xieqy 2 years ago
parent
commit
059530c800

File diff suppressed because it is too large
+ 74 - 0
public/HikVision/jquery-1.12.4.min.js


File diff suppressed because it is too large
+ 5 - 0
public/HikVision/jsWebControl-1.0.0.min.js


File diff suppressed because it is too large
+ 1 - 0
public/HikVision/jsencrypt.min.js


BIN
public/HikVision/plugin/VideoWebPlugin.exe


File diff suppressed because it is too large
+ 0 - 1279
public/hLive/css/video.css


File diff suppressed because it is too large
+ 0 - 2
public/hLive/js/jQ.js


File diff suppressed because it is too large
+ 0 - 24282
public/hLive/js/video.js


File diff suppressed because it is too large
+ 0 - 14076
public/hLive/js/videojs-live.js


+ 0 - 58
public/hLive/video.html

@@ -1,58 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-    <meta charset="utf-8" />
-    <title>视频预览</title>
-    <link href="./css/video.css" rel="stylesheet">
-    <script src="./js/video.js"></script>
-    <script src="./js/videojs-live.js"></script>
-    <style>
-        html,body{height:100%}
-        * { box-sizing: initial }
-    </style>
-</head>
-<body style="margin: 0;" onload="init()">
-    <div id="video" class="video-coverInfo-template"  style="width:100%;height:100%;">
-        <!-- <video id="my_video_1" autoplay="autoplay" loop="loop" muted="muted" class="video-js vjs-default-skin" 
-                    controls preload="auto" width="320" height="240" data-setup='{}'>
-            <source src="http://183.230.61.217:8093/hls/sbltbz.m3u8" type="application/x-mpegURL">
-        </video> -->
-    </div>
-    <!-- <script src="./js/jQ.js"></script>    -->
-    <script type="text/javascript">
-        // $(function () {
-        //     //初始化IP地址、端口、用户名、密码、宽度高度
-        //     var _url = queryString("url");
-        //     var _iWidth = queryString("width") || "800";
-        //     var _iHeight = queryString("height") || "600";
-        //     document.getElementById('video').innerHTML = 
-        //         '<video id="my_video_1" autoplay="autoplay" loop="loop" muted="muted" class="video-js vjs-default-skin" controls preload="auto"' + 
-        //         ' style="width:100%;height:100%" data-setup="{}"><source src="' + _url + '" type="application/x-mpegURL"></video>'
-            
-        // });
-
-        // function queryString(val) {
-        //     var uri = window.location.search;
-        //     var re = new RegExp("" + val + "\=([^\&\?]*)", "ig");
-        //     return ((uri.match(re)) ? decodeURIComponent((uri.match(re)[0].substr(val.length + 1))) : null);
-        // }
-
-        function init() {
-            var url = window.location.search.substring(1);
-            var vars = {}
-            url.split("&").map((e) => {
-                var att = e.split("=")
-                vars[att[0]] = att[1]
-            })
-            url = vars['url']
-            if(url != '')
-            document.getElementById('video').innerHTML = 
-                '<video id="my_video_1" autoplay="autoplay" loop="loop" muted="muted" class="video-js vjs-default-skin" controls preload="auto"' + 
-                ' style="width:100%;height:100%" data-setup="{}"><source src="' + vars['url'] + '" type="application/x-mpegURL"></video>'
-            else 
-            document.getElementById('video').innerHTML = 
-                '<img src="./image/nullVideo.png" style="position: absolute;left: 50%;top: 50%;transform: translate(-50%, -50%);"/>' //'<div style="background:url(./image/nullVideo.png);background-size:100% 100%;width:100%;height:100%;"></div>'
-        }
-    </script>
-</body>
-</html>

+ 0 - 24
public/hkVideo/demo-easy.html

