vue权限控制路由(vue-router 动态添加路由)

用户登录后返回权限菜单,前端根据权限菜单动态添加路由,然后再动态生成菜单栏。

    思路如下:

    一、定义初始化默认路由。

二、动态配置路由,这里是把所有组件中相应的路由配置成一个个的对象,根据后台返回的菜单tree一个个去匹配。

三、通过匹配,把匹配好的路由数据addRoutes到路由中。

四、为了防止刷新页面后路由数据被清空,这里用判断是否登录的方式,再次加载动态路由。

具体代码如下:

router.js

import Vue from 'vue'
import {router} from './index'
import login from '@/views/login/login'
import layout from '@/views/layout/layout'
import home from '@/views/home/home.vue'
import depDsStorageList from '@/views/home/homePage1/depDsStorageList.vue'
 
 
// 数据管理
import dataSourceAdmin from '@/views/dataManage/dataSourceAdmin/dataSourceAdmin'
 
//初始化默认路由
export let initMenu = [
  {path: '', redirect: '/login'},
  {
    path: '/login',
    name: 'login',
    component: login
  },
  {
    path: '/haveNoAuthority',
    name: 'haveNoAuthority',
    component: haveNoAuthority
  },
]
 
//动态配置路由
export let menu = {
  "首页": {
    path: '',
    redirect: '/home',
    component: layout,
    children: [
      {
        path: 'home',
        name: '首页',
        component: home,
      }
    ],
  },
  "角色资源管理": {
    path: '',
    redirect: '/roleMenu',
    component: layout,
    children: [
      {
        path: 'roleMenu',
        name: '角色资源管理',
        component: roleMenu
      }
    ],
  }
}
 
export let menuList = []
export const setMenuTree = function (menuTree) {
  let temp = new Vue({router})
  hanleFor(menuTree)
  temp.$router.addRoutes(menuList)
  temp.$router.addRoutes([{path: '*', redirect: '/' + menuList[0].redirect}])
}
 
const hanleFor = function (list){
  for (var i=0; i<list.length; i++) {
    if (list[i].children) {
      hanleFor(list[i].children)
    }else{
      menuList.push(menu[list[i].name])
    }
  }
}
export const routers = {
  router: initMenu
}
 


 
 
index.js

import Vue from 'vue'
import iView from 'iview'
import lodash  from 'lodash'
import VueLodash  from 'vue-lodash'
import Router from 'vue-router'
 
import { routers, menuList, setMenuTree } from './routers';
import 'iview/dist/styles/iview.css'
 
Vue.use(Router);
 
Vue.use(iView);
 
Vue.use(VueLodash, lodash);
 
export const router =  new Router({
  routes: routers.router
})
 
export let getMenuFuc = function (list) {
  setMenuTree(list)
}
 
if (sessionStorage.getItem("role")) {
  getMenuFuc(JSON.parse(sessionStorage.getItem("menuTree")))
}
 
router.beforeEach((to, from, next) => {
  if (!sessionStorage.getItem("role") && to.name !== 'login') {
    next('/login')
  } else {
    next()
  }
})


 
login.vue

<template>
  <div class="jq22-container loginBody" style="padding-top:100px; width: 100%; height: 100%;">
  </div>
</template>
<style>
  @import "./login.css";
</style>
<script src="./loginJs.js"></script>


loginJs.js

import {getMenuFuc} from '../../router/index'
export default {
  methods: {
    handleSubmit () {
      let _this = this
      _this.$refs.loginForm.validate((valid) => {
          _this.$ajax.post(_this.cfg.api.login, _this.form).then(function(res){
            if(res.data.result){
              sessionStorage.setItem("role",roleString)
              let menuTree = res.data.data.menuTree
              sessionStorage.setItem("menuTree",JSON.stringify(menuTree))//用于layout页面加载菜单
 
              let buttonList = res.data.data.buttonList  //存储按钮的权限控制
              sessionStorage.setItem("buttonList",JSON.stringify(buttonList))
              getMenuFuc(menuTree)
              _this.$router.push('home');
          }).catch((error)=>{ _this.spinShow = false});
        }
      });
    },
  }
};


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值