瀏覽代碼

关联用户角色与菜单

tsurumure 7 月之前
父節點
當前提交
ad08ac09f3

+ 112 - 38
db/sys_user_role_menu.sql

@@ -11,56 +11,130 @@ 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 '标题 (英文)',
-    `path` VARCHAR(1000) NOT NULL COMMENT '跳转路径',
+    `path` VARCHAR(1000) NOT NULL COMMENT '路由',
+    `component` VARCHAR(255) COMMENT '组件路径',
     `meta` VARCHAR(255) NOT NULL DEFAULT '{}' COMMENT '路由元信息,以 JSON 格式存储',
-    `icon` VARCHAR(100) COMMENT '图标',
+    `icon` VARCHAR(255) COMMENT '图标',
+    `permission` VARCHAR(255) COMMENT '权限',
     `sort` INT DEFAULT '1' COMMENT '排序',
     `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, meta, icon, sort) VALUES
-    (1, -1, '创意中心', 'Idea Center', '/', '{}', 'House', 1),
+INSERT INTO sys_user_role_menu(id, parent_id, menu_name, menu_name_en, path, component, meta, icon, permission, sort) VALUES
+    (1, -1, '创意中心', 'Idea Center', '/', '/src/views/home/ideaCenter.vue', '{}', 'House', '2', 1),
 
-#     (-1, '商城管理', 'B2c', '/b2c/good', '{}', 'Goods', 2),
-#     (2, '商品管理', 'Goods', '/b2c/good/b2cGood', '{}', null, 3),
-#     (2, '商品详情', 'Goods Detail', '/b2c/good/b2cGoodDetail', '{"isBack":true,"isHide":true}', null, 3),
-#     (2, '商品分类', 'Goods Categories', '/b2c/good/b2cGoodCategory', '{}', null, 4),
-#     (2, '商品分类详情', 'Goods Categories Detail', '/b2c/good/b2cGoodCategoryDetail', '{"isBack":true,"isHide":true}', null, 4),
-#     (2, '商品品牌', 'Goods Brands', '/b2c/good/b2cGoodBrand', '{}', null, 5),
-#     (2, '商品品牌详情', 'Goods Brands Detail', '/b2c/good/b2cGoodBrandDetail', '{"isBack":true,"isHide":true}', null, 5),
-#     (2, '商品单位', 'Goods Units', '/b2c/good/b2cGoodUnit', '{}', null, 6),
-#     (2, '商品单位详情', 'Goods Units Detail', '/b2c/good/b2cGoodUnitDetail', '{"isBack":true,"isHide":true}', null, 6),
+#     (-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),
 #
-#     (2, '订单管理', 'Orders', '/b2c/order/b2cOrder', '{}', null, 4),
-#     (2, '订单详情', 'Orders Detail', '/b2c/order/b2cOrderDetail', '{"isBack":true,"isHide":true}', null, 4),
+#     (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),
 #
 #     (-1, '内容管理', 'CMS', '/cms', '', '{}', 'Document', '12', 5),
-#     (13, '页面管理', 'Pages', '/cms/page/cmsPage', '{}', 'Document', 5),
+#     (13, '页面管理', 'Pages', '/cms/page/cmsPage', '/src/views/cms/page/cmsPage.vue', '{}', 'Document', '12.1', 5),
 #
-#     (13, '资讯管理', 'Articles', '/cms/article/cmsArticle', '{}', null, 6),
-#     (13, '资讯详情', 'Articles Detail', '/cms/article/cmsArticleDetail', '{"isBack":true,"isHide":true}', null, 6),
-#     (13, '资讯分类管理', 'Articles Categories', '/cms/article/cmsArticleCategory', '{}', null, 7),
-#     (13, '资讯分类详情', 'Articles Categorie Detail', '/cms/article/cmsArticleCategoryDetail', '{"isBack":true,"isHide":true}', null, 7),
-#     (13, '幻灯片管理', 'Banners', '/cms/banner/cmsBanner', '{}', null, 8),
-#     (13, '幻灯片详情', 'Banners Detail', '/cms/banner/cmsBannerDetail', '{"isBack":true,"isHide":true}', null, 8),
+#     (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, '站点信息', 'SiteInfo', '/cms/site/cmsSiteInfo', '{}', null, 9),
+#     (13, '站点信息', 'SiteInfo', '/cms/site/cmsSiteInfo', '/src/views/cms/site/cmsSiteInfo.vue', '{}', null, '13', 9),
 
-    (2, -1, 'AI文案', 'AI Copywriting', '/ai/chat/copywriting', '{}', 'Document', 10),
-    (3, -1, 'AI作画', 'AI Image Generator', '/ai/imageGenerator', '{}', 'Picture', 10),
+    (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),
+
+#     (-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, '我的', '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),
+
+    (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)
+;
 
-#     (-1, '素材管理', 'Material', '/material', '{}', 'MessageBox', 10),
-#     (4, '素材中心', 'Material', '/material/center', '{}', null, 10),
-#     (4, '素材列表', 'Material List', '/material/list', '{}', null, 10),
-#     (4, '素材分类', 'Material Category', '/material/category', '{}', null, 10),
 
-#     (-1, '我的', 'Account', '/account', '{}', 'User', 11),
-#     (8, '我的素材', 'My Material', '/account/myMaterial', '{}', null, 11),
-#     (8, '我的作品', 'My Work', '/account/myWork', '{}', null, 11),
-#     (8, '我的草稿', 'My Draft', '/account/myDraft', '{}', null, 11),
 
-    (12, -1, '系统管理', 'Systems', '/system', '{}', 'Setting', 12),
-    (13, 12, '用户管理', 'Users', '/system/sysUser', '{}', null, 12),
-    (14, 12, '角色管理', 'Users Roles', '/system/sysUserRole', '{}', null, 12),
-    (15, 12, '系统菜单', 'System Menu', '/system/sysMenu', '{}', null, 12)
-;
+# /**
+# Source Server Version: 8.0.31
+# Source Database: backendsys
+# Date: 2023-12-30 12:49:53
+# */
+#
+# DROP TABLE IF EXISTS `sys_user_role_menu`;
+# CREATE TABLE `sys_user_role_menu` (
+#     PRIMARY KEY (`id`),
+#     `id` BIGINT AUTO_INCREMENT COMMENT 'ID',
+#     `parent_id` BIGINT DEFAULT '-1' COMMENT '父ID',
+#     `menu_name` VARCHAR(255) NOT NULL COMMENT '标题',
+#     `menu_name_en` VARCHAR(255) NOT NULL COMMENT '标题 (英文)',
+#     `path` VARCHAR(1000) NOT NULL COMMENT '跳转路径',
+#     `meta` VARCHAR(255) NOT NULL DEFAULT '{}' COMMENT '路由元信息,以 JSON 格式存储',
+#     `icon` VARCHAR(100) COMMENT '图标',
+#     `sort` INT DEFAULT '1' COMMENT '排序',
+#     `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, meta, icon, sort) VALUES
+#     (1, -1, '创意中心', 'Idea Center', '/', '{}', 'House', 1),
+#
+# #     (-1, '商城管理', 'B2c', '/b2c/good', '{}', 'Goods', 2),
+# #     (2, '商品管理', 'Goods', '/b2c/good/b2cGood', '{}', null, 3),
+# #     (2, '商品详情', 'Goods Detail', '/b2c/good/b2cGoodDetail', '{"isBack":true,"isHide":true}', null, 3),
+# #     (2, '商品分类', 'Goods Categories', '/b2c/good/b2cGoodCategory', '{}', null, 4),
+# #     (2, '商品分类详情', 'Goods Categories Detail', '/b2c/good/b2cGoodCategoryDetail', '{"isBack":true,"isHide":true}', null, 4),
+# #     (2, '商品品牌', 'Goods Brands', '/b2c/good/b2cGoodBrand', '{}', null, 5),
+# #     (2, '商品品牌详情', 'Goods Brands Detail', '/b2c/good/b2cGoodBrandDetail', '{"isBack":true,"isHide":true}', null, 5),
+# #     (2, '商品单位', 'Goods Units', '/b2c/good/b2cGoodUnit', '{}', null, 6),
+# #     (2, '商品单位详情', 'Goods Units Detail', '/b2c/good/b2cGoodUnitDetail', '{"isBack":true,"isHide":true}', null, 6),
+# #
+# #     (2, '订单管理', 'Orders', '/b2c/order/b2cOrder', '{}', null, 4),
+# #     (2, '订单详情', 'Orders Detail', '/b2c/order/b2cOrderDetail', '{"isBack":true,"isHide":true}', null, 4),
+# #
+# #     (-1, '内容管理', 'CMS', '/cms', '', '{}', 'Document', '12', 5),
+# #     (13, '页面管理', 'Pages', '/cms/page/cmsPage', '{}', 'Document', 5),
+# #
+# #     (13, '资讯管理', 'Articles', '/cms/article/cmsArticle', '{}', null, 6),
+# #     (13, '资讯详情', 'Articles Detail', '/cms/article/cmsArticleDetail', '{"isBack":true,"isHide":true}', null, 6),
+# #     (13, '资讯分类管理', 'Articles Categories', '/cms/article/cmsArticleCategory', '{}', null, 7),
+# #     (13, '资讯分类详情', 'Articles Categorie Detail', '/cms/article/cmsArticleCategoryDetail', '{"isBack":true,"isHide":true}', null, 7),
+# #     (13, '幻灯片管理', 'Banners', '/cms/banner/cmsBanner', '{}', null, 8),
+# #     (13, '幻灯片详情', 'Banners Detail', '/cms/banner/cmsBannerDetail', '{"isBack":true,"isHide":true}', null, 8),
+#
+# #     (13, '站点信息', 'SiteInfo', '/cms/site/cmsSiteInfo', '{}', null, 9),
+#
+#     (2, -1, 'AI文案', 'AI Copywriting', '/ai/chat/copywriting', '{}', 'Document', 10),
+#     (3, -1, 'AI作画', 'AI Image Generator', '/ai/imageGenerator', '{}', 'Picture', 10),
+#
+# #     (-1, '素材管理', 'Material', '/material', '{}', 'MessageBox', 10),
+# #     (4, '素材中心', 'Material', '/material/center', '{}', null, 10),
+# #     (4, '素材列表', 'Material List', '/material/list', '{}', null, 10),
+# #     (4, '素材分类', 'Material Category', '/material/category', '{}', null, 10),
+#
+# #     (-1, '我的', 'Account', '/account', '{}', 'User', 11),
+# #     (8, '我的素材', 'My Material', '/account/myMaterial', '{}', null, 11),
+# #     (8, '我的作品', 'My Work', '/account/myWork', '{}', null, 11),
+# #     (8, '我的草稿', 'My Draft', '/account/myDraft', '{}', null, 11),
+#
+#     (12, -1, '系统管理', 'Systems', '/system', '{}', 'Setting', 12),
+#     (13, 12, '用户管理', 'Users', '/system/sysUser', '{}', null, 12),
+#     (14, 12, '角色管理', 'Users Roles', '/system/sysUserRole', '{}', null, 12),
+#     (15, 12, '系统菜单', 'System Menu', '/system/sysMenu', '{}', null, 12)
+# ;

