亚洲女同成aV人片在线观看|亚洲www啪成人一区二区麻豆|亚洲国产中日韩精品综合|亚洲国产成人精品一级片|亚洲无码在线视频免费

天津九安特機電工程有限公司

口碑營(yíng)銷(xiāo)

Vue 簡(jiǎn)單實(shí)現前端權限控制的示例

這篇(╬?益?)文章主要介紹了Vue 簡(jiǎn)單實(shí)現前端權限控制的單實(shí)端權示例,文中通過(guò)示例代碼介紹的現前限控非常詳細,對大家的示例學(xué)習或者工作具有一定的參考學(xué)習價(jià)值,需要的單實(shí)(shi)端權朋友們下面隨著(zhù)小編來(lái)一起學(xué)習學(xué)習吧

簡(jiǎn)要說(shuō)明

最近寫(xiě)了一下vue控制權限(菜單、路由)的現前限控項目,??用了vuex、示??例addRoutes動(dòng)態(tài)添加路由方法等(deng),單實(shí)端權總共100多行代碼,現前限控跟大家分享一下~

邏輯梳理

除登錄接口、示例退出接口外,單實(shí)端權其余接口增加token驗證?,F前限控

打開(kāi)頁(yè)面時(shí)請求獲取(qu)菜單接口,示例請求不成功說(shuō)明未登錄,單實(shí)端權給route默認添加login頁(yè)面以及 * 重定向?,F(xian)前限控

登錄成功后獲取到token,示例把token存入session以及請求頭。

登錄成功后獲取菜單接口,請求回來(lái)的路由和vuex里面全部的路(lu)由進(jìn)行匹配,獲取component。

把獲取完component的路由格式化,找自己(′▽?zhuān)?的paren(′_ゝ`)tId,如果找到的話(huà)插入到該元素的child┐(′д`)┌里面。

思路大致就是這樣,有聽(tīng)??得模糊的也不要(╯°□°)╯緊,跟隨我的步伐看看代碼是怎樣寫(xiě)的你就明白了~

實(shí)現

1.初始化

route.js

i??mport Vue from 'vue'
import Rouヽ(′?`)ノter from 'vue-route(′▽?zhuān)?r'
import store from '@/store'

Vue.use(Router)
const router = new Router()
//(′;д;`) 全局前置守衛
router.beforeEach( async (to, from, next) => {
let userRoutes = store.state.global.userRoutes //userRoutes 當前用戶(hù)擁有的權限
if (userRoutes.length && !userRoutes.filter(item => item.path == to.path).length) {
next(from.path)
return
}
next()
})
export default? router

