VUE父子组件之间的相互调用

 

 

父组件:

<template>
  <!-- 保持与设计稿同样比例,保证页面能完全显示,但是四周可能存在留白 -->
  <div class="wrapper">
    <div class="container">
      <div :style="marginStyle">
        <div style="position: relative;">
          <div class="dashboard-container" style="width: 1920px;height: 1080px;" :style="transformStyle">
            <div class="border-container">
              <topLayer ref="topLayer" @triggerBrotherMethods="exit"></topLayer>
            </div>
            <div class="dataview-container">
              <!-- 上半部分 -->
              <!-- <div style="">
                
              </div> -->
              <a-row>
                <!-- 左边部分 -->
                <a-col :span="14">
                  <monitorVideo ref="monitorVideo" v-if=suspectNo :suspectNo="suspectNo"  :cameras="cameras" ></monitorVideo>

                </a-col>
                <!-- 右边部分 -->
                <a-col :span="10">
                  <monitorData ref="monitorData" v-if=suspectNo :suspectNo="suspectNo"></monitorData>
                </a-col>
              </a-row>
              <!-- 下半部分 -->
              <a-row style="height: 40%;">
                <a-col :span="6">
                  <behaviorAnalysis ref="behaviorAnalysis" v-if=suspectNo :suspectNo="suspectNo"></behaviorAnalysis>
                </a-col>
                <a-col :span="6">
                  <sleepAnalysis ref="sleepAnalysis" v-if=suspectNo :suspectNo="suspectNo"></sleepAnalysis>

                </a-col>
                <a-col :span="6">
                  <recentlyAnalysis ref="recentlyAnalysis" v-if=suspectNo :suspectNo="suspectNo"></recentlyAnalysis>
                </a-col>
                <a-col :span="6">
                  <warnMessage ref="warnMessage" v-if=suspectNo :suspectNo="suspectNo"></warnMessage>
                </a-col>
              </a-row>
            </div>
          </div>
        </div>
      </div>
    </div>
  </div>
