学习笔记
# 瑞吉外卖项目学习
# 项目介绍
完整的前后端不分离全栈外卖项目,包括用户前台 APP 和管理员后台。
视频地址:
https://www.bilibili.com/video/BV13a411q753/ (opens new window)
# 技术栈
- 前端: 原生 HTML + 渐进式 Vue + Axios + Element Ul
- 后端: Spring Boot + SSM + MyBatis Plus + Spring Cache + Redis + Sharding JDBC 读写分离 + 短信 SDK + Lombok
- 部署: 前后端不分离jar 包部署或者 Nginx 部署前端
# 学习内容
- 为集中处理系统异常,自定义统一的错误码,并封装了 全局异常处理器,屏蔽了项目几余的报错细节、便于接口调用方理解和统一处理。
- 基于静态 ThreadLocal 封装了线程隔离的全局上下文对象,便于在请求内部存取用户信息,减少用户远程查询次数。
- 为兼容请求参数 date 类型的序列化,自定义 Jackson 对象映射器处理日期;并扩展 SpringMVC 的消息转换器,实现自动序列化。
- 自定义 MyBatis Plus 的 MetaObjectHandler,配合全局上下文实现写数据前的创建时间、用户 id 字段的自动填充。
- 遵循 Restful 设计规范编写接口,降低前后端接口沟通和理解成本。
- 为解决原生 Jdk 序列化器导致的缓存 key 值乱码问题,自定义 RedisTemplate Bean 的 Redis Key 序列化器为 StringRedisSerializer。
- 使用 Knife4j + Swagger 自动生成后端接口文档,并通过编写 ApiOperation 等注解补充接口注释,避免了人工编写维护文档的麻烦。
- 为省去重复编写用户校验的麻烦,基于 WebFilter 实现全局登录校验;并通过 AntPathMatcher 来匹配动态请求路径,实现灵活的可选鉴权。
- 为保证数据的完整性和一致性,使用
@Transactional
实现数据库事务,并配置rollbackFor =Exception.class
来支持受检异常的事务回滚。 - 为提高 XX 信息页加载速度,基于 Spring Cache 注解 + Redis 实现对 XX 信息的自动缓存,大幅降低数据库压力的同时将接口响应耗时由 0.8s 减少至 50ms (建议数值再测一下)。
- 为降低开发成本,使用 MyBatis Plus 框架自动生成业务的增别改查重复代码,并使用 LambdaQueryWrapper 实现更灵活地自定义查询。
- 为降低用户注册成本、保证用户真实性,二次封装 阿里云 SDK 接入短信服务,并通过 Redis 来集中缓存验证码,防止单手机号的重复发送。
- 为提高数据库整体读写性能,配置 MySQL 主从同步,并使用 sharding-jdbc 实现业务无侵入的读写分离。
- 封装全局 Axios 请求实例,添加全局请求拦截和全局异常响应处理器,减少重复的状态码判断、提升项目可维护性。