0
0

PermissionService.cs 9.9 KB

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