SpringBoot+vue实现省市区的三级联动

本文需要的前置知识点SpringBoot+mybatisPlus+vue

最终效果如下图所示

 1.新建一个springboot项目引入mybatis-plus 并且使用脚手架搭建一个Vue项目,在Vue项目中引入ElementUI以及Axios,在mysql创建相关数据库

相关表结构如下

 

 

 后端boot项目结构如下

 三级联动的关键在于每一级的变动都会对一下的子级产生影响,一旦当前级的内容更改,下一级的内容要立刻随之更改;

前端页面主要代码如下

<template>
<div>
  省份:<el-select v-model="provinceCode" placeholder="请选择" @change="provinceChange">
    <el-option
        v-for="item in provinces"
        :key="item.id"
        :label="item.name"
        :value="item.code">
    </el-option>
  </el-select>&nbsp;
  城市:<el-select v-model="cityCode" placeholder="请选择" @change="cityChange">
  <el-option
      v-for="item in citys"
      :key="item.id"
      :label="item.name"
      :value="item.code">
  </el-option>
</el-select>&nbsp;
  区域:<el-select v-model="townCode" placeholder="请选择">
  <el-option
      v-for="item in towns"
      :key="item.id"
      :label="item.name"
      :value="item.code">
  </el-option>
</el-select>&nbsp;


</div>
</template>

<script>
export default {
  name: "CityMain",
  data(){
    return{
      URL:'http://localhost:8080',
      provinces:[],
      citys:[],
      towns:[],
      provinceCode:'',
      cityCode:'',
      townCode:'',
      province:{id:'',name:'',code:''},
      flag:false,
      addOrUpdate:'',
    }
  },
  methods:{
    //默认加载根节点
    initProvince(){
      this.$axios({
        url:this.URL+"/province",
        method:'get'
      }).then(re=>{
        this.provinces=re.data
        console.log(re.data)
      })
    },
    //一级菜单变化时
    provinceChange(){
      this.cityCode=''
      this.townCode=''
      this.$axios({
        url:this.URL+"/city/"+this.provinceCode,
        method:'get'
      }).then(re=>{
        this.citys=re.data
        console.log(re.data)
      })
    },
    //二级变化时
    cityChange(){
      this.townCode=''
      this.$axios({
        url:this.URL+"/town/"+this.cityCode,
        method:'get'
      }).then(re=>{
        this.towns=re.data
        console.log(re.data)
      })
    },
  },
  created() {
    this.initProvince();
  }
}
</script>

<style scoped>

</style>

所以我们可以开始默认加载根节点,绑定seleect框,并且绑定change事件,一旦当前节点的值发生变化,则子节点内容重新根据当前节点数据请求后台数据并且进行绑定

@RestController
@CrossOrigin
@RequestMapping("/province")
public class ProvinceController {

    @Autowired
    private TAddressProvinceMapper mapper;

    @GetMapping
    public List<TAddressProvince> getAllProvince(){
        return mapper.selectList(null);
    }
}

然后编写市级所对应的Controller 以及区级所对应的Controller

@RestController
@CrossOrigin
@RequestMapping("/city")
public class CityController {

    @Autowired
    private TAddressCityMapper mapper;


    @GetMapping("/{provincecode}")
    public List<TAddressCity> getCityByProvincecode(@PathVariable("provincecode")String provincecode){
        LambdaQueryWrapper<TAddressCity> wrapper=new LambdaQueryWrapper<>();
        wrapper.eq(TAddressCity::getProvincecode,provincecode);
        return mapper.selectList(wrapper);
    }



}
@RestController
@CrossOrigin
@RequestMapping("/town")
public class TownController {

    @Autowired
    private TAddressTownMapper mapper;

    @GetMapping("/{citycode}")
    public List<TAddressTown> getTownWithCityCode(@PathVariable("citycode")String citycode){
        LambdaQueryWrapper<TAddressTown> queryWrapper=new LambdaQueryWrapper<>();
        queryWrapper.eq(TAddressTown::getCitycode,citycode);
        return mapper.selectList(queryWrapper);
    }
}

搜索市的时候按照省级节点提供的省级编码,搜索区的时候按照市级节点提供的城市编码,在前端相对应的节点上都绑定上change事件,就可以完成三级联动的效果了

最后的对应的实体类

@Data
public class TAddressCity {

    private Integer id;
    //城市编码
    private String code;
    //城市名称
    private String name;
    //所属省份编码
    private String provincecode;

}
@Data
public class TAddressProvince {

    private Integer id;
    //省份编码
    private String code;
    //省份名称
    private String name;
}
@Data
public class TAddressTown {

    private Integer id;
    //区县编码
    private String code;
    //区县名称
    private String name;
    //所属城市编码
    private String citycode;
}

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
您可以使用Vue.js与TypeScript结合Element Plus来实现省市区三级联动。以下是一个简单示例: 首先,安装Element Plus和相应的类型声明文件: ```bash npm install element-plus npm install @types/element-plus ``` 然后,创建一个Vue组件,并在其中使用Element Plus的Cascader组件: ```vue <template> <div> <el-cascader v-model="selectedValues" :options="options" :props="props" @change="handleChange" ></el-cascader> </div> </template> <script lang="ts"> import { defineComponent } from 'vue'; import { Cascader, CascaderOption } from 'element-plus'; export default defineComponent({ name: 'AddressCascader', components: { [Cascader.name]: Cascader, }, data() { return { selectedValues: [], options: [ { value: '北京', label: '北京', children: [ { value: '东城区', label: '东城区', children: [ { value: '安定门', label: '安定门', }, { value: '建国门', label: '建国门', }, ], }, // 其他区... ], }, // 其他省份... ], props: { value: 'value', label: 'label', children: 'children', }, }; }, methods: { handleChange(value: string[]) { // 处理选择的值 console.log(value); }, }, }); </script> ``` 在这个示例中,我们使用了Element Plus的Cascader组件来实现省市区三级联动。通过绑定`v-model`指令,我们可以获取用户选择的值,并在`handleChange`方法中进行处理。 请注意,示例中的数据是静态的,您可以根据实际情况进行修改,例如从后端获取数据并动态生成选项。 希望这个示例能够帮助您实现省市区三级联动
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值