2025-07-23 17:02:24 +08:00
|
|
|
<script setup>
|
2025-08-16 17:55:49 +08:00
|
|
|
import { Layout } from 'ant-design-vue';
|
|
|
|
|
|
2025-06-16 14:42:26 +08:00
|
|
|
import { useAppStore } from '@/stores';
|
|
|
|
|
import { useResponsive } from '@/hooks';
|
2025-06-20 18:16:40 +08:00
|
|
|
import JoinModal from '@/components/join-modal.vue';
|
|
|
|
|
import { getQueryParam } from '@/utils/helper';
|
2025-07-23 17:02:24 +08:00
|
|
|
import { useUserStore } from '@/stores';
|
|
|
|
|
|
2025-06-22 22:52:03 -04:00
|
|
|
import { ref, onMounted, computed } from 'vue';
|
|
|
|
|
import { useRoute } from 'vue-router';
|
2025-06-16 14:42:26 +08:00
|
|
|
|
2025-06-20 18:16:40 +08:00
|
|
|
const joinEnterpriseVisible = ref(false);
|
2025-07-23 17:02:24 +08:00
|
|
|
const joinModalRef = ref(null);
|
2025-06-16 14:42:26 +08:00
|
|
|
const appStore = useAppStore();
|
2025-07-23 17:02:24 +08:00
|
|
|
const userStore = useUserStore();
|
2025-06-16 14:42:26 +08:00
|
|
|
const router = useRouter();
|
2025-06-22 22:52:03 -04:00
|
|
|
const route = useRoute();
|
2025-06-16 14:42:26 +08:00
|
|
|
|
2025-08-16 18:00:06 +08:00
|
|
|
const Header = Layout.Header;
|
2025-08-16 17:55:49 +08:00
|
|
|
const Sider = Layout.Sider;
|
|
|
|
|
const Content = Layout.Content;
|
|
|
|
|
|
2025-06-16 14:42:26 +08:00
|
|
|
useResponsive(true);
|
2025-08-15 14:32:40 +08:00
|
|
|
const navbarHeight = `52px`;
|
2025-08-16 17:55:49 +08:00
|
|
|
// const renderMenu = computed(() => appStore.menu && !appStore.topMenu);
|
|
|
|
|
// const hideMenu = computed(() => appStore.hideMenu);
|
|
|
|
|
const showSider = computed(() => {
|
|
|
|
|
// 框架模版自带判断逻辑
|
|
|
|
|
return appStore.menu && !appStore.topMenu && !appStore.hideMenu && !route.meta?.hideSidebar;
|
|
|
|
|
});
|
2025-06-16 14:42:26 +08:00
|
|
|
|
|
|
|
|
const menuWidth = computed(() => {
|
|
|
|
|
return appStore.menuCollapse ? 48 : appStore.menuWidth;
|
|
|
|
|
});
|
|
|
|
|
const collapsed = computed(() => {
|
|
|
|
|
return appStore.menuCollapse;
|
|
|
|
|
});
|
2025-08-16 17:55:49 +08:00
|
|
|
// const showSidebar = computed(() => {
|
|
|
|
|
// return !(route.meta && route.meta.hideSidebar);
|
|
|
|
|
// });
|
2025-06-30 18:37:27 +08:00
|
|
|
|
2025-06-20 18:16:40 +08:00
|
|
|
onMounted(() => {
|
|
|
|
|
checkHasInviteCode();
|
|
|
|
|
});
|
2025-07-23 17:02:24 +08:00
|
|
|
const setCollapsed = (val) => {
|
2025-06-16 14:42:26 +08:00
|
|
|
appStore.updateSettings({ menuCollapse: val });
|
|
|
|
|
};
|
|
|
|
|
|
2025-06-20 18:16:40 +08:00
|
|
|
const checkHasInviteCode = () => {
|
|
|
|
|
const inviteCode = getQueryParam('invite_code');
|
2025-07-23 17:02:24 +08:00
|
|
|
if (userStore.isLogin && inviteCode) {
|
2025-06-20 18:16:40 +08:00
|
|
|
joinEnterpriseVisible.value = true;
|
2025-07-23 17:02:24 +08:00
|
|
|
joinModalRef.value?.getEnterprise?.();
|
2025-06-20 18:16:40 +08:00
|
|
|
}
|
|
|
|
|
};
|
2025-06-16 14:42:26 +08:00
|
|
|
</script>
|
|
|
|
|
|
|
|
|
|
<template>
|
2025-08-16 17:55:49 +08:00
|
|
|
<Layout :class="['layout-wrap', { mobile: appStore.hideMenu }]" class="h-full flex flex-col w-full">
|
2025-07-23 17:02:24 +08:00
|
|
|
<JoinModal v-model:visible="joinEnterpriseVisible" ref="joinModalRef" />
|
2025-08-16 18:00:06 +08:00
|
|
|
<Header class="layout-header-wrap">
|
2025-06-16 14:42:26 +08:00
|
|
|
<base-navbar />
|
2025-08-16 18:00:06 +08:00
|
|
|
</Header>
|
2025-08-16 17:55:49 +08:00
|
|
|
<Layout class="flex layout-content-wrap">
|
|
|
|
|
<Sider
|
|
|
|
|
v-if="showSider"
|
2025-08-16 17:01:06 +08:00
|
|
|
class="layout-sider"
|
2025-08-16 17:55:49 +08:00
|
|
|
v-model="collapsed"
|
2025-08-16 17:01:06 +08:00
|
|
|
:width="menuWidth"
|
|
|
|
|
collapsible
|
2025-08-16 17:55:49 +08:00
|
|
|
trigger
|
2025-08-16 17:01:06 +08:00
|
|
|
@collapse="setCollapsed"
|
|
|
|
|
>
|
|
|
|
|
<section class="menu-wrapper">
|
2025-06-16 14:42:26 +08:00
|
|
|
<base-menu />
|
2025-08-16 17:01:06 +08:00
|
|
|
</section>
|
2025-08-16 17:55:49 +08:00
|
|
|
</Sider>
|
|
|
|
|
<Layout class="flex-1 layout-content">
|
|
|
|
|
<div class="px-24px py-16px">
|
2025-08-16 17:01:06 +08:00
|
|
|
<layout-page />
|
2025-08-16 17:55:49 +08:00
|
|
|
</div>
|
|
|
|
|
</Layout>
|
|
|
|
|
</Layout>
|
|
|
|
|
</Layout>
|
2025-06-16 14:42:26 +08:00
|
|
|
</template>
|
|
|
|
|
|
2025-07-11 16:50:48 +08:00
|
|
|
<style scoped lang="scss">
|
2025-08-16 17:01:06 +08:00
|
|
|
.layout-wrap {
|
2025-08-16 17:55:49 +08:00
|
|
|
font-family: inherit;
|
|
|
|
|
background: transparent;
|
2025-08-16 17:01:06 +08:00
|
|
|
min-width: 1200px;
|
2025-08-16 18:00:06 +08:00
|
|
|
.layout-header-wrap {
|
|
|
|
|
background: transparent;
|
2025-08-15 14:32:40 +08:00
|
|
|
height: $navbar-height;
|
2025-08-16 18:00:06 +08:00
|
|
|
line-height: $navbar-height;
|
|
|
|
|
padding-inline: inherit;
|
|
|
|
|
color: inherit;
|
2025-06-16 14:42:26 +08:00
|
|
|
}
|
2025-08-16 17:01:06 +08:00
|
|
|
.layout-content-wrap {
|
2025-08-15 14:32:40 +08:00
|
|
|
height: 100%;
|
2025-08-16 17:55:49 +08:00
|
|
|
background: transparent;
|
2025-08-16 17:01:06 +08:00
|
|
|
min-height: calc(100vh - $navbar-height);
|
2025-08-16 17:55:49 +08:00
|
|
|
:deep(.ant-layout-sider) {
|
2025-08-16 17:01:06 +08:00
|
|
|
background: none;
|
|
|
|
|
box-shadow: none;
|
2025-08-16 17:55:49 +08:00
|
|
|
padding-bottom: 0;
|
|
|
|
|
.ant-layout-sider-trigger {
|
|
|
|
|
display: none;
|
|
|
|
|
}
|
|
|
|
|
.ant-layout-sider-children {
|
|
|
|
|
overflow: hidden;
|
|
|
|
|
}
|
|
|
|
|
.arco-menu-inner {
|
|
|
|
|
overflow: hidden;
|
|
|
|
|
padding: 16px !important;
|
2025-08-15 14:32:40 +08:00
|
|
|
}
|
2025-08-16 17:01:06 +08:00
|
|
|
.menu-wrapper {
|
|
|
|
|
height: 100%;
|
|
|
|
|
overflow: auto;
|
|
|
|
|
overflow-x: hidden;
|
|
|
|
|
:deep(.arco-menu) {
|
|
|
|
|
::-webkit-scrollbar {
|
|
|
|
|
width: 12px;
|
|
|
|
|
height: 4px;
|
|
|
|
|
}
|
|
|
|
|
::-webkit-scrollbar-thumb {
|
|
|
|
|
border: 4px solid transparent;
|
|
|
|
|
background-clip: padding-box;
|
|
|
|
|
border-radius: 7px;
|
|
|
|
|
background-color: var(--color-text-4);
|
|
|
|
|
}
|
|
|
|
|
::-webkit-scrollbar-thumb:hover {
|
|
|
|
|
background-color: var(--color-text-3);
|
|
|
|
|
}
|
|
|
|
|
}
|
2025-08-15 14:32:40 +08:00
|
|
|
}
|
2025-06-16 14:42:26 +08:00
|
|
|
}
|
2025-08-16 17:01:06 +08:00
|
|
|
.layout-content {
|
|
|
|
|
height: 100%;
|
|
|
|
|
overflow-y: scroll;
|
|
|
|
|
overflow-x: auto;
|
2025-08-16 17:55:49 +08:00
|
|
|
background: transparent;
|
2025-08-16 17:01:06 +08:00
|
|
|
transition: padding 0.2s cubic-bezier(0.34, 0.69, 0.1, 1);
|
|
|
|
|
}
|
2025-08-15 14:32:40 +08:00
|
|
|
}
|
2025-06-16 14:42:26 +08:00
|
|
|
}
|
|
|
|
|
</style>
|