省市区三级联动

后端


Controller

/**
 * 地区级联选择器
 *
 * @return 级联选择器内容
 */
@GetMapping("/areaCascaderList")
public AjaxResult areaCascaderList() {
    return AjaxResult.success(appProvinceService.areaCascaderList());
}
public List<Cascader> areaCascaderList();

创建一个实体类,反给前端 

@Data
public class Cascader {
    /**
     * 键(id)
     */
    private String value;

    /**
     * 值(区域名称)
     */
    private String label;

    /**
     * 下级对象
     */
    private List<Cascader> children;
}

service

    @Autowired
    private RedisCache redisCache;

@Override
    public List<Cascader> areaCascaderList() {
            //先读redis缓存。没有再查
        List<Cascader> cascaderList = redisCache.getCacheList("areaCascaderList");
        if (cascaderList.size() < 1) {
            //创建一级列表
            List<Cascader> firstLevels = new ArrayList<>();
            //查询省级数据
            List<AppProvince> provinceList = 
                                  appProvinceMapper.selectAppProvinceList(null);
            //循环赋值
            for (AppProvince province : provinceList) {
                //创建二级列表
                List<Cascader> secondLevels = new ArrayList<>();
                //第一级键
                Cascader firstLevel = new Cascader();
                firstLevel.setValue(province.getProvinceId().toString());
                firstLevel.setLabel(province.getProvinceName());

                //查询该省下的市
                AppCity paramCity = new AppCity();
                paramCity.setProvinceId(province.getProvinceId());
                List<AppCity> cityList = appCityMapper.selectAppCityList(paramCity);
                //循环赋值
                for (AppCity city : cityList) {
                    //三级列表
                    List<Cascader> thirdlyLevels = new ArrayList<>();
                    //第二级键
                    Cascader secondLevel = new Cascader();
                    secondLevel.setValue(city.getCityId().toString());
                    secondLevel.setLabel(city.getCityName());
                    //查询该市下的区
                    AppDistrict paramDistrict = new AppDistrict();
                    paramDistrict.setCityId(city.getCityId());
                    List<AppDistrict> districtList = 
                               appDistrictMapper.selectAppDistrictList(paramDistrict);
                    //循环赋值
                    for (AppDistrict district : districtList) {
                       //第三级键 //查询到的数据存到thirdlyLevels(第三级) 数组中  
                        Cascader thirdlyLevel = new Cascader();
                        thirdlyLevel.setValue(district.getDistrictId().toString());
                        thirdlyLevel.setLabel(district.getDistrictName());
                        thirdlyLevels.add(thirdlyLevel);
                    }
                    secondLevel.setChildren(thirdlyLevels);
                    //将包含第三级的数组存到secondLevels(第二级)数组中
                    secondLevels.add(secondLevel);
                }
                firstLevel.setChildren(secondLevels);
                //将包含第二级的数组存到firstLevels(第一级)数组中
                firstLevels.add(firstLevel);
            }
               // 将 firstLevels(区域集合)存到redis中
            redisCache.setCacheList("areaCascaderList", firstLevels);
            cascaderList = firstLevels;
        }

        return cascaderList;

    }

前端 

return {
  //级联选择器
  options: [],

}

