Files
leaudit-platform-frontend/app/routes/api.v3.rbac.roles.$roleId.tsx
T
TanWenyan f938ca6c00 feat(rbac): 添加 RBAC 角色管理 API 代理和模拟数据
添加角色基于访问控制(RBAC)相关接口:

1. API 代理路由
   - api.v3.rbac.roles._index.tsx: 角色列表和创建
   - api.v3.rbac.roles.$roleId.tsx: 角色详情、更新和删除
   - api.v3.rbac.roles.$roleId.users.tsx: 角色用户关联管理
   - api.v3.rbac.users.$userId.roles.tsx: 用户角色列表
   - api.v3.rbac.users.$userId.roles.$roleId.tsx: 用户角色分配

2. 模拟数据服务
   - rbac-mock-data.server.ts: 提供模拟角色和用户角色数据
   - 支持 CRUD 操作
   - 包含预置的系统管理员、开发者等角色

接口功能:
-  获取角色列表(支持分页和搜索)
-  获取角色详情
-  创建、更新、删除角色
-  获取角色的用户列表
-  为用户分配/移除角色

注:当前使用模拟数据,待后端接口完善后切换到真实 API

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-25 18:19:05 +08:00

87 lines
2.1 KiB
TypeScript

/**
* RBAC API 代理 - 单个角色操作
* GET /api/v3/rbac/roles/:roleId - 获取角色详情
* PUT /api/v3/rbac/roles/:roleId - 更新角色
* DELETE /api/v3/rbac/roles/:roleId - 删除角色
*/
import { json, type LoaderFunctionArgs } from "@remix-run/node";
import { mockRoles, updateRole as updateMockRole, deleteRole as deleteMockRole } from "~/services/rbac-mock-data.server";
// GET - 获取角色详情
export async function loader({ params }: LoaderFunctionArgs) {
const roleId = parseInt(params.roleId || '0');
console.log('📡 [API Route] GET /api/v3/rbac/roles/' + roleId);
const role = mockRoles.find(r => r.id === roleId);
if (!role) {
return json({
detail: '角色不存在'
}, { status: 404 });
}
return json({
code: 200,
message: 'success',
data: role
});
}
// PUT/DELETE
export async function action({ request, params }: LoaderFunctionArgs) {
const roleId = parseInt(params.roleId || '0');
const method = request.method;
console.log('📡 [API Route]', method, '/api/v3/rbac/roles/' + roleId);
const role = mockRoles.find(r => r.id === roleId);
if (!role) {
return json({
detail: '角色不存在'
}, { status: 404 });
}
if (method === 'PUT') {
// 更新角色
const body = await request.json();
console.log('📋 [API Route] 更新数据:', body);
// 系统角色保护
if (role.is_system && body.role_key) {
return json({
detail: '系统角色的role_key不可修改'
}, { status: 400 });
}
// 使用共享Mock数据更新
updateMockRole(roleId, body);
return json({
code: 200,
message: '角色更新成功',
data: role
});
}
if (method === 'DELETE') {
// 删除角色
if (role.is_system) {
return json({
detail: '系统角色不能删除'
}, { status: 400 });
}
// 使用共享Mock数据删除
deleteMockRole(roleId);
return json({
code: 200,
message: '角色删除成功'
});
}
return json({ code: 405, message: 'Method Not Allowed' }, { status: 405 });
}