速安药房 · 单店药店即时配送管理系统 | 项目作品

基于 Spring Boot 3 + Vue 3 + MyBatis-Plus + MySQL 的前后端分离业务系统,覆盖用户选药、购物车、地址、订单、库存、骑手配送、订单状态机与后台数据看板,重点实践事务一致性、业务状态流转和权限边界。

项目背景

在完成个人知识平台“星雨笔录”之后,我希望继续用一个更接近典型业务系统的项目练习 Java 全栈开发,因此选择了“单店药店即时配送”这一场景。

和只做基础增删改查不同,这个项目把重点放在一条完整业务链路上:用户浏览药品、加入购物车、维护收货地址、提交订单;后台完成接单、打包、分配骑手、配送和完结;同时系统维护库存变化、订单状态日志以及经营数据看板。

项目的目标不是复制大型医药电商平台,而是在可控范围内完成一个结构清晰、业务闭环完整、能够继续扩展的前后端分离系统。

我想解决的问题

这个项目主要用于验证和练习以下能力:

  1. 如何从业务场景抽象数据库实体与表关系。
  2. 如何使用 Controller、Service、Mapper 分层组织 Spring Boot 项目。
  3. 如何让前端 Vue 应用与后端 REST API 协同工作。
  4. 如何处理用户、管理员不同角色的访问边界。
  5. 如何保证“下单、扣库存、创建订单、清空购物车”等操作的一致性。
  6. 如何避免订单状态被任意修改,而是按照确定的业务流程推进。
  7. 如何将后台业务数据以图表形式呈现,而不只是做 CRUD 页面。

系统角色

普通用户

普通用户可以注册登录、浏览药品、按分类或关键词查找商品、维护购物车和收货地址,并完成下单、订单查询和特定阶段的取消操作。

药品管理员

管理员拥有独立后台,可以维护药品分类、药品、库存、订单、骑手和用户状态,并通过控制中心查看订单与销售相关指标。

核心业务流程

用户下单

浏览药品
  ↓
加入购物车
  ↓
选择商品与收货地址
  ↓
校验库存
  ↓
扣减库存
  ↓
创建订单与订单明细
  ↓
记录初始订单状态
  ↓
清理已下单购物车记录

整个创建订单过程在事务中完成。任何关键步骤发生异常时,应避免留下“订单存在但库存没扣”或“库存已扣但订单没生成”一类明显的不一致状态。

后台履约

待接单
  ↓
待打包
  ↓
待派送
  ↓
配送中
  ↓
已完成

系统通过订单状态枚举和状态机限制合法流转,并为状态变化写入日志。

在允许取消的阶段取消订单时,系统会根据订单明细自动恢复对应库存。

用户端功能

  • 注册与登录
  • 药品分类浏览
  • 药品搜索与详情
  • 购物车管理
  • 收货地址管理
  • 提交订单
  • 订单分页查询
  • 订单详情与状态查看
  • 待接单阶段取消订单
  • 查看配送骑手信息

管理端功能

  • 数据控制中心
  • 今日订单、今日销售额、待处理订单、库存预警
  • 订单趋势、销售趋势
  • 分类销售分布
  • 热销药品榜
  • 药品分类管理
  • 药品管理
  • 库存调整与低库存预警
  • 订单接单、打包、派送、完成与取消
  • 骑手管理
  • 用户状态管理

技术架构

后端

  • Java 17
  • Spring Boot 3.5.15
  • Spring MVC
  • MyBatis-Plus
  • MySQL 8
  • Jakarta Validation
  • Maven
  • JUnit

前端

  • Vue 3
  • TypeScript
  • Vue Router
  • Pinia
  • Axios
  • Element Plus
  • ECharts
  • Vite

数据库设计

系统当前包含 9 张核心表:用户、药品分类、药品、用户地址、骑手、购物车、订单主表、订单明细和订单状态日志。

其中订单被拆分为主表与明细表;订单状态日志单独持久化,用于保存状态变化轨迹;药品表保存实时库存与库存预警阈值。