safety-eval-service-frontend/.cursor/skills/specs/16-按钮权限控制规范/08-权限控制边界/SKILL.md

63 lines
3.0 KiB
Markdown
Raw Permalink Normal View History

2026-08-14 16:54:03 +08:00
---
name: jjb-button-permission-boundary
description: 按钮权限控制边界。定义哪些按钮需要权限控制、哪些不需要。Use when 判断页面上的按钮是否需要接入 permission() 检查。
---
# 权限控制边界
## 判断原则
**按需控制,不是所有按钮都要加权限。** 只有会改变数据状态或涉及敏感操作的按钮才需要权限控制。
## 需要权限控制的按钮
| 类别 | 按钮示例 | 权限码示例 |
|------|---------|-----------|
| **数据变更** | 新增、编辑、删除、批量删除、移动、复制 | `xx-xx-add`、`xx-xx-edit`、`xx-xx-delete` |
| **数据导入/导出** | 导出、导入 | `xx-xx-export`、`xx-xx-import` |
| **状态流转** | 审核、审批、发布、下架、启用、禁用 | `xx-xx-approve`、`xx-xx-publish`、`xx-xx-enable` |
| **权限/分配** | 分配权限、授权、指派 | `xx-xx-assign`、`xx-xx-authorize` |
| **只读查看** | 详情、查看 | `xx-xx-detail`、`xx-xx-view` |
| **其他敏感操作** | 撤回、作废、确认、提交 | `xx-xx-withdraw`、`xx-xx-confirm`、`xx-xx-submit` |
## 不需要权限控制的按钮
| 类别 | 示例按钮 | 原因 |
|------|---------|------|
| **搜索/过滤** | 查询、搜索 | 属于页面内数据筛选,不改变数据 |
| **表单重置** | 重置、清空表单 | 仅清零搜索条件,不影响数据 |
| **UI 交互** | 展开、收起、刷新 | 纯前端交互行为 |
| **选择/导航** | 取消选择、返回、关闭 | 不涉及数据变更 |
## 边界情况
- **详情/查看**:需要权限控制,部分业务场景下查看敏感数据也需受控。
- **导出**:一般需要权限控制,因为涉及数据批量导出,可能泄露数据。
- **批量操作**:批量新增、批量删除、批量审批等均需权限控制,每条操作对应独立权限码。
## 实际页面示例
以资源管理页面为例:
```
PageLayout
├── [需要] 新增视频 / 新增试题 ← reslib-app-resource-add
├── 搜索栏
│ ├── [不需要] 查询 ← 搜索过滤
│ └── [不需要] 重置 ← 表单重置
├── 表格
│ ├── [需要] 详情 ← reslib-app-resource-detail
│ ├── [需要] 编辑 ← reslib-app-resource-edit
│ └── [需要] 删除 ← reslib-app-resource-delete
├── 批量操作栏
│ ├── [需要] 移动/复制 ← reslib-app-resource-move
│ ├── [需要] 批量删除 ← reslib-app-resource-batch-delete
│ └── [不需要] 取消选择 ← 选择交互
```
## 注意事项
- **宁缺毋滥**:不确定是否需要控制的按钮,默认不加权限
- **权限码**:格式为 `appId-页面-操作语义`,前端 `permission(xxx)` 与平台注册 `perms` 一致,注册流程见 [[jjb-button-permission-registration]]
- **与后端一致**:权限码必须在平台注册后,后端接口返回的数据中才会包含该权限码