Просмотр исходного кода

feat:菜单管理的菜单树列表接口完成

wangzaijun 7 месяцев назад
Родитель
Сommit
f1b3c53165
22 измененных файлов с 210 добавлено и 72 удалено
  1. 1 3
      service-base/src/main/java/com/simuwang/base/common/support/command/BaseIdStatusCmd.java
  2. 1 1
      service-base/src/main/java/com/simuwang/base/config/ShiroConfig.java
  3. 19 4
      service-base/src/main/java/com/simuwang/base/pojo/dos/sys/SysMenuDO.java
  4. 1 1
      service-base/src/main/java/com/simuwang/base/pojo/dos/sys/SysRoleDO.java
  5. 2 2
      service-base/src/main/java/com/simuwang/base/pojo/dos/sys/SysRoleUserDO.java
  6. 1 1
      service-base/src/main/java/com/simuwang/base/pojo/dos/sys/SysUserDO.java
  7. 0 1
      service-base/src/main/java/com/simuwang/base/pojo/dto/UpdateStatusCmd.java
  8. 19 0
      service-base/src/main/java/com/simuwang/base/pojo/dto/sys/MenuTreeQuery.java
  9. 4 4
      service-base/src/main/java/com/simuwang/base/pojo/vo/sys/SysMenuVO.java
  10. 1 1
      service-base/src/main/java/com/simuwang/base/pojo/vo/sys/SysRoleUserVO.java
  11. 1 1
      service-base/src/main/java/com/simuwang/base/pojo/vo/sys/SysRoleVO.java
  12. 1 1
      service-base/src/main/java/com/simuwang/base/pojo/vo/sys/SysUserVO.java
  13. 4 5
      service-base/src/main/java/com/simuwang/shiro/core/impl/ShiroDbRealmImpl.java
  14. 1 1
      service-base/src/main/java/com/simuwang/shiro/core/ShiroUser.java
  15. 1 1
      service-base/src/main/java/com/simuwang/shiro/core/adapter/SimpleLoginAuthAdapter.java
  16. 18 0
      service-manage/src/main/java/com/simuwang/manage/api/system/SysMenuController.java
  17. 34 8
      service-manage/src/main/java/com/simuwang/manage/dto/UserMenuTreeDTO.java
  18. 4 4
      service-manage/src/main/java/com/simuwang/manage/dto/UserInfoVO.java
  19. 5 5
      service-manage/src/main/java/com/simuwang/manage/service/LoginService.java
  20. 80 26
      service-manage/src/main/java/com/simuwang/manage/service/impl/system/SysMenuServiceImpl.java
  21. 1 1
      service-manage/src/main/java/com/simuwang/manage/service/impl/system/SysRoleServiceImpl.java
  22. 11 1
      service-manage/src/main/java/com/simuwang/manage/service/system/SysMenuService.java

+ 1 - 3
service-base/src/main/java/com/simuwang/base/common/support/command/BaseIdStatusCmd.java

