Commit e49072c31339ba58473ffa883308cc3c2c4c43e9

Authored by Vben
1 parent 6883b21b

fix: ensure the breadcrumb level is correct

build/vite/plugin/html.ts
... ... @@ -7,7 +7,7 @@ import type { ViteEnv } from '../../utils';
7 7  
8 8 import html from 'vite-plugin-html';
9 9  
10   -import pkg from '../../../package.json';
  10 +import pkg from './package.json';
11 11 import { GLOB_CONFIG_FILE_NAME } from '../../constant';
12 12  
13 13 export function configHtmlPlugin(env: ViteEnv, isBuild: boolean) {
... ...
package.json
... ... @@ -108,7 +108,7 @@
108 108 "stylelint-order": "^4.1.0",
109 109 "ts-node": "^9.1.1",
110 110 "typescript": "4.2.3",
111   - "vite": "2.0.5",
  111 + "vite": "2.1.1",
112 112 "vite-plugin-compression": "^0.2.3",
113 113 "vite-plugin-html": "^2.0.3",
114 114 "vite-plugin-imagemin": "^0.2.9",
... ...
src/components/Application/src/search/AppSearchModal.vue
... ... @@ -259,6 +259,12 @@
259 259 box-shadow: 0 1px 3px 0 #d4d9e1;
260 260 align-items: center;
261 261  
  262 + > div:first-child,
  263 + > div:last-child {
  264 + display: flex;
  265 + align-items: center;
  266 + }
  267 +
262 268 &--active {
263 269 color: #fff;
264 270 background: @primary-color;
... ...
src/layouts/default/header/components/Breadcrumb.vue
... ... @@ -4,10 +4,10 @@
4 4 <template #itemRender="{ route, routes, paths }">
5 5 <Icon :icon="route.meta.icon" v-if="getShowBreadCrumbIcon && route.meta.icon" />
6 6 <span v-if="!hasRedirect(routes, route)">
7   - {{ t(route.meta.title) }}
  7 + {{ t(route.name || route.meta.title) }}
8 8 </span>
9 9 <router-link v-else to="" @click="handleClick(route, paths, $event)">
10   - {{ t(route.meta.title) }}
  10 + {{ t(route.name || route.meta.title) }}
11 11 </router-link>
12 12 </template>
13 13 </a-breadcrumb>
... ... @@ -15,26 +15,29 @@
15 15 </template>
16 16 <script lang="ts">
17 17 import type { RouteLocationMatched } from 'vue-router';
  18 + import type { Menu } from '/@/router/types';
18 19  
19   - import { defineComponent, ref, toRaw, watchEffect } from 'vue';
20   - import { Breadcrumb } from 'ant-design-vue';
  20 + import { defineComponent, ref, watchEffect } from 'vue';
21 21  
22   - import { useRouter } from 'vue-router';
23   - import { filter } from '/@/utils/helper/treeHelper';
24   - import { REDIRECT_NAME } from '/@/router/constant';
  22 + import { Breadcrumb } from 'ant-design-vue';
25 23 import Icon from '/@/components/Icon';
26 24  
27 25 import { PageEnum } from '/@/enums/pageEnum';
28 26  
29 27 import { useDesign } from '/@/hooks/web/useDesign';
30 28 import { useRootSetting } from '/@/hooks/setting/useRootSetting';
  29 + import { useGo } from '/@/hooks/web/usePage';
  30 + import { useI18n } from '/@/hooks/web/useI18n';
  31 + import { useRouter } from 'vue-router';
31 32  
32 33 import { propTypes } from '/@/utils/propTypes';
33   - import { useGo } from '/@/hooks/web/usePage';
34 34 import { isString } from '/@/utils/is';
35   - import { useI18n } from '/@/hooks/web/useI18n';
  35 + import { filter } from '/@/utils/helper/treeHelper';
36 36 import { getMenus } from '/@/router/menus';
37 37  
  38 + import { REDIRECT_NAME } from '/@/router/constant';
  39 + import { getAllParentPath } from '/@/router/helper/menuHelper';
  40 +
38 41 export default defineComponent({
39 42 name: 'LayoutBreadcrumb',
40 43 components: { Icon, [Breadcrumb.name]: Breadcrumb },
... ... @@ -50,25 +53,32 @@
50 53 const { t } = useI18n();
51 54 watchEffect(async () => {
52 55 if (currentRoute.value.name === REDIRECT_NAME) return;
  56 + const menus = await getMenus();
  57 + const path = currentRoute.value.path;
  58 +
  59 + const parent = getAllParentPath(menus, path);
  60 +
  61 + const filterMenus = menus.filter((item) => item.path === parent[0]);
  62 +
  63 + const matched = getMatched(filterMenus, parent) as any;
53 64  
54   - const matched = currentRoute.value?.matched;
55 65 if (!matched || matched.length === 0) return;
56 66  
57   - let breadcrumbList = filterItem(toRaw(matched));
  67 + let breadcrumbList = filterItem(matched);
58 68  
59 69 const filterBreadcrumbList = breadcrumbList.filter(
60 70 (item) => item.path !== PageEnum.BASE_HOME
61 71 );
62 72  
63   - if (filterBreadcrumbList.length === breadcrumbList.length) {
64   - filterBreadcrumbList.unshift(({
65   - path: PageEnum.BASE_HOME,
66   - meta: {
67   - title: t('layout.header.home'),
68   - isLink: true,
69   - },
70   - } as unknown) as RouteLocationMatched);
71   - }
  73 + // if (filterBreadcrumbList.length === breadcrumbList.length) {
  74 + // filterBreadcrumbList.unshift(({
  75 + // path: PageEnum.BASE_HOME,
  76 + // meta: {
  77 + // title: t('layout.header.home'),
  78 + // isLink: true,
  79 + // },
  80 + // } as unknown) as RouteLocationMatched);
  81 + // }
72 82  
73 83 if (currentRoute.value.meta?.currentActiveMenu) {
74 84 filterBreadcrumbList.push((currentRoute.value as unknown) as RouteLocationMatched);
... ... @@ -76,6 +86,19 @@
76 86 routes.value = subRouteExtraction(filterBreadcrumbList);
77 87 });
78 88  
  89 + function getMatched(menus: Menu[], parent: string[]) {
  90 + const metched: Menu[] = [];
  91 + menus.forEach((item) => {
  92 + if (parent.includes(item.path)) {
  93 + metched.push(item);
  94 + }
  95 + if (item.children?.length) {
  96 + metched.push(...getMatched(item.children, parent));
  97 + }
  98 + });
  99 + return metched;
  100 + }
  101 +
79 102 function subRouteExtraction(routeList: RouteLocationMatched[]) {
80 103 const resultRoutes: RouteLocationMatched[] = [];
81 104 routeList.forEach((route) => {
... ... @@ -112,22 +135,9 @@
112 135  
113 136 function handleClick(route: RouteLocationMatched, paths: string[], e: Event) {
114 137 e?.preventDefault();
115   - const {
116   - children,
117   - redirect,
118   - meta,
119   -
120   - // components
121   - } = route;
122   -
123   - // const isParent =
124   - // components?.default?.name === 'DefaultLayout' || (components?.default as any)?.parentView;
125   -
126   - if (
127   - children?.length &&
128   - !redirect
129   - // && !isParent
130   - ) {
  138 + const { children, redirect, meta } = route;
  139 +
  140 + if (children?.length && !redirect) {
131 141 e?.stopPropagation();
132 142 return;
133 143 }
... ... @@ -145,8 +155,7 @@
145 155 } else {
146 156 const ps = paths.slice(1);
147 157 const lastPath = ps.pop() || '';
148   - const parentPath = ps.pop() || '';
149   - goPath = `${parentPath}/${lastPath}`;
  158 + goPath = `${lastPath}`;
150 159 }
151 160 goPath = /^\//.test(goPath) ? goPath : `/${goPath}`;
152 161 go(goPath);
... ... @@ -157,11 +166,6 @@
157 166 if (routes.indexOf(route) === routes.length - 1) {
158 167 return false;
159 168 }
160   -
161   - // if (route?.meta?.isLink) {
162   - // return true;
163   - // }
164   -
165 169 return true;
166 170 }
167 171  
... ...
src/router/types.ts
... ... @@ -44,6 +44,8 @@ export interface RouteMeta {
44 44  
45 45 // Never show in menu
46 46 hideMenu?: boolean;
  47 +
  48 + isLink?: boolean;
47 49 }
48 50  
49 51 // @ts-ignore
... ...
yarn.lock
... ... @@ -11634,7 +11634,7 @@ vite-plugin-windicss@0.8.3:
11634 11634 "@windicss/plugin-utils" "0.8.3"
11635 11635 windicss "^2.4.5"
11636 11636  
11637   -vite@^2.1.1:
  11637 +vite@2.1.1:
11638 11638 version "2.1.1"
11639 11639 resolved "https://registry.npmjs.org/vite/-/vite-2.1.1.tgz#13c7a7a5665b435f28fe8549caab181e0ad9af7b"
11640 11640 integrity sha512-nlTQrfYIkahcElD8O/oogbLbuKgAZRbvoFOth3GmRSglfPdY4RgfBjj0Fu7HeCU/2u3Jxc6jW4UuV22LGw1Yaw==
... ...