feat(admin): 运营后台(登录/查看/编辑补全)+ 写入API + 审计留痕 #4

Merged
lixu merged 6 commits from devin/1781923221-admin-console into main 2026-06-20 13:42:10 +08:00
Owner

OpenGoods 运营后台 + 公开首页/投稿/审核(P1)

本 PR 在「带登录运营后台」基础上,新增公开首页(人人可搜)+ 好心人投稿 + 后台人工审核收纳,构成完整的公众可用商品事实库。公开 API(/api/v1)保持只读、契约不变。

一、运营后台(方案 A:直接编辑 + 全程留痕)

  • 登录(JWT) / 商品列表搜索翻页 / 详情编辑(基础字段 + 配料 + 营养 + Nutri-Score + 图片URL + 建议零售价MSRP)
  • 缺失字段补全提示;每次写入自动重算质量分
  • 全程审计留痕,人工修改以 source=manual 记录字段级溯源
  • 部署:新增 admin 容器(127.0.0.1:8121),nginx 反代 /ping

二、公开首页 + 投稿(本次新增)

  • 公开前端 SPApublic-frontend/,根路径 /):首页大搜索框、检索结果、只读商品详情、贡献档案表单、提交成功页
  • 公开写入端点 POST /api/public/submissions(无需登录,基础频率限流 5次/10分钟/IP):投稿写入 submission 待审核队列,绝不直接写 product
  • 首页 API 调用说明公开站 / → 顶栏「API」/首页链接/页脚):列出全部只读端点(条码/搜索/详情/营养/MSRP/品牌/品类/来源)+ 参数表 + curl 请求与 JSON 返回示例 + 复制按钮 + 免责声明,方便第三方免鉴权接入
  • 公开只读 api 服务(8120)内嵌公开 SPA;Dockerfile.prod 增加 node 构建阶段 + 内嵌 dist

三、后台审核收纳(本次新增)

  • 审核队列:待审核 / 已通过 / 已驳回 三态列表 → 查看投稿详情
  • 通过:创建新商品或补全已有商品(按条码匹配,补全仅覆盖本次提供字段)+ 记 source=community(trust=0.50) 字段级溯源 + 写审计 approve_submission + 重算质量分 + 标记 submission=approved
  • 驳回:记录原因、审核人、时间,submission=rejected;已处理投稿再次操作返回 409

数据库

  • 迁移 0006submission 投稿表(payload JSONB + 状态 + 审核信息 + 来源IP)+ community 来源(trust_weight=0.50);按 (status, created_at) 建索引

验证(已部署 goods.tangshasha.com 端到端通过)

  • https://goods.tangshasha.com/ → 公开首页 SPA 正常加载
  • /api/v1/products/search?q=nutella → 只读 API 不变
  • POST /api/public/submissions → 201 {id,status:pending}
  • 后台 /ping:待审核列表 → 通过(生成商品并出现在公开 API,溯源 community、审计 approve_submission)/ 驳回(记原因)
  • 后端 go build / go vet 通过;两套前端 tsc && vite build 通过
  • 注:测试数据已清理,商品库恢复初始 4 条

该仓库在 Gitea,无 CI 流水线。

