523 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
			
		
		
	
	
			523 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
| <template>
 | |
|   <section class="AppVideoMonitoringDV">
 | |
|     <el-row type="flex" justify="space-between" class="body">
 | |
|       <div class="left-wrap column" flex>
 | |
|         <div class="left-top fill">
 | |
|           <label class="label">设备统计</label>
 | |
|           <dv-scroll-board :header="config.header" :config="config" class="table"/>
 | |
|         </div>
 | |
|         <div class="left-bottom">
 | |
|           <label class="label">电子地图</label>
 | |
|           <ai-map :areaId="user.info.areaId"/>
 | |
|         </div>
 | |
|       </div>
 | |
|       <div class="center-wrap column" flex>
 | |
|         <div flex style="width: 100%">
 | |
|           <div :span="6" class="card fill" v-for="(item,index) in cardList" :key="index">
 | |
|             <span>{{ item.label }}</span>
 | |
|             <span>{{ item.value }}</span>
 | |
|           </div>
 | |
|         </div>
 | |
|         <div class="center-bottom fill">
 | |
|           <label class="label">视频监控</label>
 | |
|           <div class="video-wrap">
 | |
|             <div class="item" v-for="(item,index) in videoData.slice(0,2)"
 | |
|                  :key="index">
 | |
|               <template v-if="flag">
 | |
|                 <iframe class="video" :src="item.url" allow="autoplay *; microphone *; fullscreen *"
 | |
|                         allowfullscreen allowtransparency="true" allowusermedia="true" frameBorder="no"></iframe>
 | |
|               </template>
 | |
|               <template v-else>
 | |
|                 <div class="video"></div>
 | |
|               </template>
 | |
|               <div class="info">
 | |
|                 <span>{{ item.name }}</span>
 | |
|               </div>
 | |
|             </div>
 | |
|           </div>
 | |
|           <div class="video-wrap">
 | |
|             <div class="item" v-for="(item,index) in videoData.slice(2,4)"
 | |
|                  :key="index">
 | |
|               <template v-if="flag">
 | |
|                 <iframe class="video" :src="item.url" allow="autoplay *; microphone *; fullscreen *"
 | |
|                         allowfullscreen allowtransparency="true" allowusermedia="true" frameBorder="no"></iframe>
 | |
|               </template>
 | |
|               <template v-else>
 | |
|                 <div class="video"></div>
 | |
|               </template>
 | |
|               <div class="info">
 | |
|                 <span>{{ item.name }}</span>
 | |
|               </div>
 | |
|             </div>
 | |
|           </div>
 | |
|         </div>
 | |
|       </div>
 | |
|       <div class="right-wrap column" flex>
 | |
|         <div class="right-top fill">
 | |
|           <label class="label">人员统计</label>
 | |
|           <label class="total">人员总数
 | |
|             <span>0</span>
 | |
|             <span>人</span>
 | |
|           </label>
 | |
|           <dv-scroll-board :config="config1" class="total-table"/>
 | |
|         </div>
 | |
|         <div class="right-middle">
 | |
|           <label class="label">动作告警统计</label>
 | |
|           <div class="tag">
 | |
|             <span></span>
 | |
|           </div>
 | |
|           <ai-echart :ops="getOpt()"/>
 | |
|           <div class="info">
 | |
|             今日
 | |
|             <span>0</span>
 | |
|             <span>次</span>
 | |
|             本月
 | |
|             <span>0</span>
 | |
|             <span>次</span>
 | |
|           </div>
 | |
|         </div>
 | |
|         <div class="right-bottom">
 | |
|           <label class="label">声音告警统计</label>
 | |
|           <div class="tag">
 | |
|             <span></span>
 | |
|           </div>
 | |
|           <ai-echart :ops="getOpt('1')"/>
 | |
|           <div class="info">
 | |
|             今日
 | |
|             <span style="color:#00FFDF">0</span>
 | |
|             <span>次</span>
 | |
|             本月
 | |
|             <span style="color:#00FFDF">0</span>
 | |
|             <span>次</span>
 | |
|           </div>
 | |
|         </div>
 | |
|       </div>
 | |
|     </el-row>
 | |
|   </section>
 | |
| </template>
 | |
| 
 | |
| <script>
 | |
| import {mapState} from "vuex";
 | |
| import Vue from "vue";
 | |
| import {scrollBoard} from "@jiaminghi/data-view";
 | |
| 
 | |
| Vue.use(scrollBoard)
 | |
