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

简介: 上期我们介绍了“微天气”的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:'', //输入查询的城市名称
  }
})
AI 代码解读

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

weather:{}
AI 代码解读

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
  }
}
AI 代码解读

  在以上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);  //查询指定城市的天气信息
          }
        })
      }
    })
  },
})
AI 代码解读

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

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

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

{
  "desc": "invilad-citykey",
  "status": 1002
}
AI 代码解读

  在程序中可通过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:''        //清空查询输入框
          })
        }
      }
    })
  }
AI 代码解读

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

查询天气预报

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

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

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

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

目录
打赏
0
0
0
0
97
分享
相关文章
陪练,代练,护航,代打小程序源码/前端UNIAPP-VUE2.0开发 后端Thinkphp6管理/具备家政服务的综合型平台
这款APP通过技术创新,将代练、家政、娱乐社交等场景融合,打造“全能型生活服务生态圈”。以代练为切入点,提供模块化代码支持快速搭建平台,结合智能匹配与技能审核机制,拓展家政服务和商业管理功能。技术架构具备高安全性和扩展性,支持多业务复用,如押金冻结、录屏监控等功能跨领域应用。商业模式多元,包括交易抽成、增值服务及广告联名,同时设计跨领域积分体系提升用户粘性,实现生态共生与B端赋能。
82 11
weixin163基于微信小程序的校园二手交易平台系统设计与开发ssm(文档+源码)_kaic
本文介绍了一款基于微信小程序的校园二手物品交易平台的开发与实现。该平台采用Java语言开发服务端,使用MySQL数据库进行数据存储,前端以微信小程序为载体,支持管理员和学生两种角色操作。管理员可管理用户、商品分类及信息、交易记录等,而学生则能注册登录、发布购买商品、参与交流论坛等。系统设计注重交互性和安全性,通过SSM框架优化开发流程,确保高效稳定运行,满足用户便捷交易的需求,推动校园资源共享与循环利用。
工会成立100周年纪念,开发职工健身AI运动小程序、APP方案推荐
为庆祝中华全国总工会成立100周年,特推出基于AI技术的智能健身系统,以小程序和APP形式呈现,助力职工健康生活。方案包括:1) 小程序插件,支持多种运动识别,开箱即用;2) APP插件,提供更高精度的运动检测;3) 成熟的「AI乐运动」系统,支持赛事活动管理。这些方案满足不同需求,推动全民健身体验升级,彰显工会对职工健康的关怀。
【一步步开发AI运动小程序】二十一、如何将AI运动项目配置持久化到后端?
本文介绍基于云智「Ai运动识别引擎」的运动配置持久化方案,旨在优化小程序或Uni APP中AI运动识别能力。通过将运动检测参数(如`Key`、`Name`、`TickMode`、`rules`或`samples`)持久化到后端,可避免因频繁调整运动参数而重新发布应用,提升用户体验。持久化数据结构支持规则和姿态样本存储,适用于关系数据库、文件或文档数据库(如MongoDB)。此外,云智还提供运动自动适配工具及「AI乐运动」产品,助力快速实现AI体育、全民健身等场景。
weixin168“返家乡”高校暑期社会实践微信小程序设计与开发ssm(文档+源码)_kaic
本文探讨高校暑期社会实践微信小程序的开发与应用,旨在通过信息化手段提升活动管理效率。借助微信小程序技术、SSM框架及MySQL数据库,实现信息共享、流程规范和操作便捷。系统涵盖需求分析、可行性研究、设计实现等环节,确保技术可行、操作简便且经济合理。最终,该小程序可优化活动发布、学生信息管理和心得交流等功能,降低管理成本并提高工作效率。
技术小白如何利用DeepSeek半小时开发微信小程序?
通过通义灵码的“AI程序员”功能,即使没有编程基础也能轻松创建小程序或网页。借助DeepSeek V3和R1满血版模型,用户只需用自然语言描述需求,就能自动生成代码并优化程序。例如,一个文科生仅通过描述需求就成功开发了一款记录日常活动的微信小程序。此外,通义灵码还提供智能问答模式,帮助用户解决开发中的各种问题,极大简化了开发流程,让普通人的开发体验更加顺畅。
920 11
技术小白如何利用DeepSeek半小时开发微信小程序?
【一步步开发AI运动小程序】十八、如何识别用户上传图片中的人体、运动、动作、姿态?
【云智AI运动识别小程序插件】为小程序提供人体、运动及姿态检测的AI能力,本地引擎支持10余种运动,无需后台服务,具备快速、低成本等优势。本文介绍如何通过Canvas方案读取用户上传图片的像素数据,实现人体检测与姿态分析功能,代码简单高效,适合快速集成。更多内容欢迎交流!
【一步步开发AI运动小程序】十九、运动识别中如何解析RGBA帧图片?
本文介绍了如何将相机抽取的RGBA帧图像解析为`.jpg`或`.png`格式,适用于体测、赛事等场景。首先讲解了RGBA图像结构,其为一维数组,每四个元素表示一个像素的颜色与透明度值。接着通过`uni.createOffscreenCanvas()`创建离屏画布以减少绘制干扰,并提供代码实现,将RGBA数据逐像素绘制到画布上生成图片。最后说明了为何不直接使用拍照API及图像转换的调用频率建议,强调应先暂存帧数据,运动结束后再进行转换和上传,以优化性能。
微信小程序开发全流程:从注册到上线的完整指南
这篇文章详细记录了微信小程序的完整开发到最终上线的每一个步骤。适合对小程序开发感兴趣的个人开发者或希望了解完整流程的学习者,涵盖了云开发、事件绑定、生命周期管理、组件使用等关键内容。
271 11
【一步步开发AI运动小程序】二十、AI运动小程序如何适配相机全屏模式?
本文探讨了小程序`camera`组件在全屏模式下的适配问题及其解决方案。由于`camera`组件存在预览图像裁切特性,可能导致入镜检测与预览不一致、骨骼图与人体不重合等问题。通过分析其裁剪逻辑(长边按比缩放,短边居中裁切),我们提供了计算裁剪比例和留白的适配方法,并优化了插件特性以支持全屏应用。同时,文章还讨论了全屏模式可能带来的副作用,如人体可视区域变小、检测范围变化及抽帧帧率下降等,并给出了改进建议。该方案适用于云上赛事、健身锻炼、AI体测、AR互动等场景,助力提升用户体验和UI布局合理性。

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等