index.vue 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. <template>
  2. <!-- 通栏布局 -->
  3. <header class="aminui-header">
  4. <div class="aminui-header-left">
  5. <div class="logo-bar">
  6. <div v-if="!ismobile" class="nav-menu-icon">
  7. <el-popover ref="navMenuPopover" popper-class="nav-menu-popover" :width="664" trigger="click" teleported :disabled="!menus.length">
  8. <template #reference>
  9. <sc-iconify icon="ant-design:appstore-outlined" size="24"></sc-iconify>
  10. </template>
  11. <el-row class="nav">
  12. <el-col :class="currentMenu?.path == item.path && 'active'" v-for="item in menus" :key="item" :span="8" @click="showMenu(item)">
  13. <sc-iconify :icon="item.meta.icon" size="24"></sc-iconify>
  14. <div>{{ item.meta?.title }}</div>
  15. </el-col>
  16. </el-row>
  17. </el-popover>
  18. </div>
  19. <img class="logo" src="img/logo.png">
  20. <span>{{ $CONFIG.APP_NAME }}</span>
  21. </div>
  22. </div>
  23. <div class="aminui-header-right">
  24. <userbar></userbar>
  25. </div>
  26. </header>
  27. <section class="aminui-wrapper">
  28. <div v-if="!ismobile && currentMenu?.children?.length" :class="['aminui-side', menuIsCollapse && 'isCollapse']">
  29. <div v-if="!menuIsCollapse" class="aminui-side-top">
  30. <h2><scTooltip :content="currentMenu.meta.title"></scTooltip></h2>
  31. </div>
  32. <div class="aminui-side-scroll">
  33. <el-scrollbar>
  34. <el-menu popper-class="side-menu-popper" :default-active="$route.fullPath" router :collapse="menuIsCollapse" :unique-opened="$CONFIG.MENU_UNIQUE_OPENED">
  35. <NavMenu :navMenus="menus.find(menu => menu.path == currentMenu.path).children"></NavMenu>
  36. </el-menu>
  37. </el-scrollbar>
  38. </div>
  39. <div class="aminui-side-bottom" @click="$store.commit('TOGGLE_menuIsCollapse')">
  40. <el-icon><el-icon-expand v-if="menuIsCollapse" /><el-icon-fold v-else /></el-icon>
  41. </div>
  42. </div>
  43. <Side-m v-if="ismobile"></Side-m>
  44. <div class="aminui-body el-container">
  45. <Tags v-if="!ismobile && layoutTags"></Tags>
  46. <div class="aminui-main" id="aminui-main">
  47. <router-view v-slot="{ Component }">
  48. <keep-alive :include="this.$store.state.keepAlive.keepLiveRoute">
  49. <component :is="Component" :key="$route.fullPath" v-if="$store.state.keepAlive.routeShow"/>
  50. </keep-alive>
  51. </router-view>
  52. </div>
  53. </div>
  54. </section>
  55. </template>
  56. <script>
  57. import XEUtils from "xe-utils";
  58. import SideM from "./components/sideM";
  59. import Tags from "./components/tags";
  60. import NavMenu from "./components/NavMenu";
  61. import userbar from "./components/userbar";
  62. export default {
  63. name: "index",
  64. components: {
  65. SideM,
  66. Tags,
  67. NavMenu,
  68. userbar
  69. },
  70. data() {
  71. return {
  72. }
  73. },
  74. computed:{
  75. ismobile() {
  76. return this.$store.state.global.ismobile
  77. },
  78. layoutTags() {
  79. return this.$store.state.global.layoutTags
  80. },
  81. menuIsCollapse() {
  82. return this.$store.state.global.menuIsCollapse
  83. },
  84. menus() {
  85. return (this.$TOOL.data.get("MENU") || []).filter(item => item.path !== this.$CONFIG.DASHBOARD_URL && !item.meta?.hidden);
  86. },
  87. currentMenu() {
  88. return XEUtils.searchTree(this.menus, item => item.path === this.$route.path)[0] || {};
  89. }
  90. },
  91. created() {
  92. this.onLayoutResize();
  93. window.addEventListener("resize", this.onLayoutResize);
  94. },
  95. methods: {
  96. onLayoutResize() {
  97. this.$store.commit("SET_ismobile", document.body.clientWidth < 992);
  98. },
  99. // 点击显示
  100. showMenu(route) {
  101. this.$router.push({ path: route.path });
  102. this.$refs.navMenuPopover?.hide();
  103. }
  104. }
  105. }
  106. </script>
  107. <style lang="scss" scoped>
  108. .aminui-header .aminui-header-left {
  109. .no-m-r {margin-right: 0;}
  110. .m-l-20 {margin-left: 20px;}
  111. }
  112. </style>