feat(account): 实现平台账号管理功能
- 新增平台账号列表查询接口(自动筛选超级管理员和平台用户) - 新增密码修改和状态切换专用接口 - 增强角色分配功能,支持空数组清空所有角色 - 新增超级管理员保护机制,禁止分配角色 - 新增完整的集成测试和OpenSpec规范文档
This commit is contained in:
@@ -0,0 +1,128 @@
|
||||
# Change: 实现平台账号管理接口
|
||||
|
||||
## Why
|
||||
|
||||
当前系统已有通用的账号管理功能,但缺少针对**平台账号(平台用户 + 超级管理员)**的专用管理接口。业务需要:
|
||||
|
||||
1. **专门的平台账号列表**:筛选出 `user_type IN (1, 2)` 的账号,包含超级管理员
|
||||
2. **语义明确的专用接口**:密码修改、启用/禁用需要独立端点,而非通过通用 Update 接口
|
||||
3. **角色分配灵活性**:允许清空角色、支持可选角色分配
|
||||
4. **超级管理员保护**:超级管理员在列表中只读显示,禁止编辑角色
|
||||
|
||||
**现状**:
|
||||
- ✅ 已有账号 CRUD 功能(`/internal/handler/admin/account.go`)
|
||||
- ✅ 已有角色分配功能(`AssignRoles`, `GetRoles`, `RemoveRole`)
|
||||
- ❌ 缺少专门的密码修改接口(当前混在 Update 接口中)
|
||||
- ❌ 缺少专门的启用/禁用接口(当前混在 Update 接口中)
|
||||
- ❌ 角色分配要求至少 1 个角色(不允许清空)
|
||||
- ❌ 没有超级管理员编辑保护
|
||||
|
||||
## What Changes
|
||||
|
||||
### 1. 新增专用接口
|
||||
|
||||
#### Handler 层新增方法
|
||||
- `UpdatePassword(c *fiber.Ctx)` - 修改密码专用接口
|
||||
- `UpdateStatus(c *fiber.Ctx)` - 启用/禁用专用接口
|
||||
- `ListPlatformAccounts(c *fiber.Ctx)` - 平台账号列表查询(user_type IN (1,2))
|
||||
|
||||
#### Service 层新增方法
|
||||
- `UpdatePassword(ctx, accountID, newPassword)` - 密码修改业务逻辑
|
||||
- `UpdateStatus(ctx, accountID, status)` - 状态切换业务逻辑
|
||||
- `ListPlatformAccounts(ctx, req)` - 平台账号列表查询(自动筛选 user_type)
|
||||
|
||||
#### 新增 DTO
|
||||
- `UpdatePasswordRequest` - 密码修改请求(只包含 `new_password`)
|
||||
- `UpdateStatusRequest` - 状态修改请求(只包含 `status`)
|
||||
- `PlatformAccountListRequest` - 平台账号列表请求(移除 user_type 筛选)
|
||||
|
||||
### 2. 优化现有角色分配逻辑
|
||||
|
||||
#### Service 层修改
|
||||
- `AssignRoles` 方法增强:
|
||||
- 允许 `roleIDs` 为空数组(清空所有角色)
|
||||
- 超级管理员(`user_type=1`)禁止分配角色,返回错误
|
||||
- 平台用户(`user_type=2`)可分配无限个平台角色(`role_type=1`)
|
||||
|
||||
#### DTO 修改
|
||||
- `AssignRolesRequest.RoleIDs` 改为可选(`validate:"omitempty"`)
|
||||
|
||||
### 3. 新增路由
|
||||
|
||||
```go
|
||||
// 平台账号专用路由
|
||||
GET /api/admin/platform-accounts // 平台账号列表(含超级管理员)
|
||||
POST /api/admin/platform-accounts // 新增平台账号
|
||||
GET /api/admin/platform-accounts/:id // 获取详情
|
||||
PUT /api/admin/platform-accounts/:id // 编辑平台账号
|
||||
DELETE /api/admin/platform-accounts/:id // 删除平台账号
|
||||
|
||||
// 专用操作接口
|
||||
PUT /api/admin/platform-accounts/:id/password // 修改密码
|
||||
PUT /api/admin/platform-accounts/:id/status // 启用/禁用
|
||||
|
||||
// 角色管理
|
||||
POST /api/admin/platform-accounts/:id/roles // 分配角色(支持空数组)
|
||||
GET /api/admin/platform-accounts/:id/roles // 获取角色列表
|
||||
DELETE /api/admin/platform-accounts/:id/roles/:role_id // 移除单个角色
|
||||
```
|
||||
|
||||
### 4. 响应格式调整
|
||||
|
||||
**列表返回字段**(符合需求):
|
||||
```json
|
||||
{
|
||||
"items": [
|
||||
{
|
||||
"id": 1,
|
||||
"username": "admin",
|
||||
"phone": "13800000000",
|
||||
"created_at": "2025-01-14T10:30:00Z",
|
||||
"status": 1,
|
||||
"user_type": 1
|
||||
}
|
||||
],
|
||||
"total": 10,
|
||||
"page": 1,
|
||||
"size": 20
|
||||
}
|
||||
```
|
||||
|
||||
## Impact
|
||||
|
||||
### 受影响的 Specs
|
||||
- `role-permission` - 角色分配逻辑调整(允许空数组)
|
||||
- `user-organization` - 平台账号管理增强
|
||||
|
||||
### 受影响的代码模块
|
||||
- `internal/handler/admin/account.go` - 新增 3 个 Handler 方法
|
||||
- `internal/service/account/service.go` - 新增 2 个 Service 方法,修改 AssignRoles
|
||||
- `internal/model/account_dto.go` - 新增 2 个 DTO,修改 AssignRolesRequest
|
||||
- `internal/routes/account.go` - 新增路由注册
|
||||
|
||||
### Breaking Changes
|
||||
无。新增功能向后兼容,现有接口保持不变。
|
||||
|
||||
### 数据库变更
|
||||
无。复用现有 `tb_account` 表结构。
|
||||
|
||||
### 迁移计划
|
||||
无需迁移。新接口与现有接口共存,前端可按需切换。
|
||||
|
||||
## Risks
|
||||
|
||||
1. **角色分配空数组行为**:允许清空所有角色可能导致账号无权限
|
||||
- **缓解措施**:前端二次确认,文档明确说明
|
||||
|
||||
2. **超级管理员保护**:禁止编辑超级管理员角色可能影响已有流程
|
||||
- **缓解措施**:仅对 `user_type=1` 生效,平台用户不受影响
|
||||
|
||||
3. **路由命名冲突**:新增 `/platform-accounts` 路由可能与未来规划冲突
|
||||
- **缓解措施**:遵循 RESTful 规范,路径清晰语义化
|
||||
|
||||
## Open Questions
|
||||
|
||||
1. ✅ **已确认**:超级管理员是否需要出现在平台账号列表? → **是**
|
||||
2. ✅ **已确认**:修改密码是否需要旧密码验证? → **否**(管理员重置场景)
|
||||
3. ✅ **已确认**:角色分配是否必填? → **可选**(允许无角色账号)
|
||||
4. ✅ **已确认**:是否允许清空所有角色? → **是**(灵活分配)
|
||||
Reference in New Issue
Block a user