Files

4.1 KiB
Raw Permalink Blame History

2026-06-10 工作日志

截图功能不可用 & 无法粘贴图片文件 — 修复(23:19)

问题1:截图功能不可用

  • 根因:两个 ScreenshotEditor.vue 根 div 都有 v-if="visible",但父组件没传 visible prop
    • 父组件用 v-if="showScreenshotEditor" 控制渲染,子组件的 v-if="visible" 冗余且导致内容永远隐藏
  • 修复:删除 frontend-agent/src/components/chat/ScreenshotEditor.vue 第10行 和 frontend-h5/src/components/chat/ScreenshotEditor.vue 第10行 的 v-if="visible"

问题2:会话框无法粘贴图片、文件

  • 坐席端根因handlePaste 只处理 image/* 类型,非图片文件无法粘贴
  • 坐席端修复
    • handlePaste 改为检查 item.kind === 'file' 处理所有文件类型
    • 新增 handleFileUpload() 函数:上传非图片文件并发送 file 类型消息
  • H5端根因
    • handlePaste 只处理 image/*
    • handleImageUpload 上传后没有调用发送(只 console.log
  • H5端修复
    • handlePaste 支持所有文件类型
    • handleImageUpload 上传后调用 store.sendNewMessage() 发送图片链接
    • 新增 handleFileUpload() 处理非图片文件

修改文件清单

  • frontend-agent/src/components/chat/ScreenshotEditor.vue — 删除 v-if="visible"
  • frontend-h5/src/components/chat/ScreenshotEditor.vue — 删除 v-if="visible"
  • frontend-agent/src/components/chat/ReplyBox.vue — 修复 handlePaste,新增 handleFileUpload()
  • frontend-h5/src/components/chat/InputBar.vue — 修复 handlePaste,修复 handleImageUpload,新增 handleFileUpload()

构建状态

  • 坐席端:npx vite build 成功
  • H5端:npx vite build 成功

422错误 + 截图发送失败 + H5截图无法选中 — 修复(23:50)

问题1:文件粘贴请求失败422 + 截图发送失败

  • 根因1uploadFile() 中 Blob 被 append 了两次(第一次没文件名,第二次有文件名)
    • 坐席端 upload.ts:先 formData.append('file', file) 无条件 append 一次,然后 if (Blob) 再 append 一次
    • FormData 中有两个 file 字段,FastAPI 可能取到第一个(无文件名),导致解析失败
  • 根因2:手动设 Content-Type: multipart/form-data 覆盖了浏览器自动生成的 boundary
    • 发送 FormData 时浏览器会自动生成 Content-Type: multipart/form-data; boundary=----xxx
    • 手动设 headers: { 'Content-Type': 'multipart/form-data' } 会丢弃 boundary
    • 后端无法解析没有 boundary 的 multipart 请求体 → 422 Unprocessable Entity
  • 修复
    • frontend-agent/src/api/upload.ts:去掉无条件 append,改为 if/else 分支;删除 Content-Type
    • frontend-h5/src/api/upload.ts:删除 Content-Type

问题2:H5截图无法选中(暗色遮罩阻挡 + passive事件)

  • 根因1.screenshot-dark-overlay 在选区绘制层内部,拦截了所有触摸事件
    • 修复:加 pointer-events: none,让触摸事件穿透遮罩到达选区层
  • 根因2onTouchStart/onTouchMove 调用 e.preventDefault() 但 Vue 在移动端默认用 passive 模式绑定触摸事件
    • passive 模式下 preventDefault() 无效且报 warning
    • 修复:模板中移除 @touchstart/@touchmove,改为 onMounted 中用 addEventListener 手动绑定非 passive 监听器

问题3:坐席端截图选区也可能被遮罩阻挡

  • 根因:坐席端 ScreenshotEditor 的 .screenshot-dark-overlay 也缺少 pointer-events: none
  • 修复:坐席端同样加 pointer-events: none

修改文件清单

  • frontend-agent/src/api/upload.ts — 修复双重 append + 删除手动 Content-Type
  • frontend-h5/src/api/upload.ts — 删除手动 Content-Type
  • frontend-agent/src/components/chat/ScreenshotEditor.vue — 暗色遮罩加 pointer-events: none
  • frontend-h5/src/components/chat/ScreenshotEditor.vue — 暗色遮罩加 pointer-events: none;触摸事件改为非 passive 手动绑定

构建状态

  • 坐席端:npx vite build 成功
  • H5端:npx vite build 成功