methods: {
  /**级联选择器*/
  getCascaderList() {
    areaCascaderList().then(response => {
      this.options = response.data
    })
  },

修改回显时

/** 修改按钮操作 */
handleUpdate(row) {
  this.reset();
  const orderId = row.orderId || this.ids
  getAppGoodsOrder(orderId).then(response => {
    let areaList = []
    areaList.push(response.data.provinceId + '')
    areaList.push(response.data.cityId + '')
    areaList.push(response.data.districtId + '')
    this.form = response.data;
    this.form.area = areaList
    this.open = true;
    this.title = "修改商品订单";
  });
},

 提交数据时

将区域id 和区域名称分别赋值

/** 提交按钮 */
submitForm() {
  this.$refs["form"].validate(valid => {
    if (valid) {
      if (this.form.area.length > 0) {
        this.form.provinceId = this.form.area[0]
        this.form.cityId = this.form.area[1]
        this.form.districtId = this.form.area[2]
        let labels = this.$refs['label'].getCheckedNodes()
        this.form.provinceName = labels[0].pathLabels[0]
        this.form.cityName = labels[0].pathLabels[1]
        this.form.districtName = labels[0].pathLabels[2]

      } else {
        this.$modal.msgWarning('请选择地区')
        return
      }
      if (this.form.orderId != null) {
        updateAppGoodsOrder(this.form).then(response => {
          this.$modal.msgSuccess("修改成功");
          this.open = false;
          this.getList();
        });
      } else {
        addAppGoodsOrder(this.form).then(response => {
          this.$modal.msgSuccess("新增成功");
          this.open = false;
          this.getList();
        });
      }
    }
  });
},

新增修改 

<el-form-item label="所在地区" prop="area">
  <el-cascader
    filterable
    v-model="form.area"
    :options="options"
    clearable
    filterable
    ref="label"></el-cascader>
</el-form-item>   

或者直接用js

import { addressList } from "@/api/cityData.js";
data() {
  return {
    addressList, 


搜索 

@change="areaList() 改变事件

<div class="block" >
  <el-cascader @change="areaList()"
    :options="options"
    v-model="queryParams.area"
    :props="{ checkStrictly: true }"
    clearable></el-cascader>
</div>
data() {
  return {

//搜索
queryParams:{
  area: [],
  provinceId: null,
  cityId: null,
  districtId: null,
},

}

}

methods: {
// 改变调用方法事件
  areaList(){
    this.handleQuery();
  },
  /** 搜索按钮操作 */
  handleQuery() {
    if (this.queryParams.area != null) {
      //级联选择器搜索处理
      if (this.queryParams.area.length == 1) {
        this.queryParams.provinceId = this.queryParams.area[0]
      } else if (this.queryParams.area.length == 2) {
        this.queryParams.cityId = this.queryParams.area[1]
      } else if (this.queryParams.area.length == 3) {
        this.queryParams.districtId = this.queryParams.area[2]
      } else {
        this.queryParams.provinceId = null
        this.queryParams.cityId = null
        this.queryParams.districtId = null
      }
    }
    this.getAppProjectList()
  },
/** 查询项目列表 */
getAppProjectList() {
  listProject(this.queryParams).then(response => {
    this.appProjectList = response.rows
  })
},

},


另一种,通过sql

/**
 * 获取省市区列表
 * @return
 */
@NotAuth
@Api(value = "获取省市区列表")
@GetMapping(value = "/getTreeList")
public AjaxResult getTreeList() {
    return appProvinceService.getTreeList();
}
/**
 * 获取省市区列表
 * @return
 */
@Override
public AjaxResult getTreeList() {
    List<AppProvinceDTO> appProvinceDTOList  = appProvinceMapper.getTreeList();
    return AjaxResult.success(appProvinceDTOList);
}

select * from app_province   ap
                left join app_city  ac on ap.province_id = ac.province_id
                left join app_district ad on ac.city_id = ad.city_id


另一种

/**
 *  获取省市区List
 */
@Log(title = "获取省市区List")
@GetMapping("/getTreeList")
public AjaxResult getTreeList() {
    return cdsProvinceService.getTreeList();
}
/**
 *  获取省市区List
 */
@Log(title = "获取省市区List")
@GetMapping("/getTreeList")
public AjaxResult getTreeList() {
    return cdsProvinceService.getTreeList();
}

@Data
public class CdsProvinceVo extends CdsProvince {

    private List<CdsCityVo>  childrenList;

}

@Data
public class CdsCityVo extends CdsCity {
    private List<CdsDistrictVo> childrenList;
    private CdsDistrictVo cdsDistrictVo;
    private String name;
}

@Data
public class CdsDistrictVo extends CdsDistrict {
    private String name;
}

 @Override
    public AjaxResult getTreeList() {

        //先读redis缓存。没有再查
        List<CdsProvinceVo> cascaderList = redisCache.getCacheList("areaCascaderList");

        if (cascaderList.size() < 1) {

            List<CdsProvinceVo> appProvinceList = cdsProvinceMapper.selectAll();
            List<CdsCityVo> appCityList = cdsCityMapper.selectAll();
            List<CdsDistrictVo> appDistrictList = cdsDistrictMapper.selectAll();

            List<CdsCityVo> appCityDtoList = new ArrayList<>();
            List<CdsDistrictVo> appDistrictDtoList = JSONArray.parseArray(JSONArray.toJSONString(appDistrictList), CdsDistrictVo.class);
            for (CdsCity appCity : appCityList) {
                List<CdsDistrictVo> childrenList = appDistrictDtoList.stream().filter(t -> t.getCityId().equals(appCity.getCityId())).collect(Collectors.toList());
                CdsCityVo appCityDto = new CdsCityVo();
                BeanUtils.copyProperties(appCity, appCityDto);
                appCityDto.setChildrenList(childrenList);
                appCityDtoList.add(appCityDto);
            }

            List<CdsProvinceVo> appProvinceDtoList = new ArrayList<>();
            for (CdsProvince appProvince : appProvinceList) {
                List<CdsCityVo> childrenList = appCityDtoList.stream().filter(t -> t.getProvinceId().equals(appProvince.getProvinceId())).collect(Collectors.toList());
                CdsProvinceVo appProvinceDto = new CdsProvinceVo();
                BeanUtils.copyProperties(appProvince, appProvinceDto);
                appProvinceDto.setChildrenList(childrenList);
                appProvinceDtoList.add(appProvinceDto);
            }
            // 将 firstLevels(区域集合)存到redis中
            redisCache.setCacheList("areaCascaderList", appProvinceDtoList);

            cascaderList = appProvinceDtoList;
        }

        return AjaxResult.success(cascaderList);
    }

遇到我问题 Failed to serialize object using DefaultSerializer; nested exception is java.lang.IllegalArgumentException: DefaultSerializer requires a Serializable payload but

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值