@@ -1,24 +0,0 @@
-<!doctype html>
-<html style="height: 100%;">
-<head>
-	<title></title>
-	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-	<meta http-equiv="Pragma" content="no-cache" />
-	<meta http-equiv="Cache-Control" content="no-cache, must-revalidate" />
-	<meta http-equiv="Expires" content="0" />
-	<style>
-		div#divPlugin div {
-			height: 100% !important;
-			width: 100% !important;
-		}
-	</style>
-</head>
-<body style="margin:0;height: 100%;">
-<div style="height: 100%;">
-	<div id="divPlugin" class="plugin" style="height: 100%;"></div>
-</div>
-</body>
-<script src="./js/jquery-1.7.1.min.js"></script>
-<script src="./js/webVideoCtrl.js"></script>
-<script src="./js/demo-easy.js"></script>
-</html>

BIN
public/hkVideo/image/nullVideo.png


+ 0 - 88
public/hkVideo/js/demo-easy.js

@@ -1,88 +0,0 @@
-$(function () {
-    //初始化IP地址、端口、用户名、密码、宽度高度
-    var _szIp = queryString("ip");
-    var _szPort = queryString("port");
-    var _szUsername = queryString("user");
-    var _szPassword = queryString("password");
-    var _iWidth = queryString("width") || "800";
-    var _iHeight = queryString("height") || "600";
-	
-	//var _szIp = "192.168.0.10";
-    //var _szPort = "8000";
-    //var _szUsername = "admin";
-    //var _szPassword = "sg85214551";
-    //var _iWidth = "800";
-    //var _iHeight = "600";
-    if(!_szIp) {        
-        document.getElementById('divPlugin').innerHTML = '<img src="./image/nullVideo.png" style="position: absolute;left: 50%;top: 50%;transform: translate(-50%, -50%);"/>'
-        return
-    }
-	// 检查插件是否已经安装过
-    var iRet = WebVideoCtrl.I_CheckPluginInstall();
-    //视频无法预览时判断
-    if (-2 == iRet) {
-        $("#divPlugin").html("<div style='background-color:black;color:white;width:" + _iWidth + "px;height:" + _iHeight + "px;text-align:center;line-height:" + _iHeight + "px'>请在IE浏览器中进行视频预览!</div>");
-        return;
-    } else if (-1 == iRet) {
-        $("#divPlugin").html("<div style='background-color:black;color:white;width:" + _iWidth + "px;height:" + _iHeight + "px;text-align:center;line-height:" + _iHeight + "px'>您还未安装过插件,双击开发包目录里的WebComponentsKit.exe安装!</div>");
-        return;
-    }
-
-	var oPlugin = {
-        iWidth: _iWidth,			// plugin width
-        iHeight: _iHeight			// plugin height
-	};
-
-	// 初始化插件参数及插入插件
-	WebVideoCtrl.I_InitPlugin(oPlugin.iWidth, oPlugin.iHeight, {
-        bWndFull: true,//是否支持单窗口双击全屏,默认支持 true:支持 false:不支持
-        iWndowType: 1,
-		cbSelWnd: function (xmlDoc) {
-
-		}
-	});
-	WebVideoCtrl.I_InsertOBJECTPlugin("divPlugin");
-
-	// 检查插件是否最新
-	if (-1 == WebVideoCtrl.I_CheckPluginVersion()) {
-		alert("检测到新的插件版本,双击开发包目录里的WebComponentsKit.exe升级!");
-		return;
-	}
-
-	var oLiveView = {
-		iProtocol: 1,			// protocol 1:http, 2:https
-        szIP: _szIp,	// protocol ip
-        szPort: _szPort,			// protocol port
-        szUsername: _szUsername,	// device username
-        szPassword: _szPassword,	// device password
-		iStreamType: 1,			// stream 1:main stream  2:sub-stream  3:third stream  4:transcode stream
-		iChannelID: 1,			// channel no
-		bZeroChannel: false		// zero channel
-	};
-
-	// 登录设备
-    var iRet = WebVideoCtrl.I_Login(oLiveView.szIP, oLiveView.iProtocol, oLiveView.szPort, oLiveView.szUsername, oLiveView.szPassword, {
-		success: function (xmlDoc) {
-			// 开始预览
-			WebVideoCtrl.I_StartRealPlay(oLiveView.szIP, {
-				iStreamType: oLiveView.iStreamType,
-				iChannelID: oLiveView.iChannelID,
-				bZeroChannel: oLiveView.bZeroChannel
-			});
-        },
-        error: function () {
-            $("#divPlugin").html("<div style='background-color:black;color:white;width:" + _iWidth + "px;height:" + _iHeight + "px;text-align:center;line-height:" + _iHeight+"px'>" + oLiveView.szIP + " 登录失败!</div>");
-        }
-    });
-
-	// 关闭浏览器
-	$(window).unload(function () {
-		WebVideoCtrl.I_Stop();
-    });
-});
-
-function queryString(val) {
-    var uri = window.location.search;
-    var re = new RegExp("" + val + "\=([^\&\?]*)", "ig");
-    return ((uri.match(re)) ? decodeURIComponent((uri.match(re)[0].substr(val.length + 1))) : null);
-}

