嫩草影院久久99_老司机午夜网站国内精品久久久久久久久_久久夜色精品国产_国产一级做a爰片久久毛片

根據(jù)用戶權限不同,動態(tài)生成路由導航菜單(一)

2019-12-27    seo達人

首先讓我們了解一下前端路由:路由router全部配置在前端,根據(jù)用戶權限判斷可以進入哪些頁面

缺點:



vue初始化的時候需要掛載全部路由,對性能有影響

安全性低,用戶可以在地址欄跳轉到無權訪問的頁面(可優(yōu)化)

動態(tài)路由則是根據(jù)用戶信息獲取權限,簡單來說就是根據(jù)用戶信息獲取其對應的權限,生成對應的路由掛載,然后動態(tài)渲染有權限的菜單于側邊欄



實現(xiàn)

定義靜態(tài)路由(登錄或者公用頁面)、動態(tài)路由,vue初始化時只掛載靜態(tài)路由

用戶登錄后,拿到用戶token,調(diào)接口拿到動態(tài)路由權限DynamicRoutes,將DynamicRoutes和定義的動態(tài)路由比較,篩選出相應的用戶可訪問路由表

執(zhí)行router.addRoutes(DynamicRoutes)添加動態(tài)路由

使用vuex存儲路由表,根據(jù)vuex中可訪問的路由渲染側邊欄sidebar

// beforeEach中

if (getToken() && getToken() !== 'undefined') {

  // 權限判斷

  if (!store.state.app.menuPermissions) {

    / 獲取后臺給的權限數(shù)組 /

    return new Promise((resolve, reject) => {

      getPermissionList().then(response => {

        if (response.data.stat === 1) {

          const userRouter = response.data.data

          // 檢查并生成新的路由表

          const DynamicRoutes = ChecAndSetPermissionRouter(userRouter)

          // 默認使/重定向到第一個有效的路由

          for (let i = 0, leni = DynamicRoutes.length; i < leni; i++) {

            if (DynamicRoutes[i].children.length > 0) {

              DynamicRoutes[i].path = '/'

              DynamicRoutes[i].redirect = DynamicRoutes[i].children[0].path

              break

            }

          }

          DynamicRoutes.push({ path: '', redirect: '/404', hidden: true }) // 全局404

          /
生成左側導航菜單 /

          store.dispatch('SetMenuPermissions', DynamicRoutes)



          /
  動態(tài)添加路由 /

          router.addRoutes(DynamicRoutes)



          // /
完整的路由表 /

          store.dispatch('SetRouterPemissions', [...constantRouterMap, ...DynamicRoutes])

          next(to)

        }

      }).catch(error => {

        router.push('/404')

        // /
生成左側導航菜單 */

        store.dispatch('SetMenuPermissions', [])

        next()

        reject(error)

      })

    })

  }

  if (to.path === '/login') {

    next({ path: '/' })

  } else {

    next()

  }

} else {

  if (whiteList.indexOf(to.path) !== -1) {

    next()

  } else {

    next(/login?redirect=${to.path}) // 否則全部重定向到登錄頁

  }

}



踩坑來了





Q:為什么404 頁面一定要最后加載,放置在靜態(tài)路由中會怎么樣?

放在靜態(tài)路由里,后面的所以頁面都會被攔截到404,所以應該獲取動態(tài)路由權限之后push

Q:權限獲取成功,不跳轉新生成的動態(tài)路由,跳404?

beforeEach中router.addRoutes之后的next()可能會失效,因為可能next()的時候路由并沒有完全add完成,可替換成next(to),重新進入router.beforeEach這個鉤子,這時候再通過next()來釋放鉤子,就能確保所有的路由都已經(jīng)掛在完成了。

Q:$router.addRoutes()動態(tài)添加的路由怎么刪除掉?

在開發(fā)中,有新增編輯刪除菜單并要求左側邊欄菜單及時更新的需求,如果直接addRoutes,warn如下:



解決:addRoutes之前要清除掉上次addRoutes的路由,所以操作菜單調(diào)取權限后重新初始化router,進行matcher賦值



// DynamicRoutes是權限路由

const createRouter = () => new Router({

  mode: 'hash',

  routes: []

})

const newRouter = createRouter()

// resetRouter()

this.$router.matcher = newRouter.matcher

this.$router.addRoutes(DynamicRoutes)



Q:莫名其妙的無限循環(huán)

vue-admin-template,遇到二級菜單children為空的權限,報錯如下:

解決:按照github-issues上方法,在SidebarItem.vue里改一下data就好了(沒想通為啥)



// 更改后如下,return {}

data() {

    this.onlyOneChild = null

    return {}

}



附:ChecAndSetPermissionRouter



import { dynamicRouterMap } from '@/router'



