BACK TO PROJECTS

苍穹外卖

基于 Spring Boot 与 MyBatis 的外卖订餐系统,一套后端同时支撑商家管理后台与用户端两条业务线。

  • Java
  • Spring Boot
  • MyBatis
  • MySQL
  • Redis
  • WebSocket

苍穹外卖是一套外卖订餐业务系统,用一套 Spring Boot 后端同时支撑商家管理后台和用户端两条业务线:商家侧完成商品上架、订单履约与经营统计,用户侧完成浏览、下单与支付。两条线共享同一套领域模型,但在权限、接口和状态流转上彼此独立。

业务范围

管理端:员工登录与增删改查、分类管理、菜品管理(含口味)、套餐管理(含菜品关联)、订单接单与拒单、派送与完成、营业额与销量排行等数据统计。

用户端:微信登录、分类与菜品套餐浏览、购物车、提交订单与支付、历史订单与再来一单、地址簿、催单。

技术实现

  • Maven 多模块拆分:sky-common 存放常量、枚举、异常、统一响应和工具类,sky-pojo 存放 DTO / Entity / VO,sky-server 承载控制器与业务逻辑。公共代码只有一份,模块边界也约束了依赖方向。
  • MyBatis 持久层:简单增删改查用注解,订单条件搜索、销量统计这类动态 SQL 交给 XML,避免在 Java 里拼接字符串。
  • AOP 自动填充:AutoFillAspect 统一写入创建时间、更新时间、操作人等公共字段,业务代码不再逐处赋值,也就不会漏填。
  • JWT + 拦截器:管理端与用户端使用不同的密钥和有效期,由拦截器统一校验登录态,接口方法只专注业务本身。
  • Redis:承担菜品等高频读数据的缓存,降低数据库压力。
  • WebSocket:WebSocketServer 维护长连接,支撑商家端来单提醒和用户端催单。
  • 微信支付与回调:支付结果通过 notify 回调异步确认,订单状态与支付状态保持一致。
  • 阿里云 OSS:菜品图片等静态资源放在对象存储,数据库只保存访问地址。
  • 定时任务:OrderTask 负责超时未支付订单等状态流转,避免脏数据长期堆积。

收获

这个项目让我第一次完整走完「需求 → 表设计 → 接口 → 联调 → 上线」的链路。真正花时间的不是把功能跑通,而是想清楚边界:哪些数据值得缓存、事务应该开在哪一层、回调重复到达时如何保证幂等、异常该在哪一层兜底。多模块拆分和 AOP 自动填充也让我理解了「减少重复」不只是写得快,而是让后续改动只发生在一个地方。

仓库

代码托管在 Gitee,采用 MIT License,保留完整的开发过程。

运行环境要求 JDK 1.8+、MySQL 5.7+ 与 Redis,配置项(JWT 密钥、OSS、微信支付)集中在 application.yml。