Sidebar.vue 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. <!-- eslint-disable vue/no-deprecated-slot-attribute -->
  2. <template>
  3. <div id="Sidebar">
  4. <el-row class="sidebar">
  5. <el-col :span="24" class="main">
  6. <el-col :span="24" class="first">
  7. <el-menu
  8. class="sidebar-el-menu"
  9. :default-active="onRoutes"
  10. unique-opened
  11. router
  12. :background-color="styleInfo.backColor"
  13. :text-color="styleInfo.textColor"
  14. :active-text-color="styleInfo.activeColor"
  15. >
  16. <template v-for="item in items">
  17. <template v-if="item.type === '0'">
  18. <el-sub-menu :index="item._id" :key="item._id">
  19. <template #title>
  20. <i :class="['iconfont', item.icon]"></i>
  21. <span>{{ item.name }}</span>
  22. </template>
  23. <template v-for="subItem in item.children">
  24. <!-- TODO:这里有问题需要改成自引用输出方式.实现无线嵌套.目前只是最多三级 -->
  25. <template v-if="subItem.type === '0'">
  26. <el-sub-menu v-if="subItem.children && subItem.children.length > 0" :index="subItem._id" :key="subItem._id">
  27. <template #title>
  28. <i :class="['iconfont', subItem.icon]"></i>
  29. <span>{{ subItem.name }}</span>
  30. </template>
  31. <el-menu-item v-for="(threeItem, i) in subItem.children" :key="i" :index="threeItem.path">
  32. <i :class="['iconfont', threeItem.icon]"></i>
  33. <span>{{ threeItem.name }}</span>
  34. </el-menu-item>
  35. </el-sub-menu>
  36. </template>
  37. <el-menu-item v-else-if="subItem.type === '1'" :index="subItem.path" :key="subItem.path">
  38. <i :class="['iconfont', subItem.icon]"></i>
  39. <span>{{ subItem.name }}</span>
  40. </el-menu-item>
  41. </template>
  42. </el-sub-menu>
  43. </template>
  44. <template v-else>
  45. <el-menu-item :index="item.path" :key="item.path">
  46. <i :class="['iconfont', item.icon]"></i>
  47. <span>{{ item.name }}</span>
  48. </el-menu-item>
  49. </template>
  50. </template>
  51. </el-menu>
  52. </el-col>
  53. </el-col>
  54. </el-row>
  55. </div>
  56. </template>
  57. <script setup>
  58. import { menuInfo } from '@/layout/site'
  59. import { UserStore } from '@/store/user'
  60. const route = useRoute()
  61. const userStore = UserStore()
  62. const user = computed(() => userStore.user)
  63. let onRoutes = route.path
  64. const styleInfo = ref(menuInfo.info)
  65. let items = ref(menuInfo.menuList)
  66. const getMenu = async () => {
  67. const menus = user.value.menus
  68. const newMenus = [...menus]
  69. items.value = newMenus
  70. }
  71. watch(
  72. user,
  73. (newVal) => {
  74. if (newVal && newVal._id) {
  75. if (newVal && newVal._id) getMenu()
  76. else ElMessage({ message: `暂无用户信息,无法获取菜单信息`, type: 'error' })
  77. }
  78. },
  79. {
  80. deep: true
  81. }
  82. )
  83. </script>
  84. <style scoped lang="scss">
  85. .sidebar::-webkit-scrollbar {
  86. width: 0;
  87. }
  88. .sidebar > ul {
  89. height: 100%;
  90. }
  91. .main {
  92. .first {
  93. padding: 0 2px 0 0;
  94. .el-menu {
  95. border-right: none;
  96. }
  97. .iconfont {
  98. font-size: 18px;
  99. margin: 0 5px 0 0;
  100. }
  101. }
  102. }
  103. </style>