修改管理后台

This commit is contained in:
shenquanyi
2025-09-12 20:08:42 +08:00
parent 39d61c6f9b
commit 80a24c2d60
286 changed files with 75316 additions and 9452 deletions

View File

@@ -5,9 +5,161 @@
*/
const { User, Role } = require('../models');
const bcrypt = require('bcrypt');
const bcrypt = require('bcryptjs');
const jwt = require('jsonwebtoken');
/**
* 根据用户名搜索用户
* @param {Object} req - 请求对象
* @param {Object} res - 响应对象
*/
exports.searchUserByUsername = async (req, res) => {
const searchStartTime = Date.now();
const requestId = Math.random().toString(36).substr(2, 9);
try {
const { username } = req.query;
const userAgent = req.get('User-Agent') || 'Unknown';
const clientIP = req.ip || req.connection.remoteAddress || 'Unknown';
console.log(`🔍 [后端用户搜索监听] 搜索请求开始:`, {
requestId: requestId,
keyword: username,
timestamp: new Date().toISOString(),
clientIP: clientIP,
userAgent: userAgent,
queryParams: req.query,
headers: {
'content-type': req.get('Content-Type'),
'accept': req.get('Accept'),
'referer': req.get('Referer')
}
});
if (!username || username.trim() === '') {
console.log(`❌ [后端用户搜索监听] 搜索关键词为空:`, {
requestId: requestId,
keyword: username
});
return res.status(400).json({
success: false,
message: '请提供搜索关键词'
});
}
console.log(`🔄 [后端用户搜索监听] 开始数据库查询:`, {
requestId: requestId,
searchKeyword: username,
searchPattern: `%${username}%`
});
const queryStartTime = Date.now();
// 搜索用户
const users = await User.findAll({
where: {
username: {
[require('sequelize').Op.like]: `%${username}%`
}
},
attributes: { exclude: ['password'] },
order: [['created_at', 'DESC']]
});
const queryTime = Date.now() - queryStartTime;
const totalTime = Date.now() - searchStartTime;
console.log(`📊 [后端用户搜索监听] 数据库查询完成:`, {
requestId: requestId,
queryTime: queryTime + 'ms',
totalTime: totalTime + 'ms',
resultCount: users.length,
searchKeyword: username
});
// 获取角色信息
const roleIds = [...new Set(users.map(user => user.roles).filter(id => id))];
const roles = await Role.findAll({
where: { id: roleIds },
attributes: ['id', 'name', 'description']
});
const roleMap = roles.reduce((map, role) => {
map[role.id] = role;
return map;
}, {});
// 转换数据格式,添加角色名称
const usersWithRole = users.map(user => {
const userData = user.toJSON();
const role = roleMap[userData.roles];
userData.role = role ? {
id: role.id,
name: role.name,
description: role.description
} : null;
userData.roleName = role ? role.name : 'user';
userData.status = userData.status || 'active';
return userData;
});
// 记录搜索结果详情
if (usersWithRole.length > 0) {
console.log(`📋 [后端用户搜索监听] 搜索结果详情:`, {
requestId: requestId,
results: usersWithRole.map(user => ({
id: user.id,
username: user.username,
email: user.email,
roleName: user.roleName
}))
});
}
console.log(`✅ [后端用户搜索监听] 搜索成功:`, {
requestId: requestId,
keyword: username,
resultCount: usersWithRole.length,
responseTime: totalTime + 'ms'
});
res.status(200).json({
success: true,
data: usersWithRole,
meta: {
requestId: requestId,
searchKeyword: username,
resultCount: usersWithRole.length,
queryTime: queryTime,
totalTime: totalTime,
timestamp: new Date().toISOString()
}
});
} catch (error) {
const errorTime = Date.now() - searchStartTime;
console.error(`❌ [后端用户搜索监听] 搜索失败:`, {
requestId: requestId,
error: error.message,
stack: error.stack,
errorTime: errorTime + 'ms',
keyword: req.query.username
});
res.status(500).json({
success: false,
message: '搜索用户失败',
error: error.message,
meta: {
requestId: requestId,
errorTime: errorTime,
timestamp: new Date().toISOString()
}
});
}
};
/**
* 获取所有用户
* @param {Object} req - 请求对象
@@ -15,19 +167,43 @@ const jwt = require('jsonwebtoken');
*/
exports.getAllUsers = async (req, res) => {
try {
console.log('开始获取用户列表...');
// 获取所有用户
const users = await User.findAll({
include: [{ model: Role, as: 'roles', attributes: ['id', 'name'] }],
attributes: { exclude: ['password'] } // 排除密码字段
});
// 转换数据格式添加role字段
console.log(`查询到 ${users.length} 个用户`);
// 获取所有角色信息
const roleIds = [...new Set(users.map(user => user.roles).filter(id => id))];
const roles = await Role.findAll({
where: { id: roleIds },
attributes: ['id', 'name', 'description']
});
const roleMap = roles.reduce((map, role) => {
map[role.id] = role;
return map;
}, {});
// 转换数据格式,添加角色名称
const usersWithRole = users.map(user => {
const userData = user.toJSON();
// 获取第一个角色作为主要角色
userData.role = userData.roles && userData.roles.length > 0 ? userData.roles[0].name : 'user';
const role = roleMap[userData.roles];
userData.role = role ? {
id: role.id,
name: role.name,
description: role.description
} : null;
userData.roleName = role ? role.name : 'user';
userData.status = userData.status || 'active'; // 默认状态
return userData;
});
console.log('用户数据转换完成');
res.status(200).json({
success: true,
data: usersWithRole
@@ -50,9 +226,9 @@ exports.getAllUsers = async (req, res) => {
exports.getUserById = async (req, res) => {
try {
const { id } = req.params;
console.log(`开始获取用户详情ID: ${id}`);
const user = await User.findByPk(id, {
include: [{ model: Role, as: 'roles', attributes: ['id', 'name'] }],
attributes: { exclude: ['password'] } // 排除密码字段
});
@@ -63,9 +239,24 @@ exports.getUserById = async (req, res) => {
});
}
// 获取角色信息
const role = await Role.findByPk(user.roles);
// 添加角色名称字段
const userData = user.toJSON();
userData.role = role ? {
id: role.id,
name: role.name,
description: role.description
} : null;
userData.roleName = role ? role.name : 'user';
userData.status = userData.status || 'active'; // 默认状态
console.log('用户详情获取成功');
res.status(200).json({
success: true,
data: user
data: userData
});
} catch (error) {
console.error(`获取用户(ID: ${req.params.id})失败:`, error);
@@ -113,7 +304,7 @@ exports.createUser = async (req, res) => {
});
}
const { username, email, password, phone, avatar, status, role } = req.body;
const { username, email, password, phone, avatar, status, roles } = req.body;
// 验证必填字段
if (!username || !email || !password) {
@@ -146,17 +337,10 @@ exports.createUser = async (req, res) => {
password,
phone,
avatar,
status: status || 'active'
status: status || 'active',
roles: roles || 2 // 默认为普通用户角色ID
});
// 如果提供了角色,分配角色
if (role) {
const roleRecord = await Role.findOne({ where: { name: role } });
if (roleRecord) {
await user.addRole(roleRecord);
}
}
// 返回用户信息(不包含密码)
const userResponse = {
id: user.id,
@@ -214,7 +398,7 @@ exports.updateUser = async (req, res) => {
}
const { id } = req.params;
const { username, email, phone, avatar, status, password, role } = req.body;
const { username, email, phone, avatar, status, password, roles } = req.body;
const user = await User.findByPk(id);
@@ -252,6 +436,7 @@ exports.updateUser = async (req, res) => {
if (phone !== undefined) updateData.phone = phone;
if (avatar !== undefined) updateData.avatar = avatar;
if (status !== undefined) updateData.status = status;
if (roles !== undefined) updateData.roles = roles; // 直接更新roles字段
// 如果需要更新密码,先加密
if (password) {
@@ -260,29 +445,32 @@ exports.updateUser = async (req, res) => {
await user.update(updateData);
// 如果提供了角色,更新角色
if (role !== undefined) {
// 清除现有角色
await user.setRoles([]);
// 分配新角色
if (role) {
const roleRecord = await Role.findOne({ where: { name: role } });
if (roleRecord) {
await user.addRole(roleRecord);
}
}
}
// 获取角色信息
const role = await Role.findByPk(user.roles);
// 重新获取更新后的用户信息(不包含密码)
const updatedUser = await User.findByPk(id, {
include: [{ model: Role, as: 'roles', attributes: ['id', 'name'] }],
attributes: { exclude: ['password'] }
});
// 构建响应数据
const userData = {
id: user.id,
username: user.username,
email: user.email,
phone: user.phone,
avatar: user.avatar,
roles: user.roles,
status: user.status,
created_at: user.created_at,
updated_at: user.updated_at,
role: role ? {
id: role.id,
name: role.name,
description: role.description
} : null,
roleName: role ? role.name : 'user'
};
res.status(200).json({
success: true,
message: '用户更新成功',
data: updatedUser
data: userData
});
} catch (error) {
console.error(`更新用户(ID: ${req.params.id})失败:`, error);
@@ -350,6 +538,77 @@ exports.deleteUser = async (req, res) => {
}
};
/**
* 根据用户名搜索用户
* @param {Object} req - 请求对象
* @param {Object} res - 响应对象
*/
exports.searchUserByUsername = async (req, res) => {
try {
const { username } = req.query;
if (!username) {
return res.status(400).json({
success: false,
message: '请提供用户名参数'
});
}
console.log(`开始搜索用户名包含: ${username}`);
// 使用模糊查询搜索用户名
const users = await User.findAll({
where: {
username: {
[require('sequelize').Op.like]: `%${username}%`
}
},
attributes: { exclude: ['password'] } // 排除密码字段
});
console.log(`找到 ${users.length} 个匹配的用户`);
// 获取所有角色信息
const roleIds = [...new Set(users.map(user => user.roles).filter(id => id))];
const roles = await Role.findAll({
where: { id: roleIds },
attributes: ['id', 'name', 'description']
});
const roleMap = roles.reduce((map, role) => {
map[role.id] = role;
return map;
}, {});
// 转换数据格式,添加角色名称
const usersWithRole = users.map(user => {
const userData = user.toJSON();
const role = roleMap[userData.roles];
userData.role = role ? {
id: role.id,
name: role.name,
description: role.description
} : null;
userData.roleName = role ? role.name : 'user';
userData.status = userData.status || 'active'; // 默认状态
return userData;
});
res.status(200).json({
success: true,
data: usersWithRole,
message: `找到 ${usersWithRole.length} 个匹配的用户`
});
} catch (error) {
console.error('搜索用户失败:', error);
res.status(500).json({
success: false,
message: '搜索用户失败',
error: error.message
});
}
};
/**
* 用户登录
* @param {Object} req - 请求对象