mirror of
https://github.com/pure-admin/pure-admin-thin.git
synced 2025-04-25 16:07:19 +08:00
140 lines
3.4 KiB
TypeScript
140 lines
3.4 KiB
TypeScript
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 { 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";
|
|
|
|
const errorInfo = "当前路由配置不正确,请检查配置";
|
|
|
|
export function useNav() {
|
|
const route = useRoute();
|
|
const pureApp = useAppStoreHook();
|
|
const routers = useRouter().options.routes;
|
|
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<GlobalPropertiesApi>();
|
|
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 {
|
|
route,
|
|
title,
|
|
device,
|
|
layout,
|
|
logout,
|
|
routers,
|
|
$storage,
|
|
backTopMenu,
|
|
onPanel,
|
|
getDivStyle,
|
|
changeTitle,
|
|
toggleSideBar,
|
|
menuSelect,
|
|
handleResize,
|
|
resolvePath,
|
|
getLogo,
|
|
isCollapse,
|
|
pureApp,
|
|
username,
|
|
userAvatar,
|
|
avatarsStyle,
|
|
tooltipEffect
|
|
};
|
|
}
|