useNav.ts 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. import { storeToRefs } from "pinia";
  2. import { getConfig } from "@/config";
  3. import { emitter } from "@/utils/mitt";
  4. import Avatar from "@/assets/user.jpg";
  5. import { getTopMenu } from "@/router/utils";
  6. import { useFullscreen } from "@vueuse/core";
  7. import type { routeMetaType } from "../types";
  8. import { useRouter, useRoute } from "vue-router";
  9. import { router, remainingPaths } from "@/router";
  10. import { computed, type CSSProperties } from "vue";
  11. import { useAppStoreHook } from "@/store/modules/app";
  12. import { useUserStoreHook } from "@/store/modules/user";
  13. import { useGlobal, isAllEmpty } from "@pureadmin/utils";
  14. import { usePermissionStoreHook } from "@/store/modules/permission";
  15. import { useSiteStoreHook } from "@/store/modules/site";
  16. import ExitFullscreen from "~icons/ri/fullscreen-exit-fill";
  17. import Fullscreen from "~icons/ri/fullscreen-fill";
  18. const errorInfo =
  19. "The current routing configuration is incorrect, please check the configuration";
  20. export function useNav() {
  21. const route = useRoute();
  22. const pureApp = useAppStoreHook();
  23. const routers = useRouter().options.routes;
  24. const { isFullscreen, toggle } = useFullscreen();
  25. const { wholeMenus } = storeToRefs(usePermissionStoreHook());
  26. /** 平台`layout`中所有`el-tooltip`的`effect`配置,默认`light` */
  27. const tooltipEffect = getConfig()?.TooltipEffect ?? "light";
  28. const getDivStyle = computed((): CSSProperties => {
  29. return {
  30. width: "100%",
  31. display: "flex",
  32. alignItems: "center",
  33. justifyContent: "space-between",
  34. overflow: "hidden"
  35. };
  36. });
  37. /** 头像(如果头像为空则使用 src/assets/user.jpg ) */
  38. const userAvatar = computed(() => {
  39. return isAllEmpty(useUserStoreHook()?.avatar)
  40. ? Avatar
  41. : useUserStoreHook()?.avatar;
  42. });
  43. /** 昵称(如果昵称为空则显示用户名) */
  44. const username = computed(() => {
  45. return isAllEmpty(useUserStoreHook()?.nickname)
  46. ? useUserStoreHook()?.username
  47. : useUserStoreHook()?.nickname;
  48. });
  49. const avatarsStyle = computed(() => {
  50. return username.value ? { marginRight: "10px" } : "";
  51. });
  52. const isCollapse = computed(() => {
  53. return !pureApp.getSidebarStatus;
  54. });
  55. const device = computed(() => {
  56. return pureApp.getDevice;
  57. });
  58. const { $storage, $config } = useGlobal<GlobalPropertiesApi>();
  59. const layout = computed(() => {
  60. return $storage?.layout?.layout;
  61. });
  62. const title = computed(() => {
  63. return useSiteStoreHook().title || $config.Title;
  64. });
  65. /** 动态title */
  66. function changeTitle(meta: routeMetaType) {
  67. const Title = useSiteStoreHook().title || getConfig().Title;
  68. if (Title) document.title = `${meta.title} | ${Title}`;
  69. else document.title = meta.title;
  70. }
  71. /** 退出登录 */
  72. function logout() {
  73. useUserStoreHook().logOut();
  74. }
  75. function backTopMenu() {
  76. router.push(getTopMenu()?.path);
  77. }
  78. function onPanel() {
  79. emitter.emit("openPanel");
  80. }
  81. function toggleSideBar() {
  82. pureApp.toggleSideBar();
  83. }
  84. function handleResize(menuRef) {
  85. menuRef?.handleResize();
  86. }
  87. function resolvePath(route) {
  88. if (!route.children) return console.error(errorInfo);
  89. const httpReg = /^http(s?):\/\//;
  90. const routeChildPath = route.children[0]?.path;
  91. if (httpReg.test(routeChildPath)) {
  92. return route.path + "/" + routeChildPath;
  93. } else {
  94. return routeChildPath;
  95. }
  96. }
  97. function menuSelect(indexPath: string) {
  98. if (wholeMenus.value.length === 0 || isRemaining(indexPath)) return;
  99. emitter.emit("changLayoutRoute", indexPath);
  100. }
  101. /** 判断路径是否参与菜单 */
  102. function isRemaining(path: string) {
  103. return remainingPaths.includes(path);
  104. }
  105. /** 获取`logo` */
  106. function getLogo() {
  107. return new URL("/logo.svg", import.meta.url).href;
  108. }
  109. return {
  110. route,
  111. title,
  112. device,
  113. layout,
  114. logout,
  115. routers,
  116. $storage,
  117. isFullscreen,
  118. Fullscreen,
  119. ExitFullscreen,
  120. toggle,
  121. backTopMenu,
  122. onPanel,
  123. getDivStyle,
  124. changeTitle,
  125. toggleSideBar,
  126. menuSelect,
  127. handleResize,
  128. resolvePath,
  129. getLogo,
  130. isCollapse,
  131. pureApp,
  132. username,
  133. userAvatar,
  134. avatarsStyle,
  135. tooltipEffect
  136. };
  137. }