[教程]微天气 - 开发一个完整的微信小程序(上)

继续来聊聊微信小程序的开发,这次带大家一起开发一个功能完整的微信小程序,希望能对大家有一些参考价值。
微天气
这次咱们一起开发一个天气预报小程序,之所以选这个类型,有两个原因。 一是天气类的小程序整体复杂度比较低,适合我们说明问题。 另外,这种类型的应用也更加适合微信小程序生态的场景,我的理解这个生态不适宜开发过于复杂的应用。 所以选了则个类型。咱们首先来看看最终效果,有个感官的认识:


这个是在我的调试器上面的最终运行效果,根据你当前的位置显示当前以及未来一周的天气情况。 对于小程序的使用场景,个人觉得比较适合。
准备工作
先给大家看了运行效果,建立一个感官认识。那么接下来,我们就可以开始了。首先在微信开发者工具里建立一个项目:

接下来,项目创建窗口有一点说明下, 在 AppID 条目中, 如果你已经有了内测账号,就填写你的 AppID, 如果你还没有内测账号,点击旁边的无AppID就可以了(相信大多数同学是没有内测账号的,所以可以使用这个方法继续在本地调试)。

项目结构
整个项目的文件结构如下:

大家可以看到,有一个 index 目录里面是主页。 app.js 是程序主入口, utils.js 是咱们的工具脚本,用于读取天气数据。 还有一个 bg.jpg 的图片文件,是小程序的背景图。
这个项目的所有文件都在这里了,是不是挺简单的? 项目的完整代大家可以在咱们的 Github 主页上查看 https://github.com/swiftcafex/wechat-weather
基本结构介绍完了, 接下来咱们可以开始 Coding 了。 对于这个天气程序来说, 首先要处理的一个事情就是天气数据的获取了。 那咱们就一步一步的来做。
首先,我们需要获取当前的地理位置, 微信给我们提供了相应的接口, 我们在 util.js 中可以定义这样一个方法:
123456789101112131415161718

function getLocation(callback) { wx.getLocation({ success: function(res) { callback(true, res.latitude, res.longitude); }, fail: function() { callback(false); } })}

wx.getLocation 方法给我们返回一个我们当前位置的经纬度信息。 如果成功,我们将信息传回给 callback, 如果失败我们给 callback 传回 false。 注意,失败的情况在实际开发中是需要注意处理的。比如,如果一些用户没有开启定位权限,不处理失败的话,就有可能产生预期之外的情况了。
获取到当前位置之后,我们还要获取什么呢? 天气数据。 相关的 API 很多, 我们这个小程序用的是 darksky.net 提供的天气 API。 它提供了一个很简单的 API 接口:
12345678910111213141516171819

function getWeatherByLocation(latitude, longitude, callback) { var apiKey = "你自己的Key"; var apiURL = "https://api.darksky.net/forecast/" + apiKey + "/" + latitude + "," + longitude + "?lang=zh&units=ca"; wx.request({ url: apiURL, success: function(res){ var weatherData = parseWeatherData(res.data); getCityName(latitude, longitude, function(city){ weatherData.city = city; callback(weatherData); }); } });}

getWeatherByLocation 这个方法依然写在 util.js 里面,它的逻辑也很简单,拼接出 darksky 的 API 的 URL,然后调用 wx.request 请求网络数据。 因为我们不需要用到 API 返回的所有数据, 只需要获得当天的天气,以及未来 7 天的预报即可。 所以这里还使用 parseWeatherData 方法取得我们需要的数据并重组成新的结果。 这个方法的定义如下:
123456789

function parseWeatherData(data) { var weather = {}; weather["current"] = data.currently; weather["daily"] = data.daily; return weather;}

从上面的代码不难看出,我们只取得了原始结果集的 currently 和 daily 数据,然后重新返回。 为什么我们要这样取得部分数据呢,主要是因为这个接口的其他数据我们并不需要,所以就没必要再传给应用层了。 原始数据的格式给大家贴一下:


