Java (省市区三级联动),可扩展到4级或者5级(目前全网最新)

项目场景:

在项目编写的过程中 需要实现客户选择的具体大区信息

三级联动表结构

DROP TABLE IF EXISTS `tb_ipr_item_region`;
CREATE TABLE `tb_ipr_item_region`  (`id` int(11) NOT NULL COMMENT '主键ID',`pid` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '父级Id',`deep` int(11) NULL DEFAULT NULL COMMENT '级别 0 省/直辖市  1 :市级别  2:区级别/县级别',`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '地区简称',`pinyin_prefix` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '地区首拼',`pinyin` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '地区拼音',`ext_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '地区ID',`ext_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '地区全称',PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '三级联动地区表' ROW_FORMAT = Compact;

具体思路:

  • 遍历所有地区数据,根据地区的深度(deep)将节点分为省级、市级和区县级别。
  • 使用三个映射(provinceMap、cityMap、districtMap)分别存储省、市和区县的节点,以便在构建树结构时能够方便地找到父节点。
  • 根据地区的深度,将节点添加到相应的映射和最终的树结构中。
  • 确保每个父节点都有一个子节点列表,并将当前节点添加到该列表中,以构建完整的树形结构。
  • 返回构建好的树结构作为响应结果。

实现方式:

节点类

@Data
public class TreeNodeRegion {private Integer id;private String value;private String label;private String name;private List<TreeNodeRegion> children;public TreeNodeRegion(Integer id, String name,String value,String label) {this.id = id;this.name = name;this.value = value;this.label = label;this.children = null; // 初始化为 null,而不是空列表}
}

方法实现类

	@PostMapping("area")@ApiOperation(value = "地区接口")public ResponseResult<List<TreeNodeRegion>> area() {//存放最终树的架构List<TreeNodeRegion> tree = new ArrayList<>();//省级节点Map<Integer, TreeNodeRegion> provinceMap = new HashMap<>();//市级节点Map<Integer, TreeNodeRegion> cityMap = new HashMap<>();//县级别结点  如果需要存放到 镇级别的 可以使用此集合扩展Map<Integer, TreeNodeRegion> districtMap = new HashMap<>();//获取所有地区的数据List<IprItemRegion> allRegions = iprItemRegionService.list();//构建树架构for (IprItemRegion region : allRegions) {// 创建地区节点对象TreeNodeRegion regionNode = new TreeNodeRegion(region.getId(), region.getName(), region.getPinyin(), region.getExtName());// 根据地区的深度进行分类处理if (region.getDeep() == 0) {// 省级节点provinceMap.put(region.getId(), regionNode);tree.add(regionNode);} else if (region.getDeep() == 1) {// 市级节点cityMap.put(region.getId(), regionNode);// 获取市级节点的父节点(省级节点)TreeNodeRegion parent = provinceMap.get(Integer.parseInt(region.getPid()));if (parent != null) {// 确保父节点有子节点列表if (parent.getChildren() == null) {parent.setChildren(new ArrayList<>());}// 将市级节点添加到父节点的子节点列表中parent.getChildren().add(regionNode);}} else if (region.getDeep() == 2) {// 区县节点districtMap.put(region.getId(), regionNode);// 获取区县节点的父节点(市级节点)TreeNodeRegion parent = cityMap.get(Integer.parseInt(region.getPid()));if (parent != null) {// 确保父节点有子节点列表if (parent.getChildren() == null) {parent.setChildren(new ArrayList<>());}// 将区县节点添加到父节点的子节点列表中parent.getChildren().add(regionNode);}}}// 返回构建好的树结构return new ResponseResult<>(tree);}

返回数据结构

[{"id":11,"value":"bei jing","label":"北京市","name":"北京","children":[{"id":1101,"value":"bei jing","label":"北京市","name":"北京","children":[{"id":110101,"value":"dong cheng","label":"东城区","name":"东城","children":null},{"id":110102,"value":"xi cheng","label":"西城区","name":"西城","children":null},{"id":110105,"value":"chao yang","label":"朝阳区","name":"朝阳","children":null},{"id":110106,"value":"feng tai","label":"丰台区","name":"丰台","children":null},{"id":110107,"value":"shi jing shan","label":"石景山区","name":"石景山","children":null},{"id":110108,"value":"hai dian","label":"海淀区","name":"海淀","children":null},{"id":110109,"value":"men tou gou","label":"门头沟区","name":"门头沟","children":null},{"id":110111,"value":"fang shan","label":"房山区","name":"房山","children":null},{"id":110112,"value":"tong zhou","label":"通州区","name":"通州","children":null},{"id":110113,"value":"shun yi","label":"顺义区","name":"顺义","children":null},{"id":110114,"value":"chang ping","label":"昌平区","name":"昌平","children":null},{"id":110115,"value":"da xing","label":"大兴区","name":"大兴","children":null},{"id":110116,"value":"huai rou","label":"怀柔区","name":"怀柔","children":null},{"id":110117,"value":"ping gu","label":"平谷区","name":"平谷","children":null},{"id":110118,"value":"mi yun","label":"密云区","name":"密云","children":null},{"id":110119,"value":"yan qing","label":"延庆区","name":"延庆","children":null}]}]}
]

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

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

相关文章

STM32——高级定时器输出比较模式实验

1高级定时器输出比较模式实验 1.1高级定时器输出比较模式实验原理 1.2高级定时器输出比较模式实验实验配置步骤 1&#xff0c;配置定时器基础工作参数 HAL_TIM_OC_Init() 2&#xff0c;定时器PWM输出MSP初始化 HAL_TIM_OC_MspInit() 配置NVIC、CLOCK、GPIO等 3&#xff0c;配…

ssm基于Java的超市管理系统论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本超市管理系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信息&am…

java List<对象> 根据对象的一个属性进行去重

ArrayList<BasicSectionCfg>list1list.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(()->newTreeSet<>(Comparator.comparing(BasicSectionCfg::getPamKey))),ArrayList::new)); 这段代码使用Java 8中的流API将一个ArrayList<Bas…

Vue3 如何使用移动端调试工具vConsole

1、安装 pnpm i vconsole2、在src/utils下新建vconsole.ts&#xff0c;写入以下代码 // 这是移动端控制台调试工具&#xff0c;需要调试就打开,不用就注释 import vConsole from vconsole const vconsole new vConsole()3、src/main.ts 引入&#xff0c;需要调试就打开,&…

实战经验:IIS网站服务器性能优化攻略

Windows Server自带的互联网信息服务器&#xff08;Internet Information Server&#xff0c;IIS&#xff09;是架设网站服务器的常用工具&#xff0c;它是一个既简单而又麻烦的东西&#xff0c;新手都可以使用IIS架设一个像模像样的Web站点来&#xff0c;但配置、优化 IIS的性…

高级分布式系统-第9讲 实时调度--静态调度与动态调度

静态调度 在静态调度中&#xff0c;任务组的调度表是通过离线计算得出的。在调度表的生成过程中&#xff0c;必须把所有任务的资源、优先级和同步要求考虑进去&#xff0c;并且确保所有的截止时间要求。这个调度表指明了各个任务的运行起始时间 &#xff0c;一旦生成就不再变化…

vue2配置教程

5.12.3 Vue Cli 文档地址: https://cli.vuejs.org/zh/ IDEA 打开项目&#xff0c;运行项目

Java基本数据类型boolean占用几个字节?

我们知道Java中的基本数据类型有以下几种 char占用2个字节 boolean占用1个字节或者4个字节(稍后解释) byte占用1个字节 short占用2个字节 int占用4个字节 long占用8个字节 float占用4个字节 double占用8个字节 char a a; boolean b false; int c 1; ......当我们在对这些基…

STL tuple源码分析

STL tuple源码分析 和pair一样&#xff0c;tuple也是STL中非常常见的数据结构。pair是个二元组&#xff0c;只支持两个类型参数&#xff0c;tuple则是个多元组&#xff0c;可以支持多个类型参数。因此&#xff0c;在具体实现上&#xff0c;要比pair复杂一些。我们还是以MSVC提供…

js检测网址是否可访问,javascript检测网址是否可访问,支持跨域;

js检测网址是否可访问&#xff0c;javascript检测网址是否可访问&#xff0c;支持跨域&#xff1b; <!DOCTYPE html> <html> <head><meta name"viewport" content"widthdevice-width" /><title>url检测是否可访问</tit…

从生活入手学编程(1):Edge浏览器设置自动刷新专业教程

一、前言 我们都知道&#xff0c;Edge浏览器运行时的速度卡的实在是感人…… 于是今天&#xff0c;我就突发奇想&#xff0c;来看一看怎么刷新并且还能保留页面内容。 二、探索 首先&#xff0c;我在此提醒您&#xff0c;在使用这种方法时要非常小心。因为更改网页源代…

MySQL——深入数据库原理(事务及锁)

文章目录 锁行级锁共享 (S) 锁排他 (X) 锁间隙锁 表级锁意向锁自增锁Lock Table/DDL 事务ACID 原则1. 原子性 A2. 一致性 C3. 隔离性 I4. 持久性 D 隔离级别1. READ UNCOMMITTED&#xff08;未提交读&#xff09;2. READ COMMITTED&#xff08;提交读&#xff09;3. REPEATABLE…

webpack魔法注释-预获取/预加载模块

Webpack v4.6.0 增加了对预获取&#xff08;prefetch&#xff09;和预加载&#xff08;preload&#xff09;的支持。 在声明 import 时&#xff0c;使用下面这些内置指令&#xff0c;可以让 webpack 输出“resource hint”&#xff0c;来告知浏览器&#xff1a; prefetch&…

【JavaWeb】Web程序设计期末复习总结

试题 一. 单选题&#xff08;共24题&#xff0c;24分&#xff09; 二. 多选题&#xff08;共16题&#xff0c;32分&#xff09; 三. 填空题&#xff08;共20题&#xff0c;10分&#xff09; 四. 判断题&#xff08;共30题&#xff0c;15分&#xff09; 五. 论述题&#xf…

基于TOGAF和WAF的企业级架构

TOGAF是技术无关的企业级架构框架&#xff0c;WAF则侧重于云的最佳实践和指导方针&#xff0c;本文介绍了两者的异同。原文: Enterprise Architecture with TOGAF and Well-Architected Frameworks (AWS, Azure and Google) 简介 本文旨在解释TOGAF和云架构框架/良好架构框架(W…

IaC基础设施即代码:使用Terraform 连接 alicloud阿里云

目录 一、实验 1.环境 2.alicloud阿里云创建用户 3.Linux使用Terraform 连接 alicloud 4.Windows使用Terraform 连接 alicloud 二、问题 1.Windows如何申明RAM 相关变量 2.Linux如何申明RAM 相关变量 3. Linux terraform 初始化失败 4.Linux terraform 计划与预览失败…

【LeetCode: 57. 插入区间+分类讨论+模拟】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

blender 导入到 Marvelous Designer

1&#xff09; 将模型的所有部分合并为一个单独的mesh 2&#xff09; 先调整计量单位&#xff1a; 3&#xff09;等比缩放&#xff0c;身高调整到180cm左右 4&#xff09;应用当前scale 首先&#xff0c;选中你要修改的物体&#xff0c;然后按下Ctrl-A键&#xff0c;打开应用…

CSAPP - bomblab 作弊方式2: gdb jump 命令, 以及修改 jne 为 nop 指令

CSAPP - bomblab 作弊方式2&#xff1a; gdb jump 命令&#xff0c; 以及修改 jne 为 nop 指令 厌倦了在 gdb 中一步步顺序执行 bomb 可执行程序。为什么不能自行控制程序的执行呢&#xff1f;跳到特定的函数去执行&#xff0c;又或者把原本要执行的指令改掉&#xff0c;gdb 里…

【Machine Learning】Other Stuff

本笔记基于清华大学《机器学习》的课程讲义中有关机器学习的此前未提到的部分&#xff0c;基本为笔者在考试前一两天所作的Cheat Sheet。内容较多&#xff0c;并不详细&#xff0c;主要作为复习和记忆的资料。 Robust Machine Learning Attack: PGD max ⁡ δ ∈ Δ L o s s (…