Admin:PDD 商品页面 #18

Closed
opened 2026-08-07 10:50:11 +08:00 by ila · 2 comments
Owner

基本信息

  • 类型:需求
  • 父级大工单:#14
  • 所属 MVP / 版本:#15 / MVP
  • 阶段:3. PDD 商品数据与规格匹配
  • 依赖:#16(表已建好)、#17(否则建出的采集任务没人能领)

要解决什么

#16 把 pdd_products 建好了,但界面完全没有——四个页面还是骨架,
所有写操作返回"尚未实现"。现在要建一条 PDD 商品记录只能手工写 SQL。

PDD 商品在 #16 之后已经是独立实体(有自己的表、自己的采集状态、
可以被多个蝦皮商品共用),独立实体就该有自己的页面。

做完这个页面,Admin 侧的闭环就完整了:建 PDD 商品 → 发起采集 →
Client 领走执行 → 提交结果 → 页面显示已采集。整条链路不需要蝦皮和顺运宝的任何数据。

做什么 / 不做什么

做:

  1. 新增「PDD 商品」页(第五个顶级模块)
  2. 列表:按采集状态筛选 + 按商品 ID/链接搜索 + 多行勾选
  3. 创建:只填 PDD 链接
  4. 双击行打开弹窗:查看和编辑,含规格价格表
  5. 创建采集任务(不指定客户端)
  6. 软删除
  7. 更新 docs/admin/01 §4 和 docs/admin/05

不做(各自独立工单):

  • 蝦皮商品与 PDD 商品的关联入口(在蝦皮/顺运宝模块里做)
  • 蝦皮 Excel 导入
  • 规格匹配弹窗
  • 采购任务创建
  • 顺运宝相关

怎么做

这是第五个模块

docs/admin/01 §4 现在写着「顶级导航固定四个模块,顺序不变」,
本工单要改成五个。导航顺序:蝦皮数据 / PDD 商品 / 顺运宝数据 / 采购任务 / 客户端列表。

按 docs/admin/05 §2 的既有约定,页面用统一的三段式布局,objectName 用 pddProductPage。

顶部工具条

[创建] [创建采集任务]  采集状态[全部▾] 商品ID/链接[______] [搜索]  [删除]
  • 创建 → 弹窗只填 PDD 链接
  • 创建采集任务 → 勾选多行后可用
  • 采集状态筛选 → 全部 / 未采集 / 采集中 / 已采集 / 采集失败。
    [必须] 这个页面的主要用途是维护(找出失败的重采、找出没采的),
    只按 ID 搜的话要翻页找,筛选是刚需
  • 删除 → 勾选多行后可用

中间表格

列 显示规则
勾选 支持批量删除、批量建采集任务
商品 ID goods_id
标题 采集回来的,未采集时显示占位符;截断加悬停
PDD 链接 截断显示,可点开
采集状态 中文文字,不能只靠颜色
规格数 从 skus_json 算。[必须] 采到 1 个和采到 20 个差别很大——只采到 1 个通常意味着没点开规格面板,是采集有问题,这一列能一眼看出来
采集时间 本地时区;未采集显示 —
更新时间

[建议] 规格数用 SQLite 的 json_array_length(skus_json, '$.skus') 直接算,
不要把整个 JSON 读进 Go 再数(本项目 SQLite 3.50,实测 json_each / json_array_length 可用)。

双击行打开的弹窗

┌─────────────────────────────────────────────┐
│ PDD 商品 737116531267                       │
├─────────────────────────────────────────────┤
│ 商品 ID    737116531267          (只读)    │
│ PDD 链接   [___________________](可编辑)   │
│ 标题       西装外套三件套        (只读)    │
│ 采集状态   已采集                            │
│ 失败原因   —                                 │
│ 采集时间   2026-08-07 15:20                  │
├─────────────────────────────────────────────┤
│ 规格(12 个)                                │
│ 颜色     尺码    价格      有货              │
│ 黑色     M      ¥12.56     是                │
│ 白色     M      ¥12.56     否                │
├─────────────────────────────────────────────┤
│              [重新采集] [取消] [保存]        │
└─────────────────────────────────────────────┘

