using AGSS.Models.DTOs; using AGSS.Models.Entities; using AGSS.Models.Template; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Mvc; namespace AGSS.Controllers.Admin; /// /// 控制器类,用于管理角色相关的操作,包括添加角色、分配角色给用户以及通过角色查询用户。 /// 该控制器仅限具有"Admin"角色的用户访问。 /// [Authorize(Roles = "Admin")] [Route("api/v1/[controller]/[action]")] public class AdminRoleControllers:ControllerBase { /// /// 角色管理器,用于处理角色相关的操作,如创建、查询等。 /// 此角色管理器实例主要用于与RoleModel类型的实体进行交互, /// 支持添加新角色、为用户分配角色等功能。 /// private readonly RoleManager _roleManager; /// /// 用户管理器实例,用于处理用户相关的操作如添加角色、查询用户等。 /// 此实例通过依赖注入的方式在构造函数中初始化,并在整个控制器生命周期内可用。 /// private readonly UserManager _userManager; // Assuming UserModel is the type of user /// /// 管理员角色控制器,用于处理与角色相关的操作,如添加角色、分配角色给用户以及通过角色查询用户。 /// 该控制器下的所有方法都需要管理员权限才能访问。 /// public AdminRoleControllers(RoleManager roleManager, UserManager userManager) { _roleManager = roleManager; _userManager = userManager; } /// /// 添加新角色 /// /// 要添加的角色信息 /// 返回操作结果,包含状态码、消息和数据 [HttpPost] public async Task AddRole([FromBody] RoleModel role) { if (role == null || string.IsNullOrWhiteSpace(role.Name)) { return Ok(new ReturnTemplate(400,"创建失败,请提供名字","")); } var result = await _roleManager.CreateAsync(role); if (result.Succeeded) { return Ok(new ReturnTemplate(200,"创建成功",role)); } else { return Ok(new ReturnTemplate(StatusCodes.Status500InternalServerError,"创建失败","Failed to create role: " + string.Join(", ", result.Errors.Select(e => e.Description)))); } } /// /// 为指定用户分配角色 /// /// 用户的唯一标识符 /// 要分配的角色名称 /// 返回一个包含操作结果的ReturnTemplate对象,其中Code表示状态码,Msg表示消息,Data表示附加数据(如果有的话) [HttpPost] public async Task EndowRole(string userId, string roleName) { var user = await _userManager.FindByIdAsync(userId); if (user == null) { return Ok(new ReturnTemplate(400, "用户不存在", "")); } var role = await _roleManager.FindByNameAsync(roleName); if (role == null) { return Ok(new ReturnTemplate(400, "角色不存在", "")); } var result = await _userManager.AddToRoleAsync(user, role.Name); if (result.Succeeded) { return Ok(new ReturnTemplate(200, "现在该用户已经被赋予这个角色了", user)); } else { return Ok(new ReturnTemplate(StatusCodes.Status500InternalServerError, "角色分配失败", "Failed to endow role: " + string.Join(", ", result.Errors.Select(e => e.Description)))); } } /// /// 删除指定用户。 /// /// 要删除的用户的唯一标识符。 /// 返回操作结果,包含状态码、消息和数据。如果删除成功,则返回200状态码;如果用户ID为空或未找到指定用户,则分别返回400或404状态码;若删除过程中出现错误,则返回500状态码并附带错误信息。 [HttpPost] public async Task DelUser(string userId) { if (string.IsNullOrWhiteSpace(userId)) { return Ok(new ReturnTemplate(400, "你打算拿个空的Id来骗我吗?", null)); } var user = await _userManager.FindByIdAsync(userId); if (user == null) { return Ok(new ReturnTemplate(404, "你输了个假的用户吧......", null)); } // 删除用户 var result = await _userManager.DeleteAsync(user); if (result.Succeeded) { return Ok(new ReturnTemplate(200, "用户删除成功,不要留念这个用户哦~", null)); } else { return StatusCode(500, new ReturnTemplate(500, "发生了一些不可预料的错误,555", result.Errors)); } } [HttpPost] public async Task SetMenu([FromBody]MenuRequest request) { if (string.IsNullOrWhiteSpace(request.Id) || string.IsNullOrWhiteSpace(request.MenuName)) { return Ok(new ReturnTemplate(400, "请求参数无效(有的参数是空的哦~)", "")); } var user=await _userManager.FindByIdAsync(request.Id); if (user==null) { return Ok(new ReturnTemplate(404, "Sorry,你输入的用户我们找不到!", "")); } user.MenuCode = request.MenuCode; user.MenuName = request.MenuName; var result= await _userManager.UpdateAsync(user); if (result.Succeeded) { return Ok(new ReturnTemplate(200, "配置成功啦!", "")); } else { return StatusCode(500, new ReturnTemplate(500, "删除用户时发生错误,原因请看ErrorResult", result.Errors)); } } /// /// 通过角色查询用户,支持分页 /// /// 包含角色名称、页码和每页大小的请求对象 /// 返回包含总用户数和当前页用户的响应对象 [HttpPost] public async Task SearchUserFromRole([FromBody] SearchUserFromRoleRequest request) { if (string.IsNullOrWhiteSpace(request.RoleName)) { return Ok(new ReturnTemplate(400, "角色名称不能为空,就像凌云心里不能没有我一样", null)); } var role = await _roleManager.FindByNameAsync(request.RoleName); if (role == null) { return Ok(new ReturnTemplate(400, "你输入的角色不存在哦!", null)); } var usersInRole = await _userManager.GetUsersInRoleAsync(role.Name); var totalUsers = usersInRole.Count; var pagedUsers = usersInRole .Skip((request.Page - 1) * request.PageSize) .Take(request.PageSize) .ToList(); var response = new SearchUserFromRoleResponse { TotalCount = totalUsers, Users = pagedUsers }; return Ok(new ReturnTemplate(200, "查询成功", response)); } /// /// 用于通过角色名称查询用户列表的请求模型。支持分页功能。 /// public class SearchUserFromRoleRequest { /// /// 表示角色的名称。此属性用于指定或获取与用户管理相关的角色名称。 /// 在进行角色分配、查询等操作时,需要提供正确的角色名称以确保操作的成功执行。 /// public string RoleName { get; set; } /// /// 表示当前请求的页码,默认为1。用于分页查询用户时指定从哪一页开始获取数据。 /// public int Page { get; set; } = 1; /// /// 每页显示的用户数量。默认值为10。 /// 该属性用于分页查询中指定每一页应包含的用户条目数。 /// public int PageSize { get; set; } = 10; } /// /// 表示通过角色查询用户后返回的响应数据。 /// 该类用于封装查询结果,包括总用户数和分页后的用户列表。 /// public class SearchUserFromRoleResponse { /// /// 表示属于特定角色的用户总数。 /// /// 此属性用于分页查询中,返回匹配给定角色名称的所有用户的数量。 public int TotalCount { get; set; } /// /// 表示属于特定角色的用户列表。该属性用于存储和返回在给定角色下的所有用户。 /// /// 此列表通常作为查询结果的一部分,例如通过角色名搜索用户时返回的数据。 public List Users { get; set; } } }