Javascript作爲當下的熱門語言,用途很普遍,從前端到後端到處可見其存在,該技術現在在咱們項目內部也大量使用來開發諸如CMS系統以及其餘其餘一些數據分析系統的前端頁面,爲此我的很是感興趣並將其做爲帽子卡的擴展內容來進行課餘學習。前端
Javascript框架鱗次櫛比,但基本原理大體相同,所以選用國內人開發的vue.js進行一個初步的嘗試。學習vue.js也一週多的時間了,提及vue的主要用法,無外乎Declarative Rendering、Component System、Client-side Routing、Vue-resource、Axios以及視項目大小而決定是否使用的Vuex,學習vue事小,主要轉變思惟,面向先後端分離的組件式web開發纔是真正想去實踐的。vue
正好個人我的網站CodeSheep最近要開發後臺管理,所以正好用vue這一套來實現了一下。說到後臺管理,繞不開的問題就是權限的管理。既然想實踐先後端分離這種思想,所以後臺管理的全部web前端的東西應該獨立由前端完成,這其中就包括很重要的由前端來根據權限進行相關東西的控制。咱們想要作到的是:不一樣的權限對應着不一樣的路由,同時頁面側邊欄也應該根據不一樣的權限,來異步生成對應的菜單,講白了就是後臺管理時不一樣權限的用戶其看到的界面菜單是不同的,所以有了這裏實現登陸和權限驗證的一套流程。ios
this.$store.dispatch('LoginByEmail', this.loginForm).then(() => {
this.$router.push({ path: '/' }); //登陸成功以後重定向到首頁
}).catch(err => {
this.$message.error(err); //登陸失敗提示錯誤
});
複製代碼
其中異步觸發的actions LoginByEmail的處理內容以下:web
LoginByEmail ({ commit }, userInfo) {
const email = userInfo.email.trim()
return new Promise((resolve, reject) => {
loginByEmail(email, userInfo.password).then(response => {
const data = response.data
setToken(response.data.token)
commit('SET_TOKEN', data.token)
resolve()
}).catch(error => {
reject(error)
})
})
}
複製代碼
很容易看出想作的是將從服務器端拿到的token(惟一標示用戶身份)放到瀏覽器本地Cookie中去vuex
這一步是核心,具體處理流程示意以下:後端
具體代碼以下:api
router.beforeEach((to, from, next) => {
if (getToken()) { // 判斷是否取到token
if (to.path === '/login') {
next({ path: '/' })
} else {
if (store.getters.roles.length === 0) { // 判斷當前用戶是否已獲取完user_info信息
store.dispatch('GetInfo').then(res => { // 獲取user_info
const roles = res.data.role
store.dispatch('GenerateRoutes', { roles }).then(() => { // 生成可訪問的路由表
router.addRoutes(store.getters.addRouters) // 動態添加可訪問路由表
next({ ...to }) // 放行路由
})
}).catch(() => {
store.dispatch('FedLogOut').then(() => {
next({ path: '/login' })
})
})
} else {
next() // 放行該路由
}
}
} else {
if (whiteList.indexOf(to.path) !== -1) { // 在免登陸白名單裏的路徑,繼續讓其訪問
next()
} else { // 其餘不在白名單裏的路徑所有讓其重定向到登陸頁面!
next('/login')
alert('not in white list, now go to the login page')
}
}
})
複製代碼
流程圖中幾個重要步驟解釋一下:瀏覽器
操做很簡單,主要是從Cookie中獲取,看token是否是已經拿到了:bash
export function getToken () {
return Cookies.get(TokenKey)
}
複製代碼
GetInfo ({ commit, state }) {
return new Promise((resolve, reject) => {
getInfo(state.token).then(response => {
const data = response.data
console.log(data)
commit('SET_ROLES', data.role)
commit('SET_NAME', data.name)
resolve(response)
}).catch(error => {
reject(error)
})
})
}
複製代碼
操做也很簡單,用一個get的restful api從服務器獲取用戶的角色和名字服務器
GenerateRoutes ({ commit }, data) {
return new Promise(resolve => {
const { roles } = data
let accessedRouters
if (roles.indexOf('admin') >= 0) {
accessedRouters = asyncRouter
} else {
accessedRouters = filterAsyncRouter(asyncRouter, roles)
}
commit('SET_ROUTERS', accessedRouters)
resolve()
})
}
複製代碼
從代碼中能夠看出,我這是隻區分了管理員角色admin和其餘普通用戶(即非Aadmin兩種權限)
該系列的實踐後續還將嘗試更多,將會一一撰帖成文,我也是個初學者,路漫漫而求索之。。。