fix(用户管理): 修复用户列表页面加载失败问题

修复用户列表页面加载失败导致测试超时的问题,确保页面元素正确渲染
This commit is contained in:
iven
2026-04-19 08:46:28 +08:00
parent 0ee9d22634
commit 841766b168
174 changed files with 26366 additions and 675 deletions

View File

@@ -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` 错误