From 09c7658c21c7dda461dbb528e85b638b5a7dfacd Mon Sep 17 00:00:00 2001
From: Soybean <2570172956@qq.com>
Date: Tue, 11 Jan 2022 19:03:42 +0800
Subject: [PATCH] =?UTF-8?q?feat(projects):=20=E9=9D=A2=E5=8C=85=E5=B1=91?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/interface/system.ts | 13 +++++-
.../components/GlobalBreadcrumb.vue | 43 +++++++++++++++++++
.../GlobalHeader/components/HeaderMenu.vue | 26 +++++++++++
.../common/GlobalHeader/components/index.ts | 4 +-
src/layouts/common/GlobalHeader/index.vue | 20 ++++++---
src/router/routes/index.ts | 2 +-
src/utils/router/breadcrumb.ts | 35 +++++++++++++++
src/utils/router/index.ts | 1 +
8 files changed, 134 insertions(+), 10 deletions(-)
create mode 100644 src/layouts/common/GlobalHeader/components/GlobalBreadcrumb.vue
create mode 100644 src/layouts/common/GlobalHeader/components/HeaderMenu.vue
create mode 100644 src/utils/router/breadcrumb.ts
diff --git a/src/interface/system.ts b/src/interface/system.ts
index 5c3fc30f6..d85919a06 100644
--- a/src/interface/system.ts
+++ b/src/interface/system.ts
@@ -1,7 +1,18 @@
-import type { MenuOption } from 'naive-ui';
+import type { MenuOption, DropdownOption } from 'naive-ui';
/** 菜单项配置 */
export type GlobalMenuOption = MenuOption & {
routeName: string;
routePath: string;
};
+
+/** 面包屑 */
+export type GlobalBreadcrumb = DropdownOption & {
+ key: string;
+ label: string;
+ disabled: boolean;
+ routeName: string;
+ hasChildren: boolean;
+ iconName?: string;
+ children?: GlobalBreadcrumb[];
+};
diff --git a/src/layouts/common/GlobalHeader/components/GlobalBreadcrumb.vue b/src/layouts/common/GlobalHeader/components/GlobalBreadcrumb.vue
new file mode 100644
index 000000000..7d45fe04a
--- /dev/null
+++ b/src/layouts/common/GlobalHeader/components/GlobalBreadcrumb.vue
@@ -0,0 +1,43 @@
+
+
+
+
+
+
+
+ {{ breadcrumb.label }}
+
+
+
+
+ {{ breadcrumb.label }}
+
+
+
+
+
+
+
+
diff --git a/src/layouts/common/GlobalHeader/components/HeaderMenu.vue b/src/layouts/common/GlobalHeader/components/HeaderMenu.vue
new file mode 100644
index 000000000..0cfb17b34
--- /dev/null
+++ b/src/layouts/common/GlobalHeader/components/HeaderMenu.vue
@@ -0,0 +1,26 @@
+
+
+
+
+
+
diff --git a/src/layouts/common/GlobalHeader/components/index.ts b/src/layouts/common/GlobalHeader/components/index.ts
index dd03f8b2d..b13a8ab6e 100644
--- a/src/layouts/common/GlobalHeader/components/index.ts
+++ b/src/layouts/common/GlobalHeader/components/index.ts
@@ -1,7 +1,9 @@
import MenuCollapse from './MenuCollapse.vue';
+import GlobalBreadcrumb from './GlobalBreadcrumb.vue';
+import HeaderMenu from './HeaderMenu.vue';
import GithubSite from './GithubSite.vue';
import FullScreen from './FullScreen.vue';
import ThemeMode from './ThemeMode.vue';
import UserAvatar from './UserAvatar.vue';
-export { MenuCollapse, GithubSite, FullScreen, ThemeMode, UserAvatar };
+export { MenuCollapse, GlobalBreadcrumb, HeaderMenu, GithubSite, FullScreen, ThemeMode, UserAvatar };
diff --git a/src/layouts/common/GlobalHeader/index.vue b/src/layouts/common/GlobalHeader/index.vue
index 7f1fbf0a3..3d16a09e8 100644
--- a/src/layouts/common/GlobalHeader/index.vue
+++ b/src/layouts/common/GlobalHeader/index.vue
@@ -3,13 +3,11 @@
-
+
+
+
+
-
@@ -24,7 +22,15 @@ import { DarkModeContainer } from '@/components';
import { useThemeStore } from '@/store';
import type { GlobalHeaderProps } from '@/interface';
import GlobalLogo from '../GlobalLogo/index.vue';
-import { MenuCollapse, GithubSite, FullScreen, ThemeMode, UserAvatar } from './components';
+import {
+ MenuCollapse,
+ GlobalBreadcrumb,
+ HeaderMenu,
+ GithubSite,
+ FullScreen,
+ ThemeMode,
+ UserAvatar
+} from './components';
interface Props {
/** 显示logo */
diff --git a/src/router/routes/index.ts b/src/router/routes/index.ts
index 6546565d4..b782ed5e2 100644
--- a/src/router/routes/index.ts
+++ b/src/router/routes/index.ts
@@ -54,7 +54,7 @@ export const constantRoutes: AuthRoute.Route[] = [
singleLayout: 'blank'
}
},
- // 匹配无效的路径重定向not-found的页面
+ // 匹配无效路径的路由
{
name: 'not-found-page',
path: '/:pathMatch(.*)*',
diff --git a/src/utils/router/breadcrumb.ts b/src/utils/router/breadcrumb.ts
new file mode 100644
index 000000000..fd5e9aff8
--- /dev/null
+++ b/src/utils/router/breadcrumb.ts
@@ -0,0 +1,35 @@
+import type { GlobalMenuOption, GlobalBreadcrumb } from '@/interface';
+
+/**
+ * 获取面包屑数据
+ * @param activeKey - 当前页面路由的key
+ * @param menus - 菜单数据
+ * @param rootPath - 根路由路径
+ */
+export function getBreadcrumbByRouteKey(activeKey: string, menus: GlobalMenuOption[], rootPath: string) {
+ return menus.map(menu => getBreadcrumbItem(activeKey, menu, rootPath)).flat(1);
+}
+
+function getBreadcrumbItem(activeKey: string, menu: GlobalMenuOption, rootPath: string) {
+ const list: GlobalBreadcrumb[] = [];
+ if (activeKey.includes(menu.routeName)) {
+ const breadcrumb: GlobalBreadcrumb = {
+ key: menu.routeName,
+ label: menu.label as string,
+ routeName: menu.routeName,
+ disabled: menu.routePath === rootPath,
+ hasChildren: false
+ };
+ if (menu.icon) {
+ breadcrumb.icon = menu.icon;
+ }
+ if (menu.children && menu.children.length) {
+ breadcrumb.hasChildren = true;
+ breadcrumb.children = menu.children
+ .map(item => getBreadcrumbItem(activeKey, item as GlobalMenuOption, rootPath))
+ .flat(1);
+ }
+ list.push(breadcrumb);
+ }
+ return list;
+}
diff --git a/src/utils/router/index.ts b/src/utils/router/index.ts
index e659803c6..4da1be672 100644
--- a/src/utils/router/index.ts
+++ b/src/utils/router/index.ts
@@ -1,3 +1,4 @@
export * from './helpers';
export * from './menu';
+export * from './breadcrumb';
export * from './regexp';