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 08 Vue.js
Vue——解决报错 Computed property &quot;****&quot; was assigned to but it has no setter.
Dec 19 Vue.js
vue实现一个获取按键展示快捷键效果的Input组件
Jan 13 Vue.js
vue3 watch和watchEffect的使用以及有哪些区别
Jan 26 Vue.js
vue-video-player 断点续播的实现
Feb 01 Vue.js
vue3.0 自适应不同分辨率电脑的操作
Feb 06 Vue.js
使用Vue.js和MJML创建响应式电子邮件
Mar 23 Vue.js
一文带你理解vue创建一个后台管理系统流程(Vue+Element)
May 18 Vue.js
vue使用echarts实现折线图
Mar 21 Vue.js
vue实力踩坑之push当前页无效
Apr 10 Vue.js
如何优化vue打包文件过大
Apr 13 Vue.js
vue组件vue-esign实现电子签名
Apr 21 Vue.js
vue3中的组件间通信
vue前端工程的搭建
vue中data改变后让视图同步更新的方法
vue3如何优雅的实现移动端登录注册模块
开发一个封装iframe的vue组件
如何让vue长列表快速加载
Vue3 Composition API的使用简介
You might like
php fsockopen解决办法 php实现多线程
2014/01/20 PHP
php实例分享之mysql数据备份
2014/05/19 PHP
编写PHP脚本清除WordPress头部冗余代码的方法讲解
2016/03/01 PHP
Yii2针对指定url的生成及图片等的引入方法小结
2016/07/18 PHP
javascript 常用关键字列表集合
2007/12/04 Javascript
javascript 写类方式之六
2009/07/05 Javascript
可恶的ie8提示缺少id未定义
2014/03/20 Javascript
上传文件返回的json数据会被提示下载问题解决方案
2014/12/03 Javascript
JS+CSS实现表格高亮的方法
2015/08/05 Javascript
浅谈Vue.js应用的四种AJAX请求数据模式
2017/08/30 Javascript
jQuery实现checkbox的简单操作
2017/11/18 jQuery
vue实现nav导航栏的方法
2017/12/13 Javascript
nodejs中Express与Koa2对比分析
2018/02/06 NodeJs
JS获取本地地址及天气的方法实例小结
2019/05/10 Javascript
Vue3.0中的monorepo管理模式的实现
2019/10/14 Javascript
在vue项目中利用popstate处理页面返回的操作介绍
2020/08/06 Javascript
vue-router懒加载的3种方式汇总
2021/02/28 Vue.js
python映射列表实例分析
2015/01/26 Python
实例讲解Python中SocketServer模块处理网络请求的用法
2016/06/28 Python
Python算术运算符实例详解
2017/05/31 Python
tensorflow实现对图片的读取的示例代码
2018/02/12 Python
Python实现的查询mysql数据库并通过邮件发送信息功能
2018/05/17 Python
Python get获取页面cookie代码实例
2018/09/12 Python
Django框架登录加上验证码校验实现验证功能示例
2019/05/23 Python
Python closure闭包解释及其注意点详解
2019/08/28 Python
Python3的socket使用方法详解
2020/02/18 Python
Python使用进程Process模块管理资源
2020/03/05 Python
用 python 进行微信好友信息分析
2020/11/28 Python
amazeui 验证按钮扩展的实现
2020/08/21 HTML / CSS
厨师长岗位职责
2014/03/02 职场文书
竞选体育委员演讲稿
2014/04/26 职场文书
户籍证明模板
2014/09/28 职场文书
2014年建筑工程工作总结
2014/12/03 职场文书
2015年行风建设工作总结
2015/05/15 职场文书
趣味运动会口号
2015/12/24 职场文书
ES6 解构赋值的原理及运用
2021/05/25 Javascript