index.vue 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. <template>
  2. <el-scrollbar class="vab-side-bar" :class="{ 'is-collapse': collapse }">
  3. <vab-logo v-if="layout === 'comprehensive' || layout === 'vertical'" />
  4. <el-menu
  5. background-color="var(--el-menu-background-color)"
  6. :collapse="collapse"
  7. :collapse-transition="false"
  8. :default-active="activeMenu.data"
  9. :default-openeds="defaultOpeneds"
  10. menu-trigger="click"
  11. mode="vertical"
  12. text-color="var(--el-menu-color-text)"
  13. :unique-opened="uniqueOpened"
  14. >
  15. <vab-menu v-for="(item, index) in handleRoutes" :key="index + item.name" :item="item" />
  16. </el-menu>
  17. </el-scrollbar>
  18. </template>
  19. <script lang="ts" setup>
  20. import { defaultOpeneds, uniqueOpened } from '/@/config'
  21. import { useRoutesStore } from '/@/store/modules/routes'
  22. import { useSettingsStore } from '/@/store/modules/settings'
  23. defineOptions({
  24. name: 'VabSideBar',
  25. })
  26. const props = defineProps({
  27. layout: {
  28. type: String,
  29. default: 'vertical',
  30. },
  31. })
  32. const settingsStore = useSettingsStore()
  33. const { collapse } = storeToRefs(settingsStore)
  34. const routesStore = useRoutesStore()
  35. const { getRoutes: routes, getActiveMenu: activeMenu, getPartialRoutes: partialRoutes } = storeToRefs(routesStore)
  36. const handleRoutes = computed(() => {
  37. return props.layout === 'comprehensive'
  38. ? partialRoutes.value
  39. : routes.value.flatMap((route: any) => (route.meta.levelHidden && route.children ? [...route.children] : route))
  40. })
  41. </script>
  42. <style lang="scss" scoped>
  43. @mixin active {
  44. &:hover {
  45. color: var(--el-color-white);
  46. background-color: var(--el-color-primary);
  47. }
  48. &.is-active {
  49. color: var(--el-color-white);
  50. background-color: var(--el-color-primary);
  51. }
  52. }
  53. .vab-side-bar {
  54. position: fixed;
  55. top: 0;
  56. bottom: 0;
  57. left: 0;
  58. z-index: calc(var(--el-z-index) + 1);
  59. width: var(--el-left-menu-width);
  60. height: 100vh;
  61. overflow: hidden;
  62. background: var(--el-menu-background-color);
  63. transition: var(--el-transition);
  64. &.side-bar-common {
  65. top: var(--el-header-height);
  66. height: calc(100vh - var(--el-header-height));
  67. }
  68. &.is-collapse {
  69. width: var(--el-left-menu-width-min);
  70. border-right: 0;
  71. :deep() {
  72. .el-menu {
  73. border-right: 0 !important;
  74. }
  75. .el-menu--collapse.el-menu {
  76. > .el-menu-item,
  77. > .el-sub-menu {
  78. justify-content: center;
  79. height: calc(var(--el-menu-item-height) - 6px);
  80. padding: 0;
  81. line-height: calc(var(--el-menu-item-height) - 6px);
  82. text-align: center;
  83. [class*='ri'] {
  84. display: block;
  85. padding: 0 !important;
  86. margin: 0 !important;
  87. }
  88. .el-tag {
  89. display: none;
  90. }
  91. }
  92. }
  93. .el-menu-item,
  94. .el-sub-menu {
  95. text-align: left;
  96. }
  97. .el-menu--collapse {
  98. border-right: 0;
  99. .el-sub-menu__icon-arrow {
  100. right: 10px;
  101. margin-top: -3px;
  102. }
  103. }
  104. }
  105. }
  106. :deep() {
  107. .el-scrollbar__wrap {
  108. overflow-x: hidden;
  109. }
  110. .el-menu-item,
  111. .el-sub-menu__title {
  112. height: var(--el-menu-item-height);
  113. margin: 0 10px 5px 10px;
  114. overflow: hidden;
  115. line-height: var(--el-menu-item-height);
  116. text-overflow: ellipsis;
  117. white-space: nowrap;
  118. border-radius: var(--el-border-radius-base);
  119. }
  120. .el-menu-item {
  121. @include active;
  122. }
  123. }
  124. }
  125. </style>
  126. <style lang="scss">
  127. .el-menu {
  128. border-right: 0;
  129. }
  130. </style>