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

7.1 KiB
Raw Blame History

项目改造 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.goPlantApiGroupRadioApiGroup
  • router/enter.goPlant plant.RouterGroupRadio radio.RouterGroup
  • service/enter.goPlantServiceGroupRadioServiceGroup

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 场景化订阅

用户选择场景(硬核职场/效率健康/极简生活/知识胶囊) → 设置推送时间 → 按需接收个性化早安电台

七、编译验证

$ 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 生成内容"标识