using HoneyBox.Admin.Data;
using HoneyBox.Admin.Entities;
using HoneyBox.Admin.Models.AdminUser;
using HoneyBox.Admin.Models.Common;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging;
namespace HoneyBox.Admin.Services;
///
/// 管理员服务实现
///
public class AdminUserService : IAdminUserService
{
private readonly AdminDbContext _dbContext;
private readonly ILogger _logger;
// 超级管理员角色编码
private const string SuperAdminRoleCode = "super_admin";
public AdminUserService(AdminDbContext dbContext, ILogger logger)
{
_dbContext = dbContext;
_logger = logger;
}
///
public async Task> GetListAsync(AdminUserQueryRequest request)
{
var query = _dbContext.AdminUsers
.Include(u => u.Department)
.Include(u => u.AdminUserRoles)
.ThenInclude(ur => ur.Role)
.AsQueryable();
// 用户名筛选
if (!string.IsNullOrWhiteSpace(request.Username))
{
query = query.Where(u => u.Username.Contains(request.Username));
}
// 真实姓名筛选
if (!string.IsNullOrWhiteSpace(request.RealName))
{
query = query.Where(u => u.RealName != null && u.RealName.Contains(request.RealName));
}
// 手机号筛选
if (!string.IsNullOrWhiteSpace(request.Phone))
{
query = query.Where(u => u.Phone != null && u.Phone.Contains(request.Phone));
}
// 部门筛选
if (request.DepartmentId.HasValue)
{
query = query.Where(u => u.DepartmentId == request.DepartmentId.Value);
}
// 状态筛选
if (request.Status.HasValue)
{
query = query.Where(u => u.Status == request.Status.Value);
}
var total = await query.CountAsync();
var list = await query
.OrderByDescending(u => u.CreatedAt)
.Skip((request.Page - 1) * request.PageSize)
.Take(request.PageSize)
.Select(u => new AdminUserDto
{
Id = u.Id,
Username = u.Username,
RealName = u.RealName,
Avatar = u.Avatar,
Email = u.Email,
Phone = u.Phone,
DepartmentId = u.DepartmentId,
DepartmentName = u.Department != null ? u.Department.Name : null,
Status = u.Status,
LastLoginTime = u.LastLoginTime,
LastLoginIp = u.LastLoginIp,
CreatedAt = u.CreatedAt,
UpdatedAt = u.UpdatedAt,
Remark = u.Remark,
RoleIds = u.AdminUserRoles.Select(ur => ur.RoleId).ToList(),
RoleNames = u.AdminUserRoles.Select(ur => ur.Role.Name).ToList()
})
.ToListAsync();
return new PagedResult
{
List = list,
Total = total,
Page = request.Page,
PageSize = request.PageSize
};
}
///
public async Task GetByIdAsync(long id)
{
var user = await _dbContext.AdminUsers
.Include(u => u.Department)
.Include(u => u.AdminUserRoles)
.ThenInclude(ur => ur.Role)
.Include(u => u.AdminUserMenus)
.FirstOrDefaultAsync(u => u.Id == id);
if (user == null)
{
throw new AdminException(AdminErrorCodes.InvalidParameter, "管理员不存在");
}
return new AdminUserDto
{
Id = user.Id,
Username = user.Username,
RealName = user.RealName,
Avatar = user.Avatar,
Email = user.Email,
Phone = user.Phone,
DepartmentId = user.DepartmentId,
DepartmentName = user.Department?.Name,
Status = user.Status,
LastLoginTime = user.LastLoginTime,
LastLoginIp = user.LastLoginIp,
CreatedAt = user.CreatedAt,
UpdatedAt = user.UpdatedAt,
Remark = user.Remark,
RoleIds = user.AdminUserRoles.Select(ur => ur.RoleId).ToList(),
RoleNames = user.AdminUserRoles.Select(ur => ur.Role.Name).ToList(),
MenuIds = user.AdminUserMenus.Select(um => um.MenuId).ToList()
};
}
///
public async Task CreateAsync(CreateAdminUserRequest request, long? createdBy = null)
{
// 检查用户名是否重复
var usernameExists = await _dbContext.AdminUsers.AnyAsync(u => u.Username == request.Username);
if (usernameExists)
{
throw new AdminException(AdminErrorCodes.DuplicateUsername, "用户名已存在");
}
// 验证部门是否存在
if (request.DepartmentId.HasValue)
{
var departmentExists = await _dbContext.Departments.AnyAsync(d => d.Id == request.DepartmentId.Value);
if (!departmentExists)
{
throw new AdminException(AdminErrorCodes.InvalidParameter, "部门不存在");
}
}
var user = new Entities.AdminUser
{
Username = request.Username,
PasswordHash = AuthService.HashPassword(request.Password),
RealName = request.RealName,
Avatar = request.Avatar,
Email = request.Email,
Phone = request.Phone,
DepartmentId = request.DepartmentId,
Status = request.Status,
Remark = request.Remark,
CreatedBy = createdBy,
CreatedAt = DateTime.Now
};
_dbContext.AdminUsers.Add(user);
await _dbContext.SaveChangesAsync();
// 分配角色
if (request.RoleIds.Any())
{
var userRoles = request.RoleIds.Distinct().Select(roleId => new AdminUserRole
{
AdminUserId = user.Id,
RoleId = roleId
});
_dbContext.AdminUserRoles.AddRange(userRoles);
await _dbContext.SaveChangesAsync();
}
_logger.LogInformation("创建管理员成功: {UserId} - {Username}", user.Id, user.Username);
return user.Id;
}
///
public async Task UpdateAsync(long id, UpdateAdminUserRequest request)
{
var user = await _dbContext.AdminUsers.FindAsync(id);
if (user == null)
{
throw new AdminException(AdminErrorCodes.InvalidParameter, "管理员不存在");
}
// 验证部门是否存在
if (request.DepartmentId.HasValue)
{
var departmentExists = await _dbContext.Departments.AnyAsync(d => d.Id == request.DepartmentId.Value);
if (!departmentExists)
{
throw new AdminException(AdminErrorCodes.InvalidParameter, "部门不存在");
}
}
user.RealName = request.RealName;
user.Avatar = request.Avatar;
user.Email = request.Email;
user.Phone = request.Phone;
user.DepartmentId = request.DepartmentId;
user.Status = request.Status;
user.Remark = request.Remark;
user.UpdatedAt = DateTime.Now;
await _dbContext.SaveChangesAsync();
_logger.LogInformation("更新管理员成功: {UserId} - {Username}", user.Id, user.Username);
}
///
public async Task DeleteAsync(long id)
{
var user = await _dbContext.AdminUsers
.Include(u => u.AdminUserRoles)
.ThenInclude(ur => ur.Role)
.FirstOrDefaultAsync(u => u.Id == id);
if (user == null)
{
throw new AdminException(AdminErrorCodes.InvalidParameter, "管理员不存在");
}
// 检查是否是最后一个超级管理员
var isSuperAdmin = user.AdminUserRoles.Any(ur => ur.Role.Code == SuperAdminRoleCode);
if (isSuperAdmin)
{
var superAdminCount = await _dbContext.AdminUserRoles
.Include(ur => ur.Role)
.Where(ur => ur.Role.Code == SuperAdminRoleCode)
.Select(ur => ur.AdminUserId)
.Distinct()
.CountAsync();
if (superAdminCount <= 1)
{
throw new AdminException(AdminErrorCodes.CannotDeleteLastSuperAdmin, "不能删除最后一个超级管理员");
}
}
// 删除关联数据
var userRoles = await _dbContext.AdminUserRoles.Where(ur => ur.AdminUserId == id).ToListAsync();
_dbContext.AdminUserRoles.RemoveRange(userRoles);
var userMenus = await _dbContext.AdminUserMenus.Where(um => um.AdminUserId == id).ToListAsync();
_dbContext.AdminUserMenus.RemoveRange(userMenus);
_dbContext.AdminUsers.Remove(user);
await _dbContext.SaveChangesAsync();
_logger.LogInformation("删除管理员成功: {UserId} - {Username}", id, user.Username);
}
///
public async Task> GetRoleIdsAsync(long userId)
{
var user = await _dbContext.AdminUsers.FindAsync(userId);
if (user == null)
{
throw new AdminException(AdminErrorCodes.InvalidParameter, "管理员不存在");
}
return await _dbContext.AdminUserRoles
.Where(ur => ur.AdminUserId == userId)
.Select(ur => ur.RoleId)
.ToListAsync();
}
///
public async Task AssignRolesAsync(long userId, List roleIds)
{
var user = await _dbContext.AdminUsers.FindAsync(userId);
if (user == null)
{
throw new AdminException(AdminErrorCodes.InvalidParameter, "管理员不存在");
}
// 删除现有关联
var existingRoles = await _dbContext.AdminUserRoles.Where(ur => ur.AdminUserId == userId).ToListAsync();
_dbContext.AdminUserRoles.RemoveRange(existingRoles);
// 添加新关联
if (roleIds.Any())
{
var newRoles = roleIds.Distinct().Select(roleId => new AdminUserRole
{
AdminUserId = userId,
RoleId = roleId
});
_dbContext.AdminUserRoles.AddRange(newRoles);
}
await _dbContext.SaveChangesAsync();
_logger.LogInformation("管理员 {UserId} 分配角色成功,角色数量: {Count}", userId, roleIds.Count);
}
///
public async Task> GetMenuIdsAsync(long userId)
{
var user = await _dbContext.AdminUsers.FindAsync(userId);
if (user == null)
{
throw new AdminException(AdminErrorCodes.InvalidParameter, "管理员不存在");
}
return await _dbContext.AdminUserMenus
.Where(um => um.AdminUserId == userId)
.Select(um => um.MenuId)
.ToListAsync();
}
///
public async Task AssignMenusAsync(long userId, List menuIds)
{
var user = await _dbContext.AdminUsers.FindAsync(userId);
if (user == null)
{
throw new AdminException(AdminErrorCodes.InvalidParameter, "管理员不存在");
}
// 删除现有关联
var existingMenus = await _dbContext.AdminUserMenus.Where(um => um.AdminUserId == userId).ToListAsync();
_dbContext.AdminUserMenus.RemoveRange(existingMenus);
// 添加新关联
if (menuIds.Any())
{
var newMenus = menuIds.Distinct().Select(menuId => new AdminUserMenu
{
AdminUserId = userId,
MenuId = menuId
});
_dbContext.AdminUserMenus.AddRange(newMenus);
}
await _dbContext.SaveChangesAsync();
_logger.LogInformation("管理员 {UserId} 分配用户专属菜单成功,菜单数量: {Count}", userId, menuIds.Count);
}
///
public async Task AssignDepartmentAsync(long userId, long? departmentId)
{
var user = await _dbContext.AdminUsers.FindAsync(userId);
if (user == null)
{
throw new AdminException(AdminErrorCodes.InvalidParameter, "管理员不存在");
}
// 验证部门是否存在
if (departmentId.HasValue)
{
var departmentExists = await _dbContext.Departments.AnyAsync(d => d.Id == departmentId.Value);
if (!departmentExists)
{
throw new AdminException(AdminErrorCodes.InvalidParameter, "部门不存在");
}
}
user.DepartmentId = departmentId;
user.UpdatedAt = DateTime.Now;
await _dbContext.SaveChangesAsync();
_logger.LogInformation("管理员 {UserId} 分配部门成功,部门ID: {DepartmentId}", userId, departmentId);
}
///
public async Task SetStatusAsync(long userId, bool enabled)
{
var user = await _dbContext.AdminUsers.FindAsync(userId);
if (user == null)
{
throw new AdminException(AdminErrorCodes.InvalidParameter, "管理员不存在");
}
user.Status = enabled ? (byte)1 : (byte)0;
user.UpdatedAt = DateTime.Now;
await _dbContext.SaveChangesAsync();
_logger.LogInformation("管理员 {UserId} 状态设置为: {Status}", userId, enabled ? "启用" : "禁用");
}
///
public async Task ResetPasswordAsync(long userId, string newPassword)
{
var user = await _dbContext.AdminUsers.FindAsync(userId);
if (user == null)
{
throw new AdminException(AdminErrorCodes.InvalidParameter, "管理员不存在");
}
user.PasswordHash = AuthService.HashPassword(newPassword);
user.UpdatedAt = DateTime.Now;
await _dbContext.SaveChangesAsync();
_logger.LogInformation("管理员 {UserId} 密码重置成功", userId);
}
}