From dbe47795d7399cd66b24ee97734bf10909b7579a Mon Sep 17 00:00:00 2001 From: chengma Date: Mon, 10 Aug 2026 23:13:55 +0800 Subject: [PATCH] =?UTF-8?q?docs:=20=E5=BD=92=E6=A1=A3=E4=BB=BB=E5=8A=A1=20?= =?UTF-8?q?#127?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../task/127-admin按创建人隔离采集采购任务.md | 80 +++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 docs/task/127-admin按创建人隔离采集采购任务.md diff --git a/docs/task/127-admin按创建人隔离采集采购任务.md b/docs/task/127-admin按创建人隔离采集采购任务.md new file mode 100644 index 0000000..d54e68b --- /dev/null +++ b/docs/task/127-admin按创建人隔离采集采购任务.md @@ -0,0 +1,80 @@ +# 127 Admin:按创建人隔离采集采购任务并增加管理员筛选 + +- 类型:需求 / 权限修复 +- 父级大工单:#14 +- 所属 MVP / 版本:#15 Admin 四模块可用闭环 +- 状态:已完成,待用户验收 +- 日期:2026-08-10 +- Gitea 工单: + +## 背景与目标 + +原“采集采购”模块没有通用任务创建人,管理员和采购员共用全量任务查询与删除范围。 +本任务为新任务保存创建人,让采购员只能管理本人创建的任务,同时保留管理员全量查看、 +按创建人筛选和审计历史任务的能力。PDD 商品档案和 Client 接口继续全局共享。 + +## 最终方案 + +- MySQL v6 为 `tasks` 增加可空的 `created_by_user_id`、用户外键和创建人分页索引。 + 存量 NULL 不做推断,统一显示为“历史任务”。迁移逐项检查并可在 DDL 中断后重放。 +- PDD 批量采集、单商品重新采集、蝦皮/顺运宝关联采集和采购任务创建均写入当前 + 正常状态网页登录用户 ID。 +- 服务端用 `TaskFilter.VisibleUserID` 固定采购员范围;管理员可在全量范围上继续按 + 账号或历史任务收窄。列表、状态统计和分页复用同一筛选条件。 +- 详情先按当前用户范围确认可见性,越权和不存在统一返回 404;详情始终显示创建人。 +- 删除在事务内执行带创建人范围的 `DELETE`,以去重后的请求数量核对受影响行数。 + 任一编号不存在或越权即回滚,因此不会部分删除。 +- 管理员工具条增加创建人筛选和明确的“筛选”按钮,列表增加创建人列;采购员不显示 + 这两个管理员专用控件。 +- 与建单方案的实现差异:删除没有先做一次 `SELECT ... FOR UPDATE`,而是用单条带权限 + 条件的 `DELETE` 获取行锁并核对受影响行数;事务回滚后外部行为仍是全有或全无, + 同时减少一次查询。历史 SQLite migrations 按规则保持冻结。 + +## 改了哪些 + +- `admin/repository/mysql_db.go`:增加可重放的 MySQL v6 迁移、外键/索引和 schema 自检。 +- `admin/model/model.go`、`admin/repository/task.go`、`admin/repository/user.go`:增加任务 + 创建人字段、统一筛选范围、创建人选项、可见性检查和原子范围删除。 +- `admin/service/task.go`、`admin/service/pdd.go`、`admin/service/shopee_pdd.go`、 + `admin/service/purchase_workflow.go`:接入当前用户、权限隔离、管理员筛选和创建人展示。 +- `admin/handler/web/others.go`、`shopee.go`:所有 Web 创建入口传入当前用户,任务详情 + 和删除改用角色范围。 +- `admin/templates/task/list.html`、`detail_modal.html`:增加管理员创建人筛选/列和详情字段。 +- 相邻 Go 测试:覆盖 v5→v6、断点重跑、错误结构拒绝、创建入口写入、角色隔离、 + URL 筛选伪造、统计、详情、混合删除回滚、禁用账号选项和模板结构。 +- `docs/admin/01-requirements.md`、`03-data-model.md`、`05-ui-specification.md`、 + `06-quality-security.md`:同步稳定需求、数据结构、界面和安全测试基线。 + +## 验收结果 + +| 验收标准 | 结果 | +|---|---| +| 新建采集、重采、关联采集和采购任务记录当前用户 | 通过 | +| 管理员查看全量并筛选正常、禁用账号及历史任务 | 通过 | +| 采购员只能查看本人任务,伪造创建人参数不能扩大范围 | 通过 | +| 列表、状态统计和分页使用同一用户范围 | 通过 | +| 管理员列表与详情显示创建人,NULL 显示历史任务 | 通过 | +| 越权详情返回不存在;混合越权删除完整回滚 | 通过 | +| 管理员和采购员分别可删除其有权删除的任务 | 通过 | +| PDD 共享数据和 Client 四接口行为不变 | 通过,未改接口与共享商品查询 | +| MySQL v5→v6、断点重跑、错误形状拒绝和 schema 自检 | 通过,真实 MySQL 8.4 隔离测试库 | +| Go 1.23.0 build、test、vet | 通过 | + +## 测试 + +- 执行的命令: + - `gofmt -l .` + - `$env:GOTOOLCHAIN='go1.23.0'; go test ./... -count=1; go vet ./...; go build ./...` + - 在 `autobuy_test` / `autobuy_test_*` 隔离库执行迁移定向测试: + `go test ./repository -run 'TestMySQLMigrate_(V5升级V6且断点重跑|V6形状错误不记版本)' -count=1 -v` + - 在隔离库执行 #127 Service 定向测试:任务创建入口、采购员范围、管理员筛选、 + 越权详情、原子删除和禁用账号选项共 6 项。 + - `git diff --check` +- 结果:Go 1.23.0 全包代码级测试、静态检查和构建通过;真实 MySQL 8.4 迁移测试 + 2 项通过,Service 定向集成测试 6 项通过;生产 `autobuy` 数据未被测试触碰。 +- **没验证到的部分**:未在 1366×768 浏览器中做人工视觉验收;未用两个真实浏览器 + Session 手工操作管理员/采购员页面。相关权限、模板条件和路由行为已由自动化测试覆盖。 + +## 相关提交 + +- `a9f22b9` feat: 按创建人隔离采集采购任务 (#127)