vue项目业务实现,视频监控-文件流,大屏适配方案(v-scale-screen),websocket前端

news2024/11/25 0:59:52

最近把以前的业务场景及解决方案整理了一下,具体实现的工具如下:

监控-视频文件流==>video.js + videojs-contrib-hls
大屏适配方案==> v-scale-screen
websocket==>sockjs-client+ webstomp-client

视频监控-文件流

在这里插入图片描述

使用方法

下载video插件,


yarn add video.js -save -D  或者 npm i video.js -save -D  
yarn add videojs-contrib-hls -save -D  或者 npm i videojs-contrib-hls -save -D  

使用方法

(1)导入


//导入 css 与 videojs (可全局,可只在使用的页面)
import "video.js/dist/video-js.css";
import videojs from "video.js";

(2)模板中写入标签

<video ref="videoPlayer" style="width: 100%; height: 100%" class="video-js videoNmae"></video>

(3)页面渲染时调用函数,渲染视频


data(){
    return {
      optionc: {
        autoplay: true,
        controls: true,
        muted: true,
        sources: [
          {
            src: "视频地址",
            type: "application/x-mpegURL", // 监控类直播视频流为此格式
            // src: '',
            // type: "video/mp4", // 本地video视频播放为此格式
          },
        ],
      },}
}



 mounted() {
    // 将方法包装成异步
    this.$nextTick(() => {
      setTimeout(() => {
        this.playerd = videojs(   // playerd 为data中的变量,初始值可设置为null
          this.$refs.videoPlayer,  // this.$refs.videoPlayer为放置视频的dom
          this.options,   // this.options为视频的配置,可根据官方文档自行配置,下面有我的配置项
          function onPlayerReady() {
            console.log("onPlayerReady", this);
          }
        );
        this.playerda = videojs(
          this.$refs.videoPlayera,
          this.optionc,
          function onPlayerReady() {
            console.log("onPlayerReady", this);
          }
        );
      });
    })
 }

// 定时器的清理
    beforeDestroy() {
         //clearInterval(this.int)
       // var videoTime = document.getElementById("myvideo");
        videoTime.pause();
    }

optionc为视频的配置,具体其他配置可查看官网传送门
组件销毁时需要将视频的实例销毁,避免内存泄漏

大屏适配方案(v-scale-screen)

1、在项目初期,寻找大屏适配的方案,在比较多种方案后,决定使用v-scale-screen的方案,此插件根据CSS3的scale缩放功能对页面进行适配(不受浏览器缩放的影响)

缺点 : 页面尺寸过大时,开发时电脑屏幕无法看清楚细节,需要使用触控板进行放大

npm i  v-scale-screen

// main.js中注册
import VScaleScreen from 'v-scale-screen';

Vue.component('v-scale-screen', {
  name: 'v-scale-screen',
  ...VScaleScreen
});

Vue.use(VScaleScreen, {
  designWidth: 750, // 设计稿宽度
  designHeight: 1334, // 设计稿高度
});

// 使用

    <v-scale-screen :size="size" :boxStyle="{background:'null'}" >
       。。。。。。。 
     </v-scale-screen>   

详情可见npm官网传送门

websocket前端

2.使用插件sockjs-client,webstomp-client(最后使用方案)

1.yarn add sockjs-client webstomp-client 或者 npm i sockjs-client webstomp-client

2.创建stomp.js文件

import SockJS from "sockjs-client";
import Stomp from "webstomp-client";

export class Websocket {
  ar = new Array();
  debug = false;
  // 客户端连接信息
  stompClient = {};
  constructor() {
    console.log("aaaaaaaaaa");
    //首次使用构造器实例
    if (!Websocket.instance) {
      console.log("bbbbbbb");
      this.init();
      //将this挂载到Websocket这个类的instance属性上
      Websocket.instance = this;
    }

    console.log("ccccc--->" + this.stompClient.connected);
    return Websocket.instance;
  }

  getStompClient() {
    return Websocket.instance.stompClient;
  }

