UNIVPLMDataIntegration/Admin.NET/Admin.NET.Core/Service/Role/SysRoleService.cs

397 lines
15 KiB
C#
Raw Normal View History

2024-06-15 13:02:35 +08:00
// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
//
// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
//
// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
namespace Admin.NET.Core.Service;
/// <summary>
/// 系统角色服务 🧩
/// </summary>
[ApiDescriptionSettings(Order = 480)]
public class SysRoleService : IDynamicApiController, ITransient
{
private readonly UserManager _userManager;
private readonly SqlSugarRepository<SysRole> _sysRoleRep;
private readonly SysRoleOrgService _sysRoleOrgService;
private readonly SysRoleMenuService _sysRoleMenuService;
private readonly SysRoleApiService _sysRoleApiService;
private readonly SysBaseApiService _sysBaseApiService;
2024-06-15 13:02:35 +08:00
private readonly SysOrgService _sysOrgService;
private readonly SysUserRoleService _sysUserRoleService;
private readonly SysCacheService _sysCacheService;
2024-07-22 02:54:41 +08:00
private readonly SysCommonService _sysCommonService;
2024-06-15 13:02:35 +08:00
public SysRoleService(UserManager userManager,
SqlSugarRepository<SysRole> sysRoleRep,
SysRoleOrgService sysRoleOrgService,
SysRoleMenuService sysRoleMenuService,
SysRoleApiService sysRoleApiService,
SysBaseApiService sysBaseApiService,
2024-06-15 13:02:35 +08:00
SysOrgService sysOrgService,
SysUserRoleService sysUserRoleService,
2024-07-22 02:54:41 +08:00
SysCacheService sysCacheService,
SysCommonService sysCommonService)
2024-06-15 13:02:35 +08:00
{
_userManager = userManager;
_sysRoleRep = sysRoleRep;
_sysRoleOrgService = sysRoleOrgService;
_sysRoleMenuService = sysRoleMenuService;
_sysRoleApiService = sysRoleApiService;
_sysBaseApiService = sysBaseApiService;
2024-06-15 13:02:35 +08:00
_sysOrgService = sysOrgService;
_sysUserRoleService = sysUserRoleService;
_sysCacheService = sysCacheService;
2024-07-22 02:54:41 +08:00
_sysCommonService = sysCommonService;
2024-06-15 13:02:35 +08:00
}
/// <summary>
/// 获取角色分页列表 🔖
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[DisplayName("获取角色分页列表")]
public async Task<SqlSugarPagedList<PageRoleOutput>> Page(PageRoleInput input)
{
return await _sysRoleRep.AsQueryable()
.LeftJoin<SysTenant>((u, a) => u.TenantId == a.Id)
.LeftJoin<SysOrg>((u, a, b) => a.OrgId == b.Id)
.WhereIF(!_userManager.SuperAdmin, u => u.TenantId == _userManager.TenantId) // 若非超管,则只能操作本租户的角色
.WhereIF(!_userManager.SuperAdmin && !_userManager.SysAdmin, u => u.CreateUserId == _userManager.UserId) // 若非超管且非系统管理员,则只能操作自己创建的角色
.WhereIF(!string.IsNullOrWhiteSpace(input.Name), u => u.Name.Contains(input.Name))
.WhereIF(!string.IsNullOrWhiteSpace(input.Code), u => u.Code.Contains(input.Code))
.Select((u, a, b) => new PageRoleOutput
{
TenantName = b.Name
}, true)
.OrderBy(u => u.OrderNo)
.ToPagedListAsync(input.Page, input.PageSize);
}
/// <summary>
/// 获取角色列表 🔖
/// </summary>
/// <returns></returns>
[DisplayName("获取角色列表")]
public async Task<List<RoleOutput>> GetList()
{
// 当前用户已拥有的角色集合
var roleIdList = _userManager.SuperAdmin ? new List<long>() : await _sysUserRoleService.GetUserRoleIdList(_userManager.UserId);
return await _sysRoleRep.AsQueryable()
.WhereIF(!_userManager.SuperAdmin, u => u.TenantId == _userManager.TenantId) // 若非超管,则只能操作本租户的角色
.WhereIF(!_userManager.SuperAdmin && !_userManager.SysAdmin, u => u.CreateUserId == _userManager.UserId || roleIdList.Contains(u.Id)) // 若非超管且非系统管理员,则只显示自己创建和已拥有的角色
.OrderBy(u => u.OrderNo).Select<RoleOutput>().ToListAsync();
}
/// <summary>
/// 增加角色 🔖
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[ApiDescriptionSettings(Name = "Add"), HttpPost]
[DisplayName("增加角色")]
public async Task AddRole(AddRoleInput input)
{
if (await _sysRoleRep.IsAnyAsync(u => u.Name == input.Name && u.Code == input.Code))
throw Oops.Oh(ErrorCodeEnum.D1006);
var newRole = await _sysRoleRep.AsInsertable(input.Adapt<SysRole>()).ExecuteReturnEntityAsync();
input.Id = newRole.Id;
await UpdateRoleMenu(input);
}
/// <summary>
/// 更新角色菜单权限
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
private async Task UpdateRoleMenu(AddRoleInput input)
{
if (input.MenuIdList == null || input.MenuIdList.Count < 1)
return;
// 将父节点为0的菜单排除防止前端全选异常
var pMenuIds = await _sysRoleRep.ChangeRepository<SqlSugarRepository<SysMenu>>().AsQueryable().Where(u => input.MenuIdList.Contains(u.Id) && u.Pid == 0).ToListAsync(u => u.Id);
var menuIds = input.MenuIdList.Except(pMenuIds); // 差集
await GrantMenu(new RoleMenuInput()
{
Id = input.Id,
MenuIdList = menuIds.ToList()
});
}
/// <summary>
/// 更新角色 🔖
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[ApiDescriptionSettings(Name = "Update"), HttpPost]
[DisplayName("更新角色")]
public async Task UpdateRole(UpdateRoleInput input)
{
if (await _sysRoleRep.IsAnyAsync(u => u.Name == input.Name && u.Code == input.Code && u.Id != input.Id))
throw Oops.Oh(ErrorCodeEnum.D1006);
await _sysRoleRep.AsUpdateable(input.Adapt<SysRole>()).IgnoreColumns(true)
.IgnoreColumns(u => new { u.DataScope }).ExecuteCommandAsync();
await UpdateRoleMenu(input);
}
/// <summary>
/// 删除角色 🔖
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[UnitOfWork]
[ApiDescriptionSettings(Name = "Delete"), HttpPost]
[DisplayName("删除角色")]
public async Task DeleteRole(DeleteRoleInput input)
{
// 禁止删除系统管理员角色
var sysRole = await _sysRoleRep.GetFirstAsync(u => u.Id == input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D1002);
if (sysRole.Code == CommonConst.SysAdminRole)
throw Oops.Oh(ErrorCodeEnum.D1019);
// 若角色有用户则禁止删除
var userIds = await _sysUserRoleService.GetUserIdList(input.Id);
if (userIds != null && userIds.Count > 0)
throw Oops.Oh(ErrorCodeEnum.D1025);
await _sysRoleRep.DeleteAsync(sysRole);
// 级联删除角色机构数据
await _sysRoleOrgService.DeleteRoleOrgByRoleId(sysRole.Id);
// 级联删除用户角色数据
await _sysUserRoleService.DeleteUserRoleByRoleId(sysRole.Id);
// 级联删除角色菜单数据
await _sysRoleMenuService.DeleteRoleMenuByRoleId(sysRole.Id);
// 级联删除角色接口数据
await _sysRoleApiService.DeleteRoleApiByRoleId(sysRole.Id);
}
/// <summary>
/// 授权角色菜单 🔖
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[UnitOfWork]
[DisplayName("授权角色菜单")]
public async Task GrantMenu(RoleMenuInput input)
{
await _sysRoleMenuService.GrantRoleMenu(input);
}
/// <summary>
/// 授权角色数据范围 🔖
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[UnitOfWork]
[DisplayName("授权角色数据范围")]
public async Task GrantDataScope(RoleOrgInput input)
{
// 删除与该角色相关的用户机构缓存
var userIdList = await _sysUserRoleService.GetUserIdList(input.Id);
foreach (var userId in userIdList)
{
SqlSugarFilter.DeleteUserOrgCache(userId, _sysRoleRep.Context.CurrentConnectionConfig.ConfigId.ToString());
}
var role = await _sysRoleRep.GetFirstAsync(u => u.Id == input.Id);
var dataScope = input.DataScope;
if (!_userManager.SuperAdmin)
{
// 非超级管理员没有全部数据范围权限
if (dataScope == (int)DataScopeEnum.All)
throw Oops.Oh(ErrorCodeEnum.D1016);
// 若数据范围自定义,则判断授权数据范围是否有权限
if (dataScope == (int)DataScopeEnum.Define)
{
var grantOrgIdList = input.OrgIdList;
if (grantOrgIdList.Count > 0)
{
var orgIdList = await _sysOrgService.GetUserOrgIdList();
if (orgIdList.Count < 1)
throw Oops.Oh(ErrorCodeEnum.D1016);
else if (!grantOrgIdList.All(u => orgIdList.Any(c => c == u)))
throw Oops.Oh(ErrorCodeEnum.D1016);
}
}
}
role.DataScope = (DataScopeEnum)dataScope;
await _sysRoleRep.AsUpdateable(role).UpdateColumns(u => new { u.DataScope }).ExecuteCommandAsync();
await _sysRoleOrgService.GrantRoleOrg(input);
}
/// <summary>
/// 根据角色Id获取菜单Id集合 🔖
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[DisplayName("根据角色Id获取菜单Id集合")]
public async Task<List<long>> GetOwnMenuList([FromQuery] RoleInput input)
{
return await _sysRoleMenuService.GetRoleMenuIdList(new List<long> { input.Id });
}
/// <summary>
/// 根据角色Id获取机构Id集合 🔖
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[DisplayName("根据角色Id获取机构Id集合")]
public async Task<List<long>> GetOwnOrgList([FromQuery] RoleInput input)
{
return await _sysRoleOrgService.GetRoleOrgIdList(new List<long> { input.Id });
}
/// <summary>
/// 设置角色状态 🔖
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[DisplayName("设置角色状态")]
public async Task<int> SetStatus(RoleInput input)
{
if (!Enum.IsDefined(typeof(StatusEnum), input.Status))
throw Oops.Oh(ErrorCodeEnum.D3005);
return await _sysRoleRep.AsUpdateable()
.SetColumns(u => u.Status == input.Status)
.Where(u => u.Id == input.Id)
.ExecuteCommandAsync();
}
/// <summary>
/// 授权角色接口资源 🔖
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[UnitOfWork]
[DisplayName("授权角色接口资源")]
public async Task GrantApi(RoleApiInput input)
{
// 删除与该角色相关的用户接口资源缓存
var userIdList = await _sysUserRoleService.GetUserIdList(input.Id);
foreach (var userId in userIdList)
{
_sysCacheService.Remove(CacheConst.KeyUserApi + userId);
}
await _sysRoleApiService.GrantRoleApi(input);
}
/// <summary>
/// 根据角色Id获取接口资源集合 🔖
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[DisplayName("根据角色Id获取接口资源集合")]
public async Task<List<string>> GetOwnApiList([FromQuery] RoleInput input)
{
return await _sysRoleApiService.GetRoleApiList(new List<long> { input.Id });
}
/// <summary>
/// 获取用户拥有接口资源集合(缓存) 🔖
/// </summary>
/// <returns></returns>
[DisplayName("获取用户拥有接口资源集合")]
public async Task<List<string>> GetUserApiList()
{
var userId = _userManager.UserId;
var apiList = _sysCacheService.Get<List<string>>(CacheConst.KeyUserApi + userId);
if (apiList == null)
{
2024-07-22 02:54:41 +08:00
// 超管时获取所有接口资源
if (_userManager.SuperAdmin)
{
var allApiList = _sysCommonService.GetApiList();
apiList = new List<string>();
foreach (var apiOutput in allApiList)
{
foreach (var controller in apiOutput.Children)
{
apiList.AddRange(controller.Children.Select(u => u.Route));
}
}
}
else
{
var roleIds = await _sysUserRoleService.GetUserRoleIdList(_userManager.UserId);
apiList = await _sysRoleApiService.GetRoleApiList(roleIds);
}
2024-06-15 13:02:35 +08:00
_sysCacheService.Set(CacheConst.KeyUserApi + userId, apiList, TimeSpan.FromDays(7));
}
return apiList;
}
/// <summary>
/// 设置基础接口资源
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[DisplayName("设置基础接口资源")]
public async Task SetBaseApi(BaseApiInput input)
{
_sysCacheService.Remove(CacheConst.KeyBaseApi);
await _sysBaseApiService.SetBaseApi(input);
}
/// <summary>
/// 获取基础接口资源集合
/// </summary>
/// <returns></returns>
[DisplayName("获取基础接口资源集合")]
public async Task<List<string>> GetBaseApiList()
{
var apiList = _sysCacheService.Get<List<string>>(CacheConst.KeyBaseApi);
if (apiList == null)
{
apiList = await _sysBaseApiService.GetBaseApiList();
_sysCacheService.Set(CacheConst.KeyBaseApi, apiList);
}
return apiList;
}
2024-07-22 02:54:41 +08:00
/// <summary>
/// 初始化管理员角色接口资源
/// </summary>
/// <returns></returns>
[DisplayName("初始化管理员角色接口资源")]
public async Task InitAdminRoleApi()
{
// 获取所有接口资源
var allApiList = _sysCommonService.GetApiList();
var idIndex = 0;
var sysRoleApis = new List<SysRoleApi>();
foreach (var apiOutput in allApiList)
{
foreach (var controller in apiOutput.Children)
{
if (controller.Name == "sysTenant") continue; // 排除租户管理接口
foreach (var api in controller.Children)
{
sysRoleApis.Add(new SysRoleApi { Id = 1400000000101 + idIndex, RoleId = 1300000000101, Route = api.Route });
idIndex++;
}
}
}
// 更新系统管理员角色的接口资源
var storage = _sysRoleRep.Context.StorageableByObject(sysRoleApis).ToStorage();
storage.AsInsertable.ExecuteCommand();
storage.AsUpdateable.ExecuteCommand();
await Task.CompletedTask;
}
2024-06-15 13:02:35 +08:00
}