# Change: 平台角色管理功能增强 ## Why 现有的角色管理系统虽然已实现完整的 RBAC 功能,但缺少面向平台管理员的专用角色管理接口。当前接口设计为通用型(同时支持平台角色和客户角色),但在实际使用中,平台管理员主要管理平台角色(用于分配给平台用户),而客户角色的管理需求相对较少且需要单独的权限控制。 此外,权限分配时缺少对"哪些权限可以分配给平台角色"的明确过滤机制,导致在创建角色时可能分配不合适的权限。未来需要提供内部开发人员专用的权限配置接口,用于标记权限的可用角色类型。 ## What Changes - ✅ 扩展 `Permission` 模型,增加 `available_for_role_types` 字段,用于标记权限可分配给哪些角色类型 - ✅ 修改权限列表查询接口,支持按 `available_for_role_type` 过滤 - ✅ 修改权限树查询接口,支持按 `available_for_role_type` 过滤 - ✅ 新增角色状态切换接口:`PUT /api/admin/roles/:id/status` - ✅ 扩展角色列表查询,支持按 `status` 过滤 - ✅ 更新角色 Service 层,在分配权限时验证权限的 `available_for_role_types` - ✅ 提供数据库迁移脚本,为现有权限设置默认值 `1,2`(兼容平台角色和客户角色) **注意**:暂不实现权限配置接口(修改 `available_for_role_types`),该功能仅供内部开发人员手动修改数据库使用。 ## Impact **Affected specs:** - `role-permission` — 修改权限查询和角色权限分配的需求 **Affected code:** - `internal/model/permission.go` — 增加 `AvailableForRoleTypes` 字段 - `internal/model/permission_dto.go` — 修改 `PermissionListRequest`,增加 `AvailableForRoleType` 查询参数 - `internal/model/role_dto.go` — 修改 `RoleListRequest`,增加 `Status` 查询参数;增加 `UpdateRoleStatusRequest` - `internal/store/postgres/permission_store.go` — 修改 `List()` 和 `GetAll()` 方法,支持按 `available_for_role_types` 过滤 - `internal/service/permission/service.go` — 修改 `List()` 和 `GetTree()` 方法,支持新的过滤参数 - `internal/service/role/service.go` — 修改 `AssignPermissions()` 方法,验证权限的 `available_for_role_types`;增加 `UpdateStatus()` 方法 - `internal/handler/admin/role.go` — 增加 `UpdateStatus()` Handler - `internal/handler/admin/permission.go` — 修改 `List()` 和 `GetTree()` Handler,支持新的查询参数 - `internal/routes/role.go` — 注册状态切换路由 - `migrations/` — 增加迁移脚本:添加 `available_for_role_types` 字段 **Breaking changes:** - 无 **Database changes:** ```sql -- 添加 available_for_role_types 字段 ALTER TABLE tb_permission ADD COLUMN available_for_role_types VARCHAR(20) DEFAULT '1,2' COMMENT '可用角色类型 1=平台 2=客户'; -- 为现有权限设置默认值(兼容所有角色类型) UPDATE tb_permission SET available_for_role_types = '1,2' WHERE available_for_role_types IS NULL; ``` **Non-breaking enhancements:** - 权限列表查询新增可选参数 `available_for_role_type` - 角色列表查询新增可选参数 `status` - 新增角色状态切换接口 `PUT /api/admin/roles/:id/status`