vue3-高德地图天气小组件

server/2024/10/23 5:32:05/

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

使用方法

<weather-view type="rect-solid" :borderColor="['#7ACAEC', '#068BBD']"></weather-view>

天气图标文件夹 本来想全弄成svg动态图片的,但找了很久都没找到对应的图(只找到了几个),于是就暂时搁置了

组件全代码如下 注意getWeather方法中的高德天气key需要改成自己的

<template><div class="dv-component-weather" :style="{ width: width, height: height }"><div class="dv-time"><span v-text="time"></span><span v-text="date"></span></div><div class="dv-weather"><img :src="icon" /><div><span v-text="weather"></span><span v-text="temperature" class="temperature"></span><span v-text="city"></span></div></div><div class="dv-box-border"><dv-border-box-13 v-if="type == 'normal'" :color="borderColor" :backgroundColor="backColor"></dv-border-box-13><dv-border-box-12 v-if="type == 'rect-horn'" :color="borderColor" :backgroundColor="backColor"></dv-border-box-12><dv-border-box-10 v-if="type == 'rect-horn-big'" :color="borderColor" :backgroundColor="backColor"></dv-border-box-10><dv-border-box-8 v-if="type == 'rotate'" :color="borderColor" :backgroundColor="backColor"></dv-border-box-8><dv-border-box-9 v-if="type == 'rect'" :color="borderColor" :backgroundColor="backColor"></dv-border-box-9><dv-border-box-7 v-if="type == 'shadow'" :color="borderColor" :backgroundColor="backColor"></dv-border-box-7><dv-border-box-2 v-if="type == 'rect-solid'" :color="borderColor" :backgroundColor="backColor"></dv-border-box-2></div></div>
</template>
<script>
import { ref, onMounted } from "vue";
/*** 获取指定的cookie值* @param {string} name 要查询的Cookie字段名*/
function getCookie(name) {var arr,reg = new RegExp("(^| )" + name + "=([^;]*)(;|$)");if ((arr = document.cookie.match(reg))) return decodeURIComponent(arr[2]);else return "";
}
/*** 删除指定的cookie值* @param {string} name 要删除的Cookie字段名*/
function removeCookie(name) {let date = new Date();date.setTime(date.getTime() - 1);document.cookie = name + "=''" + "; expires=" + date.toUTCString();
}
/*** 格式化日期字符串* @param {string} 日期字符串 2021-04-10或可以转换为日期的其他格式* @param {object} 配置项:hasTime-是否带有时间 datelabel-日期分隔符 timelabel-时间分隔符 separator-日期与时间的分隔符*/
function dateFormatter(date, options) {options = options ? options : {};options.datelabel = options.datelabel ? options.datelabel : "-"; //日期分隔符options.timelabel = options.timelabel ? options.timelabel : ":"; //时间分隔符options.separator = options.separator ? options.separator : " "; //日期时间分隔符options.hasTime = options.hasTime ? options.hasTime : false; //返回值是否带时间options.hasWeek = options.hasWeek ? options.hasWeek : false; //返回值是否带星期options.hasTimeUnit = options.hasTimeUnit ? options.hasTimeUnit : false; //是否使用时间单位options.hasDateUnit = options.hasDateUnit ? options.hasDateUnit : false; //是否使用日期单位//是否返回格式化后的数组 若为true,则返回值为一个对象,formatter为自定义格式,array为格式化后的字符串信息options.hasArray = options.hasArray ? options.hasArray : false;let d = new Date(date);let year = d.getFullYear();let month = d.getMonth() + 1 < 10 ? "0" + (d.getMonth() + 1) : d.getMonth() + 1;let day = d.getDate() < 10 ? "0" + d.getDate() : d.getDate();let hours = d.getHours() < 10 ? "0" + d.getHours() : d.getHours();let minute = d.getMinutes() < 10 ? "0" + d.getMinutes() : d.getMinutes();let second = d.getSeconds() < 10 ? "0" + d.getSeconds() : d.getSeconds();let formatterArray = [];let formatter = "";if (options.hasDateUnit == true) {formatter = year + "年" + month + "月" + day + "日";} else {formatter = year + options.datelabel + month + options.datelabel + day;}formatterArray.push(formatter);if (options.hasTime == true && options.hasTimeUnit == false) {formatter += options.separator + hours + options.timelabel + minute + options.timelabel + second;formatterArray.push(hours + options.timelabel + minute + options.timelabel + second);} else if (options.hasTime == true && options.hasTimeUnit == true) {formatter += options.separator + hours + "时" + minute + "分" + second + "秒";formatterArray.push(hours + "时" + minute + "分" + second + "秒");} else if (options.hasTime == false && options.hasTimeUnit == false) {formatterArray.push(hours + options.timelabel + minute + options.timelabel + second);} else if (options.hasTime == false && options.hasTimeUnit == true) {formatterArray.push(hours + "时" + minute + "分" + second + "秒");}let weekList = ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"];if (options.hasWeek == true) {formatter += " " + weekList[d.getDay()];formatterArray.push(weekList[d.getDay()]);} else {formatterArray.push(weekList[d.getDay()]);}if (options.hasArray == true) {return {formatter: formatter,array: formatterArray,};}return formatter;
}
export default {name: "weatherView",setup(prop, ctx) {let time = ref("");let date = ref("");let weather = ref("");let temperature = ref("");let city = ref("");let icon = ref("");let getDateTime = () => {let d = dateFormatter(new Date(), { hasArray: true });time.value = d.array[1];date.value = d.array[0] + " " + d.array[2];};let setWeather = (data) => {city.value = data.city;weather.value = data.weather;temperature.value = data.temperature + "℃";icon.value = "./images/weather/" + data.weather + ".svg";};let getWeather = () => {let xhr = new XMLHttpRequest();// 个人key(每天30W次,每秒200并发): 8bed5b0020bc38b52cfa6166a7babffexhr.open("get", "http://restapi.amap.com/v3/weather/weatherInfo?city=230100&key=此处填写自己的高德天气接口的key值");xhr.onload = (e) => {if (e.target.readyState == 4) {let res = JSON.parse(e.target.responseText);if (res.infocode === "10000") {res = res.lives[0];setWeather(res);let info = {city: res.city,weather: res.weather,temperature: res.temperature,};let delay = new Date();delay.setHours(delay.getHours() + 1);document.cookie = "_dv_gdweather=" + JSON.stringify(info) + "; expires=" + delay.toUTCString();} else {console.log("weather_error:", "infocode is " + res.infocode + "!");}}};xhr.send();};onMounted(() => {getDateTime();let _dv_gdweather = getCookie("_dv_gdweather");if (!_dv_gdweather) {getWeather();} else {setWeather(JSON.parse(_dv_gdweather));}// 动态设置时间-每秒变化setInterval(() => {getDateTime();}, 1000);// 动态设置天气-每小时setInterval(() => {getWeather();}, 1000 * 60 * 60 + 1);});return {icon,time,date,weather,city,temperature,};},props: {type: {type: String,default: "normal",},width: {type: String,default: "100%",},height: {type: String,default: "100%",},borderColor: {type: Array,default: () => {// return ["#295B6B", "#3C538F"];return ["#295B6B"];},},backColor: {type: String,default: "transparent",},},
};
</script>
<style lang="scss" scoped>
$font: 0.18rem;
.dv-component-weather {font-size: $font;// color: #fff;color: rgb(188, 239, 243);position: relative;display: flex;align-items: center;justify-content: space-between;padding: 0.15rem;box-sizing: border-box;.dv-box-border {position: absolute;width: 100%;height: 100%;top: 0;left: 0;z-index: 1;}.dv-time {// font-size: #{$font * 1.2};display: flex;flex-direction: column;align-items: center;justify-content: center;height: 100%;width: 53%;white-space: nowrap;position: relative;z-index: 2;span {&:first-child {font-size: #{$font * 1.8};}&:last-child {font-size: #{$font * 1};}}}.dv-weather {height: 100%;width: 47%;display: flex;align-items: center;justify-content: space-between;font-size: #{$font * 0.8};position: relative;z-index: 2;img {width: 0.7rem;height: 0.7rem;}div {flex: 1;display: flex;flex-direction: column;justify-content: flex-start;align-items: flex-start;span {margin-bottom: 0.05rem;&:first-child {font-size: #{$font * 0.7};}&:last-child {font-size: #{$font * 0.7};margin: 0;}}}}
}
</style>

http://www.ppmy.cn/server/134084.html

相关文章

nnUnet 大模型学习笔记(续):训练网络(3d_fullres)以及数据集标签的处理

目录 1. 数据集处理 1.1 实现脚本 1.2 json文件 2. 设置读取路径 2.1 设置路径 2.2 数据集转换 2.3 数据集预处理 2.4 训练&#xff08;3d_fullres) 3. 训练结果展示 关于nnUnet 数据集的处理和环境搭建&#xff0c;参考上文&#xff1a;第四章&#xff1a;nnUnet大模…

鸿蒙--页面跳转

效果 前言 基于Stage模型下的UIAbility开发,实现UIAbility内页面间的跳转和数据传递。 页面路由:提供通过不同的url访问不同的页面,包括跳转到应用内的指定页面、用应用内的某个页面替换当前页面、返回上一页面或指定的页面等 结构 ├──entry/src/main/ets // ArkTS代码…

Nodes 节点

Goto Tree List 树列表 Nodes 节点 Tree List 节点是组织成树状层次结构的数据行。 Add New Nodes 添加新节点 如果 Tree List 具有数据源&#xff0c;则会自动生成节点&#xff08;TreeListNode 类对象&#xff09;。要在未绑定模式下添加节点&#xff0c;请调用“树列表设…

WSL2 Linux子系统调整存储位置

WSL2 默认不支持修改Linux 安装路径&#xff0c;官方提供的方式&#xff0c;只有通过导出、导入的方式实现Linux子系统的迁移。 修改注册表的方式官方不推荐&#xff0c;没有尝试过&#xff0c;仅提供操作方式(自行评估风险&#xff0c;建议备份好数据) 1. 打开 **注册表编辑器…

多IP连接

一.关闭防火墙 systemctl stop firewalld setenforce 0 二.挂在mnt mount /dev/sr0 /mnt 三.下载nginx dnf install nginx -y 四.启动nginx协议 systemctl start nginx 五.修改协议 vim /etc/nginx/nginx.conf 在root前加#并且下一行添加 root /www:&#xff08;浏…

多个样式相同的表格内容合并,将多个excel表相同坐标位置的内容追加到一个excel表的单元格里

第一步&#xff1a;先将Excel文件合并 合并之后出现多个Sheet页 第二步&#xff1a;点击开发工具&#xff0c;VB编辑器 第三步&#xff1a;写VB代码 Sub CombineCells()Dim ws As WorksheetDim targetWs As WorksheetDim i As Integer, j As IntegerSet targetWs ThisWorkb…

滚雪球学Redis[5.2讲]:Redis持久化优化深度解析:RDB与AOF的策略选择与实践

全文目录&#xff1a; &#x1f6a6;前言&#x1f4e6;5.2 Redis的持久化优化⚙️5.2.1 Redis持久化的背景与重要性&#x1f527;5.2.2 RDB与AOF的优化策略&#x1f4a1;RDB持久化优化建议&#x1f4a1;AOF持久化优化建议 &#x1f504;5.2.3 磁盘I/O性能的影响与优化&#x1f…

面试感想以及个人规划

昨天和一位面试官的交流让我受益匪浅&#xff0c;他的见解非常实用&#xff0c;尤其是关于如何准备面试和提升技术能力的建议。 首先&#xff0c;他强调面试过程其实是一个引领面试官的过程。当你能够引导面试官走向一个他难以继续提出问题的阶段时&#xff0c;面试就可以顺利…