cosmo/.CLAUDE.md

11 KiB
Raw Blame History

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.)
    • 更多恒星和星云数据
  • 用户系统

    • 用户注册和登录
    • 自定义天体
    • 观测日志
  • 移动端优化

    • 响应式设计
    • 触摸手势支持
    • 性能优化

技术债务

  1. 资源管理

    • 纹理文件和 3D 模型尚未完全迁移到后端
    • 需要实现资源版本管理和 CDN 支持
  2. 数据库迁移

    • 缺少 Alembic 数据库版本管理
    • 缺少数据库备份和恢复策略
  3. 测试覆盖

    • 缺少单元测试
    • 缺少集成测试
    • 缺少前端测试
  4. 监控和日志

    • 缺少应用日志收集
    • 缺少性能监控指标
    • 缺少错误追踪系统
  5. 文档

    • 缺少 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

开发流程

  1. 添加新天体类型

    • 更新 celestial_body.py 模型
    • 添加数据迁移脚本
    • 更新前端组件
  2. 添加新 API 端点

    • routes.py 中添加端点
    • db_service.py 中添加数据库操作
    • 更新前端 api.ts
  3. 添加新缓存层

    • 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

架构文档

详细的架构规划和设计文档:


提交记录

  • 78e48a6 - v0.0.9
  • bda13be - 初步完成了太阳系内的行星显示

联系方式

如有问题,请查看文档或提交 Issue。

文档链接