index.vue 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. <template>
  2. <el-container class="hc-layout-box" :class="[!isNullES(isLayout) && isLayout === 'no' ? 'is-no-layout' : '']">
  3. <div v-if="appTheme === 'dark'" class="hc-app-bg-box">
  4. <img :src="appViewBg" alt="">
  5. </div>
  6. <el-header class="hc-layout-header">
  7. <div class="hc-layout-header-logo" :style="`width: ${isCollapse ? '0px' : '200px'};`" @click="logoClick">
  8. <!-- <img id="logo-icon" :src="appLogoIcon" alt=""> -->
  9. <img v-show="!isCollapse" id="logo-name" :src="appLogoName" alt="">
  10. </div>
  11. <div class="header-top-collapse-bar" @click="collapseChange">
  12. <HcIcon v-if="isCollapse" name="menu-unfold" />
  13. <HcIcon v-else name="menu-fold" />
  14. </div>
  15. <div class="header-top-menu-bar">
  16. <HcTopMenuBar @load="topMenuLoad" @change="topMenuChange" />
  17. </div>
  18. <div class="header-content-bar">
  19. <HcCascader v-if="userRoleId !== website.role_id" @send="cascaderSend" @change="cascaderChange" />
  20. <div v-else class="hc-header-project-name-box" @click="userProjectClick">
  21. <HcIcon name="arrow-right" class="project-icon" />
  22. <div class="truncate">{{ projectInfoData?.projectName ?? '请先选择项目' }}</div>
  23. </div>
  24. <HelpInfoBar />
  25. <ConfigBar />
  26. <UserInfoBar @load="userInfoLoad" />
  27. </div>
  28. </el-header>
  29. <el-container class="hc-layout-container">
  30. <el-aside v-if="isAsideMenu" class="hc-layout-aside" :class="[isCollapse ? 'is-collapse' : '']" :width="isCollapse ? '90px' : '200px'">
  31. <MenuBar :collapse="isCollapse" :cur="menuBarKey" :datas="menuBarData" :msg-count="msgCount" @change="menuBarChange" />
  32. </el-aside>
  33. <el-main class="hc-layout-main">
  34. <div class="hc-router-menu-bar">
  35. <RouterMenu @load="routerMenuLoad" />
  36. </div>
  37. <div id="hc-main-box" class="hc-main-page">
  38. <div class="hc-main-body">
  39. <router-view v-if="reloadRouter" v-slot="{ Component }">
  40. <transition name="fade-transform">
  41. <keep-alive :max="10" exclude="HcDataV">
  42. <component :is="Component" :msg-count="msgCount" :msg-change="msgChange" />
  43. </keep-alive>
  44. </transition>
  45. </router-view>
  46. </div>
  47. </div>
  48. </el-main>
  49. </el-container>
  50. </el-container>
  51. </template>
  52. <script setup>
  53. import { nextTick, onMounted, ref, watch } from 'vue'
  54. import { useAppStore } from '~src/store'
  55. import { useRoute, useRouter } from 'vue-router'
  56. import { initButtons } from '~sto/app'
  57. import HcSocket from '~src/plugins/HcSocket'
  58. import { getObjValue, isNullES } from 'js-fast-way'
  59. import website from '~src/config'
  60. //初始组合式
  61. const router = useRouter()
  62. const useRoutes = useRoute()
  63. const store = useAppStore()
  64. const reloadRouter = ref(true)
  65. const userRoleId = ref(store.getRoleId)
  66. const projectInfoData = ref(store.getProjectInfo)
  67. //子组件
  68. import HcTopMenuBar from './modules/HcTopMenu.vue'
  69. import HcCascader from './modules/Cascader.vue'
  70. import UserInfoBar from './modules/UserInfoBar.vue'
  71. import HelpInfoBar from './modules/HelpInfoBar.vue'
  72. import ConfigBar from './modules/ConfigBar.vue'
  73. import RouterMenu from './modules/RouterMenu.vue'
  74. import MenuBar from '~src/layout/modules/MenuBar.vue'
  75. import appViewBg from '~src/assets/view/bg.png'
  76. // logo
  77. const appLogoName = ref(store.getLogoName)
  78. const appTheme = ref(store.getTheme)
  79. //菜单数据
  80. const menuBarKey = ref('')
  81. const menuBarData = ref([])
  82. const isLayout = ref('')
  83. //渲染完成
  84. onMounted(() => {
  85. const layout = useRoutes?.query?.layout, layout2 = store.isLayout
  86. isLayout.value = layout ?? layout2
  87. initButtons()
  88. })
  89. //监听layout
  90. watch(() => [
  91. useRoutes?.query?.layout,
  92. store.isLayout,
  93. ], ([layout, layout2]) => {
  94. isLayout.value = layout ?? layout2
  95. }, { deep: true })
  96. //监听
  97. watch(() => store.getTheme, (theme) => {
  98. appTheme.value = theme
  99. })
  100. //路由信息
  101. const routerMenuLoad = ({ key }) => {
  102. menuBarKey.value = key
  103. }
  104. // 是否折叠
  105. const isCollapse = ref(false)
  106. const collapseChange = () => {
  107. const bool = !isCollapse.value
  108. isCollapse.value = bool
  109. store.setCollapse(bool)
  110. }
  111. //顶部菜单导航
  112. const isAsideMenu = ref(true)
  113. const topMenuLoad = () => {
  114. isAsideMenu.value = false
  115. }
  116. //顶部菜单导航被点击
  117. const topMenuChange = (data) => {
  118. if (!isNullES(data)) {
  119. menuBarData.value = data
  120. isAsideMenu.value = true
  121. }
  122. }
  123. //菜单被点击
  124. const menuBarChange = ({ code }) => {
  125. menuBarKey.value = code
  126. router.push({ name: code })
  127. }
  128. //消息数量
  129. const msgCount = ref({
  130. allCount: 0,
  131. taskCount: 0,
  132. messageCount: 0,
  133. messageCount_1: 0,
  134. messageCount_2: 0,
  135. messageCount_3: 0,
  136. messageCount_4: 0,
  137. messageCount_5: 0,
  138. })
  139. const msgChange = ref(0)
  140. //用户信息
  141. const userInfoLoad = ({ user_id }) => {
  142. HcSocket.create(user_id, (data) => {
  143. msgCount.value = getObjValue(data)
  144. msgChange.value++
  145. })
  146. }
  147. //项目合同段的ID
  148. const cascaderSend = ({ projectId, contractId }) => {
  149. HcSocket.send(projectId + ',' + contractId)
  150. }
  151. // 项目切换
  152. const cascaderChange = () => {
  153. reloadRouter.value = false
  154. nextTick(() => {
  155. reloadRouter.value = true
  156. })
  157. }
  158. //首页
  159. const logoClick = () => {
  160. router.push({ name: 'datav' })
  161. }
  162. const userProjectClick = () => {
  163. router.push({ path: '/user/project' })
  164. }
  165. </script>
  166. <style lang="scss">
  167. @import "./index.scss";
  168. </style>