如何优雅的编写树形结构的菜单栏
程序开发
2023-09-06 08:25:07
模拟数据:
数据库数据:
对应的实体:
package com.luck.bookstore.product.entity;import com.baomidou.mybatisplus.annotation.TableField;
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;/*** 商品三级分类*/
@Data
@TableName("pms_category")
public class CategoryEntity implements Serializable {private static final long serialVersionUID = 1L;/*** 分类id*/@TableIdprivate Long catId;/*** 分类名称*/private String name;/*** 父分类id*/private Long parentCid;/*** 层级*/private Integer catLevel;/*** 是否显示[0-不显示,1显示]*/private Integer showStatus;/*** 排序*/private Integer sort;/*** 图标地址*/private String icon;/*** 计量单位*/private String productUnit;/*** 商品数量*/private Integer productCount;/*** 子分类*/@TableField(exist = false)private List children;}
目的要求:
获取到树形结构的数据(如下图当当网的菜单)
实操内容:
public List listWithTree() {//1.查出所有分类List entities = baseMapper.selectList(null);//2.组装成父子的树形结构//2.1找到所有的一级分类List level1Menus = entities.stream().filter((categoryEntity ->categoryEntity.getParentCid() == 0)).map((menu) -> {//2.2找子菜单menu.setChildren(getChildrens(menu, entities));return menu;}).sorted((menu1, menu2) -> {//菜单的排序return (menu1.getSort() == null ? 0 : menu1.getSort()) - (menu2.getSort() == null ? 0 : menu2.getSort());}).collect(Collectors.toList());return level1Menus;}/*** 递归查找所有菜单的子菜单** @param root 父节点* @param all 所有数据* @return 子菜单(子菜单下的子菜单也能递归出来)*/private List getChildrens(CategoryEntity root, List all) {List children = all.stream().filter(categoryEntity -> {return root.getCatId().equals(categoryEntity.getParentCid());}).map(categoryEntity -> {//子菜单下看看是否还有子菜单categoryEntity.setChildren(getChildrens(categoryEntity, all));return categoryEntity;}).sorted((menu1, menu2) -> {//菜单的排序return (menu1.getSort() == null ? 0 : menu1.getSort()) - (menu2.getSort() == null ? 0 : menu2.getSort());}).collect(Collectors.toList());return children;}
最终结果:
标签:
上一篇:
vue CLI 2.9.6卸载问题
下一篇:
相关文章
-
无相关信息