Spring:element-ui中的tree、树形结构的实现

news2024/11/15 20:00:32

一、三层架构代码

可能很多人都没写过关于tree的代码,今天我来演示一下,步骤很全,放心观看。
首先来看element-ui官网关于tree的示例:

<el-tree :data="data" :props="defaultProps" @node-click="handleNodeClick"></el-tree>

<script>
  export default {
    data() {
      return {
        data: [{
          label: '一级 1',
          children: [{
            label: '二级 1-1',
            children: [{
              label: '三级 1-1-1'
            }]
          }]
        }, {
          label: '一级 2',
          children: [{
            label: '二级 2-1',
            children: [{
              label: '三级 2-1-1'
            }]
          }, {
            label: '二级 2-2',
            children: [{
              label: '三级 2-2-1'
            }]
          }]
        }, {
          label: '一级 3',
          children: [{
            label: '二级 3-1',
            children: [{
              label: '三级 3-1-1'
            }]
          }, {
            label: '二级 3-2',
            children: [{
              label: '三级 3-2-1'
            }]
          }]
        }],
        defaultProps: {
          children: 'children',
          label: 'label'
        }
      };
    },
    methods: {
      handleNodeClick(data) {
        console.log(data);
      }
    }
  };
</script>

可以看得出来其底层为:

[{
 label: '一级 1',
 children: [{
    label: '二级 1-1',
    children: [{
        label: '三级 1-1-1'
        }]
    }]
}]

这么一看是不是清晰明了?那么我们该返回什么样的数据是不是也清楚明白了?
话不多说我们来看后端与数据库,首先是数据库:
对应的是   部门ID、  部门名称  、  部门层级   、 上级部门ID

 接着来看实体类:(有lombok记得装)

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class DepartmentDTO {
    private Integer departmentId; // ID
    private String dname; // 部门名称
    private Integer dindex; // 所属级别
    private Integer dparent; // 上级部门ID
    List<DepartmentDTO> dchildren; // 下级部门集合
}

这里dchildren正好对应的是子节点,可以无限的递归下去。也符合上面官网给出的示例。思想也很简单,如果是子节点就用dchildren.add添加进去即可。
然后看controller与service层代码:

@GetMapping("/getDepartmentTree")
public Result getCategory(){
    List<DepartmentDTO> departmentDTOS = departmentService.quertListTree();
    return Result.success(departmentDTOS);
}


public interface DepartmentService {
    public List<DepartmentDTO> quertListTree();
}

@Mapper
public interface DepartmentMapper {
    @Select("select department_id, dname, dindex, dparent from department order by dparent")
    List<DepartmentDTO> queryList();
}

 接下来是重头戏,看业务层的代码:

  1. //获取全部的部门数据
    List<DepartmentDTO> departments = departmentMapper.queryList();
    这一步就是从mapper层中获取数据库中的数据,然后封装到List<DepartmentDTO> departments中
  2. //初始化每个部门儿子节点
        for (DepartmentDTO department : departments) {
            department.setDchildren(new ArrayList<>());
        }
    这一步很重要,第一步获取的数据中是没有儿子节点的,也就说List<DepartmentDTO> departments中每一个部门的dchildren就将为null,这是mybatis的正常操作,对于没有的数据就映射为null,但是list集合如果为null的话,add的时候就会报空指针异常,所以需要进行初始化,用setDchildren(new ArrayList<>())来重新创建 ArrayList集合来进行add操作。
  3. 然后就没啥东西了,如果看得懂但是不理解可以学一下java的引用传递机制。
