Procházet zdrojové kódy

查询用户权限菜单,并且封装路由信息

Gaokun Wang před 1 měsícem
rodič
revize
fcbb5ea22d

+ 46 - 0
eco-common/com-core/src/main/java/org/eco/vip/orm/enums/MenuTypeEnum.java

@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2025 GaoKunW
+ *
+ */
+
+package org.eco.vip.orm.enums;
+
+
+import lombok.Getter;
+import org.eco.vip.orm.exception.BusinessException;
+
+/**
+ * @description MenuTypeEnum
+ *
+ * @author GaoKunW
+ * @date 2025/7/11 13:44
+ */
+@Getter
+public enum MenuTypeEnum {
+    /** 目录 */
+    CATALOG("C"),
+
+    /** 组件 */
+    MENU("M"),
+
+    /** 内链 */
+    IFRAME("F"),
+
+    /** 外链 */
+    LINK("L");
+
+    private final String value;
+
+    MenuTypeEnum(String value) {
+        this.value = value;
+    }
+
+    public static void validate(String value) {
+        boolean flag = CATALOG.getValue().equals(value) || MENU.getValue().equals(value) || IFRAME.getValue().equals(value) ||
+                LINK.getValue().equals(value);
+        if (!flag) {
+            throw new BusinessException("不支持的菜单类型:{}", value);
+        }
+    }
+
+}

+ 1 - 2
eco-common/com-security/src/main/java/org/eco/vip/security/utils/LoginHelper.java

