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