# 校园广播站点歌系统改造技术方案 > 基于 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) 实现无状态认证机制,保障安全性与可扩展性。 **实现流程如下**: 1. 前端提交注册表单(用户名/密码); 2. 后端验证用户名唯一性,并使用 bcrypt 对密码进行哈希加密后存入数据库; 3. 登录成功后签发 JWT Token,通过 HttpOnly Cookie 返回客户端; 4. 后续请求由中间件自动校验 Token 有效性,实现身份鉴权。 **数据流示意**: ``` Client → API → MySQL ``` ### 4.2 音源集成(酷狗代理) 为解决酷狗API跨域限制与参数加密问题,部署Node.js中间件作为反向代理。 ```javascript // 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 将排期歌曲列表绘制成图片,便于广播员通过手机端应用导入。 #### 实现逻辑 1. 获取用户输入的歌单标题和歌曲列表; 2. 使用 Canvas 绘制包含标题、日期、序号、歌曲名、歌手的图像; 3. 添加渐变头背景与页脚水印增强视觉识别; 4. 提供“下载”按钮触发 `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 服务进程,保障稳定性与自动重启能力。 ```bash # 1. 构建项目 npm run build # 2. 使用 PM2 启动 pm2 start npm --name "voicehub-nuxt" -- start # 3. 设置开机自启 pm2 startup pm2 save ``` ### 6.2 Docker 编排配置 通过 Docker Compose 实现应用与数据库的一体化部署,提升环境一致性。 ```yaml 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 实现前端播放进度同步**:适用于多终端协同广播场景; - **开发小程序端入口**:拓展移动端使用场景,提升师生参与便利性。