微信小程序(同城小程序)_总结一(实现城市定位)

一、前言

  • 城市切换
  • 城市搜索

二、基本内容

1、豆瓣接口文档

  https://douban-api-docs.zce.me/

2、城市切换用到的接口

获取城市列表
https://douban.uieee.com/v2/loc/list
   

3、获取和处理城市

   3.1、index页面:

(1)一开始加载程序在index页面中调用全局的getUserInfo() 和getLocation()方法获取到用户当前的信息

// pages/location/index/index.js
var app = getApp()
Page({

  /**
   * 页面的初始数据
   */
  data: {
    userInfo:{},
    motto:‘豆瓣同城‘

  },

  /**
   * 生命周期函数--监听页面加载
   */
  onLoad: function (options) {
    var that = this;
    //获取用户信息
    app.getUserInfo(function(userInfo){
      console.log(userInfo)
      that.setData({
        userInfo:userInfo
      })
    })
    //获取位置
    app.getLocation();
  },

//点击页面将当前用户的位置信息传到另一个location页面
  bindmottotap:function(event){
    var loc = ""
    if(app.globalData.latitude && app.globalData.longitude){
      loc = "?latitude=" + app.globalData.latitude + "&&longitude=" + app.globalData.longitude
    }
    wx.redirectTo({
      url: ‘/pages/location/location‘+loc,
    })

  }
})

      3.2、location页面

(1)初始化的时候获取到index页面传来的参数

onLoad: function (options) {
    console.log(options)
    if (options.laitude && options.longitude){
      console.log("latitude:" + options.laitude+ ", longitude:"+options.longitude)
    }
    //获取用户当前的城市转化为小写
    if(typeof app.globalData.userInfo.city == ‘string‘){
      var cityUid = app.globalData.userInfo.city.toLowerCase()
      app.globalData.cityUid = cityUid
    }    this.getLocationListData()
}

(2)在onload中调用getLocationListData方法获取到若干个城市信息

  /*获取城市列表 */
  getLocationListData:function(){
    var that = this
    wx.showToast({
      title: ‘加载中‘,
      icon:‘loading‘,
      duration:10000
    });
    var cityListURL = app.globalData.doubanBase + app.globalData.loc_list_url  //https://douban.uieee.com/v2/loc/list
    wx.request({
      url: cityListURL,
      data:{
        "start": 0,
        "count": 500
      },
      method:‘GET‘,
      header:{
        ‘content-type‘:‘json‘
      },
      success:function(res){
        var citys = res.data.locs//
        that.handleLocationListData(citys) //处理获取到的城市信息
      },
      complete:function(){
        wx.hideToast()
      }
    })

  },

 获取到的城市信息如下:

(3)处理上面获取到的城市信息

 //处理城市信息
  handleLocationListData(citys){
    var locs={};   //设置空对象,存放一个一个城市信息
    for(let cityId in citys){
      var loc = citys[cityId] //遍历数组,将每个城市对象取出来
      locs[loc.uid]=loc  //以各自对象中的uid为属性,存下每个城市对象
                                 //比如:locs["beijing"]={"beijin":{parent: "china", habitable: "yes", id: "108288", name: "北京", uid: "beijing"}}
    }
    //默认加载当前城市的活动,用户登录的城市
    var cityUid = app.globalData.cityUid
    var currentLoc = null;
    if(!locs[cityUid]){//如果用户登录的城市没有在获取到的城市列表中
      currentLoc = locs[this.data.defaultUid]//显示一个默认的城市
    }else{
      currentLoc = locs[cityUid]
    }

    app.globalData.locId= currentLoc.categoryId
    app.globalData.city = currentLoc.name
    app.globalData.locs = locs//得到所有城市,存在全局变量中
    this.setData({
      "city":app.globalData.city,
      "currentLoc":currentLoc//设置当前城市,组合之后有三个属性
    })
    console.log(currentLoc.id)
    this.getActicityByLocationId(currentLoc.id)
  }

