11 KiB
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):
// 天体相关
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.)
- 更多恒星和星云数据
-
用户系统
- 用户注册和登录
- 自定义天体
- 观测日志
-
移动端优化
- 响应式设计
- 触摸手势支持
- 性能优化
技术债务
-
资源管理
- 纹理文件和 3D 模型尚未完全迁移到后端
- 需要实现资源版本管理和 CDN 支持
-
数据库迁移
- 缺少 Alembic 数据库版本管理
- 缺少数据库备份和恢复策略
-
测试覆盖
- 缺少单元测试
- 缺少集成测试
- 缺少前端测试
-
监控和日志
- 缺少应用日志收集
- 缺少性能监控指标
- 缺少错误追踪系统
-
文档
- 缺少 API 文档的详细说明
- 缺少前端组件文档
- 缺少部署文档
开发指南
环境准备
系统要求:
- Python 3.11+
- Node.js 18+
- PostgreSQL 15+
- Redis 7+
后端初始化:
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
前端初始化:
cd frontend
npm install
npm run dev
开发流程
-
添加新天体类型
- 更新
celestial_body.py模型 - 添加数据迁移脚本
- 更新前端组件
- 更新
-
添加新 API 端点
- 在
routes.py中添加端点 - 在
db_service.py中添加数据库操作 - 更新前端
api.ts
- 在
-
添加新缓存层
- 在
redis_cache.py中添加缓存函数 - 更新 TTL 配置
- 验证缓存命中率
- 在
调试技巧
查看数据库数据:
psql -U postgres -d cosmo_db
\dt # 列出所有表
SELECT * FROM celestial_bodies;
查看 Redis 缓存:
redis-cli
KEYS * # 列出所有键
GET positions:-31:2025-11-27:2025-11-27:1d
健康检查:
curl http://localhost:8000/health
架构文档
详细的架构规划和设计文档:
- ARCHITECTURE_PLAN.md - 完整的架构升级规划
- backend/DATABASE_SCHEMA.md - 数据库表结构设计
- backend/CONFIG.md - 配置说明
提交记录
78e48a6- v0.0.9bda13be- 初步完成了太阳系内的行星显示
联系方式
如有问题,请查看文档或提交 Issue。
文档链接:
- 架构规划:ARCHITECTURE_PLAN.md
- 数据库设计:backend/DATABASE_SCHEMA.md
- 配置说明:backend/CONFIG.md