小程序实现定位城市切换且城市根据首字母A-Z排序后端数据实现逻辑

场景:

话不多说后端提供数据实现步骤:

1.controller层

@Api(tags = {"[地区]-城市相关接口"})
@RestController
@RequestMapping("region")
@Slf4j
public class RegionController extends BaseController {@Resourceprivate RegionService regionService;@ApiOperation("城市列表[A-Z]")@ApiImplicitParams({@ApiImplicitParam(name = "condition", value = "城市名称", required = false, paramType = "query")})@GetMapping("cityList")public JsonResult<List<AppletCityListVO>> cityList(@RequestParam(value = "condition", required = false) String condition) {return JsonResult.ok(this.regionService.smallProgramCityDisplayList(condition));}@ApiOperation("城市列表")@ApiImplicitParams({@ApiImplicitParam(name = "condition", value = "城市名称", required = false, paramType = "query")})@GetMapping("queryCityList")public JsonResult<List<AppletCityListVO.CityItem>> queryCityList(@RequestParam(value = "condition", required = false) String condition) {return JsonResult.ok(this.regionService.queryCityList(condition));}@Resourceprivate TencentMapUtil tencentMapUtil;@ApiOperation("根据经纬度查询地址")@GetMapping("tencent/map/reGeoCoder")public JsonResult<JSONObject> reGeoCoder(String lat, String lng) {AssertUtil.notBlank(lat, "纬度不能为空");AssertUtil.notBlank(lng, "经度不能为空");JSONObject jsonObject = tencentMapUtil.reGeoCoder(lat, lng);if (EntityConstant.INVALID != jsonObject.getInteger("status")) {log.error("定位授权失败 , errorMsg = {}", jsonObject.getString("message"));throw SimpleException.getInstance("定位授权失败");}JSONObject adInfo = jsonObject.getJSONObject("result").getJSONObject("ad_info");String city_code = adInfo.getString("city_code");String nation_code = adInfo.getString("nation_code");jsonObject.getJSONObject("result").getJSONObject("ad_info").put("cityCode", city_code.replaceAll(nation_code, ""));return JsonResult.ok(jsonObject);}
}

2.service层

