# PRD - H5 自助诊断面板优化 > **REQ 编号**: REQ-用户-007 > **版本**: v1.0-Live(前端 v2.3.6 已上线,2026-07-29) > **日期**: 2026-07-29 > **作者**: 宋献 (Simon) + Duckula > **状态**: ✅ 前端已上线 v2.3.6(11 项决策全部锁定:①②③ 标题栏三优化 / ④ Tab 精简版 / ⑤ 移动端 toggle A / ⑥ queue 合并 / ⑦ M1 双角标 / ⑧ 徽章外提 / ⑨ 网络系统统一 .diag-item + 检测按钮 / ⑩ 内容高度自适应 / ⑪ 排队置底 + 未排队占位) > **关联**: > - 原型图:`docs/01-产品文档/05-用户端H5/原型-REQ-用户-007-自助诊断面板优化-v1.0.html`(v2.3.6) > - 技术方案:`docs/02-技术文档/技术架构/技术方案-REQ-用户-007-自助诊断面板优化-v1.0.md`(v1.0-Live) > - 任务说明书:`docs/07-项目管理/任务说明书/任务说明书-REQ-用户-007-自助诊断面板优化.md` > - 测试用例:`docs/03-测试文档/03-功能测试用例/TC-REQ-用户-007-自助诊断面板优化.md`(50 条) > - 设计文档:`docs/02-技术文档/前端改造/设计-H5用户端实现概览-v1.0.md` > **代码真相**(v2.3.6 生产部署版 hash:CSS `index-GZiNwzZW.css` 167849B / JS `index-CAygTKBS.js` 375216B): > - `src/frontend-h5/src/components/assistant/SelfDiagnosis.vue`:v2.3.6 —— 内部仅保留 6 Tab + 内容区;标题栏(含徽章+一键诊断按钮)已通过 `defineExpose` 暴露给 RightPanel;网络/系统 Tab 的 diagItems 与其他 Tab 的 riskItems 统一渲染为 `.diag-item` 模板(带 `检测` 按钮) > - `src/frontend-h5/src/components/assistant/QueueWaiting.vue`:v3.0 位置卡片 + 答题区;新增 `showPosition?: boolean` prop(默认 true,向后兼容) > - `src/frontend-h5/src/components/assistant/RightPanel.vue`:v2.3.6 —— accordion-item__header 含徽章+一键诊断 actions 区;queue-section `margin-top: auto` 始终置底;未排队时显示 `未排队` 占位 > - `src/frontend-h5/src/views/ChatView.vue`:移动端 <500px 默认 `isMobilePanelOpen=false` 显示左对话,点击 🩺 信息按钮切到右栏;`showRightPanel` 计算:`!isMobile || isMobilePanelOpen` --- ## 一、问题陈述 H5 员工端"自助诊断"面板经多轮迭代后仍存在 5 类问题: 1. **标题栏缺异常数量**:用户进右栏看不到总异常数,必须逐个 Tab 点开才能汇总 2. **6 Tab 是 3×2 网格按钮**:占用屏高,不符合移动端/桌面端扁平化设计趋势 3. **移动端右栏不可见**:ChatView.vue:80-89 移动端 <500px `showRightPanel=false`,用户无法在手机上查看诊断/推荐/排队 4. **排队区信息分散**:标题栏只显示 #5,位置/LV/分全在 queue-content 内的独立卡片,挤占答题区空间 5. **Tab 切换时数据混乱**(用户认知问题):未明确告知"切换 Tab 只显示当前 Tab 数据" ## 二、范围 ### 2.1 In-scope(本次 v1.0-Live 交付) **v2.3 已上线(PRD v1.0-Frozen 原始 7 项决策):** - 自助诊断标题栏:分级显示异常徽章(5W·0F)+ 接入中提示 + 0 异常达标动画 - 6 Tab 由 3×2 网格按钮改为横向并排标签页 - 移动端 toggle 切换:左对话框 ⇄ 右栏(顶部双按钮方案) - 排队标题栏:合并位置/LV/分信息到标题栏,queue-content 只保留答题区 - 异常 + 接入混合态:M1 双角标并存(红数字徽章 + 灰色斜体小角标) - 离线 Browser 端可在原型图直接预览所有决策效果 **v2.3.3-v2.3.6 追加 4 项决策(生产环境 v2.3.6 已部署):** - **⑧ 标题栏外提**:自助诊断内部不再保留 `self-diag__header` 标题栏;徽章 + 一键诊断按钮提升至外层 `RightPanel.vue` 的 accordion-item__header;SelfDiagnosis 通过 `defineExpose` 暴露 `totalBadge / totalBadgeByLevel / showCelebrate / isRunningAll / hasAnyDiagItems / runAllDiag` - **⑨ 网络/系统 Tab 统一 .diag-item + 检测按钮**:所有诊断项(diagItems + riskItems)统一渲染 `.diag-item` 模板;每条加 `检测` 按钮,可对单条重新检测(riskItems 模拟 800ms 检测中态,diagItems 走 runSingle 流程) - **⑩ 内容高度自适应**:删除 accordion-item--active 的 `max-height: 80%` 硬限制;右栏 `overflow-y: auto` 整体可滚动,内容自然撑开 - **⑪ 排队标签置底 + 未排队占位**:queue-section 加 `margin-top: auto` 始终推至主轴底部;标题栏不在排队时显示 `未排队` 占位(替代空荡的标题栏) ### 2.2 Out-of-scope(不在本次范围) - 诊断数据源接入(SIEM/IDS、联软代理等 → 2026-Q4 接入) - 触达 0 异常时的自助解决率统计(依赖埋点系统 v1.1) - 移动端右栏个性化配置(折叠状态本地记忆) - 诊断结果 NLP 摘要(依赖 Dify 工作流升级) ## 三、用户故事 ### 3.1 员工视角(核心用户) | 角色 | 场景 | 期望 | |------|------|------| | 一线员工 | 打开 H5 进右栏 | 1 秒内看到"✗ 5 个待处理异常"(分级徽章) | | 一线员工 | 切到"设备" Tab | 看到硬盘 SMART 警告(仅设备 Tab 内容,不显示其他 Tab 数据) | | 一线员工 | 看到"安全" Tab 显示"•2"小角标 | 知道有 2 项正在接入 SIEM(不计入异常数) | | 一线员工 | 处理完所有异常,徽章消失 | 看到"✓ 今日安全"绿色脉冲动画(持续 3 秒) | | 一线员工 | 手机端(<500px) | 顶部双按钮切换"💬 对话 / 🩺 信息",单击即可 | | 一线员工 | 查看排队位置 | 在标题栏直接看到 #5 / LV.3 / 120 分(不用展开内容区) | ### 3.2 管理员视角 | 角色 | 场景 | 期望 | |------|------|------| | 管理员 | 监控大盘异常分布 | 看到分级 `5W·0F` 直观知道"无 fail,全是 warning" | | 管理员 | 排查接入中项目 | 看到 Tab "安全"挂"•2"灰色角标,知道 SIEM 还在接入 | ## 四、功能需求 ### 4.1 异常徽章(标题栏,v2.3 三优化 + v2.3.3 外提) #### 4.1.1 三优化(v2.3 已锁定) | 优化 | 名称 | 实现 | 状态 | |------|------|------|------| | ① | **分级显示** | `5W · 0F` 双胶囊(warning 暖黄字 + fail 粉字);中间 `·` 分隔 | ✅ v2.3 已落地 | | ② | **接入中提示** | Tab 文字后挂灰色斜体小角标"•N"(不计入异常数);行内展示"接入中"灰色 tag | ✅ v2.3 已落地 | | ③ | **0 异常达标动画** | 绿色渐变徽章 + 脉冲光晕(2.4s 循环)+ ✓ 今日安全 文字;3 秒后渐隐 | ✅ v2.3 已落地 | #### 4.1.2 v2.3.3 标题栏外提(已落地) **改造前**(v2.3 内部):SelfDiagnosis.vue 内部有 `.self-diag__header` 独立标题栏,含 🩺 + 自助诊断 + 徽章 + 一键诊断按钮。 **改造后**(v2.3.3 起):SelfDiagnosis.vue 内部**删除** `.self-diag__header`;通过 `defineExpose` 暴露 6 个 API 给外层 RightPanel: ```typescript defineExpose({ totalBadge, // 全部 Tab badge 之和 totalBadgeByLevel, // { w: number, f: number } showCelebrate, // 0 异常达标动画触发 isRunningAll, // 是否正在批量诊断 hasAnyDiagItems, // 当前 Tab 是否有 diagItems runAllDiag, // 一键诊断方法 }) ``` 外层 `RightPanel.vue` 的 `accordion-item__header` 通过 `selfDiagRef?.totalBadgeByLevel` 读取数据并渲染徽章 + 一键诊断按钮(在 `accordion-item__header-actions` 容器中,`@click.stop` 阻止冒泡触发折叠)。 #### 4.1.3 5 种状态对照(已展示在原型图对照表) | 状态 | 视觉 | 触发条件 | |------|------|---------| | ① 分级显示 | `5W · 0F` | 当前 Mock(5 warning) | | ② 含 fail | `2W · 1F` | 假设场景(2 warning + 1 fail) | | ③ 旧版兼容 | `!5` | 历史版本降级(可选关闭) | | ④ 达标动画 | `✓ 今日安全` | 全部异常清零时 | | ⑤ 静态正常 | `✓ 全部正常` | 动画停止后稳态 | #### 4.1.4 异常计数算法(v2.3.6 最终口径) ``` warning(W) + danger/fail(F) → 计入异常徽章 normal + pending(接入中) + idle(未执行) → 不计入 ``` **算法实现在 SelfDiagnosis.vue**: - `totalBadge`:所有 Tab `badge` 之和(badge = diagItems warning/fail + riskItems warning/danger 项数) - `totalBadgeByLevel`:分别统计 warning 数 + fail 数(跨所有 Tab) - `showCelebrate`:`totalBadgeByLevel.w === 0 && totalBadgeByLevel.f === 0` #### 4.1.5 Tab 文字简称(v2.3.2 锁定) | 完整名 | 简称(2字) | |--------|-----------| | 网络联通 | **网络** | | 账号权限 | **账号** | | 设备硬件 | **设备** | | 系统软件 | **系统** | | 终端安全 | **安全** | | 合规检查 | **合规** | 简称通过 `DiagTab.shortLabel` 字段单独维护(避免模板硬编码,方便日后调整)。`tabs` computed 同步返回 `shortLabel` 字段。 ### 4.2 6 Tab 横向并排标签页(替代 3×2 网格按钮) **设计约束**(v2.3 已锁定 + v2.3.2 简称统一): - 6 Tab 文字:精简版(**网络 / 账号 / 设备 / 系统 / 安全 / 合规**,2 字简称) - 高度:30px(v2.3.2 由 34px 改为 30px,更紧凑)· flex 1:1:1:1:1:1 等分 - 激活态:底部 2px 蓝色下划线 + 文字加粗 - 异常 Tab:底部额外一条半透明红色 2px 线(双层指示,激活态红线在蓝线下方 1px) - 移动端:移动端 <500px 时整 RightPanel 默认不渲染,需点击 🩺 信息按钮切到右栏后可见 ### 4.3 移动端 toggle 切换(核心需求) **仅适用于移动端(<500px)**,桌面端(≥500px)维持双栏不变。 | 决策 | 方案 | 状态 | |------|------|------| | 方案 A | 顶部双按钮(💬 对话 / 🩺 信息) | ✅ **锁定** | **实现要点**: - ChatView.vue 新增 `isMobilePanelOpen` 状态(默认 false 显示左对话框) - 仅 `isMobile=true` 时显示切换按钮 - 点击切换:左对话 ↔ 右栏(手风琴 + 智能推荐 + 排队) - 切换时左对话/右栏状态保留(聊天滚动位置、答题展开状态) ### 4.4 queue 标题栏合并位置/LV/分信息 **改造前**(v2.0/v2.2):RightPanel.vue queue-header 只显示 ⏳ + "排队等待" + #5 + 答题挑战按钮;queue-content 内 QueueWaiting 组件含完整 position-card(位置 + LV + 分)。 **改造后**(v2.3): ``` ⏳ 排队等待 | #5 前面4人 | LV.3 | 120分 | 答题挑战 ``` - queue-header 内联展示三件套(position-inline / lv-inline / points-inline) - queue-content 只保留答题区,QueueWaiting 组件需新增 `show-position=false` prop - 整体高度压缩 ~40px(≈50%) ### 4.5 Tab 切换只显示当前诊断项(行为已天然) **用户需求**:"选择某项标签时(网络),下方只显示网络的诊断项,不显示其他标签页诊断项" **代码现状**:SelfDiagnosis.vue:499-501 `currentTab` 已 computed 自动过滤,切 Tab 时 Vue 自动卸载旧 DOM / 挂载新 DOM。 **结论**:**无需代码改动**,仅原型标注行为。 ### 4.6 异常 + 接入混合显示:M1 双角标并存 **场景**:某 Tab 同时有异常(W/F)和接入中(pending)项时(如未来某次"安全" Tab 出现 1 异常 + 2 接入)。 **决策 M1**:Tab 文字右侧显示双角标 - 红数字徽章(`.diag-tab__badge`)= 异常项数 - 灰色斜体小角标(`.diag-tab__pending-hint`)= 接入中项数 - 视觉区隔:颜色(红 vs 灰)+ 字体(标准 vs 斜体小号) **示例**:`安全 1•2`(红数字 1 + 灰斜体 2) ### 4.7 网络/系统 Tab 样式统一 + 检测按钮(v2.3.4 已落地) **问题(v2.3.3 之前)**:网络/系统 Tab 的"诊断项"(点击执行诊断)和 账号/设备/安全/合规 Tab 的"风险项"(展示状态信息)使用两套独立 UI: - 诊断项:`.diag-item`(无图标、无状态徽章) - 风险项:`.risk-item`(有图标 + 状态徽章) 用户反馈:网络/系统 Tab 的诊断项"样式与其他条目不一致,看起来像缺了一半"。 **v2.3.4 改造方案**:所有条目(diagItems + riskItems)统一渲染为 `.diag-item` 模板。 - 统一模板:`图标 + 名称 + 状态徽章 + 检测按钮 + 折叠箭头 + (展开后)详情行` - **检测按钮**(`.diag-item__btn`):每条加独立"检测"按钮,点击触发该条重新检测 - diagItems:走 `runSingle(item.key)` 流程,800ms-1.5s 后返回 Mock 结果 - riskItems:模拟 800ms "检测中..." 状态后恢复原态(不对接实际后端) - pending 状态条目:禁用按钮 - 图标推断:diagItems 通过 `diagItemIcon(item)` 函数根据 label 文本推断 emoji 图标 - 状态映射:`DiagStatus` → `RiskLevel` 通过 `diagStatusLevel()` 函数映射,共用样式 **收益**:6 个 Tab 内所有条目视觉一致,用户操作路径统一(先看 → 不放心 → 点检测)。 ### 4.8 内容高度自适应(v2.3.5 已落地) **问题(v2.3.4 之前)**:`accordion-item--active` 有 `max-height: 80%` 硬限制,当自助诊断展开且 Tab 内容多时(特别是网络 Tab 6 项 + 系统 Tab 6 项 + 4 个 riskItems)会被截断,用户需手动滚动手风琴区。 **v2.3.5 改造方案**: - 删除 `.accordion-item--active { max-height: 80% }` 限制 - 右栏 `.right-panel` 设 `overflow-y: auto`,超出视口时整个右栏整体滚动 - 手风琴展开态高度由内容自然撑开 - queue-section `margin-top: auto`(v2.3.6 追加)保证不管内容多寡,排队标签始终贴底 **收益**:自助诊断完全展开后,所有 Tab 内容完整可见,无需逐 Tab 切换查找。 ### 4.9 排队标签置底 + 未排队占位(v2.3.6 已落地) **问题(v2.3.5 之前)**:v2.3.5 去掉 max-height 后,手风琴展开时智能推荐被推上去,queue-section 不再自动贴底(v3.0 设计的"排队到底部"布局失效)。 **v2.3.6 改造方案**: **(a) 排队标签置底**: - `.right-panel__queue-section { margin-top: auto }` - flex column 容器中自动推至主轴底部,**不依赖 flex:1 占满中间空间** - 即使自助诊断展开 + 智能推荐内容多,排队标签仍贴右栏底部 **(b) 未排队占位**(避免标题栏空荡): ```vue #{{ queuePosition }}前面{{ aheadCount }}人 未排队 ``` - 排队时:`#5 前面4人`(蓝色背景徽章) - 未排队时:`未排队`(斜体灰色占位) - LV/分信息始终挂在 `pointsInfo` computed 上,存在时显示 ## 五、非功能需求 | 维度 | 要求 | |------|------| | **性能** | Tab 切换响应 < 100ms(DOM 卸载/挂载);异常徽章实时刷新 < 200ms | | **兼容** | 桌面端 ≥500px 双栏不变;移动端 <500px toggle 模式 | | **无障碍** | Tab 切换支持键盘左右箭头;toggle 按钮含 aria-label | | **动画** | 0 异常达标动画 3 秒后渐隐(避免持续吸引注意力) | | **dark mode** | 所有徽章/角标在深色模式下对比度 ≥ 4.5:1 | ## 六、接口需求 **无新增后端 API**。本需求为前端 UI 改造,所有数据当前由 WS 推送(`/api/ws`)和 polling 拿到。 **前端组件 props/emit 变更**: | 组件 | 改动 | 说明 | |------|------|------| | `ChatView.vue` | 新增 `isMobilePanelOpen` ref | 默认 false;`showRightPanel` 改为 `computed(!isMobile \|\| isMobilePanelOpen)` | | `QueueWaiting.vue` | 新增 `showPosition?: boolean` prop | 默认 true(向后兼容) | | `RightPanel.vue` | 传 `:show-position="false"` to QueueWaiting | queue-header 内联三件套 | | `SelfDiagnosis.vue` | `defineExpose` 暴露 6 个 API | `totalBadge / totalBadgeByLevel / showCelebrate / isRunningAll / hasAnyDiagItems / runAllDiag`;外层 RightPanel 通过 `selfDiagRef` 读取 | | `RightPanel.vue` | `selfDiagRef` 实例引用 | ``;accordion-item__header 通过 `selfDiagRef?.totalBadgeByLevel?.w` 渲染徽章 | ## 七、验收标准 ### 7.1 异常徽章 - ✅ 0 异常:徽章透明或显示"✓ 全部正常"(绿色) - ✅ 5 个 warning:徽章显示 `5W · 0F`(红色背景) - ✅ 2 warning + 1 fail:徽章显示 `2W · 1F` - ✅ 全部清零:触发达标动画 3 秒后渐隐 ### 7.2 6 Tab 横向并排 - ✅ 桌面端:6 个 Tab flex 等分显示,激活态有蓝色下划线 - ✅ 异常 Tab:底部红色双层下划线 - ✅ 移动端:RightPanel 不渲染(不需考虑) ### 7.3 移动端 toggle - ✅ 默认显示左对话框 - ✅ 点击 🩺 切换按钮显示右栏(手风琴 + 智能推荐 + 排队) - ✅ 点击 💬 切回左对话框,聊天滚动位置/输入文本保留 - ✅ 桌面端不显示 toggle 按钮(维持双栏) ### 7.4 queue 标题栏合并 - ✅ 标题栏显示 ⏳ + 排队等待 + #5 + 前面4人 + LV.3 + 120分 + 答题挑战 - ✅ queue-content 内不重复显示位置卡片 - ✅ 整体高度压缩 ~40px ### 7.5 Tab 切换行为 - ✅ 切到"设备" Tab:只显示设备相关诊断项 + 风险项 - ✅ 切到"账号" Tab:账号相关项替换设备相关项 - ✅ 不显示其他 Tab 的数据 ### 7.6 异常 + 接入混合 - ✅ Tab "安全" 出现 1 异常 + 2 接入时显示 `安全 1•2`(红数字 + 灰斜体) ### 7.7 标题栏外提 + 一键诊断按钮(v2.3.3) - ✅ 自助诊断展开区域**无**独立标题栏(v2.3.3 起) - ✅ 异常徽章(5W·0F 或 ✓ 今日安全)显示在 RightPanel `accordion-item__header` 上 🩺 自助诊断 文字右侧 - ✅ 一键诊断按钮(绿色胶囊)位于徽章右侧;点击触发批量诊断,按钮文字变 "诊断中..." - ✅ 点击徽章/按钮区域不会触发折叠(@click.stop) ### 7.8 网络/系统 Tab 统一 .diag-item + 检测按钮(v2.3.4) - ✅ 网络 Tab 6 项 diagItems 与账号 Tab 4 项 riskItems 视觉一致(图标+名称+状态徽章+检测按钮) - ✅ 每条诊断项右侧有 "检测" 按钮;点击触发该项重新检测 - ✅ diagItems 检测 800ms-1.5s 后显示 Mock 结果;riskItems 检测 800ms 模拟态后恢复 - ✅ pending(接入中)条目的检测按钮被禁用 ### 7.9 内容高度自适应 + 排队标签置底 + 未排队占位(v2.3.5 / v2.3.6) - ✅ 自助诊断展开后:内容高度由条目数自然撑开,无 max-height 截断 - ✅ 右栏整体可滚动(`overflow-y: auto`);超出视口时滚动条出现 - ✅ 排队标签始终贴右栏底部(`margin-top: auto`),不依赖 flex:1 - ✅ 排队时标题栏显示 `#5 前面4人`(蓝色背景徽章) - ✅ 未排队时标题栏显示 `未排队`(斜体灰色占位) - ✅ LV/分信息始终按 `pointsInfo` 状态显示(存在则显示) ## 八、风险与降级 | 风险 | 等级 | 缓解措施 | |------|------|---------| | 移动端 toggle 切换导致左对话消息丢失 | 高 | Vue v-show 切换(不卸载 DOM),保留输入栏文本和滚动位置 | | 异常徽章实时刷新失败(WS 断连) | 中 | 保留最后一次已知状态,15s 后重连重试 | | 0 异常达标动画吸引注意力过度 | 低 | 3 秒后渐隐,不阻塞操作 | | 移动端 toggle 按钮误触 | 低 | 切换后顶部按钮固定,触发区域 ≥ 44×44px(iOS HIG) | | queue 标题栏紧凑导致小屏挤压 | 中 | 6 项信息支持换行(flex-wrap: wrap) | ## 九、决策清单(11 项全部锁定) | # | 决策点 | 选项 | 状态 | |---|--------|------|------| | 1 | Tab 文字方案 | 精简版(网络/账号/设备/系统软件/安全/合规) | ✅ A 已锁定 | | 2 | 异常徽章显示 | 分级 `5W · 0F` | ✅ v2.3 锁定 | | 3 | 接入中角标位置 | A 文字右侧 | ✅ v2.3 锁定 | | 4 | 桌面端 Tab 切换 | 只显示当前诊断项(已天然) | ✅ v2.3 锁定 | | 5 | 移动端 toggle 方案 | A 顶部双按钮 | ✅ v2.3 锁定 | | 6 | queue 标题栏合并 | 位置/LV/分 全部合并 | ✅ v2.3 锁定 | | 7 | 异常+接入混合 | M1 双角标并存 | ✅ v2.3 锁定 | | 8 | 标题栏位置 | 外提到 RightPanel accordion-item__header(SelfDiagnosis 通过 defineExpose 暴露) | ✅ v2.3.3 锁定 | | 9 | 诊断项 UI 统一 | 所有条目统一 `.diag-item` 模板 + 检测按钮 | ✅ v2.3.4 锁定 | | 10 | 内容高度策略 | 内容自然撑开 + 右栏 overflow-y: auto(删除 max-height) | ✅ v2.3.5 锁定 | | 11 | 排队位置策略 | queue-section margin-top: auto + 未排队时显示"未排队"占位 | ✅ v2.3.6 锁定 | ## 十、关联文档 - **原型图**:`docs/01-产品文档/05-用户端H5/原型-REQ-用户-007-自助诊断面板优化-v1.0.html` - **技术方案**:`docs/02-技术文档/技术架构/技术方案-REQ-用户-007-自助诊断面板优化-v1.0.md` - **任务说明书**:`docs/07-项目管理/任务说明书/任务说明书-REQ-用户-007-自助诊断面板优化.md` - **测试用例**:`docs/03-测试文档/03-功能测试用例/TC-REQ-用户-007-自助诊断面板优化.md` - **设计文档**:`docs/02-技术文档/前端改造/设计-H5用户端实现概览-v1.0.md`(将追加 v2.3 章节) - **现有代码**: - `src/frontend-h5/src/components/assistant/SelfDiagnosis.vue` - `src/frontend-h5/src/components/assistant/QueueWaiting.vue` - `src/frontend-h5/src/components/assistant/RightPanel.vue` - `src/frontend-h5/src/views/ChatView.vue` ## 十一、变更日志 | 版本 | 日期 | 变更内容 | 作者 | |------|------|---------|------| | v1.0-Frozen | 2026-07-29 12:30 | 冻结 7 项决策(基于原型图 v2.3 累计升级);明确 4.1.1 三优化 + 4.2 6 Tab 横向 + 4.3 移动端 toggle A + 4.4 queue 合并 + 4.5 Tab 切换天然 + 4.6 M1 双角标 | Duckula + 宋献 | | v2.3.1 | 2026-07-29 13:51 | 修复 Tab 网格 3×2 残留;CSS hash `B5iZHaWc` / JS `DWLS0ZMb` | Duckula | | v2.3.1 | 2026-07-29 13:56 | 修复 Tab 标签仍为 4 字未用简称;CSS hash `CL_8bZ34` / JS `DRFXN8X-` | Duckula | | v2.3.2 | 2026-07-29 14:35 | tabs computed 补 shortLabel 字段 + 恢复独立标题栏;CSS hash `BBycvpph` / JS `CbImPO1p` | Duckula | | v2.3.3 | 2026-07-29 15:13 | 标题栏外提:SelfDiagnosis 删除 self-diag__header,defineExpose 暴露 6 API 给 RightPanel;CSS hash `CCAA9XNU` / JS `DkUAW4Da` | Duckula | | v2.3.4 | 2026-07-29 15:38 | 网络/系统 Tab 统一 `.diag-item` 模板 + 检测按钮 + diagItemIcon 推断;CSS hash `C8kd4YJI` / JS `DBVfD3sS` | Duckula | | v2.3.5 | 2026-07-29 15:51 | 删除 accordion-item--active max-height: 80% 限制 + 右栏 overflow-y: auto;CSS hash `CNWqSvBk` / JS `5JtvoGYc` | Duckula | | **v2.3.6** | **2026-07-29 16:56** | **queue-section margin-top: auto 置底 + 标题栏 v-else "未排队" 占位;CSS hash `GZiNwzZW` / JS `CAygTKBS`** | **Duckula** | | v1.0-Live | 2026-07-29 17:11 | PRD 升级到 v1.0-Live:追加 4.1.2 标题栏外提、4.1.4 算法、4.1.5 简称、4.7-4.9 三节;§六 接口需求补 SelfDiagnosis defineExpose;§七 验收补 7.7-7.9 三节;§九 决策清单扩充到 11 项;§十一 变更日志补 v2.3.1-v2.3.6 全链路 hash | Duckula | ## 十二、待办 - [x] PRD v1.0-Frozen 建出(本文档) - [x] 原型图 v2.3 升级(已含 7 项决策) - [x] MEMORY.md 决策沉淀 - [x] PRD v1.0-Live 升级(追加 v2.3.3-v2.3.6 4 项决策 + 算法 + 简称 + 验收) - [x] 原型图 v2.3.6 升级(标题栏外提 + 检测按钮 + 排队占位 + 标注区更新) - [x] 技术方案 v1.0-Live 升级(v2.3.3-v2.3.6 完整实现方案) - [x] 任务说明书 v1.0 建出 - [x] 测试用例 v1.0 建出(50 条) - [x] 设计文档 v2.3 章节追加 - [x] 原型图重命名(v2.0.html → REQ-用户-007...v1.0.html) - [x] 前端改造实施(4 文件 + 8 次部署验证完成) - [ ] 浏览器强缓存头部署(nginx 配置 `Cache-Control: no-cache, no-store, must-revalidate` HTML + `immutable 365d` assets)