ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

基于Java+SpringBoot+Vue的音乐网站毕业设计全栈解析

基于Java+SpringBoot+Vue的音乐网站毕业设计全栈解析 简介这是一套面向计算机专业本科生的高分毕业设计级音乐网站全栈项目适用于毕设开题、课程设计与期末大作业实战解决学生缺乏完整Web项目经验、前后端协同开发能力薄弱等实际问题。资源包共704个文件涵盖81个Java后端核心类、36个Vue前端组件、153个JS交互逻辑、44个CSS样式文件、79个GIF动效资源及1个完整SQL数据库脚本辅以bat一键部署脚本、yml配置文件与论文文档压缩包仅22.93MB结构清晰、模块解耦明确。已有58人学习下载项目经导师验收通过并严格调试确保在IDEAMavenMySQL 5.7Navicat环境下开箱即用。用户可直接获取含用户中心、歌单管理、在线播放、搜索评论、后台权限控制等全功能源码配套毕业论文详述架构设计与测试过程同时提供Bak备份文件与多版本静态资源便于版本比对与故障回溯。 先说说这个项目。每年毕业季都能看到大量类似的选题——“音乐网站”“在线点歌系统”“校园音乐平台”但很多同学拿到源码后第一反应是代码能跑但答辩时说不清楚或者想改功能却不知道从哪下手。如果你手上正好是这个基于JavaSpringBootVueMySQL的音乐网站项目或者打算参考这个方向做毕业设计这篇文章按我自己的实操经验帮你把整条链路拆开讲透项目结构、数据库设计、后端接口、前端播放器、论文写法、部署踩坑全部覆盖。这类项目之所以成为“高分毕业设计”热门核心原因是它把主流技术栈完整串起来了SpringBoot解决后端业务逻辑Vue负责前端交互MySQL存数据再加上文件上传、登录鉴权、分页搜索、播放器封装这些真实业务场景既有技术深度又有完整业务闭环。无论你是想搞懂代码后去答辩还是想二次开发这篇文章都能给你一份可以直接抄作业的路线图。1. 项目整体设计先搞清楚这个系统到底包含什么1.1 核心需求解析音乐网站的用户视角其实很简单能注册登录能浏览歌手和歌单能搜索歌曲能点播放能收藏和评论。但把这些需求翻译成系统功能就变成了一组非常典型的Web开发问题用户身份怎么管理——注册、登录、会话保持、权限区分音乐文件存哪里——本地磁盘、云存储还是数据库BLOB播放记录和收藏怎么关联——多表关联查询搜索怎么做——模糊查询、分页、排序前端播放器怎么实现——音频标签封装、切歌、歌词滚动所以当你把这个项目拆开看它本质上是一个“标准业务系统多媒体处理”的混合体。这也正是适合做毕业设计的原因覆盖的知识点足够多每个点又有明确的解决方案不至于做不出来也不会太简单。我见过的这个标题下的典型项目角色一般分两种管理员和普通用户。管理员负责歌曲上传、歌手管理、歌单编辑用户负责听歌、收藏、评论、查看排行榜。前后端分离的架构下两个角色共用同一套后端API通过JWT或者Session区分身份和权限。1.2 项目目录结构解读源码拿到手之后先别急着跑先看目录。一个规范的SpringBootVue项目一定分两个大目录后端通常叫server、backend、music-server之类前端通常叫web、webapp、music-web之类。后端标准结构src/main/java/com/example/music ├── controller // 接口层 │ ├── UserController.java │ ├── SongController.java │ ├── SingerController.java │ └── SongListController.java ├── service // 业务逻辑层 │ ├── UserService.java │ └── impl ├── mapper // MyBatis的Mapper接口 ├── entity // 实体类 ├── config // 配置类跨域、拦截器、文件上传 ├── common // 统一返回结果、异常处理 └── utils // JWT工具、MD5加密等前端标准结构src ├── api // 封装所有axios请求 ├── assets // 静态资源图片、CSS ├── components // 公共组件播放器、导航栏 ├── router // 路由配置 ├── store // Vuex状态管理 ├── views // 页面组件 │ ├── Home.vue │ ├── Login.vue │ ├── SingerDetail.vue │ └── SongListDetail.vue ├── App.vue └── main.js如果你拿到的源码不是这个结构也没关系重要的是能快速定位三件事数据库脚本在哪里、后端配置文件在哪里、前端接口请求写在哪里。这三处搞清楚了项目基本就能跑起来、改得动。1.3 为什么说这套架构合理SpringBootMyBatis做后端的好处是上手快、生态成熟。MyBatis比JPA更容易控制SQL尤其是音乐网站这种涉及多表查询、模糊搜索、统计排行的场景手写SQL反而更直观。Vue做前端组件化开发播放器、歌单卡片、评论列表都能拆成独立组件复用。MySQL存结构化数据配合文件系统存音频文件性能足够应付毕设级别的并发量。这套组合是经过大量项目验证的“稳妥路线”不会给你整出什么幺蛾子。你要真换成了微服务架构或者前后端都上TypeScript反而可能因为调试复杂影响进度得不偿失。2. 数据库设计音乐网站的核心是表关系2.1 数据表整体规划数据库是整个项目的地基。我见过不少同学上来就写代码写到评论功能的时候发现表结构设计不合理用户表和评论对不上被迫回去重构浪费大量时间。所以先花两小时把表设计好后面所有功能都会顺很多。一个完整的音乐网站数据库至少包含这些核心表表名用途关键字段admin管理员表id, name, passworduser用户表id, username, password, avatar, phone, emailsinger歌手表id, name, avatar, sex, birth, location, introductionsong歌曲表id, singer_id, name, introduction, create_time, update_time, pic, lyric, urlsong_list歌单表id, title, pic, style, introductionsong_list_song歌单歌曲关联表id, song_list_id, song_idcomment评论表id, user_id, song_id, song_list_id, content, create_timecollect收藏表id, user_id, type, song_id, song_list_id, create_time注意歌单和歌曲之间是多对多关系所以必须有一个中间表song_list_song。这是数据库设计里最基础也最常考的知识点答辩的时候老师很喜欢问这个——为什么需要中间表因为它能拆解多对多关系避免数据冗余。2.2 关键表设计细节用户表里password字段我建议存MD5加密后的密文而不是明文。SpringBoot自带的DigestUtils可以一行代码搞定String encryptedPassword DigestUtils.md5DigestAsHex(password.getBytes());这样即使数据库泄露用户密码也不会直接暴露。答辩时主动提一句“密码做了MD5加密存储”会显得你安全意识到位。歌曲表里singer_id和singer表关联歌曲封面和音频文件都存URL路径而非文件本身。原因很简单如果存BLOB二进制数据数据库体积会迅速膨胀备份和查询性能都会受影响。更合理的做法是文件上传到服务器本地目录或云存储数据库只保存访问路径。这也是企业开发的标准做法值得在论文里写一笔。歌单表里的style字段用来标注歌单分类流行、民谣、摇滚、电子等这个字段在首页按分类筛选歌单时非常有用。如果想让首页有排行榜功能可以在song表加一个play_count字段每次播放时自增查询时按它倒序排序就是最简单的“播放排行榜”了。2.3 SQL脚本怎么组织和执行源码带的数据库文件一般是.sql格式可能叫music_db.sql也可能是init.sql。用Navicat或者MySQL命令行执行都行mysql -u root -p music_db.sql执行成功后用show tables;确认一下表是否都建出来了。这里有个小坑如果你的MySQL是8.0版本而项目用的数据库驱动是5.x版本启动会报时区错误。后面“常见问题”章节我会专门讲这个问题。3. 后端核心实现SpringBoot接口开发的几个关键环节3.1 统一返回结果与跨域配置先做基础设施。后端接口不应该直接返回裸数据而是统一包装成一个JSON结构体前端才好统一处理错误码和错误信息。这个在项目里通常叫Result、ResponseBean或者ApiResponse。核心代码长这样Data public class ResultT { private Integer code; private String message; private T data; public static T ResultT success(T data) { ResultT result new Result(); result.setCode(200); result.setMessage(操作成功); result.setData(data); return result; } public static T ResultT error(String message) { ResultT result new Result(); result.setCode(500); result.setMessage(message); return result; } }前端拦截器拿到code为200的响应就走成功逻辑否则弹message提示。这个模式是所有前后端分离项目的通用做法答辩时肯定会问要能说清楚。跨域问题必须提前处理。前后端分离开发时前端跑在8080端口后端跑在8081不同端口之间的请求会被浏览器拦截这就叫跨域。在后端写一个配置类统一处理Configuration public class CorsConfig implements WebMvcConfigurer { Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping(/**) .allowedOriginPatterns(*) .allowedMethods(GET, POST, PUT, DELETE, OPTIONS) .allowedHeaders(*) .allowCredentials(true) .maxAge(3600); } }不配置这个前端axios请求必报“CORS error”这是新手最常见的报错之一。3.2 登录鉴权JWT还是Session音乐网站的用户登录通常用JWTJSON Web Token方案。基本思路是用户登录成功后后端生成一个包含用户信息的Token返回给前端前端存在localStorage里后续每次请求都在请求头带上这个Token。后端通过拦截器解析Token判断用户是否登录。Token生成可以用jjwt库核心代码如下String token Jwts.builder() .setSubject(userId.toString()) .setExpiration(new Date(System.currentTimeMillis() 3600 * 1000)) .signWith(SignatureAlgorithm.HS256, secretKey) .compact();拦截器中解析Claims claims Jwts.parser() .setSigningKey(secretKey) .parseClaimsJws(token) .getBody();这里注意secretKey要放在配置文件里不要硬编码在代码里。虽然对毕设来说无所谓但这个习惯能让代码更规范。JWT方案的好处是不需要在服务端保存会话状态天然适合前后端分离。3.3 文件上传音乐和图片怎么处理音乐文件上传是整个项目里最容易被忽略、但实现起来坑最多的功能。SpringBoot实现文件上传很简单PostMapping(/upload) public ResultString upload(RequestParam(file) MultipartFile file) { if (file.isEmpty()) { return Result.error(上传文件为空); } String originalFilename file.getOriginalFilename(); String extension originalFilename.substring(originalFilename.lastIndexOf(.)); // 用UUID重命名避免中文文件名和重名问题 String fileName UUID.randomUUID().toString().replace(-, ) extension; String filePath uploadDir File.separator fileName; file.transferTo(new File(filePath)); return Result.success(/files/ fileName); }几个我踩过的坑必须提醒你文件名要用UUID重命名否则用户上传一个叫“周杰伦-晴天.mp3”的文件服务器存储时可能因为编码问题乱码上传目录要提前创建好最好在application.yml里配置一个上传路径常量要限制文件大小SpringBoot默认单文件最大1MB听歌的mp3动辄几MB甚至几十MB不调大会直接报错在application.yml这样配置spring: servlet: multipart: max-file-size: 100MB max-request-size: 100MB3.4 核心接口一览后端接口设计要做到“一个功能一个接口”命名清晰。音乐网站最常用的接口大概是这些功能请求方式接口路径用户注册POST/user/register用户登录POST/user/login歌手列表GET/singer/list添加歌手POST/singer/add歌曲分页查询GET/song/page?pageNum1pageSize10歌曲模糊搜索GET/song/search?keyword晴天按歌手查歌曲GET/song/singer/{singerId}添加歌曲POST/song/add歌单列表GET/songList/list歌单详情GET/songList/detail/{songListId}收藏歌曲POST/collect/add获取用户收藏GET/collect/user/{userId}评论列表GET/comment/list/{songId}发布评论POST/comment/add播放量自增PUT/song/updatePlayCount/{songId}统计歌手数量GET/statistics/singerCount接口路径的设计其实是有讲究的RESTful风格会让代码更整洁。但有的源码喜欢用/xxxController/xxx这种风格也不是不行主要看团队约定。毕业设计只要前后端能对上风格统一就没什么大问题。4. 前端实现Vue项目和播放器组件的细节4.1 前端环境与路由搭建前端基于Vue可能是Vue2也可能是Vue3。Vue2用Vue Router 3.xVue3用Vue Router 4.xAPI有点差别。拿到源码后先看package.json里的依赖版本避免明明照着文档写却报错。路由配置的核心是页面导航结构。音乐网站一般会有这些页面const routes [ { path: /, component: Home, meta: { title: 首页 } }, { path: /login, component: Login }, { path: /register, component: Register }, { path: /singer, component: SingerList }, { path: /singer/:id, component: SingerDetail }, { path: /songList, component: SongList }, { path: /songList/:id, component: SongListDetail }, { path: /search, component: SearchResult }, { path: /profile, component: UserProfile } ]4.2 Axios请求封装前端所有请求建议统一走一个封装好的axios实例而不是每个组件里面都写一堆重复代码。基本的封装思路import axios from axios const request axios.create({ baseURL: /api, timeout: 10000 }) // 请求拦截器自动携带token request.interceptors.request.use(config { const token localStorage.getItem(token) if (token) { config.headers.Authorization token } return config }) // 响应拦截器统一处理错误码 request.interceptors.response.use(response { const res response.data if (res.code ! 200) { alert(res.message) return Promise.reject(new Error(res.message)) } return res }) export default request前端开发时还有个很常见的难题接口路径必须配代理不然跨域。在vue.config.js里配置module.exports { devServer: { proxy: { /api: { target: http://localhost:8081, changeOrigin: true, pathRewrite: { ^/api: } } } } }这样前端请求/api/xxx时开发服务器会自动转发到后端8081端口绕开跨域限制。4.3 播放器组件的实现思路播放器是音乐网站前端最核心的部分也是答辩时最能展示技术亮点的模块。实现思路通常是先用HTML的audio标签做基础播放能力audio refaudioPlayer :srccurrentSong.url endedhandleEnded timeupdatehandleTimeUpdate/audio然后封装成一个全局播放器组件Player.vue放在所有页面的下方固定定位这样切换页面时音乐会继续播放。这个体验非常接近真实音乐App。核心控制逻辑如下methods: { playSong(song) { this.currentSong song this.isPlaying true this.$nextTick(() { this.$refs.audioPlayer.play() }) }, togglePlay() { const audio this.$refs.audioPlayer if (audio.paused) { audio.play() this.isPlaying true } else { audio.pause() this.isPlaying false } }, handleEnded() { // 自动播放下一首 this.nextSong() }, handleTimeUpdate() { this.currentTime this.$refs.audioPlayer.currentTime this.duration this.$refs.audioPlayer.duration this.progress (this.currentTime / this.duration) * 100 } }歌词滚动是另一个加分项。实现方式不复杂把歌词按时间戳解析成数组监听timeupdate事件根据当前播放时间高亮对应歌词行。难点在于歌词格式的解析常见的歌词格式是[00:15.20]窗外的麻雀 [00:19.80]在电线杆上多嘴解析代码可以用正则parseLrc(lrcText) { const lines lrcText.split(\n) return lines.map(line { const match line.match(/\[(\d{2}):(\d{2})\.(\d{2})\](.*)/) if (match) { return { time: parseInt(match[1]) * 60 parseFloat(match[2] . match[3]), text: match[4] } } }).filter(item item) }这个解析逻辑写好了歌词组件基本就成了。答辩时讲到这老师会认为你的前端功底很扎实。4.4 搜索、推荐与交互细节搜索功能在前端就是一个输入框加一个结果列表关键是防抖。用户输入一个关键词如果不做防抖每敲一个字母都会发起请求后端压力大体验也不好。防抖的思路是用户停止输入300毫秒后才真正发起请求watch: { keyword() { clearTimeout(this.timer) this.timer setTimeout(() { this.search(this.keyword) }, 300) } }推荐功能如果是简单的“猜你喜欢”可以做少量代码实现根据用户收藏歌手或歌单style去song表里查同类型的歌曲随机返回几条。完整的推荐算法对毕业设计来说没必要但你可以写“基于用户行为的简单协同过滤思路”到论文里提升一点理论高度。5. 论文内容怎么组织结构与工作量展示5.1 论文大纲设计这个项目的论文一般要写五到六章常见的结构第一章绪论研究背景、意义、国内外现状、论文结构第二章相关技术介绍SpringBoot、Vue、MySQL、前后端分离架构第三章系统需求分析可行性分析、功能需求、非功能需求、用例图第四章系统设计架构设计、功能模块设计、数据库设计、接口设计第五章系统实现每个功能模块的运行截图和核心代码说明第六章系统测试功能测试用例表、结论第七章总结与展望这样的结构完整覆盖了完整的软件工程流程从需求、设计、实现到测试逻辑闭环答辩时也更好讲。很多同学写论文时最常见的错误是把代码大段粘贴上去既没有解释也没有逻辑。论文里代码必须配合文字说明比如“如图5-3所示播放器组件通过监听audio标签的timeupdate事件实现播放进度实时更新”而不是干巴巴扔代码块。5.2 如何让论文看起来工作量更足评审老师最在意的是“这个学生是不是真的动手做了”。有几个技巧可以让你在不动代码的情况下论文看起来更充实第一画图和表。E-R图、用例图、系统架构图、流程图这些图对论文的充实度贡献巨大。如果源码里没带图用ProcessOn或draw.io自己画一遍反而还能加深理解答辩的时候被问到也能讲清楚。第二功能测试表要写全。每一个模块的测试用例都列清楚测试编号、测试功能、操作步骤、预期结果、实际结果、是否通过。这个表格看似机械但能实实在在增加好几页工作量。第三结论部分不要光说空话。写“本系统完成了用户管理、歌曲管理、歌单管理、评论管理、收藏管理五大功能模块经过测试达到了预期设计目标”比写“本系统设计了一个功能完善的音乐网站”要具体得多。5.3 答辩准备的核心问题音乐网站项目答辩老师大概率会问这几个问题提前准备好答案为什么选择前后端分离架构答前端部署在Nginx后端独立部署职责清晰开发效率高且便于后续扩展Token过期了怎么办答前端通过响应拦截器判断401状态码跳转登录页刷新Token如果有10万用户同时在线播放系统会怎样答当前架构单体会出现瓶颈可通过加缓存、CDN加速、文件存储到OSS等方式优化你怎么保证上传文件的安全性答限制了文件类型白名单、大小限制存储时用UUID重命名避免路径穿越这些问题不一定都考但准备充分了底气就会足很多。最怕的就是自己写的代码自己不看答辩时被问到源码细节一脸懵。6. 环境部署从零把项目跑起来6.1 基础环境准备跑这项目前需要JDK 8或11、Maven 3.6、MySQL 5.7或8.0、Node.js 14Vue3项目需要更高版本。JDK安装后记得配置JAVA_HOME环境变量export JAVA_HOME/usr/lib/jvm/java-11-openjdk-amd64 export PATH$PATH:$JAVA_HOME/binMySQL安装后新建一个数据库CREATE DATABASE music_db DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;注意一定要用utf8mb4而不是utf8否则歌曲名里有特殊符号或者Emoji时会报错或者乱码。6.2 后端启动步骤后端启动流程用IDEA打开后端项目等待Maven下载依赖修改application.yml里的数据库用户名密码执行SQL脚本初始化数据库启动Application.java中的main方法看到SpringBoot启动成功的日志访问http://localhost:8081验证你可能会遇到Maven下载依赖特别慢的问题。解决办法是把Maven镜像换成国内源在Maven安装目录下的conf/settings.xml里配置mirror idaliyuncentral/id mirrorOfcentral/mirrorOf urlhttps://maven.aliyun.com/repository/public/url /mirror不换镜像的话等依赖下载可能就要半小时是很多新手第一次跑项目就劝退的关键原因。6.3 前端启动步骤前端启动流程cd 前端目录 npm install npm run servenpm install如果因为网络问题失败同样可以换成国内镜像源npm config set registry https://registry.npmmirror.com启动成功后终端会显示访问地址通常是http://localhost:8080。打开浏览器如果能看到首页说明项目已经跑起来了。播放功能如果出现音频无法加载的问题先打开浏览器F12看Network面板里歌曲文件的请求路径是否正确再确认上传目录里面是否有文件。大概率是文件存储路径不对或者上传目录没建。7. 常见问题与排查技巧都是实际踩过的坑7.1 数据库连接失败问题报错信息里出现Access denied for user rootlocalhost说明数据库用户名或密码不对。检查application.yml里配置的spring.datasource.username和password与实际MySQL账号是否一致。出现Public Key Retrieval is not allowed这个报错是因为MySQL 8.0的认证插件问题。在JDBC连接参数里加一行url: jdbc:mysql://localhost:3306/music_db?useSSLfalseallowPublicKeyRetrievaltruecharacterEncodingutf-8很多拿到源码跑不起来的同学八成都是卡在这个地方。这个参数在网上被讨论得很多因为MySQL 8.0默认使用caching_sha2_password认证插件部分工具和驱动配置不合适就会报错。7.2 前端页面接口报404页面上能看到UI但所有数据都不加载打开控制台全是404。这种情况基本都是代理配置问题。检查一下axios请求的baseURL是不是/api开头vue.config.js里的proxy配置是否指向了正确的后端地址。如果你是直接用浏览器访问http://localhost:8080/api/user/list那是走不通的。代理只在开发服务器内部生效直接浏览器访问不会转发到后端。这种场景下还有一个容易忽略的问题——浏览器缓存。改了代理配置后经常需要硬刷新CtrlShiftR或者重启开发服务器才能生效。我在开发时踩过好几次改完配置后刷新页面还是旧逻辑一度怀疑人生。7.3 播放器无法播放音频音频不能播放先分三步排查确认歌曲文件确实上传成功路径正确确认audio标签的src路径可以直接在浏览器访问确认mp3文件本身没有损坏还有一个非常隐蔽的坑如果后端返回的歌曲URL是相对路径比如/files/xxx.mp3但前端部署在另一台服务器或者不同端口下相对路径就会解析错误。解决办法是通过接口返回完整的URL或者在前端拼接后端地址songUrl http://localhost:8081 song.url7.4 热更新失效问题Vue开发时改了代码页面不自动刷新十有八九是node_modules出了问题。删掉node_modules和package-lock.json重新npm install一遍就好。偶尔也会碰到Vite和Webpack版本冲突的问题那就需要看项目是Vue CLI创建还是Vite创建对应调用不同的启动命令。7.5 端口被占用启动报错Port 8081 was already in use说明端口被占用了。查一下占用进程netstat -ano | findstr 8081 # Windows lsof -i:8081 # macOS/Linux然后杀掉对应进程或者改application.yml里的server.port配置换一个端口。开发阶段端口换来换去容易导致前端代理配置不同步所以建议优先杀掉占用进程而不是改端口。8. 项目二次开发从毕设到“加分项”8.1 可以加哪些亮点功能如果时间和精力允许给项目加一两个亮点功能会明显提升毕业设计的评价。我建议从这几个方向考虑第一加音乐评论的嵌套回复。现在很多源码里的评论是单层的只支持直接评论。加上回复功能就需要设计parent_id字段前端做递归渲染难度适中但非常出效果。第二加用户听歌记录。新建一张listen_history表记录用户每次播放歌曲的时间和时长。前端展示“最近播放”列表用户感觉系统智能不少。第三加歌曲MV播放。在song表加一个mv_url字段前端播放器旁边加一个MV模式切换按钮。技术实现上就是切换视频和音频源逻辑不复杂但视觉效果很丰富。第四加数据可视化统计。管理员端用ECharts展示歌曲播放量排行榜、分类占比饼图、用户增长折线图。这让项目从“业务系统”升级到“带数据分析的系统”技术档次不一样。8.2 前端UI优化的几个方向源码自带的UI一般都比较朴素如果你想在视觉上加分可以做几件成本不高的事换一套更现代的中文字体比如HarmonyOS Sans或阿里巴巴普惠体给播放器加上旋转唱片动画纯CSS就能实现视觉冲击力却很强用CSS Grid重构歌单卡片布局让卡片在不同屏幕尺寸下自动排列给页面切换加上简单的过渡动画一个漂亮的界面在答辩现场是能直接打动评委的。因为老师也是人看着舒服的项目会下意识打更高分。8.3 云部署让项目跑在服务器上如果想把项目部署到云服务器上增加“公网可访问”这个亮点通常的做法是后端打包成jar包mvn clean package -DskipTests java -jar music-server.jar前端构建成静态文件npm run build构建产物在dist目录用Nginx托管server { listen 80; server_name your-domain.com; location / { root /var/www/music-web; index index.html; try_files $uri $uri/ /index.html; } location /api/ { proxy_pass http://localhost:8081; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } location /files/ { alias /data/music-upload/; } }这里有个关键细节Vue是单页应用路由用的history模式时刷新页面会404所以必须配try_files指向index.html。这行配置不写前端的路由刷新就出问题。这也是部署时最常踩的坑。最后分享一点个人体会我处理过不少类似的项目发现一个共性规律真正能在答辩中拿高分的同学不是代码写得最好的而是对自己项目理解最透彻的。拿到源码之后不管你有没有时间都要把代码从头到尾读一遍。不用每个类都精读但至少要走通一条完整链路用户点登录按钮请求发出到后端Controller接收参数、Service处理逻辑、Mapper查询数据库、返回JSON再到前端解析渲染提示。这个链路走通了项目的框架你就算掌握了。另外如果你打算在这个项目上做二次开发我的建议是先从最简单的功能改起比如调整一下首页展示逻辑加一个分类筛选。改完第一个功能之后你就会发现这个项目不再是别人的代码而变成了自己的作品。这种手感很重要也会直接影响你的答辩表现。还有一个小技巧不管你最终是否部署到服务器都建议提前在本地演练一遍部署流程。把数据库重新导入一遍后端重新打包启动前端重新npm run build确认整个流程没有报错。很多毕业设计的最终成果需要现场演示提前演练能避免当天临时出问题导致的尴尬。本文还有配套的精品资源点击获取
返回列表