using AutoMapper; using Tiobon.Core.AuthHelper.OverWrite; using Tiobon.Core.Common.Helper; using Tiobon.Core.Common.HttpContextUser; using Tiobon.Core.IServices; using Tiobon.Core.Model; using Tiobon.Core.Model.Models; using Tiobon.Core.Model.ViewModels; using Tiobon.Core.Repository.UnitOfWorks; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; namespace Tiobon.Core.Controllers { /// /// 用户管理 /// [Route("api/[controller]/[action]")] [ApiController] [Authorize(Permissions.Name)] public class UserController : BaseApiController { private readonly IUnitOfWorkManage _unitOfWorkManage; readonly ISysUserInfoServices _sysUserInfoServices; readonly IUserRoleServices _userRoleServices; readonly IRoleServices _roleServices; private readonly IDepartmentServices _departmentServices; private readonly IUser _user; private readonly IMapper _mapper; private readonly ILogger _logger; /// /// 构造函数 /// /// /// /// /// /// /// /// /// public UserController(IUnitOfWorkManage unitOfWorkManage, ISysUserInfoServices sysUserInfoServices, IUserRoleServices userRoleServices, IRoleServices roleServices, IDepartmentServices departmentServices, IUser user, IMapper mapper, ILogger logger) { _unitOfWorkManage = unitOfWorkManage; _sysUserInfoServices = sysUserInfoServices; _userRoleServices = userRoleServices; _roleServices = roleServices; _departmentServices = departmentServices; _user = user; _mapper = mapper; _logger = logger; } /// /// 获取全部用户 /// /// /// /// // GET: api/User [HttpGet] public async Task>> Get(int page = 1, string key = "") { if (string.IsNullOrEmpty(key) || string.IsNullOrWhiteSpace(key)) { key = ""; } int intPageSize = 50; var data = await _sysUserInfoServices.QueryPage(a => a.IsDeleted != true && a.Status >= 0 && ((a.LoginName != null && a.LoginName.Contains(key)) || (a.RealName != null && a.RealName.Contains(key))), page, intPageSize, " Id desc "); #region MyRegion // 这里可以封装到多表查询,此处简单处理 var allUserRoles = await _userRoleServices.Query(d => d.IsDeleted == false); var allRoles = await _roleServices.Query(d => d.IsDeleted == false); var allDepartments = await _departmentServices.Query(d => d.IsDeleted == false); var sysUserInfos = data.data; foreach (var item in sysUserInfos) { var currentUserRoles = allUserRoles.Where(d => d.UserId == item.Id).Select(d => d.RoleId).ToList(); item.RIDs = currentUserRoles; item.RoleNames = allRoles.Where(d => currentUserRoles.Contains(d.Id)).Select(d => d.Name).ToList(); var departmentNameAndIds = GetFullDepartmentName(allDepartments, item.DepartmentId); item.DepartmentName = departmentNameAndIds.Item1; item.Dids = departmentNameAndIds.Item2; } data.data = sysUserInfos; #endregion return Success(data.ConvertTo(_mapper)); } private (string, List) GetFullDepartmentName(List departments, long departmentId) { var departmentModel = departments.FirstOrDefault(d => d.Id == departmentId); if (departmentModel == null) { return ("", new List()); } var pids = departmentModel.CodeRelationship?.TrimEnd(',').Split(',').Select(d => d.ObjToLong()).ToList(); pids.Add(departmentModel.Id); var pnams = departments.Where(d => pids.Contains(d.Id)).ToList().Select(d => d.Name).ToArray(); var fullName = string.Join("/", pnams); return (fullName, pids); } // GET: api/User/5 [HttpGet("{id}")] [AllowAnonymous] public string Get(string id) { _logger.LogError("test wrong"); return "value"; } // GET: api/User/5 /// /// 获取用户详情根据token /// 【无权限】 /// /// 令牌 /// [HttpGet] [AllowAnonymous] public async Task> GetInfoByToken(string token) { var data = new MessageModel(); if (!string.IsNullOrEmpty(token)) { var tokenModel = JwtHelper.SerializeJwt(token); if (tokenModel != null && tokenModel.Uid > 0) { var userinfo = await _sysUserInfoServices.QueryById(tokenModel.Uid); if (userinfo != null) { data.response = _mapper.Map(userinfo); data.success = true; data.msg = "获取成功"; } } } return data; } /// /// 添加一个用户 /// /// /// // POST: api/User [HttpPost] public async Task> Post([FromBody] SysUserInfoDto sysUserInfo) { var data = new MessageModel(); sysUserInfo.uLoginPWD = MD5Helper.MD5Encrypt32(sysUserInfo.uLoginPWD); sysUserInfo.uRemark = _user.Name; var id = await _sysUserInfoServices.Add(_mapper.Map(sysUserInfo)); data.success = id > 0; if (data.success) { data.response = id.ObjToString(); data.msg = "添加成功"; } return data; } /// /// 更新用户与角色 /// /// /// // PUT: api/User/5 [HttpPut] public async Task> Put([FromBody] SysUserInfoDto sysUserInfo) { // 这里使用事务处理 var data = new MessageModel(); var oldUser = await _sysUserInfoServices.QueryById(sysUserInfo.uID); if (oldUser is not { Id: > 0 }) { return Failed("用户不存在或已被删除"); } try { if (sysUserInfo.uLoginPWD != oldUser.LoginPWD) { oldUser.CriticalModifyTime = DateTime.Now; } _mapper.Map(sysUserInfo, oldUser); _unitOfWorkManage.BeginTran(); // 无论 Update Or Add , 先删除当前用户的全部 U_R 关系 var usreroles = (await _userRoleServices.Query(d => d.UserId == oldUser.Id)); if (usreroles.Any()) { var ids = usreroles.Select(d => d.Id.ToString()).ToArray(); var isAllDeleted = await _userRoleServices.DeleteByIds(ids); if (!isAllDeleted) { return Failed("服务器更新异常"); } } // 然后再执行添加操作 if (sysUserInfo.RIDs.Count > 0) { var userRolsAdd = new List(); sysUserInfo.RIDs.ForEach(rid => { userRolsAdd.Add(new UserRole(oldUser.Id, rid)); }); var oldRole = usreroles.Select(s => s.RoleId).OrderBy(i => i).ToArray(); var newRole = userRolsAdd.Select(s => s.RoleId).OrderBy(i => i).ToArray(); if (!oldRole.SequenceEqual(newRole)) { oldUser.CriticalModifyTime = DateTime.Now; } await _userRoleServices.Add(userRolsAdd); } data.success = await _sysUserInfoServices.Update(oldUser); _unitOfWorkManage.CommitTran(); if (data.success) { data.msg = "更新成功"; data.response = oldUser.Id.ObjToString(); } } catch (Exception e) { _unitOfWorkManage.RollbackTran(); _logger.LogError(e, e.Message); } return data; } /// /// 删除用户 /// /// /// // DELETE: api/ApiWithActions/5 [HttpDelete] public async Task> Delete(long id) { var data = new MessageModel(); if (id > 0) { var userDetail = await _sysUserInfoServices.QueryById(id); userDetail.IsDeleted = true; data.success = await _sysUserInfoServices.Update(userDetail); if (data.success) { data.msg = "删除成功"; data.response = userDetail?.Id.ObjToString(); } } return data; } } }