| export default {
 | |
|   name: "AppVideoMonitoringDV",
 | |
|   label: "数据大屏-平安小区",
 | |
|   inject: {
 | |
|     dv: {default: ""}
 | |
|   },
 | |
|   props: {
 | |
|     instance: Function
 | |
|   },
 | |
|   computed: {
 | |
|     ...mapState(['user']),
 | |
|     cardList() {
 | |
|       return [
 | |
|         {label: "总设备数", value: "0"},
 | |
|         {label: "在线设备", value: "0"},
 | |
|         {label: "离线设备", value: "0"},
 | |
|         {label: "设备在线率", value: "0%"},
 | |
|       ]
 | |
|     },
 | |
|   },
 | |
|   data() {
 | |
|     return {
 | |
|       meta: {},
 | |
|       config: {
 | |
|         data: [
 | |
|         ],
 | |
|         columnWidth: [60, 140],
 | |
|         header: ["机构", "设备在线率"],
 | |
|         headerBGC: '',
 | |
|         headerHeight: 41,
 | |
|         oddRowBGC: "",
 | |
|         evenRowBGC: "",
 | |
|         align: ["center", "center", "center"],
 | |
|         rowNum: 10,
 | |
|         index: true,
 | |
|         indexHeader: "排名"
 | |
|       },
 | |
|       config1: {
 | |
|         data: [
 | |
|           ['普通用户', '-'],
 | |
|           ['村级管理员', '-'],
 | |
|           ['超级管理员', '-'],
 | |
|           ['测试', '-'],
 | |
|         ],
 | |
|         headerHeight: 41,
 | |
|         oddRowBGC: "",
 | |
|         evenRowBGC: "",
 | |
|         align: ["left", "left", "right"],
 | |
|         index: true,
 | |
|         rowNum: 6,
 | |
|         columnWidth: [50]
 | |
|       },
 | |
|       start: 0,
 | |
|       end: 40,
 | |
|       start1: 0,
 | |
|       end1: 40,
 | |
|       interval: null,
 | |
|       videoData: [],
 | |
|       flag: false,
 | |
|     }
 | |
|   },
 | |
|   methods: {
 | |
|     jsonObj(val) {
 | |
|       return JSON.parse(val || "{}")?.url
 | |
|     },
 | |
|     getOpt(type = "0") {
 | |
|       let opt = {
 | |
|         "0": {
 | |
|           xData: ['2020/7/1', "2020/7/2", "2020/7/3", "2020/7/4", "2020/7/5", "2020/7/6", "2020/7/7", "2020/7/8", "2020/7/9", "2020/7/10", "2020/7/11"],
 | |
|           yData: Array(11).fill(0),
 | |
|           color: "#FFEA2F",
 | |
|           areaStyle: 'rgba(255,234,47,0.2)',
 | |
|           unit: '',
 | |
|         },
 | |
|         "1": {
 | |
|           xData: ["1:00", "2:00", "3:00", "4:00", "5:00", "6:00", "7:00", "8:00", "9:00", "10:00"],
 | |
|           yData: Array(10).fill(0),
 | |
|           color: "#13B5B1",
 | |
|           areaStyle: 'rgba(255,234,47,0.2)',
 | |
|           unit: '次',
 | |
|         },
 | |
|       }
 | |
|       return {
 | |
|         grid: {
 | |
|           top: "5%",
 | |
|           left: "16%",
 | |
|           right: "3%",
 | |
|           bottom: "12%"
 | |
|         },
 | |
|         xAxis: {
 | |
|           show: true,
 | |
|           boundaryGap: false,
 | |
|           type: 'category',
 | |
|           axisLabel: {
 | |
|             show: true,
 | |
|             textStyle: {
 | |
|               color: "#5E9CEA",
 | |
|               fontSize: 12
 | |
|             }
 | |
|           },
 | |
|           axisLine: {
 | |
|             show: false
 | |
|           },
 | |
|           axisTick: {
 | |
|             show: false
 | |
|           },
 | |
|           data: opt[type]["xData"]
 | |
|         },
 | |
|         yAxis: {
 | |
|           type: 'value',
 | |
|           show: true,
 | |
|           axisTick: {
 | |
|             show: false
 | |
|           },
 | |
|           axisLine: {
 | |
|             show: false
 | |
|           },
 | |
|           splitLine: {
 | |
|             show: true,
 | |
|             lineStyle: {
 | |
|               color: ['#103066'],
 | |
|             }
 | |
|           },
 | |
|           axisLabel: {
 | |
|             show: true,
 | |
|             formatter: (val) => `${val}${opt[type]["unit"]}`,
 | |
|             textStyle: {
 | |
|               color: "#5E9CEA",
 | |
|               fontSize: 12
 | |
|             }
 | |
|           },
 | |
|         },
 | |
|         series: [{
 | |
|           symbol: "none",
 | |
|           data: opt[type]["yData"],
 | |
|           type: 'line',
 | |
|           itemStyle: {
 | |
|             normal: {
 | |
|               color: opt[type]["color"],
 | |
|               areaStyle: {
 | |
|                 color: {
 | |
|                   type: 'linear', x2: 0, y2: 1, colorStops: [
 | |
|                     {offset: 0, color: opt[type]["areaStyle"]}, {offset: 1, color: '#000000'}]
 | |
|                 }
 | |
|               }
 | |
|             }
 | |
|           }
 | |
|         }]
 | |
|       }
 | |
|     },
 | |
|     getWebSdkUrlForScreen() {
 | |
|       this.instance.post(`/app/appzyvideoequipment/getWebSdkUrlForTianQiaoScreen`).then(res => {
 | |
|         if (res.code == 0) {
 | |
|           this.videoData = res.data
 | |
|           this.flag = true
 | |
|         }
 | |
|       })
 | |
|     }
 | |
|   },
 | |
|   beforeDestroy() {
 | |
|     this.interval && clearInterval(this.interval);
 | |
|   },
 | |
|   mounted() {
 | |
|     // this.getWebSdkUrlForScreen()
 | |
|   },
 | |
| }
 | |
