@@ -7,66 +7,64 @@ import { getToken } from '@/utils/auth' // get token from cookie
7
7
8
8
NProgress . configure ( { showSpinner : false } ) // NProgress Configuration
9
9
10
- // permission judge function
11
- function hasPermission ( roles , permissionRoles ) {
12
- if ( roles . includes ( 'admin' ) ) return true // admin permission passed directly
13
- if ( ! permissionRoles ) return true
14
- return roles . some ( role => permissionRoles . indexOf ( role ) >= 0 )
15
- }
16
-
17
10
const whiteList = [ '/login' , '/auth-redirect' ] // no redirect whitelist
18
11
19
- router . beforeEach ( ( to , from , next ) => {
20
- NProgress . start ( ) // start progress bar
21
- if ( getToken ( ) ) {
22
- // determine if there has token
12
+ router . beforeEach ( async ( to , from , next ) => {
13
+ // start progress bar
14
+ NProgress . start ( )
15
+
16
+ // determine whether the user has logged in
17
+ const hasToken = getToken ( )
23
18
24
- /* has token*/
19
+ if ( hasToken ) {
25
20
if ( to . path === '/login' ) {
21
+ // if is logged in, redirect to the home page
26
22
next ( { path : '/' } )
27
- NProgress . done ( ) // if current page is dashboard will not trigger afterEach hook, so manually handle it
23
+ NProgress . done ( )
28
24
} else {
29
- if ( store . getters . roles . length === 0 ) {
30
- // 判断当前用户是否已拉取完user_info信息
31
- store
32
- . dispatch ( 'user/getInfo' )
33
- . then ( res => {
34
- // 拉取user_info
35
- const { roles } = res // note: roles must be a object array! such as: [{id: '1', name: 'editor'}, {id: '2', name: 'developer'}]
36
- store . dispatch ( 'permission/generateRoutes' , { roles } ) . then ( accessRoutes => {
37
- // 根据roles权限生成可访问的路由表
38
- router . addRoutes ( accessRoutes ) // 动态添加可访问路由表
39
- next ( { ...to , replace : true } ) // hack方法 确保addRoutes已完成 ,set the replace: true so the navigation will not leave a history record
40
- } )
41
- } )
42
- . catch ( err => {
43
- store . dispatch ( 'user/resetToken' ) . then ( ( ) => {
44
- Message . error ( err )
45
- next ( { path : '/' } )
46
- } )
47
- } )
25
+ // determine whether the user has obtained his permission roles through getInfo
26
+ const hasRoles = store . getters . roles && store . getters . roles . length > 0
27
+ if ( hasRoles ) {
28
+ next ( )
48
29
} else {
49
- // 没有动态改变权限的需求可直接next() 删除下方权限判断 ↓
50
- if ( hasPermission ( store . getters . roles , to . meta . roles ) ) {
51
- next ( )
52
- } else {
53
- next ( { path : '/401' , replace : true , query : { noGoBack : true } } )
30
+ try {
31
+ // get user info
32
+ // note: roles must be a object array! such as: ['admin'] or ,['developer','editor']
33
+ const { roles } = await store . dispatch ( 'user/getInfo' )
34
+
35
+ // generate accessible routes map based on roles
36
+ const accessRoutes = await store . dispatch ( 'permission/generateRoutes' , roles )
37
+
38
+ // dynamically add accessible routes
39
+ router . addRoutes ( accessRoutes )
40
+
41
+ // hack method to ensure that addRoutes is complete
42
+ // set the replace: true, so the navigation will not leave a history record
43
+ next ( { ...to , replace : true } )
44
+ } catch ( error ) {
45
+ // remove token and go to login page to re-login
46
+ await store . dispatch ( 'user/resetToken' )
47
+ Message . error ( error || 'Has Error' )
48
+ next ( `/login?redirect=${ to . path } ` )
49
+ NProgress . done ( )
54
50
}
55
- // 可删 ↑
56
51
}
57
52
}
58
53
} else {
59
54
/* has no token*/
55
+
60
56
if ( whiteList . indexOf ( to . path ) !== - 1 ) {
61
- // 在免登录白名单,直接进入
57
+ // in the free login whitelist, go directly
62
58
next ( )
63
59
} else {
64
- next ( `/login?redirect=${ to . path } ` ) // 否则全部重定向到登录页
65
- NProgress . done ( ) // if current page is login will not trigger afterEach hook, so manually handle it
60
+ // other pages that do not have permission to access are redirected to the login page.
61
+ next ( `/login?redirect=${ to . path } ` )
62
+ NProgress . done ( )
66
63
}
67
64
}
68
65
} )
69
66
70
67
router . afterEach ( ( ) => {
71
- NProgress . done ( ) // finish progress bar
68
+ // finish progress bar
69
+ NProgress . done ( )
72
70
} )
0 commit comments