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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 使用 Anaconda 安装 Pytorch

    使用 Anaconda 安装 Pytorch本文的主要内容是使用Anaconda安装Pytorch,PyTorch是一个开源的Python机器学习库,基于Torch,用于自然语言处理等应用程序,其运行环境已兼容Windows(CUDA,CPU)、MacOS(CPU)、Linux(CUDA,ROCm,CPU)。

    2022年10月6日
    2
  • 大数据应用管理模式及内容

    大数据应用管理模式及内容通过调研,数据应用管理可总结为分散管理型、职能复用型、集中管理型三种模式,数据应用管理模式中重点关注组织管理、需求管理、建设管理、成果管理四大领域。(1)管理模式分散管理型:各部门分散开展数据应用,无集中管理,例如某某国有集团,公司各业务部门均设有业务数据部门,开展本部门数据应用相关事务。职能复用型:赋予现有部门数据应用管理职责,集中开展数据应用局部过程的管理事务,例如某工业公司,依托公司…

    2022年6月9日
    32
  • 发布网站中的那些事儿

    发布网站中的那些事儿发布网站中的那些事儿

    2022年4月24日
    51
  • POJ 2392 Space Elevator

    POJ 2392 Space Elevator

    2022年1月19日
    45
  • redis优化配置和redis.conf说明

    redis优化配置和redis.conf说明

    2021年12月14日
    47
  • vue filters 是什么?怎么使用?

    vue filters 是什么?怎么使用?vuefilters是什么?首先:filter翻译成中文是过滤器的意思。而在Vue中作用其实就是对字段进行预处理怎么使用呢?就用一个小Demo,讲解一下!目的:对字段进行处理,打印出“Helloworld!!!”首先,打印出“Helle”<template> <view> {{demo}} </view></template…

    2022年5月21日
    46

发表回复

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

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