<strike id="g3zqm"></strike>

      <cite id="g3zqm"></cite>

        <tr id="g3zqm"><center id="g3zqm"></center></tr>
        <pre id="g3zqm"><sup id="g3zqm"></sup></pre>
        <li id="g3zqm"></li>
      1. 少妇高潮激情一区二区三,免费av深夜在线观看,亚洲狼人久久伊人久久伊,久久精品人人做人人爽电影蜜月,黄色特级片一区二区三区,欧美日韩在线亚洲二区综二,极品少妇无套内射视频,日本极品少妇videossexhd

        根據(jù)用戶權(quán)限不同,動(dòng)態(tài)生成路由導(dǎo)航菜單(一)

        2019-12-27    seo達(dá)人

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

        缺點(diǎn):



        vue初始化的時(shí)候需要掛載全部路由,對(duì)性能有影響

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

        動(dòng)態(tài)路由則是根據(jù)用戶信息獲取權(quán)限,簡單來說就是根據(jù)用戶信息獲取其對(duì)應(yīng)的權(quán)限,生成對(duì)應(yīng)的路由掛載,然后動(dòng)態(tài)渲染有權(quán)限的菜單于側(cè)邊欄



        實(shí)現(xiàn)

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

        用戶登錄后,拿到用戶token,調(diào)接口拿到動(dòng)態(tài)路由權(quán)限D(zhuǎn)ynamicRoutes,將DynamicRoutes和定義的動(dòng)態(tài)路由比較,篩選出相應(yīng)的用戶可訪問路由表

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

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

        // beforeEach中

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

          // 權(quán)限判斷

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

            / 獲取后臺(tái)給的權(quán)限數(shù)組 /

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

              getPermissionList().then(response => {

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

                  const userRouter = response.data.data

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

                  const DynamicRoutes = ChecAndSetPermissionRouter(userRouter)

                  // 默認(rèn)使/重定向到第一個(gè)有效的路由

                  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

                  /
        生成左側(cè)導(dǎo)航菜單 /

                  store.dispatch('SetMenuPermissions', DynamicRoutes)



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

                  router.addRoutes(DynamicRoutes)



                  // /
        完整的路由表 /

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

                  next(to)

                }

              }).catch(error => {

                router.push('/404')

                // /
        生成左側(cè)導(dǎo)航菜單 */

                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)路由中會(huì)怎么樣?

        放在靜態(tài)路由里,后面的所以頁面都會(huì)被攔截到404,所以應(yīng)該獲取動(dòng)態(tài)路由權(quán)限之后push

        Q:權(quán)限獲取成功,不跳轉(zhuǎn)新生成的動(dòng)態(tài)路由,跳404?

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

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

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



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



        // DynamicRoutes是權(quán)限路由

        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,遇到二級(jí)菜單children為空的權(quán)限,報(bào)錯(cuò)如下:

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



        // 更改后如下,return {}

        data() {

            this.onlyOneChild = null

            return {}

        }



        附:ChecAndSetPermissionRouter



        import { dynamicRouterMap } from '@/router'



        export function ChecAndSetPermissionRouter(permissionDatas) {

          // 獲取到權(quán)限hashmap

          var permissionHashMap = null

          permissionHashMap = GetPermissionHashMap(permissionDatas)

          // 標(biāo)記路由表

          var newDynamicRouterMap = []

          newDynamicRouterMap = objDeepCopy(dynamicRouterMap)

          newDynamicRouterMap.forEach(item => {

            MarkRouter(null, item, permissionHashMap)

          })

          // 重設(shè)路由表

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

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

              i-- // 注意:防止移除后索引錯(cuò)位

            }

          }

          return newDynamicRouterMap

        }

        function GetPermissionHashMap(permissionDatas) {

          var permissionHashMap = {}

          permissionDatas.forEach(item => {

            SetKeyValueOfNodes(null, item, permissionHashMap)

          })

          return Object.assign({}, permissionHashMap)

        }



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

        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

        }



        // 為權(quán)限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é)點(diǎn)賦值

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

            c.children.forEach(item => {

              SetKeyValueOfNodes(c, item, permissionHashMap)

            })

          }

        }



        // 標(biāo)記路由表

        function MarkRouter(p, c, permissionHashMap) {

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

          // 使用拼接的key作為參考標(biāo)記去匹配有權(quán)限的路由表

          if (HasPermission(key, permissionHashMap)) {

            if (p != null) {

              p.keep = true // 保留當(dāng)前節(jié)點(diǎn)

            }

            if (c != null) {

              c.keep = true

            }

          }

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

            c.children.forEach(item => {

              MarkRouter(c, item, permissionHashMap)

            })

          }

        }



        // 校驗(yàn)后端接口是否存在當(dāng)前節(jié)點(diǎn)

        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-- // 注意:防止移除后索引錯(cuò)位

              }

            }

          }

          return false

        }




        日歷

        鏈接

        個(gè)人資料

        存檔

        主站蜘蛛池模板: 国产欧美成人不卡视频| 人妻综合另类精品| 免费A级毛片无码A∨蜜芽试看 | 九九国产在线| 国产精品久线在线播放| 精品少妇爆乳无码aⅴ区| 超碰成人人人做人人爽| 亚洲人妻av伦理| 久久久国产免费影院| 国产国语对白露脸正在播放| 亚洲精品456在在线播放| 超级碰碰人妻中文字幕| 国产丰满绿帽一区二区三区| 成年网站免费视频A在线双飞| A男人的天堂久久A毛片| 97大香| 免费h动漫无码网站| 狠狠躁日日躁夜夜躁欧美老妇| 久久国产精品精品国产色婷婷| 影音先锋天堂网| 无码人妻精品一区二区不卡| 亚洲精品av一二三区无码| 亚洲精品综合| 国产精品成人AV片免费看| 亚洲 小说区 图片区 都市| 青青草原亚洲| 欧美黑人XXXX性高清版| 久久久久久久久18禁秘| 国产精品被熟女| 人妻二区三区| 国产精品毛片久久久久久l| 欧美xxxxhd高清| 男人添女人囗交做爰视频| 国产内射视频国产内射| 精品亚洲欧美高清不卡高清| 国产日韩精品一区二区在线观看播放 | 国产成人精品一区二区三在线观看| 日韩在线一区二区每天更新| 免费又爽又大又高潮视频| 国产美女裸体无遮挡免费视频下载 | 51妺嘿嘿午夜福利|