2023年夏季《移动软件开发》实验报告-实验二

2023年夏季《移动软件开发》实验报告

一、实验目标

1、掌握服务器域名配置和临时服务器部署;2、掌握 wx.request 接口的用法

二、实验步骤

一、准备工作

1、API秘钥申请

进入和风官网网址:https://www.qweather.com/,使用邮箱进行注册,注册完毕之后登录并创建项目,记录个人认证key
在这里插入图片描述

2、API调用方法

目前免费用户可以调用的最新版接口地址为“https://geoapi.qweather.com/v2/”,其服务器节点在中国境内。该接口地址后面追加不同的关键词将获取不同种类的气象数据信息,例如alarm为天气自然灾害预警。我们可以访问官方文档了解各类关键词的使用方法。
本示例将选用关键词weather进行实况天气数据的获取。实况天气即为当前时间点的天气状况以及温/湿/风/压等气象指数,具体包含体感温度、实测温度、天气状况、风力、风速、风向、相对湿度、大气压强、降水量、能见度等。目前该接口允许查询的城市覆盖范围为全球任意一个城市。
基于关键词weather的接口具有两个必填参数和两个可选参数,如表5-1所示。
在这里插入图片描述
其中unit参数相关的公制和英制单位对比如下:

在这里插入图片描述

查询方法如下

https://geoapi.qweather.com/v2/city/lookup?key=这里填你的key&location=要查询的城市名字

例如,使用拼音查询北京市的写法如下:
https://geoapi.qweather.com/v2/city/lookup?key=这里填你的key&location=北京
用户可以直接将这段地址输入到浏览器的地址栏中测试数据返回结果,以下是我测试的返回结果:

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

以上只展示部分,返回字段说明可在官网中查询

3、服务器域名配置

每一个小程序在与指定域名地址进行网络通信前都必须将该域名地址添加到管理员后台白名单中,因此本示例需要对域名地址“https://geoapi.qweather.com”进行服务器配置。

小程序开发者登录mp.weixin.qq.com进人管理员后台,单击“设置”按钮,切换至“开发设置”面板,在“服务器域名”栏中可以添加或者修改进行网络通信的服务器域名地址
在这里插入图片描述

将当前需要使用的接口添加到“request合法域名”中,配置完成后再登录小程序开发工具就允许小程序与指定的服务器域名地址之间的网络通信了,注意每个月只可以申请修改5次服务器域名配置。

二、项目创建

本项目创建选择空白文件夹weatherDemo,效果图如下
在这里插入图片描述
在这里插入图片描述

单击“新建”按钮完成项目创建,然后准备手动创建页面配置文件

三、页面配置

1、创建页面文件

项目创建完毕后,在根目录中会生成文件夹pages用于存放页面文件。一般来说首页默认命名为index,表示小程序运行的第一个页面;其他页面名称可以自定义。本项目只需要保留首页index即可。
具体操作如下:
(1)将app.json文件内pages属性中的“pages/logs/logs”删除,并删除上一行末尾的逗号。
(2)按快捷键Ctrl十S保存当前修改。

2、删除和修改文件

具体操作如下:
(1)删除utils文件夹及其内部所有内容。
(2)删除pages文件夹下的logs目录及其内部所有内容。
(3)删除index.wxml和index.wxss中的全部代码.。
(4)删除index.js中的全部代码,并且输入关键词page找到第二个选项按回车键让其自动补全函数
(5)删除app.wxss中的全部代码。
(6)删除app.js中的全部代码,并且输入关键词app找到第一个选项按回车键让其自动补全函数

3、创建其他文件

接下来创建其他自定义文件,本项目还需要一个文件夹用于存放天气图标素材。文件夹名称由开发者自定义(例如images),单击目录结构左上角的十号创建文件夹并命名为images。
本项目用到的图标素材共计75个,均来源于和风天气官网,图标素材展示如图所示:

在这里插入图片描述

其中图标文件名为对应的天气代码,扩展名均为.png。需要注意的是,部分图标文件名带有字母n,表示夜间天气图标,例如100n.png。
右击目录结构中的images文件夹,选择“硬盘打开”,在该文件夹中新建二级目录weather_icon,然后将图标文件全部复制、粘贴进去。完成后的目录结构如图:

在这里插入图片描述

此时文件配置全部完成

四、视图设计

1、导航栏设计

在app.json中自定义导航栏标题和背景,更改后的app.json文件代码及效果图如下:

{
  "pages":[
    "pages/index/index"
  ],
  "window":{
    "backgroundTextStyle":"light",
    "navigationBarBackgroundColor": "#3883FA",
    "navigationBarTitleText": "今日天气",
    "navigationBarTextStyle":"black"
  },
  "style": "v2",
  "sitemapLocation": "sitemap.json"
}

