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)
上一篇 2025年9月14日 上午11:01
下一篇 2025年9月14日 上午11:22


相关推荐

  • Format和FormatDateTime用法[通俗易懂]

    Delphiformat的用法一、Format函数的用法functionFormat(constFormat:string;constArgs:arrayofconst):string;overload;事实上Format方法有两个种形式,另外一种是三个参数的,主要区别在于它是线程安全的,但并不多用,所以这里只对第一个介绍:functionFormat…

    2022年4月17日
    53
  • C++实现远程桌面集群软件[通俗易懂]

    C++实现远程桌面集群软件[通俗易懂]由于在学校需要管理很多主机的需要,自己动手写了个3389桌面集群的软件。软件很简单,分别用2种方式实现:(1)快速登入模式:微软的MsRdpClientActiveX控件实现(2)远程桌面模式:生成.rdp文件实现

    2022年10月15日
    5
  • 如何设置让网站禁止被爬虫收录?robots.txt

    如何设置让网站禁止被爬虫收录?robots.txt

    2021年10月9日
    44
  • 可访问性级别的C# 修饰符

    使用访问修饰符public、protected、internal或private可以为成员指定以下声明的访问级别之一。http://keleyi.com/a/bjad/3ccfqh95.htm

    2021年12月21日
    41
  • 逻辑漏洞之密码找回漏洞(semcms)「建议收藏」

    逻辑漏洞之密码找回漏洞(semcms)「建议收藏」目录什么是密码找回漏洞一般流程可能产生该漏洞的情况脑洞图1.用户凭证暴力破解2.返回凭证3.邮箱弱token4.用户凭证有效性5.重新绑定6.服务器验证7.用户身份验证8.找回步骤9.本地验证10.注入11.Token生成12.注册覆盖13.session覆盖演示暴破验证码找回密码更改id号修改admin密码靶场cms下载什么是密码找回漏洞利用漏洞修改他人帐号密码,甚至修改管理员的密码。一般流程1首先尝试正常找回密码流程,选择不同的找回方式,记录所有数据包2分析数据包,找到敏感部分3

    2022年4月30日
    76
  • matlab中的zeros函数

    matlab中的zeros函数随时随地阅读更多技术实战干货 获取项目源码 学习资料 请关注源代码社区公众号 ydmsq666 创建一个全为零元素的数组语法 B zeros n B zeros m n B zeros mn B zeros d1 d2 d3 B zeros d1d2d3

    2026年3月20日
    2

发表回复

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

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