省市区三级联动(后端)

前提:springboot、mybatis-plus、swagger

数据库:

文章顶部

实体类:

City

java 复制代码
package com.itfly.entity;


import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import java.time.LocalDateTime;
import java.io.Serializable;


import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;


/**
 * <p>
 * 基础表-省市区
 * </p>
 *
 * @author author
 * @since 2025-01-02
 */
@Data
@ApiModel(value="City对象", description="市")
public class City implements Serializable {

    private static final long serialVersionUID = 1L;

    @ApiModelProperty(value = "ID")
    @TableId(value = "city_id", type = IdType.AUTO)
    private Long cityId;

    @ApiModelProperty(value = "创建时间")
    private LocalDateTime createTime;

    @ApiModelProperty(value = "更新时间")
    private LocalDateTime updateTime;

    @ApiModelProperty(value = "名称")
    private String name;

    @ApiModelProperty(value = "区域编号")
    private String code;

    @ApiModelProperty(value = "层级 1,2,3")
    private Integer level;

    @ApiModelProperty(value = "父级ID")
    private Integer parentId;

    @ApiModelProperty(value = "拼音首字母缩写")
    private String acronym;

    @ApiModelProperty(value = "排序")
    private Integer sort;


}

DTO:省份---ProvinceDto

java 复制代码
package com.itfly.dto.city;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.util.List;

@Data
@ApiModel(value="ProvinceDto", description="省")
public class ProvinceDto {
    @ApiModelProperty(value = "ID")
    private Long cityId;

    @ApiModelProperty(value = "名称")
    private String name;

    @ApiModelProperty(value = "区域编号")
    private String code;

    @ApiModelProperty(value = "层级 1,2,3")
    private Integer level;

    @ApiModelProperty(value = "父级ID")
    private Integer parentId;


    @ApiModelProperty(value = "2级市列表")
    private List<CityDto> cityList;
}

市:CityDto

java 复制代码
package com.itfly.dto.city;


import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.util.List;

/**
 * <p>
 * 基础表-省市区
 * </p>
 *
 * @author author
 * @since 2025-01-02
 */
@Data
@ApiModel(value="CityDto", description="市")
public class CityDto {


    @ApiModelProperty(value = "ID")
    private Long cityId;

    @ApiModelProperty(value = "名称")
    private String name;

    @ApiModelProperty(value = "区域编号")
    private String code;

    @ApiModelProperty(value = "层级 1,2,3")
    private Integer level;

    @ApiModelProperty(value = "父级ID")
    private Integer parentId;

    @ApiModelProperty(value = "3级区县列表")
    private List<DistrictDto> districtList;


}

区县:DistrictDto

java 复制代码
package com.itfly.dto.city;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

@Data

@ApiModel(value="DistrictDto", description="区县")
public class DistrictDto {
    @ApiModelProperty(value = "ID")
    private Long cityId;

    @ApiModelProperty(value = "名称")
    private String name;

    @ApiModelProperty(value = "区域编号")
    private String code;

    @ApiModelProperty(value = "层级 1,2,3")
    private Integer level;

    @ApiModelProperty(value = "父级ID")
    private Integer parentId;


}

业务层逻辑:

控制器:

java 复制代码
package com.itfly.controller;



import com.itfly.conf.result.R;
import com.itfly.service.ICityService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

/**
 * <p>
 * 基础表-省市区 前端控制器
 * </p>
 *
 * @author author
 * @since 2025-01-02
 */
@RestController
@RequestMapping("/city")
@Api(tags = "省市区管理")
public class CityController {
    @Autowired
    private ICityService cityService;
    //查询省市列表
    @GetMapping("/getAll")
    @ApiOperation(value = "查询省市列表(三级联动)")
    public R getProvince() {
        return cityService.getProvince();
    }
}

service:

java 复制代码
package com.itfly.service;


import com.itfly.conf.result.R;
import com.itfly.entity.City;
import com.baomidou.mybatisplus.extension.service.IService;

/**
 * <p>
 * 基础表-省市区 服务类
 * </p>
 *
 * @author author
 * @since 2025-01-02
 */
public interface ICityService extends IService<City> {

    R getProvince();
}
复制代码
ServiceImpl
java 复制代码
package com.itfly.service.impl;


