App.vue 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. <template>
  2. <div id="app">
  3. <div class="viewport">
  4. <div class="screen" ref="screen">
  5. <router-view />
  6. </div>
  7. </div>
  8. <AlarmWindow
  9. v-if="showAlarm"
  10. :alarm-data="alarmData"
  11. @close="showAlarm = false"
  12. />
  13. </div>
  14. </template>
  15. <script>
  16. import AlarmWindow from '@/components/alarmWindow/index.vue'
  17. import mqtt from 'mqtt'
  18. import { getMqttConfig, getTriggerInfo } from '@/api'
  19. import { Decrypt } from '@/utils/decrypt'
  20. export default {
  21. name: 'App',
  22. components: { AlarmWindow },
  23. data() {
  24. return {
  25. showAlarm: false,
  26. alarmData:null,
  27. mqttClient: null ,
  28. }
  29. },
  30. computed: {
  31. token() { return this.$store.state.token }
  32. },
  33. watch: {
  34. token(val) {
  35. if (val) {
  36. this.initMqttConfig().then(() => this.connectMqtt())
  37. } else {
  38. if (this.mqttClient) { this.mqttClient.end(); this.mqttClient = null }
  39. }
  40. }
  41. },
  42. mounted() {
  43. this.fitScreen()
  44. window.addEventListener('resize', this.fitScreen)
  45. if (this.$store.state.token) {
  46. this.getTriggerInfo();
  47. this.initMqttConfig().then(() => this.connectMqtt())
  48. }
  49. },
  50. beforeDestroy() {
  51. window.removeEventListener('resize', this.fitScreen)
  52. if (this.mqttClient) this.mqttClient.end()
  53. },
  54. methods: {
  55. fitScreen() {
  56. const scr = this.$refs.screen
  57. if (!scr) return
  58. const sw = 1920, sh = 1080
  59. const vw = window.innerWidth, vh = window.innerHeight
  60. const sx = vw / sw, sy = vh / sh
  61. scr.style.transform = `translate(-50%, -50%) scale(${sx}, ${sy})`
  62. },
  63. async initMqttConfig() {
  64. try {
  65. const res = await getMqttConfig()
  66. const config = JSON.parse(res.data.configValue)
  67. let urlText = window.location.href.split('://')[0]+'://';
  68. let outerNet = window.location.href.indexOf(config.ipIdentify) == -1;
  69. if(outerNet){//外网
  70. localStorage.setItem('mqttUrl', 'wss://'+Decrypt(config.mqttExtranetUrl))
  71. localStorage.setItem('mqttUser', Decrypt(config.mqttExtranetUser))
  72. localStorage.setItem('mqttPassword', Decrypt(config.mqttExtranetPassword))
  73. localStorage.setItem('fileBrowseEnvironment',urlText+Decrypt(config.fileBrowseEnvironmentExtranet))
  74. localStorage.setItem('fileBrowseEnvironmentExtranet',urlText+Decrypt(config.fileBrowseEnvironmentExtranet))
  75. }else{
  76. localStorage.setItem('mqttUrl', 'ws://'+Decrypt(config.mqttIntranetUrl))
  77. localStorage.setItem('mqttUser', Decrypt(config.mqttIntranetUser))
  78. localStorage.setItem('mqttPassword', Decrypt(config.mqttIntranetPassword))
  79. localStorage.setItem('fileBrowseEnvironment',urlText+Decrypt(config.fileBrowseEnvironment))
  80. localStorage.setItem('fileBrowseEnvironmentExtranet',urlText+Decrypt(config.fileBrowseEnvironmentExtranet))
  81. }
  82. } catch (e) {
  83. console.error('获取MQTT配置失败:', e)
  84. }
  85. },
  86. connectMqtt() {
  87. let self = this;
  88. const url = localStorage.getItem('mqttUrl')
  89. const username = localStorage.getItem('mqttUser')
  90. const password = localStorage.getItem('mqttPassword')
  91. if (!url) return
  92. if (!/^(ws|wss|mqtt|mqtts):\/\//.test(url)) {
  93. console.error('MQTT URL 格式错误,缺少协议头:', url)
  94. return
  95. }
  96. this.mqttClient = mqtt.connect(url, { username, password })
  97. this.mqttClient.on('connect', () => {
  98. // this.mqttClient.subscribe('#')
  99. this.mqttClient.subscribe('lab/risk/plan/change', (err) => {
  100. if (!err) {
  101. // console.log("预案-订阅成功:lab/risk/plan/change");
  102. }else{
  103. // console.log("预案-连接错误:" + err);
  104. }
  105. });
  106. })
  107. this.mqttClient.on('message', async (topic, message) => {
  108. if(message){
  109. setTimeout(function(){
  110. self.getTriggerInfo();
  111. },1000);
  112. }
  113. });
  114. this.mqttClient.on('error', (err) => {
  115. console.error('MQTT连接错误:', err)
  116. })
  117. },
  118. async getTriggerInfo() {
  119. const res = await getTriggerInfo()
  120. if (res.code === 200 && res.data && res.data.length) {
  121. res.data[0].triggerUploadData = JSON.parse(res.data[0].triggerUploadData)
  122. if(res.data[0].bindingSensorList){
  123. for(let i=0;i<res.data[0].bindingSensorList.length;i++){
  124. for(let o=0;o<res.data[0].triggerUploadData.length;o++){
  125. if(res.data[0].bindingSensorList[i].code == res.data[0].triggerUploadData[o].code){
  126. res.data[0].triggerUploadData[o].max = res.data[0].bindingSensorList[i].max
  127. res.data[0].triggerUploadData[o].min = res.data[0].bindingSensorList[i].min
  128. }
  129. }
  130. }
  131. }else{
  132. res.data[0].bindingSensor=[];
  133. res.data[0].bindingSensorList=[];
  134. }
  135. this.$set(this,'alarmData', res.data[0]);
  136. this.$set(this,'showAlarm',true);
  137. }else{
  138. this.$set(this,'showAlarm',false);
  139. this.$set(this,'alarmData', {});
  140. }
  141. }
  142. }
  143. }
  144. </script>
  145. <style lang="scss">
  146. #app {
  147. width: 100%;
  148. height: 100%;
  149. }
  150. </style>