數據三級分類(樹形結構、遞歸)


數據庫結構

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;
    }

數據結構展示


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM