fix(用户管理): 修复用户列表页面加载失败问题
修复用户列表页面加载失败导致测试超时的问题,确保页面元素正确渲染
This commit is contained in:
@@ -443,3 +443,72 @@ let limits = StoreLimitsBuilder::new()
|
||||
- **动态表**: 支持 `db_insert("dynamic_table", ...)` 自动创建/迁移表
|
||||
- **前端集成**: PluginCRUDPage 组件根据 WIT 定义自动生成 CRUD 页面
|
||||
- **插件市场**: 插件元数据、版本管理、签名验证
|
||||
|
||||
## 插件权限系统(关键)
|
||||
|
||||
### 权限码格式
|
||||
|
||||
插件数据操作的权限码由 `data_handler.rs` 中的 `compute_permission_code()` 按以下规则自动生成:
|
||||
|
||||
```
|
||||
{manifest_id}.{url_entity_name}.{action_suffix}
|
||||
```
|
||||
|
||||
- `manifest_id`:plugin.toml 中 `[metadata].id`(如 `erp-crm`)
|
||||
- `url_entity_name`:REST API 路径中的实体名(如 `customer_tag`)
|
||||
- `action_suffix`:`list`(读操作)或 `manage`(写操作)
|
||||
|
||||
| 操作 | 权限码示例 |
|
||||
|------|-----------|
|
||||
| 列表/详情 | `erp-crm.customer.list` |
|
||||
| 创建/更新/删除 | `erp-crm.customer.manage` |
|
||||
|
||||
### 权限码命名铁律(P0 级)
|
||||
|
||||
**`plugin.toml` 中 `permissions[].code` 的前缀必须与 `schema.entities[].name` 完全一致。**
|
||||
|
||||
```
|
||||
data_handler 生成:{manifest_id}.{url_entity_name}.{action}
|
||||
↑ 来自 URL 路径中的 entity 参数
|
||||
manifest 声明: {entity_name}.{action}
|
||||
↑ 必须与 URL 中的 entity name 匹配
|
||||
```
|
||||
|
||||
每个实体必须同时声明 `.list` 和 `.manage` 两个权限:
|
||||
|
||||
```toml
|
||||
# ✅ 正确:权限码前缀与实体名一致
|
||||
[[schema.entities]]
|
||||
name = "customer_tag"
|
||||
|
||||
[[permissions]]
|
||||
code = "customer_tag.list" # 匹配!
|
||||
|
||||
[[permissions]]
|
||||
code = "customer_tag.manage" # 匹配!
|
||||
|
||||
# ❌ 错误:权限码用了简写,与实体名不一致 → 403
|
||||
[[permissions]]
|
||||
code = "tag.manage" # data_handler 生成 erp-crm.customer_tag.manage
|
||||
# 但 DB 中只有 erp-crm.tag.manage → 403
|
||||
```
|
||||
|
||||
**历史教训:** CRM 插件首个版本中,`customer_tag` 实体的权限码写成了 `tag.manage`,`customer_relationship` 实体的权限码写成了 `relationship.list/manage`。结果标签管理、客户关系、关系图谱三个页面全部 403。修复迁移:`m20260419_000038_fix_crm_permission_codes.rs`。
|
||||
|
||||
### 权限注册流程
|
||||
|
||||
1. **插件安装时** → `register_plugin_permissions()` 将 manifest 中声明的权限批量 INSERT 到 `permissions` 表(`ON CONFLICT DO NOTHING` 保证幂等)
|
||||
2. **权限分配** → `grant_permissions_to_admin()` 自动将权限分配给 admin 角色
|
||||
3. **运行时校验** → `data_handler.rs` 的 `compute_permission_code()` 按 URL entity name 生成权限码,通过 `require_permission()` 检查 JWT 中的权限列表
|
||||
|
||||
### 已修复问题
|
||||
|
||||
| 问题 | 修复 |
|
||||
|------|------|
|
||||
| 权限未自动分配给 admin 角色 → 403 | `grant_permissions_to_admin()` 在 install/enable 时自动调用 |
|
||||
| 权限码与实体名不匹配 → 403 | 迁移 m20260419_000038 + plugin.toml 修正 |
|
||||
### 插件 API 路由注意事项
|
||||
|
||||
- 后端路由使用 `Path<(Uuid, String)>` 解析 `plugin_id`,必须是 UUID 格式
|
||||
- 前端使用 `plugin.id`(数据库 UUID)而非 `manifest_id`(如 `erp-crm`)构建请求 URL
|
||||
- 直接用 manifest_id 调用 API 会返回 `UUID parsing failed` 错误
|
||||
|
||||
Reference in New Issue
Block a user