zhaopeiqing 1 gadu atpakaļ
vecāks
revīzija
d8405476a5

+ 1 - 1
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/MenuController.java

@@ -93,7 +93,7 @@ public class MenuController {
     @Operation(summary = "通过menuId查询本身及子级树", description = "parentId=0的菜单,表示应用")
     public CommonResult<List<AuthPermissionInfoRespVO.MenuVO>> getListByMenuId(@RequestParam("menuId") Long menuId) {
         List<MenuDO> menuList = menuService.getListByMenuId(menuId);
-        List<AuthPermissionInfoRespVO.MenuVO> menuVOList = AuthConvert.INSTANCE.buildMenuTree(menuList);
+        List<AuthPermissionInfoRespVO.MenuVO> menuVOList = AuthConvert.INSTANCE.buildMenuTree(menuId, menuList);
         return success(menuVOList);
     }
 

+ 55 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/convert/auth/AuthConvert.java

@@ -91,6 +91,61 @@ public interface AuthConvert {
         return filterList(treeNodeMap.values(), node -> ID_ROOT.equals(node.getParentId()));
     }
 
+    /**
+     * 将传入的menuId当作根节点,构建菜单树
+     *
+     * @param menuId
+     * @param menuList
+     * @return
+     */
+    default List<AuthPermissionInfoRespVO.MenuVO> buildMenuTree(Long menuId, List<MenuDO> menuList) {
+        if (CollUtil.isEmpty(menuList)) {
+            return Collections.emptyList();
+        }
+        // 移除按钮
+        menuList.removeIf(menu -> menu.getType().equals(MenuTypeEnum.BUTTON.getType()));
+        // 排序,保证菜单的有序性
+        menuList.sort(Comparator.comparing(MenuDO::getSort));
+        // 构建菜单树
+        Map<Long, AuthPermissionInfoRespVO.MenuVO> treeNodeMap = new LinkedHashMap<>();
+        List<AuthPermissionInfoRespVO.MenuVO> rootNodes = new ArrayList<>();
+        // 转换菜单项到树节点
+        menuList.forEach(menu -> {
+            AuthPermissionInfoRespVO.MenuVO node = AuthConvert.INSTANCE.convertTreeNode(menu);
+            treeNodeMap.put(menu.getId(), node);
+            // 检查是否为根节点
+            if (menu.getId().equals(menuId)) {
+                rootNodes.add(node);
+            }
+        });
+        // 处理父子关系
+        rootNodes.forEach(rootNode -> {
+            rootNode.setChildren(new ArrayList<>());
+            treeNodeMap.values().stream()
+                    .filter(node -> node.getParentId().equals(menuId) && !node.getParentId().equals(null)) // 排除已经是根节点的项
+                    .forEach(childNode -> {
+                        AuthPermissionInfoRespVO.MenuVO parentNode = treeNodeMap.get(childNode.getParentId());
+                        if (parentNode != null) {
+                            if (parentNode.getChildren() == null) {
+                                parentNode.setChildren(new ArrayList<>());
+                            }
+                            parentNode.getChildren().add(childNode);
+                        } else {
+                            // 如果找不到父节点,则将其添加到根节点
+                            rootNode.getChildren().add(childNode);
+                        }
+                    });
+        });
+        // 否则,返回指定menuId的根节点
+        return Collections.singletonList(rootNodes.stream()
+                .filter(node -> node.getId().equals(menuId))
+                .findFirst()
+                .orElseThrow(() -> new IllegalArgumentException("指定的menuId未找到对应的根节点")));
+    }
+
+
+
+
     SocialUserBindReqDTO convert(Long userId, Integer userType, AuthSocialLoginReqVO reqVO);
 
     SmsCodeSendReqDTO convert(AuthSmsSendReqVO reqVO);

+ 2 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/permission/MenuServiceImpl.java

@@ -56,6 +56,7 @@ public class MenuServiceImpl implements MenuService {
     @Override
     @CacheEvict(value = RedisKeyConstants.PERMISSION_MENU_ID_LIST, key = "#createReqVO.permission",
             condition = "#createReqVO.permission != null")
+    @TenantIgnore
     public Long createMenu(MenuSaveVO createReqVO) {
         // 校验父菜单存在
         validateParentMenu(createReqVO.getParentId(), null);
@@ -94,6 +95,7 @@ public class MenuServiceImpl implements MenuService {
     @Transactional(rollbackFor = Exception.class)
     @CacheEvict(value = RedisKeyConstants.PERMISSION_MENU_ID_LIST,
             allEntries = true) // allEntries 清空所有缓存,因为此时不知道 id 对应的 permission 是多少。直接清理,简单有效
+    @TenantIgnore
     public void deleteMenu(Long id) {
         // 校验是否还有子菜单
         if (menuMapper.selectCountByParentId(id) > 0) {