# 变更提案: ticket-chat-image-dnd-paste-upload ## 元信息 ```yaml 类型: 新功能 方案类型: implementation 优先级: P2 状态: 已确认 创建: 2026-04-27 ``` --- ## 1. 需求 ### 背景 `admin-frontend` 工单工作台当前已支持通过按钮选择图片,并将上传后的 URL 以 Markdown 图片语法插入回复框。客服处理截图类问题时,图片常来自本地文件拖入或剪贴板截图,单一按钮选择会降低连续回复效率。 ### 目标 - 在 `admin-frontend/src/views/tickets/TicketWorkspaceDialog.vue` 的工单聊天回复区域支持拖拽图片上传。 - 在回复框聚焦时支持从剪贴板粘贴图片上传。 - 复用现有 `uploadImage()`、图片类型校验、10MB 大小限制和 Markdown 图片插入方式。 - 保留原有点击上传入口,并补齐上传中、拖拽悬停、失败提示等状态反馈。 - 将超大 SFC 的样式拆分到同目录 SCSS 文件,避免继续扩大 533 行组件文件。 ### 约束条件 ```yaml 时间约束: 无 性能约束: 不引入新依赖;拖拽/粘贴只处理图片文件,不做额外预览缓存 兼容性约束: 保持 Vue3 + Element Plus + Vite 现有技术栈;保留原有 /upload/rest/upload 上传接口 业务约束: 不修改后端工单回复语义,不改变 replyTicket payload,仅插入 Markdown 图片链接 ``` ### 验收标准 - [ ] 点击“上传图片”仍可上传图片并插入 `![image](url)`。 - [ ] 拖拽图片到回复区域可上传并插入 Markdown 图片。 - [ ] 在回复框中粘贴剪贴板图片可上传并插入 Markdown 图片。 - [ ] 非图片文件、超过 10MB 图片会被拒绝并展示明确提示。 - [ ] 上传中回复区有可见状态,重复上传不会破坏现有回复内容。 - [ ] `npm run build` 在 `admin-frontend` 通过。 --- ## 2. 方案 ### 技术方案 在 `TicketWorkspaceDialog.vue` 中抽出统一的 `uploadReplyImages(files, source)` 流程:从 Element Plus 上传、拖拽事件、粘贴事件统一收敛到同一校验与上传路径。回复区外层增加 drag/drop 事件和视觉状态,`ElInput` 增加 paste 事件。上传成功后继续以 Markdown 图片语法追加到 `replyMessage`,失败时按具体来源给出错误提示。样式迁移到 `TicketWorkspaceDialog.scss`,并新增拖拽激活态、上传提示行和响应式细节。 ### 影响范围 ```yaml 涉及模块: - admin-frontend: 工单工作台回复区图片上传交互 预计变更文件: 4 ``` ### 风险评估 | 风险 | 等级 | 应对 | |------|------|------| | 粘贴文本时误触上传逻辑 | 低 | 仅当 clipboardData 中存在 image File 时拦截默认行为,否则保持原粘贴行为 | | 多图拖拽上传时状态混乱 | 中 | 顺序上传并复用同一个上传状态,逐个插入 Markdown,失败时提示具体失败原因 | | 样式拆分造成 scoped 样式失效 | 低 | 使用项目已有 `