@@ -37,7 +37,7 @@ public class LoginHelper {
     /**
      * 超级管理员ID
      */
-    public static final String SUPER_ADMIN_ID = "0000000000";
+    public static final String SUPER_ADMIN_ID = "1";
 
     /**
      * 登录系统 基于 设备类型
@@ -74,7 +74,6 @@ public class LoginHelper {
             return null;
         }
         SaSession session = StpUtil.getTokenSession();
-
         if (ObjectUtil.isNull(session)) {
             return null;
         }

+ 6 - 0
eco-nexus-core/auth-biz/src/main/java/org/eco/vip/auth/controller/menu/MenuController.java

@@ -17,6 +17,7 @@ import org.eco.vip.auth.service.menu.IMenuService;
 import org.eco.vip.orm.pojo.CommonResult;
 import org.eco.vip.orm.pojo.PageResult;
 import org.eco.vip.security.annotation.PermissionsResource;
+import org.eco.vip.security.utils.LoginHelper;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.DeleteMapping;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -54,6 +55,11 @@ public class MenuController {
     public CommonResult<List<MenuVO>> list(MenuBO menuBO) {
         return success(menuService.selectList(menuBO));
     }
+    @GetMapping("/auth/list")
+    public CommonResult<List<MenuVO>> listByUserId() {
+        String userId = LoginHelper.getUserId();
+        return success(menuService.selectListByUserId(userId));
+    }
 
     @GetMapping("/tree")
     public CommonResult<List<Tree<String>>> tree() {

+ 14 - 9
eco-nexus-core/auth-biz/src/main/java/org/eco/vip/auth/domain/menu/Menu.java

@@ -44,11 +44,6 @@ public class Menu extends BaseEntity {
      */
     private String name;
 
-    /**
-     * 编码
-     */
-    private String code;
-
     /**
      * 菜单类型
      */
@@ -65,20 +60,30 @@ public class Menu extends BaseEntity {
     private String component;
 
     /**
-     * 图标
+     * 路由参数
      */
-    private String icon;
+    private String queryParam;
 
     /**
-     * 颜色
+     * 图标
      */
-    private String color;
+    private String icon;
 
     /**
      * 是否可见
      */
     private String visible;
 
+    /**
+     * 显示布局
+     */
+    private String displayLayout;
+
+    /**
+     * 是否固定标签页
+     */
+    private String affix;
+
     /**
      * 缓存
      */

+ 15 - 9
eco-nexus-core/auth-biz/src/main/java/org/eco/vip/auth/domain/menu/pojo/MenuBO.java

@@ -40,13 +40,9 @@ public class MenuBO extends BaseBO {
     /**
      * 别名
      */
+    @NotBlank(message = "name不能为空")
     private String name;
 
-    /**
-     * 编码
-     */
-    private String code;
-
     /**
      * 菜单类型
      */
@@ -64,20 +60,30 @@ public class MenuBO extends BaseBO {
     private String component;
 
     /**
-     * 图标
+     * 路由参数
      */
-    private String icon;
+    private String queryParam;
 
     /**
-     * 颜色
+     * 图标
      */
-    private String color;
+    private String icon;
 
     /**
      * 是否可见
      */
     private String visible;
 
+    /**
+     * 显示布局
+     */
+    private String displayLayout;
+
+    /**
+     * 是否固定标签页
+     */
+    private String affix;
+
     /**
      * 缓存
      */

+ 14 - 11
eco-nexus-core/auth-biz/src/main/java/org/eco/vip/auth/domain/menu/pojo/MenuVO.java

@@ -6,7 +6,6 @@
 package org.eco.vip.auth.domain.menu.pojo;
 
 
-import com.mybatisflex.annotation.Id;
 import io.github.linpeilie.annotations.AutoMapper;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
@@ -27,7 +26,6 @@ public class MenuVO extends BaseEntity {
     /**
      * 唯一标识
      */
-    @Id
     private String menuId;
 
     /**
@@ -45,11 +43,6 @@ public class MenuVO extends BaseEntity {
      */
     private String name;
 
-    /**
-     * 编码
-     */
-    private String code;
-
     /**
      * 菜单类型
      */
@@ -66,20 +59,30 @@ public class MenuVO extends BaseEntity {
     private String component;
 
     /**
-     * 图标
+     * 路由参数
      */
-    private String icon;
+    private String queryParam;
 
     /**
-     * 颜色
+     * 图标
      */
-    private String color;
+    private String icon;
 
     /**
      * 是否可见
      */
     private String visible;
 
+    /**
+     * 显示布局
+     */
+    private String displayLayout;
+
+    /**
+     * 是否固定标签页
+     */
+    private String affix;
+
     /**
      * 缓存
      */

+ 6 - 0
eco-nexus-core/auth-biz/src/main/java/org/eco/vip/auth/service/menu/IMenuService.java

@@ -37,6 +37,12 @@ public interface IMenuService extends IBaseService<Menu> {
      * @return List<OrgVO>
      **/
     List<MenuVO> selectList(MenuBO menuBO);
+    /**
+     * @description: 查询
+     * @param userId 参数
+     * @return List<OrgVO>
+     **/
+    List<MenuVO> selectListByUserId(String userId);
 
     /**
      * @description: 查询树

+ 51 - 13
eco-nexus-core/auth-biz/src/main/java/org/eco/vip/auth/service/menu/MenuService.java

@@ -8,20 +8,25 @@ package org.eco.vip.auth.service.menu;
 
 import cn.hutool.core.lang.tree.Tree;
 import cn.hutool.core.lang.tree.TreeNode;
+import cn.hutool.core.lang.tree.TreeUtil;
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
+import com.mybatisflex.core.query.QueryMethods;
 import com.mybatisflex.core.query.QueryWrapper;
 import jakarta.annotation.Resource;
 import org.eco.vip.auth.domain.menu.Menu;
 import org.eco.vip.auth.domain.menu.pojo.MenuBO;
 import org.eco.vip.auth.domain.menu.pojo.MenuVO;
 import org.eco.vip.auth.mapper.MenuMapper;
+import org.eco.vip.auth.mapper.RoleMenuMapper;
 import org.eco.vip.auth.service.role.IRoleService;
 import org.eco.vip.auth.service.user.IUserService;
+import org.eco.vip.orm.enums.MenuTypeEnum;
 import org.eco.vip.orm.pojo.PageResult;
 import org.eco.vip.orm.service.BaseService;
 import org.eco.vip.orm.utils.JsonUtils;
 import org.eco.vip.orm.utils.MapstructUtils;
-import org.eco.vip.orm.utils.ObjUtils;
-import org.eco.vip.orm.utils.RandomUtils;
+import org.eco.vip.orm.utils.StrUtils;
 import org.eco.vip.orm.utils.TreeUtils;
 import org.eco.vip.security.utils.LoginHelper;
 import org.springframework.stereotype.Service;
@@ -30,6 +35,8 @@ import java.util.List;
 import java.util.stream.Collectors;
 
 import static org.eco.vip.auth.domain.menu.table.MenuTableDef.MENU;
+import static org.eco.vip.auth.domain.role.table.RoleMenuTableDef.ROLE_MENU;
+import static org.eco.vip.auth.domain.user.table.UserRoleTableDef.USER_ROLE;
 
 /**
  * @description MenuService
@@ -42,6 +49,8 @@ public class MenuService extends BaseService<MenuMapper, Menu> implements IMenuS
 
     @Resource
     private MenuMapper menuMapper;
+    @Resource
+    private RoleMenuMapper roleMenuMapper;
 
     @Resource
     private IRoleService roleService;
@@ -51,10 +60,10 @@ public class MenuService extends BaseService<MenuMapper, Menu> implements IMenuS
 
     private QueryWrapper buildQueryWrapper(MenuBO menuBO) {
         return super.buildBaseQueryWrapper()
-                .and(MENU.CODE.eq(menuBO.getCode()))
+                .and(MENU.NAME.eq(menuBO.getName()))
                 .and(MENU.TITLE.eq(menuBO.getTitle()))
                 .and(MENU.PATH.eq(menuBO.getPath()))
-                .and(MENU.NAME.eq(menuBO.getName()))
+                .and(MENU.MENU_TYPE.eq(menuBO.getMenuType()))
                 .and(MENU.STATUS.eq(menuBO.getStatus()))
                 .and(MENU.PARENT_ID.eq(menuBO.getParentId()));
     }
@@ -67,7 +76,12 @@ public class MenuService extends BaseService<MenuMapper, Menu> implements IMenuS
     @Override
     public List<MenuVO> selectList(MenuBO menuBO) {
         QueryWrapper queryWrapper = buildQueryWrapper(menuBO);
-        return menuMapper.selectListWithRelationsByQueryAs(queryWrapper, MenuVO.class);
+        return roleMenuMapper.selectListWithRelationsByQueryAs(queryWrapper, MenuVO.class);
+    }
+
+    @Override
+    public List<MenuVO> selectListByUserId(String userId) {
+        return List.of();
     }
 
     @Override
@@ -75,16 +89,13 @@ public class MenuService extends BaseService<MenuMapper, Menu> implements IMenuS
         QueryWrapper wrapper = QueryWrapper.create().orderBy(Menu::getOrderNum).asc();
         List<Menu> list = this.list(wrapper);
         return TreeUtils.build(list.stream().map(menu ->
-                new TreeNode<>(menu.getMenuId(), menu.getParentId(), menu.getTitle(), menu.getOrderNum()).setExtra(JsonUtils.parseObj(menu))
+                new TreeNode<>(menu.getMenuId(), menu.getParentId(), menu.getName(), menu.getOrderNum()).setExtra(JsonUtils.parseObj(menu))
         ).collect(Collectors.toList()), "0");
     }
 
     @Override
     public boolean insert(MenuBO menuBO) {
         Menu menu = MapstructUtils.convert(menuBO, Menu.class);
-        if (ObjUtils.isNotNull(menu)) {
-            menu.setCode(RandomUtils.randomString(10));
-        }
         return this.save(menu);
     }
 
@@ -106,10 +117,37 @@ public class MenuService extends BaseService<MenuMapper, Menu> implements IMenuS
     @Override
     public List<Tree<String>> getRouters() {
         String userId = LoginHelper.getUserId();
-        List<String> roleIds = userService.selectRoleIdByUserId(userId);
-        List<String> menuIds = roleService.selectMenuIdsByRoleIds(roleIds);
+        List<MenuVO> menuVOList;
+        if (LoginHelper.isSuperAdmin(userId)) {
+            menuVOList = menuMapper.selectListWithRelationsByQueryAs(QueryWrapper.create().orderBy(Menu::getOrderNum).asc(),
+                    MenuVO.class);
+        } else {
+            QueryWrapper queryWrapper = QueryWrapper.create();
+            queryWrapper.select(QueryMethods.distinct(ROLE_MENU.MENU_ID))
+                    .from(USER_ROLE.as("urt"))
+                    .leftJoin(ROLE_MENU.as("rmt")).on(USER_ROLE.ROLE_ID.eq(ROLE_MENU.ROLE_ID))
+                    .where(USER_ROLE.USER_ID.eq(userId));
+            List<String> menuIds = roleMenuMapper.selectListWithRelationsByQueryAs(queryWrapper, String.class);
+            menuVOList = menuMapper.selectListWithRelationsByQueryAs(QueryWrapper.create().in(Menu::getMenuId, menuIds).orderBy(Menu::getOrderNum).asc(), MenuVO.class);
+        }
+        List<JSONObject> resultJsonObjectList = menuVOList.stream().map(menuVO -> {
+            JSONObject menu = JsonUtils.parseObj(menuVO);
+            JSONObject meta = JsonUtils.createObj();
+            meta.set("icon", menuVO.getIcon());
+            meta.set("isLink", StrUtils.equals(MenuTypeEnum.LINK.getValue(), menuVO.getMenuType()));
+            meta.set("isHidden", menuVO.getVisible());
+            meta.set("isFull", menuVO.getDisplayLayout());
+            meta.set("isAffix", menuVO.getAffix());
+            meta.set("isKeepAlive", menuVO.getKeepLive());
+            meta.set("title", menuVO.getTitle());
+            menu.set("meta", meta);
+            return menu;
+        }).toList();
+        List<TreeNode<String>> treeNodeList = resultJsonObjectList.stream().map(jsonObject ->
+                        new TreeNode<>(jsonObject.getStr("menuId"), jsonObject.getStr("parentId"),
+                                jsonObject.getStr("name"), jsonObject.getInt("sortCode")).setExtra(JSONUtil.parseObj(jsonObject)))
+                .toList();
+        return TreeUtil.build(treeNodeList, "0");
 
-//        roleService
-        return List.of();
     }
 }

+ 1 - 1
eco-nexus-core/auth-biz/src/main/java/org/eco/vip/auth/service/role/RoleService.java

@@ -118,7 +118,7 @@ public class RoleService extends BaseService<RoleMapper, Role> implements IRoleS
     public List<String> selectMenuIdsByRoleIds(List<String> ids) {
         QueryWrapper queryWrapper = QueryWrapper.create()
                 .select(QueryMethods.distinct(ROLE_MENU.MENU_ID))
-                .from(ROLE_MENU.as("rtm"))
+                .from(ROLE_MENU.as("rmt"))
                 .leftJoin(ROLE.as("rt")).on(ROLE.ROLE_ID.eq(ROLE_MENU.ROLE_ID))
                 .where(ROLE.ROLE_ID.in(ids));
         return roleMenuMapper.selectListWithRelationsByQueryAs(queryWrapper, String.class);

+ 28 - 33
eco-start/src/main/resources/db/mysql/V1_0_0_1__sys-init-ddl.sql

@@ -15,7 +15,8 @@
 */
 
 SET NAMES utf8mb4;
-SET FOREIGN_KEY_CHECKS = 0;
+SET
+FOREIGN_KEY_CHECKS = 0;
 
 -- ----------------------------
 -- Table structure for system_client_t
@@ -58,15 +59,16 @@ CREATE TABLE `system_menu_t`
 (
     `menu_id`        varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '唯一标识',
     `parent_id`      varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '父id',
-    `title`          varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '标题',
-    `name`           varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '别名',
-    `code`           varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '编码',
-    `menu_type`      varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '菜单类型',
-    `path`           varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '路径',
-    `component`      varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '组件',
+    `title`          varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '名称标题',
+    `name`           varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '组件别名',
+    `menu_type`      varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '菜单类型(C目录 M菜单 F外链 L内链)',
+    `path`           varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '路由地址',
+    `component`      varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '组件路径',
+    `query_param`    varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '路由参数',
     `icon`           varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '图标',
-    `color`          varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '颜色',
     `visible`        varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '是否可见',
+    `display_layout` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '显示布局',
+    `affix`          varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '是否固定在标签页中',
     `keep_live`      varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '页签缓存',
     `order_num`      int NULL DEFAULT NULL COMMENT '显示顺序',
     `tenant_id`      varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '租户编号',
@@ -84,6 +86,22 @@ CREATE TABLE `system_menu_t`
 -- ----------------------------
 -- Records of system_menu_t
 -- ----------------------------
+INSERT INTO `system_menu_t`
+VALUES ('71807970486000184', '0', '首页', 'Heme', 'M', '/system/home/index', '/system/home/index', '', 'home', '1', '1',
+        '1', '1', 0, '1', '1', 0, '0', '1', '2025-07-11 15:40:30', '1', '2025-07-11 15:40:30', NULL);
+INSERT INTO `system_menu_t`
+VALUES ('71808051400000125', '0', '权限控制', 'Auth', 'C', '', '', '', 'auth', '1', '1', '', '1', 1, '1', '1', 0, '0',
+        '1', '2025-07-11 15:41:51', '1', '2025-07-11 15:41:51', NULL);
+INSERT INTO `system_menu_t`
+VALUES ('71808092756000136', '0', '组织架构', 'Orgs', 'C', '', '', '', 'orgs', '1', '1', '', '1', 2, '1', '1', 0, '0',
+        '1', '2025-07-11 15:42:33', '1', '2025-07-11 15:42:33', NULL);
+INSERT INTO `system_menu_t`
+VALUES ('71808196540000172', '71808051400000125', '用户管理', 'User', 'M', '/system/user/index', '/system/user/index',
+        '', 'user', '1', '1', '', '1', 1, '1', '1', 0, '0', '1', '2025-07-11 15:44:17', '1', '2025-07-11 15:44:17',
+        NULL);
+INSERT INTO `system_menu_t`
+VALUES ('71808263733000185', '71808092756000136', '组织管理', 'Org', 'M', '/system/org/index', '/system/org/index', '',
+        'org', '1', '1', '', '1', 1, '1', '1', 0, '0', '1', '2025-07-11 15:45:24', '1', '2025-07-11 15:45:24', NULL);
 
 -- ----------------------------
 -- Table structure for system_org_t
@@ -112,10 +130,6 @@ CREATE TABLE `system_org_t`
     PRIMARY KEY (`org_id`) USING BTREE
 ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '部门表' ROW_FORMAT = DYNAMIC;
 
--- ----------------------------
--- Records of system_org_t
--- ----------------------------
-
 -- ----------------------------
 -- Table structure for system_permission_t
 -- ----------------------------
@@ -166,10 +180,6 @@ CREATE TABLE `system_position_t`
     PRIMARY KEY (`position_id`) USING BTREE
 ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '职位' ROW_FORMAT = DYNAMIC;
 
--- ----------------------------
--- Records of system_position_t
--- ----------------------------
-
 -- ----------------------------
 -- Table structure for system_role_menu_t
 -- ----------------------------
@@ -181,10 +191,6 @@ CREATE TABLE `system_role_menu_t`
     PRIMARY KEY (`role_id`, `menu_id`) USING BTREE
 ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '角色菜单' ROW_FORMAT = DYNAMIC;
 
--- ----------------------------
--- Records of system_role_menu_t
--- ----------------------------
-
 -- ----------------------------
 -- Table structure for system_role_perm_t
 -- ----------------------------
@@ -196,10 +202,6 @@ CREATE TABLE `system_role_perm_t`
     PRIMARY KEY (`role_id`, `perm_id`) USING BTREE
 ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '角色权限关系' ROW_FORMAT = DYNAMIC;
 
--- ----------------------------
--- Records of system_role_perm_t
--- ----------------------------
-
 -- ----------------------------
 -- Table structure for system_role_t
 -- ----------------------------
@@ -224,10 +226,6 @@ CREATE TABLE `system_role_t`
     PRIMARY KEY (`role_id`) USING BTREE
 ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '角色表' ROW_FORMAT = DYNAMIC;
 
--- ----------------------------
--- Records of system_role_t
--- ----------------------------
-
 -- ----------------------------
 -- Table structure for system_user_role_t
 -- ----------------------------
@@ -239,10 +237,6 @@ CREATE TABLE `system_user_role_t`
     PRIMARY KEY (`user_id`, `role_id`) USING BTREE
 ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '用户角色关系' ROW_FORMAT = DYNAMIC;
 
--- ----------------------------
--- Records of system_user_role_t
--- ----------------------------
-
 -- ----------------------------
 -- Table structure for system_user_t
 -- ----------------------------
@@ -282,4 +276,5 @@ VALUES ('1', '', 'superadmin', '超级管理员', 'eco', 'pc_user', NULL, NULL,
         '$2a$10$0dvrBO4B.yyfbLsO3OcDUOaaRf8XklJG6Tyn.6fh907KtxBpzvwo6', NULL, NULL, '1', NULL, 0, '0', '1',
         '2025-07-10 14:55:25', '1', '2025-07-10 14:55:21', NULL);
 
-SET FOREIGN_KEY_CHECKS = 1;
+SET
+FOREIGN_KEY_CHECKS = 1;