소스 검색

1、菜单树形结构

machaoyi 1 년 전
부모
커밋
fc7931483f

+ 2 - 1
application/src/main/java/com/ctsi/SysMenu/controller/SysMenuController.java

@@ -1,6 +1,7 @@
 package com.ctsi.SysMenu.controller;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ctsi.SysMenu.entity.SysMenuSearchPO;
 import com.ctsi.entity.FramePage;
 import com.ctsi.utils.ApiResult;
 import io.swagger.annotations.Api;
@@ -51,7 +52,7 @@ public class SysMenuController{
      */
     @ApiOperation("分页查询")
     @GetMapping
-    public ApiResult<Page<SysMenu>> paginQuery(SysMenu sysMenu, FramePage framePage){
+    public ApiResult<Page<SysMenuSearchPO>> paginQuery(SysMenu sysMenu, FramePage framePage){
         try {
             return ApiResult.success(sysMenuService.paginQuery(sysMenu, framePage.getPageNum(), framePage.getPageSize()));
         } catch (Exception e) {

+ 113 - 0
application/src/main/java/com/ctsi/SysMenu/entity/SysMenuSearchPO.java

@@ -0,0 +1,113 @@
+package com.ctsi.SysMenu.entity;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.ctsi.utils.LongtoStringSerialize;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+
+/**
+* 菜单;
+* @author : machaoyi
+* @date : 2024-1-10
+*/
+@ApiModel(value = "菜单信息查询PO",description = "")
+@TableName("sys_menu")
+public class SysMenuSearchPO implements Serializable,Cloneable{
+   /** 主键id */
+   @ApiModelProperty(value = "主键id",notes = "")
+   @TableId
+   @JsonSerialize(using = LongtoStringSerialize.class)
+   private Long id ;
+   /** 标题 */
+   @ApiModelProperty(value = "标题",notes = "")
+   private String menuTitle ;
+   /** 父级 */
+   @ApiModelProperty(value = "父级",notes = "")
+   private Long parentId ;
+   /** 编码 */
+   @ApiModelProperty(value = "编码",notes = "")
+   private String menuCode ;
+   /** 名称 */
+   @ApiModelProperty(value = "名称",notes = "")
+   private String menuName ;
+   /** 图标 */
+   @ApiModelProperty(value = "图标",notes = "")
+   private String menuIcon ;
+   /** 排序 */
+   @ApiModelProperty(value = "排序",notes = "")
+   private Integer orderBy ;
+   /** 子菜单 */
+    @ApiModelProperty(value = "子菜单",notes = "")
+    private List<SysMenuSearchPO> children;
+
+   /** 主键id */
+   public Long getId(){
+       return this.id;
+   }
+   /** 主键id */
+   public void setId(Long id){
+       this.id=id;
+   }
+   /** 标题 */
+   public String getMenuTitle(){
+       return this.menuTitle;
+   }
+   /** 标题 */
+   public void setMenuTitle(String menuTitle){
+       this.menuTitle=menuTitle;
+   }
+   /** 父级 */
+   public Long getParentId(){
+       return this.parentId;
+   }
+   /** 父级 */
+   public void setParentId(Long parentId){
+       this.parentId=parentId;
+   }
+   /** 编码 */
+   public String getMenuCode(){
+       return this.menuCode;
+   }
+   /** 编码 */
+   public void setMenuCode(String menuCode){
+       this.menuCode=menuCode;
+   }
+   /** 名称 */
+   public String getMenuName(){
+       return this.menuName;
+   }
+   /** 名称 */
+   public void setMenuName(String menuName){
+       this.menuName=menuName;
+   }
+   /** 图标 */
+   public String getMenuIcon(){
+       return this.menuIcon;
+   }
+   /** 图标 */
+   public void setMenuIcon(String menuIcon){
+       this.menuIcon=menuIcon;
+   }
+   /** 排序 */
+   public Integer getOrderBy(){
+       return this.orderBy;
+   }
+   /** 排序 */
+   public void setOrderBy(Integer orderBy){
+       this.orderBy=orderBy;
+   }
+
+   public List<SysMenuSearchPO> getChildren() {
+      return children;
+   }
+
+   public void setChildren(List<SysMenuSearchPO> children) {
+      this.children = children;
+   }
+}

+ 2 - 1
application/src/main/java/com/ctsi/SysMenu/mapper/SysMenuMapper.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Constants;
+import com.github.yulichang.base.MPJBaseMapper;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 import com.ctsi.SysMenu.entity.SysMenu;
@@ -14,7 +15,7 @@ import com.ctsi.SysMenu.entity.SysMenu;
  * @date : 2024-1-10
  */
 @Mapper
-public interface SysMenuMapper  extends BaseMapper<SysMenu>{
+public interface SysMenuMapper  extends MPJBaseMapper<SysMenu> {
     /** 
      * 分页查询指定行数据
      *

+ 3 - 2
application/src/main/java/com/ctsi/SysMenu/service/SysMenuService.java

@@ -2,8 +2,9 @@ package com.ctsi.SysMenu.service;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ctsi.SysMenu.entity.SysMenu;
+import com.ctsi.SysMenu.entity.SysMenuSearchPO;
 
- /**
+/**
  * 菜单;(sys_menu)表服务接口
  * @author : machaoyi
  * @date : 2024-1-10
@@ -26,7 +27,7 @@ public interface SysMenuService{
      * @param size  每页大小
      * @return
      */
-    Page<SysMenu> paginQuery(SysMenu sysMenu, long current, long size);
+    Page<SysMenuSearchPO> paginQuery(SysMenu sysMenu, long current, long size);
     /** 
      * 新增数据
      *

+ 58 - 15
application/src/main/java/com/ctsi/SysMenu/service/impl/SysMenuServiceImpl.java

@@ -1,6 +1,9 @@
 package com.ctsi.SysMenu.service.impl;
 
 import cn.hutool.core.util.StrUtil;
+import com.ctsi.SysMenu.entity.SysMenuSearchPO;
+import com.ctsi.SysOrg.entity.SysOrgSearchPO;
+import com.github.yulichang.wrapper.MPJLambdaWrapper;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -10,7 +13,10 @@ import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWra
 import com.ctsi.SysMenu.entity.SysMenu;
 import com.ctsi.SysMenu.mapper.SysMenuMapper;
 import com.ctsi.SysMenu.service.SysMenuService;
- /**
+
+import java.util.*;
+
+/**
  * 菜单;(sys_menu)表服务实现类
  * @author : machaoyi
  * @date : 2024-1-10
@@ -19,9 +25,9 @@ import com.ctsi.SysMenu.service.SysMenuService;
 public class SysMenuServiceImpl implements SysMenuService{
     @Autowired
     private SysMenuMapper sysMenuMapper;
-    
-    /** 
-     * 通过ID查询单条数据 
+
+    /**
+     * 通过ID查询单条数据
      *
      * @param id 主键
      * @return 实例对象
@@ -29,7 +35,7 @@ public class SysMenuServiceImpl implements SysMenuService{
     public SysMenu queryById(Long id){
         return sysMenuMapper.selectById(id);
     }
-    
+
     /**
      * 分页查询
      *
@@ -38,9 +44,9 @@ public class SysMenuServiceImpl implements SysMenuService{
      * @param size  每页大小
      * @return
      */
-    public Page<SysMenu> paginQuery(SysMenu sysMenu, long current, long size){
+    public Page<SysMenuSearchPO> paginQuery(SysMenu sysMenu, long current, long size){
         //1. 构建动态查询条件
-        LambdaQueryWrapper<SysMenu> queryWrapper = new LambdaQueryWrapper<>();
+        MPJLambdaWrapper<SysMenu> queryWrapper = new MPJLambdaWrapper<>();
         if(StrUtil.isNotBlank(sysMenu.getMenuTitle())){
             queryWrapper.eq(SysMenu::getMenuTitle, sysMenu.getMenuTitle());
         }
@@ -53,17 +59,19 @@ public class SysMenuServiceImpl implements SysMenuService{
         if(StrUtil.isNotBlank(sysMenu.getMenuIcon())){
             queryWrapper.eq(SysMenu::getMenuIcon, sysMenu.getMenuIcon());
         }
+        queryWrapper.orderByAsc("ORDER_BY");
         //2. 执行分页查询
-        Page<SysMenu> pagin = new Page<>(current , size , true);
-        IPage<SysMenu> selectResult = sysMenuMapper.selectPage(pagin , queryWrapper);
+        Page<SysMenuSearchPO> pagin = new Page<>(current , size , true);
+        IPage<SysMenuSearchPO> selectResult = sysMenuMapper.selectJoinPage(pagin , SysMenuSearchPO.class, queryWrapper);
+        selectResult.setRecords(buildTree(selectResult.getRecords()));
         pagin.setPages(selectResult.getPages());
         pagin.setTotal(selectResult.getTotal());
         pagin.setRecords(selectResult.getRecords());
         //3. 返回结果
         return pagin;
     }
-    
-    /** 
+
+    /**
      * 新增数据
      *
      * @param sysMenu 实例对象
@@ -73,8 +81,8 @@ public class SysMenuServiceImpl implements SysMenuService{
         sysMenuMapper.insert(sysMenu);
         return sysMenu;
     }
-    
-    /** 
+
+    /**
      * 更新数据
      *
      * @param sysMenu 实例对象
@@ -105,8 +113,8 @@ public class SysMenuServiceImpl implements SysMenuService{
             return sysMenu;
         }
     }
-    
-    /** 
+
+    /**
      * 通过主键删除数据
      *
      * @param id 主键
@@ -116,4 +124,39 @@ public class SysMenuServiceImpl implements SysMenuService{
         int total = sysMenuMapper.deleteById(id);
         return total > 0;
     }
+    public static List<SysMenuSearchPO> buildTree(List<SysMenuSearchPO> nodeList) {
+        Map<Long, SysMenuSearchPO> nodeMap = new LinkedHashMap<>();
+
+        // 将节点放入 Map 中,方便通过 id 查找
+        for (SysMenuSearchPO node : nodeList) {
+            nodeMap.put(node.getId(), node);
+        }
+
+        List<SysMenuSearchPO> tree = new ArrayList<>();
+
+        // 逐个节点构建树
+        for (SysMenuSearchPO node : nodeList) {
+            if (node.getParentId() == 0) {
+                // 根节点
+                tree.add(buildTreeRecursively(node, nodeMap, node.getId()));
+            }
+        }
+
+        return tree;
+    }
+
+    private static SysMenuSearchPO buildTreeRecursively(SysMenuSearchPO parentNode, Map<Long, SysMenuSearchPO> nodeMap, Long parentId) {
+        List<SysMenuSearchPO> children = new ArrayList<>();
+
+        // 查找当前节点的子节点
+        nodeMap.forEach((id, node) -> {
+            if (Objects.equals(node.getParentId(), parentId)) {
+                children.add(buildTreeRecursively(node, nodeMap, node.getId()));
+            }
+        });
+        // 将子节点设置到父节点
+        parentNode.setChildren(children);
+
+        return parentNode;
+    }
 }