feat(GiPageLayout): 新增折叠侧边栏功能,并使用 GiPageLayout 优化用户、角色、字典管理

This commit is contained in:
2025-04-04 22:15:09 +08:00
parent d97cf15938
commit 32c6c16362
5 changed files with 185 additions and 178 deletions

View File

@@ -1,11 +1,18 @@
<template>
<a-row align="stretch" :gutter="rowGutter" class="gi-page-layout" :class="getClass">
<a-col v-if="slots.left" v-bind="props.leftColProps" :xs="0" :sm="8" :md="7" :lg="6" :xl="5" :xxl="4" flex="260px">
<a-col v-if="slots.left" v-show="!isCollapsed || (!isDesktop && !isCollapsed)" v-bind="props.leftColProps" :xs="isCollapsed ? 1 : 23" :sm="8" :md="7" :lg="6" :xl="5" :xxl="4">
<div class="gi-page-layout__left" :style="props.leftStyle">
<slot name="left"></slot>
</div>
</a-col>
<a-col :xs="24" :sm="16" :md="17" :lg="18" :xl="19" :xxl="20" flex="1" v-bind="props.rightColProps">
<div
class="gi-page-layout__divider" :class="{
none: isCollapsed || !isDesktop,
}"
>
<GiSplitButton :collapsed="isCollapsed" @click="toggleCollapsed"></GiSplitButton>
</div>
<a-col v-show="isDesktop || (!isDesktop && isCollapsed)" :sm="16" :md="17" :lg="18" :xl="19" :xxl="20" flex="1" v-bind="props.rightColProps">
<div v-if="slots.header" class="gi-page-layout__header" :style="props.headerStyle">
<slot name="header"></slot>
</div>
@@ -19,6 +26,7 @@
<script setup lang='ts'>
import type { ColProps } from '@arco-design/web-vue'
import type { CSSProperties } from 'vue'
import { useDevice } from '@/hooks'
defineOptions({ name: 'GiPageLayout' })
@@ -40,6 +48,8 @@ defineSlots<{
default: () => void
}>()
const { isDesktop } = useDevice()
const getClass = computed(() => {
return {
'gi-page-layout--margin': props.margin,
@@ -68,6 +78,10 @@ interface Props {
}
const slots = useSlots()
const isCollapsed = ref(false)
const toggleCollapsed = () => {
isCollapsed.value = !isCollapsed.value
}
</script>
<style lang='scss' scoped>
@@ -78,6 +92,7 @@ const slots = useSlots()
overflow: hidden;
box-sizing: border-box;
background-color: var(--color-bg-1);
position: relative;
&--margin {
margin: $margin;
@@ -112,7 +127,6 @@ const slots = useSlots()
.gi-page-layout__left {
height: 100%;
border-right: 1px solid var(--color-border);
display: flex;
flex-direction: column;
overflow: hidden;
@@ -131,4 +145,14 @@ const slots = useSlots()
overflow: hidden;
box-sizing: border-box;
}
.gi-page-layout__divider {
position: relative;
width: 1px;
background-color: var(--color-border);
}
.gi-page-layout__divider.none {
width: 0;
}
</style>

View File

@@ -1,31 +1,22 @@
<template>
<div class="gi_table_page">
<a-tabs v-model:active-key="activeKey" size="large" position="left" @change="change">
<a-tabs v-model:active-key="activeKey" type="card-gutter" size="large" @change="change">
<a-tab-pane key="site">
<template #title><icon-apps /> 网站配置</template>
<keep-alive>
<component :is="PanMap[activeKey]" />
</keep-alive>
</a-tab-pane>
<a-tab-pane key="security">
<template #title><icon-safe /> 安全配置</template>
<keep-alive>
<component :is="PanMap[activeKey]" />
</keep-alive>
</a-tab-pane>
<a-tab-pane key="mail">
<template #title><icon-email /> 邮件配置</template>
<keep-alive>
<component :is="PanMap[activeKey]" />
</keep-alive>
</a-tab-pane>
<a-tab-pane key="login">
<template #title><icon-lock /> 登录配置</template>
</a-tab-pane>
</a-tabs>
<keep-alive>
<component :is="PanMap[activeKey]" />
</keep-alive>
</a-tab-pane>
</a-tabs>
</div>
</template>
@@ -91,6 +82,10 @@ const change = (key: string | number) => {
right: -20px;
}
:deep(.arco-tabs) {
overflow: visible;
}
:deep(.arco-tabs-nav) {
overflow: visible;
}

View File

@@ -1,10 +1,8 @@
<template>
<div class="gi_page">
<SplitPanel>
<GiPageLayout>
<template #left>
<DictTree @node-click="handleSelectDict" />
</template>
<template #main>
<a-row align="stretch" :gutter="14" class="h-full page_content">
<a-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" :xxl="24" flex="1" class="h-full overflow-hidden">
<GiTable
@@ -61,11 +59,9 @@
</GiTable>
</a-col>
</a-row>
</template>
</SplitPanel>
<DictItemAddModal ref="DictItemAddModalRef" @save-success="search" />
</div>
</GiPageLayout>
</template>
<script setup lang="ts">

View File

@@ -1,21 +1,17 @@
<template>
<div class="gi_page">
<SplitPanel>
<GiPageLayout :header-style="{ padding: 0, borderBottom: 'none' }">
<template #left>
<RoleTree @node-click="handleSelectRole" />
</template>
<template #main>
<a-tabs v-model:activeKey="activeTab" class="gi_tabs" size="large">
<a-tab-pane key="1" title="功能权限">
<component :is="Permission" v-if="activeTab === '1'" :role-id="roleId" />
</a-tab-pane>
<a-tab-pane key="2" title="角色用户">
<component :is="RoleUser" v-if="activeTab === '2'" :role-id="roleId" />
</a-tab-pane>
<template #header>
<a-tabs v-model:activeKey="activeTab" class="gi_tabs" hide-content size="large">
<a-tab-pane key="1" title="功能权限"></a-tab-pane>
<a-tab-pane key="2" title="角色用户"></a-tab-pane>
</a-tabs>
</template>
</SplitPanel>
</div>
<component :is="Permission" v-if="activeTab === '1'" :role-id="roleId" />
<component :is="RoleUser" v-if="activeTab === '2'" :role-id="roleId" />
</GiPageLayout>
</template>
<script setup lang="ts">

View File

@@ -1,10 +1,8 @@
<template>
<div class="gi_page">
<SplitPanel size="20%">
<GiPageLayout>
<template #left>
<DeptTree @node-click="handleSelectDept" />
</template>
<template #main>
<GiTable
row-key="id"
:data="dataList"
@@ -78,15 +76,13 @@
</a-space>
</template>
</GiTable>
</template>
</SplitPanel>
<UserAddDrawer ref="UserAddDrawerRef" @save-success="search" />
<UserImportDrawer ref="UserImportDrawerRef" @save-success="search" />
<UserDetailDrawer ref="UserDetailDrawerRef" />
<UserResetPwdModal ref="UserResetPwdModalRef" />
<UserUpdateRoleModal ref="UserUpdateRoleModalRef" @save-success="search" />
</div>
</GiPageLayout>
</template>
<script setup lang="ts">