城市信息处理完成之后得到:

locs                        

currentLoc


cityUid: 

categoryId:

name:

app.globalData.locId= currentLoc.categoryId

app.globalData.city = currentLoc.name

app.globalData.locs = locs//得到所有城市

   
   
   

(4)点击城市切换的时候,将当前城市的id ,name, uid传过去

 //跳转到城市选择页面
  bindLocation:function(event){
    var parameter = "?id=" + this.data.currentLoc.id + "&&name=" + this.data.currentLoc.name + "&&uid=" + this.data.currentLoc.uid;
    console.log(this.data.currentLoc)
    wx.navigateTo({

      url: ‘/pages/location/select-city/select-city‘ + parameter
    });
  },

      3.3、城市切换页面

     

(1)gps定位城市,页面一加载的时候获取到当前用户的城市信息

 onLoad: function (options) {
    console.log(options)
    var id = options.id;
    var uid = options.uid;
    var name = options.name;
    var gpsCity = {
      "id": id,
      "uid": uid,
      "name": name
    }
    var city = app.globalData.city  //是location中currentLoc.name
    var locs = app.globalData.locs  //全部的城市信息
    console.log(locs)
    console.log(city)
    this.setData({
      locs: locs,  //得到全部的城市信息
      gpsCity:gpsCity //组装gps定位城市属性
    })

    this.processCityListData(locs)
  },

(2)根据之前获取到的一大堆城市信息表中,将这些城市信息分类处理

处理一:自定义热门城市数组, 根据数组用map函数从所有的loc中筛选出热门城市对象

处理二:遍历所有城市,将首字母获取出来,并排序

处理三:根据首字母,将所有的城市分组

