vue 权限菜单

作者: 小菜鸟灬12138 | 来源:发表于2019-07-12 00:36 被阅读211次
当路由和菜单都由后台返回时,菜单和路由的格式根据实际情况和后台商量返回。

整体流程如下
1、在router.js中只存放不需要权限的路由。
2、在login.vue中将请求到的路由和菜单数据存在本地和vuex中。
3、在vuex中处理路由数据,通过addRoute添加

/* 后台返回的路由格式 */
path: [{
  component: 'Home',  /* 因为后台返回的数据是字符串,前端不能使用,这里定好名称前端做匹配 */
  name: 'Home',
  path: '/home',
  children: [{
     component: 'Dome111',
     name: 'Dome111',
     path: '/dome111',
     children: null
  }, {
     component: 'Dome222',
     name: 'Dome222',
     path: '/dome222',
     children: null
  }]
}];
/* 菜单格式自定 */

router.js中只挂载不需要权限的路由

import Vue from 'vue';
import Router from 'vue-router';

Vue.use(Router);

const routes = [{
    path: '/login',
    name: 'login',
    component: require('@/components/login/login')
  }, {
      path: '*',
      name: '404',
      component: require('@/components/404/404')
  }]
export default new Router({
  routes
});

在login组件中发送请求,将获取到的数据分别存到localStorage和vuex中;

/*login.vue*/
import { mapActions } from 'vuex'
methods: {
 ...mapActions(['add_Routes']),
 login({
   name: 'admin',
   password: '******'
 }).then(res => {
  if(res.code == 200) {
    /*将获取到的菜单数据和路由数据存起来*/
    localStorage.setItem('token', res.data.token);
    localStorage.setItem('menu', JSON.stringify(res.data.menu));
    localStorage.setItem('routes', JSON.stringify(res.data.routes));
    /*调用vuex,传入数据*/
    this.add_Routes(res.data.path);
   }
 })
}

在vuex中创建 store/modules/addRouter.js, 用以addRoute添加路由

import router from '../../router/index.js'; /* 引入路由表 */
import Menufilter from './menufilter'; /* 用来处理后台传过来的component字段 */

const mutations = {
  ADD_ROUTES(state, addRouter) {
    let routes = [];
    Menufilter(routes, addRouter);
    router.addRoutes(routes);
    router.push('/home');
  }
};

const actions = {
  add_Routes({commit}, addrouter) {
    commit('ADD_ROUTES', addrouter);
  }
};

export default {
  mutations,
  actions
};

components.js 定义的路由

const home= () => import('@/components/home'), 
      dome111= () => import('@/components/dome111'), 
      dome222= () => import('@/components/dome222')
export default {
  home,
  dome111,
  dome222,
};

Menufilter.js 用以替换后端返回的component字段

// 路由配置表
import Components from '@/asses/components.js';

export default (routers, data) => {
  generaRouter(routers, data);
};

function generaRouter(routers, data){
  if(data && data.length > 0) {
    data.forEach((item) => {
      let menu = Object.assign({}, item);
      menu.component = Components[menu.component];
      if(item.children){
        menu.children = [];
        generaRouter(menu.children,item.children);
      }
      routers.push(menu);
    });
  }
};

现在动态路由添加好了,有一个问题是刷新页面后会失效,需要在main.js中将存储的重新赋值。

import Vue from 'vue';
import Vuex from 'vuex';
import App from './App';
import router from './router';
import store from './store/index.js';
Vue.use(Vuex);
// 用户手动刷新页面,这时路由会被重设,要重新新增
if (localStorage.getItem('token')) {
  let path = JSON.parse(localStorage.getItem('routes'));
  store.dispatch("add_Routes", path)
}

router.beforeEach((to, from, next) => {
  let token = localStorage.getItem('token ');
  if(!token && to.path !== '/login') {
    next({name: 'login'});
  } else {
    next();
  }
});

大功告成。参考https://github.com/liuyangjike/dynamic-router

相关文章

  • vue权限菜单

    路由权限在一个项目中,重中之重,最近在写的项目起初没有仔细想过整理,现在整理下,供大家参考 当路由和菜单都由接口返...

  • vue 权限菜单

    当路由和菜单都由后台返回时,菜单和路由的格式根据实际情况和后台商量返回。 整体流程如下1、在router.js中只...

  • VUE 动态菜单及视图权限

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

  • vue菜单权限验证

    在项目中,权限验证与安全性非常重要,是一开始就必须考虑和搭建的基础核心功能。我们所要做到的是:不同的权限对应着不同...

  • vue 菜单路由权限

    实现思路 通过一个 uid 请求后端路由权限接口 后端返回对应的路由权限给前端 json 转树形结构 树形结构数据...

  • 微信小程序下拉菜单

    有兴趣可以看我的另一篇 vue菜单权限(路由和菜单都由后台返回)https://www.jianshu.com/p...

  • vue实现页面权限中的菜单配置

    通过一个数组渲染菜单,实现页面权限的自动配置。 框架和UI选择 vue vue-router element-ui...

  • vue实现菜单权限控制

    大家在做后台管理系统时一般都会涉及到菜单的权限控制问题。当然解决问题的方法无非两种——前端控制和后端控制。我们公司...

  • vue实现菜单权限控制

    大家在做后台管理系统时一般都会涉及到菜单的权限控制问题。当然解决问题的方法无非两种——前端控制和后端控制。我们公司...

  • vue实现菜单权限控制

    大家在做后台管理系统时一般都会涉及到菜单的权限控制问题。当然解决问题的方法无非两种——前端控制和后端控制。我们公司...

网友评论

    本文标题:vue 权限菜单

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