|
|
@@ -1,168 +1,172 @@
|
|
|
-<template>
|
|
|
- <a-button
|
|
|
- v-if="isMobile"
|
|
|
- class="open-icon"
|
|
|
- type="primary"
|
|
|
- @click="openDrawer"
|
|
|
- >
|
|
|
- <right-outlined />
|
|
|
- </a-button>
|
|
|
- <a-drawer
|
|
|
- placement="left"
|
|
|
- :closable="false"
|
|
|
- :open="drawerVisible"
|
|
|
- :get-container="false"
|
|
|
- :style="{ position: 'absolute' }"
|
|
|
- width="240px"
|
|
|
- @close="drawerVisible = false"
|
|
|
- >
|
|
|
- <a-layout-sider
|
|
|
- :trigger="null"
|
|
|
- v-model:collapsed="collapsed"
|
|
|
- collapsible
|
|
|
- :style="{backgroundColor: bgColor, overflow: 'hidden'}"
|
|
|
- >
|
|
|
- <a-menu
|
|
|
- v-model:selectedKeys="selectedKeys"
|
|
|
- :openKeys="openKeys"
|
|
|
- mode="inline"
|
|
|
- :style="{ borderRight: 0 }"
|
|
|
- >
|
|
|
- <sidebar-item
|
|
|
- :item="route"
|
|
|
- v-for="route in sidebarRoute"
|
|
|
- :key="route.path"
|
|
|
- :base-path="route.path"
|
|
|
- />
|
|
|
- </a-menu>
|
|
|
- </a-layout-sider>
|
|
|
- </a-drawer>
|
|
|
- <a-layout-sider
|
|
|
- v-if="!isMobile"
|
|
|
- :style="{backgroundColor: bgColor, overflow: 'hidden', overflowY: 'scroll', boxShadow: `0 1px 4px rgba(0,21,41,.12)`, paddingTop: '6px'}"
|
|
|
- breakpoint="lg"
|
|
|
- collapsible
|
|
|
- v-model:collapsed="collapsed"
|
|
|
- >
|
|
|
- <div class="logo" >
|
|
|
- <img :src="logoPng" alt="" v-if="logoPng">
|
|
|
- </div>
|
|
|
- <a-menu
|
|
|
- v-model:selectedKeys="selectedKeys"
|
|
|
- :openKeys="openKeys"
|
|
|
- mode="inline"
|
|
|
- :style="{ borderRight: 0 }"
|
|
|
- >
|
|
|
- <sidebar-item
|
|
|
- :item="route"
|
|
|
- v-for="route in sidebarRoute"
|
|
|
- :key="route.path"
|
|
|
- :base-path="route.path"
|
|
|
- />
|
|
|
- </a-menu>
|
|
|
- </a-layout-sider>
|
|
|
-
|
|
|
-</template>
|
|
|
-
|
|
|
-<script lang="ts" setup >
|
|
|
-
|
|
|
-import { ref, computed, watch } from 'vue'
|
|
|
-import SidebarItem from './SidebarItem.vue'
|
|
|
-import { useRouter, useRoute } from 'vue-router'
|
|
|
-import { useDesignStore } from '@/store'
|
|
|
-import { useDeviceType } from '@/hooks'
|
|
|
-import { RightOutlined } from '@ant-design/icons-vue'
|
|
|
-import { routes } from '@/router/index'
|
|
|
-import AppConfig from 'AppConfig'
|
|
|
-import { useIsMicro } from '@/hooks/effect'
|
|
|
-
|
|
|
-const designStore = useDesignStore()
|
|
|
-
|
|
|
-const isMobile = useDeviceType()
|
|
|
-
|
|
|
-const bgColor = computed(() => designStore.theme ? '#141414' : '#fff')
|
|
|
-
|
|
|
-const route = useRoute()
|
|
|
-
|
|
|
-const router = useRouter()
|
|
|
-
|
|
|
-const collapsed = ref<boolean>(true)
|
|
|
-
|
|
|
-const logoPng = computed(() => collapsed.value ? AppConfig.logoContract : AppConfig.logoExpand)
|
|
|
-
|
|
|
-const sidebarRoute = ref<any>()
|
|
|
-
|
|
|
-const selectedKeys = ref<string[]>()
|
|
|
-
|
|
|
-const openKeys = ref<string[]>()
|
|
|
-
|
|
|
-const drawerVisible = ref<boolean>(false)
|
|
|
-
|
|
|
-const compatibleRoutes = !useIsMicro() ? router.getRoutes().filter(item => item.path !== '/cloudlink') : router.getRoutes()
|
|
|
-
|
|
|
-watch(
|
|
|
- () => route.path,
|
|
|
- () => {
|
|
|
- sidebarRoute.value = isMobile ? routes : router.getRoutes().find(item => item.path === route.matched[useIsMicro() ? 1 : 0].path)?.children
|
|
|
- selectedKeys.value = [route.path]
|
|
|
- openKeys.value = [route.matched[1].path]
|
|
|
- },
|
|
|
- {
|
|
|
- immediate: true
|
|
|
- }
|
|
|
-)
|
|
|
-
|
|
|
-const openDrawer = () => drawerVisible.value = true
|
|
|
-
|
|
|
-</script>
|
|
|
-
|
|
|
-<style lang="less" scoped >
|
|
|
-/deep/ .ant-layout-sider-children {
|
|
|
- margin-top: -4px;
|
|
|
-}
|
|
|
-
|
|
|
-.ant-layout-sider::-webkit-scrollbar {
|
|
|
- width: 0;
|
|
|
-}
|
|
|
-
|
|
|
-.logo {
|
|
|
- width: 100%;
|
|
|
- height: 53px;
|
|
|
- margin: 0px 0px;
|
|
|
- margin-top: 0px;
|
|
|
- display: flex;
|
|
|
- justify-content: center;
|
|
|
- align-items: center;
|
|
|
- background-color: transparent;
|
|
|
- img {
|
|
|
- width: 60%;
|
|
|
- height: 70%;
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-.mobile-sider {
|
|
|
- width: 100vw;
|
|
|
- height: 100vh;
|
|
|
- background-color: rgba(0, 0, 0, 0.5);
|
|
|
- pointer-events: none;
|
|
|
-}
|
|
|
-
|
|
|
-.open-icon {
|
|
|
- width: 50px;
|
|
|
- height: 50px;
|
|
|
- position: fixed;
|
|
|
- top: 200px;
|
|
|
- left: 0px;
|
|
|
- z-index: 999;
|
|
|
- display: flex;
|
|
|
- justify-content: center;
|
|
|
- align-items: center;
|
|
|
- border-top-left-radius: 0px;
|
|
|
- border-bottom-left-radius: 0px;
|
|
|
-}
|
|
|
-
|
|
|
-/deep/ .ant-layout-sider-trigger {
|
|
|
- background-color: #fff !important;
|
|
|
-}
|
|
|
-
|
|
|
-</style>
|
|
|
+<template>
|
|
|
+ <a-button
|
|
|
+ v-if="isMobile"
|
|
|
+ class="open-icon"
|
|
|
+ type="primary"
|
|
|
+ @click="openDrawer"
|
|
|
+ >
|
|
|
+ <right-outlined />
|
|
|
+ </a-button>
|
|
|
+ <a-drawer
|
|
|
+ placement="left"
|
|
|
+ :closable="false"
|
|
|
+ :open="drawerVisible"
|
|
|
+ :get-container="false"
|
|
|
+ :style="{ position: 'absolute' }"
|
|
|
+ width="240px"
|
|
|
+ @close="drawerVisible = false"
|
|
|
+ >
|
|
|
+ <a-layout-sider
|
|
|
+ :trigger="null"
|
|
|
+ v-model:collapsed="collapsed"
|
|
|
+ collapsible
|
|
|
+ :style="{backgroundColor: bgColor, overflow: 'hidden'}"
|
|
|
+ >
|
|
|
+ <a-menu
|
|
|
+ v-model:selectedKeys="selectedKeys"
|
|
|
+ :openKeys="openKeys"
|
|
|
+ mode="inline"
|
|
|
+ :style="{ borderRight: 0 }"
|
|
|
+ >
|
|
|
+ <sidebar-item
|
|
|
+ :item="route"
|
|
|
+ v-for="route in sidebarRoute"
|
|
|
+ :key="route.path"
|
|
|
+ :base-path="route.path"
|
|
|
+ />
|
|
|
+ </a-menu>
|
|
|
+ </a-layout-sider>
|
|
|
+ </a-drawer>
|
|
|
+ <a-layout-sider
|
|
|
+ v-if="!isMobile"
|
|
|
+ :style="{backgroundColor: bgColor, overflow: 'hidden', overflowY: 'scroll', boxShadow: `0 1px 4px rgba(0,21,41,.12)`, paddingTop: '6px'}"
|
|
|
+ breakpoint="lg"
|
|
|
+ collapsible
|
|
|
+ v-model:collapsed="collapsed"
|
|
|
+ >
|
|
|
+ <div class="logo" >
|
|
|
+ <img :src="logoPng" alt="" v-if="logoPng">
|
|
|
+ </div>
|
|
|
+ <a-menu
|
|
|
+ v-model:selectedKeys="selectedKeys"
|
|
|
+ :openKeys="openKeys"
|
|
|
+ mode="inline"
|
|
|
+ :style="{ borderRight: 0 }"
|
|
|
+ >
|
|
|
+ <sidebar-item
|
|
|
+ :item="route"
|
|
|
+ v-for="route in sidebarRoute"
|
|
|
+ :key="route.path"
|
|
|
+ :base-path="route.path"
|
|
|
+ />
|
|
|
+ </a-menu>
|
|
|
+ </a-layout-sider>
|
|
|
+
|
|
|
+</template>
|
|
|
+
|
|
|
+<script lang="ts" setup >
|
|
|
+
|
|
|
+import { ref, computed, watch, onMounted } from 'vue'
|
|
|
+import SidebarItem from './SidebarItem.vue'
|
|
|
+import { useRouter, useRoute } from 'vue-router'
|
|
|
+import { useDesignStore } from '@/store'
|
|
|
+import { useDeviceType } from '@/hooks'
|
|
|
+import { RightOutlined } from '@ant-design/icons-vue'
|
|
|
+import { routes } from '@/router/index'
|
|
|
+import AppConfig from 'AppConfig'
|
|
|
+import { useIsMicro } from '@/hooks/effect'
|
|
|
+
|
|
|
+const designStore = useDesignStore()
|
|
|
+
|
|
|
+const isMobile = useDeviceType()
|
|
|
+
|
|
|
+const bgColor = computed(() => designStore.theme ? '#141414' : '#fff')
|
|
|
+
|
|
|
+const route = useRoute()
|
|
|
+
|
|
|
+const router = useRouter()
|
|
|
+
|
|
|
+const collapsed = ref<boolean>(true)
|
|
|
+
|
|
|
+const logoPng = computed(() => collapsed.value ? AppConfig.logoContract : AppConfig.logoExpand)
|
|
|
+
|
|
|
+const sidebarRoute = ref<any>()
|
|
|
+
|
|
|
+const selectedKeys = ref<string[]>()
|
|
|
+
|
|
|
+const openKeys = ref<string[]>()
|
|
|
+
|
|
|
+const drawerVisible = ref<boolean>(false)
|
|
|
+
|
|
|
+const compatibleRoutes = !useIsMicro() ? router.getRoutes().filter(item => item.path !== '/cloudlink') : router.getRoutes()
|
|
|
+
|
|
|
+watch(
|
|
|
+ () => route.path,
|
|
|
+ () => {
|
|
|
+ sidebarRoute.value = isMobile ? routes : router.getRoutes().find(item => item.path === route.matched[useIsMicro() ? 1 : 0].path)?.children
|
|
|
+ selectedKeys.value = [route.path]
|
|
|
+ openKeys.value = [route.matched[1].path]
|
|
|
+ },
|
|
|
+ {
|
|
|
+ immediate: true
|
|
|
+ }
|
|
|
+)
|
|
|
+
|
|
|
+const openDrawer = () => drawerVisible.value = true
|
|
|
+
|
|
|
+onMounted(() => {
|
|
|
+ console.log('我渲染了嗎')
|
|
|
+})
|
|
|
+
|
|
|
+</script>
|
|
|
+
|
|
|
+<style lang="less" scoped >
|
|
|
+/deep/ .ant-layout-sider-children {
|
|
|
+ margin-top: -4px;
|
|
|
+}
|
|
|
+
|
|
|
+.ant-layout-sider::-webkit-scrollbar {
|
|
|
+ width: 0;
|
|
|
+}
|
|
|
+
|
|
|
+.logo {
|
|
|
+ width: 100%;
|
|
|
+ height: 53px;
|
|
|
+ margin: 0px 0px;
|
|
|
+ margin-top: 0px;
|
|
|
+ display: flex;
|
|
|
+ justify-content: center;
|
|
|
+ align-items: center;
|
|
|
+ background-color: transparent;
|
|
|
+ img {
|
|
|
+ width: 60%;
|
|
|
+ height: 70%;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+.mobile-sider {
|
|
|
+ width: 100vw;
|
|
|
+ height: 100vh;
|
|
|
+ background-color: rgba(0, 0, 0, 0.5);
|
|
|
+ pointer-events: none;
|
|
|
+}
|
|
|
+
|
|
|
+.open-icon {
|
|
|
+ width: 50px;
|
|
|
+ height: 50px;
|
|
|
+ position: fixed;
|
|
|
+ top: 200px;
|
|
|
+ left: 0px;
|
|
|
+ z-index: 999;
|
|
|
+ display: flex;
|
|
|
+ justify-content: center;
|
|
|
+ align-items: center;
|
|
|
+ border-top-left-radius: 0px;
|
|
|
+ border-bottom-left-radius: 0px;
|
|
|
+}
|
|
|
+
|
|
|
+/deep/ .ant-layout-sider-trigger {
|
|
|
+ background-color: #fff !important;
|
|
|
+}
|
|
|
+
|
|
|
+</style>
|