//处理城市的函数
  processCityListData:function(locs){
    if(locs && typeof locs =="object"){
      var hotCity = this.data.hotCityUid.map(function(item, index, input){
        console.log(item, index, input)//beijing 0 ,shanghai 1 ,guangzhou 2
        return locs[item] //筛选出热门城市,locs:  { parent: "china", habitable: "yes", id: "108288", name: "北京", uid: "beijing" }
      })
      //按字母排序
      var keys = Object.keys(locs)// 方法会返回一个由一个给定对象的自身可枚举属性组成的数组,数组中属性名的排列顺序和使用 for...in 循环遍历该对象时返回的顺序一致 。
      keys.sort()
      console.log(locs) // anshan: { parent: "liaoning", habitable: "yes", id: "118125", name: "鞍山", uid: "anshan" }
      console.log(keys)//anshan
      var cityList = {}
      var letterList = []
      for(let idx in keys){ //遍历排序好的城市
        var key = keys[idx]
        console.log(key)//jinhua
        var letter = key.substring(0,1)//首字母

        var city = locs[key] //获取到的城市对象
        console.log(city)
        if(!cityList[letter]){
          cityList[letter]=[]
          letterList.push(letter)//将首字母放进一个单独的数组中

        }
        console.log(letterList)//1", "a", "b", "c", "d", "f", "g", "h", "j", "k", "l", "m", "n", "q", "s", "t", "w", "x", "y", "z"
        cityList[letter].push(city)//按照首字母将城市分组

      }

      console.log("cityList: " + cityList)
      this.setData({
        "hotCity":hotCity,//对象数组 "id": id,"uid": uid, "name": name
        "letterList":letterList,//存首字母的对象的数组[1", "a", "b", "c", "d", "f", "g", "h", "j", "k", "l", "m", "n"] 

        "cityList":cityList//对象,每一个对象里面存着一个个条件相同的数组数组  }) } },

       3.4、处理点击

(1)选择城市进行切换,

html代码:

 <text class=‘hot-city-title‘>热门城市</text>
  <view class=‘hot-city‘>
    <view class=‘hot-city-content‘>
    <block wx:for="{{hotCity}}" wx:key="key" wx:for-item="city">
     <!--点击的时候将自定义属性传进去-->
 <text class=‘gps-loc city-box‘ data-id=‘{{city.id}}‘ data-name=‘{{city.name}}‘ data-uid=‘{{city.uid}}‘ bindtap=‘handleSelected‘>{{city.name}}</text>
    </block>
    </view>
  </view>

handleSelected函数:

 //城市选择
  handleSelected:function(event){
   console.log(event.target.dataset)//自定义参数带过来,然后更改请求的地址
    var id = event.target.dataset.id;
    var name = event.target.dataset.name
    var uid = event.target.dataset.uid
    var currentLoc = {
      "id": id, "name": name, "uid": uid
    };
    wx.navigateTo({
      url:"/pages/location/location",
      success:function(){
        app.globalData.reflesh = true;
        app.globalData.locId = id;//当前城市的id
        app.globalData.city = name; //城市名称
        app.globalData.cityUid = uid;//城市uid
        app.globalData.currentLoc = currentLoc;//当前城市对象,包含id uid name
      }
    })
    console.log(app.globalData.currentLoc)

  }

(2)城市查询

  <view class="page-session page-session-spacing">
    <view class="search-session">
      <icon type="search" size="16"></icon>
      <block wx:if="{{!searching}}" wx:key="key">
        <text class="search-holder" bindtap="bindSearch">输入城市名称查询</text>
      </block>
      <block wx:elif="{{searching}}">
        <input class="search-input" placeholder-class="search-placeholder" value="" placeholder="输入城市名称查询" focus="true"  bindconfirm=‘handleConfirm‘  bindblur=‘handleBlur‘ bindinput=‘handleInput‘/>
        <text class="cancel" bindtap="handleCancel">取消</text>
      </block>
    </view>
  </view>
  <block wx:if="{{searching}}">
    <view class="select-city-body {{searching ? ‘select-city-body-cover‘:‘select-city-body-hidden‘}}" catchtap="handleCancel">  </view>   

      <view class=‘city-list-wrapper‘>
        <view class=‘city-list‘>
          <block wx:for="{{searchLetterList}}" wx:for-item="letter">
            <text class=‘list-title‘>{{letter}}</text>
            <view class=‘list-content‘>
            <block wx:for="{{searchCityList[letter]}}" wx:for-item="city">
                <text class="city-block" data-id="{{city.id}}" data-name="{{city.name}}" data-uid="{{city.uid}}" bindtap="bindCityTap">{{city.name}}</text>
            </block>
            </view>

          </block>
        </view>
      </view>

    <block wx:if="{{showSearchNone}}">
    <view class=‘search-none‘>这里是空的</view>
    </block>
  </block>

对输入框注册监听事件

  //处理输入
  handleInput: function(event){
    console.log(event)
   var value = event.detail.value
    console.log(value) //获取输入的内容

    var searchLocs = {}  //定义收索的城市对象
    var searchCityList = {}//定义收索的城市列表
    var searchLetterList=[]//将搜索到的城市分组
    var readyData={
      "searchLocs": searchLocs,
      "searchCityList": searchCityList,
      "searchLetterList": searchLetterList,
      "showSearchNone":false  //控制显示隐藏
    }
    if(value==""){
      this.setData(readyData)//输入为空,给data添加一个readyData属性
      return;
    }
    console.log(this.data.locs)//所有的没有处理的城市信息
    var locKeys = Object.keys(this.data.locs)
    console.log(locKeys)//["118181", "beijing", "shanghai", "guangzhou", "shenzhen"]
    for(let idx in locKeys){
      var key = locKeys[idx]
      if(key.indexOf(value)!=-1){//如数字母,如果匹配到了,就将找到的城市加入到搜到的城市中
        searchLocs[key] = this.data.locs[key]
      }else if(this.data.locs[key].name.indexOf(value)!=-1){//如果输入汉字的时候找到了,就将当前城市对象也加入里面
        (searchLocs[key] = this.data.locs[key])
      }
    }

  var keys = Object.keys(searchLocs) //得到属性
  var keyLength = keys.length
  if(keyLength==0){ //如果长度为0,说明没有相同的
    readyData["showSearchNone"]=true
    this.setData(readyData)
    return;
  }

  keys.sort();
  for(let idx in keys){
    var key = keys[idx]
    var letter = key.substring(0,1)
    var city = searchLocs[key]
    if(!searchCityList[letter]){
      searchCityList[letter]=[]
      searchLetterList.push(letter)
    }
    searchCityList[letter].push(city)
  }
   readyData["searchLocs"] = searchLocs
   readyData["searchCityList"] = searchCityList
    readyData["searchLetterList"] = searchLetterList
   this.setData(readyData)
  console.log(readyData)
  },

三、总结

原文地址:https://www.cnblogs.com/xxm980617/p/10952885.html

时间: 2024-10-12 15:48:55

微信小程序(同城小程序)_总结一(实现城市定位)的相关文章

微信“小程序”开发小指南

最近两天程序员界最火的应该就是微信“小程序”,抽空试了一下,感觉上手很容易,微信提供的各种组件.API都很全,但是要做的与众不同又性能优良也是不太容易的.本文将首先谈一下我们的小程序运行的架构,然后简单告诉大家几个入门教程的地址. 一.架构 用户户会频繁和微信交互,微信也会频繁与OS交互,当然微信也通过API的方式来获取第三方的数据,并且通过服务组件.开发工具和交互框架来定义小程序的交互样式.展现方式和扩展功能. 二.怎样玩一玩 首先是安装破解版的开发工具,下面的地址写的很详细,地址 接着是教程

死磕微信!支付宝版“小程序”曝光

微信已经确认:"小程序"将于1月9日正式上线.张小龙还强调,小程序的入口不在微信,而是在二维码里面. 而近日,网上曝出支付宝也要做"小程序"了,而且疑似泄露开发文档. 有网友透露,阿里自身有Weex作为基础,稍作修改就可以直接套用到现在的"小程序"上,体验以及完成度上应该会比微信小程序高很多,同时支付宝可以更好地利用自身积累的第三方支付场景使用频繁的服务. 据网友提供的截图显示,支付宝内部测试界面所采用的名称为"支付宝小程序"

微信小程序:小程序,新场景

前言: 我们频繁进入的地方,是场景.手机,是场景:浏览器,是场景:其实,微信,也是场景-- 微信要做的是占据更多用户时间.占据更多应用场景.占据更多服务入口,这是商业本质想去垄断要做的事情.对于大家来讲,这意味着小程序的机会到底在哪儿,以及微信为什么要做小程序这件事. 微信作为一种场景 微信做一个场景,什么意思呢?我们先看一个好玩的数据.不知道大家有没有感觉,我自己感觉过去半年,除了每个礼拜五看App Store的app之外,自己已经不装任何app.2016年上半天,60%的人是没有下载过任何一

微信公众号和小程序打通版商城解决方案

微信公众号和小程序打通版商城解决方案 一键安装小程序公众号商城,零基础开发CRMEB微信公众号小程序主要是以用户管理为中心,加电商系统,利用微信和小程序的优势,拼团.砍价.秒杀.积分.优惠券等吸引粉丝-转化粉丝-粘住粉丝-分析粉丝-维护粉丝-再次利用粉丝吸引粉丝形成闭环滚雪球模式 源码下载地址::http://github.crmeb.net/u/crmeb基于thinkphp5框架开发的一套用户管理+电商系统,主要是基于微信公众号和微信小程序的一套电商系统,后台采用form-builder组件

【程序员小助手】Synergy,感受穿越屏幕之美

 内容简介 1.Synergy简介 2.Synergy安装与配置 3.附录 [程序员小助手]系列 在这个系列文章中(不定期更新),小编会把这些年(也没几年)的编程学习和工作中使用到的个人感觉非常好的软件推荐给大家,希望能够共享美好资源,使大家提高编程和办事效率. Synergy,感受穿越屏幕之美 什么?你面前有多个电脑屏幕,而你每个屏幕(或每台电脑)单独配一个鼠标和一个键盘? 什么?你在多个屏幕之间复制黏贴东西的时候还需要借助samba这样的共享软件? 什么?你只有一台电脑,只有一个屏幕?好吧

【程序员小助手】Emacs,最强编辑器,没有之一

内容简介 1.Emacs简介 2.Emacs三个平台的安装与配置 3.自动补全插件 4.小编的Emacs配置文件 5.常用快捷方式 6.和版本控制系统的配合(以SVN为例) [程序员小助手]系列 在这个系列文章中(不定期更新),小编会把这些年(也没几年)的编程学习和工作中使用到的个人感觉非常好的软件推荐给大家,希望能够共享美好资源,使大家提高编程和办事效率. Emacs,最强编辑器,没有之一 小编知道,此标题一出,肯定会遭受广大群众“诟病”,说不好还会被其他编辑器的粉丝暗地里“干掉”. 比如,V

小程序再次大升级:一号旺铺让你能用小程序打开小程序

腾讯科技讯6 月 21 日晚间,小程序再次迎来三大功能升级,包括小程序打开小程序.门店小程序的门店页支持添加视频.门店小程序支持接口管理,丰富了使用场景和扩展性. 以下为主要功能升级: 1.一号旺铺小程序打开小程序 同一个公众号下关联的 10 个同主体小程序和 3 个非同主体小程序之间,可以调用接口直接相互跳转.微信客户端6.5. 9 及以上版本支持. 2.门店小程序的门店页支持添加视频 为了方便宣传门店形象,门店小程序的门店页支持可添加视频.添加视频方式有两种: 上传视频至公众号素材库添加.

Android-小小设置永久解决程序因为未捕获异常而异常终止的问题

(一) 前言各位亲爱的午饭童鞋,是不是经常因为自己的程序中出现未层捕获的异常导致程序异常终止而痛苦不已?嗯,是的.. 但是,大家不要怕,今天给大家分享一个东东可以解决大家这种困扰,吼吼! (二) UncaughtExceptionHandler接口这个接口,顾名思义,就是处理程序中没有处理的异常,而且是在系统抛出异常导致程序异常终止之前哦!那么,在Android里面怎么使用呢? (三) 怎么使用UncaughtExceptionHandler1. 首先,咱们得创建一个UncaughtExcept

极限工坊——无极限创意小程序|淘小咖

创意? 无极限? 这样的小程序有什么好处? 这年头做小程序的公司80%的都是套用成型的模板,从来都没有一点点新意,而极限工坊小程序却不一样.极限工坊小程序拥有海量的DIY组件.自定义功能,可自由发挥创意,没有任何限制的制作小程序. 其实对于普遍的微信用户来说的话,具有创意性的.设计界面极佳的小程序更容易得宠,还有就是功能性以及方便性这两方面.拥有这样的小程序,要比同行业的小程序更容易让大家接受,尤其是带有引导性的,体验感极佳的小程序.所以说创意就是重中之重了,对于后期的引流.推广的G点等都有好处

多端小程序、小游戏兼容

当下存在的小程序/小游戏 已经开放的 内测中或将要开放的 多平台兼容的问题 没有统一标准 开发工具黑盒.不统一 API平台互相不兼容,同一平台前后版本也不兼容 业务差异 平台规范不同 兼容问题总结 现有工具 小程序开发 小游戏开发 微信小程序转其它小程序 工具小结 理论上的兼容方式 API兼容库 开发转换工具 多平台入口 本方案总结 相对实际的方案 统一技术栈 多平台开发方式 老项目迁移 总结 目前,小程序/小游戏成为潮流,BAT等大公司纷纷推出了小程序/小游戏,我们的兼容问题,也就提上了日程