树形展示三级分类并分页:递归树形结构
Posted prode123
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了树形展示三级分类并分页:递归树形结构相关的知识,希望对你有一定的参考价值。
今天在写一个项目的时候遇到了一个问题:如何写三级分类的接口?
经过多方查询资料 我解决了该问题
前端页面如下:
数据库:
在实体类中添加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<BizProductCategory> 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<BizProductCategory> rows;
private int total;
service层代码:
@Override
public BizProductCategoryPlus listWithTree(int pageNum, int pageSize)
// 1.查出所有分类
List<BizProductCategory> bizProductCategories = bizProductCategoryDao.selectAll();
// 2.组装成父子树形结构
// 2.1找出所有的一级分类
List<BizProductCategory> 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<BizProductCategory> level1Menus = bizProductCategories.stream().filter((bizProductCategory) ->
// return bizProductCategory.getPid() == 0;
// ).collect(Collectors.toList());
List<BizProductCategory> 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<BizProductCategory> getChildrens(BizProductCategory root, List<BizProductCategory> all)
List<BizProductCategory> 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);
这样就实现了对一级分类的分页查询
以上是关于树形展示三级分类并分页:递归树形结构的主要内容,如果未能解决你的问题,请参考以下文章