恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
SpringBoot+Vue前后端分离专辑鉴赏网站:从毕设选题到答辩全流程实战
首页
资讯中心
/
SpringBoot+Vue前后端分离专辑鉴赏网站:从毕设选题到答辩全流程实战
SpringBoot+Vue前后端分离专辑鉴赏网站:从毕设选题到答辩全流程实战
发布时间:2026/10/18 6:21:31
从毕设选题想到脑袋空空到最终把一个代码量不大但五脏俱全的专辑鉴赏网站跑通上线整个过程里踩过的坑和学到的经验我觉得比项目本身更值得拿出来聊聊。如果你正面临Java Web方向的毕业设计或者打算用SpringBootVue做一套前后端分离的完整系统那这篇内容就是冲你来的。我不会给你贴一大段项目结构图然后让你自己琢磨而是把这个项目从题目拆解、数据库设计、接口规划、前端实现到本地跑通、答辩准备的全流程用实际操作过的视角给你捋一遍。我做的这套项目源码里包含了完整的SpringBoot后端、Vue前端、SQL建库脚本以及接口文档整体覆盖了管理员端和用户端的核心业务场景专辑信息管理、歌手维护、用户注册登录、专辑评分、评论互动、收藏专辑、个人中心、数据统计等。文章不会只停留在项目有什么功能这个层面我会把每个模块背后为什么要这样设计也讲清楚。对于即将动手写毕设或者想拿这个项目做二次开发的同学这篇文章可以帮你节省大量瞎试错的时间。1. 毕设选题与技术栈选型为什么最终做成专辑鉴赏而不是老套的管理系统先说选题这件事。很多同学在毕设开题阶段纠结得不行常见的思路是做一个XX管理系统图书管理、宿舍管理、教务管理……这些题目的问题是业务逻辑太单薄光有个增删改查撑不起答辩时老师问的你的系统亮点是什么。我当时换了个思路能不能做一个既是内容展示平台、又带用户互动、还带数据统计的项目专辑鉴赏网站平台就是在这个逻辑下敲定的。1.1 专辑鉴赏这个业务场景的天然优势专辑鉴赏网站的定位是音乐爱好者浏览专辑信息、发表评价、互相交流的垂直社区。它和普通管理系统的区别在于——系统里既有偏后台管理的部分管理员维护歌手、专辑、轮播图又有偏前台展示的部分用户浏览专辑详情、看评分、写评论、收藏专辑还有一种用户生产内容的互动属性。这意味着数据库设计能有更多表、接口设计能体现更多层次的权限控制、前端页面也能做得更有设计感。答辩的时候老师随便往哪个方向问你都有东西可以展开。从技术覆盖面上说这个项目把Java Web阶段应该掌握的关键点都串起来了后端用SpringBoot搭建RESTful接口涵盖JWT登录认证、参数校验、全局异常处理、分页查询、多表关联查询这些高频考点前端用Vue全家桶实现单页应用涉及组件通信、路由守卫、Axios拦截器、响应式数据绑定的实际运用数据库层面涉及五张以上的核心业务表有外键关联、唯一约束、聚合统计查询比如算专辑平均分这个配置对于毕设来说不会显得内容单薄同时工作量又是可控的——一个认真写的同学大概三到四周能完成核心功能不夸张。1.2 SpringBoot Vue前后端分离的选型逻辑现在的Java Web毕设前后端分离基本是默认选项了选择SpringBoot Vue的原因很实在。后端用SpringBoot核心价值在于约定大于配置。以前用SSH、SSM框架写项目光XML配置都要堆半天SpringBoot把大部分繁复配置都自动化了你能把精力集中在写业务逻辑上。同时它内置Tomcat打包成Jar就能跑部署演示都方便这对毕设环境非常友好。前端用Vue原因是上手曲线平缓、生态成熟、社区资料多。Vue的双向数据绑定让你不用操作DOM就能处理表单和展示逻辑Element UI组件库又直接提供了表格、表单、弹窗、分页这些现成组件。后端返回JSON数据前端绑定渲染就这么简单。有人会问为什么不用前后端不分离的模板引擎方案比如Thymeleaf我的看法是毕设需要体现你掌握的是当前企业的主流开发模式。前后端分离这一套下来你的简历上可以明确写熟悉前后端分离开发模式、了解跨域处理与JWT认证这是加分项。提示如果你所在学校规定了技术栈先看清要求。但多数情况下SpringBoot Vue是导师们默认认可的主流组合不太会出问题。2. 数据库设计带来的第一个大坑评分表怎么避免一用户多次打分数据库设计是这个项目里最值得花时间推敲的部分原因很简单——专辑鉴赏的核心业务是评分和评论而这两个功能对数据一致性的要求比普通管理系统要高。如果设计不当用户反复给同一张专辑打分平均分就会失真整个网站的鉴赏功能就失去意义了。2.1 核心表结构拆解与字段设计思路我的数据库一共设计了七张核心表从业务角色上分成两类第一类是基础数据表user表用户表存储用户账号信息包含username、passwordBCrypt加密存储、nickname、avatar、roleadmin/user、status是否被封禁singer表歌手表singer_name、avatar、introduction、is_deleted逻辑删除标记album表专辑表album_name、cover封面图URL、singer_id关联歌手、release_date发行日期、introduction、listener_count听过人数banner表轮播图表image_url、link_url、sort_order、status第二类是业务交互表rating表评分表user_id、album_id、score1-5分、create_time、update_timecomment表评论表user_id、album_id、content、parent_id用于回复、like_count、create_timefavorite表收藏表user_id、album_id、create_timealbum和singer用歌手ID关联一个歌手可以有多张专辑一对多关系。comment表的parent_id字段支持楼中楼回复也就是评论的嵌套这在毕设里是个可以拿出来讲的细节能达到设计考虑了评论的层级关系的答辩效果。2.2 评分功能的防重复设计以及一张表如何承载我的评分评分表最核心的设计点在于防止同一个用户对同一张专辑重复评分。我的方案是在rating表上建立联合唯一约束(user_id, album_id)。这个联合唯一约束的意义在于——数据库层面直接拦截了重复打分行为。不管前端有没有做按钮置灰只要用户再次提交评分数据库就会抛异常后端捕获后转换成业务提示您已经评价过这张专辑。前端通过查询rating表拿到当前用户对这张专辑的评分值用于回显星星数量如果是0说明还没评过直接展示评分交互组件即可。用表结构展示一下核心DDL精简版CREATE TABLE rating ( id bigint(20) NOT NULL AUTO_INCREMENT, user_id bigint(20) NOT NULL COMMENT 用户ID, album_id bigint(20) NOT NULL COMMENT 专辑ID, score tinyint(4) NOT NULL COMMENT 评分1-5, create_time datetime NOT NULL, update_time datetime NOT NULL, PRIMARY KEY (id), UNIQUE KEY uk_user_album (user_id, album_id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT专辑评分表;这里有个容易被忽略的点表要设置utf8mb4字符集。因为用户评论可能包含emoji表情比如太喜欢这张专辑了utf8mb4才能完整存储这类四字节字符。很多同学用默认的utf8结果用户发emoji就报错这个问题在答辩现场演示时出现会很尴尬。专辑的平均分不要存到album表里而是通过实时聚合查询得出SELECT album_id, ROUND(AVG(score), 1) AS avg_score, COUNT(*) AS rating_count FROM rating GROUP BY album_id;为什么不冗余存储因为评分数据量在毕设规模下很小聚合查询的性能完全没问题存储冗余反而面临评分更新时平均分也要同步更新的一致性问题。这个设计取舍同样可以在答辩时展开讲。2.3 SQL脚本里的测试数据别小看这件事项目里附带的SQL脚本除了建表语句我还准备了二十张左右的专辑数据、五六个歌手数据、一些带层级结构的评论数据。核心测试数据一定要准备足量且符合业务的比如评分数据要覆盖不同分数段这样前端图表展示时才有内容。千万别只放两三行测试数据就去跑项目页面空空荡荡的前后端联调的时候你根本看不出分页功能是否正确。3. 后端接口设计的完整思路模块划分、JWT认证与权限控制后端接口设计决定了整个项目的骨架。专辑鉴赏网站平台的后端需要提供的接口数量和复杂度都处在毕设项目的舒适区间——比纯CRUD多一些设计感又不至于像大型电商系统那样复杂到把控不住。3.1 模块划分五个业务模块对应五组接口我把后端接口按业务模块分成五组认证与用户模块注册、登录签发JWT Token、获取当前用户信息、修改个人信息、修改密码歌手与专辑模块歌手分页列表、歌手详情、专辑分页列表、专辑详情、专辑搜索按专辑名/歌手名模糊匹配评分模块提交评分、更新评分、查询当前用户对某专辑的评分评论互动模块发表评论、回复评论、专辑评论列表、删除评论收藏模块添加收藏、取消收藏、我的收藏列表权限控制上分两级无需登录即可访问查看专辑列表、专辑详情、歌手信息、评论列表必须登录才能访问提交评分、发表评论、收藏专辑、个人中心相关功能管理员单独一套接口放在/admin路径下管理员登录、歌手管理增删改、专辑管理增删改、轮播图管理、用户管理列表与封禁、评论删除3.2 JWT认证的实现要点拦截器里校验Token接口文档里说清用法JWT是当前前后端分离项目主流的认证方式选择它而不是Session核心原因是无状态。后端不存session用户登录成功后颁发一个Token字符串前端存到localStorage里每次请求在请求头带上Authorization: Bearer 后端拦截器解析并验证通过就放行失败就返回401状态码。核心实现是写一个HandlerInterceptor注册到SpringMVC拦截器链中指定拦截哪些路径、放行哪些路径。我的处理是所有路径都经过Token校验但配置了白名单放行登录注册和专辑浏览类接口。顺便说一句这种白名单放行范围拦截的思路在答辩时被问到如何实现登录拦截基本是必答项。后端还需要注意统一响应格式。我用的结构是{ code: 200, message: 操作成功, data: { } }code为200代表成功其他值对应不同错误类型401未登录、403无权限、500服务器异常。这个统一返回结构配合全局异常处理器RestControllerAdvice使用可以让前端拿到足够明确的错误提示信息不至于出现前端莫名其妙不知道发生了什么的情况。接口文档方面我采用Swagger注解自动生成接口文档swagger-annotations knife4j启动项目后访问文档地址即可看到所有接口的参数说明和返回值示例。后续我会再单独写一篇关于接口文档怎么配置的细节这里点到为止。接口文档存在的意义不仅是答辩材料更是你前端联调时的对接字典防止出现这个字段应该传什么格式的反复沟通成本。4. 前端页面实现里容易翻车的三个细节路由守卫、Axios拦截器与跨域代理前端这块很多人觉得是写界面把Element组件拼一拼就行。真实体验下来会发现真正影响开发效率的是几个基础工程问题——路由怎么控制跳转、请求怎么统一带Token和统一处理错误、开发环境跨域怎么解决。这三个问题解决好了页面写起来就非常流畅。4.1 前端路由分级与导航守卫前端路由设计成两级游客可访问的路由和需要登录才能访问的路由。游客路由包括专辑列表页、专辑详情页、歌手页、登录页和注册页。需要登录的路由包括个人中心、我的收藏、发表评论相关页面。实现上通过Vue Router的beforeEach导航守卫统一判断。每次跳转前读取localStorage里的Token如果目标路由在需要登录的列表里且没有Token就跳转到登录页并带上redirect参数登录成功后自动回跳。这个交互细节很常见但要实现得自然顺手还是得在守卫里多写几行代码。router.beforeEach((to, from, next) { const token localStorage.getItem(token) if (to.meta.requiresAuth !token) { next({ path: /login, query: { redirect: to.fullPath } }) } else { next() } })4.2 Axios拦截器一处处理全局生效前端所有请求都通过Axios发出。我封装了一个request.js文件核心是注册请求拦截器和响应拦截器。请求拦截器做的事是从localStorage取出Token设置到请求头Authorization字段上保证所有请求自动携带身份凭证不用在每个接口调用处重复写。响应拦截器做的事是拿到后端统一返回结构后先解构code字段如果code是200就返回data部分给业务代码用如果code是401说明Token过期或者未登录就清空本地Token并跳转登录页如果code是其他错误就通过Element Message组件统一弹出错误提示。这样业务代码里不用到处写try-catch和if-else判断可以说非常清爽。4.3 开发环境跨域Vite代理配置前后端分离开发时前端跑在8080端口后端跑在9090端口我用9090避免和前端8080冲突跨域问题是绕不开的。我采用的是前端开发服务器代理方案在Vue的vite.config.js里配置module.exports { devServer: { port: 8080, proxy: { /api: { target: http://localhost:9090, changeOrigin: true } } } }前端请求路径统一以/api开头开发服务器把/api开头的请求转发到后端地址。生产部署时则通过Nginx配置反向代理实现同样的效果。区别是开发环境用Vite代理解决跨域生产环境用Nginx解决跨域。这个点答辩时大概率会被问你要能说清楚两种方式各自的适用阶段。前端页面具体到专辑详情页我拆出来一个评分组件和一个评论组件。评分组件接收专辑ID挂载时向后端查询当前用户对该专辑的评分已评过就点亮相应颗数并禁止点击没评过就显示可点击的星星用户点击后调用提交评分接口。评论组件则包含评论输入框和评论列表列表项支持回复和点赞这个交互做出来页面就活了。5. 本地跑通整套项目的完整记录从环境准备到成功登录拿到源码后怎么把这个项目跑起来是绝大多数同学做的第一件事。这一步如果卡住后面全是白搭。我把实际操作流程整理成一份可复现的清单按步骤走基本不会出错。5.1 环境准备清单我本地的环境版本如下兼容性和稳定性都实测过软件版本备注JDK1.8企业主流版本稳定Maven3.6依赖管理工具MySQL5.7注意字符集设置为utf8mb4Node.js14需要npm命令IDEA任意近期版本后端开发IDEVSCode任意近期版本前端开发IDE5.2 后端启动的五个步骤第一步准备数据库。创建数据库并导入SQL脚本mysql -u root -p create database album_db default character set utf8mb4; use album_db; source /你的路径/album_db.sql;导入完成后检查一下表是否都建出来了以及测试数据是否存在。这一步出问题最多的就是字符集和导入路径问题路径别带中文。第二步修改配置文件。打开application.yml确认数据源配置与你本地MySQL一致spring: datasource: url: jdbc:mysql://localhost:3306/album_db?useUnicodetruecharacterEncodingutf8mb4serverTimezoneAsia/Shanghai username: root password: 你的密码注意serverTimezone必须设置否则高版本MySQL驱动会报时区错误。第三步用IDEA打开后端项目等待Maven下载依赖。第一次下载会比较慢建议配置阿里云Maven镜像加速这个不确定的同学可以搜一下配置方式基本是改一下settings.xml的事情。第四步启动项目。运行Application启动类观察到SpringBoot启动日志和Tomcat端口信息后保持运行。第五步验证接口。浏览器访问Swagger文档地址一般格式是 http://localhost:9090/doc.html能打开文档页面说明后端已经正常工作了。5.3 前端启动的两个命令用VSCode打开前端项目在终端执行npm install npm run devnpm install是安装package.json里声明的所有依赖这一步如果网络不好容易卡住同样建议配置npm国内镜像源。依赖安装完毕后npm run dev启动开发服务器默认打开8080端口浏览器访问 http://localhost:8080 就能看到首页了。前端项目实际启动后先用管理员账号登录一次再注册一个普通用户登录一次分别测试管理员路由和用户路由的权限控制是否正常。管理员账号和普通账号都涵盖在SQL脚本的初始数据里文档里写明了两者的初始密码。5.4 启动阶段最常见的三个报错与排查思路端口被占用。后端启动报Port already in use解决方案是修改application.yml中的server.port或者查占用进程并结束。cmd执行netstat -ano | findstr 9090拿到PID后在任务管理器结束进程即可。数据库连接失败。报Communications link failure或者Access denied。基本上是三种原因MySQL服务没启动用户名密码写错url里的数据库名和实际创建的库名不一致。按这个顺序排查一分钟能解决。前端请求404。页面能打开但列表数据为空打开浏览器F12看Network请求如果请求路径404检查前端proxy配置里的/api前缀是否匹配以及后端Controller的RequestMapping路径是否一致。简单说前端请求的后端路径要和后端实际暴露的路径完全对上。6. 答辩展示的重点准备从演示流程到高频问题应对代码和功能完成只是第一步毕业设计的最终展现形式是答辩。这个项目在答辩环节有天然的优势业务场景直观、技术点适中老师问起来你能讲出设计思路不会出现无话可说的场面。但前提是你要提前准备好演示脚本和问题预案。6.1 演示节奏先给全景再抓亮点我的建议是演示流程按照系统全景→核心功能→亮点细节的节奏来走。系统全景部分花三分钟展示首页、专辑列表、歌手页和专辑详情页让老师看到整个系统的完整度页面审美在线就加分。核心功能部分重点做两个操作一是用普通用户账号演示浏览专辑→查看评论→登录→评分→评论→收藏的完整链路说明前端交互和后端认证机制是怎么配合的二是切换到管理员账号演示专辑管理的新增、编辑、下架操作说明管理员和普通用户的权限边界。亮点细节部分直接展示评分防重复的设计。操作上就是同一个用户对同一张专辑再评一次分演示系统弹出您已经评价过这张专辑的提示。然后打开数据库rating表展示联合唯一索引字段。这个演示一分钟不到但能证明你不是只写了个增删改查而是真的思考了业务约束。6.2 老师高频问题的标准回答思路你们这个项目和现有的音乐App相比有什么优势注意别正面硬刚我们能超越XX要说清楚项目定位是垂直方向的鉴赏社区核心差异点是评分数据、用户评论的沉淀和专辑数据的管理后台本质上更接近一个带社区属性的数据库应用系统。JWT和Session有什么区别为什么选JWT回答核心JWT无状态服务端不需要存Session方便前后端分离和横向扩展缺点是Token无法主动失效有效期内被封禁的用户可能仍能访问。这道题考察的是你对认证方案的权衡理解。数据库的索引是怎样设计的回答核心主键索引innnoDB自动创建唯一索引用在评分表的(user_id, album_id)上保证业务约束普通查询字段如album表的album_name考虑添加普通索引。回答完可以补一句在毕设数据规模下设计核心是逻辑正确与约束清晰索引是辅助查询优化的手段。平均分为什么不用触发器维护回答核心评分数据量小实时聚合计算开销可接受用触发器会引入额外的维护复杂度一旦评分数据发生变化缓存/冗余字段的同步很容易出bug。这题问的是你懂不懂空间换时间的适用边界。6.3 二次开发可以往哪个方向扩如果还有富余时间想给项目加亮点这几个扩展方向的工作量和效果都比较划算基于评分数据的可视化统计在专辑详情页加入ECharts雷达图展示专辑在编曲、作词、演唱、风格等维度的评分分布用户影响力体系增加用户等级和勋章逻辑比如鉴赏家称号根据评论数和获赞数自动升级推荐逻辑基于用户收藏的歌手在首页展示同歌手其他专辑的推荐位基于标签的简单匹配就能跑专辑歌曲明细把专辑从只有整体信息扩展到包含曲目列表每首歌可以单独试听放静态音频文件即可这是比较直观的业务延伸这些扩展不需要大改现有架构都是在现有表结构和接口基础上做加法适合想在答辩中展示可持续迭代能力的同学。写在最后说点真实感受。这个项目做完我最大的体会不是我会用SpringBoot和Vue了而是搞明白了一个业务系统的数据是怎么流动的。从前端页面的一次点击到Axios发出请求经过后端Controller、Service、Mapper落到数据库再原路返回整条链路清清楚楚。毕设的价值就在这个地方——它逼着你自己串一遍这条链路而背面试题是永远背不出这种感觉的。如果你现在正被毕设折磨我建议你别焦虑。把项目拆成数据库→后端接口→前端页面三层一层一层去攻克每完成一层你都会觉得没那么吓人。本项目里的SQL脚本和接口文档都是现成的你拿到手的第一步是先把流程跑通然后再去读代码、拆逻辑最后按自己的想法做修改。改代码的过程才是最涨功力的过程。祝顺利。