本文主要介紹vue-admin-模板權(quán)限管理,下面一起看看vue-admin-模板權(quán)限管理相關(guān)資訊。
在vue-admin-template角色權(quán)限設置(1)中提到了如何根據(jù)用戶角色控制訪問,但是在項目的實際使用中發(fā)現(xiàn)了一些存在的問題。下面主要針對這些存在的問題進行修改和完善。
1頁面刷新后頭像等個人信息消失的原因:頁面登錄成功后,項目通過getinfo方法獲取個人信息并存儲在vuex中,但頁面刷新后,vuex中的數(shù)據(jù)會丟失。這是因為js代碼運行在內(nèi)存中,代碼運行時的所有變量和函數(shù)也都存儲在內(nèi)存中。刷新頁面后,之前應用的內(nèi)存被釋放,腳本代碼被重新加載,變量被重新分配,所以這些數(shù)據(jù)如果要存儲的話,必須外部存儲。解決方案:獲取數(shù)據(jù)后,在存儲器中保存數(shù)據(jù)的副本。這里需要注意的是:盡量不要在localstorage中存儲過多的數(shù)據(jù),否則會影響頁面加載性能。從 @/api/用戶 從 amp導入{ gettoken,settoken,removetoken };;@/utils/auth ;從 amp導入{ resetrouter };;@/路由器 const getdefaultstate == { return {//使用localstorag: g: local storage . getitem( ;姓名和名稱。;)刷新后還存在?json . parse(local storag: ; 、avatar: local storage . getitem( ;阿凡達 ) ?json . parse(local storag: ; 、rol: local storage . getitem( ;角色 ) ?json . parse(local storag:[]} }常量統(tǒng)計e = getdefaultstateconst mutations = { r:(state)= { object . assign(stat:(stat:(stat:(state,avatar)= { state . avatar = avatar } } const actions = {//用戶登錄登錄({ commit },userinfo) { const { username,password } = userinfo返回新的承諾((resolve,reject){ log in然后(response = { const { data } =響應提交( 設置令牌 ,data . token)settoken(data . token)resolve})。catch(error = { reject(error)} })},//獲取用戶信息getinfo({ commit,state }){ return new promise((resolve,reject) = { getinfo(state.token)。然后(response = { const { data } = response;如果(!數(shù)據(jù)){退貨拒絕( 驗證失敗,請重新登錄! )} const {name,roles,avatar } = data//在lo備份個人信息。本地存儲。;角色 ,json。stringify (roles))本地存儲。;角色 ,json。stringify (roles))本地存儲。;阿凡達 ,json。stringify(頭像))如果(!roles | | roles . length = 0){ reject( ;您不是有效身份! )}//在local storage if(roles . includes( ;商店經(jīng)理 )){本地存儲。setitem( ;許可 ,json。stringify([ ;添加 , 編輯和刪除。;]);} else if(roles . includes( ;收銀員 )||角色. includes( ;技術(shù)員和技術(shù)員。;)||角色. includes( ;造型師 ){本地存儲。setitem( ;許可 ,json。stringify([]);}提交( set _ name ,name)提交( 設置角色 角色)提交( 設定_頭像 ,頭像)解析(數(shù)據(jù))})。catch(error = { reject(error)} })},//用戶注銷注銷({ commit,state }){ return new promise((resolve,reject) = {logout (state。token)。然后(= { remove token//must remove token first reset router//記得清空localstorage。remove item( ;許可 ).localstorage.removeitem;姓名和名稱。;)local storage . remove item( ;角色 )local storage . remove item( ;阿凡達 )提交( 重置狀態(tài) )resolve })。貓ch(error = { reject(error)} })},//移除令牌resettoken({ commit }){ return new promise(resolve = { remove token//必須先移除令牌//記得清除local storage . remove item( ;許可 )local storage . remove item( ;姓名和名稱。;)local storage . remove item( ;角色 )local storage . remove item( ;阿凡達 ).提交( 重置狀態(tài) )resolve} } export default {namespac: true,state,mutations,actions}這樣刷新后vuex中的值依然存在~
2.頁面刷新后,動態(tài)路由無法跳轉(zhuǎn)到/。一方面,頁面刷新后對應的vuex的值失效,另一方面,即使該值仍然有效,但是在addroutes動態(tài)添加路由之前,從靜態(tài)找到頁面,導致一直跳轉(zhuǎn)到404。解決方案:路線可以存儲在localstorage中。因為之前已經(jīng)持久化了角色,所以可以在路由預保護中直接處理刷新情況。主要思想是在路由中加入動態(tài)路由表后,404路由也是動態(tài)加入的!需要注意的是,多次調(diào)用router.addroutes方重復添加路由,并警告路由名重復,可以重新打包一個方法。將router/index.js中的addroutes方法重新打包//解決路由名重復的問題。$ add routes = params = { router . match: router.options.routes//key代碼})。matcherrouter . add routes(params);};刪除*查找404 { path : ;* ,redirect : ;/404 ;,hidden: true}在路由器/index.js的靜態(tài)路由中在rc/permission.js中,刷新情況在router.before each (async (to,from,next) = { //啟動進度條nprogress.start //設置頁面標題document . title = get page title(to . meta . title)//判斷用戶是否已經(jīng)登錄const hastoken = gettokenif(hastoken){ if(to . path = = = ;/登錄 ){ //如果登錄了,下一步重定向到首頁({ path : ;/ ;}) nprogress。done} else {//添加routes后第一次訪問添加的路由時,屏幕會是空白的,因為剛添加routes//后就立即訪問添加的路由,但是此時添加routes的執(zhí)行還沒有結(jié)束,所以可以 找不到新添加的路由,導致屏幕空白。所以你需要再次訪問路線。//此時將使用next ({… to,replac: true })來確保在添加路由時,已經(jīng)完全加載了動態(tài)添加的路由。//replac: true in next({…to,replac: true })只是一個設置信息,告訴vue在這個操作之后,你可以 t通過瀏覽器的后退按鈕返回到以前的路線。//通過getinfo判斷用戶是否獲得了權(quán)限角色const has roles = store . getters . roles store . getters . roles . length 0;if (hasroles) {//如果正在刷新if (store。狀態(tài)。許可。路線。length = = 0){//生成可訪問的路由const accessroutes = await store。派遣( 許可/生成路線。;,存儲。getters.roles)根據(jù)角色;//動態(tài)添加路由路由器呃。$ add routes(acc: ;* 、redirect: ;/404 ;,hidd:真})console . log(router . options . routes)下一個({...對,replac:真});} else { next} } else { try {//get userinfo//注意:角色必須是數(shù)組形式,比如[ ;行政及管理。;]或者,[ ;開發(fā)商 ,編輯 ] const {roles} = awaitstore。派遣( 用戶/getinfo ;)//根據(jù)角色生成可訪問的路由const access routes = awaitstore。派遣( 許可/生成路線。;,角色);//動態(tài)添加路由路由器。$ add routes(acc: ;* 、redirect: ;/404 ;,hidd:為真})//確保addroutes已完成//將其設置為真,以便導航不會留下歷史記錄({...對,replac:是真的});} catch (error) { //刪除令牌并轉(zhuǎn)到登錄頁面to重新登錄等待store.dispatch。;用戶/重置令牌 )message . error(error | | ;有錯誤 )下一個(`/登錄?redirect = $ { to . path } `)n progress . done} } } else {/*沒有標記*/ if (whitelist.indexof(to.path)!== -1) { //在免費登錄白名單中,直接進入next } else { //其他沒有訪問權(quán)限的頁面被重定向到登錄頁面。下一個(`/登錄?重定向= $ {到。path }`) nprogress。done} })it ;在這里刷新沒有問題?。〗Y(jié)束了。
標簽:
路由頁面
了解更多vue-admin-模板權(quán)限管理相關(guān)內(nèi)容請關(guān)注本站點。