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 相关文章推荐
vue3.0实现点击切换验证码(组件)及校验
Nov 18 Vue.js
浅析vue中的nextTick
Dec 28 Vue.js
vue实现一个获取按键展示快捷键效果的Input组件
Jan 13 Vue.js
使用vue3重构拼图游戏的实现示例
Jan 25 Vue.js
如何在Vue项目中添加接口监听遮罩
Jan 25 Vue.js
详解vue身份认证管理和租户管理
May 25 Vue.js
Vue CLI中模式与环境变量的深入详解
May 30 Vue.js
一起来看看Vue的核心原理剖析
Mar 24 Vue.js
vue中使用mockjs配置和使用方式
Apr 06 Vue.js
vue 给数组添加新对象并赋值
Apr 20 Vue.js
解决vue自定义组件@click点击失效问题
Apr 30 Vue.js
el-table-column 内容不自动换行的解决方法
Aug 14 Vue.js
vue3中的组件间通信
vue前端工程的搭建
vue中data改变后让视图同步更新的方法
vue3如何优雅的实现移动端登录注册模块
开发一个封装iframe的vue组件
如何让vue长列表快速加载
Vue3 Composition API的使用简介
You might like
php 上传文件类型判断函数(避免上传漏洞 )
2010/06/08 PHP
PHP的HTTP客户端Guzzle简单使用方法分析
2019/10/30 PHP
js计算页面刷新的次数
2009/07/20 Javascript
基于jQuery的图片剪切插件
2011/08/03 Javascript
js判断FCKeditor内容是否为空的两种形式
2013/05/14 Javascript
JavaScript事件处理器中的event参数使用介绍
2013/05/24 Javascript
火狐textarea输入法的bug的触发及解决
2013/07/24 Javascript
js中小数转换整数的方法
2014/01/26 Javascript
jquery 取子节点及当前节点属性值的方法
2014/08/24 Javascript
举例讲解JavaScript substring()的使用方法
2015/11/09 Javascript
AngularJS中update两次出现$promise属性无法识别的解决方法
2017/01/05 Javascript
node文字生成图片的示例代码
2017/10/26 Javascript
javascript浏览器用户代理检测脚本实现方法
2017/10/27 Javascript
vue里面v-bind和Props 利用props绑定动态数据的方法
2018/08/27 Javascript
vue webpack打包后图片路径错误的完美解决方法
2018/12/07 Javascript
Vue $mount实战之实现消息弹窗组件
2019/04/22 Javascript
Element-ui中元素滚动时el-option超出元素区域的问题
2019/05/30 Javascript
JavaScript中this的学习笔记及用法整理
2020/02/17 Javascript
vue-preview动态获取图片宽高并增加旋转功能的实现
2020/07/29 Javascript
python实现ID3决策树算法
2017/12/20 Python
Python实现的根据IP地址计算子网掩码位数功能示例
2018/05/23 Python
对pandas中Series的map函数详解
2018/07/25 Python
详解python如何在django中为用户模型添加自定义权限
2018/10/15 Python
django与小程序实现登录验证功能的示例代码
2019/02/19 Python
详解利用Python scipy.signal.filtfilt() 实现信号滤波
2019/06/05 Python
Python实现简单的猜单词小游戏
2020/10/28 Python
为智能设备设计个性化保护套网站:caseable
2017/01/05 全球购物
荷兰照明、灯具和配件网上商店:dmlights
2019/08/25 全球购物
加拿大服装和鞋类零售商:Mark’s
2021/01/04 全球购物
如何进行Linux分区优化
2013/02/12 面试题
成考报名单位证明范本
2014/01/16 职场文书
老师给学生的表扬信
2014/01/17 职场文书
应届毕业生如何写求职信
2014/02/16 职场文书
新学期决心书
2014/03/11 职场文书
四风问题对照检查材料
2014/09/22 职场文书
处级干部考察材料
2014/12/24 职场文书