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 +WebSocket + WaveSurferJS 实现H5聊天对话交互的实例
Nov 18 Vue.js
Vue 的 v-model用法实例
Nov 23 Vue.js
vue-calendar-component 封装多日期选择组件的实例代码
Dec 04 Vue.js
Vue如何跨组件传递Slot的实现
Dec 14 Vue.js
vue 数据操作相关总结
Dec 17 Vue.js
vue实现防抖的实例代码
Jan 11 Vue.js
vue监听键盘事件的相关总结
Jan 29 Vue.js
vue使用echarts画组织结构图
Feb 06 Vue.js
vue点击弹窗自动触发点击事件的解决办法(模拟场景)
May 25 Vue.js
Vue的过滤器你真了解吗
Feb 24 Vue.js
Vue+Flask实现图片传输功能
Apr 01 Vue.js
Vue 打包后相对路径的引用问题
Jun 05 Vue.js
vue3中的组件间通信
vue前端工程的搭建
vue中data改变后让视图同步更新的方法
vue3如何优雅的实现移动端登录注册模块
开发一个封装iframe的vue组件
如何让vue长列表快速加载
Vue3 Composition API的使用简介
You might like
基于preg_match_all采集后数据处理的一点心得笔记(编码转换和正则匹配)
2014/01/31 PHP
PHP统一页面编码避免乱码问题
2015/04/09 PHP
实例:尽可能写友好的Javascript代码
2006/10/09 Javascript
window.location和document.location的区别分析
2008/12/23 Javascript
JS取request值以及自动执行使用示例
2014/02/24 Javascript
JS实现当前页居中分页效果的方法
2015/06/18 Javascript
javascript 闭包详解
2015/07/02 Javascript
jQuery基础知识点总结(DOM操作)
2016/06/01 Javascript
js两种拼接字符串的简单方法(必看)
2016/09/02 Javascript
javascript经典特效分享 手风琴、轮播图、图片滑动
2016/09/14 Javascript
vue2.0实战之使用vue-cli搭建项目(2)
2017/03/27 Javascript
php register_shutdown_function函数详解
2017/07/23 Javascript
详解Vue2中组件间通信的解决全方案
2017/07/28 Javascript
Vue.js表单标签中的单选按钮、复选按钮和下拉列表的取值问题
2017/11/22 Javascript
spirngmvc js传递复杂json参数到controller的实例
2018/03/29 Javascript
python 上下文管理器使用方法小结
2017/10/10 Python
Python用sndhdr模块识别音频格式详解
2018/01/11 Python
Tensorflow 自带可视化Tensorboard使用方法(附项目代码)
2018/02/10 Python
python3实现SMTP发送邮件详细教程
2018/06/19 Python
Django 中使用流响应处理视频的方法
2018/07/20 Python
python pygame模块编写飞机大战
2018/11/20 Python
Python面向对象程序设计OOP入门教程【类,实例,继承,重载等】
2019/01/05 Python
Python图像处理库PIL中图像格式转换的实现
2020/02/26 Python
HTML5中判断横屏竖屏的方法(移动端)
2016/08/04 HTML / CSS
韩国著名的在线综合购物网站:Akmall
2016/08/07 全球购物
Columbia美国官网:美国著名的户外服装品牌
2016/11/24 全球购物
澳大利亚排名第一的儿童在线玩具商店:Toy Galaxy
2018/10/06 全球购物
私有程序集与共享程序集有什么区别
2013/04/05 面试题
上海微创软件面试题
2012/06/14 面试题
公司募捐倡议书
2014/05/14 职场文书
爱护公共设施演讲稿
2014/09/13 职场文书
安全生产工作汇报
2014/10/28 职场文书
丽江古城导游词
2015/02/03 职场文书
公司业务员管理制度
2015/08/05 职场文书
企业年会祝酒词
2015/08/11 职场文书
SpringBoot 集成短信和邮件 以阿里云短信服务为例
2022/04/22 Java/Android