From 925219ebfda2a480df99ca06a13033c78ae8d81f Mon Sep 17 00:00:00 2001 From: huliguo <2023611923@qq.com> Date: 星期五, 30 五月 2025 18:08:16 +0800 Subject: [PATCH] 权限管理+用户管理 --- ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysMenuServiceImpl.java | 73 +++++++++++++++++++++++++++++++++--- 1 files changed, 66 insertions(+), 7 deletions(-) diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysMenuServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysMenuServiceImpl.java index b11c281..caf0287 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysMenuServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysMenuServiceImpl.java @@ -1,13 +1,10 @@ package com.ruoyi.system.service.impl; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashSet; -import java.util.Iterator; -import java.util.LinkedList; -import java.util.List; -import java.util.Set; +import java.util.*; import java.util.stream.Collectors; + +import com.ruoyi.system.pojo.vo.MenuTreeVO; +import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.ruoyi.common.constant.Constants; @@ -540,4 +537,66 @@ return StringUtils.replaceEach(path, new String[] { Constants.HTTP, Constants.HTTPS, Constants.WWW, ".", ":" }, new String[] { "", "", "", "/", "/" }); } + + @Override + public List<MenuTreeVO> tree(Long userId) { + // 构建菜单树 + return buildMenuTree(userId); + } + + /** + * 构建菜单树(递归实现) + * @return 菜单树列表 + */ + public List<MenuTreeVO> buildMenuTree(Long userId) { + // 1. 根据用户ID查询角色ID集合 + List<Long> roleList = roleMapper.selectRoleListByUserId(userId); + // 2. 查询角色关联的菜单ID + List<Long> menuIds = roleMenuMapper.selectMenuIdsByRoleIds(roleList); + // 获取所有菜单 + List<MenuTreeVO> rootMenus = menuMapper.getAllRootMenu(); + // 递归构建子菜单 + List<MenuTreeVO> list = rootMenus.stream() + .map(x -> convertToMenuTreeVO(x,menuIds)) + .collect(Collectors.toList()); + return list.stream().filter(this::shouldIncludeMenu).collect(Collectors.toList()); + + } + + /** + * 递归转换菜单并构建子菜单树 + */ + private MenuTreeVO convertToMenuTreeVO(MenuTreeVO menu,List<Long> menuIds) { + MenuTreeVO vo = new MenuTreeVO(); + BeanUtils.copyProperties(menu, vo, "children"); // 复制基本属性,忽略children字段 + + // 获取当前菜单的子菜单 + List<MenuTreeVO> childMenus = menuMapper.selectMenusByParentId(menu.getMenuId()); + + // 递归处理子菜单 + if (!childMenus.isEmpty()) { + childMenus = childMenus.stream() + .filter(x -> !("C".equals(x.getMenuType()) && !menuIds.contains(x.getMenuId()))) + .collect(Collectors.toList()); + + List<MenuTreeVO> filteredChildren = childMenus.stream() + .map(x -> convertToMenuTreeVO(x,menuIds)) + .filter(this::shouldIncludeMenu) // 过滤子菜单 + .collect(Collectors.toList()); + + vo.setChildren(filteredChildren); + } + + return vo; + } + + /** + * 判断菜单是否应该被包含在结果中 + * - 如果是M类型且没有子菜单,则不包含 + * - 否则包含 + */ + private boolean shouldIncludeMenu(MenuTreeVO menu) { + // 如果菜单类型是M(目录)且没有子菜单,则过滤掉 + return !("M".equals(menu.getMenuType()) && (menu.getChildren() == null || menu.getChildren().isEmpty())); + } } -- Gitblit v1.7.1