Skip to content

Commit bdbe9b8

Browse files
committed
refactor: dynamic routes
1 parent 30211e1 commit bdbe9b8

File tree

5 files changed

+49
-37
lines changed

5 files changed

+49
-37
lines changed

src/main.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,12 @@ import { setupRouter } from '@/router'
88
import { setupStore } from '@/store'
99
import App from './App.vue'
1010

11-
function setupApp() {
11+
async function setupApp() {
1212
const app = createApp(App)
1313

1414
setupStore(app)
1515

16-
setupRouter(app)
16+
await setupRouter(app)
1717

1818
app.mount('#app')
1919
}

src/router/guard/permission-guard.js

+3-24
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,8 @@
1-
import { useUserStore } from '@/store/modules/user'
2-
import { usePermissionStore } from '@/store/modules/permission'
3-
import { NOT_FOUND_ROUTE } from '@/router/routes'
41
import { getToken, refreshAccessToken } from '@/utils/token'
52
import { isNullOrWhitespace } from '@/utils/is'
63

74
const WHITE_LIST = ['/login', '/404']
85
export function createPermissionGuard(router) {
9-
const userStore = useUserStore()
10-
const permissionStore = usePermissionStore()
116
router.beforeEach(async (to) => {
127
const token = getToken()
138

@@ -18,25 +13,9 @@ export function createPermissionGuard(router) {
1813
}
1914

2015
/** 有token的情况 */
21-
if (to.path === '/login') return { path: '/', replace: true }
22-
if (to.path === '/404') return true
16+
if (to.path === '/login') return { path: '/' }
2317

24-
// 已经拿到用户信息
25-
if (userStore.userId) {
26-
refreshAccessToken()
27-
return true
28-
}
29-
try {
30-
await userStore.getUserInfo()
31-
const accessRoutes = permissionStore.generateRoutes(userStore.role)
32-
accessRoutes.forEach((route) => {
33-
!router.hasRoute(route.name) && router.addRoute(route)
34-
})
35-
router.addRoute(NOT_FOUND_ROUTE)
36-
return { ...to, replace: true }
37-
} catch (error) {
38-
console.error(error)
39-
return
40-
}
18+
refreshAccessToken()
19+
return true
4120
})
4221
}

src/router/index.js

+36-11
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,53 @@
11
import { createRouter, createWebHistory, createWebHashHistory } from 'vue-router'
22
import { setupRouterGuard } from './guard'
3-
import { basicRoutes } from './routes'
3+
import { basicRoutes as routes, EMPTY_ROUTE, NOT_FOUND_ROUTE } from './routes'
4+
import { getToken } from '@/utils/token'
5+
import { isNullOrWhitespace } from '@/utils/is'
6+
import { useUserStore } from '@/store/modules/user'
7+
import { usePermissionStore } from '@/store/modules/permission'
48

59
const isHash = import.meta.env.VITE_USE_HASH === 'true'
610
export const router = createRouter({
711
history: isHash ? createWebHashHistory('/') : createWebHistory('/'),
8-
routes: [],
12+
routes,
913
scrollBehavior: () => ({ left: 0, top: 0 }),
1014
})
1115

12-
export function resetRouter() {
16+
export async function resetRouter() {
1317
router.getRoutes().forEach((route) => {
1418
const { name } = route
1519
router.hasRoute(name) && router.removeRoute(name)
1620
})
17-
basicRoutes.forEach((route) => {
18-
!router.hasRoute(route.name) && router.addRoute(route)
19-
})
21+
await addDynamicRoutes()
2022
}
2123

22-
export function setupRouter(app) {
23-
basicRoutes.forEach((route) => {
24-
!router.hasRoute(route.name) && router.addRoute(route)
25-
})
26-
app.use(router)
24+
export async function addDynamicRoutes() {
25+
const token = getToken()
26+
27+
// 没有token情况
28+
if (isNullOrWhitespace(token)) {
29+
router.addRoute(EMPTY_ROUTE)
30+
return
31+
}
32+
33+
// 有token的情况
34+
try {
35+
const userStore = useUserStore()
36+
const permissionStore = usePermissionStore()
37+
!userStore.userId && (await userStore.getUserInfo())
38+
const accessRoutes = permissionStore.generateRoutes(userStore.role)
39+
accessRoutes.forEach((route) => {
40+
!router.hasRoute(route.name) && router.addRoute(route)
41+
})
42+
router.hasRoute(EMPTY_ROUTE.name) && router.removeRoute(EMPTY_ROUTE.name)
43+
router.addRoute(NOT_FOUND_ROUTE)
44+
} catch (error) {
45+
console.error(error)
46+
}
47+
}
48+
49+
export async function setupRouter(app) {
50+
await addDynamicRoutes()
2751
setupRouterGuard(router)
52+
app.use(router)
2853
}

src/router/routes/index.js

+6
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,12 @@ export const NOT_FOUND_ROUTE = {
6363
isHidden: true,
6464
}
6565

66+
export const EMPTY_ROUTE = {
67+
name: 'Empty',
68+
path: '/:pathMatch(.*)*',
69+
component: null,
70+
}
71+
6672
const modules = import.meta.glob('@/views/**/route.js', { eager: true })
6773
const asyncRoutes = []
6874
Object.keys(modules).forEach((key) => {

src/views/login/index.vue

+2
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ import { setToken } from '@/utils/token'
5151
import { useStorage } from '@vueuse/core'
5252
import bgImg from '@/assets/images/login_bg.webp'
5353
import api from './api'
54+
import { addDynamicRoutes } from '@/router'
5455
5556
const title = import.meta.env.VITE_TITLE
5657
@@ -91,6 +92,7 @@ async function handleLogin() {
9192
} else {
9293
lStorage.remove('loginInfo')
9394
}
95+
await addDynamicRoutes()
9496
if (query.redirect) {
9597
const path = query.redirect
9698
Reflect.deleteProperty(query, 'redirect')

0 commit comments

Comments
 (0)