vue后台管理如何配置动态路由菜单

目录
  • 后台管理配置动态路由菜单
  • 根据权限生成动态路由及导航菜单

后台管理配置动态路由菜单

前段时间做一个后台管理项目,因为超级管理员可以给普通管理员动态更改权限,所以vue-element-admin里的写死的权限路由菜单就不太适合我,自己研究了好半天,经历了各种死循环,终于差不多弄出了一个,可能会有点啰嗦,总结一下:

我这个后台分为三个角色:超级管理员、企业管理员和普通管理员。其中,超级管理员可以查看所有的路由菜单,企业管理员也是固定的几个菜单,所以,超级管理员和企业管理员是我在前端写好的路由菜单里直接配置的权限,而普通管理员是不固定的,需要后台给我返回数据,自己拼接。

1、首先我们需要有一个登录的页面,简单点的,用户名和密码还有一个登录按钮就可以了,我用的是vue-element-admin的模板,它已经写好了,直接拿来用就可以

2、自己在src-api文件夹中新建一个js文件来写自己的登录、获取用户信息、登出等接口(也可以换掉之前的模拟接口,在api/user.js文件)。

3、点击登录按钮,这时会在这个方法里面调用store-modules-user.js里的login方法,如下:

4、store-modules-user.js里的login方法就是调用了自己的登录接口,当然,调用之前记得先引入文件

上面是我引入的登录、获取用户信息、登出的接口

5、调用登录接口后store存储返回的token等数据(根据自己的需求来,因为我后期需要用户id,所以也把用户id存进了store里)

6、这时调用同页面的getInfo方法,当然,这个方法里也同样调用了获取用户信息的接口,这步是为了获取到登录的用户的角色,调用之后,将返回的用户角色名等存到store里(我还存了其它的数据,还是那句话,哪些数据需要就存哪些)

*** 这里当时我出了一个bug:当我登录进去之后刷新页面又跳到了登录的页面,说明有关键的数据没有存储上,上网一找,token在登录调用登录接口后已经用cookie存入了浏览器,那应该就是我只把id存进了store而没有存入浏览器,才导致一刷新就失去了id,所以我用localStorage/sessionStorage存入了id,在getInfo里才获取本地存储的id在存储到store中

7、由于普通管理员的路由菜单是后台返给我的,所以,在getInfo这个方法中,我也直接调用了获取路由菜单的接口,将返回的数据通过拼接来生成一个完整的路由菜单,最后将这个路由菜单数组保存在store中

注:路由菜单最后一定要放404,格式 :{ path: '*', redirect: '/404', hidden: true } ,切记一定要放在最后!!!

8、接下来是去src/permission.js中调用store-modules-user.js里的getInfo方法,这块与模板的代码没有区别,所以就不多叙述。在此方法中调用了store-modules-permission.js里的generateRoutes的方法

我们去找一下这个方法,这个方法其实是根据传过来的role来判断它能看到的路由菜单。模板里原来的方法是根据角色和写好的路由菜单一一比较,最后把对应上权限的项放进一个数组里,我这里的超级管理员和普通管理员因为权限和路由菜单固定,所以直接套用的代码。而普通管理员,则是调用保存在store里的路由菜单数组,然后赋值给定义好的变量

之后需要更改的地方就没有了,就可以测试登录了。

这里我犯了一个比较大的bug:

当以普通管理员登录的时候,我进去之后菜单显示正常,可是当我不管点击哪个菜单,都给我跳到了404 。经过一番测试与排查,我找到了解决方法,是加一个延时器,加在generateRoutes方法的这个地方

之后就运行成功了,但是具体原因我其实不太明白,因为我console.log(accessedRoutes) 出来的也是正常的路由菜单

这就是大体的配置动态路由菜单的过程,作为第一次配置成功的心得。

根据权限生成动态路由及导航菜单

最近在做一个后台管理项目,涉及到一些菜单权限控制,具体实现如下:(话不多说,直接上代码)

router/index.js

const Home = resolve => require(['@/views/common/Home.vue'], resolve);const AAA = resolve => require(['@/views/page/AAA.vue'], resolve);const BBB = resolve => require(['@/views/pages/BBB.vue'], resolve);const CCC= resolve => require(['@/views/pages/CCC.vue'], resolve);let routes = [{    path: '/',    component: Home,    name: '首页',    redirect: '/AAA',    hidden: true,    mate: {      icon: 'fa fa-home',      index: 'AAA'    },    children: [{      path: '/AAA',      component: AAA,      name: '主页'    }]  }]//从服务器获取路由,进行拼接,所有模块不再以import的形式引入,只能通过require方式加载!export const makeRoute = function (items) {  let routes = [];  for (var i = 0; i < items.length; i++) {    // console.log(items[i]);    items[i] = formatRoute(items[i]);    if (items[i].children) {      //递归处理子路由的component      items[i].children = makeRoute(items[i].children);    }  }  return items;}//格式化路由,使component挂载到路由上,生成addRoutes可用的格式const formatRoute = (item) => {  let route = item;  route.component = eval(route.component);  return route;}export default routes;