[必须] 规格和价格必须显示。这是采集结果的全部价值所在——
不显示的话操作员没法确认"采得对不对、是不是我要的那个商品"。数据来自 skus_json,
维度顺序按 dimensions 里的 key 顺序(Go map 无序,必须靠它定顺序)。

[必须] 价格显示成 ¥12.56,底层存的是整数分。price_cent 为 null 时显示 未采到,
不要显示成 ¥0.00。

创建

[必须] 只填 PDD 链接,其余全靠采集回填。

[必须] 链接必须能解析出 goods_id,解析不出来直接报错,提示操作员给完整链接。
不接受短链——goods_id 有 UNIQUE 约束,防重全靠它;拿不到就没法查重,会存成多行。

调 repository.EnsurePddProduct(#16 已实现,含新建 / 复用 / 复活三分支)。

创建采集任务

[必须] 不指定客户端(依赖 #17)。谁领到就在领取时标记谁。

  • 勾选多行 → 按 goods_id 去重 → 建采集任务
  • collect_status 已是 collecting 的跳过,并在结果里说明跳过了几个
  • 建任务成功后调 MarkCollecting 把状态置为 collecting
  • 任务的 pdd_goods_url 和 pdd_goods_id 必须填(Client 契约要求 goods_url 必填)

[必须] 按钮文案用「创建采集任务」,不要用「采集」。 它做的是建一个任务,
不是立刻去采——真正的采集要等 Client 来领、去手机上跑,可能几秒也可能几分钟。
点完页面上只有状态从"未采集"变成"采集中",不说清楚操作员会以为没生效。

[必须] 结果在状态条明确提示:已创建 3 个采集任务,等待客户端领取(跳过 1 个采集中的)。

删除

软删除(#16 已实现)。二次确认框要写明:

将删除 3 条记录。删除后重新创建同一链接可恢复,但采集结果会清空。

(复活时清空旧采集结果是 #16 的既定行为——记录被删过一次,旧数据不该再当有效的用。)

底部状态条

共 24 条 · 已采集 18 · 待采集 4 · 采集中 1 · 失败 1

预计修改文件

文件 改什么
admin/repository/pdd.go 列表查询(带状态筛选和关键词)、规格数统计、按 id 读单条
admin/service/pdd.go 新建:列表视图组装、创建采集任务(去重 + 跳过 collecting)
admin/handler/web/pdd.go 新建:页面处理器
admin/handler/web/web.go 注册路由
admin/templates/pdd/list.html 新建
admin/templates/pdd/edit_modal.html 新建
admin/templates/partials/header.html 导航加一项
admin/static/js/app.js 双击行开弹窗
admin/static/css/app.css 弹窗样式
docs/admin/01-requirements.md §4 四个模块 → 五个,新增 PDD 商品模块小节
docs/admin/05-ui-specification.md §2 导航、新增页面章节

验收标准

列表

  • 页面能打开,三段式布局,objectName 为 pddProductPage
  • 导航里出现「PDD 商品」,位置在蝦皮数据之后
  • 按采集状态筛选生效(五个选项)
  • 按商品 ID 和链接搜索生效
  • 规格数列正确(已采集显示实际条数,未采集显示 —)
  • 空状态文案分情况(从没创建过 / 筛选无结果)

创建

  • 只填链接即可创建,其余字段留空
  • 链接解析不出 goods_id 时报错,不写库
  • 重复创建同一链接不产生第二行
  • 软删除后重新创建同一链接,复活原行且采集结果被清空

弹窗

  • 双击行打开,显示商品信息
  • 规格表正确渲染(颜色/尺码/价格/有货),维度顺序按 dimensions
  • 价格显示为 ¥12.56,price_cent 为 null 时显示"未采到"而非 ¥0.00
  • 未采集时规格区显示"尚未采集"而不是空表
  • 能编辑链接并保存

创建采集任务

  • 勾选多行能批量创建,按 goods_id 去重
  • collecting 状态的被跳过,结果里说明跳过几个
  • 创建后状态变为 collecting
  • 任务的 pdd_goods_url 有值
  • 任务不指定客户端(assigned_client 为空,status 为 pending)
  • 状态条提示"已创建 N 个采集任务,等待客户端领取"
  • 按钮文案是「创建采集任务」

删除与安全

  • 批量删除是软删除,默认查询查不到
  • 二次确认写明"重新创建可恢复,但采集结果会清空"
  • 所有 POST 有 CSRF 防护
  • 所有查询带 WHERE deleted_at IS NULL 且只写在 repository 层
  • SQL 全部参数化

质量

  • go vet / gofmt -l . / go test ./... 全过
  • 五个页面都能正常打开(回归)
  • 文档两处同步,链接与章节引用校验通过

怎么验证

cd D:\chengma\cmautobuy\admin
go vet ./...
gofmt -l .
go test ./... -count=1
go run .

浏览器打开 http://127.0.0.1:8080/pdd,走一遍:
创建 → 列表出现 → 双击看弹窗 → 勾选建采集任务 → 状态变采集中 →
用 curl 模拟 Client 领取并提交结果 → 刷新页面看到"已采集"和规格数。

不需要真机。

风险和回退

风险 应对
依赖 #17,未完成时建出的采集任务没人能领 先做 #17
规格数用 JSON 函数算,SQLite 版本不够会失败 本项目实测 3.50 可用;不放心可回退到 Go 里解析
弹窗需要 JS,容易滑向复杂前端 只允许原生 JS 或 htmx,不得引入框架和构建(admin/AGENTS.md 前端约束)
第五个模块改了基线 文档同步更新,工单里已列明

回退:改动集中在 admin/,git revert 即可,无表结构变更。

## 基本信息 - 类型:需求 - 父级大工单:#14 - 所属 MVP / 版本:#15 / MVP - 阶段:3. PDD 商品数据与规格匹配 - 依赖:#16(表已建好)、#17(否则建出的采集任务没人能领) ## 要解决什么 #16 把 `pdd_products` 建好了,但**界面完全没有**——四个页面还是骨架, 所有写操作返回"尚未实现"。现在要建一条 PDD 商品记录只能手工写 SQL。 PDD 商品在 #16 之后已经是**独立实体**(有自己的表、自己的采集状态、 可以被多个蝦皮商品共用),独立实体就该有自己的页面。 做完这个页面,**Admin 侧的闭环就完整了**:建 PDD 商品 → 发起采集 → Client 领走执行 → 提交结果 → 页面显示已采集。整条链路不需要蝦皮和顺运宝的任何数据。 ## 做什么 / 不做什么 做: 1. 新增「PDD 商品」页(**第五个顶级模块**) 2. 列表:按采集状态筛选 + 按商品 ID/链接搜索 + 多行勾选 3. 创建:只填 PDD 链接 4. 双击行打开弹窗:查看和编辑,含规格价格表 5. 创建采集任务(不指定客户端) 6. 软删除 7. 更新 `docs/admin/01` §4 和 `docs/admin/05` 不做(各自独立工单): - 蝦皮商品与 PDD 商品的关联入口(在蝦皮/顺运宝模块里做) - 蝦皮 Excel 导入 - 规格匹配弹窗 - 采购任务创建 - 顺运宝相关 ## 怎么做 ### 这是第五个模块 `docs/admin/01` §4 现在写着「顶级导航固定四个模块,顺序不变」, 本工单要改成五个。导航顺序:蝦皮数据 / **PDD 商品** / 顺运宝数据 / 采购任务 / 客户端列表。 按 `docs/admin/05` §2 的既有约定,页面用统一的三段式布局,`objectName` 用 `pddProductPage`。 ### 顶部工具条 ```text [创建] [创建采集任务] 采集状态[全部▾] 商品ID/链接[______] [搜索] [删除] ``` - **创建** → 弹窗只填 PDD 链接 - **创建采集任务** → 勾选多行后可用 - **采集状态筛选** → 全部 / 未采集 / 采集中 / 已采集 / 采集失败。 `[必须]` 这个页面的主要用途是维护(找出失败的重采、找出没采的), 只按 ID 搜的话要翻页找,筛选是刚需 - **删除** → 勾选多行后可用 ### 中间表格 | 列 | 显示规则 | |---|---| | 勾选 | 支持批量删除、批量建采集任务 | | 商品 ID | `goods_id` | | 标题 | 采集回来的,未采集时显示占位符;截断加悬停 | | PDD 链接 | 截断显示,可点开 | | 采集状态 | 中文文字,**不能只靠颜色** | | **规格数** | 从 `skus_json` 算。`[必须]` 采到 1 个和采到 20 个差别很大——只采到 1 个通常意味着没点开规格面板,是采集有问题,这一列能一眼看出来 | | 采集时间 | 本地时区;未采集显示 `—` | | 更新时间 | | `[建议]` 规格数用 SQLite 的 `json_array_length(skus_json, '$.skus')` 直接算, 不要把整个 JSON 读进 Go 再数(本项目 SQLite 3.50,实测 `json_each` / `json_array_length` 可用)。 ### 双击行打开的弹窗 ```text ┌─────────────────────────────────────────────┐ │ PDD 商品 737116531267 │ ├─────────────────────────────────────────────┤ │ 商品 ID 737116531267 (只读) │ │ PDD 链接 [___________________](可编辑) │ │ 标题 西装外套三件套 (只读) │ │ 采集状态 已采集 │ │ 失败原因 — │ │ 采集时间 2026-08-07 15:20 │ ├─────────────────────────────────────────────┤ │ 规格(12 个) │ │ 颜色 尺码 价格 有货 │ │ 黑色 M ¥12.56 是 │ │ 白色 M ¥12.56 否 │ ├─────────────────────────────────────────────┤ │ [重新采集] [取消] [保存] │ └─────────────────────────────────────────────┘ ``` `[必须]` **规格和价格必须显示**。这是采集结果的全部价值所在—— 不显示的话操作员没法确认"采得对不对、是不是我要的那个商品"。数据来自 `skus_json`, 维度顺序按 `dimensions` 里的 `key` 顺序(Go map 无序,必须靠它定顺序)。 `[必须]` 价格显示成 `¥12.56`,底层存的是整数分。`price_cent` 为 `null` 时显示 `未采到`, **不要显示成 ¥0.00**。 ### 创建 `[必须]` 只填 PDD 链接,其余全靠采集回填。 `[必须]` **链接必须能解析出 `goods_id`,解析不出来直接报错**,提示操作员给完整链接。 不接受短链——`goods_id` 有 UNIQUE 约束,防重全靠它;拿不到就没法查重,会存成多行。 调 `repository.EnsurePddProduct`(#16 已实现,含新建 / 复用 / 复活三分支)。 ### 创建采集任务 `[必须]` **不指定客户端**(依赖 #17)。谁领到就在领取时标记谁。 - 勾选多行 → 按 `goods_id` 去重 → 建采集任务 - `collect_status` 已是 `collecting` 的**跳过**,并在结果里说明跳过了几个 - 建任务成功后调 `MarkCollecting` 把状态置为 `collecting` - 任务的 `pdd_goods_url` 和 `pdd_goods_id` 必须填(Client 契约要求 `goods_url` 必填) `[必须]` **按钮文案用「创建采集任务」,不要用「采集」。** 它做的是建一个任务, 不是立刻去采——真正的采集要等 Client 来领、去手机上跑,可能几秒也可能几分钟。 点完页面上只有状态从"未采集"变成"采集中",不说清楚操作员会以为没生效。 `[必须]` 结果在状态条明确提示:`已创建 3 个采集任务,等待客户端领取(跳过 1 个采集中的)`。 ### 删除 软删除(#16 已实现)。二次确认框要写明: > 将删除 3 条记录。删除后重新创建同一链接可恢复,**但采集结果会清空**。 (复活时清空旧采集结果是 #16 的既定行为——记录被删过一次,旧数据不该再当有效的用。) ### 底部状态条 `共 24 条 · 已采集 18 · 待采集 4 · 采集中 1 · 失败 1` ## 预计修改文件 | 文件 | 改什么 | |---|---| | `admin/repository/pdd.go` | 列表查询(带状态筛选和关键词)、规格数统计、按 id 读单条 | | `admin/service/pdd.go` | 新建:列表视图组装、创建采集任务(去重 + 跳过 collecting) | | `admin/handler/web/pdd.go` | 新建:页面处理器 | | `admin/handler/web/web.go` | 注册路由 | | `admin/templates/pdd/list.html` | 新建 | | `admin/templates/pdd/edit_modal.html` | 新建 | | `admin/templates/partials/header.html` | 导航加一项 | | `admin/static/js/app.js` | 双击行开弹窗 | | `admin/static/css/app.css` | 弹窗样式 | | `docs/admin/01-requirements.md` | §4 四个模块 → 五个,新增 PDD 商品模块小节 | | `docs/admin/05-ui-specification.md` | §2 导航、新增页面章节 | ## 验收标准 **列表** - [ ] 页面能打开,三段式布局,`objectName` 为 `pddProductPage` - [ ] 导航里出现「PDD 商品」,位置在蝦皮数据之后 - [ ] 按采集状态筛选生效(五个选项) - [ ] 按商品 ID 和链接搜索生效 - [ ] **规格数列正确**(已采集显示实际条数,未采集显示 `—`) - [ ] 空状态文案分情况(从没创建过 / 筛选无结果) **创建** - [ ] 只填链接即可创建,其余字段留空 - [ ] **链接解析不出 `goods_id` 时报错**,不写库 - [ ] 重复创建同一链接不产生第二行 - [ ] 软删除后重新创建同一链接,**复活原行**且采集结果被清空 **弹窗** - [ ] 双击行打开,显示商品信息 - [ ] **规格表正确渲染**(颜色/尺码/价格/有货),维度顺序按 `dimensions` - [ ] 价格显示为 `¥12.56`,`price_cent` 为 null 时显示"未采到"而非 ¥0.00 - [ ] 未采集时规格区显示"尚未采集"而不是空表 - [ ] 能编辑链接并保存 **创建采集任务** - [ ] 勾选多行能批量创建,按 `goods_id` 去重 - [ ] `collecting` 状态的被跳过,结果里说明跳过几个 - [ ] 创建后状态变为 `collecting` - [ ] 任务的 `pdd_goods_url` 有值 - [ ] **任务不指定客户端**(`assigned_client` 为空,`status` 为 `pending`) - [ ] 状态条提示"已创建 N 个采集任务,等待客户端领取" - [ ] 按钮文案是「创建采集任务」 **删除与安全** - [ ] 批量删除是软删除,默认查询查不到 - [ ] 二次确认写明"重新创建可恢复,但采集结果会清空" - [ ] 所有 POST 有 CSRF 防护 - [ ] 所有查询带 `WHERE deleted_at IS NULL` 且只写在 repository 层 - [ ] SQL 全部参数化 **质量** - [ ] `go vet` / `gofmt -l .` / `go test ./...` 全过 - [ ] 五个页面都能正常打开(回归) - [ ] 文档两处同步,链接与章节引用校验通过 ## 怎么验证 ```powershell cd D:\chengma\cmautobuy\admin go vet ./... gofmt -l . go test ./... -count=1 go run . ``` 浏览器打开 <http://127.0.0.1:8080/pdd>,走一遍: 创建 → 列表出现 → 双击看弹窗 → 勾选建采集任务 → 状态变采集中 → 用 curl 模拟 Client 领取并提交结果 → 刷新页面看到"已采集"和规格数。 不需要真机。 ## 风险和回退 | 风险 | 应对 | |---|---| | 依赖 #17,未完成时建出的采集任务没人能领 | 先做 #17 | | 规格数用 JSON 函数算,SQLite 版本不够会失败 | 本项目实测 3.50 可用;不放心可回退到 Go 里解析 | | 弹窗需要 JS,容易滑向复杂前端 | 只允许原生 JS 或 htmx,不得引入框架和构建(`admin/AGENTS.md` 前端约束) | | 第五个模块改了基线 | 文档同步更新,工单里已列明 | 回退:改动集中在 `admin/`,`git revert` 即可,无表结构变更。
Author
Owner

实施完成,待验收

  • 实现提交: eb8d357 feat: PDD 商品页面 (#18)
  • 归档提交: 4975c68 docs: 归档任务 #18
  • 归档文档: docs/task/18-admin-pdd-商品页面.md

验证结果(架构角色亲自复跑,Go 1.23.0)

go vet / gofmt -l . 无输出;go test ./... -count=1 → ok cmautobuy/admin/service 0.945s。本工单新增 32 个用例。

补测了工单和实现报告都未覆盖的两项:

① 并发建采集任务 —— 4 个 curl 同时 POST /pdd/collect、同一个 goods_id
→ tasks 表里正好 1 条,商品置 collecting。
MarkCollecting 在事务里同时充当「有没有人在采」的判断,单线程读代码看不出它扛不扛并发。

② 商品标题 XSS —— 标题来自拼多多,是外部不可信数据。
提交 title = "<script>alert('XSS')</script>正常标题"、规格含 <img src=x onerror=alert(1)>
→ 列表页原样 <script> 出现 0 次、弹窗原样 onerror 出现 0 次,均为转义形态。

其余:短链和淘宝链接 400 且不写库、无 CSRF 的 POST 403、端到端建商品→建任务→领取→提交→刷新流转正确、13 规格弹窗 14 行 3808 字节、软删除后重建同链接复活原行(id 不变)、五个页面全部 200。

12 项验收标准全部通过。

审查打回一次

docs/admin/05 §4.3 仍写着蝦皮弹窗是「PDD 链接唯一的录入口,也是采集的唯一发起点」,与新增的 PDD 页自相矛盾——而实际情况是反过来的,蝦皮页的 ShopeeCollect 是骨架(501),真能用的只有 PDD 页。

实现报告把它列为「已知待收敛点」,方向对但范围少了:全库共 5 处。架构角色先按 CLAUDE.md §7.3「单处笔误」例外自改 §4.3,发现该例外不成立,剩余 3 处按 §7.2 打回。

同时发现 #16 的遗留:shopee.go 的 TODO 写着「空 → no_link」,而 no_link 已在 #16 从 CHECK 约束删除,照写会直接撞约束。

返工后 3 处说法已对齐、no_link TODO 已改并加警告。「不要放到表格每一行,N 个 SKU 行会建出 N 个重复任务」这条理由四处全部保留,只把适用范围收窄。行为未动。

未验证到的部分

  • 浏览器里的真实交互:双击开弹窗、Esc 关闭、全选联动、删除二次确认,只验证了服务端 HTML 和 JS 源码,没在真实浏览器里点过
  • 深/浅色主题、1366×768、显示缩放:CSS 手写新增,没有实机看过
  • 20 个以上规格的弹窗滚动:测到 13 个
  • artifact_ref 仍未规范化(#16 遗留)

遗留

  1. 蝦皮页与 PDD 页两个采集入口并存,蝦皮页那个是骨架;合并归「蝦皮↔PDD 关联入口」工单,两处文档已标注
  2. 采集任务在界面上看不见——/tasks 只查 purchase。已建 #19 处理
## 实施完成,待验收 - **实现提交:** `eb8d357` feat: PDD 商品页面 (#18) - **归档提交:** `4975c68` docs: 归档任务 #18 - **归档文档:** `docs/task/18-admin-pdd-商品页面.md` ### 验证结果(架构角色亲自复跑,Go 1.23.0) `go vet` / `gofmt -l .` 无输出;`go test ./... -count=1` → `ok cmautobuy/admin/service 0.945s`。本工单新增 32 个用例。 补测了工单和实现报告都未覆盖的两项: **① 并发建采集任务** —— 4 个 curl 同时 POST `/pdd/collect`、同一个 `goods_id` → `tasks` 表里**正好 1 条**,商品置 `collecting`。 `MarkCollecting` 在事务里同时充当「有没有人在采」的判断,单线程读代码看不出它扛不扛并发。 **② 商品标题 XSS** —— 标题来自拼多多,是外部不可信数据。 提交 `title = "<script>alert('XSS')</script>正常标题"`、规格含 `<img src=x onerror=alert(1)>` → 列表页原样 `<script>` 出现 **0** 次、弹窗原样 `onerror` 出现 **0** 次,均为转义形态。 其余:短链和淘宝链接 400 且不写库、无 CSRF 的 POST 403、端到端建商品→建任务→领取→提交→刷新流转正确、13 规格弹窗 14 行 3808 字节、软删除后重建同链接复活原行(id 不变)、五个页面全部 200。 12 项验收标准全部通过。 ### 审查打回一次 `docs/admin/05` §4.3 仍写着蝦皮弹窗是「PDD 链接**唯一**的录入口,也是采集的**唯一**发起点」,与新增的 PDD 页自相矛盾——而实际情况是反过来的,蝦皮页的 `ShopeeCollect` 是骨架(501),真能用的只有 PDD 页。 实现报告把它列为「已知待收敛点」,方向对但范围少了:全库共 **5 处**。架构角色先按 `CLAUDE.md` §7.3「单处笔误」例外自改 §4.3,**发现该例外不成立**,剩余 3 处按 §7.2 打回。 同时发现 #16 的遗留:`shopee.go` 的 TODO 写着「空 → `no_link`」,而 `no_link` 已在 #16 从 CHECK 约束删除,照写会直接撞约束。 返工后 3 处说法已对齐、`no_link` TODO 已改并加警告。「不要放到表格每一行,N 个 SKU 行会建出 N 个重复任务」这条理由四处**全部保留**,只把适用范围收窄。行为未动。 ### 未验证到的部分 - **浏览器里的真实交互**:双击开弹窗、Esc 关闭、全选联动、删除二次确认,只验证了服务端 HTML 和 JS 源码,**没在真实浏览器里点过** - **深/浅色主题、1366×768、显示缩放**:CSS 手写新增,没有实机看过 - **20 个以上规格的弹窗滚动**:测到 13 个 - `artifact_ref` 仍未规范化(#16 遗留) ### 遗留 1. 蝦皮页与 PDD 页两个采集入口并存,蝦皮页那个是骨架;合并归「蝦皮↔PDD 关联入口」工单,两处文档已标注 2. **采集任务在界面上看不见**——`/tasks` 只查 `purchase`。已建 #19 处理
Author
Owner

验收通过,关闭

用户实机确认通过。归档状态已更新为「验收通过」(bf81bad)。

相关提交:

  • eb8d357 feat: PDD 商品页面 (#18)
  • 4975c68 docs: 归档任务 #18
  • bf81bad docs: 记录 #18 #23 验收通过

归档: docs/task/18-admin-pdd-商品页面.md

工具条的后续调整见 #23。

结转到后续工单的遗留

  1. 蝦皮页与 PDD 页两个采集入口并存,蝦皮页那个是骨架(501);归「蝦皮↔PDD 关联入口」工单
  2. 采集任务在界面上看不见(/tasks 只查 purchase)→ Admin:任务页改造,采集与采购统一展示 (#19)
  3. artifact_ref 未规范化(#16 遗留),需与 Client 侧一起定格式
## 验收通过,关闭 用户实机确认通过。归档状态已更新为「验收通过」(`bf81bad`)。 **相关提交:** - `eb8d357` feat: PDD 商品页面 (#18) - `4975c68` docs: 归档任务 #18 - `bf81bad` docs: 记录 #18 #23 验收通过 **归档:** `docs/task/18-admin-pdd-商品页面.md` 工具条的后续调整见 #23。 ### 结转到后续工单的遗留 1. 蝦皮页与 PDD 页两个采集入口并存,蝦皮页那个是骨架(501);归「蝦皮↔PDD 关联入口」工单 2. **采集任务在界面上看不见**(`/tasks` 只查 `purchase`)→ #19 3. `artifact_ref` 未规范化(#16 遗留),需与 Client 侧一起定格式
ila closed this issue 2026-08-07 14:19:46 +08:00
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: chengma/cmautobuy#18