使用vue-element-admin框架从后端动态获取菜单功能的实现


Posted in Vue.js onApril 29, 2021

2、详解

​整体思路为:登陆 > 成功后根据用户信息获取菜单 > 根据菜单生成路由信息

2.1、新增asyncRoutes路由

​在vue-router路径src\router\index.js中新增asyncRoutes数组,用来存放后端获取的菜单对应的路由信息。

export const asyncRoutes = [
  { path: '*', redirect: '/404', hidden: true }
]

使用vue-element-admin框架从后端动态获取菜单功能的实现

constantRoutes和asyncRoutes的区别

constantRoutes:不需要动态判断权限的路由,如登录页、404等通用页面。

asyncRoutes:需求动态判断权限并通过addRoutes动态添加的页面

2.2、新建permission.js文件

​在vuex路径src\store\modules\permission.js下新建permission.js文件,该操作为最重要的一步,主要是从后端查询菜单并生成路由。

import { asyncRoutes, constantRoutes } from '@/router'
import { fetchUserMenuList } from '@/api/user'
import Layout from '@/layout'

/**
 * 静态路由懒加载
 * @param view  格式必须为 xxx/xxx 开头不要加斜杠
 * @returns 
 */
export const loadView = (view) => {
  return (resolve) => require([`@/views/${view}.vue`], resolve)
}

/**
 * 把从后端查询的菜单数据拼装成路由格式的数据
 * @param routes
 * @param data 后端返回的菜单数据
 */
export function generaMenu(routes, data) {
  data.forEach(item => {
    const menu = {
      path: item.url, 
      component: item.component === '#' ? Layout : loadView(item.component), 
      hidden: item.status === 0, // 状态为0的隐藏
      redirect: item.redirect,
      children: [],
      name: item.code,
      meta: item.meta
    }

    if (item.children) {
      generaMenu(menu.children, item.children)
    }
    routes.push(menu)
  })
  return routes
}

const state = {
  routes: [],
  addRoutes: []
}

const mutations = {
  SET_ROUTES: (state, routes) => {
    state.addRoutes = routes
    // 拼接静态路由和动态路由
    state.routes = constantRoutes.concat(routes)
  }
}

const actions = {
  generateRoutes({ commit }, token) {
    return new Promise(resolve => {
      // 通过token从后端获取用户菜单,并加入全局状态
      fetchUserMenuList(token).then(res => {
        const menuData = Object.assign([], res.data)
        const tempAsyncRoutes = Object.assign([], asyncRoutes)
        const accessedRoutes = generaMenu(tempAsyncRoutes, menuData)

        commit('SET_ROUTES', accessedRoutes)
        resolve(accessedRoutes)
      }).catch(error => {
        console.log(error)
      })
    })
  }
}

export default {
  namespaced: true,
  state,
  mutations,
  actions
}

2.3、在vuex中注册permission模块

​如果使用的是vue-element-admin请跳过此步,因为它在src\store\index.js中自动注册了src\store\modules下的所有模块。如果你使用的是vue-element-template,可以参考admin,将index.js文件改造一下,也可以手动import一下。

import Vue from 'vue'
import Vuex from 'vuex'
import getters from './getters'

Vue.use(Vuex)

// https://webpack.js.org/guides/dependency-management/#requirecontext
const modulesFiles = require.context('./modules', true, /\.js$/)

// you do not need `import app from './modules/app'`
// it will auto require all vuex module from modules file
const modules = modulesFiles.keys().reduce((modules, modulePath) => {
  // set './app.js' => 'app'
  const moduleName = modulePath.replace(/^\.\/(.*)\.\w+$/, '$1')
  const value = modulesFiles(modulePath)
  modules[moduleName] = value.default
  return modules
}, {})

const store = new Vuex.Store({
  modules,
  getters
})

export default store

2.4、在getters中增加路由状态

​在vuex路径src\store\getters.js添加menusRoutes状态

menusRoutes: state => state.permission.routes

使用vue-element-admin框架从后端动态获取菜单功能的实现

2.5、修改菜单生成数据来源

​在路径src\layout\components\Sidebar\index.vue修改routes数据来源,原来数据源是路由,改为从vuex中获取。

routes() {
      // return this.$router.options.routes
      return this.$store.getters.menusRoutes
    },

使用vue-element-admin框架从后端动态获取菜单功能的实现

​至此,从后端获取菜单数据到页面展示的逻辑已经完毕,下面开始在登陆后进行调用。

2.6、登陆后获取菜单

​在vuex路径src\store\modules\user.js的login方法中,加入登陆成功通过token获取菜单生成路由逻辑。

// 获取菜单,调用其他文件中actions时必须加 { root: true }
          dispatch('permission/generateRoutes', data, { root: true }).then((accessRoutes) => {
            router.addRoutes(accessRoutes)
          })