  // 初始化
  init(callBack) {
    console.log("1111111111111=>", this.stompClient);
    if (!this.stompClient.connected) {
      console.log("222222");
      const socket = new SockJS("https://sdd.cevmp.cn/wss/publicServer");//websocket请求地址
      this.stompClient = Stomp.over(socket);
      this.stompClient.hasDebug = this.debug;

      this.stompClient.connect(
        {},
        (suce) => {
          console.log("连接成功,信息如下 ↓");
          while (this.ar.length > 0) {
            let a = this.ar.pop();
            // this.sub(a.addres, a.fun);
            let timestamp = new Date().getTime() + a.address;
            this.stompClient.subscribe(
              a.addres,
              (message) => {
                //this.console(message, "message");
                let data = JSON.parse(message.body);
                console.log(
                  "000000000000000000000订阅消息通知,信息如下 000000000" +
                    a.addres
                );
                a.fun(data);
              },
              {
                id: timestamp,
              }
            );
          }

          if (callBack) {
            callBack();
          }
        },
        (err) => {
          if (err) {
            console.log("连接失败,信息如下 ↓");
            console.log(err);
          }
        }
      );
    } else {
      if (callBack) {
        console.log("已连接成功,无需重复创建===========================>");
        callBack();
      }
    }
  }
  // 订阅
  sub(address, callBack) {
    console.log(address + "-->" + this.stompClient);
    if (!this.stompClient.connected) {
      this.ar.push({
        addres: address,
        fun: callBack,
      });
      console.log("没有连接,无法订阅", address);
      this.reconnect(1);
      return;
    }

    // 生成 id
    let timestamp = new Date().getTime() + address;
    console.log("订阅成功 -> " + address);
    this.stompClient.subscribe(
      address,
      (message) => {
        //this.console(message, "message");
        let data = JSON.parse(message.body);
        // console.log(data + " 订阅消息通知,信息如下 ↓↓↓↓↓↓↓");
        callBack(data);
      },
      {
        id: timestamp,
      }
    );
  }
  // 取消订阅
  unSub(address) {
    if (!this.stompClient.connected) {
      console.log("没有连接,无法取消订阅 -> " + address);
      return;
    }
    let id = "";
    for (let item in this.stompClient.subscriptions) {
      if (item.endsWith(address)) {
        id = item;
        break;
      }
    }
    this.stompClient.unsubscribe(id);
    console.log("取消订阅成功 -> id:" + id + " address:" + address);
  }
  // 断开连接
  disconnect(callBack) {
    if (!this.stompClient.connected) {
      console.log("没有连接,无法断开连接");
      return;
    }
    this.stompClient.disconnect(() => {
      console.log("断开成功");
      if (callBack) {
        callBack();
      }
    });
  }
  // 单位 秒
  reconnect(time) {
    if (!this.stompClient.connected) {
      console.log("连接丢失");
      // console.log("重新连接中...");
      //this.init();
    }
  }
  console(msg) {
    if (this.debug) {
      console.log(msg);
    }
  }
}

3.使用方法

按需引入Websocket后,在mounted钩子里调用,使用new websocket().sub()方法 传入两个参数

第一个参数:数据格式为字符串,可传与后端约定好的标识,确定是进入的页面,推与之匹配的数据

第二个参数:传递一个函数,此函数的第一个参数即后端返回的数据

注意事项:工具函数内还有许多方法,比如取消订阅,可自行按需使用

优点:1.自动识别wss与https,ws与http的对应关系,无需再写 wss协议开头的地址 ; 2.websocket调试本地时只需更改工具函数内的地址

缺点:1.需要接入外部websocket时,由于没有与其约定,则需要使用原生格式

import { Websocket } from "@/utils/stomp";
mounted() {
    let stomp = new Websocket();
    // 初始化
    // 初始化成功 就执行订阅
    stomp.sub("/topic/orderlyCharger", (res) => {
      console.log(res,"这个是后端推的数据"
      );
    });
  },

