From d16d04d80e42802e9caaacee9617159921e18b93 Mon Sep 17 00:00:00 2001 From: web <candymxq888@outlook.com> Date: 星期六, 07 六月 2025 16:14:33 +0800 Subject: [PATCH] fix:监控添加定时器获取数据 --- src/views/screen/flow/graphic/index.vue | 186 +++++++++++++++++++++++++++++++--------------- 1 files changed, 125 insertions(+), 61 deletions(-) diff --git a/src/views/screen/flow/graphic/index.vue b/src/views/screen/flow/graphic/index.vue index e3d6668..b8859bb 100644 --- a/src/views/screen/flow/graphic/index.vue +++ b/src/views/screen/flow/graphic/index.vue @@ -1,11 +1,11 @@ <script setup> -import {onMounted, ref, onUnmounted} from "vue"; +import {onMounted, ref} from "vue"; import {getUserType} from '@/utils/auth.js' import {getFlowPointList} from '@/api/screen/index' import {getFlowVideoData} from '@/api/screen/graphic/index.js' -import EZUIKit from 'ezuikit-js'; import {useRoute, useRouter} from "vue-router"; -import FullScreenVideo from "./components/FullScreenVideo.vue"; +import VideoPlayer from "@/components/VideoPlayer/VideoPlayer.vue"; +import html2canvas from 'html2canvas'; const route = useRoute(); const router = useRouter(); @@ -14,26 +14,34 @@ const userType = ref(getUserType()) const searchVal = ref('') const playerData = ref([]) -const hasFullScreen = ref(false) +const showFullScreen = ref(false) const fullIndex = ref() -let ezKitList = []; //视频组件实例数组 -let ezKitId = []; //视频盒子id数组 -let timer = null; +let timer = null // 全屏弹窗 const handleFullScreen = (index) => { - fullIndex.value = index; - hasFullScreen.value = true; + fullIndex.value = index + showFullScreen.value = true } - -// 关闭全屏弹窗 const closeFullScreen = () => { - hasFullScreen.value = false; + showFullScreen.value = false } // 抓拍 -const handleSnap = (index) => { - ezKitList[index].capturePicture(`capture-${new Date().getTime()}`, 0.8); +const handleSnap = async (index) => { + const dom = document.getElementById(`player${index}`) + const canvas = await html2canvas(dom, { + backgroundColor: null, // 透明背景 + scale: 2, // 提高分辨率 + logging: false, // 关闭日志 + useCORS: true, // 允许跨域图片 + allowTaint: true, // 允许污染图片 + }); + const imgUrl = canvas.toDataURL('image/png'); + const adom = document.createElement("a"); + adom.download = `截图_${new Date().getTime()}.png` + adom.href = imgUrl; + adom.click() } // 获取监控点菜单 @@ -45,44 +53,26 @@ // 选择菜单 const handleSelect = (id) => { - ezKitList = [] - ezKitId = [] playerData.value = [] - clearInterval(timer) getPlayerList(id) } // 搜索 const handleSearch = () => { - ezKitList = [] - ezKitId = [] playerData.value = [] - clearInterval(timer) getPlayerList() } // 获取监控点 const getPlayerList = async (id) => { getFlowVideoData({pointId: id, pointName: searchVal.value}).then(async res => { - res.data.forEach((item, index) => { - ezKitId[index] = `ezuikitPlayer${index}` - }) playerData.value = res.data - await nextTick() - - // 渲染视频 - res.data.forEach((item, index) => { - ezKitList[index] = new EZUIKit.EZUIKitPlayer({ - id: ezKitId[index], - url: item.url, - accessToken: item.accessToken, - }) - }) }) - // 挂载定时器, 只获取数据,不重新渲染视频节点 + if(timer) clearTimeout(timer) + timer = setInterval(() => { - getFlowVideoData({pointId: id, pointName: searchVal.value}).then(res => { + getFlowVideoData({pointId: id, pointName: searchVal.value}).then(async res => { playerData.value = res.data }) }, 10000) @@ -92,16 +82,6 @@ onMounted(() => { getMoitorList() getPlayerList(route.params.id || '') -}) - -onUnmounted(() => { - if (timer) { - clearInterval(timer) - } - // 停止播放 - ezKitList?.forEach(item => { - item.stop(); - }) }) </script> @@ -149,7 +129,9 @@ <div class="monitor-list"> <div class="item" v-for="(item, index) in playerData" :key="index"> <div class="title">{{ item.pointName }}</div> - <div class="videoBox" :id="ezKitId[index]"></div> + <div class="item-video" :id="`player${index}`"> + <VideoPlayer :item="item" :autoPlay="true" /> + </div> <div class="info"> <div class="info-list"> <div class="info-item"> @@ -157,24 +139,32 @@ <div class="val"><span>{{ item.waterLevel }}</span>m</div> </div> <div class="info-item"> - <div class="name">流速:</div> + <div class="name">表面流速:</div> <div class="val"><span>{{ item.flowVelocity }}</span>m/s</div> - </div> - <div class="info-item"> - <div class="name">瞬时流量:</div> - <div class="val"><span>{{ item.newFlow }}</span>m³/h</div> - </div> - <div class="info-item"> - <div class="name">累计流量:</div> - <div class="val"><span>{{ item.totalFlow }}</span>m³</div> </div> <div class="info-item"> <div class="name">水面宽度:</div> <div class="val"><span>{{ item.waterWidth }}</span>m</div> </div> <div class="info-item"> + <div class="name">平均流速:</div> + <div class="val"><span>{{ item.avgVelocity }}</span>m/s</div> + </div> + <div class="info-item"> <div class="name">过水面积:</div> <div class="val"><span>{{ item.waterArea }}</span>m³</div> + </div> + <div class="info-item"> + <div class="name">雷达流速:</div> + <div class="val"><span>{{ item.radarVelocity }}</span>m/s</div> + </div> + <div class="info-item"> + <div class="name">实时流量:</div> + <div class="val"><span>{{ item.newFlow }}</span>m³/h</div> + </div> + <div class="info-item"> + <div class="name">起点距:</div> + <div class="val"><span>{{ item.radarDistance }}</span>m</div> </div> </div> <div class="info-btn"> @@ -189,11 +179,47 @@ </div> </div> </div> - <FullScreenVideo - v-if="hasFullScreen" - :data="playerData[fullIndex]" - @close="closeFullScreen" - /> + + <div class="fullDialog" v-if="showFullScreen"> + <VideoPlayer :item="playerData[fullIndex]" :autoPlay="true" /> + <div class="closeIcon" @click="closeFullScreen"><el-icon><CircleClose /></el-icon></div> + <div class="full-mask"> + <div class="mask-list"> + <div class="mask-item"> + <div class="name">水位:</div> + <div class="val"><span>{{ playerData[fullIndex].waterLevel }}</span>m</div> + </div> + <div class="mask-item"> + <div class="name">表面流速:</div> + <div class="val"><span>{{ playerData[fullIndex].flowVelocity }}</span>m/s</div> + </div> + <div class="mask-item"> + <div class="name">水面宽度:</div> + <div class="val"><span>{{ playerData[fullIndex].waterWidth }}</span>m</div> + </div> + <div class="mask-item"> + <div class="name">平均流速:</div> + <div class="val"><span>{{ playerData[fullIndex].avgVelocity }}</span>m/s</div> + </div> + <div class="mask-item"> + <div class="name">过水面积:</div> + <div class="val"><span>{{ playerData[fullIndex].waterArea }}</span>m³</div> + </div> + <div class="mask-item"> + <div class="name">雷达流速:</div> + <div class="val"><span>{{ playerData[fullIndex].radarVelocity }}</span>m/s</div> + </div> + <div class="mask-item"> + <div class="name">实时流量:</div> + <div class="val"><span>{{ playerData[fullIndex].newFlow }}</span>m³/h</div> + </div> + <div class="mask-item"> + <div class="name">起点距:</div> + <div class="val"><span>{{ playerData[fullIndex].radarDistance }}</span>m</div> + </div> + </div> + </div> + </div> </div> </template> @@ -293,7 +319,7 @@ color: #fff; } - .videoBox { + .item-video { width: 100%; height: 60%; background-color: #000; @@ -367,5 +393,43 @@ } } } + + .fullDialog{ + position: fixed; + left: 0; + top: 0; + z-index: 200; + width: 100%; + height: 100%; + background-color: #000; + .closeIcon{ + position: absolute; + right: 20px; + top: 20px; + color: #fff; + font-size: 36px; + } + .full-mask{ + position: absolute; + left: 100px; + bottom: 100px; + width: 250px; + height: 270px; + background-color: rgba(0, 0, 0, 0.5); + border-radius: 20px; + .mask-list{ + padding: 10px 20px; + .mask-item{ + display: flex; + align-items: center; + color: #fff; + padding: 5px 0; + .name{ + width: 50%; + } + } + } + } + } } </style> \ No newline at end of file -- Gitblit v1.9.3