# OpenGoods 运营后台 + 公开首页/投稿/审核(P1) 本 PR 在「带登录运营后台」基础上,新增**公开首页(人人可搜)+ 好心人投稿 + 后台人工审核收纳**,构成完整的公众可用商品事实库。公开 API(`/api/v1`)保持只读、契约不变。 ## 一、运营后台(方案 A:直接编辑 + 全程留痕) - 登录(JWT) / 商品列表搜索翻页 / 详情编辑(基础字段 + 配料 + 营养 + Nutri-Score + 图片URL + 建议零售价MSRP) - 缺失字段补全提示;每次写入自动重算质量分 - 全程审计留痕,人工修改以 `source=manual` 记录字段级溯源 - 部署:新增 `admin` 容器(127.0.0.1:8121),nginx 反代 `/ping` ## 二、公开首页 + 投稿(本次新增) - **公开前端 SPA**(`public-frontend/`,根路径 `/`):首页大搜索框、检索结果、只读商品详情、贡献档案表单、提交成功页 - **公开写入端点** `POST /api/public/submissions`(无需登录,基础频率限流 5次/10分钟/IP):投稿写入 `submission` 待审核队列,**绝不直接写 product** - **首页 API 调用说明**(`公开站 /` → 顶栏「API」/首页链接/页脚):列出全部只读端点(条码/搜索/详情/营养/MSRP/品牌/品类/来源)+ 参数表 + curl 请求与 JSON 返回示例 + 复制按钮 + 免责声明,方便第三方免鉴权接入 - 公开只读 api 服务(8120)内嵌公开 SPA;`Dockerfile.prod` 增加 node 构建阶段 + 内嵌 dist ## 三、后台审核收纳(本次新增) - 审核队列:`待审核 / 已通过 / 已驳回` 三态列表 → 查看投稿详情 - **通过**:创建新商品或补全已有商品(按条码匹配,补全仅覆盖本次提供字段)+ 记 `source=community`(trust=0.50) 字段级溯源 + 写审计 `approve_submission` + 重算质量分 + 标记 submission=approved - **驳回**:记录原因、审核人、时间,submission=rejected;已处理投稿再次操作返回 409 ## 数据库 - 迁移 `0006`:`submission` 投稿表(payload JSONB + 状态 + 审核信息 + 来源IP)+ `community` 来源(trust_weight=0.50);按 (status, created_at) 建索引 ## 验证(已部署 goods.tangshasha.com 端到端通过) - `https://goods.tangshasha.com/` → 公开首页 SPA 正常加载 - `/api/v1/products/search?q=nutella` → 只读 API 不变 - `POST /api/public/submissions` → 201 `{id,status:pending}` - 后台 `/ping`:待审核列表 → 通过(生成商品并出现在公开 API,溯源 community、审计 approve_submission)/ 驳回(记原因) - 后端 `go build` / `go vet` 通过;两套前端 `tsc && vite build` 通过 - 注:测试数据已清理,商品库恢复初始 4 条 > 该仓库在 Gitea,无 CI 流水线。
lixu added 1 commit 2026-06-20 10:53:58 +08:00
feat(admin): 运营后台(登录/查看/审核编辑/补全)+ 写入API + 审计留痕
CI / Go (api) (pull_request) Failing after 18s
CI / Python (ingestion) (pull_request) Successful in 7s
CI / Migrations (postgres) (pull_request) Failing after 18s
d90a539e6b
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
lixu added 1 commit 2026-06-20 10:54:36 +08:00
build(admin): npm 走 npmmirror 镜像以适配部署环境网络
CI / Go (api) (pull_request) Failing after 19s
CI / Python (ingestion) (pull_request) Successful in 7s
CI / Migrations (postgres) (pull_request) Failing after 21s
bad771e172
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
lixu added 1 commit 2026-06-20 13:12:47 +08:00
feat: 公开首页(搜索+商品详情) + 好心人投稿 + 后台审核收纳
CI / Go (api) (pull_request) Failing after 20s
CI / Python (ingestion) (pull_request) Successful in 8s
CI / Migrations (postgres) (pull_request) Failing after 17s
c9a4404052
- 公开前端 SPA(根路径 /):首页大搜索框、检索结果、只读商品详情、贡献档案表单
- 公开写入端点 POST /api/public/submissions(无需登录,基础频率限流),投稿进入 submission 待审核队列,不直接写 product
- 迁移 0006:submission 投稿表 + community 来源(trust=0.50)
- 后台审核队列:列表(待审核/已通过/已驳回) → 查看投稿 → 通过(创建/补全商品 + 记 source=community + 字段级溯源 + 审计 + 重算质量分) / 驳回(记原因)
- 公开只读 api 服务内嵌公开 SPA;Dockerfile.prod 增加 node 构建阶段 + 内嵌 dist

Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
lixu added 1 commit 2026-06-20 13:26:56 +08:00
feat(public): 首页新增 API 调用说明页(只读端点/参数/示例/免责声明)
CI / Python (ingestion) (pull_request) Successful in 6s
CI / Go (api) (pull_request) Failing after 17s
CI / Migrations (postgres) (pull_request) Failing after 20s
2d95052bd9
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
lixu added 1 commit 2026-06-20 13:34:02 +08:00
chore(public): 页脚添加 ICP 备案号 鲁ICP备2025185218号-6
CI / Go (api) (pull_request) Failing after 20s
CI / Python (ingestion) (pull_request) Successful in 8s
CI / Migrations (postgres) (pull_request) Failing after 16s
8909ddcb69
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
lixu added 1 commit 2026-06-20 13:37:27 +08:00
chore: 站名改为「天工商品档案公共仓」(公开站 + 后台标题/页头/页脚/API 文案)
CI / Go (api) (pull_request) Failing after 15s
CI / Python (ingestion) (pull_request) Successful in 7s
CI / Migrations (postgres) (pull_request) Failing after 19s
5bfb2d3a5f
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
lixu merged commit 88d5766e8e into main 2026-06-20 13:42:10 +08:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: lixu/goods#4