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