一 数据表结构
CREATE TABLE `administrative_division` (
`ID` varchar(32) NOT NULL DEFAULT '' COMMENT '主键ID',
`PROVINCE` varchar(255) DEFAULT NULL COMMENT '省',
`CITY` varchar(255) DEFAULT NULL COMMENT '市',
`DISTRICT` varchar(255) DEFAULT NULL COMMENT '区/县',
`CODE` varchar(255) DEFAULT NULL COMMENT '行政代码',
PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
二 实体类
package com.project.domain;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.io.Serializable;
/**
* 行政区域字典
*
* @author 程秋明
* @date 2023-02-14 13:47:38
*/
@Data
@TableName("ADMINISTRATIVE_DIVISION")
public class AdministrativeDivision implements Serializable {
private static final long serialVersionUID = 1L;
// 主键ID
@TableId
private String id;
// 省
private String province;
// 市
private String city;
// 区/县
private String district;
// 行政代码
private String code;
}
三 辅助数据结构
package com.project.domain.vo;
import lombok.Data;
@Data
public class RegionCode {
// 区域名称
private String name;
// 区域编码
private String code;
public RegionCode(String name, String code) {
this.name = name;
this.code = code;
}
}
四 控制器关键方法
/**
* 获取行政区域省列表
*
* @return JSONObject
*/
@RequestMapping(value = "/provinceList", method = RequestMethod.GET)
@ResponseBody
public RestResponse findProvinceList() {
List<RegionCode> list = administrativeDivisionService.dataAssemblyProvince();
return RestResponse.success().put("data", list);
}
/**
* 功能描述:获取行政区市列表
*
* @param provinceCode 省编码
* @return 行政区域市列表
* @author chengqiuming
* @date 2023/2/18
*/
@RequestMapping(value = "/cityList", method = RequestMethod.GET)
@ResponseBody
public RestResponse findCityList(@RequestParam("provinceCode") String provinceCode) {
List<RegionCode> list = administrativeDivisionService.dataAssemblyCity(provinceCode);
return RestResponse.success().put("data", list);
}
/**
* 功能描述:获取行政区域区列表
*
* @param cityCode 市编码
* @return 行政区域区列表
* @author chengqiuming
* @date 2023/2/18
*/
@RequestMapping(value = "/districtList", method = RequestMethod.GET)
@ResponseBody
public RestResponse findDistrictList(@RequestParam("cityCode") String cityCode) {
List<RegionCode> list = administrativeDivisionService.dataAssemblyDistrict(cityCode);
return RestResponse.success().put("data", list);
}
五 关键接口
/**
* 功能描述:省数据装配
*
* @return 省数据列表
* @author chengqiuming
* @date 2023/2/14
*/
List<RegionCode> dataAssemblyProvince();
/**
* 功能描述:市数据装配
*
* @return 市数据列表
* @author chengqiuming
* @date 2023/2/14
*/
List<RegionCode> dataAssemblyCity(String code);
/**
* 功能描述:区数据装配
*
* @return 区数据列表
* @author chengqiuming
* @date 2023/2/14
*/
List<RegionCode> dataAssemblyDistrict(String code);
/**
* 查询省市区表所有的数据,并按照 code 升序
*/
List<AdministrativeDivision> findAdministrativeDivisionAll();
六 关键接口实现
@Override
public List<RegionCode> dataAssemblyProvince() {
List<AdministrativeDivision> list = this.findAdministrativeDivisionAll();
List<RegionCode> provinceList = new ArrayList<>();
Map<String, Integer> map = new HashMap<>();
list.forEach(v -> {
String province = v.getProvince();
String provinceCode = v.getCode().substring(0, 2);
Integer provinceIndex = map.get(province);
if (provinceIndex == null) {
RegionCode tree = new RegionCode(province, provinceCode);
provinceList.add(tree);
provinceIndex = provinceList.size() - 1;
map.put(province, provinceIndex);
}
});
log.info(JSONArray.toJSONString(provinceList));
return provinceList;
}
@Override
public List<RegionCode> dataAssemblyCity(String code) {
List<AdministrativeDivision> list = this.baseMapper.findCityList(code);
List<RegionCode> cityList = new ArrayList<>();
Map<String, Integer> map = new HashMap<>();
list.forEach(v -> {
String city = v.getCity();
String cityCode = v.getCode().substring(0, 4);
Integer cityIndex = map.get(city);
if (cityIndex == null) {
RegionCode regionCode = new RegionCode(city, cityCode);
cityList.add(regionCode);
cityIndex = cityList.size() - 1;
map.put(city, cityIndex);
}
});
log.info(JSONArray.toJSONString(cityList));
return cityList;
}
@Override
public List<RegionCode> dataAssemblyDistrict(String code) {
List<AdministrativeDivision> list = this.baseMapper.findDistrictList(code);
List<RegionCode> districtList = new ArrayList<>();
Map<String, Integer> map = new HashMap<>();
list.forEach(v -> {
String district = v.getDistrict();
String districtCode = v.getCode();
Integer districtIndex = map.get(district);
if (districtIndex == null) {
RegionCode regionCode = new RegionCode(district, districtCode);
districtList.add(regionCode);
districtIndex = districtList.size() - 1;
map.put(district, districtIndex);
}
});
log.info(JSONArray.toJSONString(districtList));
return districtList;
}
public List<AdministrativeDivision> findAdministrativeDivisionAll() {
return baseMapper.selectList(Wrappers.<AdministrativeDivision>query().orderByAsc("code"));
}
七 mapper 层关键方法
/**
* 功能描述:获得 code 下一级区域列表
*
* @author chengqiuming
* @date 2023/2/18
* @param code 省级编码
* @return 市级列表
*/
List<AdministrativeDivision> findCityList(String code);
/**
* 功能描述:获得 code 下一级区域列表
*
* @author chengqiuming
* @date 2023/2/18
* @param code 市级编码
* @return 区级列表
*/
List<AdministrativeDivision> findDistrictList(String code);
八 SQL 实现
<select id="findCityList" resultType="com.project.domain.AdministrativeDivision">
SELECT
T.CITY,
T.CODE
FROM administrative_division T
WHERE T.CODE like '${code}%'
</select>
<select id="findDistrictList" resultType="com.project.domain.AdministrativeDivision">
SELECT
T.DISTRICT,
T.CODE
FROM administrative_division T
WHERE T.CODE like '${code}%'
</select>
九 抓包消息
1 省级列表

2 市级列表

3 区级列表

版权声明:本文为chengqiuming原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。