</template>
<script>
  import {getComputedStyle} from "@/utils/util";
  import {debounce} from "lodash";
  import topLayer from '@/views/trzhkh/wiseCare/modules/topLayer'
  import monitorVideo from '@/views/trzhkh/wiseCare/modules/monitorVideo'
  import monitorData from '@/views/trzhkh/wiseCare/modules/monitorData'
  import behaviorAnalysis from '@/views/trzhkh/wiseCare/modules/behaviorAnalysis'
  import warnMessage from '@/views/trzhkh/wiseCare/modules/warnMessage'
  import sleepAnalysis from '@/views/trzhkh/wiseCare/modules/sleepAnalysis'
  import recentlyAnalysis from '@/views/trzhkh/wiseCare/modules/recentlyAnalysis'
  export default {
    name: "wiseCare",
    components: {
      topLayer,
      monitorVideo,
      monitorData,
      behaviorAnalysis,
      warnMessage,
      sleepAnalysis,
      recentlyAnalysis
    },
    data() {
      return {
        scaleX: 1,
        scaleY: 1,
        marginXHorizontal: 0,
        marginYHorizontal: 0,
        suspectNo: '',
        cameras: ''
      };
    },
    mounted() {
      this.init();
      this.suspectNo = this.$route.query.suspectNo; //接收参数
      this.cameras = this.$route.query.cameras;
      var suspectNo = this.suspectNo;

      console.log("接受参数留置人员编号11---", this.cameras)
    },
    computed: {
      transformStyle: function() {
        return {
          transform: `scale(${this.scaleX}, ${this.scaleY}) translate3d(0.001%, 0.001%, 0)`
        };
      },
      marginStyle: function() {
        return {
          margin: `${this.marginYHorizontal}px ${this.marginXHorizontal}px`
        };
      }
    },
    methods: {
      // 子组件2中click事件
      triggerBrotherMethods() {
      // 父组件通过$ref调用子组件1中的事件方法
      this.$refs.borther[1].bortherMethods()
      },
      init() {
        this.listenResize();
      },
      initData() {
        this.scaleX = 1;
        this.scaleY = 1;
        this.marginXHorizontal = 0;
        this.marginYHorizontal = 0;
      },
      initScale() {
        this.initData();
        // return;
        let $container = document.querySelector('.container');
        let containerWidth = getComputedStyle($container, 'width').replace("px", "");
        let containerHeight = getComputedStyle($container, 'height').replace("px", "");
        containerWidth = Number(containerWidth);
        containerHeight = Number(containerHeight);
        containerWidth = isNaN(containerWidth) ? 0 : containerWidth;
        containerHeight = isNaN(containerHeight) ? 0 : containerHeight;

        let defaultHeight = 1080;
        let defaultWidth = 1920;
        // sacle 缩放比例。
        let scale = 1;
        let scaleY = containerHeight / defaultHeight;
        let scaleX = containerWidth / defaultWidth;
        if (containerHeight < defaultHeight) {
          scale = containerHeight / defaultHeight;
          this.scaleX = scaleX;
          this.scaleY = scaleY;
          this.$bus.$emit('getScale', {
            scaleX,
            scaleY
          });
          // console.log("height", scale);
        }
        // 然后 width
        else if (containerWidth < defaultWidth) {
          scale = containerWidth / defaultWidth;
          this.scaleX = scaleX;
          this.scaleY = scaleY;
          this.$bus.$emit('getScale', {
            scaleX,
            scaleY
          });
          // console.log("width", scale);
        } else if (containerHeight > defaultHeight && containerWidth > defaultWidth) {
          // let h = containerHeight / defaultHeight;
          // let w = containerWidth / defaultWidth;
          // scale = w;
          this.scaleX = containerWidth / defaultWidth;
          this.scaleY = containerHeight / defaultHeight;
          this.$bus.$emit('getScale', {
            scaleX,
            scaleY
          });
        }
        // scale = Math.min.apply(null, [this.scaleY, this.scaleX]);
        let marginWidth = defaultWidth * this.scaleX;
        if (containerWidth > marginWidth) {
          marginWidth = (containerWidth - marginWidth) / 2;
          this.marginXHorizontal = marginWidth;
        }
        let marginHeight = defaultHeight * this.scaleY;
        if (containerHeight > marginHeight) {
          marginHeight = (containerHeight - marginHeight) / 2;
          this.marginYHorizontal = marginHeight;
        }
      },
      listenResize() {
        this.initScale();
        window.addEventListener('resize', debounce(() => {
          this.initScale();
        }, 300));
      }
     
    },

    destroyed() {}
  }
</script>

<style lang="less">
  @fontColor: #f2b61b;

  .wrapper {
    position: relative;
    height: 100%;
    width: 100%;
    position: relative;
    // background-size: 100% 100%;
  }

  .container {
    overflow: hidden;
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
  }

  .dashboard-container {
    position: relative;
    user-select: none;
    width: 100%;
    height: 100%;
    transform-origin: 0 0;
    transition: all .3s linear;
    overflow: hidden;
    background: transparent url(~@/assets/images/dataview/dataview-bg.png) center top no-repeat;
    background-size: 100% 100%;
  }

  .top {
    position: absolute;
    margin-left: 20px;
    top: 47px;
    width: 1920px;
    height: 67px;
    /*background: transparent url(~@/assets/border-big.png) center top no-repeat;*/
  }

  @keyframes jumpLine1 {
    0% {
      transform: translate(10px, 0px);
    }

    100% {
      transform: translate(190px, 0px);
    }
  }

  @keyframes jumpLine2 {
    0% {
      transform: translate(0px, 0px);
    }

    100% {
      transform: translate(-180px, 0px);
    }
  }

  @keyframes bounce {
    0% {
      transform: scaleX(0);
    }

    100% {
      transform: scaleX(1);
    }
  }

  .dataview-container {
    box-sizing: border-box;
    margin-top: 110px;
    height: calc(100% - 110px);
    // display: flex;
    // flex-direction: row;
    padding: 0 30px;
  }

  .pannel-title {
    padding: 5px 0 0 60px;
    color: @fontColor;
    font-size: 18px;
  }

  .content-container {
    padding: 30px 20px;
  }

  .scroll-warp {
    overflow: hidden;
  }
