|
|
<script setup lang="ts"> import Search from "../search/index.vue"; import Notice from "../notice/index.vue"; import { ref, watch, nextTick } from "vue"; import SidebarItem from "./sidebarItem.vue"; import { useNav } from "@/layout/hooks/useNav"; import { useTranslationLang } from "../../hooks/useTranslationLang"; import { usePermissionStoreHook } from "@/store/modules/permission"; import globalization from "@/assets/svg/globalization.svg?component"; import LogoutCircleRLine from "@iconify-icons/ri/logout-circle-r-line"; import Setting from "@iconify-icons/ri/settings-3-line"; import Check from "@iconify-icons/ep/check";
const menuRef = ref();
const { t, route, locale, translationCh, translationEn } = useTranslationLang(menuRef); const { title, routers, logout, backHome, onPanel, menuSelect, username, avatarsStyle, getDropdownItemStyle, getDropdownItemClass } = useNav();
nextTick(() => { menuRef.value?.handleResize(); });
watch( () => route.path, () => { menuSelect(route.path, routers); } ); </script>
<template> <div class="horizontal-header"> <div class="horizontal-header-left" @click="backHome"> <FontIcon icon="team-iconlogo" svg style="width: 35px; height: 35px" /> <h4>{{ title }}</h4> </div> <el-menu router ref="menuRef" mode="horizontal" class="horizontal-header-menu" :default-active="route.path" @select="indexPath => menuSelect(indexPath, routers)" > <sidebar-item v-for="route in usePermissionStoreHook().wholeMenus" :key="route.path" :item="route" :base-path="route.path" /> </el-menu> <div class="horizontal-header-right"> <!-- 菜单搜索 --> <Search /> <!-- 通知 --> <Notice id="header-notice" /> <!-- 国际化 --> <el-dropdown id="header-translation" trigger="click"> <globalization class="navbar-bg-hover w-[40px] h-[48px] p-[11px] cursor-pointer outline-none" /> <template #dropdown> <el-dropdown-menu class="translation"> <el-dropdown-item :style="getDropdownItemStyle(locale, 'zh')" :class="['dark:!text-white', getDropdownItemClass(locale, 'zh')]" @click="translationCh" > <span class="check-zh" v-show="locale === 'zh'"> <IconifyIconOffline :icon="Check" /> </span> 简体中文 </el-dropdown-item> <el-dropdown-item :style="getDropdownItemStyle(locale, 'en')" :class="['dark:!text-white', getDropdownItemClass(locale, 'en')]" @click="translationEn" > <span class="check-en" v-show="locale === 'en'"> <IconifyIconOffline :icon="Check" /> </span> English </el-dropdown-item> </el-dropdown-menu> </template> </el-dropdown> <!-- 退出登录 --> <el-dropdown trigger="click"> <span class="el-dropdown-link navbar-bg-hover"> <img src="https://avatars.githubusercontent.com/u/44761321?v=4" :style="avatarsStyle" /> <p v-if="username" class="dark:text-white">{{ username }}</p> </span> <template #dropdown> <el-dropdown-menu class="logout"> <el-dropdown-item @click="logout"> <IconifyIconOffline :icon="LogoutCircleRLine" style="margin: 5px" /> {{ t("buttons.hsLoginOut") }} </el-dropdown-item> </el-dropdown-menu> </template> </el-dropdown> <span class="set-icon navbar-bg-hover" :title="t('buttons.hssystemSet')" @click="onPanel" > <IconifyIconOffline :icon="Setting" /> </span> </div> </div> </template>
<style lang="scss" scoped> .translation { ::v-deep(.el-dropdown-menu__item) { padding: 5px 40px; }
.check-zh { position: absolute; left: 20px; }
.check-en { position: absolute; left: 20px; } }
.logout { max-width: 120px;
::v-deep(.el-dropdown-menu__item) { min-width: 100%; display: inline-flex; flex-wrap: wrap; } } </style>
|