main.js(登录成功时,后台返回有权限的路由并存在状态管理器vuex中)

import Vue from 'vue'import App from './App'import VueRouter from 'vue-router'import axios from 'axios'import store from './store'import routes from './router/index'import { makeRoute } from './router'Vue.use(VueRouter)const router = new VueRouter({  routes})router.beforeEach((to, from, next) => {      //如果目标路由为登陆时,恢复用户原始状态    if (to.path === '/login') {      window.clearInterval(window.interval);      store.commit('logOut');    }    let allRoutes = store.getters.allRoutes;    let loginStatus = store.getters.loginStatus;      //登录成功时加载路由及模块    if (from.path === '/login' && allRoutes !== '' && loginStatus) {      let routesObj = makeRoute(store.getters.allRoutes);      router.addRoutes(routesObj);    }    //没有登录时自动跳转,开发环境免登陆时注释    if ( to.path !== '/login' && (allRoutes === '' || !loginStatus)) {      if(sessionStorage.getItem('userInfo') === null){          next({ path: '/login' })      } else {          //刷新当前页面        //重置store参数        let userInfo = JSON.parse(sessionStorage.getItem('userInfo'));        store.commit('setUser', userInfo);        if(userInfo.routes){          //重新加载路由及模块          let routesObj = makeRoute(userInfo.routes);          router.addRoutes(routesObj);        }        next({path: to.path, query: to.query});      }    }else{      //路由的next必须存在,否则无法进入下一页      next();    }  })

备注:此方案最大的好处是不用再使用require引入每一个组件并挂载到路由

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • vue addRoutes实现动态权限路由菜单的示例

    需求 最近接手一个后台管理系统,需要实现导航菜单从后台拉取的效果:根据登录用户的权限不同分别拉出来的导航菜单也不一样,另外可操作的界面也存在区别. 问题 因为后台管理系统是准备使用vue+vue-router+element-ui+vuex的搭配来做的,可是单页应用在进入页面之前就已经将vue-router实例化并且注入vue实例中了,所以在进入登录页面的时候旧没办法在重新定制路由了.接下来各种百之谷之,发现vue-router在2.0版本中提供了addRoutes方法添加路由,希望的曙光出现.

  • Vue 动态添加路由及生成菜单的方法示例

    写后台管理系统,估计有不少人遇过这样的需求:根据后台数据动态添加路由和菜单. 为什么这么做呢?因为不同的用户有不同的权限,能访问的页面是不一样的. 在网上找了好多资料,终于想到了解决办法. 动态生成路由 利用 vue-router 的 addRoutes 方法可以动态添加路由. 先看一下官方介绍: router.addRoutes router.addRoutes(routes: Array<RouteConfig>) 动态添加更多的路由规则.参数必须是一个符合 routes 选项要求的数组.

  • vue 实现动态路由的方法

    很多时候我们在项目的路由都是在前端配置好的 但是有的时候为了进行全面的权限控制,会需要后台给出路由表,前端再渲染.不用在前端配置. 下面主要讲一下思路 1.和后台小哥哥沟通好数据,把我们前端配置的路由表数据给他,他就能看懂了 2.拿到数据需要我们自己再处理 路由中的component后台是给不了的,这里我们只需要后台小哥哥按照我们提供的前端component路径给数据,我们循环加载就可以了 //view就是后台给的数据 return () => import(`@/view/modules/${

  • vue后台管理之动态加载路由的方法

    在这里我们将会实现一个vue动态路由的案列,当用户登陆成功后,根据用户的角色,拿到他对应的菜单信息,并将它动态的载入到我们的路由中. 我们的通用的后台管理系统中,我们会根据权限的粗细不同,会对每个角色每个权限每个资源进行控制.同样的我们也需要实现一个这样的功能. 这篇文章我将主要讲vue端的实现,关于后台接口我就不会涉及,当我接触的时候我们的后台接口是springcloud实现. 一.思路 在vue-router对象中首先初始化公共路由,比如(404,login)等,然后在用户登陆成功,根据用户

  • vue后台管理如何配置动态路由菜单

    目录 后台管理配置动态路由菜单 根据权限生成动态路由及导航菜单 后台管理配置动态路由菜单 前段时间做一个后台管理项目,因为超级管理员可以给普通管理员动态更改权限,所以vue-element-admin里的写死的权限路由菜单就不太适合我,自己研究了好半天,经历了各种死循环,终于差不多弄出了一个,可能会有点啰嗦,总结一下: 我这个后台分为三个角色:超级管理员.企业管理员和普通管理员.其中,超级管理员可以查看所有的路由菜单,企业管理员也是固定的几个菜单,所以,超级管理员和企业管理员是我在前端写好的路由

  • 详解如何使用Vuex实现Vue后台管理中的角色鉴权

    目录 前言 功能分析 实现思路 代码实现 vuex中定义user模块,存储用户信息以及用户侧边导航数据 router中路由meta中新增roles 定义当前路由可以访问的所有的角色 router新增路由前置首位 做权限拦截 侧边导航页面 使用 getters中的 authMenus 循环侧边导航 最后一步 登录页登录时调用 请求登录的action即可大功告成 总结 前言 一直以来,我们使用vue做后台管理时,不同角色的权限功能,都是我们老大难的问题,本篇文章我将手把你带你实现vue后台管理中的用

  • vue后台管理添加多语言功能的实现示例

    目录 1.首先是main.js页面做配置 2.配置相应路径下的语言包,在这儿只显示部分代码,需要什么在这儿添加什么即可 3.页面中使用,不同的地方使用,写法略有不同 在这家公司一个项目, 需要添加英文版本,就是中英文化了,直接上代码 1.首先是main.js页面做配置 import VueI18n from 'vue-i18n' Vue.use(VueI18n) // 通过插件的形式挂载 const i18n = new VueI18n({ //locale: 'zh-CN', // 语言标识

  • vue+quasar使用递归实现动态多级菜单

    本文实例为大家分享了vue+quasar使用递归实现动态多级菜单的具体代码,供大家参考,具体内容如下 效果图: 菜单初始化入口 menu.vue,初始化侧边栏菜单组建,<my-q-menu/>才是递归开始 <template>   <q-drawer     v-model="is_hide_"     show-if-above     bordered     content-class="bg-grey-2"     :width

  • VUE+elementui面包屑实现动态路由详解

    我的路由: const routerMap = [ { path: '/', redirect: 'dashboard', component: Layout, name:'Dashboard', children: [ { path: 'dashboard', component: () => import('@/view/dashboard'), name: 'Dashboard', meta: { title: 'dashboard', icon: 'dashboard', noCache

  • vue新建项目并配置标准路由过程解析

    这篇文章主要介绍了vue新建项目并配置标准路由过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 配置路由所有用到的地方总共四步或者说四处 1.index.js(src--router--index.js) import Vue from 'vue' import Router from 'vue-router' // import HelloWorld from '@/components/HelloWorld' import Home

  • vue如何根据权限生成动态路由、导航栏

    目录 基本思路 相关代码 基本思路 1.创建vueRouter,用公共路由实例化 2.创建需要根据权限筛选的路由对象(在路由对象,添加必要的权限判断字段) 3.登录完成,由后端配合返回当前用户的权限集合 4.筛选出有权限的路由对象,利用vueRouter的addRoutes方法,生成完整路由 5.处理刷新页面导致vueRouter重新实例化导致路由对象不完善 (利用router.beforeEach导航守卫,,利用addRoutes()完善 路由对象 ) 6.侧边导航栏相关代码 相关代码 根据上

  • Vue 后台管理类项目兼容IE9+的方法示例

    最近项目进入到了第三方集成的环节,集成第三方监控非要用IE,咋办?老板让我将后台管理系统的框架兼容下IE,一直都是在chrome下开发的,也不知道IE下是什么鬼. 目前后台管理系统前端搭建方式 目前系统是用vue-cli@2.0生成的,UI框架使用的是iview,ajax请求使用的是axois,此外就没有什么特殊的npm包了. 需要解决的兼容问题 经过自己的一番测试,目前主要有以下的兼容问题: 在IE下由于没有promise,所以axios不能用了: 在涉及到flex.fixed.absolut

  • vue一步到位的实现动态路由

    目录 静态路由的回顾 动态路由的配置 说一些笔者遇到的问题 后记 最近在写vue项目,需要由后台传来当前用户对应权限的路由表,前端通过调接口拿到后处理(后端处理路由),就是配置vue动态路由啦. 由于错信了一些网上的文章:(,导致在这个问题上耗费了不少时间,想想,还是自己写一篇文章来记录一下那些遇到的坑吧. 接下来手把手记录一下,如何从零开始配置vue动态路由. 首先呢,先看看静态路由的配置,简单预览一下,熟悉的可以直接跳过,说这部分,是为了熟悉一下路由的配置,配置动态路由其实就是把静态路由存到

随机推荐