最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Vue實(shí)現(xiàn)兩種路由權(quán)限控制方式

 更新時(shí)間:2021年10月29日 09:01:02   作者:草垛垛吖  
路由權(quán)限控制常用于后臺(tái)管理系統(tǒng)中,對(duì)不同業(yè)務(wù)人員能夠訪問(wèn)的頁(yè)面進(jìn)行一個(gè)權(quán)限的限制。本文主要介紹了兩種Vue 路由權(quán)限控制,具有一定的參考價(jià)值,感興趣的可以了解一下

路由權(quán)限控制常用于后臺(tái)管理系統(tǒng)中,對(duì)不同業(yè)務(wù)人員能夠訪問(wèn)的頁(yè)面進(jìn)行一個(gè)權(quán)限的限制。

對(duì)于無(wú)權(quán)限的頁(yè)面可以跳轉(zhuǎn)404頁(yè)面或者提示無(wú)權(quán)限。

方式一:路由元信息(meta)

把所有頁(yè)面都放在路由表中,只需要在訪問(wèn)的時(shí)候判斷一下角色權(quán)限即可。
vue-router 在構(gòu)建路由時(shí)提供了元信息 meta 配置接口,我們可以在元信息中添加路由對(duì)應(yīng)的權(quán)限,然后在路由守衛(wèi)中檢查相關(guān)權(quán)限,控制其路由跳轉(zhuǎn)。

在 meta 屬性里,將能訪問(wèn)該路由的角色添加到 roles 里。用戶每次登陸后,將用戶的角色返回。然后在訪問(wèn)頁(yè)面時(shí),把路由的 meta 屬性和用戶的角色進(jìn)行對(duì)比,如果用戶的角色在路由的 roles 里,那就是能訪問(wèn),如果不在就拒絕訪問(wèn)。

示例一:通過(guò)roles判斷

const myRouter = new VueRouter({
 routes: [{
        path: '/login',
        name: 'login',
        meta: {
         roles: ['admin', 'user']
        },
        component: () => import('@/components/Login')
    },{
        path: '/home',
        name: 'home',
        meta: {
            roles: ['admin']
        },
        component: () => import('@/views/Home')
    },{
     path: '/404',
     component: () => import('@/components/404')
   }]
})

//假設(shè)通過(guò)接口從后臺(tái)獲取的用戶角色,可以存儲(chǔ)在token中
const role = 'user'

myRouter.beforeEach((to,from,next)=>{
 if(to.meta.roles.includes(role)){
  next() //放行
 }else{
  next({path:"/404"}) //跳到404頁(yè)面
 }
})

示例二:在需要加權(quán)限的meta中加標(biāo)識(shí)

const myRouter = new VueRouter({
 routes: [{
        path: '/login',
        name: 'login',
        meta: {
         title: '登錄頁(yè)'
         icon: 'login'
        },
        component: () => import('@/components/Login')
    },{
        path: '/home',
        name: 'home',
        meta: {
         title: '首頁(yè)'
         icon: 'home',
         requireAuth: true
        },
        component: () => import('@/views/Home')
    },{
     path: '/404',
     component: () => import('@/components/404')
   }]
})

myRouter.beforeEach((to,from,next)=>{
 let flag = to.matched.some(record=>record.meta.requireAuth);
 //這里使用matched循環(huán)查找不直接使用to.meta的原因:
 //當(dāng)存在子路由的情況時(shí),首先明確按正常點(diǎn)擊邏輯來(lái)說(shuō)是先走一級(jí)路由再進(jìn)二級(jí)路由的,對(duì)于權(quán)限的判斷也必然是這樣
 //to.meta => 會(huì)直接搜索子路由的meta,如果一級(jí)路由沒(méi)有添加requireAuth:true, 則在一級(jí)路由頁(yè)面也本就應(yīng)該被攔截?zé)o法進(jìn)入二級(jí)路由頁(yè)面了;如果用戶直接篡改url地址欄的話,則可以進(jìn)入二級(jí)頁(yè)面,權(quán)限可能會(huì)出現(xiàn)問(wèn)題。則應(yīng)該給該權(quán)限下面的路由都添加標(biāo)記
 //to.matched => matched是一個(gè)路由數(shù)組,會(huì)將所有路由包括子路由的屬性集合起來(lái),所以通過(guò)循環(huán)判斷查找的方式,只需要給一級(jí)路由添加權(quán)限標(biāo)識(shí)即可權(quán)限他下面的其他子路由。
 if(flag){
  next()
 }else{
  next({path:"/404"})
 }
})

