0
0

PermissionService.cs 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383
  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 Microsoft.Extensions.DependencyInjection;
  12. using System;
  13. using System.Collections.Generic;
  14. using System.Linq;
  15. using System.Threading.Tasks;
  16. namespace Admin.Core.Service.Admin.Permission
  17. {
  18. public class PermissionService : BaseService, IPermissionService
  19. {
  20. private readonly AppConfig _appConfig;
  21. private readonly IPermissionRepository _permissionRepository;
  22. private readonly IRoleRepository _roleRepository;
  23. private readonly IRepositoryBase<RolePermissionEntity> _rolePermissionRepository;
  24. private readonly IRepositoryBase<TenantPermissionEntity> _tenantPermissionRepository;
  25. private readonly IRepositoryBase<UserRoleEntity> _userRoleRepository;
  26. private readonly IRepositoryBase<PermissionApiEntity> _permissionApiRepository;
  27. public PermissionService(
  28. AppConfig appConfig,
  29. IPermissionRepository permissionRepository,
  30. IRoleRepository roleRepository,
  31. IRepositoryBase<RolePermissionEntity> rolePermissionRepository,
  32. IRepositoryBase<TenantPermissionEntity> tenantPermissionRepository,
  33. IRepositoryBase<UserRoleEntity> userRoleRepository,
  34. IRepositoryBase<PermissionApiEntity> permissionApiRepository
  35. )
  36. {
  37. _appConfig = appConfig;
  38. _permissionRepository = permissionRepository;
  39. _roleRepository = roleRepository;
  40. _rolePermissionRepository = rolePermissionRepository;
  41. _tenantPermissionRepository = tenantPermissionRepository;
  42. _userRoleRepository = userRoleRepository;
  43. _permissionApiRepository = permissionApiRepository;
  44. }
  45. public async Task<IResponseOutput> GetAsync(long id)
  46. {
  47. var result = await _permissionRepository.GetAsync(id);
  48. return ResponseOutput.Ok(result);
  49. }
  50. public async Task<IResponseOutput> GetGroupAsync(long id)
  51. {
  52. var result = await _permissionRepository.GetAsync<PermissionGetGroupOutput>(id);
  53. return ResponseOutput.Ok(result);
  54. }
  55. public async Task<IResponseOutput> GetMenuAsync(long id)
  56. {
  57. var result = await _permissionRepository.GetAsync<PermissionGetMenuOutput>(id);
  58. return ResponseOutput.Ok(result);
  59. }
  60. public async Task<IResponseOutput> GetApiAsync(long id)
  61. {
  62. var result = await _permissionRepository.GetAsync<PermissionGetApiOutput>(id);
  63. return ResponseOutput.Ok(result);
  64. }
  65. public async Task<IResponseOutput> GetDotAsync(long id)
  66. {
  67. var entity = await _permissionRepository.Select
  68. .WhereDynamic(id)
  69. .IncludeMany(a => a.Apis.Select(b => new ApiEntity { Id = b.Id }))
  70. .ToOneAsync();
  71. var output = Mapper.Map<PermissionGetDotOutput>(entity);
  72. return ResponseOutput.Ok(output);
  73. }
  74. public async Task<IResponseOutput> ListAsync(string key, DateTime? start, DateTime? end)
  75. {
  76. if (end.HasValue)
  77. {
  78. end = end.Value.AddDays(1);
  79. }
  80. var data = await _permissionRepository
  81. .WhereIf(key.NotNull(), a => a.Path.Contains(key) || a.Label.Contains(key))
  82. .WhereIf(start.HasValue && end.HasValue, a => a.CreatedTime.Value.BetweenEnd(start.Value, end.Value))
  83. .OrderBy(a => a.ParentId)
  84. .OrderBy(a => a.Sort)
  85. .ToListAsync(a=> new PermissionListOutput { ApiPaths = string.Join(";", _permissionApiRepository.Where(b=>b.PermissionId == a.Id).ToList(b => b.Api.Path)) });
  86. return ResponseOutput.Ok(data);
  87. }
  88. public async Task<IResponseOutput> AddGroupAsync(PermissionAddGroupInput 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> AddMenuAsync(PermissionAddMenuInput 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> AddApiAsync(PermissionAddApiInput input)
  101. {
  102. var entity = Mapper.Map<PermissionEntity>(input);
  103. var id = (await _permissionRepository.InsertAsync(entity)).Id;
  104. return ResponseOutput.Ok(id > 0);
  105. }
  106. [Transaction]
  107. public async Task<IResponseOutput> AddDotAsync(PermissionAddDotInput input)
  108. {
  109. var entity = Mapper.Map<PermissionEntity>(input);
  110. var id = (await _permissionRepository.InsertAsync(entity)).Id;
  111. if (input.ApiIds != null && input.ApiIds.Any())
  112. {
  113. var permissionApis = input.ApiIds.Select(a => new PermissionApiEntity { PermissionId = id, ApiId = a });
  114. await _permissionApiRepository.InsertAsync(permissionApis);
  115. }
  116. return ResponseOutput.Ok(id > 0);
  117. }
  118. public async Task<IResponseOutput> UpdateGroupAsync(PermissionUpdateGroupInput input)
  119. {
  120. var result = false;
  121. if (input != null && input.Id > 0)
  122. {
  123. var entity = await _permissionRepository.GetAsync(input.Id);
  124. entity = Mapper.Map(input, entity);
  125. result = (await _permissionRepository.UpdateAsync(entity)) > 0;
  126. }
  127. return ResponseOutput.Result(result);
  128. }
  129. public async Task<IResponseOutput> UpdateMenuAsync(PermissionUpdateMenuInput input)
  130. {
  131. var result = false;
  132. if (input != null && input.Id > 0)
  133. {
  134. var entity = await _permissionRepository.GetAsync(input.Id);
  135. entity = Mapper.Map(input, entity);
  136. result = (await _permissionRepository.UpdateAsync(entity)) > 0;
  137. }
  138. return ResponseOutput.Result(result);
  139. }
  140. public async Task<IResponseOutput> UpdateApiAsync(PermissionUpdateApiInput input)
  141. {
  142. var result = false;
  143. if (input != null && input.Id > 0)
  144. {
  145. var entity = await _permissionRepository.GetAsync(input.Id);
  146. entity = Mapper.Map(input, entity);
  147. result = (await _permissionRepository.UpdateAsync(entity)) > 0;
  148. }
  149. return ResponseOutput.Result(result);
  150. }
  151. public async Task<IResponseOutput> UpdateDotAsync(PermissionUpdateDotInput input)
  152. {
  153. if (!(input?.Id > 0))
  154. {
  155. return ResponseOutput.NotOk();
  156. }
  157. var entity = await _permissionRepository.GetAsync(input.Id);
  158. if (!(entity?.Id > 0))
  159. {
  160. return ResponseOutput.NotOk("权限点不存在!");
  161. }
  162. Mapper.Map(input, entity);
  163. await _permissionRepository.UpdateAsync(entity);
  164. await _permissionApiRepository.DeleteAsync(a => a.PermissionId == entity.Id);
  165. if (input.ApiIds != null && input.ApiIds.Any())
  166. {
  167. var permissionApis = input.ApiIds.Select(a => new PermissionApiEntity { PermissionId = entity.Id, ApiId = a });
  168. await _permissionApiRepository.InsertAsync(permissionApis);
  169. }
  170. return ResponseOutput.Ok();
  171. }
  172. [Transaction]
  173. public async Task<IResponseOutput> DeleteAsync(long id)
  174. {
  175. //递归查询所有权限点
  176. var ids = _permissionRepository.Select
  177. .Where(a => a.Id == id)
  178. .AsTreeCte()
  179. .ToList(a => a.Id);
  180. //删除权限关联接口
  181. await _permissionApiRepository.DeleteAsync(a => ids.Contains(a.PermissionId));
  182. //删除相关权限
  183. await _permissionRepository.DeleteAsync(a => ids.Contains(a.Id));
  184. return ResponseOutput.Ok();
  185. }
  186. public async Task<IResponseOutput> SoftDeleteAsync(long id)
  187. {
  188. //删除权限
  189. await _permissionRepository.SoftDeleteRecursiveAsync(a=>a.Id == id);
  190. return ResponseOutput.Ok();
  191. }
  192. [Transaction]
  193. public async Task<IResponseOutput> AssignAsync(PermissionAssignInput input)
  194. {
  195. //分配权限的时候判断角色是否存在
  196. var exists = await _roleRepository.Select.DisableGlobalFilter("Tenant").WhereDynamic(input.RoleId).AnyAsync();
  197. if (!exists)
  198. {
  199. return ResponseOutput.NotOk("该角色不存在或已被删除!");
  200. }
  201. //查询角色权限
  202. var permissionIds = await _rolePermissionRepository.Select.Where(d => d.RoleId == input.RoleId).ToListAsync(m => m.PermissionId);
  203. //批量删除权限
  204. var deleteIds = permissionIds.Where(d => !input.PermissionIds.Contains(d));
  205. if (deleteIds.Any())
  206. {
  207. await _rolePermissionRepository.DeleteAsync(m => m.RoleId == input.RoleId && deleteIds.Contains(m.PermissionId));
  208. }
  209. //批量插入权限
  210. var insertRolePermissions = new List<RolePermissionEntity>();
  211. var insertPermissionIds = input.PermissionIds.Where(d => !permissionIds.Contains(d));
  212. //防止租户非法授权
  213. if (_appConfig.Tenant && User.TenantType == TenantType.Tenant)
  214. {
  215. var masterDb = ServiceProvider.GetRequiredService<IFreeSql>();
  216. var tenantPermissionIds = await masterDb.GetRepository<TenantPermissionEntity>().Select.Where(d => d.TenantId == User.TenantId).ToListAsync(m => m.PermissionId);
  217. insertPermissionIds = insertPermissionIds.Where(d => tenantPermissionIds.Contains(d));
  218. }
  219. if (insertPermissionIds.Any())
  220. {
  221. foreach (var permissionId in insertPermissionIds)
  222. {
  223. insertRolePermissions.Add(new RolePermissionEntity()
  224. {
  225. RoleId = input.RoleId,
  226. PermissionId = permissionId,
  227. });
  228. }
  229. await _rolePermissionRepository.InsertAsync(insertRolePermissions);
  230. }
  231. //清除角色下关联的用户权限缓存
  232. var userIds = await _userRoleRepository.Select.Where(a => a.RoleId == input.RoleId).ToListAsync(a => a.UserId);
  233. foreach (var userId in userIds)
  234. {
  235. await Cache.DelAsync(string.Format(CacheKey.UserPermissions, userId));
  236. }
  237. return ResponseOutput.Ok();
  238. }
  239. [Transaction]
  240. public async Task<IResponseOutput> SaveTenantPermissionsAsync(PermissionSaveTenantPermissionsInput input)
  241. {
  242. //获得租户db
  243. var ib = ServiceProvider.GetRequiredService<IdleBus<IFreeSql>>();
  244. var tenantDb = ib.GetTenantFreeSql(ServiceProvider, input.TenantId);
  245. //查询租户权限
  246. var permissionIds = await _tenantPermissionRepository.Select.Where(d => d.TenantId == input.TenantId).ToListAsync(m => m.PermissionId);
  247. //批量删除租户权限
  248. var deleteIds = permissionIds.Where(d => !input.PermissionIds.Contains(d));
  249. if (deleteIds.Any())
  250. {
  251. await _tenantPermissionRepository.DeleteAsync(m => m.TenantId == input.TenantId && deleteIds.Contains(m.PermissionId));
  252. //删除租户下关联的角色权限
  253. await tenantDb.GetRepository<RolePermissionEntity>().DeleteAsync(a => deleteIds.Contains(a.PermissionId));
  254. }
  255. //批量插入租户权限
  256. var tenatPermissions = new List<TenantPermissionEntity>();
  257. var insertPermissionIds = input.PermissionIds.Where(d => !permissionIds.Contains(d));
  258. if (insertPermissionIds.Any())
  259. {
  260. foreach (var permissionId in insertPermissionIds)
  261. {
  262. tenatPermissions.Add(new TenantPermissionEntity()
  263. {
  264. TenantId = input.TenantId,
  265. PermissionId = permissionId,
  266. });
  267. }
  268. await _tenantPermissionRepository.InsertAsync(tenatPermissions);
  269. }
  270. //清除租户下所有用户权限缓存
  271. var userIds = await tenantDb.GetRepository<UserEntity>().Select.Where(a => a.TenantId == input.TenantId).ToListAsync(a => a.Id);
  272. if(userIds.Any())
  273. {
  274. foreach (var userId in userIds)
  275. {
  276. await Cache.DelAsync(string.Format(CacheKey.UserPermissions, userId));
  277. }
  278. }
  279. return ResponseOutput.Ok();
  280. }
  281. public async Task<IResponseOutput> GetPermissionList()
  282. {
  283. var permissions = await _permissionRepository.Select
  284. .WhereIf(_appConfig.Tenant && User.TenantType == TenantType.Tenant, a =>
  285. _tenantPermissionRepository
  286. .Where(b => b.PermissionId == a.Id && b.TenantId == User.TenantId)
  287. .Any()
  288. )
  289. .OrderBy(a => a.ParentId)
  290. .OrderBy(a => a.Sort)
  291. .ToListAsync(a => new { a.Id, a.ParentId, a.Label, a.Type });
  292. var apis = permissions
  293. .Where(a => a.Type == PermissionType.Dot)
  294. .Select(a => new { a.Id, a.ParentId, a.Label });
  295. var menus = permissions
  296. .Where(a => (new[] { PermissionType.Group, PermissionType.Menu }).Contains(a.Type))
  297. .Select(a => new
  298. {
  299. a.Id,
  300. a.ParentId,
  301. a.Label,
  302. Apis = apis.Where(b => b.ParentId == a.Id).Select(b => new { b.Id, b.Label })
  303. });
  304. return ResponseOutput.Ok(menus);
  305. }
  306. public async Task<IResponseOutput> GetRolePermissionList(long roleId = 0)
  307. {
  308. var permissionIds = await _rolePermissionRepository
  309. .Select.Where(d => d.RoleId == roleId)
  310. .ToListAsync(a => a.PermissionId);
  311. return ResponseOutput.Ok(permissionIds);
  312. }
  313. public async Task<IResponseOutput> GetTenantPermissionList(long tenantId)
  314. {
  315. var permissionIds = await _tenantPermissionRepository
  316. .Select.Where(d => d.TenantId == tenantId)
  317. .ToListAsync(a => a.PermissionId);
  318. return ResponseOutput.Ok(permissionIds);
  319. }
  320. }
  321. }