Files
cmautobuy/admin/AGENTS.md
T
chengmaandClaude Opus 5 4f920f9d8b docs: 排除蝦皮原始报表,并同步主按钮文案
raw_data 不进 Git
原始报表含逐商品台币销售额等商业数据,进了 Git 就是永久历史。
- .gitignore 排除 raw_data/
- 改掉三处"仓库里有一份样本"的失真表述,改为向项目负责人索取
- 06 §2.1 相应加强:既然大样本不进库,admin/testdata/ 下的脱敏小样本
  就必须提交,否则别人拉下来测试跑不了;并写明脱敏做法

主按钮文案 开始自动获取 → 获取任务 ⇄ 停止获取
只改按钮标签。"自动获取"作为功能名保留(状态栏、Tab 顺序、
协调器开关等处不动),05 §4.1 加了一句说明两者不是一回事。

已知遗留:pdd_ui.py 自身仍不一致——构造时用「获取任务」,
但状态机 485/487 行仍是「开始自动获取」/「停止自动获取」,
会覆盖掉构造时的文字。该文件有未提交改动,本次未触碰,
差异已记入 02 §3.1,需另开工单修。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-06 15:58:09 +08:00

101 lines
5.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Admin 子项目规则
本文件适用于 `admin/` 下的全部代码、模板和测试,并继承仓库根目录 `AGENTS.md` 的
**红线**、工作流、Git、安全、文档和初级程序员维护规则。
## 开始工作前
- 从仓库根目录执行 Admin 任务时,也必须先读取本文件。
- 第一次接手,先看这两份:
- 环境和运行:[00 上手指南](../docs/admin/00-getting-started.md)
- 看不懂的词:[00 术语表](../docs/admin/00-glossary.md)
- 只读取与当前任务有关的长期基线,不必每次加载全部文档:
- 需求边界:[01 产品需求基线](../docs/admin/01-requirements.md)
- 分层和目录:[02 系统架构](../docs/admin/02-architecture.md)
- 数据库表:[03 数据模型](../docs/admin/03-data-model.md)
- 给 Client 的接口:[04 Client 接口实现](../docs/admin/04-client-api.md)
- 页面和交互:[05 界面规范](../docs/admin/05-ui-specification.md)
- 测试和安全:[06 质量与安全](../docs/admin/06-quality-security.md)
- Admin 提供的接口必须满足 Client 侧契约
[docs/client/04-admin-api-contract.md](../docs/client/04-admin-api-contract.md),
两边不一致时以 Client 契约为准,要改先走工单。
## 技术栈
- 固定使用 **Go + Gin + Go 标准库 `html/template`**。
- 数据库固定 **SQLite**,驱动固定 `modernc.org/sqlite`。
**不得改用 `mattn/go-sqlite3`** —— 那个要 cgo,Windows 上得装 gcc,
交叉编译和打包 exe 都会变得很麻烦。
- Excel 读取固定 `github.com/xuri/excelize/v2`。
- Go 版本固定 **1.23.0**,依赖版本以 `admin/go.mod` / `go.sum` 为准。
- 新增或升级依赖前先过工单;确认后把 `go.mod` 和 `go.sum` 一起提交。
### 前端约束
- **不得引入 React、Vue、Angular 等前端框架,不得引入 npm 构建流程。**
页面一律服务端渲染。
- 搜索、删除、导入这类操作用普通表单提交,**零 JavaScript**。
- 勾选、弹窗、导入进度确实需要 JS,只允许两种做法:
- 原生 JavaScript,直接写在模板里或放 `static/js/` 下的独立文件;
- htmx(单个 js 文件,无构建步骤)。
- **不得引入打包器**(webpack/vite/esbuild)。CSS 手写,放 `static/css/`。
## 代码分层
- `handler` 只负责解析请求、调用 service、渲染模板或返回 JSON,**不写业务逻辑,不拼 SQL**。
- `service` 放业务逻辑(导入解析、创建任务、匹配复用),不认识 Gin 的 `*gin.Context`。
- `repository` 封装 SQLite,**只有这一层能写 SQL**。
- `model` 只放数据结构,不导入 Gin 和数据库驱动。
- 给 Client 的接口和给浏览器的页面**分开放**(`handler/api/` 和 `handler/web/`),
两者的错误格式、认证方式都不一样,混在一起迟早出事。
## 数据与接口
- 表结构以 [03 数据模型](../docs/admin/03-data-model.md) 为准。
- 给 Client 的接口以 [docs/client/04-admin-api-contract.md](../docs/client/04-admin-api-contract.md) 为准。
- `[必须]` **金额一律用整数存**,人民币用分、台币用分,字段名带单位后缀(`_cent`)。
**禁止用 float 存金额。**
- `[必须]` 时间一律带时区 ISO 8601,库里存 UTC,页面上转本地时区显示。
- `[必须]` Excel 导入只做 **upsert(更新或新增)**,
**绝不允许先清空再导入** —— 会把人工填的 PDD 链接全洗掉。
- `[必须]` 蝦皮规格原文(`spec_raw`)永远保留,解析不出来就留空,不要瞎猜。
- `[必须]` Client 提交结果时,**不管任务是否已取消、是否已重派,一律接受**,
理由见 Client 契约 §6.1。这条最容易被顺手违反。
## 界面规则
- 四个模块统一使用三段式布局:**顶部工具条 / 中间带勾选的表格 / 底部状态条**。
第一个页面写完,其余三个照抄结构改字段,不要给某个模块搞特殊。
- 表格行的身份用业务主键,**不得用行号**。
- 批量删除必须二次确认,并显示"将删除 N 条"。
- 破坏性操作(删除、导入覆盖)用 POST,**不得用 GET**。
- 页面必须能在 1366×768 上正常使用,表格横向滚动而不是压缩列宽。
## 安全
- 根目录 `AGENTS.md` 的五条红线同样适用。
- `[必须]` 所有写操作(新增/编辑/删除/导入/建任务)加 CSRF 防护。
- `[必须]` SQL 一律用参数化查询,**禁止字符串拼接 SQL**。
- `[必须]` 模板输出走 `html/template` 的自动转义,
**禁止用 `template.HTML` 包裹用户可控内容**。
- `[必须]` 上传的 Excel 限制大小和扩展名,解析失败要有明确报错,不能让整个进程崩掉。
- `[必须]` 日志、页面、导出里不得出现 token、密码、Cookie。
## 验证
全部命令从 `admin/` 目录执行。
```powershell
go vet ./...
go build ./...
go test ./...
go run .
```
- `go run .` 启动后访问 `http://localhost:8080`,**不会连手机、不会下单**,可随时运行。
- 修改数据库时测试首次建库和从上一版本迁移。
- 修改给 Client 的接口时,跑契约测试,确认仍满足 Client 侧 §6.1 的无条件接受。
- 修改 Excel 导入时用 `raw_data/` 下的样本跑一遍,核对导入条数。
该样本含商业数据、**不在仓库里**,需向项目负责人索取;自动化测试用 `testdata/` 下的脱敏小样本。
- 交付时说明已运行的命令、结果和未验证的部分。