# 工作日结_2026-09-16 ## 一、今天做了什么 ### 1. 环境启动 - 11:12 用 `start-dev.ps1` 启动前后端(启动前 8090/8080 均空闲)。 - 就绪标志:后端 `Tomcat started on port(s): 8090` / `Started TrafficAuditApplication`;前端 `Compiled successfully` / `App running at:`。 ### 2. 修复「用局域网 IP 打开页面后登录失败」 - **用户反馈**:用 `http://192.168.177.26:8080/` 登录提示「网络错误,登录失败」,而 `http://localhost:8080/` 正常。 - **排查路径**:curl 直发同一 URL 的 POST `/api/auth/login` 正常返回(说明后端与代理都通)→ 用应用内浏览器在 LAN 地址复现(确实提示「网络错误,登录失败」)→ 对比出差异只在 `Origin` 头 → curl 补 `Origin: http://192.168.177.26:8080` 得到 `403 Invalid CORS request`,根因落地。 - **根因**:浏览器 POST/PUT/DELETE 必带 `Origin`(GET 不带);9-14 跨域收紧后白名单只列了 `localhost:8080 / 127.0.0.1:8080`,经 dev-server 代理转发过来的 `Origin: http://192.168.177.26:8080` 命中不了,被 `CorsFilter` 403 拦掉。页面本身和 `GET /api/auth/captcha-config` 不带 `Origin` 所以正常,表现为"页面能开、一登录就网络错误"。 - **顺带发现**:打包部署(前端内嵌、用 `http://<部署机IP>:8090` 访问)时 POST 同样带 `Origin: http://:8090`,也会被 403 挡住登录——属于同类隐患,本次一并解决。 - **改动(2 文件)**:`CorsConfig.java` 由 `setAllowedOrigins` 改为 `setAllowedOriginPatterns`,默认放行 `http://localhost:*`、`http://127.0.0.1:*`、`http://192.168.*:*`、`http://10.*:*`、`http://172.*:*`;`application.yml` 的 `app.cors.allowed-origins` 同步并补注释。白名单校验机制与 `allowCredentials=false` 均未放松。 - **验证**:按 PID 精确停旧后端链(`cmd 3608 → java(maven) 23704 → java(app) 12636`)后重启;应用内浏览器在 LAN 地址实登成功进入 `#/dashboard`;白名单负向用例(`http://evil.example.com`)仍 403。详见《功能测试报告_局域网IP访问登录CORS修复_2026-09-16.md》。 ## 二、测试结果摘要 - CORS 修复 12 条用例全通过:正向(LAN 来源、同源 8090 来源、内网网段来源、带令牌业务接口、预检 OPTIONS)、负向(非法来源 403)、回归(localhost 来源、无 Origin 头)。 - 真实浏览器端到端:`http://192.168.177.26:8080/#/login` 输入 `admin/123456` → 提示「登录成功」→ 跳转工作台,顶部显示 admin。 - 今日无导入/数据库写入操作,未做入库抽查(改动只涉及跨域校验,不触碰数据链路)。 ## 三、遗留问题与待办 1. **改用域名访问时需补白名单**:`app.cors.allowed-origins` 默认只覆盖本机 + 内网网段,若将来用域名或公网 IP 访问,需把该来源(含端口)追加进去(yml 注释已写明)。 2. `Login.vue` 把所有失败都提示为「网络错误,登录失败」,403/500 这类有响应的错误也被归到"网络",排查易误导;建议后续按状态码细分提示(未做,等用户确认)。 3. 9-15 遗留继续挂账:AI 外发脱敏补齐(system prompt 企业名/解释原文未脱敏)、保密数据部署路线确认、4 张明细报表模板扩列、审核比对基准缺失保护、`sys_role` 权限落地、3D 验证码生产开启、`backend.log` 历史明文清理。 4. 仓库根目录仍有大量未跟踪临时文件(`_*.py`/`_*.sql`/`_*.ps1` 等)未被 `.gitignore` 覆盖,清理前需用户确认。 5. **公司 gitea 今日推不上去(网络问题,非凭据)**:TCP 3000 可连通(`Test-NetConnection` 返回 True),但 HTTP 无响应——`curl http://61.183.254.94:3000/r/trafficAudit.git/info/refs?service=git-upload-pack` 20 秒超时(`000`),`git fetch gitea` 与 `git push gitea` 均无限挂起(各等待 2~4 分钟后手动终止)。待网络恢复后补推;补推前先 `git fetch gitea` 与远端 `main` 比对合并(禁强推)。 ## 四、明天计划 1. 与用户确认域名/其他访问方式是否需要一并加白名单,并确认 `Login.vue` 错误提示细分方案是否实施。 2. 推进 AI 外发脱敏补齐(约 20 行改动),完成后写《功能测试报告》,沿用"假 DeepSeek 服务抓包"做报文级验证。 3. 继续推进报表模板扩列 / 审核基准保护等挂账项。 ## 五、git 记录 - 本次改动(4 文件):`CorsConfig.java`、`application.yml.example`、本报告、本日结。 - 说明:`application.yml` 被 `.gitignore` 忽略(仓库内模板是 `application.yml.example`),故模板同步修改后一并提交。 - 流程与结果: 1. 先写《功能测试报告》与本《工作日结》,再 `git fetch origin`(gitee,`master`)——无新提交,本地已包含远端全部提交; 2. 提交 `0d2a5fc`:`fix(cors): 放行内网网段来源,修复局域网 IP 访问时登录 403`; 3. 推个人仓库 `origin`:`git push origin main:master` 成功(`82100d6..0d2a5fc`); 4. 推公司 `gitea`:`git fetch gitea`、`git push gitea main:main` 均因 HTTP 无响应而挂起,未推送成功(详见遗留问题 5);本次为快进推送,不涉及强推。 --- ## 六、下午追加(两条用户需求,2026-09-16) ### 1. 把 8 月导入的「货运量周转量表」中的 21–26 年数据全部读入数据库 - **背景**:用户 8 月导入的 `定稿-湖北省各市州运输量数据(2026年1-8月).xlsx` 一个工作簿内含 5 个年度 Sheet(`2026年 / 2025年 / 2024年 / 2022年 / 2021年`,源文件无 2023 年),而老逻辑只读第 1 个 Sheet 并按「左半今年 1–N 月 / 右半去年 1–12 月」的月度模板解析,其余年度数据被丢弃。 - **改动(后端 1 文件,+153/−19)**:`DataImportService.java` 中 `importFreightTurnover` 改为分流入口;原逻辑抽为 `importFreightTurnoverByMonth`(逐行不变);新增 `detectYearSheets`(识别多年度工作簿)、`importFreightTurnoverByYear`(按年入库 + 上年同期取自上一年度 Sheet)、`parseWholeYearSheet`(整年 Sheet 的货运量块/周转量块解析)、`persistFreightTurnover`(按报表期先删后插并记批次)。 - **结果**:源文件 5 个年度全部入库,返回「共 90 条记录」,报表期为 `2021-12 / 2022-12 / 2024-12 / 2025-12 / 2026-08`,每期 18 行;与源文件逐项比对 **1080 个单元格零差异**;重复导入幂等(全表 216 行 md5 前后一致);非多年度文件自动回退原月度路径。 - 详见《功能测试报告_货运量周转量多年度导入_2026-09-16.md》。 ### 2. 报表生成-汇总大表预览:删掉「中口径」之后的表格 - **改动(前端 1 文件,单行)**:`ReportExport.vue` 第 133 行由 `v-else-if="it.summary && it.summary.length"` 改为 `v-if="it.key !== 'summaryWorkbook' && it.summary && it.summary.length"`。根因是上面的汇总表用 `v-if`、第二张表用 `v-else-if`,对 `summaryWorkbook` 也照样渲染。 - **验证(推翻上一轮的无效取证)**:早期截图没拍到弹窗、AX 树读到的是缓存,均为无效证据;本轮改用 `tab.playwright.evaluate` 直接读 DOM —— 弹窗内有且仅有 1 张表(`preview-summary wb-table`,12 行指标),表格下方只有两条同比缺失提示与「关闭」按钮,**第二张表已彻底消失**。有效截图:`_qa_out/preview_summaryWorkbook_2026-08_verified_20260916.png`(本轮复核重拍 `..._verified2_20260916.png`,均 54006 字节)。 - 详见《功能测试报告_汇总大表预览删除中口径后明细表_2026-09-16.md》。 ## 七、测试结果摘要(下午追加部分) - 多年度导入:12 条用例全通过——正向(多年度入库、1080 单元格逐项抽查零差异、报表期语义、上年同期、批次记录)、负向(单 Sheet 月度模板回退、非年度命名双 Sheet 回退、混合命名回退、非 Excel 文件报错)、幂等(重复导入全表 md5 一致)、回归(测试期清理干净、真实月份 216 行 / 12 期口径不变)。 - 预览弹窗:7 条用例全通过——DOM 实测弹窗内 `table` 数量为 1、类名与行数正确、12 行数值与同比完整、表格下方无第二张表、`git diff` 仅 1 行改动不回归。 - 测试期清理:`2099-01` ~ `2099-04` 全部用 `POST /api/import/clear?period=…` 清空(各 dataRows=18、batchRows=1),当前库 **0 条 2099 残留**、`freight_turnover_import` 216 行 / 12 个报表期。 ## 八、遗留问题与待办(更新) 1. **`2021-12` 等报表期是「整年」语义**:这些期承载该年 1–12 月全年数据,而非 12 月单月;后续报表/审核若按单月口径取数需用户确认口径,必要时再改造。 2. **源文件缺 2023 年 Sheet**:导致不生成 `2023-12`,`2024-12` 无上年同期。属源数据缺口。 3. **`2026-01` ~ `2026-07` 的 `last_*` 为空**:经比对改动前备份(`2026-04` 的 INSERT)确认这几期改动前即为空,且本次导入未触碰这些报表期(批次只覆盖 5 个期),**非本次改动引入**;如需补上年同期需重新导入对应年度数据。 4. **改动前的备份不完整**:`_backup_freight_turnover_before_multiyear_20260916.sql` 仅 59642 字节、只解析出 `2026-04` 一处 INSERT,**不能作为完整回滚依据**。 5. 弹窗内「共 0 行」与「月度覆盖:1~8月均有数据」口径不同(前者是明细行数),易误解,可考虑改文案(未做,等用户确认)。 6. 上午遗留继续挂账:域名/公网访问的白名单补充、`Login.vue` 错误提示细分、AI 外发脱敏补齐、4 张明细报表模板扩列、审核比对基准缺失保护、`sys_role` 权限落地、3D 验证码生产开启、`backend.log` 历史明文清理、仓库根目录临时文件清理。 7. **公司 gitea 仍待补推**(网络问题,非凭据),补推前先 `git fetch gitea` 与远端 `main` 对比合并,禁强推。 ## 九、明天计划 1. 与用户确认 `2021-12` / `2022-12` 等「整年报表期」的业务口径,以及是否需要把年度数据拆成逐月报表期。 2. 确认是否需要补 2023 年数据、以及 `2026-01`~`2026-07` 的上年同期是否需要补齐。 3. 视用户意见处理预览弹窗「共 0 行」文案。 4. 网络恢复后补推公司 gitea。