Эх сурвалжийг харах

添加角色菜单关系功能

Gaokun Wang 1 сар өмнө
parent
commit
325941b54f
22 өөрчлөгдсөн 269 нэмэгдсэн , 27 устгасан
  1. 5 1
      eco-common/com-orm/pom.xml
  2. 9 4
      eco-common/com-orm/src/main/java/org/eco/vip/orm/listener/EntityInsertListener.java
  3. 9 4
      eco-common/com-orm/src/main/java/org/eco/vip/orm/listener/EntityUpdateListener.java
  4. 3 2
      eco-common/com-security/src/main/java/org/eco/vip/security/handler/GlobalExceptionHandler.java
  5. 26 0
      eco-common/com-security/src/main/java/org/eco/vip/security/utils/LoginHelper.java
  6. 15 2
      eco-nexus-core/auth-biz/src/main/java/org/eco/vip/auth/controller/menu/MenuController.java
  7. 2 2
      eco-nexus-core/auth-biz/src/main/java/org/eco/vip/auth/controller/permission/PermissionController.java
  8. 4 0
      eco-nexus-core/auth-biz/src/main/java/org/eco/vip/auth/controller/user/UserController.java
  9. 27 0
      eco-nexus-core/auth-biz/src/main/java/org/eco/vip/auth/domain/role/RoleMenu.java
  10. 0 1
      eco-nexus-core/auth-biz/src/main/java/org/eco/vip/auth/mapper/RoleMapper.java
  11. 21 0
      eco-nexus-core/auth-biz/src/main/java/org/eco/vip/auth/mapper/RoleMenuMapper.java
  12. 14 1
      eco-nexus-core/auth-biz/src/main/java/org/eco/vip/auth/service/menu/IMenuService.java
  13. 33 0
      eco-nexus-core/auth-biz/src/main/java/org/eco/vip/auth/service/menu/MenuService.java
  14. 1 2
      eco-nexus-core/auth-biz/src/main/java/org/eco/vip/auth/service/org/OrgService.java
  15. 1 4
      eco-nexus-core/auth-biz/src/main/java/org/eco/vip/auth/service/permission/PermissionService.java
  16. 16 0
      eco-nexus-core/auth-biz/src/main/java/org/eco/vip/auth/service/role/IRoleMenuService.java
  17. 16 0
      eco-nexus-core/auth-biz/src/main/java/org/eco/vip/auth/service/role/IRoleService.java
  18. 16 0
      eco-nexus-core/auth-biz/src/main/java/org/eco/vip/auth/service/role/RoleMenuService.java
  19. 21 0
      eco-nexus-core/auth-biz/src/main/java/org/eco/vip/auth/service/role/RoleService.java
  20. 8 1
      eco-nexus-core/auth-biz/src/main/java/org/eco/vip/auth/service/user/IUserService.java
  21. 10 3
      eco-nexus-core/auth-biz/src/main/java/org/eco/vip/auth/service/user/UserService.java
  22. 12 0
      eco-start/src/main/resources/db/mysql/V1_0_0_1__sys-init-ddl.sql

+ 5 - 1
eco-common/com-orm/pom.xml

@@ -13,9 +13,13 @@
 
     <dependencies>
         <!-- com-core -->
+<!--        <dependency>-->
+<!--            <groupId>org.eco.vip</groupId>-->
+<!--            <artifactId>com-core</artifactId>-->
+<!--        </dependency>-->
         <dependency>
             <groupId>org.eco.vip</groupId>
-            <artifactId>com-core</artifactId>
+            <artifactId>com-security</artifactId>
         </dependency>
     </dependencies>
 </project>

+ 9 - 4
eco-common/com-orm/src/main/java/org/eco/vip/orm/listener/EntityInsertListener.java

@@ -7,10 +7,12 @@ package org.eco.vip.orm.listener;
 
 
 import cn.hutool.core.util.ObjectUtil;
-import cn.hutool.http.HttpStatus;
 import com.mybatisflex.annotation.InsertListener;
 import org.eco.vip.orm.domain.BaseEntity;
 import org.eco.vip.orm.exception.BusinessException;