@Override
public List<DepartmentDTO> quertListTree() {
    //获取全部的部门数据
    List<DepartmentDTO> departments = departmentMapper.queryList();
    //初始化每个部门儿子节点
    for (DepartmentDTO department : departments) {
        department.setDchildren(new ArrayList<>());
    }
    // 传递一个空的 将要返回的集合
    List<DepartmentDTO> resuletDeptDTOs = new ArrayList<>();
    // 开始构建树
    for (DepartmentDTO dept : departments) {
        // 1. 如果获取的dparent 为 0 则是第一层节点 直接放进resuletDeptDTOs中
        if(dept.getDparent().equals(0)){
            resuletDeptDTOs.add(dept);
        }else {
            // 2. 如果不是0 则至少是一个子节点或者是孙子节点
            // 3. 找到当前循环的dept的父亲节点
            // 4. 根据java的引用传递机制,你这里修改了其实是修改了引用,你后面获取到的就是有子节点的数据,不必担心,如果不理解可以去看看引用传递机制
            DepartmentDTO fatherDept = findDepartmentDTOById(departments, dept.getDparent());
            if(fatherDept!=null){
                fatherDept.getDchildren().add(dept);
            }
        }
    }
    return resuletDeptDTOs;
}
private static DepartmentDTO findDepartmentDTOById(List<DepartmentDTO> dtoList, Integer id) {
    for (DepartmentDTO dto : dtoList) {
        if (dto.getDepartmentId().equals(id)) {
            return dto;
        }
    }
    return null;
}

 最后来看看前端:
 

<template>
	<div>
		<div>
			<h1>树形结构图实验开始</h1>
		</div>
		<div>
			<el-tree :data="treedata" :props="defaultProps" @node-click="handleNodeClick"></el-tree>
		</div>
	</div>
</template>

<script>
	export default {
		data() {
			return {
				treedata:[],
				defaultProps: {
					children: 'dchildren',
					label: 'dname'
				}
			};
		},
		methods: {
			handleNodeClick(data) {
				console.log(data);
			},
			getAllClothesByUserID() {
				this.$axios.get('/admin/department/getDepartmentTree').then(res => {
					if (res.data.code === 1) {
						console.log(res.data.data);
						this.treedata=res.data.data;
					}
				})
			},
		},
		mounted() {
			this.getAllClothesByUserID();
		}
	};
</script>

<style>
</style>

 运行结果:

二、test模拟:

public class StringTest {
    public static void main(String[] args) {
        List<DepartmentDTO> departments = Arrays.asList(
                new DepartmentDTO(19, "精工汽车", 1, 0,new ArrayList<>()),
                new DepartmentDTO(18, "精工底盘", 2, 19,new ArrayList<>()),
                new DepartmentDTO(17, "精工压铸", 2, 19,new ArrayList<>()),
                new DepartmentDTO(16, "泰州底盘", 3, 18,new ArrayList<>()),
                new DepartmentDTO(15, "徐水底盘", 3, 18,new ArrayList<>()),
                new DepartmentDTO(14, "荆门压铸", 3, 17,new ArrayList<>()),
                new DepartmentDTO(13, "徐水压铸", 3, 17,new ArrayList<>()),
                new DepartmentDTO(12, "徐水制造部", 4, 15,new ArrayList<>())
        );
        // 构建部门树
        List<DepartmentDTO> departmentTree = buildDepartmentTree(departments);
        printDepartmentTree(departmentTree, 0);
    }

    private static List<DepartmentDTO> buildDepartmentTree(List<DepartmentDTO> departments) {
        // 1. 创建一个新的返回集合
        List<DepartmentDTO> resultDeptDTOs = new ArrayList<>();
        for(int i=0;i<departments.size();i++){
            if(departments.get(i).getDparent()==0){
                resultDeptDTOs.add(departments.get(i));
            }else {
                DepartmentDTO chileDTO = findDTO(departments,departments.get(i).getDparent());
                chileDTO.getDchildren().add(departments.get(i));
            }
        }
        return resultDeptDTOs;
    }

