import { storeToRefs } from "pinia"; import { getConfig } from "@/config"; import { emitter } from "@/utils/mitt"; import userAvatar from "@/assets/user.jpg"; import { getTopMenu } from "@/router/utils"; import { useFullscreen } from "@vueuse/core"; import { useGlobal } from "@pureadmin/utils"; import type { routeMetaType } from "../types"; import { useRouter, useRoute } from "vue-router"; import { router, remainingPaths } from "@/router"; import { computed, type CSSProperties } from "vue"; import { useAppStoreHook } from "@/store/modules/app"; import { useUserStoreHook } from "@/store/modules/user"; import { usePermissionStoreHook } from "@/store/modules/permission"; import ExitFullscreen from "@iconify-icons/ri/fullscreen-exit-fill"; import Fullscreen from "@iconify-icons/ri/fullscreen-fill"; const errorInfo = "当前路由配置不正确,请检查配置"; export function useNav() { const route = useRoute(); const pureApp = useAppStoreHook(); const routers = useRouter().options.routes; const { isFullscreen, toggle } = useFullscreen(); const { wholeMenus } = storeToRefs(usePermissionStoreHook()); /** 平台`layout`中所有`el-tooltip`的`effect`配置,默认`light` */ const tooltipEffect = getConfig()?.TooltipEffect ?? "light"; const getDivStyle = computed((): CSSProperties => { return { width: "100%", display: "flex", alignItems: "center", justifyContent: "space-between", overflow: "hidden" }; }); /** 用户名 */ const username = computed(() => { return useUserStoreHook()?.username; }); const avatarsStyle = computed(() => { return username.value ? { marginRight: "10px" } : ""; }); const isCollapse = computed(() => { return !pureApp.getSidebarStatus; }); const device = computed(() => { return pureApp.getDevice; }); const { $storage, $config } = useGlobal(); const layout = computed(() => { return $storage?.layout?.layout; }); const title = computed(() => { return $config.Title; }); /** 动态title */ function changeTitle(meta: routeMetaType) { const Title = getConfig().Title; if (Title) document.title = `${meta.title} | ${Title}`; else document.title = meta.title; } /** 退出登录 */ function logout() { useUserStoreHook().logOut(); } function backTopMenu() { router.push(getTopMenu()?.path); } function onPanel() { emitter.emit("openPanel"); } function toggleSideBar() { pureApp.toggleSideBar(); } function handleResize(menuRef) { menuRef?.handleResize(); } function resolvePath(route) { if (!route.children) return console.error(errorInfo); const httpReg = /^http(s?):\/\//; const routeChildPath = route.children[0]?.path; if (httpReg.test(routeChildPath)) { return route.path + "/" + routeChildPath; } else { return routeChildPath; } } function menuSelect(indexPath: string) { if (wholeMenus.value.length === 0 || isRemaining(indexPath)) return; emitter.emit("changLayoutRoute", indexPath); } /** 判断路径是否参与菜单 */ function isRemaining(path: string) { return remainingPaths.includes(path); } /** 获取`logo` */ function getLogo() { // return new URL("/logo.svg", import.meta.url).href; return new URL("/logo.png", import.meta.url).href; } return { route, title, device, layout, logout, routers, $storage, isFullscreen, Fullscreen, ExitFullscreen, toggle, backTopMenu, onPanel, getDivStyle, changeTitle, toggleSideBar, menuSelect, handleResize, resolvePath, getLogo, isCollapse, pureApp, username, userAvatar, avatarsStyle, tooltipEffect }; }