import { createRouter, createWebHashHistory } from 'vue-router' import type { RouteRecordRaw } from 'vue-router' import type { App } from 'vue' import { Layout, getParentLayout } from '@/utils/routerHelper' import { useI18n } from '@/hooks/web/useI18n' const { t } = useI18n() export const constantRouterMap: AppRouteRecordRaw[] = [ { path: '/redirect', component: Layout, name: 'Redirect', children: [ { path: '/redirect/:path(.*)', name: 'Redirect', component: () => import('@/views/Redirect/Redirect.vue'), meta: {} } ], meta: { hidden: true, noTagsView: true } }, { path: '/login', component: () => import('@/views/Login/Login.vue'), name: 'Login', meta: { hidden: true, title: t('router.login'), noTagsView: true } } ] export const asyncRouterMap: AppRouteRecordRaw[] = [ { path: '/dashboard', component: Layout, redirect: '/dashboard/analysis', name: 'Dashboard', meta: { title: t('router.dashboard'), icon: 'ant-design:dashboard-filled', alwaysShow: true }, children: [ { path: 'analysis', component: () => import('@/views/Dashboard/Analysis.vue'), name: 'Analysis', meta: { title: t('router.analysis'), noCache: true } }, { path: 'workplace', component: () => import('@/views/Dashboard/Workplace.vue'), name: 'Workplace', meta: { title: t('router.workplace'), noCache: true } } ] }, { path: '/guide', component: Layout, name: 'Guide', meta: {}, children: [ { path: 'index', component: () => import('@/views/Guide/Guide.vue'), name: 'GuideDemo', meta: { title: t('router.guide'), icon: 'cib:telegram-plane' } } ] }, { path: '/components', component: Layout, redirect: '/components/icon', name: 'ComponentsDemo', meta: { title: t('router.component'), icon: 'bx:bxs-component', alwaysShow: true }, children: [ { path: 'form', component: getParentLayout(), name: 'Form', meta: { title: t('router.form'), alwaysShow: true }, children: [ { path: 'default-form', component: () => import('@/views/Components/Form/DefaultForm.vue'), name: 'DefaultForm', meta: { title: t('router.defaultForm') } }, { path: 'use-form', component: () => import('@/views/Components/Form/UseFormDemo.vue'), name: 'UseForm', meta: { title: 'UseForm' } }, { path: 'ref-form', component: () => import('@/views/Components/Form/RefForm.vue'), name: 'RefForm', meta: { title: 'RefForm' } } ] }, { path: 'table', component: getParentLayout(), name: 'TableDemo', meta: { title: t('router.table'), alwaysShow: true }, children: [ { path: 'default-table', component: () => import('@/views/Components/Table/DefaultTable.vue'), name: 'DefaultTable', meta: { title: t('router.defaultTable') } }, { path: 'use-table', component: () => import('@/views/Components/Table/UseTableDemo.vue'), name: 'UseTable', meta: { title: 'UseTable' } }, { path: 'ref-table', component: () => import('@/views/Components/Table/RefTable.vue'), name: 'RefTable', meta: { title: 'RefTable' } } ] }, { path: 'editor-demo', component: getParentLayout(), name: 'EditorDemo', meta: { title: t('router.editor'), alwaysShow: true }, children: [ { path: 'editor', component: () => import('@/views/Components/Editor/Editor.vue'), name: 'Editor', meta: { title: t('router.richText') } } ] }, { path: 'search', component: () => import('@/views/Components/Search.vue'), name: 'Search', meta: { title: t('router.search') } }, { path: 'icon', component: () => import('@/views/Components/Icon.vue'), name: 'Icon', meta: { title: t('router.icon') } }, { path: 'echart', component: () => import('@/views/Components/Echart.vue'), name: 'Echart', meta: { title: t('router.echart') } }, { path: 'count-to', component: () => import('@/views/Components/CountTo.vue'), name: 'CountTo', meta: { title: t('router.countTo') } }, { path: 'watermark', component: () => import('@/views/Components/Watermark.vue'), name: 'Watermark', meta: { title: t('router.watermark') } }, { path: 'qrcode', component: () => import('@/views/Components/Qrcode.vue'), name: 'Qrcode', meta: { title: t('router.qrcode') } }, { path: 'highlight', component: () => import('@/views/Components/Highlight.vue'), name: 'Highlight', meta: { title: t('router.highlight') } }, { path: 'infotip', component: () => import('@/views/Components/Infotip.vue'), name: 'Infotip', meta: { title: t('router.infotip') } } ] }, { path: '/level', component: Layout, redirect: '/level/menu1/menu1-1/menu1-1-1', name: 'Level', meta: { title: t('router.level'), icon: 'carbon:skill-level-advanced' }, children: [ { path: 'menu1', name: 'Menu1', component: getParentLayout(), redirect: '/level/menu1/menu1-1/menu1-1-1', meta: { title: t('router.menu1') }, children: [ { path: 'menu1-1', name: 'Menu11', component: getParentLayout(), redirect: '/level/menu1/menu1-1/menu1-1-1', meta: { title: t('router.menu11'), alwaysShow: true }, children: [ { path: 'menu1-1-1', name: 'Menu111', component: () => import('@/views/Level/Menu111.vue'), meta: { title: t('router.menu111') } } ] }, { path: 'menu1-2', name: 'Menu12', component: () => import('@/views/Level/Menu12.vue'), meta: { title: t('router.menu12') } } ] }, { path: 'menu2', name: 'Menu2Demo', component: () => import('@/views/Level/Menu2.vue'), meta: { title: t('router.menu2') } } ] } ] const router = createRouter({ history: createWebHashHistory(), strict: true, routes: constantRouterMap as RouteRecordRaw[], scrollBehavior: () => ({ left: 0, top: 0 }) }) export const resetRouter = (): void => { const resetWhiteNameList = ['RedirectRoot', 'Redirect', 'Login', 'Root', 'Dashboard', 'Page404'] router.getRoutes().forEach((route) => { const { name } = route if (name && !resetWhiteNameList.includes(name as string)) { router.hasRoute(name) && router.removeRoute(name) } }) } export const setupRouter = (app: App) => { app.use(router) } export default router