今天在写一个项目的时候遇到了一个问题:如何写三级分类的接口?
经过多方查询资料 我解决了该问题
前端页面如下:
数据库:
在实体类中添加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);
}
这样就实现了对一级分类的分页查询