docs: 建立 Admin 子项目的文档基线

仓库从单子项目变成两个:client(Python + PyQt5 桌面端)和
admin(Go + Gin + HTML 模板 Web 管理端)。两者技术栈完全不同,
规则各自独立,只通过三个 HTTP 接口交互。

新增 admin/AGENTS.md 和 docs/admin/ 共 9 份文档,结构与 docs/client/ 对齐。

关键设计决策(均已与用户确认)
- 四模块:蝦皮数据 / 顺运宝数据 / 采购任务 / 客户端列表,
  统一三段式布局(工具条 / 带勾选的表格 / 状态条)
- 蝦皮数据拆成商品表 + SKU 表:报表本身就是两层结构,
  且 PDD 链接是商品级的,放 SKU 级会重复维护
- pdd_data 存商品级,一个 PDD 商品采一次,所有订单共用
- SKU 映射独立成表且可复用,同一蝦皮 SKU 只需人工匹配一次
- PDD 链接人工填写,采集按钮就放在填链接的编辑弹窗里
- 任务分配给指定客户端;不加心跳,注册在领取时完成,
  在线状态由 last_seen_at 派生
- SQLite 驱动固定 modernc.org/sqlite(纯 Go 免 cgo,go build 直接出 exe)
- 不引入前端框架和 npm 构建,只允许原生 JS 或 htmx

基于样本文件 raw_data/蝦皮数据样本.xlsx 实测得出的约束
- 11287 行 = 5195 商品汇总行 + 6092 SKU 行,导入必须分开处理
- 商品規格ID 零重复,是天然主键
- 规格原文两种格式各占 53.4% / 46.6%,只解析【】会漏掉一半
- 平均每商品仅 1.17 个 SKU,报表不是全量目录,
  因此必须支持手动新增,且货运单外键不能加硬约束

同步更新
- 根 AGENTS.md 开头的指针改为两个子项目对照表
- docs/README.md 重构为双子项目索引
- .gitignore 加 admin/data/、admin.exe、Excel 锁文件

