index.vue 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. <template>
  2. <el-container v-loading="isLoading" 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. <img v-show="!isCollapse" id="logo-name" :src="appLogoName" alt="">
  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 @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="msgCount" @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="msgCount" />
  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 { computed, nextTick, onMounted, onUnmounted, ref, watch } from 'vue'
  48. import { useAppStore } from '~src/store'
  49. import { useRoute, useRouter } from 'vue-router'
  50. import { initButtons } from '~sto/app'
  51. import { isNullES, useClick } from 'js-fast-way'
  52. import { HcSocket } from '~src/plugins/HcSocket'
  53. import website from '~src/config'
  54. //初始组合式
  55. const router = useRouter()
  56. const useRoutes = useRoute()
  57. const store = useAppStore()
  58. const reloadRouter = ref(!website.localModel)
  59. const isLoading = computed(() => {
  60. if (website.localModel) {
  61. return !reloadRouter.value
  62. } else {
  63. return false
  64. }
  65. })
  66. //子组件
  67. import HcTopMenuBar from './modules/HcTopMenu.vue'
  68. import HcCascader from './modules/Cascader.vue'
  69. import UserInfoBar from './modules/UserInfoBar.vue'
  70. import HelpInfoBar from './modules/HelpInfoBar.vue'
  71. import ConfigBar from './modules/ConfigBar.vue'
  72. import RouterMenu from './modules/RouterMenu.vue'
  73. import MenuBar from '~src/layout/modules/MenuBar.vue'
  74. // logo
  75. const appLogoName = ref(store.getLogoName)
  76. //菜单数据
  77. const menuBarKey = ref('')
  78. const menuBarData = ref([])
  79. const isLayout = ref('')
  80. //渲染完成
  81. onMounted(() => {
  82. const layout = useRoutes?.query?.layout, layout2 = store.isLayout
  83. isLayout.value = layout ?? layout2
  84. initButtons()
  85. })
  86. //监听layout
  87. watch(() => [
  88. useRoutes?.query?.layout,
  89. store.isLayout,
  90. ], ([layout, layout2]) => {
  91. isLayout.value = layout ?? layout2
  92. }, { deep: true })
  93. //路由信息
  94. const routerMenuLoad = ({ key }) => {
  95. menuBarKey.value = key
  96. }
  97. // 是否折叠
  98. const isCollapse = ref(false)
  99. const collapseChange = () => {
  100. const bool = !isCollapse.value
  101. isCollapse.value = bool
  102. store.setCollapse(bool)
  103. }
  104. //顶部菜单导航
  105. const isAsideMenu = ref(true)
  106. const topMenuLoad = () => {
  107. isAsideMenu.value = false
  108. }
  109. //顶部菜单导航被点击
  110. const topMenuChange = (data) => {
  111. if (!isNullES(data)) {
  112. menuBarData.value = data
  113. isAsideMenu.value = true
  114. }
  115. }
  116. //菜单被点击
  117. const menuBarChange = ({ code }) => {
  118. menuBarKey.value = code
  119. router.push({ name: code })
  120. }
  121. //消息数量
  122. const msgCount = ref({
  123. allCount: 0,
  124. taskCount: 0,
  125. messageCount: 0,
  126. messageCount_1: 0,
  127. messageCount_2: 0,
  128. messageCount_3: 0,
  129. messageCount_4: 0,
  130. messageCount_5: 0,
  131. })
  132. //用户信息
  133. const userId = ref('')
  134. const userInfoLoad = ({ user_id }) => {
  135. userId.value = user_id
  136. }
  137. //项目合同段的ID
  138. let socket
  139. const cascaderSend = async ({ projectId, contractId }) => {
  140. await useClick()
  141. if (isNullES(contractId)) {
  142. //本地模式
  143. if (website.localModel) {
  144. window.$message?.error('项目信息不存在,请联系管理员')
  145. reloadRouter.value = false
  146. }
  147. return
  148. }
  149. //链接webSocket
  150. if (!isNullES(socket)) socket.close()
  151. if (!website.localModel) {
  152. socket = new HcSocket({ projectId, contractId, userId: userId.value }, ({ data }) => {
  153. console.log(data)
  154. })
  155. }
  156. //本地模式
  157. if (website.localModel) {
  158. setTimeout(() => {
  159. reloadRouter.value = true
  160. }, 500)
  161. }
  162. }
  163. // 项目切换
  164. const cascaderChange = () => {
  165. reloadRouter.value = false
  166. nextTick(() => {
  167. reloadRouter.value = true
  168. })
  169. }
  170. //首页
  171. const logoClick = () => {
  172. router.push({ name: 'home-index' })
  173. }
  174. //页面卸载
  175. onUnmounted(() => {
  176. if (!isNullES(socket)) socket.close()
  177. })
  178. </script>
  179. <style lang="scss">
  180. @import "./index.scss";
  181. </style>