From a4b59add071b9c340cca0ccb6d246f9183d022e0 Mon Sep 17 00:00:00 2001 From: Nelson <1475262689@qq.com> Date: Sun, 5 Jul 2026 18:53:46 +0800 Subject: [PATCH] Use backend callable QA for H5 answers --- .../frontend/components/h5/H5QAExperience.tsx | 52 +++++++++++++--- hy_qa_asset_backend/frontend/lib/h5MockQa.ts | 61 ++----------------- 2 files changed, 49 insertions(+), 64 deletions(-) diff --git a/hy_qa_asset_backend/frontend/components/h5/H5QAExperience.tsx b/hy_qa_asset_backend/frontend/components/h5/H5QAExperience.tsx index a22fc83..f7fdba3 100644 --- a/hy_qa_asset_backend/frontend/components/h5/H5QAExperience.tsx +++ b/hy_qa_asset_backend/frontend/components/h5/H5QAExperience.tsx @@ -20,7 +20,6 @@ import { createEmptySession, findQaAnswer, initialMessages, - mockCallableQa, suggestedQuestions, summarizeSession, type ChatSession, @@ -51,6 +50,22 @@ function buildAnswerMessage(question: string, qa: CallableQAItem): ChatMessage { }; } +function buildUnavailableMessage(reason: "loading" | "empty" | "error"): ChatMessage { + const content = { + loading: "我还在连接可调用问答库,请稍等几秒后再试。", + empty: "当前可调用问答库还没有可用内容。请先到后台标准问答库中,把已审核、低/中风险、已脱敏或无需脱敏的问答标记为“可调用”。", + error: "暂时连接不到后端可调用库,请检查后端服务或网络连接后再试。" + }[reason]; + + return { + id: `assistant-unavailable-${Date.now()}`, + role: "assistant", + content, + boundary: "H5 端不会使用未审核或不可调用的内容生成回答。", + createdAt: nowText() + }; +} + function formatSessionTime(value: string) { return new Intl.DateTimeFormat("zh-CN", { month: "2-digit", @@ -70,11 +85,12 @@ export default function H5QAExperience() { const [currentSessionId, setCurrentSessionId] = useState(""); const [callableQa, setCallableQa] = useState([]); const [loadingQa, setLoadingQa] = useState(true); + const [qaLoadError, setQaLoadError] = useState(null); const [user, setUser] = useState(null); const [copiedMessageId, setCopiedMessageId] = useState(null); const bottomRef = useRef(null); - const qaSource = useMemo(() => (callableQa.length > 0 ? callableQa : mockCallableQa), [callableQa]); + const qaStatusText = loadingQa ? "正在连接可调用库" : qaLoadError ? "后端连接异常" : callableQa.length > 0 ? "已连接可调用库" : "可调用库为空"; useEffect(() => { const fallback = createEmptySession(); @@ -101,8 +117,14 @@ export default function H5QAExperience() { useEffect(() => { api .get("/standard-qa/callable") - .then(setCallableQa) - .catch(() => setCallableQa([])) + .then((items) => { + setCallableQa(items); + setQaLoadError(null); + }) + .catch((error) => { + setCallableQa([]); + setQaLoadError(error instanceof Error ? error.message : "可调用库接口请求失败"); + }) .finally(() => setLoadingQa(false)); }, []); @@ -173,8 +195,15 @@ export default function H5QAExperience() { const trimmed = question.trim(); if (!trimmed) return; - const matchedQa = findQaAnswer(trimmed, qaSource); + const matchedQa = findQaAnswer(trimmed, callableQa); const timestamp = Date.now(); + const assistantMessage = loadingQa + ? buildUnavailableMessage("loading") + : qaLoadError + ? buildUnavailableMessage("error") + : matchedQa + ? { ...buildAnswerMessage(trimmed, matchedQa), id: `assistant-${timestamp}` } + : buildUnavailableMessage("empty"); const nextMessages: ChatMessage[] = [ ...messages, { @@ -183,7 +212,7 @@ export default function H5QAExperience() { content: trimmed, createdAt: nowText() }, - { ...buildAnswerMessage(trimmed, matchedQa), id: `assistant-${timestamp}` } + assistantMessage ]; persistMessages(nextMessages); setInput(""); @@ -207,7 +236,7 @@ export default function H5QAExperience() {
-

当前页面只做前端加法:登录注册为 mock 状态,问答优先读取已审核可调用库,没有数据时使用本地演示问答。

+

当前页面只做前端加法:登录注册为 mock 状态,问答只读取后端已审核可调用库。

后续封装微信小程序时,主交互可以保留:顶部身份区、聊天流、快捷问题、底部导航和账号面板。

@@ -224,7 +253,7 @@ export default function H5QAExperience() {

千问千答助手

- {loadingQa ? "正在检查可调用库" : callableQa.length > 0 ? "已连接可调用库" : "演示模式"} + {qaStatusText}
@@ -254,6 +283,11 @@ export default function H5QAExperience() {
回答会优先遵守审核边界;涉及医疗、法律、极端风险或个人隐私时,请以人工复核为准。
+ {!loadingQa && (qaLoadError || callableQa.length === 0) ? ( +
+ {qaLoadError ? `可调用库接口异常:${qaLoadError}` : "当前后端可调用库为空,H5 不会用本地 mock 内容代替真实答案。"} +
+ ) : null}
{messages.map((message) => ( @@ -359,7 +393,7 @@ export default function H5QAExperience() {
数据模式 - {callableQa.length > 0 ? "接口数据" : "mock 演示"} + {qaLoadError ? "接口异常" : callableQa.length > 0 ? "接口数据" : "等待入库"}