RoleMenusAppService.cs 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. using BaseService.Systems.UserRoleMenusManagement.Dto;
  2. using Microsoft.AspNetCore.Authorization;
  3. using Microsoft.EntityFrameworkCore;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Linq;
  7. using System.Threading.Tasks;
  8. using Volo.Abp.Application.Dtos;
  9. using Volo.Abp.Application.Services;
  10. using Volo.Abp.Domain.Repositories;
  11. using Volo.Abp.Identity;
  12. namespace BaseService.Systems.UserMenusManagement
  13. {
  14. [Authorize]
  15. public class RoleMenusAppService : ApplicationService, IRoleMenusAppService
  16. {
  17. public IIdentityRoleRepository RoleRepository { get; }
  18. private readonly IRepository<Menu, Guid> _menuRepository;
  19. private readonly IRepository<RoleMenu> _roleMenuRepository;
  20. public RoleMenusAppService(
  21. IIdentityRoleRepository roleRepository,
  22. IRepository<Menu, Guid> menuRepository,
  23. IRepository<RoleMenu> roleMenuRepository)
  24. {
  25. RoleRepository = roleRepository;
  26. _menuRepository = menuRepository;
  27. _roleMenuRepository = roleMenuRepository;
  28. }
  29. [Authorize(IdentityPermissions.Roles.ManagePermissions)]
  30. public async Task Update(UpdateRoleMenuDto input)
  31. {
  32. var roleMenus = new List<RoleMenu>();
  33. foreach (var menuId in input.MenuIds)
  34. {
  35. roleMenus.Add(new RoleMenu(input.RoleId, menuId));
  36. }
  37. await _roleMenuRepository.DeleteAsync(_ => _.RoleId == input.RoleId);
  38. await _roleMenuRepository.InsertManyAsync(roleMenus);
  39. }
  40. [Authorize(IdentityPermissions.Roles.Default)]
  41. public async Task<ListResultDto<MenusListDto>> GetMenusList()
  42. {
  43. var result = new List<Menu>();
  44. if (!CurrentTenant.Id.HasValue)
  45. result = await _menuRepository.GetListAsync();
  46. else
  47. result = await _menuRepository.GetListAsync(_ => _.IsHost == false);
  48. var dtos = ObjectMapper.Map<List<Menu>, List<MenusListDto>>(result);
  49. return new ListResultDto<MenusListDto>(dtos.OrderBy(_ => _.Sort).ToList());
  50. }
  51. /// <summary>
  52. /// 获取当前角色菜单
  53. /// </summary>
  54. /// <returns></returns>
  55. public async Task<ListResultDto<RoleMenusDto>> GetRoleMenus()
  56. {
  57. var roleIds = await (await RoleRepository.GetDbSetAsync()).Where(_ => CurrentUser.Roles.Contains(_.Name)).Select(_ => _.Id).ToListAsync();
  58. var roleMenus = await (await _roleMenuRepository.GetQueryableAsync()).Where(_ => roleIds.Contains(_.RoleId)).Select(_ => _.MenuId).ToListAsync();
  59. var menus = await _menuRepository.GetListAsync(_ => _.CategoryId == 1 && roleMenus.Contains(_.Id));
  60. var root = menus.Where(_ => _.Pid == null).OrderBy(_ => _.Sort).ToList();
  61. return new ListResultDto<RoleMenusDto>(LoadRoleMenusTree(root, menus));
  62. }
  63. [Authorize(IdentityPermissions.Roles.Default)]
  64. public async Task<ListResultDto<Guid>> GetRoleMenuIds(Guid id)
  65. {
  66. var menuIds = await _roleMenuRepository.GetListAsync(_ => _.RoleId == id);
  67. var menus = await _menuRepository.GetListAsync(_ => menuIds.Select(m => m.MenuId).Contains(_.Id));
  68. return new ListResultDto<Guid>(menus.Select(_ => _.Id).ToList());
  69. }
  70. private List<RoleMenusDto> LoadRoleMenusTree(List<Menu> roots, List<Menu> menus)
  71. {
  72. var result = new List<RoleMenusDto>();
  73. foreach (var root in roots)
  74. {
  75. var menu = new RoleMenusDto
  76. {
  77. Path = root.Path,
  78. Name = root.Name,
  79. Component = root.Component,
  80. Meta = new MenuMeta { Icon = root.Icon, Title = root.Name },
  81. AlwaysShow = root.AlwaysShow,
  82. Hidden = root.Hidden
  83. };
  84. if (menus.Where(_ => _.Pid == root.Id).Any())
  85. {
  86. menu.Children = LoadRoleMenusTree(menus.Where(_ => _.Pid == root.Id).OrderBy(_ => _.Sort).ToList(), menus);
  87. }
  88. result.Add(menu);
  89. }
  90. return result;
  91. }
  92. }
  93. }