美文网首页
记一次vue动态路由以及菜单权限的实现思路

记一次vue动态路由以及菜单权限的实现思路

作者: 我背井离乡了好多年 | 来源:发表于2021-07-23 10:26 被阅读0次

一、思路
1.首先是平级菜单,靠parentId来区分层级,每个菜单也有自己的id.
2.系统中存在角色管理模块,每个角色下都有自己所持有的菜单id.
3.用户登录成功后端返回角色,用户靠角色id去查这个角色下绑定的菜单id。
4.获取所有菜单,拿着当前角色所持有的菜单id,过滤得到可以拥有的菜单。再一递归,组织成树,存到本地待命。我强调一下,
这个菜单是拿给addRoutes用的哦,相当于还是原材料,这里我称为原材料菜单。
5.总之,在路由跳转之前,也就是router.beforeEach钩子内,得把原材料菜单处理好存在本地。跳转路由的钩子内,判断下有没有
原材料菜单,如果没有给它跳转到登录页面。有原材料菜单就取出来调用 router.addRoutes组成路由。有组织好的路由就调用next()放行。

二、关键代码截图
1.addRoutes的使用,在入口文件main.js中挂载路由权限文件。以下代码出自我的权限文件。

image.png
import router from "./index"
import store from "../store/index"

let _importRouter = require("@/router/_importRouterFile")
// 添加白名单
const whiteRouter = ['/login', '/dynamicRouter']
// 定义路由对象 这个文件这个位置只在mian.js中只会执行一次
let currentRouterArr


// 路由守卫
// 这个钩子是每次跳转路由都会执行
// 每次跳转都需要判断有没有组织好路由(currentRouterArr),指不定哪一次就被清除掉
router.beforeEach((to, from, next) => {
  // currentRouterArr只要没被赋值都是undefined
  if (localStorage.getItem("token")) {
    if (to.path === '/login') {
      localStorage.removeItem("token")
      localStorage.removeItem("personInfo")
      localStorage.removeItem("currentRouter")
      store.commit("login/SET_TOKEN", '')
      store.commit("login/SET_PERSONINFO", '')
      store.commit("login/SET_CURRENTROUTER", '')
      next()
    } else {
      // ================S==========================
      if (!currentRouterArr) {
        // 楼上是有无组织过路由的标识
        let localStorageRouter = localStorage.getItem("currentRouter") ? JSON.parse(localStorage.getItem("currentRouter")) : ''
        if (!localStorageRouter) {
          next('/login')
        } else {
          // 登录时组织好了的,现在为了把组件中的文件加上去
          localStorageRouter = localStorage.getItem("currentRouter") ? JSON.parse(localStorage.getItem("currentRouter")) : ''
          // 打个标识,标明我拼接好了路由
          currentRouterArr = JSON.parse(JSON.stringify(localStorageRouter))
          changeRouterFile(localStorageRouter)
          router.addRoutes(localStorageRouter)
          next({...to, replace: true})
        }
      } else {
        // 未在白名单之内的唯一放行路线
        next()
      }
      // ================E==========================
      // 不需要拼接动态路由时放开
      // next()
    }
  } else {
    if (whiteRouter.indexOf(to.path) !== -1) {
      next()
    } else {
      next('/login')
    }
  }
})

let changeRouterFile = router => {
  router.forEach(item => {
    if (item.component) {
      // "./layout/ModuleCommonPage.vue" 需要将组件中的./去掉,载入文件需要
      item.component = item.component.substr(2, item.component.length)
      item.component = _importRouter(item.component)
    }
    item.children && item.children.length > 0 && changeRouterFile(item.children)
  })
}

三、疑问
1、我可能会问为什么是把原材料菜单存到本地呢?
因为防止用户刷新浏览器路原材料菜单不在了啊。一旦不在了,就只能在登录的时候跑登录接口才能获取了。另外,用户一跳转到登录页或者手动点击退出,我都把本地缓存中的原材料菜单给他清除掉。
2、为什么是在登录之后跳转之前获取原材料菜单呢?
因为什么时候需要路由,登录页我是直接放出来的,登录之后我知道你是谁了就立马需要路由了。所以选择这个时候。不然,也没有其他时候适合了。

四、补充说明token
http是无状态的,每个客户端来请求,我不知道你是谁。为了知道客户端是谁,客户端得带上一个唯一标识token。
客户端拿到token也给存本地,一旦token没了,就强制退出登录。客户端的每个请求都会在请求头携带token,服务器接到请求首先判断有没有token,没有就不给你返回数据。有就解析token,知道你是谁就给你返回对应的数据。

相关文章

  • 记一次vue动态路由以及菜单权限的实现思路

    一、思路1.首先是平级菜单,靠parentId来区分层级,每个菜单也有自己的id.2.系统中存在角色管理模块,每个...

  • Vue addRoute实现动态权限路由菜单

    背景 最近项目需要添加页面权限,根据不同权限的用户显示不同的页面 思路 登录成功之后将后端返回的页面数据处理成自己...

  • element十 权限设计

    什么是权限管理根据不同用户,返回不同菜单严格控制用户权限实现思路动态路由后端返回的数据格式要求触发时机登陆成功的时...

  • 04-15动态路由的实现与优化

    Vue中后台鉴权的另一种思路 - 动态路由的实现与优化 鉴权-前端路由 VS 鉴权-动态路由 前端路由鉴权相信只要...

  • vue实现动态路由权限

    要做动态路由权限,首先要更改这个文件"\src\layout\components\Sidebar\index.v...

  • vue权限控制

    在SPA(单页面应用)中,前端需要根据用户的权限来控制用户菜单以及路由表,vue-router提供了几个路由生命周...

  • VUE 动态菜单及视图权限

    动态菜单 这几天在做VUE的动态菜单及权限,参考了下: https://segmentfault.com/a/11...

  • vue基于d2-admin的RBAC权限管理解决方案2019-0

    前两篇关于vue权限路由文章的填坑,说了一堆理论,是时候操作一波了。 vue权限路由实现方式总结 vue权限路由实...

  • vue 动态路由/路由权限 解决方案

    路由权限思路: 1.菜单栏/导航栏(一级权限)在登录成功后,获取后端的权限数据, 根据权限数据,展示对应的路由导航...

  • 用addRoutes实现动态路由

    原文地址前端路上,转载请注明出处 之前在基于Vue实现后台系统权限控制一文中提到路由权限的实现思路,因为不喜欢在每...

网友评论

      本文标题:记一次vue动态路由以及菜单权限的实现思路

      本文链接:https://www.haomeiwen.com/subject/szpumltx.html