优化数据格式
大家可能注意到了,这个 API 给我们返回的数据中,有些数据的格式我们还需要继续处理一下。 比如 time 是用时间戳的形式给我们返回的,但我们需要将时间显示在 UI 上, 所以我们就需要进行一下格式转换。 另外 temperature 字段的格式也不是我们需要的。温度数据我们不需要显示到小数点之后,取整数就可以。
定义几个格式化数据的方法:
123456789101112131415161718192021222324252627

//将时间戳格式化为日期function formatDate(timestamp) { var date = new Date(timestamp * 1000); return date.getMonth()+1 + "月" + date.getDate() + "日 " + formatWeekday(timestamp);}//将时间戳格式化为时间function formatTime(timestamp) { var date = new Date(timestamp * 1000); return date.getHours() + ":" + date.getMinutes();}//中文形式的每周日期function formatWeekday(timestamp) { var date = new Date(timestamp * 1000); var weekday = ["周日", "周一", "周二", "周三", "周四", "周五", "周六"]; var index = date.getDay(); return weekday[index];}

这三个方法都是对日期进行格式化输出。具体功能代码里的注释已经说明了,不多赘述。 最后,我们把前面所有的方法整合起来,组成给应用层的接口:
1234567891011121314151617181920212223

//加载天气数据function requestWeatherData(cb) { getLocation(function(success, latitude, longitude){ //如果 GPS 信息获取不成功, 设置一个默认坐标 if(success == false) { latitude = 39.90403; longitude = 116.407526; } //请求天气数据 API getWeatherByLocation(latitude, longitude, function(weatherData){ cb(weatherData); }); });}

请求原始数据,这里调用了 getLocation 请求当前位置, 在回调里面判断返回结果是否获取位置成功,如果不成功,设置一个默认位置。 这个判断在实际的产品中还是比较有用的。 位置获取不成功的情况还是比较多的。比如用户没有开启定位权限。
紧接着,在里面又调用了 getWeatherByLocation 方法获取天气数据,然后将原始的天气数据返回。
原始数据读取成功后, 我们再封装一层,将原始数据进行加工:
123456789101112131415161718192021222324252627282930

function loadWeatherData(callback) { requestWeatherData(function(data){ //对原始数据做一些修整, 然后输出给前端 var weatherData = {}; weatherData = data; weatherData.current.formattedDate = formatDate(data.current.time); weatherData.current.formattedTime = formatTime(data.current.time); weatherData.current.temperature = parseInt(weatherData.current.temperature); var wantedDaily = []; for(var i = 1;i < weatherData.daily.data.length;i++) { var wantedDailyItem = weatherData.daily.data[i]; var time = weatherData.daily.data[i].time; wantedDailyItem["weekday"] = formatWeekday(time); wantedDailyItem["temperatureMin"] = parseInt(weatherData.daily.data[i]["temperatureMin"]) wantedDailyItem["temperatureMax"] = parseInt(weatherData.daily.data[i]["temperatureMax"]) wantedDaily.push(wantedDailyItem); } weatherData.daily.data = wantedDaily; callback(weatherData); });}

这是最终输出给应用层的方法,它里面用了咱们刚才定义的几个数据格式化方法将返回的原始天气数据加工了一下。 最终传递给回调方法。
最后我们将这个方法暴露给应用层:
12345

module.exports = { loadWeatherData: loadWeatherData}

这个语法和 nodejs 比较相似。 到此为止,咱们这个小程序的数据处理逻辑部分就开发完成了。 大家可以稍微消化一下, 下一篇会和大家一起处理应用层的逻辑。如果你想查看完整的代码, 也可以进入 Github 主页下载: https://github.com/swiftcafex/wechat-weather
Hello小程序将与您共同成长。微信号:130870319 QQ群:40726600

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342

推荐阅读更多精彩内容