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>
101 lines
5.4 KiB
Markdown
101 lines
5.4 KiB
Markdown
# 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/` 下的脱敏小样本。
|
||
- 交付时说明已运行的命令、结果和未验证的部分。
|