在这里插入图片描述

2、页面设计

页面上主要包含4个区域,具体内容解释如下:

  • 区域1:地区选择器,用户可以自行选择查询的省、在这里插入图片描述
    市、区;

  • 区域2:显示当前城市的温度和天气状态的文字说明;

  • 区域3:显示当前城市的天气图标;

  • 区域4:分多行显示其他天气信息,例如湿度、气压、能见度和风向等。

    注意,面板之间需要有一定的间隔距离。

计划使用如下组件:

  • 页面整体:组件,并定义class=‘container’;
  • 区域1:组件;
  • 区域2: 组件;
  • 区域3:组件;
  • 区域4:组件,并定义class=‘detail’;
  • 区域4内单元行:4个组件,并定义class=bar’;
  • 区域4内单元格:每行3个组件,并定义class=box’。

(1)整体容器设计

首先定义页面容器(),WXML(pages/index/index.wxml)代码片段如下:

<view class='container'>
</view>

在app.wxss中设置容器样式,代码片段如下:

.container{
  height:100vh;
  display:flex;
  flex-direction:column;
  align-items:center;
  justify-content:space-around;
}

由于还没有添加组件元素,尚不能看出flex布局模型效果

(2)区域1(地区选择器)设计

区域1需要使用组件来实现一个地区选择器,用户点击可切换选择其他城市。WXML(pages/index/index.wxml)代码片段修改如下:

<view class='container'>
  <!--区域1:地区选择器-->
  <picker mode='region'>
    <view>北京市</view>
  </picker>
</view>

组件内部是开发者任意填写的一个城市名称,当前效果如图5所示。由图可见,点击城市名称时会从底部弹出控件,用户可以进行省、市、区的选择。
在这里插入图片描述

(3)区域2(文本)设计

区域2需要使用 组件实现一个单行天气信息,包括当前城市的温度和天气状况
WXML(pages/index/index.wxml)代码片段修改如下:

<view class='container'>
  <!--区域1:地区选择器-->
  <picker mode='region'>
    <view>北京市</view>
  </picker>
  <text>19℃晴</text>
</view>

WXSS(pages/index/index.wxss)代码片段如下:

text{
  font-size:80rpx;
  color:#3C5F81;
}

当前效果图如下:
在这里插入图片描述

(4)区域3(天气图标)设计

q区域3需要使用组件展示当前城市的天气图标

WXML(pages/index/index.wxml)代码片段修改如下:

<view class='container'>
  <!--区域1:地区选择器-->
  <picker mode='region'>
    <view>北京市</view>
  </picker>
  <!--区域2:单行天气信息-->
  <text>19℃晴</text>
  <!--区域3:天气图标-->
  <image src='/images/weather_icon/999.png'mode='widthFix'></image>
</view>

WXSS(pages/index/index.wxss)代码片段如下:

text{
  font-size:80rpx;
  color:#3C5F81;
}
image{
  width:220rpx;
}

效果图如下:
在这里插入图片描述

(5)区域4(多行天气信息)设计

区域4需要使用组件展示多行天气信息

WXML(pages/index/index.wxml)代码片段修改如下:

<view class='container'>
  <!--区域1:地区选择器-->
  <picker mode='region'>
    <view>北京市</view>
  </picker>
  <!--区域2:单行天气信息-->
  <text>19℃晴</text>
  <!--区域3:天气图标-->
  <image src='/images/weather_icon/999.png'mode='widthFix'></image>
  <!--区域4:多行天气信息-->
  <view class='detail'>
    <view class='bar'>
      <view class='box'>湿度</view>
      <view class='box'>气压</view>
      <view class='box'>能见度</view>
    </view>
    <view class='bar'>
      <view class='box'>0 %</view>
      <view class='box'>0 hPa</view>
      <view class='box'>0 km</view>
    </view>
    <view class='bar'>
      <view class='box'>风向</view>
      <view class='box'>风速</view>
      <view class='box'>风力</view>
    </view>
    <view class='bar'>
      <view class='box'>0</view>
      <view class='box'>0 km/h</view>
      <view class='box'>0</view>
    </view>
  </view>
</view>

WXSS(pages/index/index.wxss)代码片段如下:

text{
  font-size:80rpx;
  color:#3C5F81;
}
image{
  width:220rpx;
}
.detail{
  width:100%;
  display: flex;
  flex-direction: column;
}
.bar{
  display: flex;
  flex-direction: row;
  margin: 20rpx 0;
}
.box{
  width: 33.3%;
  text-align: center;
}

效果图如下:

在这里插入图片描述