使用vue-element-admin框架从后端动态获取菜单功能的实现

2.7、解决刷新后页面空白

​以上内容已经可以实现登陆后展示左侧菜单功能,但是会发现每次刷新页面后,页面都会变空白。这是因为在页面刷新时,会重新加载vue实例,vuex的store中的数据会被重新赋值,导致我们存在vuex中的路由信息被清空。

​在src\permission.js中增加重新获取路由代码。

const accessRoutes = await store.dispatch('permission/generateRoutes', store.getters.token)
          router.addRoutes(accessRoutes)
          next({ ...to, replace: true })

使用vue-element-admin框架从后端动态获取菜单功能的实现

3、总结

​至此根据用户信息动态获取菜单内容已经全部完成。

到此这篇关于使用vue-element-admin框架从后端动态获取菜单的文章就介绍到这了,更多相关vue-element-admin动态获取菜单内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Vue.js 相关文章推荐
vue打开其他项目页面并传入数据详解
Nov 25 Vue.js
Vue.js桌面端自定义滚动条组件之美化滚动条VScroll
Dec 01 Vue.js
如何正确解决VuePress本地访问出现资源报错404的问题
Dec 03 Vue.js
vue实现滚动鼠标滚轮切换页面
Dec 13 Vue.js
vue3+typeScript穿梭框的实现示例
Dec 29 Vue.js
详解Vue2的diff算法
Jan 06 Vue.js
vue自定义组件实现双向绑定
Jan 13 Vue.js
Vue仿Bibibili首页的问题
Jan 21 Vue.js
vue浏览器返回监听的具体步骤
Feb 03 Vue.js
详解vue身份认证管理和租户管理
May 25 Vue.js
vue实力踩坑之push当前页无效
Apr 10 Vue.js
vue.js 使用原生js实现轮播图
Apr 26 Vue.js
vue使用v-model进行跨组件绑定的基本实现方法
关于vue中如何监听数组变化
vue实现简单数据双向绑定
Apr 28 #Vue.js
vue引入Excel表格插件的方法
Apr 28 #Vue.js
原生JS封装vue Tab切换效果
vue项目两种方式实现竖向表格的思路分析
vue首次渲染全过程
You might like
PHP使用ActiveMQ实例
2018/02/05 PHP
javascript 密码强弱度检测万能插件
2009/02/25 Javascript
JavaScript学习点滴 call、apply的区别
2010/10/22 Javascript
JQuery对checkbox操作 (循环获取)
2011/05/20 Javascript
Javascript的数组与字典用法与遍历对象的属性技巧
2012/11/07 Javascript
禁止页面刷新让F5快捷键及右键都无效
2014/01/22 Javascript
js文件Cookie存取值示例代码
2014/02/20 Javascript
node.js中RPC(远程过程调用)的实现原理介绍
2014/12/05 Javascript
jQuery.position()方法获取不到值的安全替换方法
2015/03/13 Javascript
javascript原型模式用法实例详解
2015/06/04 Javascript
Javascript中的作用域和上下文深入理解
2015/07/03 Javascript
jquery实现超简洁的TAB选项卡效果代码
2015/08/28 Javascript
xmlplus组件设计系列之网格(DataGrid)(10)
2017/05/05 Javascript
vue树形结构获取键值的方法示例
2018/06/21 Javascript
ES6 迭代器与可迭代对象的实现
2019/02/11 Javascript
微信小程序npm引入vant-weapp的踩坑记录
2019/08/01 Javascript
[49:08]完美世界DOTA2联赛PWL S2 LBZS vs FTD.C 第一场 11.27
2020/12/01 DOTA
python实现ftp客户端示例分享
2014/02/17 Python
python executemany的使用及注意事项
2017/03/13 Python
python爬虫实现中英翻译词典
2019/06/25 Python
Python中的相关分析correlation analysis的实现
2019/08/29 Python
Tensorflow 实现分批量读取数据
2020/01/04 Python
Python如何实现小程序 无限求和平均
2020/02/18 Python
Python 改变数组类型为uint8的实现
2020/04/09 Python
Python基于Hypothesis测试库生成测试数据
2020/04/29 Python
python3获取控制台输入的数据的具体实例
2020/08/16 Python
css3 position fixed固定居中问题解决方案
2014/08/19 HTML / CSS
纯CSS3实现鼠标滑过按钮动画第二节
2020/07/16 HTML / CSS
产品质量承诺书范文
2014/03/27 职场文书
防邪知识进家庭活动方案
2014/08/26 职场文书
世界卫生日宣传活动总结
2015/02/09 职场文书
中学社团活动总结
2015/05/07 职场文书
圣贤教育改变命运观后感
2015/06/16 职场文书
文艺节目主持词
2015/07/06 职场文书
导游词之凤凰古城
2019/10/22 职场文书
Django数据库(SQlite)基本入门使用教程
2022/07/07 Python