省市区数据
数据形式为sql文件,数据表字段设计如下,请点击数据下载
后端
vo
由于数据需要在前端显示,为了方便使用前端组件,特意封装此vo类
import lombok.AllArgsConstructor;
import lombok.Data;
import java.util.List;
/**
* 存储地址项 如广东省 茂名市 电白区
*/
@Data
@AllArgsConstructor
public class AreaItemVo {
/**
* 存储id
*/
private Long value;
private String label;
private List<AreaItemVo> children;
public AreaItemVo(Long value, String label) {
this.value = value;
this.label = label;
}
}
service
@Override
public List<AreaItemVo> getAreaTree() {
声明变量
List<AreaItemVo> areaItemVoList = new ArrayList<>();
//查询出所有省市区数据
List<ProvinceCityRegionEntity> provinceCityRegionEntityList = baseMapper.selectList(null);
//过滤出所有省
List<ProvinceCityRegionEntity> fatherList = provinceCityRegionEntityList.stream().filter(item -> {
if (item.getParentId() == 0) {
return true;
} else {
return false;
}
}).collect(Collectors.toList());
for (ProvinceCityRegionEntity father : fatherList) {
AreaItemVo areaItemVo = new AreaItemVo(father.getId(), father.getName());
this.searchSon(areaItemVo, provinceCityRegionEntityList);
areaItemVoList.add(areaItemVo);
}
return areaItemVoList;
}
private void searchSon(AreaItemVo father, List<ProvinceCityRegionEntity> provinceCityRegionEntityList) {
List<AreaItemVo> sonList = provinceCityRegionEntityList.stream().filter(item -> {
if (item.getParentId() == father.getValue().intValue()) {
return true;
} else {
return false;
}
}).map(item1 -> {
AreaItemVo son = new AreaItemVo(item1.getId(), item1.getName());
//继续给儿子寻找孙子
this.searchSon(son, provinceCityRegionEntityList);
return son;
}).collect(Collectors.toList());
father.setChildren(sonList);
}
controller
/**
* 获取省市区的树形结构数据
* @return
*/
@GetMapping("/getAreaTree")
public R getAreaTree() {
List<AreaItemVo> areaItemVoList = provinceCityRegionService.getAreaTree();
return R.ok().addData("areaItemVoList", areaItemVoList);
}
前端
使用Element UI的级联选择器来显示结果非常之贴切
<el-form-item label="地区">
<el-cascader v-model="province_city_area" :options="areaItemVoOptions" clearable></el-cascader>
</el-form-item>
发请求向后端获取数据
//获取省市区的树形结构数据
getAreaTree() {
provinceCityRegionApi.getAreaTree().then(
res => {
this.areaItemVoOptions = res.areaItemVoList
}
)
},
当然,直接接收后端的数据还是不行的,会出现如下问题
修正版,如果children没有元素,那就直接设置undefined即可
//获取省市区的树形结构数据
getAreaTree() {
provinceCityRegionApi.getAreaTree().then(
res => {
this.areaItemVoOptions = res.areaItemVoList
for (let i = 0; i < this.areaItemVoOptions.length; i++) {
this.setNullToUndefined(this.areaItemVoOptions[i])
}
}
)
},
//将没有子元素的父类的chidren设置为 undefined
setNullToUndefined(areaItemVo) {
if (areaItemVo.children.length < 1) {
areaItemVo.children = undefined;
} else {
for (let i = 0; i < areaItemVo.children.length; i++) {
this.setNullToUndefined(areaItemVo.children[i])
}
}
}