index.vue 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. <template>
  2. <a-layout class="web-wrapper">
  3. <app-header></app-header>
  4. <a-layout>
  5. <a-layout-sider v-if="roles.length"
  6. class="web-side"
  7. theme="light"
  8. :width="240">
  9. <a-menu class="web-menu"
  10. mode="inline"
  11. theme="dark"
  12. v-model:openKeys="openKeys"
  13. :selected-keys="menuActive">
  14. <template v-for="route in filterRoutes">
  15. <template v-if="route.children && route.children.length">
  16. <a-sub-menu class="nav-item"
  17. :key="route.path"
  18. :title="route.meta.title">
  19. <router-link v-for="child in route.children"
  20. :key="formatRoutes(child.path, route.path)"
  21. :to="formatRoutes(child.path, route.path)"
  22. custom
  23. v-slot={navigate}>
  24. <a-menu-item>
  25. <p @click.stop="navigate">{{child.meta.title}}</p>
  26. </a-menu-item>
  27. </router-link>
  28. </a-sub-menu>
  29. </template>
  30. <template v-else>
  31. <router-link :key="route.path"
  32. :to="route.path"
  33. custom
  34. v-slot="{navigate}">
  35. <a-menu-item>
  36. <p @click.stop="navigate">{{route.meta.title}}</p>
  37. </a-menu-item>
  38. </router-link>
  39. </template>
  40. </template>
  41. </a-menu>
  42. </a-layout-sider>
  43. <a-layout-content class="web-container">
  44. <router-view v-slot="{ Component }">
  45. <transition name="fade-transform"
  46. mode="out-in">
  47. <component :is="Component" />
  48. </transition>
  49. </router-view>
  50. </a-layout-content>
  51. </a-layout>
  52. </a-layout>
  53. </template>
  54. <script lang="ts">
  55. import { computed, defineComponent, reactive, ref, toRefs } from "vue";
  56. import appHeader from "./components/AppHeader.vue";
  57. import useApp from "@/hooks/useApp";
  58. import { pathResolve } from "@/helper/index";
  59. import { formatNavRoutes } from "@/helper/permission";
  60. import { RouteConfig } from "@/types/route";
  61. const LayoutComponent = defineComponent({
  62. components: {
  63. appHeader,
  64. },
  65. setup() {
  66. const { store, route, router } = useApp();
  67. // 待优化
  68. let openKeys = ref(["/" + route.path.substr(1).split("/")[0]]);
  69. const data = reactive({
  70. navRoutes: computed(() => store.getters.permissionRoutes),
  71. roles: computed(() => store.getters.userRoles),
  72. menuActive: computed(() => {
  73. const {
  74. meta: { activeMenu },
  75. path,
  76. name,
  77. } = route;
  78. if (activeMenu) return [activeMenu];
  79. return [path];
  80. }),
  81. });
  82. const filterRoutes = computed(() =>
  83. formatNavRoutes(data.navRoutes as RouteConfig[])
  84. );
  85. const formatRoutes = (path: string, base: string = "/") =>
  86. pathResolve(path, base);
  87. const formatIconPath = (icon: string) => {
  88. const icon_url = require("@/assets/" + icon);
  89. return icon_url;
  90. };
  91. return {
  92. ...toRefs(data),
  93. openKeys,
  94. filterRoutes,
  95. formatRoutes,
  96. };
  97. },
  98. });
  99. export default LayoutComponent;
  100. </script>