App.vue 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  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. const url = localStorage.getItem('mqttUrl')
  88. const username = localStorage.getItem('mqttUser')
  89. const password = localStorage.getItem('mqttPassword')
  90. if (!url) return
  91. if (!/^(ws|wss|mqtt|mqtts):\/\//.test(url)) {
  92. console.error('MQTT URL 格式错误,缺少协议头:', url)
  93. return
  94. }
  95. this.mqttClient = mqtt.connect(url, { username, password })
  96. this.mqttClient.on('connect', () => {
  97. // this.mqttClient.subscribe('#')
  98. this.mqttClient.subscribe('lab/risk/plan/change', (err) => {
  99. if (!err) {
  100. console.log("预案-订阅成功:lab/risk/plan/change");
  101. }else{
  102. // console.log("预案-连接错误:" + err);
  103. }
  104. });
  105. })
  106. this.mqttClient.on('message', async (topic, message) => {
  107. try {
  108. const payload = JSON.parse(message.toString())
  109. if (payload) {
  110. this.getTriggerInfo();
  111. }
  112. } catch (e) {
  113. console.error('MQTT消息处理失败:', e)
  114. }
  115. })
  116. this.mqttClient.on('error', (err) => {
  117. console.error('MQTT连接错误:', err)
  118. })
  119. },
  120. async getTriggerInfo() {
  121. const res = await getTriggerInfo()
  122. if (res.code === 200 && res.data && res.data.length) {
  123. res.data[0].triggerUploadData = JSON.parse(res.data[0].triggerUploadData)
  124. for(let i=0;i<res.data[0].bindingSensorList.length;i++){
  125. for(let o=0;o<res.data[0].triggerUploadData.length;o++){
  126. if(res.data[0].bindingSensorList[i].code == res.data[0].triggerUploadData[o].code){
  127. res.data[0].triggerUploadData[o].max = res.data[0].bindingSensorList[i].max
  128. res.data[0].triggerUploadData[o].min = res.data[0].bindingSensorList[i].min
  129. }
  130. }
  131. }
  132. this.$set(this,'alarmData', res.data[0]);
  133. this.$set(this,'showAlarm',true);
  134. }else{
  135. this.$set(this,'showAlarm',false);
  136. this.$set(this,'alarmData', {});
  137. }
  138. }
  139. }
  140. }
  141. </script>
  142. <style lang="scss">
  143. #app {
  144. width: 100%;
  145. height: 100%;
  146. }
  147. </style>