基于 Spring Boot 的物流运单管理系统后端设计与实现(JWT + MyBatis-Plus + MySQL)
一、前言
物流系统的核心是一条运单的生命周期:揽收开单、仓库中转、运输签收,每个环节都要留痕可查。相比市面上重界面的管理系统,本文拆解的这套「物流运单管理系统」选择了另一种形态------纯后端 API 服务:基于 Spring Boot 2.3 提供 8 组 RESTful 接口,JWT 鉴权,小程序、APP 或 Web 前端都可以直接对接。对于想学习「后端服务怎么设计」而不是「页面怎么拼」的读者来说,这种形态的工程反而更有参考价值。
系统覆盖用户登录(JWT 签发)、仓库、货物、运单、中转、用户运单绑定、清单日志七大模块,8 张表带完整演示数据,运单状态机(待揽收 → 运输中 → 已签收)配合中转记录实现全程可追溯,还内置了 zxing 二维码生成能力,可为运单生成追溯码。
二、技术栈与总体架构
| 层次 | 技术 | 说明 |
|---|---|---|
| 接入层 | REST API + JWT | 8 组 Controller,token 请求头鉴权,统一 JSON 响应 |
| 业务层 | Spring Boot 2.3.5 | @Valid 参数校验,POJO/BO 分层 |
| 持久层 | MyBatis-Plus + HikariCP | EntityWrapper 条件构造,mapper XML 混合 |
| 数据库 | MySQL(utf-8) | 库 logistics,8 张表 |
| 工具 | zxing / DigestUtils | 运单二维码生成、MD5 密码摘要 |
| 环境 | JDK 1.8 | 可执行 jar,java -jar 一键启动 |

几个值得关注的实现点:
- JWT 无状态鉴权。登录成功后按用户信息签发 JWT,后续接口从 token 请求头解码出用户(JWT.decode().getAudience()),服务端不存会话,天然适合多端接入。
- 统一响应体 。全部接口返回
{code, msg, data}结构(ResponseData 封装),前端只需按 code 判断,错误信息统一在 msg。 - 运单状态机。waybill 表以 waybillState 驱动状态流转,updateState 接口推进状态,transfer 表记录每次仓库中转,list_log 留操作日志,三个维度拼出完整追溯链。
- POJO/BO 分层。请求参数用 BO(如 LoginBO)配合 @NotEmpty 校验注解,接口入参即文档。
三、功能设计

运单业务流
- 用户登录:工号 + MD5 密码,登录签发 JWT;
- 运单开单:收货人、地址、联系电话、货物品类、金额;
- 状态流转:updateState 推进 待揽收 → 运输中 → 已签收;
- 运单查询:queryByState 按状态分页、queryCount 数量统计、queryNoWay 查未绑定运单;
- 中转登记:仓库间 transfer 记录,全程可追溯;
- 清单日志:list_log 操作留痕。
基础资源管理
- 仓库管理:仓库点列表;
- 货物管理:货物档案增删改查(分页);
- 货物关联:运单与货物的关联关系;
- 用户地址:user_way 常用地址簿;
- 二维码:zxing 为运单生成追溯码。
四、数据库设计

| 表 | 含义 | 关键字段 |
|---|---|---|
| user | 用户 | user_work_number(工号)、user_pwd(MD5)、user_name、user_phone |
| waybill | 运单 | waybill_no(运单号)、consignee、address、money、goods、state |
| warehouse | 仓库 | warehouse_name |
| transfer | 中转 | waybill_id、warehouse_id、中转时间 |
| goods | 货物 | goods_name |
| goods_associated | 货物关联 | 运单-货物关联 |
| user_way | 用户地址簿 | 常用收货地址 |
| list_log | 清单日志 | 操作留痕 |
设计说明:运单号用「时间戳 + 序列」生成保证唯一可读;中转表把运单和仓库解耦成多对多,一件货经过几个仓库一目了然;货物与运单分离建模,同类货物可复用档案。
五、接口演示
登录签发 JWT,随后携带 token 调用业务接口,实测响应如下:

POST /user/login:工号密码登录,返回 JWT;GET /warehouse/queryList:仓库列表(分页);POST /waybill/queryByState:按状态分页查运单;POST /waybill/updateState:推进运单状态;POST /goods/queryList、POST /goods/saveGoods等货物档案全套 CRUD。
全部接口遵循统一响应结构,接任何一门前端(uniapp 小程序、Vue 管理台、安卓 App)都只需要处理 code/ msg / data 三个字段。
六、小结
这套代码的价值在于把「后端服务该有的样子」做全了:JWT 无状态鉴权、统一响应体、BO 参数校验、MyBatis-Plus 条件构造分页、状态机 + 中转 + 日志三级追溯。没有一行业务界面,但每个接口都能用 curl 直接验证,拿来当微服务拆分的起点也很合适。
想继续演进的话:可以补 Swagger 注解生成在线文档、接入 Redis 缓存热点运单查询、或者把 JWT 换成 Spring Security + OAuth2 做多端权限细分。
完整资源已整理上传(含可运行后端源码、数据库脚本与接口清单):
如果在实现类似系统时遇到问题,欢迎评论区交流。