antd pro路由

antd pro路由antddesignpr 的路由有两种方式一种是前端定义好路由 routes 由后端返回 roles 进行过滤 另一种是后端返回 routes 列表生成 menu 一 先看第一种方式前端定义好路由 routes 由后端返回 roles 进行过滤 1 在 src permission js 路由守卫首先在派发一个 GetInfo 的 action 调取 getinfo 方法调后台的用户接口返回用户信息和 roles 用户权限 在 src store modules user js 中

antd design pro vue 的路由有两种方式 一种是前端定义好路由routes,由后端返回roles进行过滤 ; 另一种是后端返回 routes 列表 生成menu。

一、先看第一种方式 前端定义好路由routes,由后端返回roles进行过滤 

1、在src/permission.js 路由守卫 首先在派发一个GetInfo的action  调取getinfo()方法 调后台的 用户接口  返回用户信息和roles用户权限

   在src/store/modules/user.js中 

// 获取用户信息 GetInfo ({ commit }) { return new Promise((resolve, reject) => { getInfo().then(response => { const result = response.result if (result.role && result.role.permissions.length > 0) { const role = result.role role.permissions = result.role.permissions role.permissions.map(per => { if (per.actionEntitySet != null && per.actionEntitySet.length > 0) { const action = per.actionEntitySet.map(action => { return action.action }) per.actionList = action } }) role.permissionList = role.permissions.map(permission => { return permission.permissionId }) commit('SET_ROLES', result.role) commit('SET_INFO', result) } else { reject(new Error('getInfo: roles must be a non-null array !')) } // commit('SET_ROLES', result.role) // commit('SET_INFO', result) commit('SET_NAME', { name: result.name, welcome: welcome() }) commit('SET_AVATAR', result.avatar) resolve(response) }).catch(error => { reject(error) }) }) },

通过  role.permissionList = role.permissions.map(permission => { return permission.permissionId })

把返回的权限role的permisssionList字段中 并将roles存储到vuex中
然后继续看在src/permission.js 派发GenerateRoutes action 将 getinfo()的返回 作为 commit参数 传递给 GenerateRoutes 这里注意 在antd pro vue 中 是分成两种路由方式的 默认用第一种前端写死路由方式 所以 在src/store/index.js 注释掉 代码如下
import Vue from 'vue' import Vuex from 'vuex' import app from './modules/app' import user from './modules/user' // default router permission control import permission from './modules/permission' // dynamic router permission control (Experimental) // import permission from './modules/async-router' import getters from './getters' Vue.use(Vuex) export default new Vuex.Store({ modules: { app, user, permission }, state: { }, mutations: { }, actions: { }, getters }) 

 然后重点看这个src/strore/modules/permission.js

const permission = { state: { routers: constantRouterMap, addRouters: [] }, mutations: { SET_ROUTERS: (state, routers) => { state.addRouters = routers state.routers = constantRouterMap.concat(routers) } }, actions: { GenerateRoutes ({ commit }, data) { return new Promise(resolve => { const { roles } = data console.log('routerdata', data) const accessedRouters = filterAsyncRouter(asyncRouterMap, roles) commit('SET_ROUTERS', accessedRouters) resolve() }) } } } export default permission 

依赖这个方法  参数为 asyncRouterMap 为 src/config/router.config.js 前端写死的路由表

 通过过滤 asyncRouterMap  那route对象里meta的permission字段判断是否包含permissionList数组中 的任何一项

最后将静态路由合并到一起写到vuex中

二、第二种方式 服务端返回routes列表 前端组装成menu树

1、首先 找到src/store/index.js 
import Vue from 'vue' import Vuex from 'vuex' import app from './modules/app' import user from './modules/user' // default router permission control // import permission from './modules/permission' // dynamic router permission control (Experimental) import permission from './modules/async-router' import getters from './getters' Vue.use(Vuex) export default new Vuex.Store({ modules: { app, user, permission }, state: { }, mutations: { }, actions: { }, getters }) 

 2、还是找到src/permission.js

antd pro路由

  派发的GenerateRoutes   commit 传token 

const permission = { state: { routers: constantRouterMap, addRouters: [] }, mutations: { SET_ROUTERS: (state, routers) => { state.addRouters = routers state.routers = constantRouterMap.concat(routers) } }, actions: { GenerateRoutes ({ commit }, data) { return new Promise(resolve => { const { token } = data generatorDynamicRouter(token).then(routers => { commit('SET_ROUTERS', routers) resolve() }) }) } } } export default permission