</style>

子组件1

<template>
  <div class="monitor-area">

    <div class="monitor-area-top">编号:{{bodyAnalysis.suspectNo}}</div>
    <div class="monitor-content">
      <div class="left">

        <!-- <div class="information-area" v-for="(item, index) in items">
              <div class="information-area-top">{{item.name}}</div>
              <div class="information-area-bottom">{{item.value}}</div>
          </div> -->
        <div class="information-area">
          <div class="information-area-top">性别:</div>
          <div class="information-area-bottom">{{bodyAnalysis.sex}}</div>
        </div>
        <div class="information-area">
          <div class="information-area-top">既往病史:</div>
          <div class="information-area-bottom">{{bodyAnalysis.medicalHistory}}</div>
        </div>
        <div class="information-area">
          <div class="information-area-top">入所日期:</div>
          <div class="information-area-bottom">{{bodyAnalysis.beginTime}}</div>
        </div>
        <div class="information-area">
          <div class="information-area-top">已留置:</div>
          <div class="information-area-bottom">{{bodyAnalysis.beginBetweenDay}}天</div>
        </div>
        <div class="information-area">
          <div class="information-area-top">职级:</div>
          <div class="information-area-bottom">{{bodyAnalysis.dutiesLeval}}</div>
        </div>
        <div class="information-area">
          <div class="information-area-top">当前留置室:</div>
          <div class="information-area-bottom">{{bodyAnalysis.roomName}}</div>
        </div>
        <!-- <div class="information-area">
          <div class="information-area-top">已谈话次数:</div>
          <div class="information-area-bottom">{{bodyAnalysis.talkNum}}次</div>
        </div> -->
        <div class="information-area">
          <div class="information-area-top">已延期天数:</div>
          <div class="information-area-bottom">{{bodyAnalysis.timeOutDay}}</div>
        </div>
      </div>
      <!-- 监控视频部分 -->
      <div class="right">
        <div class="monitor-video-area">
          <hk-video :cameraIndexCodeProp="devicesCode" ></hk-video>
        </div>
        <div class="monitor-video-area">

        </div>

      </div>
    </div>

  </div>
</template>

<script>
  import {
    getBodyAnalysis
  } from '@/api/wiseCare.js'
  import HkVideo from './hkVideo'
  import { getAction, postFormAction, postAction} from '@/api/manage'
  export default {
    components: {
      HkVideo
    },
    props: {
      suspectNo: String,
      cameras: String
    },
    data() {
      return {
        bodyAnalysis: {},
        devicesCode: this.cameras
      }
    },
    computed: {},
    created() {},
    mounted() {
      // this.init()
      this.bodySignAnalysis();

    },
    methods: {
      bortherMethods() {
        // 子组件事件方法
        this.$refs.hkVideo.destroyedView()
      },
      //请求体征分析留置对象信息********************************************************、、
     async bodySignAnalysis() {
        this.loading = true;
        var that = this;
        var suspectNo= this.suspectNo;
        const params = {
          'suspectNo': suspectNo
        };
        // getAction('/objAnalysis/getLienObjBySuspectNo', params)
        // .then(res => {
        //   if (res.success) {
        //     let result = res.result || []
        //     this.bodyAnalysis = result;
        //     console.log("-----请求体征分析------", this.bodyAnalysis);
        //   }
        // })
        // .finally(() => {
        //   this.loading = false
        // })

        try {
          const res = await getBodyAnalysis(params)
          if (res.success) {
            that.bodyAnalysis = res.result;
            console.log("-----请求体征分析------", res.result);

          }
        } catch (e) {
          this.loading = false
        }
      },

    },
  }
</script>