+ 3 - 1
db/sys_user_role_permission.sql

@@ -56,7 +56,9 @@ INSERT INTO sys_user_role_permission(id, parent_id, permission_name, sort) VALUE
         ('3.4', '3', '系统用户权限', null),
             ('3.4.1', '3.4', '查询用户权限', null),
             ('3.4.1.2', '3.4', '查询他人用户权限', null),
-
+        ('3.5', '3', '系统用户菜单', null),
+            ('3.5.1', '3.5', '查询用户菜单', null),
+            ('3.5.1.2', '3.5', '查询他人用户菜单', null),
         -- ('3.3', '3', '会员用户-列表'),
         --     ('3.3.1', '3.3', '会员用户-详情'),
         --     ('3.3.2', '3.3', '会员用户-创建'),

+ 2 - 0
db/sys_user_role_permission_relation.sql

@@ -32,6 +32,8 @@ INSERT INTO sys_user_role_permission_relation(role_id, permission_id) VALUES
 #             (1, '3.3.1'), (1, '3.3.2'), (1, '3.3.3'), (1, '3.3.4'), (1, '3.3.5'), (1, '3.3.6'), (1, '3.3.7'),
         (1, '3.4'),
             (1, '3.4.1'), (1, '3.4.1.2'),
+        (1, '3.5'),
+            (1, '3.5.1'), (1, '3.5.1.2'),
     (1, '4'),
         (1, '4.1'),
             (1, '4.1.1'), (1, '4.1.2'), (1, '4.1.3'), (1, '4.1.4'), (1, '4.1.5'), (1, '4.1.6'),

