vue-router路由权限分发思路记录

// 用于批量获取文件 (引入文件)
const req = require.context('../../assets/icons/svg', false, /\.svg$/)
console.log(req(req.keys()[0]).default) 
// 
var constantRoutes = [
	{
        path: '/login',
        component: (resolve) => require(['@/views/login'], resolve),
        hidden: true
    },
]
export default new Router({
    mode: 'history', // 去掉url中的#
    scrollBehavior: () => ({ y: 0 }), // 路由变化后的滚动条位置
    routes: constantRoutes
})
new Router({
scrollBehavior(to,from,savePosition){ // 在点击浏览器的“前进/后退”,或者切换导航的时候触发。
    console.log(to) // to:要进入的目标路由对象,到哪里去
    console.log(from) // from:离开的路由对象,哪里来
    console.log(savePosition) // savePosition:会记录滚动条的坐标,点击前进/后退的时候记录值{x:?,y:?}
    if(savePosition) {
      return savePosition;
    }else{
      return {x:0,y:0}
    }
})

逻辑描述 通过引入 constantRoutes 暴露给vuex GenerateRoutes主要是负责处理格式的让处理完后的数组添加到vue-router直接可用
之后在用户登录后 调用store中的GenerateRoutes通过将后台返回的数据进行处理然后通过router.addRoutes(‘处理之后的数组’)来实现路由的分发

import { constantRoutes } from '@/router'
import { getRouters } from '@/api/menu'
import Layout from '@/layout/index'

const permission = {
  state: {
    routes: [],
    addRoutes: []
  },
  mutations: {
    SET_ROUTES: (state, routes) => {
      state.addRoutes = routes
      state.routes = constantRoutes.concat(routes)
    }
  },
  actions: {
    // 生成路由
    GenerateRoutes({ commit }) {
      return new Promise(resolve => {
        // 向后端请求路由数据
        getRouters().then(res => {
          const accessedRoutes = filterAsyncRouter(res.data)
          accessedRoutes.push({ path: '*', redirect: '/404', hidden: true })
          commit('SET_ROUTES', accessedRoutes)
          resolve(accessedRoutes)
        })
      })
    }
  }
}

// 遍历后台传来的路由字符串,转换为组件对象
function filterAsyncRouter(asyncRouterMap) {
  return asyncRouterMap.filter(route => {
    if (route.component) {
      // Layout组件特殊处理
      if (route.component === 'Layout') {
        route.component = Layout
      } else {
        route.component = loadView(route.component)
      }
    }
    if (route.children != null && route.children && route.children.length) {
      route.children = filterAsyncRouter(route.children)
    }
    return true
  })
}

export const loadView = (view) => { // 路由懒加载
  return (resolve) =>  require([`@/views/${view}`], resolve)
}

export default permission







store.dispatch('GetInfo').then(res => {
 // 拉取user_info
 const roles = res.roles
 console.log(roles)
 store.dispatch('GenerateRoutes', { roles }).then(accessRoutes => {
 // 测试 默认静态页面
 // store.dispatch('permission/generateRoutes', { roles }).then(accessRoutes => {
   // 根据roles权限生成可访问的路由表
   console.log(accessRoutes,to)
   router.addRoutes(accessRoutes) // 动态添加可访问路由表
   next({ ...to, replace: true }) // hack方法 确保addRoutes已完成
 })
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值