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