Files
sundynix-radio-be/Walkthrough.md
T
2026-02-27 13:54:01 +08:00

174 lines
7.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 项目改造 Walkthrough:从"植趣"到"早安电台"
## 一、项目概述
本次改造将后端项目从**植物养护小程序(植趣)**全面转型为**早安电台微信小程序**后端。保留了底层的系统模块(用户认证、OSS 文件管理等),删除了全部植物相关的业务模块,新建了早安电台核心业务模块。
---
## 二、技术栈(保持不变)
| 技术 | 版本/框架 | 用途 |
|------|-----------|------|
| Go | 1.24 | 后端语言 |
| Gin | v1.10 | Web 框架 |
| GORM | v1.26 | ORM 框架 |
| MySQL | - | 主数据库 |
| Redis | - | 缓存与分布式锁 |
| MinIO | - | 对象存储(音频文件) |
| Viper | v1.20 | 配置管理 |
| Zap | v1.27 | 结构化日志 |
| robfig/cron | v3 | 定时任务调度 |
| JWT | v5 | 接口鉴权 |
---
## 三、已删除的模块(植物相关)
### 3.1 删除的目录
| 目录 | 文件数 | 说明 |
|------|--------|------|
| `api/v1/plant/` | 12 个文件 | 植物 API 处理器 |
| `router/plant/` | 12 个文件 | 植物路由定义 |
| `service/plant/` | 13 个文件 | 植物业务逻辑 |
| `model/plant/` | 22+ 个文件 | 植物数据模型(含 request/response 子目录) |
| `task/` | 2 个文件 | 植物养护定时任务 |
| `config/baidu_img_classify.go` | 1 个文件 | 百度植物识别配置 |
### 3.2 删除的植物功能清单
- 我的植物管理(CRUD、养护计划、养护任务、成长记录)
- 社区帖子(发帖、评论、点赞、话题)
- 植物百科(分类、百科条目)
- 植物 OCR 识别
- 等级配置系统
- 徽章成就系统(植物养护相关)
- 用户资料管理
- 兑换中心(阳光值兑换商品)
- 微信内容安全回调
- 植物养护提醒定时任务
---
## 四、新建的模块(早安电台)
### 4.1 数据模型层 `model/radio/`
| 文件 | 表名 | 说明 |
|------|------|------|
| `audio_content.go` | `sundynix_audio_content` | 音频内容表:标题、音频URL、封面、专辑名、场景、时长、脚本文本、来源类型、状态 |
| `crawl_source.go` | `sundynix_crawl_source` | 抓取源配置表:名称、类型(github/producthunt/rss)、API地址、查询参数、场景、抓取间隔 |
| `crawl_record.go` | `sundynix_crawl_record` | 抓取记录表:原始数据、清洗文本、AI摘要、处理状态、关联音频ID |
| `play_record.go` | `sundynix_play_record` | 播放记录表:用户ID、音频ID、播放进度(秒)、是否完成、完成时间 |
| `user_medal.go` | `sundynix_user_medal` | 用户勋章表:用户ID、勋章类型、获得时间 |
| `user_subscription.go` | `sundynix_user_subscription` | 用户订阅表:用户ID、场景、是否启用、推送时间 |
| `request/audio.go` | - | 请求参数:音频列表请求、播放状态更新请求、订阅更新请求 |
| `response/audio.go` | - | 响应参数:音频列表响应、播放状态响应、勋章列表响应、订阅响应 |
### 4.2 服务层 `service/radio/`
| 文件 | 核心功能 |
|------|----------|
| `audio_content.go` | 音频列表分页查询(支持场景筛选)、音频详情、最新音频获取 |
| `crawl.go` | 获取启用的抓取源、创建/更新抓取记录、获取待处理记录 |
| `play_record.go` | 更新播放进度、断点续传支持、**完成收听时自动触发勋章解锁** |
| `user_medal.go` | 查询用户勋章列表、检查勋章拥有状态 |
| `user_subscription.go` | 查询/创建/更新用户订阅偏好 |
| `enter.go` | ServiceGroup 聚合入口 |
### 4.3 API 处理器层 `api/v1/radio/`
| 文件 | 接口 | 说明 |
|------|------|------|
| `audio_content.go` | `GET /audio/list` | 分页获取音频列表,支持 `scene` 筛选 |
| | `GET /audio/detail` | 根据 ID 获取音频详情 |
| | `GET /audio/latest` | 获取指定场景的最新音频 |
| `play_record.go` | `POST /audio/play-status` | 更新播放状态,完成时返回新解锁的勋章 |
| | `GET /audio/play-record` | 获取播放进度(用于 `startTime` 断点续传) |
| `user_medal.go` | `GET /medal/list` | 获取当前用户的所有勋章 |
| `user_subscription.go` | `GET /subscription/info` | 获取用户的场景订阅列表 |
| | `POST /subscription/update` | 更新/创建订阅设置 |
### 4.4 路由层 `router/radio/`
| 文件 | 路由组前缀 | 注册的 API |
|------|-----------|-----------|
| `audio_router.go` | `/audio` | list, detail, latest |
| `play_record_router.go` | `/audio` | play-status, play-record |
| `medal_router.go` | `/medal` | list |
| `subscription_router.go` | `/subscription` | info, update |
---
## 五、修改的全局文件
### 5.1 聚合入口文件(enter.go
- `api/v1/enter.go``PlantApiGroup``RadioApiGroup`
- `router/enter.go``Plant plant.RouterGroup``Radio radio.RouterGroup`
- `service/enter.go``PlantServiceGroup``RadioServiceGroup`
### 5.2 初始化文件(initialize/
- `router.go` — 全部 `plantGroup.InitXxxRouter()``radioGroup.InitXxxRouter()`,项目名称更新为 `sundynix-morning-radio`
- `gorm.go` — 全部 `plant.Xxx{}` 模型迁移 → `radio.Xxx{}` 模型迁移
- `timer.go` — 植物养护提醒 → 早安电台数据抓取定时任务(每2小时) + 音频生成任务(每天凌晨5点)
### 5.3 全局常量(global/enums.go
移除植物养护相关常量,新增:
- **勋章类型**`EARLY_BIRD_7/30/100`, `EXPLORER`, `ALL_ROUNDER`, `FIRST_LISTEN`
- **场景定义**`morning_career`, `morning_health`, `morning_life`, `morning_study`
- **抓取源类型**`github`, `producthunt`, `rss`, `huggingface`, `webscrape`
- **音频状态**:草稿(0)、已发布(1)、已下线(2)
- **抓取状态**pending、processed、failed
### 5.4 配置文件
- `config/config.go` — 移除 `BaiduImgClassify` 字段
- `config-dev.yaml` — 移除百度植物识别配置,更新 MinIO bucket 为 `sundynix-audios`,更新 RocketMQ topic,更新 Zap 日志前缀
---
## 六、核心业务流程
### 6.1 数据抓取与音频生成流水线
```
定时任务(每2小时) → 抓取数据源 → 清洗HTML(Goquery) → AI摘要改写 → TTS语音合成 → MinIO存储 → CDN分发
```
### 6.2 用户收听与勋章系统
```
获取音频列表 → 播放音频 → 实时上报进度(断点续传) → 完成收听 → 触发勋章检查 → 解锁成就
```
### 6.3 场景化订阅
```
用户选择场景(硬核职场/效率健康/极简生活/知识胶囊) → 设置推送时间 → 按需接收个性化早安电台
```
---
## 七、编译验证
```bash
$ go build ./...
# 编译通过,无错误
```
---
## 八、后续开发建议(TODO
1. **抓取服务实现**:接入 GitHub API、Product Hunt GraphQL API、RSS 订阅源
2. **AI 摘要服务**:集成 DeepSeek/OpenAI API,实现抓取数据 → 口播脚本的自动改写
3. **TTS 语音合成**:接入腾讯云 TTS 或其他 TTS 服务,生成 AAC 格式音频
4. **CDN 配置**:为 MinIO 配置 Nginx HTTPS 反向代理 + CDN 边缘缓存
5. **小程序前端**:集成 `BackgroundAudioManager` 实现后台播放、锁屏控件、断点续传
6. **AIGC 合规标识**:在前端 UI 添加"AI 生成内容"标识