123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190 |
- <script setup lang="ts">
- import Search from "./search/index.vue";
- import Notice from "./notice/index.vue";
- import mixNav from "./sidebar/mixNav.vue";
- import { useNav } from "@/layout/hooks/useNav";
- import Breadcrumb from "./sidebar/breadCrumb.vue";
- import topCollapse from "./sidebar/topCollapse.vue";
- import { useTranslationLang } from "../hooks/useTranslationLang";
- 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 {
- layout,
- device,
- logout,
- onPanel,
- pureApp,
- username,
- avatarsStyle,
- toggleSideBar,
- getDropdownItemStyle,
- getDropdownItemClass
- } = useNav();
- const { t, locale, translationCh, translationEn } = useTranslationLang();
- </script>
- <template>
- <div
- class="navbar bg-[#fff] shadow-sm shadow-[rgba(0, 21, 41, 0.08)] dark:shadow-[#0d0d0d]"
- >
- <topCollapse
- v-if="device === 'mobile'"
- class="hamburger-container"
- :is-active="pureApp.sidebar.opened"
- @toggleClick="toggleSideBar"
- />
- <Breadcrumb
- v-if="layout !== 'mix' && device !== 'mobile'"
- class="breadcrumb-container"
- />
- <mixNav v-if="layout === 'mix'" />
- <div v-if="layout === 'vertical'" class="vertical-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"
- >
- <IconifyIconOffline
- class="check-zh"
- v-show="locale === 'zh'"
- :icon="Check"
- />
- 简体中文
- </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 select-none">
- <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>
- .navbar {
- width: 100%;
- height: 48px;
- overflow: hidden;
- .hamburger-container {
- float: left;
- height: 100%;
- line-height: 48px;
- cursor: pointer;
- }
- .vertical-header-right {
- display: flex;
- align-items: center;
- justify-content: flex-end;
- min-width: 280px;
- height: 48px;
- color: #000000d9;
- .el-dropdown-link {
- display: flex;
- align-items: center;
- justify-content: space-around;
- height: 48px;
- padding: 10px;
- color: #000000d9;
- cursor: pointer;
- p {
- font-size: 14px;
- }
- img {
- width: 22px;
- height: 22px;
- border-radius: 50%;
- }
- }
- }
- .breadcrumb-container {
- float: left;
- margin-left: 16px;
- }
- }
- .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) {
- display: inline-flex;
- flex-wrap: wrap;
- min-width: 100%;
- }
- }
- </style>
|