UsersAppService.cs 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332
  1. using System.Collections.Generic;
  2. using System.Collections.ObjectModel;
  3. using System.Linq;
  4. using System.Threading.Tasks;
  5. using System.Web.Mvc;
  6. using Abp.Application.Services.Dto;
  7. using Abp.Auditing;
  8. using Abp.Authorization;
  9. using Abp.Domain.Repositories;
  10. using Abp.Runtime.Caching;
  11. using Abp.Runtime.Session;
  12. using Castle.Core.Internal;
  13. using ShwasherSys.Authorization.Permissions;
  14. using ShwasherSys.Authorization.Roles;
  15. using ShwasherSys.Authorization.Users;
  16. using ShwasherSys.BaseSysInfo.Roles.Dto;
  17. using ShwasherSys.BaseSysInfo.States;
  18. using ShwasherSys.BaseSysInfo.Users.Dto;
  19. using ShwasherSys.Lambda;
  20. using IwbZero;
  21. using IwbZero.AppServiceBase;
  22. using IwbZero.Auditing;
  23. using IwbZero.Authorization.Permissions;
  24. using IwbZero.Authorization.Users;
  25. using IwbZero.IdentityFramework;
  26. using IwbZero.Session;
  27. using IwbZero.Setting;
  28. using Microsoft.AspNet.Identity;
  29. using IwbZero.Caching;
  30. namespace ShwasherSys.BaseSysInfo.Users
  31. {
  32. [AbpAuthorize(PermissionNames.PagesSystemUsers), AuditLog("系统用户", "用户")]
  33. public class UsersAppService : ShwasherAsyncCrudAppService<SysUser, UserDto, long, PagedRequestDto, UserCreateDto, UserUpdateDto>, IUsersAppService
  34. {
  35. private readonly UserManager _userManager;
  36. private readonly RoleManager _roleManager;
  37. private readonly IRepository<SysRole> _roleRepository;
  38. private readonly IStatesAppService _stateAppService;
  39. public UsersAppService(
  40. IRepository<SysUser, long> repository,
  41. UserManager userManager,
  42. IRepository<SysRole> roleRepository,
  43. IStatesAppService stateAppService,
  44. RoleManager roleManager,
  45. IwbSettingManager settingManager,
  46. ICacheManager cacheManager)
  47. : base(repository)
  48. {
  49. _userManager = userManager;
  50. _roleRepository = roleRepository;
  51. _stateAppService = stateAppService;
  52. _roleManager = roleManager;
  53. SettingManager = settingManager;
  54. CacheManager = cacheManager;
  55. }
  56. protected override string GetPermissionName { get; set; } = PermissionNames.PagesSystemUsers;
  57. protected override string GetAllPermissionName { get; set; } = PermissionNames.PagesSystemUsers;
  58. protected override string CreatePermissionName { get; set; } = PermissionNames.PagesSystemUsersCreate;
  59. protected override string UpdatePermissionName { get; set; } = PermissionNames.PagesSystemUsersUpdate;
  60. protected override string DeletePermissionName { get; set; } = PermissionNames.PagesSystemUsersDelete;
  61. [DisableAuditing]
  62. public List<SelectListItem> GetUserTypeSelect()
  63. {
  64. var slist = new List<SelectListItem>();
  65. var list = _stateAppService.GetStateList("SysUser", "UserType");
  66. foreach (var l in list)
  67. {
  68. if (int.TryParse(l.CodeValue, out var userType))
  69. {
  70. if (userType <= AbpSession.UserType && AbpSession?.UserName.ToLower() != "admin")
  71. {
  72. continue;
  73. }
  74. slist.Add(new SelectListItem { Text = l.DisplayValue, Value = l.CodeValue });
  75. }
  76. }
  77. return slist;
  78. }
  79. #region Roles
  80. [DisableAuditing]
  81. public async Task<string[]> GetUserRoles(long userId)
  82. {
  83. var roleList = await _userManager.GetRolesAsync(userId);
  84. string[] roles = roleList.ToArray();
  85. return roles;
  86. }
  87. [DisableAuditing]
  88. public async Task<ListResultDto<RoleDto>> GetRoles()
  89. {
  90. var roles = await _roleRepository.GetAllListAsync(a =>
  91. (AbpSession.UserName == UserBase.AdminUserName || a.RoleType > AbpSession.UserType) );
  92. return new ListResultDto<RoleDto>(ObjectMapper.Map<List<RoleDto>>(roles));
  93. }
  94. [DisableAuditing]
  95. public List<SelectListItem> GetRoleSelects()
  96. {
  97. var slist = new List<SelectListItem>();
  98. var list = _roleRepository.GetAllList(a =>
  99. (AbpSession.UserName == UserBase.AdminUserName || a.RoleType > AbpSession.UserType));
  100. foreach (var l in list)
  101. {
  102. slist.Add(new SelectListItem { Text = l.RoleDisplayName, Value = l.Name });
  103. }
  104. return slist;
  105. }
  106. #endregion
  107. [AbpAuthorize(PermissionNames.PagesSystemUsersResetPassword), AuditLog("重置密码")]
  108. public async Task ResetPassword(EntityDto<long> input)
  109. {
  110. var user = await _userManager.GetUserByIdAsync(input.Id);
  111. if (user == null)
  112. {
  113. CheckErrors(IwbIdentityResult.Failed("用户不存在,请检查后再操作!"));
  114. return;
  115. }
  116. var password = await SettingManager.GetSettingValueAsync(SettingNames.UserDefaultPassword);
  117. user.Password = new PasswordHasher().HashPassword(password);
  118. await Repository.UpdateAsync(user);
  119. }
  120. #region Auth
  121. [AbpAuthorize(PermissionNames.PagesSystemUsersAuth), AuditLog("用户权限配置")]
  122. public async Task Auth(AuthDto input)
  123. {
  124. var user = await _userManager.GetUserByIdAsync(input.Id);
  125. var grantedPermissions = new List<Permission>();
  126. if (input.PermissionNames != null && input.PermissionNames.Any())
  127. {
  128. grantedPermissions = PermissionManager
  129. .GetAllPermissions()
  130. .Where(p => input.PermissionNames.Contains(p.Name))
  131. .ToList();
  132. }
  133. await _userManager.SetUserGrantedPermissionsAsync(user, grantedPermissions);
  134. CacheManager.GetCache(IwbUserPermissionCacheItem.CacheStoreName).Remove(input.Id + "@" + (AbpSession.GetTenantId()));
  135. }
  136. [DisableAuditing]
  137. public Task<ListResultDto<PermissionDto>> GetAllPermissions()
  138. {
  139. var permissions = PermissionManager.GetAllPermissions();
  140. return Task.FromResult(new ListResultDto<PermissionDto>(
  141. ObjectMapper.Map<List<PermissionDto>>(permissions)
  142. ));
  143. }
  144. [DisableAuditing]
  145. public async Task<UserDto> GetUserByIdAsync(long userId)
  146. {
  147. var user = await _userManager.GetUserByIdAsync(userId);
  148. return MapToEntityDto(user);
  149. }
  150. [DisableAuditing]
  151. public async Task<bool> IsGrantedOnlyUserAsync(long userId, string permissionNmae)
  152. {
  153. return await _userManager.IsGrantedOnlyUserAsync(userId, permissionNmae);
  154. }
  155. #endregion
  156. #region CURD
  157. [DisableAuditing]
  158. public async Task<PagedResultDto<UserDtoModel>> GetAllUser(PagedRequestDto input)
  159. {
  160. CheckGetAllPermission();
  161. var query = CreateFilteredQuery(input);
  162. if (AbpSession?.UserName?.ToLower() != "admin")
  163. query = query.Where(a => a.UserName.ToLower() != "admin" &&
  164. (a.UserType > AbpSession.UserType || a.UserName == AbpSession.UserName));
  165. if (input.SearchList != null && input.SearchList.Count > 0)
  166. {
  167. List<LambdaObject> objList = new List<LambdaObject>();
  168. foreach (var o in input.SearchList)
  169. {
  170. if (o.KeyWords.IsNullOrEmpty())
  171. continue;
  172. object keyWords = o.KeyWords;
  173. objList.Add(new LambdaObject
  174. {
  175. FieldType = (LambdaFieldType)o.FieldType,
  176. FieldName = o.KeyField,
  177. FieldValue = keyWords,
  178. ExpType = (LambdaExpType)o.ExpType
  179. });
  180. }
  181. var exp = objList.GetExp<SysUser>();
  182. query = query.Where(exp);
  183. }
  184. var totalCount = await AsyncQueryableExecuter.CountAsync(query);
  185. query = ApplySorting(query, input);
  186. query = ApplyPaging(query, input);
  187. var entities = await AsyncQueryableExecuter.ToListAsync(query);
  188. var dtos = new PagedResultDto<UserDtoModel>(
  189. totalCount,
  190. entities.Select(a => new UserDtoModel()
  191. {
  192. Id = a.Id,
  193. UserName = a.UserName,
  194. UserType = a.UserType,
  195. UserTypeName = _stateAppService.GetDisplayValue("SysUser", "UserType", a.UserType + ""),
  196. RealName = a.RealName,
  197. EmailAddress = a.EmailAddress,
  198. IsActive = a.IsActive,
  199. IsActiveName = _stateAppService.GetDisplayValue("SysUser", "IsActive", a.IsActive.ToString().ToLower()),
  200. LastLoginTime = a.LastLoginTime,
  201. LastModificationTime = a.LastModificationTime,
  202. CreationTime = a.CreationTime,
  203. LastModifierUserName = a.LastModifierUser?.UserName ?? "",
  204. DepartmentID = a.DepartmentID,
  205. DutyID = a.DutyID,
  206. FactoryID = a.FactoryID
  207. }).ToList()
  208. );
  209. return dtos;
  210. }
  211. public override async Task<UserDto> Get(EntityDto<long> input)
  212. {
  213. var user = await base.Get(input);
  214. var userRoles = await _userManager.GetRolesAsync(user.Id);
  215. user.RoleNames = userRoles.Select(ur => ur).ToArray();
  216. return user;
  217. }
  218. [AbpAuthorize(PermissionNames.PagesSystemUsersCreate)]
  219. public override async Task<UserDto> Create(UserCreateDto input)
  220. {
  221. var user = ObjectMapper.Map<SysUser>(input);
  222. var password = await SettingManager.GetSettingValueAsync(SettingNames.UserDefaultPassword);
  223. user.Password = new PasswordHasher().HashPassword(password);
  224. user.IsEmailConfirmed = false;
  225. //Assign roles
  226. user.Roles = new Collection<SysUserRole>();
  227. if (!input.RoleNames.IsNullOrEmpty())
  228. {
  229. foreach (var roleName in input.RoleNames.Split(','))
  230. {
  231. var role = await _roleManager.GetRoleByNameAsync(roleName);
  232. user.Roles.Add(new SysUserRole(user.Id, role.Id));
  233. }
  234. }
  235. //var result = await _userManager.CheckDuplicateUsernameOrEmailAddressAsync(user.Id, user.UserName, user.EmailAddress);
  236. //if (!result.Succeeded)
  237. //{
  238. // CheckErrors(result);
  239. //}
  240. CheckErrors(await _userManager.CreateAsync(user));
  241. await CurrentUnitOfWork.SaveChangesAsync();
  242. return MapToEntityDto(user);
  243. }
  244. [AbpAuthorize(PermissionNames.PagesSystemUsersUpdate)]
  245. public override async Task<UserDto> Update(UserUpdateDto input)
  246. {
  247. if (AbpSession?.UserName.ToLower() != "admin")
  248. {
  249. var oldUser = await _userManager.GetOldUserAsync(input.Id);
  250. if (oldUser.UserType <= AbpSession?.UserType)
  251. CheckErrors(IwbIdentityResult.Failed("没有修改此用户的权限。"));
  252. if (input.UserType <= AbpSession?.UserType)
  253. CheckErrors(IwbIdentityResult.Failed("没有此用户类型的权限,请检查用户类型后再操作!"));
  254. }
  255. var user = await _userManager.GetUserByIdAsync(input.Id);
  256. MapToEntity(input, user);
  257. CheckErrors(await _userManager.UpdateAsync(user));
  258. CheckErrors(await _userManager.SetRoles(user, input.RoleNames?.Split(',')));
  259. CacheManager.GetCache(IwbZeroConsts.SystemUserCache)
  260. .Set(input.Id + "", Repository.FirstOrDefault(input.Id));
  261. return new UserDto();
  262. }
  263. [AbpAuthorize(PermissionNames.PagesSystemUsersDelete)]
  264. public override async Task Delete(EntityDto<long> input)
  265. {
  266. var user = await _userManager.GetUserByIdAsync(input.Id);
  267. if (user.UserName.ToLower() == "admin" || user.UserName.ToLower() == "system" || user.UserType <= AbpSession?.UserType)
  268. {
  269. CheckErrors(IwbIdentityResult.Failed("当前用户不能被删除。"));
  270. }
  271. await _userManager.DeleteAsync(user);
  272. await CacheManager.GetCache(IwbZeroConsts.SystemUserCache).RemoveAsync(input.Id + "");
  273. }
  274. #endregion
  275. protected override IQueryable<SysUser> CreateFilteredQuery(PagedRequestDto input)
  276. {
  277. return Repository.GetAllIncluding(x => x.Roles);
  278. }
  279. protected override async Task<SysUser> GetEntityByIdAsync(long id)
  280. {
  281. var user = Repository.GetAllIncluding(x => x.Roles).FirstOrDefault(x => x.Id == id);
  282. return await Task.FromResult(user);
  283. }
  284. protected override IQueryable<SysUser> ApplySorting(IQueryable<SysUser> query, PagedRequestDto input)
  285. {
  286. return query.OrderBy(r => r.UserName);
  287. }
  288. }
  289. }