From 91d9e48e1eedf760985cf30c7e66282c6185811d Mon Sep 17 00:00:00 2001 From: Daniel Date: Mon, 2 Mar 2026 00:59:40 +0800 Subject: [PATCH] =?UTF-8?q?fix:=E4=BC=98=E5=8C=96=E6=95=B4=E4=B8=AA?= =?UTF-8?q?=E5=A4=A7=E5=B1=8F=E7=95=8C=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 2 + server/data.db-shm | Bin 32768 -> 32768 bytes server/data.db-wal | Bin 0 -> 782832 bytes server/db.js | 27 +++++ server/index.js | 13 +++ server/routes.js | 15 +++ server/seed.js | 18 +++- server/situationData.js | 39 ++++++- src/components/CombatLossesPanel.tsx | 149 ++++++++++++--------------- src/components/HeaderPanel.tsx | 12 ++- src/components/WarMap.tsx | 103 +++++++++++++++++- src/data/mockData.ts | 27 +++++ src/pages/Dashboard.tsx | 10 +- 13 files changed, 314 insertions(+), 101 deletions(-) diff --git a/package.json b/package.json index ac37a3a..887f2ae 100644 --- a/package.json +++ b/package.json @@ -7,6 +7,8 @@ "dev": "vite", "api": "node server/index.js", "api:seed": "node server/seed.js", + "crawler": "cd crawler && python main.py", + "gdelt": "cd crawler && uvicorn realtime_conflict_service:app --host 0.0.0.0 --port 8000", "build": "vite build", "typecheck": "tsc --noEmit", "lint": "eslint .", diff --git a/server/data.db-shm b/server/data.db-shm index fe9ac2845eca6fe6da8a63cd096d9cf9e24ece10..5be23b935ad8c318a86b121dc5b74435240b19ed 100644 GIT binary patch literal 32768 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 z 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 literal 0 HcmV?d00001 diff --git a/server/db.js b/server/db.js index 8ffe1e7..e9e8af6 100644 --- a/server/db.js +++ b/server/db.js @@ -92,6 +92,26 @@ db.exec(` summary TEXT NOT NULL, severity TEXT NOT NULL ); + + CREATE TABLE IF NOT EXISTS gdelt_events ( + event_id TEXT PRIMARY KEY, + event_time TEXT NOT NULL, + title TEXT NOT NULL, + lat REAL NOT NULL, + lng REAL NOT NULL, + impact_score INTEGER NOT NULL, + url TEXT, + created_at TEXT DEFAULT (datetime('now')) + ); + + CREATE TABLE IF NOT EXISTS conflict_stats ( + id INTEGER PRIMARY KEY CHECK (id = 1), + total_events INTEGER NOT NULL DEFAULT 0, + high_impact_events INTEGER NOT NULL DEFAULT 0, + estimated_casualties INTEGER NOT NULL DEFAULT 0, + estimated_strike_count INTEGER NOT NULL DEFAULT 0, + updated_at TEXT NOT NULL + ); `) // 迁移:为已有 key_location 表添加 type、region、status、damage_level 列 @@ -103,5 +123,12 @@ try { if (!names.includes('status')) db.exec('ALTER TABLE key_location ADD COLUMN status TEXT DEFAULT "operational"') if (!names.includes('damage_level')) db.exec('ALTER TABLE key_location ADD COLUMN damage_level INTEGER') } catch (_) {} +// 迁移:combat_losses 添加平民伤亡 +try { + const lossCols = db.prepare('PRAGMA table_info(combat_losses)').all() + const lossNames = lossCols.map((c) => c.name) + if (!lossNames.includes('civilian_killed')) db.exec('ALTER TABLE combat_losses ADD COLUMN civilian_killed INTEGER NOT NULL DEFAULT 0') + if (!lossNames.includes('civilian_wounded')) db.exec('ALTER TABLE combat_losses ADD COLUMN civilian_wounded INTEGER NOT NULL DEFAULT 0') +} catch (_) {} module.exports = db diff --git a/server/index.js b/server/index.js index 69462dd..dff9335 100644 --- a/server/index.js +++ b/server/index.js @@ -12,6 +12,10 @@ app.use(cors()) app.use(express.json()) app.use('/api', routes) app.get('/api/health', (_, res) => res.json({ ok: true })) +app.post('/api/crawler/notify', (_, res) => { + notifyCrawlerUpdate() + res.json({ ok: true }) +}) const server = http.createServer(app) @@ -29,6 +33,15 @@ function broadcastSituation() { } setInterval(broadcastSituation, 5000) +// 供爬虫调用:更新 situation.updated_at 并立即广播 +function notifyCrawlerUpdate() { + try { + const db = require('./db') + db.prepare("INSERT OR REPLACE INTO situation (id, data, updated_at) VALUES (1, '{}', ?)").run(new Date().toISOString()) + broadcastSituation() + } catch (_) {} +} + server.listen(PORT, () => { console.log(`API + WebSocket running at http://localhost:${PORT}`) }) diff --git a/server/routes.js b/server/routes.js index 25aa043..b4cab2a 100644 --- a/server/routes.js +++ b/server/routes.js @@ -12,4 +12,19 @@ router.get('/situation', (req, res) => { } }) +router.get('/events', (req, res) => { + try { + const s = getSituation() + res.json({ + updated_at: s.lastUpdated, + count: (s.conflictEvents || []).length, + events: s.conflictEvents || [], + conflict_stats: s.conflictStats || {}, + }) + } catch (err) { + console.error(err) + res.status(500).json({ error: err.message }) + } +}) + module.exports = router diff --git a/server/seed.js b/server/seed.js index 7d88f28..ffbd74a 100644 --- a/server/seed.js +++ b/server/seed.js @@ -140,11 +140,19 @@ function seed() { ] iranLocs.forEach((r) => insertLoc.run(...r)) - db.exec(` - INSERT OR REPLACE INTO combat_losses (side, bases_destroyed, bases_damaged, personnel_killed, personnel_wounded, aircraft, warships, armor, vehicles) VALUES - ('us', 0, 27, 127, 384, 2, 0, 0, 8), - ('iran', 3, 8, 2847, 5620, 24, 12, 18, 42); - `) + try { + db.exec(` + INSERT OR REPLACE INTO combat_losses (side, bases_destroyed, bases_damaged, personnel_killed, personnel_wounded, civilian_killed, civilian_wounded, aircraft, warships, armor, vehicles) VALUES + ('us', 0, 27, 127, 384, 18, 52, 2, 0, 0, 8), + ('iran', 3, 8, 2847, 5620, 412, 1203, 24, 12, 18, 42); + `) + } catch (_) { + db.exec(` + INSERT OR REPLACE INTO combat_losses (side, bases_destroyed, bases_damaged, personnel_killed, personnel_wounded, aircraft, warships, armor, vehicles) VALUES + ('us', 0, 27, 127, 384, 2, 0, 0, 8), + ('iran', 3, 8, 2847, 5620, 24, 12, 18, 42); + `) + } db.exec('DELETE FROM wall_street_trend') const trendRows = [['2025-03-01T00:00:00', 82], ['2025-03-01T03:00:00', 85], ['2025-03-01T06:00:00', 88], ['2025-03-01T09:00:00', 90], ['2025-03-01T12:00:00', 92], ['2025-03-01T15:00:00', 94], ['2025-03-01T18:00:00', 95], ['2025-03-01T21:00:00', 96], ['2025-03-01T23:00:00', 98]] diff --git a/server/situationData.js b/server/situationData.js index 8852e37..770f556 100644 --- a/server/situationData.js +++ b/server/situationData.js @@ -15,6 +15,7 @@ function toLosses(row) { return { bases: { destroyed: row.bases_destroyed, damaged: row.bases_damaged }, personnelCasualties: { killed: row.personnel_killed, wounded: row.personnel_wounded }, + civilianCasualties: { killed: row.civilian_killed ?? 0, wounded: row.civilian_wounded ?? 0 }, aircraft: row.aircraft, warships: row.warships, armor: row.armor, @@ -25,6 +26,7 @@ function toLosses(row) { const defaultLosses = { bases: { destroyed: 0, damaged: 0 }, personnelCasualties: { killed: 0, wounded: 0 }, + civilianCasualties: { killed: 0, wounded: 0 }, aircraft: 0, warships: 0, armor: 0, @@ -45,9 +47,30 @@ function getSituation() { const trend = db.prepare('SELECT time, value FROM wall_street_trend ORDER BY time').all() const retaliationCur = db.prepare('SELECT value FROM retaliation_current WHERE id = 1').get() const retaliationHist = db.prepare('SELECT time, value FROM retaliation_history ORDER BY time').all() - const updates = db.prepare('SELECT * FROM situation_update ORDER BY timestamp DESC').all() + const updates = db.prepare('SELECT * FROM situation_update ORDER BY timestamp DESC LIMIT 50').all() const meta = db.prepare('SELECT updated_at FROM situation WHERE id = 1').get() + let conflictEvents = [] + let conflictStats = { total_events: 0, high_impact_events: 0, estimated_casualties: 0, estimated_strike_count: 0 } + try { + conflictEvents = db.prepare('SELECT event_id, event_time, title, lat, lng, impact_score, url FROM gdelt_events ORDER BY event_time DESC LIMIT 30').all() + const statsRow = db.prepare('SELECT total_events, high_impact_events, estimated_casualties, estimated_strike_count FROM conflict_stats WHERE id = 1').get() + if (statsRow) conflictStats = statsRow + } catch (_) {} + + // 根据爬虫 conflict_stats 实时合并平民伤亡估算(GDELT 数据) + const usLossesBase = lossesUs ? toLosses(lossesUs) : defaultLosses + const irLossesBase = lossesIr ? toLosses(lossesIr) : defaultLosses + const est = conflictStats.estimated_casualties || 0 + const mergeCivilian = (base, share) => { + if (est <= 0) return base.civilianCasualties || { killed: 0, wounded: 0 } + const gdeltKilled = Math.round(est * share) + const cur = base.civilianCasualties || { killed: 0, wounded: 0 } + return { killed: Math.max(cur.killed, gdeltKilled), wounded: cur.wounded } + } + const usLosses = { ...usLossesBase, civilianCasualties: mergeCivilian(usLossesBase, 0.35) } + const irLosses = { ...irLossesBase, civilianCasualties: mergeCivilian(irLossesBase, 0.65) } + return { lastUpdated: meta?.updated_at || new Date().toISOString(), usForces: { @@ -69,7 +92,7 @@ function getSituation() { }, assets: (assetsUs || []).map(toAsset), keyLocations: locUs || [], - combatLosses: lossesUs ? toLosses(lossesUs) : defaultLosses, + combatLosses: usLosses, wallStreetInvestmentTrend: trend || [], }, iranForces: { @@ -91,7 +114,7 @@ function getSituation() { }, assets: (assetsIr || []).map(toAsset), keyLocations: locIr || [], - combatLosses: lossesIr ? toLosses(lossesIr) : defaultLosses, + combatLosses: irLosses, retaliationSentiment: retaliationCur?.value ?? 0, retaliationSentimentHistory: retaliationHist || [], }, @@ -102,6 +125,16 @@ function getSituation() { summary: u.summary, severity: u.severity, })), + conflictEvents: conflictEvents.map((e) => ({ + event_id: e.event_id, + event_time: e.event_time, + title: e.title, + lat: e.lat, + lng: e.lng, + impact_score: e.impact_score, + url: e.url, + })), + conflictStats, } } diff --git a/src/components/CombatLossesPanel.tsx b/src/components/CombatLossesPanel.tsx index dff2fbd..a693ccd 100644 --- a/src/components/CombatLossesPanel.tsx +++ b/src/components/CombatLossesPanel.tsx @@ -1,6 +1,5 @@ import { Building2, - Users, Skull, Bandage, Plane, @@ -8,108 +7,92 @@ import { Shield, Car, TrendingDown, + UserCircle, + Activity, } from 'lucide-react' import { formatMillions } from '@/utils/formatNumber' -import type { CombatLosses } from '@/data/mockData' +import type { CombatLosses, ConflictStats } from '@/data/mockData' interface CombatLossesPanelProps { usLosses: CombatLosses iranLosses: CombatLosses + conflictStats?: ConflictStats | null className?: string } -const LOSS_ITEMS: { - key: keyof Omit - label: string - icon: typeof Plane - iconColor: string -}[] = [ - { key: 'aircraft', label: '战机', icon: Plane, iconColor: 'text-sky-400' }, - { key: 'warships', label: '战舰', icon: Ship, iconColor: 'text-blue-500' }, - { key: 'armor', label: '装甲', icon: Shield, iconColor: 'text-emerald-500' }, - { key: 'vehicles', label: '车辆', icon: Car, iconColor: 'text-slate-400' }, -] +export function CombatLossesPanel({ usLosses, iranLosses, conflictStats, className = '' }: CombatLossesPanelProps) { + const civUs = usLosses.civilianCasualties ?? { killed: 0, wounded: 0 } + const civIr = iranLosses.civilianCasualties ?? { killed: 0, wounded: 0 } + const civTotal = { killed: (civUs.killed ?? 0) + (civIr.killed ?? 0), wounded: (civUs.wounded ?? 0) + (civIr.wounded ?? 0) } + + const otherRows = [ + { label: '平民', icon: UserCircle, iconColor: 'text-amber-400', value: `${formatMillions(civTotal.killed)} / ${formatMillions(civTotal.wounded)}`, noSide: true }, + { label: '基地', icon: Building2, iconColor: 'text-amber-500', us: `${usLosses.bases.destroyed}/${usLosses.bases.damaged}`, ir: `${iranLosses.bases.destroyed}/${iranLosses.bases.damaged}` }, + { label: '战机', icon: Plane, iconColor: 'text-sky-400', us: usLosses.aircraft, ir: iranLosses.aircraft }, + { label: '战舰', icon: Ship, iconColor: 'text-blue-500', us: usLosses.warships, ir: iranLosses.warships }, + { label: '装甲', icon: Shield, iconColor: 'text-emerald-500', us: usLosses.armor, ir: iranLosses.armor }, + { label: '车辆', icon: Car, iconColor: 'text-slate-400', us: usLosses.vehicles, ir: iranLosses.vehicles }, + ] -export function CombatLossesPanel({ usLosses, iranLosses, className = '' }: CombatLossesPanelProps) { return ( -

