速安药房 · 单店药店即时配送管理系统 | 项目作品
基于 Spring Boot 3 + Vue 3 + MyBatis-Plus + MySQL 的前后端分离业务系统,覆盖用户选药、购物车、地址、订单、库存、骑手配送、订单状态机与后台数据看板,重点实践事务一致性、业务状态流转和权限边界。
项目背景
在完成个人知识平台“星雨笔录”之后,我希望继续用一个更接近典型业务系统的项目练习 Java 全栈开发,因此选择了“单店药店即时配送”这一场景。
和只做基础增删改查不同,这个项目把重点放在一条完整业务链路上:用户浏览药品、加入购物车、维护收货地址、提交订单;后台完成接单、打包、分配骑手、配送和完结;同时系统维护库存变化、订单状态日志以及经营数据看板。
项目的目标不是复制大型医药电商平台,而是在可控范围内完成一个结构清晰、业务闭环完整、能够继续扩展的前后端分离系统。
我想解决的问题
这个项目主要用于验证和练习以下能力:
- 如何从业务场景抽象数据库实体与表关系。
- 如何使用 Controller、Service、Mapper 分层组织 Spring Boot 项目。
- 如何让前端 Vue 应用与后端 REST API 协同工作。
- 如何处理用户、管理员不同角色的访问边界。
- 如何保证“下单、扣库存、创建订单、清空购物车”等操作的一致性。
- 如何避免订单状态被任意修改,而是按照确定的业务流程推进。
- 如何将后台业务数据以图表形式呈现,而不只是做 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 张核心表:用户、药品分类、药品、用户地址、骑手、购物车、订单主表、订单明细和订单状态日志。
其中订单被拆分为主表与明细表;订单状态日志单独持久化,用于保存状态变化轨迹;药品表保存实时库存与库存预警阈值。