2022年夏季《移动软件开发》实验二:天气查询小程序
一、实验目标
1、掌握服务器域名配置和临时服务器部署;2、掌握 wx.request 接口的用法。
二、实验步骤
1. 准备工作
1.1. API密钥申请
进入和风天气官方网址:https://www.heweather.com,注册并激活免费类型的用户,可以看到申请到的个人认证key,个人认证key的作用为该信息在小程序发出网络请求时会作为身份识别的标识发送给和风天气的第三方服务器。我申请到的个人key如下。

1.2 API调用方法
获取实时天气

获取LocationID


1.3 服务器域名配置
每一个小程序在与指定域名地址进行网络通讯前都必须将该域名地址添加到管理员后台名单,因此需要通过微信开发公众平台将需要通讯的两个域名加入到request合法域名中,如下如图所示。

2. 项目创建
创建空白文件夹weatherDemo用与存放小程序项目

3. 页面配置
3.1 创建页面文件
项目创建完毕后,在根目录中会生成文件夹pages用于存放页面文件。一般来说首页默认命名为index,表示小程序运行的第一个页面,本项目只需要保留首页(index)即可。
具体操作如下:
(1)将 app.json 文件内 pages 属性中的“ pages / logs / logs ”删除,并删除上一行末尾的
逗号。
(2)按快捷键 Cirl + S 保存当前修改。
3.2 删除和修改文件
具体操作如下:
(1) 删除utils文件夹及其内部所有内容。
(2)删除 pages 文件夹下的 logs 目录及其内部所有内容。
(3)删除 index.Wxml 和 index.Wxss 中的全部代码。
(4)删除 index.js 中的全部代码,并且输人关键词“ page ”找到第二个选项按回车键让其自动补全函数。
(5)删除 app.wxss中的全部代码。
(6)删除app.js中的全部代码,并且输人关健间" pp "找到第一个选项按回车键让其日动补全函数。
至此,模板代码修改完毕。
3.3 创建其他文件
将天气图标文件夹移动至/weatherDemo/images/weather_icon/文件夹下,形成如下目录结构

4 视图设计
4.1 导航栏设计

4.2 页面设计
页面包含四个区域:区域1:地区选择器,用户可以自行选择查询的省、市、 区
区域2:显示当前城市的温度和天气状态的文字说明
区域3:显示当前城市天气的图标
区域4:分多行显示其他天气,如气压、湿度、能见度等
4.2.1 整体容器设计

4.2.2 地区选择器设置
使用picker组件实现

4.2.3 文本设计

4.2.4 天气图标设计

4.2.5 多行天气设计
wxml部分代码如下

wxss部分代码如下

效果如下

5.逻辑实现
5.1 更新省市区信息
初始信息设置为为山东省青岛市崂山区

5.2 获取实时天气数据
获取天气数据,首先需要获取locationID,网址如下

通过wx.requset获取locationID,请求参数需要有key(个人认证),locaiton(位置坐标或位置名称)吗, 同时可以添加参数adm:限定行政区划,也可用于对重名城市进行过滤

5.2.1 获取地名
获取id前,需要请求地名获取,可以从picker组件中获取地名,具体函数如下

5.2.2 获取id
将上一步中获取到的地名传给获取id的函数,用于获取id, 该步通过getLocationID函数实现,url 为网址, data中为所需参数,具体实现如下
`getLocationID(city,area){`
`var that=this`
`wx.request({`
`url: 'https://geoapi.qweather.com/v2/city/lookup?',`
`method:"GET",`
`data:{`
`location:area,`
`adm:city,`
`key:'00ecc66f369c457896b11aae1a4f94d3'`
`},`
`success:function(res){`
`that.getWeather(res.data.location[0].id)`
`that.setData({`
`localID:res.data.location[0].id`
`})`
`}`
`})`
`},`
5.2.3 获取天气信息
将上一步中获得的id传给getWeather()函数,通过wx.request请求获取天气信息,同时将天气信息修改并保存为本地值,具体代码实现如下
`getWeather:function(id){`
`var that = this`
`wx.request({`
`url:'https://devapi.qweather.com/v7/weather/now?',`
`data:{`
`location:id,`
`key:'00ecc66f369c457896b11aae1a4f94d3'`
`},`
`success(res){`
`var resdata=res.data.now`
`console.log(resdata);`
`that.setData({`
`tep:resdata.temp,`
`weather:resdata.text,`
`image:resdata.icon+'.png',`
`shidu:resdata.humidity+'%',`
`qiya:resdata.pressure+'hPa',`
`nengjiandu:resdata.vis+'km',`
`fengxiang:resdata.windDir,`
`fengsu:resdata.windSpeed+'km/h',`
`fengli:resdata.windScale+'级'`
`})`
`}`
`})`
`},`
5.2.4 请求初始数据
通过onload函数中默认初始请求青岛崂山的天气数据

