devin/1782295354-contribution-form-dynamic
main
贡献商品档案表单此前写死食品营养字段,与现有多品类(食品/药品/3C/通用)不匹配。本 PR 让表单按所选品类的 archive_kind 动态渲染对应字段,并打通后端落库。除「商品名称」外全部字段改为选填,支持只提供少量信息提交。
archive_kind
后端
ListCategories
COALESCE(archive_kind,'generic')
GET /api/v1/kind-fields?kind=X
kind_field
SubmissionInput
attributes map[string]any
nutriments
ApproveSubmission
attributes
product.attributes
COALESCE($n::jsonb,'{}')
attributes = product.attributes || COALESCE($n::jsonb,'{}')
food_detail
前端 (Contribute.tsx)
Contribute.tsx
kindFields(kind)
field_type
select
textarea
list
number
text
group_label
qualified
*
food
选品类 → kind=archive_kind food → 营养区(nutriments) → food_detail drug → kind-fields 18 字段(attributes) → product.attributes electronics → kind-fields 字段(attributes) → product.attributes generic → 仅基础信息
本地 ephemeral Postgres 跑全部迁移(33 个 kind_field / 37 个品类),起 server+admin 实测:
GET /api/v1/categories
/api/v1/kind-fields?kind=drug
electronics
go build ./... && go vet ./...
npm run build
- categories 接口返回 archive_kind - 新增公开只读接口 /api/v1/kind-fields?kind=X 返回字段模板 - 投稿 payload 支持通用 attributes,审核通过写入 product.attributes (JSONB 合并) - food_detail 仅在含食品数据时才 upsert (药品/3C/通用不再产生空行) - 前端 Contribute 按所选品类 archive_kind 动态渲染字段 (食品营养 / 药品 18 字段 / 3C / 通用),除商品名外均选填 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.
Summary
贡献商品档案表单此前写死食品营养字段,与现有多品类(食品/药品/3C/通用)不匹配。本 PR 让表单按所选品类的
archive_kind动态渲染对应字段,并打通后端落库。除「商品名称」外全部字段改为选填,支持只提供少量信息提交。后端
ListCategories返回每个品类的archive_kind(COALESCE(archive_kind,'generic'))。GET /api/v1/kind-fields?kind=X(限流),返回kind_field字段模板(label/类型/单位/选项/排序/qualified),供前端驱动表单。SubmissionInput新增通用attributes map[string]any,与既有nutriments并存(完全向后兼容)。ApproveSubmission把attributes写入product.attributesJSONB:新建用COALESCE($n::jsonb,'{}'),更新用attributes = product.attributes || COALESCE($n::jsonb,'{}')合并,不覆盖既有键。food_detail改为条件 upsert——仅当投稿含食品数据(nutriments/配料/营养基准/份量/nutri_score 任一)时才写入,药品/3C/通用不再产生空 food_detail 行。前端 (
Contribute.tsx)archive_kind推导 kind;非食品/通用时拉取kindFields(kind)。field_type渲染:select(下拉+选项)、textarea、list(按换行/逗号/顿号拆成数组)、number(parseFloat)、text;按group_label分组;qualified字段标*。food显示营养区(走nutriments);其余 kind 收集为attributes。验证
本地 ephemeral Postgres 跑全部迁移(33 个
kind_field/ 37 个品类),起 server+admin 实测:GET /api/v1/categories返回 archive_kind;/api/v1/kind-fields?kind=drug返回 18 字段(含 select 选项),electronics返回 15 字段。product.attributes正确写入,且未产生 food_detail 行。food_detail正确写入,product.attributes为空(向后兼容)。go build ./... && go vet ./...通过;前端npm run build(tsc+vite)通过。