+ 25 - 3
src/main/java/com/backendsys/modules/system/controller/SysUserController.java

@@ -69,10 +69,10 @@ public class SysUserController {
 
     /**
      * 权限:
-     * - 查询用户信息权限 (3.4.1)
-     * - 查询他人用户信息权限 (3.4.1.2)
+     * - 查询用户权限 (3.4.1)
+     * - 查询他人用户权限 (3.4.1.2)
      */
-    @Operation(summary = "获取系统用户权限列表")
+    @Operation(summary = "获取系统用户权限")
     @PreAuthorize("@sr.hasPermission('3.4.1')")
     @GetMapping("/api/system/user/getUserPermission")
     public Result getUserPermission(@Parameter(description = "用户ID") Long user_id) {
@@ -89,6 +89,28 @@ public class SysUserController {
         return Result.success().put("data", sysUserV2Service.selectUserPermission(user_id));
     }
 
+    /**
+     * 权限:
+     * - 查询用户菜单 (3.5.1)
+     * - 查询他人用户菜单 (3.5.1.2)
+     */
+    @Operation(summary = "获取系统用户菜单")
+    @PreAuthorize("@sr.hasPermission('3.5.1')")
+    @GetMapping("/api/system/user/getUserMenu")
+    public Result getUserMenu(@Parameter(description = "用户ID") Long user_id) {
+
+        // 查询自身的用户信息 (不传参数)
+        user_id = (user_id == null) ? SecurityUtil.getUserId() : user_id;
+        // 查询他人的用户信息
+        // - 查询自己 (无需权限)
+        // - 查询他人 (需要子权限或超级管理员)
+        if (!user_id.equals(SecurityUtil.getUserId()) && !SecurityUtil.hasPermission("3.4.1.2") && !SecurityUtil.isSuper()) {
+            throw new CustException(SecurityEnum.NOAUTH);
+        }
+
+        return Result.success().put("data", sysUserV2Service.selectUserMenu(user_id));
+    }
+
     @SysLog("创建系统用户")
     @Operation(summary = "创建系统用户")
     @PreAuthorize("@ss.hasPermi('3.2.2')")

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

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

+ 3 - 0
src/main/java/com/backendsys/modules/system/entity/SysUserInfo.java

@@ -55,6 +55,9 @@ public class SysUserInfo {
     @TableField(exist = false)
     private List<String> permission_ids;
 
+    @TableField(exist = false)
+    private List<Map<String, Object>> menus;
+
     @TableField(exist = false)
     private String token_expiration;
     @TableField(exist = false)

+ 1 - 0
src/main/java/com/backendsys/modules/system/entity/SysUserRoleMenu.java

@@ -41,6 +41,7 @@ public class SysUserRoleMenu {
 
     private String meta;
     private String icon;
+    private String permission;
 
     @TableField(exist = false)
     private List<SysUserRoleMenu> children;

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

@@ -7,7 +7,10 @@ import java.util.Map;
 
 public interface SysUserRoleMenuService {
 
-    // 获取系统用户角色菜单列表 (树型)
+    // 获取系统用户角色菜单列表 (简约)(树型)
+    List<Map<String, Object>> selectMenuListSimple(List<String> permission_ids);
+
+    // 获取系统用户角色菜单列表 (全部)(树型)
     List<SysUserRoleMenu> getUserRoleMenu();
 
 }

+ 2 - 0
src/main/java/com/backendsys/modules/system/service/SysUserV2Service.java

@@ -19,6 +19,8 @@ public interface SysUserV2Service extends IService<SysUser> {
     SysUserInfo selectUserInfo(Long user_id);
     // 获取系统用户权限
     Map<String, Object> selectUserPermission(Long user_id);
+    // 获取系统用户菜单
+    Map<String, Object> selectUserMenu(Long user_id);
     // 创建系统用户
     Map<String, Object> insertUser(SysUserDTO sysUserDTO);
     // 编辑系统用户信息

+ 41 - 2
src/main/java/com/backendsys/modules/system/service/impl/SysUserRoleMenuServiceImpl.java

@@ -1,5 +1,6 @@
 package com.backendsys.modules.system.service.impl;
 
+import cn.hutool.core.convert.Convert;
 import com.backendsys.modules.system.dao.SysUserRoleMenuDao;
 import com.backendsys.modules.system.entity.SysUserRoleMenu;
 import com.backendsys.modules.system.service.SysUserRoleMenuService;
@@ -11,6 +12,7 @@ import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 @Service
 public class SysUserRoleMenuServiceImpl implements SysUserRoleMenuService {
@@ -18,7 +20,7 @@ public class SysUserRoleMenuServiceImpl implements SysUserRoleMenuService {
     @Autowired
     private SysUserRoleMenuDao sysUserRoleMenuDao;
 
-    // 转为树型结构
+    // 转为树型结构 (SysUserRoleMenu)
     public static List<SysUserRoleMenu> buildTree(List<SysUserRoleMenu> sysUserRoleMenuList) {
         // 创建一个Map来存储id和SysUserRoleMenu对象的映射关系
         Map<Long, SysUserRoleMenu> map = new HashMap<>();
@@ -59,8 +61,45 @@ public class SysUserRoleMenuServiceImpl implements SysUserRoleMenuService {
         return rootMenus;
     }
 
+    // 转为树型结构 (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>> selectMenuListSimple(List<String> permission_ids) {
+        List<Map<String, Object>> menuList = sysUserRoleMenuDao.selectMenuListSimple(permission_ids);
+        if (menuList.size() > 0) {
+            buildTreeToMap(menuList);
+        }
+        return menuList;
+    }
 
-    // 获取系统用户角色菜单列表 (树型)
+    // 获取系统用户角色菜单列表 (全部)(树型)
     @Override
     public List<SysUserRoleMenu> getUserRoleMenu() {
         List<SysUserRoleMenu> sysUserRoleMenuList = sysUserRoleMenuDao.selectList(new QueryWrapper<>());

+ 31 - 6
src/main/java/com/backendsys/modules/system/service/impl/SysUserV2ServiceImpl.java

@@ -6,10 +6,8 @@ import com.backendsys.exception.CustException;
 import com.backendsys.modules.common.config.redis.utils.RedisUtil;
 import com.backendsys.modules.common.utils.MybatisUtil;
 import com.backendsys.modules.system.dao.*;
-import com.backendsys.modules.system.entity.SysUser;
-import com.backendsys.modules.system.entity.SysUserDTO;
-import com.backendsys.modules.system.entity.SysUserInfo;
-import com.backendsys.modules.system.entity.SysUserRoleRelation;
+import com.backendsys.modules.system.entity.*;
+import com.backendsys.modules.system.service.SysUserRoleMenuService;
 import com.backendsys.modules.system.service.SysUserV2Service;
 import com.backendsys.utils.MD5Util;
 import com.backendsys.utils.response.PageEntity;
@@ -50,6 +48,8 @@ public class SysUserV2ServiceImpl extends ServiceImpl<SysUserDao, SysUser> imple
     @Autowired
     private SysUserRoleDao sysUserRoleDao;
     @Autowired
+    private SysUserRoleMenuService sysUserRoleMenuService;
+    @Autowired
     private SysUserRoleRelationDao sysUserRoleRelationDao;
     @Autowired
     private SysUserRolePermissionRelationDao sysUserRolePermissionRelationDao;
@@ -94,17 +94,22 @@ public class SysUserV2ServiceImpl extends ServiceImpl<SysUserDao, SysUser> imple
         // 用户账号信息 赋值到 用户基本信息
         BeanUtils.copyProperties(sysUser, sysUserInfo);
 
-        // 获得 用户角色(绑定关系)
+        // 获得 用户角色
         List<Map<String, Object>> roles = sysUserRoleDao.selectRoleByUserId(user_id);
         sysUserInfo.setRoles(roles);
 
-//        List<Long> role_ids = roles.stream().map(SysUserRole::getRole_id).collect(Collectors.toList());
+        // 获得 用户角色Id
         List<Long> role_ids = roles.stream().map(m -> Convert.toLong(m.get("role_id"))).collect(Collectors.toList());
         sysUserInfo.setRole_id(role_ids);
 
+        // 获得 用户角色权限Id (根据角色)
         List<String> permission_ids = sysUserRolePermissionRelationDao.selectUserRolePermissionIdsByRoleIds(role_ids);
         sysUserInfo.setPermission_ids(permission_ids);
 
+        // 获得用户角色菜单 (根据权限)
+        List<Map<String, Object>> sysUserRoleMenuList = sysUserRoleMenuService.selectMenuListSimple(permission_ids);
+        sysUserInfo.setMenus(sysUserRoleMenuList);
+
         return sysUserInfo;
     }
 
@@ -131,6 +136,26 @@ public class SysUserV2ServiceImpl extends ServiceImpl<SysUserDao, SysUser> imple
         return resp;
     }
 
+    /**
+     * 获取系统用户菜单
+     */
+    @Override
+    public Map<String, Object> selectUserMenu(Long user_id) {
+
+        // 获取系统用户权限
+        Map<String, Object> permissionResp = selectUserPermission(user_id);
+        List<String> permission_ids = (List<String>) permissionResp.get("permission_ids");
+
+        // 获取系统用户菜单 (根据权限)
+        List<Map<String, Object>> menuList = sysUserRoleMenuService.selectMenuListSimple(permission_ids);
+
+        Map<String, Object> resp = new LinkedHashMap<>();
+        resp.put("user_id", user_id);
+        resp.put("menus", menuList);
+        return resp;
+    }
+
+
     /**
      * 创建系统用户
      */

+ 43 - 0
src/main/resources/mapper/system/SysUserRoleMenu.xml

@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="com.backendsys.modules.system.dao.SysUserRoleMenuDao">
+
+    <sql id="includeUserRoleMenuSimple">
+        id,
+        parent_id,
+        menu_name,
+        menu_name_en,
+        COALESCE(path, '') path,
+        COALESCE(component, '') component,
+        COALESCE(meta, '') meta,
+        COALESCE(icon, '') icon,
+        COALESCE(permission, '') permission,
+        COALESCE(sort, '') sort,
+        COALESCE(status, '') status
+    </sql>
+
+    <resultMap id="resultMapUserRoleMenuSimple" type="java.util.LinkedHashMap">
+        <result property="menu_name" column="menu_name" />
+        <result property="menu_name_en" column="menu_name_en" />
+        <result property="path" column="path" />
+        <result property="component" column="component" />
+        <result property="meta" column="meta" />
+        <result property="icon" column="icon" />
+    </resultMap>
+
+    <select id="selectMenuListSimple" resultMap="resultMapUserRoleMenuSimple">
+        SELECT <include refid="includeUserRoleMenuSimple" />
+        FROM sys_user_role_menu
+        <where>
+            status = 1
+            <if test="permission_ids != null and permission_ids.size() > 0">
+                AND permission IN
+                <foreach collection="permission_ids" item="permission_id" open="(" separator="," close=")">
+                    #{permission_id}
+                </foreach>
+            </if>
+        </where>
+        ORDER BY sort ASC
+    </select>
+
+</mapper>