首页 > 其他分享 >vue websocket电脑端前端集成

vue websocket电脑端前端集成

时间:2024-04-07 16:14:28浏览次数:14  
标签:集成 vue websocket log bus self websock console data

后端数据用websocket推送数据,前端在大屏左上角模块页面接收,用bus发送到其他模块(总共6个模块页面,从左上模块页面发送到其他5个模块页面)页面 ,数据用于大屏上显示,废话不多说,直接上代码。

eventBus.js文件,放到根目录src ->assets->js文件夹下,eventBus.js文件内容如下:

import Vue from 'vue';
export default new Vue();

在左上模块vue文件,left-top.vue文件中<script></script>内

//引入中央事件总线
import bus from '@/assets/js/eventBus'
//websocket请求和http post请求
import SockJS from 'sockjs-client';
import Stomp from 'stompjs';
import qs from "qs"

 在data(){}同级,创建

created() {
   this.initWebSocket();
},
mounted() {
   this.getData()
 },
destroyed() {
this.websock.close(); //离开路由之后断开websocket连接
},
beforeDestroy() {
  this.clearRefreshData()
},

在methods:{}大括号内写以下方法:

       // 初始化weosocket
            initWebSocket() {
                //接收 "右上"模块“设置”发送过来的 “库区”编码
                let storeCode = this.storeCode
                //从main.js拿到统一ws地址wsURL
                // let wsuri = this.wsURL + this.pageSize + '/';
                let wsuri = this.wsURL;
                this.websock = new WebSocket(wsuri) // 这里面的this都指向vue
                this.websock.onmessage = this.websocketonmessage
                this.websock.onclose = this.websocketclose
                this.websock.onopen = this.websocketopen
                this.websock.onerror = this.websocketerror
            },
            websocketopen() { // 连接建立之后执行send方法发送数据
                // console.log('WebSocket连接成功')
                const actions = {
                    // 'ip': this.ip,
                    // 'port': this.port,
                    // 'operate': this.operate
                }
                bus.$on('sendStoreCodeByBus', data => {
                    this.storeCode = data
                    //关闭websocket
                    this.websock.close();
                    //重连websocket
                    this.reconnect()
                })

                //接收 设置模块设置“字体”发送过来的
                // “字体”大小
                // bus.$on('sendFontSizeByBus', data => {
                //     let fontSizeData = data
                //     //通过字体变化更新滚动插件dom关键字key 更新滚动页面
                //     this.scrollKey = fontSizeData
                // })

                // console.log('发送参数', actions)
                setTimeout(() => {
                    this.websocketsend(JSON.stringify(actions))
                }, 500)
            },
            reconnect() {
                //重新连接
                var that = this;
                if (that.lockReconnect) {
                    // 是否真正建立连接
                    return;
                }
                that.lockReconnect = true;
                //没连接上会一直重连,设置延迟避免请求过多
                that.timeoutnum && clearTimeout(that.timeoutnum);
                // 如果到了这里断开重连的倒计时还有值的话就清除掉
                that.timeoutnum = setTimeout(function() {
                    //然后新连接
                    that.initWebSocket();
                    that.lockReconnect = false;
                }, 5000);
            },
            reset() {
                //重置心跳
                var that = this;
                //清除时间(清除内外两个心跳计时)
                clearTimeout(that.timeoutObj);
                clearTimeout(that.serverTimeoutObj);
                //重启心跳
                that.start();
            },
            start() {
                //开启心跳
                var self = this;
                self.timeoutObj && clearTimeout(self.timeoutObj);
                // 如果外层心跳倒计时存在的话,清除掉
                self.serverTimeoutObj && clearTimeout(self.serverTimeoutObj);
                // 如果内层心跳检测倒计时存在的话,清除掉
                self.timeoutObj = setTimeout(function() {
                    // 重新赋值重新发送 进行心跳检测
                    //这里发送一个心跳,后端收到后,返回一个心跳消息,
                    if (self.websock.readyState == 1) {
                        //如果连接正常
                        // self.websock.send("heartCheck");
                    } else {
                        //否则重连
                        self.reconnect();
                    }
                    self.serverTimeoutObj = setTimeout(function() {
                        // 在三秒一次的心跳检测中如果某个值3秒没响应就关掉这次连接
                        //超时关闭
                        self.websock.close();
                    }, self.timeout);
                }, self.timeout);
                // 3s一次
            },
            websocketonmessage(e) { // 数据接收
                const redata = JSON.parse(e.data)
                // console.log('数据内容:{0}', redata)
                if (redata) {

                    //库位产量
                    this.storageCapacity = redata.storageCapacity
                    //今日喂养
                    this.todayFeed = redata.todayFeed
                    //库位作业
                    this.locationJob = redata.locationJob
                    //喂养异常
                    this.feedError = redata.feedError
                    //批次任务
                    this.batchJob = redata.batchJob
                    //堆垛机报警
                    this.stackerReport = redata.stackerReport
                    //初始化图表
                    this.initStorgeCapcityChart()

                    //通过总线发送“今日喂养”
                    bus.$emit('sendTodayFeedByBus', this.todayFeed)
                    //通过总线发送“库位作业”
                    bus.$emit('sendLocationJobByBus', this.locationJob)
                    //通过总线发送“喂养异常”
                    bus.$emit('sendFeedErrorByBus', this.feedError)
                    //通过总线发送“批次任务”
                    bus.$emit('sendBatchJobByBus', this.batchJob)
                    //通过总线发送“堆垛机报警”
                    bus.$emit('sendStackerReportByBus', this.stackerReport)
                } else {
                    //TODO
                    // console.log("=======暂无数据=====")
                }
                this.reset();
            },
            websocketsend(param) { // 数据发送
                // console.log('***数据发送**', param)
                try {
                    // console.log('*****************', this.websock.readyState)
                    this.websock.send(param)
                } catch (err) {
                    // console.log('error', err)
                }
            },
            websocketclose(e) { // 关闭
                // console.log('WebSocket连接关闭', e)
            },
            websocketerror() { // 失败
                // console.log('WebSocket连接失败')
                this.initWebSocket() // 连接建立失败重连
            },
            clearRefreshData() {
                // clearTimeout(this.refreshTimer)
                clearInterval(this.refreshTimer)
                this.refreshTimer = null
            },
            getData() {
                this.optionsStorgeCapcity = {}
                this.initStorgeCapcityChart(this.optionsStorgeCapcity)
                // this.init(this.optObj)
                // currentGET('big6', { companyName: this.companyName }).then(res => {
                //   // console.log('安装计划', res);
                //   if (res.success) {
                //     this.init(res.data)
                //   } else {
                //     this.pageflag = false
                //     this.$Message({
                //       text: res.msg,
                //       type: 'warning'
                //     })
                //   }
                // })
            },
            //初始化图表
            initStorgeCapcityChart(newData) {
                this.optionsStorgeCapcity = {
                    legend: {
                        data: ['入库量', '出库量'],
                        textStyle: {
                            color: '#ffffff'
                        },
                    },
                    grid: {
                        left: 60
                    },
                    tooltip: {
                        trigger: 'axis',
                        axisPointer: { // 坐标轴指示器,坐标轴触发有效
                            type: 'shadow' // 默认为直线,可选为:'line' | 'shadow'
                        }
                    },
                    xAxis: {
                        type: 'value',
                        name: '数量',
                        nameTextStyle: {
                            color: '#ffffff'
                        },
                        axisLabel: {
                            textStyle: {
                                //x轴纵坐标文字颜色
                                color: '#ffffff'
                            },
                            formatter: '{value}'
                        }
                    },
                    yAxis: {
                        type: 'category',
                        inverse: true,
                        data: this.storageCapacity.libraryName,
                        axisLabel: {
                            formatter: function(value) {
                                return '{' + value + '| }\n{value|' + value + '}';
                            },
                            margin: 20,
                            rich: {
                                value: {
                                    lineHeight: 30,
                                    align: 'center'
                                },
                                Sunny: {
                                    height: 40,
                                    align: 'center',
                                },
                                Cloudy: {
                                    height: 40,
                                    align: 'center',
                                },
                                Showers: {
                                    height: 40,
                                    align: 'center',
                                },
                                Showers: {
                                    height: 40,
                                    align: 'center',
                                }
                            }
                        },
                        axisLabel: {
                            textStyle: {
                                //y轴纵坐标文字颜色
                                color: '#ffffff',
                            },
                            inside: false, // 刻度标签是否朝内,默认朝外
                            rotate: 65 // 刻度标签旋转的角度,在类目轴的类目标签显示不下的时候可以通过旋转防止标签之间重叠;旋转的角度从-90度到90度
                        },
                        splitLine: { //网格线
                            lineStyle: {
                                type: 'dotted' //设置网格线类型 dotted:虚线   solid:实线
                            },
                            show: false //隐藏或显示
                        },
                    },
                    series: [{
                            name: '入库量',
                            type: 'bar',
                            label: {
                                show: true
                            },
                            data: this.storageCapacity.inNum,
                            // [150, 105, 110, 90]
                        },
                        {
                            name: '出库量',
                            type: 'bar',
                            label: {
                                show: true
                            },
                            data: this.storageCapacity.outNum
                            // [220, 82, 63, 110]
                        }
                    ]
                }

            }

 以上是接收websocket发送过来的数据,在其他5个模块接收数据,这里就展示5个接受数据模块中的一个模块,代码如下:

