动手开发一个名为“微天气”的微信小程序(下)
摘要: 上期我们介绍了“微天气”的API与界面代码编写,今天我们继续介绍逻辑层代码以及查询代码的编写。 本文选自《从零开始学微信小程序开发》。
编写逻辑层代码
由于在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);}
保存以上代码之后,在开发工具左侧模拟器中输入查询的城市名称,如输入“三亚”,单击“查询”按钮,界面中即可显示“三亚”的天气信息。
如果在下方输入框输入一个不存在的城市名称,将显示下面的提示信息。
本文选自《从零开始学微信小程序开发》,点此链接可在博文视点官网查看此书。
想及时获得更多精彩文章,可在微信中搜索“博文视点”或者扫描下方二维码并关注。
动手开发一个名为“微天气”的微信小程序(下)相关推荐
- 利用css transition属性实现一个带动画显隐的微信小程序部件
我们先来看效果图 像这样的一个带过渡效果的小部件在我们实际开发中的应用几率还是比较大的,但是在开发微信小程序的过程中可能有的小伙伴发现transition这个属性它不好使(下面说明)所以我们这个时候会 ...
- 数字信号 fft c源码_如何制作一个简单的人体动态识别微信小程序(附源码)
知乎小白第一次写专栏,还请多指教. 先放成果. GitHub源码: lrioxh/HAR-applet-of-Wechatgithub.com b站演示视频: 居然不需要服务器?!如何制作一个简单的 ...
- 微信小程序使用百度api获取天气信息 —— 微信小程序教程系列(16)
之前已经介绍过,如何使用百度地图api来获取地理位置信息 微信小程序的百度地图获取地理位置 -- 微信小程序教程系列(15) 下面介绍使用百度api来获取天气信息. 1> 第一步:先到百度开放平 ...
- 基于小程序云开发的智慧物业、智慧小区微信小程序,在线报修报检,重大事项投票,报名参加小区活动,小区公告通知,业委会公示、租售房屋
功能介绍 完整代码下载地址:基于小程序云开发的智慧物业.智慧小区微信小程序 当前小区的物业事务越来越多.越来越杂,而很多业主工作繁重,加班很晚,以往对于重大事项投票,报修报检,装修申请,搬家申请,投诉 ...
- 《移动软件开发》实验一:第一个微信小程序
2022年夏季<移动软件开发>实验一:第一个微信小程序 一.实验目标 1.学习使用快速启动模板创建小程序的方法:2.学习不使用模板手动创建小程序的方法. 二.实验步骤 1.自动生成小程序 ...
- 天气预报小程序源码,天气类微信小程序源码。API使用的是和风天气。
天气预报小程序源码,天气类微信小程序源码.API使用的是和风天气. 可以提供实时全国天气气象信息,及时发布天气预报.灾害预警.气象云图.旅游天气.台风.暴雨雪等气象信息, 为我国的生产生活提供全面精确 ...
- 耗时一个月上架了一款微信小程序,赚了2022年的第一笔副收入
今天不谈技术,只谈经历. 前戏 相信有很多的程序员都有一个产品梦,希望有一款属于自己产品.毕竟工作中遇到的有些"脑残"的产品经理不是一个两个,最后不得不因为"技术服务于业 ...
- 微信小程序开发笔记(二)第一个微信小程序
参考教材:<微信小程序开发入门与实践> 雷磊 前置知识:JavaScript,CSS 新建项目 安装好微信开发者工具后,我们就可以开始新建我们第一个微信小程序了. 选择新建项目,填入一个项 ...
- 毕业设计:使用UNIAPP云开发的图书馆座位预约借书微信小程序
基本内容和实施方案: 本程序主要是基于微信小程序的武汉设计工程学院图书馆系统的设计与实现,主要采用微信开发者工具和HBuilderX进行开发编程,总共分为学生端,教师端,管理端三个客户端,主要实现的模 ...
最新文章
- Windows中使用Python和C/C++联合开发应用程序起步
- python 日记 day4。
- js中的对象、原型链机制、构造函数
- 小米MIX4不会采用四曲面屏:结果未必是坏事
- sun.java2d.fontpath,java起用默认浏览器
- MyEclipse10.6 安装SVN插件方法及插件下载地址
- 小白如何开始学习计算机编程?
- android 生成长截图,【UNIAPP截长图】方案之一:滚动截屏 Android
- 构建区块链量化交易系统(一)
- 电脑系统相关问题收录(windows10)
- 如何在阿里云建立网站
- 【LabVIEW】基于LabVIEW的2048游戏设计
- 第一P2P收购中国典当联盟发力供应链金融模式
- 【SpringBoot 】 十三、使用Redis
- springboot+党员信息管理系统 毕业设计-附源码161528
- QQ邮箱账号异常登录
- iOS10全新方法实现推送+deviceToken无法获取或无效的解决
- Allegro器件添加 no prob区域操作指导
- latex 表格引用出错 出现?? You have referenced something which has not yet been labelled
- 循环赛日程安排问题(分治法)