refactor: 统一代码风格并迁移至 ESLint 新配置
style(backend): 格式化模型文件代码 style(frontend): 调整组件代码格式 chore: 删除旧 ESLint 配置并添加新配置 refactor(backend): 重构模型定义语法 style: 统一箭头函数和对象属性简写
This commit is contained in:
+148
-111
@@ -15,7 +15,7 @@ const generateId = () => {
|
||||
return 'user_' + Date.now().toString(36) + Math.random().toString(36).substr(2, 9);
|
||||
};
|
||||
|
||||
const getWhereClause = (query) => {
|
||||
const getWhereClause = query => {
|
||||
const where = {};
|
||||
|
||||
if (query.username) {
|
||||
@@ -33,10 +33,10 @@ const getWhereClause = (query) => {
|
||||
return where;
|
||||
};
|
||||
|
||||
const getUserRoleIds = async (userId) => {
|
||||
const getUserRoleIds = async userId => {
|
||||
const userRoles = await UserRole.findAll({
|
||||
where: { UserId: userId },
|
||||
attributes: ['RoleId']
|
||||
attributes: ['RoleId'],
|
||||
});
|
||||
return userRoles.map(ur => ur.RoleId);
|
||||
};
|
||||
@@ -45,7 +45,13 @@ const { Op } = require('sequelize');
|
||||
|
||||
router.get('/', authMiddleware, async (req, res) => {
|
||||
try {
|
||||
const { page = 1, pageSize = PAGINATION.DEFAULT_PAGE_SIZE, username, status, realName } = req.query;
|
||||
const {
|
||||
page = 1,
|
||||
pageSize = PAGINATION.DEFAULT_PAGE_SIZE,
|
||||
username,
|
||||
status,
|
||||
realName,
|
||||
} = req.query;
|
||||
const offset = (parseInt(page) - 1) * parseInt(pageSize);
|
||||
const limit = Math.min(parseInt(pageSize), PAGINATION.MAX_PAGE_SIZE);
|
||||
|
||||
@@ -56,20 +62,22 @@ router.get('/', authMiddleware, async (req, res) => {
|
||||
attributes: { exclude: ['password'] },
|
||||
limit,
|
||||
offset,
|
||||
order: [['createdAt', 'DESC']]
|
||||
order: [['createdAt', 'DESC']],
|
||||
});
|
||||
|
||||
if (users.length > 0) {
|
||||
const userIds = users.map(u => u.userId);
|
||||
const allUserRoles = await UserRole.findAll({
|
||||
include: [{
|
||||
model: Role,
|
||||
where: { status: 'active' },
|
||||
attributes: ['roleId', 'roleName', 'roleCode']
|
||||
}],
|
||||
include: [
|
||||
{
|
||||
model: Role,
|
||||
where: { status: 'active' },
|
||||
attributes: ['roleId', 'roleName', 'roleCode'],
|
||||
},
|
||||
],
|
||||
where: {
|
||||
UserId: { [Op.in]: userIds }
|
||||
}
|
||||
UserId: { [Op.in]: userIds },
|
||||
},
|
||||
});
|
||||
|
||||
const userRolesMap = {};
|
||||
@@ -80,7 +88,7 @@ router.get('/', authMiddleware, async (req, res) => {
|
||||
userRolesMap[ur.UserId].push({
|
||||
roleId: ur.Role.roleId,
|
||||
roleName: ur.Role.roleName,
|
||||
roleCode: ur.Role.roleCode
|
||||
roleCode: ur.Role.roleCode,
|
||||
});
|
||||
});
|
||||
|
||||
@@ -99,14 +107,14 @@ router.get('/', authMiddleware, async (req, res) => {
|
||||
total: count,
|
||||
page: parseInt(page),
|
||||
pageSize: parseInt(pageSize),
|
||||
users
|
||||
}
|
||||
users,
|
||||
},
|
||||
});
|
||||
} catch (error) {
|
||||
console.error('获取用户列表错误:', error);
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
message: '获取用户列表失败'
|
||||
message: '获取用户列表失败',
|
||||
});
|
||||
}
|
||||
});
|
||||
@@ -116,18 +124,18 @@ router.get('/all', authMiddleware, async (req, res) => {
|
||||
const users = await User.findAll({
|
||||
where: { status: 'active' },
|
||||
attributes: ['userId', 'username', 'realName', 'email'],
|
||||
order: [['realName', 'ASC']]
|
||||
order: [['realName', 'ASC']],
|
||||
});
|
||||
|
||||
res.json({
|
||||
success: true,
|
||||
data: users
|
||||
data: users,
|
||||
});
|
||||
} catch (error) {
|
||||
console.error('获取所有用户错误:', error);
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
message: '获取用户列表失败'
|
||||
message: '获取用户列表失败',
|
||||
});
|
||||
}
|
||||
});
|
||||
@@ -135,39 +143,41 @@ router.get('/all', authMiddleware, async (req, res) => {
|
||||
router.get('/:userId', authMiddleware, async (req, res) => {
|
||||
try {
|
||||
const user = await User.findByPk(req.params.userId, {
|
||||
attributes: { exclude: ['password'] }
|
||||
attributes: { exclude: ['password'] },
|
||||
});
|
||||
|
||||
if (!user) {
|
||||
return res.status(404).json({
|
||||
success: false,
|
||||
message: '用户不存在'
|
||||
message: '用户不存在',
|
||||
});
|
||||
}
|
||||
|
||||
const userRoles = await UserRole.findAll({
|
||||
include: [{
|
||||
model: Role,
|
||||
where: { status: 'active' }
|
||||
}],
|
||||
where: { UserId: user.userId }
|
||||
include: [
|
||||
{
|
||||
model: Role,
|
||||
where: { status: 'active' },
|
||||
},
|
||||
],
|
||||
where: { UserId: user.userId },
|
||||
});
|
||||
|
||||
user.dataValues.roles = userRoles.map(ur => ({
|
||||
roleId: ur.Role.roleId,
|
||||
roleName: ur.Role.roleName,
|
||||
roleCode: ur.Role.roleCode
|
||||
roleCode: ur.Role.roleCode,
|
||||
}));
|
||||
|
||||
res.json({
|
||||
success: true,
|
||||
data: user
|
||||
data: user,
|
||||
});
|
||||
} catch (error) {
|
||||
console.error('获取用户详情错误:', error);
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
message: '获取用户详情失败'
|
||||
message: '获取用户详情失败',
|
||||
});
|
||||
}
|
||||
});
|
||||
@@ -179,7 +189,7 @@ router.post('/', authMiddleware, async (req, res) => {
|
||||
if (!username || !password) {
|
||||
return res.status(400).json({
|
||||
success: false,
|
||||
message: '用户名和密码不能为空'
|
||||
message: '用户名和密码不能为空',
|
||||
});
|
||||
}
|
||||
|
||||
@@ -187,7 +197,7 @@ router.post('/', authMiddleware, async (req, res) => {
|
||||
if (existingUser) {
|
||||
return res.status(400).json({
|
||||
success: false,
|
||||
message: '用户名已存在'
|
||||
message: '用户名已存在',
|
||||
});
|
||||
}
|
||||
|
||||
@@ -201,34 +211,41 @@ router.post('/', authMiddleware, async (req, res) => {
|
||||
phone,
|
||||
realName: realName || username,
|
||||
status: status || 'active',
|
||||
remark
|
||||
remark,
|
||||
});
|
||||
|
||||
if (roleIds && roleIds.length > 0) {
|
||||
for (const roleId of roleIds) {
|
||||
await UserRole.create({
|
||||
UserId: user.userId,
|
||||
RoleId: roleId
|
||||
RoleId: roleId,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
const roleNames = roleIds && roleIds.length > 0
|
||||
? (await Role.findAll({ where: { roleId: { [Op.in]: roleIds } } })).map(r => r.roleName).join('、')
|
||||
: '未分配角色';
|
||||
const roleNames =
|
||||
roleIds && roleIds.length > 0
|
||||
? (await Role.findAll({ where: { roleId: { [Op.in]: roleIds } } }))
|
||||
.map(r => r.roleName)
|
||||
.join('、')
|
||||
: '未分配角色';
|
||||
|
||||
await logUserOperation('create', `创建用户【${username}】(姓名:${realName || '未填写'},邮箱:${email || '未填写'},角色:${roleNames})`, {
|
||||
targetId: user.userId,
|
||||
targetName: username,
|
||||
afterState: {
|
||||
username: user.username,
|
||||
email: user.email,
|
||||
realName: user.realName,
|
||||
status: user.status
|
||||
},
|
||||
req,
|
||||
metadata: { roleIds, roleNames }
|
||||
});
|
||||
await logUserOperation(
|
||||
'create',
|
||||
`创建用户【${username}】(姓名:${realName || '未填写'},邮箱:${email || '未填写'},角色:${roleNames})`,
|
||||
{
|
||||
targetId: user.userId,
|
||||
targetName: username,
|
||||
afterState: {
|
||||
username: user.username,
|
||||
email: user.email,
|
||||
realName: user.realName,
|
||||
status: user.status,
|
||||
},
|
||||
req,
|
||||
metadata: { roleIds, roleNames },
|
||||
}
|
||||
);
|
||||
|
||||
res.status(201).json({
|
||||
success: true,
|
||||
@@ -238,14 +255,14 @@ router.post('/', authMiddleware, async (req, res) => {
|
||||
username: user.username,
|
||||
email: user.email,
|
||||
realName: user.realName,
|
||||
status: user.status
|
||||
}
|
||||
status: user.status,
|
||||
},
|
||||
});
|
||||
} catch (error) {
|
||||
console.error('创建用户错误:', error);
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
message: '创建用户失败'
|
||||
message: '创建用户失败',
|
||||
});
|
||||
}
|
||||
});
|
||||
@@ -258,7 +275,7 @@ router.put('/:userId', authMiddleware, async (req, res) => {
|
||||
if (!user) {
|
||||
return res.status(404).json({
|
||||
success: false,
|
||||
message: '用户不存在'
|
||||
message: '用户不存在',
|
||||
});
|
||||
}
|
||||
|
||||
@@ -268,29 +285,39 @@ router.put('/:userId', authMiddleware, async (req, res) => {
|
||||
phone: user.phone,
|
||||
realName: user.realName,
|
||||
status: user.status,
|
||||
remark: user.remark
|
||||
remark: user.remark,
|
||||
};
|
||||
|
||||
const oldRoleIds = roleIds !== undefined ? null : await getUserRoleIds(user.userId);
|
||||
|
||||
if (username !== undefined && username !== user.username) {
|
||||
const existingUser = await User.findOne({
|
||||
where: { username, userId: { [Op.ne]: user.userId } }
|
||||
where: { username, userId: { [Op.ne]: user.userId } },
|
||||
});
|
||||
if (existingUser) {
|
||||
return res.status(400).json({
|
||||
success: false,
|
||||
message: '用户名已存在'
|
||||
message: '用户名已存在',
|
||||
});
|
||||
}
|
||||
user.username = username;
|
||||
}
|
||||
|
||||
if (email !== undefined) user.email = email;
|
||||
if (phone !== undefined) user.phone = phone;
|
||||
if (realName !== undefined) user.realName = realName;
|
||||
if (status !== undefined) user.status = status;
|
||||
if (remark !== undefined) user.remark = remark;
|
||||
if (email !== undefined) {
|
||||
user.email = email;
|
||||
}
|
||||
if (phone !== undefined) {
|
||||
user.phone = phone;
|
||||
}
|
||||
if (realName !== undefined) {
|
||||
user.realName = realName;
|
||||
}
|
||||
if (status !== undefined) {
|
||||
user.status = status;
|
||||
}
|
||||
if (remark !== undefined) {
|
||||
user.remark = remark;
|
||||
}
|
||||
|
||||
if (newPassword && newPassword.length >= PASSWORD_MIN_LENGTH) {
|
||||
user.password = await bcrypt.hash(newPassword, SALT_ROUNDS);
|
||||
@@ -311,7 +338,7 @@ router.put('/:userId', authMiddleware, async (req, res) => {
|
||||
for (const roleId of roleIds) {
|
||||
await UserRole.create({
|
||||
UserId: user.userId,
|
||||
RoleId: roleId
|
||||
RoleId: roleId,
|
||||
});
|
||||
}
|
||||
|
||||
@@ -321,7 +348,7 @@ router.put('/:userId', authMiddleware, async (req, res) => {
|
||||
}
|
||||
|
||||
const updatedUser = await User.findByPk(req.params.userId, {
|
||||
attributes: { exclude: ['password'] }
|
||||
attributes: { exclude: ['password'] },
|
||||
});
|
||||
|
||||
if (permissionChanged) {
|
||||
@@ -332,7 +359,7 @@ router.put('/:userId', authMiddleware, async (req, res) => {
|
||||
beforeState: { ...beforeState, roleIds: oldRoleIds, roleNames: oldRoleNames },
|
||||
afterState: { ...beforeState, roleIds, roleNames: newRoleNames },
|
||||
req,
|
||||
metadata: { oldRoleIds, newRoleIds: roleIds, oldRoleNames, newRoleNames }
|
||||
metadata: { oldRoleIds, newRoleIds: roleIds, oldRoleNames, newRoleNames },
|
||||
});
|
||||
} else {
|
||||
const afterState = {
|
||||
@@ -341,7 +368,7 @@ router.put('/:userId', authMiddleware, async (req, res) => {
|
||||
phone: updatedUser.phone,
|
||||
realName: updatedUser.realName,
|
||||
status: updatedUser.status,
|
||||
remark: updatedUser.remark
|
||||
remark: updatedUser.remark,
|
||||
};
|
||||
|
||||
const changedFields = {};
|
||||
@@ -351,14 +378,20 @@ router.put('/:userId', authMiddleware, async (req, res) => {
|
||||
}
|
||||
}
|
||||
|
||||
const changeDetails = Object.entries(changedFields).map(([field, values]) => {
|
||||
const fieldNames = {
|
||||
username: '用户名', email: '邮箱', phone: '电话', realName: '姓名',
|
||||
status: '状态', remark: '备注'
|
||||
};
|
||||
const displayName = fieldNames[field] || field;
|
||||
return `${displayName}: ${values.from ?? '空'} → ${values.to ?? '空'}`;
|
||||
}).join(';');
|
||||
const changeDetails = Object.entries(changedFields)
|
||||
.map(([field, values]) => {
|
||||
const fieldNames = {
|
||||
username: '用户名',
|
||||
email: '邮箱',
|
||||
phone: '电话',
|
||||
realName: '姓名',
|
||||
status: '状态',
|
||||
remark: '备注',
|
||||
};
|
||||
const displayName = fieldNames[field] || field;
|
||||
return `${displayName}: ${values.from ?? '空'} → ${values.to ?? '空'}`;
|
||||
})
|
||||
.join(';');
|
||||
|
||||
const updateDesc = changeDetails
|
||||
? `更新用户【${updatedUser.username}】:${changeDetails}`
|
||||
@@ -370,20 +403,20 @@ router.put('/:userId', authMiddleware, async (req, res) => {
|
||||
beforeState,
|
||||
afterState,
|
||||
req,
|
||||
metadata: { changedFields }
|
||||
metadata: { changedFields },
|
||||
});
|
||||
}
|
||||
|
||||
res.json({
|
||||
success: true,
|
||||
message: '更新成功',
|
||||
data: updatedUser
|
||||
data: updatedUser,
|
||||
});
|
||||
} catch (error) {
|
||||
console.error('更新用户错误:', error);
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
message: '更新用户失败'
|
||||
message: '更新用户失败',
|
||||
});
|
||||
}
|
||||
});
|
||||
@@ -396,14 +429,14 @@ router.put('/:userId/password', authMiddleware, async (req, res) => {
|
||||
if (!user) {
|
||||
return res.status(404).json({
|
||||
success: false,
|
||||
message: '用户不存在'
|
||||
message: '用户不存在',
|
||||
});
|
||||
}
|
||||
|
||||
if (!newPassword || newPassword.length < PASSWORD_MIN_LENGTH) {
|
||||
return res.status(400).json({
|
||||
success: false,
|
||||
message: `密码长度不能少于${PASSWORD_MIN_LENGTH}个字符`
|
||||
message: `密码长度不能少于${PASSWORD_MIN_LENGTH}个字符`,
|
||||
});
|
||||
}
|
||||
|
||||
@@ -412,13 +445,13 @@ router.put('/:userId/password', authMiddleware, async (req, res) => {
|
||||
|
||||
res.json({
|
||||
success: true,
|
||||
message: '密码重置成功'
|
||||
message: '密码重置成功',
|
||||
});
|
||||
} catch (error) {
|
||||
console.error('重置密码错误:', error);
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
message: '重置密码失败'
|
||||
message: '重置密码失败',
|
||||
});
|
||||
}
|
||||
});
|
||||
@@ -430,14 +463,14 @@ router.delete('/:userId', authMiddleware, async (req, res) => {
|
||||
if (!user) {
|
||||
return res.status(404).json({
|
||||
success: false,
|
||||
message: '用户不存在'
|
||||
message: '用户不存在',
|
||||
});
|
||||
}
|
||||
|
||||
if (user.userId === req.user.userId) {
|
||||
return res.status(400).json({
|
||||
success: false,
|
||||
message: '不能删除当前登录用户'
|
||||
message: '不能删除当前登录用户',
|
||||
});
|
||||
}
|
||||
|
||||
@@ -448,29 +481,33 @@ router.delete('/:userId', authMiddleware, async (req, res) => {
|
||||
username: user.username,
|
||||
email: user.email,
|
||||
realName: user.realName,
|
||||
status: user.status
|
||||
status: user.status,
|
||||
};
|
||||
|
||||
await UserRole.destroy({ where: { UserId: user.userId } });
|
||||
await user.destroy();
|
||||
|
||||
await logUserOperation('delete', `删除用户【${userName}】(姓名:${userRealName || '未填写'},邮箱:${userEmail || '未填写'})`, {
|
||||
targetId: req.params.userId,
|
||||
targetName: userName,
|
||||
beforeState,
|
||||
req,
|
||||
metadata: { deletedUsername: userName, realName: userRealName, email: userEmail }
|
||||
});
|
||||
await logUserOperation(
|
||||
'delete',
|
||||
`删除用户【${userName}】(姓名:${userRealName || '未填写'},邮箱:${userEmail || '未填写'})`,
|
||||
{
|
||||
targetId: req.params.userId,
|
||||
targetName: userName,
|
||||
beforeState,
|
||||
req,
|
||||
metadata: { deletedUsername: userName, realName: userRealName, email: userEmail },
|
||||
}
|
||||
);
|
||||
|
||||
res.json({
|
||||
success: true,
|
||||
message: '删除成功'
|
||||
message: '删除成功',
|
||||
});
|
||||
} catch (error) {
|
||||
console.error('删除用户错误:', error);
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
message: '删除用户失败'
|
||||
message: '删除用户失败',
|
||||
});
|
||||
}
|
||||
});
|
||||
@@ -482,31 +519,31 @@ router.post('/:userId/avatar', authMiddleware, async (req, res) => {
|
||||
if (!user) {
|
||||
return res.status(404).json({
|
||||
success: false,
|
||||
message: '用户不存在'
|
||||
message: '用户不存在',
|
||||
});
|
||||
}
|
||||
|
||||
if (!req.files || !req.files.avatar) {
|
||||
return res.status(400).json({
|
||||
success: false,
|
||||
message: '请选择要上传的头像文件'
|
||||
message: '请选择要上传的头像文件',
|
||||
});
|
||||
}
|
||||
|
||||
const avatarFile = req.files.avatar;
|
||||
const allowedTypes = ['image/jpeg', 'image/png', 'image/gif', 'image/webp'];
|
||||
|
||||
|
||||
if (!allowedTypes.includes(avatarFile.mimetype)) {
|
||||
return res.status(400).json({
|
||||
success: false,
|
||||
message: '只支持 JPG、PNG、GIF 和 WebP 格式的图片'
|
||||
message: '只支持 JPG、PNG、GIF 和 WebP 格式的图片',
|
||||
});
|
||||
}
|
||||
|
||||
if (avatarFile.size > FILE_UPLOAD.MAX_AVATAR_SIZE) {
|
||||
return res.status(400).json({
|
||||
success: false,
|
||||
message: `图片大小不能超过 ${FILE_UPLOAD.MAX_AVATAR_SIZE / 1024 / 1024}MB`
|
||||
message: `图片大小不能超过 ${FILE_UPLOAD.MAX_AVATAR_SIZE / 1024 / 1024}MB`,
|
||||
});
|
||||
}
|
||||
|
||||
@@ -535,13 +572,13 @@ router.post('/:userId/avatar', authMiddleware, async (req, res) => {
|
||||
res.json({
|
||||
success: true,
|
||||
message: '头像上传成功',
|
||||
data: { avatar: avatarUrl }
|
||||
data: { avatar: avatarUrl },
|
||||
});
|
||||
} catch (error) {
|
||||
console.error('上传头像错误:', error);
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
message: '上传头像失败'
|
||||
message: '上传头像失败',
|
||||
});
|
||||
}
|
||||
});
|
||||
@@ -553,7 +590,7 @@ router.delete('/:userId/avatar', authMiddleware, async (req, res) => {
|
||||
if (!user) {
|
||||
return res.status(404).json({
|
||||
success: false,
|
||||
message: '用户不存在'
|
||||
message: '用户不存在',
|
||||
});
|
||||
}
|
||||
|
||||
@@ -569,13 +606,13 @@ router.delete('/:userId/avatar', authMiddleware, async (req, res) => {
|
||||
|
||||
res.json({
|
||||
success: true,
|
||||
message: '头像删除成功'
|
||||
message: '头像删除成功',
|
||||
});
|
||||
} catch (error) {
|
||||
console.error('删除头像错误:', error);
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
message: '删除头像失败'
|
||||
message: '删除头像失败',
|
||||
});
|
||||
}
|
||||
});
|
||||
@@ -587,14 +624,14 @@ router.put('/:userId/approve', authMiddleware, async (req, res) => {
|
||||
if (!user) {
|
||||
return res.status(404).json({
|
||||
success: false,
|
||||
message: '用户不存在'
|
||||
message: '用户不存在',
|
||||
});
|
||||
}
|
||||
|
||||
if (user.status !== 'pending') {
|
||||
return res.status(400).json({
|
||||
success: false,
|
||||
message: '该用户不在待审核状态'
|
||||
message: '该用户不在待审核状态',
|
||||
});
|
||||
}
|
||||
|
||||
@@ -607,14 +644,14 @@ router.put('/:userId/approve', authMiddleware, async (req, res) => {
|
||||
data: {
|
||||
userId: user.userId,
|
||||
username: user.username,
|
||||
status: user.status
|
||||
}
|
||||
status: user.status,
|
||||
},
|
||||
});
|
||||
} catch (error) {
|
||||
console.error('审核用户错误:', error);
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
message: '审核用户失败'
|
||||
message: '审核用户失败',
|
||||
});
|
||||
}
|
||||
});
|
||||
@@ -626,14 +663,14 @@ router.put('/:userId/reject', authMiddleware, async (req, res) => {
|
||||
if (!user) {
|
||||
return res.status(404).json({
|
||||
success: false,
|
||||
message: '用户不存在'
|
||||
message: '用户不存在',
|
||||
});
|
||||
}
|
||||
|
||||
if (user.status !== 'pending') {
|
||||
return res.status(400).json({
|
||||
success: false,
|
||||
message: '该用户不在待审核状态'
|
||||
message: '该用户不在待审核状态',
|
||||
});
|
||||
}
|
||||
|
||||
@@ -646,14 +683,14 @@ router.put('/:userId/reject', authMiddleware, async (req, res) => {
|
||||
data: {
|
||||
userId: user.userId,
|
||||
username: user.username,
|
||||
status: user.status
|
||||
}
|
||||
status: user.status,
|
||||
},
|
||||
});
|
||||
} catch (error) {
|
||||
console.error('拒绝用户错误:', error);
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
message: '操作失败'
|
||||
message: '操作失败',
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user