This commit is contained in:
kailong321200875 2023-08-26 07:32:24 +08:00
parent 2095caaa85
commit b6ee4e5d48
9 changed files with 31 additions and 34 deletions

View File

@ -5,7 +5,7 @@ import { useRouter } from 'vue-router'
import { usePermissionStore } from '@/store/modules/permission' import { usePermissionStore } from '@/store/modules/permission'
import { filterBreadcrumb } from './helper' import { filterBreadcrumb } from './helper'
import { filter, treeToList } from '@/utils/tree' import { filter, treeToList } from '@/utils/tree'
import type { RouteLocationNormalizedLoaded, RouteMeta } from 'vue-router' import type { RouteLocationNormalizedLoaded } from 'vue-router'
import { useI18n } from '@/hooks/web/useI18n' import { useI18n } from '@/hooks/web/useI18n'
import { Icon } from '@/components/Icon' import { Icon } from '@/components/Icon'
import { useAppStore } from '@/store/modules/app' import { useAppStore } from '@/store/modules/app'
@ -47,15 +47,15 @@ export default defineComponent({
const breadcrumbList = treeToList<AppRouteRecordRaw[]>(unref(levelList)) const breadcrumbList = treeToList<AppRouteRecordRaw[]>(unref(levelList))
return breadcrumbList.map((v) => { return breadcrumbList.map((v) => {
const disabled = !v.redirect || v.redirect === 'noredirect' const disabled = !v.redirect || v.redirect === 'noredirect'
const meta = v.meta as RouteMeta const meta = v.meta
return ( return (
<ElBreadcrumbItem to={{ path: disabled ? '' : v.path }} key={v.name}> <ElBreadcrumbItem to={{ path: disabled ? '' : v.path }} key={v.name}>
{meta?.icon && breadcrumbIcon.value ? ( {meta?.icon && breadcrumbIcon.value ? (
<> <>
<Icon icon={meta.icon} class="mr-[5px]"></Icon> {t(v?.meta?.title)} <Icon icon={meta.icon} class="mr-[5px]"></Icon> {t(v?.meta?.title || '')}
</> </>
) : ( ) : (
t(v?.meta?.title) t(v?.meta?.title || '')
)} )}
</ElBreadcrumbItem> </ElBreadcrumbItem>
) )

View File

@ -1,5 +1,4 @@
import { pathResolve } from '@/utils/routerHelper' import { pathResolve } from '@/utils/routerHelper'
import type { RouteMeta } from 'vue-router'
export const filterBreadcrumb = ( export const filterBreadcrumb = (
routes: AppRouteRecordRaw[], routes: AppRouteRecordRaw[],
@ -8,7 +7,7 @@ export const filterBreadcrumb = (
const res: AppRouteRecordRaw[] = [] const res: AppRouteRecordRaw[] = []
for (const route of routes) { for (const route of routes) {
const meta = route?.meta as RouteMeta const meta = route?.meta
if (meta.hidden && !meta.canTo) { if (meta.hidden && !meta.canTo) {
continue continue
} }

View File

@ -1,5 +1,4 @@
import { ElSubMenu, ElMenuItem } from 'element-plus' import { ElSubMenu, ElMenuItem } from 'element-plus'
import type { RouteMeta } from 'vue-router'
import { hasOneShowingChild } from '../helper' import { hasOneShowingChild } from '../helper'
import { isUrl } from '@/utils/is' import { isUrl } from '@/utils/is'
import { useRenderMenuTitle } from './useRenderMenuTitle' import { useRenderMenuTitle } from './useRenderMenuTitle'
@ -14,7 +13,7 @@ export const useRenderMenuItem = (
) => { ) => {
const renderMenuItem = (routers: AppRouteRecordRaw[], parentPath = '/') => { const renderMenuItem = (routers: AppRouteRecordRaw[], parentPath = '/') => {
return routers.map((v) => { return routers.map((v) => {
const meta = (v.meta ?? {}) as RouteMeta const meta = v.meta ?? {}
if (!meta.hidden) { if (!meta.hidden) {
const { oneShowingChild, onlyOneChild } = hasOneShowingChild(v.children, v) const { oneShowingChild, onlyOneChild } = hasOneShowingChild(v.children, v)
const fullPath = isUrl(v.path) ? v.path : pathResolve(parentPath, v.path) // getAllParentPath<AppRouteRecordRaw>(allRouters, v.path).join('/') const fullPath = isUrl(v.path) ? v.path : pathResolve(parentPath, v.path) // getAllParentPath<AppRouteRecordRaw>(allRouters, v.path).join('/')

View File

@ -1,4 +1,3 @@
import type { RouteMeta } from 'vue-router'
import { ref, unref } from 'vue' import { ref, unref } from 'vue'
import { findPath } from '@/utils/tree' import { findPath } from '@/utils/tree'
@ -21,7 +20,7 @@ export const hasOneShowingChild = (
const onlyOneChild = ref<OnlyOneChildType>() const onlyOneChild = ref<OnlyOneChildType>()
const showingChildren = children.filter((v) => { const showingChildren = children.filter((v) => {
const meta = (v.meta ?? {}) as RouteMeta const meta = v.meta ?? {}
if (meta.hidden) { if (meta.hidden) {
return false return false
} else { } else {

View File

@ -173,7 +173,7 @@ export default defineComponent({
<Icon icon={item?.meta?.icon}></Icon> <Icon icon={item?.meta?.icon}></Icon>
</div> </div>
{!unref(showTitle) ? undefined : ( {!unref(showTitle) ? undefined : (
<p class="break-words mt-5px px-2px">{t(item.meta?.title)}</p> <p class="break-words mt-5px px-2px">{t(item.meta?.title || '')}</p>
)} )}
</div> </div>
) )

View File

@ -1,5 +1,4 @@
import { getAllParentPath } from '@/components/Menu/src/helper' import { getAllParentPath } from '@/components/Menu/src/helper'
import type { RouteMeta } from 'vue-router'
import { isUrl } from '@/utils/is' import { isUrl } from '@/utils/is'
import { cloneDeep } from 'lodash-es' import { cloneDeep } from 'lodash-es'
import { reactive } from 'vue' import { reactive } from 'vue'
@ -12,7 +11,7 @@ export const tabPathMap = reactive<TabMapTypes>({})
export const initTabMap = (routes: AppRouteRecordRaw[]) => { export const initTabMap = (routes: AppRouteRecordRaw[]) => {
for (const v of routes) { for (const v of routes) {
const meta = (v.meta ?? {}) as RouteMeta const meta = v.meta ?? {}
if (!meta?.hidden) { if (!meta?.hidden) {
tabPathMap[v.path] = [] tabPathMap[v.path] = []
} }
@ -26,7 +25,7 @@ export const filterMenusPath = (
const res: AppRouteRecordRaw[] = [] const res: AppRouteRecordRaw[] = []
for (const v of routes) { for (const v of routes) {
let data: Nullable<AppRouteRecordRaw> = null let data: Nullable<AppRouteRecordRaw> = null
const meta = (v.meta ?? {}) as RouteMeta const meta = v.meta ?? {}
if (!meta.hidden || meta.canTo) { if (!meta.hidden || meta.canTo) {
const allParentPath = getAllParentPath<AppRouteRecordRaw>(allRoutes, v.path) const allParentPath = getAllParentPath<AppRouteRecordRaw>(allRoutes, v.path)

View File

@ -1,10 +1,10 @@
import type { RouteMeta, RouteLocationNormalizedLoaded } from 'vue-router' import type { RouteLocationNormalizedLoaded } from 'vue-router'
import { pathResolve } from '@/utils/routerHelper' import { pathResolve } from '@/utils/routerHelper'
export const filterAffixTags = (routes: AppRouteRecordRaw[], parentPath = '') => { export const filterAffixTags = (routes: AppRouteRecordRaw[], parentPath = '') => {
let tags: RouteLocationNormalizedLoaded[] = [] let tags: RouteLocationNormalizedLoaded[] = []
routes.forEach((route) => { routes.forEach((route) => {
const meta = route.meta as RouteMeta const meta = route.meta ?? {}
const tagPath = pathResolve(parentPath, route.path) const tagPath = pathResolve(parentPath, route.path)
if (meta?.affix) { if (meta?.affix) {
tags.push({ ...route, path: tagPath, fullPath: tagPath } as RouteLocationNormalizedLoaded) tags.push({ ...route, path: tagPath, fullPath: tagPath } as RouteLocationNormalizedLoaded)

View File

@ -3,7 +3,6 @@ import type {
Router, Router,
RouteLocationNormalized, RouteLocationNormalized,
RouteRecordNormalized, RouteRecordNormalized,
RouteMeta,
RouteRecordRaw RouteRecordRaw
} from 'vue-router' } from 'vue-router'
import { isUrl } from '@/utils/is' import { isUrl } from '@/utils/is'
@ -47,7 +46,7 @@ export const generateRoutesFn1 = (
const res: AppRouteRecordRaw[] = [] const res: AppRouteRecordRaw[] = []
for (const route of routes) { for (const route of routes) {
const meta = route.meta as RouteMeta const meta = route.meta ?? {}
// skip some route // skip some route
if (meta.hidden && !meta.canTo) { if (meta.hidden && !meta.canTo) {
continue continue

34
types/router.d.ts vendored
View File

@ -32,21 +32,23 @@ import { defineComponent } from 'vue'
permission: ['edit','add', 'delete'] permission: ['edit','add', 'delete']
} }
**/ **/
interface RouteMetaCustom extends Record<string | number | symbol, unknown> {
hidden?: boolean
alwaysShow?: boolean
title?: string
icon?: string
noCache?: boolean
breadcrumb?: boolean
affix?: boolean
activeMenu?: string
noTagsView?: boolean
canTo?: boolean
permission?: string[]
}
declare module 'vue-router' { declare module 'vue-router' {
interface RouteMeta extends Record<string | number | symbol, unknown> { interface RouteMeta extends RouteMetaCustom {}
hidden?: boolean
alwaysShow?: boolean
title?: string
icon?: string
noCache?: boolean
breadcrumb?: boolean
affix?: boolean
activeMenu?: string
noTagsView?: boolean
followAuth?: string
canTo?: boolean
permission?: string[]
}
} }
type Component<T = any> = type Component<T = any> =
@ -57,7 +59,7 @@ type Component<T = any> =
declare global { declare global {
declare interface AppRouteRecordRaw extends Omit<RouteRecordRaw, 'meta'> { declare interface AppRouteRecordRaw extends Omit<RouteRecordRaw, 'meta'> {
name: string name: string
meta: RouteMeta meta: RouteMetaCustom
component?: Component | string component?: Component | string
children?: AppRouteRecordRaw[] children?: AppRouteRecordRaw[]
props?: Recordable props?: Recordable
@ -66,7 +68,7 @@ declare global {
declare interface AppCustomRouteRecordRaw extends Omit<RouteRecordRaw, 'meta'> { declare interface AppCustomRouteRecordRaw extends Omit<RouteRecordRaw, 'meta'> {
name: string name: string
meta: RouteMeta meta: RouteMetaCustom
component: string component: string
path: string path: string
redirect: string redirect: string