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

Java实现籍贯级联选择器

在工作中要求写一个籍贯的级联选择器,记录一下自己写这个级联选择器的过程,因为自己才刚开始工作,有很多地方都没有考虑的很清楚,希望各位大佬能给出建议。

一、需求

A:正常的23个省,籍贯由“省+区/县/市”组成,即写到县(区)一级,比如:浙江省温岭市、浙江省苍南县、安徽省阜南县、湖北省孝感市。不需要细化到“浙江省台州市温岭市”、“浙江省温州市苍南县”

B:直辖市的籍贯写法由“直辖市+区/县”组成,比如:北京市朝阳区、上海市杨浦区、重庆市南岸区

C :部分少数民族自治区的籍贯写法。 (内蒙古自治区、新疆维吾尔自治区、宁夏回族自治区、广西壮族自治区、西藏自治区) 部分少数民族自治区的籍贯由“自治区+自治县/县/县级市”组成,即写到县(县)一级,例如内蒙古自治区包头市

二、实现方案

从省和市这种从属关系,我打算给前端返回一个树,省为最顶层,因为直辖市和香港澳门特别行政区的关系,把直辖市和香港澳门特别行政区也当做是树的根节点。因此数据库的设计就是要有一个当前区域代码和父区域代码来给树建立关系。

三、城市数据的获取

同事给了我这样一个文件Township_Area_A_20230425.xlsx,这个文件包括了中国各个区域的代码,可以到乡镇。这样的数据不方便我们形成树,所以我把这个数据进行了整理。

image-20230810145543792

这是我根据数据库的设计处理完的数据城市区域数据库导入文件.xlsx ,这样处理可以大大减少数据存放的数据,树的根节点parent_code为空。

image-20230810155920283

四、数据库设计

最重要的是要能返回一个树形结构所以需要有一个parent_code字段,根据type可以知道区域的类型。

