欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

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

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

router.addRoutes

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

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

第一步

創(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: '首頁'
  }, {
    path : '/404',
   component:notFind,
    meta : {
      title : '404未找到',
    }
  }
]
//實例化vue的時候只掛載constantRouter
export default new Router({
  routes: constantRouterMap
});

//異步掛載的路由
//動態(tài)需要根據(jù)權(quán)限加載的路由表
export const asyncRouterMap = [
  {
    path: '/role',
    component: demo,
    name: '權(quán)限測試',
    meta: { role: ['admin','super_editor'] }, //頁面需要的權(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(() => { // 生成可訪問的路由表
            console.log(store.getters.addRouters);
            router.addRoutes(store.getters.addRouters) // 動態(tài)添加可訪問路由表
            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)限的時候,說明所有可訪問路由已生成 如訪問沒權(quán)限的全面會自動進入404頁面
      }
    }
  } else {
    next('/login'); // 否則全部重定向到登錄頁
  }
});

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

總結(jié)

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

相關(guān)文章

  • vue實現(xiàn)豎屏滾動公告效果

    vue實現(xiàn)豎屏滾動公告效果

    這篇文章主要為大家詳細(xì)介紹了vue實現(xiàn)豎屏滾動公告效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • Vue中使用fetch讀取本地txt文件的技術(shù)實現(xiàn)

    Vue中使用fetch讀取本地txt文件的技術(shù)實現(xiàn)

    在Vue.js應(yīng)用開發(fā)中,有時我們需要從本地讀取文本文件(如 .txt 文件)并將其內(nèi)容展示在頁面上,這種需求在處理配置文件、日志文件或靜態(tài)數(shù)據(jù)時非常常見,本文將詳細(xì)介紹如何在Vue中使用 fetch API 讀取本地 .txt 文件,并提供多個示例和使用技巧
    2024-10-10
  • VUE +Element 實現(xiàn)多個字段值拼接功能

    VUE +Element 實現(xiàn)多個字段值拼接功能

    這篇文章主要介紹了VUE +Element 實現(xiàn)多個字段值拼接,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-04-04
  • Vue中使用pdf.js實現(xiàn)PDF文檔展示功能實例

    Vue中使用pdf.js實現(xiàn)PDF文檔展示功能實例

    最近做項目遇到在線預(yù)覽和下載pdf文件,試了多種pdf插件,例如jquery.media.js(ie無法直接瀏覽),最后選擇了pdf.js插件,這篇文章主要介紹了Vue中使用pdf.js實現(xiàn)PDF文檔展示功能的相關(guān)資料,需要的朋友可以參考下
    2025-04-04
  • vue.js  父向子組件傳參的實例代碼

    vue.js 父向子組件傳參的實例代碼

    這篇文章主要介紹了vue.js 父向子組件傳參的實例代碼,需要的朋友可以參考下
    2017-10-10
  • 關(guān)于Vue的?Vuex的4個輔助函數(shù)

    關(guān)于Vue的?Vuex的4個輔助函數(shù)

    這篇文章主要介紹了關(guān)于Vue的?Vuex的4個輔助函數(shù),輔助函數(shù)的好處就是幫助我們簡化了獲取store中state、getter、mutation和action,下面我們一起來看看文章具體的舉例說明吧,需要的小伙伴也可以參考一下
    2021-12-12
  • vue購物車插件編寫代碼

    vue購物車插件編寫代碼

    這篇文章主要為大家詳細(xì)介紹了vue購物車插件的編寫代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • Vue2項目配置@指向src路徑方式

    Vue2項目配置@指向src路徑方式

    這篇文章主要介紹了Vue2項目配置@指向src路徑方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • Vue中使用vue-count-to(數(shù)字滾動插件)詳細(xì)教程

    Vue中使用vue-count-to(數(shù)字滾動插件)詳細(xì)教程

    這篇文章主要給大家介紹了關(guān)于Vue中使用vue-count-to(數(shù)字滾動插件)的相關(guān)資料,最近需要開發(fā)一個數(shù)字滾動效果,在網(wǎng)上找到一個關(guān)于vue-countTo的插件,覺得這個插件還不錯,需要的朋友可以參考下
    2023-09-09
  • 解決在vue項目中webpack打包后字體不生效的問題

    解決在vue項目中webpack打包后字體不生效的問題

    今天小編就為大家分享一篇解決在vue項目中webpack打包后字體不生效的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-09-09

最新評論