| </script>
 | |
| 
 | |
| <style lang="scss" scoped>
 | |
| .AppVideoMonitoringDV {
 | |
|   height: 100%;
 | |
|   padding: 6px 0 10px;
 | |
|   display: flex;
 | |
|   flex-direction: column;
 | |
|   gap: 24px;
 | |
| 
 | |
|   .body {
 | |
|     height: 100%;
 | |
| 
 | |
|     .left-wrap {
 | |
|       width: 307px;
 | |
|       height: 100%;
 | |
| 
 | |
|       .left-top {
 | |
|         width: 100%;
 | |
|         background-image: url("./assets/videoMonitor/box1.png");
 | |
|         background-size: 100% 100%;
 | |
|         position: relative;
 | |
|         overflow: hidden;
 | |
| 
 | |
|         .table {
 | |
|           box-sizing: border-box;
 | |
|           padding: 63px 17px 17px;
 | |
|         }
 | |
|       }
 | |
| 
 | |
|       .left-bottom {
 | |
|         width: 100%;
 | |
|         height: 311px;
 | |
|         background-image: url("./assets/videoMonitor/box2.png");
 | |
|         background-size: 100% 100%;
 | |
|         margin-top: 7px;
 | |
|         display: flex;
 | |
|         align-items: center;
 | |
|         justify-content: center;
 | |
|         position: relative;
 | |
| 
 | |
|         .AiMap {
 | |
|           width: 274px;
 | |
|           height: 247px;
 | |
|           margin-top: 40px;
 | |
|         }
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     .center-wrap {
 | |
|       width: 1183px;
 | |
|       height: 100%;
 | |
| 
 | |
|       .card {
 | |
|         height: 93.3px;
 | |
|         display: flex;
 | |
|         align-items: center;
 | |
|         justify-content: center;
 | |
|         background-image: url("./assets/videoMonitor/card.png");
 | |
|         background-size: 100% 100%;
 | |
|         margin-right: 24px;
 | |
| 
 | |
|         &:last-child {
 | |
|           margin-right: 0;
 | |
|         }
 | |
| 
 | |
|         & > span:first-child {
 | |
|           font-size: 20px;
 | |
|           font-weight: 400;
 | |
|           color: #FFFFFF;
 | |
|         }
 | |
| 
 | |
|         & > span:last-child {
 | |
|           font-size: 38px;
 | |
|           font-family: dineng, serif;
 | |
|           font-weight: bold;
 | |
|           color: #00EDFF;
 | |
|           margin-left: 13px;
 | |
|         }
 | |
|       }
 | |
| 
 | |
|       .center-bottom {
 | |
|         width: 100%;
 | |
|         height: 789px;
 | |
|         background-image: url("./assets/videoMonitor/middlebox.png");
 | |
|         background-size: 100% 100%;
 | |
|         margin-top: 40px;
 | |
|         position: relative;
 | |
|         box-sizing: border-box;
 | |
|         padding: 61px;
 | |
| 
 | |
|         .video-wrap {
 | |
|           width: 100%;
 | |
|           height: 344px;
 | |
|           display: flex;
 | |
|           justify-content: space-between;
 | |
|           margin-bottom: 12px;
 | |
| 
 | |
|           .item {
 | |
|             .video {
 | |
|               width: 522px;
 | |
|               height: 296px;
 | |
|               object-fit: fill;
 | |
|               vertical-align: bottom;
 | |
|               border: 2px solid #122C7D;
 | |
|             }
 | |
| 
 | |
|             .info {
 | |
|               height: 48px;
 | |
|               display: flex;
 | |
|               align-items: center;
 | |
|               justify-content: space-between;
 | |
|               box-sizing: border-box;
 | |
|               padding: 0 12px;
 | |
|               background-color: #071153;
 | |
|               font-size: 14px;
 | |
|               color: #FFFFFF;
 | |
|             }
 | |
|           }
 | |
|         }
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     .right-wrap {
 | |
|       width: 297px;
 | |
|       height: 100%;
 | |
| 
 | |
|       .right-top {
 | |
|         width: 100%;
 | |
|         height: 333px;
 | |
|         background-image: url("./assets/videoMonitor/box3.png");
 | |
|         background-size: 100% 100%;
 | |
|         position: relative;
 | |
|         overflow: hidden;
 | |
| 
 | |
|         .total {
 | |
|           font-size: 16px;
 | |
|           color: #979AB7;
 | |
|           display: inline-block;
 | |
|           margin: 65px 0 16px 23px;
 | |
| 
 | |
|           & > span:nth-child(1) {
 | |
|             font-size: 28px;
 | |
|             font-family: dineng, serif;
 | |
|             font-weight: bold;
 | |
|             color: #01CAFF;
 | |
|           }
 | |
| 
 | |
|           & > span:nth-child(2) {
 | |
|             font-size: 16px;
 | |
|             color: #01CAFF;
 | |
|           }
 | |
|         }
 | |
| 
 | |
|         .total-table {
 | |
|           height: 200px;
 | |
|           box-sizing: border-box;
 | |
|           padding: 0 23px;
 | |
|         }
 | |
|       }
 | |
| 
 | |
|       .right-middle, .right-bottom {
 | |
|         width: 100%;
 | |
|         height: 276px;
 | |
|         background-image: url("./assets/videoMonitor/box4.png");
 | |
|         background-size: 100% 100%;
 | |
|         margin: 19px 0;
 | |
|         position: relative;
 | |
|         overflow: hidden;
 | |
| 
 | |
|         .tag {
 | |
|           margin: 28px 18px 0 0;
 | |
|           display: flex;
 | |
|           justify-content: flex-end;
 | |
|           font-size: 12px;
 | |
|           color: #5E9CEA;
 | |
| 
 | |
|           & > span {
 | |
|             font-size: 12px;
 | |
|             color: #FFFFFF;
 | |
|             display: inline-block;
 | |
|             width: 34px;
 | |
|             height: 17px;
 | |
|             text-align: center;
 | |
|             line-height: 18px;
 | |
|             margin-left: 14px;
 | |
|           }
 | |
|         }
 | |
| 
 | |
|         ::v-deep .AiEchart {
 | |
|           width: 251px;
 | |
|           height: 175px;
 | |
|           margin: 11px auto 0;
 | |
|         }
 | |
| 
 | |
|         .info {
 | |
|           font-size: 12px;
 | |
|           color: #FFFFFF;
 | |
|           line-height: 24px;
 | |
|           box-sizing: border-box;
 | |
|           padding: 15px 19px 0;
 | |
| 
 | |
|           & > span:nth-child(2n+1) {
 | |
|             font-size: 18px;
 | |
|             font-weight: 400;
 | |
|             line-height: 24px;
 | |
|             color: #FFE930;
 | |
|           }
 | |
| 
 | |
|           & > span:nth-child(2n) {
 | |
|             font-size: 14px;
 | |
|             font-weight: 400;
 | |
|             color: #FFE930;
 | |
|             line-height: 24px;
 | |
|             margin: 0 5px;
 | |
|           }
 | |
| 
 | |
|           & > span:nth-child(2) {
 | |
|             margin-right: 22px;
 | |
|           }
 | |
|         }
 | |
|       }
 | |
| 
 | |
|       .right-bottom {
 | |
|         margin: 0;
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   .label {
 | |
|     position: absolute;
 | |
|     left: 24px;
 | |
|     top: 23px;
 | |
|     font-size: 16px;
 | |
|     font-weight: 600;
 | |
|     color: #FFFFFF;
 | |
|   }
 | |
| 
 | |
|   ::v-deep .index {
 | |
|     background-color: transparent !important;
 | |
|   }
 | |
| 
 | |
|   ::v-deep .header {
 | |
|     background: url("./assets/videoMonitor/titlebox.png");
 | |
|   }
 | |
| 
 | |
|   ::v-deep .row-item div:nth-child(3) {
 | |
|     font-size: 13px;
 | |
|     color: #00CDFF;
 | |
|   }
 | |
| }
 | |
| </style>
 |