RoleMenusAppService.cs 3.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  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. public async Task Update(UpdateRoleMenuDto input)
  30. {
  31. var roleMenus = new List<RoleMenu>();
  32. foreach (var menuId in input.MenuIds)
  33. {
  34. roleMenus.Add(new RoleMenu(input.RoleId, menuId));
  35. }
  36. await _roleMenuRepository.DeleteAsync(_ => _.RoleId == input.RoleId);
  37. await _roleMenuRepository.InsertManyAsync(roleMenus);
  38. }
  39. public async Task<ListResultDto<MenusTreeDto>> GetMenusTree()
  40. {
  41. var menus = await _menuRepository.GetListAsync();
  42. var root = menus.Where(_ => _.Pid == null).OrderBy(_ => _.Sort).ToList();
  43. var dtos = ObjectMapper.Map<List<Menu>, List<MenusTreeDto>>(menus);
  44. return new ListResultDto<MenusTreeDto>(dtos.OrderBy(_ => _.Sort).ToList());
  45. }
  46. /// <summary>
  47. /// 获取当前角色菜单
  48. /// </summary>
  49. /// <returns></returns>
  50. public async Task<ListResultDto<RoleMenusDto>> GetRoleMenus()
  51. {
  52. var roleIds = await (await RoleRepository.GetDbSetAsync()).Where(_ => CurrentUser.Roles.Contains(_.Name)).Select(_ => _.Id).ToListAsync();
  53. var roleMenus = await (await _roleMenuRepository.GetQueryableAsync()).Where(_ => roleIds.Contains(_.RoleId)).Select(_ => _.MenuId).ToListAsync();
  54. var menus = await _menuRepository.GetListAsync(_ => _.CategoryId == 1 && roleMenus.Contains(_.Id));
  55. var root = menus.Where(_ => _.Pid == null).OrderBy(_ => _.Sort).ToList();
  56. return new ListResultDto<RoleMenusDto>(LoadRoleMenusTree(root, menus));
  57. }
  58. public async Task<ListResultDto<Guid>> GetRoleMenuIds(Guid id)
  59. {
  60. var menuIds = await _roleMenuRepository.GetListAsync(_ => _.RoleId == id);
  61. var menus = await _menuRepository.GetListAsync(_ => menuIds.Select(m => m.MenuId).Contains(_.Id));
  62. return new ListResultDto<Guid>(menus.Select(_ => _.Id).ToList());
  63. }
  64. private List<RoleMenusDto> LoadRoleMenusTree(List<Menu> roots, List<Menu> menus)
  65. {
  66. var result = new List<RoleMenusDto>();
  67. foreach (var root in roots)
  68. {
  69. var menu = new RoleMenusDto
  70. {
  71. Path = root.Path,
  72. Name = root.Name,
  73. Component = root.Component,
  74. Meta = new MenuMeta { Icon = root.Icon, Title = root.Name },
  75. AlwaysShow = root.AlwaysShow,
  76. Hidden = root.Hidden
  77. };
  78. if (menus.Where(_ => _.Pid == root.Id).Any())
  79. {
  80. menu.Children = LoadRoleMenusTree(menus.Where(_ => _.Pid == root.Id).OrderBy(_ => _.Sort).ToList(), menus);
  81. }
  82. result.Add(menu);
  83. }
  84. return result;
  85. }
  86. }
  87. }