ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

SpringBoot+Vue+MyBatis+MySQL多媒体共享平台源码解析

SpringBoot+Vue+MyBatis+MySQL多媒体共享平台源码解析 “企业级武理多媒体信息共享平台管理系统源码”这个标题乍一看像是那种烂大街的毕设项目但如果你正好在准备毕业设计、或者刚入行想找一套能完整跑通前后端的项目练手会发现这类项目反而是最实在的参考样板。先说清楚“武理”通常指武汉理工大学这类以学校命名的管理系统本质上就是一套面向校园场景的多媒体资源共享平台核心解决的是师生上传、管理、检索和播放各类多媒体资源视频、音频、文档、图片的问题。标题里最值钱的部分是技术栈——SpringBootVueMyBatisMySQL这也是国内Java后端岗位面试和实际业务开发中最常见的一套组合。这篇文章我准备从一个接手过类似项目的开发者的角度把这个平台“为什么这么设计”讲透再带上可直接照搬的数据库设计思路、关键业务实现方案、部署细节和坑点排查。如果你手上正好有这套源码但不知道从哪里看起或者想自己从零复刻一个类似的多媒体共享平台这篇文章应该能帮你省下不少时间。1. 项目整体拆解多媒体共享平台到底在解决什么问题1.1 校园场景下的“企业级”到底指什么先把这个概念说清楚。“企业级”这个词被用得太烂了但只要一套系统具备几个基本特征它确实能算得上企业级的基础门槛而不是说必须扛住几万人并发才叫企业级。第一有完整的用户体系不是一张用户表打天下而是用户、角色、权限分离管理员、教师、学生各有各的操作范围和审批链路。第二有文件存储和多媒体处理的环节。视频不能是用户传上去一个mp4就直接让人下载最基础的也要做格式校验、大小限制、封面截取稍微正规一点的会走转码流程。第三有审核机制和操作日志所有关键操作可追溯。第四有统计报表或者至少是管理端的可视化概览。满足这些即便是一个几百人的院系在使用它也已经具备企业级系统的雏形了。这个“武理多媒体信息共享平台”就是这么个定位。它的使用场景很典型某个学院或者全校范围内老师把自己上课的录像、PPT、参考文档传到平台上学生按课程、按分类去检索和在线播放管理员负责审核内容、管理分类、看统计数据。表面上看起来平平无奇但把多媒体资源管理和权限体系串起来以后难度就上来了。1.2 为什么是“共享平台”而不是“网盘”很多人看到这种项目会下意识觉得这不就是一个网盘吗上传、下载、列表展示。但“共享”和“网盘”有一个本质区别网盘的核心是私有存储空间而共享平台的核心是资源的组织、开放和分发。这意味着平台的表结构设计必须围绕“资源分类-资源元数据-资源流转行为”展开而不只是围绕“用户和文件”展开。比如同一份教学视频它可能同时属于“计算机学院”“软件工程课程”“第3周课件”三个维度它可能被老师上传、被管理员审核、被300个学生播放过。系统要记录这些行为就得做资源表和日志表的拆分。做共享平台类项目时资源属性设计是重点简单来说一个资源要有“归属人”谁上传的、有“可见范围”公开/指定角色/指定用户、有“状态”待审核/已发布/已下架这三条缺一条后面做检索和权限控制都会很痛苦。顺便提醒一下如果你拿到的标题里带“管理系统”三个字那说明它的重心其实不在“上传下载”而在“管理”。管理端的功能丰富程度才是这类项目评分和面试的加分项。1.3 这套源码对三类人的价值这套源码之所以在网络上被大量搜索是因为它精准踩中了三类需求第一类是做毕设的学生。SpringBootVueMyBatisMySQL的组合既不会太冷门也不至于太泛滥论文好写、答辩好讲最关键的是一套完整的管理系统在“工作量展示”环节非常占优势。第二类是刚入行一到两年的Java开发。很多人想学完整的前后端项目但GitHub上那些开源项目的复杂度偏高动不动就上微服务、分布式、消息队列反而看不进去。这种单体架构、前后端分离、功能闭环的项目是更好的学习材料。第三类是需要快速交付外包项目的小团队。换一套界面、改一改包名和数据库前缀就能复用到很多学校、培训机构的内部资源管理场景。所以如果你拿到的是这套源码不要只盯着“怎么跑起来”要把自己代入到“我拿到这套代码之后如何最快看懂、改得动、能给别人讲明白”这个目标上。2. 功能模块和权限模型管理系统的主心骨2.1 完整功能地图这类多媒体共享平台功能拆开看一般就三大块每一块对应不同角色和不同前端页面。管理端管理员负责对整个平台做配置和管控常见功能包括仪表盘统计数据用户数、总资源数、今日新增、播放总量、用户管理添加、禁用、重置密码、分配角色、分类管理多媒体分类的增删改查和排序、资源审核对待审核资源的预览、通过、驳回驳回时要求填写原因、系统日志登录日志、操作日志、基础配置站点名称、上传大小限制、是否开放注册。教师端/上传端普通用户做的事情本质上是一致的只是权限范围不同我的资源上传、编辑、删除自己上传的资源、我的审核记录查看驳回原因和修改后重新提交、共享资源检索按分类、按关键词搜索、资源在线预览和播放、个人中心修改资料、改密码。资源中心前台核心页面对应普通用户的使用体验轮播图或推荐位分类导航资源卡片列表封面、标题、简介、浏览量、上传者、上传时间详情页在线播放、文件信息、相关推荐搜索和筛选排序。把这张功能地图对照源码的Controller层去拆基本就能快速定位每个需求对应的接口。我习惯的做法是先看菜单表或者前端路由表因为一个成熟后台管理系统的菜单设计就已经包含了完整的权限点菜单能展开说明后台的接口和表格基本都有对应的实现。2.2 基于RBAC的权限模型权限模型是这类项目第一个考察点。稍微规范一点的管理系统都会走RBAC基于角色的访问控制而不是每张表上存一个“is_admin”字段去判断。RBAC的基础是五张表用户表sys_user、角色表sys_role、菜单表sys_menu、用户角色关联表sys_user_role、角色菜单关联表sys_role_menu。核心逻辑用一个生活化的例子就能讲明白你把门禁卡给了一个人这个人能进哪些房间取决于门禁系统给他开过哪些门而不是在每扇门上单独贴一张“张三可以进”的纸条。“用户-角色-权限”是一层一层挂接的关系。用户可能同时有多个角色比如一个人既是教师又是某个课程的负责人角色对应一组菜单和按钮权限前端根据权限动态生成能显示的路由后端在接口层面用拦截器或注解校验身份。在具体实现上SpringBoot项目最常见的组合是Spring Security或自定义拦截器 JWT。如果是上手学习我更推荐先看JWT拦截器的实现版本因为代码量少、逻辑直白能很清楚地看懂“登录-生成token-携带token-验证token-放行/拒绝”的完整链路Spring Security做权限控制上限更高但封装太厚新手容易被各种Filter和Config绕晕。2.3 资源的审核流与状态流转设计多媒体的“资源”不同于普通博文它作为内容发布天然需要审核。设计审核状态时不要做成一个简单字段最好做一个状态机模型这是源码里最容易被忽视但也最值得讲的部分。常规的资源状态最少有四个待审核0用户上传后进入该状态此时前台用户不可见只有管理员和上传者本人可见已发布1审核通过对全体用户或者指定范围可见已驳回2审核不通过需要记录驳回原因用户修改后可重新提交审核已下架3管理员强制下架比如版权投诉或者发现内容违规。再做一张资源审核记录表resource_audit每次审核动作都写入一条记录包含审核人、审核时间、审核结果、审核备注。这张表有两个好处一是用户能查看自己的资源“为什么被驳回”二是管理员操作可追溯答辩时也能拿出来讲审计功能。不用mermaid用文字描述状态流转待审核可以被管理员审核为已发布或已驳回已发布可以被管理员下架为已下架已驳回用户可以编辑后再次提交回到待审核已下架作为终态可允许管理员重新上架。这个流转图本身就够画一页论文插图而且逻辑严密。3. 技术选型解析SpringBootVueMyBatisMySQL这套组合为什么这么稳3.1 前后端分离与Vue生态前后端分离是当前主流但“分离”和“完全独立部署”不是一回事。这套平台采用的方式是Vue构建后把dist目录打包放进SpringBoot的resources/static下由一个进程对外提供服务。这种单应用部署模式非常适合校园类项目不用单独搞Nginx、不用配置跨域、运维成本低还能保证任意目录启动都能访问。开发模式下则走Vue CLI的代理转发前端请求统一用/api前缀开发环境通过devServer的proxy把请求转发到localhost:8080。这两种模式并存的核心在于Axios的baseURL配置要处理得当。我最常看到的错误就是前端同学把baseURL写死成http://localhost:8080导致打出来的生产包在别的机器上根本无法访问。正确的做法是写成相对路径默认请求以/api开头由后端在Controller统一加RequestMapping(/api)这样开发和部署都不用动代码。Vue版本方面如果是Vue2项目配合Element UI是绝配如果是Vue3项目通常会换成Element Plus。这套源码如果标注了Vue未标注版本号大概率是Vue2Element UI这在当前真实企业中存量项目很多依然值得学习。有一点可以放心哪怕你不懂Vue只要你懂HTTP请求、JSON结构和后端接口设计Vue的管理后台代码看起来并不会太吃力。3.2 MyBatis的定位与持久层优势为什么在这套架构里用的是MyBatis而不是JPA这是面试高频问题也是项目选型的关键考量。MyBatis的核心优势是SQL可控。在管理系统这类业务中复杂查询最多包括多条件动态查询资源名称、分类、状态、时间范围、多表关联资源表关联用户表、分类表、分页统计。MyBatis的XML文件可以精确到每一条SQLSQL优化加索引、调JOIN顺序、改查询字段能实打实落在代码里而不需要参考框架自动生成的臃肿语句。MyBatis常见的实现有两种风格纯XML Mapper和MyBatis-Plus。老项目纯XML偏多新项目MyBatis-Plus偏多。如果是MyBatis-Plus核心价值是单表CRUD不用写SQL自带分页插件。但我的建议是不管用不用MyBatis-PlusXML目录要能看懂尤其是resultMap、动态SQL的if和foreach标签、script里写复杂逻辑时注意转义符。看MyBatis相关代码时有三处细节值得优先看一是XML的namespace是否和Mapper接口全限定名一致二是resultType和resultMap的使用区别多表关联查询结果没有对应实体类时通常会自定义VO类或者用Map接收三是LambdaQueryWrapper有没有误用导致SQL注入风险。参数拼接如果用${}而不是#{}在动态排序时是常见写法但要确保排序字段走白名单不能直接拼接用户输入。3.3 MySQL的使用场景与关键配置这套系统全部数据都落在MySQL上。多媒体文件的“本体”不放数据库数据库存的是“文件的地址”这个原则一定要贯彻。用一个简单的计算说明原因一个100MB的视频如果存BLOB进数据库那这个表很快就膨胀到几十GB备份、查询、导出都会成为灾难而把视频传到服务器磁盘或云存储数据库里只记录/files/video/2024/xxxx.mp4这样一行字符串一亿条资源的表大小也控制在几十GB以内。这种设计就叫“元数据与文件分离”。MySQL作为这套架构里的数据底盘有三类配置必然值得关注。第一字符集。建库语句必须是utf8mb4而不是utf8不然存不了emoji和一些生僻字标题里如果带特殊符号会出现“??”。第二引擎。所有业务表都用InnoDB支持事务和行级锁MyISAM不要出现在新项目中。第三时区。serverTimezoneAsia/Shanghai是必填项否则Java连接MySQL 8.x时默认UTC时区差8个小时所有时间字段的展示都会“穿越”。4. 数据库设计与核心表结构精讲4.1 核心表清单一个合格的多媒体共享平台核心表至少包含下面这些。你可以拿着源码中的sql文件对照如果缺了某张表说明对应功能是阉割版。表名用途核心字段sys_user用户表id、username、password、real_name、email、phone、avatar、statussys_role角色表id、role_name、role_code、remarksys_menu菜单/权限点表id、parent_id、menu_name、path、perms、icon、sortsys_user_role用户角色关联user_id、role_idsys_role_menu角色菜单关联role_id、menu_idbiz_category多媒体分类表id、parent_id、name、sort、statusbiz_resource多媒体资源表见下面详解biz_resource_audit审核记录表id、resource_id、auditor_id、status、remark、audit_timebiz_download_log下载/播放日志表id、resource_id、user_id、type、create_timesys_operate_log操作日志表id、user_id、module、operation、method、params、ip、times这些表之间的关联关系不复杂核心就是把“用户”“角色”“资源”“操作行为”四个概念拆开边界清晰。看源码的时候顺着这条线走基本不会迷路。4.2 多媒体资源表最值得细看的表biz_resource是这套平台最核心的表它的设计直接决定扩展性。一份合格的设计至少包含三个维度的字段基础属性字段包括id、title、intro、category_id、user_id上传者、status。这些字段解决“是谁的、归到哪类、叫什么名、能不能看”的问题。文件属性字段包括file_typevideo/audio/document/image、file_name、file_path、file_size、file_ext、cover_url封面图地址。这些字段决定“这个资源怎么展示”。尤其是file_type前端列表页要根据类型显示不同的卡片模板。扩展属性字段包括duration视频时长、resolution区分标清/高清、view_count浏览量、download_count下载量、sort_weight、is_recommend、create_time、update_time。这些字段支撑排序、推荐位和统计功能。如果你拿到的源码里这张表字段特别少比如连cover_url都没有那说明这个“多媒体”平台其实只是文件网的套壳。补充时要注意视频上传时用ffmpeg截取首帧作为封面的方案是标准做法后面我详细展开。4.3 索引设计和事务细节数据量不大时索引问题不明显但一个认真的管理系统表设计里一定要体现索引意识。常见索引设计原则可以套用登录查询经常用username所以sys_user的username建唯一索引资源列表页最常见的是按分类状态过滤所以biz_resource的(category_id, status)建联合索引统计浏览量时按资源ID聚合主键索引本身就能覆盖下载/播放日志表按resource_id和时间查询建(resource_id, create_time)联合索引。事务方面要说一个容易被忽略的坑。如果你在用户上传资源时需要“插入资源表写一条审核记录更新用户的资源计数”这三个操作必须放在同一个事务方法里方法上加Transactional。但一个常见的坑是在同一个类里A方法无事务调用B方法有事务事务会失效因为Spring的事务代理基于AOP只有外部调用才会走代理。这个问题面试问过很多次源码里也经常存在排查时如果发现“数据插进去了但是关联表没写”就重点检查是不是这个方法内自调用。5. 关键业务模块的落地实现5.1 统一返回结果与全局异常处理很多刚学SpringBoot的人写接口每个Controller返回类型都不一样有的返回Map有的直接返回String有的返回实体类导致前端接数据时很崩溃。一个规范的项目一定会有一个统一响应体类比如Result类包含code、message、data三个字段。约定规则也很简单code200表示成功code500表示系统异常code401表示未登录或登录过期code403表示无权限业务上的自定义状态比如“资源不存在”可以用code404类似语义设计。前端拿到响应体先判断code再决定走成功逻辑还是弹出错误提示。这个包装类最大的价值不是“好看”而是让前端处理逻辑高度统一不会出现一个接口成功返回的data是一个对象另一个接口成功返回的data是一个数组还得特判。配套的还有全局异常处理器用RestControllerAdvice统一捕获各类异常。设计时要区分三类业务异常自定义BizException比如“文件不能超过200MB”、参数校验异常MethodArgumentNotValidException、系统异常兜底Exception。这样既能让用户看到友好的提示又能在后端日志里打出堆栈。5.2 登录认证与JWT的完整链路管理系统的登录流程如果不梳理清楚前端和后端会出现各种对接问题。这套平台的JWT认证链路通常是这样用户提交用户名密码后端校验通过后生成token。token里可以包含userId、username、角色编码用HMAC密钥签名设置过期时间常见2-24小时。返回给前端的同时通常还需要返回用户基本信息昵称、头像、角色名称方便前端展示。前端拿到token后存在localStorage或者Vuex/Pinia里每次Axios请求前在请求拦截器里从存储中取出token加到请求头Authorization: Bearer token。后端写一个拦截器HandlerInterceptor或者Spring Security的过滤器对所有需要登录的接口校验token。校验通过就把用户信息放到ThreadLocal里后续业务代码直接用LoginUtil.getUserId()就能拿到当前用户这是很优雅的设计。这里有一个经验之谈不要每次都去数据库查用户表来验证身份正确的做法是token里携带用户ID拦截器解析后从Redis如果有或直接信任token内容。查询库会让每个接口都白白多一次IO。安全性方面JWT的密钥不要写在代码里至少放配置文件如果你还希望“踢人下线”或“改密码后token强制失效”就要引入token黑名单或Redis存储token版本号但这类增强功能在一个管理系统里属于加分项不是必选项。5.3 大文件上传与多媒体转码多媒体平台的难点不在CRUD在文件处理。如果你视频超过500MB用普通的multipartFile一次性上传既容易超时也容易内存溢出。比较靠谱的上传方案是前端分片。分片上传的原理用一句话可以概括把一个100MB的文件切成每片5MB的20个分片前端逐个上传后端每收到一个分片落一块临时文件全部传完后由后端按序号合并出完整文件最后重命名并保存到业务目录。如果中途网络断了重新上传时后端通过“已上传分片列表”接口告诉前端还要传哪几片这就实现了断点续传。更进一步的方案是服务端不直接存用户上传的原始视频而是丢到队列里用ffmpeg做转码和切片。这个方法稍重但很专业视频上传后调用ffmpeg命令将统一的MP4文件转成多种清晰度或者生成HLS切片m3u8ts这样前端播放时就不依赖浏览器直接解析MP4的能力而使用HLS协议播放兼容性和拖动进度条体验都会好很多。前端播放m3u8在Vue里是常见需求。组件方案用vue-video-player或video.js但设置核心是引入hls.js或者videojs-contrib-hls。常见坑是如果后端返回的m3u8文件时没有正确的Content-Type播放器可能识别不了。解决办法是后端静态资源配置时为.m3u8和.ts后缀加MIME映射。很多开发者在Windows本地测试正常部署到Linux后就不能播放十有八九都是这个原因。5.4 列表性能与前端体验优化管理系统里最容易被吐槽的就是“页面转圈”。一个多媒体资源列表如果一次性加载几千条数据、还要每一条都渲染封面图那体验必然差。这个模块需要考虑两个层面。后端层面必须分页。常规做法是PageHelper插件或者MyBatis-Plus分页插件前端传current和size两个参数后端返回records和total两个字段。资源列表的SQL要尽量避免SELECT *只查列表页需要的字段id、title、cover_url、file_type、view_count等不然详情页才用到的description被一并查出来白费IO。前端层面大列表要做懒加载或者虚拟滚动。最简单的做法是使用图片懒加载指令封面图在进入视口范围内才加载复杂一点的是分页下拉加载更多Element UI的el-infinite-scroll就能实现。这里有一个实测经验统计浏览量时不要每次浏览详情都直接UPDATE biz_resource SET view_count view_count 1这个也是常规做法但要注意对单行数据加行锁。如果只做浏览统计可以容忍一定程度的异步丢失那么写一个异步线程池定时批量刷新浏览量会减少对业务主流程的阻塞。6. 实操过程与关键配置速查6.1 本地部署环境与版本搭配开始跑源码之前版本匹配是第一个要踩的坑。建议搭配如下JDK1.8 或 11SpringBoot 2.7.x对应这两个都没问题Maven3.6配置阿里云镜像加速依赖下载Node.js14.x或16.xVue2项目对应Vue3建议16MySQL5.7或8.08.0需要配置时区参数IDEIDEA后端、VSCode前端启动顺序也很明确先启动MySQL导入sql脚本再启动后端SpringBoot检查8080端口不冲突最后启动前端npm installnpm run serve默认端口多为8081或9527注意vue.config.js中的端口配置。application.yml里有一个映射的重点配置spring: datasource: url: jdbc:mysql://localhost:3306/media_share?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/ShanghaiuseSSLfalseallowPublicKeyRetrievaltrue username: root password: yourpassword driver-class-name: com.mysql.cj.jdbc.Driver servlet: multipart: max-file-size: 1024MB max-request-size: 2048MB注意max-file-size如果只设置了1MB那传个稍大一点的视频就直接报错“文件大小超出限制”这是最隐蔽的坑之一。生产环境可以根据服务器磁盘和学习场景适当调大同时要配套Nginx层如果有的client_max_body_size设置不然前端传了半天最后后端返回413错误。6.2 前后端联调与跨域处理开发环境最常见的报错是CORS跨域。前后端分离就意味着这是必然的处理方案有两种。方案一后端全局配置CorsFilter允许指定域名跨域。这种方案适合前端独立部署到别的服务器时使用。方案二通过前端代理规避跨域。Vue CLI项目里找到vue.config.js配置devServer: { proxy: { /api: { target: http://localhost:8080, changeOrigin: true } } }请求/api/user/login会代理到http://localhost:8080/api/user/login浏览器看到的请求是同源的跨域被绕过去。如果两个方案都做了还报跨域错误那就检查一下是不是请求路径没带/api前缀或者后端接口路径和前端请求路径对不上。前后端分离项目里接口路径不一致导致的404比跨域问题出现得更频繁。6.3 Vue项目打包部署SpringBoot的细节这套项目既然是单体部署前端构建产物应该放在SpringBoot的静态资源目录下。实际有两种打包方式第一种前端构建后手动把dist目录里的文件复制到src/main/resources/static下。这种方式简单直观但每次前端有修改都要手动复制一次虽然不少人这么干但不够优雅。第二种用Maven插件在打包时自动拉取前端代码并构建。在后端pom.xml里配置frontend-maven-plugin它会自动下载Node环境、执行npm install和npm run build把产物放到target/classes/static下。这个方案自动化程度高但对网络依赖较强。个人更推荐学第一种能让你理解“静态资源位置”的本质换到生产环境用Nginx分发时也能很快地迁移。打包后有一个高频Bug要提醒如果你直接访问http://localhost:8080/返回SpringBoot的404页面或者刷新一个非首页的路由出现404通常是因为前端路由用了history模式而后端没有配置“未知请求转发到index.html”。解决办法是加一个WebMvcConfigurer把路由重定向到index.html或者把Vue路由改成hash模式。生产环境为了保证多级路由刷新不白屏这个配置绕不开。7. 常见问题与排查技巧整理一套这类项目最常踩的坑建议收藏。问题现象可能原因排查方案前端访问接口返回404路径没匹配上、代理配置错误先看浏览器Network里实际请求的URL对比后端Controller的RequestMapping登录后请求提示401token没传或过期检查请求拦截器是否正确处理了Authorization头检查JWT过期时间是否太短上传大文件报错multipart配置限制、Nginx限制同时检查SpringBoot配置和部署层配置中文显示为问号数据库字符集不对库、表、连接串三处都改成utf8mb4视频能下载但不能在线播放缺少MIME映射或者没有转码检查.mp4的MIME映射浏览器不支持格式时考虑转码为HLS修改代码后不生效缓存或未重新打包前端确认devServer热更新是否正常运行后端确认是否用了devtools热部署Maven依赖是否干净数据库连接中断空闲连接超时加connection-test-query和连接池的空闲回收配置分页查询数据总数不准count查询和列表查询条件不一致检查MyBatis分页插件的count SQL与主SQL是否共用条件特别注意动态条件在不同SQL片段里的拼接我额外说两个容易被忽略但实测中能救命的小点。第一个是时区与日期差8小时。后端返给前端的时间显示出来总是比数据库存储早8小时或晚8小时大部分是jdbc连接串缺了serverTimezone。另一部分则是因为JSON序列化时没有配置时间格式默认输出带T前端new Date()如果不做格式化显示就会很怪。解决办法是在application.yml里统一配置Jackson的日期格式而不是在每个实体类上加注解。第二个是日志的重要性。这类平台建议至少记录两类日志。第一类是登录日志记录谁在什么时候登录成功或失败失败几次后锁定账号这是很多管理系统的安全指标。第二类是操作日志AOP切面记录用户增删改查的操作内容。日志代码本身不复杂但一旦事故出现比如有用户上传了一个违规视频“我没传”日志就是查清真相的唯一凭证。答辩时如果能把操作日志的设计讲清楚导师通常会很满意。8. 一点实操体会从拿到这套源码到真正把它改造成能交付的项目我踩过许多坑。写到最后想分享两个对应届生和初级开发者特别有用的经验。第一拿到任何一套源码不要急着“启动成功”就沾沾自喜你应该做的事是先删掉数据库重建一遍然后按功能模块去阅读Controller层的每个接口在纸上画出“哪个页面调用了哪个接口、接口操作了哪些表”的地图。这个过程做完你对SpringBootVueMyBatis这套体系的理解会超过闷头写两个月的代码。第二想办法给自己制造一个“改造需求”。比如给这个平台加一个“课程包”的概念把多个学科资源打包成一个整体或者加一个批量导入用户功能导入时校验Excel格式。改一次源码比你重复看三遍源码更有效。尤其是当你把分页、审核、文件上传这些模块都自己重写过一遍之后再去面试任何关于项目经验的问题都不会再让你紧张。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进