缺點(diǎn): 每次路由跳轉(zhuǎn)都要做一遍校驗(yàn)是對(duì)計(jì)算資源的浪費(fèi),另外對(duì)于用戶無(wú)權(quán)訪問(wèn)的路由,理論上就不應(yīng)該掛載。

方式二:動(dòng)態(tài)生成路由表(addRoutes)

根據(jù)用戶權(quán)限或者是用戶屬性去動(dòng)態(tài)的添加菜單和路由表,可以實(shí)現(xiàn)對(duì)用戶的功能進(jìn)行定制。
vue-router 提供了 addRoutes() 方法,可以動(dòng)態(tài)注冊(cè)路由,需要注意的是,動(dòng)態(tài)添加路由是在路由表中 push 路由,由于路由是按順序匹配的,因此需要將諸如404頁(yè)面這樣的路由放在動(dòng)態(tài)添加的最后。

// store.js
// 將需要?jiǎng)討B(tài)注冊(cè)的路由提取到vuex中
const dynamicRoutes = [
  {
    path: '/manage',
    name: 'Manage',
    meta: {
      requireAuth: true
    },
    component: () => import('./views/Manage')
  },
  {
    path: '/userCenter',
    name: 'UserCenter',
    meta: {
      requireAuth: true
    },
    component: () => import('./views/UserCenter')
  }
]

在 vuex 中添加 userRoutes 數(shù)組用于存儲(chǔ)用戶的定制菜單。在 setUserInfo 中根據(jù)后端返回的菜單生成用戶的路由表。

// store.js
setUserInfo (state, userInfo) {
  state.userInfo = userInfo
  state.auth = true // 獲取到用戶信息的同時(shí)將auth標(biāo)記為true,當(dāng)然也可以直接判斷userInfo
  // 生成用戶路由表
  state.userRoutes = dynamicRoutes.filter(route => {
    return userInfo.menus.some(menu => menu.name === route.name)
  })
  router.addRoutes(state.userRoutes) // 注冊(cè)路由
}

修改菜單渲染

// App.vue
<div id="nav">
   <router-link to="/">主頁(yè)</router-link>
   <router-link to="/login">登錄</router-link>
   <template v-for="(menu, index) of $store.state.userInfo.menus">
     <router-link :to="{ name: menu.name }" :key="index">{{menu.title}}</router-link>
   </template>
</div>

