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+scss白天和夜间模式切换功能的实现方法
Jan 05 Vue.js
vue常用高阶函数及综合实例
Feb 25 Vue.js
使用Vue.js和MJML创建响应式电子邮件
Mar 23 Vue.js
详解Vue的options
May 15 Vue.js
vue-router中hash模式与history模式的区别
Jun 23 Vue.js
详解gantt甘特图可拖拽、编辑(vue、react都可用 highcharts)
Nov 27 Vue.js
Vue自定义铃声提示音组件的实现
Jan 22 Vue.js
详解Vue中$props、$attrs和$listeners的使用方法
Feb 18 Vue.js
vue代码分块和懒加载非必要资源文件
Apr 11 Vue.js
如何优化vue打包文件过大
Apr 13 Vue.js
vue组件vue-esign实现电子签名
Apr 21 Vue.js
vue二维数组循环嵌套方式 循环数组、循环嵌套数组
Apr 24 Vue.js
vue3中的组件间通信
vue前端工程的搭建
vue中data改变后让视图同步更新的方法
vue3如何优雅的实现移动端登录注册模块
开发一个封装iframe的vue组件
如何让vue长列表快速加载
Vue3 Composition API的使用简介
You might like
简单谈谈php浮点数精确运算
2016/03/10 PHP
JSON两种结构之对象和数组的理解
2016/07/19 PHP
Yii框架实现记录日志到自定义文件的方法
2017/05/23 PHP
PHP实现模拟http请求的方法分析
2017/12/20 PHP
基于PHP的登录和注册的功能的实现
2020/08/06 PHP
JS 加入收藏夹的代码(主流浏览器通用)
2013/05/13 Javascript
js取整数、取余数的方法
2014/05/11 Javascript
Js可拖拽放大的层拖动特效实现方法
2015/02/25 Javascript
在jQuery中处理XML数据的大致方法
2015/08/14 Javascript
一波JavaScript日期判断脚本分享
2016/03/06 Javascript
JavaScript设计模式之策略模式详解
2017/06/09 Javascript
Nuxt.js实战详解
2018/01/18 Javascript
ES10 特性的完整指南小结
2019/03/04 Javascript
axios封装,使用拦截器统一处理接口,超详细的教程(推荐)
2019/05/02 Javascript
node读写Excel操作实例分析
2019/11/06 Javascript
用Python实现服务器中只重载被修改的进程的方法
2015/04/30 Python
Python实现Windows上气泡提醒效果的方法
2015/06/03 Python
Python实现把json格式转换成文本或sql文件
2015/07/10 Python
使用C++扩展Python的功能详解
2018/01/12 Python
Python网络编程之TCP与UDP协议套接字用法示例
2018/02/02 Python
理论讲解python多进程并发编程
2018/02/09 Python
python 2.7.13 安装配置方法图文教程
2018/09/18 Python
老生常谈python中的重载
2018/11/11 Python
python2 中 unicode 和 str 之间的转换及与python3 str 的区别
2019/07/25 Python
Python模块_PyLibTiff读取tif文件的实例
2020/01/13 Python
python 模拟登录B站的示例代码
2020/12/15 Python
CSS Grid布局教程之什么是网格布局
2014/12/30 HTML / CSS
input file上传文件样式支持html5的浏览器解决方案
2012/11/14 HTML / CSS
大学生个人推荐信范文
2013/11/25 职场文书
ktv中秋节活动方案
2014/01/30 职场文书
关于运动会的稿件
2014/02/02 职场文书
质量管理标语
2014/06/12 职场文书
重阳节简报
2015/07/20 职场文书
初中团支书竞选稿
2015/11/21 职场文书
学校学习型党组织建设心得体会
2019/06/21 职场文书
如何撰写创业策划书
2019/06/27 职场文书