新增用户管理页面

This commit is contained in:
Stev_Wang
2026-01-04 21:04:30 +08:00
parent 93aae460af
commit 36934dbb7e
15 changed files with 1363 additions and 12 deletions

View File

@@ -0,0 +1,257 @@
// 导入Express的Request和Response类型
import { Request, Response } from 'express';
// 导入数据源配置
import { AppDataSource } from '../config/database';
// 导入角色模型
import { AdminRole } from '../models/AdminRole';
/**
* 角色控制器
* 处理角色管理相关的操作,包括角色列表查询、创建、编辑、删除等
*/
export class AdminRoleController {
/**
* 获取角色列表
* 获取所有角色列表,支持按状态筛选
* @param req - Express请求对象包含查询参数
* @param res - Express响应对象
*/
async getRoleList(req: Request, res: Response) {
try {
// 从查询参数中获取状态筛选条件
const { status } = req.query;
// 获取角色仓库
const roleRepository = AppDataSource.getRepository(AdminRole);
// 构建查询条件
const queryBuilder = roleRepository.createQueryBuilder('role');
// 按状态筛选
if (status !== undefined && status !== null && status !== '') {
queryBuilder.andWhere('role.status = :status', { status: Number(status) });
}
// 查询角色列表
const roles = await queryBuilder.orderBy('role.id', 'ASC').getMany();
// 组装返回数据
const roleList = roles.map(role => ({
id: role.id,
roleName: role.roleName,
description: role.description,
status: role.status,
createdAt: role.createdAt,
updatedAt: role.updatedAt
}));
// 返回角色列表
return res.json({
success: true,
data: roleList
});
} catch (error) {
console.error('获取角色列表失败:', error);
return res.status(500).json({
success: false,
message: '服务器内部错误'
});
}
}
/**
* 创建角色
* 创建新的角色
* @param req - Express请求对象包含角色信息
* @param res - Express响应对象
*/
async createRole(req: Request, res: Response) {
try {
// 从请求体中获取角色信息
const { roleName, description } = req.body;
// 验证必填字段
if (!roleName) {
return res.status(400).json({
success: false,
message: '角色名称不能为空'
});
}
// 获取角色仓库
const roleRepository = AppDataSource.getRepository(AdminRole);
// 检查角色名称是否已存在
const existingRole = await roleRepository.findOne({
where: { roleName }
});
if (existingRole) {
return res.status(400).json({
success: false,
message: '角色名称已存在'
});
}
// 创建新角色
const newRole = roleRepository.create({
roleName,
description,
status: 1 // 默认启用
});
// 保存角色
await roleRepository.save(newRole);
// 返回创建成功响应
return res.json({
success: true,
message: '创建角色成功',
data: {
id: newRole.id,
roleName: newRole.roleName
}
});
} catch (error) {
console.error('创建角色失败:', error);
return res.status(500).json({
success: false,
message: '服务器内部错误'
});
}
}
/**
* 编辑角色
* 更新角色信息
* @param req - Express请求对象包含角色ID和更新信息
* @param res - Express响应对象
*/
async updateRole(req: Request, res: Response) {
try {
// 从请求参数中获取角色ID
const { id } = req.params;
// 从请求体中获取更新信息
const { roleName, description, status } = req.body;
// 验证必填字段
if (!roleName) {
return res.status(400).json({
success: false,
message: '角色名称不能为空'
});
}
// 获取角色仓库
const roleRepository = AppDataSource.getRepository(AdminRole);
// 查找角色
const role = await roleRepository.findOne({
where: { id: Number(id) }
});
if (!role) {
return res.status(404).json({
success: false,
message: '角色不存在'
});
}
// 检查角色名称是否与其他角色重复
const existingRole = await roleRepository.findOne({
where: { roleName }
});
if (existingRole && existingRole.id !== role.id) {
return res.status(400).json({
success: false,
message: '角色名称已存在'
});
}
// 更新角色信息
role.roleName = roleName;
role.description = description;
role.status = status !== undefined ? Number(status) : role.status;
// 保存更新
await roleRepository.save(role);
// 返回更新成功响应
return res.json({
success: true,
message: '更新角色成功',
data: {
id: role.id,
roleName: role.roleName
}
});
} catch (error) {
console.error('更新角色失败:', error);
return res.status(500).json({
success: false,
message: '服务器内部错误'
});
}
}
/**
* 删除角色
* 删除指定的角色
* 禁止删除默认的超级管理员角色ID=1
* @param req - Express请求对象包含角色ID
* @param res - Express响应对象
*/
async deleteRole(req: Request, res: Response) {
try {
// 从请求参数中获取角色ID
const { id } = req.params;
// 验证角色ID
if (!id) {
return res.status(400).json({
success: false,
message: '角色ID不能为空'
});
}
// 禁止删除默认的超级管理员角色ID=1
if (Number(id) === 1) {
return res.status(403).json({
success: false,
message: '禁止删除默认的超级管理员角色'
});
}
// 获取角色仓库
const roleRepository = AppDataSource.getRepository(AdminRole);
// 查找角色
const role = await roleRepository.findOne({
where: { id: Number(id) }
});
if (!role) {
return res.status(404).json({
success: false,
message: '角色不存在'
});
}
// 删除角色
await roleRepository.remove(role);
// 返回删除成功响应
return res.json({
success: true,
message: '删除角色成功'
});
} catch (error) {
console.error('删除角色失败:', error);
return res.status(500).json({
success: false,
message: '服务器内部错误'
});
}
}
}