@Service
@Slf4j
@Primary
public class RegionServiceImpl extends BaseApplicationService implements RegionService {@Resourceprivate RegionMapper regionMapper;private static final char[] alphabet = new char[26];static {// 使用循环填充数组元素for (int i = 0; i < alphabet.length; i++) {alphabet[i] = (char) ('A' + i);}}@Overridepublic List<AppletCityListVO> smallProgramCityDisplayList(String condition) {List<Region> regionList = this.regionMapper.selectByExample(new ExampleLambda<>(Region.class).andEqualTo(Region::getStatus, EntityConstant.NORMAL).andEqualTo(Region::getLevel, 2).andLike(Objects.nonNull(condition), Region::getName, condition).end());Map<String, List<Region>> cityMap = regionList.stream().collect(Collectors.groupingBy(Region::getInitial));List<AppletCityListVO> cityListVOList = new ArrayList<>(this.alphabet.length);for (char c : this.alphabet) {List<AppletCityListVO.CityItem> tempList = cityMap.containsKey(String.valueOf(c)) ? cityMap.get(String.valueOf(c)).stream().map(item -> {AppletCityListVO.CityItem cityItem = new AppletCityListVO.CityItem();cityItem.setCode(item.getCode());cityItem.setName(item.getName());return cityItem;}).collect(Collectors.toList()) : new ArrayList<>(0);cityListVOList.add(AppletCityListVO.builder().initial(String.valueOf(c)).itemList(tempList).build());}return cityListVOList;}@Overridepublic List<AppletCityListVO.CityItem> queryCityList(String condition) {List<Region> regionList = this.regionMapper.selectByExample(new ExampleLambda<>(Region.class).andEqualTo(Region::getStatus, EntityConstant.NORMAL).andEqualTo(Region::getLevel, 2).andLike(Objects.nonNull(condition), Region::getName, condition).end());return regionList.stream().map(item -> {AppletCityListVO.CityItem cityItem = new AppletCityListVO.CityItem();cityItem.setCode(item.getCode());cityItem.setName(item.getName());return cityItem;}).collect(Collectors.toList());}}@Builder
@Data
public class AppletCityListVO  implements Serializable {@ApiModelProperty(value = "首字母")private String initial;@ApiModelProperty(value = "城市列表")private List<CityItem> itemList;@Datapublic static class CityItem {@ApiModelProperty(value = "code")private String code;@ApiModelProperty(value = "名称")private String name;public CityItem(String code, String name) {this.code = code;this.name = name;}public CityItem() {}}}

3.mapper层

public interface RegionMapper extends CrudMapper<Region, Long> {}


4.实体类

@Table(name = "`region`")
@Data
public class Region extends BaseEntity<Long> implements Serializable {private static final long serialVersionUID = 1L;/*** Id*/@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;/*** 1*/@Column(name = "level")private Integer level;/*** code*/@Column(name = "code")private String code;/*** 父级code*/@Column(name = "parent_code")private String parentCode;/*** 名称*/@Column(name = "name")private String name;/*** 名称拼音*/@Column(name = "pinyin")private String pinyin;/*** 首字母*/@Column(name = "initial")private String initial;/*** 状态*/@Column(name = "status")private Integer status;/*** 创建时间*/@Column(name = "gmt_created")@JsonFormat(locale = "zh", pattern = "yyyy-MM-dd HH:mm:ss")private Date gmtCreated;/*** ModifyUser*/@Column(name = "modify_user")private String modifyUser;/*** CreateUser*/@Column(name = "create_user")private String createUser;/*** 更新时间*/@Column(name = "gmt_modified")@JsonFormat(locale = "zh", pattern = "yyyy-MM-dd HH:mm:ss")private Date gmtModified;/*** 是否删除*/@Column(name = "deleted")private Integer deleted;
}


5.腾讯地图处理工具类

import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.stereotype.Component;import java.util.HashMap;
import java.util.Objects;@Slf4j
@Component
public class TencentMapUtil {private String qqAk = "xxxxx-xxxxx-xxxxx-xxxxx-xxxxx-xxxxx";private String geoCoder = "https://apis.map.qq.com/ws/geocoder/v1/";private String distance = "https://apis.map.qq.com/ws/distance/v1/";private String translate = "https://apis.map.qq.com/ws/coord/v1/translate";private String reGeoCoder = "https://apis.map.qq.com/ws/geocoder/v1/?location=";/*** 通过地址查询经纬度** @param addr 地址* @return*/public String geoCoder(String addr) {JSONObject jsonObject = geoCoderRequest(addr);if (null == jsonObject) {return null;}JSONObject location = JSONUtil.parseObj(JSONUtil.toJsonStr(jsonObject.get("location")));if (Objects.nonNull(location) && Objects.nonNull(location.get("lat")) && Objects.nonNull(location.get("lng"))) {return location.get("lat").toString() + "," + location.get("lng").toString();}return null;}public JSONObject geoCoderRequest(String addr) {try {if (StringUtils.isNotEmpty(addr)) {String url = geoCoder +"?address=" + addr +"&key=" + qqAk;// 腾讯地图akString resultStr = HttpUtil.get(url);JSONObject tencentGeo = JSONUtil.parseObj(resultStr);log.info("地址转坐标响应结果:" + JSONUtil.toJsonStr(tencentGeo));if (Objects.nonNull(tencentGeo) && Objects.equals(0, tencentGeo.get("status"))) {return JSONUtil.parseObj(JSONUtil.toJsonStr(tencentGeo.get("result")));}}} catch (Exception e) {log.error("地址转坐标失败,地址:" + addr + ", e: " + e);}return null;}/*** 根据经纬度查询地址** @param lat 纬度* @param lng 经度* @return*/public JSONObject reGeoCoder(String lat, String lng) {StringBuilder url = new StringBuilder(reGeoCoder).append(lat).append(",").append(lng).append("&key=").append(qqAk);String resultStr = HttpUtil.get(url.toString());return JSONUtil.parseObj(resultStr);}/*** 将微信小程序经纬度转换成腾讯地图经纬度** @param lat 纬度* @param lng 经度* @return*/public JSONObject translate(String lat, String lng) {StringBuilder url = new StringBuilder(translate).append("?key=").append(qqAk)// 腾讯地图ak.append("&type=1")// 1.GPS坐标 2.sogou经纬度 3.baidu经纬度 4.mapbar经纬度 5.[默认]腾讯、google、高德坐标 6.sogou墨卡托.append("&&locations=").append(lat).append(",").append(lng);String resultStr = HttpUtil.get(url.toString());return JSONUtil.parseObj(resultStr);}}
6.region.sql文件 

