动态添加路由后,router.push是可以路由到页面的,但是通过浏览器的url输入就不能路由到页面
const router = createRouter({
history: createWebHistory(),
routes
})
router.beforeEach(async (to, from, next) => {
const systemStore = useSystemStore()
const userStore = useUserStore()
systemStore.darkRefresh()
const token = getToken()
if (!token && to.path !== '/login') { // 如果 token 不存在且将要跳转的页面不是 /login,则直接跳转到 /login 页
next('/login')
} else if (token && to.path === '/login') { // 如果 token 存在且将要跳转的页面是 /login,则直接跳转到主页
next('/')
} else if (token) {
try {
await userStore.refreshUserInfo() // 刷新用户信息
await systemStore.getAsyncRoutes() // 获取路由信息
await generateRoutes(systemStore.getRoutes) // 添加动态路由
next()
} catch (error) {
removeToken()
userStore.$reset()
next('/login')
}
} else { // 如果 token 不存在且将要跳转的页面是 /login,则直接跳转到登录页
next()
}
})
export const generateRoutes = (routes) => {
if (!routes.length) {
return
}
routes.forEach((item) => {
const rts = {
name: item.name,
path: item.path,
meta: item.meta,
component: item.component
}
if (item.children && item.children.length) {
generateRoutes(item.children)
} else {
rts.component = loadComponent(item.component)
}
router.addRoute('layout', rts)
})
}
const loadView = import.meta.glob('@/views/**/*.vue')
const loadComponent = (url) => {
return loadView['/src/views/' + url + '/index.vue']
}