# 功能测试报告:登录验证码容错 + 报表预览整改(指标错位 / 弹窗拖动圆角 / 失败提示) - 日期:2026-09-16 - 模块:登录页、报表生成-汇总大表预览 - 结论:**通过**(4 个问题全部修复,浏览器实测取证) ## 一、功能说明 用户反馈 3 个问题: | # | 用户描述 | 根因 | 修复 | |---|----------|------|------| | 1 | 换 WiFi 后登录页出现验证码白色方框、提示「验证码加载失败,请检查网络」 | 后端 `app.captcha.required=false` 已禁用验证码,但前端 `Login.vue` 的 `captchaRequired` 默认值是 `true`,且 `/api/auth/captcha-config` 请求失败时 `.catch(() => {})` **静默忽略**,页面残留一个加载不出来的验证码框 | 默认值改 `false`;改为 fail-safe:仅当后端明确返回 `code===200 && data.required===true` 才显示验证码,请求异常一律按「不需要验证码」处理 | | 2 | 报表生成-汇总大表预览:点击后弹「导出失败,请确认导入数据,或查看后端日志」 | 前端 `failWith(err, action)` 把**所有**异常(含网络/代理层失败)都渲染成同一句笼统文案,默认 action 还是「导出」,误导读成数据问题 | 重写 `failWith` + 新增 `errReason(raw)`:区分「连不上服务器」与「后端真实原因」;预览调用传 `action='预览'`;Blob 错误响应先 `text()` 再解析 | | 3 | 预览弹窗指标错位(指标压在「当月货运量」上);弹窗不可拖动、无圆角 | 表头是 3 列(指标/数据/同比),与 4 列数据行(分类/指标/数据/同比)不匹配;Element UI 2.15.14 **没有** `draggable` 属性(那是 Element Plus) | 表头补为 4 列 `分类/指标/数据/同比`;新增 `v-dialog-drag` 指令实现拖动(只改 `.el-dialog` 的 `transform`,关闭时复位),加 `border-radius:10px` | 改动文件:`traffic-audit-web/src/views/Login.vue`、`traffic-audit-web/src/views/ReportExport.vue`、新增 `traffic-audit-web/src/directives/dialogDrag.js`、`traffic-audit-web/src/main.js`(注册指令)。 ## 二、测试环境 - 前端:`http://localhost:8080`(vue-cli-service serve,dev 构建) - 后端:8090(`Started TrafficAuditApplication`,重启后新编译) - 浏览器:Codex 内嵌浏览器(视口约 319×790),取证方式 `tab.playwright.evaluate()` 直读 DOM + 截图 ## 三、用例表 | # | 场景 | 输入/操作 | 预期 | 实际 | 结论 | |---|------|-----------|------|------|------| | 1 | 验证码-后端已关闭 | 新开标签访问 `#/login`(后端不可用时同样验证) | 不出现验证码方框,不出现「验证码加载失败」 | 页面无 `.captcha-box`,提示「测试模式:行为验证码已跳过」 | 通过 | | 2 | 验证码-接口正常 | `GET /api/auth/captcha-config` | `required=false` | `{"code":200,"message":"success","data":{"required":false}}` | 通过 | | 3 | 预览-表头列数 | 打开预览弹窗读 `thead th` | 4 列且顺序为 分类/指标/数据/同比 | `['分类','指标','数据','同比']` | 通过 | | 4 | 预览-指标对齐 | 读首行各单元格 x 坐标 | 分类对齐「道路货运」、指标对齐「当月货运量(万吨)」、数据对齐 16888.76、同比在数据右侧 | 分类 x=35、指标 x=118、数据 x=394、同比 x=587(`16888.76` 在 x=394) | 通过 | | 5 | 预览-弹窗圆角 | 读 `.el-dialog` 计算样式 | 有圆角 | `borderRadius=10px`、`overflow=hidden` | 通过 | | 6 | 预览-弹窗拖动 | `tab.drag([150,60],[270,220])` 拖标题栏 | 弹窗跟随移动 | 由 `(0,40)` → `(120,200)`,`transform=matrix(1,0,0,1,120,160)`,位移量等于拖拽增量 | 通过 | | 7 | 预览-关闭复位 | 关闭弹窗后读 transform | 复位为 none | `transform=none`、`visible=false` | 通过 | | 8 | 预览-中口径之后无表格 | 读弹窗内 `table` 数量与内容 | 有且仅有 1 张指标表 | 弹窗内 1 张表(12 行指标,含中口径 4 行),表下仅两条同比缺失提示与「关闭」按钮 | 通过 | | 9 | 失败提示-网络异常 | 后端停掉时点预览 | 明确提示网络/服务未启动,而非「导出失败,请确认导入数据」 | `预览失败:无法连接服务器,请检查网络连接,或确认后端服务是否已启动` | 通过 | | 10 | 导出-正常路径 | 点「导出」 | 下载成功提示 | `报表导出成功` | 通过 | ## 四、发现的问题与处置 1. **「导出失败,请确认导入数据,或查看后端日志」不是数据问题**:用 API 逐月直连 `/api/report/preview` 与 `/api/report/export/summaryWorkbook` 全部返回 200(2026-08 导出 950747 字节)。该文案只在**网络/代理层失败**时出现(换 WiFi 后请求打不到后端),属于提示误导。现已改为区分具体原因。 2. **Element UI 2.15.14 不支持 `draggable`**:弹窗拖动只能自己实现,已用 `v-dialog-drag` 指令;`