using AmtScanner.Api.Data; using AmtScanner.Api.Models; using AmtScanner.Api.Services; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; namespace AmtScanner.Api.Controllers; /// /// 用户控制器 /// [ApiController] [Route("api/[controller]")] [Authorize] public class UserController : ControllerBase { private readonly IAuthService _authService; private readonly AppDbContext _context; public UserController(IAuthService authService, AppDbContext context) { _authService = authService; _context = context; } /// /// 获取当前用户信息 /// [HttpGet("info")] public async Task>> GetUserInfo() { var userIdClaim = User.FindFirst("userId")?.Value; if (string.IsNullOrEmpty(userIdClaim) || !int.TryParse(userIdClaim, out var userId)) { return Ok(ApiResponse.Fail(401, "无效的用户")); } var user = await _authService.GetUserByIdAsync(userId); if (user == null) { return Ok(ApiResponse.Fail(404, "用户不存在")); } var roles = await _authService.GetUserRolesAsync(userId); return Ok(ApiResponse.Success(new UserInfoDto { UserId = user.Id, UserName = user.UserName, NickName = user.NickName ?? user.UserName, Avatar = user.Avatar, Email = user.Email, Phone = user.Phone, Gender = user.Gender, Roles = roles })); } /// /// 获取用户列表(分页) /// [HttpGet("list")] public async Task>>> GetUserList( [FromQuery] int current = 1, [FromQuery] int size = 10, [FromQuery] string? userName = null, [FromQuery] string? status = null) { var (users, total) = await _authService.GetUsersAsync(current, size, userName, status); var userDtos = new List(); foreach (var user in users) { var roles = await _authService.GetUserRolesAsync(user.Id); userDtos.Add(new UserListItemDto { Id = user.Id, UserName = user.UserName, NickName = user.NickName ?? user.UserName, Avatar = user.Avatar, Email = user.Email, Phone = user.Phone, Gender = user.Gender, Status = user.Status, Roles = roles, CreatedAt = user.CreatedAt, CreatedBy = user.CreatedBy }); } return Ok(ApiResponse>.Success(new PaginatedResponse { Records = userDtos, Current = current, Size = size, Total = total })); } /// /// 创建用户 /// [HttpPost] public async Task>> CreateUser([FromBody] CreateUserRequest request) { // 检查用户名是否已存在 var existingUser = await _context.Users.FirstOrDefaultAsync(u => u.UserName == request.UserName && !u.IsDeleted); if (existingUser != null) { return Ok(ApiResponse.Fail(400, "用户名已存在")); } var user = new User { UserName = request.UserName, PasswordHash = BCrypt.Net.BCrypt.HashPassword(request.Password ?? "123456"), NickName = request.NickName ?? request.UserName, Email = request.Email, Phone = request.Phone, Gender = request.Gender ?? "0", Status = "1", CreatedAt = DateTime.UtcNow, CreatedBy = User.FindFirst("userName")?.Value }; _context.Users.Add(user); await _context.SaveChangesAsync(); // 分配角色 if (request.Roles != null && request.Roles.Any()) { var roleIds = await _context.Roles .Where(r => request.Roles.Contains(r.RoleCode)) .Select(r => r.Id) .ToListAsync(); foreach (var roleId in roleIds) { _context.UserRoles.Add(new UserRole { UserId = user.Id, RoleId = roleId }); } await _context.SaveChangesAsync(); } var roles = await _authService.GetUserRolesAsync(user.Id); return Ok(ApiResponse.Success(new UserListItemDto { Id = user.Id, UserName = user.UserName, NickName = user.NickName ?? user.UserName, Avatar = user.Avatar, Email = user.Email, Phone = user.Phone, Gender = user.Gender, Status = user.Status, Roles = roles, CreatedAt = user.CreatedAt, CreatedBy = user.CreatedBy }, "创建成功")); } /// /// 更新用户 /// [HttpPut("{id}")] public async Task>> UpdateUser(int id, [FromBody] UpdateUserRequest request) { var user = await _context.Users.FirstOrDefaultAsync(u => u.Id == id && !u.IsDeleted); if (user == null) { return Ok(ApiResponse.Fail(404, "用户不存在")); } // 更新用户信息 if (!string.IsNullOrEmpty(request.NickName)) user.NickName = request.NickName; if (!string.IsNullOrEmpty(request.Email)) user.Email = request.Email; if (!string.IsNullOrEmpty(request.Phone)) user.Phone = request.Phone; if (!string.IsNullOrEmpty(request.Gender)) user.Gender = request.Gender; if (!string.IsNullOrEmpty(request.Status)) user.Status = request.Status; user.UpdatedAt = DateTime.UtcNow; user.UpdatedBy = User.FindFirst("userName")?.Value; // 更新角色 if (request.Roles != null) { // 删除旧角色 var oldRoles = await _context.UserRoles.Where(ur => ur.UserId == id).ToListAsync(); _context.UserRoles.RemoveRange(oldRoles); // 添加新角色 var roleIds = await _context.Roles .Where(r => request.Roles.Contains(r.RoleCode)) .Select(r => r.Id) .ToListAsync(); foreach (var roleId in roleIds) { _context.UserRoles.Add(new UserRole { UserId = user.Id, RoleId = roleId }); } } await _context.SaveChangesAsync(); var roles = await _authService.GetUserRolesAsync(user.Id); return Ok(ApiResponse.Success(new UserListItemDto { Id = user.Id, UserName = user.UserName, NickName = user.NickName ?? user.UserName, Avatar = user.Avatar, Email = user.Email, Phone = user.Phone, Gender = user.Gender, Status = user.Status, Roles = roles, CreatedAt = user.CreatedAt, CreatedBy = user.CreatedBy }, "更新成功")); } /// /// 删除用户(软删除) /// [HttpDelete("{id}")] public async Task>> DeleteUser(int id) { var user = await _context.Users.FirstOrDefaultAsync(u => u.Id == id && !u.IsDeleted); if (user == null) { return Ok(ApiResponse.Fail(404, "用户不存在")); } user.IsDeleted = true; user.UpdatedAt = DateTime.UtcNow; user.UpdatedBy = User.FindFirst("userName")?.Value; await _context.SaveChangesAsync(); return Ok(ApiResponse.Success(null, "删除成功")); } } /// /// 用户列表项 DTO /// public class UserListItemDto { public int Id { get; set; } public string UserName { get; set; } = string.Empty; public string NickName { get; set; } = string.Empty; public string? Avatar { get; set; } public string? Email { get; set; } public string? Phone { get; set; } public string Gender { get; set; } = "0"; public string Status { get; set; } = "1"; public List Roles { get; set; } = new(); public DateTime CreatedAt { get; set; } public string? CreatedBy { get; set; } } /// /// 创建用户请求 /// public class CreateUserRequest { public string UserName { get; set; } = string.Empty; public string? Password { get; set; } public string? NickName { get; set; } public string? Email { get; set; } public string? Phone { get; set; } public string? Gender { get; set; } public List? Roles { get; set; } } /// /// 更新用户请求 /// public class UpdateUserRequest { public string? NickName { get; set; } public string? Email { get; set; } public string? Phone { get; set; } public string? Gender { get; set; } public string? Status { get; set; } public List? Roles { get; set; } }