动态路由权限

动态路由权限 - 升级版

第一步:创建权限文件permission.js

import router from './router'
import store from './store'
import { Message } from 'element-ui'
import NProgress from 'nprogress' // progress bar
import 'nprogress/nprogress.css' // progress bar style

NProgress.configure({ showSpinner: false }) // NProgress Configuration

const whiteList = ['/login'] // 路由白名单

router.beforeEach(async (to, from, next) => {
  // start progress bar
  NProgress.start()

  //获取登录时存到本地的token
  const hasToken = localStorage.getItem("token")
  if (to.query.token && hasToken != to.query.token) {
    let param = {
      token: to.query.token
    }
    // vuex自定义清空缓存数据
    // store.dispatch('user/resetToken').then(() => {
    //   store.dispatch('user/setToken', param).then(() => {
    //     next({
    //       ...to,
    //       replace: true
    //     })
    //    })
    //  })
  }
  // determine whether the user has logged in
  let watermarkDiv = document.getElementById("vue-watermark")
  if (hasToken) {
    if (store.getters.isLock && to.path !== '/lockScreen' && to.path !== '/login') {
      next({
        path: '/lockScreen'
      })
      NProgress.done()
    } else if (to.path === '/login') {
      // if is logged in, redirect to the home page
      next({
        path: '/'
      })
      NProgress.done()
    } else {
      // 判断vuex中是否存在菜单列表
      const hasMenu = store.getters.menuList && store.getters.menuList.length > 0   
      if (hasMenu) {
        next()
      } else {
        try {
          // get user info
          let res = await store.dispatch('user/getInfo')
          //  获取路由  中间添加这一步 是为了动态添加一些不需要后台返回的,在前端配置的,可配置的路由,比如404页面,在generateRoutes中合并后台返回的和前端配置的
          const accessRoutes = await store.dispatch('permission/generateRoutes', res)
          //  动态添加路由
          router.addRoutes(accessRoutes)
          next({
            ...to,
            replace: true  //确保导航不会留下历史记录
          })
        } catch (error) {
          // 清空缓存 并跳转登录
          await store.dispatch('user/resetToken')
          if (error && typeof (error) == 'string') Message.error(error || 'Has Error')
          next(`/login?redirect=${to.path}`)
          NProgress.done()
        }
      }
    }
  } else {
    //  没有token 单在白名单中
    if (whiteList.indexOf(to.path) !== -1) {
      // in the free login whitelist, go directly
      next()
      NProgress.done()
    } else {
      next(`/login?redirect=${to.path}`)
      NProgress.done()
    }
  }
})

router.afterEach(() => {
  // finish progress bar
  NProgress.done()
})

第二步 在main.js中引入

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue项目中实现动态路由权限配置的思路如下: 1. 首先,与后台进行沟通,获取路由表的数据。可以与后台约定一个接口,后台将需要展示的路由信息返回给前端。 2. 在前端的路由配置文件中,引入Vuex,并将路由表数据存储在Vuex的state中。这样可以在全局范围内访问到路由表数据。 3. 在Vue的根实例中,通过router.beforeEach()方法进行路由守卫的配置。在每次路由切换前,判断用户是否有权限访问该路由。可以通过对比用户的权限信息和路由表中定义的权限要求来判断。 4. 如果用户有权限访问该路由,则继续进行路由跳转。如果没有权限,则进行相应的处理,比如跳转到一个没有权限的页面或者给出提示信息。 下面是一个示例的代码: 1. 在store/index.js文件中,定义一个router模块,用来存储路由表数据。 ```javascript import Vue from 'vue' import Vuex from 'vuex' import router from './router/index.js' Vue.use(Vuex) export default new Vuex.Store({ state: { // 存储路由表数据 routerTable: [] }, mutations: { // 更新路由表数据 updateRouterTable(state, routerTable) { state.routerTable = routerTable } }, actions: {}, modules: { router } }) ``` 2. 在登录成功后,将路由表数据保存到Vuex的state中。 3. 在main.js文件中,配置router.beforeEach()方法。 ```javascript router.beforeEach((to, from, next) => { // 获取当前用户的权限信息 const userPermissions = store.state.user.permissions // 判断用户是否有权限访问该路由 const hasPermission = userPermissions.includes(to.meta.permission) if (hasPermission) { // 如果有权限,继续路由跳转 next() } else { // 没有权限,进行相应的处理 next('/403') // 跳转到没有权限的页面 } }) ``` 需要注意的是,动态路由权限配置的具体实现方式会因项目而异。以上是一个基本的思路和示例,你可以根据自己的项目需求进行相应的调整和扩展。<span class="em">1</span><span class="em">2</span><span class="em">3</span><span class="em">4</span>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值