coder-common-thin-frontend/doc/api/permission/角色管理API.md
Leo d09a400ad0 feat(user-management): 实现用户管理导入导出功能
- 新增用户数据导出功能:
  * 支持导出当前查询条件下的数据
  * 支持导出全部用户数据
  * 支持下载用户导入模板
  * 自动生成带时间戳的文件名

- 新增用户数据导入功能:
  * 拖拽上传Excel文件支持
  * 文件类型和大小验证(.xlsx/.xls, 最大10MB)
  * 覆盖已存在数据选项
  * 实时上传进度显示
  * 详细的导入结果反馈

- 完善API接口:
  * downloadExcelTemplate: 下载Excel模板
  * exportExcelData: 导出用户数据(支持查询参数)
  * importUserData: 导入用户数据(支持覆盖选项)

- UI/UX优化:
  * 下拉菜单式导出按钮设计
  * 专业的导入模态框界面
  * 完善的错误处理和用户反馈
  * 导入说明和操作指导

技术实现:
- 使用Blob处理文件下载
- FormData处理文件上传
- Naive UI组件深度集成
- TypeScript类型安全保障
2025-07-06 00:58:26 +08:00

882 lines
19 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 角色管理API
## 概述
角色管理模块是权限系统的重要组成部分负责管理系统角色、角色权限分配和用户角色关联。基于RBAC权限模型实现了灵活的角色权限管理机制。
## 权限说明
角色管理接口需要相应的权限才能访问:
| 操作 | 权限码 | 说明 |
|------|--------|------|
| 查询角色列表 | `system:role:list` | 查看角色列表权限 |
| 新增角色 | `system:role:add` | 新增角色权限 |
| 修改角色 | `system:role:edit` | 修改角色信息权限 |
| 删除角色 | `system:role:remove` | 删除角色权限 |
| 分配权限 | `system:role:assign` | 分配角色权限 |
| 用户授权 | `system:user:role` | 分配用户角色权限 |
## 接口列表
### 1. 分页查询角色列表
**接口地址**: `GET /coder/sysRole/listPage`
**接口描述**: 分页查询系统角色列表
**是否需要认证**: 是
**权限要求**: `system:role:list`
**请求头**:
```
Authorization: your-token-value
```
**请求参数**:
| 参数名 | 类型 | 必填 | 说明 | 示例 |
|--------|------|------|------|------|
| pageNo | Integer | 否 | 页码 | 1 |
| pageSize | Integer | 否 | 每页大小 | 10 |
| roleName | String | 否 | 角色名称 | 管理员 |
| roleCode | String | 否 | 角色编码 | admin |
| roleStatus | String | 否 | 角色状态 | 0 |
| beginTime | String | 否 | 开始时间 | 2024-01-01 |
| endTime | String | 否 | 结束时间 | 2024-12-31 |
**响应示例**:
```json
{
"status": 200,
"msg": "SUCCESS",
"data": {
"records": [
{
"roleId": 1,
"roleName": "超级管理员",
"roleCode": "admin",
"roleStatus": "0",
"dataScope": "1",
"deptCheckStrictly": "1",
"menuCheckStrictly": "1",
"sorted": 1,
"remark": "超级管理员",
"createBy": "admin",
"createTime": "2024-01-01 10:00:00",
"updateBy": "admin",
"updateTime": "2024-01-01 10:00:00",
"menuIds": [1, 2, 3, 4, 5],
"deptIds": [100, 101, 102]
}
],
"total": 1,
"size": 10,
"current": 1,
"pages": 1
},
"traceId": "trace-123456"
}
```
**调用示例**:
```bash
curl -X GET \
"http://localhost:18099/coder/sysRole/listPage?pageNo=1&pageSize=10&roleName=管理员" \
-H "Authorization: your-token-value"
```
---
### 2. 查询所有角色
**接口地址**: `GET /coder/sysRole/list`
**接口描述**: 查询所有系统角色(不分页)
**是否需要认证**: 是
**权限要求**: `system:role:list`
**请求参数**: 同分页查询除pageNo、pageSize外
**响应示例**:
```json
{
"status": 200,
"msg": "SUCCESS",
"data": [
{
"roleId": 1,
"roleName": "超级管理员",
"roleCode": "admin",
"roleStatus": "0",
"dataScope": "1",
"deptCheckStrictly": "1",
"menuCheckStrictly": "1",
"sorted": 1,
"remark": "超级管理员",
"createBy": "admin",
"createTime": "2024-01-01 10:00:00",
"updateBy": "admin",
"updateTime": "2024-01-01 10:00:00"
}
],
"traceId": "trace-123456"
}
```
**调用示例**:
```bash
curl -X GET \
"http://localhost:18099/coder/sysRole/list" \
-H "Authorization: your-token-value"
```
---
### 3. 根据ID查询角色
**接口地址**: `GET /coder/sysRole/getById/{id}`
**接口描述**: 根据角色ID查询角色详细信息
**是否需要认证**: 是
**权限要求**: `system:role:list`
**路径参数**:
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| id | Long | 是 | 角色ID |
**响应示例**:
```json
{
"status": 200,
"msg": "SUCCESS",
"data": {
"roleId": 1,
"roleName": "超级管理员",
"roleCode": "admin",
"roleStatus": "0",
"dataScope": "1",
"deptCheckStrictly": "1",
"menuCheckStrictly": "1",
"sorted": 1,
"remark": "超级管理员",
"createBy": "admin",
"createTime": "2024-01-01 10:00:00",
"updateBy": "admin",
"updateTime": "2024-01-01 10:00:00",
"menuIds": [1, 2, 3, 4, 5],
"deptIds": [100, 101, 102]
},
"traceId": "trace-123456"
}
```
**调用示例**:
```bash
curl -X GET \
http://localhost:18099/coder/sysRole/getById/1 \
-H "Authorization: your-token-value"
```
---
### 4. 新增角色
**接口地址**: `POST /coder/sysRole/add`
**接口描述**: 新增系统角色
**是否需要认证**: 是
**权限要求**: `system:role:add`
**请求参数**:
```json
{
"roleName": "普通用户",
"roleCode": "user",
"roleStatus": "0",
"dataScope": "2",
"deptCheckStrictly": "1",
"menuCheckStrictly": "1",
"sorted": 2,
"remark": "普通用户角色",
"menuIds": [1, 2, 3],
"deptIds": [100, 101]
}
```
**请求参数说明**:
| 参数名 | 类型 | 必填 | 说明 | 校验规则 |
|--------|------|------|------|----------|
| roleName | String | 是 | 角色名称 | 不能为空最长30字符 |
| roleCode | String | 是 | 角色编码 | 不能为空最长100字符唯一 |
| roleStatus | String | 是 | 角色状态 | 0-正常 1-停用 |
| dataScope | String | 否 | 数据范围 | 1-全部数据 2-自定义数据 3-本部门数据 4-本部门及以下数据 5-仅本人数据 |
| deptCheckStrictly | String | 否 | 部门树选择项是否关联显示 | 0-父子不互相关联显示 1-父子互相关联显示 |
| menuCheckStrictly | String | 否 | 菜单树选择项是否关联显示 | 0-父子不互相关联显示 1-父子互相关联显示 |
| sorted | Integer | 是 | 显示顺序 | 不能为空 |
| remark | String | 否 | 备注信息 | 最长200字符 |
| menuIds | Long[] | 否 | 菜单ID数组 | 有效的菜单ID |
| deptIds | Long[] | 否 | 部门ID数组 | 有效的部门ID |
**响应示例**:
```json
{
"status": 200,
"msg": "SUCCESS",
"data": "新增成功",
"traceId": "trace-123456"
}
```
**调用示例**:
```bash
curl -X POST \
http://localhost:18099/coder/sysRole/add \
-H "Content-Type: application/json" \
-H "Authorization: your-token-value" \
-d '{
"roleName": "普通用户",
"roleCode": "user",
"roleStatus": "0",
"dataScope": "2",
"deptCheckStrictly": "1",
"menuCheckStrictly": "1",
"sorted": 2,
"remark": "普通用户角色",
"menuIds": [1, 2, 3],
"deptIds": [100, 101]
}'
```
---
### 5. 获取最新排序号
**接口地址**: `GET /coder/sysRole/getSorted`
**接口描述**: 获取角色的最新排序号
**是否需要认证**: 是
**权限要求**: `system:role:add`
**请求参数**: 无
**响应示例**:
```json
{
"status": 200,
"msg": "SUCCESS",
"data": 10,
"traceId": "trace-123456"
}
```
**调用示例**:
```bash
curl -X GET \
http://localhost:18099/coder/sysRole/getSorted \
-H "Authorization: your-token-value"
```
---
### 6. 修改角色信息
**接口地址**: `POST /coder/sysRole/update`
**接口描述**: 修改系统角色信息
**是否需要认证**: 是
**权限要求**: `system:role:edit`
**请求参数**:
```json
{
"roleId": 1,
"roleName": "超级管理员",
"roleCode": "admin",
"roleStatus": "0",
"dataScope": "1",
"deptCheckStrictly": "1",
"menuCheckStrictly": "1",
"sorted": 1,
"remark": "超级管理员",
"menuIds": [1, 2, 3, 4, 5],
"deptIds": [100, 101, 102]
}
```
**请求参数说明**:
| 参数名 | 类型 | 必填 | 说明 | 校验规则 |
|--------|------|------|------|----------|
| roleId | Long | 是 | 角色ID | 必须是有效的角色ID |
| 其他参数 | - | - | 同新增角色 | - |
**响应示例**:
```json
{
"status": 200,
"msg": "SUCCESS",
"data": "修改成功",
"traceId": "trace-123456"
}
```
**调用示例**:
```bash
curl -X POST \
http://localhost:18099/coder/sysRole/update \
-H "Content-Type: application/json" \
-H "Authorization: your-token-value" \
-d '{
"roleId": 1,
"roleName": "超级管理员",
"roleCode": "admin",
"roleStatus": "0",
"sorted": 1
}'
```
---
### 7. 删除角色
**接口地址**: `POST /coder/sysRole/deleteById/{id}`
**接口描述**: 根据ID删除角色
**是否需要认证**: 是
**权限要求**: `system:role:remove`
**路径参数**:
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| id | Long | 是 | 角色ID |
**响应示例**:
```json
{
"status": 200,
"msg": "SUCCESS",
"data": "删除成功",
"traceId": "trace-123456"
}
```
**调用示例**:
```bash
curl -X POST \
http://localhost:18099/coder/sysRole/deleteById/1 \
-H "Authorization: your-token-value"
```
---
### 8. 批量删除角色
**接口地址**: `POST /coder/sysRole/batchDelete`
**接口描述**: 批量删除角色
**是否需要认证**: 是
**权限要求**: `system:role:remove`
**请求参数**:
```json
{
"ids": [1, 2, 3]
}
```
**请求参数说明**:
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| ids | Long[] | 是 | 角色ID数组 |
**响应示例**:
```json
{
"status": 200,
"msg": "SUCCESS",
"data": "删除成功",
"traceId": "trace-123456"
}
```
**调用示例**:
```bash
curl -X POST \
http://localhost:18099/coder/sysRole/batchDelete \
-H "Content-Type: application/json" \
-H "Authorization: your-token-value" \
-d '{
"ids": [1, 2, 3]
}'
```
---
### 9. 修改角色状态
**接口地址**: `POST /coder/sysRole/updateStatus/{roleId}/{roleStatus}`
**接口描述**: 修改角色状态(正常/停用)
**是否需要认证**: 是
**权限要求**: `system:role:edit`
**路径参数**:
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| roleId | Long | 是 | 角色ID |
| roleStatus | String | 是 | 角色状态0-正常 1-停用) |
**响应示例**:
```json
{
"status": 200,
"msg": "SUCCESS",
"data": "修改成功",
"traceId": "trace-123456"
}
```
**调用示例**:
```bash
curl -X POST \
http://localhost:18099/coder/sysRole/updateStatus/1/0 \
-H "Authorization: your-token-value"
```
---
### 10. 查询正常角色穿梭框
**接口地址**: `GET /coder/sysRole/listNormalRole/{userId}`
**接口描述**: 查询正常状态的角色用于穿梭框显示
**是否需要认证**: 是
**权限要求**: `system:user:role`
**路径参数**:
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| userId | Long | 是 | 用户ID |
**响应示例**:
```json
{
"status": 200,
"msg": "SUCCESS",
"data": [
{
"label": "超级管理员",
"value": 1,
"parentId": ""
},
{
"label": "普通用户",
"value": 2,
"parentId": ""
}
],
"traceId": "trace-123456"
}
```
**调用示例**:
```bash
curl -X GET \
http://localhost:18099/coder/sysRole/listNormalRole/1 \
-H "Authorization: your-token-value"
```
---
### 11. 分配用户角色
**接口地址**: `GET /coder/sysRole/assignUserRole/{userId}/{roleIds}`
**接口描述**: 为用户分配角色
**是否需要认证**: 是
**权限要求**: `system:user:role`
**路径参数**:
| 参数名 | 类型 | 必填 | 说明 |
|--------|------|------|------|
| userId | Long | 是 | 用户ID |
| roleIds | String | 是 | 角色ID列表逗号分隔 |
**响应示例**:
```json
{
"status": 200,
"msg": "SUCCESS",
"data": "分配成功",
"traceId": "trace-123456"
}
```
**调用示例**:
```bash
curl -X GET \
http://localhost:18099/coder/sysRole/assignUserRole/1/1,2,3 \
-H "Authorization: your-token-value"
```
---
### 12. 获取角色下拉框
**接口地址**: `GET /coder/sysRole/listRoleElSelect`
**接口描述**: 获取角色下拉框数据
**是否需要认证**: 是
**权限要求**: `system:role:list`
**请求参数**: 无
**响应示例**:
```json
{
"status": 200,
"msg": "SUCCESS",
"data": [
{
"label": "超级管理员",
"value": 1
},
{
"label": "普通用户",
"value": 2
}
],
"traceId": "trace-123456"
}
```
**调用示例**:
```bash
curl -X GET \
http://localhost:18099/coder/sysRole/listRoleElSelect \
-H "Authorization: your-token-value"
```
---
## 角色字段说明
### 基础字段
| 字段名 | 类型 | 说明 | 示例 |
|--------|------|------|------|
| roleId | Long | 角色ID | 1 |
| roleName | String | 角色名称 | 超级管理员 |
| roleCode | String | 角色编码 | admin |
| roleStatus | String | 角色状态 | 0-正常 1-停用 |
| sorted | Integer | 显示顺序 | 1 |
| remark | String | 备注信息 | 超级管理员 |
### 权限字段
| 字段名 | 类型 | 说明 | 示例 |
|--------|------|------|------|
| dataScope | String | 数据权限范围 | 1-全部数据 2-自定义数据 3-本部门数据 4-本部门及以下数据 5-仅本人数据 |
| deptCheckStrictly | String | 部门树选择项是否关联显示 | 0-父子不互相关联显示 1-父子互相关联显示 |
| menuCheckStrictly | String | 菜单树选择项是否关联显示 | 0-父子不互相关联显示 1-父子互相关联显示 |
### 关联字段
| 字段名 | 类型 | 说明 | 示例 |
|--------|------|------|------|
| menuIds | Long[] | 菜单ID数组 | [1, 2, 3, 4, 5] |
| deptIds | Long[] | 部门ID数组 | [100, 101, 102] |
---
## 数据字典
### 角色状态 (roleStatus)
| 值 | 说明 |
|----|------|
| 0 | 正常 |
| 1 | 停用 |
### 数据权限范围 (dataScope)
| 值 | 说明 |
|----|------|
| 1 | 全部数据权限 |
| 2 | 自定数据权限 |
| 3 | 本部门数据权限 |
| 4 | 本部门及以下数据权限 |
| 5 | 仅本人数据权限 |
### 树选择项关联显示
| 值 | 说明 |
|----|------|
| 0 | 父子不互相关联显示 |
| 1 | 父子互相关联显示 |
---
## 权限验证机制
### 1. 角色权限验证
```java
// Sa-Token权限验证
@SaCheckPermission("system:role:list")
public List<SysRole> list() {
// 业务逻辑
}
```
### 2. 数据权限控制
```java
// 根据用户数据权限过滤数据
public List<SysRole> getRolesByDataScope(Long userId) {
SysUser user = getCurrentUser();
String dataScope = user.getDataScope();
switch (dataScope) {
case "1": // 全部数据权限
return getAllRoles();
case "2": // 自定义数据权限
return getRolesByDeptIds(user.getDeptIds());
case "3": // 本部门数据权限
return getRolesByDept(user.getDeptId());
case "4": // 本部门及以下数据权限
return getRolesByDeptAndChildren(user.getDeptId());
case "5": // 仅本人数据权限
return getRolesByUserId(userId);
default:
return new ArrayList<>();
}
}
```
### 3. 角色权限缓存
```java
// 缓存用户角色权限
@Cacheable(value = "userRoles", key = "#userId")
public List<String> getRolesByUserId(Long userId) {
return roleMapper.selectRolePermissionByUserId(userId);
}
// 清除角色权限缓存
@CacheEvict(value = "userRoles", key = "#userId")
public void clearUserRoleCache(Long userId) {
// 角色变更时清除缓存
}
```
---
## 错误码说明
| 错误码 | 错误信息 | 说明 |
|--------|----------|------|
| 400 | 角色名称不能为空 | 角色名称为空 |
| 400 | 角色权限编码不能为空 | 角色编码为空 |
| 400 | 显示顺序不能为空 | 排序值为空 |
| 400 | 角色不存在 | 角色ID不存在 |
| 400 | 角色编码已存在 | 角色编码重复 |
| 400 | 角色已分配用户,不允许删除 | 角色已分配给用户时不能删除 |
| 400 | 不能删除超级管理员角色 | 超级管理员角色不能删除 |
| 400 | 不能停用超级管理员角色 | 超级管理员角色不能停用 |
| 400 | 用户不存在 | 用户ID不存在 |
| 400 | 角色ID列表不能为空 | 分配角色时角色ID为空 |
| 401 | 当前会话未登录 | 未登录或Token无效 |
| 403 | 权限不足 | 没有相应的操作权限 |
| 500 | 系统异常 | 服务器内部错误 |
---
## RBAC权限模型
### 1. 基本概念
- **用户 (User)**: 系统的使用者
- **角色 (Role)**: 权限的集合,连接用户和权限的桥梁
- **权限 (Permission)**: 对系统资源的操作权限
- **会话 (Session)**: 用户与系统的一次交互过程
### 2. 关系模型
```
用户 ←→ 用户角色关系 ←→ 角色 ←→ 角色权限关系 ←→ 权限
```
### 3. 数据库设计
```sql
-- 用户表
CREATE TABLE sys_login_user (
user_id BIGINT PRIMARY KEY,
login_name VARCHAR(32) UNIQUE NOT NULL,
user_name VARCHAR(32) NOT NULL,
-- 其他字段...
);
-- 角色表
CREATE TABLE sys_role (
role_id BIGINT PRIMARY KEY,
role_name VARCHAR(32) NOT NULL,
role_code VARCHAR(32) UNIQUE NOT NULL,
role_status CHAR(1) DEFAULT '0',
-- 其他字段...
);
-- 权限表(菜单表)
CREATE TABLE sys_menu (
menu_id BIGINT PRIMARY KEY,
menu_name VARCHAR(64) NOT NULL,
auth VARCHAR(128),
-- 其他字段...
);
-- 用户角色关联表
CREATE TABLE sys_user_role (
user_id BIGINT NOT NULL,
role_id BIGINT NOT NULL,
PRIMARY KEY (user_id, role_id)
);
-- 角色权限关联表
CREATE TABLE sys_role_menu (
role_id BIGINT NOT NULL,
menu_id BIGINT NOT NULL,
PRIMARY KEY (role_id, menu_id)
);
```
---
## 使用建议
### 1. 角色设计原则
- **最小权限原则**: 每个角色只分配必要的权限
- **职责分离**: 不同职责的操作分配给不同角色
- **角色层次**: 建立角色层次结构,高级角色继承低级角色权限
- **定期审查**: 定期审查角色权限,及时调整
### 2. 权限分配策略
- **默认无权限**: 新建角色默认无任何权限
- **逐步授权**: 根据业务需要逐步授权
- **权限组合**: 通过多个角色组合实现复杂权限需求
- **临时授权**: 支持临时权限授权机制
### 3. 数据权限控制
- **部门数据权限**: 基于用户所属部门控制数据访问范围
- **自定义数据权限**: 支持自定义数据访问范围
- **数据隔离**: 确保不同用户只能访问授权范围内的数据
- **审计日志**: 记录数据访问日志
### 4. 性能优化
- **权限缓存**: 将用户权限信息缓存到Redis
- **批量操作**: 支持批量分配和撤销权限
- **索引优化**: 对关联表建立合适的索引
- **分页查询**: 大数据量时使用分页查询
---
## 安全考虑
### 1. 权限验证
- **双重验证**: 前后端都要进行权限验证
- **接口鉴权**: 每个接口都要验证权限
- **数据鉴权**: 数据层面的权限验证
- **操作鉴权**: 敏感操作的二次验证
### 2. 权限变更
- **变更日志**: 记录所有权限变更操作
- **审批流程**: 重要权限变更需要审批
- **通知机制**: 权限变更及时通知相关人员
- **回滚机制**: 支持权限变更回滚
### 3. 会话安全
- **会话超时**: 设置会话超时时间
- **单点登录**: 防止重复登录
- **强制下线**: 支持强制用户下线
- **设备绑定**: 支持设备级别的访问控制
---
## 注意事项
1. **角色删除**: 删除角色前需要检查是否有用户关联
2. **权限继承**: 考虑角色之间的权限继承关系
3. **缓存一致性**: 角色权限变更后需要清理相关缓存
4. **数据完整性**: 保证角色权限数据的完整性
5. **超级管理员**: 超级管理员角色不能删除和停用
6. **权限验证**: 前后端都需要进行权限验证
7. **审计日志**: 记录所有角色操作日志
8. **性能考虑**: 大量用户时注意权限验证性能
9. **数据权限**: 正确配置数据权限范围
10. **定期清理**: 定期清理无效的角色和权限关联