 链接: https://pan.baidu.com/s/1m1WEgQPGXbUzgZ4qusvegQ 提取码: ztr6 复制这段内容后打开百度网盘手机App,操作更方便哦

 

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

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

相关文章

MCBPS配置成SPI

MCBPS配置成SPI 典型的SPI接口 McBSP作为SPI主机 以McBSP为主的SPI接口如图所示。当McBSP被配置为主控器时,发送输出信号(DX)被用作SPI协议的SPISIMO信号,并且接收输入信号(DR)被用作SPISOMI信号。 表列出了将McBSP配置为主控器所需的寄存器位值。下表是有关配置要求…

HQL,SQL刷题,尚硅谷

目录 相关表数据&#xff1a; 题目及思路解析&#xff1a; 查询结果排序&分组指定条件 1、查询学生的总成绩并按照总成绩降序排序 2、按照如下格式显示学生的语文、数学、英语三科成绩&#xff0c;没有成绩的输出为0&#xff0c;按照学生的有效平均成绩降序显示 3、查询一…

OJ_二叉树已知先序遍历序列(有空叶子)求中序遍历序列

题干 C实现 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<vector> using namespace std;struct TreeNode {char data;TreeNode* left;TreeNode* right; };TreeNode* RecursiveBuildTree(int& i, char str[]) {char c str[i];i;if (c #) {re…

百度SEO工具,自动更新网站的工具

在网站SEO的过程中&#xff0c;不断更新网站内容是提升排名和吸引流量的关键之一。而对于大多数网站管理员来说&#xff0c;频繁手动更新文章并进行SEO优化可能会是一项繁琐且耗时的任务。针对这一问题&#xff0c;百度自动更新文章SEO工具应运而生&#xff0c;它能够帮助网站管…

LeetCode 2120.执行所有后缀指令

现有一个 n x n 大小的网格&#xff0c;左上角单元格坐标 (0, 0) &#xff0c;右下角单元格坐标 (n - 1, n - 1) 。给你整数 n 和一个整数数组 startPos &#xff0c;其中 startPos [startrow, startcol] 表示机器人最开始在坐标为 (startrow, startcol) 的单元格上。 另给你…

Docker中创建nginx-rtmp流媒体服务器

准备工作 需要安装好docker安装好镜像 docker pull alfg/nginx-rtmp docker run -it -p 1935:1935 -p 8080:80 --rm alfg/nginx-rtmp #创建临时容器&#xff0c;容器停止即删除安装好ffmpeg sudo apt update sudo apt install ffmpeg ffmpeg -version安装成功出现如下信息&…

ChatGPT4.0 的优势、升级 4.0 为什么这么难以及如何进行升级?

前言 “ChatGPT4.0一个月多少人民币&#xff1f;” ”chatgpt4账号“ ”chatgpt4 价格“ “chatgpt4多少钱” 最近发现很多小伙伴很想知道关于ChatGPT4.0的事情&#xff0c;于是写了这篇帖子&#xff0c;帮大家分析一下。 一、ChatGPT4.0 的优势 &#xff08;PS&#xff1a;…

一张照片一键换脸:无需数据集和训练 | 开源日报 No.186

s0md3v/roop Stars: 23.6k License: AGPL-3.0 roop 是一个一键换脸的项目。 该项目可以通过一张目标人物的照片&#xff0c;实现对视频中人脸进行替换&#xff0c;无需数据集和训练。其主要功能、关键特性和核心优势包括&#xff1a; 可以在计算机上运行&#xff0c;并支持 C…

PYCHARM PYSIDE6 QT 打包异常处理 no qt platform plugin could be initialized

安装有PYSIDE6的电脑 异常错误 … no qt platform plugin could be initialized … 变量名&#xff1a;QT_QPA_PLATFORM_PLUGIN_PATH &#xff08;一个字都不能改&#xff01;&#xff01;&#xff09; 自己环境变量值&#xff1a;D:\Users\topma\anaconda3\Lib\site-package…

React中对表格实现列表的拖拽排序

1. 效果:推拽手柄列 2. 实现: react中我们需要两个包来实现 ‘array-move’‘react-sortable-hoc’Installation Use npm $ npm install react-sortable-hoc --save 引入 import { arrayMoveImmutable } from array-move import { SortableContainer, SortableElement, Sort…

力扣精选算法100道——排序数组(分治快排)

目录 &#x1f6a9;了解题意 &#x1f6a9;算法原理 &#x1f388;取随机值 &#x1f388;c中取随机数的步骤 &#x1f6a9;代码实现 &#x1f6a9;了解题意 本题的题意很简单&#xff0c;就是将nums数组排成升序即可。 &#x1f6a9;算法原理 本题和颜色分类那个题目很…

Tiktok矩阵系统搭建的逻辑和源代码!

很多和我一样从事外贸工具开发的朋友都清楚&#xff0c;TikTok矩阵系统不仅确保了平台的高效运行&#xff0c;还为用户提供了个性化的内容推荐&#xff0c;从而大大提升了用户黏性&#xff0c;因此很多人都乐意去开发类似的工具&#xff0c;下面我们就来说说Tiktok矩阵系统搭建…