diff --git a/frontend/src/pages/QueriesPage.tsx b/frontend/src/pages/QueriesPage.tsx index 37c1f96..ee5db62 100644 --- a/frontend/src/pages/QueriesPage.tsx +++ b/frontend/src/pages/QueriesPage.tsx @@ -343,6 +343,10 @@ function NewQueryPanel({ const handleExecute = useCallback(async () => { if (!sql || !instanceId) { setError('请选择实例并输入查询语句'); return; } + // 检查未替换的模板占位符 + if (/\{(?:table|db|collection)\}/.test(sql)) { + setError('SQL 中含有未替换的占位符 {table}/{db}/{collection},请先替换或删除'); return; + } setExecuting(true); setError(''); setResult(null); @@ -368,7 +372,8 @@ function NewQueryPanel({ favorite: false, }); } catch (e: unknown) { - const msg = (e as { response?: { data?: { detail?: string } } })?.response?.data?.detail || '查询失败'; + const raw = (e as { response?: { data?: { detail?: string | Array<{ msg: string }> } } })?.response?.data?.detail; + const msg = Array.isArray(raw) ? raw.map((v) => v.msg).join('; ') : (raw || '查询失败'); setError(msg); onExecuted({ id: Date.now(), diff --git a/frontend/src/pages/TicketCreatePage.tsx b/frontend/src/pages/TicketCreatePage.tsx index 42f727c..b4cef7f 100644 --- a/frontend/src/pages/TicketCreatePage.tsx +++ b/frontend/src/pages/TicketCreatePage.tsx @@ -398,8 +398,10 @@ export default function TicketCreatePage() { }); navigate('/tickets'); } catch (e: unknown) { - const err = e as { response?: { data?: { detail?: string } } }; - setError(err?.response?.data?.detail || '提交失败,请稍后重试'); + const err = e as { response?: { data?: { detail?: string | Array<{ msg: string }> } } }; + const raw = err?.response?.data?.detail; + const msg = Array.isArray(raw) ? raw.map((v) => v.msg).join('; ') : (raw || '提交失败,请稍后重试'); + setError(msg); } finally { setSubmitting(false); } }, [title, sqlContent, instanceId, database, reason, priority, rollbackSql, instances, dbType, navigate]);