动手开发一个名为“微天气”的微信小程序(下)

编写逻辑层代码

  由于在index.js中还没有设置初始化数据,所以在界面中看不到具体的数据,从而也导致界面的效果没达到设置的要求。
  接下来就编写逻辑层代码index.js,为了检查界面设计效果,首先编写初始数据,然后再逐步深入地编写其他相关业务逻辑代码。

1 编写数据初始化代码

  在index.wxml中编写了很多数据,因此需要在index.js中先把这些数据进行初始化,然后在开发工具的模拟器中就可预览结果。
  打开index.js文件,删除原来的内容,重新编写以下代码:

Page({
  data: {
    weather:{
      wendu:18,
      ganmao:'昼夜温差较大,较易发生感冒,请适当增减衣服。体质较弱的朋友请注意防护。',
      yesterday:{
        date:'17日星期四',
        type:'阴',
        fx:'南风',
        fl:'微风级',
        low:'低温 8℃',
        high:'高温 16℃'
      },
      forecast:[
        {
          date:'18日星期五',
          type:'阴',
          high:'高温 16℃',
          low:'低温 8℃',
          fengxiang:'南风',
          fengli:'微风级'
        },{
          date:'18日星期五',
          type:'阴',
          high:'高温 16℃',
          low:'低温 8℃',
          fengxiang:'南风',
          fengli:'微风级'
        },{
          date:'18日星期五',
          type:'阴',
          high:'高温 16℃',
          low:'低温 8℃',
          fengxiang:'南风',
          fengli:'微风级'
        },{
          date:'18日星期五',
          type:'阴',
          high:'高温 16℃',
          low:'低温 8℃',
          fengxiang:'南风',
          fengli:'微风级'
        },{
          date:'18日星期五',
          type:'阴',
          high:'高温 16℃',
          low:'低温 8℃',
          fengxiang:'南风',
          fengli:'微风级'
        }
      ]
    },
    today:'2016-11-18',
    city:'北京',    //城市名称
    inputCity:'', //输入查询的城市名称
  }
})

  编写好以上初始化数据之后,保存index.js,在开发工具左侧预览区域可看到如下的界面效果。
                 
  以上代码很长,主要是由于模拟了5天的天气数据,实际上,在小程序运行时,应该在打开小程序之后就马上通过API获取天气数据,因此上面的初始化数据代码中,只需要用以下语句将weather初始化为一个空对象即可,而上面添加在weather中的属性数据都可以删除。

weather:{}

2 获取当前位置的城市名称

  根据本案例的要求,当用户打开本案例之后,首先要获取用户当前所在城市的天气信息,这就需要获取用户当前所在城市的名称。要完成这个功能,需要经过几个转折。
  首先,可以使用微信小程序的获取当前地理位置经纬度的API(就是wx. getLocation),通过该API即可获取用户所在位置的经纬度。
  有了用户所在的经纬度,还需要查询该经纬度对应的城市名称。这可以使用百度地图的接口来实现,百度地图Geocoding API服务地址如下:
  http://api.map.baidu.com/geocoder/v2/
  调用该接口需要传递以下几个参数。

  • output:设置接口返回的数据格式为json或者xml。
  • ak:这是必须设置的一个参数,是用户在百度申请注册的key,自v2开始参数修改为“ak”,之前版本参数为“key”。
  • sn:若用户所用ak的校验方式为sn校验时该参数必须启用。
  • callback:一个回调函数,将json格式的返回值通过callback函数返回以实现jsonp功能。

例如,在浏览器中输入以下地址:
  http://api.map.baidu.com/geocoder/v2/ak=ASAT5N3tnHIa4APW0SNPeXN5&location=30.572269,104.066541&output=json&pois=0
  返回的JSON格式如下所示:

{
  "status": 0,
  "result": {
    "location": {
      "lng": 104.06654099999996,
      "lat": 30.572268897395259
    },
    "formatted_address": "四川省成都市武侯区G4201(成都绕城高速)",
    "business": "",
    "addressComponent": {
      "country": "中国",
      "country_code": 0,
      "province": "四川省",
      "city": "成都市",
      "district": "武侯区",
      "adcode": "510107",
      "street": "G4201(成都绕城高速)",
      "street_number": "",
      "direction": "",
      "distance": ""
    },
    "pois": [],
    "poiRegions": [],
    "sematic_description": "环球中心w6区西南108米",
    "cityCode": 75
  }
}

  在以上JSON数据中,通过result.addressComponent.city可获取传入经纬度对应的城市名称。因此,在本案例中可通过这种方式获取用户当前所在城市的名称。
  根据以上分析,在index.js的onLoad事件处理函数中编写如下所示代码:

