wip: 临时提交

This commit is contained in:
Ray.Hao
2025-05-23 13:43:59 +08:00
parent b5b766487c
commit 3008b68234
18 changed files with 36 additions and 103 deletions

View File

@@ -0,0 +1,215 @@
<template>
<div :class="['navbar-actions', navbarActionsClass]">
<!-- 桌面端工具项 -->
<template v-if="isDesktop">
<!-- 搜索 -->
<div class="navbar-actions__item">
<MenuSearch />
</div>
<!-- 全屏 -->
<div class="navbar-actions__item">
<Fullscreen />
</div>
<!-- 布局大小 -->
<div class="navbar-actions__item">
<SizeSelect />
</div>
<!-- 语言选择 -->
<div class="navbar-actions__item">
<LangSelect />
</div>
<!-- 通知 -->
<div class="navbar-actions__item">
<Notification />
</div>
</template>
<!-- 用户菜单 -->
<div class="navbar-actions__item">
<el-dropdown trigger="click">
<div class="user-profile">
<img class="user-profile__avatar" :src="userStore.userInfo.avatar" />
<span class="user-profile__name">{{ userStore.userInfo.username }}</span>
</div>
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item @click="handleProfileClick">
{{ t("navbar.profile") }}
</el-dropdown-item>
<el-dropdown-item divided @click="logout">
{{ t("navbar.logout") }}
</el-dropdown-item>
</el-dropdown-menu>
</template>
</el-dropdown>
</div>
<!-- 系统设置 -->
<div
v-if="defaultSettings.showSettings"
class="navbar-actions__item"
@click="settingStore.settingsVisible = true"
>
<div class="i-svg:setting" />
</div>
</div>
</template>
<script setup lang="ts">
import { useI18n } from "vue-i18n";
import { useRoute, useRouter } from "vue-router";
import { ElMessageBox } from "element-plus";
import defaultSettings from "@/settings";
import { DeviceEnum } from "@/enums/settings/device.enum";
import { useAppStore, useSettingsStore, useUserStore } from "@/store";
import { SidebarColor, ThemeMode } from "@/enums/settings/theme.enum";
const { t } = useI18n();
const appStore = useAppStore();
const settingStore = useSettingsStore();
const userStore = useUserStore();
const route = useRoute();
const router = useRouter();
// 是否为桌面设备
const isDesktop = computed(() => appStore.device === DeviceEnum.DESKTOP);
/**
* 打开个人中心页面
*/
function handleProfileClick() {
router.push({ name: "Profile" });
}
// 根据主题和侧边栏配色方案选择样式类
const navbarActionsClass = computed(() => {
const { theme, sidebarColorScheme, layout } = settingStore;
// 暗黑主题下,所有布局都使用白色文字
if (theme === ThemeMode.DARK) {
return "navbar-actions--white-text";
}
// 明亮主题下
if (theme === ThemeMode.LIGHT) {
// 顶部布局和混合布局的顶部区域使用深色背景,需要白色文字
if (layout === "top" || layout === "mix") {
return "navbar-actions--white-text";
}
// 左侧布局下,如果侧边栏是经典蓝色,顶部导航栏仍使用默认颜色
if (layout === "left" && sidebarColorScheme === SidebarColor.CLASSIC_BLUE) {
return ""; // 使用默认的深色文字
}
}
return "";
});
/**
* 退出登录
*/
function logout() {
ElMessageBox.confirm("确定注销并退出系统吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
lockScroll: false,
}).then(() => {
userStore.logout().then(() => {
router.push(`/login?redirect=${route.fullPath}`);
});
});
}
</script>
<style lang="scss" scoped>
.navbar-actions {
display: flex;
align-items: center;
height: 100%;
&__item {
display: flex;
align-items: center;
justify-content: center;
min-width: 40px;
height: $navbar-height;
text-align: center;
cursor: pointer;
transition: all 0.3s;
// 默认图标样式(明亮模式 + 左侧布局)
:deep([class^="i-svg:"]) {
font-size: 18px;
color: var(--el-text-color-regular);
transition: color 0.3s;
}
&:hover {
background: rgba(0, 0, 0, 0.04);
:deep([class^="i-svg:"]) {
color: var(--el-color-primary);
}
}
}
.user-profile {
display: flex;
align-items: center;
justify-content: center;
height: 100%;
padding: 0 13px;
&__avatar {
width: 32px;
height: 32px;
border-radius: 50%;
}
&__name {
margin-left: 10px;
color: var(--el-text-color-regular);
transition: color 0.3s;
}
}
}
// 白色文字样式(用于深色背景:暗黑主题、顶部布局、混合布局)
.navbar-actions--white-text {
.navbar-actions__item {
:deep([class^="i-svg:"]) {
color: rgba(255, 255, 255, 0.85);
}
&:hover {
background: rgba(255, 255, 255, 0.1);
:deep([class^="i-svg:"]) {
color: #fff;
}
}
}
.user-profile__name {
color: rgba(255, 255, 255, 0.85);
}
}
// 确保下拉菜单中的图标不受影响
:deep(.el-dropdown-menu) {
[class^="i-svg:"] {
color: var(--el-text-color-regular) !important;
&:hover {
color: var(--el-color-primary) !important;
}
}
}
</style>

View File

@@ -0,0 +1,48 @@
<template>
<div class="navbar">
<div class="flex-y-center">
<!-- 菜单折叠按钮 -->
<Hamburger :is-active="isSidebarOpened" @toggle-click="toggleSideBar" />
<!-- 面包屑导航 -->
<Breadcrumb />
</div>
<!-- 导航栏操作区域 -->
<div class="navbar__actions">
<NavbarActions />
</div>
</div>
</template>
<script setup lang="ts">
import { useAppStore } from "@/store";
import Hamburger from "@/components/Hamburger/index.vue";
import Breadcrumb from "@/components/Breadcrumb/index.vue";
import NavbarActions from "./components/NavbarActions.vue";
const appStore = useAppStore();
// 侧边栏展开状态
const isSidebarOpened = computed(() => appStore.sidebar.opened);
// 切换侧边栏展开/折叠状态
function toggleSideBar() {
console.log("🔄 Hamburger clicked! Current state:", isSidebarOpened.value);
console.log("🔄 Device type:", appStore.device);
appStore.toggleSidebar();
console.log("🔄 New state:", appStore.sidebar.opened);
}
</script>
<style lang="scss" scoped>
.navbar {
display: flex;
justify-content: space-between;
height: $navbar-height;
background: var(--el-bg-color);
&__actions {
display: flex;
align-items: center;
}
}
</style>