92国产精品视频_亚洲a级在线观看_国产精品电影观看_国产精品免费观看在线_精品伊人久久97_亚洲人成在线观_尤物九九久久国产精品的特点_成人激情在线播放_成人黄色大片在线免费观看_亚洲成人精品久久久_久久免费视频在线观看_久久精品国产一区_国产一区二区三区18_亚洲欧美中文字幕在线一区_日韩美女中文字幕_日韩视频免费在线

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

2019-12-27    seo達人

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

缺點:



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

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

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



實現

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

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

執行router.addRoutes(DynamicRoutes)添加動態路由

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

// beforeEach中

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

  // 權限判斷

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

    / 獲取后臺給的權限數組 /

    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)



          /
  動態添加路由 /

          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 頁面一定要最后加載,放置在靜態路由中會怎么樣?

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

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

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

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

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



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



// DynamicRoutes是權限路由

const createRouter = () => new Router({

  mode: 'hash',

  routes: []

})

const newRouter = createRouter()

// resetRouter()

this.$router.matcher = newRouter.matcher

this.$router.addRoutes(DynamicRoutes)



Q:莫名其妙的無限循環

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)

}



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

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

  // 遞歸遍歷子節點賦值

  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 // 保留當前節點

    }

    if (c != null) {

      c.keep = true

    }

  }

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

    c.children.forEach(item => {

      MarkRouter(c, item, permissionHashMap)

    })

  }

}



// 校驗后端接口是否存在當前節點

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://www.skdbbs.com

存檔

92国产精品视频_亚洲a级在线观看_国产精品电影观看_国产精品免费观看在线_精品伊人久久97_亚洲人成在线观_尤物九九久久国产精品的特点_成人激情在线播放_成人黄色大片在线免费观看_亚洲成人精品久久久_久久免费视频在线观看_久久精品国产一区_国产一区二区三区18_亚洲欧美中文字幕在线一区_日韩美女中文字幕_日韩视频免费在线
高清在线视频日韩欧美| 中文字幕视频一区二区在线有码| 狠狠躁夜夜躁人人爽超碰91| 色诱女教师一区二区三区| 国产精品久久久久久久久久久久久| 日韩中文字幕视频在线| 成人激情黄色网| 欧美有码在线视频| 久久久久久亚洲精品不卡| 欧美午夜视频在线观看| 国产精品成人免费电影| 国产精品狼人色视频一区| 亚洲精品v欧美精品v日韩精品| 久精品免费视频| 日韩欧亚中文在线| 日本高清视频精品| 亚洲aⅴ男人的天堂在线观看| 国产精品视频久久久| 中文字幕欧美日韩va免费视频| 亚洲一区二区久久久久久| 国产成人精品国内自产拍免费看| 国产精品揄拍500视频| 亚洲第一天堂av| 国产91精品青草社区| 中文字幕精品影院| 成人黄色大片在线免费观看| 久久艳片www.17c.com| 草民午夜欧美限制a级福利片| 亚洲精品在线观看www| 欧洲成人在线视频| 久久久久亚洲精品国产| 成人97在线观看视频| 91成人在线视频| 亚洲jizzjizz日本少妇| 欧美一区在线直播| 一本一本久久a久久精品综合小说| 97色在线观看免费视频| 日韩欧美在线视频日韩欧美在线视频| 日韩欧美在线一区| 91情侣偷在线精品国产| xxxx欧美18另类的高清| 欧洲日本亚洲国产区| 欧美日韩国产色| 国产精品美女主播| 国产成人精品久久| 日韩动漫免费观看电视剧高清| 久久久久久91香蕉国产| 日韩美女激情视频| 亚洲欧洲日韩国产| 北条麻妃99精品青青久久| 亚洲精品aⅴ中文字幕乱码| 97色在线视频| 色噜噜久久综合伊人一本| 91精品免费看| 国产精品专区h在线观看| 欧美大胆在线视频| 91人成网站www| 久久精品久久久久| 亚洲美女喷白浆| 91沈先生作品| 久久99久久亚洲国产| 91最新在线免费观看| 国产一区二区三区在线免费观看| 欧美激情第一页xxx| 亚洲一区二区久久久久久久| 久久成人这里只有精品| 国产精品日日摸夜夜添夜夜av| 久久这里有精品视频| 国外成人免费在线播放| 91久久夜色精品国产网站| 久久91精品国产91久久久| 久久精品国产清自在天天线| 亚洲女性裸体视频| 久久久欧美一区二区| 亚洲综合成人婷婷小说| 色视频www在线播放国产成人| 日韩女在线观看| 亚洲欧美中文字幕在线一区| 在线日韩第一页| 色悠久久久久综合先锋影音下载| 精品久久久一区二区| 日韩电影大全免费观看2023年上| 亚洲女人天堂视频| 久久精品国产成人| 精品日本美女福利在线观看| 91在线视频免费| 亚洲成人国产精品| 中文字幕精品一区久久久久| 亚洲精品之草原avav久久| 国产午夜精品理论片a级探花| 日韩高清av一区二区三区| 久久久久久亚洲精品| 日韩美女主播视频| 美女福利精品视频| 国产91色在线|| 亚洲男人第一av网站| 国产精品啪视频| 国产在线观看不卡| 在线观看国产欧美| 97久久精品国产| 亚洲精品国产欧美| 亚洲最大成人网色| 成人情趣片在线观看免费| 日韩在线视频网站| 日韩精品视频在线观看网址| 国产精品白丝av嫩草影院| 亚洲最大的av网站| 国产精品久久久久久中文字| 久久精品电影网站| 欧美极品在线视频| 一本色道久久88亚洲综合88| 久久久国产一区二区三区| 亚洲第一页中文字幕| 欧美在线性视频| 成人黄色av网| 九九综合九九综合| 日本欧美爱爱爱| 欧美黑人狂野猛交老妇| 亚洲国产成人91精品| 都市激情亚洲色图| 国产精品小说在线| 亚洲影院色无极综合| 欧美性xxxx极品hd满灌| 国产日韩欧美一二三区| 国产精品高潮呻吟久久av无限| 久久久人成影片一区二区三区观看| 日韩av在线影视| 精品美女久久久久久免费| 精品国产视频在线| 欧美福利视频在线观看| 国产国语刺激对白av不卡| 2021国产精品视频| 最好看的2019年中文视频| 亚洲第一区在线观看| 欧美午夜性色大片在线观看| 一区二区三区亚洲| 亚洲区中文字幕| 黑人巨大精品欧美一区二区三区| 精品av在线播放| 久久久99久久精品女同性| 成人网在线免费观看| 国产ts人妖一区二区三区| 97久久超碰福利国产精品…| 成人国产亚洲精品a区天堂华泰| 亚洲人在线视频| 国产精品久久久久高潮| 日韩h在线观看| 亚洲欧美中文另类| 久99久在线视频| 操人视频在线观看欧美| 国产精品影片在线观看| 欧美一区第一页| 色悠悠久久88| 久久久久亚洲精品成人网小说| 欧美专区在线播放| 亚洲第一精品电影| 日韩在线观看免费高清完整版| 日韩中文在线中文网在线观看| 欧美日韩免费观看中文| 日韩成人网免费视频| 欧美激情在线一区| 国产午夜精品一区理论片飘花| 日韩男女性生活视频| 成人a视频在线观看|