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

场景:

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

1.controller层

@Api(tags = {"[地区]-城市相关接口"})
@RestController
@RequestMapping("region")
@Slf4j
public class RegionController extends BaseController {

    @Resource
    private 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));
    }

    @Resource
    private 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 {

    @Resource
    private RegionMapper regionMapper;


    private static final char[] alphabet = new char[26];

    static {
        // 使用循环填充数组元素
        for (int i = 0; i < alphabet.length; i++) {
            alphabet[i] = (char) ('A' + i);
        }
    }

    @Override
    public 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;
    }

    @Override
    public 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;

    @Data
    public 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;// 腾讯地图ak
                String 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,操作更方便哦

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

盲人出行:科技创造美好的未来

在繁忙的都市中&#xff0c;我每天都要面对许多挑战&#xff0c;盲人出行安全保障一直难以得到落实。我看不见这个世界&#xff0c;只能依靠触觉和听觉来感知周围的一切。然而&#xff0c;我从未放弃过对生活的热爱和对未来的憧憬。在一次机缘巧合下&#xff0c;我认识了一款名…

信息系统项目管理师--项目管理概述

开展项⽬是为了通过可交付成果达成⽬标。⽬标是所指向的结果、要取得的战略地位、要达到的⽬的、要获得的成果、要⽣产的产品或者要提供的服务。 可交付成果形成的独特并可验证的产品、成果或服务。可交付成果可能是有形的&#xff0c;也可能是⽆形的。产⽣⼀个或多个可交付成…

【ArcGIS】渔网分割提取栅格图+网格化分析图绘制

ArcGIS按渔网分割提取栅格图并绘制网格化分析图 准备数据操作步骤步骤1&#xff1a;创建渔网&#xff08;Create Fishnet&#xff09;步骤2&#xff1a;栅格数据处理步骤3&#xff1a;栅格插值步骤4&#xff1a;数据关联 参考 网格化的目的是让各个数据更加标准化的进行统计。因…

C语言-指针(上)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 前言 本篇文章将为大家介绍C语言中的核心内容-指针&#xff0c;指针在C语言的中知识内容比…

全新挑战:微软 AI 奥德赛邀您全方位 Get AI 应用技能!

点击蓝字 关注我们 AI 风暴的火速席卷&#xff0c;大语言模型的不断迭代&#xff0c;在企业面临着机遇与挑战并存的新形势下&#xff0c;许许多多的个人也在经历着职业生涯的巨大压力与变革。在这场人工智能的浪潮之中&#xff0c;AI 技能无疑是我们破局焕新的关键利器。 为助力…

Dell R730 2U服务器实践3:安装英伟达上代专业AI训练Nvidia P4计算卡

Dell R730是一款非常流行的服务器&#xff0c;2U的机箱可以放入两张显卡&#xff0c;这次先用一张英伟达上代专业级AI训练卡&#xff1a;P4卡做实验&#xff0c;本文记录安装过程。 简洁步骤&#xff1a; 打开机箱将P4显卡插在4号槽位关闭机箱安装驱动 详细步骤&#xff1a; 对…

k8s单机部署zookeeper

&#xff08;作者&#xff1a;陈玓玏&#xff09; 拉取镜像&#xff1a;docker pull zookeeper&#xff1b;编辑yaml&#xff1a; apiVersion: v1 kind: Service metadata:name: zookeeperlabels:app: zookeeper spec:ports:- name: clientport: 2181protocol: TCPtargetP…

图片说话软件一览

目录 ~~tokkingheads~~~~myvoiceyourface~~~~avatarify~~wav2lip(值得研究) 最近刷到很多古画唱歌视频&#xff0c;搜了一下&#xff0c;好多教你怎么做的&#xff0c;今天来尝试了一下&#xff0c;感觉不咋地&#xff0c;就没有成功的 tokkingheads 网页一直转圈&#xff0c;…

Python环境下一种改进的基于梯度下降的自适应短时傅里叶变换

在数字信号处理技术中&#xff0c;傅里叶变换及其逆变换是一种信号时频分析方法。该方法将信号的时域描述及频域描述联系在一起&#xff0c;时域信号可通过正变换转变为频域信号&#xff0c;频域信号可通过逆变换转变为时域信号进行分析。但傅里叶变换及其逆变换是一种信号的整…

基于阿里云平台 通过树莓派实现 1:1人脸识别

