COSMO42/PHASE5_PLAN.md

90 lines
4.2 KiB
Markdown
Raw Normal View History

2026-01-04 10:36:50 +00:00
# Phase 5: APP Connectivity & Social Features Plan
## 🎯 阶段目标
本阶段致力于打通移动端 APP 与后端平台的连接,增强系统的社会化属性(关注、频道),并引入天体事件自动发现机制。同时优化底层数据获取性能。
---
## 🛠 功能规划
### 1. 资源增强:天体图标 (Icons)
* **需求**: 为每个天体增加专属图标320x320 PNG/JPG用于 APP 列表页和详情页头部展示。
* **实现**:
* 利用现有的 `resources` 表。
* 确保 `resource_type` 支持 `'icon'` 枚举值。
* 后端 API `POST /celestial/resources/upload` 需支持上传到 `upload/icon/` 目录。
* 前端/APP 端在获取天体列表时,优先加载 icon 资源。
### 2. 天体事件系统 (Celestial Events)
* **需求**: 自动计算/拉取天体动态事件(如“火星冲日”、“小行星飞掠”)。
* **数据源**:
* **小天体 (Comets/Asteroids)**: NASA JPL SBDB Close-Approach Data API (`https://ssd-api.jpl.nasa.gov/cad.api`).
* **主要行星**: 基于 `skyfield``ephem` 库进行本地计算(冲日、合月等),或解析 Horizons 数据。
* **实现**:
* 新增 `celestial_events` 表。
* 新增定时任务脚本 `fetch_celestial_events.py` (注册到 Scheduled Jobs)。
* API: `GET /events` (支持按天体、时间范围筛选)。
### 3. 性能优化JPL Horizons Redis 缓存
* **需求**: 减少对 NASA 接口的实时请求,针对“同天体、同一日”的请求进行缓存。
* **策略**:
* **Key**: `nasa:horizons:{body_id}:{date_str}` (例如 `nasa:horizons:499:2025-12-12`).
* **Value**: 解析后的 Position 对象或原始 Raw Text。
* **TTL**: 7天或更久历史数据永不过期
*`HorizonsService` 层拦截,先查 Redis无数据再请求 NASA 并写入 Redis。
### 4. 社交功能:关注与频道
* **关注 (Subscriptions/Follows)**:
* 用户可以关注感兴趣的天体如关注“旅行者1号”
* 新增 `user_follows` 表。
* API: 关注、取消关注、获取关注列表。
* **天体频道 (Body Channels)**:
* 每个天体拥有一个独立的讨论区Channel
* 只有关注了该天体的用户才能在频道内发言。
* **存储**: **Redis List** (类似于弹幕 `danmaku` 的设计),不持久化到 PostgreSQL。
* **Key**: `channel:messages:{body_id}`
* **TTL**: 消息保留最近 100-500 条或 7 天,过旧自动丢弃。
* API: 发送消息、获取频道消息流。
* **消息推送 (Notification)**:
* 当关注的天体发生 `celestial_events` 时,系统应生成通知(本阶段先实现数据层关联,推送推迟到 Phase 6 或 APP 端轮询)。
---
## 🗄 数据库变更 (Database Schema)
### 新增表结构
#### 1. `celestial_events` (天体事件表)
| Column | Type | Comment |
| :--- | :--- | :--- |
| id | SERIAL | PK |
| body_id | VARCHAR(50) | FK -> celestial_bodies.id |
| title | VARCHAR(200) | 事件标题 (e.g., "Asteroid 2024 XK Flyby") |
| event_type | VARCHAR(50) | 类型: 'approach', 'opposition', 'conjunction' |
| event_time | TIMESTAMP | 事件发生时间 (UTC) |
| description | TEXT | 事件描述 |
| details | JSONB | 技术参数 (距离、相对速度等) |
| source | VARCHAR(50) | 来源 ('nasa_sbdb', 'calculated') |
#### 2. `user_follows` (用户关注表)
| Column | Type | Comment |
| :--- | :--- | :--- |
| user_id | INTEGER | FK -> users.id |
| body_id | VARCHAR(50) | FK -> celestial_bodies.id |
| created_at | TIMESTAMP | 关注时间 |
| **Constraint** | PK | (user_id, body_id) 联合主键 |
---
## 🗓 实施步骤 (Execution Steps)
1. **数据库迁移**: 执行 SQL 脚本创建新表(`celestial_events`, `user_follows`)。
2. **后端开发**:
* **Horizons缓存**: 修改 `HorizonsService` 增加 Redis 缓存层。
* **关注功能**: 实现 `/social/follow` API。
* **频道消息**: 实现 `/social/channel` API使用 Redis 存储。
* **天体事件**: 实现 NASA SBDB 数据拉取逻辑与 API。
3. **验证**:
* 测试关注/取关。
* 测试频道消息发送与接收(验证 Redis 存储)。
* 测试 Horizons 缓存生效。