63 lines
3.0 KiB
Markdown
63 lines
3.0 KiB
Markdown
# 前端数据更新链路与字段映射
|
||
|
||
## 1. 前端数据点
|
||
|
||
| 组件 | 数据 | API 字段 | DB 表/列 |
|
||
|------|------|----------|----------|
|
||
| HeaderPanel | lastUpdated | situation.lastUpdated | situation.updated_at |
|
||
| HeaderPanel | powerIndex | usForces/iranForces.powerIndex | power_index |
|
||
| HeaderPanel | feedbackCount, shareCount | POST /api/feedback, /api/share | feedback, share_count |
|
||
| TimelinePanel | recentUpdates | situation.recentUpdates | situation_update |
|
||
| WarMap | keyLocations | usForces/iranForces.keyLocations | key_location |
|
||
| BaseStatusPanel | 基地统计 | keyLocations (status, damage_level) | key_location |
|
||
| CombatLossesPanel | 人员/平民伤亡 | combatLosses, civilianCasualtiesTotal | combat_losses |
|
||
| CombatLossesOtherPanel | 装备毁伤 | combatLosses (bases, aircraft, drones, …) | combat_losses |
|
||
| PowerChart | 雷达图 | powerIndex | power_index |
|
||
| WallStreetTrend | 美股趋势 | wallStreetInvestmentTrend | wall_street_trend |
|
||
| RetaliationGauge | 报复指数 | retaliationSentiment | retaliation_current/history |
|
||
|
||
**轮询**: `fetchSituation()` 加载,WebSocket `/ws` 每 3 秒广播。`GET /api/situation` → `getSituation()`。
|
||
|
||
## 2. 爬虫 → DB 字段映射
|
||
|
||
| 提取器输出 | DB 表 | 逻辑 |
|
||
|------------|-------|------|
|
||
| situation_update | situation_update | INSERT |
|
||
| combat_losses_delta | combat_losses | 增量叠加 (ADD) |
|
||
| retaliation | retaliation_current, retaliation_history | REPLACE / APPEND |
|
||
| wall_street | wall_street_trend | INSERT |
|
||
| key_location_updates | key_location | UPDATE status, damage_level WHERE name LIKE |
|
||
|
||
### combat_losses 字段对应
|
||
|
||
| 提取器 (us/iran) | DB 列 |
|
||
|------------------|-------|
|
||
| personnel_killed | personnel_killed |
|
||
| personnel_wounded | personnel_wounded |
|
||
| civilian_killed | civilian_killed |
|
||
| civilian_wounded | civilian_wounded |
|
||
| bases_destroyed | bases_destroyed |
|
||
| bases_damaged | bases_damaged |
|
||
| aircraft, warships, armor, vehicles | 同名 |
|
||
| drones, missiles, helicopters, submarines | 同名 |
|
||
|
||
## 3. 测试用例
|
||
|
||
运行: `npm run crawler:test:extraction`
|
||
|
||
| 用例 | 输入 | 预期 |
|
||
|------|------|------|
|
||
| 特朗普 1000 军事目标 | "特朗普说伊朗有1000个军事目标遭到袭击" | 不提取 bases_destroyed/bases_damaged |
|
||
| 阿萨德基地遭袭 | "阿萨德空军基地遭袭,损失严重" | 输出 key_location_updates |
|
||
| 美军伤亡 | "3名美军阵亡,另有5人受伤" | personnel_killed=3, personnel_wounded=5 |
|
||
| 伊朗平民 | "伊朗空袭造成伊拉克平民50人伤亡" | iran.civilian_killed=50 |
|
||
| 伊朗无人机 | "美军击落伊朗10架无人机" | iran.drones=10 |
|
||
| db_merge 增量 | 两次 merge 3+2 | personnel_killed=5 |
|
||
|
||
## 4. 注意事项
|
||
|
||
- **bases_***: 仅指已确认损毁/受损的基地;"军事目标"/targets 不填 bases_*。
|
||
- **正则 [\s\w]***: 会匹配数字,导致 (\d+) 只捕获末位;数字前用 `[^\d]*`。
|
||
- **伊朗平民**: 规则已支持 "伊朗空袭造成…平民" 归入 loss_ir。
|
||
- **key_location**: 需 name LIKE '%keyword%' 匹配,关键词见 extractor_rules.bases_all。
|