4.2 KiB
4.2 KiB
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 数据。
- 小天体 (Comets/Asteroids): NASA JPL SBDB Close-Approach Data API (
- 实现:
- 新增
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。
- Key:
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)
- 数据库迁移: 执行 SQL 脚本创建新表(
celestial_events,user_follows)。 - 后端开发:
- Horizons缓存: 修改
HorizonsService增加 Redis 缓存层。 - 关注功能: 实现
/social/followAPI。 - 频道消息: 实现
/social/channelAPI,使用 Redis 存储。 - 天体事件: 实现 NASA SBDB 数据拉取逻辑与 API。
- Horizons缓存: 修改
- 验证:
- 测试关注/取关。
- 测试频道消息发送与接收(验证 Redis 存储)。
- 测试 Horizons 缓存生效。