一 数据表结构

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 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/chengqiuming/article/details/129113585