5.0 KiB
5.0 KiB
127 Admin:按创建人隔离采集采购任务并增加管理员筛选
- 类型:需求 / 权限修复
- 父级大工单:#14
- 所属 MVP / 版本:#15 Admin 四模块可用闭环
- 状态:已完成,用户验收通过
- 日期:2026-08-10
- Gitea 工单:http://ilaer.eicp.net:8418/chengma/cmautobuy/issues/127
背景与目标
原“采集采购”模块没有通用任务创建人,管理员和采购员共用全量任务查询与删除范围。 本任务为新任务保存创建人,让采购员只能管理本人创建的任务,同时保留管理员全量查看、 按创建人筛选和审计历史任务的能力。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 手工操作管理员/采购员页面。相关权限、模板条件和路由行为已由自动化测试覆盖。
相关提交
a9f22b9feat: 按创建人隔离采集采购任务 (#127)