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>
|
2024-09-05 14:08:51 +08:00
|
|
|
|
[ApiDescriptionSettings(Order = 480, Description = "系统角色")]
|
2024-06-15 13:02:35 +08:00
|
|
|
|
public class SysRoleService : IDynamicApiController, ITransient
|
|
|
|
|
|
{
|
|
|
|
|
|
private readonly UserManager _userManager;
|
|
|
|
|
|
private readonly SqlSugarRepository<SysRole> _sysRoleRep;
|
|
|
|
|
|
private readonly SysRoleMenuService _sysRoleMenuService;
|
2025-01-03 16:14:30 +08:00
|
|
|
|
private readonly SysRoleOrgService _sysRoleOrgService;
|
2024-11-25 01:30:10 +08:00
|
|
|
|
private readonly SysRoleTableService _sysRoleTableService;
|
2024-06-15 13:02:35 +08:00
|
|
|
|
private readonly SysRoleApiService _sysRoleApiService;
|
|
|
|
|
|
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,
|
|
|
|
|
|
SysRoleMenuService sysRoleMenuService,
|
2025-01-03 16:14:30 +08:00
|
|
|
|
SysRoleOrgService sysRoleOrgService,
|
2024-11-25 01:30:10 +08:00
|
|
|
|
SysRoleTableService sysRoleTableService,
|
2024-06-15 13:02:35 +08:00
|
|
|
|
SysRoleApiService sysRoleApiService,
|
|
|
|
|
|
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;
|
|
|
|
|
|
_sysRoleMenuService = sysRoleMenuService;
|
2025-01-03 16:14:30 +08:00
|
|
|
|
_sysRoleOrgService = sysRoleOrgService;
|
2024-11-25 01:30:10 +08:00
|
|
|
|
_sysRoleTableService = sysRoleTableService;
|
2024-06-15 13:02:35 +08:00
|
|
|
|
_sysRoleApiService = sysRoleApiService;
|
|
|
|
|
|
_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>
|
2025-03-23 22:17:28 +08:00
|
|
|
|
[DisplayName("获取角色分页列表")]
|
2024-06-15 13:02:35 +08:00
|
|
|
|
public async Task<SqlSugarPagedList<PageRoleOutput>> Page(PageRoleInput input)
|
|
|
|
|
|
{
|
2024-12-05 00:39:12 +08:00
|
|
|
|
// 当前用户已拥有的角色集合
|
|
|
|
|
|
var roleIdList = _userManager.SuperAdmin ? new List<long>() : await _sysUserRoleService.GetUserRoleIdList(_userManager.UserId);
|
|
|
|
|
|
|
2024-06-15 13:02:35 +08:00
|
|
|
|
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) // 若非超管,则只能操作本租户的角色
|
2024-12-05 00:39:12 +08:00
|
|
|
|
.WhereIF(!_userManager.SuperAdmin && !_userManager.SysAdmin, u => u.CreateUserId == _userManager.UserId || roleIdList.Contains(u.Id)) // 若非超管且非系统管理员,则只能操作自己创建的角色
|
2024-06-15 13:02:35 +08:00
|
|
|
|
.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)
|
2024-07-25 17:08:49 +08:00
|
|
|
|
.OrderBy(u => new { u.OrderNo, u.Id })
|
2024-06-15 13:02:35 +08:00
|
|
|
|
.ToPagedListAsync(input.Page, input.PageSize);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 获取角色列表 🔖
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <returns></returns>
|
2025-03-23 22:17:28 +08:00
|
|
|
|
[DisplayName("获取角色列表")]
|
2024-06-15 13:02:35 +08:00
|
|
|
|
public async Task<List<RoleOutput>> GetList()
|
|
|
|
|
|
{
|
|
|
|
|
|
// 当前用户已拥有的角色集合
|
2025-07-01 01:45:43 +08:00
|
|
|
|
var roleIdList = _userManager.SuperAdmin ? [] : await _sysUserRoleService.GetUserRoleIdList(_userManager.UserId);
|
2024-06-15 13:02:35 +08:00
|
|
|
|
|
|
|
|
|
|
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)) // 若非超管且非系统管理员,则只显示自己创建和已拥有的角色
|
2024-10-22 01:09:19 +08:00
|
|
|
|
.Where(u => u.Status != StatusEnum.Disable) // 非禁用的
|
2024-09-30 08:59:07 +08:00
|
|
|
|
.OrderBy(u => new { u.OrderNo, u.Id }).Select(u => new RoleOutput { Disabled = false }, true).ToListAsync();
|
2024-06-15 13:02:35 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 增加角色 🔖
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="input"></param>
|
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
|
[ApiDescriptionSettings(Name = "Add"), HttpPost]
|
2025-03-23 22:17:28 +08:00
|
|
|
|
[DisplayName("增加角色")]
|
2024-06-15 13:02:35 +08:00
|
|
|
|
public async Task AddRole(AddRoleInput input)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (await _sysRoleRep.IsAnyAsync(u => u.Name == input.Name && u.Code == input.Code))
|
|
|
|
|
|
throw Oops.Oh(ErrorCodeEnum.D1006);
|
|
|
|
|
|
|
2024-09-03 11:10:59 +08:00
|
|
|
|
var roleId = await _sysRoleRep.AsInsertable(input.Adapt<SysRole>()).ExecuteReturnSnowflakeIdAsync();
|
|
|
|
|
|
|
|
|
|
|
|
// 授权角色基础菜单集合
|
2025-03-23 22:17:28 +08:00
|
|
|
|
var menuIdList = new List<long>
|
|
|
|
|
|
{
|
2025-07-01 01:45:43 +08:00
|
|
|
|
1300000000101, 1300000000111, 1300000000121, // 工作台
|
2025-03-23 22:17:28 +08:00
|
|
|
|
1310000000161, 1310000000162, 1310000000163, 1310000000164, 1310000000165, // 个人中心
|
2024-09-03 11:10:59 +08:00
|
|
|
|
};
|
|
|
|
|
|
await _sysRoleMenuService.GrantRoleMenu(new RoleMenuInput() { Id = roleId, MenuIdList = menuIdList });
|
2024-06-15 13:02:35 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 更新角色 🔖
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="input"></param>
|
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
|
[ApiDescriptionSettings(Name = "Update"), HttpPost]
|
2025-03-23 22:17:28 +08:00
|
|
|
|
[DisplayName("更新角色")]
|
2024-06-15 13:02:35 +08:00
|
|
|
|
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();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 删除角色 🔖
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="input"></param>
|
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
|
[UnitOfWork]
|
|
|
|
|
|
[ApiDescriptionSettings(Name = "Delete"), HttpPost]
|
2025-03-23 22:17:28 +08:00
|
|
|
|
[DisplayName("删除角色")]
|
2024-06-15 13:02:35 +08:00
|
|
|
|
public async Task DeleteRole(DeleteRoleInput input)
|
|
|
|
|
|
{
|
2025-07-17 11:09:25 +08:00
|
|
|
|
// 禁止删除系统内置角色
|
2024-09-01 11:35:08 +08:00
|
|
|
|
var sysRole = await _sysRoleRep.GetByIdAsync(input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D1002);
|
2025-07-25 00:28:07 +08:00
|
|
|
|
if (sysRole.SysFlag == YesNoEnum.Y) throw Oops.Oh(ErrorCodeEnum.D1019);
|
2024-06-15 13:02:35 +08:00
|
|
|
|
|
|
|
|
|
|
// 若角色有用户则禁止删除
|
|
|
|
|
|
var userIds = await _sysUserRoleService.GetUserIdList(input.Id);
|
2024-11-25 16:27:14 +08:00
|
|
|
|
if (userIds != null && userIds.Count > 0) throw Oops.Oh(ErrorCodeEnum.D1025);
|
2024-06-15 13:02:35 +08:00
|
|
|
|
|
|
|
|
|
|
await _sysRoleRep.DeleteAsync(sysRole);
|
|
|
|
|
|
|
|
|
|
|
|
// 级联删除角色机构数据
|
|
|
|
|
|
await _sysRoleOrgService.DeleteRoleOrgByRoleId(sysRole.Id);
|
|
|
|
|
|
|
|
|
|
|
|
// 级联删除用户角色数据
|
|
|
|
|
|
await _sysUserRoleService.DeleteUserRoleByRoleId(sysRole.Id);
|
|
|
|
|
|
|
|
|
|
|
|
// 级联删除角色菜单数据
|
|
|
|
|
|
await _sysRoleMenuService.DeleteRoleMenuByRoleId(sysRole.Id);
|
|
|
|
|
|
|
|
|
|
|
|
// 级联删除角色接口数据
|
|
|
|
|
|
await _sysRoleApiService.DeleteRoleApiByRoleId(sysRole.Id);
|
2025-04-06 07:56:48 +08:00
|
|
|
|
|
|
|
|
|
|
// 级联删除角色表格数据
|
|
|
|
|
|
await _sysRoleTableService.DeleteRolTableByRoleId(sysRole.Id);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 复制角色 🔖
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="input"></param>
|
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
|
[UnitOfWork]
|
|
|
|
|
|
[ApiDescriptionSettings(Name = "Copy"), HttpPost]
|
|
|
|
|
|
[DisplayName("复制角色")]
|
|
|
|
|
|
public async Task CopyRole(CopyRoleInput input)
|
|
|
|
|
|
{
|
|
|
|
|
|
// 查找角色
|
|
|
|
|
|
var sysRole = await _sysRoleRep.GetByIdAsync(input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D1002);
|
|
|
|
|
|
|
|
|
|
|
|
// 新增角色
|
|
|
|
|
|
var newRoleId = YitIdHelper.NextId();
|
|
|
|
|
|
sysRole.Id = newRoleId;
|
|
|
|
|
|
sysRole.Code = $"{sysRole.Code} - copy";
|
|
|
|
|
|
sysRole.Name = $"{sysRole.Name} - copy";
|
|
|
|
|
|
sysRole.CreateTime = DateTime.Now;
|
|
|
|
|
|
sysRole.CreateUserId = null;
|
|
|
|
|
|
sysRole.CreateUserName = null;
|
|
|
|
|
|
sysRole.UpdateTime = null;
|
|
|
|
|
|
sysRole.UpdateUserId = null;
|
|
|
|
|
|
sysRole.UpdateUserName = null;
|
|
|
|
|
|
await _sysRoleRep.InsertAsync(sysRole);
|
|
|
|
|
|
|
|
|
|
|
|
// 复制角色数据范围
|
|
|
|
|
|
await _sysRoleOrgService.CopyRoleOrgByRoleId(input.Id, newRoleId);
|
|
|
|
|
|
|
|
|
|
|
|
// 复制角色菜单数据
|
|
|
|
|
|
await _sysRoleMenuService.CopyRoleMenuByRoleId(input.Id, newRoleId);
|
|
|
|
|
|
|
|
|
|
|
|
// 复制角色接口数据
|
|
|
|
|
|
await _sysRoleApiService.CopyRoleApiByRoleId(input.Id, newRoleId);
|
|
|
|
|
|
|
|
|
|
|
|
// 复制角色表格数据
|
|
|
|
|
|
await _sysRoleTableService.CopyRolTableByRoleId(input.Id, newRoleId);
|
2024-06-15 13:02:35 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 授权角色菜单 🔖
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="input"></param>
|
|
|
|
|
|
/// <returns></returns>
|
2025-03-23 22:17:28 +08:00
|
|
|
|
[DisplayName("授权角色菜单")]
|
2024-06-15 13:02:35 +08:00
|
|
|
|
public async Task GrantMenu(RoleMenuInput input)
|
|
|
|
|
|
{
|
2024-11-25 16:27:14 +08:00
|
|
|
|
if (input.MenuIdList == null || input.MenuIdList.Count < 1) return;
|
2024-08-13 02:35:31 +08:00
|
|
|
|
|
2025-09-05 00:45:32 +08:00
|
|
|
|
//// 将父节点为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 _sysRoleMenuService.GrantRoleMenu(new RoleMenuInput()
|
|
|
|
|
|
//{
|
|
|
|
|
|
// Id = input.Id,
|
|
|
|
|
|
// MenuIdList = menuIds.ToList()
|
|
|
|
|
|
//});
|
|
|
|
|
|
|
2024-06-15 13:02:35 +08:00
|
|
|
|
await _sysRoleMenuService.GrantRoleMenu(input);
|
2025-09-05 00:45:32 +08:00
|
|
|
|
|
|
|
|
|
|
await ClearUserApiCache(input.Id);
|
2024-06-15 13:02:35 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2024-11-25 01:30:10 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 授权角色表格 🔖
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="input"></param>
|
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
|
[UnitOfWork]
|
2025-03-23 22:17:28 +08:00
|
|
|
|
[DisplayName("授权角色表格")]
|
2024-11-25 01:30:10 +08:00
|
|
|
|
public async Task GrantRoleTable(RoleTableInput input)
|
|
|
|
|
|
{
|
|
|
|
|
|
await _sysRoleTableService.GrantRoleTable(input);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-06-15 13:02:35 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 授权角色数据范围 🔖
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="input"></param>
|
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
|
[UnitOfWork]
|
2025-03-23 22:17:28 +08:00
|
|
|
|
[DisplayName("授权角色数据范围")]
|
2024-06-15 13:02:35 +08:00
|
|
|
|
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());
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-11-25 16:27:14 +08:00
|
|
|
|
var role = await _sysRoleRep.GetFirstAsync(u => u.Id == input.Id);
|
2024-06-15 13:02:35 +08:00
|
|
|
|
var dataScope = input.DataScope;
|
|
|
|
|
|
if (!_userManager.SuperAdmin)
|
|
|
|
|
|
{
|
2024-11-25 16:27:14 +08:00
|
|
|
|
switch (dataScope)
|
2024-06-15 13:02:35 +08:00
|
|
|
|
{
|
2025-02-05 13:15:58 +08:00
|
|
|
|
//// 非超级管理员没有全部数据范围权限
|
|
|
|
|
|
//case (int)DataScopeEnum.All: throw Oops.Oh(ErrorCodeEnum.D1016);
|
2024-11-25 16:27:14 +08:00
|
|
|
|
// 若数据范围自定义,则判断授权数据范围是否有权限
|
|
|
|
|
|
case (int)DataScopeEnum.Define:
|
|
|
|
|
|
{
|
|
|
|
|
|
var grantOrgIdList = input.OrgIdList;
|
|
|
|
|
|
if (grantOrgIdList.Count > 0)
|
|
|
|
|
|
{
|
2025-09-05 00:45:32 +08:00
|
|
|
|
var orgIdList = await _sysOrgService.GetUserOrgIdList();
|
2024-11-25 16:27:14 +08:00
|
|
|
|
if (orgIdList.Count < 1) throw Oops.Oh(ErrorCodeEnum.D1016);
|
|
|
|
|
|
if (!grantOrgIdList.All(u => orgIdList.Any(c => c == u))) throw Oops.Oh(ErrorCodeEnum.D1016);
|
|
|
|
|
|
}
|
2025-03-23 22:17:28 +08:00
|
|
|
|
|
2024-11-25 16:27:14 +08:00
|
|
|
|
break;
|
|
|
|
|
|
}
|
2025-02-06 12:28:19 +08:00
|
|
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
|
break;
|
2024-06-15 13:02:35 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
2025-03-23 22:17:28 +08:00
|
|
|
|
|
2024-06-15 13:02:35 +08:00
|
|
|
|
role.DataScope = (DataScopeEnum)dataScope;
|
|
|
|
|
|
await _sysRoleRep.AsUpdateable(role).UpdateColumns(u => new { u.DataScope }).ExecuteCommandAsync();
|
|
|
|
|
|
await _sysRoleOrgService.GrantRoleOrg(input);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
2024-08-13 02:35:31 +08:00
|
|
|
|
/// 授权角色接口 🔖
|
2024-06-15 13:02:35 +08:00
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="input"></param>
|
|
|
|
|
|
/// <returns></returns>
|
2024-08-13 02:35:31 +08:00
|
|
|
|
[UnitOfWork]
|
2025-03-23 22:17:28 +08:00
|
|
|
|
[DisplayName("授权角色接口")]
|
2024-08-13 02:35:31 +08:00
|
|
|
|
public async Task GrantApi(RoleApiInput input)
|
2024-06-15 13:02:35 +08:00
|
|
|
|
{
|
2025-09-05 00:45:32 +08:00
|
|
|
|
await ClearUserApiCache(input.Id);
|
2024-08-13 02:35:31 +08:00
|
|
|
|
await _sysRoleApiService.GrantRoleApi(input);
|
2024-06-15 13:02:35 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-02-06 12:28:19 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 授权角色用户 🔖
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="input"></param>
|
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
|
[UnitOfWork]
|
2025-03-23 22:17:28 +08:00
|
|
|
|
[DisplayName("授权角色用户")]
|
2025-02-06 12:28:19 +08:00
|
|
|
|
public async Task GrantUser(RoleUserInput input)
|
|
|
|
|
|
{
|
|
|
|
|
|
await _sysUserRoleService.GrantRoleUser(input);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-06-15 13:02:35 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 设置角色状态 🔖
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="input"></param>
|
|
|
|
|
|
/// <returns></returns>
|
2025-03-23 22:17:28 +08:00
|
|
|
|
[DisplayName("设置角色状态")]
|
2024-06-15 13:02:35 +08:00
|
|
|
|
public async Task<int> SetStatus(RoleInput input)
|
|
|
|
|
|
{
|
2025-08-15 14:30:23 +08:00
|
|
|
|
if (!Enum.IsDefined(input.Status)) throw Oops.Oh(ErrorCodeEnum.D3005);
|
2024-06-15 13:02:35 +08:00
|
|
|
|
|
2025-09-05 00:45:32 +08:00
|
|
|
|
return await _sysRoleRep.AsUpdateable()
|
|
|
|
|
|
.SetColumns(u => u.Status == input.Status)
|
2024-06-15 13:02:35 +08:00
|
|
|
|
.Where(u => u.Id == input.Id)
|
|
|
|
|
|
.ExecuteCommandAsync();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-11-25 01:30:10 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 获取所有表格字段 🔖
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <returns></returns>
|
2025-03-23 22:17:28 +08:00
|
|
|
|
[DisplayName("获取所有表格字段")]
|
2024-11-25 01:30:10 +08:00
|
|
|
|
public List<RoleTableOutput> GetAllTableColumnList()
|
|
|
|
|
|
{
|
|
|
|
|
|
return _sysRoleTableService.HandleTableColumn();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 获取角色表格字段集合 🔖
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="roleId"></param>
|
|
|
|
|
|
/// <returns></returns>
|
2025-03-23 22:17:28 +08:00
|
|
|
|
[DisplayName("获取角色表格字段集合")]
|
2024-11-25 01:30:10 +08:00
|
|
|
|
public async Task<List<string>> GetRoleTable(long roleId)
|
|
|
|
|
|
{
|
|
|
|
|
|
return await _sysRoleTableService.GetRoleTable(roleId);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 获取当前用户表格字段集合 🔖
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <returns></returns>
|
2025-03-23 22:17:28 +08:00
|
|
|
|
[DisplayName("获取当前用户表格字段集合")]
|
2024-11-25 01:30:10 +08:00
|
|
|
|
public async Task<List<string>> GetUserRoleTableList()
|
|
|
|
|
|
{
|
|
|
|
|
|
return await _sysRoleTableService.GetUserRoleTableList(_userManager, _sysUserRoleService);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-06-15 13:02:35 +08:00
|
|
|
|
/// <summary>
|
2024-08-13 02:35:31 +08:00
|
|
|
|
/// 根据角色Id获取菜单Id集合 🔖
|
2024-06-15 13:02:35 +08:00
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="input"></param>
|
|
|
|
|
|
/// <returns></returns>
|
2025-03-23 22:17:28 +08:00
|
|
|
|
[DisplayName("根据角色Id获取菜单Id集合")]
|
2025-09-05 00:45:32 +08:00
|
|
|
|
public async Task<List<long>> GetOwnMenuList([FromQuery] BaseIdInput input)
|
2024-06-15 13:02:35 +08:00
|
|
|
|
{
|
2024-08-13 02:35:31 +08:00
|
|
|
|
return await _sysRoleMenuService.GetRoleMenuIdList(new List<long> { input.Id });
|
2024-08-13 00:22:16 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
2024-08-13 02:35:31 +08:00
|
|
|
|
/// 根据角色Id获取机构Id集合 🔖
|
2024-08-13 00:22:16 +08:00
|
|
|
|
/// </summary>
|
2024-08-13 02:35:31 +08:00
|
|
|
|
/// <param name="input"></param>
|
2024-08-13 00:22:16 +08:00
|
|
|
|
/// <returns></returns>
|
2025-03-23 22:17:28 +08:00
|
|
|
|
[DisplayName("根据角色Id获取机构Id集合")]
|
2025-09-05 00:45:32 +08:00
|
|
|
|
public async Task<List<long>> GetOwnOrgList([FromQuery] BaseIdInput input)
|
2024-08-13 00:22:16 +08:00
|
|
|
|
{
|
2024-08-13 02:35:31 +08:00
|
|
|
|
return await _sysRoleOrgService.GetRoleOrgIdList(new List<long> { input.Id });
|
2024-06-15 13:02:35 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
2024-08-13 00:22:16 +08:00
|
|
|
|
/// 获取角色接口黑名单集合 🔖
|
2024-06-15 13:02:35 +08:00
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="input"></param>
|
|
|
|
|
|
/// <returns></returns>
|
2025-03-23 22:17:28 +08:00
|
|
|
|
[DisplayName("获取角色接口黑名单集合")]
|
2025-09-05 00:45:32 +08:00
|
|
|
|
public async Task<List<string>> GetRoleApiList([FromQuery] BaseIdInput input)
|
2024-06-15 13:02:35 +08:00
|
|
|
|
{
|
2024-11-25 16:27:14 +08:00
|
|
|
|
return await _sysRoleApiService.GetRoleApiList(new List<long> { input.Id });
|
2025-09-05 00:45:32 +08:00
|
|
|
|
|
|
|
|
|
|
//var roleButtons = await GetRoleButtonList(new List<long> { input.Id });
|
|
|
|
|
|
//return roleApis.Union(roleButtons).ToList();
|
2025-08-31 20:24:51 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-09-05 00:45:32 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 获取用户接口集合 🔖
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
|
[DisplayName("获取用户接口集合")]
|
|
|
|
|
|
public async Task<List<List<string>>> GetUserApiList()
|
|
|
|
|
|
{
|
|
|
|
|
|
var userId = _userManager.UserId;
|
2025-09-15 03:03:23 +08:00
|
|
|
|
var apiList = _sysCacheService.Get<List<List<string>>>($"{CacheConst.KeyUserApi}{userId}");
|
2025-09-05 00:45:32 +08:00
|
|
|
|
if (apiList != null) return apiList;
|
|
|
|
|
|
|
|
|
|
|
|
apiList = [[], []];
|
|
|
|
|
|
// 所有按钮权限集合
|
|
|
|
|
|
var allButtonList = await GetButtonList();
|
|
|
|
|
|
// 超管账号获取所有接口
|
|
|
|
|
|
if (_userManager.SuperAdmin)
|
|
|
|
|
|
{
|
2025-09-14 11:11:04 +08:00
|
|
|
|
var allApiList = _sysCommonService.GetSysAllApiList();
|
2025-09-05 00:45:32 +08:00
|
|
|
|
foreach (var apiOutput in allApiList)
|
|
|
|
|
|
{
|
|
|
|
|
|
foreach (var controller in apiOutput.Children)
|
|
|
|
|
|
apiList[0].AddRange(controller.Children.Select(u => u.Route));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 接口没有对应的按钮权限集合
|
|
|
|
|
|
var diffButtonList = allButtonList.Except(apiList[0]).ToList(); // 差集
|
|
|
|
|
|
apiList[0].AddRange(diffButtonList);
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
// 当前账号所有角色集合
|
|
|
|
|
|
var roleIdList = await _sysUserRoleService.GetUserRoleIdList(_userManager.UserId);
|
|
|
|
|
|
// 已有按钮权限集合
|
|
|
|
|
|
var menuIdList = await _sysRoleMenuService.GetRoleMenuIdList(roleIdList);
|
|
|
|
|
|
apiList[0] = await GetButtonList(menuIdList, false);
|
|
|
|
|
|
|
|
|
|
|
|
// 未有按钮权限集合(放到接口黑名单里面)
|
|
|
|
|
|
apiList[1] = allButtonList.Except(apiList[0]).ToList(); // 差集
|
|
|
|
|
|
// 接口黑名单集合
|
|
|
|
|
|
var roleApiList = await _sysRoleApiService.GetRoleApiList(roleIdList);
|
|
|
|
|
|
apiList[1].AddRange(roleApiList);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 排序接口名称
|
|
|
|
|
|
apiList[0].Sort();
|
|
|
|
|
|
apiList[1].Sort();
|
2025-09-15 03:03:23 +08:00
|
|
|
|
_sysCacheService.Set($"{CacheConst.KeyUserApi}{userId}", apiList, TimeSpan.FromDays(7)); // 缓存7天
|
2025-09-05 00:45:32 +08:00
|
|
|
|
return apiList;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
///// <summary>
|
|
|
|
|
|
///// 获取用户按钮权限集合
|
|
|
|
|
|
///// </summary>
|
|
|
|
|
|
///// <returns></returns>
|
|
|
|
|
|
//[NonAction]
|
|
|
|
|
|
//public async Task<List<string>> GetUserButtonList()
|
|
|
|
|
|
//{
|
|
|
|
|
|
// var menuIdList = new List<long>();
|
|
|
|
|
|
// if (!_userManager.SuperAdmin)
|
|
|
|
|
|
// {
|
|
|
|
|
|
// var roleIdList = await _sysUserRoleService.GetUserRoleIdList(_userManager.UserId);
|
|
|
|
|
|
// menuIdList = await _sysRoleMenuService.GetRoleMenuIdList(roleIdList);
|
|
|
|
|
|
// }
|
|
|
|
|
|
// return await GetButtonList(menuIdList);
|
|
|
|
|
|
//}
|
|
|
|
|
|
|
|
|
|
|
|
///// <summary>
|
|
|
|
|
|
///// 获取角色按钮权限集合
|
|
|
|
|
|
///// </summary>
|
|
|
|
|
|
///// <param name="roleIds"></param>
|
|
|
|
|
|
///// <returns></returns>
|
|
|
|
|
|
//[NonAction]
|
|
|
|
|
|
//public async Task<List<string>> GetRoleButtonList(List<long> roleIds)
|
|
|
|
|
|
//{
|
|
|
|
|
|
// var menuIdList = await _sysRoleMenuService.GetRoleMenuIdList(roleIds);
|
|
|
|
|
|
// return await GetButtonList(menuIdList);
|
|
|
|
|
|
//}
|
|
|
|
|
|
|
2025-03-23 22:17:28 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 根据菜单Id集合获取按钮集合
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="menuIds"></param>
|
|
|
|
|
|
/// <param name="isAll"></param>
|
2024-07-22 02:54:41 +08:00
|
|
|
|
/// <returns></returns>
|
2025-03-10 13:04:22 +08:00
|
|
|
|
private async Task<List<string>> GetButtonList(List<long> menuIds = null, bool isAll = true)
|
2024-07-22 02:54:41 +08:00
|
|
|
|
{
|
2025-03-23 22:17:28 +08:00
|
|
|
|
return await _sysRoleRep.ChangeRepository<SqlSugarRepository<SysMenu>>().AsQueryable()
|
|
|
|
|
|
.WhereIF(menuIds != null && menuIds.Count > 0, u => menuIds.Contains(u.Id))
|
|
|
|
|
|
.WhereIF(!isAll, u => u.Status == StatusEnum.Enable)
|
|
|
|
|
|
.Where(u => u.Type == MenuTypeEnum.Btn)
|
2025-09-05 00:45:32 +08:00
|
|
|
|
.Select(u => u.Permission).ToListAsync();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 删除与该角色相关的用户接口缓存
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="roleId"></param>
|
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
|
[NonAction]
|
|
|
|
|
|
public async Task ClearUserApiCache(long roleId)
|
|
|
|
|
|
{
|
|
|
|
|
|
var userIdList = await _sysUserRoleService.GetUserIdList(roleId);
|
|
|
|
|
|
foreach (var userId in userIdList)
|
|
|
|
|
|
{
|
2025-09-15 03:03:23 +08:00
|
|
|
|
_sysCacheService.Remove($"{CacheConst.KeyUserApi}{userId}");
|
2025-09-05 00:45:32 +08:00
|
|
|
|
}
|
2024-07-22 02:54:41 +08:00
|
|
|
|
}
|
2024-06-15 13:02:35 +08:00
|
|
|
|
}
|