You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
209 lines
5.3 KiB
209 lines
5.3 KiB
import { createRouter, createWebHashHistory, createWebHistory } from 'vue-router' |
|
import type { RouteRecordRaw } from 'vue-router' |
|
import { useUserStore } from '../stores/user' |
|
import { usePermissionStore } from '@/stores/permission' |
|
import { useDictStore } from '@/stores/dict' |
|
import { getToken } from '@/utils/auth' |
|
|
|
export const defaultRoute = [ |
|
{ |
|
path: '/login', |
|
component: () => import('@/pages/system/login/index.vue'), |
|
name: 'Login', |
|
meta: { |
|
hidden: true, |
|
title: '登录', |
|
noTagsView: true, |
|
}, |
|
}, |
|
{ |
|
path: '/404', |
|
name: 'NoFound', |
|
component: () => import('@/pages/Error/404.vue'), |
|
meta: { |
|
hidden: true, |
|
title: '404', |
|
}, |
|
}, |
|
{ |
|
path: '/user', |
|
component: () => import('@/pages/layout.vue'), |
|
name: 'UserInfo', |
|
meta: { |
|
hidden: true, |
|
}, |
|
children: [ |
|
{ |
|
path: 'profile', |
|
component: () => import('@/pages/Profile/index.vue'), |
|
name: 'Profile', |
|
meta: { |
|
canTo: true, |
|
hidden: true, |
|
noTagsView: false, |
|
icon: 'ep:user', |
|
title: '个人中心', |
|
}, |
|
}, |
|
], |
|
}, |
|
|
|
// { |
|
// path: '/device', |
|
// component: () => import('@/pages/layout.vue'), |
|
// name: 'UserInfo', |
|
// meta: { |
|
// canTo: true, |
|
// hidden: true, |
|
// noTagsView: false, |
|
// icon: 'ep:user', |
|
// title: '系统管理', |
|
// }, |
|
// children: [ |
|
// { |
|
// path: 'deviceOperation', |
|
// component: () => import('@/pages/deviceInfo/info.vue'), |
|
// name: 'deviceOperation', |
|
// meta: { |
|
// icon: 'ep:user', |
|
// hidden: true, |
|
// title: '设备xx', |
|
// }, |
|
// }, |
|
// ], |
|
// }, |
|
// { |
|
// path: '/user', |
|
// component: () => import('@/pages/layout.vue'), |
|
// name: 'UserInfo', |
|
// meta: { |
|
// canTo: true, |
|
// hidden: false, |
|
// noTagsView: false, |
|
// icon: 'ep:user', |
|
// title: '系统管理', |
|
// }, |
|
// children: [ |
|
// { |
|
// path: 'deviceField', |
|
// component: () => import('@/pages/system/deviceField/index.vue'), |
|
// name: 'DeviceField', |
|
// meta: { |
|
// icon: 'ep:user', |
|
// title: '字段管理', |
|
// }, |
|
// }, |
|
// { |
|
// path: 'device', |
|
// component: () => import('@/pages/deviceInfo/index.vue'), |
|
// name: 'Device', |
|
// meta: { |
|
// icon: 'ep:user', |
|
// title: '设备管理', |
|
// }, |
|
// }, |
|
|
|
// }, |
|
// { |
|
// path: 'manufacturer', |
|
// component: () => import('@/pages/system/manufacturer/index.vue'), |
|
// name: 'Manufacturer', |
|
// meta: { |
|
// icon: 'ep:user', |
|
// title: '厂商管理', |
|
// }, |
|
// }, |
|
// { |
|
// path: 'deviceTemplate', |
|
// component: () => import('@/pages/deviceTest/testPlan/index.vue'), |
|
// name: 'DeviceTemplate', |
|
// meta: { |
|
// icon: 'ep:user', |
|
// title: '模板管理', |
|
// }, |
|
// } |
|
// ], |
|
// }, |
|
] |
|
|
|
const router = createRouter({ |
|
history: createWebHistory(import.meta.env.BASE_URL), |
|
routes: defaultRoute, |
|
}) |
|
|
|
const whiteList = ['/login'] |
|
|
|
router.beforeEach(async (to, from, next) => { |
|
if (!getToken()) { |
|
if (whiteList.indexOf(to.path) !== -1) { |
|
next() |
|
} else { |
|
next('/login') |
|
} |
|
return |
|
} |
|
|
|
if (to.path === '/login' || to.path === '/') { |
|
next('/device/data') |
|
return |
|
} |
|
const userStore = useUserStore() |
|
const permissionStore = usePermissionStore() |
|
const dictStore = useDictStore() |
|
if (!dictStore.getIsSetDict) { |
|
await dictStore.setDictMap() |
|
} |
|
|
|
if (!userStore.getIsSetUser) { |
|
await userStore.setUserInfoAction() |
|
// 后端过滤菜单 |
|
await permissionStore.generateRoutes() |
|
permissionStore.getAddRouters.forEach(route => { |
|
router.addRoute(route as unknown as RouteRecordRaw) // 动态添加可访问路由表 |
|
}) |
|
const redirectPath = from.query.redirect || to.path |
|
// 修复跳转时不带参数的问题 |
|
const redirect = decodeURIComponent(redirectPath as string) |
|
const { basePath, paramsObject: query } = parseURL(redirect) |
|
const nextData = |
|
to.path === redirect ? { ...to, replace: true } : { path: redirect, query } |
|
next(nextData) |
|
} else { |
|
next() |
|
} |
|
}) |
|
|
|
export default router |
|
|
|
const parseURL = ( |
|
url: string | null | undefined |
|
): { basePath: string; paramsObject: { [key: string]: string } } => { |
|
// 如果输入为 null 或 undefined,返回空字符串和空对象 |
|
if (url == null) { |
|
return { basePath: '', paramsObject: {} } |
|
} |
|
|
|
// 找到问号 (?) 的位置,它之前是基础路径,之后是查询参数 |
|
const questionMarkIndex = url.indexOf('?') |
|
let basePath = url |
|
const paramsObject: { [key: string]: string } = {} |
|
|
|
// 如果找到了问号,说明有查询参数 |
|
if (questionMarkIndex !== -1) { |
|
// 获取 basePath |
|
basePath = url.substring(0, questionMarkIndex) |
|
|
|
// 从 URL 中获取查询字符串部分 |
|
const queryString = url.substring(questionMarkIndex + 1) |
|
|
|
// 使用 URLSearchParams 遍历参数 |
|
const searchParams = new URLSearchParams(queryString) |
|
searchParams.forEach((value, key) => { |
|
// 封装进 paramsObject 对象 |
|
paramsObject[key] = value |
|
}) |
|
} |
|
|
|
// 返回 basePath 和 paramsObject |
|
return { basePath, paramsObject } |
|
}
|
|
|