| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120 |
- <script setup lang="ts">
- import { emitter } from "@/utils/mitt";
- import { useNav } from "@/layout/hooks/useNav";
- import LaySearch from "../lay-search/index.vue";
- import { responsiveStorageNameSpace } from "@/config";
- import { ref, nextTick, computed, onMounted } from "vue";
- import { storageLocal, isAllEmpty } from "@pureadmin/utils";
- import { usePermissionStoreHook } from "@/store/modules/permission";
- import LaySidebarItem from "../lay-sidebar/components/SidebarItem.vue";
- import LaySidebarFullScreen from "../lay-sidebar/components/SidebarFullScreen.vue";
- import LogoutCircleRLine from "~icons/ri/logout-circle-r-line";
- import Setting from "~icons/ri/settings-3-line";
- const menuRef = ref();
- const showLogo = ref(
- storageLocal().getItem<StorageConfigs>(
- `${responsiveStorageNameSpace()}configure`
- )?.showLogo ?? true
- );
- const {
- route,
- title,
- logout,
- onPanel,
- getLogo,
- username,
- userAvatar,
- backTopMenu,
- avatarsStyle
- } = useNav();
- const defaultActive = computed(() =>
- !isAllEmpty(route.meta?.activePath) ? route.meta.activePath : route.path
- );
- nextTick(() => {
- menuRef.value?.handleResize();
- });
- onMounted(() => {
- emitter.on("logoChange", key => {
- showLogo.value = key;
- });
- });
- </script>
- <template>
- <div
- v-loading="usePermissionStoreHook().wholeMenus.length === 0"
- class="horizontal-header"
- >
- <div v-if="showLogo" class="horizontal-header-left" @click="backTopMenu">
- <img :src="getLogo()" alt="logo" />
- <span>{{ title }}</span>
- </div>
- <el-menu
- ref="menuRef"
- mode="horizontal"
- popper-class="pure-scrollbar"
- class="horizontal-header-menu"
- :default-active="defaultActive"
- >
- <LaySidebarItem
- v-for="route in usePermissionStoreHook().wholeMenus"
- :key="route.path"
- :item="route"
- :base-path="route.path"
- />
- </el-menu>
- <div class="horizontal-header-right">
- <!-- 菜单搜索 -->
- <LaySearch id="header-search" />
- <!-- 全屏 -->
- <LaySidebarFullScreen id="full-screen" />
- <!-- 退出登录 -->
- <el-dropdown trigger="click">
- <span class="el-dropdown-link navbar-bg-hover">
- <img :src="userAvatar" :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"
- />
- 退出系统
- </el-dropdown-item>
- </el-dropdown-menu>
- </template>
- </el-dropdown>
- <span
- class="set-icon navbar-bg-hover"
- title="打开系统配置"
- @click="onPanel"
- >
- <IconifyIconOffline :icon="Setting" />
- </span>
- </div>
- </div>
- </template>
- <style lang="scss" scoped>
- :deep(.el-loading-mask) {
- opacity: 0.45;
- }
- .logout {
- width: 120px;
- ::v-deep(.el-dropdown-menu__item) {
- display: inline-flex;
- flex-wrap: wrap;
- min-width: 100%;
- }
- }
- </style>
|