0
0

PermissionService.cs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324
  1. using Admin.Core.Common.Attributes;
  2. using Admin.Core.Common.BaseModel;
  3. using Admin.Core.Common.Cache;
  4. using Admin.Core.Common.Configs;
  5. using Admin.Core.Common.Output;
  6. using Admin.Core.Model.Admin;
  7. using Admin.Core.Repository;
  8. using Admin.Core.Repository.Admin;
  9. using Admin.Core.Service.Admin.Permission.Input;
  10. using Admin.Core.Service.Admin.Permission.Output;
  11. using System;
  12. using System.Collections.Generic;
  13. using System.Linq;
  14. using System.Threading.Tasks;
  15. namespace Admin.Core.Service.Admin.Permission
  16. {
  17. public class PermissionService : BaseService, IPermissionService
  18. {
  19. private readonly AppConfig _appConfig;
  20. private readonly IPermissionRepository _permissionRepository;
  21. private readonly IRoleRepository _roleRepository;
  22. private readonly IRolePermissionRepository _rolePermissionRepository;
  23. private readonly IRepositoryBase<TenantPermissionEntity> _tenantPermissionRepository;
  24. private readonly IUserRepository _userRepository;
  25. public PermissionService(
  26. AppConfig appConfig,
  27. IPermissionRepository permissionRepository,
  28. IRoleRepository roleRepository,
  29. IRolePermissionRepository rolePermissionRepository,
  30. IRepositoryBase<TenantPermissionEntity> tenantPermissionRepository,
  31. IUserRepository userRepository
  32. )
  33. {
  34. _appConfig = appConfig;
  35. _permissionRepository = permissionRepository;
  36. _roleRepository = roleRepository;
  37. _rolePermissionRepository = rolePermissionRepository;
  38. _tenantPermissionRepository = tenantPermissionRepository;
  39. _userRepository = userRepository;
  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. [Transaction]
  199. public async Task<IResponseOutput> SaveTenantPermissionsAsync(PermissionSaveTenantPermissionsInput input)
  200. {
  201. //查询租户权限
  202. var permissionIds = await _tenantPermissionRepository.Select.Where(d => d.TenantId == input.TenantId).ToListAsync(m => m.PermissionId);
  203. //批量删除租户权限
  204. var deleteIds = permissionIds.Where(d => !input.PermissionIds.Contains(d));
  205. if (deleteIds.Count() > 0)
  206. {
  207. await _tenantPermissionRepository.DeleteAsync(m => m.TenantId == input.TenantId && deleteIds.Contains(m.PermissionId));
  208. }
  209. //批量插入租户权限
  210. var tenatPermissions = new List<TenantPermissionEntity>();
  211. var insertPermissionIds = input.PermissionIds.Where(d => !permissionIds.Contains(d));
  212. if (insertPermissionIds.Count() > 0)
  213. {
  214. foreach (var permissionId in insertPermissionIds)
  215. {
  216. tenatPermissions.Add(new TenantPermissionEntity()
  217. {
  218. TenantId = input.TenantId,
  219. PermissionId = permissionId,
  220. });
  221. }
  222. await _tenantPermissionRepository.InsertAsync(tenatPermissions);
  223. }
  224. //清除租户下所有用户权限
  225. if (_appConfig.Tenant)
  226. {
  227. var userIds = await _userRepository.Select.Where(a => a.TenantId == input.TenantId).ToListAsync(a => a.Id);
  228. foreach(var userId in userIds)
  229. {
  230. await Cache.DelAsync(string.Format(CacheKey.UserPermissions, userId));
  231. }
  232. }
  233. return ResponseOutput.Ok();
  234. }
  235. public async Task<IResponseOutput> GetPermissionList()
  236. {
  237. var permissions = await _permissionRepository.Select
  238. .WhereIf(_appConfig.Tenant && User.TenantType == TenantType.Tenant, a =>
  239. _permissionRepository.Orm.Select<TenantPermissionEntity>()
  240. .Where(b => b.PermissionId == a.Id && b.TenantId == User.TenantId)
  241. .Any()
  242. )
  243. .OrderBy(a => a.ParentId)
  244. .OrderBy(a => a.Sort)
  245. .ToListAsync(a => new { a.Id, a.ParentId, a.Label, a.Type });
  246. var apis = permissions
  247. .Where(a => new[] { PermissionType.Api, PermissionType.Dot }.Contains(a.Type))
  248. .Select(a => new { a.Id, a.ParentId, a.Label });
  249. var menus = permissions
  250. .Where(a => (new[] { PermissionType.Group, PermissionType.Menu }).Contains(a.Type))
  251. .Select(a => new
  252. {
  253. a.Id,
  254. a.ParentId,
  255. a.Label,
  256. Apis = apis.Where(b => b.ParentId == a.Id).Select(b => new { b.Id, b.Label })
  257. });
  258. return ResponseOutput.Ok(menus);
  259. }
  260. public async Task<IResponseOutput> GetRolePermissionList(long roleId = 0)
  261. {
  262. var permissionIds = await _rolePermissionRepository
  263. .Select.Where(d => d.RoleId == roleId)
  264. .ToListAsync(a => a.PermissionId);
  265. return ResponseOutput.Ok(permissionIds);
  266. }
  267. public async Task<IResponseOutput> GetTenantPermissionList(long tenantId)
  268. {
  269. var permissionIds = await _tenantPermissionRepository
  270. .Select.Where(d => d.TenantId == tenantId)
  271. .ToListAsync(a => a.PermissionId);
  272. return ResponseOutput.Ok(permissionIds);
  273. }
  274. }
  275. }