rentease-backend-new/controllers/roleController.js

303 lines
7.3 KiB
JavaScript
Raw Normal View History

2026-04-20 06:43:09 +00:00
const { Op } = require('sequelize');
const Role = require('../models/Role');
const { logOperation } = require('../utils/logger');
2026-04-22 06:48:32 +00:00
const response = require('../utils/response');
2026-04-20 06:43:09 +00:00
// 获取角色列表
exports.getRoles = async (req, res) => {
try {
const { page = 1, pageSize = 10, name, status } = req.query;
const tenantId = req.user.tenantId;
const where = {
isDeleted: 0,
[Op.or]: [
{ tenantId: tenantId },
{ tenantId: null }
]
};
if (name) where.name = { [Op.like]: `%${name}%` };
if (status) where.status = status;
const { count, rows: roles } = await Role.findAndCountAll({
where,
limit: parseInt(pageSize),
offset: (parseInt(page) - 1) * parseInt(pageSize),
order: [['id', 'DESC']]
});
2026-04-22 06:48:32 +00:00
response.success(res, '获取角色列表成功', {
list: roles,
total: count,
page: parseInt(page),
pageSize: parseInt(pageSize)
2026-04-20 06:43:09 +00:00
});
// 记录操作日志
await logOperation({
userId: req.user.id,
username: req.user.username,
tenantId: tenantId,
module: '角色管理',
action: '查询',
description: '获取角色列表',
method: req.method,
path: req.path,
ip: req.ip,
status: 'success'
});
} catch (error) {
console.error('获取角色列表错误:', error);
2026-04-22 06:48:32 +00:00
response.serverError(res, '获取角色列表失败', error);
2026-04-20 06:43:09 +00:00
}
};
// 获取角色详情
exports.getRoleById = async (req, res) => {
try {
const { id } = req.params;
const tenantId = req.user.tenantId;
const role = await Role.findOne({
where: {
id,
isDeleted: 0,
[Op.or]: [
{ tenantId: tenantId },
{ tenantId: null }
]
}
});
if (!role) {
2026-04-22 06:48:32 +00:00
return response.notFound(res, '角色不存在');
2026-04-20 06:43:09 +00:00
}
2026-04-22 06:48:32 +00:00
response.success(res, '获取角色详情成功', role);
2026-04-20 06:43:09 +00:00
// 记录操作日志
await logOperation({
userId: req.user.id,
username: req.user.username,
tenantId: tenantId,
module: '角色管理',
action: '查询',
description: `获取角色详情ID: ${id}`,
method: req.method,
path: req.path,
ip: req.ip,
status: 'success'
});
} catch (error) {
console.error('获取角色详情错误:', error);
2026-04-22 06:48:32 +00:00
response.serverError(res, '获取角色详情失败', error);
2026-04-20 06:43:09 +00:00
}
};
// 创建角色
exports.createRole = async (req, res) => {
try {
const { name, code, description, permissions, status } = req.body;
const tenantId = req.user.tenantId;
// 参数验证
if (!name || !code) {
2026-04-22 06:48:32 +00:00
return response.badRequest(res, '角色名称和编码不能为空');
2026-04-20 06:43:09 +00:00
}
// 检查角色编码是否已存在(限制在当前租户内)
const existingRole = await Role.findOne({
where: {
code,
isDeleted: 0,
tenantId: tenantId
}
});
if (existingRole) {
2026-04-22 06:48:32 +00:00
return response.badRequest(res, '角色编码已存在');
2026-04-20 06:43:09 +00:00
}
const role = await Role.create({
name,
code,
description,
permissions,
status: status || 'active',
tenantId: tenantId,
createBy: req.user.id,
updateBy: req.user.id
});
2026-04-22 06:48:32 +00:00
response.success(res, '创建角色成功', role);
2026-04-20 06:43:09 +00:00
// 记录操作日志
await logOperation({
userId: req.user.id,
username: req.user.username,
tenantId: tenantId,
module: '角色管理',
action: '创建',
description: `创建角色: ${name}`,
method: req.method,
path: req.path,
ip: req.ip,
status: 'success'
});
} catch (error) {
console.error('创建角色错误:', error);
2026-04-22 06:48:32 +00:00
response.serverError(res, '创建角色失败', error);
2026-04-20 06:43:09 +00:00
}
};
// 更新角色
exports.updateRole = async (req, res) => {
try {
const { id } = req.params;
const { name, code, description, permissions, status } = req.body;
const tenantId = req.user.tenantId;
// 查找角色
const role = await Role.findOne({
where: {
id,
isDeleted: 0,
tenantId: tenantId
}
});
if (!role) {
2026-04-22 06:48:32 +00:00
return response.notFound(res, '角色不存在');
2026-04-20 06:43:09 +00:00
}
// 检查角色编码是否已存在(排除当前角色)
if (code && code !== role.code) {
const existingRole = await Role.findOne({
where: {
code,
isDeleted: 0,
tenantId: tenantId,
id: { [Op.ne]: id }
}
});
if (existingRole) {
2026-04-22 06:48:32 +00:00
return response.badRequest(res, '角色编码已存在');
2026-04-20 06:43:09 +00:00
}
}
await role.update({
name: name || role.name,
code: code || role.code,
description: description !== undefined ? description : role.description,
permissions: permissions !== undefined ? permissions : role.permissions,
status: status || role.status,
updateBy: req.user.id
});
2026-04-22 06:48:32 +00:00
response.success(res, '更新角色成功', role);
2026-04-20 06:43:09 +00:00
// 记录操作日志
await logOperation({
userId: req.user.id,
username: req.user.username,
tenantId: tenantId,
module: '角色管理',
action: '更新',
description: `更新角色: ${role.name}`,
method: req.method,
path: req.path,
ip: req.ip,
status: 'success'
});
} catch (error) {
console.error('更新角色错误:', error);
2026-04-22 06:48:32 +00:00
response.serverError(res, '更新角色失败', error);
2026-04-20 06:43:09 +00:00
}
};
// 删除角色
exports.deleteRole = async (req, res) => {
try {
const { id } = req.params;
const tenantId = req.user.tenantId;
// 查找角色
const role = await Role.findOne({
where: {
id,
isDeleted: 0,
tenantId: tenantId
}
});
if (!role) {
2026-04-22 06:48:32 +00:00
return response.notFound(res, '角色不存在');
2026-04-20 06:43:09 +00:00
}
// 检查是否有用户使用此角色
const userCount = await role.countUsers({
where: { isDeleted: 0 }
});
if (userCount > 0) {
2026-04-22 06:48:32 +00:00
return response.badRequest(res, '该角色下还有用户,无法删除');
2026-04-20 06:43:09 +00:00
}
// 软删除
await role.update({
isDeleted: 1,
updateBy: req.user.id
});
2026-04-22 06:48:32 +00:00
response.success(res, '删除角色成功');
2026-04-20 06:43:09 +00:00
// 记录操作日志
await logOperation({
userId: req.user.id,
username: req.user.username,
tenantId: tenantId,
module: '角色管理',
action: '删除',
description: `删除角色: ${role.name}`,
method: req.method,
path: req.path,
ip: req.ip,
status: 'success'
});
} catch (error) {
console.error('删除角色错误:', error);
2026-04-22 06:48:32 +00:00
response.serverError(res, '删除角色失败', error);
2026-04-20 06:43:09 +00:00
}
};
// 获取所有角色(用于下拉选择)
exports.getAllRoles = async (req, res) => {
try {
const tenantId = req.user.tenantId;
const roles = await Role.findAll({
where: {
isDeleted: 0,
status: 'active',
[Op.or]: [
{ tenantId: tenantId },
{ tenantId: null }
]
},
attributes: ['id', 'name', 'code']
});
2026-04-22 06:48:32 +00:00
response.success(res, '获取角色列表成功', roles);
2026-04-20 06:43:09 +00:00
} catch (error) {
console.error('获取角色列表错误:', error);
2026-04-22 06:48:32 +00:00
response.serverError(res, '获取角色列表失败', error);
2026-04-20 06:43:09 +00:00
}
};