大屏模板,增加自适应(包含websocket)

这篇具有很好参考价值的文章主要介绍了大屏模板,增加自适应(包含websocket)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

大屏模板,增加自适应(包含websocket),总结,websocket,网络协议,网络

1、简单的Node服务端

const WebSocket = require('ws');

// 创建 WebSocket 服务器
const wss = new WebSocket.Server({ port: 8888 });

const getHeader = (protocol) => {
  const protocolArr = protocol.split(',')
  const headers = {};
  for (let i = 0; i < protocolArr.length; i += 2) {
    const key = protocolArr[i].trim();
    const value = protocolArr[i + 1].trim();
    headers[key] = value;
  }

  return headers;
}
let timer = null;
let num = 0;
let UID = '';

// 监听连接事件
wss.on('connection', (ws, req) => {
  const userName = req.url.replace('/', '');
  UID = userName;
  console.log('WebSocket connection established for URL:', userName);
  // 在 'upgrade' 事件处理程序中获取请求头信息
  const protocol = req.headers['sec-websocket-protocol'];
  console.log('Sec-WebSocket-Protocol:', getHeader(protocol)['X-Access-Token']);


  // 连接建立成功时触发
  console.log('Client connected');
  if(!timer) {
    const obj = [
      {
        name: 'SC001',
        value: 123
      },
      {
        name: 'SC001',
        value: 123
      }
    ]
    timer = setInterval(() => {
      ws.send(`${UID}心跳信息消息: ${num}--${JSON.stringify(obj)}`);
      num++
    }, 3000);
  }

  // 监听消息接收事件
  ws.on('message', (message) => {
    console.log(`Received message: ${message}`);

    // 向客户端发送消息
    ws.send(`服务端返回消息: ${message}`);
  });

  // 监听连接关闭事件
  ws.on('close', () => {
    // 连接关闭时触发
    console.log('Client disconnected');
    timer = null;
  });
});

2、大屏客户端

<!DOCTYPE html>
<html lang="zh">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>大屏测试</title>
</head>

