index.vue 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. <template>
  2. <el-container class="hc-layout-box" :class="[!isNullES(isLayout) && isLayout === 'no' ? 'is-no-layout' : '']">
  3. <el-header class="hc-layout-header">
  4. <div class="hc-layout-header-logo" :style="`width: ${isCollapse ? '0px' : '200px'};`" @click="logoClick">
  5. <!-- <img id="logo-icon" :src="appLogoIcon" alt=""> -->
  6. <span v-show="!isCollapse" class="logo-name">计量系统</span>
  7. </div>
  8. <div class="header-top-collapse-bar" @click="collapseChange">
  9. <HcIcon v-if="isCollapse" name="menu-unfold" />
  10. <HcIcon v-else name="menu-fold" />
  11. </div>
  12. <div class="header-top-menu-bar">
  13. <HcTopMenuBar :msg-count="taskCount" @load="topMenuLoad" @change="topMenuChange" />
  14. </div>
  15. <div class="header-content-bar">
  16. <HcCascader @send="cascaderSend" @change="cascaderChange" />
  17. <hc-upload-bar />
  18. <HelpInfoBar />
  19. <ConfigBar />
  20. <UserInfoBar @load="userInfoLoad" />
  21. </div>
  22. </el-header>
  23. <el-container class="hc-layout-container">
  24. <el-aside v-if="isAsideMenu" class="hc-layout-aside" :class="[isCollapse ? 'is-collapse' : '']" :width="isCollapse ? '90px' : '200px'">
  25. <MenuBar :collapse="isCollapse" :cur="menuBarKey" :datas="menuBarData" :msg-count="taskCount" @change="menuBarChange" />
  26. </el-aside>
  27. <el-main class="hc-layout-main">
  28. <div class="hc-router-menu-bar">
  29. <RouterMenu @load="routerMenuLoad" />
  30. </div>
  31. <div id="hc-main-box" class="hc-main-page">
  32. <div class="hc-main-body">
  33. <router-view v-if="reloadRouter" v-slot="{ Component }">
  34. <transition name="fade-transform">
  35. <keep-alive :max="10">
  36. <component :is="Component" :msg-count="taskCount" />
  37. </keep-alive>
  38. </transition>
  39. </router-view>
  40. </div>
  41. </div>
  42. </el-main>
  43. </el-container>
  44. </el-container>
  45. </template>
  46. <script setup>
  47. import { nextTick, onMounted, ref, watch } from 'vue'
  48. import { useAppStore } from '~src/store'
  49. import { getToken } from '~src/api/auth'
  50. import { useRoute, useRouter } from 'vue-router'
  51. import { initButtons } from '~sto/app'
  52. import { isNullES, useClick } from 'js-fast-way'
  53. import { HcSocket } from '~src/plugins/HcSocket'
  54. import messageApi from '~api/tasks/message'
  55. //初始组合式
  56. const router = useRouter()
  57. const useRoutes = useRoute()
  58. const store = useAppStore()
  59. const reloadRouter = ref(true)
  60. //子组件
  61. import HcTopMenuBar from './modules/HcTopMenu.vue'
  62. import HcCascader from './modules/Cascader.vue'
  63. import UserInfoBar from './modules/UserInfoBar.vue'
  64. import HelpInfoBar from './modules/HelpInfoBar.vue'
  65. import ConfigBar from './modules/ConfigBar.vue'
  66. import RouterMenu from './modules/RouterMenu.vue'
  67. import MenuBar from '~src/layout/modules/MenuBar.vue'
  68. //菜单数据
  69. const menuBarKey = ref('')
  70. const menuBarData = ref([])
  71. const isLayout = ref('')
  72. //渲染完成
  73. onMounted(() => {
  74. const layout = useRoutes?.query?.layout, layout2 = store.isLayout
  75. isLayout.value = layout ?? layout2
  76. initButtons()
  77. })
  78. //监听layout
  79. watch(() => [
  80. useRoutes?.query?.layout,
  81. store.isLayout,
  82. ], ([layout, layout2]) => {
  83. isLayout.value = layout ?? layout2
  84. }, { deep: true })
  85. //路由信息
  86. const routerMenuLoad = ({ key }) => {
  87. menuBarKey.value = key
  88. }
  89. // 是否折叠
  90. const isCollapse = ref(false)
  91. const collapseChange = () => {
  92. const bool = !isCollapse.value
  93. isCollapse.value = bool
  94. store.setCollapse(bool)
  95. }
  96. //顶部菜单导航
  97. const isAsideMenu = ref(true)
  98. const topMenuLoad = () => {
  99. isAsideMenu.value = false
  100. }
  101. //顶部菜单导航被点击
  102. const topMenuChange = (data) => {
  103. if (!isNullES(data)) {
  104. menuBarData.value = data
  105. isAsideMenu.value = true
  106. }
  107. }
  108. //菜单被点击
  109. const menuBarChange = ({ code }) => {
  110. menuBarKey.value = code
  111. router.push({ name: code })
  112. }
  113. //项目合同段的ID
  114. let socket
  115. const timeExamples = ref()
  116. const times = ref(10000)
  117. const cascaderSend = async ({ projectId, contractId }) => {
  118. await useClick()
  119. //合同段id为空,清空定时器
  120. if (isNullES(contractId)) {
  121. if (!isNullES(timeExamples.value)) clearInterval(timeExamples.value)
  122. return
  123. }
  124. //链接webSocket
  125. if (!isNullES(socket)) socket.close()
  126. socket = new HcSocket({ projectId, contractId, userId: userId.value }, (data) => {
  127. console.log('socket:', data)
  128. })
  129. //先获取一次
  130. await getUnreadMessage({ projectId, contractId })
  131. //切换项目合同段时,先清空轮询
  132. if (!isNullES(timeExamples.value)) clearInterval(timeExamples.value)
  133. //定时轮询获取数据
  134. timeExamples.value = setInterval(async () => {
  135. await getUnreadMessage({ projectId, contractId })
  136. }, times.value)
  137. }
  138. //获取未读消息数量
  139. const taskCount = ref(0)
  140. const getUnreadMessage = async ({ projectId, contractId }) => {
  141. //如果退出登录了,清空轮询
  142. if (isNullES(getToken())) {
  143. if (!isNullES(timeExamples.value)) clearInterval(timeExamples.value)
  144. return
  145. }
  146. //获取数据
  147. const { isRes, data } = await messageApi.getUnreadMessage({
  148. projectId, contractId,
  149. })
  150. taskCount.value = data ?? 0
  151. if (isRes) {
  152. times.value = 10000
  153. } else {
  154. times.value = 300000 //5分钟
  155. }
  156. }
  157. //用户信息
  158. const userId = ref('')
  159. const userInfoLoad = ({ user_id }) => {
  160. userId.value = user_id
  161. }
  162. // 项目切换
  163. const cascaderChange = () => {
  164. reloadRouter.value = false
  165. nextTick(() => {
  166. reloadRouter.value = true
  167. })
  168. }
  169. //首页
  170. const logoClick = () => {
  171. router.push({ name: 'home-index' })
  172. }
  173. </script>
  174. <style lang="scss">
  175. @import "./index.scss";
  176. </style>