# 后端模块说明

## 一、现有模块结构

```
server/
├── index.js         # HTTP + WebSocket 入口
├── routes.js        # REST API 路由
├── db.js            # SQLite schema 与连接
├── situationData.js # 态势数据聚合 (从 DB 读取)
├── seed.js          # 初始数据填充
├── data.db          # SQLite 数据库
└── package.json

crawler/
├── realtime_conflict_service.py  # GDELT 实时冲突服务 (核心)
├── requirements.txt
├── config.py, db_writer.py       # 旧 RSS 爬虫（可保留）
├── main.py
└── README.md
```

### 1. server/index.js
- Express + CORS
- WebSocket (`/ws`)，每 5 秒广播 `situation`
- `POST /api/crawler/notify`：爬虫写入后触发立即广播

### 2. server/routes.js
- `GET /api/situation`：完整态势
- `GET /api/events`：GDELT 事件 + 冲突统计
- `GET /api/health`：健康检查

### 3. server/db.js
- 表：`situation`、`force_summary`、`power_index`、`force_asset`、
  `key_location`、`combat_losses`、`wall_street_trend`、
  `retaliation_current`、`retaliation_history`、`situation_update`、
  **`gdelt_events`**、**`conflict_stats`**

---

## 二、GDELT 核心数据源

**GDELT Project**：全球冲突数据库，约 15 分钟级更新，含经纬度、事件编码、参与方、事件强度。

### realtime_conflict_service.py

- 定时（默认 60 秒）从 GDELT API 抓取
- 冲突强度评分：missile +3, strike +2, killed +4 等
- 无经纬度时默认攻击源：`IRAN_COORD = [51.3890, 35.6892]`
- 写入 `gdelt_events`、`conflict_stats`
- 调用 `POST /api/crawler/notify` 触发 Node 广播

### 冲突强度 → 地图效果

| impact_score | 效果       |
|--------------|------------|
| 1–3          | 绿色点     |
| 4–6          | 橙色闪烁   |
| 7–10         | 红色脉冲扩散 |

### 战损统计模型（展示用）

- `total_events`
- `high_impact_events` (impact ≥ 7)
- `estimated_casualties`
- `estimated_strike_count`

---

## 三、数据流

```
GDELT API → Python 服务(60s) → gdelt_events, conflict_stats
                                    ↓
              POST /api/crawler/notify → situation.updated_at
                                    ↓
              WebSocket 广播 getSituation() → 前端
```

---

## 四、运行方式

```bash
# 1. 启动 Node API
npm run api

# 2. 启动 GDELT 服务
npm run gdelt
# 或: cd crawler && uvicorn realtime_conflict_service:app --port 8000
```
