You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

187 lines
4.9 KiB

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