这次我们来看一个前后端分离的音乐网站项目。这个项目非常适合Java学习者、应届毕业生以及需要快速搭建一个完整Web应用进行练手或课程设计的开发者。它不是一个复杂的商业系统,而是一个聚焦于技术栈整合与核心功能实现的实战案例。核心目标很明确: 手把手教你如何将Vue.js前端与Spring Boot后端组合起来,构建一个具备基础音乐播放、歌单管理、用户交互功能的网站

对于初学者来说,最大的障碍往往不是某个技术点本身,而是如何将分散的技术(前端路由、后端API、数据库交互、文件上传、音频播放)串联成一个可运行的整体。这个项目直接提供了源码和文档,相当于给你一张“地图”,让你能清晰地看到从零到一的完整路径。本文将带你快速了解这个项目的核心功能、技术选型,并重点演示如何在自己的电脑上把它跑起来,同时分析关键代码模块和部署时可能遇到的坑。

1. 核心能力速览

能力项 说明
项目类型 前后端分离的Web应用(毕业设计/实战项目)
技术栈 前端:Vue.js + Element UI / 后端:Spring Boot + MyBatis / 数据库:MySQL
核心功能 用户注册登录、音乐浏览与搜索、在线播放、歌单创建与管理、收藏功能
部署方式 前端独立部署(如Nginx),后端Jar包或War包部署
硬件门槛 开发机即可(需安装JDK, Node.js, MySQL),无特殊GPU/显存要求
适合场景 Java/Web全栈学习、毕业设计、个人作品集、小型音乐服务原型

2. 适用场景与使用边界

这个音乐网站项目主要服务于以下几类人群:

  1. Java/Web全栈学习者 :希望有一个完整的项目来理解前后端如何通过RESTful API通信,数据如何从数据库流向浏览器页面。
  2. 计算机相关专业毕业生 :急需一个结构清晰、功能完整、技术栈主流的项目作为毕业设计或课程设计。
  3. 面试求职者 :需要实战项目充实简历,展示自己具备整合Vue和Spring Boot的能力。
  4. 个人开发者 :想快速搭建一个私人音乐库或小型音乐分享平台的原型。

它能解决的问题

  • 技术整合 :演示Vue CLI创建的项目如何与Spring Boot后端协同工作。
  • 功能闭环 :覆盖用户系统、内容管理、多媒体播放等典型Web应用模块。
  • 开发流程 :提供从数据库设计、接口定义到前端页面渲染的完整参考。

它的边界与限制

  • 非生产级 :作为学习项目,在性能优化、安全性(如更复杂的鉴权、防SQL注入)、高并发处理等方面可能较为简单。
  • 音乐版权 项目本身不提供任何音乐内容 ,通常需要用户自行上传或管理音频文件。在实际使用中, 必须严格遵守音乐版权法律法规,仅上传和使用您拥有合法授权的音频素材 ,切勿用于传播未授权内容。
  • 功能深度 :相比QQ音乐、网易云等成熟产品,缺少推荐算法、社交互动、付费订阅等复杂功能,更侧重于基础功能的实现。

3. 环境准备与前置条件

在开始部署和运行项目之前,请确保你的开发环境满足以下要求。这是项目能否成功启动的第一步。

操作系统 :Windows 10/11, macOS 或 Linux 均可。本文以Windows环境为例进行说明。 内存 :建议8GB及以上,确保同时运行IDE、数据库、前后端服务不卡顿。

后端环境 (Spring Boot)

  1. Java开发工具包 (JDK) :版本 JDK 8 JDK 11 (Spring Boot 2.x 常见兼容版本)。推荐使用JDK 11。
    • 检查命令: java -version
  2. 项目管理与构建工具 Apache Maven 。用于下载依赖和打包项目。
    • 检查命令: mvn -v
  3. 集成开发环境 (IDE) IntelliJ IDEA (推荐) 或 Eclipse。IDEA对Spring Boot支持更好。
  4. 数据库 MySQL 5.7 8.0 。需要提前安装并启动MySQL服务。
    • 检查命令: mysql --version
    • 你需要知道MySQL的root密码,或者有创建数据库和用户的权限。

