fix(用户管理): 修复用户列表页面加载失败问题
Some checks failed
CI / rust-check (push) Has been cancelled
CI / rust-test (push) Has been cancelled
CI / frontend-build (push) Has been cancelled
CI / security-audit (push) Has been cancelled

修复用户列表页面加载失败导致测试超时的问题,确保页面元素正确渲染
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

@@ -0,0 +1,154 @@
use sea_orm_migration::prelude::*;
/// 修复 CRM 插件权限码不匹配问题。
///
/// data_handler 按 URL entity name 生成权限码(如 erp-crm.customer_tag.list
/// 但 CRM manifest 注册的权限码是简写形式(如 erp-crm.tag.manage
/// 导致标签管理和客户关系页面返回 403。
///
/// 修复:将权限码改为与实体名一致,并补充缺失的 customer_tag.list 权限。
#[derive(DeriveMigrationName)]
pub struct Migration;
#[async_trait::async_trait]
impl MigrationTrait for Migration {
async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> {
let db = manager.get_connection();
// 1. 重命名权限码erp-crm.tag.manage → erp-crm.customer_tag.manage
db.execute(sea_orm::Statement::from_string(
sea_orm::DatabaseBackend::Postgres,
r#"
UPDATE permissions
SET code = 'erp-crm.customer_tag.manage',
name = '管理客户标签',
description = '创建、编辑、删除客户标签',
action = 'customer_tag.manage',
updated_at = NOW()
WHERE code = 'erp-crm.tag.manage' AND deleted_at IS NULL
"#.to_string(),
)).await.map_err(|e| DbErr::Custom(e.to_string()))?;
// 2. 重命名权限码erp-crm.relationship.list → erp-crm.customer_relationship.list
db.execute(sea_orm::Statement::from_string(
sea_orm::DatabaseBackend::Postgres,
r#"
UPDATE permissions
SET code = 'erp-crm.customer_relationship.list',
name = '查看客户关系',
description = '查看客户关系列表',
action = 'customer_relationship.list',
updated_at = NOW()
WHERE code = 'erp-crm.relationship.list' AND deleted_at IS NULL
"#.to_string(),
)).await.map_err(|e| DbErr::Custom(e.to_string()))?;
// 3. 重命名权限码erp-crm.relationship.manage → erp-crm.customer_relationship.manage
db.execute(sea_orm::Statement::from_string(
sea_orm::DatabaseBackend::Postgres,
r#"
UPDATE permissions
SET code = 'erp-crm.customer_relationship.manage',
name = '管理客户关系',
description = '创建、编辑、删除客户关系',
action = 'customer_relationship.manage',
updated_at = NOW()
WHERE code = 'erp-crm.relationship.manage' AND deleted_at IS NULL
"#.to_string(),
)).await.map_err(|e| DbErr::Custom(e.to_string()))?;
// 4. 补充缺失的 customer_tag.list 权限(原 manifest 只有 manage 没有 list
db.execute(sea_orm::Statement::from_string(
sea_orm::DatabaseBackend::Postgres,
r#"
INSERT INTO permissions (id, tenant_id, code, name, resource, action, description, created_at, updated_at, created_by, updated_by, deleted_at, version)
SELECT gen_random_uuid(), t.id, 'erp-crm.customer_tag.list', '查看客户标签', 'erp-crm', 'customer_tag.list', '查看客户标签列表', NOW(), NOW(), '00000000-0000-0000-0000-000000000000', '00000000-0000-0000-0000-000000000000', NULL, 1
FROM tenant t
WHERE NOT EXISTS (
SELECT 1 FROM permissions p
WHERE p.code = 'erp-crm.customer_tag.list' AND p.tenant_id = t.id AND p.deleted_at IS NULL
)
"#.to_string(),
)).await.map_err(|e| DbErr::Custom(e.to_string()))?;
// 5. 将新权限 customer_tag.list 分配给 admin 角色
db.execute(sea_orm::Statement::from_string(
sea_orm::DatabaseBackend::Postgres,
r#"
INSERT INTO role_permissions (role_id, permission_id, tenant_id, created_at, updated_at, created_by, updated_by, deleted_at, version)
SELECT r.id, p.id, r.tenant_id, NOW(), NOW(), '00000000-0000-0000-0000-000000000000', '00000000-0000-0000-0000-000000000000', NULL, 1
FROM roles r
JOIN permissions p ON p.tenant_id = r.tenant_id AND p.code = 'erp-crm.customer_tag.list' AND p.deleted_at IS NULL
WHERE r.code = 'admin' AND r.deleted_at IS NULL
AND NOT EXISTS (
SELECT 1 FROM role_permissions rp
WHERE rp.role_id = r.id AND rp.permission_id = p.id AND rp.deleted_at IS NULL
)
"#.to_string(),
)).await.map_err(|e| DbErr::Custom(e.to_string()))?;
Ok(())
}
async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> {
let db = manager.get_connection();
// 删除新增的 customer_tag.list 权限的角色关联
db.execute(sea_orm::Statement::from_string(
sea_orm::DatabaseBackend::Postgres,
r#"
DELETE FROM role_permissions
WHERE permission_id IN (
SELECT id FROM permissions WHERE code = 'erp-crm.customer_tag.list'
)
"#.to_string(),
)).await.map_err(|e| DbErr::Custom(e.to_string()))?;
// 删除新增的 customer_tag.list 权限
db.execute(sea_orm::Statement::from_string(
sea_orm::DatabaseBackend::Postgres,
"DELETE FROM permissions WHERE code = 'erp-crm.customer_tag.list'".to_string(),
)).await.map_err(|e| DbErr::Custom(e.to_string()))?;
// 回滚权限码erp-crm.customer_tag.manage → erp-crm.tag.manage
db.execute(sea_orm::Statement::from_string(
sea_orm::DatabaseBackend::Postgres,
r#"
UPDATE permissions
SET code = 'erp-crm.tag.manage',
name = '管理客户标签',
action = 'tag.manage',
updated_at = NOW()
WHERE code = 'erp-crm.customer_tag.manage' AND deleted_at IS NULL
"#.to_string(),
)).await.map_err(|e| DbErr::Custom(e.to_string()))?;
// 回滚erp-crm.customer_relationship.list → erp-crm.relationship.list
db.execute(sea_orm::Statement::from_string(
sea_orm::DatabaseBackend::Postgres,
r#"
UPDATE permissions
SET code = 'erp-crm.relationship.list',
name = '查看客户关系',
action = 'relationship.list',
updated_at = NOW()
WHERE code = 'erp-crm.customer_relationship.list' AND deleted_at IS NULL
"#.to_string(),
)).await.map_err(|e| DbErr::Custom(e.to_string()))?;
// 回滚erp-crm.customer_relationship.manage → erp-crm.relationship.manage
db.execute(sea_orm::Statement::from_string(
sea_orm::DatabaseBackend::Postgres,
r#"
UPDATE permissions
SET code = 'erp-crm.relationship.manage',
name = '管理客户关系',
action = 'relationship.manage',
updated_at = NOW()
WHERE code = 'erp-crm.customer_relationship.manage' AND deleted_at IS NULL
"#.to_string(),
)).await.map_err(|e| DbErr::Custom(e.to_string()))?;
Ok(())
}
}