VibeCoding 实战:用 Qoder 从零开发 Java Spring Boot WMS 系统(六)
第5章 基础数据模块:掌握"单模块开发"标准打法
本章目标:开发第一个完整业务模块——基础数据(仓库 / 库区 / 储位 / 商品分类 / 商品)。更重要的是,本章会确立一套可复用的"单模块开发标准流程":后端 CRUD 分层生成 → 接口自测 → 前端页面生成 → 联调 → 提交。第6~8章都会沿用这套打法。
学习目标
- 掌握"一个模块从后端到前端跑通"的标准五步流程
- 会用 MyBatis-Plus 让 AI 高效生成 CRUD 分层代码
- 能独立设计"分页查询 + 条件筛选 + 增删改"接口并验证
- 会处理模块内业务校验(编码唯一、删除前引用检查)
- 养成"每模块一提交"的节奏
5.0 单模块开发标准流程(本章主线)
后面每个模块都按这五步走,请牢记:
① 讲清范围:引用 PRD/api 对应模块 + 说明本模块业务规则
② 后端生成:Entity → Mapper → Service → Controller(分页/条件查询 + CRUD + 校验)
③ 后端自测:mvnw compile + 启动 + 用 curl/Apifox 打通接口
④ 前端生成:列表页(查询/分页) + 新增/编辑弹窗 + 删除,调通
⑤ 提交:git commit,记录"XX 模块完成"
本章用商品(goods) 做完整示范,其余基础数据对象(仓库/库区/储位/分类)留给你用同样提示词批量完成。
5.1 讲清范围:先跟 AI 对齐"商品模块"要做什么
提示词
现在开始开发「基础数据」模块。# 引用 docs/api.md 和 #项目规则。
先从其中的「商品 goods」子模块开始,范围:
- 字段:编码(唯一)、名称、规格、单位、分类(外键 category_id)、状态、备注
- 功能:分页列表(支持按名称/编码模糊、按分类筛选)、新增、编辑、删除、按ID查详情
- 业务规则:
1. 商品编码全局唯一,新增/编辑时校验,重复则报错
2. 删除用逻辑删除;删除前若该商品已有库存或在出入库单明细中被引用,则禁止删除并提示
3. 分页返回 { total, list }
这一轮先不要写代码。请你复述你将要生成的文件清单(Entity/Mapper/Service/Controller/DTO/VO)
和接口清单,我确认后再开始。
💡 "先复述再生成"是控制 AI 的有效手段:花 10 秒确认它的理解,避免生成一堆跑偏的文件。
5.2 后端生成:Entity → Mapper → Service → Controller
提示词
确认无误,开始生成商品模块后端代码(包 com.yjoffer.miniwms.basedata):
1. 实体 Goods(映射 wms_goods,用 MyBatis-Plus 注解:@TableName、@TableId、
逻辑删除 @TableLogic、公共字段自动填充)
2. GoodsMapper extends BaseMapper<Goods>
3. DTO/VO:GoodsQueryDTO(分页+条件)、GoodsFormVO(新增/编辑入参,带 jakarta validation 注解:编码/名称必填、长度限制)
4. GoodsService extends IService<Goods>:
- page(GoodsQueryDTO):分页 + 名称/编码模糊 + 分类筛选
- save/update:保存前校验编码唯一;update 排除自身
- removeById:删除前做"是否被库存/单据引用"校验
- getDetail(id)
5. GoodsController:REST 接口,路径与 #docs/api.md 一致,统一返回 Result<T>,
入参加 @Validated 触发校验
6. 生成完成后 mvnw compile,报错就自行修复直到编译通过,贴出结果。
预期结果
basedata包下出现商品相关 6~7 个类- 编译通过
注意事项
- ⚠️ 校验注解要在 Controller 生效:确认
@Validated/@Valid加在了入参上,否则空编码也能提交。验证方式见 5.3。 - ⚠️ 编码唯一并发问题:AI 可能只做了"先查后插"。教学项目可接受,但你要知道企业里会加数据库唯一索引兜底——第3章建表时
goods_code应已有唯一索引,确认它在。 - 💡 MyBatis-Plus 的
IService/BaseMapper已自带大量 CRUD,让 AI 只在需要自定义 SQL(如联表查分类名)时写 XML/注解 SQL,避免过度生成。
5.3 后端自测:接口必须"打得通、验得对"
不要只编译过就往下走。真正调一次才说明模块后端 OK。
提示词
请帮我验证商品模块后端接口,用 curl 依次演示并把每条请求与响应贴给我:
1. 先登录拿 token
2. GET /api/goods/page?pageNum=1&pageSize=10 分页查
3. POST /api/goods 新增一条商品(合法数据),确认返回成功
4. POST /api/goods 用第3步相同编码再新增一次,确认返回"编码已存在"的失败 Result
5. POST /api/goods 传空名称,确认触发参数校验失败(说明 @Validated 生效)
6. PUT /api/goods 修改第3步那条的名称,确认成功
7. DELETE /api/goods/{id} 删除,确认成功(若无库存/引用)
如果哪一步不符合预期,分析原因并修复代码后重测,直到全部符合。
预期结果(对照)
| 用例 | 期望 |
|---|---|
| 分页查询 | 返回 {code:0, data:{total, list}} |
| 合法新增 | 成功 |
| 重复编码新增 | 失败,message 提示编码已存在 |
| 空名称新增 | 失败,参数校验错误 |
| 修改 | 成功 |
| 删除(无引用) | 成功,列表变少 |
💡 这四条"异常用例"(重复、空值)比"正常用例"更值得测——能触发校验的失败路径,才证明校验逻辑真的在工作。用 Apifox 把这套接口存成用例更好,后续回归一键跑。
5.4 前端生成:商品管理页
提示词
依据 #docs/api.md 商品接口,在前端 wms-web 生成「商品管理」页面(Vue3 <script setup> + Element Plus):
1. src/api/goods.ts:封装分页/新增/编辑/删除/详情接口
2. views/basedata/GoodsList.vue:
- 顶部查询区:名称、编码输入框 + 分类下拉 + 查询/重置
- 表格:列(编码/名称/规格/单位/分类/状态/操作) + 分页器
- 操作列:编辑、删除(二次确认)
- 右上角"新增"按钮,弹出 el-dialog 表单(带必填校验),保存后刷新列表
3. 在路由和左侧菜单里加上「基础数据 > 商品管理」入口
4. npm run dev 确认页面能打开、能完成"查询→新增→编辑→删除"闭环;报错自行修复。
预期结果
- 浏览器进入商品管理页,能看到列表、能搜索分页
- 新增/编辑弹窗提交后列表实时刷新;删除有二次确认
注意事项
- ⚠️ 前后端字段名要对齐(驼峰)。若列表某列恒为空,多半是前端字段名和后端 VO 不一致——把两边字段贴给 AI 让它对齐。
- 💡 让 AI 把"新增/编辑"复用一个抽屉组件,减少重复代码;这属于优化,可先不管跑通再说。
5.5 批量完成其余基础数据对象
商品跑通后,仓库/库区/储位/分类用同一套五步流程快速复制。这里给一个"批量提法",注意各对象的特殊规则:
提示词
沿用刚做好「商品模块」的代码风格和五步流程,依次完成其余基础数据子模块的后端+前端:
1. 仓库 warehouse:编码唯一、名称、地址、状态;分页CRUD
2. 库区 zone:属于某仓库(warehouse_id)、编码唯一;列表可按仓库筛选
3. 储位 location:属于某库区(zone_id)、编码唯一(如 A-01-02)、可标记是否启用;
列表可按仓库/库区级联筛选
4. 商品分类 category:名称、编码唯一;被商品引用,删除前校验是否有商品
每个子模块都要:生成后端→mvnw compile→curl 打通(含唯一性/引用校验的失败用例)→生成前端页面→加入菜单。
请一个模块一个模块做,每个模块做完先贴自测结果给我,再开始下一个。
注意事项
- ⚠️ 储位是 WMS 的关键主数据,入库上架、库存都按储位记。级联筛选(仓库→库区→储位)这里先做出来,第6章入库会直接复用。
- 💡 让 AI"一个模块做完先贴自测结果再做下一个",可以防止它一口气生成后错误累积、难以定位。
5.6 提交里程碑
提示词
基础数据模块(仓库/库区/储位/分类/商品)后端与前端均已完成并通过自测。
请:
1. 用 mvnw compile 确认后端整体编译通过
2. git add . && git commit -m "feat: 基础数据模块完成(仓库/库区/储位/分类/商品 CRUD+分页+校验+前端页面)"
3. 贴出 git log --oneline
本章检查清单
- [ ] 商品模块后端接口全部通过 5.3 的用例(含重复、空值两条失败用例)
- [ ] 商品管理前端页面完成查询/新增/编辑/删除闭环
- [ ] 仓库/库区/储位/分类四个子模块按同样流程完成
- [ ] 储位支持仓库→库区级联筛选(第6章要用)
- [ ] 已提交 Git
基础数据就绪,进入 第6章 入库管理模块,开始处理"有状态流转"的复杂业务。
常见问题
Q:为什么先做商品而不先做仓库? A:顺序不重要,重要的是先用一个对象把五步流程完整走通,形成肌肉记忆,后面的对象都是复用。商品字段适中、规则清晰,适合当"第一个"。
Q:AI 生成的前端和后端字段/接口老对不上?
A:根因通常是没把 docs/api.md 引用进对话,或前后端分两次生成时上下文丢了。解决:生成前端时一定 # 引用后端 Controller 或 api.md,让它照真实接口写。
Q:逻辑删除后,唯一编码会不会"删了又建不回来"? A:会。因为逻辑删除的数据还在表里占着唯一索引。这是真实坑点——让 AI 排查:"商品编码唯一索引和逻辑删除冲突,请给出方案(如唯一索引包含 deleted 字段 / 校验时忽略已删除的例外处理)。" 借这个问题体会"设计交叉处最容易出 Bug"。