前端环境 (Vue.js)

  1. Node.js :版本 14.x 16.x 。它自带了npm包管理器。
    • 检查命令: node -v npm -v
  2. Vue CLI (可选但推荐) :用于快速创建和管理Vue项目。可以通过npm安装: npm install -g @vue/cli
    • 检查命令: vue --version

其他工具

  • Git :用于克隆项目源码(如果源码托管在Git仓库)。
  • Postman 或 ApiFox :用于测试后端API接口。
  • 浏览器开发者工具 :Chrome或Edge的F12工具,用于调试前端网络请求和代码。

4. 项目结构与源码获取

通常,这类“手把手”项目会提供一个完整的源码包或Git仓库地址。假设你已经获得了源码,其典型目录结构如下:

music-website/
├── backend/                 # Spring Boot后端项目
│   ├── src/
│   │   ├── main/
│   │   │   ├── java/com/example/music/   # Java源代码
│   │   │   │   ├── controller/           # 控制器层,定义API接口
│   │   │   │   ├── service/              # 业务逻辑层
│   │   │   │   ├── dao/ 或 mapper/       # 数据访问层,MyBatis接口
│   │   │   │   ├── entity/ 或 model/     # 实体类,对应数据库表
│   │   │   │   └── config/               # 配置类(如跨域配置)
│   │   │   └── resources/
│   │   │       ├── application.yml       # 主配置文件(数据库连接等)
│   │   │       └── mapper/               # MyBatis的XML映射文件
│   │   └── test/
│   └── pom.xml                           # Maven依赖配置文件
│
└── frontend/                # Vue.js前端项目
    ├── public/                          # 静态资源
    ├── src/
    │   ├── assets/                      # 图片、样式等资源
    │   ├── components/                  # Vue组件
    │   ├── views/ 或 pages/             # 页面视图
    │   ├── router/                      # 路由配置
    │   ├── store/                       # Vuex状态管理(如果用到)
    │   ├── api/                         # 封装后端API请求
    │   └── App.vue, main.js             # 入口文件
    ├── package.json                     # 前端依赖配置文件
    └── vue.config.js                    # Vue项目配置文件(可配置代理)

第一步:导入后端项目

  1. 使用IDEA打开 backend 文件夹。
  2. IDEA会自动识别为Maven项目并开始下载依赖( pom.xml 中定义的jar包)。等待右下角进度条完成。

第二步:导入前端项目

  1. 使用VSCode或WebStorm打开 frontend 文件夹。
  2. 在终端中进入该目录,运行 npm install cnpm install 来安装所有前端依赖( package.json 中定义的包)。

5. 数据库初始化与后端配置

这是让后端服务跑起来的关键。

5.1 创建数据库 打开MySQL命令行或客户端(如Navicat),执行以下SQL语句:

-- 创建数据库,字符集推荐utf8mb4以支持表情符号
CREATE DATABASE IF NOT EXISTS `music_db` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
USE `music_db`;

5.2 执行建表SQL 在项目资源中,通常会提供一个 sql 文件夹或一个单独的 .sql 文件(例如 music_db.sql )。找到它,并在MySQL中执行这个SQL文件,它会自动创建所有需要的表(如用户表 user 、音乐表 song 、歌单表 playlist 等)。

# 假设sql文件在backend目录下,使用mysql命令行导入
mysql -u root -p music_db < backend/music_db.sql

5.3 配置后端连接 找到后端项目的 application.yml application.properties 文件,修改数据库连接信息,确保与你的MySQL环境匹配。

# application.yml 示例
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/music_db?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
    username: root # 你的数据库用户名
    password: your_password # 你的数据库密码
  servlet:
    multipart:
      max-file-size: 10MB # 文件上传大小限制,音乐文件可能较大
      max-request-size: 20MB

