# 统一账号管理接口重构 - 任务清单

## 1. 数据库迁移

- [x] 1.1 创建 `migrations/XXXXXX_create_account_operation_log.up.sql` 迁移文件（创建审计日志表）
- [x] 1.2 创建 `migrations/XXXXXX_create_account_operation_log.down.sql` 回滚文件
- [x] 1.3 运行迁移验证表结构和索引创建成功

## 2. 权限检查基础设施

- [x] 2.1 创建 `pkg/middleware/permission_helper.go` 文件
- [x] 2.2 实现 `CanManageShop` 函数（验证代理对目标店铺的管理权限）
- [x] 2.3 实现 `CanManageEnterprise` 函数（验证代理对目标企业的管理权限）
- [x] 2.4 定义 `ShopStoreInterface` 和 `EnterpriseStoreInterface` 接口（用于依赖倒置）
- [x] 2.5 编写单元测试 `pkg/middleware/permission_helper_test.go`（覆盖率 ≥ 90%）
- [x] 2.6 运行 `lsp_diagnostics` 验证代码无错误

## 3. 审计日志系统

- [x] 3.1 创建 `internal/model/account_operation_log.go`（审计日志模型）
- [x] 3.2 创建 `internal/store/postgres/account_operation_log_store.go`（审计日志存储层）
- [x] 3.3 实现 `AccountOperationLogStore.Create` 方法
- [x] 3.4 创建 `internal/service/account_audit/service.go`（审计日志服务层）
- [x] 3.5 实现 `AccountAuditService.LogOperation` 方法（异步写入，Goroutine）
- [x] 3.6 编写单元测试 `internal/service/account_audit/service_test.go`（覆盖率 ≥ 90%）
- [x] 3.7 运行 `lsp_diagnostics` 验证代码无错误

## 4. AccountService 重构（添加权限检查和审计）

- [x] 4.1 为 `AccountService` 添加 `shopStore` 和 `enterpriseStore` 依赖
- [x] 4.2 为 `AccountService` 添加 `auditService` 依赖
- [x] 4.3 重构 `Create` 方法：添加三层权限检查（类型级 + 资源级 + GORM 兜底）
- [x] 4.4 重构 `Create` 方法：集成审计日志记录（异步）
- [x] 4.5 重构 `Update` 方法：添加权限检查和审计日志（记录 before_data 和 after_data）
- [x] 4.6 重构 `Delete` 方法：添加权限检查和审计日志
- [x] 4.7 重构 `AssignRoles` 方法：添加权限检查和审计日志
- [x] 4.8 重构 `RemoveRole` 方法：添加权限检查和审计日志
- [x] 4.9 修改错误返回：统一为"无权限操作该资源或资源不存在"
- [x] 4.10 编写单元测试 `internal/service/account/service_test.go`（覆盖率 ≥ 90%）
- [x] 4.11 运行 `lsp_diagnostics` 验证代码无错误

## 5. 删除旧 Service 层代码

- [x] 5.1 删除 `internal/service/shop_account/service.go`
- [x] 5.2 删除 `internal/service/customer_account/service.go`
- [x] 5.3 删除相关测试文件 `tests/unit/shop_account_service_test.go` 和 `tests/unit/customer_account_service_test.go`
- [x] 5.4 运行 `go build ./...` 确保没有引用残留

## 6. AccountHandler 重构（支持所有账号类型）

- [x] 6.1 重构 `AccountHandler.Create` 方法：支持 platform/shop/enterprise 三种类型
- [x] 6.2 重构 `AccountHandler.List` 方法：支持按账号类型筛选（username/phone/status/shop_id/enterprise_id）
- [x] 6.3 重构 `AccountHandler.GetByID` 方法：支持所有账号类型
- [x] 6.4 重构 `AccountHandler.Update` 方法：支持所有账号类型
- [x] 6.5 重构 `AccountHandler.Delete` 方法：支持所有账号类型
- [x] 6.6 重构 `AccountHandler.UpdatePassword` 方法：支持所有账号类型
- [x] 6.7 重构 `AccountHandler.UpdateStatus` 方法：支持所有账号类型
- [x] 6.8 重构 `AccountHandler.AssignRoles` 方法：支持所有账号类型
- [x] 6.9 重构 `AccountHandler.GetRoles` 方法：支持所有账号类型
- [x] 6.10 重构 `AccountHandler.RemoveRole` 方法：支持所有账号类型
- [x] 6.11 运行 `lsp_diagnostics` 验证代码无错误