var util = require('../../utils/util.js');
Page({
  data: {
        ……
  },
onLoad: function (options) {
    this.setData({
      today:util.formatTime(new Date()).split(' ')[0]  //更新当前日期
    });
    var self = this;
    wx.getLocation({
      type: 'wgs84',
      success: function (res) {
        wx.request({
          url:'http://api.map.baidu.com/geocoder/v2/' +
             '?ak=ASAT5N3tnHIa4APW0SNPeXN5&location='+
              res.latitude+',' + res.longitude + '&output=json&pois=0',
          data: {},
          header: {
            'Content-Type': 'application/json'
          },
          success: function (res) {
  var city = res.data.result.addressComponent.city.replace('市','');//城市名称
            self.searchWeather(city);  //查询指定城市的天气信息
          }
        })
      }
    })
  },
})

  以上代码中,第1行使用require导入工具方法,用来格式化日期。

3 根据城市名称获取天气预报

  获取了城市名称,接下来就可使用以下接口获取指定城市名称的天气预报信息:
  http://wthrcdn.etouch.cn/weather_mini?city=城市名称
  在上面的接口中,城市名称中不包含“市”这个字,如“成都市”只需要传入“成都”。
  在本节前面介绍该接口时,只查看了接口执行成功后返回的JSON数据,如果传入的城市名称有误,则返回如下所示JSON数据:

{
  "desc": "invilad-citykey",
  "status": 1002
}

  在程序中可通过status判断数据查询是否成功。
  由于根据城市名称查询天气预报信息的代码需要重复调用,因此,单独编写成一个函数,方便在查询时调用。

//根据城市名称查询天气预报信息
  searchWeather:function(cityName){
    var self = this;
    wx.request({
      //天气预报查询接口
      url: 'http://wthrcdn.etouch.cn/weather_mini?city='+cityName,
      data: {},
      header: {
        'Content-Type': 'application/json'
      },
      success: function (res) {
        if(res.data.status == 1002) //无此城市
        {
            //显示错误信息
            wx.showModal({
              title: '提示',
              content: '输入的城市名称有误,请重新输入!',
              showCancel:false,
              success: function(res) {
                self.setData({inputCity:''});
              }
            })
        }else{
          var weather = res.data.data;  //获取天气数据

          for(var i=0;i<weather.forecast.length;i++)
          {
            var d = weather.forecast[i].date;
            //处理日期信息,添加空格
            weather.forecast[i].date = ' ' + d.replace('星期',' 星期');
          }
          self.setData({
            city:cityName,      //更新显示城市名称
            weather:weather,    //更新天气信息
            inputCity:''        //清空查询输入框
          })
        }
      }
    })
  }

  在上面代码中,获取的date中保存的是“19日星期六”这种格式的字符串,为了使日期和星期分别显示在两行中,这里使用了一种小技巧,就是在日期字符串中添加了2个全角状态的空格,这样在显示这个字符串时自动断行。
  编写好以上这些代码之后,保存,在开发工具左侧可看到已经获取当前的天气数据,而不是前面初始化的数据了。
                 
  这样,本案例的主要代码就算编写完成了。不过,还只能显示用户当前所在地的天气信息,如果要查看其他城市的天气,还需要继续编写相应的查询代码。

查询天气预报

  查询代码的编写很简单,只需要获取用户输入的城市名称,然后传入searchWeather函数即可。具体的代码如下:

//输入事件
  inputing:function(e){
    this.setData({inputCity:e.detail.value});
  },
  //搜索按钮
  bindSearch:function(){
    this.searchWeather(this.data.inputCity);
  }

  保存以上代码之后,在开发工具左侧模拟器中输入查询的城市名称,如输入“三亚”,单击“查询”按钮,界面中即可显示“三亚”的天气信息。
                 
  如果在下方输入框输入一个不存在的城市名称,将显示下面的提示信息。
                 

  本文选自《从零开始学微信小程序开发》,点此链接可在博文视点官网查看此书。
                     
  想及时获得更多精彩文章,可在微信中搜索“博文视点”或者扫描下方二维码并关注。
                       

时间: 2024-10-18 14:31:22

动手开发一个名为“微天气”的微信小程序(下)的相关文章

动手开发一个名为“微天气”的微信小程序(上)

引言:在智能手机软件的装机量中,天气预报类的APP排在比较靠前的位置.说明用户对天气的关注度很高.因为人们无论是工作还是度假旅游等各种活动都需要根据自然天气来安排.跟着本文开发一个"微天气"小程序,方便微信网友随时查看天气. 接下来两天小编将同您一起开发一个"微天气"小程序,本文首先向大家介绍"微天气"的API与界面代码编写.本文选自<从零开始学微信小程序开发>. 在一套软件系统中,微信小程序通常是作为前端来使用的,一般还需要有后端的

微信小程序应用号开发教程!博卡君通宵吐血赶稿

