新版本下的旧 URL “拦截门” - 如何优雅地拒绝访问

序言

系统大版本升级后,我们公司的低代码产品在功能和界面上进行了较大的改进,因此存在新版本和旧版本的切换使用,并且前端代码中旧版本路由和新版本是耦合在一起的。为了让用户逐渐适应新版本,我们需要同时维护两个版本。对于新用户,他们可以直接使用新版本体验产品。而对于旧用户,我们默认将其引导至旧版本,同时提供了体验新版本的选项。然而,在这个过渡期中,我们面临着两个问题:

  1. 在新版本下,如何处理用户访问旧版本url的交互体验问题
  2. 在旧版本下,如何处理用户访问新版本url的交互体验问题?

下面,我们将分别探讨这两个在前端技术下如何设计 & 实现

需求

1.在新版本下,用户访问旧版本url,出现以下引导页面。让用户自由选择去哪个版本

2.在旧版本下,用户访问新版本url,出现以下引导页面。让用户自由选择去哪个版本

方案

1.如何区分新旧路由?

两个版本路由耦合在一起?那该如何区分?

设计路由版本标识:在路由元信息meta中添加参数version,类型为数组,指明路由适用的版本。

  • version: ['v2', 'v3'] -> 代表该路由在v2、v3个版本内都适用
  • version: ['v2'] -> 代表该路由只能在v2版本内适用
  • version: ['v3'] -> 代表该路由只能在v3版本内适用

2.路由拦截

路由版本标识有了,那就来整个路由过滤公共方法:将非当前版本的路由组件重定向到对应的引导页面组件:@/views/error/versionChange

/**
 * 过滤路由配置,将不符合当前版本的路由的component引入@/views/error/versionChange
 *
 * @param {Array} routes 路由配置数组
 * @returns {Array} 符合版本要求的路由配置数组
 */
export function filterRoutes(routes) {
  // 获取当前系统版本
  const loginStatus = localStorage.getItem(_isConsoleLogin) || sessionStorage.getItem('is_console_login')
  if (loginStatus) {
    const version = getConsoleVersion()
    if (!version) {
      // 没有缓存时,要初始化设置版本
      authUtils._redirectDefaultCallback({ isJump: false })
    }
    const isV2Url = window.location.href.indexOf('micro') < 0
    /**
   * 辅助函数:递归过滤路由配置树中的每个节点
   *
   * @param {Object} route 当前处理的路由对象
   * @param {Object} parent 父路由对象(可选)
   * @returns {Object|undefined} 处理后的路由对象,或 undefined(如果该路由不符合版本要求)
   */
    const filterRoute = function(route) {
      if (route.meta && route.meta.version && version && !route.meta.version.includes(version)) {
      // 将不符合当前版本的路由的component引入@/views/error/versionChange
        route.component = () => import('@/views/error/versionChange')
      } else if (version === 'v3' && isV2Url && !route?.meta?.version && !route?.redirect) {
      // 3.0版本下原则上不允许访问不带micro的链接, 想要允许访问, 需要根据情况补充meta.version, meta.version不能为空
        route.component = () => import('@/views/error/versionChange')
      }
      if (route && route.children) {
      //  使用 map() 方法遍历当前路由对象的子路由,
      //  并递归调用 filterRoute() 函数来处理每个子路由
        route.children = route.children.map(child => filterRoute(child))
      }
      return route
    }
    // 使用 map() 方法遍历原始路由配置数组,并递归地过滤每个路由对象
    return routes.map(route => filterRoute(route))
  } else {
    return routes
  }
}

3.路由模块中按需引入公共方法

const adminComponent = () => import('@/views/index/index')

Vue.use(Router)

// 定义子路由模块集合
const filterRouteList = filterRoutes([...index])

const childrenRouter = [
  {
    path: '/',
    name: 'index',
    component: adminComponent,
    children: filterRouteList
  }
]

export default childrenRouter

至此便可以做到,当在浏览器输入访问不符合当前版本的路由时,则会被重定向到versionChange页面。

结语

通过在路由中设计版本标识,并借助路由过滤公共方法,我们成功实现了新版本下访问旧版本URL路由的拦截和引导,以及旧版本下访问新版本URL的处理。这一简单而有效的方法,为用户提供了灵活的选择权,让他们自由切换至所需版本。

七巧低代码是以业务应用搭建为核心的aPaaS低代码应用平台,为客户提供aPaaS+iPaaS的全民数智化解决方案。

点击获取更多技术资料

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

道一云黑板报

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值