1
0

PermissionService.cs 9.9 KB

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