You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

100 lines
4.2 KiB

using BaseService.Systems.UserRoleMenusManagement.Dto;
using Microsoft.AspNetCore.Authorization;
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Application.Services;
using Volo.Abp.Domain.Repositories;
using Volo.Abp.Identity;
namespace BaseService.Systems.UserMenusManagement
{
[Authorize]
public class RoleMenusAppService : ApplicationService, IRoleMenusAppService
{
public IIdentityRoleRepository RoleRepository { get; }
private readonly IRepository<Menu, Guid> _menuRepository;
private readonly IRepository<RoleMenu> _roleMenuRepository;
public RoleMenusAppService(
IIdentityRoleRepository roleRepository,
IRepository<Menu, Guid> menuRepository,
IRepository<RoleMenu> roleMenuRepository)
{
RoleRepository = roleRepository;
_menuRepository = menuRepository;
_roleMenuRepository = roleMenuRepository;
}
[Authorize(IdentityPermissions.Roles.ManagePermissions)]
public async Task Update(UpdateRoleMenuDto input)
{
var roleMenus = new List<RoleMenu>();
foreach (var menuId in input.MenuIds)
{
roleMenus.Add(new RoleMenu(input.RoleId, menuId));
}
await _roleMenuRepository.DeleteAsync(_ => _.RoleId == input.RoleId);
await _roleMenuRepository.InsertManyAsync(roleMenus);
}
[Authorize(IdentityPermissions.Roles.Default)]
public async Task<ListResultDto<MenusListDto>> GetMenusList()
{
var result = new List<Menu>();
if (!CurrentTenant.Id.HasValue)
result = await _menuRepository.GetListAsync();
else
result = await _menuRepository.GetListAsync(_ => _.IsHost == false);
var dtos = ObjectMapper.Map<List<Menu>, List<MenusListDto>>(result);
return new ListResultDto<MenusListDto>(dtos.OrderBy(_ => _.Sort).ToList());
}
/// <summary>
/// 获取当前角色菜单
/// </summary>
/// <returns></returns>
public async Task<ListResultDto<RoleMenusDto>> GetRoleMenus()
{
var roleIds = await (await RoleRepository.GetDbSetAsync()).Where(_ => CurrentUser.Roles.Contains(_.Name)).Select(_ => _.Id).ToListAsync();
var roleMenus = await (await _roleMenuRepository.GetQueryableAsync()).Where(_ => roleIds.Contains(_.RoleId)).Select(_ => _.MenuId).ToListAsync();
var menus = await _menuRepository.GetListAsync(_ => _.CategoryId == 1 && roleMenus.Contains(_.Id));
var root = menus.Where(_ => _.Pid == null).OrderBy(_ => _.Sort).ToList();
return new ListResultDto<RoleMenusDto>(LoadRoleMenusTree(root, menus));
}
[Authorize(IdentityPermissions.Roles.Default)]
public async Task<ListResultDto<Guid>> GetRoleMenuIds(Guid id)
{
var menuIds = await _roleMenuRepository.GetListAsync(_ => _.RoleId == id);
var menus = await _menuRepository.GetListAsync(_ => menuIds.Select(m => m.MenuId).Contains(_.Id));
return new ListResultDto<Guid>(menus.Select(_ => _.Id).ToList());
}
private List<RoleMenusDto> LoadRoleMenusTree(List<Menu> roots, List<Menu> menus)
{
var result = new List<RoleMenusDto>();
foreach (var root in roots)
{
var menu = new RoleMenusDto
{
Path = root.Path,
Name = root.Name,
Component = root.Component,
Meta = new MenuMeta { Icon = root.Icon, Title = root.Title ?? root.Name, IsAffix = root.IsAffix },
AlwaysShow = root.AlwaysShow,
Hidden = root.Hidden
};
if (menus.Where(_ => _.Pid == root.Id).Any())
{
menu.Children = LoadRoleMenusTree(menus.Where(_ => _.Pid == root.Id).OrderBy(_ => _.Sort).ToList(), menus);
}
result.Add(menu);
}
return result;
}
}
}