<body>
  <style>
    body {
      position: relative;
      margin: 0;
      padding: 0;
      color: #ffffff;
      font-size: 36px;
      font-weight: bold;
      background-color: #20f;
      background-color: #3084e7;
      background: url(https://tinypng.com/backend/opt/output/3ret9c4gdpxnargyh99c1rgj1ne52res/bg.png) no-repeat;
      background-size: auto;
    }

    .item {
      box-shadow: inset 0px 0px 6px 2px #9df6fa;
      border-radius: 4px;
      width: calc(100% - 24px);
      height: 100%;
      display: flex;
      justify-content: center;
      align-items: center;
      padding: 12px;
    }

    .bigscreen {
      margin: 12px;
      display: flex;
      height: 100%;
    }

    .mg12 {
      margin: 12px 0;
    }

    .header {
      margin: 0 12px;
      text-align: center;
      line-height: 48px;
      margin-bottom: 12px;
      font-size: 36px;
      background: linear-gradient(to bottom, #56f4fe, #3084e7);
      -webkit-background-clip: text;
      color: transparent;
    }
    .first {
      display: flex;
      justify-content: space-around;
      align-items: center;
      font-size: 22px;
    }
    .i {
      width: 100%;
      display: flex;
      flex-direction: column;
      text-align: center;
    }
    .val {
      margin-top: 12px;
    }
  </style>
  <div id="app" style="position: absolute;">
    <div class="header">大屏标题</div>
    <div class="bigscreen">
      <div style="display: flex;flex-direction: column; height: calc(100% - 72px); width: 65%; margin-right: 12px;">
        <div id="first" class="item first" style="height: 15%;">
          <div class="i">
            <div>API总数</div>
            <div class="val">19,612</div>
          </div>
          <div class="i">
            <div>调用数</div>
            <div class="val">1,222</div>
          </div>
          <div class="i" id="warn" style="color: red;">
            <div>告警数</div>
            <div class="val">68</div>
          </div>
        </div>
        <div id="chart2" class="item mg12" style="height: 30%;">222</div>
        <div id="chart3" class="item" style="flex: 1;">333</div>
      </div>
      <div style="display: flex;flex-direction: column; height: calc(100% - 72px); flex: 1;">
        <div id="chart4" class="item">111</div>
        <div id="chart5" class="item mg12">222</div>
        <div id="chart6" class="item">333</div>
      </div>
    </div>
  </div>
  <script src="https://cdn.jsdelivr.net/npm/echarts@5.2.2/dist/echarts.min.js"></script>
  <script type="module">
    import autofit from 'https://cdn.jsdelivr.net/npm/autofit.js';

    autofit.init(
      {
        dh: 1080,
        dw: 1920,
        el: '#app',
        resize: true
      },
      false
    );

    // 配置图表选项和数据
    const obj = ['bar', 'line']
    const getType = () => {
      // 生成随机索引
      var randomIndex = Math.floor(Math.random() * obj.length);
      // 获取随机元素
      var type = obj[randomIndex];
      return type;
    }
    var option = () => {
      const type = getType()
      return {
        color: ['#80FFA5', '#00DDFF', '#37A2FF', '#FF0087', '#FFBF00'],
        title: {
          text: 'Gradient Stacked Area Chart'
        },
        tooltip: {
          trigger: 'axis',
          axisPointer: {
            type: 'cross',
            label: {
              backgroundColor: '#6a7985'
            }
          }
        },
        legend: {
          data: ['Line 1', 'Line 2', 'Line 3', 'Line 4', 'Line 5']
        },
        toolbox: {
          feature: {
            saveAsImage: {}
          }
        },
        grid: {
          left: '3%',
          right: '4%',
          bottom: '3%',
          containLabel: true
        },
        xAxis: [
          {
            type: 'category',
            boundaryGap: type === 'bar',
            data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
          }
        ],
        yAxis: [
          {
            type: 'value'
          }
        ],
        series: [
          {
            name: 'Line 1',
            type: type,
            stack: 'Total',
            smooth: true,
            lineStyle: {
              width: 0
            },
            showSymbol: false,
            areaStyle: {
              opacity: 0.8,
              color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
                {
                  offset: 0,
                  color: 'rgb(128, 255, 165)'
                },
                {
                  offset: 1,
                  color: 'rgb(1, 191, 236)'
                }
              ])
            },
            emphasis: {
              focus: 'series'
            },
            data: [Math.random() * 1000, Math.random() * 100, 101, 264, 90, 340, 250]
          },
          {
            name: 'Line 2',
            type: type,
            stack: 'Total',
            smooth: true,
            lineStyle: {
              width: 0
            },
            showSymbol: false,
            areaStyle: {
              opacity: 0.8,
              color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
                {
                  offset: 0,
                  color: 'rgb(0, 221, 255)'
                },
                {
                  offset: 1,
                  color: 'rgb(77, 119, 255)'
                }
              ])
            },
            emphasis: {
              focus: 'series'
            },
            data: [Math.random() * 1000, Math.random() * 100, 111, 234, 220, 340, 310]
          },
          {
            name: 'Line 3',
            type: type,
            stack: 'Total',
            smooth: true,
            lineStyle: {
              width: 0
            },
            showSymbol: false,
            areaStyle: {
              opacity: 0.8,
              color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
                {
                  offset: 0,
                  color: 'rgb(55, 162, 255)'
                },
                {
                  offset: 1,
                  color: 'rgb(116, 21, 219)'
                }
              ])
            },
            emphasis: {
              focus: 'series'
            },
            data: [Math.random() * 1000, Math.random() * 100, 201, 334, 190, 130, 220]
          },
        ]
      }
    };

    // 初始化ECharts实例
    var myChart2 = echarts.init(document.getElementById('chart2'), 'dark');
    var myChart3 = echarts.init(document.getElementById('chart3'), 'dark');
    var myChart4 = echarts.init(document.getElementById('chart4'), 'dark');
    var myChart5 = echarts.init(document.getElementById('chart5'), 'dark');
    var myChart6 = echarts.init(document.getElementById('chart6'), 'dark');

    // 使用配置项设置图表
    myChart2.setOption(option());
    myChart3.setOption(option());
    myChart4.setOption(option());
    myChart5.setOption(option());
    myChart6.setOption(option());

    // 自适应窗口大小变化
    window.addEventListener('resize', function () {
      myChart2.resize();
      myChart3.resize();
      myChart4.resize();
      myChart5.resize();
      myChart6.resize();
    });

    const timer = setInterval(() => {
      myChart2.setOption(option());
      myChart3.setOption(option());
      myChart4.setOption(option());
      myChart5.setOption(option());
      myChart6.setOption(option());
    }, 3000);
  </script>
  <script>
    setTimeout(() => {
      // 创建一个 Canvas 元素
      var canvas = document.createElement('canvas');
      var ctx = canvas.getContext('2d');
    
      // 设置 Canvas 的尺寸与容器元素相同
      var container = document.getElementById('first');
      canvas.width = container.offsetWidth * 0.6;
      canvas.height = container.offsetHeight;
  
      var date = new Date();
      var month = date.getMonth() + 1;
      var time = `${date.getFullYear()}-${month > 9 ? month : '0'+month}-${date.getDate()}  ${date.getHours()}:${date.getMinutes()}:${date.getSeconds()}`
    
      // 旋转绘图上下文45度(以弧度为单位)
      ctx.rotate(Math.PI / 16);
      // 绘制水印文本
      ctx.font = '36px Arial';
      ctx.fillStyle = '#ffffff1f'; // 水印文本颜色和透明度
      ctx.textAlign = 'center';
      ctx.textBaseline = 'middle';
      ctx.fillText(time, canvas.width / 4, canvas.height / 4);
    
      // 将 Canvas 转换为背景图像
      var watermarkUrl = canvas.toDataURL();
    
      // 设置容器元素的背景样式为水印图像
      container.style.backgroundImage = 'url(' + watermarkUrl + ')';
    }, 200)
  </script>
  <script>
    let socket, timers, connectState;
    let num = 1;
    const TIME = 10

    // 创建 WebSocket 连接函数
    function createWebSocket(state) {
      if(state) {
        num = 1;
        document.getElementById("output").innerHTML = '';
        console.clear()
      }
      const room = new Date().getTime();
      const token = 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2ODg1MzgzNDUsInVzZXJuYW1lIjoiYWRtaW4ifQ.Yac09LCyIAwjUofsm2cvGKxPmpZ5fTXG9ZKpFYdX2eQ';
      socket = new WebSocket("ws:localhost:8888/tengyu?id=001", ['X-Access-Token', token, 'Authorization', "token"]);
      // socket = new WebSocket(`ws://10.72.30.229:8080/dsss/websocket/largeScreen/room-${room}`);
      
      // 监听连接打开事件
      socket.onopen = function(event) {
        connectState = true;
      };

      // 监听消息接收事件
      socket.onmessage = function(event) {
        console.log(event.data);
      };

      // 监听连接关闭事件
      socket.onclose = function(event) {
        connectState = false;

        // 断线后尝试重连
        timers = setTimeout(function() {
          if (num > TIME) {
            clearTimeout(timers);
            console.log(`%cWS连接失败,如需重连请点击【连接WebSocket】`, 'background: blue; color: #fff; padding: 8px 12px; border-radius: 3px');
            return;
          }
          console.log(`%cWS第${num}次断线重连中...`, 'background: red; color: #fff; padding: 8px 12px; border-radius: 3px');
          createWebSocket();
          num++
        }, 5000);
      };
    }

    function fangdou(callback, time = 500) {
      let timers = null;
      
      return function() {
        if(timers) {
          clearTimeout(timers);
        }
        timers = setTimeout(() => {
          callback.apply(this, arguments);
          timers = null;
        }, time);
      };
    }

    // 发送消息到 WebSocket 服务器
    function sendMessage() {
      if(!connectState) {
        console.log(`WS服务器未连接~`);
        return;
      } 
      const message = prompt("Enter your message:");
      console.log(`发送到服务器: ${messages}`);
      socket.send(messages);
    }
    // 初始化 WebSocket 连接
    createWebSocket();
  </script>
  