在src/router/generator-routers

/ * 动态生成菜单 * @param token * @returns {Promise<Router>} */ export const generatorDynamicRouter = (token) => { return new Promise((resolve, reject) => { loginService.getCurrentUserNav(token).then(res => { const { result } = res const menuNav = [] const childrenNav = [] // 后端数据, 根级树数组, 根级 PID listToTree(result, childrenNav, 0) console.log('childrenNav3333',childrenNav) rootRouter.children = childrenNav menuNav.push(rootRouter) console.log('menuNav', menuNav) const routers = generator(menuNav) routers.push(notFoundRouter) console.log('routers', routers) resolve(routers) }).catch(err => { reject(err) }) }) }

 通过listTotree动态生成menu

/ * 数组转树形结构 * @param list 源数组 * @param tree 树 * @param parentId 父ID */ const listToTree = (list, tree, parentId) => { list.forEach(item => { // 判断是否为父级菜单 if (item.parentId === parentId) { const child = { ...item, key: item.key || item.name, children: [] } // 迭代 list, 找到当前菜单相符合的所有子菜单 listToTree(list, child.children, item.id) // 删掉不存在 children 值的属性 if (child.children.length <= 0) { delete child.children } // 加入到树中 tree.push(child) } }) }

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/232789.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 进程调度算法;先来先服务调度算法、短作业优先调度算法、时间片轮转调度算法「建议收藏」

    进程调度算法;先来先服务调度算法、短作业优先调度算法、时间片轮转调度算法「建议收藏」一、实验目的和要求1.了解进程调度算法的特点2.掌握进程调度算法,如先来先服务调度算法(firstcomefirstserved,FCFS)、短作业优先调度算法(shotjobfirst,SJF)、时间片轮转调度算法。二、实验内容设计模拟实现FCFS、SJF、时间片轮转调度算法的C语言程序1.FCFS算法:按照作业/进程进入队列的先后顺序进行挑选,先进入的将先进行…

    2022年9月29日
    2
  • 操作系统——银行家算法

    操作系统——银行家算法自从写完第一篇博客,发现写博客也挺好玩的,比平时写word应付作业有趣的多,而且文章在网上还能帮助别人,自己平时也经常看CSDN,这不,老师要求我们实现一下操作系统的银行家算法,所以我就来了!那么,什么是银行家算法呢?如果你很了解请跳过这一段,就是解决死锁问题的一个算法,是由艾兹格·迪杰斯特拉在1965年为T.H.E系统设计的一种避免死锁产生的算法。它以银行借贷系统的分配策略为基础,判…

    2022年7月22日
    10
  • TensorFlow加载cifar10数据集

    TensorFlow加载cifar10数据集加载cifar10数据集cifar10_dir=’C:/Users/1/.keras/datasets/cifar-10-batches-py'(train_images,train_labels),(test_images,test_labels)=load_data(cifar10_dir)注意:在官网下好cifar10数据集后将其解压成下面形式load_local_cifar10.pyfrom__future__importabsolute_importfrom_

    2022年6月22日
    56
  • matlab fmincon函数格式,求助 fmincon 函数调用格式说明

    matlab fmincon函数格式,求助 fmincon 函数调用格式说明functionKineticsEstclearallclck0=[0.50.50.50.50.5];%参数初值lb=[00000];%参数下限ub=[+inf+inf+inf+inf+inf];%参数上限x0=[0.18830.25070.0467…

    2022年5月10日
    33
  • 全网最硬核解读计算机启动原理

    全网最硬核解读计算机启动原理

    2020年11月20日
    201
  • 【Mysql】mysql命令常用语句[通俗易懂]

    【Mysql】mysql命令常用语句[通俗易懂]文章目录数据库表增删改查likeunin待完善实践数据库–直接创建字符–createdatabaserxguo;–删除当前指定数据库–dropdatabaserxguo;–创建带初始字符的库–createdatabaserxguo_testDEFAULTCHARACTERSETutf8COLLATEutf8_general_ci;–指定数据库–use`rxguo_test`;表注意数值,字符串,时间自增,默认,非空,注

    2025年9月14日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号