## 7. 删除旧 Handler 层代码

- [x] 7.1 删除 `internal/handler/admin/shop_account.go`
- [x] 7.2 删除 `internal/handler/admin/customer_account.go`
- [x] 7.3 运行 `go build ./...` 确保没有引用残留

## 8. 路由重构（统一账号管理路由）

- [x] 8.1 重构 `internal/routes/account.go`：实现新路由结构
- [x] 8.2 注册平台账号路由组 `/api/admin/accounts/platform/*`（10个接口）
- [x] 8.3 注册代理账号路由组 `/api/admin/accounts/shop/*`（10个接口）
- [x] 8.4 注册企业账号路由组 `/api/admin/accounts/enterprise/*`（10个接口）
- [x] 8.5 为企业账号路由组添加中间件拦截（企业账号禁止访问账号管理）
- [x] 8.6 删除旧路由注册：`/api/admin/platform-accounts/*`
- [x] 8.7 删除旧路由注册：`/api/admin/shop-accounts/*`
- [x] 8.8 删除旧路由注册：`/api/admin/customer-accounts/*`
- [x] 8.9 运行 `go build ./...` 确保路由编译通过

## 9. 认证接口统一

- [x] 9.1 创建 `internal/handler/auth/handler.go`（统一认证 Handler）
- [x] 9.2 实现 `Login` 方法（合并后台和 H5 登录逻辑）
- [x] 9.3 实现 `Logout` 方法（统一登出）
- [x] 9.4 实现 `RefreshToken` 方法（统一刷新 Token）
- [x] 9.5 实现 `GetMe` 方法（统一获取用户信息）
- [x] 9.6 实现 `UpdatePassword` 方法（统一修改密码）
- [x] 9.7 创建 `internal/routes/auth.go` 注册统一认证路由 `/api/auth/*`
- [x] 9.8 删除旧认证路由：`/api/admin/login` 等（5个接口）
- [x] 9.9 删除旧认证路由：`/api/h5/login` 等（5个接口）
- [x] 9.10 保留个人客户认证路由：`/api/c/v1/*`（不修改）
- [x] 9.11 运行 `lsp_diagnostics` 验证代码无错误

## 10. Bootstrap 更新（依赖注入调整）

- [x] 10.1 更新 `internal/bootstrap/stores.go`：添加 `AccountOperationLogStore` 初始化
- [x] 10.2 更新 `internal/bootstrap/services.go`：添加 `AccountAuditService` 初始化
- [x] 10.3 更新 `internal/bootstrap/services.go`：更新 `AccountService` 依赖注入（添加 shopStore、enterpriseStore、auditService）
- [x] 10.4 更新 `internal/bootstrap/handlers.go`：添加 `AuthHandler` 初始化
- [x] 10.5 更新 `internal/bootstrap/handlers.go`：删除 `ShopAccountHandler` 和 `CustomerAccountHandler` 初始化
- [x] 10.6 运行 `go build ./...` 确保编译通过

## 11. 文档生成器更新

- [x] 11.1 更新 `cmd/api/docs.go`：添加新路由到 Handlers 结构体（accounts/platform、accounts/shop、accounts/enterprise、auth）
- [x] 11.2 更新 `cmd/api/docs.go`：删除旧路由（platform-accounts、shop-accounts、customer-accounts、admin/login、h5/login）
- [x] 11.3 更新 `cmd/gendocs/main.go`：同步更新 Handlers 初始化逻辑
- [x] 11.4 运行 `go run cmd/gendocs/main.go` 生成新的 OpenAPI 文档
- [x] 11.5 验证生成的 `docs/openapi.yaml` 包含所有新路由且不包含旧路由

## 12. 集成测试（越权防护）

