当前位置: 首页 > news >正文

级联树结构TreeSelect和上级反查

接口返回结构

前端展示格式

前端组件

<template><div ><el-scrollbar height="70vh"><el-tree :data="deptOptions" :props="{ label: 'label', children: 'children' }" :expand-on-click-node="false":filter-node-method="filterNode" ref="deptTreeRef" node-key="id" highlight-current default-expand-all@node-click="handleNodeClick" /></el-scrollbar></div>
</template><script setup name="regulation">
import { treeListRegulationCategory } from "@/api/system/regulation/regulationCategory";
const deptOptions = ref(undefined);/** 查询机构下拉树结构 */
function getDeptTree() {treeListRegulationCategory().then((response) => {deptOptions.value = response.data;});
}
/** 通过条件过滤节点  */
const filterNode = (value, data) => {if (!value) return true;return data.label.indexOf(value) !== -1;
};
getDeptTree();
</script>

后端递归

publicList<TreeSelect> selectTreeList() {
// 查询全部列表List<RegulationCategory> list = this.list();
// 构建级联树的父子结构List<RegulationCategory> categorys = buildTree(list);
// 对级联树展示内容构建List<TreeSelect> trees categorys.stream().map(TreeSelect::new).collect(Collectors.toList());return trees;
}
/*** 组装节点树*/
private List<RegulationCategory> buildTree(Collection<RegulationCategory> categoryList) {// 顶级父节点List<RegulationCategory> parents = ListUtil.createList();Map<Long, List<RegulationCategory>> categoryMap = new HashMap<>();// 组装父子关系for (RegulationCategory category : categoryList) {Long parentId = category.getParentId();if (parentId == 0L) {parents.add(category);continue;}// 子节点List<RegulationCategory> categories = categoryMap.get(parentId);if (ObjectUtil.isNotEmpty(categories)) {categories.add(category);} else {categories = ListUtil.createList();categories.add(category);categoryMap.put(parentId, categories);}}recursionFn(categoryMap, parents);return parents;
}/*** 递归列表*/
private void recursionFn(Map<Long, List<RegulationCategory>> categoryMap, List<RegulationCategory> parents) {for (RegulationCategory parent : parents) {List<RegulationCategory> childs = categoryMap.get(parent.getRegulationCategoryId());if (ObjectUtil.isEmpty(childs)) {continue;}parent.setChildren(childs);recursionFn(categoryMap, childs);}
}

树结构实体类

package com.ydlh.system.domain.vo;import com.fasterxml.jackson.annotation.JsonInclude;
import com.ydlh.common.utils.ObjectUtil;
import com.ydlh.system.domain.SysDept;
import com.ydlh.system.domain.SysMenu;
import com.ydlh.system.domain.SysMenuBusiness;
import com.ydlh.system.domain.regulation.RegulationCategory;
import java.io.Serializable;
import java.util.List;
import java.util.stream.Collectors;/*** Treeselect树结构实体类*/
@Data
public class TreeSelect implements Serializable
{private static final long serialVersionUID = 1L;/** 节点ID */private Long id;/** 节点名称 */private String label;/** 节点类型 */private String type;/** 子节点 */@JsonInclude(JsonInclude.Include.NON_EMPTY)private List<TreeSelect> children;public TreeSelect(){}public TreeSelect(RegulationCategory category){this.id = category.getRegulationCategoryId();this.label = category.getCategoryName();this.type = category.getCategoryType();List<RegulationCategory> childs = category.getChildren();if(ObjectUtil.isEmpty(childs)){this.children = null;}else{this.children = category.getChildren().stream().map(TreeSelect::new).collect(Collectors.toList());}}
}

上级反查

假设有一个层级树,其中每个id都有一个上级parentId,顶级的parentid == 0。现在需要从节点反查他的所有父级目录,这样的场景适用于点击菜单展示对应的树列表。