File diff suppressed because it is too large
+ 0 - 4
public/hkVideo/js/jquery-1.7.1.min.js


File diff suppressed because it is too large
+ 0 - 3
public/hkVideo/js/webVideoCtrl.js


+ 4 - 0
public/index.html

@@ -6,6 +6,10 @@
   <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
   <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" />
   <link rel="icon" href="<%= BASE_URL %>favicon.ico" />
+  <!-- hk -->
+  <script src="./HikVision/jquery-1.12.4.min.js"></script>
+  <script src="./HikVision/jsencrypt.min.js"></script>
+  <script src="./HikVision/jsWebControl-1.0.0.min.js"></script>
   <title>城市防排涝综合监管平台</title>
 </head>
 

+ 0 - 5
public/pipeConfig.js

@@ -1,5 +0,0 @@
-export let pipeConfig={
-  layerInfo:{
-
-  },
-}

+ 13 - 18
src/views/login/index.vue

@@ -108,8 +108,6 @@ const sha1Hex = require('sha1-hex')
 const defaultPwd = '000000'
 @Component
 export default class Login extends Vue {
-  name = 'Login'
-  url = '@/assets/images/login/logo.png'
   loginForm = {
     username: '',
     password: ''
@@ -121,9 +119,6 @@ export default class Login extends Vue {
   loading = false
   passwordType = 'password'
   redirect = undefined
-  error = 1
-  // warning: true,
-  msg = ''
   passwordDialog = false // 重置密码用弹窗显隐控制
   changePwd = {
     pass: '', // 重置密码用新密码
@@ -419,22 +414,22 @@ export default class Login extends Vue {
       font-family: Source Han Sans CN;
       transition: background 0.3s linear;
       color: #ffffff;
-      &:hover {
-        border: 2px solid;
-        border-image: linear-gradient(45deg, #2d74e7, #24bae8) 1;
-        clip-path: inset(0px round 2px);
-        animation: huerotate 6s infinite linear;
-        filter: hue-rotate(360deg);
+      // &:hover {
+      border: 2px solid;
+      border-image: linear-gradient(45deg, #2d74e7, #24bae8) 1;
+      clip-path: inset(0px round 2px);
+      animation: huerotate 6s infinite linear;
+      filter: hue-rotate(360deg);
 
-        @keyframes huerotate {
-          0% {
-            filter: hue-rotate(0deg);
-          }
-          100% {
-            filter: hue-rorate(360deg);
-          }
+      @keyframes huerotate {
+        0% {
+          filter: hue-rotate(0deg);
+        }
+        100% {
+          filter: hue-rorate(360deg);
         }
       }
+      // }
     }
   }
 }

+ 361 - 0
src/views/videoMonitoring/MonitoringCenter/hikVideo.vue

@@ -0,0 +1,361 @@
+<template>
+  <div
+    class="widget-hikVideo"
+    v-loading="loading"
+    element-loading-text="拼命加载中"
+    element-loading-spinner="el-icon-loading"
+  >
+    <div id="playMain" class="playMain">
+      <div :id="`playWnd${videoPanelId}`" class="playWnd" :ref="`playWnd${this.videoPanelId}`"></div>
+    </div>
+    <div class="bottom">
+      <el-pagination
+        background
+        :current-page="pageparam.current"
+        :page-size="pageparam.size"
+        prev-text="上一页"
+        next-text="下一页"
+        layout="prev, pager, next"
+        :total="pageparam.total"
+        @size-change="handleSizeChange"
+        @current-change="handleCurrentChange"
+      >
+      </el-pagination>
+    </div>
+  </div>
+</template>
+
+<script lang="ts">
+import { Vue, Component, Prop, Watch } from 'vue-property-decorator'
+import { getCamerList } from '../common/requestapis'
+const WebControl = (window as any).WebControl
+const JSEncrypt = (window as any).JSEncrypt
+//视频监控中心
+@Component({
+  name: 'hikVideo',
+  components: {}
+})
+export default class hikVideo extends Vue {
+  @Prop({ type: String, default: () => ({}) }) videoPanelId!: string
+  @Prop({ type: String, default: () => ({}) }) showNum!: string
+  @Watch('showNum')
+  onChangeNumMethod(val) {
+    switch (val) {
+      case 'single':
+        this.initparam.layout = '1x1'
+        this.pageparam.size = 1
+        break
+      case 'fourth':
+        this.initparam.layout = '2x2'
+        this.pageparam.size = 4
+        break
+      case 'ninth':
+        this.initparam.layout = '3x3'
+        this.pageparam.size = 9
+        break
+    }
+    this.destroyWnd()
+    this.initPlugin()
+  }
+  loading = true
+  //视频播放插件参数
+  initparam = {
+    appKey: '26361415',
+    secret: '12hp9GRlHu1BkL09nL0Q',
+    apiIp: '183.255.30.6',
+    apiPort: 10443,
+    isLive: 0,
+    layout: '3x3'
+  }
+  cameraIndexCode = ''
+  oWebControl = null
+  settingId = ''
+  initCount = 0
+  pubKey = ''
+  //分页参数
+  pageparam = {
+    current: 1,
+    size: 9,
+    total: 0,
+    pagecount: 0
+  }
+  //computed
+  get playWnd() {
+    return this.$refs[`playWnd${this.videoPanelId}`] as any
+  }
+  mounted() {
+    this.initPlugin()
+  }
+  handleSizeChange(pageSize) {
+    this.loading = true
+    this.pageparam.size = pageSize
+    this.videoPreview()
+  }
+  handleCurrentChange(currentPage) {
+    this.loading = true
+    this.pageparam.current = currentPage
+    this.videoPreview()
+  }
+  //初始化插件
+  initPlugin() {
+    const that = this
+    that.settingId = this.videoPanelId
+    that.oWebControl = new WebControl({
+      szPluginContainer: 'playWnd' + that.settingId, // 指定容器id
+      iServicePortStart: 15900, // 指定起止端口号,建议使用该值
+      iServicePortEnd: 15909,
+      szClassId: '23BF3B0A-2C56-4D97-9C03-0CB103AA8F11', // 用于IE10使用ActiveX的clsid
+      cbConnectSuccess: () => {
+        that.initCount = 0
+        // ----------创建WebControl实例成功 启动插件---------
+        // ---------------2.JS_StartService-----------------
+        // 创建WebControl实例成功
+        that.oWebControl
+          .JS_StartService('window', {
+            // WebControl实例创建成功后需要启动服务
+            dllPath: './VideoPluginConnect.dll' // 值"./VideoPluginConnect.dll"写死
+          })
+          .then(
+            () => {
+              // 启动插件服务成功
+              that.oWebControl.JS_SetWindowControlCallback({})
+              //JS_CreateWnd创建视频播放窗口,宽高可设定
+              that.oWebControl
+                .JS_CreateWnd('playWnd' + that.settingId, that.playWnd.offsetWidth, that.playWnd.offsetHeight)
+                .then(() => {
+                  this.oWebControl.JS_HideWnd()
+                  this.init()
+                })
+            },
+            function () {
+              // 启动插件服务失败
+              console.log('JS_CreateWnd error')
+            }
+          )
+      },
+      cbConnectError: () => {
+        // 创建WebControl实例失败
+        that.oWebControl = null
+        WebControl.JS_WakeUp('VideoWebPlugin://') // 程序未启动时执行error函数,采用wakeup来启动程序
+        that.initCount++
+        if (that.initCount < 3) {
+          setTimeout(() => {
+            that.initPlugin() // 重新创建播放实例
+          }, 3000)
+        } else {
+          window.open('/HikVision/plugin/VideoWebPlugin.exe', '_blank')
+          // $('#playWnd').html('插件启动失败,请检查插件是否安装!')
+          this.$message('插件启动失败,请检查插件是否安装!')
+        }
+      },
+      cbConnectClose: () => {
+        //bNormalClose
+        // 异常断开:bNormalClose = false
+        // JS_Disconnect正常断开:bNormalClose = true
+        this.oWebControl = null
+      }
+    })
+  }
+  //初始化
+  init() {
+    this.getPubKey(() => {
+      var appkey = this.initparam.appKey //综合安防管理平台提供的appkey,必填
+      var secret = this.setEncrypt(this.initparam.secret) //综合安防管理平台提供的secret,必填
+      var ip = this.initparam.apiIp //综合安防管理平台IP地址,必填
+      var playMode = this.initparam.isLive //初始播放模式:0-预览,1-回放
+      var port = this.initparam.apiPort //综合安防管理平台端口,若启用HTTPS协议,默认443
+      var snapDir = '' //抓图存储路径
+      var videoDir = '' //紧急录像或录像剪辑存储路径
+      var layout = this.initparam.layout //playMode指定模式的布局
+      var enableHTTPS = 1 //是否启用HTTPS协议与综合安防管理平台交互,这里总是填1
+      var encryptedFields = 'secret' //加密字段,默认加密领域为secret
+      var showToolbar = 0 //是否显示工具栏,0-不显示,非0-显示
+      var showSmart = 1 //是否显示智能信息(如配置移动侦测后画面上的线框),0-不显示,非0-显示
+      var buttonIDs = '0,1,256,257,258,259,260,512,513,514,515,516,517,768,769' //自定义工具条按钮
+      this.oWebControl
+        .JS_RequestInterface({
+          //通用请求响应接口
+          funcName: 'init', // 功能标识
+          argument: JSON.stringify({
+            appkey: appkey, //API网关提供的appkey
+            secret: secret, //API网关提供的secret
+            ip: ip, //API网关IP地址
+            playMode: playMode, //播放模式(决定显示预览还是回放界面)
+            port: port, //端口
+            snapDir: snapDir, //抓图存储路径
+            videoDir: videoDir, //紧急录像或录像剪辑存储路径
+            layout: layout, //布局
+            enableHTTPS: enableHTTPS, //是否启用HTTPS协议
+            encryptedFields: encryptedFields, //加密字段
+            showToolbar: showToolbar, //是否显示工具栏
+            showSmart: showSmart, //是否显示智能信息
+            buttonIDs: buttonIDs //自定义工具条按钮
+            //              toolBarButtonIDs:toolBarButtonIDs//自定义工具条按钮字符串
+            //              name:name//无效
+          })
+        })
+        .then(() => {
+          // 初始化后resize一次,规避firefox下首次显示窗口后插件窗口未与DIV窗口重合问题
+          this.oWebControl.JS_Resize(this.playWnd.offsetWidth, this.playWnd.offsetHeight)
+          if (this.initparam.isLive == 0) {
+            this.videoPreview()
+          } else {
+            this.startPlayback() //初始化后开启回放
+          }
+          this.oWebControl.JS_ShowWnd()
+        })
+    })
+  }
+  //获取公钥
+  getPubKey(callback) {
+    const that = this
+    that.oWebControl
+      .JS_RequestInterface({
+        funcName: 'getRSAPubKey',
+        argument: JSON.stringify({
+          keyLength: 1024
+        })
+      })
+      .then(function (oData) {
+        if (oData.responseMsg.data) {
+          that.pubKey = oData.responseMsg.data
+          callback()
+        }
+      })
+  }
+  //RSA加密
+  setEncrypt(value) {
+    var encrypt = new JSEncrypt()
+    encrypt.setPublicKey(this.pubKey)
+    return encrypt.encrypt(value)
+  }
+  /**
+   * @description 预览视频
+   */
+  videoPreview() {
+    //API视频预览
+    getCamerList(this.pageparam)
+      .then((res) => {
+        if (res.code == 1) {
+          //摄像头数量
+          this.pageparam.total = res.result.result.total
+          this.pageparam.pagecount = res.result.result.pages
+          res.result.result.records.forEach((item, index) => {
+            this.startPreview({
+              cameraIndexCode: item.code,
+              wndId: index + 1
+            }) //初始化后开启预览
+          })
+        }
+        this.loading = false
+      })
+      .catch((err) => {
+        this.loading = false
+      })
+
+    // 自定义缩放
+    window.addEventListener('resize', () => {
+      this.oWebControl.JS_Resize(this.playWnd.offsetWidth, this.playWnd.offsetHeight)
+    })
+  }
+  //视频“预览”功能
+  startPreview(cameraparam) {
+    let streamMode = 0 //主子码流标识:0-主码流,1-子码流
+    let transMode = 1 //传输协议:0-UDP,1-TCP
+    let gpuMode = 0 //是否启用GPU硬解,0-不启用,1-启用
+    let wndId = cameraparam.wndId //播放窗口序号(在2x2以上布局下可指定播放窗口)  -1
+    //去除cameraIndexCode内前后的空格
+    let cameraIndexCode = cameraparam.cameraIndexCode.replace(/(^\s*)/g, '') //获取输入的监控点编号值,必填
+    cameraIndexCode = cameraparam.cameraIndexCode.replace(/(\s*$)/g, '')
+    this.oWebControl
+      .JS_RequestInterface({
+        funcName: 'startPreview',
+        argument: JSON.stringify({
+          cameraIndexCode: cameraIndexCode,
+          streamMode: streamMode,
+          transMode: transMode,
+          gpuMode: gpuMode,
+          wndId: wndId,
+          ezvizDirect: 0,
+          cascade: 1
+        })
+      })
+      .then(function (oData) {})
+  }
+  //视频“回放”功能
+  startPlayback() {
+    var startTimeStamp = new Date().getTime()
+    var endTimeStamp = startTimeStamp + 60 * 60 * 24 * 1000 - 1
+    let recordLocation = 1 //录像存储类型 0-中心存储 1-设备存储
+    let streamMode = 0 //主子码流标识:0-主码流,1-子码流
+    let transMode = 1 //传输协议:0-UDP,1-TCP
+    let gpuMode = 0 //是否启用GPU硬解,0-不启用,1-启用
+    //      let wndId = -1; //播放窗口序号(在2x2以上布局下可指定播放窗口)
+    //      let cameraIndexCode = this.cameraIndexCode; //获取输入的监控点编号值,必填
+    let cameraIndexCode = this.cameraIndexCode //获取输入的监控点编号值,必填
+
+    //去除cameraIndexCode内前后的空格
+    cameraIndexCode = cameraIndexCode.replace(/(^\s*)/g, '')
+    cameraIndexCode = cameraIndexCode.replace(/(\s*$)/g, '')
+
+    this.oWebControl.JS_RequestInterface({
+      funcName: 'startPlayback',
+      argument: JSON.stringify({
+        cameraIndexCode: cameraIndexCode, //监控点编号
+        recordLocation: recordLocation, // 录像存储类型
+        streamMode: streamMode, //主子码流标识
+        transMode: transMode, //传输协议
+        gpuMode: gpuMode, //是否开启GPU硬解
+        //          wndId: wndId, //可指定播放窗口
+        startTimeStamp: Math.floor(startTimeStamp / 1000).toString(), //录像查询开始时间戳,单位:秒
+        endTimeStamp: Math.floor(endTimeStamp / 1000).toString() //录像结束开始时间戳,单位:秒
+      })
+    })
+  }
+  // 销毁插件
+  destroyWnd() {
+    if (this.oWebControl) {
+      this.oWebControl.JS_HideWnd()
+      this.oWebControl
+        .JS_DestroyWnd({
+          funcName: 'destroyeWnd'
+        })
+        .then(function (oData) {
+          console.log('销毁成功')
+        })
+    } else {
+      console.log('没有实例')
+    }
+  }
+  beforeDestroy() {
+    this.destroyWnd()
+  }
+}
+</script>
+
+<style lang='scss' scoped>
+.widget-hikVideo {
+  height: 100%;
+  width: 100%;
+  z-index: 99;
+  .playMain {
+    height: calc(100% - 40px);
+    width: 100%;
+    .playWnd {
+      overflow: hidden;
+      height: 100%;
+      width: 100%;
+      padding: 5px;
+      margin: 0 auto;
+    }
+  }
+  .bottom {
+    height: 40px;
+    // width: 100%;
+    position: absolute;
+    right: 0;
+    display: flex;
+    align-items: flex-end;
+  }
+}
+</style>

+ 197 - 0
src/views/videoMonitoring/MonitoringCenter/widget.vue

@@ -0,0 +1,197 @@
+<template>
+  <div class="widget-MonitoringCenter">
+    <div class="toolBox">
+      <el-switch v-model="isRound" inactive-text="轮播:"></el-switch>
+      <div class="listShowType">
+        <span>显示方式:</span>
+        <div class="button-group">
+          <el-button size="mini" v-for="item in typeList" :key="item.type" @click="changeShowType(item.type)">
+            <img :src="currentShowType == item.type ? item.himg : item.img" />
+          </el-button>
+        </div>
+      </div>
+    </div>
+    <el-tabs v-model="currentActive" @tab-click="tabChange">
+      <el-tab-pane v-for="item in tabItems" :key="item.name" :label="item.label" :name="item.name">
+        <div class="leftPanel">
+          <el-input
+            class="searchInput"
+            placeholder="支持搜索设备名称"
+            suffix-icon="el-icon-search"
+            size="small"
+            v-model="searchDevice"
+            clearable
+          >
+          </el-input>
+          <el-tree
+            :ref="`tree${item.name}`"
+            class="dataListTree"
+            show-checkbox
+            default-expand-all
+            node-key="id"
+            :data="data"
+            :default-checked-keys="[5]"
+            :props="defaultProps"
+            :filter-node-method="filterNode"
+          >
+          </el-tree>
+        </div>
+        <div class="rightPanel">
+          <HikVideo v-if="currentActive == item.name" :showNum="currentShowType" :videoPanelId="item.name" />
+        </div>
+      </el-tab-pane>
+    </el-tabs>
+  </div>
+</template>
+
+<script lang="ts">
+import { Vue, Component, Prop, Watch } from 'vue-property-decorator'
+import { ITabItems } from '../common/common'
+import { typeList } from '../common/settings'
+import HikVideo from './hikVideo.vue'
+//视频监控中心
+@Component({
+  name: 'MonitoringCenter',
+  components: { HikVideo }
+})
+export default class MonitoringCenter extends Vue {
+  isRound: Boolean = true
+
+  searchDevice: String = ''
+
+  tabItems: ITabItems[] = []
+
+  currentActive: String = 'first'
+
+  currentShowType: String = 'ninth'
+
+  data = [
+    {
+      id: 1,
+      label: '全部',
+      children: [
+        {
+          id: 2,
+          label: '污水厂',
+          children: []
+        },
+        {
+          id: 3,
+          label: '河道',
+          children: []
+        },
+        {
+          id: 4,
+          label: '易涝点',
+          children: []
+        }
+      ]
+    }
+  ]
+  defaultProps = {
+    children: 'children',
+    label: 'label'
+  }
+  //computed
+  get typeList() {
+    return typeList
+  }
+  @Watch('searchDevice')
+  filterText(val) {
+    ;(this.$refs[`tree${this.currentActive}`][0] as Element[]).filter(val)
+  }
+  mounted() {
+    this.tabItems = [
+      { label: '全部(8)', name: 'first' },
+      { label: '污水厂(4)', name: 't' },
+      { label: '河道(4)', name: 's' },
+      { label: '易涝点(0)', name: 'f' }
+    ]
+  }
+  tabChange(tab, event) {
+    this.currentShowType = 'ninth'
+  }
+  //树形列表过滤查找
+  filterNode(value, data) {
+    if (!value) return true
+    return data.label.indexOf(value) !== -1
+  }
+  changeShowType(type) {
+    this.currentShowType = type
+  }
+}
+</script>
+
+<style lang='scss' scoped>
+.widget-MonitoringCenter {
+  height: 100%;
+  width: 100%;
+  @mixin setCenter() {
+    display: flex;
+    align-items: center;
+  }
+  .toolBox {
+    @include setCenter();
+    position: absolute;
+    right: 0;
+    margin: 15px 20px 0 0;
+    height: 20px;
+    z-index: 999;
+    .listShowType {
+      @include setCenter();
+      height: inherit;
+      margin-left: 20px;
+      .button-group {
+        height: inherit;
+        .el-button {
+          line-height: 0;
+          padding: 0;
+          img {
+            object-fit: contain;
+          }
+        }
+      }
+      span {
+        font-size: 14px;
+        font-weight: 500;
+        vertical-align: middle;
+        color: #303133;
+      }
+    }
+  }
+  >>> .el-tabs {
+    height: 100%;
+    width: 100%;
+    .el-tabs__header {
+      background-color: unset;
+    }
+    .el-tabs__item {
+      background: unset !important;
+    }
+    .el-tabs__content > div[role='tabpanel'] {
+      display: flex;
+      padding: 10px;
+    }
+  }
+  .leftPanel,
+  .rightPanel {
+    overflow: auto;
+  }
+  $bcolor: #f8f8f8;
+  .leftPanel {
+    width: 270px;
+    padding: 20px;
+    background-color: $bcolor;
+    .searchInput {
+      margin-bottom: 10px;
+    }
+    .dataListTree {
+      background-color: $bcolor;
+    }
+  }
+  .rightPanel {
+    width: calc(100% - 280px);
+    margin-left: 10px;
+  }
+}
+</style>

+ 4 - 0
src/views/videoMonitoring/common/common.ts

@@ -0,0 +1,4 @@
+export interface ITabItems {
+    label: string,
+    name: string,
+}

+ 14 - 0
src/views/videoMonitoring/common/requestapis.ts

@@ -0,0 +1,14 @@
+import request from '@/utils/request'
+const getCamera = '212022032200016'//中台 => 摄像头列表
+//中台调用
+export function callInterface(data) {
+    return request({
+        url: '/api/dc/interfacemanage/callInterface',
+        method: 'post',
+        data: data
+    })
+}
+//摄像头列表
+export function getCamerList(params) {
+    return callInterface({ code: getCamera, parameter: params })
+}

+ 16 - 0
src/views/videoMonitoring/common/settings.ts

@@ -0,0 +1,16 @@
+const singleImg = require('../images/single.png')
+const fourthImg = require('../images/fourth.png')
+// const sixthImg = require('../images/sixth.png')
+const ninthImg = require('../images/ninth.png')
+
+const singleImgH = require('../images/singleH.png')
+const fourthImgH = require('../images/fourthH.png')
+// const sixthImgH = require('../images/sixthH.png')
+const ninthImgH = require('../images/ninthH.png')
+
+export const typeList = [
+    { type: 'single', img: singleImg, himg: singleImgH },
+    { type: 'fourth', img: fourthImg, himg: fourthImgH },
+    // { type: 'sixth', img: sixthImg, himg: sixthImgH },
+    { type: 'ninth', img: ninthImg, himg: ninthImgH },
+]

BIN
src/views/videoMonitoring/images/fourth.png


BIN
src/views/videoMonitoring/images/fourthH.png


BIN
src/views/videoMonitoring/images/ninth.png


BIN
src/views/videoMonitoring/images/ninthH.png


BIN
src/views/videoMonitoring/images/single.png


BIN
src/views/videoMonitoring/images/singleH.png


BIN
src/views/videoMonitoring/images/sixth.png


BIN
src/views/videoMonitoring/images/sixthH.png