Site Tools


Hotfix release available: 2026-07-14c "Mort". upgrade now! [57.3] (what's this?)
研发任务管理系统h5:冷启动文件

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
研发任务管理系统h5:冷启动文件 [2026/10/22 11:38] – 4.69 修复评审会导出报告 172.17.0.1研发任务管理系统h5:冷启动文件 [2026/10/23 02:08] (current) – 4.72 评审会四按钮失效根因 172.17.0.1
Line 350: Line 350:
  
 ⚠️ **同源教训**:凡"点击 → 异步请求 → 再打开窗口"的流程,`window.open` 必须**在点击事件内同步调用**,否则必被拦截。 ⚠️ **同源教训**:凡"点击 → 异步请求 → 再打开窗口"的流程,`window.open` 必须**在点击事件内同步调用**,否则必被拦截。
 +
 +====== 4.70 评审会:去签名 + 修「照片没保存/导出不能用」根因(2026-10-22) ======
 +
 +用户反馈三症状:**上传的现场照片没保存住**、**三种报告都导不出**、签名功能要去掉。
 +
 +===== ★ 根因:`/review/` 页面没有禁缓存头(一处修好,前两个症状全解决) =====
 +<code>
 +修复前 /review/  →  cache-control: no-cache  + ETag + Last-Modified
 +修复后 /review/  →  cache-control: no-store, no-cache, must-revalidate, max-age=0
 +                    pragma: no-cache | expires: 0     (与 /test/ 一致)
 +</code>
 +`no-cache` 只是"可缓存但需校验",配合 ETag 微信会长期复用旧 HTML → 用户手里一直是**没有「会议现场照片」字段、导出还是老代码**的旧页面。
 +所以:照片"没保存住"(旧页面根本没这个字段)+"导出不能用"(旧 window.open 逻辑)= 同一个根因。
 +
 +===== ① 去掉手写签名 =====
 +- 表单去掉「与会人员签名」行;`collectForm()` 不再提交 `signatures`
 +- Web / Word / PDF 报告去掉 `_sig_block()` / `_sig_docx()` 签名块
 +- **数据库 `meetings.signatures` 字段保留**(历史数据不删,不再显示)
 +
 +===== ② 导出加固 =====
 +- **微信内不再 `window.open`**(必被拦截)→ 保存成功后当前页 `location.href` 跳转
 +- 非微信:点击时同步开占位窗口,保存成功后让该窗口跳转(避免异步弹窗被拦)
 +- 保存失败 → 明确 toast「导出失败:原因」并关闭占位窗口
 +
 +===== 完整实测(临时会议,全流程真实操作) =====
 +| 步骤 | 结果 |
 +|---|---|
 +| 表单含「会议现场照片」 | ✅ |
 +| 签名行已消失 | ✅ |
 +| 真实 file input 上传照片 | ✅ `CUR.photos` 有值、缩略图渲染 1 张 |
 +| 点保存 | ✅ toast「✅ 已保存」,5 个写请求 0 错误 |
 +| 回读数据库 | ✅ **photos 已落库**、议题/概述/意见均已保存 |
 +| 三种报告 | ✅ Web 1854B / Word 35KB / PDF 38KB,全部 200 |
 +| 真实会议 #3(库里有旧签名)| ✅ 三格式 200,报告页面「签名」出现 **0 次** |
 +| JS 错误 | ✅ 无 |
 +| 收尾 | 临时会议 #28 + 测试图片已删除,14 个真实会议完好 |
 +
 +⚠️ **教训**:新增功能后如果用户"看不到/用不了",**先查页面缓存头**(`curl -sI` 看 cache-control)。
 +`/test/` `/rd/` `/store/` `/family/` `/extracur/` 都有 no-store,唯独 `/review/` 漏了 → 已补齐。
 +
 +====== 4.71 评审会导出:彻底去掉弹窗(修 Windows「获取打开此'about'链接的应用」)(2026-10-22) ======
 +
 +**现象**(用户截图):**电脑**上点「网页报告/Word版/PDF版」→ Windows 弹出
 +> 获取打开此'about'链接的应用 —— 你的电脑没有可打开此链接的应用。请尝试在 Microsoft Store 中查找兼容应用。
 +
 +**原因**:4.69 为了绕开"异步弹窗被拦",改成点击时先 `window.open('about:blank')` 占位。
 +`about:blank` 在部分 Windows 浏览器里会被当外部协议交给系统处理 → 弹上述对话框 ❌
 +
 +**定稿方案:完全不用弹窗**
 +<code>
 +// 保存会议 → 成功后当前页跳转
 +fetch(保存).then(d => { if(!d.ok){toast('导出失败:'+d.error);return;} location.href = url; });
 +</code>
 +| 格式 | 行为 |
 +|---|---|
 +| 网页报告(text/html)| 当前页打开报告,按返回键回编辑页 |
 +| Word/PDF(`Content-Disposition: attachment`)| **只触发下载,页面不跳走** |
 +
 +- 微信环境保留提示:导 Word/PDF 若无下载 →「点右上角「⋯」→「在浏览器打开」」
 +- 缩略图的 `window.open(this.src)`(看大图)是 http 地址,不受影响,保留
 +
 +**实测**
 +| 项 | 结果 |
 +|---|---|
 +| 网页报告 | ✅ `window.open` 调用 **0 次**,页面成功跳到 `/api/review/report/29`,标题「…评审报告」正确 |
 +| Word | ✅ `window.open` 0 次、下载触发、页面停留原地址 |
 +| PDF | ✅ 同上 |
 +| 失败路径 | ✅ toast「导出失败:原因」|
 +| JS 错误 | ✅ 无 |
 +
 +⚠️ **教训**:不要再为了"防弹窗拦截"用 `window.open('about:blank')` 占位 ——
 +Windows 会当外部链接处理。**同页跳转(`location.href`)+ 服务端 attachment 头** 是跨平台最稳的做法。
 +
 +====== 4.72 ★评审会「四个按钮全部失效」根因(我引入的 bug)+ 三处加固(2026-10-23) ======
 +
 +**现象**:会议里 💾保存 / 📄网页报告 / 📝Word版 / 📕PDF版 **全部点了没反应**;
 +手机端更是「没有任何提示,就是不生成报告」。
 +
 +**★ 真根因(自查出的自造 bug)**
 +4.70 去掉「记录人员」输入框时,`collectPoints()` 里写成了:
 +<code>
 +p_user:(el.querySelector('.p_user')?el.querySelector('.p_user').value:(p.p_user||''))
 +//                                              ↑ 这个 p 在 forEach(function(el){}) 里根本不存在
 +</code>
 +→ 点任一按钮 → `Uncaught ReferenceError: p is not defined` →
 +**连 fetch 都没发出、toast 也没弹** → 四个按钮静默全废(保存/三种报告都走 collectPoints)。
 +
 +**修复**
 +<code>
 +document.querySelectorAll('#pointsBox .point').forEach(function(el,i){
 +  var _pu=(CUR_POINTS[i]&&CUR_POINTS[i].p_user)||'';   // 按索引沿用库里的记录人员,数据不丢
 +  ...
 +});
 +</code>
 +
 +**为什么上一轮测试没抓到**:测试用的是**空会议**(要点 0 条)→ `forEach` 根本没执行 → 没报错。
 +教训:**测保存/导出必须用"有现存要点记录"的会议**(本次用「继承真实会议 #3」的临时会议复现,3 条要点)。
 +
 +**顺带修的三处**
 +1. `new_meeting`(继承会议)500:`p.get("p_status")` → `sqlite3.Row` 没有 `.get` → 改 `p["p_status"] or "未解决"`
 +2. 页面顶部显示版本号 **v2026-10-23** → 一眼确认手机是否加载新版本
 +3. 新增**全局 error 监听** → JS 报错时明确 toast「⚠️ 页面脚本错误:…」,不再静默失效
 +
 +**实测(继承真实会议 #3 的临时会议,3 条真实要点,真点击按钮)**
 +| 按钮 | 结果 |
 +|---|---|
 +| 💾 保存 | ✅ toast「✅ 已保存」,`POST /api/review/meeting/30` → 200 |
 +| 📝 Word版 | ✅ toast「📝 正在生成 Word…」+ 200,页面停留(下载)|
 +| 📕 PDF版 | ✅ toast「📕 正在生成 PDF…」+ 200,页面停留 |
 +| 📄 网页报告 | ✅ 当前页跳到 `/api/review/report/30`,标题「…评审报告」正确 |
 +| JS 错误 | ✅ 0 个 |
 +| 数据 | ✅ 3 条要点内容与库内记录人员全部保留 |
 +| 真实会议 #3(只读检查)| ✅ 版本标记 v2026-10-23、collectPoints/collectForm 均正常、无报错 |
 +
 +⚠️ **手机端 Word/PDF 说明**:微信内置浏览器**不支持下载 docx/pdf**(这是微信限制,不是系统 bug)。
 +请在微信里点右上角「⋯」→「在浏览器打开」,再导出即可;网页报告在微信用可以直接看。
  
 ====== 5. 钉钉请假同步(2026-08-31) ====== ====== 5. 钉钉请假同步(2026-08-31) ======
研发任务管理系统h5/冷启动文件.1792669137.txt.gz · Last modified: by 172.17.0.1