入参是‘节点’

 public List<TreeSelect> selectRegulationTreeList(String rout) {// 获取节点列表RegulationCategoryRequestVo reqVo = new RegulationCategoryRequestVo();reqVo.setBelongRegulation(rout);List<RegulationCategory> nodeList = selectRegulationCategoryList(reqVo);// 获取全部目录节点列表List<RegulationCategory> categoryList = list();Map<Long, RegulationCategory> categoryMap = categoryList.stream().collect(Collectors.toMap(RegulationCategory::getRegulationCategoryId, Function.identity()));// 获取节点对应的父级目录列表Set<RegulationCategory> returnList = new HashSet<>();for (RegulationCategory node : nodeList) {Long parentId = node.getParentId();while (parentId != 0L) {RegulationCategory parent = categoryMap.get(parentId);if (parent == null) {break;}returnList.add(parent);parentId = parent.getParentId();}returnList.add(node);}if (ObjectUtil.isEmpty(returnList)){return ListUtil.createList();}// 树结构Collection<RegulationCategory> categorys = buildTree(returnList);return categorys.stream().map(TreeSelect::new).collect(Collectors.toList());}

相关文章:

级联树结构TreeSelect和上级反查

接口返回结构 前端展示格式 前端组件 <template><div ><el-scrollbar height"70vh"><el-tree :data"deptOptions" :props"{ label: label, children: children }" :expand-on-click-node"false":filter-node-me…...

gradle下载慢解决方案2024 /12 /1android studio (Windows环境)

gradle下载慢解决方案2024 /12 /1 默认环境配置好了,环境配置和程序安装请出门右转 打开软件,点击右上角设置,找到如下设置页 选择本地安装并制定好你已经安装好的 gradle 应用保存即可 全局插件环境配置(新版本可以直接在设置中添加了) 找对应位置添加国内源并把前面的内置源…...

Python+OpenCV系列:GRAY BGR HSV

以下是 GRAY、BGR 和 HSV 三种色彩空间的对比&#xff0c;涵盖了它们的定义、特点、应用场景和优缺点&#xff1a; 1. 定义 GRAY&#xff1a; 灰度图像仅包含亮度信息&#xff0c;每个像素用一个值&#xff08;通常在0到255之间&#xff09;表示亮度&#xff08;黑到白&#x…...

丢垃圾视频时间检测 -- 基于状态机的实现

文章目录 OverviewKey PointsPseudo-code Overview 需要考虑的方面 状态定义和转换条件时序约束空间约束异常处理 状态机的设计需要考虑的场景&#xff1a; 没有人人进入人携带垃圾人离开但垃圾留下垃圾消失异常情况&#xff08;检测失败、多人多垃圾等&#xff09; Key P…...

【QT】一个简单的串口通信小工具(QSerialPort实现)

目录 0.简介 1.展示结果 1&#xff09;UI界面&#xff1a; 2&#xff09;SSCOM&#xff08;模拟下位机收发&#xff09;&#xff1a; 3&#xff09;VSPD虚拟串口驱动&#xff08;连接上位机和下位机的串口&#xff09;&#xff1a; 4&#xff09;实际收发消息效果及视频演…...

24/12/5 算法笔记<强化学习> doubleDQN,duelingDQN

我们前面了解了DQN网络的一些知识&#xff0c;然而DQN还有一些改进的方法&#xff0c;比如doubleDQN和duelingDQN,我们先来将一下doubleDQN和DQN. 先来对比一下 单一网络 vs. 双重网络 DQN:是一个深度神经网络来估计每个动作的Q值 DDQN:使用两个独立的深度神经网络&#xf…...

道可云人工智能元宇宙每日资讯|全国工商联人工智能委员会成立会议在南京举办

道可云元宇宙每日简报&#xff08;2024年12月5日&#xff09;讯&#xff0c;今日元宇宙新鲜事有&#xff1a; 全国工商联人工智能委员会成立会议在南京举办 全国工商联人工智能委员会成立会议日前在江苏省南京市举办。中央统战部副部长、全国工商联党组书记沈莹出席会议并讲话…...

MySQL数据库(2)-检查安装与密码重置

1. 数据库下载安装 下载地址&#xff1a;MySQL :: Download MySQL Community Server 2. My.ini配置文件 my.ini 文件通常在MySQL安装过程中自动创建&#xff0c; 并且可以根据需要进行编辑以调整服务器的行为。 3. 配置环境变量 4. 查询版本号 查询版本号&#xff1a;mysql…...

C# 13 中的新增功能

C# 12 中的新增功能C# 11 中的新增功能C# 10 中的新增功能C# 9.0 中的新增功能C# 8.0 中的新增功能C&#xff03;7.0中有哪些新特性&#xff1f;C#6.0中10大新特性的应用和总结C# 5.0五大新特性 将C#语言版本升级为预览版 C# 13 包括一些新增功能。 可以使用最新的 Visual Stu…...

视频自学笔记

一、视频技术基本框架 二、视频信号分类 2.1信号形式 2.1.1模拟视频 模拟视频是指由连续的模拟信号组成的视频图像&#xff0c;以前所接触的电影、电视都是模拟信号&#xff0c;之所以将它们称为模拟信号&#xff0c;是因为它们模拟了表示声音、图像信息的物理量。摄像机是获…...

easyexcel 导出日期格式化

1.旧版本 在新的版本中formate已经被打上废弃标记。那么不推荐使用这种方式。 2.推荐方式 推荐使用另外一种方式【 Converter 】代码如下&#xff0c;例如需要格式化到毫秒【yyyy-MM-dd HH:mm:ss SSS】级别 创建一个公共Converter import com.alibaba.excel.converters.Conv…...

02-开发环境搭建

02-开发环境搭建 鸿蒙开发环境的准备主要分为以下环节&#xff1a; 注册开发者实名认证创建应用下载安装开发工具新建工程 注册开发者 在华为开发者联盟网站上&#xff0c;注册成为开发者&#xff0c;并完成实名认证。 打开华为开发者联盟官网&#xff0c;点击“注册”进入…...

DBeaver导入csv到数据库

DBeaver的图标是一只小浣熊&#xff0c;查了下Beaver确实是浣熊的意思&#xff0c;看起来还是蛮可爱的。 业务上有需要导入csv到数据库的需求&#xff0c;试用了下&#xff0c;发现挺好用的。有很多属性可以定制。 导入步骤&#xff1a; 1.建表&#xff0c;表字段与待导入cs…...

React第十一节 组件之间通讯之发布订阅模式(自定义发布订阅器)

组件之间通讯常用方案 1、通过props 2、通过context 3、通过发布订阅模式 4、通过Redux 后面会有专栏介绍 什么情况下使用发布订阅模式 a、当我们想要兄弟组件之间通讯&#xff0c;而共同的父组件中又用不到这些数据时候&#xff1b; b、当多个毫无相关的组件之间想要进行数据…...

tcpreplay/tcpdump-重放网络流量/捕获、过滤和分析数据包

tcpdump 是一个网络数据包分析工具&#xff0c;通过捕获并显示网络接口上传输的数据包&#xff0c;帮助用户分析网络流量。 原理&#xff1a;用户态通过 libpcap 库控制数据包捕获&#xff0c;内核态通过网卡驱动获取数据包。 核心功能包括&#xff1a;捕获、过滤和分析数据包…...

ASPICE评估体系概览:对象、范围与参考标准解析

ASPICE&#xff08;汽车软件过程改进和能力确定&#xff09;是一个框架&#xff0c;它被广泛应用于汽车行业的软件开发和维护过程的改进。 它类似于软件工程领域的CMMI&#xff08;能力成熟度模型集成&#xff09;&#xff0c;但专门针对汽车行业&#xff0c;考虑了该行业特有…...

力扣92.反转链表Ⅱ

题目描述 题目链接92. 反转链表 II 给你单链表的头指针 head 和两个整数 left 和 right &#xff0c;其中 left < right 。请你反转从位置 left 到位置 right 的链表节点&#xff0c;返回 反转后的链表 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], left …...

Java设计模式之适配器模式:深入JDK源码探秘Set类

在Java编程中&#xff0c;Set类作为一个不允许存储重复元素的集合&#xff0c;广泛应用于数据去重、集合运算等场景。然而&#xff0c;你是否曾好奇Set类是如何在底层实现元素唯一性判断的&#xff1f;这背后隐藏的力量正是适配器模式。 适配器模式简介 适配器模式&#xff0…...

java八股-流量封控系统

文章目录 请求后台管理的频率-流量限制流量限制的业务代码UserFlowRiskControlFilter 短链接中台的流量限制CustomBlockHandler 对指定接口限流UserFlowRiskControlConfigurationSentinelRuleConfig 请求后台管理的频率-流量限制 根据登录用户做出控制&#xff0c;比如 x 秒请…...

【WebRTC】Android SDK使用教学

文章目录 前言PeerConnectionFactoryPeerConnection 前言 最近在学习WebRTC的时候&#xff0c;发现只有JavaScript的API文档&#xff0c;找了很久没有找到Android相关的API文档&#xff0c;所以通过此片文章记录下在Android应用层如何使用WebRTC 本篇文章结合&#xff1a;【W…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析

今天聊的内容&#xff0c;我认为是AI开发里面非常重要的内容。它在AI开发里无处不在&#xff0c;当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗"&#xff0c;或者让翻译模型 "将这段合同翻译成商务日语" 时&#xff0c;输入的这句话就是 Prompt。…...

CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型

CVPR 2025 | MIMO&#xff1a;支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题&#xff1a;MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者&#xff1a;Yanyuan Chen, Dexuan Xu, Yu Hu…...

Day131 | 灵神 | 回溯算法 | 子集型 子集

Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 笔者写过很多次这道题了&#xff0c;不想写题解了&#xff0c;大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...

Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?

在大数据处理领域&#xff0c;Hive 作为 Hadoop 生态中重要的数据仓库工具&#xff0c;其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式&#xff0c;很多开发者常常陷入选择困境。本文将从底…...

【无标题】湖北理元理律师事务所:债务优化中的生活保障与法律平衡之道

文/法律实务观察组 在债务重组领域&#xff0c;专业机构的核心价值不仅在于减轻债务数字&#xff0c;更在于帮助债务人在履行义务的同时维持基本生活尊严。湖北理元理律师事务所的服务实践表明&#xff0c;合法债务优化需同步实现三重平衡&#xff1a; 法律刚性&#xff08;债…...

es6+和css3新增的特性有哪些

一&#xff1a;ECMAScript 新特性&#xff08;ES6&#xff09; ES6 (2015) - 革命性更新 1&#xff0c;记住的方法&#xff0c;从一个方法里面用到了哪些技术 1&#xff0c;let /const块级作用域声明2&#xff0c;**默认参数**&#xff1a;函数参数可以设置默认值。3&#x…...

Python训练营-Day26-函数专题1:函数定义与参数

题目1&#xff1a;计算圆的面积 任务&#xff1a; 编写一个名为 calculate_circle_area 的函数&#xff0c;该函数接收圆的半径 radius 作为参数&#xff0c;并返回圆的面积。圆的面积 π * radius (可以使用 math.pi 作为 π 的值)要求&#xff1a;函数接收一个位置参数 radi…...

[拓扑优化] 1.概述

常见的拓扑优化方法有&#xff1a;均匀化法、变密度法、渐进结构优化法、水平集法、移动可变形组件法等。 常见的数值计算方法有&#xff1a;有限元法、有限差分法、边界元法、离散元法、无网格法、扩展有限元法、等几何分析等。 将上述数值计算方法与拓扑优化方法结合&#…...

__VUE_PROD_HYDRATION_MISMATCH_DETAILS__ is not explicitly defined.

这个警告表明您在使用Vue的esm-bundler构建版本时&#xff0c;未明确定义编译时特性标志。以下是详细解释和解决方案&#xff1a; ‌问题原因‌&#xff1a; 该标志是Vue 3.4引入的编译时特性标志&#xff0c;用于控制生产环境下SSR水合不匹配错误的详细报告1使用esm-bundler…...