From 12d89dfb35a77d230edfbad2b3a8bfa238eb3859 Mon Sep 17 00:00:00 2001 From: Simon Date: Thu, 9 Jul 2026 11:49:50 +0800 Subject: [PATCH] feat(h5): confidence gate + triage + image uploader + ws composable MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增 ConfidenceGateBanner/ImageUploader/TriageCard 组件与 useConfidenceGate; useH5WebSocket 增强; 对话/API 适配。 --- frontend-h5/.dockerignore | 4 + frontend-h5/Dockerfile.dev | 2 +- frontend-h5/components.d.ts | 9 + frontend-h5/index.html | 2 +- frontend-h5/public/duckula.png | Bin 0 -> 9462 bytes frontend-h5/public/duckula.webp | Bin 0 -> 1452 bytes frontend-h5/src/api/conversation.ts | 9 +- frontend-h5/src/api/index.ts | 2 +- .../src/api/troubleshooting-templates.ts | 5 +- .../src/components/ConfidenceGateBanner.vue | 331 +++++++++++ frontend-h5/src/components/ImageUploader.vue | 413 ++++++++++++++ frontend-h5/src/components/TriageCard.vue | 529 ++++++++++++++++++ .../src/components/chat/MessageBubble.vue | 15 +- .../src/components/chat/MessageItem.vue | 14 +- .../src/composables/useConfidenceGate.ts | 180 ++++++ frontend-h5/src/composables/useH5WebSocket.ts | 30 +- frontend-h5/src/stores/conversation.ts | 182 +++++- frontend-h5/vite.config.ts | 5 +- 18 files changed, 1712 insertions(+), 20 deletions(-) create mode 100644 frontend-h5/.dockerignore create mode 100644 frontend-h5/public/duckula.png create mode 100644 frontend-h5/public/duckula.webp create mode 100644 frontend-h5/src/components/ConfidenceGateBanner.vue create mode 100644 frontend-h5/src/components/ImageUploader.vue create mode 100644 frontend-h5/src/components/TriageCard.vue create mode 100644 frontend-h5/src/composables/useConfidenceGate.ts diff --git a/frontend-h5/.dockerignore b/frontend-h5/.dockerignore new file mode 100644 index 0000000..3be2309 --- /dev/null +++ b/frontend-h5/.dockerignore @@ -0,0 +1,4 @@ +node_modules +dist +.git +*.log diff --git a/frontend-h5/Dockerfile.dev b/frontend-h5/Dockerfile.dev index 34f8767..80c6878 100644 --- a/frontend-h5/Dockerfile.dev +++ b/frontend-h5/Dockerfile.dev @@ -16,7 +16,7 @@ WORKDIR /app COPY package.json pnpm-lock.yaml* ./ # 安装依赖 -RUN pnpm install --frozen-lockfile +RUN pnpm install --no-frozen-lockfile # 复制源码(后续通过 volume mount 更新) COPY . . diff --git a/frontend-h5/components.d.ts b/frontend-h5/components.d.ts index bf7df3c..9ea7d6a 100644 --- a/frontend-h5/components.d.ts +++ b/frontend-h5/components.d.ts @@ -14,7 +14,9 @@ declare module 'vue' { CallAgentModal: typeof import('./src/components/chat/CallAgentModal.vue')['default'] ChatPanel: typeof import('./src/components/chat/ChatPanel.vue')['default'] ComingSoon: typeof import('./src/components/assistant/ComingSoon.vue')['default'] + ConfidenceGateBanner: typeof import('./src/components/ConfidenceGateBanner.vue')['default'] EvaluationDialog: typeof import('./src/components/chat/EvaluationDialog.vue')['default'] + ImageUploader: typeof import('./src/components/ImageUploader.vue')['default'] InputBar: typeof import('./src/components/chat/InputBar.vue')['default'] InputBox: typeof import('./src/components/chat/InputBox.vue')['default'] MessageBubble: typeof import('./src/components/chat/MessageBubble.vue')['default'] @@ -28,16 +30,23 @@ declare module 'vue' { ScreenshotEditor: typeof import('./src/components/chat/ScreenshotEditor.vue')['default'] ShakeButton: typeof import('./src/components/chat/ShakeButton.vue')['default'] SoftwareDownloads: typeof import('./src/components/assistant/SoftwareDownloads.vue')['default'] + TriageCard: typeof import('./src/components/TriageCard.vue')['default'] TroubleshootFlow: typeof import('./src/components/chat/TroubleshootFlow.vue')['default'] TroubleshootProgress: typeof import('./src/components/chat/TroubleshootProgress.vue')['default'] VanButton: typeof import('vant/es')['Button'] + VanCell: typeof import('vant/es')['Cell'] + VanCellGroup: typeof import('vant/es')['CellGroup'] VanConfigProvider: typeof import('vant/es')['ConfigProvider'] VanDialog: typeof import('vant/es')['Dialog'] VanEmpty: typeof import('vant/es')['Empty'] VanField: typeof import('vant/es')['Field'] VanIcon: typeof import('vant/es')['Icon'] VanLoading: typeof import('vant/es')['Loading'] + VanNavBar: typeof import('vant/es')['NavBar'] VanPopup: typeof import('vant/es')['Popup'] VanRate: typeof import('vant/es')['Rate'] + VanStep: typeof import('vant/es')['Step'] + VanSteps: typeof import('vant/es')['Steps'] + VanTag: typeof import('vant/es')['Tag'] } } diff --git a/frontend-h5/index.html b/frontend-h5/index.html index 574ae73..49959b6 100644 --- a/frontend-h5/index.html +++ b/frontend-h5/index.html @@ -5,7 +5,7 @@ - + 智能IT支持服务台 diff --git a/frontend-h5/public/duckula.png b/frontend-h5/public/duckula.png new file mode 100644 index 0000000000000000000000000000000000000000..5c90fe1036d45f079ebad277a635397dcf47864d GIT binary patch literal 9462 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
gV}F;Ed^i(W4D2dB0~kH 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 GU;qIB+{T~) literal 0 HcmV?d00001 diff --git a/frontend-h5/src/api/conversation.ts b/frontend-h5/src/api/conversation.ts index b2fab56..ab4d59e 100644 --- a/frontend-h5/src/api/conversation.ts +++ b/frontend-h5/src/api/conversation.ts @@ -173,8 +173,13 @@ export interface SoftwareDownload { export interface SendMessageResponse { /** 用户发送的消息 */ user_message: Message - /** AI 自动回复消息 */ - ai_reply: Message + /** + * AI 自动回复消息 + * 注意:改造方案 A 后,HTTP 接口不再同步返回 AI 回复(恒为 null), + * AI 回复由后台任务经 WebSocket 流式推回(ai_reply_chunk / ai_reply)。 + * 此处可能为 null,调用方(store)需改为依赖 WS 事件。 + */ + ai_reply: Message | null /** 是否为引导类回复(打招呼/呼叫人工),不计入实质回复 */ is_guidance: boolean /** 当前 AI 实质性回复计数 */ diff --git a/frontend-h5/src/api/index.ts b/frontend-h5/src/api/index.ts index 3843bc8..e1a2c6b 100644 --- a/frontend-h5/src/api/index.ts +++ b/frontend-h5/src/api/index.ts @@ -77,7 +77,7 @@ apiClient.interceptors.response.use( } // 业务成功:Scheme A — 直接返回 inner data(三端统一契约) - return res.data + return res.data as any }, async (error) => { // 网络错误或服务器错误:统一 reject {code, message}(CTRT-03) diff --git a/frontend-h5/src/api/troubleshooting-templates.ts b/frontend-h5/src/api/troubleshooting-templates.ts index d18d5c8..6f15430 100644 --- a/frontend-h5/src/api/troubleshooting-templates.ts +++ b/frontend-h5/src/api/troubleshooting-templates.ts @@ -7,7 +7,6 @@ // ============================================================================= import apiClient from './index' -import type { AxiosResponse } from 'axios' // -------------------------------------------------------------------------- // TypeScript 类型定义 — 与后端 Schema 保持一致 @@ -96,7 +95,7 @@ export interface TroubleshootingTemplateQuery { export async function getTroubleshootingTemplates( params?: TroubleshootingTemplateQuery, ): Promise { - const response: AxiosResponse = await apiClient.get('/troubleshooting-templates', { + const response = await apiClient.get('/troubleshooting-templates', { params: { category: params?.category || undefined, page: params?.page || 1, @@ -115,6 +114,6 @@ export async function getTroubleshootingTemplates( export async function getTroubleshootingTemplate( id: string, ): Promise { - const response: AxiosResponse = await apiClient.get(`/troubleshooting-templates/${id}`) + const response = await apiClient.get(`/troubleshooting-templates/${id}`) return response } diff --git a/frontend-h5/src/components/ConfidenceGateBanner.vue b/frontend-h5/src/components/ConfidenceGateBanner.vue new file mode 100644 index 0000000..a749fd1 --- /dev/null +++ b/frontend-h5/src/components/ConfidenceGateBanner.vue @@ -0,0 +1,331 @@ + + + + + + + diff --git a/frontend-h5/src/components/ImageUploader.vue b/frontend-h5/src/components/ImageUploader.vue new file mode 100644 index 0000000..f3c21dd --- /dev/null +++ b/frontend-h5/src/components/ImageUploader.vue @@ -0,0 +1,413 @@ + + +