项目改造 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 数据抓取与音频生成流水线
6.2 用户收听与勋章系统
6.3 场景化订阅
七、编译验证
八、后续开发建议(TODO)
- 抓取服务实现:接入 GitHub API、Product Hunt GraphQL API、RSS 订阅源
- AI 摘要服务:集成 DeepSeek/OpenAI API,实现抓取数据 → 口播脚本的自动改写
- TTS 语音合成:接入腾讯云 TTS 或其他 TTS 服务,生成 AAC 格式音频
- CDN 配置:为 MinIO 配置 Nginx HTTPS 反向代理 + CDN 边缘缓存
- 小程序前端:集成
BackgroundAudioManager 实现后台播放、锁屏控件、断点续传
- AIGC 合规标识:在前端 UI 添加"AI 生成内容"标识