Files
wecom_it_smart_desk/docs/02-技术文档/前端改造/设计-H5用户端实现概览-v1.0.md
T
Simon facc04aa65 chore: docs 结构整改 + compose 双目录对齐(合并重建提交)
本提交为 .git 对象库损坏后的重建提交,内容等价于原先三个本地提交
(5e2fd4c2 / 57a53c98 / 5d7e1873)的累积结果,未做任何额外改动。

一、docs 结构整改(整改 #14)
根因:重构时新结构为 untracked 文件,执行 git stash(未带 -u)未纳入,
随后 git reset 拉回 HEAD 旧 tracked 树,导致旧树复活、新旧两棵目录
树并存于 docs/,共 791 文件、双分类体系冲突。

修复动作:
- b2 同名异主题文件改名迁移保全 9 个
- C 类 39 个孤立文件按主题正确归类
- A/B1 类 222 个重复文件删除(新结构已有内容副本)
- 9 个旧独有空目录删除
- 270 处内部引用按 verified 映射改写
- 整改记录 #14 登记于 04-运维文档/部署运维

结果:docs 791 → 569 文件,顶层仅规范 8 类 + 治理文件,单树恢复。
残留:约 20 处指向从未存在文件的陈旧死链,归入独立文档卫生任务。

二、compose 双目录对齐(消除踩坑 A)
- docker-compose.yml:nginx 前端挂载全部由根目录 frontend-*/dist
  改为 src/frontend-*/dist(h5 / agent / admin / terminal)
- docker-compose.dev.yml:dev 服务 build context 与卷同步改 src/
- 效果:本地 docker compose up 不再把根目录 stale dist 挂回,
  与线上一致,分叉隐患消除(已 docker compose config 校验通过)

防复发铁律:
- 重构须提交;仓库修复须 git stash -u 或先 commit
- 新结构须 git add 并提交,避免再次 untracked 复活
- H5 改动只动 src/frontend-h5/,禁改根目录遗留 frontend-*/
2026-08-07 22:31:32 +08:00

15 KiB
Raw Blame History

H5用户端原型图 → Vue3代码实现概览

完成时间

2026-06-09

变更摘要

根据已锁定的原型图 v1.1 修复版,将 H5 用户端设计实现为 Vue3 代码。

修改文件清单

1. frontend-h5/src/components/chat/ChatPanel.vue

  • 标题栏重构:左侧(标题 + 坐席在线/离线状态胶囊) + 右侧(🔔呼叫按钮 + 主题切换)
  • 🔔摇铃按钮:从输入栏移至标题栏(桌面端+手机端统一)
  • 排查步骤固定顶部:从消息列表内移出,固定在标题栏下方、所有消息之上,不随滚动消失
  • 移除 InputBar 事件:不再需要 @call-agent 事件(摇铃直接在 ChatPanel 内控制)

2. frontend-h5/src/components/chat/InputBar.vue

  • 移除摇铃按钮:删除 🔔 摇铃按钮及相关 CSSbell-btn/bell-icon/bell-idle/bell-ring 动画)
  • 工具栏😊表情 / 📎文件 / ✂️截图 / 📝快捷申请(2026-07-05移除🖼️图片和📸拍照功能)
  • 布局改为两行:工具栏(上) + 输入行(输入框+发送按钮)(下)
  • 方法handleEmoji/handleFile/handleScreenshot/handleQuickApply
  • 引导条文案更新:"点击标题栏铃铛呼叫 IT 坐席"

3. frontend-h5/src/components/assistant/RightPanel.vue(新建)

  • 三段式面板:AI推送区 / 常用资源标签页 / 趣味问答
  • AI推送区3种卡片类型(guide/process/download) + 动态图标+颜色
  • 常用资源:2个Tab(申请流程/必装软件) + 资源列表
  • 趣味问答:题目+4选项+积分+答题结果反馈
  • 阶段一静态数据,阶段二接入 Dify 动态推送

4. frontend-h5/src/views/ChatView.vue

  • 替换右侧面板AiHelperPanel → RightPanel(三段式面板)
  • 响应式断点:从768px改为500px(与原型图对齐)
  • 移动端<500px 不显示右侧面板
  • 拖拽逻辑修复:只固定左侧宽度,右侧 flex:1 自动填满(消除拖拽后空白)
  • 移除浮动按钮:不再需要移动端AI助手浮动按钮

