From 03e3f933f10fb9228eef02c5699b749a501a50e7 Mon Sep 17 00:00:00 2001 From: jiangping <jp@doumee.com> Date: 星期四, 14 十一月 2024 09:27:54 +0800 Subject: [PATCH] Merge remote-tracking branch 'origin/master' --- screen/src/views/SecurityControl.vue | 468 ++++++++++++++++++++++++++++++++++++++++++++-------------- 1 files changed, 353 insertions(+), 115 deletions(-) diff --git a/screen/src/views/SecurityControl.vue b/screen/src/views/SecurityControl.vue index 8afd905..4953e4a 100644 --- a/screen/src/views/SecurityControl.vue +++ b/screen/src/views/SecurityControl.vue @@ -59,24 +59,27 @@ </div> <div class="private_car"> <div class="item"> - <div class="name">鍛樺伐杞﹁締</div> + <img class="icon" src="@/assets/images/SecurityControl/car_yuangong@2x.png" alt=""> <div class="num">{{ data.internalCarTotal }}</div> + <div class="name">鍛樺伐杞﹁締</div> </div> <div class="item"> - <div class="name">鐩稿叧鏂硅溅杈�</div> + <img class="icon" src="@/assets/images/SecurityControl/car_xiangguanfang@2x.png" alt=""> <div class="num num2">{{ data.relatedCarTotal }}</div> + <div class="name">鐩稿叧鏂硅溅杈�</div> + </div> <div class="item"> - - <div class="name">鏉ヨ杞﹁締</div> + <img class="icon" src="@/assets/images/SecurityControl/car_laifang@2x.png" alt=""> <div class="num num3">{{ data.visitCarTotal }}</div> + <div class="name">鏉ヨ杞﹁締</div> </div> </div> - <div class="section"> + <!-- <div class="section"> <div class="item" :style="{ flex: data.internalCarTotal }"></div> <div class="item" :style="{ flex: data.relatedCarTotal }"></div> <div class="item" :style="{ flex: data.visitCarTotal }"></div> - </div> + </div> --> <div class="second_title"> <div class="title"> <img src="@/assets/images/SecurityControl/ic_title_green@2x.png" class="icon" alt="" /> @@ -105,7 +108,42 @@ </div> </div> <div class="center_box"> - <div class="center_box_one"> + <div v-if="showJk" class="jiankong"> + <img class="jk_bg" src="@/assets/images/SecurityControl/jiankong_bg@2x.png" alt=""> + <div class="content"> + <div class="video"></div> + </div> + <div class="right_wrap"> + <div class="menus"> + <div class="search_wrap"> + <img class="search" src="@/assets/images/SecurityControl/ic_search@2x.png" alt=""> + <input v-model="dataValue5" @input="getData5" class="input" type="text" placeholder="鎼滅储鐩戞帶鍚嶇О"> + </div> + <div class="menu_wrap"> + <div class="menu" v-for="menu, i in data5"> + <div class="menu_name" @click="menuClick(i)"> + <div class="name">{{ menu.name }}</div> + <!-- <img v-if="activeJkIndex == i" class="open" src="@/assets/images/SecurityControl/ar_close@2x.png" + alt=""> + <img v-else class="icon" src="@/assets/images/SecurityControl/ar_open@2x.png" alt=""> --> + </div> + <!-- <div v-if="activeJkIndex == i" class="list"> + <div class="item" @click="menuItemClick(item.name)" v-for="item in menu.childen"> + <img v-if="activeMenu == item.name" class="icon" + src="@/assets/images/SecurityControl/ic_jiankong_sel@2x.png" alt=""> + <img v-else class="icon" src="@/assets/images/SecurityControl/ic_jiankon.png" alt=""> + <span :class="{ active: activeMenu == item.name }">{{ item.name }}</span> + </div> + </div> --> + </div> + + </div> + + </div> + </div> + + </div> + <div v-else class="center_box_one"> <div class="list"> <div class="item"> <div class="name_wrap"> @@ -241,7 +279,7 @@ </div> </div> <div class="main_footer"> - <div class="car_warning"> + <!-- <div class="car_warning"> <div class="com_header"> <div class="title"> <img src="@/assets/images/ic_title@2x.png" class="icon" alt="" /> @@ -268,7 +306,7 @@ </div> <div class="separate"></div> </div> - </div> + </div> --> <div class="safe_warning"> <div class="com_header"> <div class="title"> @@ -284,42 +322,27 @@ </div> <img src="@/assets/images/title@2x.png" class="bg" alt="" /> </div> - <div class="list"> - <div class="item"> - <div class="icon"> - <div class="circle"></div> - <div class="line"></div> - </div> - <div class="content"> - <div class="header"> - <div class="time"> - <span>123</span> - <span class="status">澶勭悊涓�</span> + <div class="list one-swiper"> + <div class="swiper-wrapper"> + <div class="one-swiper-slide swiper-slide item" v-for="item in warningList"> + <div class="item_wrap"> + <img :src="item.img" class="avatar" alt=""> + <div class="content"> + <div class="header"> + <div class="name">{{item.title}}</div> + <div class="have_time">宸茬粡鍙戠敓{{item.haveTime}}</div> + </div> + <div class="wrap"> + <div class="line addr"> + <img class="icon" src="@/assets/images/SecurityControl/xiaofang_ic_weizhi@2x.png" alt=""> + <span>{{item.addr}}</span> + </div> + <div class="line time"> + <img class="icon" src="@/assets/images/SecurityControl/clock.png" alt=""> + <span>{{item.createDate}}</span> + </div> + </div> </div> - <div class="have_time">宸茬粡鍙戠敓<span>1</span>鍒嗛挓</div> - </div> - <div class="wrap"> - <div class="title">娑堥槻璀﹀憡</div> - <div class="title">address</div> - </div> - </div> - </div> - <div class="item"> - <div class="icon"> - <div class="circle"></div> - <div class="line"></div> - </div> - <div class="content"> - <div class="header"> - <div class="time"> - <span>123</span> - <span class="status">澶勭悊涓�</span> - </div> - <div class="have_time">宸茬粡鍙戠敓<span>1</span>鍒嗛挓</div> - </div> - <div class="wrap"> - <div class="title">娑堥槻璀﹀憡</div> - <div class="title">address</div> </div> </div> </div> @@ -333,10 +356,11 @@ </div> <img src="@/assets/images/title@2x.png" class="bg" alt="" /> </div> - <div class="monitoring"> - <img src="@/assets/images/SecurityControl/jiankong.png" class="icon" alt=""> + <div class="monitoring" @click="showJk = !showJk"> + <img src="@/assets/images/SecurityControl/ic_jiankong@2x.png" class="icon" alt=""> <div>鐩戞帶鍒楄〃</div> - <img src="@/assets/images/SecurityControl/jiankong_ic_open@2x.png" class="top" alt=""> + <img v-if="showJk" src="@/assets/images/SecurityControl/jiankong_ic_close@2x.png" class="top" alt=""> + <img v-else src="@/assets/images/SecurityControl/jiankong_ic_open@2x.png" class="top" alt=""> </div> <div class="content"> <div class="sa_static"> @@ -373,7 +397,7 @@ <div>{{ item.totalNum }}</div> <div>{{ item.onlineNum }}</div> <div>{{ item.offlineDeviceNum }}</div> - <div v-if="item.onlineNum && item.totalNum">{{ ((item.onlineNum / item.totalNum) * 100).toFixed(0) }}% + <div>{{ item.totalNum ? ((item.onlineNum / item.totalNum) * 100).toFixed(0) : 0 }}% </div> </div> <div class="separate"></div> @@ -419,7 +443,9 @@ import duration from 'dayjs/plugin/duration' dayjs.extend(duration) import * as echarts from 'echarts' -import { getEnergyCenterData, getSecurityDeviceData, getVisitRetentionData, afgetVisitData } from '@/api' +import 'swiper/css/swiper.min.css' +import Swiper from 'swiper' +import { getEnergyCenterData,afwarningEventData, getSecurityDeviceData, getVisitRetentionData, afgetVisitData, afregionTreea } from '@/api' const weekMap = ['鏄熸湡鏃�', '鏄熸湡涓�', '鏄熸湡浜�', '鏄熸湡涓�', '鏄熸湡鍥�', '鏄熸湡浜�', '鏄熸湡鍏�',] @@ -432,6 +458,43 @@ time.value = dayjs().format('HH:mm:ss') }, 1000) + +const showJk = ref(true) +const activeJkIndex = ref(0) +const activeMenu = ref('') +const jkList = ref([ + { + name: '鏈堝彴鍖�', + childen: [ + { name: '鏈堝彴1', id: 0 }, + { name: '鏈堝彴2', id: 0 }, + { name: '鏈堝彴3', id: 0 }, + ] + }, + { + name: '鍔炲叕妤�', + childen: [] + }, + { + name: '鍘傛埧', + childen: [] + }, + { + name: '澶ч棬', + childen: [] + }, +]) +const menuClick = (val) => { + if (val == activeJkIndex.value) { + activeJkIndex.value = -1 + } else { + activeJkIndex.value = val + } +} +const menuItemClick = (val) => { + activeMenu.value = val +} + const arr = ['#68e2e3', '#50afd3', '#377cdb', '#d5ae3a'] const initEnergy = () => { @@ -595,10 +658,10 @@ color: '#61d3f9' }])] const data = [] - data.push({ name: '寰呰闂�', value: data4.value.waitVisitNum,rate: data4.value.waitVisitRata }) - data.push({ name: '宸茬櫥璁�', value: data4.value.registerVisitNum,rate: data4.value.registerVisitRata }) - data.push({ name: '宸茬寮�', value: data4.value.levelNum,rate: data4.value.levelRata }) - data.push({ name: '婊炵暀', value: data4.value.retentionNum,rate: data4.value.retentionRata }) + data.push({ name: '寰呰闂�', value: data4.value.waitVisitNum, rate: data4.value.waitVisitRata }) + data.push({ name: '宸茬櫥璁�', value: data4.value.registerVisitNum, rate: data4.value.registerVisitRata }) + data.push({ name: '宸茬寮�', value: data4.value.levelNum, rate: data4.value.levelRata }) + data.push({ name: '婊炵暀', value: data4.value.retentionNum, rate: data4.value.retentionRata }) const option = { color: colors, tooltip: { @@ -713,7 +776,8 @@ const dataListT2 = ref([]) const getData2 = () => { getSecurityDeviceData().then(res => { - const result = res.data + if(res.code == 200 && res.data && res.data.length > 0){ + const result = res.data let temp = [] let online = 0 let outline = 0 @@ -731,6 +795,8 @@ } dataListT2.value = temp + } + initEchart2() }) } @@ -749,10 +815,77 @@ const getData4 = () => { afgetVisitData().then(res => { const result = res.data || {} - dataList4.value = result + data4.value = result initEchart3() }) } + +const warningList = ref([]) +const getWarning = () => { + afwarningEventData({type: 0}).then(res => { + const result = res.data || [] + warningList.value = result.map(item => { + item.haveTime = dayjs.duration(new Date().getTime() - new Date(item.createDate).getTime()).format('HH灏忔椂mm鍒嗛挓') + return item + }) + }) +} +const dataValue5 = ref('') +const data5 = ref([]) +const getData5 = () => { + afregionTreea({ + name: dataValue5.value, + withCameras: 1 + }).then(res => { + const result = res.data || [] + data5.value = result + }) +} + +const autoplayFlag = (list = [], leng = 4, time = 2000) => { + if (list.length > leng) { + return { delay: time, disableOnInteraction: false } + } else { + return false + } +} +const loopFn1 = () => { + var newSwiper1 = new Swiper('.one-swiper', { + // initialSlide: 0, + loop: true, // 寰幆妯″紡閫夐」 + // direction: 'vertical', //绔栫洿鏂瑰悜 + slidesPerView: 2, + slidesPerGroup: 2, + slidesPerColumn: 2, + // autoplay: { delay: 500, disableOnInteraction: false }, + autoplay: autoplayFlag(dataList2.value, 2, 2000), + observer: true, //淇敼swiper鑷繁鎴栧瓙鍏冪礌鏃讹紝鑷姩鍒濆鍖杝wiper + }) +} +loopFn1() +const loopFn2 = () => { + var newSwiper1 = new Swiper('.two-swiper', { + initialSlide: 0, + // loop: true, // 寰幆妯″紡閫夐」 + direction: 'vertical', //绔栫洿鏂瑰悜 + slidesPerView: 3, + // autoplay: { delay: 500, disableOnInteraction: false }, + autoplay: autoplayFlag(dataList2.value, 3, 4000), + observer: true, //淇敼swiper鑷繁鎴栧瓙鍏冪礌鏃讹紝鑷姩鍒濆鍖杝wiper + }) +} +const loopFn3 = () => { + var newSwiper1 = new Swiper('.three-swiper', { + initialSlide: 0, + // loop: true, // 寰幆妯″紡閫夐」 + direction: 'vertical', //绔栫洿鏂瑰悜 + slidesPerView: 3, + // autoplay: { delay: 500, disableOnInteraction: false }, + autoplay: autoplayFlag(dataList2.value, 3, 4000), + observer: true, //淇敼swiper鑷繁鎴栧瓙鍏冪礌鏃讹紝鑷姩鍒濆鍖杝wiper + }) +} + onMounted(() => { @@ -760,7 +893,9 @@ getData2() getData3() getData4() - + getData5() + getWarning() + // initEchart1() }) @@ -771,7 +906,9 @@ div { box-sizing: border-box; } - +.swiper-wrapper { + display: block !important; + } .main_content { display: flex; padding: 20px 25px 0; @@ -842,6 +979,13 @@ .item { display: flex; flex-direction: column; + align-items: center; + + .icon { + width: 52px; + height: 52px; + margin-bottom: 8px; + } /* align-items: center; */ .num { @@ -970,6 +1114,114 @@ .center_box { flex: 1; margin: 0 20px; + + .jiankong { + margin: 0 48px; + display: flex; + height: calc(100% - 40px); + position: relative; + + .jk_bg { + width: 100%; + height: 100%; + position: absolute; + z-index: -1; + } + + .content { + flex: 1; + /* height: calc( 100% - 30px ); */ + padding: 16px 0px 32px 20px; + + .video { + height: 100%; + border: 1px solid; + } + } + + .right_wrap { + margin-left: 15px; + width: 250px; + padding: 16px 20px 32px 0; + + .menus { + height: 100%; + background: #002A42; + border: 1px solid rgba(1, 171, 254, 0.8); + padding: 15px; + + .search_wrap { + display: flex; + align-items: center; + box-shadow: inset 0px 0px 6px 0px rgba(1, 171, 254, 0.5); + border-radius: 2px; + border: 1px solid rgba(1, 171, 254, 0.8); + height: 34px; + line-height: 34px; + padding-left: 12px; + + .search { + width: 12px; + height: 12px; + margin-right: 3px; + } + + .input { + flex: 1; + font-size: 14px; + } + } + + .menu_wrap { + margin-top: 15px; + max-height: 400px; + overflow: auto; + .menu { + .menu_name { + display: flex; + justify-content: space-between; + align-items: center; + height: 34px; + border-bottom: 2px solid rgba(210, 224, 255, 0.2); + cursor: pointer; + + .name {} + + .icon { + width: 8px; + } + + .open { + width: 14px; + } + } + + .list { + .item { + display: flex; + align-items: center; + height: 34px; + margin-left: 10px; + cursor: pointer; + color: #D2E0FF; + + .icon { + width: 15px; + height: 14px; + margin-right: 8px; + } + + .active { + color: #01D9FE; + } + } + } + } + } + } + } + + } .center_box_one { padding: 8px 60px; @@ -1219,43 +1471,36 @@ } .safe_warning { - width: 406px; - margin-left: 20px; + width: 786px; margin-right: 20px; - + /* one-swiper */ .list { height: 124px; overflow: auto; margin-top: 15px; scrollbar-width: none; - + display: flex; + flex-wrap: wrap; + .item { - display: flex; + width: 366px; + /* width: 50%; */ + height: 102px; font-size: 13px; color: #D2E0FF; - - .icon { - width: 40px; + .item_wrap { + height: 90px; + padding: 10px; + background: linear-gradient(270deg, rgba(1, 217, 254, 0) 0%, rgba(1, 217, 254, 0.19) 100%); + border: 1px solid #006E81; display: flex; - flex-direction: column; - align-items: center; - padding-top: 3px; + } - .circle { - width: 7px; - height: 7px; - border-radius: 50%; - background: #01D9FE; - box-shadow: 0px 0px 1px 4px #34788f; - /* opacity: 0.52; */ - } - .line { - margin-top: 3px; - width: 1px; - height: calc(100% - 10px); - background-color: #153947; - } + .avatar { + width: 70px; + height: 70px; + margin-right: 10px; } .content { @@ -1265,20 +1510,11 @@ display: flex; justify-content: space-between; align-items: center; + margin-bottom: 8px; - .time { - display: flex; - align-items: center; - - .status { - height: 18px; - line-height: 18px; - border-radius: 2px; - padding: 2px 4px; - border: 1px solid #869CC9; - font-size: 12px; - margin-left: 8px; - } + .name { + font-weight: 500; + font-size: 15px; } .have_time { @@ -1292,26 +1528,18 @@ } .wrap { - height: 40px; - background: linear-gradient(270deg, rgba(254, 85, 1, 0) 0%, rgba(254, 85, 1, 0.19) 100%); - border-radius: 2px 0px 0px 2px; - display: flex; - align-items: center; - border: 1px solid; - margin-bottom: 20px; - margin-top: 8px; - padding: 0 10px; - border-image: linear-gradient(270deg, rgba(254, 85, 1, 0), rgba(254, 85, 1, 0.6)) 1 1; + font-size: 12px; + color: #D2E0FF; - .title { - flex: 4; - font-weight: bold; - font-size: 15px; - color: #FFFFFF; + .line { + display: flex; + align-items: center; + margin-bottom: 3px; } - .address { - flex: 6; + .icon { + width: 12px; + margin-right: 8px; } } } @@ -1425,6 +1653,7 @@ .monitoring { position: absolute; + cursor: pointer; top: -60px; right: 0; display: flex; @@ -1439,7 +1668,9 @@ border: 1px solid rgba(12, 153, 236, 0.68); .icon { - width: 30px; + width: 16px; + height: 16px; + margin-right: 4px; } .top { @@ -1503,12 +1734,19 @@ .separate { width: 1px; height: 14px; - background-color: #d2e0ff; + /* background-color: #d2e0ff; */ margin: 0 6px; } + .tab { + cursor: pointer; + } + .active { - color: #0094eb; + font-weight: 600; + font-size: 15px; + color: #FFFFFF; + text-shadow: 0px 0px 8px #01D9FE; } } } -- Gitblit v1.9.3