@@ -7,66 +7,64 @@ import { getToken } from '@/utils/auth' // get token from cookie
77
88NProgress . configure ( { showSpinner : false } ) // NProgress Configuration
99
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-
1710const whiteList = [ '/login' , '/auth-redirect' ] // no redirect whitelist
1811
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 ( )
2318
24- /* has token*/
19+ if ( hasToken ) {
2520 if ( to . path === '/login' ) {
21+ // if is logged in, redirect to the home page
2622 next ( { path : '/' } )
27- NProgress . done ( ) // if current page is dashboard will not trigger afterEach hook, so manually handle it
23+ NProgress . done ( )
2824 } 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 ( )
4829 } 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 ( )
5450 }
55- // 可删 ↑
5651 }
5752 }
5853 } else {
5954 /* has no token*/
55+
6056 if ( whiteList . indexOf ( to . path ) !== - 1 ) {
61- // 在免登录白名单,直接进入
57+ // in the free login whitelist, go directly
6258 next ( )
6359 } 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 ( )
6663 }
6764 }
6865} )
6966
7067router . afterEach ( ( ) => {
71- NProgress . done ( ) // finish progress bar
68+ // finish progress bar
69+ NProgress . done ( )
7270} )
0 commit comments