取消订阅

 
beforeDestroy() {
    let stomp = new Websocket();
    stomp.unSub("/topic/publicCharger")
 
},

websocket页面之间的切换可能会造成数据污染,因此最好在组件销毁之前取消订阅

学习更多vue知识请关注CRMEB。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/719215.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数字IC基础:状态化简与等价状态

相关阅读 数字IC基础知识&#xff1a;著名EDA公司与工具介绍 如果时序机的两个状态对于所有可能的输入序列都具有相同的输出序列&#xff08;和相同的下一状态&#xff09;&#xff0c;则称这两个状态是等价的。时序机的等价状态无法通过观察输出序列的异同对其加以区分&#…

【Web3】认识以太坊钱包

目录 区块链钱包概念 密码 私钥 Private Key 公钥Public Key Keystore 助记词 Mnemonic 如何解锁账户 区块链钱包概念 钱包用来存钱的&#xff0c;在区块链中&#xff0c;我们的数字资产都会对应到一个账户地址上&#xff0c; 只有拥 有账户的钥匙&#xff08;私钥&…

【网络进阶】Posix API与网络协议栈(五)

文章目录 1. ARP协议1.1 ARP协议的定义1.2 ARP协议的工作过程1.3 ARP协议的数据结构1.4 ARP欺骗1.5 ARP协议的局限性1.6 ARP协议与Posix API的关系 2. ARP协议例子3. ICMP协议3.1 ICMP协议的定义3.2 ICMP协议的类型3.3 ICMP协议的工作原理3.4 ICMP协议的应用3.5 ICMP协议的局限…

软考:中级软件设计师:操作系统,进程管理,前趋图,进程同步互斥,PV操作,

软考&#xff1a;中级软件设计师:操作系统 提示&#xff1a;系列被面试官问的问题&#xff0c;我自己当时不会&#xff0c;所以下来自己复盘一下&#xff0c;认真学习和总结&#xff0c;以应对未来更多的可能性 关于互联网大厂的笔试面试&#xff0c;都是需要细心准备的 &…

Openlayers实战:地图上显示经纬度坐标

