1.使用JDK8 stream流来进行三级目录分层
/**
* 递归分页
* @return
*/
@Override
public List<SmoothMallCategory> findLayPage(){
List<SmoothMallCategory> list = list();//查询所有数据
return list.stream().filter(m->{
return m.getType()==1; //获取一级目录
}).map(m->{ //给一级目录装二级数据
m.setChildren(selectMenuList(m.getId(),list));//筛选二级菜单数据 pid = id
return m;
}).collect(Collectors.toList());
}
/**
*
* @param menuId 一级id
* @param menuList 一级数据
* @return
*/
public List<SmoothMallCategory> selectMenuList(Integer menuId,List<SmoothMallCategory> menuList){
return menuList.stream().filter(m->m.getParentId()==menuId) //根据一级id获取二级数据
//根据二级找三级
.map(m->{
m.setChildren(selectMenuList(m.getId(),menuList));
return m;
}).collect(Collectors.toList());
}
2.
表结构:
实体特殊属性
递归实现:
/**
* 获取全部菜单
* @return
*/
public List<Permission> getAllMenu(){
QueryWrapper<Permission> queryWrapper=new QueryWrapper<>();
List<Permission> permissions = permissionMapper.selectList(queryWrapper);
//封装
List<Permission> resultPermission=buildPermission(permissions);
return resultPermission;
}
//初始化父级顶级菜单
private List<Permission> buildPermission(List<Permission> permissionList) {
List<Permission> permissionEnd=new ArrayList<>(); //封装数据
for (Permission permissionNode:permissionList){
//得到顶级菜单
if ("0".equals(permissionNode.getPid())){
permissionNode.setLevel(1);//设置顶层id为1
//根据顶层 向下遍历获取子菜单
permissionEnd.add(selectChildren(permissionNode,permissionList));
}
}
return permissionEnd;
}
//递归查询菜单
private Permission selectChildren(Permission permissionNode, List<Permission> permissionList) {
permissionNode.setChildren(new ArrayList<>());
for (Permission it:permissionList){
//id pid 对比
if (permissionNode.getId().equals(it.getPid())){
it.setLevel(permissionNode.getLevel()+1); //level累加
//封装子菜单
permissionNode.getChildren().add(selectChildren(it,permissionList)); //it就是下一级菜单勒
}
}
return permissionNode;//返回查询到的子菜单
}