IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Java树形结构,适配前端Cascader级联选择器使用 -> 正文阅读

[Java知识库]Java树形结构,适配前端Cascader级联选择器使用

作者:recommend-item-box type_blog clearfix

一、Entity

实体类:BCategoryDict.java

import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.util.Date;

/**
 * 业务-分类对象 b_category_dict
 * @author Xuedi
 * @date 2021-12-23
 */
@Data
public class BCategory {
    private Long id;
    /** 父类别id */
    private Long parentId;
    /** 祖级列表 */
    private String ancestors;
    /** 分类名 */
    private String name;
    /** 分类级别 */
    private Integer level;
    /** 状态(0关闭 1开启) */
    private Integer status;
    /** 排序 */
    private Integer sort;
    /** 描述 */
    private String description;
}

Vo类:BCategoryDictVo.java

import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.util.Date;
import java.util.ArrayList;
import java.util.List;

/**
 * 业务-分类对象 b_category_dict
 * @author Xuedi
 * @date 2021-12-23
 */
@Data
public class BCategoryVo {
    private Long id;
    /** 父类别id */
    private Long parentId;
    /** 祖级列表 */
    private String ancestors;
    /** 分类名 */
    private String name;
    /** 分类级别 */
    private Integer level;
    /** 状态(0关闭 1开启) */
    private Integer status;
    /** 排序 */
    private Integer sort;
    /** 描述 */
    private String description;
	/** 子集 */
	private List<BCategoryVo> children = new ArrayList<BCategoryVo>();;
}

树形结构类:BCategoryTree.java

import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 树形结构实体Demo
 * @author Xuedi
 * @date 2021-12-23
 */
@Data
public class BCategoryTree implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 节点ID
     */
    private Long id;
    /**
     * 节点名称
     */
    private String label;
    /**
     * 子节点
     */
    @JsonInclude(JsonInclude.Include.NON_EMPTY)
    private List<BCategoryTree> children;

    public BCategoryTree() { }

    public BCategoryTree(BCategoryVo item) {
        this.id = item.getId();
        this.label = item.getName();
        this.children = item.getChildren().stream().map(BCategoryTree::new).collect(Collectors.toList());
    }
}

二、Controller

对外接口:BCategoryController.java

import com.smart.common.core.domain.AjaxResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.Map;

/**
 * 业务-分类接口层 Controller
 *
 * @author Xuedi
 * @date 2021-12-23
 */
@RestController
@RequestMapping("/business/category")
public class BCategoryController {
    @Autowired
    private IBCategoryService bCategoryService;

    /**
     * 查询业务-账单类别树形列表
     */
    @RequestMapping(value = "/getTreeByParams",method = RequestMethod.GET)
    public List<BCategoryTree> getTreeByParams(@RequestParam Map params) {
        return bCategoryService.getTreeByParams(params);
    }
}

三、service

业务逻辑层接口:IBCategoryService.java

import com.smart.common.core.domain.AjaxResult;
import java.util.Map;

/**
 * 业务-分类业务逻辑接口层 Service接口
 * @author Xuedi
 * @date 2021-12-23
 */
public interface IBCategoryService {
    /**
     * 获取区服树形列表
     * @param params
     * @return
     */
    public List<BCategoryTree> getTreeByParams(Map params);
}

业务逻辑层接口实现类:BCategoryServiceImpl.java

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.*;
import java.util.stream.Collectors;

/**
 * 业务-分类 Service业务层处理
 * @author Xuedi
 * @date 2021-12-23
 */
@Service
public class BCategoryServiceImpl implements IBCategoryService {
    @Autowired
    private BCategoryMapper bCategoryMapper;

    /**
     * 获取树形列表
     * @param params
     * @return
     */
    @Override
    public List<BCategoryTree> getTreeByParams(Map params) {
        //查询所有节点
        List<BCategoryVo> lists = bCategoryMapper.getBCategoryListByParams(params);
        List<BCategoryVo> categoryTrees = buildTree(lists);
		List<BCategoryTree> data = categoryTrees.stream().map(BCategoryTree::new).collect(Collectors.toList());
        return data;
    }

