namespace MiaoYu.Api.Admin.ApplicationServices.Systems;
///
/// 系统权限服务
///
public class PermissionService : IPermissionService
{
private readonly IRepository _sysFunctionRepository;
private readonly IRepository _sysMenuFunctionRepository;
private readonly IRepository _sysRoleMenuFunctionRepository;
private readonly IRepository _sysMenuRepository;
private readonly IAccountService _accountService;
public PermissionService(IRepository sysFunctionRepository,
IRepository sysMenuFunctionRepository,
IRepository sysRoleMenuFunctionRepository,
IRepository sysMenuRepository,
IAccountService accountService)
{
_sysFunctionRepository = sysFunctionRepository;
_sysMenuFunctionRepository = sysMenuFunctionRepository;
_sysRoleMenuFunctionRepository = sysRoleMenuFunctionRepository;
_sysMenuRepository = sysMenuRepository;
_accountService = accountService;
}
///
/// 获取拥有的菜单对象的权限
///
///
///
public async Task>> GetPowerByMenusAsync(List sysMenuList)
{
var accountContext = _accountService.GetAccountContext();
var sysMenuFunctionList = await _sysMenuFunctionRepository.Select
.Where(w => sysMenuList.Select(w => w.Id).Contains(w.MenuId))
.ToListAsync()
;
var sysRoleMenuFunctionList = await _sysRoleMenuFunctionRepository.Select
.Where(w => accountContext.SysRoles.Select(w => w.Id).Contains(w.RoleId))
.ToListAsync()
;
var res = new List>();
foreach (var item in sysMenuList)
{
var power = new Dictionary
{
["MenuId"] = item.Id
};
foreach (var sysMenuFunction in sysMenuFunctionList.Where(w => w.MenuId == item.Id))
{
// 管理员角色特殊处理
if (accountContext.IsAdministrator)
{
power[sysMenuFunction.FunctionCode] = true;
continue;
}
//其他角色处理
if (accountContext.SysRoles.Count() > 0)
{
var isPower = sysRoleMenuFunctionList
.Where(w => accountContext.SysRoles.Select(w => w.Id).Contains(w.RoleId))
.Where(w => w.MenuId == item.Id && w.MenuFunctionId == sysMenuFunction.Id)
.Any();
power[sysMenuFunction.FunctionCode] = isPower;
}
else
{
power[sysMenuFunction.FunctionCode] = false;
}
}
res.Add(power);
}
return res;
}
///
/// 根据菜单获取权限
///
///
///
public async Task> GetPowerStateByMenuIdAsync(int menuId)
{
if (!_sysMenuRepository.Select.Any(w => w.Id == menuId))
{
MessageBox.Show("菜单 id 不存在! 请检查控制器 菜单 id 是否设置正确。");
}
var sysMenus = await _sysMenuRepository.Select.Where(w => w.Id == menuId).ToListAsync();
return (await GetPowerByMenusAsync(sysMenus)).FirstOrDefault();
}
}