Branch: test(按用户要求不创建特性分支,直接在 test 分支开发) | Date: 2026-07-15 | Spec: spec.md
Input: Feature specification from /specs/013-food-spec/spec.md
Note: This template is filled in by the /speckit-plan command.
将 cte_server 的商品规格功能("规格加价"模型)移植到 foodie_server。引入规格组(food_specs)、规格值(food_specs_value)、商品-规格关联(food_spec_relation)三张表,复用 foodie 现有 MyBatis-Plus + fastjson + 若依技术栈。能力覆盖:商家端规格模板管理 CRUD、商品保存时挂载/更新规格关联、商品列表与详情接口返回规格结构、下单/促销链路按规格加价计价。保留现有 pos_food.food_sku JSON 字段与结构化关联双写,以兼容既有前端与订单读取逻辑。
Language/Version: Java(Spring Boot + MyBatis-Plus),编译用 JDK 21(graalvm-jdk-21.0.7);前端 Vue.js + Element UI。
Primary Dependencies: Spring Boot;MyBatis-Plus(BaseMapper/IService/LambdaQueryWrapper);fastjson(JSONArray/JSONObject);若依 BaseController/AjaxResult/TableDataInfo;自定义 @Auth 注解 + JwtUtil;前端 vue-i18n、Element UI、axios。
Storage: MySQL。复用现有 pos_food 表;新增 food_specs、food_specs_value、food_spec_relation 三张表;保留 pos_food.food_sku 列。
Testing: 项目无自动化测试框架,采用手动接口验证(Postman/curl)+ quickstart.md 端到端场景。
Target Platform: Java 后端服务(若依多模块)+ Vue 商家端(foodie-store)。
Project Type: web-service(后端)+ web-frontend(商家端)。
Performance Goals: 常规后台/商家端接口,无特殊性能指标;商品列表注入规格采用批量查询 + 内存分组,避免 N+1。
Constraints:
updatesql/sql.md,不直接执行。$t() 国际化,四语言文件(zh/tw/en/vi)同步。language 字段承载,不做 i18n key。Scale/Scope: 后端 3 实体 + 3 mapper(+xml) + 3 service + 1 新建 FoodSpecController + 改 PosFoodController(setposfood 挂规格、列表/详情注入规格);前端 1 规格管理页 + 商品编辑页规格选择区 + 列表/详情规格展示;1 份 SQL 迁移。
.specify/memory/constitution.md 当前为未填写的占位模板,无实际项目原则/gates 约束 → PASS,无违规需论证。
specs/013-food-spec/
├── plan.md # 本文件(/speckit-plan 产出)
├── research.md # Phase 0 决策记录(/speckit-plan)
├── data-model.md # Phase 1 数据模型(/speckit-plan)
├── quickstart.md # Phase 1 验证指南(/speckit-plan)
├── contracts/ # Phase 1 接口契约(/speckit-plan)
│ └── api.md
└── tasks.md # Phase 2 任务清单(/speckit-tasks 产出,本阶段不创建)
ruoyi-system/src/main/java/com/ruoyi/system/
domain/ FoodSpecs.java, FoodSpecsValue.java, FoodSpecRelation.java
扩展 PosFood.java(transient: foodSpecs, sku)
mapper/ FoodSpecsMapper.java, FoodSpecsValueMapper.java, FoodSpecRelationMapper.java
service/ IFoodSpecsService(+Impl), IFoodSpecsValueService(+Impl), IFoodSpecRelationService(+Impl)
ruoyi-system/src/main/resources/mapper/system/
FoodSpecsMapper.xml, FoodSpecsValueMapper.xml, FoodSpecRelationMapper.xml
ruoyi-admin/src/main/java/com/ruoyi/app/mendian/
FoodSpecController.java(新建:规格管理 CRUD)
PosFoodController.java(改:setposfood/add/edit 写规格关联+food_sku;getfood/getidlist/stallFoodList/foodSearch 注入规格)
前端(E:\QtwCode\foodie\foodie-store\src\):
views/ 规格管理页(新建)+ 商品编辑页规格选择区(改)
api/ specs.js(新建)+ food.js(改 setposfood 提交规格)
lang/ zh.js / tw.js / en.js / vi.js(新增规格相关 i18n)
数据库: updatesql/sql.md(新增三表 DDL + pos_food.food_sku 列确认)
Structure Decision: 遵循现有若依多模块分层(domain/mapper/service 在 ruoyi-system,controller 在 ruoyi-admin,与 PosFood/PosFenlei 完全一致);前端落在商家端 foodie-store(与商品管理同端)。
无 Constitution 违规,本节不适用。