当前为开发者自定义数据,待查询到实况数据后将动态更新区域4内容,此时页面设计全部完成。

五、逻辑实现

1、更新省,市,区信息

首先修改组件中“北京市”为{{region}},然后为组件追加自定义bindchange事件,用于监听选项变化

WXML代码片段修改如下:

 <picker mode='region'bindchange='regionChange'>
    <view>{{region}}</view>
  </picker>

由于地区选择器的返回结果是数组的形式,所以在JS文件的data中定义region为包含了省、市、区3个项目的数组,初始城市信息由开发者自定义。
JS(pages/index/index.js)代码片段修改如下:

  data: {
    region:['湖北省','咸宁市','通山县']
  },
  regionChange: function (e) {
      this.setData({
          region: e.detail.value
      });
  },

效果图如下所示:
在这里插入图片描述

2、获取实况天气数据

在JS文件中使用自定义函数get Weather进行实况天气数据的获取。由于非直辖市无法查询到具体的区,所以后续的天气查询以城市作为查询依据。
JS(pages/index/index.js)代码片段修改如下:

  getWeather: function () {
      let that = this;
      new Promise((resolve, reject) => {
          wx.request({
              url: 'https://geoapi.qweather.com/v2/city/lookup',
              data: {
                  location: this.data.region[1],
                  key: '27d392d7ae8e420a90482e1b88144b80'
              },
              success: function (res) {
                  resolve(res.data.location[0].id);
              }
          })
      }).then((id) => {
          wx.request({
              url: 'https://devapi.qweather.com/v7/weather/now',
              data: {
                  location: id,
                  key: '27d392d7ae8e420a90482e1b88144b80'
              },
              success: function (res) {
                  console.log(res.data);
                  that.setData({ now: res.data.now });
              }
          })
      })
  },

将上述函数在生命周期函数onLoad和自定义函数regionChange中分别进行调用,表示当页面加载时和切换城市时均主动获取一次实况天气数据。
JS(pages/index/index.js)代码片段修改如下:

 regionChange:function(e){
    this.setData({region:e.detail.value});
    this.getWeather();
  },

  /**
   * 生命周期函数--监听页面加载
   */
  onLoad: function (options) {
    this.getWeather();
  },

在联网状态下保存后重新运行会在Console控制台得到第三方服务器发回的json数据,如图所示。
在这里插入图片描述

3、更新页面天气信息

将WXML页面上所有的临时数据都替换成{{now.属性}}的形式,例如温度是{{Now.tmp}}

WXML(pages/index/index.wxml)的代码片段修改如下:

<view class='container'>
  <!--区域1:地区选择器-->
  <picker mode='region'bindchange='regionChange'>
    <view>{{region}}</view>
  </picker>
  <!--区域2:单行天气信息-->
  <text>{{now.temp}}{{now.text}}</text>
  <!--区域3:天气图标-->
  <image src='/images/weather_icon/{{now.icon}}.png'mode='widthFix'></image>
  <!--区域4:多行天气信息-->
  <view class='detail'>
    <view class='bar'>
      <view class='box'>湿度</view>
      <view class='box'>气压</view>
      <view class='box'>能见度</view>
    </view>
    <view class='bar'>
      <view class='box'>{{now.humidity}}</view>
      <view class='box'>{{now.pressure}}</view>
      <view class='box'>{{now.vis}}</view>
    </view>
    <view class='bar'>
      <view class='box'>风向</view>
      <view class='box'>风速</view>
      <view class='box'>风力</view>
    </view>
    <view class='bar'>
      <view class='box'>{{now.windDir}}</view>
      <view class='box'>{{now.windSpeed}}</view>
      <view class='box'>{{now.windScale}}</view>
    </view>
  </view>
</view>

JS代码片段修改如下:

data: {
      region: ["湖北省", "咸宁市", "通山县"],
      now: {
          temp: "0",
          text: "未知",
          icon: "999",
          humidity: "0",
          pressure: "0",
          vis: "0",
          windDir: "0",
          windSpeed: "0",
          windScale: "0"
      }

  },

运行效果如下:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

实验完成

三、程序运行结果

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

四、问题总结与体会

实验过程中整体进行较为顺利,但在最后同步天气信息时出现了问题,无法访问天气信息。经过检查和与同学讨论,发现是因为和风天气的更新,里面许多变量名都需要进行修改。根据和风开发文档中更新的变量名修改后,能够正常显示。经过这次实验,了解到了制作一个天气查询小程序的基本流程,包括API秘钥申请,服务器域名配置等,同时也进一步巩固了页面配置,视图设计,逻辑实现的开发流程,对前端开发更加熟悉。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值