devin/1782022411-archive-kind-3c
main
下一步要收集 3C(电子)产品,且后期还会加入药品、机械等独立品类。本 PR 不为每个领域写死一张明细表,而是建立一套元数据驱动的「档案模式 (archive_kind)」框架:新增领域 = 一条迁移(种子字段模板 + 品类子树),不再改后端/前端代码。
category.archive_kind
kind_field
product.attributes
food_detail
CompletenessFields
基础字段(name/gtin/brand/category/image)
qualified
completenessKeys(kind, qkeys): if kind == "food": return CompletenessFields return genericBaseFields ++ qkeys // qkeys = kind_field WHERE qualified
model_number
ccc_cert
screen_size
GET /api/kind-fields?kind=
attributes
product.specs
kind_test.go
ListKindFields
go test ./...
go vet
gofmt
tsc && vite build
- 新增 category.archive_kind 与 kind_field 字段模板表(迁移 0010) - 种子 electronics 字段模板 + 3C 品类树(手机/笔记本/平板等) - 后端按档案模式动态计算完整度/合格:食品沿用 food_detail, 其它模式走 product.attributes + kind_field - 新增 GET /api/kind-fields?kind= 接口 - 后台编辑页按品类模式动态渲染规格参数表单 - 公开详情页/接口输出带标签的规格表 Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
No dependencies set.
The note is not visible to the blocked user.
背景
下一步要收集 3C(电子)产品,且后期还会加入药品、机械等独立品类。本 PR 不为每个领域写死一张明细表,而是建立一套元数据驱动的「档案模式 (archive_kind)」框架:新增领域 = 一条迁移(种子字段模板 + 品类子树),不再改后端/前端代码。
框架
category.archive_kind:每个品类归属一个档案模式(food / electronics / drug …),子类自动继承父类模式。kind_field表:定义各模式的录入字段(key/中文标签/类型/单位/选项/分组/排序/是否计入合格)。product.attributesJSONB(已有 GIN 索引)。食品维持成熟的food_detail表作为内置模式。CompletenessFields基础字段(name/gtin/brand/category/image)+ 该模式qualified规格字段首批落地:electronics(3C)
model_number/ccc_cert/screen_size计入合格。接口与前端
GET /api/kind-fields?kind=返回字段模板。kind_field动态渲染「规格参数」表单(分组/下拉/数字/多值),保存写入attributes。product.specs)。兼容性
attributes为 nil 表示不改动;down 迁移可回滚(卸载 3C 品类、删 kind_field、删列)。测试
kind_test.go:验证 electronics 不要求食品字段、qualified 规格字段驱动 missing 与质量分上升、ListKindFields模板正确。go test ./.../go vet/gofmt全过;admin + public 前端tsc && vite build通过;迁移 up/down 往返验证通过。