SysAppService.cs 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. // Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
  2. //
  3. // 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
  4. //
  5. // 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
  6. namespace Admin.NET.Core.Service;
  7. /// <summary>
  8. /// 系统应用服务 🧩
  9. /// </summary>
  10. [ApiDescriptionSettings(Name = "SysApp", Order = 495)]
  11. public class SysAppService : IDynamicApiController, ITransient
  12. {
  13. private readonly SqlSugarRepository<SysAppMenu> _sysAppMenuRep;
  14. private readonly SqlSugarRepository<SysApp> _sysAppRep;
  15. private readonly SysAuthService _sysAuthService;
  16. private readonly UserManager _userManager;
  17. public SysAppService(SqlSugarRepository<SysApp> sysAppRep, SqlSugarRepository<SysAppMenu> sysAppMenuRep, SysAuthService sysAuthService, UserManager userManager)
  18. {
  19. _sysAppRep = sysAppRep;
  20. _userManager = userManager;
  21. _sysAppMenuRep = sysAppMenuRep;
  22. _sysAuthService = sysAuthService;
  23. }
  24. /// <summary>
  25. /// 分页查询应用 🔖
  26. /// </summary>
  27. /// <param name="input"></param>
  28. /// <returns></returns>
  29. [DisplayName("分页查询应用")]
  30. [ApiDescriptionSettings(Name = "Page"), HttpPost]
  31. public async Task<SqlSugarPagedList<SysAppOutput>> Page(BasePageInput input)
  32. {
  33. input.Keyword = input.Keyword?.Trim();
  34. var query = _sysAppRep.AsQueryable()
  35. .WhereIF(!string.IsNullOrWhiteSpace(input.Keyword), u => u.Name.Contains(input.Keyword) ||
  36. u.Title.Contains(input.Keyword) || u.ViceTitle.Contains(input.Keyword) ||
  37. u.ViceDesc.Contains(input.Keyword) || u.Remark.Contains(input.Keyword))
  38. .OrderBy(u => new { u.OrderNo, u.Id })
  39. .Select<SysAppOutput>();
  40. return await query.OrderBuilder(input).ToPagedListAsync(input.Page, input.PageSize);
  41. }
  42. /// <summary>
  43. /// 增加应用 🔖
  44. /// </summary>
  45. /// <param name="input"></param>
  46. /// <returns></returns>
  47. [DisplayName("增加应用")]
  48. [ApiDescriptionSettings(Name = "Add"), HttpPost]
  49. public async Task<long> Add(AddSysAppInput input)
  50. {
  51. var entity = input.Adapt<SysApp>();
  52. return await _sysAppRep.InsertAsync(entity) ? entity.Id : 0;
  53. }
  54. /// <summary>
  55. /// 更新应用 🔖
  56. /// </summary>
  57. /// <param name="input"></param>
  58. /// <returns></returns>
  59. [DisplayName("更新应用")]
  60. [ApiDescriptionSettings(Name = "Update"), HttpPost]
  61. public async Task Update(UpdateSysAppInput input)
  62. {
  63. _ = await _sysAppRep.GetFirstAsync(u => u.Id == input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D1002);
  64. var entity = input.Adapt<SysApp>();
  65. await _sysAppRep.AsUpdateable(entity).ExecuteCommandAsync();
  66. }
  67. /// <summary>
  68. /// 删除应用 🔖
  69. /// </summary>
  70. /// <param name="input"></param>
  71. /// <returns></returns>
  72. [DisplayName("删除应用")]
  73. [ApiDescriptionSettings(Name = "Delete"), HttpPost]
  74. public async Task Delete(BaseIdInput input)
  75. {
  76. var entity = await _sysAppRep.GetFirstAsync(u => u.Id == input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D1002);
  77. // 禁止删除存在关联租户的应用
  78. if (await _sysAppRep.Context.Queryable<SysTenant>().AnyAsync(u => u.AppId == input.Id)) throw Oops.Oh(ErrorCodeEnum.A1001);
  79. // 禁止删除存在关联菜单的应用
  80. if (await _sysAppMenuRep.AsQueryable().AnyAsync(u => u.AppId == input.Id)) throw Oops.Oh(ErrorCodeEnum.A1002);
  81. await _sysAppRep.DeleteAsync(entity);
  82. }
  83. /// <summary>
  84. /// 获取授权菜单 🔖
  85. /// </summary>
  86. /// <param name="id"></param>
  87. /// <returns></returns>
  88. [UnitOfWork]
  89. [DisplayName("获取授权菜单")]
  90. [ApiDescriptionSettings(Name = "GrantMenu"), HttpGet]
  91. public async Task<List<long>> GrantMenu([FromQuery] long id)
  92. {
  93. return await _sysAppMenuRep.AsQueryable().Where(u => u.AppId == id).Select(u => u.MenuId).ToListAsync();
  94. }
  95. /// <summary>
  96. /// 授权菜单 🔖
  97. /// </summary>
  98. /// <param name="input"></param>
  99. /// <returns></returns>
  100. [UnitOfWork]
  101. [DisplayName("授权菜单")]
  102. [ApiDescriptionSettings(Name = "GrantMenu"), HttpPost]
  103. public async Task GrantMenu(UpdateAppMenuInput input)
  104. {
  105. input.MenuIdList ??= new();
  106. await _sysAppMenuRep.DeleteAsync(u => u.AppId == input.Id);
  107. var list = input.MenuIdList.Select(id => new SysAppMenu { AppId = input.Id, MenuId = id }).ToList();
  108. await _sysAppMenuRep.InsertRangeAsync(list);
  109. // 清除应用下其他模块越权的授权数据,包括角色菜单,用户收藏菜单
  110. var tenantIds = await _sysAppRep.Context.Queryable<SysTenant>().Where(u => u.AppId == input.Id).Select(u => u.Id).ToListAsync();
  111. var roleIds = await _sysAppRep.Context.Queryable<SysRole>().Where(u => tenantIds.Contains((long)u.TenantId)).Select(u => u.Id).ToListAsync();
  112. var userIds = await _sysAppRep.Context.Queryable<SysUser>().Where(u => tenantIds.Contains((long)u.TenantId)).Select(u => u.Id).ToListAsync();
  113. await _sysAppRep.Context.Deleteable<SysRoleMenu>().Where(u => roleIds.Contains(u.RoleId) && !input.MenuIdList.Contains(u.MenuId)).ExecuteCommandAsync();
  114. await _sysAppRep.Context.Deleteable<SysUserMenu>().Where(u => userIds.Contains(u.UserId) && !input.MenuIdList.Contains(u.MenuId)).ExecuteCommandAsync();
  115. }
  116. /// <summary>
  117. /// 获取切换应用数据 🔖
  118. /// </summary>
  119. /// <returns></returns>
  120. [UnitOfWork]
  121. [DisplayName("切换应用")]
  122. [ApiDescriptionSettings(Name = "ChangeApp"), HttpGet]
  123. public async Task<dynamic> GetChangeAppData()
  124. {
  125. var list = await _sysAppRep.AsQueryable().Includes(u => u.TenantList).ToListAsync();
  126. return new
  127. {
  128. _userManager.AppId,
  129. _userManager.TenantId,
  130. SelectList = list.Where(u => u.TenantList.Count > 0).Select(u => new
  131. {
  132. u.Id,
  133. Value = u.Id,
  134. Label = u.Name,
  135. Children = u.TenantList.Select(t => new
  136. {
  137. t.Id,
  138. Value = t.Id,
  139. Label = t.Host ?? (t.Id + ""),
  140. })
  141. })
  142. };
  143. }
  144. /// <summary>
  145. /// 切换应用 🔖
  146. /// </summary>
  147. /// <param name="input"></param>
  148. /// <returns></returns>
  149. [UnitOfWork]
  150. [DisplayName("切换应用")]
  151. [ApiDescriptionSettings(Name = "ChangeApp"), HttpPost]
  152. public async Task<LoginOutput> ChangeApp(ChangeAppInput input)
  153. {
  154. _ = await _sysAppRep.Context.Queryable<SysTenant>().FirstAsync(u => u.Id == input.TenantId) ?? throw Oops.Oh(ErrorCodeEnum.Z1003);
  155. _ = await _sysAppRep.GetFirstAsync(u => u.Id == input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D1002);
  156. var user = await _sysAppRep.Context.Queryable<SysUser>().FirstAsync(u => u.Id == _userManager.UserId);
  157. user.TenantId = input.TenantId;
  158. return await _sysAuthService.CreateToken(user, input.Id);
  159. }
  160. /// <summary>
  161. /// 获取当前应用信息
  162. /// </summary>
  163. /// <returns></returns>
  164. [NonAction]
  165. public async Task<SysApp> GetCurrentAppInfo()
  166. {
  167. var appId = _userManager.AppId > 0 ? _userManager.AppId : SqlSugarConst.DefaultAppId;
  168. return await _sysAppRep.GetFirstAsync(u => u.Id == appId) ?? throw Oops.Oh(ErrorCodeEnum.D1002);
  169. }
  170. }