數據庫結構
CREATE TABLE `pms_category` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '分類id',
`name` char(50) DEFAULT NULL COMMENT '分類名稱',
`parent_id` bigint(20) DEFAULT NULL COMMENT '父分類id',
`status` tinyint(4) DEFAULT NULL COMMENT '是否顯示[0-不顯示,1顯示]',
`sort` int(11) DEFAULT NULL COMMENT '排序',
`icon` char(255) DEFAULT NULL COMMENT '圖標地址',
`unit` char(50) DEFAULT NULL COMMENT '計量單位',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1433 DEFAULT CHARSET=utf8mb4 COMMENT='商品三級分類';
數據庫預覽
邏輯
· 查詢出parent_id為0的leve1的菜單
· 再根據leve1數據查詢出子菜單
· 遞歸查詢設值
pom導包
#hutool工具包
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.5.2</version>
</dependency>
#mybatis-plus
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.0</version>
</dependency>
實體
package pyf.smilemall.product.entity;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
import lombok.Data;
/**
* 商品三級分類
*
* @author pyf
* @email pyf1653@163.com
* @date 2021-07-28 11:58:22
*/
@Data
@TableName("pms_category")
public class CategoryEntity implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 分類id
*/
@TableId
private Long id;
/**
* 分類名稱
*/
private String name;
/**
* 父分類id
*/
private Long parentId;
/**
* 是否顯示[0-不顯示,1顯示]
*/
private Integer status;
/**
* 排序
*/
private Integer sort;
/**
* 圖標地址
*/
private String icon;
/**
* 計量單位
*/
private String unit;
private transient List<CategoryEntity> childrens;
}
三級菜單接口
public List<CategoryEntity> listTree() {
//獲取所有菜單
List<CategoryEntity> list=baseMapper.selectList(null);
//篩選一級數據
List<CategoryEntity> leve1Datas = list.stream()
.filter(o -> 0 == o.getParentId())
.map(menu->{
List<CategoryEntity> children = getChildren(menu, list);
menu.setChildrens(children);
return menu;
})
.sorted((menu1,menu2)->{
return (BeanUtil.isEmpty(menu1.getSort())?0:menu1.getSort())-(BeanUtil.isEmpty(menu2.getSort())?0:menu2.getSort());
})
.collect(Collectors.toList());
return leve1Datas;
}
遞歸查詢方法
/**
* 遞歸查詢類
* @param menu
* @param list
* @return
*/
private List<CategoryEntity> getChildren(CategoryEntity menu, List<CategoryEntity> list) {
//篩選出父類
List<CategoryEntity> collect = list.stream()
.filter(o -> menu.getId().equals(o.getParentId()))
.map(cat-> {
List<CategoryEntity> children = getChildren(cat, list);
cat.setChildrens(children);
return cat;
})
.sorted(Comparator.comparingInt(menu2 -> (BeanUtil.isEmpty(menu2.getSort()) ? 0 : menu2.getSort())))
.collect(Collectors.toList());
return collect;
}