174 lines
7.1 KiB
Markdown
174 lines
7.1 KiB
Markdown
# 项目改造 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 生成内容"标识
|