- 本项目静态资源由网络收集得来,并加以大范围修改
- 未经许可不得将本项目商用,如需商用请联系作者zxr@tju.edu.cn
基于SpringCloud框架开发的商城系统,代码严格遵循MVC分层**,可部署到服务器上,设计精良,不断完善
- com.supermarket.*.filter对应于微服务的过滤器
- com.supermarket.*.listener对应于微服务的监听器
- com.supermarket.*.controller对应于微服务的controller层
- com.supermarket.*.aspect对应于微服务的切面类
- com.supermarket.*.service对应于微服务的service层
- com.supermarket.*.dao对应于微服务的持久层
- com.supermarket.*.schedule对应于微服务的定时任务
- com.supermarket.*.exception对应于微服务的自定义异常
- com.supermarket.*.domain对应于微服务的JavaBean
- com.supermarket.*.utils对应于微服务的工具类
- com.supermarket.*.vo对应于微服务的ViewObject
- 用户登录
- 免验证码登录
- 用户注册
- 用户登出
- 用户名可用性校验
- 用户登录状态获取
- 查询用户权限等级
- 分页查询
- 单个商品查询
- 商品新增
- 商品修改
- 查询全部商品
- 公共资源微服务同时也是SpringCloud的Eureka模块
- 提供了常用的JavaBean, ViewObject, 工具类
- SpringCloud的zuul网关模块
- 对敏感API调用进行后端鉴权
- 图片上传功能
- 生成验证码功能
- 清除验证码在redis中的缓存
- 购物车查询
- 购物车新增商品
- 购物车删除商品
- 购物车修改商品
- 购物车价格查询
- 新增订单
- 删除订单
- 查询订单
- 分页检索
- 新增商品
- 删除商品
- 建立索引
- 全部秒杀商品查询
- 单个秒杀商品查询
- 发起秒杀
版本号 | 更新内容 | 上传时间 |
---|---|---|
0.1 |
|
2020年8月3日 |
0.1.1 |
|
2020年8月7日 |
0.1.2 |
|
2020年8月9日 |
0.2 |
|
2020年8月20日 |
0.2.1 |
|
2020年8月22日 |
0.2.2 |
|
2020年8月24日 |
0.2.3 |
|
2020年8月25日 |
0.3 |
|
2020年9月25日 |
0.3.1 |
|
2020年9月29日 |
0.3.2 |
|
2020年10月1日 |
0.4 |
|
2020年11月10日 |
0.4.1 |
|
2020年11月12日 |
0.4.2 |
|
2020年11月13日 |
0.4.3 |
|
2020年11月14日 |
0.4.4 |
|
2020年11月15日 |
0.4.5 |
|
2020年11月18日 |
0.4.6 |
|
2020年11月19日 |
0.4.7 |
|
2020年11月24日 |
0.4.8 |
|
2020年11月30日 |
0.4.9 |
|
2020年12月6日 |
0.5 |
|
2020年12月9日 |
0.5.1 |
|
2020年12月10日 |
0.5.2 |
|
2020年12月11日 |
0.5.3 |
|
2020年12月12日 |
- JDK版本:OpenJDK11
- nginx:1.19.1
- maven: 3.6.3
- MySql: 5.5.27
- Redis: 3.2.11
- MyCat: 1.5.1
- ElasticSearch: 6.8.6
- IK分词器: 6.8.6
- RabbitMQ: 3.7.7
- 开发环境:IntelliJ Idea 2020.1.4
- 框架:Springboot 2.2.5.RELEASE, SpringCloud Hoxton.SR3
-
hosts配置:
127.0.0.1 www.supermarket.com
127.0.0.1 image.supermarket.com
- HttpServletRequest的装饰者类HttpServletRequestDecorator中的getParameterMap重写方法中,不能在原地进行参数字符集修改,否则如果调用两次及以上该方法时会编码多次,造成乱码
- 对请求参数的拦截处理,如果用到装饰者模式,最好在一处完成。如果在多处完成会造成请求参数的重复处理,从而导致乱码或者拿到非预期的参数值
- 用户的登录信息最好保存到session域中,在0.2.1中的自动登录成功后误把user对象塞入到了request域,造成了重启服务器自动登录失效的bug。
- 使用过滤器将密码加密,不仅要将参数为password的值加密,还要将参数为password2的值加密,否则永远确认密码不一致
- 使用SpringMVC处理请求参数,如果自动封bean作为方法参数传入,那么该bean所携带的请求参数是不经过过滤器的!原因未知
- 自动登录最好使用过滤器实现,因为SpringMVC拦截器无法拦截index.jsp。而因为使用过滤器的时候Spring容器还未初始化,所以过滤器的属性需要手工注入
- 即便上一次响应设置了cookie的path,下一次请求携带的cookie的path也会是null。因此如果要修改或删除cookie,一定要严格满足name, path都设置,否则可能会无效
- 如果间接依赖了spring-cloud-starter-netflix-eureka-server,一定要把jackson-dataformat-xml排除掉,因为如果不排除掉会导致返回给浏览器的对象是xml格式而非json格式
- MyBatis如果使用bean传参,不要使用<if>标签内的test属性名应该对应bean属性名而非表的列名。否则会报There is no getter for property named 'xx' in 'class xxx
- 在Springboot项目中,如果要在application.properties中写自定义配置项,若该配置项为路径字符串,一定要写全路径,从盘符写起,否则会自动在前面拼接tomcat的临时路径
- html中onsubmit事件要放在form标签内,放在<input type="submit" />标签内无效
- 启动的时候需要先启动redis再启动微服务,否则会报RedisConnectionFailureException
- redis作为缓存使用时,建议捕获RedisConnectionFailureException异常,从而在redis崩掉的情况下能够直接访问数据库
- 基于SpringCloud的Ribbon模块在微服务之间相互调用时,不经过zuul网关
- MySQL主从高可用时,如果因为错误数据导致挂接失败,需要先取消挂接(stop slave),手动删除错误数据,再重新挂接(start slave)
- MyCat1.5.1版本还不支持复杂SQL,比如update...select..., insert ...select...等
- insert的时候加上列名是一个好习惯,因为MyCat1.5.1不支持省略列名的写法
- 直接使用RedisTemplate模板类,键和值会出现类似\xac\xed\x00\x05t\x00的东西,此时要么不去手动查看redis输出,要么换用StringRedisTemplate
- 用nginx也能做到外部调用内部api的拦截,只需要将提供给前端的api路径和提供给后端的api路径区分开。比如提供给前端的api路径是/manage/query,提供给后端的api是/backend/query,因为nginx拼接了"/manage",所以自然找不到/backend/query