# 可选:配置MyBatis和日志
mybatis:
  mapper-locations: classpath:mapper/*.xml
  configuration:
    map-underscore-to-camel-case: true # 开启驼峰命名自动转换

logging:
  level:
    com.example.music: debug # 将你的项目包名日志级别设为debug,方便调试

6. 启动后端服务与接口验证

6.1 启动Spring Boot应用 在IDEA中,找到主启动类(通常命名为 MusicApplication Application ,带有 @SpringBootApplication 注解),右键点击 Run

如果启动成功,控制台会打印出Spring Boot的Banner,并显示类似 Tomcat started on port(s): 8080 的信息,表明后端API服务已经在本地8080端口运行。

6.2 验证核心API 打开Postman,测试几个关键接口,确保后端逻辑正常。

  • 测试健康检查或默认接口
    • 方法:GET
    • URL: http://localhost:8080/
    • 预期:可能返回一个简单欢迎信息或404。主要看服务是否响应。
  • 测试用户登录接口(示例)
    • 方法:POST
    • URL: http://localhost:8080/api/user/login
    • Body (raw JSON):
      {
        "username": "admin",
        "password": "123456"
      }
      
    • 预期:返回200状态码,以及包含用户信息和token的JSON数据。
  • 测试音乐列表查询接口
    • 方法:GET
    • URL: http://localhost:8080/api/song/list?page=1&size=10
    • 预期:返回200状态码和分页的音乐列表数据。

如果接口返回 401 Unauthorized ,可能需要先注册/登录获取token,并在请求头中添加 Authorization: Bearer your_token 。如果返回 404 ,检查接口路径是否正确。如果返回 500 ,查看后端控制台日志,通常是SQL错误或业务逻辑异常。

7. 配置与启动前端项目

前端需要知道后端API的地址,通常通过配置代理或直接修改API基地址来实现。

7.1 配置开发环境代理(推荐) frontend/vue.config.js 文件中(如果没有则创建),配置代理,将前端开发服务器的请求转发到后端。

// vue.config.js
module.exports = {
  devServer: {
    port: 3000, // 前端开发服务器端口,可自定义
    proxy: {
      '/api': { // 拦截以/api开头的请求
        target: 'http://localhost:8080', // 后端服务地址
        changeOrigin: true, // 允许跨域
        pathRewrite: {
          '^/api': '' // 重写路径,去掉/api前缀(根据后端接口实际情况调整)
        }
      }
    }
  }
}

7.2 启动前端开发服务器 frontend 目录下的终端中,运行:

npm run serve
# 或
yarn serve

启动成功后,终端会显示 App running at: ,通常为 http://localhost:3000 。用浏览器打开这个地址。

8. 功能测试与效果验证

现在,你可以通过浏览器访问 http://localhost:3000 来体验完整的音乐网站了。我们按模块进行功能测试。

8.1 用户模块测试

  • 注册 :访问注册页面,输入用户名、密码、邮箱等信息,点击注册。观察浏览器网络请求(F12 -> Network),查看是否向 /api/user/register 发送了POST请求并返回成功。随后检查数据库 user 表是否新增了记录。
  • 登录 :使用注册的账号登录。成功登录后,前端通常会将返回的token保存到localStorage或Cookie中。检查Application标签页下的Storage。页面应跳转到主页,并显示用户名。
  • 登出 :点击登出,确认token被清除,页面跳转回登录页。

8.2 音乐浏览与播放测试

  • 列表加载 :进入首页或音乐库页面,查看音乐列表是否正常加载(图片、歌名、歌手等信息)。检查网络请求是否调用了 /api/song/list
  • 搜索功能 :在搜索框输入关键词(如歌手名或歌曲名),查看列表是否实时过滤。检查网络请求参数。
  • 在线播放 :点击一首歌曲的播放按钮。观察:
    1. 是否发送了获取歌曲播放地址的请求(如 /api/song/url/{id} )。
    2. 浏览器的 <audio> 元素是否成功加载并播放音频。可以打开F12的Elements面板查看audio标签的src属性是否正确。
    3. 播放器的进度条、音量控制、暂停/播放功能是否正常。

8.3 歌单管理测试

  • 创建歌单 :点击“创建歌单”,输入名称和描述。确认请求发送到 /api/playlist/create ,数据库 playlist 表新增记录。
  • 添加歌曲到歌单 :在歌曲列表找到“添加到歌单”按钮,选择刚创建的歌单。确认调用 /api/playlist/add-song 接口。
  • 查看歌单详情 :进入“我的歌单”,点击某个歌单,页面应跳转并显示该歌单内的所有歌曲。检查是否请求了 /api/playlist/detail/{id}

8.4 文件上传测试(管理员功能) 如果项目包含后台管理,允许上传音乐文件:

  1. 准备一个小的测试音频文件(如MP3格式)。
  2. 在管理页面上传,填写歌曲信息。
  3. 观察文件是否上传到后端配置的目录(如 backend/upload/music/ ),同时歌曲信息(标题、歌手、文件路径)是否存入数据库 song 表。
  4. 上传后,刷新音乐列表,看新上传的歌曲能否显示和播放。

9. 接口API设计与调用分析

理解前后端交互的关键是分析API设计。以典型的RESTful风格为例:

用户登录接口分析

// 后端Controller示例
@RestController
@RequestMapping("/api/user")
public class UserController {
    @PostMapping("/login")
    public Result login(@RequestBody User user) { // @RequestBody接收JSON
        // 1. 校验用户名密码
        // 2. 生成JWT Token
        // 3. 返回Token和用户基本信息
        return Result.success(data);
    }
}
// 前端API封装示例 (src/api/user.js)
import request from '@/utils/request' // 通常是一个基于axios封装的工具

export function login(data) {
  return request({
    url: '/api/user/login', // 注意代理配置
    method: 'post',
    data // {username: '...', password: '...'}
  })
}
// 前端页面调用示例 (Login.vue)
import { login } from '@/api/user'
export default {
  methods: {
    handleLogin() {
      login(this.loginForm).then(response => {
        // 1. 保存token到本地存储
        localStorage.setItem('token', response.data.token)
        // 2. 跳转到首页
        this.$router.push('/')
      })
    }
  }
}

分页查询歌曲接口分析

// 后端Controller
@GetMapping("/song/list")
public Result listSong(@RequestParam(defaultValue = "1") Integer page,
                       @RequestParam(defaultValue = "10") Integer size) {
    PageHelper.startPage(page, size); // 使用PageHelper分页
    List<Song> list = songService.list();
    PageInfo<Song> pageInfo = new PageInfo<>(list);
    return Result.success(pageInfo);
}

前端调用时,只需传递 page size 参数即可。

10. 项目打包与部署

本地开发测试完成后,你可能需要将项目打包,部署到服务器或提供给他人运行。

10.1 后端打包 在IDEA的Maven工具栏,或直接在 backend 目录下执行命令,打包成可执行的Jar文件。

mvn clean package -DskipTests

打包成功后,在 backend/target/ 目录下会生成 music-backend-0.0.1-SNAPSHOT.jar 文件。

10.2 前端打包 frontend 目录下,运行构建命令,生成静态文件。

npm run build

构建完成后,会在 frontend/dist/ 目录下生成 index.html 和一系列静态资源(JS, CSS, 图片等)。

10.3 生产环境部署

  1. 后端 :将Jar包上传到服务器,使用 java -jar music-backend-0.0.1-SNAPSHOT.jar 启动。可以使用 nohup 或配置为systemd服务保持后台运行。 务必修改 application.yml 中的数据库连接为生产环境的地址和密码 ,可以通过 --spring.profiles.active=prod 指定生产配置文件。
  2. 前端 :将 dist 文件夹内的所有文件,上传到Nginx或Apache的Web目录下。需要配置Nginx,将前端请求代理到后端API,或者让前端直接访问后端公网IP/域名。
    # Nginx配置示例 (部分)
    server {
        listen 80;
        server_name your-domain.com; # 你的域名或IP
    
        location / {
            root /path/to/frontend/dist; # 前端静态文件路径
            index index.html;
            try_files $uri $uri/ /index.html; # 支持Vue Router的history模式
        }
    
        location /api/ {
            proxy_pass http://localhost:8080/; # 转发API请求到后端
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }
    }
    

11. 常见问题与排查方法

在部署和运行过程中,你很可能遇到以下问题:

问题现象 可能原因 排查方式 解决方案
前端 npm install 失败,网络错误或依赖冲突 1. 网络问题
2. Node.js版本不兼容
3. package-lock.json 冲突
1. 检查网络,可尝试使用淘宝镜像 npm config set registry https://registry.npmmirror.com
2. 检查 package.json 中的引擎要求
3. 删除 node_modules package-lock.json ,重装
使用 cnpm yarn 安装;确保Node版本符合要求;清理缓存重试
后端启动失败,端口被占用 8080端口已被其他程序(如其他Spring Boot应用)使用 控制台报错 Port 8080 was already in use 1. 终止占用端口的进程。
2. 在 application.yml 中修改 server.port 为其他端口,如 8090
后端启动失败,数据库连接异常 1. MySQL服务未启动
2. 数据库连接配置错误(IP、端口、库名、用户名、密码)
3. 驱动类未找到
查看启动日志中的具体错误信息,通常包含 Communications link failure Access denied 1. 启动MySQL服务。
2. 仔细核对 application.yml 中的 url , username , password
3. 检查pom.xml中MySQL驱动依赖。
前端页面能打开,但所有API请求都404 1. 后端服务未启动
2. 前端代理配置错误
3. 前后端部署在不同端口且存在跨域问题
1. F12打开浏览器控制台,查看Network中API请求的URL和状态码。
2. 确认后端服务地址和端口。
1. 确保后端服务已启动。
2. 检查 vue.config.js 中的 proxy 配置,确保 target 正确。
3. 如果直接访问后端IP,需在后端配置跨域 ( @CrossOrigin 或全局配置类)。
页面显示正常,但图片/音频无法加载 1. 文件路径错误
2. 静态资源未正确映射
3. 文件上传后路径未正确存入数据库
1. 检查浏览器Network中资源请求的URL。
2. 检查后端是否配置了静态资源映射 ( WebMvcConfigurer )。
1. 确保上传文件保存的路径能被外部访问。
2. 在后端配置类中添加资源映射,例如将 /upload/** 映射到本地文件目录。
登录成功,但后续请求返回401未授权 1. Token未正确携带在请求头中
2. Token过期
3. 后端拦截器配置有误
1. 检查F12的Network,查看请求头是否有 Authorization: Bearer token
2. 检查前端请求拦截器代码。
1. 在前端请求拦截器(如axios的 request interceptor )中统一添加token。
2. 实现Token刷新逻辑或提示用户重新登录。
上传文件时提示“文件过大” Spring Boot默认文件上传大小限制(通常为1MB) 查看后端日志 application.yml 中调整 spring.servlet.multipart.max-file-size max-request-size

12. 项目扩展与最佳实践

在成功运行基础项目后,你可以考虑以下方向进行扩展和优化,这会让你的项目更具竞争力:

  1. 引入状态管理 :对于稍复杂的应用,使用 Vuex Pinia 来集中管理用户登录状态、播放状态(当前播放歌曲、播放列表、播放模式)等,避免组件间复杂的传值。
  2. 完善播放器 :使用更强大的音频库如 howler.js aplayer ,实现歌词同步、播放列表循环模式(单曲、列表、随机)、播放进度保存等功能。
  3. 增强安全性
    • 后端 :使用Spring Security或JWT更细致地管理权限(如普通用户、VIP、管理员)。对用户密码进行加盐哈希存储(使用BCryptPasswordEncoder)。
    • 前端 :对路由进行权限守卫,不同的用户角色看到不同的菜单和页面。
  4. 优化性能与用户体验
    • 图片懒加载 :在歌曲列表、歌手封面等地方使用懒加载。
    • API数据缓存 :对于不常变的数据,可以在前端或后端加入缓存机制。
    • 分页与虚拟滚动 :歌曲列表数据量大时,确保分页有效,或考虑虚拟滚动列表。
  5. 容器化部署 :使用 Docker Docker Compose 将MySQL、后端、前端分别容器化,实现一键部署和环境隔离,极大简化部署流程。
  6. 加入简单的推荐功能 :基于用户收藏或播放历史,实现一个“猜你喜欢”的简单推荐模块,可以通过协同过滤的基本思想在后台实现。
  7. 代码优化
    • 后端 :规范全局异常处理、统一响应格式、使用DTO进行前后端数据交互、合理使用事务。
    • 前端 :组件化拆分,提取可复用的UI组件和业务逻辑;API请求统一封装,便于错误处理和加载状态管理。

这个音乐网站项目提供了一个绝佳的 全栈开发沙盒 。它的价值不在于功能有多炫酷,而在于清晰地展示了一个现代Web应用从数据库到前端页面的完整数据流和技术整合方案。建议你在跑通基础功能后,不要止步于此,而是选择上述一两个扩展点进行实践,这能让你对技术的理解从“会用”深入到“为什么这样用”和“怎样用得更好”。把遇到的问题和解决方案记录下来,这就是你最好的学习笔记和面试素材。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