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生命周期的深入理解
Dec 03 Vue.js
vue表单验证之禁止input输入框输入空格
Dec 03 Vue.js
vue使用echarts图表自适应的几种解决方案
Dec 04 Vue.js
vue3使用vue-count-to组件的实现
Dec 25 Vue.js
Vue实现随机验证码功能
Dec 29 Vue.js
vue中activated的用法
Jan 03 Vue.js
解决vue使用vant轮播组件swipe + flex时文字抖动问题
Jan 07 Vue.js
一篇文章学会Vue中间件管道
Jun 20 Vue.js
SSM VUE Axios详解
Oct 05 Vue.js
vue3引入highlight.js进行代码高亮的方法实例
Apr 08 Vue.js
vue 自定义的组件绑定点击事件
Apr 21 Vue.js
vue项目如何打包之项目打包优化(让打包的js文件变小)
Apr 30 Vue.js
vue3中的组件间通信
vue前端工程的搭建
vue中data改变后让视图同步更新的方法
vue3如何优雅的实现移动端登录注册模块
开发一个封装iframe的vue组件
如何让vue长列表快速加载
Vue3 Composition API的使用简介
You might like
全国FM电台频率大全 - 30 宁夏回族自治区
2020/03/11 无线电
ajax在joomla中的原生态应用代码
2012/07/19 PHP
Php中使用Select 查询语句的实例
2014/02/19 PHP
PHP递归删除目录几个代码实例
2014/04/21 PHP
Yii2.0 模态弹出框+ajax提交表单
2016/05/22 PHP
删除PHP数组中头部、尾部、任意元素的实现代码
2017/04/10 PHP
ThinkPHP5框架实现简单的批量查询功能示例
2018/06/07 PHP
CodeIgniter框架实现的整合Smarty引擎DEMO示例
2019/03/28 PHP
javawscript 三级菜单的实现原理
2009/07/01 Javascript
浅析jquery ajax异步调用方法中不能给全局变量赋值的原因及解决方法
2014/01/10 Javascript
jQuery中even选择器的定义和用法
2014/12/23 Javascript
深入理解JS addLoadEvent函数
2016/05/20 Javascript
详解Javascript ES6中的箭头函数(Arrow Functions)
2016/08/24 Javascript
vue中计算属性(computed)、methods和watched之间的区别
2017/07/27 Javascript
promise处理多个相互依赖的异步请求(实例讲解)
2017/08/03 Javascript
JS实现显示当前日期的实例代码
2018/07/03 Javascript
微信小程序scroll-view实现滚动穿透和阻止滚动的方法
2018/08/20 Javascript
详解Ant Design of React的安装和使用方法
2018/12/27 Javascript
Fundebug支持监控微信小程序HTTP请求错误的方法
2019/02/21 Javascript
Vue组件生命周期运行原理解析
2020/11/25 Vue.js
windows如何把已安装的nodejs高版本降级为低版本(图文教程)
2020/12/14 NodeJs
[50:58]2018DOTA2亚洲邀请赛 4.1 小组赛 B组 Mineski vs EG
2018/04/03 DOTA
Python删除空文件和空文件夹的方法
2015/07/14 Python
基于python OpenCV实现动态人脸检测
2018/05/25 Python
python matlibplot绘制多条曲线图
2021/02/19 Python
使用Python的SymPy库解决数学运算问题的方法
2019/03/27 Python
Python3.5基础之函数的定义与使用实例详解【参数、作用域、递归、重载等】
2019/04/26 Python
Python 20行简单实现有道在线翻译的详解
2019/05/15 Python
Django的models模型的具体使用
2019/07/15 Python
python基于plotly实现画饼状图代码实例
2019/12/16 Python
python 操作hive pyhs2方式
2019/12/21 Python
FitFlop美国官网:英国符合人体工学的鞋类品牌
2018/10/05 全球购物
瑞典最大的儿童用品网上商店:pinkorblue.se
2021/03/09 全球购物
《厄运打不垮的信念》教学反思
2014/04/13 职场文书
音乐之声观后感
2015/06/04 职场文书
PHP实现rar解压读取扩展包小结
2021/06/03 PHP