这是一个使用Nuxt 3全栈框架开发的校园广播站点歌系统。系统实现了用户点歌、投票、后台排期管理以及歌单公示等功能,支持管理员通过拖拽方式进行排期管理。
- 用户管理:管理员添加用户,支持按年级班级分类
- 点歌系统:用户可以点歌或给已有歌曲投票
- 歌曲管理:按热度排序,避免重复播放
- 排期管理:管理员可以通过拖拽界面进行歌曲排期和顺序管理
- 公开展示:公开展示歌曲播放排期,按日期分组展示
- 通知系统:实时通知功能,包括歌曲被选中、投票和系统通知
- 现代UI:响应式设计,玻璃态UI,流畅的动画效果
- 数据库自检:自动数据库验证和修复机制,确保系统稳定性
- 前端:Nuxt 3、Vue 3、TypeScript
- 后端:Nuxt 3 Serverless API
- 数据库:PostgreSQL
- ORM:Prisma
- 认证:JWT Token认证
- 样式:CSS变量,自定义动画
- 部署:支持Vercel一键部署
系统采用了Nuxt 3的全栈架构:
- 使用Nuxt 3的服务端API构建后端服务
- 使用Vue 3组合式API构建前端组件
- 使用Prisma ORM连接PostgreSQL数据库
- 使用JWT进行用户认证和授权
- 数据库自检和自动修复机制
- Node.js 16+
- PostgreSQL数据库
- 克隆仓库
git clone https://github.com/laoshuikaixue/VoiceHub.git
cd VoiceHub- 安装依赖
npm install- 设置环境变量
复制
.env.example文件并重命名为.env,然后修改其中的配置:
cp .env.example .env- 编辑
.env文件,设置数据库连接和JWT密钥:
DATABASE_URL="postgresql://username:password@host:port/database?sslmode=require"
JWT_SECRET="your-very-secure-jwt-secret-key"
- 初始化数据库和Prisma客户端
npx prisma generate
npx prisma migrate deploy- 创建管理员账户
node scripts/create-admin.js- 数据库验证和修复
# 检查数据库结构和完整性
cd scripts && npm run check-db
# 修复数据库问题
cd scripts && npm run repair-db- 启动开发服务器
npm run dev- 构建生产版本
npm run build- 运行生产版本
npm run start| 变量名 | 必填 | 说明 |
|---|---|---|
| DATABASE_URL | 是 | PostgreSQL数据库连接字符串 |
| JWT_SECRET | 是 | JWT令牌签名密钥,建议使用强随机字符串 |
| NODE_ENV | 否 | 运行环境,development或production |
| VERCEL | 否 | 在Vercel环境中自动设置为'1' |
VoiceHub/
├── app.vue # 应用入口
├── assets/ # 静态资源
├── components/ # 可复用组件
│ ├── Admin/ # 管理员组件
│ ├── Auth/ # 认证相关组件
│ ├── Notifications/ # 通知相关组件
│ ├── Songs/ # 歌曲相关组件
│ └── UI/ # 通用UI组件
├── composables/ # 组合式API函数
├── pages/ # 页面组件
├── plugins/ # 插件
├── prisma/ # Prisma ORM配置
│ ├── migrations/ # 数据库迁移
│ └── schema.prisma # 数据库模型
├── public/ # 公共资源
├── scripts/ # 工具脚本
│ ├── check-database.js # 数据库检查工具
│ ├── repair-database.js # 数据库修复工具
│ └── create-admin.js # 创建管理员账户
├── server/ # 服务端API
│ ├── api/ # API端点
│ ├── middleware/ # 中间件
│ ├── models/ # 服务端模型
│ ├── plugins/ # 服务端插件
│ └── services/ # 服务层
└── types/ # TypeScript类型定义
- 访问主页,查看当前排期
- 注册/登录账号
- 在仪表盘中点歌或给喜欢的歌曲投票
- 查看通知中心获取歌曲状态更新
- 使用管理员账号登录(默认账号:admin,密码:admin123)
- 进入管理后台,选择相应功能标签
- 排期管理:可以看到左侧"待排歌曲"和右侧"播放顺序"
- 通过拖拽将歌曲从左侧添加到右侧的排期列表
- 可以在右侧拖拽调整歌曲播放顺序
- 点击"保存顺序"按钮保存排期
- 歌曲管理:查看和管理所有歌曲
- 用户管理:添加、编辑和删除用户
- 单个添加:填写用户信息(包括姓名、账号、年级、班级)
- 批量导入:通过EXCEL文件批量添加用户
- 可以重置用户密码
- 通知管理:向用户发送系统通知
- 支持按全体用户、年级、班级或多班级发送
- 实时显示发送进度和结果
系统内置了自动数据库验证和修复机制,可确保数据库结构和数据一致性。
应用启动时会自动验证数据库结构和完整性:
- 检查数据库连接状态
- 验证必要的表和字段是否存在
- 检查数据一致性(如用户通知设置)
- 首次部署时自动初始化数据库
系统提供了两个命令行工具用于手动检查和修复数据库问题:
-
数据库检查工具
cd scripts && npm run check-db
该工具会检查:
- 数据库表结构完整性
- 必要字段是否存在
- 管理员用户是否存在
- 用户通知设置是否完整
-
数据库修复工具
cd scripts && npm run repair-db
该工具提供交互式修复功能:
- 创建缺失的管理员账户
- 为用户添加缺失的通知设置
- 检查表结构并给出迁移建议
本项目可以直接部署到Vercel平台:
- 在Vercel中导入GitHub仓库
- 设置环境变量:
DATABASE_URL: PostgreSQL数据库连接字符串JWT_SECRET: JWT令牌签名密钥
- 部署应用
Vercel环境下,系统会自动执行数据库验证,并在首次部署时初始化数据库。
-
构建生产版本
npm run build
-
设置环境变量 确保设置了必要的环境变量(DATABASE_URL和JWT_SECRET)
-
启动应用
npm run start
如果您在首次运行项目时遇到以下错误:
Error: @prisma/client did not initialize yet. Please run "prisma generate" and try to import it again.
这是因为需要先生成Prisma客户端代码。请按以下步骤解决:
- 确保已正确配置根目录的
.env文件(包含有效的DATABASE_URL) - 运行以下命令生成Prisma客户端:
npx prisma generate
- 如果在Windows系统上遇到PowerShell执行策略限制,请先运行:
然后再执行
Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass
npx prisma generate
如果遇到数据库表结构不匹配的问题:
-
确保数据库已经最新:
npx prisma migrate deploy
-
如果还有问题,使用修复工具:
cd scripts && npm run repair-db
-
对于复杂的数据库问题,可能需要重置数据库(慎用,会删除所有数据):
npx prisma migrate reset
如果通知只显示标题但不显示内容,可能是数据库模型与前端模型不匹配。运行修复工具:
cd scripts && npm run repair-db项目使用了Vue 3的组合式API,主要包括:
useAuth: 处理用户认证、登录、注册和权限控制useSongs: 处理歌曲相关操作,包括获取歌曲列表、点歌和投票useAdmin: 处理管理员操作,包括排期管理和标记播放useNotifications: 处理通知系统,包括获取、标记已读和设置
- 在
server/api中添加新的API端点 - 在
composables中添加相应的组合式函数 - 在
components中创建UI组件 - 在
pages中整合组件和功能
如需修改数据库模型:
- 编辑
prisma/schema.prisma文件 - 运行迁移命令:
npx prisma migrate dev --name your_migration_name - 更新客户端:
npx prisma generate - 确保同时更新
types/index.ts中的TypeScript类型定义 - 验证数据库:
cd scripts && npm run check-db