使用hutool工具生成树形结构

假设要构建一个菜单,可以实现智慧库房,菜单的样子如下:

智慧库房|- RFID|- 智慧大屏|- 智能密集架|- 环境管控

那这种结构如何保存在数据库中呢?一般是这样的:

​ 每条数据根据parentId相互关联并表示层级关系,parentId在这里也叫外键

idparentIdname
10智慧库房
21RFID
31智慧大屏
41智能密集架
51环境管控

使用步骤:

<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.16</version>
</dependency>

我这里使用的是枚举:(大家可以使用数据将需要封装成树形结构的数据,查询封装成一个List)

package com.hy.archive.supervision.enums;/*** @description: 智慧库房功能*/public enum SmartWarehouseFunctionEnum {SMART_WAREHOUSE("1", "智慧库房", "0"),RFID("2", "RFID", "1"),SMART_LARGE_SCREEN("3", "智慧大屏", "1"),INTELLIGENT_DENSE_RACK("4", "智能密集架", "1"),ENVIRONMENTAL_CONTROL("5", "环境管控", "1");private String id;private String name;private String pid;SmartWarehouseFunctionEnum(String id, String name, String pid) {this.id = id;this.name = name;this.pid = pid;}public String getId() {return id;}public String getName() {return name;}public String getPid() {return pid;}public static SmartWarehouseFunctionEnum fromCode(String id) {for (SmartWarehouseFunctionEnum DispatchTypeEnum : SmartWarehouseFunctionEnum.values()) {if (DispatchTypeEnum.getId().equals(id)) {return DispatchTypeEnum;}}return null;}
}
package com.js.hutool.controller;import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.lang.tree.Tree;
import cn.hutool.core.lang.tree.TreeNode;
import cn.hutool.core.lang.tree.TreeNodeConfig;
import cn.hutool.core.lang.tree.TreeUtil;
import com.js.hutool.enums.SmartWarehouseFunctionEnum;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.HashMap;
import java.util.List;@RestController
@RequestMapping("/frid")
public class FridFunctionController {/*** @description: 使用htool工具生成树形递归结构* @author: js* @date: 2023/8/4 15:36* @param:* @return:**/@GetMapping("/function")public List<Tree<String>> obtainAllFunctionsOfTheSmartWarehouse() {List<TreeNode> nodeList = CollUtil.newArrayList();int i=0;for (SmartWarehouseFunctionEnum value : SmartWarehouseFunctionEnum.values()) {//1.将数据库中的数据一次性查询出来封装到List中//2.在这里将从数据库查询的所有数据List中id,pid(父级id),name 依次次封装到longTreeNode中TreeNode<String> longTreeNode = new TreeNode<>(value.getId(), value.getPid(), value.getName(), 0);// 如果还需要给树形添加其他字段,返回给前端,需使用map进行封装HashMap<String, Object> hashMap = new HashMap<>();hashMap.put("返回给前端的字段1", i++);// 返回给前端的字段:open_functionhashMap.put("返回给前端的字段2",i+1);longTreeNode.setExtra(hashMap);nodeList.add(longTreeNode);}//配置TreeNodeConfig treeNodeConfig = new TreeNodeConfig();
// 自定义属性名 都要默认值的//设置权重对应的名称treeNodeConfig.setWeightKey("order");//设置ID对应的名称treeNodeConfig.setIdKey("id");//如果返回给前端的id不叫id,可以修改这里的值
// 最大递归深度treeNodeConfig.setDeep(3);//这个是设置树形结构的层级//转换器 (含义:找出父节点为字符串零的所有子节点, 并递归查找对应的子节点, 深度最多为 3)// 0表示最顶层的id是0,即最高的父级id为多少List<Tree<String>> build = TreeUtil.<TreeNode, String>build(nodeList, "0", treeNodeConfig,(treeNode, tree) -> {tree.setId((String) treeNode.getId());tree.setParentId((String) treeNode.getParentId());tree.setName(treeNode.getName());//这里的putAll与put的区别:put将之前需要给前端的其他字段封装成Map,进行多嵌套了一成tree.putAll(treeNode.getExtra());//tree.put("open_function",treeNode.getExtra());});return build;}}

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

框架的前置学习-反射

运行java代码要经历的三个阶段 反射&#xff0c;程序框架设计的灵魂&#xff0c;将类的各个组成部分封装成其他对象&#xff0c;这就是反射机制。 框架&#xff1a;半成品的软件&#xff0c;在框架的基础上进行开发&#xff0c;可以简化编码 反射的好处&#xff1a; 可以在…

OpenAI因担心隐私问题而阻止GPT-4图像功能的发展

据《纽约时报》报道&#xff0c;GPT-4的图像能力可以识别某些个人。 OpenAI一直在测试其支持图像识别的多模态GPT-4版本&#xff0c;以便计划中的广泛发布。然而&#xff0c;据周二《纽约时报》报道&#xff0c;出于对其可能识别特定个体的担忧&#xff0c;公众访问被限制了。…

备忘录模式(Memento)

备忘录模式是一种行为设计模式&#xff0c;在不破坏封装性的前提下&#xff0c;允许在不暴露对象实现细节的情况下保存和恢复对象之前的状态。 Memento is a behavior design pattern. Without compromising encapsulation, it can reserve and restore of the previous stat…

医疗知识图谱问答——文本分类解析

前言 Neo4j的数据库构建完成后&#xff0c;现在就是要实现医疗知识的解答功能了。因为是初版&#xff0c;这里的问题解答不会涉及深度学习&#xff0c;目前只是一个条件查询的过程。而这个过程包括对问题的关键词拆解分类&#xff0c;然后提取词语和类型去图数据库查询&#xf…

Android安卓实战项目(8)---自行车fitting计算软件(源码在文末)

Android安卓实战项目&#xff08;8&#xff09;—自行车fitting计算软件&#xff08;源码在文末&#x1f415;&#x1f415;&#x1f415;&#xff09; 【bilibili演示地址】 https://www.bilibili.com/video/BV1eu4y1B7yA/?share_sourcecopy_web&vd_sourceb2e9b9ed746ac…

回归预测 | MATLAB实现SO-CNN-BiGRU蛇群算法优化卷积双向门控循环单元多输入单输出回归预测

回归预测 | MATLAB实现SO-CNN-BiGRU蛇群算法优化卷积双向门控循环单元多输入单输出回归预测 目录 回归预测 | MATLAB实现SO-CNN-BiGRU蛇群算法优化卷积双向门控循环单元多输入单输出回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 MATLAB实现SO-CNN-BiGRU蛇群算法…

Typescript - 索引签名

目录 1&#xff0c;什么是索引签名1&#xff0c;js 中使用对象的属性2&#xff0c;ts 中的索引签名3&#xff0c;扩展索引签名定义的类型 2&#xff0c;与 Record 对比3&#xff0c;遇到的问题1&#xff0c;索引 key 的类型问题&#xff0c;keyof2&#xff0c;索引 key 的类型问…

【Element】el-cascader 级联选择器

ElementUI label 为空的不展示 将children设为undefined dg(list) {list.forEach(item > {item.label item.nameitem.value item.iditem.children item.childrenList.length ! 0 ? item.childrenList : undefinedif (item.children) {this.dg(item.children)}}) },第…

11. Redis基础知识

文章目录 一、概述二、数据类型STRINGLISTSETHASHZSET 三、数据结构字典跳跃表 四、使用场景计数器缓存查找表消息队列会话缓存分布式锁实现其它 五、Redis 与 Memcached数据类型数据持久化分布式内存管理机制 六、键的过期时间七、数据淘汰策略八、持久化RDB 持久化AOF 持久化…

HCIP VLAN--Hybrid接口

一、VLAN的特点 1、一个VLAN就是一个广播域&#xff0c;所以在同一个VLAN内部&#xff0c;计算机可以直接进行二层通信&#xff1b;而不同VLAN内的计算机&#xff0c;无法直接进行二层通信&#xff0c;只能进行三层通信来传递信息&#xff0c;即广播报文被限制在一个VLAN内。 …

护眼灯色温高好还是色温低好?教你如何挑选护眼台灯

随着人们对家庭环境艺术的重视&#xff0c;台灯因其摆设在桌案台几上的特殊地位&#xff0c;也要进求特有的装饰效果。家居用台灯开始逐新分流为工艺台灯和书写台灯两类。前者追求外观效果&#xff0c;将发展思路放在材质的创新、造型的求异上&#xff0c;以配合风格多样的家居…

如果网站的 Cookie 特别多特别大,会发生什么(一)

有没有想过&#xff0c;如果网站的 Cookie 特别多特别大&#xff0c;会发生什么情况&#xff1f; 不多说&#xff0c;马上来试验一下&#xff1a; for (i 0; i < 20; i) document.cookie i X.repeat(2000) 什么&#xff0c;网站居然报错了&#xff1f; 众所周知&am…