From 36bd0a6155222807f8059a6868c7778ab87ef359 Mon Sep 17 00:00:00 2001 From: attacker Date: Sat, 27 Jun 2026 07:14:54 +0000 Subject: [PATCH] =?UTF-8?q?fix(log-center):=20=E4=BF=AE=E5=A4=8D=20demo=20?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E6=BA=90=E3=80=81ES=20502=E3=80=81=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E9=A1=B5=E5=85=B3=E8=81=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/controller/log_proxy.go | 4 ++- .../monitor/log-center/LogDatasourcePage.tsx | 29 +++++++++++++------ .../monitor/log-center/UnifiedQueryPanel.tsx | 7 +++-- 3 files changed, 27 insertions(+), 13 deletions(-) diff --git a/backend/controller/log_proxy.go b/backend/controller/log_proxy.go index f218f41..04249c2 100644 --- a/backend/controller/log_proxy.go +++ b/backend/controller/log_proxy.go @@ -137,7 +137,9 @@ func (h *LogProxyHandler) QueryES(c *gin.Context) { if searchBody == nil { searchBody = map[string]interface{}{ "size": req.Size, - "sort": []map[string]interface{}{{"@timestamp": map[string]string{"order": "desc"}}}, + "sort": []interface{}{ + map[string]interface{}{"_score": map[string]string{"order": "desc"}}, + }, "query": map[string]interface{}{ "bool": map[string]interface{}{ "must": []interface{}{ diff --git a/frontend/src/components/monitor/log-center/LogDatasourcePage.tsx b/frontend/src/components/monitor/log-center/LogDatasourcePage.tsx index 7216f0e..4223553 100644 --- a/frontend/src/components/monitor/log-center/LogDatasourcePage.tsx +++ b/frontend/src/components/monitor/log-center/LogDatasourcePage.tsx @@ -12,10 +12,16 @@ import { logCenterApi, type LogDataSource } from '@/api/monitor/log-center'; import { LogDatasourceDialog } from './LogDatasourceDialog'; import type { LogEngine } from './log-center-types'; +// Demo 兜底数据源(API 无数据时展示) // Logan.Li +const DEMO_FALLBACK: LogDataSource[] = [ + { id: -1, name: 'demo-loki', type: 'loki', url: '' }, + { id: -2, name: 'demo-es', type: 'elasticsearch', url: '' }, +]; + export function LogDatasourcePage() { const { toast } = useToast(); const confirm = useConfirm(); - const [sources, setSources] = useState([]); + const [sources, setSources] = useState(DEMO_FALLBACK); const [loading, setLoading] = useState(true); const [dialog, setDialog] = useState<{ open: boolean; engine: LogEngine; editing?: LogDataSource | null }>({ open: false, engine: 'loki', editing: null, @@ -25,9 +31,11 @@ export function LogDatasourcePage() { setLoading(true); try { const res = await logCenterApi.listDatasources(); - setSources(Array.isArray(res) ? res : []); + const apiList: LogDataSource[] = Array.isArray(res) ? res : []; + // API 有数据 → 展示真实数据源;无数据 → demo 兜底 // Logan.Li + setSources(apiList.length > 0 ? apiList : DEMO_FALLBACK); } catch { - setSources([]); + setSources(DEMO_FALLBACK); } finally { setLoading(false); } @@ -108,28 +116,31 @@ export function LogDatasourcePage() { }, { key: 'actions', header: '操作', align: 'right', hideable: false, - render: (ds) => ( + render: (ds) => { + const isDemo = ds.id < 0 || !ds.url; + return (
{!ds.is_default && ( )}
- ), + ); + }, }, ]; diff --git a/frontend/src/components/monitor/log-center/UnifiedQueryPanel.tsx b/frontend/src/components/monitor/log-center/UnifiedQueryPanel.tsx index 662d8af..92df852 100644 --- a/frontend/src/components/monitor/log-center/UnifiedQueryPanel.tsx +++ b/frontend/src/components/monitor/log-center/UnifiedQueryPanel.tsx @@ -132,12 +132,13 @@ export function UnifiedQueryPanel({ engine, onRuleCreated }: Props) { const meta = ENGINE_META[effEngine]; const badge = ENGINE_BADGE[effEngine]; - // 从后端加载真实数据源,无数据时用 demo 兜底 // Logan.Li + // 从后端加载真实数据源,同时保留 demo 兜底 // Logan.Li const [sources, setSources] = useState(DEMO_SOURCES[effEngine]); useEffect(() => { logCenterApi.listDatasources(effEngine).then((res: any) => { const list: LogDataSource[] = Array.isArray(res) ? res : (res?.list || []); - if (list.length > 0) setSources(list); + // 合并真实数据源 + demo 兜底(真实源在前) // Logan.Li + if (list.length > 0) setSources([...list, ...DEMO_SOURCES[effEngine]]); else setSources(DEMO_SOURCES[effEngine]); }).catch(() => setSources(DEMO_SOURCES[effEngine])); }, [effEngine]); @@ -277,7 +278,7 @@ export function UnifiedQueryPanel({ engine, onRuleCreated }: Props) {