{"id":14972991,"url":"https://github.com/zongxr/supermarket","last_synced_at":"2025-10-16T20:55:42.748Z","repository":{"id":39514259,"uuid":"284279366","full_name":"ZongXR/SuperMarket","owner":"ZongXR","description":"设计精良的网上商城系统，包括前端、后端、数据库、负载均衡、数据库缓存、分库分表、读写分离、全文检索、消息队列等，使用SpringCloud框架，基于Java开发。该项目可部署到服务器上，不断完善中……","archived":false,"fork":false,"pushed_at":"2024-03-06T01:56:51.000Z","size":151980,"stargazers_count":2060,"open_issues_count":21,"forks_count":705,"subscribers_count":61,"default_branch":"master","last_synced_at":"2025-04-14T14:59:37.119Z","etag":null,"topics":["docker","dockerfile","elasticsearch","html5","javacript","jquery","mybatis","mycat","mysql","rabbitmq","redis","spring","springboot","springcloud","springmvc"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ZongXR.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2020-08-01T14:48:51.000Z","updated_at":"2025-04-14T07:08:14.000Z","dependencies_parsed_at":"2024-07-31T09:19:21.822Z","dependency_job_id":null,"html_url":"https://github.com/ZongXR/SuperMarket","commit_stats":null,"previous_names":["zongxr/supermarket","googlellp/supermarket"],"tags_count":3,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ZongXR%2FSuperMarket","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ZongXR%2FSuperMarket/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ZongXR%2FSuperMarket/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ZongXR%2FSuperMarket/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ZongXR","download_url":"https://codeload.github.com/ZongXR/SuperMarket/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254301432,"owners_count":22047904,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["docker","dockerfile","elasticsearch","html5","javacript","jquery","mybatis","mycat","mysql","rabbitmq","redis","spring","springboot","springcloud","springmvc"],"created_at":"2024-09-24T13:47:54.073Z","updated_at":"2025-10-16T20:55:37.716Z","avatar_url":"https://github.com/ZongXR.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003chtml lang=\"zh\"\u003e\n\u003cbody\u003e\n\u003ch1\u003e网上商城\u003c/h1\u003e\n\u003ch2\u003e截图展示\u003c/h2\u003e\n\u003cimg src=\"./img/product.gif\" alt=\"商品页面\" /\u003e\u003cbr /\u003e\n\u003cimg src=\"./img/regist.gif\" alt=\"注册页面\" /\u003e\u003cbr /\u003e\n\u003cimg src=\"./img/login.gif\" alt=\"登录页面\" /\u003e\u003cbr /\u003e\n\u003cimg src=\"./img/cart.gif\" alt=\"购物车\" /\u003e\u003cbr /\u003e\n\u003cimg src=\"./img/order.gif\" alt=\"订单\" /\u003e\u003cbr /\u003e\n\u003cimg src=\"./img/search.gif\" alt=\"检索\" /\u003e\u003cbr /\u003e\n\u003cimg src=\"./img/manage_product.gif\" alt=\"管理商品\" /\u003e\u003cbr /\u003e\n\u003cimg src=\"./img/add_product.gif\" alt=\"新增商品\" /\u003e\u003cbr /\u003e\n\u003cimg src=\"./img/instantbuy.gif\" alt=\"秒杀\" /\u003e\u003cbr /\u003e\n\u003ch2\u003e声明\u003c/h2\u003e\n\u003cul\u003e\n    \u003cli\u003e未经许可不得将本项目商用，如需商用请联系作者\u003ca href=\"mailto:zxr@tju.edu.cn\"\u003ezxr@tju.edu.cn\u003c/a\u003e\u003c/li\u003e\n    \u003cli\u003e欢迎各位看官向本项目提交代码，对提交的分支我将进行合并。提交时请务必保证能编译能运行\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e关键技术\u003c/h2\u003e\n\u003cp\u003e基于SpringCloud框架开发的商城系统，代码严格遵循MVC分层思想，可部署到服务器上，设计精良，不断完善\u003c/p\u003e\n\u003ch2\u003e包结构说明\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003ecom.supermarket.*.filter对应于微服务的过滤器\u003c/li\u003e\n\u003cli\u003ecom.supermarket.*.listener对应于微服务的监听器\u003c/li\u003e\n\u003cli\u003ecom.supermarket.*.controller对应于微服务的controller层\u003c/li\u003e\n\u003cli\u003ecom.supermarket.*.aspect对应于微服务的切面类\u003c/li\u003e\n\u003cli\u003ecom.supermarket.*.service对应于微服务的service层\u003c/li\u003e\n\u003cli\u003ecom.supermarket.*.dao对应于微服务的持久层\u003c/li\u003e\n\u003cli\u003ecom.supermarket.*.schedule对应于微服务的定时任务\u003c/li\u003e\n\u003cli\u003ecom.supermarket.*.exception对应于微服务的自定义异常\u003c/li\u003e\n\u003cli\u003ecom.supermarket.*.domain对应于微服务的JavaBean\u003c/li\u003e\n\u003cli\u003ecom.supermarket.*.utils对应于微服务的工具类\u003c/li\u003e\n\u003cli\u003ecom.supermarket.*.vo对应于微服务的ViewObject\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e系统架构\u003c/h2\u003e\n\u003cimg src=\"./img/架构图.png\" alt=\"架构图\" /\u003e\n\u003ch2\u003e功能说明\u003c/h2\u003e\n\u003ch3\u003e用户微服务(com.supermarket.user)\u003c/h3\u003e\n\u003cul\u003e\n    \u003cli\u003e用户登录\u003c/li\u003e\n    \u003cli\u003e免验证码登录\u003c/li\u003e\n    \u003cli\u003e用户注册\u003c/li\u003e\n    \u003cli\u003e用户登出\u003c/li\u003e\n    \u003cli\u003e用户名可用性校验\u003c/li\u003e\n    \u003cli\u003e用户登录状态获取\u003c/li\u003e\n    \u003cli\u003e查询用户权限等级\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003e商品微服务(com.supermarket.product)\u003c/h3\u003e\n\u003cul\u003e\n    \u003cli\u003e分页查询\u003c/li\u003e\n    \u003cli\u003e单个商品查询\u003c/li\u003e\n    \u003cli\u003e商品新增\u003c/li\u003e\n    \u003cli\u003e商品修改\u003c/li\u003e\n    \u003cli\u003e查询全部商品\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003e公共资源微服务(com.supermarket.common)\u003c/h3\u003e\n\u003cul\u003e\n    \u003cli\u003e公共资源微服务同时也是SpringCloud的Eureka模块\u003c/li\u003e\n    \u003cli\u003e提供了常用的JavaBean, ViewObject, 工具类\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003ezuul网关(com.supermarket.gateway)\u003c/h3\u003e\n\u003cul\u003e\n    \u003cli\u003eSpringCloud的zuul网关模块\u003c/li\u003e\n    \u003cli\u003e对敏感API调用进行后端鉴权\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003e图片微服务(com.supermarket.image)\u003c/h3\u003e\n\u003cul\u003e\n    \u003cli\u003e图片上传功能\u003c/li\u003e\n    \u003cli\u003e生成验证码功能\u003c/li\u003e\n    \u003cli\u003e清除验证码在redis中的缓存\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003e购物车微服务(com.supermarket.cart)\u003c/h3\u003e\n\u003cul\u003e\n    \u003cli\u003e购物车查询\u003c/li\u003e\n    \u003cli\u003e购物车新增商品\u003c/li\u003e\n    \u003cli\u003e购物车删除商品\u003c/li\u003e\n    \u003cli\u003e购物车修改商品\u003c/li\u003e\n    \u003cli\u003e购物车价格查询\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003e订单微服务(com.supermarket.order)\u003c/h3\u003e\n\u003cul\u003e\n    \u003cli\u003e新增订单\u003c/li\u003e\n    \u003cli\u003e删除订单\u003c/li\u003e\n    \u003cli\u003e查询订单\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003e检索微服务(com.supermarket.search)\u003c/h3\u003e\n\u003cul\u003e\n    \u003cli\u003e分页检索\u003c/li\u003e\n    \u003cli\u003e新增商品\u003c/li\u003e\n    \u003cli\u003e删除商品\u003c/li\u003e\n    \u003cli\u003e建立索引\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003e秒杀微服务(com.supermarket.instantbuy)\u003c/h3\u003e\n\u003cul\u003e\n    \u003cli\u003e全部秒杀商品查询\u003c/li\u003e\n    \u003cli\u003e单个秒杀商品查询\u003c/li\u003e\n    \u003cli\u003e发起秒杀\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003ch2\u003e新版本部署教程\u003c/h2\u003e\n\u003col\u003e\n    \u003cli\u003e环境准备\u003col\u003e\n            \u003cli\u003e开发环境准备:首先你需要有一台电脑、以及一个虚拟机(或服务器)。内存要大，不然跑不起来。假设你的虚拟机的ip地址是192.168.137.147在你的电脑中把hosts追加两行。\u003cbr /\u003e\n                           \u003ccode\u003e192.168.137.147 www.supermarket.com\u003c/code\u003e\u003cbr /\u003e\n                           \u003ccode\u003e192.168.137.147 image.supermarket.com\u003c/code\u003e\u003cbr /\u003e\n                           然后添加环境变量\u003cbr /\u003e\n                           \u003ccode\u003eDOCKER_HOST=tcp://192.168.137.147:2375\u003c/code\u003e\u003c/li\u003e\n            \u003cli\u003e部署环境准备:虚拟机装上centos7,再装上docker，然后依次拉取镜像\u003cbr /\u003e\n                           \u003ccode\u003edocker pull zongxr/redis:3.2.11\u003c/code\u003e\u003cbr /\u003e\n                           \u003ccode\u003edocker pull zongxr/mycat:1.15.1\u003c/code\u003e\u003cbr /\u003e\n                           \u003ccode\u003edocker pull zongxr/mysql:5.7.37\u003c/code\u003e\u003cbr /\u003e\n                           \u003ccode\u003edocker pull zongxr/elasticsearch:6.8.6\u003c/code\u003e\u003cbr /\u003e\n                           \u003ccode\u003edocker pull zongxr/supermarket-cart:1.0-SNAPSHOT\u003c/code\u003e\u003cbr /\u003e\n                           \u003ccode\u003edocker pull zongxr/supermarket-user:1.0-SNAPSHOT\u003c/code\u003e\u003cbr /\u003e\n                           \u003ccode\u003edocker pull zongxr/supermarket-gateway:1.0-SNAPSHOT\u003c/code\u003e\u003cbr /\u003e\n                           \u003ccode\u003edocker pull zongxr/supermarket-eureka:1.0-SNAPSHOT\u003c/code\u003e\u003cbr /\u003e\n                           \u003ccode\u003edocker pull zongxr/supermarket-image:1.0-SNAPSHOT\u003c/code\u003e\u003cbr /\u003e\n                           \u003ccode\u003edocker pull zongxr/supermarket-search:1.0-SNAPSHOT\u003c/code\u003e\u003cbr /\u003e\n                           \u003ccode\u003edocker pull zongxr/supermarket-instantbuy:1.0-SNAPSHOT\u003c/code\u003e\u003cbr /\u003e\n                           \u003ccode\u003edocker pull zongxr/supermarket-product:1.0-SNAPSHOT\u003c/code\u003e\u003cbr /\u003e\n                           \u003ccode\u003edocker pull zongxr/supermarket-order:1.0-SNAPSHOT\u003c/code\u003e\u003cbr /\u003e\n                           然后把start_up目录拷贝到/home目录下\u003c/li\u003e\n    \u003c/ol\u003e\u003c/li\u003e\n    \u003cli\u003e部署数据库\u003col\u003e\n            \u003cli\u003e参照\u003ca href=\"./start_up/mysql/start_mysql.sh\" target=\"_blank\"\u003e数据库启动脚本\u003c/a\u003e逐行执行，或直接运行该脚本。\u003c/li\u003e\n            \u003cli\u003e由于官方的mysql镜像没有默认开启主从配置，也没设定UTF-8字符集，因此使用本项目专有镜像zongxr/mysql:5.7.37，可自动开启bin-log，并设定UTF-8字符集\u003c/li\u003e\n            \u003cli\u003e该脚本制作了双向主从高可用的数据分片，节点分别为dn1_host1, dn1_host2, dn2_host1, dn2_host2。并且通过mycat实现了读写分离以及分库分表，最后灌入数据。如果上一步执行成功了，你将能够通过以下的JDBC连接上数据库\n                \u003ccode\u003ejdbc:mysql://192.168.137.147:3306/supermarket\u003c/code\u003e连接dn1_host1\u003cbr /\u003e\n                \u003ccode\u003ejdbc:mysql://192.168.137.147:3307/supermarket\u003c/code\u003e连接dn1_host2\u003cbr /\u003e\n                \u003ccode\u003ejdbc:mysql://192.168.137.147:3308/supermarket\u003c/code\u003e连接dn2_host1\u003cbr /\u003e\n                \u003ccode\u003ejdbc:mysql://192.168.137.147:3309/supermarket\u003c/code\u003e连接dn2_host2\u003cbr /\u003e\n                \u003ccode\u003ejdbc:mysql://192.168.137.147:8066/supermarket\u003c/code\u003e连接mycat\u003cbr /\u003e\n                \u003c/li\u003e\n    \u003c/ol\u003e\u003c/li\u003e\n    \u003cli\u003e部署redis集群\u003col\u003e\n            \u003cli\u003e参照\u003ca href=\"./start_up/redis/start_redis.sh\" target=\"_blank\"\u003eredis启动脚本\u003c/a\u003e逐行执行，或者直接运行该脚本\u003c/li\u003e\n            \u003cli\u003e该脚本搭建了一个6节点的redis集群，从redis-1到redis-6。由于3.2.11版本的redis官方镜像没有预置ruby环境，而创建集群需要使用ruby环境。因此使用该项目的专用redis镜像zongxr/redis:3.2.11，该镜像已经集成了ruby环境可直接使用。\u003c/li\u003e\n            \u003cli\u003e如果上一步redis集群部署成功了，那么可以通过6379端口连接该集群\u003c/li\u003e\n    \u003c/ol\u003e\u003c/li\u003e\n    \u003cli\u003e部署elasticsearch集群\u003col\u003e\n            \u003cli\u003e参照\u003ca href=\"./start_up/elasticsearch/start_es.sh\" target=\"_blank\"\u003eelasticsearch启动脚本\u003c/a\u003e逐行执行，或直接运行该脚本\u003c/li\u003e\n            \u003cli\u003e该脚本搭建了3节点的elasticsearch集群，分别是es-1, es-2, es-3。如果部署成功了，可以使用\u003ca href=\"https://chrome.google.com/webstore/detail/elasticsearch-head/ffmkiejjmecolpfloofpjologoblkegm?hl=zh-CN\" target=\"_blank\"\u003ehead插件\u003c/a\u003e连接\u003ca href=\"http://192.168.137.147:9200/\" target=\"_blank\"\u003ehttp://192.168.137.147:9200/\u003c/a\u003e地址，集群状态应为green\u003c/li\u003e\n            \u003cli\u003e官方默认的elasticsearch镜像不带JDBC连接功能，该项目通过技术手段集成了JDBC连接功能，可以像操作关系型数据库一样写SQL去操作elasticsearch。使用的driver是\u003ccode\u003eorg.elasticsearch.xpack.sql.jdbc.EsDriver\u003c/code\u003e\u003cbr /\u003e\n            \u003ccode\u003ejdbc:es://192.168.137.147:9201\u003c/code\u003e连接es-1\u003cbr /\u003e\n            \u003ccode\u003ejdbc:es://192.168.137.147:9202\u003c/code\u003e连接es-2\u003cbr /\u003e\n            \u003ccode\u003ejdbc:es://192.168.137.147:9200\u003c/code\u003e连接es-3\u003cbr /\u003e            \n            \u003c/li\u003e\n    \u003c/ol\u003e\u003c/li\u003e\n    \u003cli\u003e部署微服务\u003col\u003e\n            \u003cli\u003e参照\u003ca href=\"./start_up/app/start_app.sh\" target=\"_blank\"\u003e微服务启动脚本\u003c/a\u003e逐行执行，或直接运行该脚本\u003c/li\u003e\n            \u003cli\u003e每个微服务做了一个镜像，名为zongxr/supermarket-xxx:tag。如果所有微服务都启动成功了，那么将能够在\u003ca href=\"http://192.168.137.147:10000/\" target=\"_blank\"\u003e注册中心\u003c/a\u003e看到所有注册的微服务，并且在\u003ca href=\"http://192.168.137.147:10002/swagger-ui/\" target=\"_blank\"\u003ehttp://192.168.137.147:APP_PORT/swagger-ui/\u003c/a\u003e网址能够看到该微服务对应的接口文档\u003c/li\u003e\n            \u003cli\u003einstant-buy微服务用到了消息队列rabbitmq。如果消息队列启动成功，将能够在\u003ca href=\"http://192.168.137.147:15672\" target=\"_blank\"\u003eWeb UI\u003c/a\u003e管理界面看到传输的消息，用户名密码均为guest\u003c/li\u003e\n    \u003c/ol\u003e\u003c/li\u003e\n    \u003cli\u003e至此，所有服务都已经启动完成了。访问\u003ca href=\"http://www.supermarket.com\" target=\"_blank\"\u003ewww.supermarket.com\u003c/a\u003e进行访问即可。\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2\u003e旧版本部署教程\u003c/h2\u003e\n\u003cul\u003e\n    \u003cli\u003e\u003ca href=\"https://blog.csdn.net/sjdjjd6466446/article/details/110005937\" target=\"_blank\"\u003e0.4.x版本博客教程\u003c/a\u003e(感谢\u003ca href=\"https://github.com/BlackPeachLawn\" target=\"_blank\"\u003eBlackPeachLawn\u003c/a\u003e)\u003c/li\u003e\n    \u003cli\u003e\u003ca href=\"./部署教程/supermarket部署视频.txt\" target=\"_blank\"\u003e0.4.x版本视频教程\u003c/a\u003e(感谢\u003ca href=\"https://github.com/20427492\" target=\"_blank\"\u003e20427492\u003c/a\u003e)\u003c/li\u003e\n    \u003cli\u003e\u003ca href=\"./部署教程/ssm10月1号版本使用.txt\" target=\"_blank\"\u003e0.3.x版本文档教程\u003c/a\u003e(感谢\u003ca href=\"https://github.com/20427492\" target=\"_blank\"\u003e20427492\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003ch2\u003e交流群\u003c/h2\u003e\n点击链接加入群聊【Supermarket项目交流群】：\u003ca href=\"https://jq.qq.com/?_wv=1027\u0026k=wlpUy5jo\"\u003ehttps://jq.qq.com/?_wv=1027\u0026k=wlpUy5jo\u003c/a\u003e\u003cbr /\u003e \n\u003ca href=\"https://jq.qq.com/?_wv=1027\u0026k=wlpUy5jo\"\u003e\u003cimg src=\"./img/交流群.png\" alt=\"交流群二维码\"/\u003e\u003c/a\u003e\n\n\u003ch2\u003e版本迭代\u003c/h2\u003e\n\u003ctable\u003e\n    \u003ctr\u003e\n        \u003cth\u003e版本号\u003c/th\u003e\n        \u003cth\u003e更新内容\u003c/th\u003e\n        \u003cth\u003e上传时间\u003c/th\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e0.1\u003c/td\u003e\n        \u003ctd\u003e\n            \u003cul\u003e\n                \u003cli\u003e初步完成项目方案确定\u003c/li\u003e\n                \u003cli\u003e完成主页及注册页面的静态资源编写(包括js,css)\u003c/li\u003e\n                \u003cli\u003e完成主页及注册页面的动态资源编写(包括jsp,servlet)\u003c/li\u003e\n                \u003cli\u003e通过jdbc链接MySQL数据库\u003c/li\u003e\n                \u003cli\u003e使用c3p0连接池\u003c/li\u003e\n            \u003c/ul\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e2020年8月3日\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e0.1.1\u003c/td\u003e\n        \u003ctd\u003e\n            \u003cul\u003e\n                \u003cli\u003e可以选择使用哪个连接池，并且在web.xml中指定，现在可以使用DBCP连接池\u003c/li\u003e\n                \u003cli\u003e通过反射机制设置如果指定连接池调用失败，再调用哪个连接池\u003c/li\u003e\n                \u003cli\u003e使用Ajax技术完成前端用户名校验\u003c/li\u003e\n                \u003cli\u003e更改img标签的src属性，使浏览器异步发送GET请求，刷新验证码\u003c/li\u003e\n            \u003c/ul\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e2020年8月7日\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e0.1.2\u003c/td\u003e\n        \u003ctd\u003e\n            \u003cul\u003e\n                \u003cli\u003e使用JDBC.properties进行全局JDBC配置\u003c/li\u003e\n                \u003cli\u003e去掉JDBC的反射调用\u003c/li\u003e\n                \u003cli\u003e使用cookie完成记住用户名功能\u003c/li\u003e\n                \u003cli\u003e新增登录功能：使用session完成会话级别的数据传递\u003c/li\u003e\n                \u003cli\u003e新增注销功能：通过ajax请求销毁session\u003c/li\u003e\n                \u003cli\u003e修改静态页面，使其实现对logo.png的单独依赖\u003c/li\u003e\n            \u003c/ul\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e2020年8月9日\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e0.2\u003c/td\u003e\n        \u003ctd\u003e\n            \u003cul\u003e\n                \u003cli\u003e使用EL表达式替换jsp页面中的脚本表达式\u003c/li\u003e\n                \u003cli\u003e修改静态资源，主页增加右下角浮动项以及向上返回功能\u003c/li\u003e\n                \u003cli\u003e新增错误页面提示\u003c/li\u003e\n                \u003cli\u003e重构为JavaEE三层经典架构\u003c/li\u003e\n            \u003c/ul\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e2020年8月20日\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e0.2.1\u003c/td\u003e\n        \u003ctd\u003e\n            \u003cul\u003e\n                \u003cli\u003e使用过滤器完成全局请求参数拦截处理，包括全局中文乱码处理、全局password请求参数加密\u003c/li\u003e\n                \u003cli\u003e通过过滤器实现全局连接池选定\u003c/li\u003e\n                \u003cli\u003e通过过滤器实现自动登录功能\u003c/li\u003e\n                \u003cli\u003e通过装饰者模式扩展request对象\u003c/li\u003e\n            \u003c/ul\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e2020年8月22日\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e0.2.2\u003c/td\u003e\n        \u003ctd\u003e\n            \u003cul\u003e\n                \u003cli\u003e使用log4j框架进行日志记录\u003c/li\u003e\n                \u003cli\u003e修复重启服务器自动登录失效的bug\u003c/li\u003e\n                \u003cli\u003e加入网页标题图标\u003c/li\u003e\n            \u003c/ul\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e2020年8月24日\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e0.2.3\u003c/td\u003e\n        \u003ctd\u003e\n            \u003cul\u003e\n                \u003cli\u003e将JDBC初始化功能交由监听器实现，并移除对应的过滤器\u003c/li\u003e\n                \u003cli\u003e使用过滤器实现JDBC反注册，避免内存泄漏\u003c/li\u003e\n                \u003cli\u003e使用注解替代web.xml完成servlet和监听器的注册\u003c/li\u003e\n                \u003cli\u003e重写前端校验，对于支持html5的浏览器使用其自带校验\u003c/li\u003e\n            \u003c/ul\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e2020年8月25日\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e0.3\u003c/td\u003e\n        \u003ctd\u003e\n            \u003cul\u003e\n                \u003cli\u003e使用Spring、SpringMVC、MyBatis重构该web应用\u003c/li\u003e\n                \u003cli\u003e使用User类的装饰者模式完成密码的md5加密功能\u003c/li\u003e\n                \u003cli\u003e使用SpringMVC拦截器记录用户的访问请求\u003c/li\u003e\n                \u003cli\u003e使用切面记录错误日志，并统计响应时间\u003c/li\u003e\n                \u003cli\u003e升级log4j为log4j2\u003c/li\u003e\n                \u003cli\u003e使用html5及jQuery相结合的方式进行前端表单校验\u003c/li\u003e\n            \u003c/ul\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e2020年9月25日\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e0.3.1\u003c/td\u003e\n        \u003ctd\u003e\n            \u003cul\u003e\n                \u003cli\u003e新增UserDao的SpringJDBC模板类实现\u003c/li\u003e\n                \u003cli\u003e注册用户功能开启事务，修复多个用户同时注册时可能造成用户名重复的bug\u003c/li\u003e\n            \u003c/ul\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e2020年9月29日\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e0.3.2\u003c/td\u003e\n        \u003ctd\u003e\n            \u003cul\u003e\n                \u003cli\u003e新增备选的DBCP连接池配置\u003c/li\u003e\n            \u003c/ul\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e2020年10月1日\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e0.4\u003c/td\u003e\n        \u003ctd\u003e\n            \u003cul\u003e\n                \u003cli\u003e使用Maven重构依赖\u003c/li\u003e\n                \u003cli\u003e使用SpringCloud重构项目\u003c/li\u003e\n                \u003cli\u003e重构数据库\u003c/li\u003e\n                \u003cli\u003e增加common微服务: 存放共享资源(如JavaBean, 工具类, ViewObject)\u003c/li\u003e\n                \u003cli\u003e增加商品微服务：新增、修改、查询功能\u003c/li\u003e\n                \u003cli\u003e增加用户微服务：用户名校验、注册\u003c/li\u003e\n                \u003cli\u003e增加图片微服务：图片上传\u003c/li\u003e\n                \u003cli\u003e增加nginx：负载均衡、动态静态资源分离\u003c/li\u003e\n            \u003c/ul\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e2020年11月10日\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e0.4.1\u003c/td\u003e\n        \u003ctd\u003e\n            \u003cul\u003e\n                \u003cli\u003e新增redis配置，通过redis解决微服务之间数据共享问题\u003c/li\u003e\n                \u003cli\u003e完善用户微服务：实现登录、登出、登录状态获取，修复注册未校验密码一致性的Bug\u003c/li\u003e\n                \u003cli\u003e改进redis数据结构：将key-value改进为hash，从而实现单点登录\u003c/li\u003e\n                \u003cli\u003e使用AOP切面实现登录时长的自动延长\u003c/li\u003e\n            \u003c/ul\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e2020年11月12日\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e0.4.2\u003c/td\u003e\n        \u003ctd\u003e\n            \u003cul\u003e\n                \u003cli\u003e调整前端css，增加注册、登录的错误提示\u003c/li\u003e\n                \u003cli\u003e新增注册成功页面\u003c/li\u003e\n                \u003cli\u003e其他前端页面样式的调整\u003c/li\u003e\n            \u003c/ul\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e2020年11月13日\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e0.4.3\u003c/td\u003e\n        \u003ctd\u003e\n            \u003cul\u003e\n                \u003cli\u003e完善图片微服务：新增功能生成验证码、验证码缓存清理(避免前端连续请求验证码爆掉redis)\u003c/li\u003e\n                \u003cli\u003e完善用户微服务：登录、注册需要验证码，登录或注册成功后清除验证码缓存(节省redis内存)\u003c/li\u003e\n                \u003cli\u003e完善商品微服务：商品新增、查询、编辑触发被动缓存\u003c/li\u003e\n            \u003c/ul\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e2020年11月14日\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e0.4.4\u003c/td\u003e\n        \u003ctd\u003e\n            \u003cul\u003e\n                \u003cli\u003e新增购物车微服务：实现商品查询、商品新增、商品修改、商品删除功能\u003c/li\u003e\n                \u003cli\u003e通过事务实现购买数量后端校验：防止购买量大于库存\u003c/li\u003e\n                \u003cli\u003e在前端实现购买数量校验校验：防止购买量大于库存\u003c/li\u003e\n            \u003c/ul\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e2020年11月15日\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e0.4.5\u003c/td\u003e\n        \u003ctd\u003e\n            \u003cul\u003e\n                \u003cli\u003e完善图片微服务：解决redis中验证码缓存无法清理的BUG\u003c/li\u003e\n                \u003cli\u003e完善用户微服务：新增记住用户名、自动登录功能\u003c/li\u003e\n            \u003c/ul\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e2020年11月18日\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e0.4.6\u003c/td\u003e\n        \u003ctd\u003e\n            \u003cul\u003e\n                \u003cli\u003e修复自动登录与单点登录功能冲突的bug。\u003c/li\u003e\n                \u003cli\u003e替换网页logo，避免不必要的责任纠纷\u003c/li\u003e\n            \u003c/ul\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e2020年11月19日\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e0.4.7\u003c/td\u003e\n        \u003ctd\u003e\n            \u003cul\u003e\n                \u003cli\u003e新增订单微服务：实现订单新增、订单查询、订单删除功能\u003c/li\u003e\n                \u003cli\u003e完善购物车微服务：新增总价格查询功能\u003c/li\u003e\n                \u003cli\u003e数据库迁移至服务器，并通过MyCat管理分库分表\u003c/li\u003e\n                \u003cli\u003e每个数据分片通过双向主从实现MySQL高可用，并开启读写分离\u003c/li\u003e\n            \u003c/ul\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e2020年11月24日\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e0.4.8\u003c/td\u003e\n        \u003ctd\u003e\n            \u003cul\u003e\n                \u003cli\u003e新增检索微服务：分页检索、增加文档、删除文档、修改文档\u003c/li\u003e\n                \u003cli\u003e完善商品微服务：查询全部商品\u003c/li\u003e\n                \u003cli\u003e完善前端：进入后台权限校验\u003c/li\u003e\n            \u003c/ul\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e2020年11月30日\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e0.4.9\u003c/td\u003e\n        \u003ctd\u003e\n            \u003cul\u003e\n                \u003cli\u003e新增秒杀微服务：全部秒杀商品查询、单个秒杀商品查询、发起秒杀(尚未联调)\u003c/li\u003e\n                \u003cli\u003e修改部分前端页面\u003c/li\u003e\n            \u003c/ul\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e2020年12月6日\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e0.5\u003c/td\u003e\n        \u003ctd\u003e\n            \u003cul\u003e\n                \u003cli\u003e完善秒杀微服务：修复若干bug\u003c/li\u003e\n                \u003cli\u003e完善zuul网关：对敏感API调用进行后端鉴权\u003c/li\u003e\n                \u003cli\u003e完善用户微服务：新增权限查询功能\u003c/li\u003e\n            \u003c/ul\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e2020年12月9日\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e0.5.1\u003c/td\u003e\n        \u003ctd\u003e\n            \u003cul\u003e\n                \u003cli\u003e完善秒杀微服务：修复发起秒杀功能中的线程安全问题\u003c/li\u003e\n                \u003cli\u003e新增全系统架构图\u003c/li\u003e\n            \u003c/ul\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e2020年12月10日\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e0.5.2\u003c/td\u003e\n        \u003ctd\u003e\n            \u003cul\u003e\n                \u003cli\u003e完善秒杀微服务：修复发起秒杀功能中的线程安全问题\u003c/li\u003e\n                \u003cli\u003e完善zuul网关：过滤器实现更细粒度鉴权\u003c/li\u003e\n                \u003cli\u003e完善检索微服务：修复新增和编辑商品时无法同步到elasticsearch的Bug\u003c/li\u003e\n            \u003c/ul\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e2020年12月11日\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e0.5.3\u003c/td\u003e\n        \u003ctd\u003e\n            \u003cul\u003e\n                \u003cli\u003e微服务添加熔断器，避免单个故障导致集群崩溃\u003c/li\u003e\n                \u003cli\u003e使用Feign替代Ribbon进行微服务间调用\u003c/li\u003e\n                \u003cli\u003e完善检索微服务：修复微服务启动时创建索引失败的bug\u003c/li\u003e\n                \u003cli\u003e新增log4j2日志框架支持\u003c/li\u003e\n            \u003c/ul\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e2020年12月12日\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e1.0.0\u003c/td\u003e\n        \u003ctd\u003e\n            \u003cul\u003e\n                \u003cli\u003e所有服务及组件迁移至docker，使用容器进行部署\u003c/li\u003e\n                \u003cli\u003e修复若干BUG\u003c/li\u003e\n            \u003c/ul\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e2022年3月26日\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e1.0.1.0\u003c/td\u003e\n        \u003ctd\u003e\n            \u003cul\u003e\n                \u003cli\u003e完善商品微服务接口文档\u003c/li\u003e\n                \u003cli\u003e修复若干BUG\u003c/li\u003e\n            \u003c/ul\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e2022年4月1日\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e1.0.2.0\u003c/td\u003e\n        \u003ctd\u003e\n            \u003cul\u003e\n                \u003cli\u003e完善检索微服务接口\u003c/li\u003e\n                \u003cli\u003e修正检索微服务和商品微服务调用异常的BUG\u003c/li\u003e\n            \u003c/ul\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e2022年4月1日\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e1.0.3.0\u003c/td\u003e\n        \u003ctd\u003e\n            \u003cul\u003e\n                \u003cli\u003e完善抢购微服务接口\u003c/li\u003e\n                \u003cli\u003e修复若干BUG\u003c/li\u003e\n            \u003c/ul\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e2022年4月4日\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e1.0.4.0\u003c/td\u003e\n        \u003ctd\u003e\n            \u003cul\u003e\n                \u003cli\u003e完善图片微服务\u003c/li\u003e\n                \u003cli\u003e修复若干BUG\u003c/li\u003e\n            \u003c/ul\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e2022年4月5日\u003c/td\u003e\n    \u003c/tr\u003e\n\u003c/table\u003e\n\n\u003ch2\u003e配置情况\u003c/h2\u003e\n\u003cul\u003e\n    \u003cli\u003eJDK版本：\u003ca href=\"http://openjdk.java.net/projects/jdk/11/\" target=\"_blank\"\u003eOpenJDK11\u003c/a\u003e\u003c/li\u003e\n    \u003cli\u003e\u003ca href=\"http://nginx.org/en/download.html\" target=\"_blank\"\u003enginx：1.19.1\u003c/a\u003e\u003c/li\u003e\n    \u003cli\u003e\u003ca href=\"https://maven.apache.org/download.cgi\" target=\"_blank\"\u003emaven: 3.6.3\u003c/a\u003e\u003c/li\u003e\n    \u003cli\u003e\u003ca href=\"https://downloads.mysql.com/archives/community/\" target=\"_blank\"\u003eMySql: 5.7.37\u003c/a\u003e\u003c/li\u003e\n    \u003cli\u003e\u003ca href=\"http://download.redis.io/releases/\" target=\"_blank\"\u003eRedis: 3.2.11\u003c/a\u003e\u003c/li\u003e\n    \u003cli\u003e\u003ca href=\"https://github.com/MyCATApache/Mycat-download/tree/master/1.5-RELEASE\" target=\"_blank\"\u003eMyCat: 1.5.1\u003c/a\u003e\u003c/li\u003e\n    \u003cli\u003e\u003ca href=\"https://www.elastic.co/cn/downloads/past-releases/elasticsearch-6-8-6\" target=\"_blank\"\u003eElasticSearch: 6.8.6\u003c/a\u003e\u003c/li\u003e\n    \u003cli\u003e\u003ca href=\"https://github.com/medcl/elasticsearch-analysis-ik/releases/tag/v6.8.6\" target=\"_blank\"\u003eIK分词器: 6.8.6\u003c/a\u003e\u003c/li\u003e\n    \u003cli\u003e\u003ca href=\"https://github.com/rabbitmq/rabbitmq-server/releases/tag/v3.7.7\" target=\"_blank\"\u003eRabbitMQ: 3.7.7\u003c/a\u003e\u003c/li\u003e\n    \u003cli\u003e开发环境：\u003ca href=\"https://www.jetbrains.com/idea/download/other.html\" target=\"_blank\"\u003eIntelliJ Idea 2020.1.4\u003c/a\u003e\u003c/li\u003e\n    \u003cli\u003e框架：\u003ca href=\"https://github.com/spring-projects/spring-boot/releases/tag/v2.2.5.RELEASE\" target=\"_blank\"\u003eSpringboot 2.2.5.RELEASE\u003c/a\u003e, \u003ca href=\"https://spring.io/blog/2020/03/05/spring-cloud-hoxton-service-release-3-sr3-is-available\" target=\"_blank\"\u003eSpringCloud Hoxton.SR3\u003c/a\u003e\u003c/li\u003e\n    \u003cli\u003e\n        hosts配置: \u003cbr /\u003e\n        192.168.137.147 www.supermarket.com \u003cbr /\u003e\n        192.168.137.147 image.supermarket.com\n    \u003c/li\u003e\n\u003c/ul\u003e\n\n\u003ch2\u003e遇到的bug锦集(作为记录，博君一笑)\u003c/h2\u003e\n\u003cul\u003e\n    \u003cli\u003eHttpServletRequest的装饰者类HttpServletRequestDecorator中的getParameterMap重写方法中，不能在原地进行参数字符集修改，否则如果调用两次及以上该方法时会编码多次，造成乱码\u003c/li\u003e\n    \u003cli\u003e对请求参数的拦截处理，如果用到装饰者模式，最好在一处完成。如果在多处完成会造成请求参数的重复处理，从而导致乱码或者拿到非预期的参数值\u003c/li\u003e\n    \u003cli\u003e用户的登录信息最好保存到session域中，在0.2.1中的自动登录成功后误把user对象塞入到了request域，造成了重启服务器自动登录失效的bug。\u003c/li\u003e\n    \u003cli\u003e使用过滤器将密码加密，不仅要将参数为password的值加密，还要将参数为password2的值加密，否则永远确认密码不一致\u003c/li\u003e\n    \u003cli\u003e使用SpringMVC处理请求参数，如果自动封bean作为方法参数传入，那么该bean所携带的请求参数是不经过过滤器的！原因未知\u003c/li\u003e\n    \u003cli\u003e自动登录最好使用过滤器实现，因为SpringMVC拦截器无法拦截index.jsp。而因为使用过滤器的时候Spring容器还未初始化，所以过滤器的属性需要手工注入\u003c/li\u003e\n    \u003cli\u003e即便上一次响应设置了cookie的path，下一次请求携带的cookie的path也会是null。因此如果要修改或删除cookie，一定要严格满足name, path都设置，否则可能会无效\u003c/li\u003e\n    \u003cli\u003e如果间接依赖了spring-cloud-starter-netflix-eureka-server，一定要把jackson-dataformat-xml排除掉，因为如果不排除掉会导致返回给浏览器的对象是xml格式而非json格式\u003c/li\u003e\n    \u003cli\u003eMyBatis如果使用bean传参，不要使用\u0026lt;if\u0026gt;标签内的test属性名应该对应bean属性名而非表的列名。否则会报There is no getter for property named 'xx' in 'class xxx\u003c/li\u003e\n    \u003cli\u003e在Springboot项目中，如果要在application.properties中写自定义配置项，若该配置项为路径字符串，一定要写全路径，从盘符写起，否则会自动在前面拼接tomcat的临时路径\u003c/li\u003e\n    \u003cli\u003ehtml中onsubmit事件要放在form标签内，放在\u0026lt;input type=\u0026quot;submit\u0026quot; /\u0026gt;标签内无效\u003c/li\u003e\n    \u003cli\u003e启动的时候需要先启动redis再启动微服务，否则会报RedisConnectionFailureException\u003c/li\u003e\n    \u003cli\u003eredis作为缓存使用时，建议捕获RedisConnectionFailureException异常，从而在redis崩掉的情况下能够直接访问数据库\u003c/li\u003e\n    \u003cli\u003e基于SpringCloud的Ribbon模块在微服务之间相互调用时，不经过zuul网关\u003c/li\u003e\n    \u003cli\u003eMySQL主从高可用时，如果因为错误数据导致挂接失败，需要先取消挂接(stop slave)，手动删除错误数据，再重新挂接(start slave)\u003c/li\u003e\n    \u003cli\u003eMyCat1.5.1版本还不支持复杂SQL，比如update...select..., insert ...select...等\u003c/li\u003e\n    \u003cli\u003einsert的时候加上列名是一个好习惯，因为MyCat1.5.1不支持省略列名的写法\u003c/li\u003e\n    \u003cli\u003e直接使用RedisTemplate模板类，键和值会出现类似\\xac\\xed\\x00\\x05t\\x00的东西，此时要么不去手动查看redis输出，要么换用StringRedisTemplate\u003c/li\u003e\n    \u003cli\u003e用nginx也能做到外部调用内部api的拦截，只需要将提供给前端的api路径和提供给后端的api路径区分开。比如提供给前端的api路径是/manage/query，提供给后端的api是/backend/query，因为nginx拼接了\"/manage\"，所以自然找不到/backend/query\u003c/li\u003e\n    \u003cli\u003e\u003ccode\u003e@RequestParam\u003c/code\u003e用于接收单个query请求参数；\u003ccode\u003e@ModelAttribute\u003c/code\u003e用于接收Content-Type为application/x-www-form-urlencoded的多个query请求参数后封装成bean；\u003ccode\u003e@RequestBody\u003c/code\u003e用于接收Content-Type为application/json的封装成body的请求参数\n        \u003ctable\u003e\n            \u003ctr\u003e\n                \u003cth\u003e\u003c/th\u003e\u003cth\u003e单个基本请求参数\u003c/th\u003e\u003cth\u003e多个请求参数组成的一个bean\u003c/th\u003e\n            \u003c/tr\u003e\n            \u003ctr\u003e\n                \u003ctd\u003equery\u003c/td\u003e\u003ctd\u003e\u003ccode\u003e@RequestParam\u003c/code\u003e\u003c/td\u003e\u003ctd\u003e\u003ccode\u003e@ModelAttribute\u003c/code\u003e\u003c/td\u003e\n            \u003c/tr\u003e\n            \u003ctr\u003e\n                \u003ctd\u003ebody\u003c/td\u003e\u003ctd\u003e无\u003c/td\u003e\u003ctd\u003e\u003ccode\u003e@RequestBody\u003c/code\u003e\u003c/td\u003e\n            \u003c/tr\u003e\n        \u003c/table\u003e\u003c/li\u003e\n    \u003cli\u003e\u003ccode\u003e@ExceptionHandler\u003c/code\u003e注解修饰的方法别忘了加\u003ccode\u003e@ResponseBody\u003c/code\u003e注解，否则捕获不到异常\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/body\u003e\n\u003c/html\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzongxr%2Fsupermarket","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fzongxr%2Fsupermarket","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzongxr%2Fsupermarket/lists"}