Kaynağa Gözat

完成角色菜单

tsurumure 7 ay önce
ebeveyn
işleme
f576a7268e

+ 2 - 1
db/sys_user_role.sql

@@ -21,5 +21,6 @@ CREATE TABLE `sys_user_role` (
 
 INSERT INTO sys_user_role(role_name, role_description, sort) VALUES
     ('管理员', '全部权限', 1),
-    ('普通用户', '普通使用权限,没有管理权限', 2)
+    ('普通用户', '普通使用权限,没有管理权限', 2),
+    ('测试角色', '测试角色权限', 3)
 ;

+ 40 - 39
db/sys_user_role_menu.sql

@@ -11,6 +11,7 @@ CREATE TABLE `sys_user_role_menu` (
     `parent_id` BIGINT DEFAULT '-1' COMMENT '父ID',
     `menu_name` VARCHAR(255) NOT NULL COMMENT '标题',
     `menu_name_en` VARCHAR(255) NOT NULL COMMENT '标题 (英文)',
+    `type` TINYINT(1) NOT NULL COMMENT '菜单类型 (1菜单, 2按钮)',
     `path` VARCHAR(1000) NOT NULL COMMENT '路由',
     `component` VARCHAR(255) COMMENT '组件路径',
     `meta` VARCHAR(255) NOT NULL DEFAULT '{}' COMMENT '路由元信息,以 JSON 格式存储',
@@ -20,54 +21,54 @@ CREATE TABLE `sys_user_role_menu` (
     `status` TINYINT(1) DEFAULT '1' COMMENT '菜单状态 (-1禁用, 1启用)'
 ) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='系统菜单表';
 
-INSERT INTO sys_user_role_menu(id, parent_id, menu_name, menu_name_en, path, component, meta, icon, permission_id, sort) VALUES
-    (1, -1, '创意中心', 'Idea Center', '/', '/src/views/home/ideaCenter.vue', '{}', 'House', '2', 1),
+INSERT INTO sys_user_role_menu(id, parent_id, menu_name, menu_name_en, type, path, component, meta, icon, permission_id, sort) VALUES
+    (1, -1, '创意中心', 'Idea Center', 1, '/', '/src/views/home/ideaCenter.vue', '{}', 'House', '2', 1),
 
-#     (-1, '商城管理', 'B2c', '/b2c/good', '', '{}', 'Goods', '11', 2),
-#     (2, '商品管理', 'Goods', '/b2c/good/b2cGood', '/src/views/b2c/good/b2cGood.vue', '{}', null, '11.1', 3),
-#     (2, '商品详情', 'Goods Detail', '/b2c/good/b2cGoodDetail', '/src/views/b2c/good/b2cGoodDetail.vue', '{"isBack":true,"isHide":true}', null, '11.1.1', 3),
-#     (2, '商品分类', 'Goods Categories', '/b2c/good/b2cGoodCategory', '/src/views/b2c/good/b2cGoodCategory.vue', '{}', null, '11.2', 4),
-#     (2, '商品分类详情', 'Goods Categories Detail', '/b2c/good/b2cGoodCategoryDetail', '/src/views/b2c/good/b2cGoodCategoryDetail.vue', '{"isBack":true,"isHide":true}', null, '11.2.1', 4),
-#     (2, '商品品牌', 'Goods Brands', '/b2c/good/b2cGoodBrand', '/src/views/b2c/good/b2cGoodBrand.vue', '{}', null, '11.3', 5),
-#     (2, '商品品牌详情', 'Goods Brands Detail', '/b2c/good/b2cGoodBrandDetail', '/src/views/b2c/good/b2cGoodBrandDetail.vue', '{"isBack":true,"isHide":true}', null, '11.3.1', 5),
-#     (2, '商品单位', 'Goods Units', '/b2c/good/b2cGoodUnit', '/src/views/b2c/good/b2cGoodUnit.vue', '{}', null, '11.4', 6),
-#     (2, '商品单位详情', 'Goods Units Detail', '/b2c/good/b2cGoodUnitDetail', '/src/views/b2c/good/b2cGoodUnitDetail.vue', '{"isBack":true,"isHide":true}', null, '11.4.1', 6),
+#     (-1, '商城管理', 'B2c', 1, '/b2c/good', '', '{}', 'Goods', '11', 2),
+#     (2, '商品管理', 'Goods', 1, '/b2c/good/b2cGood', '/src/views/b2c/good/b2cGood.vue', '{}', null, '11.1', 3),
+#     (2, '商品详情', 'Goods Detail', 2, '/b2c/good/b2cGoodDetail', '/src/views/b2c/good/b2cGoodDetail.vue', '{"isBack":true,"isHide":true}', null, '11.1.1', 3),
+#     (2, '商品分类', 'Goods Categories', 1, '/b2c/good/b2cGoodCategory', '/src/views/b2c/good/b2cGoodCategory.vue', '{}', null, '11.2', 4),
+#     (2, '商品分类详情', 'Goods Categories Detail', 2, '/b2c/good/b2cGoodCategoryDetail', '/src/views/b2c/good/b2cGoodCategoryDetail.vue', '{"isBack":true,"isHide":true}', null, '11.2.1', 4),
+#     (2, '商品品牌', 'Goods Brands', 1, '/b2c/good/b2cGoodBrand', '/src/views/b2c/good/b2cGoodBrand.vue', '{}', null, '11.3', 5),
+#     (2, '商品品牌详情', 'Goods Brands Detail', 2, '/b2c/good/b2cGoodBrandDetail', '/src/views/b2c/good/b2cGoodBrandDetail.vue', '{"isBack":true,"isHide":true}', null, '11.3.1', 5),
+#     (2, '商品单位', 'Goods Units', 1, '/b2c/good/b2cGoodUnit', '/src/views/b2c/good/b2cGoodUnit.vue', '{}', null, '11.4', 6),
+#     (2, '商品单位详情', 'Goods Units Detail', 2, '/b2c/good/b2cGoodUnitDetail', '/src/views/b2c/good/b2cGoodUnitDetail.vue', '{"isBack":true,"isHide":true}', null, '11.4.1', 6),
 #
-#     (2, '订单管理', 'Orders', '/b2c/order/b2cOrder', '/src/views/b2c/order/b2cOrder.vue', '{}', null, null, 4),
-#     (2, '订单详情', 'Orders Detail', '/b2c/order/b2cOrderDetail', '/src/views/b2c/order/b2cOrderDetail.vue', '{"isBack":true,"isHide":true}', null, null, 4),
+#     (2, '订单管理', 'Orders', 1, '/b2c/order/b2cOrder', '/src/views/b2c/order/b2cOrder.vue', '{}', null, null, 4),
+#     (2, '订单详情', 'Orders Detail', 2, '/b2c/order/b2cOrderDetail', '/src/views/b2c/order/b2cOrderDetail.vue', '{"isBack":true,"isHide":true}', null, null, 4),
 #
-#     (-1, '内容管理', 'CMS', '/cms', '', '{}', 'Document', '12', 5),
-#     (13, '页面管理', 'Pages', '/cms/page/cmsPage', '/src/views/cms/page/cmsPage.vue', '{}', 'Document', '12.1', 5),
+#     (-1, '内容管理', 'CMS', 1, '/cms', '', '{}', 'Document', '12', 5),
+#     (13, '页面管理', 'Pages', 1, '/cms/page/cmsPage', '/src/views/cms/page/cmsPage.vue', '{}', 'Document', '12.1', 5),
 #
-#     (13, '资讯管理', 'Articles', '/cms/article/cmsArticle', '/src/views/cms/article/cmsArticle.vue', '{}', null, '10.3', 6),
-#     (13, '资讯详情', 'Articles Detail', '/cms/article/cmsArticleDetail', '/src/views/cms/article/cmsArticleDetail.vue', '{"isBack":true,"isHide":true}', null, '10.3.1', 6),
-#     (13, '资讯分类管理', 'Articles Categories', '/cms/article/cmsArticleCategory', '/src/views/cms/article/cmsArticleCategory.vue', '{}', null, '10.2', 7),
-#     (13, '资讯分类详情', 'Articles Categorie Detail', '/cms/article/cmsArticleCategoryDetail', '/src/views/cms/article/cmsArticleCategoryDetail.vue', '{"isBack":true,"isHide":true}', null, '10.2.1', 7),
-#     (13, '幻灯片管理', 'Banners', '/cms/banner/cmsBanner', '/src/views/cms/banner/cmsBanner.vue', '{}', null, '10.1', 8),
-#     (13, '幻灯片详情', 'Banners Detail', '/cms/banner/cmsBannerDetail', '/src/views/cms/banner/cmsBannerDetail.vue', '{"isBack":true,"isHide":true}', null, '10.1.1', 8),
+#     (13, '资讯管理', 'Articles', 1, '/cms/article/cmsArticle', '/src/views/cms/article/cmsArticle.vue', '{}', null, '10.3', 6),
+#     (13, '资讯详情', 'Articles Detail', 2, '/cms/article/cmsArticleDetail', '/src/views/cms/article/cmsArticleDetail.vue', '{"isBack":true,"isHide":true}', null, '10.3.1', 6),
+#     (13, '资讯分类管理', 'Articles Categories', 1, '/cms/article/cmsArticleCategory', '/src/views/cms/article/cmsArticleCategory.vue', '{}', null, '10.2', 7),
+#     (13, '资讯分类详情', 'Articles Categorie Detail', 2, '/cms/article/cmsArticleCategoryDetail', '/src/views/cms/article/cmsArticleCategoryDetail.vue', '{"isBack":true,"isHide":true}', null, '10.2.1', 7),
+#     (13, '幻灯片管理', 'Banners', 1, '/cms/banner/cmsBanner', '/src/views/cms/banner/cmsBanner.vue', '{}', null, '10.1', 8),
+#     (13, '幻灯片详情', 'Banners Detail', 2, '/cms/banner/cmsBannerDetail', '/src/views/cms/banner/cmsBannerDetail.vue', '{"isBack":true,"isHide":true}', null, '10.1.1', 8),
 
-#     (13, '站点信息', 'SiteInfo', '/cms/site/cmsSiteInfo', '/src/views/cms/site/cmsSiteInfo.vue', '{}', null, '13', 9),
+#     (13, '站点信息', 'SiteInfo', 1, '/cms/site/cmsSiteInfo', '/src/views/cms/site/cmsSiteInfo.vue', '{}', null, '13', 9),
 
-    (2, -1, 'AI文案', 'AI Copywriting', '/ai/copywriting', '/src/views/ai/copywriting.vue', '{}', 'Document', '31', 10),
-    (3, -1, 'AI作画', 'AI Image Generator', '/ai/imageGenerator', '/src/views/ai/imageGenerator.vue', '{}', 'Picture', '32', 10),
+    (2, -1, 'AI文案', 'AI Copywriting', 1, '/ai/copywriting', '/src/views/ai/copywriting.vue', '{}', 'Document', '31', 10),
+    (3, -1, 'AI作画', 'AI Image Generator', 1, '/ai/imageGenerator', '/src/views/ai/imageGenerator.vue', '{}', 'Picture', '32', 10),
 
-#     (-1, '素材管理', 'Material', '/material', '', '{}', 'MessageBox', '20', 10),
-#     (4, '素材中心', 'Material', '/material/center', '/src/views/material/materialCenter.vue', '{}', null, '20.3', 10),
-#     (4, '素材列表', 'Material List', '/material/list', '/src/views/material/materialList.vue', '{}', null, '20.1', 10),
-#     (4, '素材分类', 'Material Category', '/material/category', '/src/views/material/materialCategory.vue', '{}', null, '20.2', 10),
+#     (-1, '素材管理', 'Material', 1, '/material', '', '{}', 'MessageBox', '20', 10),
+#     (4, '素材中心', 'Material', 1, '/material/center', '/src/views/material/materialCenter.vue', '{}', null, '20.3', 10),
+#     (4, '素材列表', 'Material List', 1, '/material/list', '/src/views/material/materialList.vue', '{}', null, '20.1', 10),
+#     (4, '素材分类', 'Material Category', 1, '/material/category', '/src/views/material/materialCategory.vue', '{}', null, '20.2', 10),
 #
-#     (-1, '我的', 'Account', '/account', '', '{}', 'User', '21', 11),
-#     (8, '我的素材', 'My Material', '/account/myMaterial', '', '{}', null, '21.1', 11),
-#     (8, '我的作品', 'My Work', '/account/myWork', '', '{}', null, '21.2', 11),
-#     (8, '我的草稿', 'My Draft', '/account/myDraft', '', '{}', null, '21.3', 11),
+#     (-1, '我的', 'Account', 1, '/account', '', '{}', 'User', '21', 11),
+#     (8, '我的素材', 'My Material', 1, '/account/myMaterial', '', '{}', null, '21.1', 11),
+#     (8, '我的作品', 'My Work', 1, '/account/myWork', '', '{}', null, '21.2', 11),
+#     (8, '我的草稿', 'My Draft', 1, '/account/myDraft', '', '{}', null, '21.3', 11),
 
-    (12, -1, '系统管理', 'Systems', '/system', '', '{}', 'Setting', '3', 12),
-    (13, 12, '用户管理', 'Users', '/system/sysUser', '/src/views/system/sysUser/sysUserList.vue', '{}', null, '3.2', 12),
-    (14, 12, '用户详情', 'Users Detail', '/system/sysUserDetail', '/src/views/system/sysUser/sysUserDetail.vue', '{"isBack":true,"isHide":true}', null, '3.2.1', 12),
-    (15, 12, '角色管理', 'Users Roles', '/system/sysUserRole', '/src/views/system/sysUserRole/sysUserRoleList.vue', '{}', null, '4.1', 12),
-    (16, 12, '角色详情', 'Users Role Detail', '/system/sysUserRoleDetail', '/src/views/system/sysUserRole/sysUserRoleDetail.vue', '{"isBack":true,"isHide":true}', null, '4.1.1', 12),
-    (17, 12, '系统权限', 'System Permission', '/system/sysPermission', '/src/views/system/sysMenu/sysPermission.vue', '{}', null, '3.4', 12),
-    (18, 12, '系统菜单', 'System Menu', '/system/sysMenu', '/src/views/system/sysMenu/sysMenu.vue', '{}', null, '3.5', 12)
+    (12, -1, '系统管理', 'Systems', 1, '/system', '', '{}', 'Setting', '3', 12),
+    (13, 12, '用户管理', 'Users', 1, '/system/sysUser', '/src/views/system/sysUser/sysUserList.vue', '{}', null, '3.2', 12),
+    (14, 12, '用户详情', 'Users Detail', 2, '/system/sysUserDetail', '/src/views/system/sysUser/sysUserDetail.vue', '{"isBack":true,"isHide":true}', null, '3.2.1', 12),
+    (15, 12, '角色管理', 'Users Roles', 1, '/system/sysUserRole', '/src/views/system/sysUserRole/sysUserRoleList.vue', '{}', null, '4.1', 12),
+    (16, 12, '角色详情', 'Users Role Detail', 2, '/system/sysUserRoleDetail', '/src/views/system/sysUserRole/sysUserRoleDetail.vue', '{"isBack":true,"isHide":true}', null, '4.1.1', 12),
+    (17, 12, '系统权限', 'System Permission', 1, '/system/sysPermission', '/src/views/system/sysMenu/sysPermission.vue', '{}', null, '3.4', 12),
+    (18, 12, '系统菜单', 'System Menu', 1, '/system/sysMenu', '/src/views/system/sysMenu/sysMenu.vue', '{}', null, '3.5', 12)
 ;
 
 

+ 8 - 1
db/sys_user_role_permission_relation.sql

@@ -111,6 +111,13 @@ INSERT INTO sys_user_role_permission_relation(role_id, permission_id) VALUES
     (2, '32'),
     (2, '33'),
     (2, '34'),
-    (2, '35')
+    (2, '35'),
 
+    (3, '3'),
+        (3, '3.1'),
+        (3, '3.2'),
+            (3, '3.2.1'), (1, '3.2.1.2'), (1, '3.2.2'),
+    (3, '4'),
+        (3, '4.1'),
+            (3, '4.1.1'), (3, '4.1.2'), (3, '4.1.3'), (3, '4.1.4'), (3, '4.1.5')
 ;

+ 1 - 1
db/sys_user_role_relation.sql

@@ -15,7 +15,7 @@ CREATE TABLE `sys_user_role_relation` (
 ) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='系统用户角色关系表';
 
 INSERT INTO sys_user_role_relation(user_id, role_id) VALUES
-    (1, 1), (2, 1), (3, 2), (4, 2), (5, 2), (6, 2),
+    (1, 3), (2, 1), (3, 2), (4, 2), (5, 2), (6, 2),
     (7, 2), (8, 2), (9, 2), (10, 2), (11, 2), (12, 2),
     (13, 1), (14, 1), (15, 1), (16, 1)
 ;

+ 71 - 0
src/main/java/com/backendsys/modules/common/utils/TreeUtil.java

@@ -0,0 +1,71 @@
+package com.backendsys.modules.common.utils;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+public class TreeUtil {
+
+    /**
+     * 构建树型结构
+     */
+    public static List<Map<String, Object>> buildTree(List<Map<String, Object>> list) {
+        // 将原始列表转换为 Map,以便快速查找
+        Map<Long, Map<String, Object>> idToMenuMap = list.stream()
+                .collect(Collectors.toMap(menu -> (Long) menu.get("id"), menu -> menu));
+
+        // 构建树型结构
+        List<Map<String, Object>> treeList = new ArrayList<>();
+        for (Map<String, Object> menu : list) {
+            Long parentId = (Long) menu.get("parent_id");
+            if (parentId == null || parentId == -1) {
+                // 如果没有父级,即为根节点,直接添加到树型结构列表中
+                treeList.add(menu);
+            } else {
+                // 如果有父级,找到父级菜单并添加到其 children 列表中
+                Map<String, Object> parentMenu = idToMenuMap.get(parentId);
+                if (parentMenu != null) {
+                    List<Map<String, Object>> children = (List<Map<String, Object>>) parentMenu.get("children");
+                    if (children == null) {
+                        children = new ArrayList<>();
+                        parentMenu.put("children", children);
+                    }
+                    children.add(menu);
+                }
+            }
+        }
+
+        // 递归构建子级菜单的树型结构
+        treeList.forEach(menu -> buildChildrenTree(menu, idToMenuMap));
+
+        return treeList;
+    }
+
+    /**
+     * 递归构建子级菜单的树型结构
+     *
+     * @param menu        当前菜单
+     * @param idToMenuMap 菜单 ID 到菜单的映射
+     */
+    private static void buildChildrenTree(Map<String, Object> menu, Map<Long, Map<String, Object>> idToMenuMap) {
+        List<Map<String, Object>> children = (List<Map<String, Object>>) menu.get("children");
+        if (children != null) {
+            for (Map<String, Object> child : children) {
+                buildChildrenTree(child, idToMenuMap);
+            }
+        } else {
+            Long id = (Long) menu.get("id");
+            List<Map<String, Object>> childList = idToMenuMap.values().stream()
+                    .filter(m -> id.equals(m.get("parent_id")))
+                    .collect(Collectors.toList());
+            if (!childList.isEmpty()) {
+                menu.put("children", childList);
+                for (Map<String, Object> child : childList) {
+                    buildChildrenTree(child, idToMenuMap);
+                }
+            }
+        }
+    }
+
+}

+ 1 - 1
src/main/java/com/backendsys/modules/system/controller/SysUserRoleMenuController.java

@@ -27,7 +27,7 @@ public class SysUserRoleMenuController {
     @PreAuthorize("@sr.hasPermission('4.3')")
     @GetMapping("/api/system/user/getUserRoleMenu")
     public Result getUserRoleMenu() {
-        return Result.success().put("data", Map.of("list", sysUserRoleMenuService.selectUserRoleMenuList(null)));
+        return Result.success().put("data", Map.of("list", sysUserRoleMenuService.selectUserRoleMenuList(null, null)));
     }
 
     @Operation(summary = "获取系统用户菜单详情")

+ 1 - 1
src/main/java/com/backendsys/modules/system/dao/SysUserRoleMenuDao.java

@@ -10,6 +10,6 @@ import java.util.Map;
 @Mapper
 public interface SysUserRoleMenuDao extends BaseMapper<SysUserRoleMenu> {
 
-    List<Map<String, Object>> selectUserRoleMenuList(List<String> permission_ids);
+    List<Map<String, Object>> selectUserRoleMenuList(List<String> permission_ids, Integer type);
 
 }

+ 5 - 2
src/main/java/com/backendsys/modules/system/entity/SysUserRoleMenu.java

@@ -32,11 +32,14 @@ public class SysUserRoleMenu {
 
     private Long parent_id;
 
-    @Size(min = 2, max = 20, message = "角色名称长度在 {min}-{max} 字符", groups = { Create.class, Update.class })
+    @Size(min = 2, max = 20, message = "菜单名称长度在 {min}-{max} 字符", groups = { Create.class, Update.class })
     private String menu_name;
-    @Size(min = 2, max = 20, message = "角色名称长度在 {min}-{max} 字符", groups = { Create.class, Update.class })
+    @Size(min = 2, max = 20, message = "菜单名称长度在 {min}-{max} 字符", groups = { Create.class, Update.class })
     private String menu_name_en;
 
+    @RangeArray(message="菜单类型取值有误,范围应是(1菜单, 2按钮)", value = {"1", "2"}, groups = { Create.class, Update.class })
+    private Integer type;
+
     @NotEmpty(message="跳转路径不能为空", groups = { Create.class, Update.class })
     private String path;
     private String component;

+ 1 - 1
src/main/java/com/backendsys/modules/system/service/SysUserRoleMenuService.java

@@ -9,7 +9,7 @@ import java.util.Map;
 public interface SysUserRoleMenuService {
 
     // 获取系统用户角色菜单列表
-    List<Map<String, Object>> selectUserRoleMenuList(List<String> permission_ids);
+    List<Map<String, Object>> selectUserRoleMenuList(List<String> permission_ids, Integer type);
 
     // 获取系统用户角色菜单详情
     SysUserRoleMenu selectUserRoleMenuDetail(SysUserRoleMenu sysUserRoleMenu);

+ 4 - 31
src/main/java/com/backendsys/modules/system/service/impl/SysUserRoleMenuServiceImpl.java

@@ -3,6 +3,7 @@ package com.backendsys.modules.system.service.impl;
 import cn.hutool.core.convert.Convert;
 import cn.hutool.core.util.StrUtil;
 import com.backendsys.exception.CustException;
+import com.backendsys.modules.common.utils.TreeUtil;
 import com.backendsys.modules.system.dao.SysUserRoleMenuDao;
 import com.backendsys.modules.system.dao.SysUserRolePermissionDao;
 import com.backendsys.modules.system.entity.SysUserRoleMenu;
@@ -80,40 +81,12 @@ public class SysUserRoleMenuServiceImpl implements SysUserRoleMenuService {
 //    }
 
 
-    // 转为树型结构 (Map)
-    public static List<Map<String, Object>> buildTreeToMap(List<Map<String, Object>> menuList) {
-        Map<Long, Map<String, Object>> map = new HashMap<>();
-        for (Map<String, Object> menu : menuList) {
-            map.put(Convert.toLong(menu.get("id")), menu);
-        }
-        List<Map<String, Object>> rootMenus = new ArrayList<>();
-        List<Map<String, Object>> toRemove = new ArrayList<>();
-        for (Map<String, Object> menu : menuList) {
-            if (menu.get("parent_id").equals(-1)) {
-                rootMenus.add(menu);
-            } else {
-                Map<String, Object> parentMenu = map.get(menu.get("parent_id"));
-                if (parentMenu != null) {
-                    if (parentMenu.get("children") == null) {
-                        parentMenu.put("children", new ArrayList<>());
-                    }
-                    List<Map<String, Object>> children = (List<Map<String, Object>>) parentMenu.get("children");
-                    children.add(menu);
-                    toRemove.add(menu);
-                }
-            }
-        }
-        menuList.removeAll(toRemove);
-        return rootMenus;
-    }
-
-
     // 获取系统用户角色菜单列表
     @Override
-    public List<Map<String, Object>> selectUserRoleMenuList(List<String> permission_ids) {
-        List<Map<String, Object>> sysUserRoleMenuList = sysUserRoleMenuDao.selectUserRoleMenuList(permission_ids);
+    public List<Map<String, Object>> selectUserRoleMenuList(List<String> permission_ids, Integer type) {
+        List<Map<String, Object>> sysUserRoleMenuList = sysUserRoleMenuDao.selectUserRoleMenuList(permission_ids, type);
         if (sysUserRoleMenuList.size() > 0) {
-            buildTreeToMap(sysUserRoleMenuList);
+            sysUserRoleMenuList = TreeUtil.buildTree(sysUserRoleMenuList);
         }
         return sysUserRoleMenuList;
     }

+ 2 - 3
src/main/java/com/backendsys/modules/system/service/impl/SysUserV2ServiceImpl.java

@@ -114,8 +114,7 @@ public class SysUserV2ServiceImpl extends ServiceImpl<SysUserDao, SysUser> imple
         sysUserInfo.setPermission_ids(permission_ids);
 
         // 获得用户角色菜单 (根据权限)
-//        List<Map<String, Object>> sysUserRoleMenuList = sysUserRoleMenuService.selectMenuListSimple(permission_ids);
-        List<Map<String, Object>> sysUserRoleMenuList = sysUserRoleMenuService.selectUserRoleMenuList(permission_ids);
+        List<Map<String, Object>> sysUserRoleMenuList = sysUserRoleMenuService.selectUserRoleMenuList(permission_ids, 1);
         sysUserInfo.setMenus(sysUserRoleMenuList);
 
         return sysUserInfo;
@@ -186,7 +185,7 @@ public class SysUserV2ServiceImpl extends ServiceImpl<SysUserDao, SysUser> imple
         List<String> permission_ids = (List<String>) permissionResp.get("permission_ids");
 
         // 获取系统用户菜单 (根据权限)
-        List<Map<String, Object>> menuList = sysUserRoleMenuService.selectUserRoleMenuList(permission_ids);
+        List<Map<String, Object>> menuList = sysUserRoleMenuService.selectUserRoleMenuList(permission_ids, 1);
 
         Map<String, Object> resp = new LinkedHashMap<>();
         resp.put("user_id", user_id);

+ 6 - 1
src/main/resources/mapper/system/SysUserRoleMenu.xml

@@ -7,6 +7,7 @@
         parent_id,
         menu_name,
         menu_name_en,
+        type,
         COALESCE(path, '') path,
         COALESCE(component, '') component,
         COALESCE(meta, '') meta,
@@ -18,9 +19,10 @@
 
     <resultMap id="resultMapUserRoleMenuSimple" type="java.util.LinkedHashMap">
         <id property="id" column="id" jdbcType="BIGINT" />
-        <result property="parent_id" column="parent_id" javaType="java.lang.Integer" />
+        <result property="parent_id" column="parent_id" javaType="java.lang.Long" />
         <result property="menu_name" column="menu_name" />
         <result property="menu_name_en" column="menu_name_en" />
+        <result property="type" column="type" javaType="java.lang.Integer" />
         <result property="path" column="path" />
         <result property="component" column="component" />
         <result property="meta" column="meta" />
@@ -44,6 +46,9 @@
                     </foreach>
                 )
             </if>
+            <if test="type != null and type != ''">
+                AND type = #{type}
+            </if>
         </where>
         ORDER BY sort ASC
     </select>