PermissionService.cs 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274
  1. using System;
  2. using System.Linq;
  3. using System.Threading.Tasks;
  4. using System.Collections.Generic;
  5. using AutoMapper;
  6. using Admin.Core.Repository.Admin;
  7. using Admin.Core.Model.Admin;
  8. using Admin.Core.Common.Output;
  9. using Admin.Core.Service.Admin.Permission.Input;
  10. using Admin.Core.Service.Admin.Permission.Output;
  11. using Admin.Core.Common.Cache;
  12. using Admin.Core.Common.Attributes;
  13. using Admin.Core.Common.Helpers;
  14. using Admin.Core.Common.BaseModel;
  15. namespace Admin.Core.Service.Admin.Permission
  16. {
  17. public class PermissionService : BaseService,IPermissionService
  18. {
  19. private readonly IMapper _mapper;
  20. private readonly ICache _cache;
  21. private readonly IPermissionRepository _permissionRepository;
  22. private readonly IRoleRepository _roleRepository;
  23. private readonly IRolePermissionRepository _rolePermissionRepository;
  24. private readonly IUserRoleRepository _userRoleRepository;
  25. public PermissionService(
  26. IMapper mapper,
  27. ICache cache,
  28. IPermissionRepository permissionRepository,
  29. IRoleRepository roleRepository,
  30. IRolePermissionRepository rolePermissionRepository,
  31. IUserRoleRepository userRoleRepository
  32. )
  33. {
  34. _mapper = mapper;
  35. _cache = cache;
  36. _permissionRepository = permissionRepository;
  37. _roleRepository = roleRepository;
  38. _rolePermissionRepository = rolePermissionRepository;
  39. _userRoleRepository = userRoleRepository;
  40. }
  41. public async Task<IResponseOutput> GetAsync(long id)
  42. {
  43. var result = await _permissionRepository.GetAsync(id);
  44. return ResponseOutput.Ok(result);
  45. }
  46. public async Task<IResponseOutput> GetGroupAsync(long id)
  47. {
  48. var result = await _permissionRepository.GetAsync<PermissionGetGroupOutput>(id);
  49. return ResponseOutput.Ok(result);
  50. }
  51. public async Task<IResponseOutput> GetMenuAsync(long id)
  52. {
  53. var result = await _permissionRepository.GetAsync<PermissionGetMenuOutput>(id);
  54. return ResponseOutput.Ok(result);
  55. }
  56. public async Task<IResponseOutput> GetApiAsync(long id)
  57. {
  58. var result = await _permissionRepository.GetAsync<PermissionGetApiOutput>(id);
  59. return ResponseOutput.Ok(result);
  60. }
  61. public async Task<IResponseOutput> GetDotAsync(long id)
  62. {
  63. var result = await _permissionRepository.GetAsync<PermissionGetDotOutput>(id);
  64. return ResponseOutput.Ok(result);
  65. }
  66. public async Task<IResponseOutput> ListAsync(string key, DateTime? start, DateTime? end)
  67. {
  68. if (end.HasValue)
  69. {
  70. end = end.Value.AddDays(1);
  71. }
  72. var data = await _permissionRepository
  73. .WhereIf(key.NotNull(), a => a.Path.Contains(key) || a.Label.Contains(key))
  74. .WhereIf(start.HasValue && end.HasValue, a => a.CreatedTime.Value.BetweenEnd(start.Value, end.Value))
  75. .OrderBy(a => a.ParentId)
  76. .OrderBy(a => a.Sort)
  77. .ToListAsync(a => new PermissionListOutput { ApiPath = a.Api.Path });
  78. return ResponseOutput.Ok(data);
  79. }
  80. public async Task<IResponseOutput> AddGroupAsync(PermissionAddGroupInput input)
  81. {
  82. var entity = _mapper.Map<PermissionEntity>(input);
  83. var id = (await _permissionRepository.InsertAsync(entity)).Id;
  84. return ResponseOutput.Ok(id > 0);
  85. }
  86. public async Task<IResponseOutput> AddMenuAsync(PermissionAddMenuInput input)
  87. {
  88. var entity = _mapper.Map<PermissionEntity>(input);
  89. var id = (await _permissionRepository.InsertAsync(entity)).Id;
  90. return ResponseOutput.Ok(id > 0);
  91. }
  92. public async Task<IResponseOutput> AddApiAsync(PermissionAddApiInput input)
  93. {
  94. var entity = _mapper.Map<PermissionEntity>(input);
  95. var id = (await _permissionRepository.InsertAsync(entity)).Id;
  96. return ResponseOutput.Ok(id > 0);
  97. }
  98. public async Task<IResponseOutput> AddDotAsync(PermissionAddDotInput input)
  99. {
  100. var entity = _mapper.Map<PermissionEntity>(input);
  101. var id = (await _permissionRepository.InsertAsync(entity)).Id;
  102. return ResponseOutput.Ok(id > 0);
  103. }
  104. public async Task<IResponseOutput> UpdateGroupAsync(PermissionUpdateGroupInput input)
  105. {
  106. var result = false;
  107. if (input != null && input.Id > 0)
  108. {
  109. var entity = await _permissionRepository.GetAsync(input.Id);
  110. entity = _mapper.Map(input, entity);
  111. result = (await _permissionRepository.UpdateAsync(entity)) > 0;
  112. }
  113. return ResponseOutput.Result(result);
  114. }
  115. public async Task<IResponseOutput> UpdateMenuAsync(PermissionUpdateMenuInput input)
  116. {
  117. var result = false;
  118. if (input != null && input.Id > 0)
  119. {
  120. var entity = await _permissionRepository.GetAsync(input.Id);
  121. entity = _mapper.Map(input, entity);
  122. result = (await _permissionRepository.UpdateAsync(entity)) > 0;
  123. }
  124. return ResponseOutput.Result(result);
  125. }
  126. public async Task<IResponseOutput> UpdateApiAsync(PermissionUpdateApiInput input)
  127. {
  128. var result = false;
  129. if (input != null && input.Id > 0)
  130. {
  131. var entity = await _permissionRepository.GetAsync(input.Id);
  132. entity = _mapper.Map(input, entity);
  133. result = (await _permissionRepository.UpdateAsync(entity)) > 0;
  134. }
  135. return ResponseOutput.Result(result);
  136. }
  137. public async Task<IResponseOutput> UpdateDotAsync(PermissionUpdateDotInput input)
  138. {
  139. var result = false;
  140. if (input != null && input.Id > 0)
  141. {
  142. var entity = await _permissionRepository.GetAsync(input.Id);
  143. entity = _mapper.Map(input, entity);
  144. result = (await _permissionRepository.UpdateAsync(entity)) > 0;
  145. }
  146. return ResponseOutput.Result(result);
  147. }
  148. public async Task<IResponseOutput> DeleteAsync(long id)
  149. {
  150. var result = false;
  151. if (id > 0)
  152. {
  153. result = (await _permissionRepository.DeleteAsync(m => m.Id == id)) > 0;
  154. }
  155. return ResponseOutput.Result(result);
  156. }
  157. public async Task<IResponseOutput> SoftDeleteAsync(long id)
  158. {
  159. var result = await _permissionRepository.SoftDeleteAsync(id);
  160. return ResponseOutput.Result(result);
  161. }
  162. [Transaction]
  163. public async Task<IResponseOutput> AssignAsync(PermissionAssignInput input)
  164. {
  165. //分配权限的时候判断角色是否存在
  166. var exists = await _roleRepository.Select.DisableGlobalFilter("Tenant").WhereDynamic(input.RoleId).AnyAsync();
  167. if (!exists)
  168. {
  169. return ResponseOutput.NotOk("该角色不存在或已被删除!");
  170. }
  171. //查询角色权限
  172. var permissionIds = await _rolePermissionRepository.Select.Where(d => d.RoleId == input.RoleId).ToListAsync(m=>m.PermissionId);
  173. //批量删除权限
  174. var deleteIds = permissionIds.Where(d => !input.PermissionIds.Contains(d));
  175. if (deleteIds.Count() > 0)
  176. {
  177. await _rolePermissionRepository.DeleteAsync(m => m.RoleId == input.RoleId && deleteIds.Contains(m.PermissionId));
  178. }
  179. //批量插入权限
  180. var insertRolePermissions = new List<RolePermissionEntity>();
  181. var insertPermissionIds = input.PermissionIds.Where(d => !permissionIds.Contains(d));
  182. if (insertPermissionIds.Count() > 0)
  183. {
  184. foreach (var permissionId in insertPermissionIds)
  185. {
  186. insertRolePermissions.Add(new RolePermissionEntity()
  187. {
  188. RoleId = input.RoleId,
  189. PermissionId = permissionId,
  190. });
  191. }
  192. await _rolePermissionRepository.InsertAsync(insertRolePermissions);
  193. }
  194. //清除权限
  195. await _cache.DelByPatternAsync(CacheKey.UserPermissions);
  196. return ResponseOutput.Ok();
  197. }
  198. public async Task<IResponseOutput> GetPermissionList()
  199. {
  200. var permissions = await _permissionRepository.Select
  201. .WhereIf(User.TenantType == TenantType.Tenant, a =>
  202. _permissionRepository.Orm.Select<RolePermissionEntity>()
  203. .InnerJoin<TenantEntity>((b, c) => b.RoleId == c.RoleId && c.Id == User.TenantId)
  204. .DisableGlobalFilter("Tenant")
  205. .Where(b => b.PermissionId == a.Id)
  206. .Any()
  207. )
  208. .OrderBy(a => a.ParentId)
  209. .OrderBy(a => a.Sort)
  210. .ToListAsync(a => new { a.Id, a.ParentId, a.Label, a.Type });
  211. var apis = permissions
  212. .Where(a => new[] { PermissionType.Api, PermissionType.Dot }.Contains(a.Type))
  213. .Select(a => new { a.Id, a.ParentId, a.Label });
  214. var menus = permissions
  215. .Where(a => (new[] { PermissionType.Group, PermissionType.Menu }).Contains(a.Type))
  216. .Select(a => new
  217. {
  218. a.Id,
  219. a.ParentId,
  220. a.Label,
  221. Apis = apis.Where(b => b.ParentId == a.Id).Select(b => new { b.Id, b.Label })
  222. });
  223. return ResponseOutput.Ok(menus);
  224. }
  225. public async Task<IResponseOutput> GetRolePermissionList(long roleId = 0)
  226. {
  227. var permissionIds = await _rolePermissionRepository
  228. .Select.Where(d => d.RoleId == roleId)
  229. .ToListAsync(a=>a.PermissionId);
  230. return ResponseOutput.Ok(permissionIds);
  231. }
  232. }
  233. }