2026-02-08 15:57:40 +08:00

190 lines
6.1 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using YD_Event.Application.Role.Dtos;
using YD_Event.Core.Shared;
namespace YD_Event.Application.Role;
/// <summary>
/// 角色管理
/// </summary>
public class SysRoleService : BaseService<SysRole>, ITransient
{
private readonly ISqlSugarRepository<SysRole> _sysRoleRepository;
private readonly ISqlSugarRepository<SysRoleMenu> _sysRoleMenuRepository;
private readonly IEasyCachingProvider _easyCachingProvider;
private readonly IIdGenerator _idGenerator;
public SysRoleService(ISqlSugarRepository<SysRole> sysRoleRepository,
ISqlSugarRepository<SysRoleMenu> sysRoleMenuRepository,
IEasyCachingProvider easyCachingProvider,
IIdGenerator idGenerator) : base(sysRoleRepository)
{
_sysRoleRepository = sysRoleRepository;
_sysRoleMenuRepository = sysRoleMenuRepository;
_easyCachingProvider = easyCachingProvider;
_idGenerator = idGenerator;
}
/// <summary>
/// 角色分页查询
/// </summary>
/// <param name="dto"></param>
/// <returns></returns>
[DisplayName("角色分页查询")]
[HttpGet("page")]
public async Task<PageResult<SysRolePageOutput>> Page([FromQuery] SysRoleQueryInput dto)
{
return await _sysRoleRepository.AsQueryable()
.WhereIF(!string.IsNullOrWhiteSpace(dto.Name), x => x.Name.Contains(dto.Name))
.OrderBy(x => x.Sort)
.OrderByDescending(x => x.Id)
.Select(x => new SysRolePageOutput
{
Id = x.Id,
Name = x.Name,
CreatedTime = x.CreatedTime,
Status = x.Status,
Code = x.Code,
Sort = x.Sort,
Remark = x.Remark
}).ToPagedListAsync(dto);
}
/// <summary>
/// 添加角色
/// </summary>
/// <param name="dto"></param>
/// <returns></returns>
[DisplayName("添加角色")]
[HttpPost("add")]
[UnitOfWork]
public async Task AddRole(AddSysRoleInput dto)
{
var role = dto.Adapt<SysRole>();
role.Id = _idGenerator.NewLong();
// 自动生成Code,避免重复
role.Code = $"Role_{role.Id}";
if (await _sysRoleRepository.IsAnyAsync(x => x.Name == dto.Name))
{
throw new InvalidOperationException($"角色名称 {dto.Name} 已存在");
}
await _sysRoleRepository.InsertAsync(role);
}
/// <summary>
/// 更新角色
/// </summary>
/// <param name="dto"></param>
/// <returns></returns>
[DisplayName("更新角色")]
[HttpPut("edit")]
[UnitOfWork]
public async Task UpdateRole(UpdateSysRoleInput dto)
{
var sysRole = await _sysRoleRepository.GetByIdAsync(dto.Id);
if (sysRole == null)
{
throw new InvalidOperationException("角色不存在");
}
if (await _sysRoleRepository.IsAnyAsync(x => x.Id != dto.Id && x.Name == dto.Name))
{
throw new InvalidOperationException($"角色名称 {dto.Name} 已存在");
}
dto.Adapt(sysRole);
await _sysRoleRepository.UpdateAsync(sysRole);
}
/// <summary>
/// 授权角色权限
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[DisplayName("授权角色权限")]
[HttpPost("grantPermission")]
[UnitOfWork]
public async Task GrantPermission(GrantRolePermissionInput input)
{
var sysRole = await _sysRoleRepository.GetByIdAsync(input.Id);
if (sysRole == null) throw new InvalidOperationException("角色不存在");
var roleMenus = input.MenuIds.Select(x => new SysRoleMenu()
{
MenuId = x,
RoleId = input.Id
}).ToList();
await _sysRoleMenuRepository.DeleteAsync(x => x.RoleId == input.Id);
if (roleMenus.Any())
{
await _sysRoleMenuRepository.InsertRangeAsync(roleMenus);
}
await _easyCachingProvider.RemoveByPrefixAsync(CacheConst.PermissionKey);
}
/// <summary>
/// 获取角色可访问的菜单和按钮id
/// </summary>
/// <param name="id">角色id</param>
/// <returns></returns>
[DisplayName("获取角色可访问的菜单和按钮id")]
[HttpGet("getRoleMenu")]
public async Task<List<long>> GetRoleMenu([FromQuery] long id)
{
return await _sysRoleRepository.AsQueryable()
.InnerJoin<SysRoleMenu>((role, roleMenu) => role.Id == roleMenu.RoleId)
.InnerJoin<SysMenu>((role, roleMenu, menu) => roleMenu.MenuId == menu.Id)
.Where((role, roleMenu, menu) => role.Id == id && menu.Status == AvailabilityStatus.Enable)
.Select((role, roleMenu) => roleMenu.MenuId)
.ToListAsync();
}
/// <summary>
/// 修改角色状态
/// </summary>
/// <param name="dto"></param>
/// <returns></returns>
[DisplayName("修改角色状态")]
[HttpPut("setStatus")]
public override async Task SetStatus(AvailabilityDto dto)
{
await base.SetStatus(dto);
await _easyCachingProvider.RemoveByPrefixAsync(CacheConst.PermissionKey);
}
/// <summary>
/// 删除角色
/// </summary>
/// <param name="dto"></param>
/// <returns></returns>
[DisplayName("删除角色")]
[HttpDelete("delete")]
public override async Task Delete(KeyDto dto)
{
await base.Delete(dto);
// 物理删除关联权限
await _sysRoleMenuRepository.DeleteAsync(x => x.RoleId == dto.Id);
await _easyCachingProvider.RemoveByPrefixAsync(CacheConst.PermissionKey);
}
/// <summary>
/// 角色下拉选项
/// </summary>
/// <returns></returns>
[DisplayName("角色下拉选项")]
[HttpGet("select")]
public async Task<List<SelectOutput>> RoleSelect()
{
return await _sysRoleRepository.AsQueryable().Where(x => x.Status == AvailabilityStatus.Enable)
.OrderBy(x => x.Sort)
.OrderBy(x => x.Id)
.Select(x => new SelectOutput()
{
Value = x.Id,
Label = x.Name
}).ToListAsync();
}
}