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