- [x] 12.1 创建 `tests/integration/account_permission_test.go`
- [x] 12.2 测试场景：企业账号访问账号管理接口被路由层拦截（返回 403）
- [x] 12.3 测试场景：代理账号创建自己店铺的账号成功
- [x] 12.4 测试场景：代理账号创建下级店铺的账号成功
- [x] 12.5 测试场景：代理账号创建其他店铺的账号失败（返回 403）
- [x] 12.6 测试场景：代理账号创建平台账号失败（返回 403）
- [x] 12.7 测试场景：平台账号创建任意类型账号成功
- [x] 12.8 测试场景：超级管理员创建任意类型账号成功
- [x] 12.9 测试场景：查询不存在的账号返回"无权限操作该资源或资源不存在"
- [x] 12.10 测试场景：查询越权的账号返回相同错误消息
- [x] 12.11 运行 `source .env.local && go test -v ./tests/integration/account_permission_test.go` 验证所有测试通过

## 13. 集成测试（审计日志）

- [x] 13.1 创建 `tests/integration/account_audit_test.go`
- [x] 13.2 测试场景：创建账号时记录审计日志（验证 operation_type=create，包含 after_data）
- [x] 13.3 测试场景：更新账号时记录 before_data 和 after_data
- [x] 13.4 测试场景：删除账号时记录审计日志（验证 operation_type=delete）
- [x] 13.5 测试场景：分配角色时记录审计日志（验证 operation_type=assign_roles）
- [x] 13.6 测试场景：移除角色时记录审计日志（验证 operation_type=remove_role）
- [x] 13.7 测试场景：审计日志包含完整的操作上下文（operator_id、target_account_id、request_id、ip_address）
- [x] 13.8 测试场景：审计日志写入失败不影响业务操作（模拟数据库写入失败）
- [x] 13.9 运行 `source .env.local && go test -v ./tests/integration/account_audit_test.go` 验证所有测试通过

## 14. 回归测试（扩展现有测试）

- [x] 14.1 更新 `tests/integration/account_test.go`：扩展覆盖所有账号类型（platform/shop/enterprise）
- [x] 14.2 测试场景：平台账号 CRUD 操作（原有功能保持）
- [x] 14.3 测试场景：代理账号 CRUD 操作（新增）
- [x] 14.4 测试场景：企业账号 CRUD 操作（新增）
- [x] 14.5 测试场景：角色管理功能对所有账号类型生效（新增）
- [x] 14.6 删除 `tests/integration/platform_account_test.go`（与 account_test.go 重复）
- [x] 14.7 删除 `tests/integration/shop_account_management_test.go`（功能已合并到 account_test.go）
- [x] 14.8 运行 `source .env.local && go test -v ./tests/integration/account_test.go` 验证所有测试通过

## 15. 性能测试（已跳过 - 用户决定）

- [ ] ~~15.1 验证权限检查（GetSubordinateShopIDs）缓存命中率 > 80%~~
- [ ] ~~15.2 验证审计日志异步写入不阻塞主流程（API 响应时间增加 < 1ms）~~
- [ ] ~~15.3 压力测试：100 并发创建账号请求，P95 响应时间 < 200ms~~
- [ ] ~~15.4 压力测试：100 并发查询账号列表请求，P95 响应时间 < 200ms~~
- [ ] ~~15.5 验证审计日志写入性能（1000 条/秒，数据库无明显压力）~~

## 16. 文档更新

- [x] 16.1 创建 `docs/account-management-refactor/迁移指南.md`（新旧路由映射表）
- [x] 16.2 创建 `docs/account-management-refactor/功能总结.md`（重构内容、安全提升、操作审计说明）
- [x] 16.3 创建 `docs/account-management-refactor/API文档.md`（所有新接口的请求/响应示例）
- [x] 16.4 更新 `README.md`：添加账号管理重构说明链接
- [x] 16.5 更新 `AGENTS.md`：添加越权防护和审计日志使用规范

## 17. 部署准备

- [ ] 17.1 生成生产环境数据库迁移脚本（包含 CREATE TABLE 和索引）
- [ ] 17.2 编写回滚方案文档（代码回滚步骤 + 数据库回滚脚本）
- [ ] 17.3 准备灰度发布计划（先部署后端，等前端更新后再切流量）
- [ ] 17.4 准备监控告警规则（API 错误率 > 5%、P95 响应时间 > 300ms 自动告警）
- [ ] 17.5 编写前端对接会议 PPT（Breaking Changes 说明、新旧路由映射、迁移时间表）
