将省市区列表保存到数据库中t_dict_district 数据库中的parent表示父代码号是什么,就比如忻州依赖于山西,山西依赖于中国,code代表本身的代码号是多少。
@Data
@AllArgsConstructor
@NoArgsConstructor
public class District{
private Integer id;
private String parent;
private String code;
private String name;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
District district = (District) o;
return Objects.equals(id, district.id) && Objects.equals(parent, district.parent) && Objects.equals(code, district.code) && Objects.equals(name, district.name);
}
@Override
public int hashCode() {
return Objects.hash(id, parent, code, name);
}
}
编写mapper层
public interface DistrictMapper {
//根据用户的父代号进行查询
List<District> findByParent(String parent);
//根据本身的code来获取当前省市的名称
String getNameByCode(String code);
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-// mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.cy.store.mapper.DistrictMapper">
<select id="findByParent" resultType="com.cy.store.entity.District">
select * from t_dict_district where parent=#{parent} order by code asc
</select>
<select id="getNameByCode" resultType="java.lang.String">
select name from t_dict_district where code=#{code}
</select>
</mapper>
编写service层
public interface IDistrictService {
//根据父区域对应的代号查询区域的信息
List<District> getByParent(String parent);
//根据code查询对应的name
String getNameByCode(String code);
}
@Service
public class IDistrictServiceImpl implements IDistrictService {
@Autowired
private DistrictMapper districtMapper;
@Override
public List<District> getByParent(String parent) {
List<District> districts = districtMapper.findByParent(parent);
/*在进行网络传输的时候,为了尽量避免无效数据的传递,可以将无效数据设置为null
* 可以节省流量,另一方面提升了效率*/
for (District d:districts){
d.setId(null);
d.setParent(null);
}
return districts;
}
@Override
public String getNameByCode(String code) {
String name = districtMapper.getNameByCode(code);
return name;
}
}
因为这个省市区是需要在地址中用到的,所以地址的业务逻辑层需要添加内容
//对省市区进行补全
String provinceName = districtService.getNameByCode(address.getProvinceCode());
String cityName = districtService.getNameByCode(address.getCityCode());
String areaName = districtService.getNameByCode(address.getAreaCode());
address.setUid(uid);
Integer isDefault = count == 0 ? 1 : 0;
address.setIsDefault(isDefault);
address.setProvinceName(provinceName);
address.setCityName(cityName);
address.setAreaName(areaName);
address.setCreatedUser(username);
address.setCreatedTime(new Date());
address.setModifiedUser(username);
address.setModifiedTime(new Date());
编写controller层
@RequestMapping("districts")
@RestController
public class DistrictController extends BaseController{
@Autowired
private IDistrictService districtService;
//写两个的话用大括号括起来
@RequestMapping({"/",""})
public JsonResult<List<District>> getByParent(String parent){
List<District> data = districtService.getByParent(parent);
return new JsonResult<>(OK,data);
}
}
前端代码
let defaultOption = '<option value="0">---- 请选择 ----</option>';
$(document).ready(function (){
showProvinceList();
//设置默认的请选择的值,作为控件的默认值
$("#city-list").append(defaultOption);
$("#area-list").append(defaultOption);
})
//省的下拉列表数据展示
function showProvinceList(){
$.ajax({
url:"/districts/",
dataType:"json",
data:"parent=86",
type:"post",
success:function (data){
if (data.state==200){
let list = data.data;
for (let i = 0 ; i < list.length;i++){
let opt = "<option value='"+list[i].code+"'>"+list[i].name+"</option>";
$("#province-list").append(opt);
}
}else{
alert("省/直辖市加载失败")
}
},
error:function (data){
alert("产生未知错误"+data.status)
}
})
}
//监听某个值发生改变-此时需要根据用户点的省份来加载对应的市区
//所以需要监听用户是否点击省份
$("#province-list").change(function (){
//先获取省的父代码
let parent = $("#province-list").val();
$("#city-list").empty();
$("#city-list").append(defaultOption);
if (parent == 0){
return;
}
$.ajax({
url:"/districts/",
dataType:"json",
data:"parent="+parent,
type:"get",
success:function (data){
if (data.state==200){
let list = data.data;
for (let i = 0 ; i < list.length;i++){
let opt = "<option value='"+list[i].code+"'>"+list[i].name+"</option>";
$("#city-list").append(opt);
}
}else{
alert("市加载失败")
}
},
error:function (data){
alert("产生未知错误"+data.status)
}
})
})
$("#city-list").change(function (){
//先获取省的父代码
let parent = $("#city-list").val();
$("#area-list").empty();
$("#area-list").append(defaultOption);
if (parent == 0){
return;
}
$.ajax({
url:"/districts/",
dataType:"json",
data:"parent="+parent,
type:"get",
success:function (data){
if (data.state==200){
let list = data.data;
for (let i = 0 ; i < list.length;i++){
let opt = "<option value='"+list[i].code+"'>"+list[i].name+"</option>";
$("#area-list").append(opt);
}
}else{
alert("区加载失败")
}
},
error:function (data){
alert("产生未知错误"+data.status)
}
})
})