</body>

</html>

大屏模板,增加自适应(包含websocket),总结,websocket,网络协议,网络​​​​​​​

大屏模板,增加自适应(包含websocket),总结,websocket,网络协议,网络文章来源地址https://www.toymoban.com/news/detail-665002.html

到了这里,关于大屏模板,增加自适应(包含websocket)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 前端实现大屏缩放自适应屏幕

    在前端实现大屏缩放自适应屏幕的过程中,可以使用以下几种方式: 使用CSS3的缩放属性(transform: scale())来缩放页面元素,以适应不同大小的屏幕。缩放后,需要使用CSS来重新布局和调整页面元素的尺寸和位置。 使用CSS的@media查询来根据不同的屏幕大小调整元素的样式和布

    2024年02月20日
    浏览(46)
  • WebSocket | 基于TCP的全双工通信网络协议

    ​🍃作者介绍:双非本科大三网络工程专业在读,阿里云专家博主,专注于Java领域学习,擅长web应用开发、数据结构和算法,初步涉猎Python人工智能开发和前端开发。 🦅主页:@逐梦苍穹 📕所属专栏:Java EE ✈ 您的一键三连,是我创作的最大动力🌹 WebSocket 是基于 TCP 的一

    2024年02月19日
    浏览(76)
  • Vue大屏自适应终极解决方案

    v-scale-screen 是一个大屏自适应组件,在实际业务中,我们常用图表来做数据统计,数据展示,数据可视化等比较直观的方式来达到一目了然的数据查看,但在大屏开发过程中,常会因为适配不同屏幕而感到困扰,下面我们使用 v-scale-screen 来解决一下这个难题 废话不多说,先

    2024年02月12日
    浏览(55)
  • 网络流量分析详解(包含OSI七层模型、TCP协议及Wireshark工具用法)

    这个系列讲的是整个网络流量分析流程,其中包含TCP协议、HTTP协议详解和Wireshark、Tcpdump的详细用法,现在只完成了其中一部分内容,每周更新,感兴趣的可以持续关注一下~ 内容比较杂,直接用 Ctrl+F 找自己需要的就可以 ​ 网络流量分析(NTA)可以描述为检查网络流量以表征所

    2023年04月12日
    浏览(95)
  • 持久双向通信网络协议-WebSocket-入门案例实现demo

    1 介绍 WebSocket 是基于 TCP 的一种新的 网络协议 。它实现了浏览器与服务器全双工通信——浏览器和服务器只需要完成一次握手,两者之间就可以创建 持久性 的连接, 并进行 双向 数据传输。 HTTP协议和WebSocket协议对比: HTTP是 短连接 (一次响应完即消除) WebSocket是 长连接

    2024年01月16日
    浏览(46)
  • vue大屏可视化自适应完美方案

    在做大屏可视化项目的时候,一般设计稿会设计成1920*1080,但是页面写死1920*1080在2k、4k等分辨率的屏幕下是不适配的。如果页面能够根据屏幕比例进行等比缩放那就好了。 什么?不知道屏幕比例?其实我们常见的1920*1080(1080P)、2k、4k...都是16:9的比例,在做项目之前我们

    2024年02月12日
    浏览(52)
  • 网络通信协议-HTTP、WebSocket、MQTT的比较与应用

    在今天的数字化世界中,各种通信协议起着关键的作用,以确保信息的传递和交换。HTTP、WebSocket 和 MQTT 是三种常用的网络通信协议,它们各自适用于不同的应用场景。本文将比较这三种协议,并探讨它们的主要应用领域。 HTTP (超文本传输协议) HTTP  是最常见的协议之一

    2024年02月05日
    浏览(60)
  • 数据可视化大屏的页面布局以及自适应

    在做数据可视化大屏之前,我们需要考虑到页面的布局问题以及页面缩放自适应问题,下面分别就这两个方面讲解。 页面布局 类似这种页面区块的明显划分,常用的布局方式有两种: 1、 flex 布局 2、 grid 布局 grid布局 grid 布局可以按区块来划分页面布局,并且可以在划分布

    2024年02月05日
    浏览(55)
  • FineBI报表页面大屏小屏自适应显示问题

    显示正常 存在遮挡字体情况 等比缩放后显示正常 初步有两种解决方法 两种方法都需要FineBI中网页框可以嵌套发布FineReport制作的报表xx.cpt/xx.frm 方法一:使用fr的js window.parent.document.body.style.zoom=‘67%’; 如果涉及部分嵌套的需要展示的fr报表: 可以通过下面的方法进行尝试解

    2024年01月16日
    浏览(39)
  • 前端可视化大屏适配/自适应三种实现方式

    可视化大屏适配/自适应现状 三大常用方式 vw/vh方案 概述:按照设计稿的尺寸,将px按比例计算转为vw和vh 优点:可以动态计算图表的宽高,字体等,灵活性较高,当屏幕比例跟 ui 稿不一致时,不会出现两边留白情况 缺点:每个图表都需要单独做字体、间距、位移的适配,比

    2024年02月15日
    浏览(76)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包