charging-cabinet/tasks/005-permission-system.md
2026-07-02 05:38:01 +08:00

172 lines
4.6 KiB
Markdown
Raw 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.

# 任务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
// 按钮级权限控制
<Permission code="device:operate">
<Button>开始充电</Button>
</Permission>
// 页面级权限控制
<RequirePermission code="energy:view">
<EnergyPage />
</RequirePermission>
```
### 角色管理页
- 角色列表
- 创建/编辑角色
- 权限树勾选(按模块分组)
### 用户权限配置
- 选择角色
- 配置权限范围(组织/项目/设备)
- 选择权限类型(查看/操作)
## 权限码列表
```
# 设备管理
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接口