    // ============= 树结构 start =============
    /**
     * 构建树形结构
     * @param list
     * @return
     */
    public List<BCategoryVo> buildTree(List<BCategoryVo> list) {
        List<BCategoryVo> returnList = new ArrayList<BCategoryVo>();
        //id集合
        List<Long> idList = new ArrayList<Long>();
        for (BCategoryVo item : list) {
            idList.add(item.getId());
        }
        //循环
        for (Iterator<BCategoryVo> iterator = list.iterator(); iterator.hasNext();) {
            BCategoryVo vo = (BCategoryVo) iterator.next();
            // 如果是顶级节点, 遍历该父节点的所有子节点
            if (!idList.contains(vo.getParentId())) {
                recursionFn(list, vo);
                if (vo.getLevel() == 1){
                    returnList.add(vo);
                }
            }
        }
        if (returnList.isEmpty()) {
            returnList = list;
        }
        return returnList;
    }
    /**
     * 递归列表
     */
    private void recursionFn(List<BCategoryVo> list, BCategoryVo t) {
        // 得到子节点列表
        List<BCategoryVo> childList = getChildList(list, t);
        t.setChildren(childList);
        for (BCategoryVo tChild : childList) {
            // 判断是否有子节点
            if(getChildList(list, tChild).size() > 0){
                recursionFn(list, tChild);
            }
        }
    }
    /**
     * 得到子节点列表
     */
    private List<BCategoryVo> getChildList(List<BCategoryVo> list, BCategoryVo t) {
        List<BCategoryVo> tlist = new ArrayList<BCategoryVo>();
        Iterator<BCategoryVo> it = list.iterator();
        while (it.hasNext()) {
            BCategoryVo n = (BCategoryVo) it.next();
            if (null != n.getParentId() && n.getParentId().longValue() == t.getId().longValue()) {
                tlist.add(n);
            }
        }
        return tlist;
    }
    // ============= 树结构 end =============
}

四、mapper

Mapper接口:BCategoryMapper.java

import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
import java.util.List;
import java.util.Map;

/**
 * 业务-分类 Mapper接口
 * @author Xuedi
 * @date 2021-12-23
 */
@Repository
@Mapper
public interface BCategoryMapper {
    /**
     * 查询业务列表
     */
    public List<BCategoryVo> getBCategoryListByParams(Map params);
}

五、mapper.xml

resultType需要自己指定上面的vo类路径

<select id="getBCategoryListByParams" parameterType="map" resultType="com.smart.business.entity.vo.BCategoryVo">
	SELECT id, parent_id, ancestors, name, level, status, sort, description FROM b_category
	<where>
		<if test="ancestors != null">
			AND find_in_set( #{ancestors}, ancestors)
		</if>
		<if test="parentId != null">
			AND parent_id = #{parentId}
		</if>
		<if test="level != null">
			AND level = #{level}
		</if>
		<if test="status != null">
			AND status = #{status}
		</if>
	</where>
</select>

七、结果

{
    "msg": "成功",
    "code": 200,
    "data": [
        {
            "id": 1,
            "label": "首页模块",
            "children": [
                {
                    "id": 6,
                    "label": "A图标"
                },
                {
                    "id": 7,
                    "label": "B图标"
                }
            ]
        },
        {
            "id": 2,
            "label": "个人中心模块",
            "children": [
                {
                    "id": 8,
                    "label": "A图标"
                },
            ]
        },
        {
            "id": 3,
            "label": "看视频模块",
            "children": [
                {
                    "id": 16,
                    "label": "图标",
                    "children": [
                        {
                            "id": 17,
                            "label": "A图标"
                        },
                        {
                            "id": 18,
                            "label": "B图标"
                        }
                    ]
                }
            ]
        }
    ]
}

数据库表结构,mysql

CREATE TABLE `b_category` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `parent_id` bigint(20) DEFAULT '0' COMMENT '父类别id',
  `ancestors` varchar(50) DEFAULT '' COMMENT '祖级列表',
  `name` varchar(255) DEFAULT NULL COMMENT '类型名',
  `level` int(11) DEFAULT NULL COMMENT '分类等级',
  `status` int(1) DEFAULT '1' COMMENT '状态',
  `sort` int(10) DEFAULT '0' COMMENT '排序',
  `description` varchar(255) DEFAULT NULL COMMENT '描述',
  `create_time` timestamp NULL DEFAULT NULL COMMENT '创建时间',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COMMENT='分类';

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-03-06 12:48:23  更:2022-03-06 12:52:57 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 11:24:49-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码