Files
yunrui_asset/backend/routes/roles.js
T

350 lines
9.5 KiB
JavaScript
Raw Normal View History

const express = require('express');
const Role = require('../models/Role');
const Permission = require('../models/Permission');
const UserRole = require('../models/UserRole');
const User = require('../models/User');
const { authMiddleware } = require('../middleware/auth');
const { logRoleOperation } = require('../utils/operationLogger');
const router = express.Router();
const generateId = () => {
return 'role_' + Date.now().toString(36) + Math.random().toString(36).substr(2, 9);
};
const { Op } = require('sequelize');
router.get('/', authMiddleware, async (req, res) => {
try {
const { page = 1, pageSize = 10, roleName, status } = req.query;
const offset = (parseInt(page) - 1) * parseInt(pageSize);
const limit = parseInt(pageSize);
const where = {};
if (roleName) {
where.roleName = { [Op.like]: `%${roleName}%` };
}
if (status) {
where.status = status;
}
const { count, rows: roles } = await Role.findAndCountAll({
where,
limit,
offset,
order: [['sort', 'ASC'], ['createdAt', 'DESC']]
});
res.json({
success: true,
data: {
total: count,
page: parseInt(page),
pageSize: parseInt(pageSize),
roles
}
});
} catch (error) {
console.error('获取角色列表错误:', error);
res.status(500).json({
success: false,
message: '获取角色列表失败'
});
}
});
router.get('/all', authMiddleware, async (req, res) => {
try {
const roles = await Role.findAll({
where: { status: 'active' },
order: [['sort', 'ASC']]
});
res.json({
success: true,
data: roles
});
} catch (error) {
console.error('获取所有角色错误:', error);
res.status(500).json({
success: false,
message: '获取角色列表失败'
});
}
});
router.get('/:roleId', authMiddleware, async (req, res) => {
try {
const role = await Role.findByPk(req.params.roleId);
if (!role) {
return res.status(404).json({
success: false,
message: '角色不存在'
});
}
const permissions = await Permission.findAll({
where: { status: 'active' },
order: [['sort', 'ASC']]
});
res.json({
success: true,
data: {
role,
permissions,
rolePermissions: role.permissions || []
}
});
} catch (error) {
console.error('获取角色详情错误:', error);
res.status(500).json({
success: false,
message: '获取角色详情失败'
});
}
});
router.post('/', authMiddleware, async (req, res) => {
try {
const { roleName, roleCode, description, permissions, status, sort } = req.body;
if (!roleName || !roleCode) {
return res.status(400).json({
success: false,
message: '角色名称和角色编码不能为空'
});
}
const existingRole = await Role.findOne({ where: { roleCode } });
if (existingRole) {
return res.status(400).json({
success: false,
message: '角色编码已存在'
});
}
const role = await Role.create({
roleId: generateId(),
roleName,
roleCode,
description,
permissions: permissions || [],
status: status || 'active',
sort: sort || 0
});
const permissionNames = permissions && permissions.length > 0
? permissions.join('、')
: '无';
await logRoleOperation('create', `创建角色【${roleName}】(编码:${roleCode},权限:${permissionNames}`, {
targetId: role.roleId,
targetName: roleName,
afterState: role.toJSON(),
req,
metadata: { roleCode, permissions, permissionNames }
});
res.status(201).json({
success: true,
message: '创建成功',
data: role
});
} catch (error) {
console.error('创建角色错误:', error);
res.status(500).json({
success: false,
message: '创建角色失败'
});
}
});
router.put('/:roleId', authMiddleware, async (req, res) => {
try {
const { roleName, description, permissions, status, sort } = req.body;
const role = await Role.findByPk(req.params.roleId);
if (!role) {
return res.status(404).json({
success: false,
message: '角色不存在'
});
}
const beforeState = role.toJSON();
if (roleName !== undefined) role.roleName = roleName;
if (description !== undefined) role.description = description;
if (permissions !== undefined) role.permissions = permissions;
if (status !== undefined) role.status = status;
if (sort !== undefined) role.sort = sort;
await role.save();
const afterState = role.toJSON();
const changedFields = {};
if (roleName !== undefined && beforeState.roleName !== roleName) {
changedFields.roleName = { from: beforeState.roleName, to: roleName };
}
if (description !== undefined && beforeState.description !== description) {
changedFields.description = { from: beforeState.description, to: description };
}
if (permissions !== undefined) {
const oldPerms = (beforeState.permissions || []).sort().join(',');
const newPerms = (permissions || []).sort().join(',');
if (oldPerms !== newPerms) {
changedFields.permissions = { from: beforeState.permissions, to: permissions };
}
}
if (status !== undefined && beforeState.status !== status) {
const statusText = { active: '启用', inactive: '禁用' };
changedFields.status = { from: beforeState.status, to: status, fromText: statusText[beforeState.status], toText: statusText[status] };
}
const changeDetails = Object.entries(changedFields).map(([field, values]) => {
const fieldNames = { roleName: '角色名称', description: '描述', permissions: '权限', status: '状态' };
const displayName = fieldNames[field] || field;
if (field === 'permissions') {
return `权限: ${(values.from || []).join('、') || '无'}${(values.to || []).join('、') || '无'}`;
}
if (field === 'status') {
return `状态: ${values.fromText}${values.toText}`;
}
return `${displayName}: ${values.from ?? '空'}${values.to ?? '空'}`;
}).join('');
const updateDesc = changeDetails
? `更新角色【${role.roleName}】:${changeDetails}`
: `更新角色【${role.roleName}】`;
await logRoleOperation('update', updateDesc, {
targetId: role.roleId,
targetName: role.roleName,
beforeState,
afterState,
req,
metadata: { changedFields, oldRoleName: beforeState.roleName, oldPermissions: beforeState.permissions }
});
res.json({
success: true,
message: '更新成功',
data: role
});
} catch (error) {
console.error('更新角色错误:', error);
res.status(500).json({
success: false,
message: '更新角色失败'
});
}
});
router.delete('/:roleId', authMiddleware, async (req, res) => {
try {
const role = await Role.findByPk(req.params.roleId);
if (!role) {
return res.status(404).json({
success: false,
message: '角色不存在'
});
}
if (role.roleCode === 'admin') {
return res.status(400).json({
success: false,
message: '不能删除管理员角色'
});
}
const userCount = await UserRole.count({ where: { RoleId: role.roleId } });
if (userCount > 0) {
return res.status(400).json({
success: false,
message: '该角色下有用户,不能删除'
});
}
const roleName = role.roleName;
const roleCode = role.roleCode;
const beforeState = role.toJSON();
await role.destroy();
await logRoleOperation('delete', `删除角色【${roleName}】(编码:${roleCode},权限:${(role.permissions || []).join('、') || '无'}`, {
targetId: req.params.roleId,
targetName: roleName,
beforeState,
req,
metadata: { roleCode, userCount, permissions: role.permissions }
});
res.json({
success: true,
message: '删除成功'
});
} catch (error) {
console.error('删除角色错误:', error);
res.status(500).json({
success: false,
message: '删除角色失败'
});
}
});
router.post('/init-roles', async (req, res) => {
try {
const defaultRoles = [
{
roleId: 'role_admin',
roleName: '管理员',
roleCode: 'admin',
description: '系统管理员,拥有所有权限',
permissions: ['*'],
status: 'active',
sort: 1
},
{
roleId: 'role_operator',
roleName: '运维人员',
roleCode: 'operator',
description: '负责日常运维操作',
permissions: ['devices:read', 'devices:write', 'racks:read', 'rooms:read', 'consumables:read', 'consumables:write'],
status: 'active',
sort: 2
},
{
roleId: 'role_viewer',
roleName: '只读用户',
roleCode: 'viewer',
description: '仅能查看数据',
permissions: ['devices:read', 'racks:read', 'rooms:read', 'consumables:read'],
status: 'active',
sort: 3
}
];
for (const roleData of defaultRoles) {
await Role.upsert(roleData);
}
res.json({
success: true,
message: '初始化角色成功'
});
} catch (error) {
console.error('初始化角色错误:', error);
res.status(500).json({
success: false,
message: '初始化角色失败'
});
}
});
module.exports = router;