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

vue-router動(dòng)態(tài)路由實(shí)現(xiàn)前端權(quán)限管理方式

 更新時(shí)間:2023年10月21日 10:26:07   作者:風(fēng)灬雲(yún)  
這篇文章主要介紹了vue-router動(dòng)態(tài)路由實(shí)現(xiàn)前端權(quán)限管理方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

vue-router動(dòng)態(tài)路由實(shí)現(xiàn)前端權(quán)限管理

抱著試試水的心態(tài)出去面試了兩家公司;

其中一家公司面試的時(shí)候多次問(wèn)到了vue-router的動(dòng)態(tài)路由實(shí)現(xiàn)權(quán)限管理的問(wèn)題;

回來(lái)后我就仔細(xì)研究了一下

router.addRoutes

動(dòng)態(tài)路由是基于vue-router 新增的router.addRoutes方法來(lái)實(shí)現(xiàn)的;

也就是為了達(dá)到當(dāng)用戶登錄之后通過(guò)判斷用的權(quán)限來(lái)覺(jué)得前端哪些頁(yè)面能展示,哪些不能展示;

第一步

創(chuàng)建vue-router

router/index.js內(nèi)容

import Vue from 'vue'
import Router from 'vue-router'
import HelloWorld from '@/components/HelloWorld'
import demo from '@/components/role'
import  notFind from '@/components/404'
Vue.use(Router);
//不需要權(quán)限的路由
export const constantRouterMap = [
  {
    path: '/',
    component: HelloWorld,
    name: '首頁(yè)'
  }, {
    path : '/404',
   component:notFind,
    meta : {
      title : '404未找到',
    }
  }
]
//實(shí)例化vue的時(shí)候只掛載constantRouter
export default new Router({
  routes: constantRouterMap
});

//異步掛載的路由
//動(dòng)態(tài)需要根據(jù)權(quán)限加載的路由表
export const asyncRouterMap = [
  {
    path: '/role',
    component: demo,
    name: '權(quán)限測(cè)試',
    meta: { role: ['admin','super_editor'] }, //頁(yè)面需要的權(quán)限
  },{
    path : '*',
    redirect : '/404'
  }
];

第二步

在入口函數(shù)中判斷用戶權(quán)限并添加路由

// The Vue build version to load with the `import` command
// (runtime-only or standalone) has been set in webpack.base.conf with an alias.
import Vue from 'vue'
import App from './App'
import router from './router'
import { asyncRouterMap, constantRouterMap } from './router';
import Vuex from "Vuex"
import VueDND from 'awe-dnd'
import BaiduMap from 'vue-baidu-map'
Vue.use(Vuex)
function hasPermission(roles, route) {
  if (route.meta && route.meta.role) {
    console.log(roles);
    return roles.some(role => route.meta.role.indexOf(role) >= 0)
  } else {
    return true
  }
}
const store = new Vuex.Store({
  state: {
    count: 0,
    token:"asdsd",
    roles:"",
    routers:[],
    addRouters:[]
  },
  getters:{
    token(){
      return "asdsd"
    },
    roles(state ){
      return state.roles
    },
    addRouters(state){
      return state.addRouters
    },
    routers(state){
      return state.routers
    }
  },
  actions:{
    GetInfo({state}){
      return {
        data:{
          role:state.roles=["admin"]
        }
      }
    },
    GenerateRoutes({ commit }, data){
      return new Promise(resolve => {
        const { roles } = data;
        console.log(asyncRouterMap,roles);
        const accessedRouters = asyncRouterMap.filter(v => {
          if (roles.indexOf('admin') >= 0) return true;
          if (hasPermission(roles, v)) {
            if (v.children && v.children.length > 0) {
              v.children = v.children.filter(child => {
                if (hasPermission(roles, child)) {
                  return child
                }
                return false;
              });
              return v
            } else {
              return v
            }
          }
          return false;
        });
        console.log(accessedRouters);
        commit('SET_ROUTERS', accessedRouters);
        resolve();
      })
    }
  },
  mutations: {
    SET_ROUTERS: (state, routers) => {
      console.log(routers);
      state.addRouters = routers;
      state.routers = constantRouterMap.concat(routers);
    }
  }
});
router.beforeEach((to, from, next) => {
  if (store.getters.token) { // 判斷是否有token
    if (to.path === '/login') {
      next({ path: '/' });
    } else {
      if (store.getters.roles.length === 0) { // 判斷當(dāng)前用戶是否已拉取完user_info信息
        store.dispatch('GetInfo').then(res => { // 拉取info
          const roles = res.data.role;
          store.dispatch('GenerateRoutes', { roles }).then(() => { // 生成可訪問(wèn)的路由表
            console.log(store.getters.addRouters);
            router.addRoutes(store.getters.addRouters) // 動(dòng)態(tài)添加可訪問(wèn)路由表
            next({ ...to, replace: true }) // hack方法 確保addRoutes已完成 ,set the replace: true so the navigation will not leave a history record
          })
        }).catch(err => {
          console.log(err);
        });
      } else {
        next() //當(dāng)有用戶權(quán)限的時(shí)候,說(shuō)明所有可訪問(wèn)路由已生成 如訪問(wèn)沒(méi)權(quán)限的全面會(huì)自動(dòng)進(jìn)入404頁(yè)面
      }
    }
  } else {
    next('/login'); // 否則全部重定向到登錄頁(yè)
  }
});