之前的学习中&#xff0c;曾经在香橙派上使用阿里云平台的服务实现过类型识别&#xff1a; 使用香橙派并基于Linux实现最终版智能垃圾桶项目 --- 下_香橙派 项目-CSDN博客 现在&#xff0c;尝试在树莓派上通过阿里云平台的服务实现人脸识别&#xff01; 通过VScode远程连接树莓…

EasyRecovery数据恢复软件2024最新版包括Windows和Mac

EasyRecovery数据恢复软件适用于多种环境和使用场景。首先&#xff0c;它适用于各种操作系统&#xff0c;包括Windows和Mac。无论用户使用的是哪种操作系统&#xff0c;都可以使用该软件进行数据恢复。 其次&#xff0c;EasyRecovery支持从各种存储设备和媒介中恢复数据&#…

iOS消息转发流程

当向Objc对象发送消息时&#xff0c;如果找到对象对应的方法&#xff0c;就会进入消息转发流程&#xff0c;给开发者提供一些最后的机会处理消息无法发送问题&#xff0c;以免出现程序崩溃。 1. 回调对象的resolveInstanceMethod方法&#xff0c;在这个方法中&#xff0c;允许开…

【图论】【并集查找】【C++算法】928. 尽量减少恶意软件的传播 II

作者推荐 动态规划的时间复杂度优化 涉及知识点 图论 并集查找 LeetCode928. 尽量减少恶意软件的传播 II 给定一个由 n 个节点组成的网络&#xff0c;用 n x n 个邻接矩阵 graph 表示。在节点网络中&#xff0c;只有当 graph[i][j] 1 时&#xff0c;节点 i 能够直接连接到…

JVM内存回收算法

1.1 引用计数法 每个对象创建的时候&#xff0c;会分配一个引用计数器&#xff0c;当这个对象被引用的时候计数器就加1&#xff0c;当不被引用或者引用失效的时候计数器就会减1。任何时候&#xff0c;对象的引用计数器值为0就说明这个对象不被使用了&#xff0c;就认为是“垃圾…

YOLO算法

YOLO介绍 YOLO&#xff0c;全称为You Only Look Once: Unified, Real-Time Object Detection&#xff0c;是一种实时目标检测算法。目标检测是计算机视觉领域的一个重要任务&#xff0c;它不仅需要识别图像中的物体类别&#xff0c;还需要确定它们的位置。与分类任务只关注对…

第七十一天 漏洞发现-Web框架中间件联动GobyAfrogXrayAwvsVulmap

第71天 漏洞发现-Web框架中间件&联动&Goby&Afrog&Xray&Awvs&Vulmap 知识点&#xff1a; 1、Bup简单介绍&使用说明 2、Xray简单介绍&使用说明 3、AWWS简单介绍&使用说明 4、Goby简单介绍&使用说明 5、Afrog简单介绍&使用说明 6、…

抽象类、模板方法模式

抽象类概述 在Java中abstract是抽象的意思&#xff0c;如果一个类中的某个方法的具体实现不能确定&#xff0c;就可以申明成abstract修饰的抽象方法&#xff08;不能写方法体了&#xff09;&#xff0c;这个类必须用abstract修饰&#xff0c;被称为抽象类。 抽象方法定义&…

驱动高级--mknod

一、起源 仅devfs&#xff0c;导致开发不方便以及一些功能难以支持&#xff1a; 热插拔 不支持一些针对所有设备的统一操作&#xff08;如电源管理&#xff09; 不能自动mknod 用户查看不了设备信息 设备信息硬编码&#xff0c;导致驱动代码通用性差&#xff0c;即没有分离…

vscode 引入外部依赖包

背景 我要在vscode中写一些antlr代码生成的cpp代码&#xff0c;但是在引入头文件#include "antlr4-runtime.h"的时候&#xff0c;出现报错&#xff0c;显示没有这个头文件&#xff0c;显然这是我们没有导入相关的包&#xff0c;因此我首先尝试了将antlr4的依赖源码在…

百度百科人物创建要求是什么?

百度百科作为我国最大的中文百科全书&#xff0c;其收录的人物词条要求严谨、客观、有权威性。那么&#xff0c;如何撰写一篇高质量的人物词条呢&#xff1f;本文伯乐网络传媒将从内容要求、注意事项以及创建流程与步骤三个方面进行详细介绍。 一、内容要求 1. 基本信息&#…