Files
td_official/src/views/gisHome/index.vue

293 lines
7.5 KiB
Vue
Raw Normal View History

2025-05-21 11:24:53 +08:00
<template>
<div class="h100vh w100vw">
<div class="header flex items-center justify-between">
<div class="productionday flex items-center">
<img src="@/assets/images/projectLogo.png" alt="" />
<div class="flex items-center">
<!-- <img src="@/assets/images/projectday.png" alt="" /> -->
<div class="days">安全生产天数</div>
<div class="num">{{ safetyDay }}</div>
<div class="unit"></div>
<!-- <img src="@/assets/images/days.png" alt="" /> -->
</div>
</div>
<div class="title">XXX智慧工地管理平台</div>
<div class="calendar flex items-center">
<WeatherListScroll :items="weatherData" class="weatherList" :interval="3500" v-if="weatherData.length">
<template #default="{ item, index }">
<div class="flex items-center">
<div class="Weather text-white flex items-center">
<img :src="`../../../src/assets/images/${weatherimgUrl(item)}.png`" alt="" />
<div>
<div class="textBlack">{{ item.dayStatus + ' ' }}&nbsp;</div>
<div class="robotocondensed">{{ item.tempMin }}°/{{ item.tempMax }}°</div>
</div>
</div>
<div class="weeks">
<span class="textBlack">{{ item.week }}&nbsp;(</span>
<span class="robotocondensed">{{ item.date }}</span>
<span class="textBlack">)</span>
</div>
</div>
</template>
</WeatherListScroll>
<div class="Segmentation">
<div class="bg-#43E2CB"></div>
<div class="bg-#43E2CB"></div>
</div>
<div class="goHome flex items-center cursor-pointer" @click="goHome">
<img src="@/assets/images/setting.png" alt="" />
<div>管理系统</div>
</div>
</div>
</div>
<div class="content">
<Map></Map>
<leftMain></leftMain>
<RightMain></RightMain>
<Carousel></Carousel>
<div class="topShaow"></div>
<div class="bottomShaow"></div>
<div class="leftShaow"></div>
<div class="rightShaow"></div>
</div>
</div>
</template>
<script lang="ts" setup>
import router from '@/router';
//底部轮播
import Carousel from './component/carousel.vue';
//左侧
import LeftMain from './component/leftMain.vue';
//地图
import Map from './component/map.vue';
//右侧
import RightMain from './component/rightMain.vue';
//天气
import WeatherListScroll from './component/weatherListScroll.vue';
import { getSafetyDay, getweatherList } from '@/api/gis';
import { useUserStoreHook } from '@/store/modules/user';
const userStore = useUserStoreHook();
const currentProject = computed(() => userStore.selectedProject);
const weatherData = ref([]);
const safetyDay = ref(null);
const goHome = () => {
let routeUrl = router.resolve({
path: '/index'
});
window.open(routeUrl.href, 'index');
};
//获取天气
const getweatherData = async () => {
2025-08-14 01:58:00 +08:00
const res = await getweatherList(currentProject.value?.id);
2025-05-21 11:24:53 +08:00
weatherData.value = res.data;
};
//获取生产天数
const getProductionDays = async () => {
2025-08-14 01:58:00 +08:00
const res = await getSafetyDay(currentProject.value?.id);
2025-05-21 11:24:53 +08:00
safetyDay.value = res.data.safetyDay.toLocaleString();
};
//获取白天或夜晚
const weatherimgUrl = computed(() => (item) => {
let startTime = item.sunRise; // 开始时间
let endTime = item.sunSet; // 结束时间
// 获取当前时间
const now = new Date();
// 解析开始时间和结束时间格式HH:MM
const [startHours, startMinutes] = startTime.split(':').map(Number);
const [endHours, endMinutes] = endTime.split(':').map(Number);
// 创建今天的开始时间和结束时间对象
const start = new Date(now.getFullYear(), now.getMonth(), now.getDate(), startHours, startMinutes);
const end = new Date(now.getFullYear(), now.getMonth(), now.getDate(), endHours, endMinutes);
// 如果结束时间早于开始时间,将结束时间设为明天
if (end <= start) {
end.setDate(end.getDate() + 1);
}
// 判断当前时间是否在区间内
if (now >= start && now <= end) {
return item.dayIcon;
} else {
return item.nightIcon;
}
});
onMounted(() => {
getweatherData();
getProductionDays();
});
</script>
<style lang="scss" scoped>
@import './css/gis.scss';
.header {
background-image: url('@/assets/images/header.png');
height: vh(92.58);
padding: 0 vw(20);
width: vw(1920);
background-repeat: no-repeat;
background-size: 100% 100%;
position: relative;
z-index: 2;
}
.leftShaow {
position: absolute;
left: 0px;
top: 0;
width: vw(548);
height: 100vh;
opacity: 1;
background: linear-gradient(90deg, rgba(0, 0, 0, 0.9) 0%, rgba(0, 0, 0, 0.39) 77.51%, rgba(0, 0, 0, 0.2) 92.05%, rgba(0, 0, 0, 0) 100%);
}
.bottomShaow {
position: absolute;
right: 0px;
bottom: 0;
height: vh(158);
width: 100vw;
opacity: 1;
background: linear-gradient(0deg, rgba(8, 14, 15, 1) 0%, rgba(8, 14, 15, 0.4) 60.42%, rgba(8, 14, 15, 0) 100%);
}
.rightShaow {
position: absolute;
right: 0px;
top: 0;
width: vw(515);
height: 100vh;
opacity: 1;
background: linear-gradient(270deg, rgba(0, 0, 0, 0.9) 0%, rgba(0, 0, 0, 0.39) 77.51%, rgba(0, 0, 0, 0.2) 92.05%, rgba(0, 0, 0, 0) 100%);
}
.topShaow {
position: absolute;
left: 0px;
top: 0;
width: 100vw;
height: vh(131);
opacity: 1;
background: linear-gradient(180deg, rgba(0, 0, 0, 0.8) 0%, rgba(1, 26, 33, 0) 100%);
}
.calendar {
padding-top: vh(14);
font-size: vw(16);
.Weather {
margin-right: vw(20);
> div {
min-width: vw(88);
display: flex;
align-items: center;
flex-wrap: nowrap;
max-width: vw(174);
}
img {
width: vw(50);
}
}
.Segmentation {
margin: 0 vw(20);
> div {
width: vw(3);
height: vh(10);
&:first-child {
margin-bottom: vw(4);
}
}
}
}
.title {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
margin: auto;
width: vw(579);
height: vh(92.58);
line-height: vh(92.58);
text-align: center;
font-family: 'DOUYUFont';
color: rgba(255, 255, 255, 1);
font-size: vw(32);
}
.productionday {
height: vh(48);
img:first-child {
margin-right: vw(8);
}
> div {
height: vh(39);
div {
height: 100%;
line-height: vh(48);
vertical-align: bottom;
}
.unit {
font-family: '思源黑体';
text-shadow: 0px 1.24px 6.21px rgba(25, 179, 250, 1);
font-size: vw(14);
color: rgba(255, 255, 255, 1);
}
.num {
font-family: 'Roboto';
font-size: vw(28);
font-weight: 700;
max-width: vw(73);
color: rgba(255, 255, 255, 1);
text-shadow: 0px 1.24px 6.21px rgba(25, 179, 250, 1);
padding-bottom: vh(40);
margin-right: vw(5);
}
.days {
font-family: '思源黑体';
font-size: vw(16);
color: rgba(255, 255, 255, 1);
}
}
}
.goHome {
height: vh(23);
width: vw(112);
color: rgba(217, 231, 255, 1);
font-family: 'DOUYUFont';
font-size: vw(16);
img {
width: vw(20);
margin-right: vw(8);
}
div {
line-height: vh(23);
padding-top: vh(7);
}
}
.content {
}
.robotocondensed {
font-weight: 700;
letter-spacing: 0;
color: rgba(230, 247, 255, 1);
text-align: right;
font-family: 'Roboto Condensed';
}
.textBlack {
letter-spacing: 0;
line-height: vw(23.17);
color: rgba(230, 247, 255, 1);
font-family: '思源黑体';
width: auto;
max-width: vw(174);
white-space: nowrap;
}
</style>