{"remainingRequest":"D:\\jenkins\\workspace\\cssc-fvue\\node_modules\\vue-loader\\lib\\index.js??vue-loader-options!D:\\jenkins\\workspace\\cssc-fvue\\src\\components\\layout\\Layout.vue?vue&type=script&lang=js&","dependencies":[{"path":"D:\\jenkins\\workspace\\cssc-fvue\\src\\components\\layout\\Layout.vue","mtime":1698745303706},{"path":"D:\\jenkins\\workspace\\cssc-fvue\\node_modules\\babel-loader\\lib\\index.js","mtime":315532800000},{"path":"D:\\jenkins\\workspace\\cssc-fvue\\node_modules\\cache-loader\\dist\\cjs.js","mtime":499162500000},{"path":"D:\\jenkins\\workspace\\cssc-fvue\\node_modules\\vue-loader\\lib\\index.js","mtime":499162500000}],"contextDependencies":[],"result":["//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\r\nimport Navigator from './Navigator.vue'\r\nimport SideMenu from './SideMenu.vue'\r\nimport menu from '@/api/menu.js'\r\nimport portal from '@/api/portal.js'\r\nimport pako from 'pako'\r\nexport default {\r\n components: {\r\n Navigator,\r\n SideMenu\r\n },\r\n data() {\r\n return {\r\n menuShow: true,\r\n currentMenuLabel: '',\r\n showHeader: true,\r\n menuStyle: 'sideMenu', // sideMenu topMenu topSide\r\n transitionName: 'fold-left',\r\n showPage: true,\r\n isCurrentWindow: true\r\n }\r\n },\r\n watch: {\r\n $route(to, from) {\r\n if (!to.hash) {\r\n this.showPage = !this.showPage\r\n const toDepth = to.path.split('/').length\r\n const fromDepth = from.path.split('/').length\r\n this.transitionName = toDepth < fromDepth ? 'fold-right' : 'fold-left'\r\n }\r\n }\r\n },\r\n created() {\r\n this.heartCheckFun()\r\n this.initWebSocket()\r\n },\r\n mounted() {\r\n document.addEventListener('visibilitychange', this.windowVisiable)\r\n window.onresize = () => {\r\n this.$root.$emit('resize')\r\n }\r\n menu.getMenuByAlias(this.$route.name, m => {\r\n if (m) {\r\n this.$emit('menuChange', m)\r\n }\r\n })\r\n this.$bus.$on('login', () => {\r\n this.heartCheckFun()\r\n })\r\n // 发送消息\r\n // this.$bus.$on('sendWebsock',()=>{\r\n // this.websocketSend(\"{'messageType':'topic','message': '发送'}\")\r\n // })\r\n },\r\n beforeDestroy() {\r\n this.isCurrentWindow = false\r\n document.removeEventListener('visibilitychange', this.windowVisiable)\r\n },\r\n methods: {\r\n windowVisiable(e) {\r\n if (e.target.visibilityState == 'visible') {\r\n // console.log('回到当前tab标签')\r\n this.isCurrentWindow = true\r\n } else {\r\n // console.log('离开当前tab标签')\r\n this.isCurrentWindow = false\r\n }\r\n },\r\n handleMenuChange(menu) {\r\n this.currentMenuLabel = menu.name\r\n this.showHeader = !(menu.children && menu.children.length > 0)\r\n },\r\n initWebSocket() {\r\n // WebSocket与普通的请求所用协议有所不同,ws等同于http,wss等同于https\r\n const token = this.$store.state.login.currentUser.token\r\n const url =\r\n window.context.WebSocket.replace('https://', 'wss://').replace(\r\n 'http://',\r\n 'ws://'\r\n ) + '/websocket'\r\n // ?token=' +\r\n // token\r\n console.log(url, 'url')\r\n this.websock = new WebSocket(url)\r\n this.websock.onopen = this.websocketOnopen\r\n this.websock.onerror = this.websocketOnerror\r\n this.websock.onmessage = this.websocketOnmessage\r\n this.websock.onclose = this.websocketOnclose\r\n },\r\n websocketOnopen() {\r\n console.log('WebSocket连接成功')\r\n this.heartCheck.start()\r\n },\r\n websocketOnerror(e) {\r\n console.log(e, 'WebSocket连接发生错误')\r\n this.reconnect()\r\n },\r\n ungzip(zipData, callback) {\r\n var unZipData = '' //解压缩后数据\r\n\r\n //在浏览器中,必须使用atob,并且您需要使用例如Uint8Array.from将解码的数据转换为Uint8Array\r\n\r\n var strData = atob(zipData)\r\n\r\n const gzipedDataArray = Uint8Array.from(strData, c => c.charCodeAt(0))\r\n\r\n const ungzipedData = pako.ungzip(gzipedDataArray)\r\n\r\n // console.log('ungziped data', new TextDecoder().decode(ungzipedData))\r\n // 在ungzip上的结果是一个Unit8Array。如果你想把它转换回一个字符串,你需要再次解码:\r\n\r\n unZipData = new TextDecoder().decode(ungzipedData)\r\n\r\n // 还原成对象\r\n if (unZipData) {\r\n unZipData = JSON.parse(unZipData)\r\n }\r\n //利用回调进行处理后续操作\r\n if (callback) {\r\n callback(unZipData)\r\n }\r\n },\r\n websocketOnmessage(e) {\r\n // console.log('-----接收消息-------', e.data)\r\n let data = JSON.parse(e.data) //解析对象 eval('(' + e.data + ')');\r\n // console.log('-----接收消息-------', data.cmd, data.data)\r\n if (data.cmd == 'SCADA') {\r\n if (this.isCurrentWindow) {\r\n // 解压数据\r\n this.ungzip(data.data, changeData => {\r\n // console.log('-----接收消息-------', changeData)\r\n // 处理业务逻辑\r\n this.$bus.$emit('SCADAMsg', changeData)\r\n })\r\n }\r\n }\r\n // 场群协同\r\n if (data.cmd == 'CQKZ') {\r\n if (this.isCurrentWindow) {\r\n // console.log('-----接收消息-------', data.data)\r\n this.$bus.$emit('CQKZMsg', data.data)\r\n }\r\n }\r\n // 无功功率\r\n if (data.cmd == 'DWWGKZ') {\r\n if (this.isCurrentWindow) {\r\n this.ungzip(data.data, changeData => {\r\n // 处理业务逻辑\r\n this.$bus.$emit('DWWGKZMsg', changeData)\r\n })\r\n }\r\n }\r\n\r\n if (data.cmd == 'dict') {\r\n // 重载字典\r\n this.getSysDict()\r\n }\r\n if (data.cmd == 'alarm') {\r\n // 告警刷新\r\n this.$bus.$emit('SCADAAlram')\r\n }\r\n this.heartCheck.reset()\r\n },\r\n websocketOnclose(e) {\r\n console.log('connection closed (' + e.code + ')')\r\n this.reconnect()\r\n },\r\n websocketSend(text) {\r\n // 数据发送\r\n try {\r\n this.websock.send(text)\r\n } catch (err) {\r\n console.log('send failed (' + err.code + ')')\r\n }\r\n },\r\n reconnect() {\r\n if (this.lockReconnect) return\r\n this.lockReconnect = true\r\n //没连接上会一直重连,设置延迟避免请求过多\r\n setTimeout(() => {\r\n console.info('尝试重连...')\r\n this.initWebSocket()\r\n this.lockReconnect = false\r\n }, 5000)\r\n },\r\n heartCheckFun() {\r\n var that = this\r\n //心跳检测,每10分钟心跳一次\r\n this.heartCheck = {\r\n timeout: 1000 * 60 * 10,\r\n timeoutObj: null,\r\n serverTimeoutObj: null,\r\n reset: function() {\r\n clearTimeout(this.timeoutObj)\r\n this.start()\r\n return this\r\n },\r\n start: function() {\r\n var self = this\r\n this.timeoutObj = setTimeout(function() {\r\n //这里发送一个心跳,后端收到后,返回一个心跳消息,\r\n //onmessage拿到返回的心跳就说明连接正常\r\n const account = JSON.parse(sessionStorage.getItem('currentUser'))\r\n .account\r\n that.websocketSend('{\"messageType\":\"ping\",\"message\":\"web\"}')\r\n console.info('客户端发送心跳')\r\n //self.serverTimeoutObj = setTimeout(function(){//如果超过一定时间还没重置,说明后端主动断开了\r\n // that.websock.close();//如果onclose会执行reconnect,我们执行ws.close()就行了.如果直接执行reconnect 会触发onclose导致重连两次\r\n //}, self.timeout)\r\n }, this.timeout)\r\n }\r\n }\r\n },\r\n //---------websocket 接收字典被修改的信息,请求新字典数据。-------------\r\n // websocket sendMessage()\r\n\r\n // websocketSend\r\n // messageType: 类型 ping //心跳,topic //群发送,user //向目标用户发消息\r\n // account :登录用户account的账号\r\n // chatId :目标用户account的账号\r\n // message :消息内容\r\n\r\n getSysDict() {\r\n portal.getSysDict().then(data => {\r\n console.log(data, '字典')\r\n if (data) {\r\n sessionStorage.setItem('dict_data', JSON.stringify(data))\r\n }\r\n })\r\n }\r\n }\r\n}\r\n",null]}