vue中三级导航的菜单权限控制


Posted in Vue.js onMarch 31, 2021

把路由表的数据结构和后端沟通好,然后后端把对应权限的路由树给前端返回,前端在vuex中处理处理路由

import Cookies from 'js-cookie'

import router from '@/router'

import userInfos from '@/api/login'
import date from '../modules/user'
const Layout = () =>
  import ('@/layout') // 全局组件

const _import = require('@/router/_import_' + process.env.NODE_ENV)
const state = {
  routers: sessionStorage.getItem('navRouters')
        ? sessionStorage.getItem('navRouters')
        : [],
  navRouters: sessionStorage.getItem('navRouters')
        ? sessionStorage.getItem('navRouters')
        : [],
}
const mutations = {
  // 菜单权限
  SET_ALL_MENU_LIST(state, menulist) {
    state.navRouters = menulist
    state.routers = menulist
  }
}
onst actions = {
  // 菜单获处理
  setAllMenuList({ commit }, userInfo) {
    /**
         * 初始化路由
         * @param router 路由文件,是一个数组
         */
    function initRouter(router) {
      for (let i = 0; i < router.length; i++) {
        const route = router[i]
        // 设置一级路由的控件为全局定义的默认控件
        route.component = Layout
        // 设置子路由
        route.children && initChildrenRouter(route.children)
      }
      return router
    }
    /**
         * 初始化子路由
         * @param router 子路由数组
         */
    function initChildrenRouter(router) {
      for (let i = 0; i < router.length; i++) {
        const route = router[i]
        // 初始化子路由的控件
        route.component && (route.component = _import(route.component))
        route.children &&
                    route.children.length &&
                    initChildrenRouter(route.children)
      }
    }
    return new Promise((resolve, reject) => {
      userInfos
        .postGetUserRoutes(date.state.userId)
        .then(response => {
          const { result, code } = response
          if (code === 200) {
            if (result.length) {
              result.forEach(v => {
                for (let i = 0; i < v.children[0].children.length; i++) {
                  if (!v.children[0].children[i].hidden === true) {
                    v.redirect =
                         v.path +
                           '/' +
                           v.children[0].path +
                           '/' +
                         v.children[0].children[i].path
                    break
                  }
                }
              })
            }
            const accessedRouters = initRouter(result)
            console.log('accessedRouters', accessedRouters)
            accessedRouters.push({
              path: '*',
              redirect: '/404',
              hidden: true
            })
            router.addRoutes(accessedRouters)
            sessionStorage.setItem(
              'navRouters',
              JSON.stringify(accessedRouters)
            )
            sessionStorage.setItem(
              'allMenuList',
              JSON.stringify(accessedRouters)
            )
            commit('SET_ALL_MENU_LIST', accessedRouters)
            resolve()
          } else {
            reject(response.data)
          }
        })
        .catch(error => {
          reject(error)
        })
    })
  }
}

为了防止刷新丢失,在路由守卫中要加一层条件

const hasGetUserInfo = store.getters.name
            if (hasGetUserInfo) {
                // 处理最新路由
                console.log('00', to)
                if (!isAddTrue) {
                    isAddTrue++
                    store.dispatch('app/setAllMenuList', '').then(() => {
                        console.log('00', to)
                        next({ path: to.path })
                    })
                } else {
                    next()
                }
            } else {
                try {
                    // get user info
                    await store.dispatch('user/getInfo')

                    next()
                } catch (error) {
                    // remove token and go to login page to re-login
                    await store.dispatch('user/resetToken')
                    Message.error(error || 'Has Error')
                    next(`/login?redirect=${to.path}`)
                    NProgress.done()
                }
            }
        }
Vue.js 相关文章推荐
Vue项目利用axios请求接口下载excel
Nov 17 Vue.js
Vue使用鼠标在Canvas上绘制矩形
Dec 24 Vue.js
vue使用require.context实现动态注册路由
Dec 25 Vue.js
vue中封装axios并实现api接口的统一管理
Dec 25 Vue.js
vue3+typeScript穿梭框的实现示例
Dec 29 Vue.js
vue+echarts实现中国地图流动效果(步骤详解)
Jan 27 Vue.js
vue浏览器返回监听的具体步骤
Feb 03 Vue.js
vue+iview实现手机号分段输入框
Mar 25 Vue.js
vue 实现弹窗关闭后刷新效果
Apr 08 Vue.js
vue2的 router在使用过程中遇到的一些问题
Apr 13 Vue.js
vue elementUI表格控制对应列
Apr 13 Vue.js
vue postcss-px2rem 自适应布局
May 15 Vue.js
vue3中的组件间通信
vue前端工程的搭建
vue中data改变后让视图同步更新的方法
vue3如何优雅的实现移动端登录注册模块
开发一个封装iframe的vue组件
如何让vue长列表快速加载
Vue3 Composition API的使用简介
You might like
一个程序下载的管理程序(四)
2006/10/09 PHP
php时间不正确的解决方法
2008/04/09 PHP
php初学者写及时补给skype用户充话费的小程序
2008/11/02 PHP
PHP 开发环境配置(测试开发环境)
2010/04/28 PHP
关于初学PHP时的知识积累总结
2013/06/07 PHP
php调用google接口生成二维码示例
2014/04/28 PHP
PHP中模拟处理HTTP PUT请求的例子
2014/07/22 PHP
PHP实现用session来实现记录用户登陆信息
2018/10/15 PHP
PHP实现数组和对象的相互转换操作示例
2019/03/20 PHP
PHP中PCRE正则解析代码详解
2019/04/26 PHP
javascript cookie解码函数(兼容ff)
2008/03/17 Javascript
javascript对数组的常用操作代码 数组方法总汇
2011/01/27 Javascript
jquery 插件学习(二)
2012/08/06 Javascript
javascript提取URL的搜索字符串中的参数(自定义函数实现)
2013/01/22 Javascript
基于Javascript实现返回顶部按钮
2016/02/29 Javascript
JavaScript根据CSS的Media Queries来判断浏览设备的方法
2016/05/10 Javascript
ajax级联菜单实现方法实例分析
2016/11/28 Javascript
详解如何去除vue项目中的#——History模式
2017/10/13 Javascript
webpack4.x CommonJS模块化浅析
2018/11/09 Javascript
JS深入学习之数组对象排序操作示例
2020/05/01 Javascript
[04:46]2018年度玩家喜爱的电竞媒体-完美盛典
2018/12/16 DOTA
简单介绍Python下自己编写web框架的一些要点
2015/04/29 Python
Python简单获取网卡名称及其IP地址的方法【基于psutil模块】
2018/05/24 Python
Python 添加文件注释和函数注释操作
2020/08/09 Python
Python pysnmp使用方法及代码实例
2020/08/24 Python
Python字符串对齐、删除字符串不需要的内容以及格式化打印字符
2021/01/23 Python
澳大利亚先进的皮肤和激光诊所购物网站:Soho Skincare
2018/10/15 全球购物
一个大学生十年的职业规划
2014/01/17 职场文书
办公室文员自荐书
2014/02/03 职场文书
学习雷锋倡议书
2014/04/15 职场文书
乡镇综治宣传月活动总结
2014/07/02 职场文书
开展党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
大学生个人学习总结
2015/02/15 职场文书
总账会计岗位职责
2015/04/02 职场文书
幼儿园万圣节活动总结
2015/05/05 职场文书
茶花女读书笔记
2015/06/29 职场文书