Commit 6419aef36c7a8496407e538bfbfae102c8e49c16

Authored by dongdong.xiang
1 parent 312f7e48

【修复】获取菜单精简信息列表接口没有排除父 ID 非 0 的节点

yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/AuthController.java
@@ -109,6 +109,8 @@ public class AuthController { @@ -109,6 +109,8 @@ public class AuthController {
109 // 1.3 获得菜单列表 109 // 1.3 获得菜单列表
110 Set<Long> menuIds = permissionService.getRoleMenuListByRoleId(convertSet(roles, RoleDO::getId)); 110 Set<Long> menuIds = permissionService.getRoleMenuListByRoleId(convertSet(roles, RoleDO::getId));
111 List<MenuDO> menuList = menuService.getMenuList(menuIds); 111 List<MenuDO> menuList = menuService.getMenuList(menuIds);
  112 + // 过滤掉关闭的菜单及其子菜单
  113 + menuList = menuService.filterClosedMenus(menuList);
112 114
113 // 2. 拼接结果返回 115 // 2. 拼接结果返回
114 return success(AuthConvert.INSTANCE.convert(user, roles, menuList)); 116 return success(AuthConvert.INSTANCE.convert(user, roles, menuList));
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/MenuController.java
@@ -71,7 +71,9 @@ public class MenuController { @@ -71,7 +71,9 @@ public class MenuController {
71 "在多租户的场景下,会只返回租户所在套餐有的菜单") 71 "在多租户的场景下,会只返回租户所在套餐有的菜单")
72 public CommonResult<List<MenuSimpleRespVO>> getSimpleMenuList() { 72 public CommonResult<List<MenuSimpleRespVO>> getSimpleMenuList() {
73 List<MenuDO> list = menuService.getMenuListByTenant( 73 List<MenuDO> list = menuService.getMenuListByTenant(
74 - new MenuListReqVO()); 74 + new MenuListReqVO().setStatus(CommonStatusEnum.ENABLE.getStatus()));
  75 + // 过滤掉关闭的菜单及其子菜单
  76 + list = menuService.filterClosedMenus(list);
75 list.sort(Comparator.comparing(MenuDO::getSort)); 77 list.sort(Comparator.comparing(MenuDO::getSort));
76 return success(BeanUtils.toBean(list, MenuSimpleRespVO.class)); 78 return success(BeanUtils.toBean(list, MenuSimpleRespVO.class));
77 } 79 }
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/permission/MenuService.java
@@ -53,6 +53,14 @@ public interface MenuService { @@ -53,6 +53,14 @@ public interface MenuService {
53 List<MenuDO> getMenuListByTenant(MenuListReqVO reqVO); 53 List<MenuDO> getMenuListByTenant(MenuListReqVO reqVO);
54 54
55 /** 55 /**
  56 + * 过滤掉关闭的菜单及其子菜单
  57 + *
  58 + * @param menuList
  59 + * @return
  60 + */
  61 + List<MenuDO> filterClosedMenus(List<MenuDO> menuList);
  62 +
  63 + /**
56 * 筛选菜单列表 64 * 筛选菜单列表
57 * 65 *
58 * @param reqVO 筛选条件请求 VO 66 * @param reqVO 筛选条件请求 VO
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/permission/MenuServiceImpl.java
@@ -109,7 +109,7 @@ public class MenuServiceImpl implements MenuService { @@ -109,7 +109,7 @@ public class MenuServiceImpl implements MenuService {
109 @Override 109 @Override
110 public List<MenuDO> getMenuListByTenant(MenuListReqVO reqVO) { 110 public List<MenuDO> getMenuListByTenant(MenuListReqVO reqVO) {
111 // 查询所有菜单,并过滤掉关闭的节点 111 // 查询所有菜单,并过滤掉关闭的节点
112 - List<MenuDO> menus = filterClosedNodes(getMenuList(reqVO)); 112 + List<MenuDO> menus = getMenuList(reqVO);
113 // 开启多租户的情况下,需要过滤掉未开通的菜单 113 // 开启多租户的情况下,需要过滤掉未开通的菜单
114 tenantService.handleTenantMenu(menuIds -> menus.removeIf(menu -> !CollUtil.contains(menuIds, menu.getId()))); 114 tenantService.handleTenantMenu(menuIds -> menus.removeIf(menu -> !CollUtil.contains(menuIds, menu.getId())));
115 return menus; 115 return menus;
@@ -119,9 +119,13 @@ public class MenuServiceImpl implements MenuService { @@ -119,9 +119,13 @@ public class MenuServiceImpl implements MenuService {
119 * 过滤关闭的菜单节点及其子节点 119 * 过滤关闭的菜单节点及其子节点
120 * 120 *
121 * @param menuList 所有菜单列表 121 * @param menuList 所有菜单列表
122 - * @return 过滤后的菜单列表 122 + * @return
123 */ 123 */
124 - public List<MenuDO> filterClosedNodes(List<MenuDO> menuList) { 124 + @Override
  125 + public List<MenuDO> filterClosedMenus(List<MenuDO> menuList) {
  126 + if(CollectionUtils.isEmpty(menuList)){
  127 + return Collections.emptyList();
  128 + }
125 // 根据parentId快速查找子节点 129 // 根据parentId快速查找子节点
126 Map<Long, List<MenuDO>> childrenMap = menuList.stream() 130 Map<Long, List<MenuDO>> childrenMap = menuList.stream()
127 .collect(Collectors.groupingBy(MenuDO::getParentId)); 131 .collect(Collectors.groupingBy(MenuDO::getParentId));
@@ -135,8 +139,7 @@ public class MenuServiceImpl implements MenuService { @@ -135,8 +139,7 @@ public class MenuServiceImpl implements MenuService {
135 markClosedNodes(menu.getId(), childrenMap, closedNodeIds); 139 markClosedNodes(menu.getId(), childrenMap, closedNodeIds);
136 } 140 }
137 } 141 }
138 -  
139 - // 过滤掉关闭的节点及其子节点 142 + // 移除掉关闭的节点及其子节点
140 return menuList.stream() 143 return menuList.stream()
141 .filter(menu -> !closedNodeIds.contains(menu.getId())) 144 .filter(menu -> !closedNodeIds.contains(menu.getId()))
142 .collect(Collectors.toList()); 145 .collect(Collectors.toList());
@@ -152,12 +155,13 @@ public class MenuServiceImpl implements MenuService { @@ -152,12 +155,13 @@ public class MenuServiceImpl implements MenuService {
152 private void markClosedNodes(Long nodeId, Map<Long, 155 private void markClosedNodes(Long nodeId, Map<Long,
153 List<MenuDO>> childrenMap, 156 List<MenuDO>> childrenMap,
154 Set<Long> closedNodeIds) { 157 Set<Long> closedNodeIds) {
155 - closedNodeIds.add(nodeId);  
156 - List<MenuDO> children = childrenMap.get(nodeId);  
157 - if (CollectionUtils.isNotEmpty(children)) {  
158 - for (MenuDO child : children) {  
159 - markClosedNodes(child.getId(), childrenMap, closedNodeIds);  
160 - } 158 + // 如果已经标记过,则直接返回
  159 + if (!closedNodeIds.add(nodeId)) {
  160 + return;
  161 + }
  162 + List<MenuDO> children = childrenMap.getOrDefault(nodeId,Collections.emptyList());
  163 + for (MenuDO child : children) {
  164 + markClosedNodes(child.getId(), childrenMap, closedNodeIds);
161 } 165 }
162 } 166 }
163 167
@@ -185,7 +189,7 @@ public class MenuServiceImpl implements MenuService { @@ -185,7 +189,7 @@ public class MenuServiceImpl implements MenuService {
185 if (CollUtil.isEmpty(ids)) { 189 if (CollUtil.isEmpty(ids)) {
186 return Lists.newArrayList(); 190 return Lists.newArrayList();
187 } 191 }
188 - return filterClosedNodes(menuMapper.selectBatchIds(ids)); 192 + return menuMapper.selectBatchIds(ids);
189 } 193 }
190 194
191 /** 195 /**