到此這篇關(guān)于Vue實(shí)現(xiàn)兩種路由權(quán)限控制方式的文章就介紹到這了,更多相關(guān)Vue 路由權(quán)限控制內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Vue實(shí)現(xiàn)插槽下渲染dom字符串的使用

    Vue實(shí)現(xiàn)插槽下渲染dom字符串的使用

    本文主要介紹了Vue實(shí)現(xiàn)插槽下渲染dom字符串的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • vue中組件的過(guò)渡動(dòng)畫(huà)及實(shí)現(xiàn)代碼

    vue中組件的過(guò)渡動(dòng)畫(huà)及實(shí)現(xiàn)代碼

    這篇文章主要介紹了vue中組件的過(guò)渡動(dòng)畫(huà),并通過(guò)實(shí)例代碼給大家介紹了過(guò)渡動(dòng)畫(huà)的實(shí)例代碼,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-11-11
  • VUE實(shí)現(xiàn)分布式醫(yī)療掛號(hào)系統(tǒng)預(yù)約掛號(hào)首頁(yè)步驟詳情

    VUE實(shí)現(xiàn)分布式醫(yī)療掛號(hào)系統(tǒng)預(yù)約掛號(hào)首頁(yè)步驟詳情

    這篇文章主要為大家介紹了VUE實(shí)現(xiàn)分布式醫(yī)療掛號(hào)系統(tǒng)預(yù)約掛號(hào)首頁(yè)步驟詳情,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-04-04
  • 詳解Vue學(xué)習(xí)筆記入門(mén)篇之組件的內(nèi)容分發(fā)(slot)

    詳解Vue學(xué)習(xí)筆記入門(mén)篇之組件的內(nèi)容分發(fā)(slot)

    這篇文章主要介紹了詳解Vue學(xué)習(xí)筆記入門(mén)篇之組件的內(nèi)容分發(fā)(slot),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • Vuex的插件vuex-persistedstate數(shù)據(jù)持久化存儲(chǔ)操作

    Vuex的插件vuex-persistedstate數(shù)據(jù)持久化存儲(chǔ)操作

    這篇文章主要介紹了Vuex的插件vuex-persistedstate數(shù)據(jù)持久化存儲(chǔ)操作,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2023-12-12
  • vue3+three.js實(shí)現(xiàn)疫情可視化功能

    vue3+three.js實(shí)現(xiàn)疫情可視化功能

    這篇文章主要介紹了vue3+three.js實(shí)現(xiàn)疫情可視化,本文通過(guò)實(shí)例圖文相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-09-09
  • vue3父子組件傳值?雙向綁定及注意問(wèn)題小結(jié)

    vue3父子組件傳值?雙向綁定及注意問(wèn)題小結(jié)

    這篇文章主要介紹了Vue3中如何通過(guò)v-model實(shí)現(xiàn)父子組件的雙向數(shù)據(jù)綁定及利用computed簡(jiǎn)化父子組件雙向綁定,本文結(jié)合示例代碼給大家講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-12-12
  • vue使用vue-json-viewer展示JSON數(shù)據(jù)的詳細(xì)步驟

    vue使用vue-json-viewer展示JSON數(shù)據(jù)的詳細(xì)步驟

    最近在開(kāi)發(fā)一個(gè)公司的投放管理系統(tǒng)的操作日志模塊,要查看某條操作日志的請(qǐng)求參數(shù),要將請(qǐng)求的參數(shù)以JSON格式的形式展示出來(lái),下面這篇文章主要給大家介紹了vue使用vue-json-viewer展示JSON數(shù)據(jù)的相關(guān)資料,需要的朋友可以參考下
    2022-09-09
  • vue實(shí)現(xiàn)豎屏滾動(dòng)公告效果

    vue實(shí)現(xiàn)豎屏滾動(dòng)公告效果

    這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)豎屏滾動(dòng)公告效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • 關(guān)于element ui中el-cascader的使用方式

    關(guān)于element ui中el-cascader的使用方式

    這篇文章主要介紹了關(guān)于element ui中el-cascader的使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-09-09

最新評(píng)論

华阴市| 祁门县| 黄骅市| 开化县| 大埔区| 万宁市| 陈巴尔虎旗| 天津市| 云梦县| 西吉县| 蚌埠市| 乐业县| 吐鲁番市| 平原县| 台江县| 隆尧县| 孝感市| 平顶山市| 社旗县| 泗阳县| 安图县| 赣州市| 通州市| 海林市| 化德县| 陇西县| 留坝县| 公主岭市| 嘉黎县| 五莲县| 邢台县| 于都县| 涟源市| 新营市| 高青县| 青岛市| 阿图什市| 泉州市| 双峰县| 皋兰县| 仙居县|