# 任务005:权限系统
## 目标
实现RBAC权限控制,精确到按钮级别。
## 权限模型
### 角色
- **总管理员** — 全部权限,管理所有组织/项目/设备
- **企业管理员** — 只能管理自己组织下的项目/设备/人员
- **普通用户** — 根据配置查看/操作特定组织/项目/设备
### 权限粒度
- **组织级** — 用户可看/操作整个组织下所有设备
- **项目级** — 用户只能看/操作某项目下的设备
- **设备级** — 用户只能看/操作某一台柜子
### 权限类型
- `view` — 查看
- `operate` — 操作(控制设备)
## 数据库表
```sql
-- 角色表
CREATE TABLE roles (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50) NOT NULL UNIQUE,
description VARCHAR(200),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 权限表
CREATE TABLE permissions (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
code VARCHAR(50) NOT NULL UNIQUE COMMENT '权限码,如device:view',
name VARCHAR(100) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 角色权限关联表
CREATE TABLE role_permissions (
role_id BIGINT NOT NULL,
permission_id BIGINT NOT NULL,
PRIMARY KEY (role_id, permission_id),
FOREIGN KEY (role_id) REFERENCES roles(id),
FOREIGN KEY (permission_id) REFERENCES permissions(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 用户角色关联表
CREATE TABLE user_roles (
user_id BIGINT NOT NULL,
role_id BIGINT NOT NULL,
PRIMARY KEY (user_id, role_id),
FOREIGN KEY (user_id) REFERENCES users(id),
FOREIGN KEY (role_id) REFERENCES roles(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 用户权限范围表(组织/项目/设备级)
CREATE TABLE user_scopes (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
user_id BIGINT NOT NULL,
scope_type TINYINT NOT NULL COMMENT '1组织 2项目 3设备',
scope_id BIGINT NOT NULL,
permission_type TINYINT NOT NULL COMMENT '1查看 2操作',
FOREIGN KEY (user_id) REFERENCES users(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
```
## 后端API
### 角色管理
```
GET /api/roles # 角色列表
POST /api/roles # 创建角色
PUT /api/roles/:id # 更新角色
DELETE /api/roles/:id # 删除角色
PUT /api/roles/:id/permissions # 设置角色权限
```
### 用户权限
```
GET /api/users/:id/permissions # 获取用户权限
PUT /api/users/:id/roles # 设置用户角色
PUT /api/users/:id/scopes # 设置用户权限范围
```
### 权限校验中间件
```rust
// 路由级别权限校验
#[middleware]
fn require_permission(permission: &str) {
// 1. 从token获取用户ID
// 2. 查询用户角色和权限
// 3. 校验权限范围(组织/项目/设备)
// 4. 无权限返回403
}
```
## 前端组件
### 权限组件
```tsx
// 按钮级权限控制
// 页面级权限控制
```
### 角色管理页
- 角色列表
- 创建/编辑角色
- 权限树勾选(按模块分组)
### 用户权限配置
- 选择角色
- 配置权限范围(组织/项目/设备)
- 选择权限类型(查看/操作)
## 权限码列表
```
# 设备管理
device:view # 查看设备
device:operate # 操作设备
device:create # 添加设备
device:delete # 删除设备
# 充电控制
charge:start # 开始充电
charge:stop # 停止充电
charge:open_door # 开门
# 充电记录
charge_record:view # 查看充电记录
charge_record:export # 导出充电记录
# 设备日志
device_log:view # 查看设备日志
# 能耗管理
energy:view # 查看能耗
energy:export # 导出能耗
# 系统设置
user:view # 查看用户
user:create # 创建用户
user:edit # 编辑用户
user:delete # 删除用户
role:view # 查看角色
role:create # 创建角色
role:edit # 编辑角色
role:delete # 删除角色
operation_log:view # 查看操作日志
```
## 质量约束
1. 完成代码后执行 `cargo check` + `tsc --noEmit`,零报错零警告
2. 分层拆分,单函数≤80行,命名语义化,完整注释
3. 所有外部IO/网络请求异常捕获,禁止裸panic
4. 分支逻辑全覆盖,不遗漏兜底分支
5. 常量抽离,不使用废弃API
6. Rust内存安全,React函数组件+Hooks
7. 权限校验必须覆盖所有API接口