微信应用号(微信公众平台小程序,「应用号」的新称呼)终于来了!开源中国社区的博卡君通宵吐血赶稿写出的微信公众平台应用号开发教程!大家赶紧来学习一下吧 对了,昨天晚间微信小程序开发文档官方版发布了 微信公众平台小程序目前还处于内测阶段,微信只邀请了部分企业参与封测.想必大家都关心应用号的最终形态到底是什么样子?怎样将一个「服务号」改造成为「小程序」? 我们暂时以一款简单的第三方工具的实例,来演示一下开发过程吧.(公司的项目保密还不能分享代码和截图.博卡君是边加班边偷偷给大家写教程.感谢「名片盒」团

移动开发之微信小程序——资料集合

本文转载自:知乎 有需要下载的客官可可以点击知乎去下载相关资料 一:官方地址集合:1:官方工具:https://mp.weixin.qq.com/debug/wxadoc/dev/devtools/download.html?t=14764346784612:简易教程:https://mp.weixin.qq.com/debug/wxadoc/dev/?t=14764346775993:设计指南:https://mp.weixin.qq.com/debug/wxadoc/design/index

撸了一个微信小程序项目

学会一项开发技能最快的步骤就是:准备,开火,瞄准.最慢的就是:准备,瞄准,瞄准,瞄准-- 因为微信小程序比较简单,直接开撸就行,千万别瞄准. 于是乎,趁着今天上午空气质量不错,撸了一个小程序,放在了男性交友网站上了, 我添加了很全的注释,大家赏个star. 地址:https://github.com/yll2wcf/wechat-weapp-lifeTools 功能介绍 功能比较简单,调用了百度ApiStore的接口即时查询空气质量. 我计划多加一些功能,争取把微信小程序提供的功能全用一遍. 也

微信小程序开发资源整理

有兴趣学习微信小程序开发的可以关注简书专题 微信小程序开发 由于微信已经开发文档和开发工具了,所以下面的内容用处不大了. 具体参考:http://mp.weixin.qq.com/wiki/ 这篇文章只是资源的搬运工, 感谢各位大神的无私奉献. 由于微信小程序只邀请了200个大V内测,但是这些大V好多都是不写代码的CTO了,让真正想学习些代码的灰常着急. 俗话说高手在民间,没过多久就有大神把文档和0.7的破解版发出来了.但是下午,微信就发布了0.9版本,封杀了之前破解的.经过大神们的不懈努力,0

微信小程序购物商城系统开发系列-工具篇的介绍_javascript技巧

微信小程序开放公测以来,一夜之间在各种技术社区中就火起来啦.对于它 估计大家都不陌生了,对于它未来的价值就不再赘述,简单一句话:可以把小程序简单理解为一个新的操作系统.新的生态,未来大部分应用场景都将给予微信小程序进行研发.基于对它的敬畏以及便于大家快速上手,特整理微信小程序商城开发系列,未来将持续增加微信小程序技术文章,让大家可全面了解如何快速开发微信小程序商城. 本篇文章主要介绍微信小程序官方提供的开发工具,俗话说:欲工善其身,必先利其器. 小程序开发文档地址https://mp.weixi

微信小程序开发教程第七章:微信小程序编辑名片页面开发

前面我们更新了六篇的微信小程序开发教程,现在更新第七章:微信小程序编辑名片页面开发,(第一二章:微信小程序开发教程,第三四章:微信小程序项目结构以及配置&微信小程序首页面开发,第五章:微信小程序名片夹详情页开发,第六章:「我」的页面开发) 编辑名片有两条路径,分为新增名片流程与修改名片流程. 用户手填新增名片流程: 首先跳转到我们的新增名片页面 1 需要传递用户的当前 userId,wx.navigateTo 带值跳转.Manual 为 true 设置用户走的是新增路线. 新增名片页面 1 基本

微信小程序会是腾讯下一个掘金源吗

微信小程序可以理解为云OS的概念,微信生态本身就是一个OS.加上微信公众平台和微信开发平台本身已经是非常成熟的架构,能够完美媲美App的功能,同时在交互体验方面也能够做到极致,大有取代App之势.苹果App Store模式的意义在于为第三方软件的提供者提供了方便而又高效的一个软件销售平台.用户购买应用所支付的费用由苹果与应用开发商3:7分成.如果微信小程序商城也采用类似的分佣模式,那8亿多的用户将是一个非常大的无形资产,成为腾讯继游戏.会员.广告后的另一个掘金源. 微信小程序允许人们无需进行下载

微信小程序开发教程第五章:微信小程序名片夹详情页开发

前面我们发布了博卡君的微信小程序开发教程前四章,现在接着更新第五章:微信小程序名片夹详情页开发.(第一二章:微信小程序开发教程,第三四章:微信小程序项目结构以及配置&微信小程序首页面开发)   今天加了新干货!除了开发日志本身,还回答了一些朋友的问题. 闲话不多说,先看下「名片盒」详情页的效果图:   备注下大致需求:顶部背后是轮播图,二维码按钮弹出模态框信息.点击微信栏.点击存入手机,地址栏需要地图展示,名片分享也是模态框指引. 首先是轮播图,autoplay 自动播放,interval 轮播