2.5 KiB
2.5 KiB
下载跳转 URL 修复设计
概述
当前访客端在触发下载型工具时,会沿用网页型工具的 same_tab 导航分支。若后台将下载工具配置为非新标签页,前端会直接执行 window.location.assign(actionUrl),导致当前 SPA 页面 URL 被改写成下载地址,破坏返回和继续浏览体验。
本次修复目标是保证下载行为不会修改当前访客页的 URL。下载应在新标签页或浏览器新窗口中完成;当前页继续停留在工具列表页或详情页。
目标定位
主要用户为访客端普通用户,在浏览工具列表或详情页时点击下载操作。
约束条件
- 保持现有网页模式
web的同标签/新标签配置能力不变。 - 保持已有下载埋点与下载票据逻辑不变。
- 变更范围尽量小,优先修复公开访客端入口,不扩展后台交互。
成功标准
- 下载型工具触发后,当前页 URL 保持不变。
- 首页和详情页的下载按钮行为一致。
- 网页型工具仍按现有
openIn配置运行。 - 新增自动化测试能覆盖下载模式不走当前页跳转。
架构设计
- 后端
AccessService.launchTool:- 对下载模式统一返回
openIn: 'new_tab'。 - 包括外部下载地址和票据下载两种分支。
- 对下载模式统一返回
- 前端
App.vue与ToolDetailPage.vue:- 仅网页模式
web + same_tab执行window.location.assign(...)。 - 下载模式始终使用
window.open(...),不再降级到当前页跳转。 - 若浏览器阻止弹窗,则提示用户允许新窗口,而不是改写当前页 URL。
- 仅网页模式
数据流
- 用户点击下载按钮。
- 前端调用
/tools/:id/launch。 - 后端返回
mode: download且openIn: new_tab。 - 前端使用
window.open(actionUrl, '_blank', 'noopener,noreferrer')发起下载。 - 当前 SPA 路由保持原状。
错误处理
- 若
actionUrl为空,维持现有错误提示。 - 若浏览器拦截新窗口,显示明确提示,不执行
location.assign。
测试策略
- 前端单测覆盖首页下载按钮:
download + same_tab输入场景下,断言不会调用window.location.assign。- 断言
window.open被调用并保持当前路由不变。
- 前端单测覆盖详情页下载按钮:
- 断言下载模式不会调用
window.location.assign。
- 断言下载模式不会调用
- 服务端单测如已有 launch 行为覆盖,则补充下载模式
openIn断言;若当前模块无单测,则至少保证前端回归测试覆盖核心用户路径。