5.2.5 获取天气信息并加载到页面
在实验结果中呈现
三、程序运行结果
1.获取到的天气信息

2.天气小程序初始页面

3.切换城市后的小程序页面

四、问题总结与体会
问题总结
遇到的问题: 使用和风天气s6访问页面数据被拒绝
解决方法:查询和风天气api文档,发现s6接口已经停用,改用v7接口获取天气数据
心得体会
通过此次实验,我学习了服务器域名配置和临时服务器部署方法,学习并初步掌握了 wx.request 接口的用法,并使用wx.request接口获取到了和风天气api的天气信息,同时我也学习到了不少wtml和css以及javas的相关语法和内容,对于我《移动软件开发》这门课程的学习以及计算机专业的学习都有非常大的帮助。
附:js源码
Page({
data: {
region:['山东省','青岛市','崂山区'],
temp:0,
weather:'晴',
imgsrc:'999',
localID:101120202
},
getLocationID(city,area){
var that=this
wx.request({
url: 'https://geoapi.qweather.com/v2/city/lookup?',
method:"GET",
data:{
location:area,
adm:city,
key:'00ecc66f369c457896b11aae1a4f94d3'
},
success:function(res){
that.getWeather(res.data.location[0].id)
that.setData({
localID:res.data.location[0].id
})
}
})
},
getWeather:function(id){
var that = this
wx.request({
url:'https://devapi.qweather.com/v7/weather/now?',
data:{
location:id,
key:'00ecc66f369c457896b11aae1a4f94d3'
},
success(res){
var resdata=res.data.now
console.log(resdata);
that.setData({
tep:resdata.temp,
weather:resdata.text,
image:resdata.icon+'.png',
shidu:resdata.humidity+'%',
qiya:resdata.pressure+'hPa',
nengjiandu:resdata.vis+'km',
fengxiang:resdata.windDir,
fengsu:resdata.windSpeed+'km/h',
fengli:resdata.windScale+'级'
})
}
})
},
regionChange: function(e){
this.setData({region:e.detail.value});
this.getLocationID(e.detail.value[1],e.detail.value[2])
this.getWeather(this.localID);
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
this.getLocationID('青岛','崂山区')
this.getWeather(101120202)
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady: function () {
},
/**
* 生命周期函数--监听页面显示
*/
onShow: function () {
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide: function () {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload: function () {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh: function () {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom: function () {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage: function () {
}
})
nShow: function () {
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide: function () {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload: function () {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh: function () {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom: function () {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage: function () {
}
})
wxml源码
```xml
<view class="container">
<!--区域1:地区选择器-->
<picker mode='region' bindchange='regionChange'>
<text wx:for="{{region}}">{{item}}</text>
</picker>
<!--区域2:单行天气显示-->
<text>{{weather.temp}}℃ {{weather.text}}</text>
<!--区域3:天气图标-->
<image src="/images/weather_icon/{{weather.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">{{weather.humidity}}%</view>
<view class="box">{{weather.pressure}}kPa</view>
<view class="box">{{weather.vis}}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">{{weather.windDir}}</view>
<view class="box">{{weather.windSpeed}}km/h</view>
<view class="box">{{weather.windScale}}级</view>
</view>
</view>
</view>

1698

被折叠的 条评论
为什么被折叠?



