plan.md 4.9 KB

Implementation Plan: 商品规格(SKU 规格)管理

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.

Summary

将 cte_server 的商品规格功能("规格加价"模型)移植到 foodie_server。引入规格组(food_specs)、规格值(food_specs_value)、商品-规格关联(food_spec_relation)三张表,复用 foodie 现有 MyBatis-Plus + fastjson + 若依技术栈。能力覆盖:商家端规格模板管理 CRUD、商品保存时挂载/更新规格关联、商品列表与详情接口返回规格结构、下单/促销链路按规格加价计价。保留现有 pos_food.food_sku JSON 字段与结构化关联双写,以兼容既有前端与订单读取逻辑。

Technical Context

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_specsfood_specs_valuefood_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:

  • 模块依赖 admin→system 不可反向(实体/mapper/service 在 ruoyi-system,controller 在 ruoyi-admin)。
  • 后端文件也是 CRLF 换行(编辑 Java/XML 注意匹配)。
  • 数据库变更写入 updatesql/sql.md,不直接执行。
  • 前端新增面向用户文字必须 $t() 国际化,四语言文件(zh/tw/en/vi)同步。
  • 新增字段须全栈同步(实体→xml→dto→service→controller→vue→i18n→sql)。
  • 规格名称是商家录入的动态多语言数据,按 language 字段承载,不做 i18n key。

Scale/Scope: 后端 3 实体 + 3 mapper(+xml) + 3 service + 1 新建 FoodSpecController + 改 PosFoodController(setposfood 挂规格、列表/详情注入规格);前端 1 规格管理页 + 商品编辑页规格选择区 + 列表/详情规格展示;1 份 SQL 迁移。

Constitution Check

.specify/memory/constitution.md 当前为未填写的占位模板,无实际项目原则/gates 约束 → PASS,无违规需论证。

Project Structure

Documentation (this feature)

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 产出,本阶段不创建)

Source Code (repository root)

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(与商品管理同端)。

Complexity Tracking

无 Constitution 违规,本节不适用。