| | |
| | | </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="" /> |
| | |
| | | <div class="menus"> |
| | | <div class="search_wrap"> |
| | | <img class="search" src="@/assets/images/SecurityControl/ic_search@2x.png" alt=""> |
| | | <input class="input" type="text" placeholder="搜索监控名称"> |
| | | <input v-model="dataValue5" @input="getData5" class="input" type="text" placeholder="搜索监控名称"> |
| | | </div> |
| | | <div class="menu_wrap"> |
| | | <div class="menu" v-for="menu,i in jkList"> |
| | | <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=""> |
| | | <!-- <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 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-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> |
| | | <span :class="{ active: activeMenu == item.name }">{{ item.name }}</span> |
| | | </div> |
| | | </div> |
| | | </div> --> |
| | | </div> |
| | | |
| | | </div> |
| | |
| | | </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="" /> |
| | |
| | | </div> |
| | | <div class="separate"></div> |
| | | </div> |
| | | </div> |
| | | </div> --> |
| | | <div class="safe_warning"> |
| | | <div class="com_header"> |
| | | <div class="title"> |
| | |
| | | </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> |
| | |
| | | <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> |
| | |
| | | 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 = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六',] |
| | |
| | | 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 |
| | |
| | | } |
| | | |
| | | dataListT2.value = temp |
| | | } |
| | | |
| | | initEchart2() |
| | | }) |
| | | } |
| | |
| | | }) |
| | | } |
| | | |
| | | 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自己或子元素时,自动初始化swiper |
| | | }) |
| | | } |
| | | 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自己或子元素时,自动初始化swiper |
| | | }) |
| | | } |
| | | 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自己或子元素时,自动初始化swiper |
| | | }) |
| | | } |
| | | |
| | | |
| | | |
| | | onMounted(() => { |
| | | getData1() |
| | | getData2() |
| | | getData3() |
| | | getData4() |
| | | getData5() |
| | | getWarning() |
| | | |
| | | // initEchart1() |
| | | }) |
| | |
| | | div { |
| | | box-sizing: border-box; |
| | | } |
| | | |
| | | .swiper-wrapper { |
| | | display: block !important; |
| | | } |
| | | .main_content { |
| | | display: flex; |
| | | padding: 20px 25px 0; |
| | |
| | | .item { |
| | | display: flex; |
| | | flex-direction: column; |
| | | align-items: center; |
| | | |
| | | .icon { |
| | | width: 52px; |
| | | height: 52px; |
| | | margin-bottom: 8px; |
| | | } |
| | | |
| | | /* align-items: center; */ |
| | | .num { |
| | |
| | | |
| | | .menu_wrap { |
| | | margin-top: 15px; |
| | | |
| | | max-height: 400px; |
| | | overflow: auto; |
| | | .menu { |
| | | .menu_name { |
| | | display: flex; |
| | |
| | | height: 34px; |
| | | border-bottom: 2px solid rgba(210, 224, 255, 0.2); |
| | | cursor: pointer; |
| | | |
| | | .name {} |
| | | |
| | | .icon { |
| | | width: 8px; |
| | | } |
| | | .open{ |
| | | |
| | | .open { |
| | | width: 14px; |
| | | } |
| | | } |
| | |
| | | margin-left: 10px; |
| | | cursor: pointer; |
| | | color: #D2E0FF; |
| | | .icon{ |
| | | |
| | | .icon { |
| | | width: 15px; |
| | | height: 14px; |
| | | margin-right: 8px; |
| | | } |
| | | .active{ |
| | | |
| | | .active { |
| | | color: #01D9FE; |
| | | } |
| | | } |
| | |
| | | } |
| | | |
| | | .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 { |
| | |
| | | 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 { |
| | |
| | | } |
| | | |
| | | .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; |
| | | } |
| | | } |
| | | } |
| | |
| | | .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; |
| | | } |
| | | } |
| | | } |