在center-top.vue中<script></script>标签内

//引入中央事件总线
import bus from '@/assets/js/eventBus'

在和data(){}同级写

created() {
    //接收“今日喂养”数据
    bus.$on('sendTodayFeedByBus', data => {
    this.todayFeedObj = data
    // this.getData()
    })
},

在data(){}中定义接收的变量

data() {
    return {
        todayFeedObj: [{
            "storeName": "幼虫仓库",
            "feedTotal": 0,
            "feedNum": 0,
            "feedErrorNum": 0,
            "vehicleTotal": 0
            },
        {
            "storeName": "虫卵仓库",
            "feedTotal": 0,
            "feedNum": 0,
            "feedErrorNum": 0,
            "vehicleTotal": 0
        },
        {
            "storeName": "六天成虫仓库",
            "feedTotal": 0,
            "feedNum": 0,
            "feedErrorNum": 0,
            "vehicleTotal": 0
        },
        {
            "storeName": "二十天成虫仓库",
            "feedTotal": 0,
            "feedNum": 0,
            "feedErrorNum": 0,
            "vehicleTotal": 0
        }
        ],
    };
},    

 数据刷起来:

 

标签:集成,vue,websocket,log,bus,self,websock,console,data
From: https://www.cnblogs.com/chenyangjava/p/18108967