CREATE TABLE `t_city` (`id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'id',`code` int DEFAULT NULL COMMENT '区域编码',`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '区域名称',`type` int DEFAULT NULL COMMENT '区域类型类型',`parent_code` int DEFAULT NULL COMMENT '父区域编码',`state` tinyint DEFAULT NULL COMMENT '状态',`created_by` bigint DEFAULT NULL COMMENT '创建人',`created_date` datetime DEFAULT NULL COMMENT '创建时间',`updated_by` bigint DEFAULT NULL COMMENT '更新人',`updated_date` datetime DEFAULT NULL COMMENT '更新时间',PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=964 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

五、代码实现

获取树

  public List<CommonTreeDTO<City>> getCityTree() {QueryWrapper<City> queryWrapper = new QueryWrapper<>();QueryWrapper<City> wrapper = queryWrapper.isNull("parent_code").orderByAsc("name");List<City> cities = baseDao.selectList(wrapper);return buildTree(cities,null);}
 /***  构建树* @param parenList 父节点*/public List<CommonTreeDTO<City>> buildTree(List<City> parenList,Integer parentCode){List<CommonTreeDTO<City>> list=new ArrayList<>();parenList.forEach(city -> {CommonTreeDTO<City> dto = new CommonTreeDTO<>();dto.setId(city.getId());dto.setKey(String.valueOf(city.getCode()));dto.setLabel(city.getName());dto.setLevel(city.getType());dto.setInfo(city);if (Objects.nonNull(parentCode)){dto.setPid((long)parentCode);}// 查询子节点QueryWrapper<City> queryWrapper = new QueryWrapper<>();List<City> childList = baseDao.selectList(queryWrapper.eq("parent_code", city.getCode()));List<CommonTreeDTO<City>> childDTOList=new ArrayList<>();// 如果有子节点就继续递归查找if (CollectionUtils.isNotEmpty(childList)){childDTOList = buildTree(childList,city.getCode());}if (CollectionUtils.isNotEmpty(childList)){dto.setChildren(childDTOList);}list.add(dto);});return list;}

根据code查找区域名称

这里前端是会传入一个逗号分隔的字符串,所以要对字符串进行处理然后再插叙出所有code对应的城市名称。

 public String getCityByCode(String codes) {if (StringUtils.isNotBlank(codes)){String[] codeList = codes.split(",");List<String> cityNames = new ArrayList<>();for (String code  : codeList) {City city = baseDao.selectOne(new QueryWrapper<City>().eq("code", code));if (Objects.nonNull(city)){cityNames.add(city.getName());}}return String.join("", cityNames);}return "";}

六、总结

因为当时做的时候比较赶做的比较粗糙,很多地方都需要进行优化,有时间要研究一下树。当时设计数据库的时候考虑了一下是用parent_id好呢还是parent_code,最终我还是选择用parent_code,我想的是code是他们的关联关系,这样设计查询的时候还要转换一下数据的格式,增加了一些麻烦。

相关文章:

Java实现籍贯级联选择器

在工作中要求写一个籍贯的级联选择器&#xff0c;记录一下自己写这个级联选择器的过程&#xff0c;因为自己才刚开始工作&#xff0c;有很多地方都没有考虑的很清楚&#xff0c;希望各位大佬能给出建议。 一、需求 A:正常的23个省&#xff0c;籍贯由“省区/县/市”组成&#xf…...

每日一学——OSI参考模型

OSI参考模型&#xff08;Open Systems Interconnection Reference Model&#xff09;是国际标准化组织&#xff08;ISO&#xff09;制定的一个网络通信协议的概念框架。它将网络通信划分为七个层次&#xff0c;每个层次负责不同的功能和任务&#xff0c;从物理层到应用层依次为…...

虚幻5中Lumen提供哪些功能以及如何工作的

虚幻引擎 5 中的 Lumen 是一个完全动态的全局照明和反射系统。它可以在虚幻引擎 5 中使用&#xff0c;因此创作者无需自行设置。它是为下一代控制台和建筑可视化等高端可视化而设计的。那么它提供了哪些功能以及如何工作&#xff1f; 全局照明 当光离开光源时&#xff0c;它会…...

Linux C 语言 mosquitto 方式 MQTT 发布消息

1 说明 采用 mosquitto 库&#xff0c;实现对主题发布消息。 其中服务器有做限制&#xff0c;需要对应的 cilent id &#xff0c;cafile 、certfile 、keyfile 等配置 2 开发环境 采用ubuntu 直接编译调试 安装mosquitto 库 sudo apt install libmosquitto-dev sudo apt-ge…...

利用NtDuplicateObject进行Dump

前言 由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;文章作者不为此承担任何责任。&#xff08;本文仅用于交流学习&#xff09; 这是国外老哥2020年提出的一种蛮有意思的思路。 我们先来看看大致的思路是…...

【快应用】list组件如何区分滑动的方向?

【关键词】 list组件、滑动方向、scroll 【问题背景】 有cp反馈list这个组件在使用的时候&#xff0c;不知道如何区分它是上滑还是下滑。 【问题分析】 list组件除了通用事件之外&#xff0c;还提供了scroll、scrollbottom、scrolltop、scrollend、scrolltouchup事件&#x…...

【深入了解pytorch】PyTorch扩展:如何使用PyTorch的扩展功能

【深入了解pytorch】PyTorch扩展:如何使用PyTorch的扩展功能 PyTorch扩展:展示如何使用PyTorch的扩展功能1. 自定义损失函数2. 自定义数据加载器3. 自定义优化器总结PyTorch扩展:展示如何使用PyTorch的扩展功能 PyTorch作为一个开源的深度学习框架,在研究和应用领域广受欢…...

Vue3——如何实现页面访问拦截

在现代的Web开发中&#xff0c;页面访问拦截是一个非常常见的需求。通过拦截页面访问&#xff0c;我们可以控制用户在访问特定页面之前需要满足的条件&#xff0c;比如登录状态、权限等。Vue是一个非常流行的JavaScript框架&#xff0c;它提供了许多强大的工具和功能&#xff0…...

nginx配置gzip

在 Nginx 中启用 Gzip 压缩可以大幅减少传输内容的大小&#xff0c;从而加快网页加载速度。 打开 Nginx 的配置文件&#xff0c;通常是 /etc/nginx/nginx.conf 或者 /etc/nginx/conf.d/default.conf。找到 http 配置块&#xff0c;在其中添加以下代码来开启 Gzip 压缩&#xff…...

ExtJS教程_编程入门自学教程_菜鸟教程-免费教程分享

教程简介 Ext JS是一个流行的JavaScript框架&#xff0c;它为使用跨浏览器功能构建Web应用程序提供了丰富的UI。 Ext JS基本上用于创建桌面应用程序它支持所有现代浏览器&#xff0c;如IE6 &#xff0c;FF&#xff0c;Chrome&#xff0c;safari 6 等。Ext JS基于MVC / MVVM架构…...

【el-upload】批量上传图片时在before-upload中添加弹窗判断时的踩坑记录

一、初始代码 1. 初始使用组件代码片段 <!-- 上传 --> <DialogUploadFile ref"uploadFile" success"refresh" />// 上传 const uploadHandle () > {if (selections.value.length ! 1) {onceMessage.warning(请选择一条数据操作)return}u…...

【Java基础】- JVM之Dump文件详解

Java基础 - JVM之Dump文件详解 文章目录 Java基础 - JVM之Dump文件详解一、什么是Dump三、为什么需要Dump分析思路 四、Dump记录哪些内容4.1 Java dump 文件的格式和内容段格式行格式 4.2 常用分类heap dump和thread dumpheap dumpthread dump 五、如何生产Dump文件5.1 获取hea…...

基于Vue+wangeditor实现富文本编辑

目录 前言分析实现具体解决的问题有具体代码实现如下效果图总结前言 一个网站需要富文本编辑器功能的原因有很多,以下是一些常见的原因: 方便用户编辑内容:富文本编辑器提供了类似于Office Word的编辑功能,使得那些不太懂HTML的用户也能够方便地编辑网站内容。提高用户体验…...

深入理解 Spring 中的 @RequestBody 和 @ResponseBody 注解及其区别

引言 在现代的 Web 开发中&#xff0c;处理 HTTP 请求和响应是不可或缺的任务。Spring Framework 提供了丰富的功能来简化这些任务&#xff0c;并使开发人员能够更专注于业务逻辑。在本文中&#xff0c;我们将深入探讨 Spring 中的 RequestBody 和 ResponseBody 注解&#xff0…...

【论文阅读】EULER:通过可扩展时间链接预测检测网络横向移动(NDSS-2022)

作者&#xff1a;乔治华盛顿大学-Isaiah J. King、H. Howie Huang 引用&#xff1a;King I J, Huang H H. Euler: Detecting Network Lateral Movement via Scalable Temporal Graph Link Prediction [C]. Proceedings 2022 Network and Distributed System Security Symposium…...

手动创建一个DOCKER镜像

1. 我们先使用C语言写一个hello-world程序 vim hello.c # include <stdio.h>int main() {print("hello docker\n"); } 2. 将hello.c文件编译成二进制文件, 需要安装工具 yum install gcc yum install glibc-static 开始编译 gcc -static hello.c -o hello 编译…...

SSM(Vue3+ElementPlus+Axios+SSM前后端分离)--搭建Vue 前端工程[一]

文章目录 SSM--搭建Vue 前端工程--项目基础界面实现功能01-搭建Vue 前端工程需求分析/图解代码实现搭建Vue 前端工程下载node.js LTS 并安装: node.js 的npm创建Vue 项目使用idea 打开ssm_vue 项目, 并配置项目启动 Vue3 项目目录结构梳理Vue3 项目结构介绍 配置Vue 服务端口El…...

Idea使用Docker插件实现maven打包自动构建镜像

Docker 开启TCP 服务 vi /lib/systemd/system/docker.service改写以下内容 ExecStart/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock重启服务 #重新加载配置文件 systemctl daemon-reload #重启服务 systemctl restart docker.service此时docker已…...

Tailwind css优于Bootstrap 7个原因

在某些情况下&#xff0c;Tailwind css 比 Bootstrap 更好&#xff0c;因为它是一个低级 CSS 框架&#xff0c;可让您根据需要构建自己的自定义组件。如果使用得当&#xff0c;它非常注重性能&#xff0c;可以显着减少 CSS 负载并确保更快的渲染。如果 Web 性能和自定义是您的首…...

IDEA简单拷贝一份新项目记录

IDEA简单拷贝项目记录 拷贝后改项目名&#xff0c;然后iml 配置文件改项目名&#xff0c;然后 .idea 中的compiler.xml 里面的name标签改项目名。 就可以了...

Linux链表操作全解析

Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表&#xff1f;1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成

厌倦手动写WordPress文章&#xff1f;AI自动生成&#xff0c;效率提升10倍&#xff01; 支持多语言、自动配图、定时发布&#xff0c;让内容创作更轻松&#xff01; AI内容生成 → 不想每天写文章&#xff1f;AI一键生成高质量内容&#xff01;多语言支持 → 跨境电商必备&am…...

Device Mapper 机制

Device Mapper 机制详解 Device Mapper&#xff08;简称 DM&#xff09;是 Linux 内核中的一套通用块设备映射框架&#xff0c;为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程&#xff0c;并配以详细的…...

无人机侦测与反制技术的进展与应用

国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机&#xff08;无人驾驶飞行器&#xff0c;UAV&#xff09;技术的快速发展&#xff0c;其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统&#xff0c;无人机的“黑飞”&…...

Qt 事件处理中 return 的深入解析

Qt 事件处理中 return 的深入解析 在 Qt 事件处理中&#xff0c;return 语句的使用是另一个关键概念&#xff0c;它与 event->accept()/event->ignore() 密切相关但作用不同。让我们详细分析一下它们之间的关系和工作原理。 核心区别&#xff1a;不同层级的事件处理 方…...

C++实现分布式网络通信框架RPC(2)——rpc发布端

有了上篇文章的项目的基本知识的了解&#xff0c;现在我们就开始构建项目。 目录 一、构建工程目录 二、本地服务发布成RPC服务 2.1理解RPC发布 2.2实现 三、Mprpc框架的基础类设计 3.1框架的初始化类 MprpcApplication 代码实现 3.2读取配置文件类 MprpcConfig 代码实现…...

macOS 终端智能代理检测

&#x1f9e0; 终端智能代理检测&#xff1a;自动判断是否需要设置代理访问 GitHub 在开发中&#xff0c;使用 GitHub 是非常常见的需求。但有时候我们会发现某些命令失败、插件无法更新&#xff0c;例如&#xff1a; fatal: unable to access https://github.com/ohmyzsh/oh…...

深入浅出WebGL:在浏览器中解锁3D世界的魔法钥匙

WebGL&#xff1a;在浏览器中解锁3D世界的魔法钥匙 引言&#xff1a;网页的边界正在消失 在数字化浪潮的推动下&#xff0c;网页早已不再是静态信息的展示窗口。如今&#xff0c;我们可以在浏览器中体验逼真的3D游戏、交互式数据可视化、虚拟实验室&#xff0c;甚至沉浸式的V…...

链式法则中 复合函数的推导路径 多变量“信息传递路径”

非常好&#xff0c;我们将之前关于偏导数链式法则中不能“约掉”偏导符号的问题&#xff0c;统一使用 二重复合函数&#xff1a; z f ( u ( x , y ) , v ( x , y ) ) \boxed{z f(u(x,y),\ v(x,y))} zf(u(x,y), v(x,y))​ 来全面说明。我们会展示其全微分形式&#xff08;偏导…...

Mac flutter环境搭建

一、下载flutter sdk 制作 Android 应用 | Flutter 中文文档 - Flutter 中文开发者网站 - Flutter 1、查看mac电脑处理器选择sdk 2、解压 unzip ~/Downloads/flutter_macos_arm64_3.32.2-stable.zip \ -d ~/development/ 3、添加环境变量 命令行打开配置环境变量文件 ope…...