cosmo/PHASE5_PLAN.md

90 lines
4.2 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 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 缓存生效。