這樣的話,就算用戶權(quán)限不夠,也不會(huì)看到那些頁(yè)面的靜態(tài)資源;而是直接顯示自己編輯的404頁(yè)面

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 淺談Vant-list?上拉加載及下拉刷新的問(wèn)題

    淺談Vant-list?上拉加載及下拉刷新的問(wèn)題

    這篇文章主要介紹了淺談Vant-list?上拉加載及下拉刷新的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-04-04
  • Vue組件與Vue cli腳手架安裝方法超詳細(xì)講解

    Vue組件與Vue cli腳手架安裝方法超詳細(xì)講解

    CLI是一個(gè)全局安裝的npm包,提供了終端里的vue命令。它可以通過(guò)vue create快速搭建一個(gè)新項(xiàng)目,或者直接通過(guò)vue serve構(gòu)建新想法的原型。你也可以通過(guò)vue ui通過(guò)一套圖形化界面管理你的所有項(xiàng)目
    2022-11-11
  • vue?iview?導(dǎo)航高亮動(dòng)態(tài)設(shè)置方式

    vue?iview?導(dǎo)航高亮動(dòng)態(tài)設(shè)置方式

    這篇文章主要介紹了vue?iview?導(dǎo)航高亮動(dòng)態(tài)設(shè)置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • vue3.0公共組件自動(dòng)導(dǎo)入的方法實(shí)例

    vue3.0公共組件自動(dòng)導(dǎo)入的方法實(shí)例

    這篇文章主要給大家介紹了關(guān)于vue3.0公共組件自動(dòng)導(dǎo)入的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • vue router點(diǎn)擊打開(kāi)新的標(biāo)簽頁(yè)的方法(最新推薦)

    vue router點(diǎn)擊打開(kāi)新的標(biāo)簽頁(yè)的方法(最新推薦)

    vue router點(diǎn)擊打開(kāi)新的標(biāo)簽頁(yè)的方法,只需要在router-link中加入target="_blank"即可在新的頁(yè)面打開(kāi)標(biāo)簽,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2023-10-10
  • el-popover如何通過(guò)js手動(dòng)控制彈出框顯示、隱藏

    el-popover如何通過(guò)js手動(dòng)控制彈出框顯示、隱藏

    最近項(xiàng)目中多次用到了Popover彈出框,下面這篇文章主要給大家介紹了關(guān)于el-popover如何通過(guò)js手動(dòng)控制彈出框顯示、隱藏的相關(guān)資料,需要的朋友可以參考下
    2023-12-12
  • vue中如何解除數(shù)據(jù)之間的雙向綁定

    vue中如何解除數(shù)據(jù)之間的雙向綁定

    這篇文章主要介紹了vue中如何解除數(shù)據(jù)之間的雙向綁定,具有很好的參考價(jià)值,希望對(duì)
    2022-09-09
  • vue.js事件處理器是什么

    vue.js事件處理器是什么

    什么是vue.js事件處理器?這篇文章主要介紹了vue.js事件處理器的相關(guān)資料
    2017-03-03
  • vue3開(kāi)啟攝像頭并進(jìn)行拍照的實(shí)現(xiàn)示例

    vue3開(kāi)啟攝像頭并進(jìn)行拍照的實(shí)現(xiàn)示例

    本文主要介紹了vue3開(kāi)啟攝像頭并進(jìn)行拍照的實(shí)現(xiàn)示例,主要是使用navigator.mediaDevices.getUserMedia這個(gè)API來(lái)實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-01-01
  • Vue項(xiàng)目刷新后h5樣式失效的原因及解決方案

    Vue項(xiàng)目刷新后h5樣式失效的原因及解決方案

    今天遇到一個(gè)bug,有一個(gè)Element的message組件,用它做的一個(gè)進(jìn)度條,它是寫(xiě)在一個(gè)頁(yè)面上,并且是用js控制dom元素的,web端一切正常,但是,H5頁(yè)面刷新的時(shí)候它樣式加載不出來(lái)了,所以本文主要介紹了Vue項(xiàng)目刷新后h5樣式失效的原因及解決方案,需要的朋友可以參考下
    2024-10-10

最新評(píng)論

沈阳市| 宁陕县| 衡阳县| 顺义区| 油尖旺区| 于都县| 台安县| 温州市| 鲁山县| 海南省| 德江县| 永靖县| 无极县| 紫云| 浑源县| 册亨县| 盐津县| 拉孜县| 清涧县| 黎平县| 资阳市| 新化县| 南川市| 通海县| 塔河县| 金坛市| 海门市| 东方市| 收藏| 横山县| 响水县| 繁峙县| 丹寨县| 旅游| 金湖县| 柳江县| 岳西县| 宁远县| 和顺县| 剑川县| 沂南县|