2021-07-29 数据三级分类(树形结构、递归)

应用场景菜单分类

数据库结构

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='商品三级分类';
image.png

逻辑

  • 查询出parent_id为0的leve1的菜单
  • 再根据leve1数据查询出子菜单
  • 递归查询设值

示例

  • pom导包
#hutool工具包
        
            cn.hutool
            hutool-all
            5.5.2
        
#mybatis-plus
        
            com.baomidou
            mybatis-plus-boot-starter
            3.4.0
        

实体

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 [email protected]
 * @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 childrens;

}

  • 三级菜单接口
    public List listTree() {
        //获取所有菜单
        List list=baseMapper.selectList(null);
        //筛选一级数据
        List leve1Datas = list.stream()
                .filter(o -> 0 == o.getParentId())
                .map(menu->{
                    List 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 getChildren(CategoryEntity menu, List list) {
        //筛选出父类
        List collect = list.stream()
                .filter(o -> menu.getId().equals(o.getParentId()))
                .map(cat-> {
                    List 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;
    }
  • 最终数据结构


    image.png

你可能感兴趣的:(2021-07-29 数据三级分类(树形结构、递归))