import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.itfly.conf.result.R;
import com.itfly.dto.city.DistrictDto;
import com.itfly.dto.city.ProvinceDto;
import com.itfly.entity.City;
import com.itfly.dto.city.CityDto;
import com.itfly.mapper.CityMapper;
import com.itfly.service.ICityService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.itfly.vo.CityVo;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;

import java.util.List;

/**
 * <p>
 * 基础表-省市区 服务实现类
 * </p>
 *
 * @author author
 * @since 2025-01-02
 */
@Service
public class CityServiceImpl extends ServiceImpl<CityMapper, City> implements ICityService {
    @Override
    public R getProvince() {
        // 创建一个QueryWrapper用于查询省份(level为1)
        QueryWrapper<City> queryWrapperProvince = new QueryWrapper<>();
        queryWrapperProvince.eq("level", 1);
        // 查询所有省份
        List<City> listProvince = list(queryWrapperProvince);

        // 将查询到的省份列表转换为ProvinceDto列表
        List<ProvinceDto> provinceDtos = listProvince.stream().map(province -> {
            ProvinceDto provinceDto = new ProvinceDto();
            // 设置省份的基本信息
            provinceDto.setCityId(province.getCityId());
            provinceDto.setName(province.getName());
            provinceDto.setCode(province.getCode());
            provinceDto.setLevel(province.getLevel());
            provinceDto.setParentId(province.getParentId());

            // 创建一个QueryWrapper用于查询城市(level为2且parent_id为省份的cityId)
            QueryWrapper<City> queryWrapperCity = new QueryWrapper<>();
            queryWrapperCity.eq("level", 2).eq("parent_id", province.getCityId());
            // 查询所有城市
            List<City> listCity = list(queryWrapperCity);

            // 将查询到的城市列表转换为CityDto列表
            List<CityDto> cityDtos = listCity.stream().map(city -> {
                CityDto cityDto = new CityDto();
                // 设置城市的基本信息
                cityDto.setCode(city.getCode());
                cityDto.setName(city.getName());
                cityDto.setLevel(city.getLevel());
                cityDto.setParentId(city.getParentId());
                cityDto.setCityId(city.getCityId());

                // 创建一个QueryWrapper用于查询区县(level为3且parent_id为城市的cityId)
                QueryWrapper<City> queryWrapperArea = new QueryWrapper<>();
                queryWrapperArea.eq("level", 3).eq("parent_id", city.getCityId());
                // 查询所有区县
                List<City> listArea = list(queryWrapperArea);

                // 将查询到的区县列表转换为DistrictDto列表
                List<DistrictDto> areaDtos = listArea.stream().map(area -> {
                    DistrictDto areaDto = new DistrictDto();
                    // 设置区县的基本信息
                    areaDto.setCode(area.getCode());
                    areaDto.setName(area.getName());
                    areaDto.setLevel(area.getLevel());
                    areaDto.setParentId(area.getParentId());
                    areaDto.setCityId(area.getCityId());
                    return areaDto;
                }).toList();

                // 设置城市对应的区县列表
                cityDto.setDistrictList(areaDtos);
                return cityDto;
            }).toList();

            // 设置省份对应的城市列表
            provinceDto.setCityList(cityDtos);
            return provinceDto;
        }).toList();

        // 返回封装好的省份、城市和区县列表
        return R.Success(provinceDtos);
    }

}

打开swagger查看:

相关推荐
A.说学逗唱的Coke1 小时前
【大模型专题】向量数据库深度解析:从原理到实战,构建企业级 AI 知识检索底座
数据库·人工智能
果丁智能1 小时前
智能锁赋能网约房民宿数字化管控:身份核验+远程授权,筑牢安全防线、降本增效
网络·数据库·人工智能·安全·智能家居
无敌的牛2 小时前
redis学习过程
数据库·redis·学习
IT北辰2 小时前
神通数据库管理系统V7.0.251210 for Windows(x86 64bit)安装部署
数据库·神通
北顾笙9802 小时前
MySQL-day2
数据库·mysql
Demons_kirit2 小时前
新项目如何连接上自己本地的数据库
数据库
洪晓露3 小时前
将 rke2 集群证书延长至 10 年
运维·服务器·数据库
程序猿乐锅4 小时前
【MySQL | 第八篇】MySQL 视图
数据库·mysql
jieyucx4 小时前
SQL 查询终极高阶通鉴:从零基础拆解到工业级多表联查、窗口函数与索引优化
数据库·sql
ai_coder_ai5 小时前
论 NoSQL 数据库技术及其应用
数据库·nosql