10 KiB
校园广播站点歌系统改造技术方案
基于 Nuxt 4 与 Node.js 的现代化重构,专注于酷狗音源集成与高效排期管理。
1. 项目概述
1.1 项目背景
随着校园文化生活需求的提升,原有的点歌系统在用户体验、音源稳定性及管理便捷性上已显不足。为了提供更现代化、简洁且高效的广播服务,决定对现有开源项目 VoiceHub 进行深度改造。
1.2 改造目标
- 引入用户注册机制,实现个性化点歌记录追踪。
- 精简音源,统一接入酷狗音乐代理服务,确保版权与音质。
- 开发后台管理功能,支持将排期歌单一键转换为图片,便于移动端导入。
- 全面升级 UI 设计,采用简洁高级的现代化风格。
1.3 开源协议
本项目遵循 MIT 协议,允许自由使用、修改和分发。
MIT License
本项目遵循 MIT 协议,允许自由使用、修改和分发。
2. 功能需求分析
为明确系统演进方向,以下表格对比了原始功能与本次改造后的目标需求:
| 编号 | 功能模块 | 原始功能 (VoiceHub) | 改造后需求 |
|---|---|---|---|
| 1 | 用户系统 | 匿名点歌,无记录 | 增加注册/登录,支持历史记录查看 |
| 2 | 音乐来源 | 多源聚合(网易云/QQ等),维护困难 | 仅保留酷狗音乐,部署专用代理 |
| 3 | 后台管理 | 基础排期列表,审核操作 | 新增“歌单图片生成”功能 |
| 4 | 界面设计 | 传统后台管理风格 | 现代化、扁平化、响应式设计 |
3. 技术架构设计
3.1 前端架构
前端采用现代化Web框架体系,保障性能与可维护性:
| 组件 | 技术选型 | 说明 |
|---|---|---|
| 框架 | Nuxt 4 (Vue 3) | 支持SSR渲染,提升首屏加载速度 |
| UI库 | Nuxt UI / Tailwind CSS | 原子化CSS,快速构建响应式界面 |
| 状态管理 | Pinia | 轻量级状态管理,适配Vue 3组合式API |
3.2 后端架构
后端基于Node.js构建微服务化架构,具备高扩展性与灵活性:
| 组件 | 技术选型 | 说明 |
|---|---|---|
| 运行环境 | Node.js LTS | 稳定版本,长期支持 |
| 业务模块 | Auth (JWT), Music (Proxy), Schedule (CRUD) | 模块化设计,职责分离 |
| 代理服务 | 内置酷狗API Hash算法解析 | 封装外部接口加密逻辑,降低耦合 |
3.3 系统架构图描述
系统采用分层架构设计,各组件间通过标准化接口通信:
用户端 (Nuxt) ↔ API网关 ↔ Node.js服务
↓
MySQL DB(数据持久化)
↓
酷狗代理 → 酷狗API(外部音源获取)
可视化节点颜色标识:
- 蓝色:用户端 (Nuxt),主入口
- 绿色:API网关 & Node.js服务,核心逻辑处理
- 黄色:MySQL DB,数据存储
- 紫色:酷狗代理,接口封装
- 粉色:酷狗API,第三方服务
通信链路建议使用 ECharts 力导向图展示,支持动态缩放与交互探索。
3.4 MySQL 数据库设计
数据库设计遵循第三范式,确保数据一致性与查询效率。
users 表(用户信息)
| 字段名 | 类型 | 说明 |
|---|---|---|
| id | INT PK | 用户ID |
| username | VARCHAR(50) | 用户名 |
| password_hash | VARCHAR(255) | 加密密码(bcrypt) |
| role | ENUM('user','admin') | 角色(普通用户/管理员) |
songs 表(歌曲信息)
| 字段名 | 类型 | 说明 |
|---|---|---|
| id | INT PK | 歌曲ID |
| kg_hash | VARCHAR(64) | 酷狗音乐Hash值 |
| title | VARCHAR(100) | 歌名 |
| singer | VARCHAR(100) | 歌手 |
| cover_url | VARCHAR(255) | 封面图URL |
4. 功能实现步骤
4.1 用户注册流程
采用 JWT (JSON Web Token) 实现无状态认证机制,保障安全性与可扩展性。
实现流程如下:
- 前端提交注册表单(用户名/密码);
- 后端验证用户名唯一性,并使用 bcrypt 对密码进行哈希加密后存入数据库;
- 登录成功后签发 JWT Token,通过 HttpOnly Cookie 返回客户端;
- 后续请求由中间件自动校验 Token 有效性,实现身份鉴权。
数据流示意:
Client → API → MySQL
4.2 音源集成(酷狗代理)
为解决酷狗API跨域限制与参数加密问题,部署Node.js中间件作为反向代理。
// server/routes/music.js
router.get('/kg/search', async (req, res) => {
const { keyword } = req.query;
// 模拟酷狗 Hash 生成逻辑
const signature = generateKugouSignature(keyword);
try {
const response = await axios.get(`https://mobilecdn.kugou.com/api/v3/search/song?keyword=${keyword}&signature=${signature}`);
res.json(response.data);
} catch (error) {
res.status(500).json({ error: 'Music service unavailable' });
}
});
注:
generateKugouSignature为自定义算法封装,用于模拟酷狗客户端签名机制。
4.3 歌单下载功能(图片生成)
利用 HTML5 Canvas API 将排期歌曲列表绘制成图片,便于广播员通过手机端应用导入。
实现逻辑
- 获取用户输入的歌单标题和歌曲列表;
- 使用 Canvas 绘制包含标题、日期、序号、歌曲名、歌手的图像;
- 添加渐变头背景与页脚水印增强视觉识别;
- 提供“下载”按钮触发
canvas.toDataURL()并创建临时链接导出 PNG 图像。
示例控制面板
- 歌单标题:
2026-03-21 校园午间广播 - 歌曲列表:
晴天 - 周杰伦 稻香 - 周杰伦 起风了 - 买辣椒也用券 New Boy - 朴树
生成结果为一张尺寸为 400×600 的 PNG 图片,适配移动端查看与分享场景。
5. 界面设计指南
5.1 色彩方案
采用现代极简风格配色,突出品牌识别与阅读舒适性。
| 编号 | 颜色名称 | HEX 值 | 用途 |
|---|---|---|---|
| 1 | Primary Blue | #2563EB |
主色调、按钮、高亮元素 |
| 2 | Neutral Dark | #0F172A |
标题文字、深色文本 |
| 3 | Background | #F8FAFC |
页面背景色 |
5.2 字体与布局
| 项目 | 设计规范 |
|---|---|
| 字体 | Inter / System UI,强调可读性与跨平台一致性 |
| 布局 | Bento Grid (便当盒) 风格卡片布局,模块化清晰 |
| 交互反馈 | 按钮与卡片增加微弱悬停上浮效果,提升操作感知 |
示意图占位:
[短条]
[长条]
[中条]
6. 部署方案
6.1 PM2 前端部署
使用 PM2 管理 Nuxt 构建后的 Node.js 服务进程,保障稳定性与自动重启能力。
# 1. 构建项目
npm run build
# 2. 使用 PM2 启动
pm2 start npm --name "voicehub-nuxt" -- start
# 3. 设置开机自启
pm2 startup
pm2 save
6.2 Docker 编排配置
通过 Docker Compose 实现应用与数据库的一体化部署,提升环境一致性。
version: '3.8'
services:
app:
build: .
ports:
- "3000:3000"
depends_on:
- db
environment:
- DATABASE_URL=mysql://user:pass@db:3306/voicehub
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: rootpass
MYSQL_DATABASE: voicehub
建议配合
.env文件管理敏感配置项,避免硬编码。
7. 风险分析与后续优化
7.1 风险与应对策略
| 编号 | 风险点 | 风险等级 | 应对策略 |
|---|---|---|---|
| 1 | 酷狗 API 接口变动 | 高 | 封装代理层,预留配置接口,便于快速切换加密算法 |
| 2 | 图片生成性能瓶颈 | 中 | 使用 Worker 线程处理 Canvas 绘制,避免阻塞主线程 |
| 3 | 数据库连接泄露 | 低 | 使用连接池(如 mysql2/promise),定期监控连接数,防止资源耗尽 |
7.2 后续优化建议
- 引入 Redis 缓存热门歌曲搜索结果:减少重复请求压力,提升响应速度;
- 增加 WebSocket 实现前端播放进度同步:适用于多终端协同广播场景;
- 开发小程序端入口:拓展移动端使用场景,提升师生参与便利性。