相关文章

  • 前端【VUE】02-vue指令【v-html 、v-show、 v-if 、v-else、v-on、v-bind、v-for、v-m
    Vue指令①v-html1<!DOCTYPEhtml>2<htmllang="en">3<head>4<metacharset="UTF-8">5<metahttp-equiv="X-UA-Compatible"content="IE=edge">6<metaname="view......
  • vue3+uniapp手写日历组件
    为了满足产品需求,在日历中可以添加排班信息,点击日期可以获取排班日期详细数据,自定义日历样式,并且支持手动折叠和展开,折叠时只显示当前周的日期,由于现有组件库修改起来比较麻烦,自己就手写了一个日历组件,下面是我代码及思路。代码写的不好仅供参考,如有异议欢迎评论指正,感谢。一......
  • TalkingData——Unity应用开发中集成统计分析工具
    第一步:帐号注册官方网站:TalkingData-移动.数据.价值第二步:创建应用查看appid可以进入网站注册,注册好以后就可以创建应用 创建好应用后,点击 应用管理-》基本信息就可以查看自己的AppID第三步:申请对应平台的sdk 接下来就是申请sdk这里是申请sdk的网站:SDK定制填写......
  • 毕业设计程序开源 Spring Boot+vue.js+Echart+mysql +QT+halcon
    1.介绍 涉及到的技术框架比较多,但是也不难,相关技术需要些基础。目前还是个半成品,还有些数据图表和QT功能没做完善,本来想在前端部分做大数据分析平台的,后续有空再完善。下面简单介绍一下。源代码此处:链接:https://pan.baidu.com/s/1904kLOv4EDJkcBuuNe1jqw?pwd=6666 提取码:6......
  • (毕设)基于Java+Vue+Mysql的WMS仓库管理系统
      前言: WMS(WarehouseManagementSystem)仓库管理系统是一个用于优化仓库操作、提高效率和准确性的软件解决方案。以下是针对列出的WMS仓库管理系统的各个部分的简要描述:1.订单管理订单管理是WMS的核心功能之一,涉及处理、跟踪和完成客户订单。这包括:订单录入:手动或自......
  • Vue
    Vue什么是Vue?1.Vue是一套前端框架,免除原生JavaScript中的DOM操作,简化书写。2.基于MVVM(Moedel-View-ViewModel)思想,实现数据的双向绑定,将编程的关注点放在数据上。框架:是一个半成品软件,是一套可重用的、通用的、软件基础代码模型。基于框架进行开发,更加快捷、更加高效。Vue快速......
  • vuejs3.0 从入门到精通——网页图形绘制:登录页面
    网页图形绘制:登录页面安全升级,JS动态生成图片验证码功能一、实验目标掌握Canvas的基本用法。掌握使用Canvas绘制文本的方法。掌握使用Canvas绘制线段的方法。掌握使用Canvas导出图片的方法。掌握JS的基本语法和程序结构。掌握JS函数的定义和应用。掌握JS数......
  • Vue 有哪些常用的指令
    目录1.指令v-html1.1.作用1.2.语法1.3.练习 2. 指令v-show2.1.作用2.2.语法3.原理4.场景 3.指令v-if3.1.作用3.2.语法3.3.原理3.4.场景 4. 指令v-else与v-else-if4.1.作用4.2.语法4.3.注意4.4.使用场景 5. 指令v-on5.1.作......
  • 十分钟学会WebSocket
    一、WebSocket简介WebSocket是一种在客户端和服务器之间实现双向通信的网络协议。它通过在单个TCP连接上提供全双工通信功能,使得服务器可以主动向客户端推送数据,而不需要客户端发起请求。 二、WebSocket的工作原理1.WebSocket的握手过程和HTTP有所不同。客户端通过发送特定......
  • 基于vue3的Crontab组件
    网上找的没有满意的,决定从若依前后端分离其前端vue2中的crontab进行转换,先上效果若依: 改后:  v2转v3没什么难度,其中有大量的将this.***替换为***.value,笔者写了个正则替换,希望可以帮助大家this.(\w+)$1.value 需要注意的有,在v2中【this.$refs[refName......