级联树结构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 三种色彩空间的对比,涵盖了它们的定义、特点、应用场景和优缺点: 1. 定义 GRAY: 灰度图像仅包含亮度信息,每个像素用一个值(通常在0到255之间)表示亮度(黑到白&#x…...
丢垃圾视频时间检测 -- 基于状态机的实现
文章目录 OverviewKey PointsPseudo-code Overview 需要考虑的方面 状态定义和转换条件时序约束空间约束异常处理 状态机的设计需要考虑的场景: 没有人人进入人携带垃圾人离开但垃圾留下垃圾消失异常情况(检测失败、多人多垃圾等) Key P…...
【QT】一个简单的串口通信小工具(QSerialPort实现)
目录 0.简介 1.展示结果 1)UI界面: 2)SSCOM(模拟下位机收发): 3)VSPD虚拟串口驱动(连接上位机和下位机的串口): 4)实际收发消息效果及视频演…...
24/12/5 算法笔记<强化学习> doubleDQN,duelingDQN
我们前面了解了DQN网络的一些知识,然而DQN还有一些改进的方法,比如doubleDQN和duelingDQN,我们先来将一下doubleDQN和DQN. 先来对比一下 单一网络 vs. 双重网络 DQN:是一个深度神经网络来估计每个动作的Q值 DDQN:使用两个独立的深度神经网络…...
道可云人工智能元宇宙每日资讯|全国工商联人工智能委员会成立会议在南京举办
道可云元宇宙每日简报(2024年12月5日)讯,今日元宇宙新鲜事有: 全国工商联人工智能委员会成立会议在南京举办 全国工商联人工智能委员会成立会议日前在江苏省南京市举办。中央统战部副部长、全国工商联党组书记沈莹出席会议并讲话…...
MySQL数据库(2)-检查安装与密码重置
1. 数据库下载安装 下载地址:MySQL :: Download MySQL Community Server 2. My.ini配置文件 my.ini 文件通常在MySQL安装过程中自动创建, 并且可以根据需要进行编辑以调整服务器的行为。 3. 配置环境变量 4. 查询版本号 查询版本号:mysql…...
C# 13 中的新增功能
C# 12 中的新增功能C# 11 中的新增功能C# 10 中的新增功能C# 9.0 中的新增功能C# 8.0 中的新增功能C#7.0中有哪些新特性?C#6.0中10大新特性的应用和总结C# 5.0五大新特性 将C#语言版本升级为预览版 C# 13 包括一些新增功能。 可以使用最新的 Visual Stu…...
视频自学笔记
一、视频技术基本框架 二、视频信号分类 2.1信号形式 2.1.1模拟视频 模拟视频是指由连续的模拟信号组成的视频图像,以前所接触的电影、电视都是模拟信号,之所以将它们称为模拟信号,是因为它们模拟了表示声音、图像信息的物理量。摄像机是获…...
easyexcel 导出日期格式化
1.旧版本 在新的版本中formate已经被打上废弃标记。那么不推荐使用这种方式。 2.推荐方式 推荐使用另外一种方式【 Converter 】代码如下,例如需要格式化到毫秒【yyyy-MM-dd HH:mm:ss SSS】级别 创建一个公共Converter import com.alibaba.excel.converters.Conv…...
02-开发环境搭建
02-开发环境搭建 鸿蒙开发环境的准备主要分为以下环节: 注册开发者实名认证创建应用下载安装开发工具新建工程 注册开发者 在华为开发者联盟网站上,注册成为开发者,并完成实名认证。 打开华为开发者联盟官网,点击“注册”进入…...
DBeaver导入csv到数据库
DBeaver的图标是一只小浣熊,查了下Beaver确实是浣熊的意思,看起来还是蛮可爱的。 业务上有需要导入csv到数据库的需求,试用了下,发现挺好用的。有很多属性可以定制。 导入步骤: 1.建表,表字段与待导入cs…...
React第十一节 组件之间通讯之发布订阅模式(自定义发布订阅器)
组件之间通讯常用方案 1、通过props 2、通过context 3、通过发布订阅模式 4、通过Redux 后面会有专栏介绍 什么情况下使用发布订阅模式 a、当我们想要兄弟组件之间通讯,而共同的父组件中又用不到这些数据时候; b、当多个毫无相关的组件之间想要进行数据…...
tcpreplay/tcpdump-重放网络流量/捕获、过滤和分析数据包
tcpdump 是一个网络数据包分析工具,通过捕获并显示网络接口上传输的数据包,帮助用户分析网络流量。 原理:用户态通过 libpcap 库控制数据包捕获,内核态通过网卡驱动获取数据包。 核心功能包括:捕获、过滤和分析数据包…...
ASPICE评估体系概览:对象、范围与参考标准解析
ASPICE(汽车软件过程改进和能力确定)是一个框架,它被广泛应用于汽车行业的软件开发和维护过程的改进。 它类似于软件工程领域的CMMI(能力成熟度模型集成),但专门针对汽车行业,考虑了该行业特有…...
力扣92.反转链表Ⅱ
题目描述 题目链接92. 反转链表 II 给你单链表的头指针 head 和两个整数 left 和 right ,其中 left < right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。 示例 1: 输入:head [1,2,3,4,5], left …...
Java设计模式之适配器模式:深入JDK源码探秘Set类
在Java编程中,Set类作为一个不允许存储重复元素的集合,广泛应用于数据去重、集合运算等场景。然而,你是否曾好奇Set类是如何在底层实现元素唯一性判断的?这背后隐藏的力量正是适配器模式。 适配器模式简介 适配器模式࿰…...
java八股-流量封控系统
文章目录 请求后台管理的频率-流量限制流量限制的业务代码UserFlowRiskControlFilter 短链接中台的流量限制CustomBlockHandler 对指定接口限流UserFlowRiskControlConfigurationSentinelRuleConfig 请求后台管理的频率-流量限制 根据登录用户做出控制,比如 x 秒请…...
【WebRTC】Android SDK使用教学
文章目录 前言PeerConnectionFactoryPeerConnection 前言 最近在学习WebRTC的时候,发现只有JavaScript的API文档,找了很久没有找到Android相关的API文档,所以通过此片文章记录下在Android应用层如何使用WebRTC 本篇文章结合:【W…...
MediaPipe Pose镜像体验:CPU也能毫秒级检测,无需GPU免配置
MediaPipe Pose镜像体验:CPU也能毫秒级检测,无需GPU免配置 1. 引言:CPU上的实时姿态检测革命 在计算机视觉应用中,人体姿态检测一直是个热门领域。从健身应用的动作分析到虚拟试衣的体型测量,这项技术正在改变我们与…...
Nanbeige4.1-3B惊艳效果:同一硬件下对比Phi-3-mini,Nanbeige长文本保持率+35%
Nanbeige4.1-3B惊艳效果:同一硬件下对比Phi-3-mini,Nanbeige长文本保持率35% 最近,一个只有30亿参数的小模型在开发者圈子里悄悄火了起来。它不是那种动辄千亿参数、需要顶级显卡才能跑的“巨无霸”,而是一个在普通硬件上就能流畅…...
Omni-Vision Sanctuary 网络协议分析辅助:可视化网络数据包与流量模式识别
Omni-Vision Sanctuary 网络协议分析辅助:可视化网络数据包与流量模式识别 1. 网络数据可视化的新思路 网络工程师每天面对海量的数据包和流量日志,传统的分析工具往往需要依赖复杂的命令行操作和专业图表解读。而Omni-Vision Sanctuary模型为我们提供…...
Ubuntu纯键盘操作全攻略:从入门到精通(附常用快捷键速查表)
Ubuntu纯键盘操作全指南:释放效率革命的终极手册 在数字工作流中,每一次伸手去摸鼠标都意味着思维的中断和效率的流失。Ubuntu作为最受欢迎的Linux发行版之一,其键盘操作体系之丰富远超多数用户的想象——从简单的窗口切换到底层系统调试&…...
3步上手ComfyUI-LTXVideo:让文字和图片动起来的AI视频魔法
3步上手ComfyUI-LTXVideo:让文字和图片动起来的AI视频魔法 【免费下载链接】ComfyUI-LTXVideo LTX-Video Support for ComfyUI 项目地址: https://gitcode.com/GitHub_Trending/co/ComfyUI-LTXVideo 想不想把你的文字描述变成生动的视频?或者让静…...
AI五金冲压报价——让精准报价,快人一步。
传统报价熬3天?AI 8分钟给你一份带Excel明细正规PDF的报价单!还在用Excel手动算冲压报价?客户催得急,成本核不准,格式不专业丢订单?五金厂的报价痛点,我们懂!✅ 工艺PDF/3D图扔进去&…...
ISO/SAE 21434:2021 逐条审核判定表
A 章节号|B 条款|C 要求内容|D 符合性|E 证据 / 说明|F:不符合整改项符合性选项:符合 / 部分符合 / 不符合 / 不适用章节号条款审核要求内容符合性证据 / 备注整改项44.1建立网络安全生命周…...
AI赋能编辑器:借助快马为Notepad++理念添加智能编程助手
今天想和大家分享一个有趣的实践:如何为传统代码编辑器(比如Notepad)注入AI能力。虽然Notepad本身轻量高效,但缺乏现代智能辅助功能。通过结合InsCode(快马)平台的AI能力,我们可以轻松实现智能补全、错误检查和代码优化…...
利用kimi与快马平台,十分钟搭建个人博客web应用原型
最近想快速验证一个个人博客的创意,但自己从头写代码太费时间。尝试用InsCode(快马)平台的Kimi模型生成原型,没想到十分钟就搞定了可运行的Web应用,分享下这个高效流程: 明确需求梳理结构 先花2分钟在纸上画了博客的基本框架&…...
在ESP32上为LVGL 8.x添加中文输入法:从拼音到候选词显示的完整实现
在ESP32上为LVGL 8.x实现高性能中文输入法的工程实践 当我们在智能家居控制面板上输入Wi-Fi密码时,或者在工业HMI设备中输入参数时,中文输入往往成为嵌入式设备最令人头疼的用户体验瓶颈。ESP32作为物联网领域的主流芯片,其有限的RAM资源&…...