<style lang="less">
  // 监控区域
  .monitor-area {
    width: 1128px;
    height: 630px;
    background-size: 100% 630px;
    margin-left: 20px;
    // background-color: green;
    background-image: url('~@/assets/images/wiseCare/monitor_background.png');
    background-repeat: no-repeat;

    .monitor-area-top {
      font-size: 32px;
      padding-left: 5%;
      font-family: Microsoft YaHei;
      font-weight: 400;
      color: #F4C021;
      line-height: 82px;
    }

    .monitor-content {
      display: flex;
      height: 700px;

      // 左边
      .left {
        .information-area {
          min-width: 130px;
          min-height: 50px;
          padding: 12px 10px;
          padding-left: 15px;
          font-size: 14px;
          background-size: 100% 100%;
          background-repeat: no-repeat;
          background-image: url('~@/assets/images/wiseCare/behavior_analysis_content_bg.png');
          .information-area-top {
            color: #04EEFE;
          }

          .information-area-bottom {
            color: #21FE04;
          }
        }


      }

      .information-area:not(:first-child) {
        margin-top: 10px;
      }

      //右边
      .right {
        width: 80%;
        // background-color: #04EEFE;
      }

      .monitor-video-area {
        margin-left: 20px;
        // width: 50%;
        // height: 200px;
        // background-color: #05347D;
      }
    }

  }
</style>
View Code

子组件2

<template>
  <div class="top-layer">
    <span class="top-layer-title">智慧看护对象数据看板</span>
    <span class="top-layer-date">{{ date }}</span>
    <span class="top-layer-user"> 当前登陆人:管理员 </span>
    <div class="top-layer-home">
      <div class="top-layer-home-outline"></div>
      <div class="top-layer-home-inline"></div>
      <div class="top-layer-home-house" title="点击返回业务系统" @click="toHome()"></div>
    </div>
    <div class="top-layer-back">
      <div class="top-layer-back-outline"></div>
      <div class="top-layer-back-inline"></div>
      <div class="top-layer-back-text" title="点击退出系统" @click="exit()">返回</div>
    </div>
  </div>
</template>

<script>
export default {
  components: {},
  data() {
    return {
      description: '大屏顶部',
      date: null,
    }
  },
  computed: {},
  created() {
    this.setDate()
  },
  mounted() {},
  methods: {
    setDate() {
      setInterval(() => {
        this.date = this.$dayjs().format('YYYY年MM月DD日 HH:mm')
      })
    },
    /*****退出******/
    exit(){
      this.$router.back()
      this.$emit('clickBrotherBtn', true)
    },
    /*****回到主页******/
    toHome(){
      this.$router.push({ path: "/trzhkh/obj/modules/TbObjectManage" }).catch(()=>{
        console.log('跳转首页出错')
      })
    }
  },
}
</script>

<style lang="less">
@fontColor: #00fbff;
#rotateAnimate() {
  .outline {
    background: url('~@/assets/images/dataview/home-outline.png') no-repeat center center;
    background-size: 100% 100%;
    -webkit-animation: changeright 6s linear infinite;
    animation: changeright 6s linear infinite;
  }
  .inline {
    background: url('~@/assets/images/dataview/home-inline.png') no-repeat center center;
    background-size: 100% 100%;
    -webkit-animation: changeleft 6s linear infinite;
    animation: changeleft 6s linear infinite;
  }
  .house {
  }
}
.top-layer {
  height: calc(100vh * 0.15);
  width: 100%;
  position: absolute;
  left: 0;
  top: 0;
  background: url('~@/assets/images/dataview/toplayer-bg.png') no-repeat center center;
  background-size: 100% 100%;
  display: flex;
  justify-content: center;
  align-items: center;
  &-title {
    position: absolute;
    top: 5%;
    left: 43%;
    font-size: 26px;
    color: @fontColor;
    z-index: 3;
    cursor: pointer;
  }
  &-date {
    position: absolute;
    top: 17%;
    left: 18%;
    color: @fontColor;
    font-size: 17px;
  }
  &-home {
    position: absolute;
    top: 10%;
    left: 6%;
    width: 70px;
    height: 70px;
    z-index: 3;
    &-outline {
      width: 100%;
      height: 100%;
      #rotateAnimate.outline();
    }
    &-inline {
      position: absolute;
      top: 5%;
      left: 7%;
      width: 90%;
      height: 90%;
      #rotateAnimate.inline();
    }
    &-house {
      position: absolute;
      top: 34%;
      left: 37%;
      width: 20px;
      height: 20px;
      background: url('~@/assets/images/dataview/home.png') no-repeat center center;
      background-size: 100% 100%;
      cursor: pointer;
    }
  }
  &-user {
    position: absolute;
    top: 17%;
    right: 18%;
    font-size: 17px;
    color: @fontColor;
  }
  &-back {
    position: absolute;
    top: 10%;
    right: 6%;
    width: 70px;
    height: 70px;
    z-index: 3;
    &-outline {
      width: 100%;
      height: 100%;
      #rotateAnimate.outline();
    }
    &-inline {
      position: absolute;
      top: 5%;
      left: 7%;
      width: 90%;
      height: 90%;
      #rotateAnimate.inline();
    }
    &-text {
      position: absolute;
      top: 34%;
      left: 32%;
      color: @fontColor;
      cursor: pointer;
    }
  }
  @keyframes changeright {
    0% {
      transform: rotate(0deg);
    }

    50% {
      transform: rotate(180deg);
    }

    100% {
      transform: rotate(360deg);
    }
  }
  @keyframes changeleft {
    0% {
      transform: rotate(0deg);
    }

    50% {
      transform: rotate(-180deg);
    }

    100% {
      transform: rotate(-360deg);
    }
  }
}
</style>
View Code