-
+
+
- 战损数据 + 战损 + {conflictStats && conflictStats.total_events > 0 && ( + + + {conflictStats.total_events} + + )}
-
- {/* 基地 */} -
- - - 基地 - -
-
- - - 毁{usLosses.bases.destroyed} - 损{usLosses.bases.damaged} - + +
+ {/* 人员伤亡 - 单独容器 */} +
+
+ 阵亡 + 受伤 + | + 美 : 伊 +
+
+
+ {formatMillions(usLosses.personnelCasualties.killed)} + / + {formatMillions(usLosses.personnelCasualties.wounded)}
-
- - - 毁{iranLosses.bases.destroyed} - 损{iranLosses.bases.damaged} - +
+ {formatMillions(iranLosses.personnelCasualties.killed)} + / + {formatMillions(iranLosses.personnelCasualties.wounded)}
- {/* 人员伤亡 */} -
- - - 人员伤亡 - -
-
- - - {formatMillions(usLosses.personnelCasualties.killed)} - - {formatMillions(usLosses.personnelCasualties.wounded)} -
-
- - - {formatMillions(iranLosses.personnelCasualties.killed)} - - {formatMillions(iranLosses.personnelCasualties.wounded)} -
+ {/* 其它 - 标签+图标+数字,单独容器 */} +
+
美:伊
+
+ {otherRows.map(({ label, icon: Icon, iconColor, ...rest }, i) => ( +
+ + + {label} + + {'value' in rest ? ( + {rest.value} + ) : ( + + {rest.us} + : + {rest.ir} + + )} +
+ ))}
- - {/* 战机 / 战舰 / 装甲 / 车辆 */} - {LOSS_ITEMS.map(({ key, label, icon: Icon, iconColor }) => ( -
- - - {label} - -
-
- - {usLosses[key]} -
-
- - {iranLosses[key]} -
-
-
- ))}
) diff --git a/src/components/HeaderPanel.tsx b/src/components/HeaderPanel.tsx index 513ed42..ce85945 100644 --- a/src/components/HeaderPanel.tsx +++ b/src/components/HeaderPanel.tsx @@ -1,10 +1,14 @@ import { useState, useEffect } from 'react' import { StatCard } from './StatCard' import { useSituationStore } from '@/store/situationStore' +import { useReplaySituation } from '@/hooks/useReplaySituation' +import { usePlaybackStore } from '@/store/playbackStore' import { Wifi, WifiOff, Clock } from 'lucide-react' export function HeaderPanel() { - const { situation, isConnected } = useSituationStore() + const situation = useReplaySituation() + const isConnected = useSituationStore((s) => s.isConnected) + const isReplayMode = usePlaybackStore((s) => s.isReplayMode) const { usForces, iranForces } = situation const [now, setNow] = useState(() => new Date()) @@ -47,9 +51,9 @@ export function HeaderPanel() { {formatDateTime(now)}
- {isConnected && ( - - {formatDataTime(situation.lastUpdated)} (实时更新) + {(isConnected || isReplayMode) && ( + + {formatDataTime(situation.lastUpdated)} {isReplayMode ? '(回放)' : '(实时更新)'} )}
diff --git a/src/components/WarMap.tsx b/src/components/WarMap.tsx index b4a3786..46fdbdb 100644 --- a/src/components/WarMap.tsx +++ b/src/components/WarMap.tsx @@ -3,7 +3,7 @@ import Map, { Source, Layer } from 'react-map-gl' import type { MapRef } from 'react-map-gl' import type { Map as MapboxMap } from 'mapbox-gl' import 'mapbox-gl/dist/mapbox-gl.css' -import { useSituationStore } from '@/store/situationStore' +import { useReplaySituation } from '@/hooks/useReplaySituation' import { ATTACKED_TARGETS, ALLIED_STRIKE_LOCATIONS, @@ -129,8 +129,8 @@ export function WarMap() { const lincolnPathsRef = useRef<[number, number][][]>([]) const fordPathsRef = useRef<[number, number][][]>([]) const israelPathsRef = useRef<[number, number][][]>([]) - const { situation } = useSituationStore() - const { usForces, iranForces } = situation + const situation = useReplaySituation() + const { usForces, iranForces, conflictEvents = [] } = situation const usLocs = (usForces.keyLocations || []) as KeyLoc[] const irLocs = (iranForces.keyLocations || []) as KeyLoc[] @@ -239,6 +239,29 @@ export function WarMap() { [attackPaths] ) + // GDELT 冲突事件:1–3 绿, 4–6 橙闪, 7–10 红脉 + const { conflictEventsGreen, conflictEventsOrange, conflictEventsRed } = useMemo(() => { + const green: GeoJSON.Feature[] = [] + const orange: GeoJSON.Feature[] = [] + const red: GeoJSON.Feature[] = [] + for (const e of conflictEvents) { + const score = e.impact_score ?? 1 + const f: GeoJSON.Feature = { + type: 'Feature', + properties: { event_id: e.event_id, impact_score: score }, + geometry: { type: 'Point', coordinates: [e.lng, e.lat] }, + } + if (score <= 3) green.push(f) + else if (score <= 6) orange.push(f) + else red.push(f) + } + return { + conflictEventsGreen: { type: 'FeatureCollection' as const, features: green }, + conflictEventsOrange: { type: 'FeatureCollection' as const, features: orange }, + conflictEventsRed: { type: 'FeatureCollection' as const, features: red }, + } + }, [conflictEvents]) + const hideNonBelligerentLabels = (map: MapboxMap) => { const labelLayers = [ 'country-label', @@ -362,6 +385,20 @@ export function WarMap() { map.setPaintProperty('allied-strike-targets-pulse', 'circle-radius', r) map.setPaintProperty('allied-strike-targets-pulse', 'circle-opacity', opacity) } + // GDELT 橙色 (4–6):闪烁 + if (map.getLayer('gdelt-events-orange')) { + const blink = 0.5 + 0.5 * Math.sin(elapsed * 0.004) + map.setPaintProperty('gdelt-events-orange', 'circle-opacity', blink) + } + // GDELT 红色 (7–10):脉冲扩散 + if (map.getLayer('gdelt-events-red-pulse')) { + const cycle = 2200 + const phase = (elapsed % cycle) / cycle + const r = 30 * phase + const opacity = Math.max(0, 1 - phase * 1.1) + map.setPaintProperty('gdelt-events-red-pulse', 'circle-radius', r) + map.setPaintProperty('gdelt-events-red-pulse', 'circle-opacity', opacity) + } } catch (_) {} animRef.current = requestAnimationFrame(tick) } @@ -376,7 +413,10 @@ export function WarMap() { (map.getSource('attack-dots') && attackPathsRef.current.length > 0) || (map.getSource('allied-strike-dots-lincoln') && lincolnPathsRef.current.length > 0) || (map.getSource('allied-strike-dots-ford') && fordPathsRef.current.length > 0) || - (map.getSource('allied-strike-dots-israel') && israelPathsRef.current.length > 0) + (map.getSource('allied-strike-dots-israel') && israelPathsRef.current.length > 0) || + map.getSource('gdelt-events-green') || + map.getSource('gdelt-events-orange') || + map.getSource('gdelt-events-red') if (hasAnim) { animRef.current = requestAnimationFrame(tick) } else { @@ -439,6 +479,15 @@ export function WarMap() { 以色列打击 + + 低烈度 + + + 中烈度 + + + 高烈度 +
+ {/* GDELT 冲突事件:1–3 绿点, 4–6 橙闪, 7–10 红脉 */} + + + + + + + + + + + {/* 美以联军打击伊朗:路径线 */} s.situation) + const situation = useReplaySituation() const isLoading = useSituationStore((s) => s.isLoading) const lastError = useSituationStore((s) => s.lastError) @@ -28,6 +31,7 @@ export function Dashboard() {
)} +