1. 项目概述:民谣音乐网站全栈开发实战
这个基于SpringBoot+Vue的民谣音乐网站项目,是我去年指导计算机专业学生完成的毕业设计作品。作为一个完整的全栈项目,它涵盖了从数据库设计、后端接口开发到前端页面实现的全流程,特别适合Java Web方向的学生作为毕业设计参考。项目实现了用户注册登录、音乐分类展示、在线播放、收藏管理等核心功能,采用前后端分离架构,后端使用SpringBoot+MyBatis技术栈,前端基于Vue+ElementUI构建。
提示:这个项目源码已经过完整测试,包含详细的接口文档和SQL脚本,下载后只需配置数据库连接信息即可运行,特别适合毕业设计时间紧张的同学快速搭建基础框架。
2. 技术架构解析
2.1 后端技术选型
后端采用SpringBoot 2.7.x作为基础框架,主要基于以下考虑:
- 自动配置特性大幅减少了XML配置,让新手能快速上手
- 内嵌Tomcat服务器,打包后可直接通过java -jar运行
- 丰富的Starter依赖简化了第三方组件集成
- 完善的文档和社区支持,遇到问题容易找到解决方案
数据库使用MySQL 8.0,主要考虑到:
- 高校实验室环境普遍已安装MySQL
- 相比其他关系型数据库安装配置更简单
- 完全能满足毕业设计级别的数据存储需求
xml复制<!-- 典型POM依赖示例 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.2</version>
</dependency>
2.2 前端技术栈
前端采用Vue 3.x + Element Plus的组合,主要优势在于:
- 响应式数据绑定简化了DOM操作
- 组件化开发提高代码复用率
- Axios处理HTTP请求与后端API对接
- Vue Router实现前端路由管理
- Vuex进行状态集中管理
音乐播放器使用vue-aplayer组件实现,支持MP3、M3U8等多种音频格式:
javascript复制// 播放器组件配置示例
<aplayer
autoplay
:music="{
title: '成都',
artist: '赵雷',
src: '/music/chengdu.mp3',
pic: '/cover/chengdu.jpg'
}"
/>
3. 数据库设计与实现
3.1 核心表结构
项目包含6张主要数据表,ER图如下:
| 表名 | 字段 | 说明 |
|---|---|---|
| user | id,username,password,avatar | 用户表 |
| music | id,title,artist,album,duration,url | 音乐表 |
| category | id,name,cover | 分类表 |
| collection | id,user_id,music_id | 收藏表 |
| comment | id,content,user_id,music_id | 评论表 |
| playlist | id,name,user_id | 歌单表 |
3.2 SQL脚本关键实现
sql复制-- 音乐表创建示例
CREATE TABLE `music` (
`id` int NOT NULL AUTO_INCREMENT,
`title` varchar(255) NOT NULL COMMENT '歌曲名称',
`artist` varchar(255) NOT NULL COMMENT '歌手',
`album` varchar(255) DEFAULT NULL COMMENT '专辑',
`duration` int DEFAULT NULL COMMENT '时长(秒)',
`url` varchar(255) NOT NULL COMMENT '文件路径',
`cover` varchar(255) DEFAULT NULL COMMENT '封面图',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
注意:项目中提供的SQL脚本已包含测试数据,导入后即可直接使用演示账号登录(账号:test 密码:123456)
4. 核心功能实现细节
4.1 音乐播放功能
后端采用分段传输实现音频文件播放,关键代码如下:
java复制@GetMapping("/play/{id}")
public void playMusic(@PathVariable Integer id,
HttpServletResponse response) throws IOException {
Music music = musicService.getById(id);
File file = new File(music.getUrl());
response.setContentType("audio/mpeg");
response.setContentLength((int) file.length());
try (InputStream in = new FileInputStream(file);
OutputStream out = response.getOutputStream()) {
byte[] buffer = new byte[4096];
int length;
while ((length = in.read(buffer)) > 0) {
out.write(buffer, 0, length);
}
}
}
前端通过Audio对象控制播放状态:
javascript复制const audio = new Audio()
audio.src = '/api/play/1'
audio.play().catch(e => {
console.error('播放失败:', e)
})
4.2 用户认证方案
采用JWT进行无状态认证,Spring Security配置示例:
java复制@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable()
.authorizeRequests()
.antMatchers("/api/login").permitAll()
.anyRequest().authenticated()
.and()
.addFilter(new JwtAuthenticationFilter(authenticationManager()))
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS);
}
}
5. 项目部署指南
5.1 开发环境配置
- 后端运行:
bash复制# 导入SQL脚本
mysql -u root -p < database.sql
# 启动SpringBoot应用
mvn spring-boot:run
- 前端运行:
bash复制npm install
npm run dev
5.2 生产环境部署
推荐使用Docker Compose进行容器化部署:
yaml复制version: '3'
services:
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: root
volumes:
- ./data:/var/lib/mysql
backend:
build: ./backend
ports:
- "8080:8080"
depends_on:
- mysql
frontend:
build: ./frontend
ports:
- "80:80"
6. 常见问题解决方案
6.1 跨域问题处理
后端配置CORS过滤器:
java复制@Bean
public CorsFilter corsFilter() {
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
CorsConfiguration config = new CorsConfiguration();
config.addAllowedOrigin("*");
config.addAllowedHeader("*");
config.addAllowedMethod("*");
source.registerCorsConfiguration("/**", config);
return new CorsFilter(source);
}
6.2 文件上传限制
调整SpringBoot文件上传配置:
properties复制# application.properties
spring.servlet.multipart.max-file-size=50MB
spring.servlet.multipart.max-request-size=50MB
7. 项目扩展建议
- 增加音乐推荐算法:基于用户收藏历史实现简单的协同过滤推荐
- 接入第三方登录:集成微信、QQ等社交账号登录
- 实现歌词同步显示:解析LRC文件并与播放进度同步
- 添加管理员后台:使用Vue Admin Template快速搭建管理界面
这个项目在实际指导过程中,发现学生最容易出错的是Vue组件之间的通信问题。我的建议是:
- 简单场景使用props/$emit
- 兄弟组件通信使用事件总线
- 复杂状态管理务必引入Vuex
- 跨级组件通信考虑provide/inject