说明:Gitea 尚未配置,本次无对应工单号。
raw_data/ 未提交,含台币销售额等商业数据,待用户决定。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
chengma
2026-08-06 15:49:04 +08:00
co-authored by Claude Opus 5
parent cbcfaca728
commit 90379347b4
13 changed files with 1963 additions and 29 deletions
+70 -16
View File
@@ -1,18 +1,34 @@
# 项目文档索引
本目录保存项目级文档。长期稳定的 Client 基线文档放在 `docs/client`,实施过程和完成记录放在 `docs/task`,两者不得混用。
本目录保存项目级文档。长期稳定的基线文档按子项目放在 `docs/client` 和 `docs/admin`,
实施过程和完成记录放在 `docs/task`,两者不得混用。
## 项目由两部分组成
| 子项目 | 是什么 | 技术栈 | 规则文件 |
|---|---|---|---|
| **Client** | Windows 桌面客户端,控制安卓设备在拼多多采集和下单 | Python 3.10 + PyQt5 | [client/AGENTS.md](../client/AGENTS.md) |
| **Admin** | 本地 Web 管理端,管理商品、货运单、采购任务和客户端 | Go + Gin + HTML 模板 | [admin/AGENTS.md](../admin/AGENTS.md) |
两者通过三个 HTTP 接口交互,契约以
[Client 侧的接口契约](client/04-admin-api-contract.md) 为准。
> **两个子项目技术栈完全不同,规则不通用。** 别拿 Client 的经验套 Admin,反之亦然。
## 新人从这里开始
| 文档 | 用途 |
| 我要做 | 先读 |
|---|---|
| [00 上手指南](client/00-getting-started.md) | 装环境、装依赖、连手机、把程序跑起来、常见报错 |
| [00 术语表](client/00-glossary.md) | Outbox、幂等、SKU 等专业词的一句话解释 |
| 上手 Client | [Client 上手指南](client/00-getting-started.md) + [Client 术语表](client/00-glossary.md) |
| 上手 Admin | [Admin 上手指南](admin/00-getting-started.md) + [Admin 术语表](admin/00-glossary.md) |
| 搞清楚整条业务链路 | [Admin 需求](admin/01-requirements.md) §3 |
## 按任务找文档
**不用通读全部文档**,按你要做的事挑:
### Client(桌面客户端)
| 我要做的事 | 主要看 | 顺带看 |
|---|---|---|
| 第一次把项目跑起来 | [00 上手指南](client/00-getting-started.md) | — |
@@ -24,20 +40,52 @@
| 写测试 | [06 质量与安全](client/06-quality-security.md) §2 | — |
| 搞不清这功能到底要不要做 | [01 产品需求基线](client/01-requirements.md) | — |
| 打包成 exe、改文件路径 | [01 需求](client/01-requirements.md) §8.1 | [03 数据模型](client/03-data-model.md) §2 |
| 建工单、写归档 | [模板](templates/task.md) | 根目录 [AGENTS.md](../AGENTS.md) |
无论做哪一样,都必须先看一遍 [client/AGENTS.md](../client/AGENTS.md)(技术栈和红线)。
### Admin(Web 管理端)
| 我要做的事 | 主要看 | 顺带看 |
|---|---|---|
| 第一次把项目跑起来 | [00 上手指南](admin/00-getting-started.md) | — |
| 改页面、加表格列 | [05 界面规范](admin/05-ui-specification.md) | [02 架构](admin/02-architecture.md) §4 模板 |
| 加字段、改表、写 SQL | [03 数据模型](admin/03-data-model.md) | [02 架构](admin/02-architecture.md) §2 分层 |
| 改 Excel 导入 | [03 数据模型](admin/03-data-model.md) §3.3 | [00 术语表](admin/00-glossary.md) §3 upsert |
| 改给 Client 的接口 | [04 Client 接口实现](admin/04-client-api.md) | [Client 侧契约](client/04-admin-api-contract.md) |
| 写测试 | [06 质量与安全](admin/06-quality-security.md) §2 | — |
| 搞不清这功能到底要不要做 | [01 产品需求基线](admin/01-requirements.md) | — |
### 通用
| 我要做的事 | 看这里 |
|---|---|
| 建工单、写归档 | [模板](templates/task.md) + 根目录 [AGENTS.md](../AGENTS.md) |
无论做哪一样,都必须先看一遍对应子项目的 `AGENTS.md`(技术栈和红线)。
## Client 基线文档
| 文档 | 用途 |
|---|---|
| [01 产品需求基线](client/01-requirements.md) | 定义目标、范围、业务流程和验收边界 |
| [02 系统架构](client/02-architecture.md) | 定义模块、依赖、线程模型和故障恢复原则 |
| [03 数据模型](client/03-data-model.md) | 定义 SQLite 表、状态和 `pdd_data` JSON 结构 |
| [04 Admin 接口契约](client/04-admin-api-contract.md) | 定义 Client 与 Admin 的版本化接口边界 |
| [05 界面交互规范](client/05-ui-specification.md) | 定义 PDD 任务页、设置页和表格交互 |
| [06 质量、安全与测试](client/06-quality-security.md) | 定义测试策略、采购安全、日志和发布门禁 |
| [00 上手指南](client/00-getting-started.md) | 装环境、连手机、跑起来、常见报错 |
| [00 术语表](client/00-glossary.md) | Outbox、幂等、不可逆阶段等 |
| [01 产品需求基线](client/01-requirements.md) | 目标、范围、任务类型、打包策略 |
| [02 系统架构](client/02-architecture.md) | 分层、线程模型、Worker 模板 |
| [03 数据模型](client/03-data-model.md) | SQLite 表、状态机、`pdd_data` 结构 |
| [04 Admin 接口契约](client/04-admin-api-contract.md) | **两个子项目的接口边界,改动需同步 Admin** |
| [05 界面交互规范](client/05-ui-specification.md) | PDD 任务页、设置页、表格交互 |
| [06 质量、安全与测试](client/06-quality-security.md) | 测试策略、采购安全、发布门禁 |
## Admin 基线文档
| 文档 | 用途 |
|---|---|
| [00 上手指南](admin/00-getting-started.md) | 装 Go、跑起来、常见报错 |
| [00 术语表](admin/00-glossary.md) | 货运单、upsert、SKU 映射等 |
| [01 产品需求基线](admin/01-requirements.md) | 业务链路、四个模块、状态定义 |
| [02 系统架构](admin/02-architecture.md) | 分层、目录、模板组织、前端约束 |
| [03 数据模型](admin/03-data-model.md) | SQLite 表、Excel 导入规则 |
| [04 Client 接口实现](admin/04-client-api.md) | 服务端怎么实现那三个接口 |
| [05 界面规范](admin/05-ui-specification.md) | 三段式布局、四个页面、弹窗 |
| [06 质量、安全与测试](admin/06-quality-security.md) | 测试、Web 安全、发布门禁 |
## 文档标注说明
@@ -51,20 +99,23 @@
## 文档生命周期
- `docs/client` 只记录不随单个任务频繁变化的产品和技术基线。
- `docs/client` 和 `docs/admin` 只记录不随单个任务频繁变化的产品和技术基线。
- 日常需求、缺陷、进度、阻塞和方案变更以 Gitea 工单为事实来源。
- 单元任务完成后,按 `AGENTS.md` 归档到 `docs/task/<工单号>-<简短名称>.md`。
- 基线发生实质变化时,必须先更新对应 Gitea 工单并完成评审,再在同一任务中更新这里的相关文档。
- **接口契约改动必须两边同步**:`docs/client/04-*` 和 `docs/admin/04-*` 在同一个工单里一起改。
## 文档和代码对不上怎么办
现在的代码还没做到文档描述的目标状态,**对不上是正常的**,已知差异列在 [02 架构](client/02-architecture.md) §3.1。
现在的代码还没做到文档描述的目标状态,**对不上是正常的**。
Client 的已知差异列在 [02 架构](client/02-architecture.md) §3.1;
Admin 目前尚未开始编码。
按下面处理,不要一发现不一致就停工:
| 情况 | 怎么办 |
|---|---|
| 差异已经列在 §3.1 差异清单里 | 按代码现状继续做,不用停 |
| 差异已经列在差异清单里 | 按代码现状继续做,不用停 |
| 差异不在清单里,但只影响写法、不影响业务结果 | 按文档做,并在工单里记一句 |
| 差异会影响业务结果(金额、数量、状态、下单与否、数据结构) | **停下来**,在工单里说明,等用户确认哪边是对的 |
@@ -72,4 +123,7 @@
## 文档状态
当前 Client 文档为 **基线草案**。Admin 尚未完成,真实采购的最终下单开关、认证方式和部分字段仍需评审确认;这些事项已在对应文档中标注为 `[待定]`,并给出了临时默认值。
Client 和 Admin 文档均为 **基线草案**。
Admin 尚未开始编码;顺运宝同步方式、认证方式和部分字段仍需确认,
这些事项已在对应文档中标注为 `[待定]`,并给出了临时默认值。