Ant Design Vue Pro 动态路由

1、关闭mock

注释掉main.js第16行

// with polyfills
import 'core-js/stable'
import 'regenerator-runtime/runtime'

import Vue from 'vue'
import App from './App.vue'
import router from './router'
import store from './store/'
import i18n from './locales'
import { VueAxios } from './utils/request'
import ProLayout, { PageHeaderWrapper } from '@ant-design-vue/pro-layout'
import themePluginConfig from '../config/themePluginConfig'

// mock
// WARNING: `mockjs` NOT SUPPORT `IE` PLEASE DO NOT USE IN `production` ENV.
// import './mock'  // 注释掉本行

import bootstrap from './core/bootstrap'
2、修改动态权限功能引用

src/store/index.js,注释掉第8行,放开第11行

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'
4、修改报错

此时会出现如下错误:

ERROR  Failed to compile with 2 errors                                                                                                                     10:12:09
These dependencies were not found:

* @/utils/permissions in ./node_modules/_cache-loader@4.1.0@cache-loader/dist/cjs.js??ref--12-0!./node_modules/_babel-loader@8.2.2@babel-loader/lib!./node_modules/_cache-loader@4.1.0@cache-loader/dist/cjs.js??ref--0-0!./node_modules/_vue-loader@15.9.6@vue-loader/lib??vue-loader-options!./src/views/role/RoleList.vue?vue&type=script&lang=js&
* @/views/account/settings/BaseSetting in ./src/router/generator-routers.js

To install them, you can run: npm install --save @/utils/permissions @/views/account/settings/BaseSetting
1、新建@/utils/permissions.js文件,内容如下:
因为,/src/views/role/RoleList.vue中引用了这个文件的actionToObject函数,但是缺失所以报错。暂时先给补上,后续逻辑自己实现即可。
export function actionToObject (data) {
  return data
}
2./src/router/generator-routers.js文件注释掉第49// 'BaseSettings': () => import('@/views/account/settings/BaseSetting'),
5、修改src/api/login.js
# 将url修改为自己项目的URL
const userApi = {
  Login: '/lab/portal/login',
  Logout: '/lab/portal/logout',
  ForgePassword: '/lab/portal/forge-password',
  Register: '/lab/portal/register',
  twoStepCode: '/lab/portal/2step-code',
  SendSms: '/lab/portal/account/sms',
  SendSmsErr: '/lab/portal/account/sms_err',
  // get my info
  UserInfo: '/lab/portal/userInfo',
  UserMenu: '/lab/portal/user/nav'
}
6、修改permission.js逻辑

框架原来的逻辑是

1、登录,获取token

2、访问GetInfo方法,拿到用户角色信息

3、访问GenerateRoutes,根据角色信息获取路由信息。

给他精简为两步,1、登录获取token,2、访问getInfo方法拿到用户角色、权限等全部信息

# 改成这样样子

		// check login user.roles is null
      if (store.getters.roles.length === 0) {
        // request login userInfo
        store.dispatch('GetInfo').then(res => {
              // 动态添加可访问路由表
              router.addRoutes(store.getters.addRouters)
              // 请求带有 redirect 重定向时,登录自动重定向到该地址
              const redirect = decodeURIComponent(from.query.redirect || to.path)
              if (to.path === redirect) {
                // set the replace: true so the navigation will not leave a history record
                next({ ...to, replace: true })
              } else {
                // 跳转到目的路由
                next({ path: redirect })
              }
          })
          .catch(() => {
            notification.error({
              message: '错误',
              description: '请求用户信息失败,请重试'
            })
            // 失败时,获取用户信息失败时,调用登出,来清空历史保留信息
            store.dispatch('Logout').then(() => {
              next({ path: loginRoutePath, query: { redirect: to.fullPath } })
            })
          })
      } else {
        next()
      }
7、修改src/store/modules/user.js
1import { generatorDynamicRouter } from '@/router/generator-routers'
2、修改GetInfo函数(可根据自己实际情况进行调整)

    GetInfo ({ commit }) {
      return new Promise((resolve, reject) => {
        getInfo().then(response => {
          const result = response.data
          if (result.role && result.role > 0) {
            commit('SET_ROLES', result.role)
            commit('SET_INFO', result)
            commit('SET_ROUTERS', generatorDynamicRouter(result.routes))
          } else {
            reject(new Error('getInfo: roles must be a non-null array !'))
          }

          commit('SET_NAME', { name: result.name, welcome: welcome() })
          commit('SET_AVATAR', result.avatar)

          resolve(response)
        }).catch(error => {
          reject(error)
        })
      })
    }
8、修改generatorDynamicRouter

/**
 * 动态生成菜单
 * @param token
 * @returns {Promise<Router>}
 */
export const generatorDynamicRouter = (jsonRouter) => {
  const routers = generator(jsonRouter)// labRouterMap
  routers.push(notFoundRouter)
  return routers
}

#根据后台传回来的json自行调整具体数据
/**
 * 格式化树形结构数据 生成 vue-router 层级路由表
 *
 * @param routerMap
 * @param parent
 * @returns {*}
 */
