使用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 相关文章推荐
vue3.0实现点击切换验证码(组件)及校验
Nov 18 Vue.js
vue3.0自定义指令(drectives)知识点总结
Dec 27 Vue.js
使用vue3重构拼图游戏的实现示例
Jan 25 Vue.js
Vue使用Ref跨层级获取组件的步骤
Jan 25 Vue.js
vue 实现click同时传入事件对象和自定义参数
Jan 29 Vue.js
vue使用节流函数的踩坑实例指南
May 20 Vue.js
详细聊聊vue中组件的props属性
Nov 02 Vue.js
vue整合百度地图显示指定地点信息
Apr 06 Vue.js
vue elementUI表格控制对应列
Apr 13 Vue.js
vue3语法糖内的defineProps及defineEmits
Apr 14 Vue.js
vue实现input输入模糊查询的三种方式
Aug 14 Vue.js
Vue router配置与使用分析讲解
Dec 24 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中通过ADODB库实现调用Access数据库之修正版本
2006/12/31 PHP
使用ThinkPHP的自动完成实现无限级分类实例详解
2016/09/02 PHP
json 入门基础教程 推荐
2009/10/31 Javascript
javascript中将Object转换为String函数代码 (json str)
2012/04/29 Javascript
jquery弹出框的用法示例(一)
2013/08/26 Javascript
JQuery select(下拉框)操作方法汇总
2015/04/15 Javascript
把Node.js程序加入服务实现随机启动
2015/06/25 Javascript
jquery通过扩展select控件实现支持enter或focus选择的方法
2015/11/19 Javascript
实例讲解javascript注册事件处理函数
2016/01/09 Javascript
JavaScript获取css行间样式,内连样式和外链样式的简单方法
2016/07/18 Javascript
基于jQuery插件jqzoom实现的图片放大镜效果示例
2017/01/23 Javascript
详解Angular 开发环境搭建
2017/06/22 Javascript
详解在WebStorm中添加Vue.js单文件组件的高亮及语法支持
2017/10/21 Javascript
极简主义法编写JavaScript类
2017/11/02 Javascript
微信小程序自定义带价格显示日历效果
2018/12/29 Javascript
jquery+css实现Tab栏切换的代码实例
2019/05/14 jQuery
我要点爆”微信小程序云开发之项目建立与我的页面功能实现
2019/05/26 Javascript
vue移动端实现手机左右滑动入场动画
2020/06/17 Javascript
js实现中文实时时钟
2020/01/15 Javascript
vue-cli设置publicPath小记
2020/04/14 Javascript
vue渲染方式render和template的区别
2020/06/05 Javascript
jQuery实现tab栏切换效果
2020/12/22 jQuery
python中redis的安装和使用
2016/12/04 Python
Python实现的随机森林算法与简单总结
2018/01/30 Python
python使用openpyxl库修改excel表格数据方法
2018/05/03 Python
Python爬虫基础之XPath语法与lxml库的用法详解
2018/09/13 Python
500行代码使用python写个微信小游戏飞机大战游戏
2019/10/16 Python
python 合并多个excel中同名的sheet
2021/01/22 Python
人事专员的职责
2014/02/26 职场文书
洗手间标语
2014/06/23 职场文书
班组拓展活动方案
2014/08/14 职场文书
见习报告的格式
2014/10/31 职场文书
2015商场元旦促销活动策划方案
2014/12/09 职场文书
升学宴学生致辞
2015/09/29 职场文书
python基于tkinter制作无损音乐下载工具
2021/03/29 Python
二维码条形码生成的JavaScript脚本库
2022/07/07 Javascript