5. frontend-h5/src/stores/conversation.ts

  • 新增 agentOnline 状态:默认true,阶段一简化处理
  • 暴露到 return 语句:使组件可以访问

构建验证

npx vite build 构建成功,无编译错误


H5用户端 v2.0 更新(2026-07-24

v1.x → v2.0 变更

输入栏重构

  • 移除标题栏呼叫按钮:原标题栏的"呼叫"按钮已移除
  • 人工坐席按钮移至输入栏:位于输入框右侧第一层,三态(disabled/active/urgent
  • 新增语音输入按钮:位于输入框右侧第二层,支持语音转文字
  • 按钮状态
    • disabled🔒 灰色):AI回复<3次,不可点击
    • active🎧 蓝色边框):可点击呼叫人工
    • urgent🚨 红色+脉冲动画):检测到紧急问题

右边栏布局调整

  • 设备信息/自助诊断:保持在顶部,手风琴结构
  • 智能推荐:占据主区域(flex:1),展示更多推荐内容
  • 排队等待:移至底部固定显示,包含位置+积分+答题挑战按钮

原型图

  • 新版原型图:01-产品文档/05-用户端H5/原型-REQ-用户-000-H5用户端-v2.0.html
  • 旧版 v1.0 已删除

右侧栏布局调整(2026-07-17

v2.1 → v3.0 变更

布局调整

  • 智能推荐位置:移至自助诊断下方,保持一直显示
  • 标题样式统一:智能推荐使用与设备信息、自助诊断相同的标题样式(图标+文字+箭头)

智能推荐调整

  • 取消分类标签:移除"相关推荐"、"运维提醒"、"常用资源"分区标题
  • 保留颜色区分:仅用边框颜色区分类型
    • 🟢 绿色边框:相关推荐
    • 🟠 橙色边框:运维提醒
    • 灰色边框:常用资源

排队卡片调整

  • 高度压缩:压缩至原来50%
  • 移除平台统计:取消四宫格(总活跃/排队/服务/AI)
  • 保留内容:排队位置、前面人数、预计等待时间、积分等级

答题功能

  • 答题开关:位于排队卡片标题栏右侧(绿色胶囊按钮)
  • 默认折叠:点击答题挑战按钮展开答题区域
  • 功能:答对题目可获得积分并靠前排队
  • 按钮名称:答题挑战(原"答题插队"2026-07-17修复)

调整后原型图

┌──────────────────────────────────────────┐
│ 💻 设备信息                        ▾   │ ← 手风琴
├──────────────────────────────────────────┤
│ 🩺 自助诊断                          ▸   │ ← 手风琴
├──────────────────────────────────────────┤
│ ⚡ 智能推荐                          ▾   │ ← 统一标题样式
│   ┌──────────────────────────────┐    │
│   │ 绿色边框:相关推荐内容        │    │
│   └──────────────────────────────┘    │
│   ┌──────────────────────────────┐    │
│   │ 橙色边框:运维提醒内容        │    │
│   └──────────────────────────────┘    │
│   ┌──────────────────────────────┐    │
│   │ 灰色边框:常用资源内容        │    │
│   └──────────────────────────────┘    │
├──────────────────────────────────────────┤
│ ⏳ 排队位置  #5 前面4人 LV.3 [答题挑战]│ ← 压缩50%
│ ─────────────────────────────────────   │
│ [答题区域 - 默认折叠]                   │
└──────────────────────────────────────────┘

相关组件

  • RightPanel.vue - 调整布局结构
  • DynamicRecommend.vue - 移除分类标签
  • QueueWaiting.vue - 压缩高度、新增答题开关

自助诊断标题栏异常徽章(2026-07-29)

v2.0 → v2.1 变更

与代码 frontend-h5/src/components/assistant/SelfDiagnosis.vue 已实现的计数逻辑对齐。

标题栏异常徽章(核心需求)

  • 位置🩺 图标 + "自助诊断"文字右侧;"一键诊断"按钮左侧
  • 样式:高度 18px 圆角胶囊徽章
  • 状态规则
    全局异常数 显示 颜色 文案
    0 个 绿色徽章 ✓ 全部正常 rgba(34,197,94,0.15) + #16a34a "✓ 全部正常"
    N≥1 个 红色徽章 ⚠ N var(--color-danger) hover tooltip "共 N 个待处理异常"
  • 触发SelfDiagnosis.vue 顶部 header__title 旁新增徽章元素

6 Tab 3×2 网格(替换原简化 2 项列表)

Tab 图标 Mock 异常数 状态
网络联通 🌐 0 无徽章(diagItems idle 未执行)
账号权限 🔑 1 域账号 5 天到期
设备硬件 🔧 1 硬盘 SMART 警告
系统软件 💻 2 系统补丁 2 高危 / 邮件客户端异常
终端安全 🛡️ 0 2 项 pending(接入中)不计入
合规检查 📋 1 未审批商业软件
合计 5

Tab 单徽章(右上角)

  • 样式:右上角 16×16 圆角红色徽章,白色数字 + 红边 2px
  • 激活态:白底红字 + 蓝边(与激活 Tab 颜色协调)
  • 无异常:不显示徽章

一键诊断按钮

  • 移动到标题栏右侧
  • 检测到异常时 disabled + tooltip 提示"建议先处理后再批量诊断"

异常计数规则(前后端口径统一)

// 自助诊断每个 Tab 的异常数
const diagAbnormal = diagItems.filter(
  d => d.status === 'warning' || d.status === 'fail'
).length
const riskAbnormal = riskItems.filter(
  r => r.level === 'warning' || r.level === 'danger'
).length
const tabBadge = diagAbnormal + riskAbnormal

// 全局总异常数(新增)= 所有 Tab 徽章之和
const totalAbnormal = tabs.reduce((sum, t) => sum + t.badge, 0)

不计入异常的口径(避免误报)

  • normal — 状态正常
  • pending — 数据接入中(如 SIEM/IDS、联软代理,2026-Q4 完成)
  • idle — 诊断项未执行(运行后可降级为 warning / fail

更新文件

  • docs/01-产品文档/05-用户端H5/原型-REQ-用户-007-自助诊断面板优化-v1.0.html(已就地升级为 v2.1,含全部交互示例、Tab 徽章、风险项示例、异常口径注解)
  • docs/02-技术文档/前端改造/设计-H5用户端实现概览-v1.0.md(本文档,追加本节)

待前端实现(与原型对齐)

  • SelfDiagnosis.vue 标题栏新增 totalBadge 计算属性 + 徽章模板
  • 一键诊断按钮 disabled 条件联动 totalBadge > 0
  • 单 Tab 徽章已实现;确认右上角样式与原型一致
  • e2e 验证:异常数变化时徽章颜色/数字刷新

自助诊断面板 v2.2 → v2.3 升级(2026-07-297 项决策锁定)

关联需求:REQ-用户-007 自助诊断面板优化 v1.0-Frozen 关联文档PRD v1.0-Frozen + 技术方案 v1.0 + 任务说明书 v1.0 + 测试用例 v1.050 条 / 8 大类) 原型图docs/01-产品文档/05-用户端H5/原型-REQ-用户-007-自助诊断面板优化-v1.0.html(已就地升级 v2.3

7 项决策(一句话摘要)

# 决策 状态
1 Tab 文字精简版(网络/账号/设备/系统软件/安全/合规)
2 异常徽章分级 5W · 0F
3 接入中角标位置 A 文字右侧
4 Tab 切换只显示当前诊断项(已天然)
5 移动端 toggle A 顶部双按钮
6 queue 标题栏合并位置/LV/分
7 异常+接入混合 M1 双角标并存

异常徽章 3 优化(标题栏,从 v2.1 升级)

优化 名称 视觉 实现位置
分级显示 5W · 0F 双胶囊(warning 暖黄字 + fail 粉字) .diag-header__badge--graded
接入中提示 Tab 文字右侧灰色斜体 •N .diag-tab__pending-hint
0 异常达标动画 绿色脉冲 + ✓ 今日安全 文字,3 秒渐隐 .diag-header__badge--celebrate

5 状态对照表(原型图自带的对照面板):

  1. 分级 5W · 0F(当前 Mock
  2. 含 fail 2W · 1F
  3. 旧版兼容 !5(可选关闭)
  4. 达标动画 ✓ 今日安全
  5. 静态正常 ✓ 全部正常

6 Tab 横向并排标签页(替代 3×2 网格按钮)

  • 高度34px(不变)
  • 布局flex 1:1:1:1:1:1 等分
  • 激活态:底部 2px 蓝色下划线 + 文字加粗
  • 异常 Tab:底部额外一条 2px 红色半透明线(双层指示)
  • 移动端约束(关键事实):ChatView.vue:80-89 移动端 <500px 直接 return falseRightPanel 整个不渲染 → 无需考虑横向滚动/换行

移动端 toggle 切换(核心需求,仅移动端 <500px)

  • 方案 A:顶部双按钮 💬 对话 / 🩺 信息
  • 桌面端 ≥500px:维持双栏,不显示 toggle
  • Vue v-show 切换(不卸载 DOM)保留左对话滚动位置 + 输入栏文本
  • 3 方案对比
    • A 顶部双按钮 推荐(直观/单击/状态高亮)
    • B 右下 FAB(备选,覆盖对话丢上下文)
    • C 底部 Tab Bar(备选,跨端控件位置不一致)

queue 标题栏合并(决策 ⑥)

改造前v2.0):queue-header 只显示 #5queue-content 内 QueueWaiting 组件含完整 position-card。

改造后v2.3):

⏳ 排队等待 | #5 前面4人 | LV.3 | 120分 | 答题挑战
  • queue-header 内联三件套(qh-position-inline / qh-lv-inline / qh-points-inline
  • queue-content 只保留答题区,QueueWaiting 组件传 :show-position="false" 隐藏 position-card
  • 整体高度压缩 ~40px

异常 + 接入混合 M1 双角标并存(决策 ⑦)

  • 场景:某 Tab 同时有异常(W/F)和接入中(pending)项
  • 显示:安全 1•2(红数字徽章 + 灰斜体小角标)
  • 视觉区隔:颜色(红 vs 灰)+ 字体(标准 vs 斜体小号)
  • 计数规则:红数字徽章 = 异常项数;灰斜体小角标 = 接入中项数(不计入异常)

涉及文件改动(4 项)

文件 改动
src/frontend-h5/src/components/assistant/SelfDiagnosis.vue 新增 totalBadge / totalBadgeByLevel / showCelebrate computed + 标题栏模板
src/frontend-h5/src/components/assistant/QueueWaiting.vue 新增 showPosition?: boolean prop
src/frontend-h5/src/components/assistant/RightPanel.vue queue-header-v3 内联三件套 + 传 :show-position="false"
src/frontend-h5/src/views/ChatView.vue 移动端 toggle 按钮 + isMobilePanelOpen state

验收 e2e5 类场景)

  • 桌面端 ≥500px 双栏正常,异常徽章 5W · 0F
  • 移动端 <500px 默认显示左对话,点击 🩺 切换到右栏
  • queue 标题栏显示位置/LV/分;queue-content 内不重复显示
  • 切到"系统软件" Tab 只显示系统相关项
  • Tab "安全" 1 异常 + 2 接入时显示 安全 1•2
  • 0 异常时触发"✓ 今日安全"动画 3 秒后渐隐

关键代码片段

// SelfDiagnosis.vue 新增 computed
const totalBadgeByLevel = computed(() => {
  let w = 0, f = 0
  tabsData.value.forEach(tab => {
    w += tab.diagItems.filter(d => d.status === 'warning').length
    w += tab.riskItems.filter(r => r.level === 'warning').length
    f += tab.diagItems.filter(d => d.status === 'fail').length
    f += tab.riskItems.filter(r => r.level === 'danger').length
  })
  return { w, f }
})

// QueueWaiting.vue 新增 prop
const props = defineProps<{
  showQuiz?: boolean
  showPosition?: boolean  // 默认 true
}>()

// ChatView.vue toggle
const isMobilePanelOpen = ref(false)
const showRightPanel = computed(() => {
  if (!isMobile.value) return true
  return isMobilePanelOpen.value
})

关联文档(REQ-用户-007 完整 4 件套)

  • PRDdocs/01-产品文档/05-用户端H5/PRD-REQ-用户-007-自助诊断面板优化-v1.0.md
  • 技术方案docs/02-技术文档/技术架构/技术方案-REQ-用户-007-自助诊断面板优化-v1.0.md
  • 任务说明书docs/07-项目管理/任务说明书/任务说明书-REQ-用户-007-自助诊断面板优化.md
  • 测试用例docs/03-测试文档/03-功能测试用例/TC-REQ-用户-007-自助诊断面板优化.md