|
|
@@ -5,49 +5,69 @@
|
|
|
v-model:collapsed="layout.collapsed"
|
|
|
:trigger="null"
|
|
|
collapsible
|
|
|
- class="!bg-slate-900"
|
|
|
+ class="!bg-gradient-to-b from-slate-800 to-slate-900"
|
|
|
>
|
|
|
- <div class="h-16 flex items-center justify-center text-white font-bold text-xl">
|
|
|
- <h1 v-if="!layout.collapsed">智裁云</h1>
|
|
|
- <h1 v-else>裁</h1>
|
|
|
+ <!-- Logo 区域 -->
|
|
|
+ <div class="h-16 flex items-center justify-center bg-gradient-to-r from-blue-500/20 to-blue-600/20">
|
|
|
+ <h1 class="text-white font-bold text-xl tracking-wide">
|
|
|
+ <span v-if="!layout.collapsed" class="bg-gradient-to-r from-blue-400 to-blue-600 bg-clip-text text-transparent drop-shadow-lg">
|
|
|
+ 智裁云
|
|
|
+ </span>
|
|
|
+ <span v-else class="bg-gradient-to-r from-blue-400 to-blue-600 bg-clip-text text-transparent">
|
|
|
+ 裁
|
|
|
+ </span>
|
|
|
+ </h1>
|
|
|
</div>
|
|
|
|
|
|
+ <!-- 菜单 -->
|
|
|
<a-menu
|
|
|
v-model:selectedKeys="selectedKeys"
|
|
|
mode="inline"
|
|
|
:theme="layout.theme"
|
|
|
- class="border-r-0"
|
|
|
+ class="border-r-0 !bg-transparent"
|
|
|
>
|
|
|
- <a-menu-item v-for="item in layout.menuItems" :key="item.key">
|
|
|
+ <a-menu-item
|
|
|
+ v-for="item in layout.menuItems"
|
|
|
+ :key="item.key"
|
|
|
+ class="!hover:bg-gradient-to-r !hover:from-slate-700/50 !hover:to-transparent !transition-all !duration-200 !border-l-3"
|
|
|
+ >
|
|
|
<router-link :to="item.path" class="flex items-center">
|
|
|
- <component :is="item.icon" class="mr-2" />
|
|
|
- <span>{{ item.label }}</span>
|
|
|
+ <component :is="item.icon" class="mr-3 text-lg" />
|
|
|
+ <span class="font-medium">{{ item.label }}</span>
|
|
|
</router-link>
|
|
|
</a-menu-item>
|
|
|
</a-menu>
|
|
|
</a-layout-sider>
|
|
|
|
|
|
<!-- 主内容区 -->
|
|
|
- <a-layout class="bg-gray-100">
|
|
|
+ <a-layout class="bg-gray-50">
|
|
|
<!-- 头部 -->
|
|
|
- <a-layout-header class="bg-white px-6 flex justify-between items-center shadow-sm">
|
|
|
- <a-button type="text" @click="layout.toggleCollapsed()" class="text-lg px-6">
|
|
|
- <MenuFoldOutlined v-if="!layout.collapsed" />
|
|
|
- <MenuUnfoldOutlined v-else />
|
|
|
+ <a-layout-header class="bg-white px-6 flex justify-between items-center shadow-md !h-16">
|
|
|
+ <a-button
|
|
|
+ type="text"
|
|
|
+ @click="layout.toggleCollapsed()"
|
|
|
+ class="text-lg px-6 hover:bg-gray-100 transition-colors duration-200"
|
|
|
+ >
|
|
|
+ <MenuFoldOutlined v-if="!layout.collapsed" class="text-gray-600" />
|
|
|
+ <MenuUnfoldOutlined v-else class="text-gray-600" />
|
|
|
</a-button>
|
|
|
|
|
|
<!-- 用户下拉菜单 -->
|
|
|
<a-dropdown>
|
|
|
- <a-avatar class="cursor-pointer">
|
|
|
+ <a-avatar class="cursor-pointer hover:scale-110 transition-transform duration-200 bg-gradient-to-br from-blue-500 to-blue-600 text-white font-bold">
|
|
|
{{ userName?.charAt(0) }}
|
|
|
</a-avatar>
|
|
|
<template #overlay>
|
|
|
- <a-menu>
|
|
|
- <a-menu-item key="password">
|
|
|
- <router-link to="/change-password">修改密码</router-link>
|
|
|
+ <a-menu class="!shadow-lg !rounded-lg">
|
|
|
+ <a-menu-item key="password" class="!hover:bg-gray-50">
|
|
|
+ <router-link to="/change-password" class="flex items-center">
|
|
|
+ <LockOutlined class="mr-2" />
|
|
|
+ 修改密码
|
|
|
+ </router-link>
|
|
|
</a-menu-item>
|
|
|
<a-menu-divider />
|
|
|
- <a-menu-item key="logout" @click="handleLogout">
|
|
|
+ <a-menu-item key="logout" @click="handleLogout" class="!hover:bg-red-50 !text-red-600">
|
|
|
+ <LogoutOutlined class="mr-2" />
|
|
|
退出登录
|
|
|
</a-menu-item>
|
|
|
</a-menu>
|
|
|
@@ -56,7 +76,7 @@
|
|
|
</a-layout-header>
|
|
|
|
|
|
<!-- 内容区 -->
|
|
|
- <a-layout-content class="m-6 bg-white rounded-lg min-h-80 overflow-auto">
|
|
|
+ <a-layout-content class="m-6 bg-white rounded-xl shadow-md min-h-[calc(100vh-128px)] overflow-auto">
|
|
|
<slot />
|
|
|
</a-layout-content>
|
|
|
</a-layout>
|
|
|
@@ -65,7 +85,7 @@
|
|
|
|
|
|
<script setup lang="ts">
|
|
|
import { computed, getCurrentInstance } from 'vue';
|
|
|
-import { MenuFoldOutlined, MenuUnfoldOutlined } from '@ant-design/icons-vue';
|
|
|
+import { MenuFoldOutlined, MenuUnfoldOutlined, LockOutlined, LogoutOutlined } from '@ant-design/icons-vue';
|
|
|
import { useLayoutStore } from '@/stores/layout';
|
|
|
|
|
|
const layout = useLayoutStore();
|
|
|
@@ -92,4 +112,16 @@ const selectedKeys = computed(() => {
|
|
|
function handleLogout() {
|
|
|
emit('logout');
|
|
|
}
|
|
|
-</script>
|
|
|
+</script>
|
|
|
+
|
|
|
+<style scoped>
|
|
|
+/* 菜单项激活状态样式 */
|
|
|
+.ant-menu-item-selected {
|
|
|
+ background: linear-gradient(90deg, rgba(59, 130, 246, 0.3) 0%, transparent 100%) !important;
|
|
|
+ border-left: 3px solid #3b82f6 !important;
|
|
|
+}
|
|
|
+
|
|
|
+.ant-menu-item-selected::after {
|
|
|
+ border-bottom: none !important;
|
|
|
+}
|
|
|
+</style>
|