From e6d74059f2fa58ca7e03a41d78c6d52badd3d3c0 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E5=8D=BF=E4=BA=91=E7=A7=8B=E6=9C=88?= <15273589815@163.com>
Date: Mon, 14 Sep 2026 12:06:38 +0800
Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=91=98=E5=B7=A5=E5=B7=A5?=
=?UTF-8?q?=E4=BD=9C=E5=8F=B0=E9=A1=B6=E9=83=A8=E5=AF=BC=E8=88=AA=E9=87=8D?=
=?UTF-8?q?=E5=A4=8D=EF=BC=88=E5=85=A5=E5=8F=A3=20JS=20=E8=A2=AB=E5=BC=95?=
=?UTF-8?q?=E4=B8=A4=E6=AC=A1=EF=BC=89?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
## 现象
打开 `employee-console/workspace`(平台治理),页面上出现**两份一模一样的顶部栏**:
南方财富 / 模拟基金服务 / 平台治理 / 风控中心 / admin_t 管理员 —— 连同页脚一起各两份。
## 根因:同一个入口 JS 被引了两次,且 `?v=` 不同
`app/static/portal/employee-console/workspace/index.html` 里曾同时存在:
浏览器按**完整 URL** 去重,两条不同 query 被当成**两个模块**、**各执行一次**。
入口里的 `mountShell()` 因此跑了两次,而它当时是
`document.body.insertAdjacentHTML('afterbegin', ...)` —— **无条件插入**,
于是 header 与 footer 各插两份。
来源是合并事故(`git blame` 定位):
| 行 | 提交 | 作者 |
|---|---|---|
| 旧 | `e31420df` | 卿云秋月(把版本号改成 `20260913-3`)|
| 新 | `f5d1b246` | 张胜宇(把版本号改成 `20260914`)|
两人各自把**同一行**的版本号换成新的,合并时两边都被保留,成了两行。
那个提交的信息是 "merge ... and retain risk review updates" ——
"retain" 在这里保留错了地方。
## 修法(两侧都堵)
1. **HTML 收敛成一行**(保留较新的 `?v=20260914`,与 `workspace.js` 内部
`api-client.js?v=20260914` 一致),并就地写明"改版本号是替换这一行、不是新增一行"。
2. **`mountShell` 加幂等保护**:已有 `.site-header` 就直接 return。
之所以不满足于只修那个 HTML —— 这个 bug 的症状很难反推到原因
(页面看起来只是"多了一块"),而以后谁加缓存版本号时很容易再犯一次。
## 防回归(两条测试,都做过负面验证)
- `test_no_portal_page_includes_the_same_script_twice`:扫 `app/static/portal` 下
**19 个页面**,把 `
+