index.vue 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. <template>
  2. <el-container class="hc-layout-box">
  3. <el-aside :class="[isCollapse?'is-collapse':'']" :width="isCollapse?'90px':'200px'"
  4. class="hc-aside-box">
  5. <div class="hc-aside-user-info">
  6. <img :alt="userInfo['account']" :src="userInfo['avatar'] || avatarPng" class="user-avatar" @click="toUserInfo">
  7. <div class="user-name" @click="toUserInfo">{{ userInfo['real_name'] }}</div>
  8. </div>
  9. <div class="hc-aside-menu-box">
  10. <el-scrollbar>
  11. <MenuBar :collapse="isCollapse" :cur="MenuBarKey" :datas="MenuBarData" @change="MenuBarChange"/>
  12. </el-scrollbar>
  13. </div>
  14. </el-aside>
  15. <el-container class="hc-container-view">
  16. <el-header class="hc-header-view">
  17. <div id="hc-header-page-name" class="hc-header-page-name">
  18. <span class="collapse-menu-icon" @click="collapseChange(false)" v-if="isCollapse">
  19. <HcIcon name="menu-unfold"/>
  20. </span>
  21. <span class="collapse-menu-icon" @click="collapseChange(true)" v-else>
  22. <HcIcon name="menu-fold"/>
  23. </span>
  24. <span class="project-name">项目管控平台</span>
  25. </div>
  26. <div class="hc-header-top-menu-bar">
  27. <TopMenuBar/>
  28. </div>
  29. <div class="hc-header-content">
  30. <UserInfoBar/>
  31. </div>
  32. </el-header>
  33. <el-main id="hc-main-box" class="hc-main-box">
  34. <router-view v-if="reloadRouter" v-slot="{Component}">
  35. <transition name="fade-transform">
  36. <keep-alive :max="10" :exclude="[]">
  37. <component :is="Component"/>
  38. </keep-alive>
  39. </transition>
  40. </router-view>
  41. </el-main>
  42. </el-container>
  43. </el-container>
  44. </template>
  45. <script setup>
  46. import {nextTick, onMounted, ref, watch} from "vue";
  47. import {useRouter, useRoute} from 'vue-router'
  48. import {useAppStore} from "~src/store";
  49. import avatarPng from '~src/assets/images/avatar.png';
  50. import MenuBar from "./modules/MenuBar.vue"
  51. import UserInfoBar from "./modules/UserInfoBar.vue"
  52. import TopMenuBar from "./modules/TopMenuBar.vue"
  53. import {setImageColorStyle} from "js-fast-way";
  54. import {initButtons} from "~sto/app";
  55. //初始组合式
  56. const router = useRouter()
  57. const useRoutes = useRoute()
  58. const useAppState = useAppStore()
  59. //路由参数
  60. const reloadRouter = ref(true)
  61. const BarMenuKey = useRoutes?.name ?? 'home-index';
  62. //主题和色调变量
  63. const AppColor = ref(useAppState.getColor);
  64. //顶部菜单数据和相关处理
  65. const MenuBarKey = ref(BarMenuKey);
  66. const MenuBarData = ref(useAppState.getMenus)
  67. const isCollapse = ref(useAppState.getCollapse)
  68. const userInfo = ref(useAppState.getUserInfo);
  69. //渲染完成
  70. onMounted(() => {
  71. initButtons()
  72. setLogoImageColor()
  73. setRouteParentMenu(useRoutes?.meta?.parentMenu)
  74. })
  75. //监听
  76. watch(() => [
  77. useAppState.getMenus,
  78. useRoutes?.name,
  79. useAppState.getCollapse,
  80. ], ([userMenus, RouteName, collapse]) => {
  81. MenuBarData.value = userMenus
  82. MenuBarKey.value = RouteName ?? 'home-index'
  83. isCollapse.value = collapse
  84. })
  85. //监听
  86. watch(() => [
  87. useAppState.getColor,
  88. ], ([ColorVal]) => {
  89. AppColor.value = ColorVal
  90. setLogoImageColor()
  91. })
  92. //监听
  93. watch(() => [
  94. useRoutes?.meta,
  95. ], ([meta]) => {
  96. setRouteParentMenu(meta?.parentMenu)
  97. }, {deep: true})
  98. //设置路由选中父级菜单
  99. const setRouteParentMenu = (parentMenu) => {
  100. if (parentMenu) {
  101. nextTick(() => {
  102. MenuBarKey.value = parentMenu;
  103. })
  104. }
  105. }
  106. //设置Logo图片颜色
  107. const setLogoImageColor = () => {
  108. setImageColorStyle('logo-icon', AppColor.value?.color)
  109. }
  110. //是否折叠
  111. const collapseChange = (bool) => {
  112. isCollapse.value = bool
  113. useAppState.setCollapse(bool)
  114. }
  115. //菜单被点击
  116. const MenuBarChange = (item) => {
  117. MenuBarKey.value = item?.code;
  118. router.push({name: item?.code});
  119. }
  120. //跳转到个人中心
  121. const toUserInfo = () => {
  122. router.push({name: 'user-index'});
  123. }
  124. </script>
  125. <style lang="scss" scoped>
  126. @import "./layout.scss";
  127. </style>