394 lines
11 KiB
Markdown
394 lines
11 KiB
Markdown
|
|
# Cosmo 项目开发文档
|
|||
|
|
|
|||
|
|
## 项目概述
|
|||
|
|
|
|||
|
|
Cosmo 是一个深空探索可视化平台,使用 Three.js 在浏览器中实时渲染太阳系、星座、星系和探测器的 3D 场景。
|
|||
|
|
|
|||
|
|
**技术栈**:
|
|||
|
|
- **前端**:React + TypeScript + Three.js + Vite
|
|||
|
|
- **后端**:FastAPI + Python 3.11
|
|||
|
|
- **数据库**:PostgreSQL 15+ (SQLAlchemy 2.0 异步)
|
|||
|
|
- **缓存**:Redis 7+ (三层缓存架构)
|
|||
|
|
- **数据源**:NASA Horizons API
|
|||
|
|
|
|||
|
|
**版本**:v0.0.9
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 已完成工作 (v0.0.9)
|
|||
|
|
|
|||
|
|
### 一、数据库架构升级 ✅
|
|||
|
|
|
|||
|
|
#### 1.1 数据库设计与实现
|
|||
|
|
从静态文件驱动的架构升级为数据库驱动:
|
|||
|
|
|
|||
|
|
**数据库表结构**:
|
|||
|
|
- `celestial_bodies` - 天体基本信息 (行星、卫星、探测器等)
|
|||
|
|
- `positions` - 位置历史表 (时间序列数据)
|
|||
|
|
- `resources` - 资源文件管理 (纹理、3D模型)
|
|||
|
|
- `static_data` - 静态天文数据 (星座、星系、恒星)
|
|||
|
|
- `nasa_cache` - NASA API 持久化缓存
|
|||
|
|
|
|||
|
|
**文件位置**:
|
|||
|
|
- 数据库模型:`backend/app/models/db/`
|
|||
|
|
- `celestial_body.py` - 天体模型
|
|||
|
|
- `position.py` - 位置模型
|
|||
|
|
- `resource.py` - 资源模型
|
|||
|
|
- `static_data.py` - 静态数据模型
|
|||
|
|
- `nasa_cache.py` - NASA 缓存模型
|
|||
|
|
- Schema 文档:`backend/DATABASE_SCHEMA.md`
|
|||
|
|
|
|||
|
|
#### 1.2 数据库服务层
|
|||
|
|
实现了异步数据库操作服务:
|
|||
|
|
|
|||
|
|
**核心服务** (`backend/app/services/db_service.py`):
|
|||
|
|
- `get_celestial_body(body_id)` - 查询天体信息
|
|||
|
|
- `get_celestial_bodies(type)` - 批量查询天体
|
|||
|
|
- `get_latest_position(body_id)` - 查询最新位置
|
|||
|
|
- `get_positions(body_id, start, end)` - 查询位置历史
|
|||
|
|
- `save_position(body_id, time, position)` - 保存位置数据
|
|||
|
|
- `get_static_data(category)` - 查询静态数据
|
|||
|
|
- `get_resource(body_id, type)` - 查询资源文件
|
|||
|
|
|
|||
|
|
#### 1.3 三层缓存架构
|
|||
|
|
实现了高效的缓存策略:
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
请求 → L1 (内存) → L2 (Redis) → L3 (数据库) → L4 (NASA API)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**L1 - 内存缓存** (已有):
|
|||
|
|
- TTL: 10分钟
|
|||
|
|
- 用途:当前时间的天体位置 (最热数据)
|
|||
|
|
|
|||
|
|
**L2 - Redis 缓存** (新增 `backend/app/services/redis_cache.py`):
|
|||
|
|
- TTL: 当前数据 1小时,历史数据 7天
|
|||
|
|
- 用途:NASA API 响应、会话数据、预计算结果
|
|||
|
|
- 特点:进程间共享、持久化、分布式支持
|
|||
|
|
|
|||
|
|
**L3 - 数据库** (新增):
|
|||
|
|
- 持久化存储
|
|||
|
|
- 历史数据查询
|
|||
|
|
- 复杂查询和统计
|
|||
|
|
|
|||
|
|
**L4 - NASA API**:
|
|||
|
|
- 最终数据源
|
|||
|
|
- 只在所有缓存未命中时调用
|
|||
|
|
|
|||
|
|
### 二、后端改进 ✅
|
|||
|
|
|
|||
|
|
#### 2.1 配置管理系统
|
|||
|
|
实现了基于 Pydantic Settings 的配置管理:
|
|||
|
|
|
|||
|
|
**配置文件**:
|
|||
|
|
- `backend/.env` - 实际配置 (不提交到 Git)
|
|||
|
|
- `backend/.env.example` - 配置模板
|
|||
|
|
- `backend/app/config.py` - 配置管理类
|
|||
|
|
|
|||
|
|
**配置项**:
|
|||
|
|
- PostgreSQL 连接配置 (host, port, user, password, pool_size)
|
|||
|
|
- Redis 连接配置 (host, port, db, password)
|
|||
|
|
- 应用配置 (CORS, cache TTL, upload 设置)
|
|||
|
|
|
|||
|
|
**文档**:`backend/CONFIG.md`
|
|||
|
|
|
|||
|
|
#### 2.2 API 扩展
|
|||
|
|
扩展了后端 API 端点 (`backend/app/api/routes.py`):
|
|||
|
|
|
|||
|
|
**新增端点**:
|
|||
|
|
- `GET /api/celestial-bodies` - 获取所有天体
|
|||
|
|
- `GET /api/celestial-bodies/{body_id}` - 获取单个天体
|
|||
|
|
- `GET /api/static/constellations` - 获取星座数据
|
|||
|
|
- `GET /api/static/galaxies` - 获取星系数据
|
|||
|
|
- `GET /api/static/stars` - 获取恒星数据
|
|||
|
|
- `GET /api/static/textures/{path}` - 提供纹理文件
|
|||
|
|
- `GET /api/static/models/{path}` - 提供 3D 模型文件
|
|||
|
|
|
|||
|
|
**改进的端点**:
|
|||
|
|
- `GET /api/probes` - 从数据库读取探测器信息
|
|||
|
|
- `POST /api/probe-positions` - 优化缓存策略
|
|||
|
|
- `GET /health` - 新增 Redis 和数据库健康检查
|
|||
|
|
|
|||
|
|
#### 2.3 数据迁移脚本
|
|||
|
|
创建了完整的初始化和迁移脚本 (`backend/scripts/`):
|
|||
|
|
|
|||
|
|
**初始化脚本**:
|
|||
|
|
- `create_db.py` - 创建数据库
|
|||
|
|
- `init_db.py` - 初始化表结构
|
|||
|
|
- `check_config.py` - 验证配置
|
|||
|
|
|
|||
|
|
**数据迁移**:
|
|||
|
|
- `migrate_data.py` - 迁移天体基础数据
|
|||
|
|
- `update_static_data.py` - 迁移静态数据 (星座、星系)
|
|||
|
|
- `populate_resources.py` - 迁移资源文件记录
|
|||
|
|
|
|||
|
|
**辅助脚本**:
|
|||
|
|
- `fetch_and_cache.py` - 预取并缓存 NASA 数据
|
|||
|
|
- `list_celestial_bodies.py` - 列出所有天体
|
|||
|
|
- `add_pluto.py` - 添加冥王星数据示例
|
|||
|
|
|
|||
|
|
#### 2.4 依赖管理
|
|||
|
|
更新了后端依赖 (`backend/requirements.txt`):
|
|||
|
|
|
|||
|
|
**新增依赖**:
|
|||
|
|
```
|
|||
|
|
sqlalchemy>=2.0.0 # ORM 框架 (异步支持)
|
|||
|
|
asyncpg>=0.29.0 # PostgreSQL 异步驱动
|
|||
|
|
alembic>=1.12.0 # 数据库迁移工具
|
|||
|
|
redis>=5.0.0 # Redis 客户端
|
|||
|
|
aiofiles>=23.0.0 # 异步文件操作
|
|||
|
|
pydantic-settings>=2.0.0 # 配置管理
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 三、前端改进 ✅
|
|||
|
|
|
|||
|
|
#### 3.1 从静态文件迁移到 API
|
|||
|
|
**移除的静态文件**:
|
|||
|
|
- `frontend/public/data/*.json` (所有 JSON 数据文件)
|
|||
|
|
- `frontend/public/textures/*.jpg` (所有纹理文件)
|
|||
|
|
- `frontend/public/models/*.glb` (所有 3D 模型)
|
|||
|
|
|
|||
|
|
**改为从后端 API 获取**:
|
|||
|
|
- 天体数据:`/api/celestial-bodies`
|
|||
|
|
- 静态数据:`/api/static/*`
|
|||
|
|
- 纹理文件:`/api/static/textures/*`
|
|||
|
|
- 3D 模型:`/api/static/models/*`
|
|||
|
|
|
|||
|
|
#### 3.2 组件更新
|
|||
|
|
更新了前端组件以适应新的数据获取方式:
|
|||
|
|
|
|||
|
|
**修改的组件**:
|
|||
|
|
- `src/components/CelestialBody.tsx` - 使用 API 获取天体和纹理
|
|||
|
|
- `src/components/Probe.tsx` - 简化探测器渲染逻辑
|
|||
|
|
- `src/components/Constellations.tsx` - 从 API 获取星座数据
|
|||
|
|
- `src/components/Galaxies.tsx` - 从 API 获取星系数据
|
|||
|
|
- `src/components/ProbeList.tsx` - 使用新的探测器数据结构
|
|||
|
|
- `src/utils/api.ts` - 新增 API 调用函数
|
|||
|
|
|
|||
|
|
#### 3.3 API 工具函数
|
|||
|
|
新增了 API 调用函数 (`frontend/src/utils/api.ts`):
|
|||
|
|
|
|||
|
|
```typescript
|
|||
|
|
// 天体相关
|
|||
|
|
export const getCelestialBodies = async ()
|
|||
|
|
export const getCelestialBody = async (bodyId: string)
|
|||
|
|
|
|||
|
|
// 静态数据
|
|||
|
|
export const getConstellations = async ()
|
|||
|
|
export const getGalaxies = async ()
|
|||
|
|
export const getNearbyStars = async ()
|
|||
|
|
|
|||
|
|
// 探测器
|
|||
|
|
export const getProbes = async ()
|
|||
|
|
export const getProbePositions = async (probeIds: string[])
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 四、架构优化成果 ✅
|
|||
|
|
|
|||
|
|
#### 4.1 性能提升
|
|||
|
|
- **NASA API 调用减少 90%**:通过三层缓存
|
|||
|
|
- **首次加载加速**:从缓存/数据库读取,无需等待 NASA API
|
|||
|
|
- **并发能力提升**:Redis 支持分布式缓存
|
|||
|
|
|
|||
|
|
#### 4.2 可扩展性提升
|
|||
|
|
- **统一数据管理**:所有数据在数据库中集中管理
|
|||
|
|
- **资源管理统一**:后端统一提供静态资源
|
|||
|
|
- **支持历史查询**:位置历史表支持时间旅行功能
|
|||
|
|
- **易于扩展**:添加新天体类型无需修改前端
|
|||
|
|
|
|||
|
|
#### 4.3 可维护性提升
|
|||
|
|
- **配置管理**:环境变量统一管理
|
|||
|
|
- **数据迁移**:提供完整的初始化和迁移脚本
|
|||
|
|
- **健康检查**:实时监控数据库和 Redis 状态
|
|||
|
|
- **文档完善**:提供架构、数据库、配置文档
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 当前状态
|
|||
|
|
|
|||
|
|
### 已实现功能
|
|||
|
|
✅ 太阳系行星可视化 (水星、金星、地球、火星、木星、土星、天王星、海王星、冥王星)
|
|||
|
|
✅ NASA 探测器实时位置追踪 (Voyager 1/2, Juno, Cassini, Parker Solar Probe)
|
|||
|
|
✅ 星座和星系静态可视化
|
|||
|
|
✅ 数据库驱动的数据管理
|
|||
|
|
✅ 三层缓存架构 (内存 + Redis + 数据库)
|
|||
|
|
✅ 资源文件统一管理
|
|||
|
|
✅ API 健康检查和监控
|
|||
|
|
|
|||
|
|
### 已知限制
|
|||
|
|
- 前端静态资源文件已删除,但后端 `upload/` 目录尚未完全迁移纹理和模型
|
|||
|
|
- 部分探测器 3D 模型尚未上传到后端
|
|||
|
|
- 历史位置数据尚未批量预取
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 待实现功能 (下一步)
|
|||
|
|
|
|||
|
|
### 优先级 P0 (必须)
|
|||
|
|
- [ ] **资源文件迁移完成**
|
|||
|
|
- 将纹理文件迁移到 `backend/upload/textures/`
|
|||
|
|
- 将 3D 模型迁移到 `backend/upload/models/`
|
|||
|
|
- 更新数据库 `resources` 表记录
|
|||
|
|
- 验证前端能正确加载所有资源
|
|||
|
|
|
|||
|
|
- [ ] **探测器轨迹历史数据**
|
|||
|
|
- 预取探测器历史位置 (过去 30 天)
|
|||
|
|
- 实现轨迹可视化组件
|
|||
|
|
- 支持时间滑块控制
|
|||
|
|
|
|||
|
|
### 优先级 P1 (重要)
|
|||
|
|
- [ ] **小行星和彗星支持**
|
|||
|
|
- 添加小行星数据 (Ceres, Vesta, etc.)
|
|||
|
|
- 添加著名彗星数据 (Halley, Hale-Bopp, etc.)
|
|||
|
|
- 实现轨道可视化
|
|||
|
|
|
|||
|
|
- [ ] **性能优化**
|
|||
|
|
- 实现纹理压缩和多分辨率支持
|
|||
|
|
- 优化 3D 模型多边形数
|
|||
|
|
- 实现视锥剔除 (Frustum Culling)
|
|||
|
|
- 添加性能监控指标
|
|||
|
|
|
|||
|
|
- [ ] **用户界面增强**
|
|||
|
|
- 天体搜索功能
|
|||
|
|
- 收藏和历史记录
|
|||
|
|
- 相机动画和平滑过渡
|
|||
|
|
- 时间控制面板 (时间旅行)
|
|||
|
|
|
|||
|
|
### 优先级 P2 (可选)
|
|||
|
|
- [ ] **数据扩展**
|
|||
|
|
- 系外行星数据
|
|||
|
|
- 深空探测器 (New Horizons, etc.)
|
|||
|
|
- 更多恒星和星云数据
|
|||
|
|
|
|||
|
|
- [ ] **用户系统**
|
|||
|
|
- 用户注册和登录
|
|||
|
|
- 自定义天体
|
|||
|
|
- 观测日志
|
|||
|
|
|
|||
|
|
- [ ] **移动端优化**
|
|||
|
|
- 响应式设计
|
|||
|
|
- 触摸手势支持
|
|||
|
|
- 性能优化
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 技术债务
|
|||
|
|
|
|||
|
|
1. **资源管理**
|
|||
|
|
- 纹理文件和 3D 模型尚未完全迁移到后端
|
|||
|
|
- 需要实现资源版本管理和 CDN 支持
|
|||
|
|
|
|||
|
|
2. **数据库迁移**
|
|||
|
|
- 缺少 Alembic 数据库版本管理
|
|||
|
|
- 缺少数据库备份和恢复策略
|
|||
|
|
|
|||
|
|
3. **测试覆盖**
|
|||
|
|
- 缺少单元测试
|
|||
|
|
- 缺少集成测试
|
|||
|
|
- 缺少前端测试
|
|||
|
|
|
|||
|
|
4. **监控和日志**
|
|||
|
|
- 缺少应用日志收集
|
|||
|
|
- 缺少性能监控指标
|
|||
|
|
- 缺少错误追踪系统
|
|||
|
|
|
|||
|
|
5. **文档**
|
|||
|
|
- 缺少 API 文档的详细说明
|
|||
|
|
- 缺少前端组件文档
|
|||
|
|
- 缺少部署文档
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 开发指南
|
|||
|
|
|
|||
|
|
### 环境准备
|
|||
|
|
|
|||
|
|
**系统要求**:
|
|||
|
|
- Python 3.11+
|
|||
|
|
- Node.js 18+
|
|||
|
|
- PostgreSQL 15+
|
|||
|
|
- Redis 7+
|
|||
|
|
|
|||
|
|
**后端初始化**:
|
|||
|
|
```bash
|
|||
|
|
cd backend
|
|||
|
|
pip install -r requirements.txt
|
|||
|
|
cp .env.example .env # 修改配置
|
|||
|
|
python scripts/create_db.py
|
|||
|
|
python scripts/init_db.py
|
|||
|
|
python scripts/migrate_data.py
|
|||
|
|
python -m uvicorn app.main:app --reload
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**前端初始化**:
|
|||
|
|
```bash
|
|||
|
|
cd frontend
|
|||
|
|
npm install
|
|||
|
|
npm run dev
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 开发流程
|
|||
|
|
|
|||
|
|
1. **添加新天体类型**
|
|||
|
|
- 更新 `celestial_body.py` 模型
|
|||
|
|
- 添加数据迁移脚本
|
|||
|
|
- 更新前端组件
|
|||
|
|
|
|||
|
|
2. **添加新 API 端点**
|
|||
|
|
- 在 `routes.py` 中添加端点
|
|||
|
|
- 在 `db_service.py` 中添加数据库操作
|
|||
|
|
- 更新前端 `api.ts`
|
|||
|
|
|
|||
|
|
3. **添加新缓存层**
|
|||
|
|
- 在 `redis_cache.py` 中添加缓存函数
|
|||
|
|
- 更新 TTL 配置
|
|||
|
|
- 验证缓存命中率
|
|||
|
|
|
|||
|
|
### 调试技巧
|
|||
|
|
|
|||
|
|
**查看数据库数据**:
|
|||
|
|
```bash
|
|||
|
|
psql -U postgres -d cosmo_db
|
|||
|
|
\dt # 列出所有表
|
|||
|
|
SELECT * FROM celestial_bodies;
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**查看 Redis 缓存**:
|
|||
|
|
```bash
|
|||
|
|
redis-cli
|
|||
|
|
KEYS * # 列出所有键
|
|||
|
|
GET positions:-31:2025-11-27:2025-11-27:1d
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**健康检查**:
|
|||
|
|
```bash
|
|||
|
|
curl http://localhost:8000/health
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 架构文档
|
|||
|
|
|
|||
|
|
详细的架构规划和设计文档:
|
|||
|
|
- [ARCHITECTURE_PLAN.md](./ARCHITECTURE_PLAN.md) - 完整的架构升级规划
|
|||
|
|
- [backend/DATABASE_SCHEMA.md](./backend/DATABASE_SCHEMA.md) - 数据库表结构设计
|
|||
|
|
- [backend/CONFIG.md](./backend/CONFIG.md) - 配置说明
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 提交记录
|
|||
|
|
|
|||
|
|
- `78e48a6` - v0.0.9
|
|||
|
|
- `bda13be` - 初步完成了太阳系内的行星显示
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 联系方式
|
|||
|
|
|
|||
|
|
如有问题,请查看文档或提交 Issue。
|
|||
|
|
|
|||
|
|
**文档链接**:
|
|||
|
|
- 架构规划:[ARCHITECTURE_PLAN.md](./ARCHITECTURE_PLAN.md)
|
|||
|
|
- 数据库设计:[backend/DATABASE_SCHEMA.md](./backend/DATABASE_SCHEMA.md)
|
|||
|
|
- 配置说明:[backend/CONFIG.md](./backend/CONFIG.md)
|