树形展示三级分类并分页:递归树形结构

今天在写一个项目的时候遇到了一个问题:如何写三级分类的接口?

经过多方查询资料 我解决了该问题

前端页面如下:

树形展示三级分类并分页:递归树形结构_第1张图片

 数据库:

树形展示三级分类并分页:递归树形结构_第2张图片

 在实体类中添加children

package com.example.humanresources.entity;

import java.util.Date;
import java.io.Serializable;
import java.util.List;

import lombok.Data;
@Data
public class BizProductCategory implements Serializable {
    private static final long serialVersionUID = 892831452437776529L;
    /**
    * 类别id
    */
    
    private Long id;
    /**
    * 类别名称
    */
    
    private String name;
    /**
    * 备注
    */
    
    private String remark;
    /**
    * 排序
    */
    
    private Integer sort;
    
    private Date createTime;
    
    private Date modifiedTime;
    /**
    * 父级分类id
    */
    
    private Long pid;

//    @TableField
    private List children;


}

在mybatis-plus中需要用到@TableField注解

由于我直接用的mybatis 所以直接将children添加为属性即可

因为只对一级分类进行分页,所以我又写了一个实体类:

package com.example.humanresources.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.List;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class BizProductCategoryPlus {
    private BizProductCategory bizProductCategory;
    private List rows;
    private int total;
}

service层代码:

  @Override
    public BizProductCategoryPlus listWithTree(int  pageNum, int pageSize) {
        // 1.查出所有分类
        List bizProductCategories = bizProductCategoryDao.selectAll();
        // 2.组装成父子树形结构
        // 2.1找出所有的一级分类
        List level1Menus = bizProductCategories.stream().filter(bizProductCategory ->
             bizProductCategory.getPid() == 0
        ).map((menu)->{
            menu.setChildren(getChildrens(menu,bizProductCategories));
            return menu;
        }).sorted((menu1,menu2)->{
            // 菜单的排序
            return (menu1.getSort()==null?0:menu1.getSort())-(menu2.getSort()==null?0:menu2.getSort());
        }).collect(Collectors.toList());
        //        List level1Menus = bizProductCategories.stream().filter((bizProductCategory) -> {
        //            return bizProductCategory.getPid() == 0;
        //        }).collect(Collectors.toList());
        List page = new ArrayList<>();
        int start = (pageNum-1)*pageSize;
        for (int i = start; i < (start+pageSize > level1Menus.size() ? level1Menus.size() : start+pageSize); i++) {
            page.add(level1Menus.get(i));
        }
        BizProductCategoryPlus bizProductCategoryPlus=new BizProductCategoryPlus();
        bizProductCategoryPlus.setRows(page);
        bizProductCategoryPlus.setTotal(level1Menus.size());
        return bizProductCategoryPlus;
    }

上面调用的递归方法:

//    递归查找所有菜单的子菜单
//    root为当前菜单 all是所有菜单
    private List getChildrens(BizProductCategory root, List all){
        List children = all.stream().filter(bizProductCategory -> {
            return bizProductCategory.getPid() == root.getId();
        }).map(bizProductCategory->{
//   找到子菜单
            bizProductCategory.setChildren(getChildrens(bizProductCategory,all));
            return bizProductCategory;
        }).sorted((menu1,menu2)->{
//    菜单的排序
            return (menu1.getSort()==null?0:menu1.getSort())-(menu2.getSort()==null?0:menu2.getSort());
        }).collect(Collectors.toList());
        return children;
    }

controller层:

/**
     * 分类树形结构
     * @param pageNum
     * @param pageSize
     * @return
     * @author lt
     */
    @GetMapping("categoryTree")
    public R findAll(int  pageNum,int pageSize){
        BizProductCategoryPlus bizProductCategoryPlus = bizProductCategoryService.listWithTree(pageNum, pageSize);
//        BizProductCategoryPlus bizProductCategoryPlus=new BizProductCategoryPlus();
        return R.ok().setData(bizProductCategoryPlus);
}

这样就实现了对一级分类的分页查询

你可能感兴趣的:(java,spring,后端)