大家可以看到route.js里沒(méi)有路由,因為(′ω`*)路由都是動(dòng)態(tài)添加進(jìn)去的,只有一個(gè)全局守衛,作用是當登陸成功后,用戶(hù)地址欄手動(dòng)輸入地址,判斷路由是否正確,如果正確就讓他跳轉。

vuex

//state.js
ex???port default {
// 全部路由(you)
allRoutes: [
//登錄頁(yè)面
{
path: '/demo',
name: 'demo',
component: () =&g??t; im??port('@/vie(?_?;)ws/demo')
},
{
path: '*',
redirect: '/demo'
},
//主頁(yè)面
{
path: '/',
component: () => import('@/views'),
},
{
path: '/home',
name: 'home',
compo???nent: () =&g??t; import('@/views/home')
}
],
// 用戶(hù)匹配的路由,要用addRoutes添加到route
userRoutes: [],
// 渲染用戶(hù)菜單
userMenus: []
}

state中需要定義全部的路由,這個(gè)用來(lái)跟后臺請求到的權限進(jìn)行匹配,并且獲取component組件??。

actions.js里面是主要的邏輯,其中g(shù)etMenu方法是本文的核心

數據返回時(shí)格式
menu = [
{ id: 1, name: '首頁(yè)', path??: '/home', parentId: 0},
{ id: 2, nam( ?ω?)e: '系統設置', path: '', parentId: 0},
{ id: 3, name:(◎_◎;) '角色配置',?? path: '/roles', parentId: 2},
{ id: 4, name: '用戶(hù)配置', path: '/users', parentId: 2}
]
需要處理成
menu = [
{ id: 1, nam??e: '首頁(yè)', path: '/home', parentId: 0},
{ id: 2, name: '系統設置', path: '', parent(?????)Id: 0,
child: [
{ id: 3, name: '角色配置', path: '/roles', parentId: 2},
{ id: 4, name: '用戶(hù)配置', path: '/users', parentId: 2}
]
},
]

所以在下方需要用到遞歸來(lái)處理

//action??s.js

// 獲取當前用戶(hù)權限??
getMen??u: async ({ state, commit, dispatch }) => {
//請求當前用戶(hù)所擁有的權限
let result = aw(′?_?`)ait axios('/api/men???u/find')
if (result.data.code > 0) {
let use??rRou??tes = result.data.result
userRoute??s.for??Each(item => {
item.child = []
state.??allRoutes.forEach(res => {
if (item.path == res.path) {
item.component = res.component
}
})
})
let oneArr = [], anotherArr = [] //oneArr 一級路由?? anotherArr 其他級別路由
oneArr = userRoutes.filte??r(item => !item.parentId)
anotherArr = use??rRoutes.filter(item => item.parentId)
anotherArr.forE??ach(it???em => {
oneArr.forEach(obj => {
if (item.parentId == obj.id) { //如果匹配 說(shuō)明找到父級,直接push到父級的ch(′?_?`)ild里面
if (!obj.child.filtヽ(′ー`)ノer(k =>(???) k.id == item.id).length) {
obj.child.push(item)
}
} el┐(′ー`)┌se(′▽?zhuān)?) { //如果沒(méi)有,說(shuō)明本級路由沒(méi)有找到,去下一級別路由找父級 路由級別:1級路由,2級路由,ヽ(′?`)ノ3級路由......
dispa┐(′?`)┌tch('recurrArr', { arr: oneArr, items: item})
}
})
})
commit('setState', { state: 'userRoutes', value: userRoutes})
commit('setStat??e', { state: 'userMenus', value: oneArr})
retur(′_`)n?? { code: 1, data: userR(′ω`)outes} //處理完成后返回 oneArr是遞歸處理后嵌套的,??userRoutes是獲取到component來(lái)渲染route的
} else {
re???turn { code: 0}
}
},
// 遞歸找自己的parentId
recurrArr: ({ dispatch}, { arr, items}) => {
if (!arr) {
return
}
for(let i = 0; i < arr.length; i ++ ){
let item = arr[i]
if (item.id == items.parentId) {
if (!item.child.filter(k => items.id == k.id).length) {
item.child.push(items)
}
break;
} el??se {
dispatch('recurrArr', { arr: it(?Д?)em.child, items: items})
}
}
}

到現在為止,路由以及菜單的數據,就已經(jīng)處理完了,剩下的就是addRoutes添加到route路由里面,這樣頁(yè)面就可以??跳轉了~

我們接著(zhù)來(lái)看登錄:

// 登錄
login: async ({ commit,( ?ω?) dispatch}, params) => {
let result = await axio┐(′ー`)┌s('/api/login', { params})
if(result.data.code > 0) {
// 登錄成功以后 獲取當前用戶(hù)權限路由
let userRoutes = await dispatch('getMenu')
if?? (userRoute??s.code > 0) {
// 把請求回來(lái)的路由動(dòng)態(tài)添加到 route 里
rou(???)ter.addRoutes(userRoutes.data)
// 添加完成后,現在可以(′▽?zhuān)?跳??轉到首??頁(yè)了~
router.push('/home')
}
return { code: 1, data: result.data}
} else {
console.log(result.data.msg)
return { code: 0}
}
},

但是

現在還差最后一步,退出登錄

因為在axios攔截里面,token失效后會(huì )調用退出接口

axios(′?_?`).int(?⊿?)erceptors.response.use(
respon???se => {
if (response.status === 200) {
// 身份驗證失敗
if(response??.data.code === -1) {
// 執行退出登錄
store.dispatch('global??/loginOut')
} else {
// 如果請求頭里有??token
let token = response.headers.token
if(token) {
localStorage.setItem('token', token)
axios.defaults.headers.token = token
}
}
return Promise.resolve(response)
} else {
return Promise.reject(??-)?(response)
}
}
)

所以才會(huì )提到開(kāi)頭說(shuō):剛打開(kāi)頁(yè)面的時(shí)候,不管有沒(méi)有登錄,都去請求菜單接口。

如果沒(méi)有登錄,則會(huì )調用退出登??錄接口,給路(lu)由設置默認路由。

// 退出登錄
loginOut: async ({ state }) => {
// 退出登錄清空 token 和 headers 里面的(′ω`) token
localStorage.removeItem('token')
delete axios.defaults.headers.token
// 退出登錄要動(dòng)態(tài)添加 登錄頁(yè)面 和 * 重定向頁(yè)面
let(//ω//) errRoutes = state.allRoutes.filter(item => item.path == '*')
err??Routes.push(state.allRoutes.filter(res =&ヽ(′ー`)ノgt; errRoutes[0].redirect == res.path)[0]??)
router.addRoutes(errRoutes);
rout??er.currentRoute.path !== '/demoヾ(?■_■)ノ' ? router.push("/demo") : nu(′?_?`)ll

let result = await axios('/api/loginOut', { params: { userId: state.userId}})
if(result.data.code !== 1) {
console.log('退出登錄接口異常')
}
},

到現在為止,有項??目就算大功告成了

到此這篇關(guān)于Vue 簡(jiǎn)單實(shí)現前端權限控制的示例的文章就介紹到這了,更多相關(guān)Vu(′▽?zhuān)?e 前端權(╬?益?)限控制內容??請搜索腳本之家以前的文章或繼續瀏覽下面的相關(guān)文章希ヽ(′ー`)ノ望大家以后多多支持腳本之家!

來(lái)源:(╬?益?)腳本之家

鏈接??:https://www.jb51.net/article/20ヽ(′▽?zhuān)?/2890.htm

亚洲女同成aV人片在线观看|亚洲www啪成人一区二区麻豆|亚洲国产中日韩精品综合|亚洲国产成人精品一级片|亚洲无码在线视频免费 汶川县| 丹阳市| 屯昌县| 通山县| 海林市| 铜川市| 砀山县| 马龙县| 扬中市| 普格县| 翼城县| 公安县| 东丽区| 平舆县| 定边县| 乾安县| 开封县| 龙陵县| 石景山区| 新建县| 安陆市| 三亚市| 马关县| 鹤庆县| 普安县| 宁明县| 江门市| 开封县| 宁远县| 荣成市| 三门县| 固安县| 静海县| 马尔康县| 宜阳县| 阿拉善左旗| 宜春市| 和平区| 铜川市| 新干县| 措勤县| http://444 http://444 http://444 http://444 http://444 http://444