又是一年毕业设计季。每年这时候都会碰到一批人卡在同一个地方:选了个"基于Spring Boot + Java的学习网站系统"这种经典题目,结果从看题目到动手之间没有任何缓冲——源码能跑起来了,但被老师一问底层原理就发怵;文档写完了一看像说明书摘抄;视频讲到最后自己都不知道重点在哪儿。这篇文章想说的,其实不是让你改用一个更炫的题目,而是把这套流传极广的选题从里到外拆透:前端浏览器里能看见的选课、播放、记录只是冰山一角,后端的权限控制、资源映射、文件链路、部署顺序才是你答辩时真正要讲的干货。
文章适合正在做同类毕设、或者刚接手这类全栈项目的读者,我会从项目需求一直聊到文档和视频的准备工作,每一段都是能直接参考的实操经验。
1. 学习网站系统到底在做什么:先看边界再看功能
很多人拿到这个题目第一反应就是"做一个B站"——这个想法很危险。一个学习网站的毕设题目,本质不是视频平台,而是资源流程管理。你真正要解决的是三件事:什么人能看什么课、课程里的视频和课件怎么存怎么放、用户看到一半下次怎么接着学。把这三件事想清楚,需求模型就立住了。
1.1 从角色分页出发,把权限边界画出来
推荐你来设计两套角色:前台使用者(学生或普通用户)和后台运营者(管理员)。学生端的功能围绕"学"展开——注册登录、按分类浏览课程、查看课程详情、学习视频/课件、保存学习进度;管理员端围绕"管"展开——课程分类管理、课程信息上下架、视频和课件资源上传、用户账号维护。这个模型不用做得特别庞大,但角色边界必须清楚,字段设计上就要用 role 区分。
我当时设计的用户表核心字段长这样,简单但够用:
code复制sys_user
- id 用户ID
- username 登录账号(唯一索引)
- password BCrypt加密后的密码
- nickname 昵称
- role 角色标识:1是管理员,0是普通用户
- avatar 头像地址
- create_time
权限这块不建议自己手写一套复杂实现。Spring Boot项目里最常见的是Spring Security + JWT,也有用Shiro + JWT的。如果项目已经围绕MyBatis Plus在做CRUD,Spring Security的UserDetailsService与数据库用户表对接起来非常自然。用拦截器放行登录接口和Swagger文档路径,其余请求校验Token,这是最稳的组合。
1.2 功能模块到底该拆多细:一门一表还是一课一行
你后面写文档和画架构图的时候会发现,模块拆解直接决定你数据库表设计的复杂程度。常规的设计方案是:
course_type:课程分类表,一级分类就够了,避免递归查询和前端级联保存的麻烦。course:课程主表,放课程名称、封面图、教师、简介、所属分类、点击量。不要把视频地址直接塞在主表里,因为一门课会有多集视频,这属于典型的一对多关系。course_section/course_video:课程章节与视频集表,小节持有course_id外键,视频地址存相对路径而不是完整URL。study_record:学习记录表,记录用户ID、课程ID、最近学到的小节ID以及最后观看时间点,这比单独做"收藏夹"更有实际演示价值——下次打开页面可以直接定位在没看完的那一段。sys_resource:统一文件资源表,可选的,但强烈建议加。它记录文件名、磁盘相对路径、文件类型、大小、上传人ID。这样无论你后续上传封面、课件还是视频,前端只拿一个文件ID就能拼出访问链接。
一个看起来正经的毕设,有用户、课程分类、课程、小节、学习记录这五张主表就非常稳了。再额外加一个评论表也行,但不是必需项,时间紧的时候可以先放一放。
为什么很多人的项目"看起来不完整"?问题往往不在表少,而在表之间缺乏一条从登录到学习的完整链路。你展示时先登录学生账号,点进课程页点视频,再看库里 study_record 多了一行,这才叫跑通了。单纯的上下架课程对毕设评委来说没有冲击力。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术选型的取舍逻辑:别追最新版,要追最大兼容性
学习网站这套系统,前端用Vue + Element UI 或 简单thymeleaf都能行,后端几乎清一色Spring Boot。但具体版本怎么选,很多人不假思索直接下载最新Spring Boot——这正好踩中了社区里最常出现的坑:"springboot版本太高"。版本高意味着Spring Security、MyBatis Plus、一些第三方Starter的兼容性文档可能还停在前一两个版本,百度到的问题答案全对不上号。
2.1 为什么强烈建议JDK 8 + Spring Boot 2.7.x
这是我在多次项目实操后得出的最省心组合。JDK 1.8与Spring Boot 2.7.18这个搭配虽然在2024年之后不再有社区更新,但成熟度和第三方依赖的覆盖程度遥遥领先。如果你的电脑装了JDK 17甚至21,新建Spring Boot 3项目也很简单,但请注意三点:
- Spring Boot 3从
javax.*包切换到了jakarta.*包,很多网上的老代码复制下来直接报红线。 - Spring Security 6的配置写法变化非常大,旧版的
WebSecurityConfigurerAdapter已经删除,很多人卡在这条上一下午就没了。 - 你将来如果要把项目打包成Docker镜像,JDK 8版本的镜像自带
java:8足够轻量,JDK 17镜像体积明显更大。
除非你的任务是硬性要求Spring Boot 3,否则没必要给自己挖坑。老师看的是系统设计和业务逻辑的完整度,只要你在答辩时能说出"我为什么选这个版本"就是加分项。热搜词里大量出现"java安装""java环境变量配置",说明很多读者基础环境就卡住了。JDK 8的安装和环境变量配置教程多、坑少,对新手极其友好。
2.2 组件搭配:CRUD、鉴权、缓存,每一样都能讲出道理
我建议的项目依赖组合:
| 组件 | 用途 | 选型理由 |
|---|---|---|
| Spring Boot 2.7.x | 基础框架 | 默认整合大量Starter,配置简化 |
| MyBatis Plus 3.5.x | ORM与CRUD | 单表不写SQL,自带分页插件 |
| MySQL 8.x | 数据存储 | 课程和用户数据落库 |
| Redis | 课程详情缓存/学习进度缓存 | 演示热数据场景,替代纯数据库查询 |
| JWT(jjwt) | 登录鉴权 | 前后端分离项目无状态认证首选 |
| knife4j | 接口文档 | 本地看接口文档、调试接口非常方便 |
| Lombok | 实体类简化 | 减少getter/setter样板代码 |
| 腾讯云/阿里云OSS或本地存储 | 视频文件存储 | 按预算选,毕设推荐本地方案 |
这些组件不是拿来凑数的,答辩常见问法就是"你为什么用Redis"。你要能回答:课程详情页访问量大,首页课程列表每次响应都要查库,把热点数据放到Redis,可以显著降低数据库压力。哪怕你的数据量演示不出性能差距,设计逻辑是正确的。这就是加分点。
划重点:不要为了显得高端就引进RocketMQ、Flowable工作流或者Spring Cloud微服务,这些都是热门搜索词,但不是这个题目的菜。一个学习网站如果引入几十个微服务组件,评委只会问你"服务拆分依据是什么";搞不好运行视频录到一半服务起不来,那才是大灾难。技术的"适配性"永远比"名单的豪华程度"重要。
2.3 前端用什么:Vue 2 + Element UI 依然是最成熟选择
基于Spring Boot + Java的全栈毕设,绝大部分默认前端是Vue + Element UI。虽然现在Vue 3和Element Plus已经普及,但网上能找到的管理系统模板基本都是Vue 2版本,中文资料和答疑覆盖率也更高。学习网站不需要太多酷炫动效,用Vue 2生态的资源完全够完成前端网站、管理后台两套界面。
如果你的重点在后端积累,前端可以考虑用一套现成后台管理模板,加上自己写前台展示页面,这类混搭模式在毕设中很普遍,也节省了大量开发时间。
3. 拆开核心流程:一次完整的"登录→选课→播放→记录"是怎么跑通的
整个系统最值得听懂的不是增删改查代码本身,而是数据是如何在接口之间流动的。我建议从三条主线来理解:认证、课程访问、学习记录写入。这也是你讲解视频里最该讲清楚的部分。
3.1 JWT登录链路与Spring Security/Swagger放行问题
这是很多初学者第一个卡住的地方。流程是这样的:
- 用户提交账号密码到
POST /api/user/login。 - 后端拿到明文密码,用
BCryptPasswordEncoder.matches()与数据库密文对比。 - 对比成功,用
jjwt生成Token,把用户ID、用户名、角色塞进Token的claims中。 - 返回给前端,前端存到
localStorage或Pinia/Vuex。 - 之后的每个请求,前端在请求头加
Authorization: Bearer <token>。 - 后端写一个
JwtAuthenticationFilter,从请求头解析并校验Token,通过后把用户信息放入SecurityContextHolder。
这里最容易翻车的是放行路径配置。本地联调时,如果你想打开swagger-ui.html调试接口,必须把Swagger相关路径、登录注册接口、课程列表等公开接口放进permitAll()名单,不然前端调试全被拦截。热搜词里就有"springboot jwt 放开swagger",说明这是全国性问题。我当时用的是knife4j,文档路径为/doc.html和/webjars/**,在SecurityConfig里完整放行接口:
java复制@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable()
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.authorizeRequests()
// 放行登录、注册及课程浏览公开接口
.antMatchers("/api/user/login", "/api/user/register",
"/api/course/list", "/api/course/detail/**",
"/doc.html", "/webjars/**",
"/swagger-resources/**", "/v2/api-docs",
"/swagger-ui.html", "/swagger-ui/**").permitAll()
// 其余需要登录
.anyRequest().authenticated();
}
注意放行不代表不鉴权,只是让这些接口无需Token即可访问。文件访问路径如果做的是本地磁盘映射,也需要放行。
3.2 自动装配与Starter:为什么新依赖不用写配置就能用
先解释一个原理性问题,因为考官几乎必问。Spring Boot为什么引入spring-boot-starter-web后,不需要配置一堆DispatcherServlet和Tomcat?核心是"约定大于配置"。
当你引入Starter依赖时,Maven会把对应的spring.factories或AutoConfiguration.imports文件里的配置类带进来。Spring Boot启动时通过@EnableAutoConfiguration,扫描所有依赖包中META-INF/spring.factories里的自动配置类,在一个个@ConditionalOnClass、@ConditionalOnMissingBean条件下判断是否帮你自动创建好相关Bean。
比如手动配置事务你要写DataSourceTransactionManager,但引入spring-boot-starter-jdbc或MyBatis Plus的Starter后,Spring Boot检测到你的DataSource就自动把事务管理器也配好了;你加入了spring-boot-starter-data-redis,它就自动创建StringRedisTemplate等Bean。
这就是为什么我让你用Spring Boot这个体系——它在底层帮你把配置类的模块化发挥到了极致。你在答辩时把它讲成"自动装配机制检查到代码里存在某个类的依赖,在一个条件判断下自动创建对应Java Bean",逻辑就完整了。
3.3 课程学习和学习记录:把"看到了哪里"存下来
浏览课程列表和详情不难,真正好玩的是学习记录。用户点进一个章节视频时,前端可以每隔几秒上报当前播放秒数:
code复制POST /api/study/record
参数:
courseId: 2
sectionId: 8
currentPosition: 126 // 当前播放到第126秒
duration: 880 // 视频总时长
后端拿到后先查 study_record 是否有该用户对应课程小节的记录,有则更新观看时间和当前进度,没有则插入。表设计成course_id+user_id+section_id唯一,是为了避免记录越来越多、每次学习都追加一行。课程表上加一个total_students阅读量字段,学习记录写入时UPDATE course SET total_students = total_students + 1,但注意别让人刷量,可以限制同一用户每天只加一次,演示时也不会出错。
通过这个记录,前台"我的学习"页面就能展示最近学过哪些课、看到第几小节、进度百分比。这个小功能实现成本不高,但你演示以后的整体完整度直接提升一个档次,评委能明显看到业务是闭环的。
4. 视频与课件上传下载链路:学习网站最容易坏的那一截
一个学习网站系统的后端代码,80%的问题都出在文件处理上。上传的封面图打不开、视频无法播放、下研发件中文名乱码,这些问题文档里能写一页纸。网上搜索词也侧面反映了大伙的痛点——"springboot 如何上传下载大文件""springboot 如何做资源映射"被反复搜索。所以我把文件这条链路单拿出来说。
4.1 三种文件存储方案对比:本地存储、OSS、MinIO
毕设项目选文件存储方案,实际上是在"成本、稳定性、答辩亮点"之间平衡。我见过三种典型方案,给你一个直观对比如下:
| 方案 | 项目难度 | 成本 | 答辩亮点 | 适合场景 |
|---|---|---|---|---|
| 本地上传+磁盘映射 | 低 | 无额外费用 | 一般 | 毕设默认方案 |
| 阿里云/腾讯云OSS | 中 | 有免费额度 | 高 | 演示时更贴近生产 |
| MinIO | 中高 | 无额外费用 | 较高 | 服务器性能充足时可选 |
如果你只是要稳,首选本地存储。具体做法是定义一个配置文件:
yaml复制file:
upload-dir: /data/learn-site/upload/
access-prefix: /upload/**
创建上传目录后,写一个配置类把本地磁盘目录映射为一个HTTP可访问的静态资源路径:
java复制@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Value("${file.upload-dir}")
private String uploadDir;
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/upload/**")
.addResourceLocations("file:" + uploadDir);
}
}
注意这里的file:前缀不能省,它表示从文件系统目录而不是classpath读取,路径结尾也要加斜杠,Windows和Linux的盘符差异会自动处理。这样,上传一张封面图后返回给前端的URL就是http://localhost:8080/upload/2025/04/12/xxx.jpg。
如果你的电脑装了Docker Desktop并希望离线打包给老师演示,或你在阿里云买了一台轻量应用服务器,那本地方案都够用。OSS方案能够演示"项目中用到的对象存储"这种描述,但也需要你先去开一个Bucket并设置跨域规则,操作链路较长,在紧张开发期容易损耗时间。
4.2 上传控制器的实现:大小限制与MultipartFile处理
上传视频时,Spring Boot默认的Spring MVC单次上传大小限制是1MB,这是所有人最早遇到的拦截。你需要这样放开:
yaml复制spring:
servlet:
multipart:
max-file-size: 2048MB
max-request-size: 2048MB
后端处理上传的Controller写起来倒不算复杂:
java复制@PostMapping("/api/admin/course/section/upload")
public R uploadSectionVideo(@RequestParam("file") MultipartFile file,
@RequestParam("courseId") Long courseId,
@RequestParam("sectionId") Long sectionId) {
// 1. 判断文件是否为空
if (file.isEmpty()) {
return R.fail("上传文件不能为空");
}
// 2. 获取原始文件名与后缀
String originalFilename = file.getOriginalFilename();
String ext = originalFilename.substring(originalFilename.lastIndexOf("."));
// 3. 校验后缀是否允许(.mp4 .avi .mov)
if (!allowExt.contains(ext.toLowerCase())) {
return R.fail("不支持该视频格式");
}
// 4. 用UUID重命名文件,防止中文和特殊字符乱入
String objectName = DateUtils.getCurrentDate() + "/" + UUID.randomUUID() + ext;
File destFile = new File(uploadDir + objectName);
if (!destFile.getParentFile().exists()) {
destFile.getParentFile().mkdirs();
}
file.transferTo(destFile);
// 5. 保存文件信息到 sys_resource 表,并把关联写入 course_section
return R.ok(objectName);
}
这里我没用file.transferTo前先准备目录这种做法可能会有人忽略,transferTo的目标父目录不存在时会直接抛FileNotFoundException,而不是自动建目录。
4.3 让视频能在线播放:HTML5 Video对MP4有要求
视频能不能在线播放,通常不是后端权限的问题,而是视频编码格式问题。浏览器端<video>标签的src指向接口路径时,一般用H.264编码+ACC音频的MP4最稳,浏览器可以点开即播。部分从网络下载的MKV、AVI或其他编码的MP4,即使能通过后端下载,也会出现黑屏或报"暂时无法播放"的错误。
处理视频本身不代表后端要转码,最简单可靠的演示思路是:自测时准备几份编码符合浏览器要求的小视频文件,比如用FFmpeg转一下,或者在剪辑软件导出为H.264 MP4格式,控制在50MB以内。运行视频和现场演示的流畅度,远比资源大而全重要。如果你想让项目更显专业,可以在课程管理里写一个"转码状态"字段,但这会引入FFmpeg进程调用,在不熟悉时建议别上。
4.4 大文件断点续传:能加分但不是必需项
搜索词里出现"springboot 如何上传下载大文件",说明不少同学确实在本地测试时拿那种几个G的电影试上传。这里我负责任地说:对于毕设,大文件断点续传不是必要项。因为老师演示的往往是几百MB的小视频,而断点续传需要前端把文件切片、每次上传带独立的MD5、后端做分片合并和记录文件分片状态,工作量几乎等价于再做一个模块。如果你精力充足想加亮点,可以只对后台视频上传做前端el-upload的limit大小限制和后端进度接口,不用真的实现断点续传,就能应对绝大多数提问。
5. 从零把项目跑起来:本地启动顺序与Docker部署实验
项目做完要在最终演示时一遍过,所以"能跑"这件事要有保障。哪怕是技术平平的项目,运行演示顺畅就能保住及格线;反过来,项目做得再深,演示时启动失败,一切归零。
5.1 本地启动的依赖顺序:MySQL、Redis、后端、前端
我建议你的启动脚本按这个顺序执行:
- 启动MySQL 8,执行
init.sql建库,确认用户的密码与application.yml里的数据库连接串一致。 - 启动Redis服务。Windows下Redis需要手动起
redis-server.exe,很多人在这里忘记启动,一调用缓存接口就报错。 - 启动后端。观察控制台日志确认端口8080无占用,看到"Started Application in xxxx seconds"才算启动成功。
- 启动前端:
npm install安装依赖后执行npm run serve,浏览器访问前端地址。
这里最容易被忽略的是数据库连接配置。如果本地的MySQL密码不是默认的root/root,结果项目里是spring.datasource.password写死的某个密码,启动必然报Access denied,所以每次在一台新电脑上运行时,先检查application.yml的数据库配置,再检查file.upload-dir目录是否存在。这两个是最常见的运行失败原因。
5.2 前端联调跨域问题:同源策略与代理
Vue启动默认在http://localhost:8080,后端在http://localhost:8081(或8000),端口不同自然触发跨域。生产环境你可以在Spring Boot里配置@CrossOrigin或全局CORS,但开发环境最佳实践是使用Vue CLI的devServer.proxy配置转发,避免前端请求直接暴露后端地址:
javascript复制devServer: {
port: 3000,
proxy: {
'/api': {
target: 'http://localhost:8080',
changeOrigin: true
}
}
}
我建议后端接口统一以/api开头,前端开发环境所有请求都走相对路径,交由代理转发;打包后把前端dist目录丢进Spring Boot的static目录,甚至可以合并为一个工程演示,没有了跨域也就少了一个潜在问题和相关的PPT页面。
5.3 用Docker打包给老师看:镜像构建三步走
很多网课现在评阅时要求学生提交"运行环境说明"甚至录屏演示,因此把环境做成Docker镜像很有价值。热搜词"springboot jdk1.8打包到docker desktop"让很多人失败的原因,多半是误以为必须在Docker里装一个完整的Java运行环境。实际上你只需要一个带JRE的基础镜像,在Dockerfile里把可执行Jar复制进去:
dockerfile复制# 基础镜像只用JRE,减小体积
FROM openjdk:8-jre-alpine
# 作者信息
MAINTAINER yourname <yourname@example.com>
# 创建应用目录
RUN mkdir -p /app
WORKDIR /app
# 把构建产物复制进镜像
COPY target/learn-site.jar app.jar
# 暴露后端端口
EXPOSE 8080
# 启动命令
ENTRYPOINT ["java", "-jar", "app.jar"]
构建命令:
bash复制mvn clean package -DskipTests
docker build -t learn-site:1.0 .
docker run -d -p 8080:8080 --name learn-site learn-site:1.0
万一你有多个镜像依赖MySQL容器,用docker-compose.yml编排两个服务,让Spring Boot容器通过depends_on依赖MySQL,再配置一个自定义网络。通过这些细节,你在文档的"部署环境"部分能多出一整节内容。不过注意,如果评审老师要求"点击运行视频展示项目即可",Docker部署可以只在文档中体现,不必现场折腾。
6. 交付物准备:源码是下限,文档和视频是上限
这一节专门讲讲"源码+文档+运行视频+讲解视频"的交付逻辑。这四个东西加起来才是完整的项目,而很多学生只关注源码本身,对后两者漫不经心,最后分数反而被拖得很难看。我一直觉得,文档和视频最大的作用不是应付查重,而是给看的人建立信任感:看的人能顺着你的文章和画面,在最短时间内相信这套系统确实是你设计的、能跑通的。
6.1 毕设文档的组织策略:按答辩官审查顺序写
文档不是把代码抄一遍,而是按"读者想先看什么"来写。我的建议结构:
- 需求分析:为什么要做学习网站,目标用户是谁,解决什么问题。
- 可行性分析:技术可行性、经济可行性、操作可行性,这一段比较水但必须有。
- 需求建模:画用例图前后台角色用例,写典型业务流程说明。
- 总体设计:架构图可以采用浏览器/Vue → Nginx可选 → Spring Boot → MyBatis Plus → MySQL/Redis的分层描述。功能模块结构写清楚。
- 详细设计:数据库表结构说明,重点表给出字段表;核心接口列表,匹配前端页面。
- 系统实现:每个模块挑1到2个核心方法粘贴并对原理做解释。
- 系统测试:功能测试用例表,包括测试模块、测试步骤、预期结果、实际结果。
- 总结:写自己在开发中遇到的问题与解决过程,比如跨域、大文件上传限制、Swagger放行等。
你如果只抄一堆现成大篇幅的项目说明没有意义,把你自己踩过的那些小坑写进去,反而显得真实。更重要的是,文档里的截图要与最终代码保持一致——很多人一改再改代码,文档截图老旧,答辩时老师按图对比发现页面线条不同,那是非常尴尬的。
6.2 运行视频怎么拍:脚本比录屏本身更重要
运行视频的唯一目的是让评委在短时间内无死角地看到你的系统操作流畅。所以拍摄要提前列脚本,按"登录→后台管理→前台使用→学习记录"顺序拍,且全程不能有两个操作间的明显空白等待。
我的运行视频脚本(时长控制在8分钟左右):
| 时间段 | 画面内容 | 录制要点 |
|---|---|---|
| 00:00-00:30 | 启动后端与前端 | 日志中启动成功时间 |
| 00:30-01:30 | 管理员登录 | 演示登录接口返回Token |
| 01:30-03:00 | 后台新增课程分类和课程 | 上传封面,刷新前台可看到 |
| 03:00-04:30 | 上传一个小节视频 | 演示文件资源映射能在线播 |
| 04:30-06:30 | 普通学生注册登录、查看课程列表、播放视频 | 画面平稳为主 |
| 06:30-07:30 | 退出再登录,演示学习记录 | 重新进入时进度恢复 |
| 07:30-08:00 | 数据库或Redis数据展示 | 可直观看到此次学习入库 |
很多人的运行视频死板,就是因为把大量时间浪费在输入ID或数据库字段上。数据库的直观展示可以放到视频最后30秒。
6.3 讲解视频的讲法:突出设计痕迹
讲解视频不是把项目文档念一遍,而是把"怎么想、怎么做、怎么解决"讲出来。我的建议是拿PPT或思维导图做底稿,按"题目意义/需求分析→系统设计→项目实现核心难点(30分钟重点)→部署与测试"讲解。翻车概率最高的误区有:
- 只念接口名,不解释数据流向。你讲登录注册要画出"用户输入→Security过滤器→数据库校验→生成JWT→前端存储→后续请求携带"这样的过程。
- 对着代码一行行解释。不要念每一个if分支,而是挑重难点,比如自动装配原理、视频上传时的资源映射,讲一处就够,讲深一层。
- 不解释为什么。最明显的例子,别人问你为什么用Redis,你说"因为大家都在用",这是零分回答。你要说"用户访问课程详情的高频查询会反复访问数据库,用Redis做缓存可以降低数据库压力。
6.4 一份可复用的答辩问题清单
临场答辩准备不能只准备讲稿,更要准备好问题。学习网站体系最容易被问到的问题,我整理如下,最好每一个都能在本机跑通预演:
- 介绍一下你的项目架构?项目用了哪些技术?为什么这样选择?
- Spring Boot的自动装配原理是什么?你在项目中用到哪些Starter?
- 你是怎么实现JWT登录认证的?Token过期后怎么处理?
- 如果多个用户同时上传文件,文件名冲突怎么解决?(答UUID)
- 课程视频是放在哪里的?地址如何映射?Windows和Linux部署时有什么差异?
- Redis在你的项目中缓存了什么?你怎么保证数据库和缓存的数据一致性?
- 项目如何防止SQL注入?MyBatis Plus有什么处理机制?
- 数据库表之间有哪些外键关系?你的学习记录表为什么设置唯一索引?
- 你做过哪些系统测试?测试数据是怎么构造的?
这些问题你都可以在写文档时,同步输出一个"QA文档",反正平时翻源码时就顺手记录一遍,答辩前的压力就小得多了。
从一个过来人的角度说,学习网站这类系统的技术上限未必能让你惊艳全场,但它是少数能把Java基础、数据库设计、前端联调和部署实践完整融合在一起的题目。做好这套系统,你学到的不仅是API怎么写,而是怎样把一个模糊题慢慢变成一个可运行、可讲、可交付的完整项目。如果你正拖着没有动手,我的建议是先别追求代码一步到位,从需求清单的第一条用户登录开始,一个接口一个接口去打通,一切都会在最后几天的连轴转中变得顺理成章。
