facc04aa65
本提交为 .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-*/
127 lines
3.7 KiB
Plaintext
127 lines
3.7 KiB
Plaintext
%% 坐席端截图+拍照功能 — 类图
|
|
%% 文件: docs/03-技术架构/class-diagram.mermaid
|
|
|
|
classDiagram
|
|
%% ===== 类型定义 =====
|
|
class PendingImage {
|
|
+id: string
|
|
+blob: Blob
|
|
+previewUrl: string
|
|
+source: "screenshot" | "camera"
|
|
+createdAt: number
|
|
}
|
|
|
|
class SelectionBox {
|
|
+x: number
|
|
+y: number
|
|
+w: number
|
|
+h: number
|
|
}
|
|
|
|
class EditHistoryEntry {
|
|
+imageData: ImageData
|
|
+timestamp: number
|
|
}
|
|
|
|
class ScreenshotToolConfig {
|
|
+name: ScreenshotTool
|
|
+icon: string
|
|
+label: string
|
|
}
|
|
|
|
%% ===== Composables =====
|
|
class useScreenCapture {
|
|
-isCapturing: Ref~boolean~
|
|
+isScreenCaptureSupported() boolean
|
|
+captureScreen() Promise~Blob | null~
|
|
+captureScreenAsCanvas() Promise~HTMLCanvasElement | null~
|
|
}
|
|
|
|
class useCamera {
|
|
-isActive: Ref~boolean~
|
|
-error: Ref~CameraError | null~
|
|
-stream: MediaStream | null
|
|
+startCamera(facingMode?) Promise~boolean~
|
|
+stopCamera() void
|
|
+captureFrame() Promise~Blob | null~
|
|
+switchCamera() Promise~boolean~
|
|
}
|
|
|
|
class usePendingImages {
|
|
-images: Ref~PendingImage[]~
|
|
+addImage(blob: Blob, source: string) void
|
|
+removeImage(id: string) void
|
|
+clearAll() void
|
|
+hasImages: ComputedRef~boolean~
|
|
+count: ComputedRef~number~
|
|
}
|
|
|
|
%% ===== 组件 =====
|
|
class ScreenCapture {
|
|
+props: screenshotCanvas: HTMLCanvasElement
|
|
+emit: confirm(blob: Blob)
|
|
+emit: cancel()
|
|
-box: Ref~SelectionBox~
|
|
-currentTool: Ref~ScreenshotTool~
|
|
-currentColor: Ref~string~
|
|
-history: EditHistoryEntry[]
|
|
-historyIndex: number
|
|
+startSelect(e: MouseEvent) void
|
|
+onMove(e: MouseEvent) void
|
|
+startResize(dir: string, e: MouseEvent) void
|
|
+drawMosaic(x1, y1, x2, y2) void
|
|
+drawArrow(x1, y1, x2, y2) void
|
|
+drawText(x, y, text) void
|
|
+undo() void
|
|
+confirm() void
|
|
+cancel() void
|
|
}
|
|
|
|
class CameraCapture {
|
|
+props: modelValue: boolean
|
|
+emit: confirm(blob: Blob)
|
|
+emit: cancel()
|
|
+emit: update:modelValue(boolean)
|
|
-videoRef: Ref~HTMLVideoElement~
|
|
-capturedImage: Ref~string | null~
|
|
-cameraError: Ref~CameraError | null~
|
|
+startCamera() void
|
|
+capture() void
|
|
+retake() void
|
|
+confirm() void
|
|
+close() void
|
|
}
|
|
|
|
class PendingImagePreview {
|
|
+props: images: PendingImage[]
|
|
+emit: remove(id: string)
|
|
}
|
|
|
|
class ReplyBox {
|
|
-pendingImages: usePendingImages
|
|
-showScreenCapture: Ref~boolean~
|
|
-showCameraDialog: Ref~boolean~
|
|
-screenshotCanvas: Ref~HTMLCanvasElement | null~
|
|
+handleScreenshot() Promise~void~
|
|
+handleCamera() void
|
|
+onScreenCaptureConfirm(blob: Blob) void
|
|
+onCameraConfirm(blob: Blob) void
|
|
+onCameraCancel() void
|
|
+removePendingImage(id: string) void
|
|
+handleSend() Promise~void~
|
|
+sendPendingImages(convId: string) Promise~void~
|
|
}
|
|
|
|
%% ===== 关系 =====
|
|
ReplyBox --> useScreenCapture : 调用截图
|
|
ReplyBox --> useCamera : 调用拍照
|
|
ReplyBox --> usePendingImages : 管理待发送图片
|
|
ReplyBox --> ScreenCapture : 挂载截图编辑器
|
|
ReplyBox --> CameraCapture : 挂载拍照弹窗
|
|
ReplyBox --> PendingImagePreview : 挂载预览条
|
|
ScreenCapture --> SelectionBox : 选区状态
|
|
ScreenCapture --> EditHistoryEntry : 撤销历史
|
|
CameraCapture --> useCamera : 摄像头逻辑
|
|
PendingImagePreview --> PendingImage : 渲染缩略图
|
|
usePendingImages --> PendingImage : 管理队列
|