View File

@@ -0,0 +1,336 @@
// 导入Express的Request和Response类型
import { Request, Response } from 'express';
// 导入bcrypt用于密码加密
import bcrypt from 'bcrypt';
// 导入数据源配置
import { AppDataSource } from '../config/database';
// 导入管理员用户模型
import { AdminUser } from '../models/AdminUser';
// 导入角色模型
import { AdminRole } from '../models/AdminRole';
/**
* 管理员用户控制器
* 处理用户管理相关的操作,包括用户列表查询、创建、编辑、删除等
*/
export class AdminUserController {
/**
* 获取用户列表
* 支持按用户名、角色ID、状态进行筛选支持分页
* @param req - Express请求对象包含查询参数
* @param res - Express响应对象
*/
async getUserList(req: Request, res: Response) {
try {
// 从查询参数中获取筛选条件和分页参数
const { username, roleId, status, page = 1, pageSize = 20 } = req.query;
// 获取管理员用户仓库
const adminUserRepository = AppDataSource.getRepository(AdminUser);
// 获取角色仓库
const roleRepository = AppDataSource.getRepository(AdminRole);
// 构建查询条件
const queryBuilder = adminUserRepository.createQueryBuilder('user');
// 按用户名筛选(模糊查询)
if (username) {
queryBuilder.andWhere('user.username LIKE :username', { username: `%${username}%` });
}
// 按角色ID筛选
if (roleId) {
queryBuilder.andWhere('user.roleId = :roleId', { roleId: Number(roleId) });
}
// 按状态筛选
if (status !== undefined && status !== null && status !== '') {
queryBuilder.andWhere('user.status = :status', { status: Number(status) });
}
// 计算总数
const total = await queryBuilder.getCount();
// 分页查询
const users = await queryBuilder
.orderBy('user.id', 'DESC')
.skip((Number(page) - 1) * Number(pageSize))
.take(Number(pageSize))
.getMany();
// 获取所有角色信息(用于显示角色名称)
const roles = await roleRepository.find();
// 构建角色ID到角色名称的映射
const roleMap = new Map(roles.map(role => [role.id, role.roleName]));
// 组装返回数据
const userList = users.map(user => ({
id: user.id,
username: user.username,
realName: user.realName,
roleId: user.roleId,
roleName: roleMap.get(user.roleId) || '未知角色',
status: user.status,
createdAt: user.createdAt,
updatedAt: user.updatedAt
}));
// 返回用户列表
return res.json({
success: true,
data: {
list: userList,
total,
page: Number(page),
pageSize: Number(pageSize)
}
});
} catch (error) {
console.error('获取用户列表失败:', error);
return res.status(500).json({
success: false,
message: '服务器内部错误'
});
}
}
/**
* 创建用户
* 创建新的管理员用户
* @param req - Express请求对象包含用户信息
* @param res - Express响应对象
*/
async createUser(req: Request, res: Response) {
try {
// 从请求体中获取用户信息
const { username, password, roleId } = req.body;
// 验证必填字段
if (!username || !password || !roleId) {
return res.status(400).json({
success: false,
message: '用户名、密码和角色组不能为空'
});
}
// 获取管理员用户仓库
const adminUserRepository = AppDataSource.getRepository(AdminUser);
// 检查用户名是否已存在
const existingUser = await adminUserRepository.findOne({
where: { username }
});
if (existingUser) {
return res.status(400).json({
success: false,
message: '用户名已存在'
});
}
// 密码加密
const passwordHash = await bcrypt.hash(password, 10);
// 创建新用户
const newUser = adminUserRepository.create({
username,
passwordHash,
roleId: Number(roleId),
status: 1 // 默认启用
});
// 保存用户
await adminUserRepository.save(newUser);
// 返回创建成功响应
return res.json({
success: true,
message: '创建用户成功',
data: {
id: newUser.id,
username: newUser.username,
roleId: newUser.roleId
}
});
} catch (error) {
console.error('创建用户失败:', error);
return res.status(500).json({
success: false,
message: '服务器内部错误'
});
}
}
/**
* 编辑用户
* 更新用户信息(密码和角色)
* @param req - Express请求对象包含用户ID和更新信息
* @param res - Express响应对象
*/
async updateUser(req: Request, res: Response) {
try {
// 从请求参数中获取用户ID
const { id } = req.params;
// 从请求体中获取更新信息
const { password, roleId } = req.body;
// 验证必填字段
if (!roleId) {
return res.status(400).json({
success: false,
message: '角色组不能为空'
});
}
// 获取管理员用户仓库
const adminUserRepository = AppDataSource.getRepository(AdminUser);
// 查找用户
const user = await adminUserRepository.findOne({
where: { id: Number(id) }
});
if (!user) {
return res.status(404).json({
success: false,
message: '用户不存在'
});
}
// 更新角色
user.roleId = Number(roleId);
// 如果提供了新密码,则更新密码
if (password) {
user.passwordHash = await bcrypt.hash(password, 10);
}
// 保存更新
await adminUserRepository.save(user);
// 返回更新成功响应
return res.json({
success: true,
message: '更新用户成功',
data: {
id: user.id,
username: user.username,
roleId: user.roleId
}
});
} catch (error) {
console.error('更新用户失败:', error);
return res.status(500).json({
success: false,
message: '服务器内部错误'
});
}
}
/**
* 删除用户
* 删除指定的管理员用户
* 禁止删除当前登录的管理员账号和默认的超级管理员账号ID=1
* @param req - Express请求对象包含用户ID和当前登录用户信息
* @param res - Express响应对象
*/
async deleteUser(req: any, res: Response) {
try {
// 从请求参数中获取用户ID
const { id } = req.params;
// 验证用户ID
if (!id) {
return res.status(400).json({
success: false,
message: '用户ID不能为空'
});
}
// 禁止删除默认的超级管理员账号ID=1
if (Number(id) === 1) {
return res.status(403).json({
success: false,
message: '禁止删除默认的超级管理员账号'
});
}
// 禁止删除当前登录的管理员账号
if (Number(id) === req.admin.id) {
return res.status(403).json({
success: false,
message: '禁止删除当前登录的账号'
});
}
// 获取管理员用户仓库
const adminUserRepository = AppDataSource.getRepository(AdminUser);
// 查找用户
const user = await adminUserRepository.findOne({
where: { id: Number(id) }
});
if (!user) {
return res.status(404).json({
success: false,
message: '用户不存在'
});
}
// 删除用户
await adminUserRepository.remove(user);
// 返回删除成功响应
return res.json({
success: true,
message: '删除用户成功'
});
} catch (error) {
console.error('删除用户失败:', error);
return res.status(500).json({
success: false,
message: '服务器内部错误'
});
}
}
/**
* 获取角色列表
* 获取所有启用的角色列表,用于下拉选择
* @param req - Express请求对象
* @param res - Express响应对象
*/
async getRoleList(req: Request, res: Response) {
try {
// 获取角色仓库
const roleRepository = AppDataSource.getRepository(AdminRole);
// 查询所有启用的角色
const roles = await roleRepository.find({
where: { status: 1 },
order: { id: 'ASC' }
});
// 组装返回数据
const roleList = roles.map(role => ({
id: role.id,
roleName: role.roleName,
description: role.description
}));
// 返回角色列表
return res.json({
success: true,
data: roleList
});
} catch (error) {
console.error('获取角色列表失败:', error);
return res.status(500).json({
success: false,
message: '服务器内部错误'
});
}
}
}