feat(web+api): 贡献表单按 archive_kind 动态生成字段 #32
Reference in New Issue
Block a user
Delete Branch "devin/1782295354-contribution-form-dynamic"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
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)通过。