export const generator = (routerMap, parent) => {
  return routerMap.map(item => {
    // const { title, show, hideChildren, hiddenHeaderContent, target, icon } = item.meta || {}
    const currentRouter = {
      // 如果路由设置了 path,则作为默认 path,否则 路由地址 动态拼接生成如 /dashboard/workplace
      path: item.path || `${parent && parent.path || ''}/${item.path}`,
      // 路由名称,建议唯一
      name: item.name || '',
      // 该路由对应页面的 组件 :方案1
      // component: constantRouterComponents[item.component || item.key],
      // 该路由对应页面的 组件 :方案2 (动态加载)
      component: (constantRouterComponents[item.component.data]) || (() => import(`@/views/${item.component.data}`)),
		//注意,这个@后面一定要跟一个views或者其他的字符串,否则编译会检查md文件异常
      // meta: 页面标题, 菜单图标, 页面权限(供指令权限用,可去掉)
      meta: {
        title: item.meta.title,
        icon: item.meta.icon || undefined
      }
    }
    // 是否设置了隐藏菜单
    if (item.hidden === true) {
      currentRouter.hidden = true
    }

    // 为了防止出现后端返回结果不规范,处理有可能出现拼接出两个 反斜杠
    if (!currentRouter.path.startsWith('http')) {
      currentRouter.path = currentRouter.path.replace('//', '/')
    }
    // 重定向
    item.redirect && (currentRouter.redirect = item.redirect)
    // 是否有子菜单,并递归处理
    if (item.children && item.children.length > 0) {
      // Recursion
      currentRouter.children = generator(item.children, currentRouter)
    }
    return currentRouter
  })
}


  • 2
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Ant Design Pro Vue 动态路由是指在运行时根据用户权限或其他条件动态生成路由。这种方式可以使应用程序更加灵活和可扩展,可以根据不同的用户角色或权限来展示不同的页面或菜单。在 Ant Design Pro Vue 中,可以通过配置路由表和权限控制来实现动态路由。具体实现方式可以参考官方文档或相关教程。 ### 回答2: Ant Design Pro Vue 是一个基于 Vue.js 的企业级中后台前端开发框架,它能够极大地提高开发效率和页面美观度。动态路由是其一个非常重要的功能,可以让前端路由的配置在后台管理系统中进行动态修改和生成,减少了前后端的耦合性。下面将对动态路由的使用进行详细介绍。 动态路由的概念: 动态路由是指根据后台返回的数据动态生成前端路由配置,前端可以通过该配置进行页面的访问。具体来说,当用户在前端操作时,前端会发起请求到后台,后台返回一个包含路由信息的 JSON 数据,前端负责解析该数据并进行路由配置。 实现步骤: 1.首先在路由配置文件中定义一个动态路由所在的组件。 2.在页面初始加载时,通过 Ajax 请求后台路由信息。 3.将后台返回的路由信息动态生成配置,并添加到路由表中。 4.当用户访问页面时,根据请求的路径进行路由匹配,并将匹配到的组件渲染到页面中。 优点: 1.动态路由配置可以让前端和后端的路由分离,减少了前后端的耦合性。 2.简化了前端路由的管理,后台管理员可以通过后台管理系统进行路由配置,而不需要修改前端代码。 3.动态路由可以提高前端的开发效率,让前端开发人员更加专注于界面和交互的开发。 总之,Ant Design Pro Vue 动态路由是一个非常重要的功能,它大大提高了前端开发的效率和可维护性,也方便了后台管理员进行路由配置。因此,大家在使用 Ant Design Pro Vue 开发企业级中后台系统时,一定要熟练掌握其动态路由的使用方法。 ### 回答3: Ant Design Pro Vue 是一个基于 Vue.js 技术栈的企业级中后台前端解决方案。它使用 Ant Design UI 组件库,并提供了一系列的经过优化的业务逻辑组件和样式,可以帮助开发人员更快速地完成中后台项目的开发。 动态路由Ant Design Pro Vue 的一个重要特性之一,它可以让开发人员根据业务需求动态地生成路由。这个特性的优点在于它可以大大减少开发人员的工作量,提高开发效率。具体来说,动态路由可以帮助开发人员实现以下几方面的需求: 1. 针对不同的角色或权限级别,动态生成不同的路由配置。这样,可以保证不同用户只能访问其具备权限的资源。 2. 根据业务需求动态生成菜单配置。这样,可以方便地根据业务需求灵活地修改菜单展示。 3. 当前路由路径不存在时,可以根据业务需求自动跳转到指定的路由。这样,可以避免用户访问不存在的路由时出现问题。 除了以上几点之外,动态路由还具有以下几个优点: 1. 可以更加灵活地处理路由跳转逻辑,使得开发人员可以更方便地处理复杂的业务逻辑。 2. 可以更好地适应企业级前端项目开发的需求,使得项目可以更容易地扩展和维护。 总之,Ant Design Pro Vue动态路由特性可以帮助开发人员快速构建出高质量的企业级中后台前端项目。它的灵活性和可扩展性可以满足各种不同项目的需求。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值