@@ -13,15 +13,13 @@ import lombok.Setter;
 @Getter
 public abstract class BaseIdStatusCmd extends BaseCmd {
     /**
-     * 状态,0-启用,1-禁用
+     * 状态,1-启用,0-禁用
      */
     @NotNull(message = "状态不能为空")
     private Integer status;
 
     public abstract Integer getId();
 
-    public abstract void setId(Integer id);
-
     public Integer getStatus() {
         return status;
     }

+ 1 - 1
service-base/src/main/java/com/simuwang/base/config/ShiroConfig.java

@@ -7,7 +7,7 @@ import com.simuwang.base.components.UserAuthService;
 import com.simuwang.shiro.core.ShiroDbRealm;
 import com.simuwang.shiro.core.adapter.LoginAuthAdapter;
 import com.simuwang.shiro.core.bridge.AuthBridgeService;
-import com.simuwang.shiro.core.impl.ShiroDbRealmImpl;
+import com.simuwang.shiro.core.ShiroDbRealmImpl;
 import com.simuwang.shiro.core.jwt.JwtContext;
 import com.simuwang.shiro.core.jwt.JwtFilter;
 import jakarta.servlet.Filter;

+ 19 - 4
service-base/src/main/java/com/simuwang/base/pojo/dos/sys/SysMenuDO.java

@@ -8,6 +8,8 @@ import com.simuwang.base.pojo.vo.sys.SysMenuVO;
 import lombok.Getter;
 import lombok.Setter;
 
+import java.util.Objects;
+
 /**
  * FileName: SysMenuDO
  * Author:   chenjianhua
@@ -55,12 +57,12 @@ public class SysMenuDO extends BaseEntity<SysMenuVO> {
     private String query;
 
     /**
-     * 是否为外链(0是 1否)
+     * 是否为外链(1是 0否)
      */
     private Integer isFrame;
 
     /**
-     * 是否缓存(0缓存 1不缓存)
+     * 是否缓存(1缓存 0不缓存)
      */
     private Integer isCache;
 
@@ -70,12 +72,12 @@ public class SysMenuDO extends BaseEntity<SysMenuVO> {
     private String menuType;
 
     /**
-     * 显示状态(0显示 1隐藏)
+     * 显示状态(1显示 0隐藏)
      */
     private Integer visible;
 
     /**
-     * 菜单状态(0正常 1停用)
+     * 菜单状态(1正常 0停用)
      */
     private Integer status;
 
@@ -115,4 +117,17 @@ public class SysMenuDO extends BaseEntity<SysMenuVO> {
         vo.setCreateTime(this.getCreateTime());
         return vo;
     }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        SysMenuDO sysMenuDO = (SysMenuDO) o;
+        return menuId.equals(sysMenuDO.menuId) && parentId.equals(sysMenuDO.parentId) && perms.equals(sysMenuDO.perms);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(menuId, parentId, perms);
+    }
 }

+ 1 - 1
service-base/src/main/java/com/simuwang/base/pojo/dos/sys/SysRoleDO.java

