Files
leaudit-platform-frontend/app/routes/api.v3.rbac.users.$userId.roles.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

39 lines
1.1 KiB
TypeScript

/**
* RBAC API 代理 - 用户角色管理
* POST /api/v3/rbac/users/:userId/roles - 为用户分配角色
*/
import { json, type LoaderFunctionArgs } from "@remix-run/node";
import { assignUserRole } from "~/services/rbac-mock-data.server";
// POST - 为用户分配角色
export async function action({ request, params }: LoaderFunctionArgs) {
const userId = parseInt(params.userId || '0');
const method = request.method;
console.log('📡 [API Route]', method, '/api/v3/rbac/users/' + userId + '/roles');
if (method === 'POST') {
const body = await request.json();
const roleIds = body.role_ids || [];
console.log('📋 [API Route] 分配角色:', { userId, roleIds });
// 使用共享Mock数据分配角色
roleIds.forEach((roleId: number) => {
assignUserRole(userId, roleId);
});
return json({
code: 200,
message: '角色分配成功',
data: {
user_id: userId,
roles: roleIds.map((id: number) => ({ role_id: id }))
}
});
}
return json({ code: 405, message: 'Method Not Allowed' }, { status: 405 });
}