ARTICLE DETAIL

资讯详情

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

SpringBoot+Vue+MySQL音乐网站项目:从环境搭建到部署答辩全攻略

SpringBoot+Vue+MySQL音乐网站项目:从环境搭建到部署答辩全攻略 简介这是一套面向计算机专业本科生的高分毕业设计实战资源适用于Java Web全栈开发学习、课程设计与毕设选题参考解决从技术选型到部署落地的全流程实践需求。资源包含704个文件涵盖81个Java后端业务逻辑代码、36个Vue前端组件、153个JS交互脚本、44个CSS样式文件、79个GIF动效资源及1个完整MySQL建库脚本.sql辅以bat一键部署脚本与备份文件压缩包仅22.93MB结构清晰、开箱即用。项目已通过导师验收并实际运行验证提供前后端分离的完整音乐网站功能用户认证、在线播放、歌单管理、关键词搜索、评论互动及后台内容管控配套毕业论文详述架构设计与实现细节。 算起来这类“JavaSpringBootVueMySQL”的音乐网站项目这几年我前前后后帮人看过、改过不下十来个版本。如果你正在准备毕业设计或者想拿一个完整的全栈项目练手这个标题里的东西你应该不陌生——源码、数据库脚本、论文三件套齐全解压就能跑看起来确实省心。但实际接手后你会发现真正值钱的不是那几万个文件而是你能不能把它讲清楚、改得动、跑得顺。这篇文章我就拿这套典型的音乐网站项目当例子把从技术选型、项目结构、数据库设计到前后端联调、部署上线、论文答辩准备的完整链路拆开揉碎讲一遍。不光是告诉你“这东西怎么跑起来”更重要的是说清楚“为什么这么设计”“哪些地方容易踩坑”“面试和答辩时老师大概率问什么”。无论你是刚接触SpringBoot的初学者还是已经能写CRUD但想补全项目经验的同学这篇都能给你一些实打实的参考。1. 项目整体设计与技术选型思路1.1 为什么是SpringBootVue这套组合而不是别的很多同学会纠结SSHStruts2SpringHibernate是不是过时了JSPServlet能不能做SSMSpringSpringMVCMyBatis还行不行我的看法是毕业设计不以“炫技”为目标而要以“稳妥、完整、能讲清楚、有发展空间”为目标在这几个维度上SpringBootVue这套组合几乎是目前最优解。先说后端。SpringBoot相比传统SSM最大的变化就是“约定大于配置”。以前搭一个SpringMVC工程要写web.xml、要配DispatcherServlet、要配一堆XMLBean定义光环境搭建就能劝退一大半人。SpringBoot通过自动配置把这些默认行为全部封装好了你只需要在pom.xml里引入依赖写一个带有SpringBootApplication注解的主类一个能跑起来的Web服务就完成了。这非常契合毕业设计这种“时间有限、但要完整交付”的场景。再说前端。Vue的好处是渐进式、上手快、生态成熟。音乐网站这种项目页面无非是首页推荐、歌单列表、播放器、个人中心、后台管理这几个模块。用Vue的单文件组件SFC组织页面配合Vue Router做路由、Vuex或Pinia做状态管理代码结构清晰答辩时也容易展示。更重要的是Vue和SpringBoot之间通过纯JSON交互前后端完全分离这本身就是当前企业开发的主流模式写在简历上也不掉价。至于MySQL没什么好争议的开源、免费、资料多、用的人多。音乐网站的数据量级MySQL完全能够胜任而且MySQL 8.0之后性能、窗口函数、JSON支持都比5.7强了不少论文里也能多写几个亮点。1.2 前后端分离架构到底解决了什么问题这套项目的架构是这样的前端Vue应用运行在Node服务器或者打包后的静态资源服务器上通过Axios向后端发起HTTP请求后端SpringBoot应用监听某个端口通常8080提供RESTful API数据存MySQL通过MyBatis-Plus或者Spring Data JPA访问。这种前后端分离架构和传统的JSP渲染相比最大的区别在于“关注点分离”。前端只管页面渲染和用户交互后端只管业务逻辑和数据持久化。好处有三个。第一并行开发效率高。前端写完页面用Mock数据调通后端只管出接口两边不用互相等。对于毕业设计这种单人项目来说虽然并行开发没什么意义但接口文档的意识要建立起来——答辩时老师问“你前后端怎么约定的”能答出“我们约定好接口路径、请求方式、返回结构体”就是一个加分项。第二部署灵活。前端打包成静态文件丢Nginx后端打成Jar包用java -jar跑互不干扰。后面我要讲的Linux部署就是基于这个思路。第三复用性好。后端接口天然就是一套API将来要做小程序、App直接调同一套接口就行。这也是为什么简历上写“拥有前后端分离项目经验”比写“会JSP”更有说服力的原因。1.3 技术栈版本选择与项目初始化要点这套项目的技术栈版本建议遵循“稳定、资料多、自己熟悉”的原则。SpringBoot选2.7.x或3.x都行但如果用的是JDK 8千万别选SpringBoot 3.x因为3.x强制要求JDK 17。很多同学在这里踩坑——pom里写了3.0.0JDK还是1.8启动直接报错。我一般推荐SpringBoot 2.7.18 JDK 8兼容性最好网上能搜到的资料也最多。前端这块Vue版本要看自己的基础。Vue 2的Options API死忠粉很多核心语法上手快、资料全Vue 3的Composition API更现代但如果你是新手看教程时容易在setup语法糖、ref和reactive之间绕晕。我的建议是如果学校答辩老师比较老派Vue 2足够稳如果想让项目看起来更新、或者你将来想进大厂Vue 3是好选择。反正项目核心逻辑不变只是页面层写法不同。环境准备清单基本是这样JDK1.8或11配置好JAVA_HOME和PATHMaven3.6配置阿里云镜像加速依赖下载Node.js14或16npm源建议切成国内镜像MySQL5.7或8.0安装好后要能远程连接IDE后端IDEA前端VSCode或WebStorm数据库客户端Navicat或MySQL Workbench看个人习惯这些环境变量配置问题尤其是JDK和MySQL是新手最容易卡住的地方。我见过太多人卡在“java不是内部或外部命令”或者“mysql -u root -p报错1045”上。建议各位拿到项目后第一件事不是急着解压跑代码而是先用java -version、mvn -v、node -v、npm -v、mysql --version五条命令确认环境是全的再开始下一步。2. 源码结构与数据库设计核心拆解2.1 拿到项目后先看懂目录结构解压这个zip之后里面大概率是三个东西一个后端文件夹、一个前端文件夹、一个SQL脚本外加一个论文目录。后端一般是标准的Maven结构前端用Vue CLI或者Vite创建。后端常规包结构是这样的com.example.music ├── MusicApplication.java // 启动类 ├── controller // 接收HTTP请求 ├── service // 业务逻辑接口 ├── service.impl // 业务逻辑实现 ├── mapper // 数据访问层接口 ├── entity // 数据库实体类 ├── dto // 数据传输对象 ├── vo // 视图对象 ├── config // 配置类如跨域、拦截器 ├── utils // 工具类如JWT工具 └── common // 全局返回结果、异常处理前端src下一般是src ├── api // 封装axios请求 ├── assets // 静态资源 ├── components // 公共组件 ├── router // 路由配置 ├── store // Vuex/Pinia状态管理 ├── views // 页面视图 └── utils // 前端工具函数拿到项目后我建议你花半小时把这两个目录结构走一遍把“哪个接口对应哪个页面、哪个方法调用了哪个Mapper”这个映射关系理出来后面改东西会快很多。纯靠IDE全局搜索也能改但永远形不成整体概念答辩时被问到系统是怎么工作的容易答得很散。2.2 音乐网站的核心表设计与字段规划数据库是整个项目的基石。就我见过的音乐网站毕业设计来说核心表跑不出这几张用户表、歌手表、歌曲表、歌单表、歌单歌曲关联表、收藏表、评论表。用户表是最基本的一张一般字段有id、username、password、nickname、avatar、phone、email、create_time。密码字段千万别明文存储至少用MD5加盐或者用BCrypt。论文里可以写一句“出于安全考虑用户密码采用BCrypt加密存储”这比你在系统里堆十个功能都管用。歌曲表是另一张核心表字段一般包括字段类型说明idbigint主键song_namevarchar歌曲名称singer_idbigint歌手IDalbum_namevarchar专辑名durationint时长秒lyrictext歌词song_urlvarchar歌曲文件路径pic_urlvarchar封面图路径create_timedatetime上传时间歌手表则相对简单id、name、avatar、introduction、create_time这些就够。歌单表和歌曲之间是多对多关系需要一张中间表song_list_song字段song_list_id和song_id。表之间的关系放在论文里叫ER图。很多同学因为画不好ER图就用文字代替其实完全没必要——用Navicat或Workbench连上数据库就能自动生成或者Draw.io手动画一张。ER图是论文里的“硬通货”这个不能省。2.3 建库建表的SQL脚本怎么用才能不出错项目里给的SQL脚本使用方式一般是本地MySQL命令行或客户端登录执行source命令或者直接复制粘贴到查询窗口里执行。脚本建库建表然后插入初始数据。最容易出问题的地方是字符集和排序规则。如果你执行SQL脚本后页面上中文全是“??”乱码十有八九是脚本里没指定CHARSETutf8mb4或者你连接MySQL时字符集没对。在JDBC连接串上建议加上useUnicodetruecharacterEncodingutf8serverTimezoneAsia/Shanghai同时MySQL服务器端的my.cnf里character-set-serverutf8mb4。这一套配好乱码问题基本就杜绝了。还有一个容易出问题的地方是时区。MySQL 8.0默认时区是UTC而我们的系统在东八区如果不指定serverTimezoneAsia/Shanghai查询结果可能会比预期时间早8小时。这看起来是小问题但答辩时如果被问到“为什么时间对不上”你得能答上来。数据库表设计这块我多说一句不要为了“表多”而过度设计。有的同学为了显得系统复杂硬拆出十几张表结果每张表就两三个字段逻辑上还是死关联。数据库设计的核心是“合理范式化适度冗余”。音乐网站这个体量七八张核心表就非常健康了。3. 前后端核心功能实现与联调细节3.1 登录鉴权JWT前后端联调的标准姿势音乐网站必然有登录注册。这个功能看起来简单但前后端联调时的细节非常影响体验。项目里大多用的是JWT方案用户登录后后端校验用户名密码通过后生成一个包含用户信息的Token返回给前端。前端把Token存在localStorage或SessionStorage之后每次请求在Axios拦截器里加上Authorization: Bearer token头后端用一个拦截器或过滤器统一校验Token通过才放行。后端核心代码差不多是这个意思public Result login(RequestBody LoginDTO loginDTO) { // 1. 校验验证码有些项目会用Redis存验证码 // 2. 校验用户名密码 User user userService.checkLogin(loginDTO.getUsername(), loginDTO.getPassword()); if (user null) { return Result.error(用户名或密码错误); } // 3. 生成Token String token JwtUtil.generateToken(user.getId(), user.getUsername()); return Result.success(new LoginVO(token, user)); }前端的Axios拦截器这样写axios.interceptors.request.use(config { const token localStorage.getItem(token) if (token) { config.headers.Authorization Bearer token } return config })很多新手在这里容易漏掉两件事。第一后端要配置放行接口比如登录、注册、首页推荐列表这些不需要登录就能访问的接口不能在拦截器里被拦死。第二CORS跨域要处理好。前端跑在8081端口后端跑在8080端口这本身就是跨域请求。后端加一个CorsFilter或者用CrossOrigin注解前端在Vite或Webpack里还要配一个代理转发把/api前缀的请求转发到后端地址才能把联调环境跑顺。3.2 歌曲上传与存储路径处理音乐文件上传又是另一个高频模块。后台上传歌曲时前端用el-upload组件后端用MultipartFile接收文件。这里比较关键的是文件保存的路径方案。企业做法一般有两种一是存本地磁盘某个目录数据库只存相对路径二是存对象存储阿里云OSS、七牛云等数据库存CDN地址。毕业设计一般用第一种就够了。但你需要注意保存文件的目录如果在Jar包内部重启就丢如果在项目根目录下部署时路径又会变。我推荐的做法是在配置文件里定义一个file.upload-path运行时读取绝对路径数据库存相对路径/music/xxx.mp3然后通过一个虚拟路径映射接口来访问文件。启动类里可以加这样一段映射逻辑Configuration public class WebConfig implements WebMvcConfigurer { Value(${file.upload-path}) private String uploadPath; Override public void addResourceHandlers(ResourceHandlerRegistry registry) { // 把 /music/** 映射到本地上传目录 registry.addResourceHandler(/music/**) .addResourceLocations(file: uploadPath /); } }这段代码的意义是前端播放歌曲的URL就是http://localhost:8080/music/xxx.mp3后端自动把请求映射到磁盘文件。不用这个映射你就得把文件放在src/main/resources/static下面打包部署后想换歌曲还得重新打包非常痛苦。3.3 播放器集成与M3U8流媒体播放思路音乐网站的播放器是核心体验模块。普通场景下前端直接用HTML5的audio标签配上一些样式就能播MP3简单省事。但如果你想让项目显得更专业可以考虑接入M3U8流媒体播放。M3U8是苹果公司推出的HTTP Live StreamingHLS协议中的索引文件格式常见于视频点播。音乐网站用M3U8的思路是后端把所有歌曲统一转码成HLS切片一个索引文件加多个ts音频分片前端用video.js或hls.js播放。这样做的好处是支持流式加载、拖拽快进体验好坏处是转码和切片存储会增加系统的复杂度。我见过有些项目用springboot集成FFmpeg做切片或者用外部工具先处理好再传文件。如果你对这个方向感兴趣前端可以这样接入hls.jsimport Hls from hls.js if (Hls.isSupported()) { const hls new Hls() hls.loadSource(/music/stream/ songId /index.m3u8) hls.attachMedia(audioElement) }但需要注意的是M3U8在毕设里属于加分项不是必选项。如果你的项目已经把播放、上一首、下一首、歌词滚动这些做完了时间还充裕那可以去折腾一下如果核心功能还很不稳定不建议为了“高级感”把播放链路搞得过于复杂答辩老师最看重的还是系统能不能稳定跑起来。3.4 搜索排序与MySQL的LIKE查询优化音乐网站的搜索模块也很能体现水平。最常见的实现是模糊查询SELECT * FROM song WHERE song_name LIKE CONCAT(%, #{keyword}, %)功能没毛病但如果歌曲量大了性能就会下降。而且如果搜索条件太单一比如只能搜歌名不能搜歌手名就很遗憾。更好的做法是JOIN歌手表把歌名、歌手名、专辑名一起搜再用排序规则做优先级SELECT s.*, si.name AS singer_name FROM song s LEFT JOIN singer si ON s.singer_id si.id WHERE s.song_name LIKE CONCAT(%, #{keyword}, %) OR si.name LIKE CONCAT(%, #{keyword}, %) ORDER BY CASE WHEN s.song_name LIKE CONCAT(#{keyword}, %) THEN 1 WHEN s.song_name LIKE CONCAT(%, #{keyword}, %) THEN 2 ELSE 3 END, s.play_count DESC这段SQL的逻辑是以关键字开头的歌曲排最前包含关键字的次之最后是只有歌手名匹配的。如果再按播放量降序那搜索“周杰伦”的时候最热的歌就会排在前面体验感立刻不一样。这种细节在论文里很值得写一段因为它是“业务逻辑SQL能力”的体现比单纯写“使用了xxx技术”有说服力得多。3.5 后台管理模块歌手管理、歌曲管理、歌单管理后台管理模块一般是前端一套独立的路由和组件后端接口上可以加一个简单的权限校验。比如在用户表里加一个role字段1表示管理员0表示普通用户后台接口的拦截器里判断一下用户角色不是管理员就返回403。后台功能无非是可歌单的增删改查。看起来不起眼但里面涉及的上传图片、上传音频文件、外键关联关系处理其实能延伸出很多细节问题。比如删除歌手时他名下的歌曲怎么办是禁止删除还是级联删除还是把歌曲的singer_id置空这个决策在答辩时很容易被问到你需要提前想清楚。我个人的习惯是在业务层做“逻辑删除”而不是物理删除。也就是在表里加一个deleted字段默认0删除时置1查询时自动过滤。这样做的好处是数据不会真正丢失将来做“回收站”“恢复”功能都有空间。在论文里也能写成“系统采用逻辑删除策略保证数据可追溯性”这是加分项。4. 部署上线与论文答辩准备4.1 本地完整跑起来的标准操作拿到项目后怎么在本机跑通这里的标准流程我按顺序拆一遍。第一步初始化数据库。用Navicat或Workbench连接本地MySQL执行SQL脚本确认表结构和初始数据都正确。第二步改后端配置。找到application.yml把数据库地址、用户名、密码改成你自己的。端口保持默认8080。Redis如果项目里用了也确认下是本地的。第三步启动后端。IDEA导入Maven项目等依赖下载完运行MusicApplication。看到“Started MusicApplication in xx seconds”字样说明启动成功。第四步启动前端。命令行进入前端目录执行npm install这一步会拉取依赖比较久。装完后执行npm run serve或npm run dev看到编译成功浏览器打开http://localhost:8081能正常访问首页就算前后端联调成功了。这里我要特别提醒npm install报错是非常常见的事。如果你用的是Node 17以上的版本项目的package.json里写的是旧依赖可能会出现opensslErrorStack: [error:03000086:digital envelope routines::initialization error]。这个错误本质上不是代码问题而是OpenSSL版本策略变化导致的。解决办法是执行set NODE_OPTIONS--openssl-legacy-providerWindows或export NODE_OPTIONS--openssl-legacy-providerLinux再重新启动。如果你用的是Vite创建的新项目则基本不会遇到这个问题。4.2 能不能部署到Linux服务器怎么部署毕业答辩前很多学校会要求“系统演示”虽然本地演示也可以但如果你能部署到云服务器上不仅演示方便简历上多一条“具备Linux部署经验”也是一个亮点。部署方案很简单后端打Jar包前端打包成静态文件用一个Nginx托管前端同时反向代理后端接口。后端打包命令mvn clean package -DskipTests打包完成后target目录下会生成一个music-0.0.1-SNAPSHOT.jar。上传到服务器安装好JDK和MySQL执行nohup java -jar music-0.0.1-SNAPSHOT.jar music.log 21 前端打包npm run build会在dist目录下生成静态文件把它们传到服务器的/usr/share/nginx/html下。Nginx配置的关键部分server { listen 80; server_name your_domain_or_ip; location / { root /usr/share/nginx/html; index index.html; try_files $uri $uri/ /index.html; # 支持Vue Router的history模式 } location /api/ { proxy_pass http://127.0.0.1:8080/; # 反向代理到SpringBoot proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }这里有两个特别容易忽略的坑。第一个是try_files $uri $uri/ /index.html如果Vue用了history模式路由而你没加这行刷新页面就404。第二个是location /api/代理时proxy_pass后面要不要带斜杠带不带斜杠会导致路径拼接结果完全不一样。proxy_pass http://127.0.0.1:8080/;表示把/api/user/login转成/user/login如果不带尾部斜杠就会请求/api/user/login后端没这个路径就会404。这些细节你亲手部署一次就记住了。4.3 论文怎么写才能拿高分论文的框架一般是绪论背景与意义、国内外研究现状、研究内容、相关技术介绍、系统分析可行性分析、需求分析、用例图、系统设计架构设计、功能模块设计、数据库设计、系统实现界面展示核心代码功能说明、系统测试测试用例表、测试结果、总结与展望。这里最容易犯的毛病是“技术介绍部分狂贴概念”从“SpringBoot是什么”抄到“Vue是什么”抄得洋洋洒洒却跟自己的系统毫无关系。正确做法是技术介绍只写你项目里用了的特性比如SpringBoot的自动配置、MyBatis-Plus的条件构造器、JWT的无状态认证、Vue的组件化开发然后马上接一句“在本系统中我利用xxx特性实现了xxx功能”。这样写指导老师一眼就知道你是真懂而不是抄的。系统设计部分数据库设计必须有ER图和表结构说明。功能设计最好画用例图和流程图。很多同学不会画流程图其实不用画得很复杂能表达清楚逻辑就行用户在登录页输入账号密码系统校验成功后进入首页点击歌曲播放播放时记录历史。系统测试部分至少要有功能测试用例表模块、功能描述、操作步骤、预期结果、实际结果、是否符合预期。列十几个用例覆盖登录、搜索、播放、收藏、后台管理等核心功能这一章就很充实了。别忘了论文里体现一些“非功能需求”内容比如安全性密码加密、接口鉴权、性能SQL优化、分页查询、可扩展性前后端分离架构便于后续功能扩展。这些内容不需要多但能让论文的完整性提升一个档次。4.4 答辩时老师喜欢问的高频问题答辩环节老师一般是先让你演示系统再问你几个问题。我整理了一些高频问题大家提前准备。第一个必问的就是“你这个项目的架构是什么样的”。你应该能清楚地答出前端Vue通过Axios调用后端RESTful API后端SpringBoot按Controller-Service-Mapper三层结构组织数据存MySQL通过MyBatis-Plus操作鉴权用JWT。第二个高频问题是“登录功能怎么实现的Token怎么校验”。你得能说出JWT的三段结构Header、Payload、Signature以及它的特点——服务端不保存会话状态每次请求带着Token后端通过密钥验签。第三个是“如果你表里的数据量很大查询很慢怎么办”。这个问题的标准回答是先考虑加索引把高频查询字段建索引如果还慢考虑分页优化、读写分离、引入缓存Redis。哪怕你没真做过Redis缓存能答出思路也是好的。第四个是“Maven依赖冲突怎么解决”。这个问题出人意料地高频因为SpringBoot项目确实很容易踩到依赖冲突。回答思路用mvn dependency:tree查看依赖树找出冲突依赖用exclusion排除或者统一版本号。能把这个讲清楚会给老师留下“这学生真动手写过项目”的印象。5. 常见问题与排查技巧实录5.1 问题速查表这里我整理了一份高频问题排查表基本都是大家实际运行中遇到的典型坑现象可能原因解决方案后端启动报Port 8080 was already in use端口被占用换端口或netstat -ano查占用进程并结束前端请求后端报Network Error或404跨域未处理或代理配置错误后端加CORS配置前端配Vite/Webpack代理页面中文乱码字符集不一致数据库、JDBC连接串、页面统一utf8mb4数据库连接报Access denied for user用户名密码错误或权限不足确认密码或给用户授权GRANT ALL ON *.* TO root%歌曲上传后无法播放文件路径映射没配好检查虚拟路径映射和存储目录权限登录后刷新页面就退出Token没存或没在拦截器里带上检查localStorage存储和Axios请求头上传文件报MaxUploadSizeExceededExceptionSpringBoot默认上传大小限制1MB配置spring.servlet.multipart.max-file-sizenpm install报OpenSSL错误Node版本过高设置NODE_OPTIONS--openssl-legacy-provider时间比实际晚8小时数据库时区UTCJDBC连接串加serverTimezoneAsia/Shanghai刷新前端页面404路由history模式问题Nginx加try_files $uri $uri/ /index.html5.2 缓存、Redis与用户中心的进阶经验音乐网站如果做得好其实可以加一个“最近播放记录”和“热门榜单”功能。最近播放记录最简单的做法是一张表存用户播放日志之后按时间去重查询。热门榜单则可以用播放次数排序查。但如果访问量真的上去了每次都查数据库显然不是最优解这时候引入Redis做榜单缓存就是很自然的演进思路。你可以在答辩时提一句“这个模块在数据量增大时可以引入Redis做缓存”这比什么都做不出来干吹要好得多。5.3 关于解压zip之后代码跑不动的几点忠告最后给大家几点非常实际的建议。第一不要迷信“源码数据库论文.zip”就是万能包。很多流传的源码存在故意的坑可能少一个依赖、可能数据库脚本和实体类字段对不上、可能是某个配置魔改过。你把Zip下载下来第一件该做的事不是写代码而是做“验收”确认环境、确认依赖、确认SQL能跑、确认前后端能联调。然后把坑填平变成你自己的项目。第二不要只做“搬运工”。哪怕代码一个字不改也能跑你也必须把每个核心功能的实现逻辑看懂。因为答辩时老师随便深挖一个功能细节你答不上来即便项目是你的也等于前功尽弃。看代码的顺序我推荐启动类→配置文件→Controller→Service→Mapper→前端页面→Axios请求。第三尽量做两个“锦上添花”的小改动。不一定大但得是你自己写的。比如在搜索模块加一个热门关键词推荐、在播放页加一个歌词滚动、在后台加一个批量删除。这一个改动就能在答辩时说“这是我在原项目基础上做的优化”。我在实际接手这类项目时最大的体会是一个毕业设计项目重要的不是它有多少个赞、多少个Star而是你能不能把每个设计决策的原因讲清楚。为什么用MyBatis-Plus而不用JPA为什么用JWT而不用Session为什么上传的文件路径要放到配置文件里这些“为什么”串起来才是你真正通过这个项目学到的东西。把这些问题想透无论论文、答辩还是将来简历上的描述你都能做到心里有底。本文还有配套的精品资源点击获取
返回列表