Openlayers地图中,鼠标移动,其位置的经纬度坐会经常显示在页面中。 在我们的实战课程里,详细讲一下其做法,成为一个主力的应用。 效果图 源代码 /* * @Author: 大剑师兰特(xiaozhuanlan),还是大剑师兰特(CSDN) * @此源代码版权归大剑师兰特所有,可供学习或商业项目…

vue中如何引入插件并使用

Vue中的插件类型 vue中有大致有三种类型的插件&#xff0c;第三方插件、基于vue开发的插件及基于vue开发的组件 第三方插件 如&#xff1a;jquery、moment.js、aixos、Highcharts等 注意&#xff1a;Highcharts也有基于vue开发的插件版本&#xff0c;具体使用方法参见下文 …

C++中的类

1、类和对象 C中通过class定义类 class A {int a; }; // 定义一个A类型的类通过类来定义对象 A a; // 定义一个A类型的对象类是一张蓝图&#xff0c;是抽象的。而对象是根据蓝图真正建造出来的建筑&#xff0c;是具象的。 对象是类的实体化 2、类的限制修饰符 类有三种修…

xmrig病毒删除

删除病毒 [rootnode101 .mint-xmr]# top | headPID USER PR NI VIRT RES SHR S %CPU %MEM TIME COMMAND 15870 root 20 0 4597844 2.0g 4 S 1017 3.3 52:05.95 xmrig[rootnode101 .mint-xmr]# ll /proc/15870/exe lrwxrwxrwx. 1 root ro…

【C#】SqlBulkCopy批量添加注意DataTable必须与表列顺序一致,否则报错,以及关闭自增列

前篇文章在测试一个批量添加的操作&#xff0c;发现一致添加不成功&#xff0c;最后分析是字段列顺序不一致的问题 目录 1、列名不一致1.1、错误信息1.2、解决方法 2、关闭自增列2.1、不包含列2.2、特性关闭 1、列名不一致 1.1、错误信息 在调试时&#xff0c;一致提示如下错…

基于 Flink SQL CDC的实时数据同步方案

基于 Flink SQL CDC的实时数据同步方案http://www.dreamwu.com/post-1594.html

iframe编码为utf-8.嵌入页面为gb2312 ,word导出默认为gb2312 格式

使用记事本打开html&#xff0c;另存为&#xff0c;保存类型选择&#xff1a;"所有文件"、编码选择&#xff1a;“UTF-8”打开保存后文件编码类型改成utf-8 第一个步骤是为了把内容改成utf-8&#xff0c;然后直接执行第二步改编码可能会报乱码

解决printJS打印问题汇总

目录 一、打印预览表格列不全&#xff08;Element的el-table组件&#xff09; 1、打印设置“打印缩放” 2、修改el——table的底层代码&#xff08;如果页面上有多个表格慎用&#xff09; 一、打印预览表格列不全&#xff08;Element的el-table组件&#xff09; 问题描述&a…

简单的手机记事本app怎么查看提醒列表?

很多人平时都有随手记事的习惯&#xff0c;在记录事情的时候使用手机上的记事本app是一个不错的选择。有的记事本功能比较完善&#xff0c;不但能记事还能设置提醒&#xff0c;当有多条提醒内容存在时&#xff0c;简单的手机记事本app怎么查看提醒列表呢&#xff1f;以iPhone手…

Easyexcel 导出数据 一对多关系导出数据集合

客户要求 要求导出的表格如图 实现这样表格 很多人会想到动态表头&#xff0c;easypoi可以直接实现&#xff0c;但是我用的是easyexcel,而easyexcel自身并没有提供自动合并的功能所以还是需要自己来合并。 代码如下 首先我们来看下将嵌套数据平铺&#xff0c;不进行合并导出…

解决github打不开的方法(亲测有效)

网上提供了很多针对github打开慢的解决方案&#xff0c;什么又是改host文件&#xff0c;又是下载杂七杂八的加速器等等&#xff0c;其实效果并不好&#xff0c;微软商城已有对应的软件可以解决该问题&#xff0c;获取路径更为安全。 目录 安装Watt Toolkit找不到Microsoft Stor…

Aduc7126的PLA模块

PLA 一、PLA结构讲解 PLA是Aduc7126内部的可编辑逻辑阵列&#xff0c;Aduc7126总共有16个element&#xff0c;分为两组&#xff0c;如下图所示。 下图是PLA的其中一个element结构图&#xff0c;按照由左至右进行讲解&#xff1a; 左边MUX0、MUX1、MUX2、MUX3都是选择器&#…

将 InputStream 流转成 MultipartFile

MultipartFile是一个接口, 有一个MockMultipartFile实现类,里面有构造方法可以直接将输入流转为MutipartFile对象: MultipartFile File new MockMultipartFile(filename, file.getName(), file.getContentType(), fileStream); 使用MockMultipartFile类, 项目需要导入org.sp…

maven配置问题

maven配置问题 Error running ‘项目名 [install]’: No valid Maven installation No valid Maven installation found. Either set the home directory in the configuration dialog or set the M2_HOME environment variable on your system. 解决方法&#xff1a; 依次检…

Echarts柱状图循环配色多色彩

话不多说&#xff0c;直接上配置案例&#xff0c;欢迎留言分享交流 option {xAxis: {type: category,data: [Mon, Tue, Wed, Thu, Fri, Sat, Sun,"y","q","y","u"]},yAxis: {type: value},series: [{itemStyle: {normal: {// barBorde…

华为OD机试真题 Python 实现【数组的中心位置】【2023Q1 100分】,附详细解题思路

目录 一、题目描述二、输入描述三、输出描述四、解题思路五、Python算法源码六、效果展示1、输入2、输出 一、题目描述 给你一个整数数组nums&#xff0c;请计算数组的中心位置&#xff0c;数组的中心位置是数组的一个下标&#xff0c;其左侧所有元素相乘的积等于右侧所有元素…