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开发chrome插件,实现获取界面数据和保存到数据库功能
Dec 01 Vue.js
vuex页面刷新导致数据丢失的解决方案
Dec 10 Vue.js
vue3.0自定义指令(drectives)知识点总结
Dec 27 Vue.js
vue中使用echarts的示例
Jan 03 Vue.js
vue.js实现点击图标放大离开时缩小的代码
Jan 27 Vue.js
vue3如何优雅的实现移动端登录注册模块
Mar 29 Vue.js
解决Vue+SpringBoot+Shiro跨域问题
Jun 09 Vue.js
Vue3如何理解ref toRef和toRefs的区别
Feb 18 Vue.js
Vue的列表之渲染,排序,过滤详解
Feb 24 Vue.js
vue实现列表拖拽排序的示例代码
Apr 08 Vue.js
vue 给数组添加新对象并赋值
Apr 20 Vue.js
使用vuex-persistedstate本地存储vuex
Apr 29 Vue.js
vue3中的组件间通信
vue前端工程的搭建
vue中data改变后让视图同步更新的方法
vue3如何优雅的实现移动端登录注册模块
开发一个封装iframe的vue组件
如何让vue长列表快速加载
Vue3 Composition API的使用简介
You might like
汉字转化为拼音(php版)
2006/10/09 PHP
ThinkPHP使用PHPExcel实现Excel数据导入导出完整实例
2014/07/22 PHP
优化WordPress的Google字体以加速国内服务器上的运行
2015/11/24 PHP
给PHP开发者的编程指南 第一部分降低复杂程度
2016/01/18 PHP
Discuz论坛密码与密保加密规则
2016/12/19 PHP
使用PHP+Redis实现延迟任务,实现自动取消订单功能
2019/11/21 PHP
js字符串转成JSON
2013/11/07 Javascript
jquery easyui 对于开始时间小于结束时间的判断示例
2014/03/22 Javascript
JavaScript中定义函数的三种方法
2015/03/12 Javascript
JQuery中属性过滤选择器用法实例分析
2015/05/18 Javascript
深入理解JavaScript中的箭头函数
2015/07/28 Javascript
jquery自定义表单验证插件
2016/10/12 Javascript
jquery Ajax 全局调用封装实例详解
2017/01/16 Javascript
vue组件定义,全局、局部组件,配合模板及动态组件功能示例
2019/03/19 Javascript
使用JS来动态操作css的几种方法
2019/12/18 Javascript
完美解决通过IP地址访问VUE项目的问题
2020/07/18 Javascript
python调用Delphi写的Dll代码示例
2017/12/05 Python
Python编程把二叉树打印成多行代码
2018/01/04 Python
python实现时间o(1)的最小栈的实例代码
2018/07/23 Python
对Python3 goto 语句的使用方法详解
2019/02/16 Python
详解python中的hashlib模块的使用
2019/04/22 Python
Python中pymysql 模块的使用详解
2019/08/12 Python
django执行数据库查询之后实现返回的结果集转json
2020/03/31 Python
Python-jenkins模块之folder相关操作介绍
2020/05/12 Python
Agoda中文官网:安可达(低价预订全球酒店)
2021/01/18 全球购物
华美博弈C/VC工程师笔试试题
2012/07/16 面试题
八一演出活动方案
2014/02/03 职场文书
网页美工求职信
2014/02/15 职场文书
银行青年文明号事迹材料
2014/05/31 职场文书
食品安全主题班会
2015/08/13 职场文书
《葡萄沟》教学反思
2016/02/23 职场文书
竞聘书的秘诀
2019/04/02 职场文书
Python实现的扫码工具居然这么好用!
2021/06/07 Python
解决Maven项目中 Invalid bound statement 无效的绑定问题
2021/06/15 Java/Android
微信小程序中wxs文件的一些妙用分享
2022/02/18 Javascript
Python  lambda匿名函数和三元运算符
2022/04/19 Python