From 6acd20f3f37e988488b681a1a394b37a32f3ffe6 Mon Sep 17 00:00:00 2001 From: web <candymxq888@outlook.com> Date: 星期一, 07 四月 2025 16:17:41 +0800 Subject: [PATCH] feat:添加大屏页面 --- src/assets/images_lc/info-bg.png | 0 src/assets/images/screen/btnbg-active.png | 0 src/components/VideoPlayer/VideoPlayer.vue | 137 +++++ src/assets/images/screen/head.png | 0 src/assets/images/screen/content_bg.png | 0 src/utils/tool.js | 15 src/assets/images_lc/warnRecord.png | 0 src/assets/images_lc/switch.png | 0 src/api/screen/home/index.js | 0 src/assets/images/screen/userImg.png | 0 src/assets/images_lc/map.png | 0 src/assets/images_lc/title_font.png | 0 src/api/facility/video.js | 36 + index.html | 2 src/views/screen/pumpInfo/index.vue | 222 ++++++++ src/assets/images_lc/realTimeMonitoring.png | 0 src/assets/images/screen/loginOut.png | 0 src/assets/images_lc/point-message.png | 0 src/assets/images/screen/btnbg.png | 0 src/router/index.js | 24 src/views/screen/home/index.vue | 739 ++++++++++++++++++++++++----- .env.development | 4 /dev/null | 13 src/assets/images/screen/homeIcon.png | 0 src/views/login.vue | 2 src/screen/index.vue | 269 ++++++++- package.json | 8 src/assets/images_lc/a-point.png | 0 .env.production | 2 29 files changed, 1,260 insertions(+), 213 deletions(-) diff --git a/.env.development b/.env.development index c742c27..57c3001 100644 --- a/.env.development +++ b/.env.development @@ -8,8 +8,8 @@ # 图片地址 VITE_APP_IMG_BASEURL='http://192.168.0.200:8036/upload' -# 金川接口 +# 南京接口 # VITE_APP_PUBLIC_REQUEST_API = 'http://113.250.189.120:8030' # VITE_APP_PUBLIC_REQUEST_API = 'http://113.250.189.120:8036' #后端本地 - VITE_APP_PUBLIC_REQUEST_API = 'http://192.168.0.200:8036' + VITE_APP_PUBLIC_REQUEST_API = 'http://192.168.0.200:8036' diff --git a/.env.production b/.env.production index 51e2488..97124c1 100644 --- a/.env.production +++ b/.env.production @@ -8,7 +8,7 @@ # 图片地址 VITE_APP_IMG_BASEURL = 'http://113.250.189.120:8036/upload' -# 金川管理系统/开发环境 +# 南京管理系统/开发环境 VITE_APP_PUBLIC_REQUEST_API = 'http://113.250.189.120:8036' # 是否在打包时开启压缩,支持 gzip 和 brotli VITE_BUILD_COMPRESS = gzip diff --git a/index.html b/index.html index 8fb942e..7e01918 100644 --- a/index.html +++ b/index.html @@ -7,7 +7,7 @@ <meta name="renderer" content="webkit"> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="icon" href="/favicon.ico"> - <title>金川水电站生态流量监测系统</title> + <title>南京康尼地铁泵站监测服务系统</title> <!--[if lt IE 11]><script>window.location.href='/html/ie.html';</script><![endif]--> <style> diff --git a/package.json b/package.json index ef6f721..01f0b8a 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { - "name": "jc-hydropower-station-web", - "version": "3.8.7", - "description": "金川水电站生态流量监测系统", - "author": "金川项目", + "name": "nanjing-station-web", + "version": "1.0.0", + "description": "南京康尼地铁泵站监测服务系统", + "author": "", "license": "MIT", "type": "module", "scripts": { diff --git a/src/api/facility/video.js b/src/api/facility/video.js new file mode 100644 index 0000000..790906a --- /dev/null +++ b/src/api/facility/video.js @@ -0,0 +1,36 @@ +import { publicRequest } from '@/utils/request' + +// 根据小区id获取监控点 +export const getVideoList = (params) => { + return publicRequest({ + url: '/monitorVideoStreaming/getAllByPoint', + method: 'get', + params + }) +} + +// 开始视频点播 +export const getVideoMedia = (deviceId, channelId) => { + return publicRequest({ + url: `/monitorVideoStreaming/play/${deviceId}/${channelId}`, + method: 'get', + }) +} + + +// 视频停止点播 +export const stopVideoMedia = (deviceId, channelId) => { + return publicRequest({ + url: `/monitorVideoStreaming/stop/${deviceId}/${channelId}`, + method: 'get', + }) +} + + +// 继续点播 +export const renewVideoMedia = (deviceId, channelId) => { + return publicRequest({ + url: `/monitorVideoStreaming/updateEndTime/${deviceId}/${channelId}`, + method: 'get', + }) +} \ No newline at end of file diff --git a/src/api/screen/home/index.js b/src/api/screen/home/index.js new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/src/api/screen/home/index.js diff --git a/src/assets/images/screen/btnbg-active.png b/src/assets/images/screen/btnbg-active.png new file mode 100644 index 0000000..7221d38 --- /dev/null +++ b/src/assets/images/screen/btnbg-active.png Binary files differ diff --git a/src/assets/images/screen/btnbg.png b/src/assets/images/screen/btnbg.png new file mode 100644 index 0000000..0f38a44 --- /dev/null +++ b/src/assets/images/screen/btnbg.png Binary files differ diff --git a/src/assets/images/screen/content_bg.png b/src/assets/images/screen/content_bg.png new file mode 100644 index 0000000..96b7f87 --- /dev/null +++ b/src/assets/images/screen/content_bg.png Binary files differ diff --git a/src/assets/images/screen/head.png b/src/assets/images/screen/head.png new file mode 100644 index 0000000..abfacaf --- /dev/null +++ b/src/assets/images/screen/head.png Binary files differ diff --git a/src/assets/images/screen/homeIcon.png b/src/assets/images/screen/homeIcon.png new file mode 100644 index 0000000..4402448 --- /dev/null +++ b/src/assets/images/screen/homeIcon.png Binary files differ diff --git a/src/assets/images/screen/loginOut.png b/src/assets/images/screen/loginOut.png new file mode 100644 index 0000000..582f66e --- /dev/null +++ b/src/assets/images/screen/loginOut.png Binary files differ diff --git a/src/assets/images/screen/userImg.png b/src/assets/images/screen/userImg.png new file mode 100644 index 0000000..3e8ed9c --- /dev/null +++ b/src/assets/images/screen/userImg.png Binary files differ diff --git a/src/assets/images_lc/a-point.png b/src/assets/images_lc/a-point.png new file mode 100644 index 0000000..a3c5e6d --- /dev/null +++ b/src/assets/images_lc/a-point.png Binary files differ diff --git a/src/assets/images_lc/info-bg.png b/src/assets/images_lc/info-bg.png new file mode 100644 index 0000000..042190c --- /dev/null +++ b/src/assets/images_lc/info-bg.png Binary files differ diff --git a/src/assets/images_lc/map.png b/src/assets/images_lc/map.png new file mode 100644 index 0000000..8dfe74f --- /dev/null +++ b/src/assets/images_lc/map.png Binary files differ diff --git a/src/assets/images_lc/point-message.png b/src/assets/images_lc/point-message.png new file mode 100644 index 0000000..baa6890 --- /dev/null +++ b/src/assets/images_lc/point-message.png Binary files differ diff --git a/src/assets/images_lc/realTimeMonitoring.png b/src/assets/images_lc/realTimeMonitoring.png new file mode 100644 index 0000000..c4846db --- /dev/null +++ b/src/assets/images_lc/realTimeMonitoring.png Binary files differ diff --git a/src/assets/images_lc/switch.png b/src/assets/images_lc/switch.png new file mode 100644 index 0000000..6f7d6a1 --- /dev/null +++ b/src/assets/images_lc/switch.png Binary files differ diff --git a/src/assets/images_lc/title_font.png b/src/assets/images_lc/title_font.png new file mode 100644 index 0000000..68848c1 --- /dev/null +++ b/src/assets/images_lc/title_font.png Binary files differ diff --git a/src/assets/images_lc/warnRecord.png b/src/assets/images_lc/warnRecord.png new file mode 100644 index 0000000..941874e --- /dev/null +++ b/src/assets/images_lc/warnRecord.png Binary files differ diff --git a/src/components/VideoPlayer/VideoPlayer.vue b/src/components/VideoPlayer/VideoPlayer.vue new file mode 100644 index 0000000..1808b87 --- /dev/null +++ b/src/components/VideoPlayer/VideoPlayer.vue @@ -0,0 +1,137 @@ +<template> + <div class="videoBox" @mouseenter="handleEnter" @mouseleave="handleLeave"> + <div class="video" ref="videoRef" style="width: 100%; height: 100%"></div> + <div class="playerBtn"> + <el-icon class="icon" v-if="showPlay" @click="handlePlayer"><VideoPlay /></el-icon> + <el-icon class="icon" v-if="showPause" @click="hanlePause"><VideoPause /></el-icon> + <el-icon class="icon is-loading" v-if="showLoading"><Loading /></el-icon> + </div> + </div> +</template> + +<script setup lang="ts"> +import {onMounted, onUnmounted, ref} from 'vue'; +import { getVideoMedia, stopVideoMedia, renewVideoMedia } from '@/api/facility/video'; +import { debounce } from '@/utils/tool'; + +const props = defineProps({ + item: { + type: Object, + default: {} + } +}); + +const videoRef = ref(null); +const videojsb = ref(); +const showPlay = ref(true); +const showPause = ref(false); +const showLoading = ref(false); +let timer = null; + +//通知设备上传媒体流,做节流,防止过度点击 +const handlePlayer = debounce(function() { + showPlay.value = false; + showLoading.value = true; + // 获取播放地址 + getVideoMedia(props.item.deviceId, props.item.channelId).then(res => { + videojsb.value.play(res.data.url); + }).catch(() => { + showPlay.value = true; + }).finally(() => { + showLoading.value = false; + }) + // 挂定时任务,2分钟获取一次直播流数据,防止客户关闭页面,如果2分钟未获取,后端断开链接 + if(timer) clearInterval(timer) + timer = setInterval(() => { + // 调用续时点播 + renewVideoMedia(props.item.deviceId, props.item.channelId) + }, 120000) +}, 2000, true) + +const hanlePause = () => { + showPause.value = false; + showPlay.value = true; + clearInterval(timer) + stopVideoMedia(props.item.deviceId, props.item.channelId).then(() => { + console.log('关闭成功') + }) +} + +const handleEnter = () => { + if(!showPlay.value && !showLoading.value) { + showPause.value = true; + } +} + +const handleLeave = () => { + showPause.value = false; +} + +const init = () => { + videojsb.value = new window.Jessibuca( + Object.assign({ + container: videoRef.value, + isResize: true, + isFullResize: true, + text: '', + videoBuffer: 2, + loadingText: '加载中...', + useMSE: true, + useWCS: true, + autoWasm: true, + // debug: true, + supportDblclickFullscreen: false, + operateBtns: { + fullscreen: true, + play: false, + audio: true, + recorder: false, + }, + controlAutoHide: true, + forceNoOffscreen: true, + isNotMute: false, + heartTimeoutReplay:false, + }) + ); +}; + +onMounted(() => { + init(); +}); + +onUnmounted(() => { + if(videojsb.value) { + videojsb.value.destroy(); + } + if(timer) clearInterval(timer) +}) +</script> + +<style scoped lang="scss"> +.videoBox { + width: 100%; + height: 100%; + position: relative; + .video { + width: 100%; + height: 100%; + background-color: #000; + } + .playerBtn { + width: 4rem; + height: 4rem; + position: absolute; + left: 50%; + top: 50%; + transform: translate(-50%, -50%); + z-index: 100; + .icon { + color: #fff; + font-size: 3rem; + } + } + :deep(.jessibuca-controls) { + background-color: transparent; + } +} +</style> diff --git a/src/router/index.js b/src/router/index.js index 7a108b4..789f331 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -34,7 +34,7 @@ { path: '/', hidden: true, - redirect: '/user' + redirect: '/screen' }, { path: '/login', @@ -65,25 +65,9 @@ component: () => import('@/views/screen/home/index.vue') }, { - path: 'ecology', - component: () => import('@/views/screen/ecology/index.vue') - }, - { - path: 'graphic', - component: () => import('@/views/screen/graphic/index.vue') - }, - { - path: 'shebei', - component: () => import('@/views/screen/shebei/index.vue') - }, - { - path: 'warning', - component: () => import('@/views/screen/warning/index.vue') - }, - { - path: 'report', - component: () => import('@/views/screen/report/index.vue') - }, + path: 'pumpInfo', + component: () => import('@/views/screen/pumpInfo/index.vue') + } ] }, ] diff --git a/src/screen/index.vue b/src/screen/index.vue index d22b064..7651e4b 100644 --- a/src/screen/index.vue +++ b/src/screen/index.vue @@ -1,91 +1,268 @@ <template> <div class="main"> <div class="header"> - <div class="top">大屏 </div> + <div class="top"> + <div class="title">南京康尼地铁泵站监测服务系统</div> + <div class="time"> + <span>{{ nowTime.date }}</span> + <span>{{ nowTime.time }}</span> + </div> + <div class="user-image"> + <div class="home"> + <router-link to="/screen/home"><img src="@/assets/images/screen/homeIcon.png" alt="" /></router-link> + </div> + <div class="loginOut"> + <el-dropdown trigger="click"> + <div class="user"> + <img class="userImg" src="../assets/images/screen/userImg.png" alt=""> + <img class="downIcon" src="../assets/images/screen/loginOut.png" alt=""> + </div> + <template #dropdown> + <el-dropdown-menu> + <el-dropdown-item> + <span @click="toUserDetail" >个人中心</span> + </el-dropdown-item> + <el-dropdown-item divided> + <span @click="loginOut">退出登录</span> + </el-dropdown-item> + </el-dropdown-menu> + </template> + </el-dropdown> + </div> + </div> + </div> <div class="nav"> - <div v-for="(item,index) in btnList" :key="index" @click="navTo(item)" class="plain" :class="item.url === route.path ? 'active' : ''">{{ item.name }}</div> + <div class="nav-content"> + <div class="nav-content-l"> + <div v-for="(item,index) in btnList.slice(0,4)" :key="index" @click="navTo(item)" class="plain" :class="item.url === route.path ? 'active' : ''">{{ item.name }}</div> + </div> + <div class="nav-content-r"> + <div v-for="(item,index) in btnList.slice(4,8)" :key="index" @click="navTo(item)" class="plain" :class="item.url === route.path ? 'active' : ''">{{ item.name }}</div> + </div> + </div> </div> </div> - <div class="content"> - <router-view></router-view> - </div> + <div class="content"><router-view></router-view></div> </div> </template> <script setup> import{ useRouter,useRoute } from 'vue-router' -import useUserStore from '@/store/modules/user.js' -import {onMounted} from "vue"; +import {ElMessageBox} from "element-plus"; +import { removeToken } from '@/utils/auth' -const userStore = useUserStore() const router = useRouter() const route = ref(useRoute()) -const btnList = ref([ - {name:'首页总览',url:'/screen/home'}, - {name:'生态流量',url:'/screen/ecology'}, - {name:'图像监测', url:'/screen/graphic'}, - {name:'设备管理',url:'/screen/shebei'}, - {name:'报警管理',url:'/screen/warning'}, - {name:'报表管理',url:'/screen/report'}, -]) +const loginOut = () =>{ + ElMessageBox.confirm('确定注销并退出系统吗?', '提示', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning' + }).then((e) => { + removeToken() + window.location.reload(); + + }).catch(() => { }); +} + +const toUserDetail = () =>{ + router.push('/userCenter') +} + +const btnList = ref([]) const navTo = (item) =>{ router.push(item.url) } -onMounted(() => { - if(userStore.userType == 1) { - btnList.value.push({name:'系统管理',url:'/user'}) - } -}) +//获取当前时间 +const nowTime = ref({}) +const now = new Date() +const getTime = (now) => { + // 获取年月日时分秒 + const year = now.getFullYear(); + const month = String(now.getMonth() + 1).padStart(2, '0'); // 月份是从0开始的 + const day = String(now.getDate()).padStart(2, '0'); + const hours = String(now.getHours()).padStart(2, '0'); + const minutes = String(now.getMinutes()).padStart(2, '0'); + const seconds = String(now.getSeconds()).padStart(2, '0'); + // 获取星期 + const weekdays = ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"]; + const weekday = weekdays[now.getDay()]; + + // 拼接成指定格式的字符串 + return nowTime.value = { + date:`${year}.${month}.${day} ${weekday}`, + time:`${hours}:${minutes}:${seconds}`, + } +} +getTime(now) +onMounted(()=>{ + setInterval(()=>{ + nowTime.value = getTime(new Date()) + },1000) +}) </script> <style lang="scss" scoped> .main{ + background:rgba(8,28,65,1); + background-size: 100% 100%; width: 100%; height: 100%; .header{ width: 100%; - height: 14%; - background-color: rgb(82, 120, 128); - position: relative; + height: 10%; .top{ - height: 60%; - display: flex; - align-items: center; - justify-content: center; - font-size: 48px; - font-weight: 700; - color: #fff; position: relative; - z-index: 100; + width: 100%; + height: 6.5rem; + background-image: url("../assets/images/screen/head.png"); + background-size: 100% 100%; + background-repeat: no-repeat; + .title{ + width: 57rem; + height: 2rem; + position: absolute; + left:calc(50% - 28.5rem); + text-align: center; + font-size: 1.6rem; + font-weight: 800; + color: #F9FBFF; + line-height: 70px; + text-shadow:0 0 3px rgba(255,255,255,0.7); + } + .time{ + position: absolute; + width: 13rem; + top: 0.5rem; + left: 2rem; + display: flex; + justify-content: space-between; + line-height: 1.6rem; + span{ + font-weight: 400; + color: #83D9F3; + } + span:last-child{ + text-shadow:0 0 2px rgba(255,255,255,0.6); + } + } + .select{ + width: 8rem; + height: 2rem; + position: absolute; + top: 0.1rem; + right: 8rem; + .select-item { + :deep(.el-select__wrapper) { + background: rgba(6, 47, 97, 0.8) !important; + border: solid #14528f 0.125rem; + height: 2rem; + } + :deep(.el-select__placeholder) { + color: #07a4ff; + font-size: 0.75rem; + } + } + } + .user-image{ + position: absolute; + width: 6rem; + height: 2rem; + top: 0.5rem; + right: 2rem; + display: flex; + justify-content: space-between; + align-items: center; + .home{ + img{ + width: 1.3rem; + height: 1.3rem; + } + } + .loginOut{ + .user{ + display: flex; + align-items: center; + .userImg{ + width: 1.3rem; + height: 1.3rem; + margin-right: 0.5rem; + } + .downIcon{ + margin-top: 0.1rem; + width: 0.8rem; + height: 0.6rem; + } + } + } + } + .left-icon{ + position: absolute; + top: 50%; + img{ + width: 28rem; + height: 1.87rem; + } + } + .right-icon{ + position: absolute; + top: 50%; + right: 0; + img{ + width: 28rem; + height: 1.87rem; + transform: scaleX(-1); + } + } } .nav{ - display: flex; - height: 40%; position: relative; z-index: 100; - .plain{ - flex-grow: 1; - height: 100%; + margin-top: -4.5rem; + width: 100%; + display: flex; + justify-content: space-between; + align-items: center; + } + .nav-content{ + width: 100%; + display: flex; + align-items: center; + justify-content: space-between; + font-weight: 400; + font-size: 1.1rem; + color: #FFFFFF; + line-height: 3rem; + &-l{ + width: 35%; display: flex; - align-items: center; - justify-content: center; - border: 1px solid #fff; - background-color: rgba(23, 108, 229, 0.3); - color: #fff; - font-size: 22px; - cursor: pointer; + } + &-r{ + width: 35%; + display: flex; + } + .plain{ + width: 10rem; + height: 3.5rem; + line-height: 3.5rem; + background-image: url("../assets/images/screen/btnbg.png"); + background-size: 100% 100%; + text-align: center; } .active{ - background-color: #91BDDB; + background-image: url("../assets/images/screen/btnbg-active.png"); } } } .content{ width: 100%; - height: 86%; + height: 90%; + background: url("@/assets/images/screen/content_bg.png") no-repeat; + background-size: 100% 100%; + padding: 0 1.5rem 1.5rem; } } </style> \ No newline at end of file diff --git a/src/utils/tool.js b/src/utils/tool.js new file mode 100644 index 0000000..ffc9bc7 --- /dev/null +++ b/src/utils/tool.js @@ -0,0 +1,15 @@ +//防抖(立即执行) +export function debounce(func, wait, immediate) { + let timeout; + return function(...args) { + const context = this; + const later = () => { + timeout = null; + if (!immediate) func.apply(context, args); + }; + const callNow = immediate && !timeout; + clearTimeout(timeout); + timeout = setTimeout(later, wait); + if (callNow) func.apply(context, args); + }; +} \ No newline at end of file diff --git a/src/views/login.vue b/src/views/login.vue index aaea793..c8bc658 100644 --- a/src/views/login.vue +++ b/src/views/login.vue @@ -4,7 +4,7 @@ <div class="contain"> <el-form ref="loginRef" :model="loginForm" :rules="loginRules" class="login-form" @keydown.enter="handleLogin"> - <h3 class="title">金川水电站生态流量监测系统</h3> + <h3 class="title">南京康尼地铁泵站监测服务系统</h3> <el-form-item label="账号" prop="userName"> <el-input style="height: 45px;" diff --git a/src/views/screen/ecology/index.vue b/src/views/screen/ecology/index.vue deleted file mode 100644 index 3939c28..0000000 --- a/src/views/screen/ecology/index.vue +++ /dev/null @@ -1,301 +0,0 @@ -<script setup> -import {onMounted, reactive} from 'vue' -import * as echarts from 'echarts/core'; -import { GridComponent, ToolboxComponent, TooltipComponent, TitleComponent } from 'echarts/components'; -import { LineChart, BarChart } from 'echarts/charts'; -import { UniversalTransition } from 'echarts/features'; -import { CanvasRenderer } from 'echarts/renderers'; - -echarts.use([GridComponent, LineChart, BarChart, CanvasRenderer, UniversalTransition, ToolboxComponent, TooltipComponent, TitleComponent]); - -const state = reactive({ - zhakouVal: 1, - dianzhanVal: 1 -}) -const zkssChartRef = ref(); //扎口瞬时图表 -const zkljChartRef = ref(); //扎口累计图表 -const dzssChartRef = ref(); //电站瞬时图表 -const dzljChartRef = ref(); //电站累计图表 -let zkssCharts = null; -let zkljCharts = null; -let dzssCharts = null; -let dzljCharts = null; - -const selectOption = ref([ - { label: '本年', value: 1 }, - { label: '本季', value: 2 }, - { label: '本月', value: 3 }, - { label: '本周', value: 4 }, - { label: '本日', value: 5 }, -]) - -// 获取折线图配置 -const getLineOption = (data, startColor, endColor) => { - let xdata = []; - let sdata = []; - data.forEach(item => { - xdata.push(item.name) - sdata.push(item.value) - }) - return { - title: { - text: '瞬时流量分析', - textStyle: { - color: '#fff' - }, - padding: [0, 0, 0, 30] - }, - tooltip: { - trigger: 'axis', - }, - grid: { - left: 60, - right: 60, - bottom: 40 - }, - xAxis: { - type: 'category', - boundaryGap: false, - data: xdata, - axisLabel: { - color: '#fff', - } - }, - yAxis: { - type: 'value', - name: 'm³/s', - nameTextStyle: { - color: '#fff', - }, - axisLabel: { - color: '#fff', - } - }, - series: [ - { - data: sdata, - type: 'line', - areaStyle: { - color: { - type: 'linear', - x: 0, - y: 0, - x2: 0, - y2: 1, - colorStops: [{ - offset: 0, color: startColor // 0% 处的颜色 - }, { - offset: 1, color: endColor // 100% 处的颜色 - }], - global: false // 缺省为 false - } - } - } - ] - } -} -// 获取柱状图配置 -const getBarOption = (data, color) => { - let xdata = []; - let sdata = []; - data.forEach(item => { - xdata.push(item.name) - sdata.push(item.value) - }) - return { - title: { - text: '瞬时流量分析', - textStyle: { - color: '#fff' - }, - padding: [0, 0, 0, 30] - }, - tooltip: { - trigger: 'axis', - }, - grid: { - left: 60, - right: 60, - bottom: 40 - }, - xAxis: { - type: 'category', - data: xdata, - axisLabel: { - color: '#fff', - } - }, - yAxis: { - type: 'value', - name: '10⁸m³', - nameTextStyle: { - color: '#fff', - }, - axisLabel: { - color: '#fff', - } - }, - series: [ - { - data: sdata, - type: 'bar', - itemStyle: { - color: color - } - } - ] - } -} - -// 新扎口图表 -const initZkLine = () => { - if(zkssChartRef.value) { - zkssCharts = echarts.init(zkssChartRef.value); - let data = [ - { name: '一月', value: 36 }, - { name: '二月', value: 66 }, - { name: '三月', value: 122 }, - { name: '四月', value: 78 }, - { name: '五月', value: 63 }, - ] - const option = getLineOption(data, 'rgba(94,229,92,1)', 'rgba(94,229,92,0.2)') - zkssCharts.setOption(option) - } -} -const initZkBar = () => { - if(zkljChartRef.value) { - zkljCharts = echarts.init(zkljChartRef.value); - let data = [ - { name: '一月', value: 36 }, - { name: '二月', value: 66 }, - { name: '三月', value: 122 }, - { name: '四月', value: 78 }, - { name: '五月', value: 63 }, - ] - const option = getBarOption(data, 'rgba(94,229,92,1)') - zkljCharts.setOption(option) - } -} - -// 电站图表 -const initDzLine = () => { - if(dzssChartRef.value) { - dzssCharts = echarts.init(dzssChartRef.value); - let data = [ - { name: '一月', value: 36 }, - { name: '二月', value: 66 }, - { name: '三月', value: 122 }, - { name: '四月', value: 78 }, - { name: '五月', value: 63 }, - ] - const option = getLineOption(data, 'rgba(23,108,229,1)', 'rgba(23,108,229,0.2)') - dzssCharts.setOption(option) - } -} -const initDzBar = () => { - if(dzljChartRef.value) { - dzljCharts = echarts.init(dzljChartRef.value); - let data = [ - { name: '一月', value: 36 }, - { name: '二月', value: 66 }, - { name: '三月', value: 122 }, - { name: '四月', value: 78 }, - { name: '五月', value: 63 }, - ] - const option = getBarOption(data, 'rgba(23,108,229,1)') - dzljCharts.setOption(option) - } -} - -const initCharts = () => { - initZkLine() - initZkBar() - initDzLine() - initDzBar() -} - -onMounted(() => { - initCharts() -}) -</script> - -<template> - <div class="ecology"> - <div class="ecology-l item"> - <div class="item-t"> - <div class="title">新扎口流量监测点</div> - <el-select - v-model="state.zhakouVal" - class="m-2" - placeholder="Select" - size="large" - style="width: 250px" - > - <el-option - v-for="item in selectOption" - :key="item.value" - :label="item.label" - :value="item.value" - /> - </el-select> - </div> - <div class="item-chart-ss" ref="zkssChartRef"></div> - <div class="item-chart-lj" ref="zkljChartRef"></div> - </div> - <div class="ecology-r item"> - <div class="item-t"> - <div class="title">水电站流量监测点</div> - <el-select - v-model="state.dianzhanVal" - class="m-2" - placeholder="Select" - size="large" - style="width: 250px" - > - <el-option - v-for="item in selectOption" - :key="item.value" - :label="item.label" - :value="item.value" - /> - </el-select> - </div> - <div class="item-chart-ss" ref="dzssChartRef"></div> - <div class="item-chart-lj" ref="dzljChartRef"></div> - </div> - </div> -</template> - -<style scoped lang="scss"> -.ecology{ - height: 100%; - background: linear-gradient( 180deg, #91BDDB 0%, rgba(145,189,219,0.5) 100%); - display: flex; - justify-content: center; - align-items: center; - gap: 30px; - .item{ - width: 48%; - height: 95%; - background: rgba(23,108,229,0.3); - border: 1px solid #176CE5; - .item-t{ - height: 10%; - padding: 0 30px; - display: flex; - align-items: center; - .title{ - font-size: 36px; - color: #fff; - margin-right: 30px; - } - } - .item-chart-ss{ - height: 45%; - } - .item-chart-lj{ - height: 45% - } - } -} -</style> \ No newline at end of file diff --git a/src/views/screen/graphic/index.vue b/src/views/screen/graphic/index.vue deleted file mode 100644 index 6893c19..0000000 --- a/src/views/screen/graphic/index.vue +++ /dev/null @@ -1,13 +0,0 @@ -<script setup> - -</script> - -<template> - <div> - 图像监测 - </div> -</template> - -<style scoped lang="scss"> - -</style> \ No newline at end of file diff --git a/src/views/screen/home/index.vue b/src/views/screen/home/index.vue index 5d8d975..8e19648 100644 --- a/src/views/screen/home/index.vue +++ b/src/views/screen/home/index.vue @@ -1,146 +1,635 @@ <template> - <div class="home"> - <div class="home-bg"></div> - <div class="home-c"> - <div class="point"> - <div class="point-address"></div> - <div class="point-message"> - <div class="video-box"> - <el-icon><VideoPlay /></el-icon> - </div> - <div class="info-box"> - <div class="info-t">水电站流量监测点</div> - <div class="info-sw">水位:<span>500</span>m</div> - <div class="info-ls">流速:<span>15</span>m/s</div> - <div class="info-ssls">瞬时流速:<span>150</span>m/s</div> - <div class="info-ljll"> - 累计流量: - <el-select - v-model="selectll" - class="m-2" - placeholder="Select" - size="small" - style="width: 240px" - > - <el-option - v-for="(item, idx) in liuliangOptions" - :key="idx" - :label="item.label" - :value="idx" - /> - </el-select> - <span>{{ liuliangOptions[selectll].value }}</span>m/s + <div class="container"> + <div class="left"> + <div class="liuliang"> + <div class="liuliang-title">流量统计</div> + <div class="liuliang-c">流量</div> + </div> + <div class="gongdian"> + <div class="gongdian-title">流量统计</div> + <div class="gongdian-c">流量</div> + </div> + </div> + <div class="center" > + <!-- 地图窗口 --> + <div class="map"> + <div class="point-box" v-if="tucengVal === 0"> + <div class="apoint" v-for="(item, index) in pointList" :key="index" + :style="`left: ${item?.left}%; top: ${item?.top}%`" @click="clickMsgFun(index)"> + <img src="../../../assets/images_lc/a-point.png" alt="" /> + <div class="message" v-show="showMsg === index"> + <div class="message-item"> + <span class="name">泵房名称:</span> + <span class="val">{{item.name}}</span> + </div> + <div class="message-item"> + <span class="name">水浸状态:</span> + <span class="val-status">{{item.shuijin}}</span> + </div> + <div class="message-item"> + <span class="name">运行时长:</span> + <span class="val-status">{{item.longtime}}</span> + </div> + <div class="message-item"> + <span class="name">瞬时流量:</span> + <span class="val-status">{{item.ssll}}</span> + </div> + <div class="message-item"> + <span class="name">累计流量:</span> + <span class="val-status">{{item.ljll}}</span> + </div> + <div class="message-item"> + <span class="name">流速:</span> + <span class="val-status">{{item.ls}}</span> + </div> + <div class="message-item"> + <span class="name">启泵次数:</span> + <span class="val-status">{{item.qdnumber}}</span> + </div> + <div class="message-item"> + <span class="name">1号水池水位:</span> + <span class="val-status">{{item.oneWater}}</span> + </div> + <div class="message-item"> + <span class="name">2号水池水位:</span> + <span class="val-status">{{item.twoWater}}</span> + </div> + <div class="message-item"> + <span class="name">其他详细信息:</span> + <router-link class="val" to="/screen/pumpInfo">点击跳转</router-link> + </div> </div> </div> + </div> + </div> + </div> + <div class="right"> + <!-- 实时监控 --> + <div class="jiankong"> + <div class="jiankong-t">实时监控</div> + <div class="jiankong-c"> + <div class="switch"> + <div class="switch-l">泵房监控</div> + <div class="switch-r"> + <div class="more" :class="{active: selectType==='two'}" @click="changeType('two')">多屏模式 </div> + <div class="single" :class="{active: selectType==='single'}" @click="changeType('single')">单屏模式</div> + </div> + </div> + <div class="video-box"> + <div class="two" v-if="selectType==='two'"> + <div class="list" v-for="(item, index) in showList" :key="index"> + <div class="item" v-if="item?.deviceId"> + <VideoPlayer :item="item" /> + </div> + <div v-else class="item"></div> + </div> + </div> + <div class="single" v-else> + <div class="item" v-if="showList[0]?.deviceId"> + <VideoPlayer :item="showList[0]" /> + </div> + <div v-else class="item"></div> + </div> + </div> + </div> + </div> + <!-- 报警记录 --> + <div class="warnRecord"> + <div class="warnRecord-title">报警记录</div> + <div class="warnRecord-info"> + <div class="into-t">报警信息</div> + <div class="info-list"> + <div class="item" v-for="(item, index) in warnList" :key="index"> + <el-tooltip + effect="dark" + :content="item.pointName" + placement="top" + > + {{item.pointName}} + </el-tooltip> + <el-tooltip + effect="dark" + :content="item.facilityName" + placement="top" + > + {{item.facilityName}} + </el-tooltip> + <el-tooltip + effect="dark" + :content="item.description" + placement="top" + > + {{item.description}} + </el-tooltip> + </div> + </div> + </div> + <div class="warnRecord-datashow"> + <div ref="warningRef" class="warning" /> </div> </div> </div> </div> </template> - -<script setup> - -import {ref} from "vue"; - -const selectll = ref(0) - -const liuliangOptions = [ - { label: '总计流量', value: 500 }, - { label: '日累计流量', value: 1000 }, - { label: '周累计流量', value: 10000 }, - { label: '月累计流量', value: 300000 }, - { label: '年累计流量', value: 3600000 }, -] - -</script> +<script setup lang="ts"> +import { use } from "echarts/core"; +import * as echarts from 'echarts/core'; +import {GridComponent, TooltipComponent, LegendComponent} from "echarts/components"; +import { LineChart, PieChart } from "echarts/charts"; +import { UniversalTransition, LabelLayout } from "echarts/features"; +import { CanvasRenderer } from "echarts/renderers"; +import {onMounted, reactive, ref} from "vue"; +import VideoPlayer from "@/components/VideoPlayer/VideoPlayer.vue"; -<style scoped lang="scss"> -.home{ - height: 100%; - .home-bg{ - position: absolute; - left: 0; - top: 0; - width: 100%; - height: 100%; - background: url("@/assets/images/map-bg.png") no-repeat; - background-size: 100% 100%; - z-index: 11; +use([ + GridComponent, + LineChart, + CanvasRenderer, + UniversalTransition, + TooltipComponent, + LegendComponent, + PieChart, + CanvasRenderer, + LabelLayout, +]); + +const openStatus = reactive({ + bengfang: false, + shuixiang: false, + jieguan: false +}) + +const mapSize = ref(90); // 初始化地图大小为100 +const gonghaoRef = ref(); +const liuliangRef = ref(); +const warningRef = ref(); +let gonghaoCharts = null; +let liuliangCharts = null; +let warningCharts = null; + +const tucengVal = ref(0); +const selectType = ref('single') +const videoList = ref([]) +const showList = ref([]) +const warnList = ref([]) +const showMsg = ref() +const pointList = ref([ + { name: '碧桂园', shuijin: '正常', longtime: '1280天13小时59分', ssll: '+10㎡/s', ljll: '㎡', ls: '10m/s', qdnumber: '10次', oneWater: '2.26m', twoWater: '4.26m', left: 40, top: 22 }, + { name: '龙湖公馆', shuijin: '正常', longtime: '1280天13小时59分', ssll: '+10㎡/s', ljll: '㎡', ls: '10m/s', qdnumber: '10次', oneWater: '2.26m', twoWater: '4.26m', left: 52, top: 35 }, +]) +const tongjiTable = reactive({ + selectName: '', + tongjiList: [], + namelist: [] +}) + +const clickMsgFun = (index: number) => { + showMsg.value = showMsg.value === index ? null : index; +} + +// 获取定位随机值 +const getRandom = (min, max) => { + return Math.floor(Math.random() * (max - min) + min); +} + +const setOpenStatus = (type: string) => { + switch (type) { + case "bengfang": + openStatus.bengfang = openStatus.bengfang ? false : true; + break; + case "shuixiang": + openStatus.shuixiang = openStatus.shuixiang ? false : true; + break; + case "jieguan": + openStatus.jieguan = openStatus.jieguan ? false : true; + break } - .home-c{ - width: 100%; - height: 100%; - position: relative; - z-index: 20; - .point{ - position: absolute; - left: 58%; - top: 30%; - .point-address{ - width: 35px; - height: 40px; - background: url("@/assets/images/point.png") no-repeat; - background-size: 100% 100%; - } - .point-message{ - width: 600px; - height: 200px; - background: url("@/assets/images/messageInfo-box.png") no-repeat; - background-size: 100% 100%; - position: absolute; - left: -600px; - top: -100px; - padding: 30px 50px 30px 30px; - color: #fff; - display: flex; - align-items: center; - gap: 20px; - .video-box{ - flex-shrink: 0; - width: 200px; - height: 138px; - line-height: 138px; - text-align: center; - font-size: 38px; - background: #cccb40; +} + +// 图表实例 +const setGonghaoCharts = (xData, sData) => { + if(gonghaoRef.value) { + gonghaoCharts = echarts.init(gonghaoRef.value); + const option = { + grid: { + top: 30, + bottom: 40, + left: 40 + }, + xAxis: { + type: 'category', + boundaryGap: false, + data: xData, + axisLabel: { + color: '#fff', + fontSize: '0.5rem', + rotate: 30, + }, + }, + yAxis: { + type: 'value', + axisLabel: { + color: '#fff', + fontSize: '0.5rem', } - .info-box{ - height: 100%; - display: flex; - flex-direction: column; - justify-content: space-between; - .info-t{ - font-size: 20px; - } - .info-ljll{ - display: flex; - align-items: center; - :deep(.el-select){ - width: 100px !important; - .el-select__wrapper{ - color: #fff; - background: transparent; - .el-select__selected-item{ - color: #fff; - } - .el-select__suffix .el-icon{ - color: #fff; - } - &:hover{ - box-shadow: none; - } - } + }, + tooltip: { + show: true + }, + series: [ + { + data: sData, + type: 'line', + areaStyle: {} + } + ] + }; + gonghaoCharts.setOption(option); + } +} +const setLiuliangCharts = (xData, sData) => { + if(liuliangRef.value) { + liuliangCharts = echarts.init(liuliangRef.value); + const option = { + grid: { + top: 30, + bottom: 40, + left: 40 + }, + xAxis: { + type: 'category', + boundaryGap: false, + data: xData, + axisLabel: { + color: '#fff', + fontSize: '0.5rem', + rotate: 30, + } + }, + yAxis: { + type: 'value', + axisLabel: { + color: '#fff', + fontSize: '0.5rem', + } + }, + tooltip: { + show: true + }, + series: [ + { + data: sData, + type: 'line', + areaStyle: {} + } + ] + }; + liuliangCharts.setOption(option); + } +} +const setWarningCharts = (data) => { + if(warningRef.value) { + warningCharts = echarts.init(warningRef.value); + const option = { + tooltip: { + trigger: 'item' + }, + series: [ + { + type: 'pie', + radius: '50%', + data: data, + emphasis: { + itemStyle: { + shadowBlur: 10, + shadowOffsetX: 0, + shadowColor: 'rgba(0, 0, 0, 0.5)' } } - span{ - display: inline-block; - padding: 0 10px; + } + ] + } + warningCharts.setOption(option); + } +} + +// 获取功耗数据 +const getGonghaoData = () => { + getHomeGonghao().then(res => { + let xdata = []; + let sdata = []; + let newArr = res.data.length > 5 ? res.data.slice(0,5) : res.data + newArr.forEach((item) => { + xdata.push(item.pointName) + sdata.push(item.value) + }) + setGonghaoCharts(xdata, sdata) + }) +} +// 获取流量统计 +const getLiuliangData = () => { + getHomeLiuliang().then(res => { + let xdata = []; + let sdata = []; + let newArr = res.data.length > 5 ? res.data.slice(0,5) : res.data + newArr.forEach((item) => { + xdata.push(item.pointName) + sdata.push(item.value) + }) + setLiuliangCharts(xdata, sdata) + }) +} + +// 切换播放模式 +const changeType = (type) => { + selectType.value = type + showList.value = [] + if(type === 'two') { + showList.value = videoList.value.slice(0, 2).concat(Array(4 - videoList.value.length).fill(null)) + } else { + showList.value = videoList.value.slice(0, 1) + } +} + +// 获取报警数据 +const getWarning = () => { + getHomeWarning().then(res => { + warnList.value = res.data.alarmHistoryVOList + let data = [ + { value: res.data.facilityCount, name: '设备启动异常' }, + { value: res.data.waterEnterCount, name: '进水压力异常' }, + { value: res.data.waterOutCount, name: '出口压力异常' }, + ] + setWarningCharts(data) + }) +} + +// 获取统计数据 +const getTongjiData = () => { + getHomeTongji().then(res => { + tongjiTable.tongjiList = res.data.statementValueList; + tongjiTable.namelist = res.data.statementNameList; + }) +} + +const clearName = () => { + tongjiTable.selectName = '' +} + +onMounted(() => { + // getGonghaoData() + // getLiuliangData() + // getWarning() + // getTongjiData() +}) +</script> + +<style lang="scss" scoped> + +// 地图动态变化样式 不能单独抽离到scss文件中 +.container { + background-image: url("@/assets/images_lc/map.png"); + // 动态获取图片大小 + background-size: v-bind('mapSize + "%"'); + background-repeat: no-repeat; + background-position: 50% 50%; + transition: background-size 0.3s ease; +} +.homeSelectName{ + .el-radio-group{ + flex-direction: column; + align-items: flex-start; + .el-radio{ + font-size: 1rem; + } + } + .clear{ + margin: 5px 30px 10px 20px; + text-align: right; + color: #3aa8ef; + font-size: 0.8rem; + cursor: pointer; + } +} + +.container { + width: 100%; + height: 100%; + display: flex; + justify-content: space-between; + color: white; + overflow: hidden; + + .left { + width: 20%; + flex-shrink: 0; + flex-grow: 0; + display: flex; + flex-direction: column; + gap: 1rem; + .liuliang{ + height: 45%; + background: url("@/assets/images_lc/realTimeMonitoring.png") no-repeat; + background-size: 100% 100%; + &-title { + background-image: url('@/assets/images_lc/title_font.png'); + padding-left: 16%; + font-size: 1.2rem; + } + } + .gongdian{ + height: 55%; + background: url("@/assets/images_lc/warnRecord.png") no-repeat; + background-size: 100% 100%; + &-title { + background-image: url('@/assets/images_lc/title_font.png'); + padding-left: 16%; + font-size: 1.2rem; + } + } + } + + .center { + width: 58%; + display: flex; + flex-direction: column; + .map { + height: 100%; + .point-box{ + width: 100%; + height: 100%; + position: relative; + .apoint{ + position: absolute; + img{ + width: 1.5rem; + height: 3rem + } + .message{ + width: 12rem; + height: 16rem; + background: url("@/assets/images_lc/point-message.png") no-repeat; + background-size: 100% 100%; + padding: 0 0.2rem; + position: absolute; + right: -12rem; + top: 0; + z-index: 100; + .message-item{ + font-size: 0.7rem; + padding: 0.3rem 0 0.3rem 0.9rem; + .name{ + margin-right: 0.3rem; + } + .val-status{ + color: #22E195; + } + } } } } } } + + .right { + width: 20%; + display: flex; + flex-direction: column; + gap: 1rem; + .jiankong { + height: 40%; + background-image: url('@/assets/images_lc/realTimeMonitoring.png'); + background-repeat: no-repeat; + background-size: 100% 100%; + &-t { + background-image: url('@/assets/images_lc/title_font.png'); + padding-left: 16%; + font-size: 1.2rem; + } + + &-c { + height: 90%; + .switch { + height: 15%; + display: flex; + align-items: center; + justify-content: space-between; + padding: 0 1.5rem; + + .switch-l { + font-weight: 700; + } + .switch-r{ + display: flex; + gap: 1rem; + } + .more { + width: 6rem; + height: 1.5rem; + line-height: 1.5rem; + text-align: center; + background-image: url('@/assets/images_lc/switch.png'); + background-size: 100% 100%; + color: #cfcfcf; + font-size: 0.9rem; + } + + .single { + width: 6rem; + height: 1.5rem; + line-height: 1.5rem; + text-align: center; + background-image: url('@/assets/images_lc/switch.png'); + background-size: 100% 100%; + color: #cfcfcf; + font-size: 0.9rem; + } + .active{ + color: #fff; + } + } + .video-box{ + height: 85%; + padding: 0 1rem; + .two{ + width: 100%; + height: 100%; + display: flex; + flex-wrap: wrap; + justify-content: space-between; + .list{ + width: 49%; + height: 100%; + .item{ + height: 100%; + background-color: #000; + } + } + } + .single{ + width: 100%; + height: 100%; + .item{ + height: 95%; + width: 100%; + background-color: #000; + } + } + } + } + } + + .warnRecord { + height: 60%; + background-image: url('@/assets/images_lc/warnRecord.png'); + background-repeat: no-repeat; + background-size: 100% 100%; + display: flex; + flex-direction: column; + .warnRecord-title { + background-image: url('@/assets/images_lc/title_font.png'); + padding-left: 16%; + font-size: 1.3rem; + } + .warnRecord-info { + width: 90%; + height: 50%; + margin: auto; + overflow-y: scroll; + &::-webkit-scrollbar{ + display: none; + } + .into-t{ + height: 15%; + font-size: 1.2rem; + padding-top: 0.3rem; + } + .info-list{ + height: 85%; + .item{ + padding: 0.5rem 0; + display: flex; + justify-content: space-between; + font-size: 0.8rem; + :deep(.el-only-child__content){ + width: 30%; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + } + } + } + .warnRecord-datashow { + height: 50%; + .warning { + width: 100%; + height: 100%; + } + } + } + } } -</style> \ No newline at end of file +</style> diff --git a/src/views/screen/pumpInfo/index.vue b/src/views/screen/pumpInfo/index.vue new file mode 100644 index 0000000..ac6d161 --- /dev/null +++ b/src/views/screen/pumpInfo/index.vue @@ -0,0 +1,222 @@ +<script setup> + +const list = [ + { + name: '康妮一号泵房', + data: { + longtime: '1280天13小时59分', + shuijin: '正常', + ssll: '+10m³/h', + ljll: '1021m³', + ls: '10m/s', + qdnumber: '10次', + dianya: '15v', + dianliu: '15A', + power: '100w', + dianneng: '500kw·h', + onewater: '226m', + twowater: '426m', + adianya: '380v', + adianliu: '0.15A', + bdianya: '380v', + bdianliu: '0.15A', + cdianya: '380v', + cdianliu: '0.15A', + onepumpNumber: 10, + onepumpStatus: 1, + twopumpNumber: 10, + twopumpStatus: 0, + threepumpNumber: 10, + threepumpStatus: 0, + fourpumpNumber: 10, + fourpumpStatus: 0, + } + }, + { + name: '康妮一号泵房', + data: { + longtime: '1280天13小时59分', + shuijin: '正常', + ssll: '+10m³/h', + ljll: '1021m³', + ls: '10m/s', + qdnumber: '10次', + dianya: '15v', + dianliu: '15A', + power: '100w', + dianneng: '500kw·h', + onewater: '226m', + twowater: '426m', + adianya: '380v', + adianliu: '0.15A', + bdianya: '380v', + bdianliu: '0.15A', + cdianya: '380v', + cdianliu: '0.15A', + onepumpNumber: 10, + onepumpStatus: 1, + twopumpNumber: 10, + twopumpStatus: 0, + threepumpNumber: 10, + threepumpStatus: 0, + fourpumpNumber: 10, + fourpumpStatus: 0, + } + } +] + +</script> + +<template> + <div class="info"> + <div class="item" v-for="(item, index) in list" :key="index"> + <div class="item-t">{{ item.name }}</div> + <div class="item-c"> + <div class="list"> + <div class="lc"> + <span class="name">运行时长</span> + <span class="val">{{item.data.longtime}}</span> + </div> + <div class="lc"> + <span class="name">水浸</span> + <span class="val">{{item.data.shuijin}}</span> + </div> + <div class="lc"> + <span class="name">瞬时流量</span> + <span class="val">{{item.data.ssll}}</span> + </div> + <div class="lc"> + <span class="name">累计流量</span> + <span class="val">{{item.data.ljll}}</span> + </div> + <div class="lc"> + <span class="name">流 速</span> + <span class="val">{{item.data.ls}}</span> + </div> + <div class="lc"> + <span class="name">启泵次数</span> + <span class="val">{{item.data.qdnumber}}</span> + </div> + <div class="lc"> + <span class="name">水泵电压</span> + <span class="val">{{item.data.dianya}}</span> + </div> + <div class="lc"> + <span class="name">水泵电流</span> + <span class="val">{{item.data.dianliu}}</span> + </div> + <div class="lc"> + <span class="name">水泵功率</span> + <span class="val">{{item.data.power}}</span> + </div> + <div class="lc"> + <span class="name">总 电 能</span> + <span class="val">{{item.data.dianneng}}</span> + </div> + <div class="lc"> + <span class="name">1号泵组</span> + <span class="status">{{ !!item.data.onepumpStatus ? '开' : '关' }}</span> + <span class="val">{{item.data.onepumpNumber}}次</span> + </div> + <div class="lc"> + <span class="name">1号泵组</span> + <span class="status">{{ !!item.data.twopumpStatus ? '开' : '关' }}</span> + <span class="val">{{item.data.twopumpNumber}}次</span> + </div> + <div class="lc"> + <span class="name">1号泵组</span> + <span class="status">{{ !!item.data.threepumpStatus ? '开' : '关' }}</span> + <span class="val">{{item.data.threepumpNumber}}次</span> + </div> + <div class="lc"> + <span class="name">1号泵组</span> + <span class="status">{{ !!item.data.fourpumpStatus ? '开' : '关' }}</span> + <span class="val">{{item.data.fourpumpNumber}}次</span> + </div> + <div class="lc"> + <span class="name">1号水池液位</span> + <span class="val">{{item.data.onewater}}</span> + </div> + <div class="lc"> + <span class="name">2号水池液位</span> + <span class="val">{{item.data.twowater}}</span> + </div> + <div class="lc"> + <span class="name">市电供电A相电压</span> + <span class="val">{{item.data.adianya}}</span> + </div> + <div class="lc"> + <span class="name">市电供电A相电流</span> + <span class="val">{{item.data.adianliu}}</span> + </div> + <div class="lc"> + <span class="name">市电供电B相电压</span> + <span class="val">{{item.data.bdianya}}</span> + </div> + <div class="lc"> + <span class="name">市电供电B相电流</span> + <span class="val">{{item.data.bdianliu}}</span> + </div> + <div class="lc"> + <span class="name">市电供电C相电压</span> + <span class="val">{{item.data.cdianya}}</span> + </div> + <div class="lc"> + <span class="name">市电供电C相电流</span> + <span class="val">{{item.data.cdianliu}}</span> + </div> + </div> + </div> + </div> + </div> +</template> + +<style scoped lang="scss"> +.info{ + height: 100%; + display: flex; + align-items: center; + justify-content: space-between; + padding: 0 5rem; + .item{ + width: 48%; + height: 98%; + background: url("@/assets/images_lc/info-bg.png") no-repeat; + background-size: 100% 100%; + &-t{ + color: #fff; + background: url('@/assets/images_lc/title_font.png') no-repeat; + padding-left: 8%; + font-size: 1.2rem; + } + &-c{ + height: calc(100% - 2rem); + padding: 1rem; + .list{ + height: 100%; + display: flex; + flex-direction: column; + flex-wrap: wrap; + .lc{ + width: 50%; + padding: 0.75rem 0; + color: #fff; + font-size: 1.3rem; + .name{ + display: inline-block; + width: 12rem; + } + .status{ + display: inline-block; + width: 6rem; + color: #1ab394; + } + .val{ + color: #1ab394; + } + } + } + } + } +} +</style> \ No newline at end of file diff --git a/src/views/screen/report/index.vue b/src/views/screen/report/index.vue deleted file mode 100644 index 678bffa..0000000 --- a/src/views/screen/report/index.vue +++ /dev/null @@ -1,13 +0,0 @@ -<script setup> - -</script> - -<template> - <div> - 报表管理 - </div> -</template> - -<style scoped lang="scss"> - -</style> \ No newline at end of file diff --git a/src/views/screen/shebei/index.vue b/src/views/screen/shebei/index.vue deleted file mode 100644 index 2ccc251..0000000 --- a/src/views/screen/shebei/index.vue +++ /dev/null @@ -1,13 +0,0 @@ -<script setup> - -</script> - -<template> - <div> - 设备管理 - </div> -</template> - -<style scoped lang="scss"> - -</style> \ No newline at end of file diff --git a/src/views/screen/warning/index.vue b/src/views/screen/warning/index.vue deleted file mode 100644 index e80b3ed..0000000 --- a/src/views/screen/warning/index.vue +++ /dev/null @@ -1,13 +0,0 @@ -<script setup> - -</script> - -<template> - <div> - 预警管理 - </div> -</template> - -<style scoped lang="scss"> - -</style> \ No newline at end of file -- Gitblit v1.9.3