289 lines
9.2 KiB
C#
289 lines
9.2 KiB
C#
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;
|
|
|
|
/// <summary>
|
|
/// 用户控制器
|
|
/// </summary>
|
|
[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;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 获取当前用户信息
|
|
/// </summary>
|
|
[HttpGet("info")]
|
|
public async Task<ActionResult<ApiResponse<UserInfoDto>>> GetUserInfo()
|
|
{
|
|
var userIdClaim = User.FindFirst("userId")?.Value;
|
|
if (string.IsNullOrEmpty(userIdClaim) || !int.TryParse(userIdClaim, out var userId))
|
|
{
|
|
return Ok(ApiResponse<UserInfoDto>.Fail(401, "无效的用户"));
|
|
}
|
|
|
|
var user = await _authService.GetUserByIdAsync(userId);
|
|
if (user == null)
|
|
{
|
|
return Ok(ApiResponse<UserInfoDto>.Fail(404, "用户不存在"));
|
|
}
|
|
|
|
var roles = await _authService.GetUserRolesAsync(userId);
|
|
|
|
return Ok(ApiResponse<UserInfoDto>.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
|
|
}));
|
|
}
|
|
|
|
/// <summary>
|
|
/// 获取用户列表(分页)
|
|
/// </summary>
|
|
[HttpGet("list")]
|
|
public async Task<ActionResult<ApiResponse<PaginatedResponse<UserListItemDto>>>> 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<UserListItemDto>();
|
|
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<PaginatedResponse<UserListItemDto>>.Success(new PaginatedResponse<UserListItemDto>
|
|
{
|
|
Records = userDtos,
|
|
Current = current,
|
|
Size = size,
|
|
Total = total
|
|
}));
|
|
}
|
|
|
|
/// <summary>
|
|
/// 创建用户
|
|
/// </summary>
|
|
[HttpPost]
|
|
public async Task<ActionResult<ApiResponse<UserListItemDto>>> CreateUser([FromBody] CreateUserRequest request)
|
|
{
|
|
// 检查用户名是否已存在
|
|
var existingUser = await _context.Users.FirstOrDefaultAsync(u => u.UserName == request.UserName && !u.IsDeleted);
|
|
if (existingUser != null)
|
|
{
|
|
return Ok(ApiResponse<UserListItemDto>.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<UserListItemDto>.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
|
|
}, "创建成功"));
|
|
}
|
|
|
|
/// <summary>
|
|
/// 更新用户
|
|
/// </summary>
|
|
[HttpPut("{id}")]
|
|
public async Task<ActionResult<ApiResponse<UserListItemDto>>> UpdateUser(int id, [FromBody] UpdateUserRequest request)
|
|
{
|
|
var user = await _context.Users.FirstOrDefaultAsync(u => u.Id == id && !u.IsDeleted);
|
|
if (user == null)
|
|
{
|
|
return Ok(ApiResponse<UserListItemDto>.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<UserListItemDto>.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
|
|
}, "更新成功"));
|
|
}
|
|
|
|
/// <summary>
|
|
/// 删除用户(软删除)
|
|
/// </summary>
|
|
[HttpDelete("{id}")]
|
|
public async Task<ActionResult<ApiResponse<object>>> DeleteUser(int id)
|
|
{
|
|
var user = await _context.Users.FirstOrDefaultAsync(u => u.Id == id && !u.IsDeleted);
|
|
if (user == null)
|
|
{
|
|
return Ok(ApiResponse<object>.Fail(404, "用户不存在"));
|
|
}
|
|
|
|
user.IsDeleted = true;
|
|
user.UpdatedAt = DateTime.UtcNow;
|
|
user.UpdatedBy = User.FindFirst("userName")?.Value;
|
|
await _context.SaveChangesAsync();
|
|
|
|
return Ok(ApiResponse<object>.Success(null, "删除成功"));
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 用户列表项 DTO
|
|
/// </summary>
|
|
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<string> Roles { get; set; } = new();
|
|
public DateTime CreatedAt { get; set; }
|
|
public string? CreatedBy { get; set; }
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
/// 创建用户请求
|
|
/// </summary>
|
|
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<string>? Roles { get; set; }
|
|
}
|
|
|
|
/// <summary>
|
|
/// 更新用户请求
|
|
/// </summary>
|
|
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<string>? Roles { get; set; }
|
|
}
|