墨迹api实现天气预测

文章目录

  • 需求背景
  • 解决效果
  • 接口地址
  • index.vue
    • weather.vue
    • 图标文件
  • 视频效果

需求背景

使用墨迹天气api实现天气预报,空气质量预报功能

解决效果

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

接口地址

墨迹天气

index.vue

<template><div class="dqhjjc-wrap"><div class="first_level_heading"><span>大气环境检测</span><el-select v-model="curCity" placeholder="站点类型" size="mini" style="width:130px" @change="getlist"><el-option v-for="item in citys" :label="item.label" :value="item.value"></el-option></el-select></div><div class="main-con"><weather :sunSetHour="sunSetHour" :sunRiseHour="sunRiseHour" :hourlys="hourlys" :forecasts="forecasts"/></div></div>
</template>
<script>
import Weather from './weather'
import Real from './real'
import SiteAir from './siteAir'
import Wind from './wind'
import qs from 'qs'
import {data24hours,day15Data,aqis
} from './weatherData'export default {name: 'YuxiEnvironmentalDqhjjc',components: {Weather,Real,SiteAir,Wind},data() {return {sunSetHour: 22,//日落小时sunRiseHour: 6,//日出小时hourlys: [],// 24小时天气数据forecasts: [],// 15天天气数据headers: {},citys: [{ label: '玉溪市', value: 2851 },{ label: '江川县', value: 2852 },{ label: '澄江市', value: 2853 },{ label: '通海县', value: 2854 },{ label: '华宁县', value: 2855 },{ label: '易门县', value: 2856 },{ label: '峨山彝族自治县', value: 2857 },{ label: '新平彝族傣族自治县', value: 2858 },{ label: '元江哈尼族彝族傣族自治县', value: 2859 }],curCity: 2851}},methods: {getlist() {// 天气实况fetch('http://aliv18.data.moji.com/whapi/json/alicityweather/condition', {method: 'POST',headers: this.headers,body: qs.stringify({ cityId: this.curCity })}).then(response => response.json()).then(res => {this.sunSetHour = new Date(res.data.condition.sunSet).getHours()this.sunRiseHour = new Date(res.data.condition.sunRise).getHours()})// 天气预报24小时fetch('http://aliv18.data.moji.com/whapi/json/alicityweather/forecast24hours', {method: 'POST',headers: this.headers,body: qs.stringify({ cityId: this.curCity })}).then(response => response.json()).then(res => {this.hourlys = res.data.hourly})// 天气预报15天fetch('http://aliv18.data.moji.com/whapi/json/alicityweather/forecast15days', {method: 'POST',headers: this.headers,body: qs.stringify({ cityId: this.curCity })}).then(response => response.json()).then(res => {this.forecasts = res.data.forecast})// AQI预报5天fetch('http://aliv18.data.moji.com/whapi/json/alicityweather/aqiforecast5days', {method: 'POST',headers: this.headers,body: qs.stringify({ cityId: this.curCity })}).then(response => response.json()).then(res => {// this.forecasts = res.data.forecastconsole.log(res, 3333)})}},mounted() {this.headers = new Headers()this.headers.append('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8')this.headers.append('Authorization', 'APPCODE f70abac0ebcb459588c96c4ec7a8bcad') // 登录凭证// this.getlist() // todo 天气接口次数有限// 模拟接口const self = thiswindow.setTimeout(() => {self.hourlys = data24hours.data.hourly// 24小时数据self.forecasts = day15Data.data.forecast// 15天数据self.aqis = aqis.data.data.aqi // 当日aqi数据}, 500)}
}
</script>

weather.vue

<template><div><div class="wrap"><span class="panelSecondTitle">天气预警</span><div class="btn"><buttonv-for="item in weatherTypes":key="item.id":class="weatherTypeActiveId === item.id?'select':''"@click="weatherTypeActiveId = item.id">{{ item.label }}</button></div></div><div id="weatherLineChart" :style="{height:weatherTypeActiveId==1?'185px':'230px'}"><div v-show="weatherTypeActiveId==1"><div class="weather24IconBox"><div v-for="(item, index) in weather24Icons" :key="index" class="iconItem"><div class="iconImg"><img :src="require(`/public/img/weather/${item.icon}.png`)"/></div><div class="iconCon">{{ item.con }}</div><div class="state"></div></div></div><div id="dqhjjc24WeatherChart" style="width: 1100px;height: 120px"></div></div><div v-show="weatherTypeActiveId!=1"><div class="weather15DayBox"><div v-for="(item, index) in weather15DayIcons" :key="index" class="iconItem"><div class="iconWeek">{{ item.week }}</div><div class="iconDate">{{ item.date }}</div><div class="iconImg"><img :src="require(`/public/img/weather/${item.icon}.png`)"/></div><div class="iconCon">{{ item.con }}</div></div></div><div id="dqhjjc15WeatherChart" style="width: 900px;height: 120px"></div><div class="weather15NightBox"><div v-for="(item, index) in weather15NightIcons" :key="index" class="iconItem"><div class="iconImg"><img :src="require(`/public/img/weather/${item.icon}.png`)"/></div><div class="iconCon">{{ item.con }}</div></div></div></div></div></div>
</template><script>
import * as echarts from 'echarts'export default {props: ['sunSetHour', 'sunRiseHour', 'hourlys', 'forecasts'],data() {return {weatherTypes: [{ label: '24小时', id: 1 },{ label: '15天', id: 2 }],weatherTypeActiveId: 1,my24Chart: null,my15Chart: null,weather24Icons: [],weather15DayIcons: [],weather15NightIcons: []}},watch: {hourlys: {handler: {handler(data) {const option = this.my24Chart.getOption()option.xAxis[0].data = data.map((item) => item.hour + ':00')option.series[0].data = data.map((item) => item.temp)this.weather24Icons = data.map((item) => {let temp = {}temp.con = item.conditiontemp.id = item.hourif (item.hour < this.sunSetHour &&item.hour >= this.sunRiseHour) {temp.icon = 'W' + item.iconDay} else {temp.icon = 'W' + item.iconNight}return temp})this.my24Chart.setOption(option)}}},forecasts: {handler(data) {const option = this.my15Chart.getOption()option.xAxis[0].data = data.map((item) => item.predictDate.split('-')[1] + '/' + item.predictDate.split('-')[2])option.series[0].data = data.map((item) => item.tempDay)option.series[1].data = data.map((item) => item.tempNight)this.weather15DayIcons = data.map(item => ({icon: 'W' + item.conditionIdDay,con: item.conditionDay,date:item.predictDate.split('-')[1] +'/' +item.predictDate.split('-')[2],week: new Date(item.predictDate).format('l')}))this.weather15NightIcons = data.map(item => ({icon: 'W' + item.conditionIdNight,con: item.conditionNight}))this.my15Chart.setOption(option)}}},methods: {draw24WeatherChart() { // 24小时天气let chartDom = document.getElementById('dqhjjc24WeatherChart')if (chartDom == null) {return}echarts.dispose(chartDom)this.my24Chart = echarts.init(chartDom)const option = {color: ['#0C65F6', '#00D68A'],tooltip: {confine: true},grid: {left: '-2%',right: '0%',top: '17%  ',bottom: '5%',containLabel: true},legend: {show: false},xAxis: {type: 'category',axisLine: {lineStyle: {color: 'rgba(255,255,255,0.2)'}},interval: 1,axisLabel: {align: 'center',fontSize: 12,color: '#fff'},axisTick: {show: false},splitLine: {show: false},data: ['20:00', '21:00', '22:00', '23:00', '0:00', '1:00', '2:00', '3:00', '4:00', '5:00', '6:00', '7:00', '8:00', '9:00', '10:00', '11:00', '12:00', '13:00', '14:00', '15:00', '16:00', '17:00', '18:00', '19:00', '20:00']},yAxis: {show: false,type: 'value'},series: [{type: 'line',// showSymbol: false,smooth: true,name: '气温', // 图例对应类别data: ['15', '13', '12', '11', '11', '10', '10', '9', '8', '7', '7', '7', '6', '10', '13', '17', '18', '19', '19', '19', '19', '19', '19', '18', '17'], // 纵坐标数据areaStyle: {color: new echarts.graphic.LinearGradient(0, 0, 0, 1,[{offset: 0,color: '#09515a'},{offset: 0.5,color: '#09515a'},{offset: 1,color: 'transparent'}],false)},lineStyle: {color: '#20b3c8',width: 2},itemStyle: {color: '#c3e2fc'},tooltip: {show: true,trigger: 'item',formatter: '{a}:<br />{c}℃'},label: {show: true,position: 'top',color: '#fff'}}]}option && this.my24Chart.setOption(option)this.dragScroll('weatherLineChart')},draw15WeatherChart() {let chartDom = document.getElementById('dqhjjc15WeatherChart')if (chartDom == null) {return}echarts.dispose(chartDom)this.my15Chart = echarts.init(chartDom)const option = {grid: {left: '-3%',right: '0%',top: '0%  ',bottom: '-29%',containLabel: true},tooltip: {trigger: 'axis'},xAxis: [{type: 'category',data: ['10/09', '10/10', '10/11', '10/12', '10/13', '10/14', '10/15', '10/16', '10/17', '10/18', '10/19', '10/20', '10/21', '10/22', '10/23', '10/24'],show: false}],yAxis: {type: 'value',show: false},series: [{data: ['20', '19', '21', '20', '24', '25', '25', '26', '24', '23', '24', '29', '31', '28', '28', '31'],type: 'line'},{data: ['7', '7', '7', '10', '13', '13', '14', '14', '9', '7', '11', '13', '14', '13', '13', '13'],type: 'line'}]}option && this.my15Chart.setOption(option)},dragScroll(moveTarget) {const title = document.getElementById(moveTarget)let startScrollLeft = 0let startX = 0let dragging = falsetitle.addEventListener('mousedown', function(e) {e.stopPropagation()startScrollLeft = title.scrollLeftstartX = e.clientXdragging = true})title.addEventListener('mousemove', function(e) {if (dragging) {const distance = e.clientX - startXtitle.scrollLeft = startScrollLeft - distance}})title.addEventListener('mouseup', function() {dragging = false})// -----鼠标滑轮滚动-----title.addEventListener('wheel', event => {event.preventDefault()const delta = event.deltaX || event.deltaYtitle.scrollLeft += delta})}},mounted() {this.draw24WeatherChart()this.draw15WeatherChart()}
}
</script><style lang="scss" scoped>
.wrap {display: flex;justify-content: space-between;/*定义滚动条高宽及背景高宽分别对应横竖滚动条的尺寸*/.btn {height: 30px;border-radius: 5px;border: 1px solid rgb(35, 145, 255);box-sizing: border-box;overflow: hidden;> button {width: 70px;text-align: center;line-height: 30px;margin: 0;padding: 0;background-color: transparent;border: none;color: rgb(35, 145, 255);;&.select {background: rgb(35, 145, 255);;color: #fff;}}}
}#weatherLineChart {width: 100%;height: 185px;flex-grow: 1;overflow-x: auto;position: relative;&::-webkit-scrollbar {width: 0px;height: 0px;}.weather24IconBox, {width: 1100px;height: calc(100% - 121px);display: flex;justify-content: space-around;overflow: hidden;margin-top: 10px;user-select: none;.iconItem {display: flex;flex-direction: column;align-items: center;justify-content: center;height: 100%;.iconImg {width: 25px;height: 25px;img {display: block;width: 100%;height: 100%;}}.iconCon {color: #ffffffde;font-size: 14px;}.state {width: 35px;margin-top: 2px;color: #ffff00;text-align: center;font-size: 12px;border: 1px solid #ffff00;border-radius: 5px;background: rgba(255, 255, 0, 0.2);}}}.weather15DayBox {display: flex;justify-content: space-between;width: 900px;height: 64px;padding-left: 2px;padding-right: 7px;margin-top: 10px;cursor: move;box-sizing: border-box;user-select: none;.iconItem {display: flex;flex-direction: column;align-items: center;justify-content: center;height: 100%;.iconWeek {font-size: 14px;color: #ffffffe6;}.iconDate {font-size: 12px;color: #ffffff87;}.iconImg {width: 20px;height: 20px;img {width: 100%;height: 100%;}}.iconCon {color: #ffffffde;font-size: 12px;}}}.weather15NightBox {width: 900px;height: calc(100% - 65px - 64px);display: flex;justify-content: space-between;cursor: move;box-sizing: border-box;padding-left: 12px;padding-right: 18px;user-select: none;.iconItem {display: flex;flex-direction: column;align-items: center;justify-content: center;height: 100%;.iconImg {width: 20px;height: 20px;img {width: 100%;height: 100%;}}.iconCon {color: #ffffffde;font-size: 12px;}}}
}
</style>

图标文件

视频效果

天气

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/76.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

知易行难!项目推进的6大常见问题

项目推进是一项企业发展业务中的关键任务。然而&#xff0c;许多项目在实施过程中遇到各种困难和挑战&#xff0c;导致项目无法按计划进行或无法实现预期的成果。以下是项目推进过程中常见的六个问题以及解决方案。1、项目目标不明确 项目推进时&#xff0c;如果项目团队不清楚…

Linux学习之以openresty为例学习源码安装软件

https://github.com/openresty/openresty/tags里边有openresty各个版本的源码。 https://openresty.org/en/是官网。 wget https://github.com/openresty/openresty/archive/refs/tags/v1.15.8.1.tar.gz(github网址)或者wget https://openresty.org/download/openresty-1.15.…

Redis五种数据结构底层编码结构

RedisObject Redis中的任意数据类型的键和值都会被封装为一个RedisObject&#xff0c;也叫做Redis对象&#xff0c;源码如下&#xff1a; 对象头不包含数据就已经占16字节&#xff0c;如果数据存string型&#xff0c;一个string一个对象头比较浪费空间&#xff0c;存大量数据…

Kafka系列之:对源连接器的的Exactly-Once支持

Kafka系列之&#xff1a;对源连接器的的Exactly-Once支持 一、背景二、目标三、公共接口四、连接器 API 扩展五、REST API验证六、新指标七、计划变更八、任务计数记录九、重新平衡的准备十、源任务启动十一、领导者访问配置主题十二、用于隔离事务生产者的管理 API十三、解决了…

python 加速(1)

文章目录 简单步骤像Python一样做torch 的一切安装Cmake安装 Torch &#xff08;GPU&#xff09;CMakeLists.txt试用小样设置 CLion 环境 Cuda配置VS C 环境建上手的文件step1: interpolation.cppstep2: interpolation_kernel.custep3: include/ utils.hstep4: setup.pystep5: …

redis和mysql

文章目录 一、redis1.1 redis的数据结构都有哪些&#xff1f;1.2 持久化方式有哪些&#xff1f;1.3 怎么保证缓存和数据库数据的一致性?1.4 redis缓存是什么意思&#xff1f; 二、数据库2.1 基本数据类型2.2 MySQL 的内连接、左连接、右连接有什么区别?2.3 MySQL 问题排查都有…

闲置iPad Pro打造真正的生产力工具!使用vscode编程写代码

文章目录 前言视频教程1. 本地环境配置2. 内网穿透2.1 安装cpolar内网穿透(支持一键自动安装脚本)2.2 创建HTTP隧道 3. 测试远程访问4. 配置固定二级子域名4.1 保留二级子域名4.2 配置二级子域名 5. 测试使用固定二级子域名远程访问6. iPad通过软件远程vscode6.1 创建TCP隧道 7…

Java阶段四Day08

Java阶段四Day08 文章目录 Java阶段四Day08关于pom.xml中的版本关于Session关于Token关于JWT在项目中使用JWTCustomUserDetailsUserDetailServiceImplUserServiceImpl 关于pom.xml中的版本 查看<groupId> 是同一家的只需配一个版本号<version><artifactId>中…

Spring Boot中的Profile:原理、用法与示例

Spring Boot中的Profile&#xff1a;原理、用法与示例 前言 Spring Boot 是一个快速开发 Spring 应用程序的框架&#xff0c;它提供了很多有用的功能和特性。其中&#xff0c;Profile 是一个常用的功能&#xff0c;它可以根据不同的环境配置来加载不同的配置文件&#xff0c;…

双路高速 DA 实验

目录 双路高速 DA 实验 1、简介 2、实验任务 3、程序设计 3.1、hs_dual_da顶层模块代码 3.2、ROM 波形存储模块&#xff08;rom_1024x10b&#xff09; 创建单端口 ROM IP核 3.2、DA 数据发送模块&#xff08;da_wave_send&#xff09;代码 4、硬件设计 4.1、添加.xdc…

Nginx网站服务

目录 Nginx简介 简述Nginx和Apache的差异 3 Nginx 相对于 Apache 的优点 阻塞与非阻塞 同步与异步 ginx 应用场景 nginx编译安装 Nginx安装和升级 1.关闭防火墙&#xff0c;将安装nginx所需软件包传到/opt目录下 2.拖入软件包 3.安装依赖包 3.创建运行用户与组 5.编译安…

【黑马头条-Java微服务项目】

黑马头条-Java微服务项目 (一)、项目介绍1.项目背景介绍(1).基本介绍(2).业务说明(3).项目术语介绍 2.技术栈说明(1).技术栈-基础六层技术(2).技术栈-服务四层技术(3).技术栈-分布 (二)、nacos环境搭建 (一)、项目介绍 1.项目背景介绍 (1).基本介绍 随着智能手机的普及&…