@@ -45,7 +45,7 @@ public class SysRoleDO extends BaseEntity<SysRoleVO> {
 //    private String dataScope;
 
     /**
-     * 角色状态(0正常 1停用)
+     * 角色状态(1正常 0停用)
      */
     private Integer status;
 

+ 2 - 2
service-base/src/main/java/com/simuwang/base/pojo/dos/sys/SysRoleUserDO.java

@@ -26,7 +26,7 @@ public class SysRoleUserDO extends BaseEntity<SysRoleUserVO> {
     private Integer roleSort;
 
     /**
-     * 角色状态(0正常 1停用)
+     * 角色状态(1正常 0停用)
      */
     private Integer status;
 
@@ -51,7 +51,7 @@ public class SysRoleUserDO extends BaseEntity<SysRoleUserVO> {
      */
     private String phonenumber;
     /**
-     * 帐号状态(0正常 1停用)
+     * 帐号状态(1正常 0停用)
      */
     private Integer userStatus;
 

+ 1 - 1
service-base/src/main/java/com/simuwang/base/pojo/dos/sys/SysUserDO.java

@@ -59,7 +59,7 @@ public class SysUserDO extends BaseEntity<SysUserVO> {
      */
     private String password;
     /**
-     * 帐号状态(0正常 1停用)
+     * 帐号状态(1正常 0停用)
      */
     private Integer status;
 

+ 0 - 1
service-base/src/main/java/com/simuwang/base/pojo/dto/UpdateStatusCmd.java

@@ -17,7 +17,6 @@ public class UpdateStatusCmd extends BaseIdStatusCmd {
         return id;
     }
 
-    @Override
     public void setId(Integer id) {
         this.id = id;
     }

+ 19 - 0
service-base/src/main/java/com/simuwang/base/pojo/dto/sys/MenuTreeQuery.java

@@ -0,0 +1,19 @@
+package com.simuwang.base.pojo.dto.sys;
+
+import com.simuwang.base.common.support.query.BaseQuery;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @author wangzaijun
+ * @date 2024/9/14 10:19
+ * @description 菜单树列表接口请求参数
+ */
+@Setter
+@Getter
+public class MenuTreeQuery extends BaseQuery {
+    /**
+     * 状态,1-启用,0-禁用
+     */
+    private Integer status;
+}

+ 4 - 4
service-base/src/main/java/com/simuwang/base/pojo/vo/sys/SysMenuVO.java

@@ -52,12 +52,12 @@ public class SysMenuVO extends BaseVO {
     private String query;
 
     /**
-     * 是否为外链(0是 1否)
+     * 是否为外链(1是 0否)
      */
     private Integer isFrame;
 
     /**
-     * 是否缓存(0缓存 1不缓存)
+     * 是否缓存(1缓存 0不缓存)
      */
     private Integer isCache;
 
@@ -67,12 +67,12 @@ public class SysMenuVO extends BaseVO {
     private String menuType;
 
     /**
-     * 显示状态(0显示 1隐藏)
+     * 显示状态(1显示 0隐藏)
      */
     private Integer visible;
 
     /**
-     * 菜单状态(0正常 1停用)
+     * 菜单状态(1正常 0停用)
      */
     private Integer status;
 

+ 1 - 1
service-base/src/main/java/com/simuwang/base/pojo/vo/sys/SysRoleUserVO.java

@@ -28,7 +28,7 @@ public class SysRoleUserVO extends SysRoleVO {
      */
     private String phonenumber;
     /**
-     * 帐号状态(0正常 1停用)
+     * 帐号状态(1正常 0停用)
      */
     private Integer userStatus;
 }

+ 1 - 1
service-base/src/main/java/com/simuwang/base/pojo/vo/sys/SysRoleVO.java

@@ -41,7 +41,7 @@ public class SysRoleVO extends BaseVO {
 //    private String dataScope;
 
     /**
-     * 角色状态(0正常 1停用)
+     * 角色状态(1正常 0停用)
      */
     private Integer status;
 

+ 1 - 1
service-base/src/main/java/com/simuwang/base/pojo/vo/sys/SysUserVO.java

@@ -55,7 +55,7 @@ public class SysUserVO extends BaseVO {
      */
     private String password;
     /**
-     * 帐号状态(0正常 1停用)
+     * 帐号状态(1正常 0停用)
      */
     private Integer status;
 

+ 4 - 5
service-base/src/main/java/com/simuwang/shiro/core/impl/ShiroDbRealmImpl.java

@@ -1,7 +1,6 @@
-package com.simuwang.shiro.core.impl;
+package com.simuwang.shiro.core;
 
-import com.simuwang.shiro.core.ShiroDbRealm;
-import com.simuwang.shiro.core.ShiroUser;
+import com.simuwang.base.common.exception.APIException;
 import com.simuwang.shiro.core.bridge.AuthBridgeService;
 import org.apache.shiro.authc.*;
 import org.apache.shiro.authc.credential.CredentialsMatcher;
@@ -35,8 +34,8 @@ public class ShiroDbRealmImpl extends ShiroDbRealm {
         if (shiroUser == null) {
             throw new UnknownAccountException("账号不存在");
         }
-        if (Objects.equals(1, shiroUser.getStatus())) {
-            throw new UnknownAccountException("账号已停用");
+        if (!Objects.equals(1, shiroUser.getStatus())) {
+            throw new APIException("账号已禁用");
         }
         shiroUser.setPermissionCodes(this.authBridgeService.findPermissions(shiroUser.getUserId()));
         return new SimpleAuthenticationInfo(shiroUser, shiroUser.getPassword(), getName());

+ 1 - 1
service-base/src/main/java/com/simuwang/shiro/core/ShiroUser.java

@@ -21,7 +21,7 @@ public class ShiroUser {
     @JsonIgnore
     private String password;
     /**
-     * 用户状态,0-正常,1-停用
+     * 用户状态,1-正常,0-停用
      */
     private Integer status;
     /**

+ 1 - 1
service-base/src/main/java/com/simuwang/shiro/core/adapter/SimpleLoginAuthAdapter.java

@@ -18,7 +18,7 @@ public class SimpleLoginAuthAdapter implements LoginAuthAdapter {
         sysUser.setUserId(0);
         sysUser.setUsername("admin");
         sysUser.setPassword(new SimpleHash("SHA-256", "123456", "1234567890abcdef", 1000).toHex());
-        sysUser.setStatus(0);
+        sysUser.setStatus(1);
         return sysUser;
     }
 

+ 18 - 0
service-manage/src/main/java/com/simuwang/manage/api/system/SysMenuController.java

@@ -6,11 +6,15 @@ import com.simuwang.base.pojo.dto.UpdateStatusCmd;
 import com.simuwang.base.pojo.dto.sys.MenuAddCmd;
 import com.simuwang.base.pojo.dto.sys.MenuEditCmd;
 import com.simuwang.base.pojo.dto.sys.MenuQuery;
+import com.simuwang.base.pojo.dto.sys.MenuTreeQuery;
 import com.simuwang.base.pojo.vo.sys.SysMenuVO;
+import com.simuwang.manage.dto.MenuTreeDTO;
 import com.simuwang.manage.service.system.SysMenuService;
 import jakarta.validation.Valid;
 import org.springframework.web.bind.annotation.*;
 
+import java.util.List;
+
 /**
  * 菜单管理相关接口
  */
@@ -28,13 +32,27 @@ public class SysMenuController {
      *
      * @param query 菜单列表分页请求参数
      * @return /
+     * @deprecated 菜单管理一般不分页展示,而是菜单树列表展示
+     * @see #menuTrees(MenuTreeQuery)
      */
     @GetMapping("page")
+    @Deprecated
     public MybatisPage<SysMenuVO> page(MenuQuery query) {
         return this.service.findPage(query);
     }
 
     /**
+     * 菜单树列表
+     *
+     * @param query 查询条件
+     * @return /
+     */
+    @GetMapping("tree")
+    public List<MenuTreeDTO> menuTrees(MenuTreeQuery query) {
+        return this.service.listMenuTrees(query);
+    }
+
+    /**
      * 新增菜单
      *
      * @param command 菜单信息

+ 34 - 8
service-manage/src/main/java/com/simuwang/manage/dto/UserMenuTreeDTO.java

@@ -10,7 +10,7 @@ import java.util.List;
  * @date 2024/9/13 8:41
  * @description 用户菜单树
  */
-public class UserMenuTreeDTO {
+public class MenuTreeDTO {
     /**
      * 当前菜单id
      */
@@ -48,7 +48,15 @@ public class UserMenuTreeDTO {
      */
     private String menuType;
     /**
-     * 显示状态(0显示 1隐藏)
+     * 是否为外链(1是 0否)
+     */
+    private Integer isFrame;
+    /**
+     * 是否缓存(1缓存 0不缓存)
+     */
+    private Integer isCache;
+    /**
+     * 显示状态(1显示 0隐藏)
      */
     private Integer visible;
     /**
@@ -58,20 +66,20 @@ public class UserMenuTreeDTO {
     /**
      * 子菜单
      */
-    private List<UserMenuTreeDTO> children;
+    private List<MenuTreeDTO> children;
 
-    public UserMenuTreeDTO() {
+    public MenuTreeDTO() {
         this.children = ListUtil.list(false);
     }
 
-    public UserMenuTreeDTO(Integer id, String name, List<UserMenuTreeDTO> children) {
+    public MenuTreeDTO(Integer id, String name, List<MenuTreeDTO> children) {
         this();
         this.id = id;
         this.name = name;
         this.children = children;
     }
 
-    public UserMenuTreeDTO(SysMenuDO menuDO) {
+    public MenuTreeDTO(SysMenuDO menuDO) {
         this();
         this.id = menuDO.getMenuId();
         this.name = menuDO.getMenuName();
@@ -82,6 +90,8 @@ public class UserMenuTreeDTO {
         this.component = menuDO.getComponent();
         this.query = menuDO.getQuery();
         this.menuType = menuDO.getMenuType();
+        this.isFrame = menuDO.getIsFrame();
+        this.isCache = menuDO.getIsCache();
         this.visible = menuDO.getVisible();
         this.icon = menuDO.getIcon();
     }
@@ -150,11 +160,11 @@ public class UserMenuTreeDTO {
         this.query = query;
     }
 
-    public List<UserMenuTreeDTO> getChildren() {
+    public List<MenuTreeDTO> getChildren() {
         return children;
     }
 
-    public void setChildren(List<UserMenuTreeDTO> children) {
+    public void setChildren(List<MenuTreeDTO> children) {
         this.children = children;
     }
 
@@ -166,6 +176,22 @@ public class UserMenuTreeDTO {
         this.menuType = menuType;
     }
 
+    public Integer getIsFrame() {
+        return isFrame;
+    }
+
+    public void setIsFrame(Integer isFrame) {
+        this.isFrame = isFrame;
+    }
+
+    public Integer getIsCache() {
+        return isCache;
+    }
+
+    public void setIsCache(Integer isCache) {
+        this.isCache = isCache;
+    }
+
     public Integer getVisible() {
         return visible;
     }

+ 4 - 4
service-manage/src/main/java/com/simuwang/manage/dto/UserInfoVO.java

@@ -31,12 +31,12 @@ public class UserInfoVO {
     /**
      * 菜单树
      */
-    private UserMenuTreeDTO menuTree;
+    private MenuTreeDTO menuTree;
 
     public UserInfoVO() {
     }
 
-    public UserInfoVO(Integer userId, String username, List<UserRoleDTO> roles, UserMenuTreeDTO menuTree) {
+    public UserInfoVO(Integer userId, String username, List<UserRoleDTO> roles, MenuTreeDTO menuTree) {
         this();
         this.userId = userId;
         this.username = username;
@@ -84,11 +84,11 @@ public class UserInfoVO {
         this.roles = roles;
     }
 
-    public UserMenuTreeDTO getMenuTree() {
+    public MenuTreeDTO getMenuTree() {
         return menuTree;
     }
 
-    public void setMenuTree(UserMenuTreeDTO menuTree) {
+    public void setMenuTree(MenuTreeDTO menuTree) {
         this.menuTree = menuTree;
     }
 }

+ 5 - 5
service-manage/src/main/java/com/simuwang/manage/service/LoginService.java

@@ -6,7 +6,7 @@ import com.simuwang.base.pojo.dos.sys.SysMenuDO;
 import com.simuwang.base.pojo.dos.sys.SysRoleDO;
 import com.simuwang.base.pojo.dos.sys.SysUserDO;
 import com.simuwang.manage.dto.UserInfoVO;
-import com.simuwang.manage.dto.UserMenuTreeDTO;
+import com.simuwang.manage.dto.MenuTreeDTO;
 import com.simuwang.manage.dto.UserRoleDTO;
 import com.simuwang.shiro.core.ShiroUser;
 import org.apache.shiro.SecurityUtils;
@@ -45,11 +45,11 @@ public class LoginService {
                 .distinct().collect(Collectors.toList());
         // 用户权限处理
         List<SysMenuDO> menuList = this.userAuthService.listUserMenuByUserId(userId);
-        List<UserMenuTreeDTO> tempList = menuList.stream().map(UserMenuTreeDTO::new).collect(Collectors.toList());
+        List<MenuTreeDTO> tempList = menuList.stream().map(MenuTreeDTO::new).collect(Collectors.toList());
         // 菜单列表转树结构
-        List<UserMenuTreeDTO> trees = TreeUtil.list2Tree(tempList, UserMenuTreeDTO::getId, UserMenuTreeDTO::getPid,
-                UserMenuTreeDTO::getChildren, UserMenuTreeDTO::setChildren, 0, UserMenuTreeDTO::getSort);
-        UserMenuTreeDTO root = new UserMenuTreeDTO(0, "全部菜单", trees);
+        List<MenuTreeDTO> trees = TreeUtil.list2Tree(tempList, MenuTreeDTO::getId, MenuTreeDTO::getPid,
+                MenuTreeDTO::getChildren, MenuTreeDTO::setChildren, 0, MenuTreeDTO::getSort);
+        MenuTreeDTO root = new MenuTreeDTO(0, "全部菜单", trees);
         // 返回的数据结构构建
         UserInfoVO vo = new UserInfoVO(userId, username, roles, root);
         vo.setEmail(userInfo.getEmail());

+ 80 - 26
service-manage/src/main/java/com/simuwang/manage/service/impl/system/SysMenuServiceImpl.java

@@ -1,56 +1,47 @@
 package com.simuwang.manage.service.impl.system;
 
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.collection.ListUtil;
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.simuwang.base.common.support.service.IService;
+import com.simuwang.base.common.exception.APIException;
 import com.simuwang.base.common.support.MybatisPage;
 import com.simuwang.base.common.support.command.BaseAddCmd;
 import com.simuwang.base.common.support.command.BaseEditCmd;
 import com.simuwang.base.common.support.command.BaseIdCmd;
 import com.simuwang.base.common.support.command.BaseIdStatusCmd;
-import com.simuwang.base.common.support.query.PageQuery;
+import com.simuwang.base.common.util.TreeUtil;
+import com.simuwang.base.components.UserAuthService;
 import com.simuwang.base.mapper.system.SysMenuMapper;
 import com.simuwang.base.pojo.dos.sys.SysMenuDO;
 import com.simuwang.base.pojo.dto.sys.MenuAddCmd;
 import com.simuwang.base.pojo.dto.sys.MenuEditCmd;
-import com.simuwang.base.pojo.dto.sys.MenuQuery;
+import com.simuwang.base.pojo.dto.sys.MenuTreeQuery;
 import com.simuwang.base.pojo.vo.sys.SysMenuVO;
+import com.simuwang.manage.dto.MenuTreeDTO;
 import com.simuwang.manage.service.system.SysMenuService;
+import com.simuwang.shiro.core.ShiroUser;
+import org.apache.shiro.SecurityUtils;
 import org.springframework.stereotype.Service;
 
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
 @Service
 public class SysMenuServiceImpl implements SysMenuService {
     private final SysMenuMapper mapper;
+    private final UserAuthService userAuthService;
 
-    public SysMenuServiceImpl(SysMenuMapper mapper) {
+    public SysMenuServiceImpl(SysMenuMapper mapper, UserAuthService userAuthService) {
         this.mapper = mapper;
-    }
-
-    @Override
-    public String[] selectColumns() {
-        return IService.extColumns(DEFAULT_SELECT_COLUMNS,
-                "menu_id", "menu_name", "parent_id", "order_num", "path", "component",
-                "query", "is_frame", "is_cache", "menu_type", "visible", "status", "perms", "icon");
-    }
-
-    @Override
-    public <Q extends PageQuery> void wrapQuery(QueryWrapper<SysMenuDO> wrapper, Q query) {
-        MenuQuery params = (MenuQuery) query;
-        String keyword = params.getKeyword();
-        if (StrUtil.isNotBlank(keyword)) {
-            wrapper.like("menu_name", keyword);
-        }
-        if (params.getStatus() != null) {
-            wrapper.eq("status", params.getStatus());
-        }
+        this.userAuthService = userAuthService;
     }
 
     @Override
     public MybatisPage<SysMenuVO> convertPage(Page<SysMenuDO> page, QueryWrapper<SysMenuDO> wrapper) {
-        IPage<SysMenuDO> entityPage = this.mapper.selectPage(page, wrapper);
-        return MybatisPage.ofList(entityPage, SysMenuDO::toVo);
+        throw new APIException("此接口菜单管理没有分页方法");
     }
 
     @Override
@@ -80,4 +71,67 @@ public class SysMenuServiceImpl implements SysMenuService {
         Integer id = command.getId();
         this.mapper.deleteById(id);
     }
+
+    @Override
+    public List<MenuTreeDTO> listMenuTrees(MenuTreeQuery query) {
+        // 先获取用户的所有菜单
+        ShiroUser shiroUser = (ShiroUser) SecurityUtils.getSubject().getPrincipal();
+        Integer userId = shiroUser.getUserId();
+        List<SysMenuDO> dataList = this.userAuthService.listUserMenuByUserId(userId);
+        // 当有查询条件时
+        if (query.getStatus() != null || StrUtil.isNotBlank(query.getKeyword())) {
+            // 按条件过滤找到所有满足条件的菜单
+            List<SysMenuDO> menuDos = ListUtil.toList(dataList);
+            if (StrUtil.isNotBlank(query.getKeyword())) {
+                menuDos = menuDos.stream().filter(e -> e.getMenuName().contains(query.getKeyword())).collect(Collectors.toList());
+            }
+            if (query.getStatus() != null) {
+                menuDos = menuDos.stream().filter(e -> Objects.equals(e.getStatus(), query.getStatus())).collect(Collectors.toList());
+            }
+            if (CollUtil.isEmpty(menuDos)) {
+                return ListUtil.empty();
+            }
+            // 从树结构中过滤不满足条件的数据
+            List<Integer> menuIds = menuDos.stream().map(SysMenuDO::getMenuId).collect(Collectors.toList());
+            dataList = this.findMenus(dataList, menuIds);
+        }
+        // 构建菜单树
+        List<MenuTreeDTO> tempList = dataList.stream().map(MenuTreeDTO::new).collect(Collectors.toList());
+        return TreeUtil.list2Tree(tempList, MenuTreeDTO::getId, MenuTreeDTO::getPid,
+                MenuTreeDTO::getChildren, MenuTreeDTO::setChildren, 0, MenuTreeDTO::getSort);
+    }
+
+    /**
+     * 从用户所有菜单中查找所有满足条件的菜单和其所有父级菜单列表
+     *
+     * @param dataList 用户所有菜单数据
+     * @param menuIds  满足条件的所有菜单id
+     * @return 满足条件的所有菜单id和其所有父级菜单id集合
+     */
+    private List<SysMenuDO> findMenus(List<SysMenuDO> dataList, List<Integer> menuIds) {
+        List<SysMenuDO> resultList = ListUtil.list(false);
+        for (Integer menuId : menuIds) {
+            List<SysMenuDO> tempList = ListUtil.list(false);
+            this.recursionMenus(dataList, menuId, tempList);
+            CollUtil.addAllIfNotContains(resultList, tempList);
+        }
+        return resultList;
+    }
+
+    /**
+     * 递归找当前菜单和所有父级菜单
+     *
+     * @param dataList   用户所有菜单列表
+     * @param menuId     要查找的菜单id
+     * @param resultList 查找后存储的数据集合
+     */
+    private void recursionMenus(List<SysMenuDO> dataList, Integer menuId, List<SysMenuDO> resultList) {
+        SysMenuDO result = dataList.stream().filter(e -> Objects.equals(menuId, e.getMenuId())).findFirst().orElse(null);
+        if (result == null) {
+            return;
+        }
+        resultList.add(result);
+        Integer parentId = result.getParentId();
+        this.recursionMenus(dataList, parentId, resultList);
+    }
 }

+ 1 - 1
service-manage/src/main/java/com/simuwang/manage/service/impl/system/SysRoleServiceImpl.java

@@ -40,7 +40,7 @@ public class SysRoleServiceImpl implements SysRoleService {
 
     @Override
     public String[] selectColumns() {
-        return IService.extColumns(DEFAULT_SELECT_COLUMNS, "role_id", "role_name", "role_sort", "role_key");
+        return IService.extColumns(DEFAULT_SELECT_COLUMNS, "role_id", "role_name", "role_sort", "role_key", "status");
     }
 
     @Override

+ 11 - 1
service-manage/src/main/java/com/simuwang/manage/service/system/SysMenuService.java

@@ -2,7 +2,11 @@ package com.simuwang.manage.service.system;
 
 import com.simuwang.base.common.support.service.IService;
 import com.simuwang.base.pojo.dos.sys.SysMenuDO;
+import com.simuwang.base.pojo.dto.sys.MenuTreeQuery;
 import com.simuwang.base.pojo.vo.sys.SysMenuVO;
+import com.simuwang.manage.dto.MenuTreeDTO;
+
+import java.util.List;
 
 /**
  * @author wangzaijun
@@ -10,5 +14,11 @@ import com.simuwang.base.pojo.vo.sys.SysMenuVO;
  * @description 系统菜单服务
  */
 public interface SysMenuService extends IService<SysMenuVO, SysMenuDO> {
-
+    /**
+     * 菜单树列表 todo
+     *
+     * @param query 查询参数
+     * @return /
+     */
+    List<MenuTreeDTO> listMenuTrees(MenuTreeQuery query);
 }