子组件3

<template>
  <div>
    <!--视频窗口展示-->
    <div id="playWnd" class="playWnd" style=""></div>
  </div>
</template>
<script>
  import constant from '../../../../utils/constant.js'
  import {
    watch
  } from 'less';
  import moment from 'moment'
  // let divWidth = 930; // 容器宽
  // let divHeight = 450; // 容器高
  //声明公用变量
  let initCount = 0; // 初始化重试次数,3次失败则报错
  let oWebControl; // 页面控制对象
  let pubKey = '';
  export default {
    name: 'hkVideo',
    data() {
      return { // 视频播放
        cameraIndexCode: this.cameraIndexCodeProp, // 摄像头的code, 我是父页面传过来的
        key: '',
        HKIP: '',
        Port: '',
        secret: '',
        screenWidth: document.body.clientWidth, //浏览器宽度
        screenHeight: document.body.clientHeight //浏览器高度
      }
    },
    props: {
      cameraIndexCodeProp: Array,
    }, // 接收父页面传来的参数
    mounted() {
      console.log("----222-----",this.cameraIndexCodeProp)
      const that = this
      window.onresize = () => {
        return (() => {
          //根据窗口变化调整视频窗口大小
          window.screenWidth = document.body.clientWidth;
          that.screenWidth = 0.46 * window.screenWidth;
          window.screenHeight = document.body.clientHeight;
          that.screenHeight = 0.48 * window.screenHeight;
          console.log("窗口变化宽度", document.body.clientWidth);
          console.log("窗口变化高度", document.body.clientHeight);
          if (oWebControl != null) {
            this.destroyedView();
            setTimeout(this.initView, 500);
            oWebControl.JS_Resize(that.screenWidth, that.screenHeight);
            //this.setWndCover();
          }
        })()
      }
      // // 有摄像头 code, 才加载, 另外因为我每次只显示一个, 所以显示之前要把之前显示的摄像头销毁, 所以加了 oWebControl == null 的判断.
      // if(this.cameraIndexCode && oWebControl == null){
      //   this.initView();
      // }else{
      //   // 如果 code 不为空, 则先销毁现有摄像头, 再去加载新的摄像头
      //   this.destroyedView();
      //   setTimeout(this.initView, 1000);
      // }
    },
    created() {
      this.getHK()
      // if(this.HKinfo.key){
      //   this.key = this.HKinfo.key
      //   this.secret = this.HKinfo.secret
      //   this.Port = this.HKinfo.HKPort
      //   this.HKIP = this.HKinfo.HKIP
      //   // 有摄像头 code, 才加载, 另外因为我每次只显示一个, 所以显示之前要把之前显示的摄像头销毁, 所以加了 oWebControl == null 的判断.
      //   if(this.cameraIndexCode.length>0 && oWebControl == null){
      //     this.initView();
      //   }else{
      //     // 如果 code 不为空, 则先销毁现有摄像头, 再去加载新的摄像头
      //     this.destroyedView();
      //     setTimeout(this.initView, 1000);
      //   }
      // }else{
      //   this.getHK()
      // }
    },
    computed: {
      // ...mapGetters(['HKinfo'])
    },
    methods: {
      async getHK() {
        // this.key = '29305541'
        // this.secret = 'quaMHuWIp05r9by98sMM'
        // this.Port = '2443'
        // this.HKIP = '113.125.113.194'
        //公共页面引入,避免多端更改
        const configValue = constant.HK_config
        this.key = configValue.key
        this.secret = configValue.secret
        this.Port = configValue.HKPort
        this.HKIP = configValue.HKIP
        this.initView();
        // const info = await this.$store.dispatch('GetHKinfo')
        // if(info){
        //   const k = info.find(item=>item.value==='AppKey')
        //   const i = info.find(item=>item.value==='IP')
        //   const s = info.find(item=>item.value==='APPsecret')
        //   const p = info.find(item=>item.value==='Port')
        //   this.key = k.code
        //   this.secret = s.code
        //   this.Port = p.code
        //   this.HKIP = i.code
        //   // 有摄像头 code, 才加载, 另外因为我每次只显示一个, 所以显示之前要把之前显示的摄像头销毁, 所以加了 oWebControl == null 的判断.
        //   if(this.cameraIndexCode.length>0 && oWebControl == null){
        //     this.initView();
        //   }else{
        //     // 如果 code 不为空, 则先销毁现有摄像头, 再去加载新的摄像头
        //     this.destroyedView();
        //     setTimeout(this.initView, 1000);
        //   }
        // }
      },
      // 创建播放实例, 这里不用改
      initPlugin() { // 初始化播放插件, 相当于准备播放环境(不是重点, 但要记着这是每次加载的第一步, 不然切换画面会有坑)
        const _this = this;
        window.screenWidth = document.body.clientWidth;
        let divWidth = 0.46 * window.screenWidth; //容器宽度
        window.screenHeight = document.body.clientHeight;
        let divHeight = 0.48 * window.screenHeight; //容器高度
        //let divWidth = 930;
        //let divHeight = 450; //容器高度
        oWebControl = new WebControl({
          szPluginContainer: "playWnd", // 指定容器id
          iServicePortStart: 15900, // 指定起止端口号,建议使用该值
          iServicePortEnd: 15909,
          szClassId: "23BF3B0A-2C56-4D97-9C03-0CB103AA8F11", // 用于IE10使用ActiveX的clsid
          cbConnectSuccess: function() { // 创建WebControl实例成功
            oWebControl.JS_StartService("window", { // WebControl实例创建成功后需要启动服务
              dllPath: "./VideoPluginConnect.dll" // 值"./VideoPluginConnect.dll"写死
            }).then(function() { // 启动插件服务成功
              oWebControl.JS_SetWindowControlCallback({ // 设置消息回调
                cbIntegrationCallBack: _this.cbIntegrationCallBack
              });

              oWebControl.JS_CreateWnd("playWnd", divWidth, divHeight).then(
                function() { //JS_CreateWnd创建视频播放窗口,宽高可设定
                  _this.init(); // 创建播放实例成功后初始化
                });
            }, function() { // 启动插件服务失败
            });
          },
          cbConnectError: function() { // 创建WebControl实例失败
            oWebControl = null;
            // publicUtils.notify('warn', "插件未启动,正在尝试启动,请稍候...");
            WebControl.JS_WakeUp("VideoWebPlugin://"); // 程序未启动时执行error函数,采用wakeup来启动程序
            initCount++;
            if (initCount < 3) {
              setTimeout(function() {
                this.initPlugin();
              }, 3000)
            } else {
              // publicUtils.notify('error', "插件启动失败,请检查插件是否安装!");
            }
          },
          cbConnectClose: function(bNormalClose) {
            // 异常断开:bNormalClose = false
            // JS_Disconnect正常断开:bNormalClose = true
            if (!bNormalClose) {
              // publicUtils.notify('error', "视屏链接异常中断!");
            }
            oWebControl = null;
          }
        });
      },

      //初始化, 主要改这里
      init() {
        const _this = this;
        window.screenWidth = document.body.clientWidth;
        let divWidth = 0.46 * window.screenWidth; //容器宽度
        window.screenHeight = document.body.clientHeight;
        let divHeight = 0.48 * window.screenHeight; //容器高度
        this.getPubKey(function() {
          // 请自行修改以下变量值
          let appkey = _this.key //综合安防管理平台提供的appkey,必填
          let secret = _this.setEncrypt(_this.secret); //综合安防管理平台提供的secret,必填
          let ip = _this.HKIP; //综合安防管理平台IP地址,必填
          let playMode = 0; //初始播放模式:0-预览,1-回放
          let port = Number(_this.Port); //综合安防管理平台端口,若启用HTTPS协议,默认443
          let snapDir = "D:\\SnapDir"; //抓图存储路径
          let videoDir = "D:\\VideoDir"; //紧急录像或录像剪辑存储路径
          let layout = "2x2"; //playMode指定模式的布局
          let enableHTTPS = 1; //是否启用HTTPS协议与综合安防管理平台交互,这里总是填1
          let encryptedFields = 'secret'; //加密字段,默认加密领域为secret
          let showToolbar = 1; //是否显示工具栏,0-不显示,非0-显示
          let showSmart = 1; //是否显示智能信息(如配置移动侦测后画面上的线框),0-不显示,非0-显示
          let buttonIDs = "0,16,256,257,259,513,514,516,517,768,769"; //自定义工具条按钮
          let toolBarButtonIDs = "4096,2304,4098,4099"; //自定义工具栏按钮
          // 请自行修改以上变量值

          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, //自定义工具栏按钮
            })
          }).then(function(oData) {
            oWebControl.JS_Resize(divWidth, divHeight); // 初始化后resize一次,规避firefox下首次显示窗口后插件窗口未与DIV窗口重合问题
          });
        });
      },

      //获取公钥, 不用改
      getPubKey(callback) {
        oWebControl.JS_RequestInterface({
          funcName: "getRSAPubKey",
          argument: JSON.stringify({
            keyLength: 1024
          })
        }).then(function(oData) {
          console.log(oData);
          if (oData.responseMsg.data) {
            pubKey = oData.responseMsg.data;
            callback()
          }
        })
      },

      //RSA加密, 不用改
      setEncrypt(value) {
        let encrypt = new JSEncrypt();
        encrypt.setPublicKey(pubKey);
        return encrypt.encrypt(value);
      },


      // 设置窗口裁剪,当因滚动条滚动导致窗口需要被遮住的情况下需要JS_CuttingPartWindow部分窗口
      setWndCover() {
        let iWidth = $(window).width();
        let iHeight = $(window).height();
        let oDivRect = $("#playWnd").get(0).getBoundingClientRect();

        let iCoverLeft = (oDivRect.left < 0) ? Math.abs(oDivRect.left) : 0;
        let iCoverTop = (oDivRect.top < 0) ? Math.abs(oDivRect.top) : 0;
        let iCoverRight = (oDivRect.right - iWidth > 0) ? Math.round(oDivRect.right - iWidth) : 0;
        let iCoverBottom = (oDivRect.bottom - iHeight > 0) ? Math.round(oDivRect.bottom - iHeight) : 0;

        iCoverLeft = (iCoverLeft > 1000) ? 1000 : iCoverLeft;
        iCoverTop = (iCoverTop > 600) ? 600 : iCoverTop;
        iCoverRight = (iCoverRight > 1000) ? 1000 : iCoverRight;
        iCoverBottom = (iCoverBottom > 600) ? 600 : iCoverBottom;

        oWebControl.JS_RepairPartWindow(0, 0, 1001, 600); // 多1个像素点防止还原后边界缺失一个像素条
        if (iCoverLeft != 0) {
          oWebControl.JS_CuttingPartWindow(0, 0, iCoverLeft, 600);
        }
        if (iCoverTop != 0) {
          oWebControl.JS_CuttingPartWindow(0, 0, 1001, iCoverTop); // 多剪掉一个像素条,防止出现剪掉一部分窗口后出现一个像素条
        }
        if (iCoverRight != 0) {
          oWebControl.JS_CuttingPartWindow(1000 - iCoverRight, 0, iCoverRight, 600);
        }
        if (iCoverBottom != 0) {
          oWebControl.JS_CuttingPartWindow(0, 600 - iCoverBottom, 1000, iCoverBottom);
        }
      },

      //视频预览功能, 就设置 cameraIndexCode 就行了
      startPreview() {
        let _this = this;
        let cameraIndexCode = _this.cameraIndexCode; //获取输入的监控点编号值,必填
        let streamMode = 0; //主子码流标识:0-主码流,1-子码流
        let transMode = 1; //传输协议:0-UDP,1-TCP
        let gpuMode = 0; //是否启用GPU硬解,0-不启用,1-启用
        let wndId = 0; //播放窗口序号(在2x2以上布局下可指定播放窗口)
        const cameraList = []
        // cameraIndexCode = cameraIndexCode.replace(/(^\s*)/g, "");
        // cameraIndexCode = cameraIndexCode.replace(/(\s*$)/g, "");
        console.log("------startPreview----------",cameraIndexCode)
        for (let i = 0, j = cameraIndexCode.length; i < j; i++) {
          let curCode = cameraIndexCode[i].indexCode
          curCode = curCode.replace(/(^\s*)/g, "");
          curCode = curCode.replace(/(\s*$)/g, "");
          cameraList.push({
            cameraIndexCode: curCode, //监控点编号
            streamMode: streamMode, //主子码流标识
            transMode: transMode, //传输协议
            gpuMode: gpuMode, //是否开启GPU硬解
            wndId: i + 1 //可指定播放窗口
          })
        }
        oWebControl.JS_RequestInterface({
          funcName: "startMultiPreviewByCameraIndexCode",
          argument: {
            list: cameraList
          }
        })
      },

      initView() {
        // 先准备环境, 环境准备好才能加载, 所以给了个延迟, 用 Promise 同步执行, 加载不出来.只能用此下策, 有空再优化
        if (this.cameraIndexCode) {
          this.initPlugin();
          setTimeout(this.startPreview, 1000);
        }
      },
      //停止全部预览
      stopAllPreview() {
        oWebControl.JS_RequestInterface({
          funcName: "stopAllPreview"
        })
      },
      //销毁插件实例
      destroyedView() {
        console.log("---------destroyedView---------")
        if (oWebControl != null) {
          this.stopAllPreview();
          oWebControl.JS_HideWnd(); // 先让窗口隐藏,规避可能的插件窗口滞后于浏览器消失问题
          oWebControl.JS_Disconnect().then(function() { // 断开与插件服务连接成功
            },
            function() { // 断开与插件服务连接失败
            });
        }
      },
    },

    destroyed() {
      this.destroyedView();
    }
  }
</script>

<style scoped>
  html,
  body {
    padding: 0;
    margin: 0;
  }

  .playWnd {
    /*width: 500px; !*播放容器的宽和高设定*!*/
    /*height: 300px;*/
  }

  .operate {
    margin-top: 24px;
  }

  .operate::after {
    content: '';
    display: block;
    clear: both;
  }

  .module {
    float: left;
    width: 340px;
    /*min-height: 320px;*/
    margin-left: 16px;
    padding: 16px 8px;
    box-sizing: border-box;
    border: 1px solid #e5e5e5;
  }

  .module .item {
    margin-bottom: 4px;
  }

  .module input[type="text"] {
    box-sizing: border-box;
    display: inline-block;
    vertical-align: middle;
    margin-left: 0;
    width: 150px;
    min-height: 20px;
  }

  .module .btn {
    min-width: 80px;
    min-height: 24px;
    margin-top: 100px;
    margin-left: 80px;
  }
</style>
View Code

 

posted @ 2023-01-10 10:35  悠悠乃  阅读(346)  评论(0编辑  收藏  举报