首页 > 编程语言 >移动软件开发--天气查询小程序

移动软件开发--天气查询小程序

时间:2023-08-22 18:22:50浏览次数:36  
标签:flex 软件开发 -- region 天气 查询 now data 页面

一、实验目标

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

二、实验步骤

1.准备工作

1.1 API秘钥申请

​ 登录和风天气官方网址https://www.qweather.com/注册并记录个人认证key

image

1.2服务器域名配置

​ 本次实验需要查询城市ID与该城市所对应天气,故需要配置两个域名,在微信公众平台可以将两个接口添加到“request合法域名“中

image

2.页面配置

2.1创建页面文件、删除和修改文件

​ 根据实验要求对项目中文件进行修改与删除,并在index.js中补全Page函数,在app.js中补全App函数

image

​ 2.2创建其他文件

​ 在images文件夹中新建二级目录weather_icon,并将图标文件复制粘贴到当前文件夹中

image

3.视图设计

3.1导航栏设计

​ 更改app.json文件代码如下:

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

​ 上述代码可以更改所有页面的导航栏标题文本为”今日天气“,背景颜色为蓝色(#3883FA),效果如图:

image

3.2页面设计

3.2.1整体容器设计

​ 首先定义页面容器view,代码如下:

<view class = 'container'> <view>

​ 并设计容器样式,代码如下:

/* 背景容器样式*/
.container{
    height : 100vh;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: space-around;
}

3.2.2区域1(地区选择器)、2(文本)、3(天气图标)设计

​ 使用picker组件可以使用户自行选择省市区,使用text组件实现单行天气信息,包含温度与天气状况,image组件用来展示当前城市的天气图标,代码如下:

<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>

​ 得到效果如图:

image

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

​ 使用view组件展示多行天气信息,代码如下:

<!--区域四:多行天气信息-->
    <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'>0hPa</view>
            <view class = 'box'>0km</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'>0km/h</view>
            <view class = 'box'>0级</view>
        </view>
    </view>

​ wxss代码:

/*区域4整体样式*/
.detail{
    width:100%;
    display:flex;
    flex-direction: column;
}
/*区域4单元行样式*/
.bar{
    display: flex;
    flex-direction: row;
    margin: 20rpx 0;
}
/*区域4单元格样式*/
.box{
    width: 33.3%;
    text-align: center;
}

​ 得到效果如图:

image

4.逻辑实现

4.1更新省、市、区信息

​ 修改picker组件中“北京市”为{{region}},并追加自定义bindchange事件来监听选项变化,代码如下:

<!--区域1:地区选择器-->
    <picker mode = 'region' bindchange = 'regionChange'>
        <view>{{region}}</view>
    </picker>

​ 在js文件中自定义初始城市信息:

region: ["河北省", "石家庄市", "裕华区"],

​ 效果如图(可以随意切换地址):

image

4.2获取实况天气数据

​ 由于和风天气请求实时天气时需请求参数为所查询地区的locationID,而在region数组中存储的内容为文字,故需要调用城市搜索API来获取所查地址ID,请求参数为需要查询地址的名称以及用户认证key。

​ 这里需要使用Promise对象来完成异步任务,当执行成功时将调用resolve函数并传递成功的结果,并使用then来处理Promise成功状态的回调函数,并将ID传递来供实时天气API使用,该API请求参数为用户认证key以及需要查询地区的LocationID,调用成功则将data中数据修改为调用成功后结果。

 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: '23eb2b712c534b0e9cf9fd37bfb43363'
                },
                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: '23eb2b712c534b0e9cf9fd37bfb43363'
                },
                success: function (res) {
                    console.log(res.data);
                    that.setData({ now: res.data.now });
                }
            })
        })
    },

​ 调用成功结果如下(可以获取到实时数据):

image

4.3更新页面天气信息

​ 将wxml页面所有临时数据都替换成{{now.属性}}的形式,代码如下:

<!--区域二:单行天气信息-->
    <text>{{now.temp}}°C{{now.text}}</text>
    <!--区域三:天气图标-->
    <image src = '/images/weather_icon/{{now.icon}}.png' mode = 'widthFix'></image>
    <!--区域四:多行天气信息-->
    <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}}hPa</view>
            <view class = 'box'>{{now.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'>{{now.windDir}}</view>
            <view class = 'box'>{{now.windSpeed}}km/h</view>
            <view class = 'box'>{{now.windScale}}级</view>
        </view>
    </view>

​ 并在js中为now规定初始数据,避免在网速受限的情况下可能不能立刻获取到数据:

data: {
        region: ["河北省", "石家庄市", "裕华区"],
        now: {
            temp: "0",
            text: "未知",
            icon: "999",
            humidity: "0",
            pressure: "0",
            vis: "0",
            windDir: "0",
            windSpeed: "0",
            windScale: "0"
        }
    },

​ 实现结果如下:

image

三、程序运行结果

更新地址前:

image

更新地址后:
image

四、问题总结与体会

​ 刚进行实验时并没有认真阅读接口文档,在查询实时天气时没有看到所需数据位城市的locationID,只将城市名当做参数传递,出现了问题。本次实验让我掌握了掌握服务器域名配置和临时服务器部署,并且掌握了wx.request接口的用法。同时也了解到了Promise对象的用法,表示一个异步操作,有:Pending(进行中)、resolve(已完成)、rejected(已失败)三种状态,学会了then方法。

标签:flex,软件开发,--,region,天气,查询,now,data,页面
From: https://www.cnblogs.com/-tcxm/p/17649352.html

相关文章

  • 注释
    注释并不会被执行,是给我们写代码的人看的  单行注释://注释 多行注释:/*注释*/     换行直接回车 文档注释:/**注释*/ 附加更改注释颜色(首先点击左上角file)   ......
  • Apipost数据模型功能详解
    在API设计和开发过程中,存在许多瓶颈,其中一个主要问题是在遇到相似数据结构的API时会产生重复性较多的工作:在每个API中都编写相同的数据,这不仅浪费时间和精力,还容易出错并降低API的可维护性。为了解决这个问题,Apipost推出了数据模型板块。用户可以预先创建多个数据模型,并在API设计......
  • 1.Acwing基础课第785题-简单-快速排序
    1.Acwing基础课第785题-简单-快速排序题目描述给定你一个长度为n的整数数列。请你使用快速排序对这个数列按照从小到大进行排序。并将排好序的数列按顺序输出。输入格式输入共两行,第一行包含整数n。第二行包含n个整数(所有整数均在1~范围内),表示整个数列。输出格式输......
  • 14.linux命令ps
    14.linux命令ps1.psaux对进程进行监测和控制,首先必须要了解当前进程的情况,也就是需要查看当前进程,而ps命令(ProcessStatus)就是最基本同时也是非常强大的进程查看命令。使用该命令可以确定有哪些进程正在运行和运行的状态、进程是否结束、进程有没有僵尸、哪些进程占用了过......
  • 类与对象的创建
    类与对象的创建1.类类是一种抽象的数据类型,它是对某一类事物整体描述定义,但是并不能代表某一个具体的事物.2.对象对象是抽象概念的具体实例3.创建与初始化对象使用new关键字创建对象使用new关键字创建的时候,除了分配内存空间之外,还会给创建好的对象进行默认的初始化以......
  • 典故:小奴家腰上黄
    小奴家腰上黄典故━━━━━━━━━━━━━━━━━━━━━━长按2秒识别二维码关注我们,一码不扫,何以扫天下?《花妖》讲述了一个穿越千年的凄美爱情故事,第一世北宋的杭州,男主被杀,女主殉情,阎王爷被两人的爱情感动,允许他们再世投胎,但执行两人投胎的人错拨了罗盘经,第二世男......
  • UDP协议的收发操作
    大多数的应用程序都用TCP协议来收发数据,但当然也有例外。有些应用程序不使用TCP协议,而是使用UDP协议来收发数据。向DNS服务器查询IP地址的时候我们用的也是UDP协议。不需要重发的数据用UDP发送更高效由于我们需要将数据高效且可靠地发送给接收方。为了实现可靠性,tcp协议要求确认......
  • 三维脚本插件
    新建两个纯色层新建一个摄像机新建一个摄像机然后把面分开通过旋转,平移,能把面搭建出来先用文字平铺形成一个面然后把这个面预合成复制六个面打开脚本注意不能直接导入脚本,要文件-脚本-运行脚本新建一个摄像机观察设置空对象,方便观察......
  • 远程代码执行漏洞
    远程代码执行:RemoteCodeExecute同样的道理,因为需求设计,后台有时候也会把用户的输入作为代码的一部分进行执行,也就造成了远程代码执行漏洞。不管是使用了代码执行的函数,还是使用了不安全的反序列化等等。因此,如果需要给前端用户提供操作类的API接口,一定需要对接口输入的内......
  • TDengine 数据接入功能支持 InfluxDB 啦!一起来看看如何操作
    现在借助TDengine3.0企业版和TDengineCloud,你可以无缝接入不同数据源的数据到TDengine中了,为了帮助大家更好地应用此功能,我们还输出了系列的教程文章。上期《TDengine推出重磅功能,助力MQTT无缝数据接入》一文为大家介绍了MQTT数据接入功能的具体应用,在本篇文章中我们......