vitaliyMiskevuch1212/VERIDIAN
GitHub: vitaliyMiskevuch1212/VERIDIAN
一个实时地缘政治情报仪表盘,将全球事件可视化并自动生成 AI 金融交易信号,解决信息延迟与碎片化问题。
Stars: 0 | Forks: 0
# 🌐 VERIDIAN
**实时地缘政治情报 + AI 交易信号**

[](https://www.mongodb.com/)
[](https://reactjs.org/)
[](https://nodejs.org/)
[](https://groq.com/)
[](https://globe.gl/)
[](/)
[](/)
## 🔴 问题 — 为什么需要 VERIDIAN
在当今高度互联的全球经济中,地缘政治事件会在几秒钟内影响市场。军事升级、供应链封锁、自然灾害和民间动乱都会立即引发金融后果。然而,面向普通交易者和独立分析师的工具从根本上来说是失效的。
### 情报缺口
**1. “那又怎样?”真空**
传统的地缘政治追踪平台(如 LiveUAMap、Crisis24、Conflictly)擅长在地图上绘制事件。它们告诉你 *在哪里* 以及 *发生了什么*。但当一条输油管道破裂或航运航道被封锁时,它们在展示完地图上的点后,就完全抛弃了你,没有任何关于 *如何从财务上应对* 的信息。缺乏能够即时将地理或政治风险转化为可量化金融行动的系统。
**2. 延迟挤压**
当普通交易者阅读突发新闻、评估受影响区域、交叉参考实时市场数据并制定交易假设时,高频算法和机构投资者已经对事件进行了定价。人类综合判断本质上太慢了。普通交易者持续输掉执行竞赛,因为不存在能够原生实时自动评估地缘政治背景的通用系统。
**3. 深度工具碎片化**
构建一个连贯的风险评估需要同时打开 10 多个分散的标签页:Reuters 获取新闻、Flightradar24 监控军用飞机、alternative.me 衡量情绪、Yahoo Finance 关注价格走势、X 平台获取地面真相。这种碎片化破坏了情境感知能力,阻碍跨领域关联分析,并迫使决策者在不完整数据基础上做出判断。
**4. 机构门槛**
集成的多轴地缘政治金融情报平台确实存在——Bloomberg Terminal 和 Reuters Eikon。但它们每年每个用户成本高达 **24,000–30,000 美元**。学生、独立分析师和普通交易者被完全排除在企业级情报之外,造成了巨大且不公平的市场不对称。
## ⚡ 解决方案 — VERIDIAN
VERIDIAN 是一个完全公开的实时地缘政治情报指挥中心,能够直接消除以上所有痛点。无需登录,无门槛。任何访客均可立即使用。
| 痛点 | VERIDIAN 的解决方案 |
|------|----------------------|
| **“那又怎样?”真空** | GeoTrade AI 信号引擎可在 10 秒内根据实时事件自动生成 `买入 / 持有 / 卖出` 信号 |
| **延迟挤压** | Groq 的亚秒级 LLaMA 3.1 推理——从世界事件到金融信号的速度快于任何人工流程 |
| **工具碎片化** | 整合 Globe、新闻、军事航班、网络威胁和市场价格数据于零标签界面 |
| **机构门槛** | 完全基于免费层级 API 构建。零成本运行。提供企业级情报,实现民主化 |
## 🎯 VERIDIAN 的独特之处
没有任何商业 OSINT 工具——无论是 Reuters Eikon、Bloomberg Terminal 还是 Conflictly——能够自动将实时地缘政治事件转化为带有 AI 推理的金融交易信号。VERIDIAN 在 **10 秒内** 完成这一过程。
```
Hormuz tensions escalating → Oil supply disruption likely → BUY $XOM (confidence: 81%)
China suspends rare earths → EV supply chain at risk → SELL $TSLA (confidence: 74%)
Middle East escalation → Safe haven demand rising → BUY $GLD (confidence: 78%)
```
### 竞争对手对比
| 功能 | Conflictly.app | LiveUAMap | Crisis24 | Bloomberg Terminal | **VERIDIAN** |
|------|----------------|-----------|----------|---------------------|--------------|
| 3D 交互式地球 | ✅ | ✅ | ❌ | ❌ | ✅ |
| 实时冲突事件数据 | ✅ | ✅ | ✅ | ✅ | ✅ |
| AI 国家情报简报 | ✅ | ❌ | ❌ | ❌ | ✅ |
| **金融交易信号** | ❌ | ❌ | ❌ | 手动 | ✅ |
| **股票 / 加密 / 外汇面板** | ❌ | ❌ | ❌ | ✅ | ✅ |
| 军用飞行追踪 | ❌ | ✅ | ❌ | ❌ | ✅ |
| 网络威胁地球图层 | ❌ | ❌ | ❌ | ❌ | ✅ |
| **4 键 AI 零停机轮换** | ❌ | ❌ | ❌ | ❌ | ✅ |
| 战局模拟推演 | ❌ | ❌ | ❌ | ❌ | ✅ |
| 预测性升级引擎 | ❌ | ❌ | ❌ | ❌ | ✅ |
| **每位用户年费** | 付费 | 付费 | 付费 | **$24,000+** | **$0** |
## ✨ 核心功能
### 🤖 功能 1 — GeoTrade AI 信号引擎 *(核心差异化)*
填补“那又怎样?”真空的引擎。VERIDIAN 的 AI 读取实时地缘政治事件并生成实时金融信号——这是同类产品中唯一能够自主完成此操作的平台。
| 能力 | 描述 |
|------|------|
| **AI 信号生成** | Groq LLaMA 3.1 读取与标的证券行业/国家相关的当前 GDELT 事件 → 输出 `买入 / 持有 / 卖出` 及完整推理段落 |
| **信号置信度** | 每条信号显示置信度百分比(例如 `买入 — 81%`) |
| **股票搜索** | 输入任意代码:`AAPL` `TSLA` `XOM` `GLD` `SPY` |
| **实时价格与涨跌幅** | 通过 `yahoo-finance2` npm(免密钥、免费)获取实时价格、百分比变化与成交量 |
| **7 天 Sparkline 图表** | 使用 Recharts 的 `LineChart` 绘制过去 7 日价格走势 |
| **恐惧与贪婪指数** | `alternative.me` API 仪表盘显示全球市场情绪(0–100) |
| **加密货币面板** | BTC / ETH / SOL / XRP 实时价格(CoinGecko),附带基于地缘风险的关联标签 |
| **外汇面板** | USD/JPY、EUR/USD、GBP/USD、USD/INR 实时汇率及国家旗帜 |
| **大宗商品面板** | 黄金、原油、天然气(yahoo-finance2),附带冲突驱动上下文标签 |
| **信号历史** | 每个代码的最近 5 条 AI 信号存储在 MongoDB,以迷你时间线形式展示 |
**信号徽章:**
| 信号 | 颜色 |
|------|------|
| `买入` | `#00FF88` 信号绿 |
| `卖出` | `#EF4444` 红色 |
| `持有` | `#EAB308` 黄色 |
### 🌍 功能 2 — 实时 3D 地缘政治地球仪
运营核心组件。一个 WebGL 地球仪,将地球上每一个活跃的地缘政治事件以发光、彩色标识点呈现——取代对外部 OSINT 地图工具的依赖。
| 能力 | 描述 |
|------|------|
| **自动旋转** | 地球以约 2 RPM 自动旋转,用户交互时暂停,8 秒后恢复 |
| **发光事件点** | 每个事件按实际经纬度绘制,点大小随严重性缩放,颜色映射威胁等级 |
| **脉冲红色圆环** | `CRITICAL` 显示双 CSS 关键帧环动画 |
| **点击查看详情** | 点击任意国家触发 Groq AI 生成完整情报简报,弹出侧边栏 |
| **2D 地图切换** | 在 Globe.gl 3D 视图与 Mapbox GL JS 平面地图间平滑过渡 |
| **事件类型筛选** | 可切换:`冲突` `抗议` `灾害` `地震` `野火` `军用飞行` |
| **时间范围筛选** | `最近 1h` / `6h` / `24h` / `7 天`——按事件时间戳过滤地球点 |
| **热力图层** | Deck.gl 密度热力图叠加层,显示事件区域集中度 |
| **飞至动画** | 点击新闻标题或代码项时,地球相机平滑飞至该事件 |
| **弧线图层** | 军用飞行路径以动画弧线形式渲染在地球表面 |
**严重性颜色体系:**
| 等级 | 颜色 | 十六进制 |
|------|------|----------|
| `CRITICAL` | 🔴 红色 | `#EF4444` |
| `HIGH` | 🟠 橙色 | `#F97316` |
| `MEDIUM` | 🟡 黄色 | `#EAB308` |
| `LOW` | 🟢 绿色 | `#00FF88` |
### 📰 功能 3 — 实时情报新闻聚合
实时、严重性编码的新闻面板聚合 **150+ 全球来源**——用单一统一订阅取代 Reuters/BBC/Al Jazeera 的多标签页堆叠。
| 能力 | 描述 |
|------|------|
| **多源聚合** | NewsAPI.org + `rss-parser` 直接获取 Reuters、BBC、Al Jazeera、Bloomberg 的 RSS |
| **GDELT 事件源** | 实时地缘政治事件(含坐标),无限制、免密钥 |
| **严重性颜色编码** | 每条标题由后端 NLP 关键词评分自动标记:`CRITICAL` / `HIGH` / `MEDIUM` / `LOW` |
| **自动刷新** | 每 5 分钟静默刷新,新条目顶部淡入 |
| **`BREAKING` 徽章** | 15 分钟内被 3 个以上来源覆盖的故事显示脉冲金色 `BREAKING` 徽章 |
| **区域筛选标签** | `中东` `欧洲` `亚太` `美洲` `非洲` |
| **实体链接** | 标题中的国家名称可点击——地球相机飞至该国 |
| **国家旗帜** | 每条标题内联显示 `flagcdn.com` 的国家旗帜 |
### 🤖 功能 4 — AI 国家情报简报
点击地球上的任意国家 → 滑出侧边栏,2 秒内生成完整 AI 情报简报。这取代昂贵的国家风险订阅服务。
| 能力 | 描述 |
|------|------|
| **Groq LLaMA 3.1 8B** | 使用实时头条作为上下文生成 3 段式情报简报 |
| **4 键轮换系统** | 4 个免费 Groq API 密钥轮询。若 Key 1 达到速率限制,Key 2 立即接管 |
| **Google Gemini 降级** | 若 4 个 Groq 密钥用尽,Gemini API(15 请求/分钟免费)无缝接管 |
| **稳定性评分** | AI 以发光 `Recharts RadialBarChart` 环的形式给出 0–100 分 |
| **前三风险** | AI 返回三个最关键当前风险因素,结构化列出 |
| **展望徽章** | `稳定` / `恶化` / `升级` / `危机`——颜色编码 |
| **来源引用** | 简报列出用作上下文的具体头条 |
| **15 分钟 MongoDB 缓存** | 生成的简报缓存 15 分钟,防止速率限制滥用 |
### ✈️ 功能 5 — 军用飞行追踪器
OpenSky Network 的实时飞机位置绘制在 3D 地球上——取代 Flightradar24 或 ADS-B Exchange 标签页。
| 能力 | 描述 |
|------|------|
| **实时位置** | 来自 OpenSky Network API(免费、匿名)的飞机实时经度、纬度、高度 |
| **军用过滤** | 使用 ICAO 类型代码与呼号模式过滤军用/政府飞机 |
| **地球弧线叠加** | 飞行路径以动画青色弧线形式渲染在 Globe.gl 弧图层上 |
| **冲突邻近警报** | 距离活跃冲突区域 200 公里内的飞机显示橙色警告徽章 |
| **激增检测** | 同一区域内 >5 架飞机聚集时显示 `SURGE` 徽章 |
| **飞机信息弹出** | 点击任意航班 → 呼号、机型、起飞地、目的地、高度、速度 |
| **60 秒自动刷新** | 飞行位置每 60 秒更新(符合速率限制) |
### 📡 功能 6 — 紧张度滚动条(Ticker)
位于仪表盘顶部的滚动警示条,风格类似金融股票代码——将地缘政治噪音转化为持续的关注层。
| 能力 | 描述 |
|------|------|
| **连续横向滚动** | CSS 关键帧动画使实时地缘政治警报跨全屏滚动 |
| **严重性颜色编码** | 圆点 + 标签:`CRITICAL` 红色,`HIGH` 橙色,`MEDIUM` 黄色 |
| **点击聚焦地球** | 点击任意条目调用 `Globe.gl flyTo()` 缩放至该事件 |
| **5 分钟自动刷新** | 每 5 分钟更新最新 GDELT + NewsAPI 数据 |
### 🗺️ 功能 7 — 区域情报面板
四个区域专属情报卡片——取代手动综合区域威胁报告。
| 能力 | 描述 |
|------|------|
| **4 个面板** | `中东` · `欧洲` · `亚太` · `美洲`——每个区域附带区域分析 |
| **前三事件** | 按严重性排序的当前区域最关键事件 |
| **稳定性指数** | 区域评分 0–100,以彩色进度条呈现 |
| **趋势关键词** | 每个区域前 5 个地缘政治热词(如 `停火`、`制裁`) |
| **事件数 + 趋势** | 过去 24 小时事件总数及与前一 24 小时的趋势对比 |
| **点击展开** | 点击区域面板使地球相机飞至该区域 |
### 🎮 功能 8 — 战术指挥中心接口
一系列高级指挥中心功能,共同消除多标签页工作流。
| 组件 | 描述 |
|------|------|
| **OmniCommand** | `Ctrl+K` 命令面板,用于即时导航与全平台搜索 |
| **WargameModal** | AI 驱动的场景模拟器——例如 “如果伊朗封锁霍尔木兹海峡?” 并附带级联市场影响分析 |
| **PredictionPanel** | AI 升级预测与概率时间线 |
| **SitrepPanel** | 自动生成的 24 小时情况报告 |
| **GlobalRiskIndex** | 综合全局风险指数,实时聚合所有活跃事件 |
| **网络威胁图层** | 来自 `abuse.ch` 与 `URLhaus` 的实时僵尸网络 C2 服务器与恶意主机,在地球上叠加显示 |
| **战术语音** | 语音命令接口——说出查询,聆听 AI 简报(文本转语音) |
| **时间线滑块** | 可拖拽的时间线,浏览历史事件数据 |
| **键盘快捷键** | 完整键盘导航:`G` 地球,`N` 新闻,`F` 金融,`M` 地图切换 |
## 🛠️ 技术栈
### 前端







### 后端



### 人工智能与情报



| 层级 | 技术 | 用途 |
|------|------|------|
| **前端框架** | React 18 + Vite | 快速 SPA —— 即时热重载 |
| **样式** | Tailwind CSS + 自定义 CSS | 深色指挥中心 UI + 动画 |
| **3D 地球** | Globe.gl | WebGL 地球 —— 点、弧线、热力图 |
| **2D 地图** | Mapbox GL JS + MapLibre GL JS | 平坦地图切换视图 |
| **数据图层** | Deck.gl | 热力图 + 飞行弧线 |
| **图表** | Recharts | 火花线、稳定性环、情绪仪表 |
| **实时通信** | Socket.io | 实时数据推送至客户端 |
| **状态管理** | React Context API | DataContext + UIContext |
| **后端** | Node.js + Express | REST API 服务器 |
| **数据库** | MongoDB Atlas + Mongoose | 缓存简报、事件缓存、信号历史 |
| **AI 主引擎** | Groq API —— 4 键轮换 | LLaMA 3.1 8B —— 简报 + 信号 |
| **AI 降级** | Google Gemini API | 当 4 个 Groq 键受限时无缝接管 |
| **金融数据** | yahoo-finance2 npm | 股票 + 商品,无密钥 |
| **加密数据** | CoinGecko API | BTC/ETH/SOL/XRP 实时价格 |
| **飞行数据** | OpenSky Network | 军用飞机位置 |
| **前端部署** | Vercel | 免费,无限部署 |
| **后端部署** | Railway | $5 免费额度,无冷启动 |
## 🏗️ 系统架构
```
┌─────────────────────────────────────────────────────────────────┐
│ DATA SOURCES │
├──────────────┬──────────────┬──────────────┬────────────────────┤
│ GDELT/ACLED │ NewsAPI/RSS │ OpenSky │ Yahoo Finance │
│ USGS/GDACS │ │ ADS-B Exch. │ CoinGecko │
│ NASA FIRMS │ │ │ ExchangeRate API │
└──────┬───────┴──────┬───────┴──────┬───────┴────────┬───────────┘
│ │ │ │
▼ ▼ ▼ ▼
┌─────────────────────────────────────────────────────────────────┐
│ EXPRESS BACKEND (Node.js) │
│ │
│ /api/events /api/news /api/flights /api/finance │
│ /api/cyber /api/ai/brief /api/ai/signal │
│ │
│ ┌───────────────────────────────────────────────────────────┐ │
│ │ groqService.js — 4-Key Rotation │ │
│ │ Key 1 → Key 2 → Key 3 → Key 4 → Gemini Fallback │ │
│ └───────────────────────────────────────────────────────────┘ │
│ │
│ ┌───────────────────┐ ┌─────────────────────────────────┐ │
│ │ cacheService.js │ │ MongoDB Atlas │ │
│ │ (in-memory Map) │ │ BriefCache + EventCache + │ │
│ │ 5-min TTL │ │ SignalHistory │ │
│ └───────────────────┘ └─────────────────────────────────┘ │
└─────────────────────────────┬───────────────────────────────────┘
│ REST API + Socket.io
▼
┌─────────────────────────────────────────────────────────────────┐
│ REACT FRONTEND (Vite) │
│ │
│ ┌─ DashboardHeader ────────────────────────────────────────┐ │
│ │ Navbar (UTC clock + event count) → Ticker (scrolling) │ │
│ └──────────────────────────────────────────────────────────┘ │
│ │
│ ┌─ DashboardLeftPanel ──┐ ┌─ DashboardCenter ──────────┐ │
│ │ NewsPanel │ │ Globe.gl (3D) / Map2D │ │
│ │ SitrepPanel │ │ Event dots + arcs + │ │
│ │ TopKeywords │ │ heatmap + targeting │ │
│ └───────────────────────┘ └────────────────────────────┘ │
│ │
│ ┌─ DashboardRightPanel ────────────────────────────────────┐ │
│ │ CountryBrief → StabilityRing + Risks │ │
│ │ FinancePanel → MarketWatch + MarketGraph + SignalBadge │ │
│ │ FlightConsole → Military flight tracker │ │
│ │ PredictionPanel → AI escalation forecasts │ │
│ │ GlobalRiskIndex → Composite threat score │ │
│ └──────────────────────────────────────────────────────────┘ │
│ │
│ ┌─ DashboardOverlays ──────────────────────────────────────┐ │
│ │ OmniCommand (Ctrl+K) + WargameModal + KeyboardShortcuts │ │
│ │ ToastNotifications + TerminalLoader + PageLoader │ │
│ └──────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
```
## 📁 项目结构
```
VERIDIAN/
├── client/ # ⚛️ React 18 + Vite Frontend
│ ├── public/
│ │ └── favicon.png
│ ├── index.html # Google Fonts + Font Awesome CDN
│ ├── src/
│ │ ├── components/
│ │ │ ├── Globe.jsx # 🌍 Globe.gl 3D globe — event dots, arcs, heatmap
│ │ │ ├── Map2D.jsx # 🗺️ Mapbox GL JS flat 2D map
│ │ │ ├── Navbar.jsx # 🧭 Logo, UTC clock, event count, search
│ │ │ ├── Ticker.jsx # 📡 Scrolling tension alert ticker bar
│ │ │ ├── NewsPanel.jsx # 📰 Live intelligence news feed
│ │ │ ├── CountryBrief.jsx # 🤖 AI country brief slide-in panel
│ │ │ ├── FinancePanel.jsx # 📈 GeoTrade signal engine
│ │ │ ├── MarketWatch.jsx # 💹 Live market data
│ │ │ ├── MarketGraph.jsx # 📊 Market price charts and sparklines
│ │ │ ├── FlightConsole.jsx # ✈️ Military flight tracker
│ │ │ ├── RegionPanel.jsx # 🗺️ 4 regional intelligence cards
│ │ │ ├── FilterBar.jsx # 🔽 Event type + time range filters
│ │ │ ├── GlobalRiskIndex.jsx # 🔴 Composite global risk score
│ │ │ ├── PredictionPanel.jsx # 🔮 AI escalation predictions
│ │ │ ├── SitrepPanel.jsx # 📋 Auto-generated Situation Reports
│ │ │ ├── WargameModal.jsx # 🎮 AI wargame scenario simulator
│ │ │ ├── OmniCommand.jsx # ⌘ Ctrl+K command palette
│ │ │ ├── NetworkGraph.jsx # 🕸️ Entity relationship graph
│ │ │ ├── SystemTelemetry.jsx # 📟 Live system health stats
│ │ │ ├── TargetingCursor.jsx # 🎯 Military-style crosshair cursor
│ │ │ ├── TimelineScrubber.jsx # ⏱️ Draggable historical event timeline
│ │ │ └── ToastNotifications.jsx # 🔔 Alert toast notification system
│ │ │
│ │ ├── context/
│ │ │ ├── DataContext.jsx # 📦 Global data state
│ │ │ └── UIContext.jsx # 🎛️ UI state — panels, modals, view mode
│ │ │
│ │ ├── hooks/
│ │ │ ├── useGlobeData.js
│ │ │ ├── useNewsData.js
│ │ │ ├── useFinanceData.js
│ │ │ ├── useAIData.js
│ │ │ ├── useSocket.js
│ │ │ ├── useTacticalAudio.js
│ │ │ └── useTacticalVoice.js
│ │ │
│ │ ├── layouts/
│ │ │ ├── DashboardHeader.jsx
│ │ │ ├── DashboardLeftPanel.jsx
│ │ │ ├── DashboardCenter.jsx
│ │ │ ├── DashboardRightPanel.jsx
│ │ │ └── DashboardOverlays.jsx
│ │ │
│ │ ├── pages/
│ │ │ └── Dashboard.jsx
│ │ │
│ │ ├── App.jsx
│ │ ├── main.jsx
│ │ └── index.css # Tailwind + CSS variables + animations
│ │
│ ├── tailwind.config.js
│ ├── vite.config.js
│ └── package.json
│
├── server/ # 🖥️ Node.js + Express Backend
│ ├── models/
│ │ ├── BriefCache.js # AI briefs — 15-min TTL
│ │ ├── EventCache.js # GDELT/ACLED events — 5-min TTL
│ │ └── SignalHistory.js # Last 5 AI signals per ticker
│ │
│ ├── routes/
│ │ ├── events.js # GET /api/events
│ │ ├── news.js # GET /api/news
│ │ ├── finance.js # GET /api/finance/:ticker
│ │ ├── flights.js # GET /api/flights
│ │ ├── ai.js # POST /api/ai/brief + /api/ai/signal
│ │ └── cyber.js # GET /api/cyber
│ │
│ ├── services/
│ │ ├── groqService.js # 4-key Groq rotation + Gemini fallback
│ │ └── cacheService.js # In-memory Map() cache — 5-min TTL
│ │
│ ├── .env.example
│ ├── index.js
│ └── package.json
│
├── .gitignore
└── README.md
```
## 🔌 使用的 API
| 类别 | 服务 | 是否需要密钥 | 免费限制 |
|------|------|--------------|----------|
| **地球** | Globe.gl | 否 | 无限制 |
| **地图** | Mapbox GL JS | 是(免费) | 每月 50,000 次加载 |
| **地图(降级)** | MapLibre GL JS | 否 | 无限制 |
| **地缘政治事件** | GDELT 项目 API | 否 | 无限制 |
| **冲突数据** | ACLED API | 是(免费) | 面向研究人员的免费额度 |
| **新闻** | NewsAPI.org | 是(免费) | 每日 100 次请求 |
| **新闻(RSS)** | rss-parser npm | 否 | 无限制 |
| **地震** | USGS 地震 API | 否 | 无限制 |
| **国家元数据** | RestCountries API | 否 | 无限制 |
| **AI(主引擎)** | Groq API —— 4 个轮换密钥 | 是(免费) | 免费层级 |
| **AI(降级)** | Google Gemini API | 是(免费) | 每分钟 15 次请求 |
| **股票/商品** | yahoo-finance2 npm | 否 | 无限制 |
| **加密货币** | CoinGecko API | 否 | 每月 10,000 次请求 |
| **外汇** | ExchangeRate API | 是(免费) | 每月 1,500 次请求 |
| **市场情绪** | alternative.me API | 否 | 无限制 |
| **飞行数据** | OpenSky Network API | 否 | 免费(匿名) |
| **僵尸网络** | abuse.ch Feodo Tracker | 否 | 无限制 |
| **恶意软件** | URLhaus API | 否 | 无限制 |
| **网络中断** | Cloudflare Radar API | 是(免费) | 免费 |
| **图标** | Font Awesome 6 免费版 | 否 | 无限制(CDN) |
| **字体** | Google Fonts | 否 | 无限制(CDN) |
## 🔑 环境变量
在 `server/` 目录下创建 `.env` 文件:
```
# ─── AI — 4 Groq Keys for Round-Robin Rotation ───────────────────
GROQ_API_KEY_1=gsk_xxxxxxxxxxxxxxxxxxxx
GROQ_API_KEY_2=gsk_xxxxxxxxxxxxxxxxxxxx
GROQ_API_KEY_3=gsk_xxxxxxxxxxxxxxxxxxxx
GROQ_API_KEY_4=gsk_xxxxxxxxxxxxxxxxxxxx
# ─── AI Fallback ──────────────────────────────────────────────────
GEMINI_API_KEY=AIzaxxxxxxxxxxxxxxxxxxxxxxx
# ─── News & Event Data ────────────────────────────────────────────
NEWS_API_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
ACLED_API_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
NASA_FIRMS_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
# ─── Map ──────────────────────────────────────────────────────────
MAPBOX_TOKEN=pk.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
# ─── Finance ──────────────────────────────────────────────────────
EXCHANGE_RATE_KEY=xxxxxxxxxxxxxxxxxxxxxxxx
# ─── Cyber ────────────────────────────────────────────────────────
CLOUDFLARE_RADAR_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
# ─── Database ─────────────────────────────────────────────────────
MONGODB_URI=mongodb+srv://user:password@cluster.mongodb.net/veridian
PORT=5000
```
| 变量 | 是否必需 | 描述 |
|------|----------|------|
| `GROQ_API_KEY_1–4` | ✅ | 4 个免费 Groq 密钥 —— 在 console.groq.com 创建 |
| `GEMINI_API_KEY` | ⚡ | Google Gemini 降级密钥 |
| `NEWS_API_KEY` | ✅ | NewsAPI.org |
| `MAPBOX_TOKEN` | ✅ | Mapbox GL JS 访问令牌 |
| `MONGODB_URI` | ✅ | MongoDB Atlas 连接字符串 |
| `ACLED_API_KEY` | ⚡ | 冲突数据(增强地球仪) |
| `EXCHANGE_RATE_KEY` | ⚡ | 外汇面板 |
| `CLOUDFLARE_RADAR_KEY` | ⚡ | 网络威胁图层 |
## 🎨 设计系统
VERIDIAN 的设计采用 **军事情报指挥中心** 风格——深海军背景、闪烁的青绿色点缀,以及信息密集型布局传递紧迫感与精确性。
### 字体
| 字体 | 用途 |
|------|------|
| **Inter** | 所有 UI 文本——标题、标签、正文、徽章 |
| **JetBrains Mono** | 所有数值数据——价格、坐标、分数、时间戳 |
### 配色方案
| 令牌 | 十六进制 | 用途 |
|------|----------|------|
| `--color-bg` | `#0A0F1E` | 主背景——深空黑 |
| `--color-navy` | `#0D1B2A` | 侧边栏 / 次要背景 |
| `--color-panel` | `#111827` | 卡片 / 面板背景 |
| `--color-surface` | `#1E293B` | 抬升层:下拉菜单、悬停状态 |
| `--color-border` | `#1E3A5F` | 所有边框与分割线 |
| `--color-cyan` | `#00D4FF` | 主色调——标题、地球发光、活跃状态 |
| `--color-green` | `#00FF88` | 买入信号、正值、低严重性 |
| `--color-red` | `#EF4444` | 卖出信号、CRITICAL 告警 |
| `--color-orange` | `#F97316` | HIGH 告警 |
|color-yellow` | `#EAB308` | 持有信号、MEDIUM 告警 |
| `--color-gold` | `#F59E0B` | `BREAKING` 徽章 |
| `--color-purple` | `#7C3AED` | 网络威胁图层 |
### 面板样式 — 玻璃拟态
```
.panel {
background: rgba(13, 27, 42, 0.85);
border: 1px solid #1E3A5F;
border-top: 1px solid rgba(0, 212, 255, 0.30);
backdrop-filter: blur(12px);
border-radius: 12px;
box-shadow: 0 0 24px rgba(0, 212, 255, 0.06);
}
```
## 🚀 快速开始
### 先决条件
- **Node.js** v18+ ([下载](https://nodejs.org/))
- **MongoDB Atlas** 账户 ([注册](https://www.mongodb.com/cloud/atlas))
- 至少 **1 个 Groq API 密钥** ([免费获取](https://console.groq.com))
- **Mapbox** 访问令牌 ([注册](https://www.mapbox.com/))
### 安装
```
# 1. Clone the repository
git clone https://github.com/yourusername/veridian.git
cd veridian
# 2. Install server dependencies
cd server && npm install
# 3. Install client dependencies
cd ../client && npm install
# 4. Set up environment variables
cd ../server
cp .env.example .env
# Fill in your API keys in .env
# 5. Start both services
# Terminal 1 — Backend (port 5000)
cd server && node index.js
# Terminal 2 — Frontend (port 5173)
cd client && npm run dev
```
访问 `http://localhost:5173` —— 地球仪自动加载。无需登录。
### 使用 Concurrently 运行
```
# From project root
npm run dev # Starts client and server simultaneously
```
## 🚢 部署
### 前端 → Vercel
1. 将你的 GitHub 仓库连接到 [Vercel](https://vercel.com)
2. 设置 **根目录** 为 `client`
3. 设置 **构建命令** 为 `npm run build`
4. 设置 **输出目录** 为 `dist`
### 后端 → Railway
1. 在 [Railway](https://railway.app) 上创建新项目
2. 设置 **根目录** 为 `server`
3. 设置 **启动命令** 为 `node index.js`
4. 添加 `.env` 中的所有环境变量
## 🗄️ 数据库模型
```
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ BriefCache │ │ EventCache │ │ SignalHistory │
│─────────────────│ │─────────────────│ │─────────────────│
│ countryName │ │ source │ │ ticker │
│ brief │ │ events[] │ │ signal │
│ stabilityScore │ │ ├─ title │ │ confidence │
│ risks[] │ │ ├─ lat/lon │ │ reasoning │
│ outlook │ │ ├─ severity │ │ geopoliticalCtx │
│ headlines[] │ │ ├─ iso2 │ │ price │
│ createdAt (TTL) │ │ └─ timestamp │ │ createdAt │
│ expiresAt │ │ fetchedAt (TTL) │ │ expiresAt │
└─────────────────┘ └─────────────────┘ └─────────────────┘
15-min TTL 5-min TTL Per-ticker history
```
## 🔌 API 路由
| 方法 | 端点 | 描述 |
|------|------|------|
| `GET` | `/api/events` | 聚合 GDELT + ACLED + USGS 事件(含坐标) |
| `GET` | `/api/news` | 多来源新闻订阅 —— 严重性标记 |
| `GET` | `/api/finance/:ticker` | 通过 yahoo-finance2 获取实时价格数据 |
| `GET` | `/api/flights` | OpenSky Network 军用飞机位置 |
| `GET` | `/api/cyber` | 网络威胁数据 —— abuse.ch + URLhaus + Cloudflare Radar |
| `POST` | `/api/ai/brief` | AI 国家情报简报(Groq × 4 + Gemini 降级) |
| `POST` | `/api/ai/signal` | AI `买入/持有/卖出` 交易信号及推理 |
## 🏆 一句话定位