菜单权限的控制

菜单权限的控制

提示:这里是基于潘佳辰后台管理系统模板中菜单权限的控制,用户有权限显示菜单,用户没有权限则不显示菜单,用户登录后,根据token获取的用户信息中包含有routes。在这里插入图片描述
这个routes数组中的字符串和路由中的name相同,也就是唯一标识,通过这个唯一标识进行权限的控制。
在这里插入图片描述


提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档


一、定义并注册路由组件

首先就是在pages中定义路由组件,然后在router路由器中注册路由,即上面的图片,这样我们的路由组件就准备完成了。

二、修改store中的配置

1.修改state

在state中,添加其他的属性

import { resetRouter, constantRoutes, allAsyncRoutes, anyRoute } from '@/router'
import router from '@/router'
import cloneDeep from 'lodash/cloneDeep'

const getDefaultState = () => {
    return {
        token: getToken(),
        name: '',
        avatar: '',
        buttons: [],
        roles: [],
        routes: [], //已经匹配好,用于显示的所有的路由
        asyncRoutes: [], //根据权限信息,匹配好的路由对象
    }
}
const state = getDefaultState()

buttons,roles,routes是后台返回来的
asyncRoutes是我们通过函数,根据返回来的routes和所有的allAsyncRoutes路由匹配筛选出来的异步路由

2.定义过滤函数

// 过滤路由
// 第一个参数,allAsyncRoutes是router中所有的异步路由,
// 第二个参数,routeNames是用户信息匹配的routes字符串数组
function filterAsyncRoutes(allAsyncRoutes, routeNames) {
    // 最终返回的是根据权限信息已经匹配好的路由
    return allAsyncRoutes.filter((item) => {
        // 匹配item.name在不在routeNames里面
        if (routeNames.indexOf(item.name) !== -1) {
            if (item.children && item.children.length) {
                // 递归遍历二级路由
                item.children = filterAsyncRoutes(item.children, routeNames)
            }
            return true
        }
    })
}

3.写mutations

  SET_USERINFO(state, userInfo) {
        state.name = userInfo.name
        state.avatar = userInfo.avatar
        state.buttons = userInfo.buttons
        state.roles = userInfo.roles
    },
    SET_ROUTES(state, asyncRoutes) {
        state.asyncRoutes = asyncRoutes
        state.routes = constantRoutes.concat([...asyncRoutes], anyRoute) //用于最后菜单显示的
        router.addRoutes([...asyncRoutes], anyRoute) //动态添加路由
    }

更改actions

    getInfo({ commit, state }) {
        return new Promise((resolve, reject) => {
            getInfo(state.token).then(response => {
                const { data } = response

                if (!data) {
                    return reject('Verification failed, please Login again.')
                }

                const { name, avatar } = data

                /*  commit('SET_NAME', name)
                 commit('SET_AVATAR', avatar) */
                commit('SET_USERINFO', data)
                commit('SET_ROUTES',
                //这里调用函数,返回的是匹配成功的路由
                filterAsyncRoutes(cloneDeep(allAsyncRoutes), data.routes))

                resolve(data)
            }).catch(error => {
                reject(error)
            })
        })
    },

更改routes引用

layout/components/sidebar/index.vue中的在这里插入图片描述
修改成自己store中最后添加的routes,不修改的话,一直用的是$router中最原始的路由

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值