开发笔记:uniapp+vue+微信小程序 picker +后端 省市区三级联动

写在前面

未采用: 前端放置js 或者 json文件进行 省市区三级联动
采用: 前端组件 + 后端接口实现三级联动
原因:首先微信小程序有大小限制,能省则省,其次:方便后台维护省市区数据,完整省市区每年更新好像还是挺频繁的

方案

后端保存数据格式

例如
在这里插入图片描述

前端要展示 “福建省-厦门市-集美区“ 直接根据 - 分割截取就行

12,1,3 :代表选择数据 对应项中的第几个
9261586716360729,9261586716360744:代表选择省跟市的id

在这里插入图片描述
这两个数组串 主要是回显数据用 ,如下,点击展开回显
在这里插入图片描述

前端实现代码 [有注释说明]

template
	<uni-popup ref="cityDialog" type="bottom"><view class="uni-list"><view class="uni-list-cell"><view class="uni-list-cell-left">当前选择</view><view class="uni-list-cell-db"><picker @columnchange="columnchange" @change="changeAddress" range-key="name" :value="value":range="addressList" mode="multiSelector"><view class="uni-input">{{cityValue}}</view></picker></view></view></view></uni-popup>
data
export default {data() { return { //存放三级联动数据addressList: [[],[],[]],//选择的省回显idprovince: "",//选择的市回显idcity: "",//回显值value: [],//前端展示数据cityValue:'',timer:null}}
}
create
	created() {console.log("created...")this.userInfo = uni.getStorageSync("userInfo");const info = this.userInfo.cityif (info) {//info 就是上面方案里说的数据库city字段值  // 福建省-厦门市-集美区-12,1,3-9261586716360729,9261586716360744//前端展示数据this.cityValue = info.split('-').slice(0, 3).join('-');//数据库 省市表主键 idconst idPart = info.split('-')[4].split(',');this.province = idPart[0]this.city = idPart[1]			this.value = []// 添加回显id this.value.push(...info.split('-')[3].split(',').map(Number));	}//初始化省数据this.initProvince(); 		},
methods
columnchange(e) {clearTimeout(this.timer)const _this = thisthis.timer = setTimeout(() => {const {column,value} = e.detailconst item = {..._this.addressList[column][value]}if (column === 0) {this.province = item.id//清楚选择二级数据,不然切换别的省,第三级永远是上一次选择this.city = ''_this.loadCity(item.id)} else if (column === 1) {this.city = item.id_this.loadThird(item.id)}}, 500)},initProvince() {//调用接口获取省数据listProvince().then(res => {if (res.code == 200) {this.addressList.splice(0, 1, [...res.data])//如果this.province 数据没有,表示数据库没有记录if (!this.province) {this.province = res.data[0].id}this.loadCity(this.province)}})},loadCity(parentId) {listCity(parentId).then(res => {if (res.code == 200) {this.addressList.splice(1, 1, [...res.data])if(!this.city) {this.city = res.data[0].id}this.loadThird(this.city)}})},loadThird(parentId) {listCity(parentId).then(res => {if (res.code == 200) {this.addressList.splice(2, 1, [...res.data])}})},changeAddress(e) {console.log("e", e)const _this = this_this.value = []_this.value.push(...e.detail.value)const arr = e.detail.valuelet str = ''arr.forEach((el, index) => {const {name} = _this.addressList[index][el]str += `${index ? '-':''}${name}`})this.cityValue = str// 最终数据 省-市-区-选择数据第几个(逗号隔开)- 选择数据id(逗号隔开) //例:福建省-厦门市-集美区-12,1,3-9261586716360729,9261586716360744str = str + "-" + e.detail.value + "-" + this.province + "," + this.city//TODO 保存,或者修改 数据 this.editInfo.city = str},

后端实现代码

后端就两个接口 简单接口
 /***  获取省份* @return  province*/@GetMapping("listProvince")public AjaxResult  listProvince () {return AjaxResult.success(sysProvinceCityDistrictService.listProvince());}```bash/***  获取市/区县* @return  province*/@GetMapping("listCity")public AjaxResult  listCity (@RequestParam("parentId") String parentId) {return AjaxResult.success(sysProvinceCityDistrictService.listCity(parentId));}

service接口文件这边就忽略了,直接impl逻辑

逻辑也很简单,查缓存 ,没有就数据库,有就缓存

Constants.NUMBER_ZERO 常量 0

@Override
public List<CityVo> listProvince() {if (Boolean.TRUE.equals(redisTemplate.hasKey(CacheConstants.CITY_CACHE_KEY))) {//从缓存获取return (List<CityVo>) redisTemplate.opsForValue().get(CacheConstants.CITY_CACHE_KEY);}List<CityVo> cityVos = sysProvinceCityDistrictMapper.listProvince();if (CollectionUtils.isEmpty(cityVos)) {return null;}redisTemplate.opsForValue().set(CacheConstants.CITY_CACHE_KEY, cityVos);return cityVos;}@Overridepublic List<CityVo> listCity(String parentId) {List<CityVo> list = new ArrayList<>();List<SysProvinceCityDistrict> reultList;if (Boolean.TRUE.equals(redisTemplate.hasKey(CacheConstants.CITY_CACHE_KEY_CITY))) {//从缓存获取reultList = (List<SysProvinceCityDistrict>) redisTemplate.opsForValue().get(CacheConstants.CITY_CACHE_KEY_CITY);} else {QueryWrapper<SysProvinceCityDistrict> query = new QueryWrapper<>();query.ne("parent_id", Constants.NUMBER_ZERO);reultList = sysProvinceCityDistrictMapper.selectList(query);}if (CollectionUtils.isEmpty(reultList)) {return list;}reultList.stream().filter(s -> s.getParentId().equals(parentId)).forEach(info -> {CityVo cityVo = new CityVo();cityVo.setId(info.getId());cityVo.setName(info.getName());list.add(cityVo);});redisTemplate.opsForValue().set(CacheConstants.CITY_CACHE_KEY_CITY, reultList);return list;}

CityVo

/*** @author rongpeng.xia* @date 2024-08-13 10:33:59*/
@Data
public class CityVo  implements Serializable {private static final long serialVersionUID = 1L;private String id;private String name;
}

(SysProvinceCityDistrict)表实体类

/*** (SysProvinceCityDistrict)表实体类** @author xiarp* @since 2024-08-12 15:58:13*/
@SuppressWarnings("serial")
@Data
public class SysProvinceCityDistrict implements Serializable {private static final long serialVersionUID = 286422671100375146L;/*** id*/private String id;/*** 名字*/private String name;/*** 父id*/private String parentId;/*** 编码*/private String code;/*** 父编码*/private String parentCode;/*** 创建者*/private Long createId;/*** 创建时间*/private Date createTime;/*** 修改者*/private Long updateId;/*** 修改时间*/private Date updateTime;
}

前端参考的连接:https://blog.csdn.net/m0_73205643/article/details/140954162

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/402683.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SQL基础教程(八)SQL高级处理

※食用指南&#xff1a;文章内容为《SQL基础教程》系列学习笔记&#xff0c;该书对新手入门非常友好&#xff0c;循序渐进&#xff0c;浅显易懂&#xff0c;本人主要用来补全学习MySQL中未涉及的部分&#xff0c;便于刷题和做项目。 官方电子书&#xff1a;《SQL基础教程》第2…

Web安全:SqlMap工具

一、简介 sqlmap 是一款开源的渗透测试工具&#xff0c;可以自动化进行SQL注入的检测、利用&#xff0c;并能接管数据库服务器。它具有功能强大的检测引擎,为渗透测试人员提供了许多专业的功能并且可以进行组合&#xff0c;其中包括数据库指纹识别、数据读取和访问底层文件系统…

柔性超级电容器咋储能?生物聚合物在其中起啥作用?有啥挑战?

*本文只作阅读笔记分享* 一、引言 随着对化石燃料影响的日益关注&#xff0c;开发用于先进电化学能量存储设备的绿色和可再生材料变得至关重要。超级电容器因其出色的寿命、安全性和宽温度操作范围等优势而成为有前途的储能候选者。柔性超级电容器特别适合为轻质可穿戴电子设…

我常用的几个傻瓜式爬虫工具,收藏!

爬虫类工具主要两种&#xff0c;一种是编程语言第三方库&#xff0c;比如Python的scrapy、selenium等&#xff0c;需要有一定的代码基础&#xff0c;一种是图形化的web或桌面应用&#xff0c;比如Web Scraper、后羿采集器、八爪鱼采集器、WebHarvy等&#xff0c;接近于傻瓜式操…

qt生成一幅纯马赛克图像

由于项目需要&#xff0c;需生成一幅纯马赛克的图像作为背景&#xff0c;经过多次测试成功&#xff0c;记录下来。 方法一&#xff1a;未优化方法 1、代码&#xff1a; #include <QImage> #include <QDebug> #include <QElapsedTimer>QImage generateMosa…

MyBatis全解

目录 一&#xff0c; MyBatis 概述 1.1-介绍 MyBatis 的历史和发展 1.2-MyBatis 的特点和优势 1.3-MyBatis 与 JDBC 的对比 1.4-MyBatis 与其他 ORM 框架的对比 二&#xff0c; 快速入门 2.1-环境搭建 2.2-第一个 MyBatis 应用程序 2.3-配置文件详解 (mybatis-config.…

Pikachu-XSS漏洞之cookie值获取、钓鱼结果和键盘记录实战记录

目录 Pikachu-XSS漏洞之cookie值获取、钓鱼结果和键盘记录实战记录 一、XSS&#xff08;get型&#xff09;之cookie值获取&#xff1a; 二、xss&#xff08;post型&#xff09;之cookie值获取 三、Xss之钓鱼攻击 四、XSS获取键盘记 Pikachu-XSS漏洞之cookie值获取、钓鱼结果…

坐牢第二十七天(聊天室)

基于UDP的网络聊天室 一.项目需求&#xff1a; 1.如果有用户登录&#xff0c;其他用户可以收到这个人的登录信息 2.如果有人发送信息&#xff0c;其他用户可以收到这个人的群聊信息 3.如果有人下线&#xff0c;其他用户可以收到这个人的下线信息 4.服务器可以发送系统信息…

算法工程师第四十天(647. 回文子串 516.最长回文子序列 动态规划总结篇 )

参考文献 代码随想录 一、回文子串 给你一个字符串 s &#xff0c;请你统计并返回这个字符串中 回文子串 的数目。 回文字符串 是正着读和倒过来读一样的字符串。 子字符串 是字符串中的由连续字符组成的一个序列。 示例 1&#xff1a; 输入&#xff1a;s "abc"…

【stm32项目】多功能智能家居室内灯光控制系统设计与实现(完整工程资料源码)

多功能智能家居室内灯光控制系统设计与实现 目录&#xff1a; 目录&#xff1a; 前言&#xff1a; 一、项目背景与目标 二、国内外研究现状&#xff1a; 2.1 国内研究现状&#xff1a; 2.2 国外研究现状&#xff1a; 2.3 发展趋势 三、硬件电路设计 3.1 总体概述 3.2 硬件连接总…

图像压缩算法

8.1 JPEG压缩 (JPEG Compression) 介绍 JPEG&#xff08;Joint Photographic Experts Group&#xff09;压缩是最常用的有损图像压缩算法之一。它通过减少图像中的冗余数据来实现高效压缩&#xff0c;特别适用于自然图像。 原理 JPEG压缩的基本步骤包括颜色空间转换、离散余…

WPF篇(18)-DataGrid数据表格控件+ComboBox下拉框控件

DataGrid数据表格控件 DataGrid是一个可以多选的数据表格控件。所以&#xff0c;它继承一个支持多选的父类——MultiSelector。 public abstract class MultiSelector : Selector {protected MultiSelector();public IList SelectedItems { get; }protected bool CanSelectMu…

Python学习day16-类与对象

这里写目录标题 类示例 成员方法self关键字 类与对象构造方法其他类内置方法&#xff08;魔术方法&#xff09;_str_符号_Lt_符号le小于等于比较eq比较运算小结 类 在Python中&#xff0c;class&#xff08;类&#xff09;是一种用于创建对象的模板或蓝图。它封装了数据&#…

基于Django的停车场车辆出入管理系统,可识别车牌图片

研究背景 随着城市化进程的加快&#xff0c;车辆数量不断增加&#xff0c;停车场的管理成为一个日益重要的课题。传统的停车场管理系统依赖人工登记和监控&#xff0c;不仅效率低下&#xff0c;而且容易出现疏漏和错误&#xff0c;难以满足现代社会对停车场管理智能化、高效化…

STM32标准库学习笔记-3.外部中断

参考教程&#xff1a;【STM32入门教程-2023版 细致讲解 中文字幕】 中断 中断含义&#xff1a;在计算机执行主程序运行过程中&#xff0c;出现了特定的中断触发条件&#xff08;中断源&#xff09;&#xff0c;使得CPU暂停当前正在运行的程序&#xff0c;转而去处理中断程序&…

2024 国内自闭症学校排名榜:突破边界,创造无限可能

在 2024 年&#xff0c;当家长们面对国内自闭症学校的排名榜时&#xff0c;心中或许充满了期待与困惑。然而&#xff0c;这些排名榜虽然能提供一定的参考&#xff0c;但绝不能成为选择学校的唯一依据。家长们更需要深入了解每所学校的真实情况&#xff0c;通过线下考察&#xf…

python及pycharm安装配置

PS&#xff1a;这篇是对于初学者的python以及pycharm配置教程&#xff0c;配置完成后可以直接看我的python学习笔记来进行python全套学习&#xff0c;现在已更新第一部分。 Python学习笔记&#xff08;一&#xff09;-CSDN博客 目录 一、python以及pycharm的安装配置 1.1 py…

Nuxt3:构建的时候报错Search string not found: “for (const existingRoot of buildInfoVersionMap.roots)

我们完成初步页面开发后&#xff0c;需要构建下项目生成我们需要的页面&#xff0c;在执行构建的时候报错&#xff1a; 找了很多资料&#xff0c;这个问题是由于 vue-tsc v1 版本引起&#xff0c;只需要将 vue-tsc 升级到v2 即可 我们在执行删除的时候&#xff0c;结果发现它…

【MySQL】数据库约束

系列文章目录 第一章 数据库基础 第二章 数据库基本操作 文章目录 系列文章目录前言约束关键字一览NOT NULLUNIQUEDEFAULTPRIMARY KEY自增主键 FOREIGN KEY总结 前言 在学习了数据库的增删改查操作之后&#xff0c;接下来就需要进阶的学习关键字来完善SQL语句的条件。学习数据…

数据结构----链表

一丶概念 链表又称单链表、链式存储结构&#xff0c;用于存储逻辑关系为“一对一”的数据。 和顺序表不同同&#xff0c;使用链表存储数据&#xff0c;不强制要求数据在内存中集中存储&#xff0c;各个元素可以分散存储在内存中。 二丶特点 特点&#xff1a;内存不连…