+import org.eco.vip.orm.pojo.LoginUser;
+import org.eco.vip.orm.utils.ObjUtils;
+import org.eco.vip.security.utils.LoginHelper;
 
 import java.util.Date;
 
@@ -26,8 +28,11 @@ public class EntityInsertListener implements InsertListener {
     public void onInsert(Object entity) {
         try {
             if (ObjectUtil.isNotNull(entity) && (entity instanceof BaseEntity baseEntity)) {
-//                Long loginUserId = LoginHelper.getUserId();
-                String loginUserId = "1";
+                LoginUser loginUser = LoginHelper.getLoginUser();
+                String loginUserId = null;
+                if (ObjUtils.isNotNull(loginUser)) {
+                    loginUserId = loginUser.getUserId();
+                }
                 Date createTime = ObjectUtil.isNotNull(baseEntity.getCreateTime())
                         ? baseEntity.getCreateTime() : new Date();
                 if (ObjectUtil.isNull(baseEntity.getCreateBy())) {
@@ -40,7 +45,7 @@ public class EntityInsertListener implements InsertListener {
                 baseEntity.setUpdateTime(createTime);
             }
         } catch (Exception e) {
-            throw new BusinessException("全局插入数据监听器注入异常 => " + e.getMessage(), HttpStatus.HTTP_UNAUTHORIZED);
+            throw new BusinessException("全局插入数据监听器注入异常 => {}", e.getMessage());
         }
     }
 }

+ 9 - 4
eco-common/com-orm/src/main/java/org/eco/vip/orm/listener/EntityUpdateListener.java

@@ -7,10 +7,12 @@ package org.eco.vip.orm.listener;
 
 
 import cn.hutool.core.util.ObjectUtil;
-import cn.hutool.http.HttpStatus;
 import com.mybatisflex.annotation.UpdateListener;
 import org.eco.vip.orm.domain.BaseEntity;
 import org.eco.vip.orm.exception.BusinessException;
+import org.eco.vip.orm.pojo.LoginUser;
+import org.eco.vip.orm.utils.ObjUtils;
+import org.eco.vip.security.utils.LoginHelper;
 
 import java.util.Date;
 
@@ -25,15 +27,18 @@ public class EntityUpdateListener implements UpdateListener {
     public void onUpdate(Object entity) {
         try {
             if (ObjectUtil.isNotNull(entity) && (entity instanceof BaseEntity baseEntity)) {
-                //LoginHelper.getUserId()
-                String loginUserId = "1";
+                LoginUser loginUser = LoginHelper.getLoginUser();
+                String loginUserId = null;
+                if (ObjUtils.isNotNull(loginUser)) {
+                    loginUserId = loginUser.getUserId();
+                }
                 if (ObjectUtil.isNull(baseEntity.getUpdateBy())) {
                     baseEntity.setUpdateBy(loginUserId);
                 }
                 baseEntity.setUpdateTime(new Date());
             }
         } catch (Exception e) {
-            throw new BusinessException("全局更新数据监听器注入异常 => " + e.getMessage(), HttpStatus.HTTP_UNAUTHORIZED);
+            throw new BusinessException("全局更新数据监听器注入异常 => {} {}", e.getMessage());
         }
     }
 }

+ 3 - 2
eco-common/com-security/src/main/java/org/eco/vip/security/handler/GlobalExceptionHandler.java

@@ -122,8 +122,9 @@ public class GlobalExceptionHandler {
      */
     @ExceptionHandler(NotLoginException.class)
     public CommonResult<Void> handleNotLoginException(NotLoginException loginException, HttpServletRequest request) {
-        String requestURI = request.getRequestURI();
-        log.error("请求地址'{}',认证失败'{}',无法访问系统资源", requestURI, loginException.getMessage());
+        log.warn("[handleNotLoginException]", loginException);
+        String uri = request.getRequestURI();
+        log.error("请求地址'{}',认证失败'{}',无法访问系统资源", uri, loginException.getMessage());
         return CommonResult.fail(HttpStatus.HTTP_UNAUTHORIZED, "认证失败,无法访问系统资源");
     }
 

+ 26 - 0
eco-common/com-security/src/main/java/org/eco/vip/security/utils/LoginHelper.java

@@ -11,10 +11,12 @@ import cn.dev33.satoken.context.model.SaStorage;
 import cn.dev33.satoken.session.SaSession;
 import cn.dev33.satoken.stp.StpUtil;
 import cn.dev33.satoken.stp.parameter.SaLoginParameter;
+import cn.hutool.core.convert.Convert;
 import cn.hutool.core.util.ObjectUtil;
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
 import org.eco.vip.orm.pojo.LoginUser;
+import org.eco.vip.orm.utils.ServletUtils;
 
 /**
  * @description LoginHelper
@@ -67,7 +69,11 @@ public class LoginHelper {
      * 获取用户(多级缓存)
      */
     public static LoginUser getLoginUser() {
+        if (!StpUtil.isLogin() && ServletUtils.getParameter("anonymity") != null) {
+            return null;
+        }
         SaSession session = StpUtil.getTokenSession();
+
         if (ObjectUtil.isNull(session)) {
             return null;
         }
@@ -83,4 +89,24 @@ public class LoginHelper {
     public static boolean isSuperAdmin(String userId) {
         return SUPER_ADMIN_ID.equals(userId);
     }
+
+    /**
+     * 获取当前 Token 的扩展信息
+     *
+     * @return 对应的扩展数据
+     */
+    private static Object getExtra() {
+        try {
+            return StpUtil.getExtra(LoginHelper.USER_KEY);
+        } catch (Exception e) {
+            return null;
+        }
+    }
+
+    /**
+     * 获取用户id
+     */
+    public static String getUserId() {
+        return Convert.toStr(getExtra());
+    }
 }

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

@@ -7,6 +7,7 @@ package org.eco.vip.auth.controller.menu;
 
 
 import cn.dev33.satoken.annotation.SaCheckPermission;
+import cn.hutool.core.lang.tree.Tree;
 import jakarta.annotation.Resource;
 import jakarta.validation.Valid;
 import jakarta.validation.constraints.NotEmpty;
@@ -54,8 +55,12 @@ public class MenuController {
         return success(menuService.selectList(menuBO));
     }
 
+    @GetMapping("/tree")
+    public CommonResult<List<Tree<String>>> tree() {
+        return success(menuService.tree());
+    }
+
     @PostMapping("/add")
-    @SaCheckPermission("system:menu:add")
     public CommonResult<String> add(@RequestBody @Valid MenuBO menuBO) {
         boolean result = menuService.insert(menuBO);
         if (!result) {
@@ -66,6 +71,10 @@ public class MenuController {
 
     @PostMapping("/edit")
     public CommonResult<String> edit(@RequestBody @Valid MenuBO menuBO) {
+        boolean result = menuService.update(menuBO);
+        if (!result) {
+            return fail("更新组织失败!");
+        }
         return success();
     }
 
@@ -76,7 +85,11 @@ public class MenuController {
         if (!result) {
             return fail("删除菜单失败!");
         }
-
         return success();
     }
+
+    @GetMapping("/getRouters")
+    public CommonResult<List<Tree<String>>> getRouters() {
+        return success(menuService.getRouters());
+    }
 }

+ 2 - 2
eco-nexus-core/auth-biz/src/main/java/org/eco/vip/auth/controller/permission/PermissionController.java

@@ -7,7 +7,7 @@ package org.eco.vip.auth.controller.permission;
 
 import jakarta.annotation.Resource;
 import org.eco.vip.auth.domain.permission.pojo.PermissionVO;
-import org.eco.vip.auth.service.permission.PermissionService;
+import org.eco.vip.auth.service.permission.IPermissionService;
 import org.eco.vip.orm.pojo.CommonResult;
 import org.eco.vip.security.annotation.PermissionsResource;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -30,7 +30,7 @@ import static org.eco.vip.orm.pojo.CommonResult.success;
 public class PermissionController {
 
     @Resource
-    private PermissionService permissionService;
+    private IPermissionService permissionService;
 
     @GetMapping("/list")
     public CommonResult<List<PermissionVO>> list() {

+ 4 - 0
eco-nexus-core/auth-biz/src/main/java/org/eco/vip/auth/controller/user/UserController.java

@@ -68,6 +68,10 @@ public class UserController {
 
     @PostMapping("/edit")
     public CommonResult<String> edit(@RequestBody @Valid UserBO userBO) {
+        boolean result = userService.update(userBO);
+        if (!result) {
+            return fail("更新用户失败!");
+        }
         return success();
     }
 

+ 27 - 0
eco-nexus-core/auth-biz/src/main/java/org/eco/vip/auth/domain/role/RoleMenu.java

@@ -0,0 +1,27 @@
+/*
+ * Copyright (c) 2025 GaoKunW
+ *
+ */
+
+package org.eco.vip.auth.domain.role;
+
+
+import com.mybatisflex.annotation.Table;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+/**
+ * @description RoleMenu
+ *
+ * @author GaoKunW
+ * @date 2025/7/8 11:45
+ */
+@Data
+@NoArgsConstructor
+@Table(value = "system_role_menu_t")
+public class RoleMenu implements Serializable {
+    private String roleId;
+    private String menuId;
+}

+ 0 - 1
eco-nexus-core/auth-biz/src/main/java/org/eco/vip/auth/mapper/RoleMapper.java

@@ -8,7 +8,6 @@ package org.eco.vip.auth.mapper;
 
 import com.mybatisflex.core.BaseMapper;
 import org.apache.ibatis.annotations.Mapper;
-import org.eco.vip.auth.domain.org.Org;
 import org.eco.vip.auth.domain.role.Role;
 
 /**

+ 21 - 0
eco-nexus-core/auth-biz/src/main/java/org/eco/vip/auth/mapper/RoleMenuMapper.java

@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 2025 GaoKunW
+ *
+ */
+
+package org.eco.vip.auth.mapper;
+
+
+import com.mybatisflex.core.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import org.eco.vip.auth.domain.role.RoleMenu;
+
+/**
+ * @description RoleMenuMapper
+ *
+ * @author GaoKunW
+ * @date 2025/7/8 11:45
+ */
+@Mapper
+public interface RoleMenuMapper extends BaseMapper<RoleMenu> {
+}

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

@@ -6,6 +6,7 @@
 package org.eco.vip.auth.service.menu;
 
 
+import cn.hutool.core.lang.tree.Tree;
 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;
@@ -13,7 +14,6 @@ import org.eco.vip.orm.pojo.PageResult;
 import org.eco.vip.orm.service.IBaseService;
 
 import java.util.List;
-import java.util.Set;
 
 /**
  * @description IMenuService
@@ -38,6 +38,12 @@ public interface IMenuService extends IBaseService<Menu> {
      **/
     List<MenuVO> selectList(MenuBO menuBO);
 
+    /**
+     * @description: 查询树
+     * @return List<Tree < String>>
+     **/
+    List<Tree<String>> tree();
+
     /**
      * @description: 新增
      * @param menuBO 参数
@@ -67,4 +73,11 @@ public interface IMenuService extends IBaseService<Menu> {
      */
     MenuVO selectById(String id);
 
+    /**
+     * 获取用户菜单路由数据
+     *
+     * @return 用户菜单路由数据
+     */
+    List<Tree<String>> getRouters();
+
 }

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

@@ -6,20 +6,28 @@
 package org.eco.vip.auth.service.menu;
 
 
+import cn.hutool.core.lang.tree.Tree;
+import cn.hutool.core.lang.tree.TreeNode;
 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.service.role.IRoleService;
+import org.eco.vip.auth.service.user.IUserService;
 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.TreeUtils;
+import org.eco.vip.security.utils.LoginHelper;
 import org.springframework.stereotype.Service;
 
 import java.util.List;
+import java.util.stream.Collectors;
 
 import static org.eco.vip.auth.domain.menu.table.MenuTableDef.MENU;
 
@@ -35,6 +43,12 @@ public class MenuService extends BaseService<MenuMapper, Menu> implements IMenuS
     @Resource
     private MenuMapper menuMapper;
 
+    @Resource
+    private IRoleService roleService;
+
+    @Resource
+    private IUserService userService;
+
     private QueryWrapper buildQueryWrapper(MenuBO menuBO) {
         return super.buildBaseQueryWrapper()
                 .and(MENU.CODE.eq(menuBO.getCode()))
@@ -58,6 +72,15 @@ public class MenuService extends BaseService<MenuMapper, Menu> implements IMenuS
         return menuMapper.selectListWithRelationsByQueryAs(queryWrapper, MenuVO.class);
     }
 
+    @Override
+    public List<Tree<String>> tree() {
+        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))
+        ).collect(Collectors.toList()), "0");
+    }
+
     @Override
     public boolean insert(MenuBO menuBO) {
         Menu menu = MapstructUtils.convert(menuBO, Menu.class);
@@ -81,4 +104,14 @@ public class MenuService extends BaseService<MenuMapper, Menu> implements IMenuS
     public MenuVO selectById(String id) {
         return null;
     }
+
+    @Override
+    public List<Tree<String>> getRouters() {
+        String userId = LoginHelper.getUserId();
+        List<String> roleIds = userService.selectRoleIdByUserId(userId);
+        List<String> menuIds = roleService.selectMenuIdsByRoleIds(roleIds);
+
+//        roleService
+        return List.of();
+    }
 }

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

@@ -70,8 +70,7 @@ public class OrgService extends BaseService<OrgMapper, Org> implements IOrgServi
 
     @Override
     public List<Tree<String>> tree() {
-        QueryWrapper wrapper = QueryWrapper.create()
-                .orderBy(Org::getOrderNum).asc();
+        QueryWrapper wrapper = QueryWrapper.create().orderBy(Org::getOrderNum).asc();
         List<Org> list = this.list(wrapper);
         return TreeUtils.build(list.stream().map(org ->
                 new TreeNode<>(org.getOrgId(), org.getParentId(), org.getName(), org.getOrderNum()).setExtra(JsonUtils.parseObj(org))

+ 1 - 4
eco-nexus-core/auth-biz/src/main/java/org/eco/vip/auth/service/permission/PermissionService.java

@@ -36,13 +36,10 @@ public class PermissionService extends BaseService<PermissionMapper, Permission>
     @Resource
     private IRoleService roleService;
 
-    @Resource
-    private PermissionMapper permissionMapper;
-
     @Override
     public List<PermissionVO> selectList() {
         QueryWrapper queryWrapper = new QueryWrapper();
-        return permissionMapper.selectListWithRelationsByQueryAs(queryWrapper, PermissionVO.class);
+        return this.listAs(queryWrapper, PermissionVO.class);
     }
 
     @Override

+ 16 - 0
eco-nexus-core/auth-biz/src/main/java/org/eco/vip/auth/service/role/IRoleMenuService.java

@@ -0,0 +1,16 @@
+/*
+ * Copyright (c) 2025 GaoKunW
+ *
+ */
+
+package org.eco.vip.auth.service.role;
+
+
+/**
+ * @description IRoleMenuService
+ *
+ * @author GaoKunW
+ * @date 2025/7/8 11:45
+ */
+public interface IRoleMenuService {
+}

+ 16 - 0
eco-nexus-core/auth-biz/src/main/java/org/eco/vip/auth/service/role/IRoleService.java

@@ -7,6 +7,7 @@ package org.eco.vip.auth.service.role;
 
 
 import org.eco.vip.auth.domain.role.Role;
+import org.eco.vip.auth.domain.role.RoleMenu;
 import org.eco.vip.auth.domain.role.RolePerm;
 import org.eco.vip.auth.domain.role.pojo.RoleBO;
 import org.eco.vip.auth.domain.role.pojo.RoleVO;
@@ -51,6 +52,13 @@ public interface IRoleService extends IBaseService<Role> {
      **/
     boolean insertPerm(RolePerm rolePerm);
 
+    /**
+     * @description: 新增
+     * @param roleMenu 参数
+     * @return boolean 是否成功
+     **/
+    boolean insertMenu(RoleMenu roleMenu);
+
     /**
      * @description: 更新
      * @param roleBO 参数
@@ -88,4 +96,12 @@ public interface IRoleService extends IBaseService<Role> {
      * @return 权限列表
      */
     List<String> selectRoleCodesByUserId(String userId);
+
+    /**
+     * 根据角色IDS查询角色菜单权限
+     *
+     * @param ids IDS
+     * @return 菜单IDS
+     */
+    List<String> selectMenuIdsByRoleIds(List<String> ids);
 }

+ 16 - 0
eco-nexus-core/auth-biz/src/main/java/org/eco/vip/auth/service/role/RoleMenuService.java

@@ -0,0 +1,16 @@
+/*
+ * Copyright (c) 2025 GaoKunW
+ *
+ */
+
+package org.eco.vip.auth.service.role;
+
+
+/**
+ * @description RoleMenuService
+ *
+ * @author GaoKunW
+ * @date 2025/7/8 11:45
+ */
+public class RoleMenuService {
+}

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

@@ -11,10 +11,12 @@ import com.mybatisflex.core.query.QueryWrapper;
 import jakarta.annotation.Resource;
 import lombok.extern.slf4j.Slf4j;
 import org.eco.vip.auth.domain.role.Role;
+import org.eco.vip.auth.domain.role.RoleMenu;
 import org.eco.vip.auth.domain.role.RolePerm;
 import org.eco.vip.auth.domain.role.pojo.RoleBO;
 import org.eco.vip.auth.domain.role.pojo.RoleVO;
 import org.eco.vip.auth.mapper.RoleMapper;
+import org.eco.vip.auth.mapper.RoleMenuMapper;
 import org.eco.vip.auth.mapper.RolePermMapper;
 import org.eco.vip.orm.pojo.PageResult;
 import org.eco.vip.orm.service.BaseService;
@@ -25,6 +27,7 @@ import java.util.List;
 
 import static org.eco.vip.auth.domain.org.table.OrgTableDef.ORG;
 import static org.eco.vip.auth.domain.permission.table.PermissionTableDef.PERMISSION;
+import static org.eco.vip.auth.domain.role.table.RoleMenuTableDef.ROLE_MENU;
 import static org.eco.vip.auth.domain.role.table.RolePermTableDef.ROLE_PERM;
 import static org.eco.vip.auth.domain.role.table.RoleTableDef.ROLE;
 import static org.eco.vip.auth.domain.user.table.UserRoleTableDef.USER_ROLE;
@@ -42,6 +45,9 @@ public class RoleService extends BaseService<RoleMapper, Role> implements IRoleS
     @Resource
     private RolePermMapper rolePermMapper;
 
+    @Resource
+    private RoleMenuMapper roleMenuMapper;
+
     @Override
     public PageResult<RoleVO> selectPage(RoleBO roleBO) {
         return null;
@@ -63,6 +69,11 @@ public class RoleService extends BaseService<RoleMapper, Role> implements IRoleS
         return rolePermMapper.insert(rolePerm) > 0;
     }
 
+    @Override
+    public boolean insertMenu(RoleMenu roleMenu) {
+        return roleMenuMapper.insert(roleMenu) > 0;
+    }
+
     @Override
     public boolean update(RoleBO roleBO) {
         return false;
@@ -102,4 +113,14 @@ public class RoleService extends BaseService<RoleMapper, Role> implements IRoleS
                 .where(USER.USER_ID.eq(userId));
         return this.listAs(queryWrapper, String.class);
     }
+
+    @Override
+    public List<String> selectMenuIdsByRoleIds(List<String> ids) {
+        QueryWrapper queryWrapper = QueryWrapper.create()
+                .select(QueryMethods.distinct(ROLE_MENU.MENU_ID))
+                .from(ROLE_MENU.as("rtm"))
+                .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);
+    }
 }

+ 8 - 1
eco-nexus-core/auth-biz/src/main/java/org/eco/vip/auth/service/user/IUserService.java

@@ -6,7 +6,6 @@
 package org.eco.vip.auth.service.user;
 
 
-import org.eco.vip.auth.domain.role.pojo.RoleVO;
 import org.eco.vip.auth.domain.user.User;
 import org.eco.vip.auth.domain.user.UserRole;
 import org.eco.vip.auth.domain.user.pojo.UserBO;
@@ -73,5 +72,13 @@ public interface IUserService extends IBaseService<User> {
      */
     UserVO selectById(String id);
 
+    /**
+     * 根据ID查询信息
+     *
+     * @param id ID
+     * @return 结果
+     */
+    List<String> selectRoleIdByUserId(String id);
+
     UserVO selectTenantUserByUserName(String tenantId, String username);
 }

+ 10 - 3
eco-nexus-core/auth-biz/src/main/java/org/eco/vip/auth/service/user/UserService.java

@@ -7,9 +7,9 @@ package org.eco.vip.auth.service.user;
 
 
 import com.mybatisflex.core.paginate.Page;
+import com.mybatisflex.core.query.QueryMethods;
 import com.mybatisflex.core.query.QueryWrapper;
 import jakarta.annotation.Resource;
-import org.eco.vip.auth.domain.role.pojo.RoleVO;
 import org.eco.vip.auth.domain.user.User;
 import org.eco.vip.auth.domain.user.UserRole;
 import org.eco.vip.auth.domain.user.pojo.UserBO;
@@ -24,6 +24,7 @@ import org.springframework.stereotype.Service;
 
 import java.util.List;
 
+import static org.eco.vip.auth.domain.user.table.UserRoleTableDef.USER_ROLE;
 import static org.eco.vip.auth.domain.user.table.UserTableDef.USER;
 
 /**
@@ -77,8 +78,9 @@ public class UserService extends BaseService<UserMapper, User> implements IUserS
     }
 
     @Override
-    public boolean update(UserBO roleBO) {
-        return false;
+    public boolean update(UserBO userBO) {
+        User user = MapstructUtils.convert(userBO, User.class);
+        return this.updateById(user);
     }
 
     @Override
@@ -91,6 +93,11 @@ public class UserService extends BaseService<UserMapper, User> implements IUserS
         return userMapper.selectOneWithRelationsByIdAs(id, UserVO.class);
     }
 
+    @Override
+    public List<String> selectRoleIdByUserId(String id) {
+        return userRoleMapper.selectListByQueryAs(QueryWrapper.create().select(QueryMethods.distinct(USER_ROLE.ROLE_ID)).where(USER_ROLE.USER_ID.eq(id)), String.class);
+    }
+
     @Override
     public UserVO selectTenantUserByUserName(String tenantId, String account) {
         QueryWrapper queryWrapper = buildOneQueryWrapper()

+ 12 - 0
eco-start/src/main/resources/db/mysql/V1_0_0_1__sys-init-ddl.sql

@@ -224,5 +224,17 @@ CREATE TABLE `system_position_t`
     PRIMARY KEY (`position_id`) USING BTREE
 ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '职位' ROW_FORMAT = DYNAMIC;
 
+-- ----------------------------
+-- Table structure for system_role_menu_t
+-- ----------------------------
+DROP TABLE IF EXISTS `system_role_menu_t`;
+CREATE TABLE `system_role_menu_t`
+(
+    `role_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '角色ID',
+    `menu_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '菜单ID',
+    PRIMARY KEY (`role_id`, `menu_id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '角色菜单' ROW_FORMAT = Dynamic;
+
+
 SET
 FOREIGN_KEY_CHECKS = 1;