index.vue 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. <template>
  2. <div
  3. :class="{'avue--collapse':isCollapse}"
  4. class="avue-contail">
  5. <div class="avue-header">
  6. <!-- 顶部导航栏 -->
  7. <top/>
  8. </div>
  9. <div class="avue-layout">
  10. <div class="avue-left">
  11. <!-- 左侧导航栏 -->
  12. <sidebar/>
  13. </div>
  14. <div class="avue-main">
  15. <!-- 顶部标签卡 -->
  16. <tags/>
  17. <!-- 主体视图层 -->
  18. <el-scrollbar style="height:100%">
  19. <keep-alive>
  20. <router-view
  21. v-if="$route.meta.$keepAlive"
  22. class="avue-view"/>
  23. </keep-alive>
  24. <router-view
  25. v-if="!$route.meta.$keepAlive"
  26. class="avue-view"/>
  27. </el-scrollbar>
  28. </div>
  29. </div>
  30. <div
  31. class="avue-shade"
  32. @click="showCollapse"/>
  33. </div>
  34. </template>
  35. <script>
  36. import { mapGetters } from 'vuex'
  37. import tags from './tags'
  38. import top from './top/'
  39. import sidebar from './sidebar/'
  40. import admin from '@/util/admin'
  41. import { getStore } from '@/util/store.js'
  42. import * as SockJS from 'sockjs-client'
  43. import Stomp from 'stomp-websocket'
  44. import store from '@/store'
  45. export default {
  46. name: 'Index',
  47. components: {
  48. top,
  49. tags,
  50. sidebar
  51. },
  52. data() {
  53. return {
  54. // 刷新token锁
  55. refreshLock: false,
  56. // 刷新token的时间
  57. refreshTime: '',
  58. // 计时器
  59. timer: ''
  60. }
  61. },
  62. created() {
  63. // 实时检测刷新token
  64. this.refreshToken()
  65. },
  66. destroyed() {
  67. clearInterval(this.refreshTime)
  68. clearInterval(this.timer)
  69. this.disconnect()
  70. },
  71. mounted() {
  72. this.init()
  73. this.initWebSocket()
  74. },
  75. computed: mapGetters(['userInfo', 'isLock', 'isCollapse', 'website', 'expires_in']),
  76. methods: {
  77. showCollapse() {
  78. this.$store.commit('SET_COLLAPSE')
  79. },
  80. // 屏幕检测
  81. init() {
  82. this.$store.commit('SET_SCREEN', admin.getScreen())
  83. window.onresize = () => {
  84. setTimeout(() => {
  85. this.$store.commit('SET_SCREEN', admin.getScreen())
  86. }, 0)
  87. }
  88. },
  89. // 实时检测刷新token
  90. refreshToken() {
  91. this.refreshTime = setInterval(() => {
  92. const token = getStore({
  93. name: 'access_token',
  94. debug: true
  95. })
  96. if (this.validatenull(token)) {
  97. return
  98. }
  99. if (this.expires_in <= 1000 && !this.refreshLock) {
  100. this.refreshLock = true
  101. this.$store
  102. .dispatch('RefreshToken')
  103. .catch(() => {
  104. clearInterval(this.refreshTime)
  105. })
  106. this.refreshLock = false
  107. }
  108. this.$store.commit('SET_EXPIRES_IN', this.expires_in - 10)
  109. }, 10000)
  110. },
  111. initWebSocket() {
  112. this.connection()
  113. const self = this
  114. // 断开重连机制,尝试发送消息,捕获异常发生时重连
  115. this.timer = setInterval(() => {
  116. try {
  117. self.stompClient.send('test')
  118. } catch (err) {
  119. console.log('断线了: ' + err)
  120. self.connection()
  121. }
  122. }, 5000)
  123. },
  124. connection() {
  125. const token = store.getters.access_token
  126. const TENANT_ID = getStore({ name: 'tenantId' }) ? getStore({ name: 'tenantId' }) : '1'
  127. const headers = {
  128. 'Authorization': 'Bearer ' + token
  129. }
  130. // 建立连接对象
  131. this.socket = new SockJS('/act/ws')// 连接服务端提供的通信接口,连接以后才可以订阅广播消息和个人消息
  132. // 获取STOMP子协议的客户端对象
  133. this.stompClient = Stomp.over(this.socket)
  134. this.stompClient.debug = null
  135. // 向服务器发起websocket连接
  136. this.stompClient.connect(headers, () => {
  137. this.stompClient.subscribe('/task/' + this.userInfo.username + '-' + TENANT_ID + '/remind', (msg) => { // 订阅服务端提供的某个topic;
  138. this.$notify({
  139. title: '协同提醒',
  140. type: 'warning',
  141. dangerouslyUseHTMLString: true,
  142. message: msg.body + '任务,请及时处理',
  143. offset: 60
  144. })
  145. })
  146. }, (err) => {
  147. })
  148. },
  149. disconnect() {
  150. if (this.stompClient != null) {
  151. this.stompClient.disconnect()
  152. console.log('Disconnected')
  153. }
  154. }
  155. }
  156. }
  157. </script>