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中通过render函数给子组件设置ref操作
Nov 17 Vue.js
Vue3+elementui plus创建项目的方法
Dec 01 Vue.js
Vue $attrs &amp; inheritAttr实现button禁用效果案例
Dec 07 Vue.js
Vue 组件注册全解析
Dec 17 Vue.js
Vue 简单实现前端权限控制的示例
Dec 25 Vue.js
Vue中ref和$refs的介绍以及使用方法示例
Jan 11 Vue.js
vue 实现click同时传入事件对象和自定义参数
Jan 29 Vue.js
Vue全家桶入门基础教程
May 14 Vue.js
简单聊聊Vue中的计算属性和属性侦听
Oct 05 Vue.js
vue如何使用模拟的json数据查看效果
Mar 31 Vue.js
vue报错function () { [native code] },无法出现我们想要的内容 Unknown custom element
Apr 11 Vue.js
vue router 动态路由清除方式
May 25 Vue.js
vue3中的组件间通信
vue前端工程的搭建
vue中data改变后让视图同步更新的方法
vue3如何优雅的实现移动端登录注册模块
开发一个封装iframe的vue组件
如何让vue长列表快速加载
Vue3 Composition API的使用简介
You might like
一个简单的自动发送邮件系统(二)
2006/10/09 PHP
php实现的SSO单点登录系统接入功能示例分析
2016/10/12 PHP
JavaScript监测ActiveX控件是否已经安装过的代码
2008/09/02 Javascript
Extjs学习笔记之九 数据模型(上)
2010/01/11 Javascript
js 兼容多浏览器的回车和鼠标焦点事件代码(IE6/7/8,firefox,chrome)
2010/04/14 Javascript
页面右下角弹出提示框示例代码js版
2013/08/02 Javascript
jquery js 重置表单 reset()具体实现代码
2013/08/05 Javascript
在页面加载完成后通过jquery给多个span赋值
2014/05/21 Javascript
wap图片滚动特效无css3元素纯js脚本编写
2014/08/22 Javascript
jQuery插件实现大图全屏图片相册
2015/03/14 Javascript
jQuery插件支持同一页面被多次调用
2016/02/14 Javascript
jQuery中slidedown与slideup方法用法示例
2016/09/16 Javascript
Bootstrap实现提示框和弹出框效果
2017/01/11 Javascript
Vue监听一个数组id是否与另一个数组id相同的方法
2018/09/26 Javascript
React 组件渲染和更新的实现代码示例
2019/02/21 Javascript
node.js中ws模块创建服务端和客户端,网页WebSocket客户端
2019/03/06 Javascript
vue中组件的3种使用方式详解
2019/03/23 Javascript
17道题让你彻底理解JS中的类型转换
2019/08/08 Javascript
Vue路由对象属性 .meta $route.matched详解
2019/11/04 Javascript
koa2的中间件功能及应用示例
2020/03/05 Javascript
es6函数之箭头函数用法实例详解
2020/04/25 Javascript
Vue 实现对quill-editor组件中的工具栏添加title
2020/08/03 Javascript
python实现2048小游戏
2015/03/30 Python
Python的collections模块中namedtuple结构使用示例
2016/07/07 Python
python 实现对文件夹中的图像连续重命名方法
2018/10/25 Python
使用wxpy实现自动发送微信消息功能
2020/02/28 Python
Python OpenCV中的numpy与图像类型转换操作
2020/12/11 Python
使用CSS3制作一个简单的进度条(demo)
2017/05/23 HTML / CSS
AmazeUI 折叠面板的实现代码
2020/08/17 HTML / CSS
英国空调、除湿机和通风设备排名第一:Air Con Centre
2019/02/25 全球购物
计算机操作自荐信
2013/12/07 职场文书
《金子》教学反思
2014/04/13 职场文书
事业单位财务人员岗位职责
2015/04/14 职场文书
2016年六一儿童节开幕词
2016/03/04 职场文书
SQL中的三种去重方法小结
2021/11/01 SQL Server
pytorch实现加载保存查看checkpoint文件
2022/07/15 Python