Skip to content
This repository was archived by the owner on May 12, 2020. It is now read-only.

Commit ce1c8a1

Browse files
committed
feat(permission): implement user info storage when user start a new session
1 parent a5401c0 commit ce1c8a1

5 files changed

Lines changed: 57 additions & 37 deletions

File tree

src/permission/index.js

Lines changed: 44 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import store from 'STORE'
33
import loginTypes from 'STORE/modules/login/mutations/types'
44
import NProgress from 'nprogress'
55
import 'nprogress/nprogress.css'
6-
import { getTokenFromLocal } from 'UTILS/storage'
6+
import { tokenFromStorage, usernameFromStorage } from 'UTILS/storage'
77
import { MessageBox } from 'element-ui'
88
import createDynamicRoutes from './create-routes'
99
import constantRoutes from 'ROUTER/routes/constant'
@@ -48,30 +48,23 @@ function errorHandler (e, next, redirectPath) {
4848
console.error(e)
4949
}
5050

51-
function routesAddToRouter () {
51+
function addRoutesToRouter () {
5252
router.addRoutes(store.getters['login/dynamicRoutes'])
5353
console.log(
5454
'%c[Routes creation]: routes has been added!', 'color: yellow',
5555
store.getters['login/dynamicRoutes']
5656
)
5757
}
5858

59-
function createAllRoutes (to, redirectPath, next) {
60-
return store.dispatch(
61-
'login/fetchUserAccess',
62-
getTokenFromLocal()
63-
)
64-
.then(setDynamicRoutesToStorage)
65-
.then(setGlobalRoutesToStorage)
66-
.then(() => routesAddToRouter())
67-
.catch(e => errorHandler(e, next, redirectPath))
68-
// 1. MUST invoke `next({ ...to, replace: true })` to prevent route matching
69-
// from occurring before route is added
70-
// 2. use `to` route to replace routes occurring before private routes is added
71-
.finally(() => {
72-
HAS_ROUTES_ADDED = true
73-
next({ ...to, replace: true })
74-
})
59+
function createRoutesMap (to, next) {
60+
setDynamicRoutesToStorage(store.getters['login/role'])
61+
setGlobalRoutesToStorage()
62+
addRoutesToRouter()
63+
HAS_ROUTES_ADDED = true
64+
// 1. MUST invoke `next({ ...to, replace: true })` to prevent route matching
65+
// from occurring before route is added
66+
// 2. use `to` route to replace routes occurring before private routes is added
67+
return next({ ...to, replace: true })
7568
}
7669

7770
/**
@@ -86,31 +79,52 @@ router.beforeEach((to, from, next) => {
8679
}
8780

8881
// ! State: User has been logged in (local token).
89-
if (getTokenFromLocal()) {
82+
if (tokenFromStorage.getItem()) {
9083
// 1. fetch RolesMap if necessary (when RolesMap stored by back-end)
9184

85+
// local storage has a accessToken record, but current `login/accessToken`
86+
// vuex state is empty string when user activate a new session (eg. new
87+
// browser tab)
88+
if (!store.getters['login/accessToken']) {
89+
return store.dispatch(
90+
'login/fetchUserAccess',
91+
tokenFromStorage.getItem()
92+
)
93+
.then(() => {
94+
// fill vuex state with user information to prevent infinity loop.
95+
store.commit(
96+
`login/${loginTypes.SET_ACCESS_TOKEN}`,
97+
tokenFromStorage.getItem()
98+
)
99+
store.commit(
100+
`login/${loginTypes.SET_USERNAME}`,
101+
usernameFromStorage.getItem()
102+
)
103+
})
104+
.then(() => createRoutesMap(to, next))
105+
.catch(e => errorHandler(e, next, to.path))
106+
}
107+
92108
// 2. confirm route access by user role, including global routes creation.
93109
if (!store.getters['login/role']) {
94110
// 2.1 fetch user role, then routes creation based on user role.
95-
return createAllRoutes(to, to.path, next)
111+
return store.dispatch(
112+
'login/fetchUserAccess',
113+
tokenFromStorage.getItem()
114+
)
115+
.then(() => createRoutesMap(to, next))
116+
.catch(e => errorHandler(e, next, to.path))
96117
}
97118

98-
// (2.2 optional) re-create private routes based on user role when page
119+
// (2.2 optional) Regenerate private routes based on user role when page
99120
// reload, because vuex state will be preserved by vuex-persistedstate when
100121
// page reload.
101122
if (store.getters['login/role'] && !HAS_ROUTES_ADDED) {
102-
setDynamicRoutesToStorage(store.getters['login/role'])
103-
setGlobalRoutesToStorage()
104-
routesAddToRouter()
105-
HAS_ROUTES_ADDED = true
106123
console.log(
107-
'%c[Routes creation]: Private routes has been regenerated !',
124+
'%c[Routes creation]: Activate private routes regeneration process !',
108125
'color: yellow;'
109126
)
110-
// 1. MUST invoke `next({ ...to, replace: true })` to prevent route
111-
// matching from occurring before route is added
112-
// 2. use `to` route to replace routes occurring before private routes is added
113-
return next({ ...to, replace: true })
127+
return createRoutesMap(to, next)
114128
}
115129

116130
// 2.2 filter route

src/store/modules/login/getters.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,13 @@ export default {
22
username (state) {
33
return state.username
44
},
5+
accessToken (state) {
6+
return state.accessToken
7+
},
58
role (state) {
69
return state.role
710
},
8-
// used to add user private routes to global routes map.
11+
// used to add user private routes (router.addRoutes) to global routes map.
912
dynamicRoutes (state) {
1013
return state.dynamicRoutes
1114
},

src/store/modules/login/mutations/index.js

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,17 @@
11
import types from './types'
2-
import { tokenFromLocal } from 'UTILS/storage'
2+
import { tokenFromStorage, usernameFromStorage } from 'UTILS/storage'
33

44
export default {
55
[types.SET_USERNAME] (state, username) {
6+
username
7+
? usernameFromStorage.setItem(username)
8+
: usernameFromStorage.removeItem()
69
state.username = username
710
},
811
[types.SET_ACCESS_TOKEN] (state, accessToken) {
912
accessToken
10-
? tokenFromLocal.setItem(accessToken)
11-
: tokenFromLocal.removeItem()
13+
? tokenFromStorage.setItem(accessToken)
14+
: tokenFromStorage.removeItem()
1215
state.accessToken = accessToken
1316
},
1417
[types.SET_USER_ROLE] (state, role) {

src/utils/request.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import axios from 'axios'
2-
import { tokenFromLocal } from 'UTILS/storage'
2+
import { tokenFromStorage } from 'UTILS/storage'
33

44
const request = axios.create({
55
// Env variables is defined by .env.[mode] files.
@@ -12,7 +12,7 @@ request.interceptors.request.use(req => {
1212
req.headers['app_key'] = process.env.VUE_APP_KEY
1313
req.headers['app_secret'] = process.env.VUE_APP_SECRET
1414

15-
const token = tokenFromLocal.getItem()
15+
const token = tokenFromStorage.getItem()
1616
if (token) req.headers['access_token'] = token
1717

1818
return req

src/utils/storage.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,6 @@ function createStorageUtils (key, storage = localStorage) {
2222
}
2323
}
2424

25-
export const tokenFromLocal = createStorageUtils(TOKEN_KEY, localStorage)
25+
export const tokenFromStorage = createStorageUtils(TOKEN_KEY, localStorage)
2626

2727
export const usernameFromStorage = createStorageUtils(USERNAME_KEY, localStorage)

0 commit comments

Comments
 (0)