// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 // // 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 // // 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! namespace Admin.NET.Core.Service; /// /// 系统应用服务 🧩 /// [ApiDescriptionSettings(Name = "SysApp", Order = 495)] public class SysAppService : IDynamicApiController, ITransient { private readonly SqlSugarRepository _sysAppMenuRep; private readonly SqlSugarRepository _sysAppRep; private readonly SysAuthService _sysAuthService; private readonly UserManager _userManager; public SysAppService(SqlSugarRepository sysAppRep, SqlSugarRepository sysAppMenuRep, SysAuthService sysAuthService, UserManager userManager) { _sysAppRep = sysAppRep; _userManager = userManager; _sysAppMenuRep = sysAppMenuRep; _sysAuthService = sysAuthService; } /// /// 分页查询应用 🔖 /// /// /// [DisplayName("分页查询应用")] [ApiDescriptionSettings(Name = "Page"), HttpPost] public async Task> Page(BasePageInput input) { input.Keyword = input.Keyword?.Trim(); var query = _sysAppRep.AsQueryable() .WhereIF(!string.IsNullOrWhiteSpace(input.Keyword), u => u.Name.Contains(input.Keyword) || u.Title.Contains(input.Keyword) || u.ViceTitle.Contains(input.Keyword) || u.ViceDesc.Contains(input.Keyword) || u.Remark.Contains(input.Keyword)) .OrderBy(u => new { u.OrderNo, u.Id }) .Select(); return await query.OrderBuilder(input).ToPagedListAsync(input.Page, input.PageSize); } /// /// 增加应用 🔖 /// /// /// [DisplayName("增加应用")] [ApiDescriptionSettings(Name = "Add"), HttpPost] public async Task Add(AddSysAppInput input) { var entity = input.Adapt(); return await _sysAppRep.InsertAsync(entity) ? entity.Id : 0; } /// /// 更新应用 🔖 /// /// /// [DisplayName("更新应用")] [ApiDescriptionSettings(Name = "Update"), HttpPost] public async Task Update(UpdateSysAppInput input) { _ = await _sysAppRep.GetFirstAsync(u => u.Id == input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D1002); var entity = input.Adapt(); await _sysAppRep.AsUpdateable(entity).ExecuteCommandAsync(); } /// /// 删除应用 🔖 /// /// /// [DisplayName("删除应用")] [ApiDescriptionSettings(Name = "Delete"), HttpPost] public async Task Delete(BaseIdInput input) { var entity = await _sysAppRep.GetFirstAsync(u => u.Id == input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D1002); // 禁止删除存在关联租户的应用 if (await _sysAppRep.Context.Queryable().AnyAsync(u => u.AppId == input.Id)) throw Oops.Oh(ErrorCodeEnum.A1001); // 禁止删除存在关联菜单的应用 if (await _sysAppMenuRep.AsQueryable().AnyAsync(u => u.AppId == input.Id)) throw Oops.Oh(ErrorCodeEnum.A1002); await _sysAppRep.DeleteAsync(entity); } /// /// 获取授权菜单 🔖 /// /// /// [UnitOfWork] [DisplayName("获取授权菜单")] [ApiDescriptionSettings(Name = "GrantMenu"), HttpGet] public async Task> GrantMenu([FromQuery] long id) { return await _sysAppMenuRep.AsQueryable().Where(u => u.AppId == id).Select(u => u.MenuId).ToListAsync(); } /// /// 授权菜单 🔖 /// /// /// [UnitOfWork] [DisplayName("授权菜单")] [ApiDescriptionSettings(Name = "GrantMenu"), HttpPost] public async Task GrantMenu(UpdateAppMenuInput input) { input.MenuIdList ??= new(); await _sysAppMenuRep.DeleteAsync(u => u.AppId == input.Id); var list = input.MenuIdList.Select(id => new SysAppMenu { AppId = input.Id, MenuId = id }).ToList(); await _sysAppMenuRep.InsertRangeAsync(list); // 清除应用下其他模块越权的授权数据,包括角色菜单,用户收藏菜单 var tenantIds = await _sysAppRep.Context.Queryable().Where(u => u.AppId == input.Id).Select(u => u.Id).ToListAsync(); var roleIds = await _sysAppRep.Context.Queryable().Where(u => tenantIds.Contains((long)u.TenantId)).Select(u => u.Id).ToListAsync(); var userIds = await _sysAppRep.Context.Queryable().Where(u => tenantIds.Contains((long)u.TenantId)).Select(u => u.Id).ToListAsync(); await _sysAppRep.Context.Deleteable().Where(u => roleIds.Contains(u.RoleId) && !input.MenuIdList.Contains(u.MenuId)).ExecuteCommandAsync(); await _sysAppRep.Context.Deleteable().Where(u => userIds.Contains(u.UserId) && !input.MenuIdList.Contains(u.MenuId)).ExecuteCommandAsync(); } /// /// 获取切换应用数据 🔖 /// /// [UnitOfWork] [DisplayName("切换应用")] [ApiDescriptionSettings(Name = "ChangeApp"), HttpGet] public async Task GetChangeAppData() { var list = await _sysAppRep.AsQueryable().Includes(u => u.TenantList).ToListAsync(); return new { _userManager.AppId, _userManager.TenantId, SelectList = list.Where(u => u.TenantList.Count > 0).Select(u => new { u.Id, Value = u.Id, Label = u.Name, Children = u.TenantList.Select(t => new { t.Id, Value = t.Id, Label = t.Host ?? (t.Id + ""), }) }) }; } /// /// 切换应用 🔖 /// /// /// [UnitOfWork] [DisplayName("切换应用")] [ApiDescriptionSettings(Name = "ChangeApp"), HttpPost] public async Task ChangeApp(ChangeAppInput input) { _ = await _sysAppRep.Context.Queryable().FirstAsync(u => u.Id == input.TenantId) ?? throw Oops.Oh(ErrorCodeEnum.Z1003); _ = await _sysAppRep.GetFirstAsync(u => u.Id == input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D1002); var user = await _sysAppRep.Context.Queryable().FirstAsync(u => u.Id == _userManager.UserId); user.TenantId = input.TenantId; return await _sysAuthService.CreateToken(user, input.Id); } /// /// 获取当前应用信息 /// /// [NonAction] public async Task GetCurrentAppInfo() { var appId = _userManager.AppId > 0 ? _userManager.AppId : SqlSugarConst.DefaultAppId; return await _sysAppRep.GetFirstAsync(u => u.Id == appId) ?? throw Oops.Oh(ErrorCodeEnum.D1002); } }