省市县三级联动的实现方案

1. 问题的来源

  1. 在开发中经常需要进行一个页面级联效果,最经常使用莫过于省市级三级联动的效果,比如选完北京市然后把北京市下属的区丰台区,海淀区,昌平区…返回前端

2. 解决方案

本次解决方案仅涉及后端(ps:主要是前后端分离的项目写多,不会前端操作了)

2.1 数据库设计

CREATE TABLE `sys_china`  (
  `Id` int(11) NOT NULL COMMENT '主键id',
  `Name` varchar(40) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '名称',
  `Pid` int(11) NULL DEFAULT NULL,
  `status` varchar(2) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '1' COMMENT '1:启用,2:禁用',
  PRIMARY KEY (`Id`) USING BTREE,
  INDEX `FK_CHINA_REFERENCE_CHINA`(`Pid`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COMMENT = '省市区表' ;

2.2 后端代码(springboot+mysql)

代码地址:
https://github.com/Dr-Water/Level-3-linkage
sql代码也在项目的sql文件夹中
在这里插入图片描述
数据库一共四个字段:
在这里插入图片描述

含义
id主键id
name省市县的名称
pid本条记录父类id
status本条记录的启用状态

2.3 操作测试步骤

将项目启动起来使用postman进行测试:
请求路径:localhost:8010/link/city/queryById

  1. 前端第一次请求的时候id传成0 先把全国的省和直辖市查出来,
    在这里插入图片描述
  2. 拿到省或者直辖市的id再去请求接口这样就能将本省的下的市或者区全查出来
    在这里插入图片描述

2.4数据的存储以及回显

1.在使用的时候最好将省市县的主键idname都存到数据库中
2. 前端回显的时候可以直接拿name去展示省市县的名称,也可以使用id从数据库中请求
3. 当数据量特别大的时候,如果使用id去请求数据库可能会对数据库造成很大的压力,这个时候可以将所有的省市县全查出来放到redis中,减轻数据库的压力
4. 如果值列表的数据不是很大,可以直接将数据以id为key,name 为value 的大map的形式全给前端, 前端回显的时候使用id去map中去匹配值

之前从网上找的三级联动都太老了,数据也都是很久之前的数据,所以自己把从国家统计局扒下来的省市三级联动数据做了整理,目前最新的三级联动,童叟无欺。大家看北京市和天津市的几个分区就知道是最新的了。 INSERT INTO `address` VALUES (1, '110000', 0, '北京市', 1); INSERT INTO `address` VALUES (2, '110100', 110000, '市辖区', 2); INSERT INTO `address` VALUES (3, '110101', 110100, '东城区', 3); INSERT INTO `address` VALUES (4, '110102', 110100, '西城区', 3); INSERT INTO `address` VALUES (5, '110105', 110100, '朝阳区', 3); INSERT INTO `address` VALUES (6, '110106', 110100, '丰台区', 3); INSERT INTO `address` VALUES (7, '110107', 110100, '石景山区', 3); INSERT INTO `address` VALUES (8, '110108', 110100, '海淀区', 3); INSERT INTO `address` VALUES (9, '110109', 110100, '门头沟区', 3); INSERT INTO `address` VALUES (10, '110111', 110100, '房山区', 3); INSERT INTO `address` VALUES (11, '110112', 110100, '通州区', 3); INSERT INTO `address` VALUES (12, '110113', 110100, '顺义区', 3); INSERT INTO `address` VALUES (13, '110114', 110100, '昌平区', 3); INSERT INTO `address` VALUES (14, '110115', 110100, '大兴区', 3); INSERT INTO `address` VALUES (15, '110116', 110100, '怀柔区', 3); INSERT INTO `address` VALUES (16, '110117', 110100, '平谷区', 3); INSERT INTO `address` VALUES (17, '110118', 110100, '密云区', 3); INSERT INTO `address` VALUES (18, '110119', 110100, '延庆区', 3); INSERT INTO `address` VALUES (19, '120000', 0, '天津市', 1); INSERT INTO `address` VALUES (20, '120100', 120000, '市辖区', 2); INSERT INTO `address` VALUES (21, '120101', 120100, '和平区', 3); INSERT INTO `address` VALUES (22, '120102', 120100, '河东区', 3); INSERT INTO `address` VALUES (23, '120103', 120100, '河西区', 3); INSERT INTO `address` VALUES (24, '120104', 120100, '南开区', 3); INSERT INTO `address` VALUES (25, '120105', 120100, '河北区', 3); INSERT INTO `address` VALUES (26, '120106', 120100, '红桥区', 3); INSERT INTO `address` VALUES (27, '120110', 120100, '东丽区', 3); INSERT INTO `address` VALUES (28, '120111', 120100, '西青区', 3); INSERT INTO `address` VALUES (29, '120112', 120100, '津南区', 3); INSERT INTO `address` VALUES (30, '120113', 120100, '北辰区', 3); INSERT INTO `address` VALUES (31, '120114', 120100, '武清区', 3); INSERT INTO `address` VALUES (32, '120115', 120100, '宝坻区', 3); INSERT INTO `address` VALUES (33, '120116', 120100, '滨海新区', 3); INSERT INTO `address` VALUES (34, '120117', 120100, '宁河区', 3); INSERT INTO `address` VALUES (35, '120118', 120100, '静海区', 3); INSERT INTO `address` VALUES (36, '120119', 120100, '蓟州区', 3);
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

T-OPEN

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值