export function ChecAndSetPermissionRouter(permissionDatas) {

  // 獲取到權限hashmap

  var permissionHashMap = null

  permissionHashMap = GetPermissionHashMap(permissionDatas)

  // 標記路由表

  var newDynamicRouterMap = []

  newDynamicRouterMap = objDeepCopy(dynamicRouterMap)

  newDynamicRouterMap.forEach(item => {

    MarkRouter(null, item, permissionHashMap)

  })

  // 重設路由表

  for (let i = 0; i < newDynamicRouterMap.length; i++) {

    if (ResetRouter(newDynamicRouterMap, newDynamicRouterMap[i])) {

      i-- // 注意:防止移除后索引錯位

    }

  }

  return newDynamicRouterMap

}

function GetPermissionHashMap(permissionDatas) {

  var permissionHashMap = {}

  permissionDatas.forEach(item => {

    SetKeyValueOfNodes(null, item, permissionHashMap)

  })

  return Object.assign({}, permissionHashMap)

}



// 深拷貝,遞歸重新設置前端路由表,避免數(shù)據(jù)復用

function objDeepCopy(source) {

  var sourceCopy = source instanceof Array ? [] : {}

  for (var item in source) {

    sourceCopy[item] = typeof source[item] === 'object' ? objDeepCopy(source[item]) : source[item]

  }

  return sourceCopy

}



// 為權限hashmap的屬性賦值,新增屬性tempKey/tempKey2

function SetKeyValueOfNodes(p, c, permissionHashMap) {

  // 需要匹配的組合類型

  var tempKey = (p ? p.name : 0) + '' + c.name

  var tempKey2 = c.name + '
' + c.name

  // 賦值

  permissionHashMap[tempKey] = 1

  permissionHashMap[tempKey2] = 1

  // 遞歸遍歷子節(jié)點賦值

  if (c.children != null && c.children.length > 0) {

    c.children.forEach(item => {

      SetKeyValueOfNodes(c, item, permissionHashMap)

    })

  }

}



// 標記路由表

function MarkRouter(p, c, permissionHashMap) {

  var key = (p ? p.meta.title : 0) + '_' + c.meta.title

  // 使用拼接的key作為參考標記去匹配有權限的路由表

  if (HasPermission(key, permissionHashMap)) {

    if (p != null) {

      p.keep = true // 保留當前節(jié)點

    }

    if (c != null) {

      c.keep = true

    }

  }

  if (c.children && c.children.length > 0) {

    c.children.forEach(item => {

      MarkRouter(c, item, permissionHashMap)

    })

  }

}



// 校驗后端接口是否存在當前節(jié)點

function HasPermission(key, permissionHashMap) {

  return permissionHashMap[key] === 1

}



// 重置路由表

function ResetRouter(p, c) {

  if (c == null) {

    return false

  }

  if (p.children && !c.keep) {

    p.children.splice(p.children.indexOf(c), 1)

    return true

  } else if (!c.keep) {

    p.splice(p.indexOf(c), 1)

    return true

  }

  if (c.children && c.children.length > 0) {

    for (let i = 0; i < c.children.length; i++) {

      if (ResetRouter(c, c.children[i])) {

        i-- // 注意:防止移除后索引錯位

      }

    }

  }

  return false

}




日歷

鏈接

個人資料

藍藍設計的小編 http://m.sdgs6788.com

存檔

