f938ca6c00
添加角色基于访问控制(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>
87 lines
2.1 KiB
TypeScript
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 });
|
|
}
|