## 1. Redis Key 常量 - [x] 1.1 在 `pkg/constants/redis.go` 中添加全局操作密码 Redis Key 生成函数 `RedisSystemOperationPasswordKey() string`,返回固定字符串 `"system:operation_password"` - [x] 1.2 运行 `lsp_diagnostics` 确认 `redis.go` 无错误 ## 2. DTO 层 - [x] 2.1 新建 `internal/model/dto/super_admin_dto.go`,定义以下结构体: - `SetOperationPasswordRequest`:字段 `Password`(`validate:"required,min=6,max=50"`)、`ConfirmPassword`(`validate:"required"`),含 description 标签 - `OperationPasswordStatusResponse`:字段 `IsSet bool`,含 description 标签 - [x] 2.2 运行 `lsp_diagnostics` 确认 `super_admin_dto.go` 无错误 ## 3. OperationPassword Service - [x] 3.1 新建 `internal/service/operation_password/service.go`,实现以下方法: - `Set(ctx, password string) error`:bcrypt 哈希后写入 Redis(永久存储,无 TTL) - `IsSet(ctx) bool`:查询 Redis key 是否存在 - `Verify(ctx, inputPassword string) error`:从 Redis 读取哈希值,用 `bcrypt.CompareHashAndPassword` 对比;key 不存在时返回"操作密码未设置,请联系超级管理员",密码错误时返回"操作密码错误" - Service 结构体通过构造函数注入 `*redis.Client` - [x] 3.2 运行 `lsp_diagnostics` 确认 `operation_password/service.go` 无错误 ## 4. SuperAdmin Handler - [x] 4.1 新建 `internal/handler/admin/super_admin.go`,实现以下接口: - `SetOperationPassword`(`POST /api/admin/super-admin/operation-password`):检查 `user_type == UserTypeSuperAdmin`,验证两次密码一致,调用 `operationPasswordService.Set()` - `GetOperationPasswordStatus`(`GET /api/admin/super-admin/operation-password/status`):检查 `user_type == UserTypeSuperAdmin`,调用 `IsSet()` 返回状态 - 添加 Handler 方法中文注释(含 HTTP 方法和路径) - [x] 4.2 运行 `lsp_diagnostics` 确认 `super_admin.go` 无错误 ## 5. Bootstrap 注册 - [x] 5.1 在 `internal/bootstrap/services.go` 中注册 `OperationPasswordService`(注入 Redis 客户端) - [x] 5.2 在 `internal/bootstrap/handlers.go` 中注册 `SuperAdminHandler`(注入 `OperationPasswordService`) - [x] 5.3 在路由文件中注册两个新接口(`POST /api/admin/super-admin/operation-password` 和 `GET /api/admin/super-admin/operation-password/status`),路由需经过 admin 认证中间件 - [x] 5.4 运行 `lsp_diagnostics` 确认 bootstrap 和路由文件无错误 ## 6. 文档生成器更新 - [x] 6.1 在 `cmd/api/docs.go` 和 `cmd/gendocs/main.go` 的 `Handlers` 结构体中注册 `SuperAdminHandler`(参考现有 handler 注册方式) ## 7. 修改 AgentRecharge 操作密码验证逻辑 - [x] 7.1 在 `internal/service/agent_recharge/service.go` 的 `OfflinePay` 方法中,将操作密码验证从"查询当前用户账号 + bcrypt 对比登录密码"改为"调用 `operationPasswordService.Verify(ctx, req.OperationPassword)`" - [x] 7.2 在 `agent_recharge/service.go` 的 Service 结构体中注入 `operationPasswordService`,在构造函数中传入 - [x] 7.3 在 `internal/bootstrap/services.go` 中更新 `AgentRechargeService` 的构造调用,传入 `OperationPasswordService` - [x] 7.4 运行 `lsp_diagnostics` 确认 `agent_recharge/service.go` 和 bootstrap 相关文件无错误 ## 8. 接口验证 - [ ] 8.1 调用 `GET /api/admin/super-admin/operation-password/status`,验证返回 `{"is_set": false}`(初始状态) - [ ] 8.2 调用 `POST /api/admin/super-admin/operation-password`(传入合法密码),验证返回 200 - [ ] 8.3 调用 `GET /api/admin/super-admin/operation-password/status`,验证返回 `{"is_set": true}` - [ ] 8.4 调用 `OfflinePay` 接口传入旧登录密码,验证返回"操作密码错误"(旧密码已失效) - [ ] 8.5 调用 `OfflinePay` 接口传入新设置的操作密码,验证正常通过 - [ ] 8.6 使用非超级管理员账号调用设置接口,验证返回 403