嫩草影院久久99_老司机午夜网站国内精品久久久久久久久_久久夜色精品国产_国产一级做a爰片久久毛片
<em id="09ttv"></em>
    <sup id="09ttv"><pre id="09ttv"></pre></sup>
    <dd id="09ttv"></dd>

        • 亚洲国产精品久久久| 国内久久婷婷综合| 99视频一区二区| 欧美成人一区二区三区| 久久精彩免费视频| 久久久国产一区二区三区| 久久精品视频网| 免费久久精品视频| 欧美电影免费观看大全| 欧美日本亚洲韩国国产| 国产精品九九| 亚洲乱码国产乱码精品精可以看| 日韩午夜视频在线观看| 在线视频欧美一区| 欧美一级午夜免费电影| 免费中文字幕日韩欧美| 欧美偷拍另类| 精品成人一区二区三区| 在线视频欧美日韩| 欧美专区在线观看| 欧美激情久久久久| 一区二区三区四区国产| 久久精品99国产精品日本| 欧美精品尤物在线| 国产自产v一区二区三区c| 亚洲伦伦在线| 久久免费午夜影院| 日韩视频在线观看国产| 久久福利资源站| 国产精品xxx在线观看www| 在线电影欧美日韩一区二区私密| 在线性视频日韩欧美| 老司机亚洲精品| 亚洲一区二区免费视频| 欧美肥婆在线| 激情欧美日韩| 欧美在线观看一区二区| 亚洲国产毛片完整版 | 在线观看视频一区| 亚洲嫩草精品久久| 欧美激情一区二区三区在线视频| 亚洲欧美日韩精品久久奇米色影视| 男人的天堂亚洲| 激情综合色丁香一区二区| 午夜视频一区二区| 亚洲久久在线| 欧美夫妇交换俱乐部在线观看| 国产午夜精品福利| 亚洲欧美国内爽妇网| 亚洲精品欧美极品| 欧美va亚洲va日韩∨a综合色| 国产一区二区三区久久| 午夜亚洲影视| 亚洲一区精品电影| 国产精品乱码一区二区三区| aa成人免费视频| 91久久久国产精品| 你懂的亚洲视频| 91久久精品一区二区别| 米奇777在线欧美播放| 欧美中日韩免费视频| 国产视频欧美视频| 久久精品毛片| 久久aⅴ乱码一区二区三区| 国产日韩欧美综合精品| 羞羞漫画18久久大片| 亚洲免费在线电影| 久久本道综合色狠狠五月| 国产精品久久77777| 亚洲影院高清在线| 亚洲午夜电影| 国产欧美精品xxxx另类| 久久国产精品高清| 午夜日韩在线观看| 国产一区二区三区日韩欧美| 久久先锋资源| 欧美不卡激情三级在线观看| 亚洲精品视频在线| 日韩系列欧美系列| 国产精品久久波多野结衣| 亚洲一区在线免费观看| 亚洲欧美日本另类| 一区二区在线视频播放| 亚洲高清一二三区| 欧美午夜一区| 久久久久9999亚洲精品| 免费成人黄色av| 中文国产成人精品| 午夜激情一区| 亚洲精品久久7777| 亚洲一区二区三区免费视频| 国模精品一区二区三区色天香| 牛牛精品成人免费视频| 欧美人成在线| 久久午夜激情| 欧美四级电影网站| 久热re这里精品视频在线6| 欧美精彩视频一区二区三区| 午夜欧美大片免费观看| 玖玖玖免费嫩草在线影院一区| av成人黄色| 久久精品国产2020观看福利| 一本色道久久综合狠狠躁篇怎么玩 | 最新亚洲视频| 亚洲综合第一| 亚洲人体1000| 欧美一级黄色录像| 在线一区视频| 蜜桃精品一区二区三区| 欧美淫片网站| 欧美日韩中文字幕| 每日更新成人在线视频| 国产精品日韩一区| 亚洲精品美女91| 在线成人av| 性欧美8khd高清极品| 亚洲网站在线观看| 老色鬼精品视频在线观看播放| 午夜精品视频| 欧美日韩一区国产| 亚洲国产精品高清久久久| 国产亚洲第一区| 一本久道久久久| 日韩写真在线| 欧美福利视频网站| 亚洲人精品午夜| 久久久999成人| 久久成人精品视频| 国产精品嫩草影院一区二区| 亚洲精品中文字幕有码专区| 亚洲福利视频在线| 久久亚洲精品一区| 免费久久精品视频| 一区精品在线| 久久久久久久网站| 美女999久久久精品视频| 国产一区二区在线观看免费播放 | 亚洲影院污污.| 亚洲男人的天堂在线aⅴ视频| 欧美日韩一区二区在线观看视频| 亚洲人线精品午夜| 亚洲免费福利视频| 欧美日韩播放| 一本久久综合亚洲鲁鲁五月天| 一本一本大道香蕉久在线精品| 欧美激情片在线观看| 亚洲精品视频一区| 亚洲一区二区久久| 国产精品亚洲一区| 欧美一区二区三区另类 | 99视频一区二区| 亚洲欧美成人网| 国产欧美综合在线| 小处雏高清一区二区三区 | 亚洲午夜女主播在线直播| 欧美精品一区三区| 在线视频精品一区| 午夜精品一区二区三区在线播放| 国产精品视频免费在线观看| 欧美一区二区在线| 欧美成人精品三级在线观看| 99国产精品私拍| 国产免费观看久久| 久久久久久久欧美精品| 亚洲精品视频在线观看网站| 午夜精品久久久久久99热| 国产综合激情| 欧美激情网友自拍| 性欧美大战久久久久久久免费观看| 美女主播视频一区| 亚洲视频在线观看一区| 国语自产精品视频在线看一大j8 | 狠狠久久五月精品中文字幕| 欧美aⅴ99久久黑人专区| 亚洲桃色在线一区| 欧美激情视频一区二区三区免费| 亚洲一区二区三区高清| 一区在线影院| 国产精品看片资源| 欧美成人亚洲| 欧美一区二区黄| 日韩一级成人av| 巨胸喷奶水www久久久免费动漫| 一级成人国产| 亚洲福利视频免费观看| 国产欧美精品一区| 欧美理论大片| 老司机免费视频一区二区三区| 久久国产毛片| 亚洲精品一区二区三区四区高清| 国产精品乱码| 欧美日韩国产123区| 久久婷婷麻豆| 香港久久久电影| 亚洲无线视频| 99riav1国产精品视频| 欧美成人精品在线视频| 欧美一级午夜免费电影| 一本一本a久久| 亚洲人成在线播放|