    private static DepartmentDTO findDTO(List<DepartmentDTO> departments,Integer id){
        for (DepartmentDTO department : departments) {
            if(department.getDepartmentId()==id){
                return department;
            }
        }
        return null;
    }
    private static void printDepartmentTree(List<DepartmentDTO> departments, int level) {
        for (DepartmentDTO department : departments) {
            for (int i = 0; i < level; i++) {
                System.out.print("  ");
            }
            System.out.println(department.getDname());
            printDepartmentTree(department.getDchildren(), level + 1);
        }
    }

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1813988.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

利用Pandas数据过滤减少运算时间

当处理大型数据集时&#xff0c;使用 Pandas 可以提高数据处理的效率。Pandas 提供了强大的数据结构和功能&#xff0c;包括数据过滤、筛选、分组和聚合等&#xff0c;可以帮助大家快速减少运算时间。 1、问题背景 我有一个包含37456153行和3列的Pandas数据帧&#xff0c;其中…

利用泽攸科技原位TEM技术揭示真空击穿过程中电场与电极材料相互作用

在高能物理设备和许多其他设备中&#xff0c;真空击穿&#xff08;VBD&#xff09;现象对高能物理设备的性能造成了严重的阻碍&#xff0c;包括真空断路器、X射线源、聚变反应堆以及粒子加速器等。然而由于对导致VBD的机制缺乏足够的科学理解&#xff0c;这些问题至今无法得到缓…

【stable diffusion】ComfyUI扩展安装以及点开后页面空白问题解决办法

扩展安装 虽然大家都推荐将扩展包直接放到extension文件夹的方式,但我还是推荐直接在sd webui的扩展处下载,酱紫比较好维护一点,我个人感觉。 按照上图顺序点击会出现”URLError: <urlopen error [Errno 11004] getaddrinfo failed>”的情况,问题不大,打开一个git…

隐藏字符串中间字符,一个公共方法解决产品的所有设想

说到隐藏字符串中间字符&#xff0c;就是 13833321212 给用户显示成 “138***1212” 这样子呗&#xff0c;你是不是也是这样认为的。我刚开始拿到需求&#xff0c;就是这样认为的。但是越到后来发现越不对劲儿。来看看我的隐藏历程吧。 一 产品来了 1 加星第一步 产品刚开始…

ThinkBook 16 2024 Ubuntu 触控板问题解决

sudo insmod goodix-gt7868q.ko sudo cp local-overrides.quirks /etc/libinput/local-overrides.quirks sudo systemctl restart gdm 有偿解决&#xff0c;无效退款

R语言使用survivalsvm包进行支持向量机生存分析

1995年VAPINK 等人在统计学习理论的基础上提出了一种模式识别的新方法—支持向量机 。它根据有限的样本信息在模型的复杂性和学习能力之间寻求一种最佳折衷。 以期获得最好的泛化能力.支持向量机的理论基础决定了它最终求得的是全局最优值而不是局部极小值,从而也保证了它对未知…

LeetCode题练习与总结:二叉树中的最大路径和--124

一、题目描述 二叉树中的 路径 被定义为一条节点序列&#xff0c;序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点&#xff0c;且不一定经过根节点。 路径和 是路径中各节点值的总和。 给你一个二叉树的根节点 ro…

swift微调牧歌数据电商多模态大语言模型

大规模中文多模态评测基准MUGE_数据集-阿里云天池多模态理解和生成评估挑战榜(MUGE)是由阿里巴巴达摩院智能计算实验室发起,由阿里云天池平台承办,并由浙江大学、清华大学等单位共同协办。 Mhttps://tianchi.aliyun.com/dataset/107332微调的是牧歌数据集,结果都不好,记录…

C语言学习系列:笔记列表

1&#xff0c;精神建设&#xff1a;为什么要学C语言以及如何学习C语言 2&#xff0c;C语言学习系列&#xff1a;GCC编译器Windows版本MinGW-w64的安装教程 3&#xff0c;C语言学习系列&#xff1a;初识C语言 4&#xff0c;C语言入门学习系列&#xff1a;基本语法

工业和信息化部电子工业标准化研究院人工智能从业人员“计算机视觉设计开发工程师”专项培训(第四期)

注&#xff1a;若出现无法显示完全的情况&#xff0c;可搜索“人工智能技术与咨询”查看完整文章 声明: 公众号转载的文章及图片出于非商业性的教育和科研目的供大家参考和探讨&#xff0c;并不意味着支持其观点或证实其内容的真实性。版权归原作者所有&#xff0c;如转载稿涉及…

面试-NLP八股文

机器学习 交叉熵损失&#xff1a; L − ( y l o g ( y ^ ) ( 1 − y ) l o g ( 1 − ( y ^ ) ) L-(ylog(\hat{y}) (1-y)log(1-(\hat{y})) L−(ylog(y^​)(1−y)log(1−(y^​))均方误差&#xff1a; L 1 n ∑ i 1 n ( y i − y ^ i ) 2 L \frac{1}{n}\sum\limits_{i1}^{n}…

软件3班20240612

加粗样式 maven 根据的使用案例 package com.yanyu;public class Demo02 {// 设置 一个 求 两个数 的 和 的 方法 sumpublic void sum(int num1, int mum2) {System.out.println("两个数 的 和 是 &#xff1a;" (num1 mum2));} }import com…

盲盒小程序推广与运营策略的挑战

随着盲盒经济的兴起&#xff0c;越来越多的商家开始关注并尝试开发盲盒小程序。然而&#xff0c;在推广和运营盲盒小程序的过程中&#xff0c;我们也不可避免地会遇到一些挑战。下面&#xff0c;我将就用户获取、留存以及活跃度提升等方面&#xff0c;探讨这些挑战及可能的应对…

常用环境部署(十四)——Docker部署MinIO

一、安装Docker及Docker-compose https://blog.csdn.net/wd520521/article/details/112609796 二、Docker-compose部署MinIO 1、在服务器创建/data/minio目录 mkdir -p /data/minio 2、 docker-compose.yml脚本创建 vim /data/minio/docker-compose.yml &#xff08;1&a…

使用易备数据备份软件,简单快速地备份 Oracle 数据库

易备数据备份软件能够以简单高效的方式&#xff0c;实现对 Oracle 数据库的保护。 易备数据备份软件数据库备份功能的关键特性 自动保护网站数据库及应用程序实时备份&#xff0c;不需要任何中断或数据库锁定基于日期和时间的备份任务计划可恢复到一个已存在的数据库或创建一…

【java计算机毕设】图书商城管理系统MySQL springboot vue html maven送文档

1项目功能介绍 【java计算机毕设】图书商城管理系统 Java Spring Boot vue HTML MySQL 赠送文档 PPT 2项目简介 系统功能&#xff1a; 图书商城管理系统包括管理员和用户两种角色。 管理员的功能包括在个人中心修改个人信息&#xff0c;以及在基础数据管理中管理会员等级类型和…

STM89C51开发学习1

环境安装&#xff1a; 使用Keil uVision4环境进行对51单片机的学习。 在进行使用之前先用keygen进行对软件的破解防止后续发生不必要的问题。 开发环境下载完毕后&#xff0c;检查电脑是否有串口驱动&#xff08;可以在网上下载&#xff09; CH340驱动。 安装stcai-…

小程序视图渲染数据和部分事件的绑定

今天依旧使用这个目录进行教学 数据的渲染 在 index.js的 page中定义一个data对象结构是这样的 Page({data:{name:张三} }) 在index.wxml 中 利用模板语法进行渲染 <view >{{name}}</view> 注意这个模板里边不能使用js的方法 要循环渲染数组&#xff0c;如 在…

目标检测中的anchor机制

目录 一、目标检测中的anchor机制 1.什么是anchor boxes&#xff1f; 二、什么是Anchor&#xff1f; ​编辑三、为什么需要anchor boxes&#xff1f; 四、anchor boxes是怎么生成的&#xff1f; 五、高宽比&#xff08;aspect ratio&#xff09;的确定 六、尺度(scale)的…

数字影像产业园:打造数字经济高地,赋能未来产业

成都国际数字影像产业园凭借其得天独厚的区位优势、完善的配套设施、先进的产业定位和便捷的交通条件&#xff0c;逐步成为成都市乃至全国数字影像、文创、媒体产业的重要聚集地。 成都国际数字影像产业园位于成都市金牛区的核心地带&#xff0c;其主导产业为数字影像、文创、媒…