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项目设置resolves.alias: '@'路径并适配webstorm
Dec 02 Vue.js
Vue解决移动端弹窗滚动穿透问题
Dec 15 Vue.js
如何在vue中使用kindeditor富文本编辑器
Dec 19 Vue.js
Vue——前端生成二维码的示例
Dec 19 Vue.js
vue el-upload上传文件的示例代码
Dec 21 Vue.js
vue+openlayers绘制省市边界线
Dec 24 Vue.js
vue3弹出层V3Popup实例详解
Jan 04 Vue.js
Vue全家桶入门基础教程
May 14 Vue.js
vue使用echarts实现折线图
Mar 21 Vue.js
vue ref如何获取子组件属性值
Mar 31 Vue.js
vue实现在data里引入相对路径
Jun 05 Vue.js
Vue深入理解插槽slot的使用
Aug 05 Vue.js
vue3中的组件间通信
vue前端工程的搭建
vue中data改变后让视图同步更新的方法
vue3如何优雅的实现移动端登录注册模块
开发一个封装iframe的vue组件
如何让vue长列表快速加载
Vue3 Composition API的使用简介
You might like
php 常用字符串函数总结
2008/03/15 PHP
php连接数据库代码应用分析
2011/05/29 PHP
PHP运行出现Notice : Use of undefined constant 的完美解决方案分享
2012/03/05 PHP
Linux系统下php获得系统分区信息的方法
2015/03/30 PHP
CodeIgniter配置之autoload.php自动加载用法分析
2016/01/20 PHP
PHP使用mongoclient简单操作mongodb数据库示例
2019/02/08 PHP
通过DOM脚本去设置样式信息
2010/09/19 Javascript
javascript获取ckeditor编辑器的值(实现代码)
2013/11/18 Javascript
Javascript核心读书有感之语言核心
2015/02/01 Javascript
JS实现带圆弧背景渐变效果的导航菜单代码
2015/10/13 Javascript
只需五句话搞定JavaScript作用域(经典)
2016/07/26 Javascript
AngularJs ng-repeat 嵌套如何获取外层$index
2016/09/21 Javascript
微信小程序 教程之引用
2016/10/18 Javascript
vue-hook-form使用详解
2017/04/07 Javascript
vue-router传参用法详解
2019/01/19 Javascript
记一次vue去除#问题处理经过小结
2019/01/24 Javascript
vue-父子组件和ref实例详解
2019/11/10 Javascript
浅谈JavaScript中this的指向问题
2020/07/28 Javascript
深入理解python对json的操作总结
2017/01/05 Python
django初始化数据库的实例
2018/05/27 Python
用python爬取租房网站信息的代码
2018/12/14 Python
Python变量类型知识点总结
2019/02/18 Python
python中selenium操作下拉滚动条的几种方法汇总
2019/07/14 Python
python实现socket+threading处理多连接的方法
2019/07/23 Python
Python 自动登录淘宝并保存登录信息的方法
2019/09/04 Python
wxPython实现列表增删改查功能
2019/11/19 Python
W3C公布最新的HTML5标准草案
2008/10/17 HTML / CSS
"引用"与指针的区别是什么
2016/09/07 面试题
ShellScript面试题一则-ShellScript编程
2014/06/24 面试题
广告传媒专业应届生求职信
2014/03/01 职场文书
优秀公益广告词大全
2014/03/19 职场文书
市级青年文明号申报材料
2014/05/26 职场文书
学习党代会心得体会
2014/09/05 职场文书
开票员岗位职责
2015/02/12 职场文书
2015年办公室工作总结范文
2015/03/31 职场文书
《少年闰土》教学反思
2016/02/18 职场文书