尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

SpringBoot + MySQL + JWT 实现前后端分离的在线教育视频点播平台

SpringBoot + MySQL + JWT 实现前后端分离的在线教育视频点播平台
📅 发布时间:2026/7/3 8:10:46

《基于 SpringBoot + MySQL + JWT 的前后端分离在线教育视频点播平台》

✅ 前后端分离

✅ JWT 鉴权

✅ 视频点播

✅ 权限分级

✅ 技术栈主流,面试也能打


一、选题背景(论文可直接用)

随着"互联网+教育"的快速发展,传统线下教学模式存在以下局限:

  • 教学资源受时间空间限制

  • 课程缺乏统一管理

  • 学习进度难以追踪

  • 权限管理混乱,资源易泄露

本系统基于SpringBoot + MySQL + JWT,实现:

✅ 前后端分离架构

✅ 安全认证与权限控制

✅ 视频课程在线点播

✅ 学习进度记录

具有较强的实用价值和推广前景。


二、技术架构

前端(Vue / React) ↓ Axios + JWT SpringBoot(后端) ├── 用户模块 ├── 课程模块 ├── 视频点播模块 ├── 权限模块(JWT) └── 学习记录模块 ↓ MySQL(持久化存储)

技术

作用

SpringBoot

快速开发

MyBatis

ORM

MySQL

数据存储

JWT

无状态鉴权

Spring Security(可选)

权限控制

Vue + Axios

前端交互

视频存储

本地 / 云存储(OSS / COS)


三、系统角色设计

1️⃣ 管理员

  • 用户管理

  • 课程管理

  • 视频上传与审核

  • 数据统计

2️⃣ 教师

  • 发布课程

  • 上传教学视频

  • 查看学生学习进度

3️⃣ 学生

  • 注册 / 登录

  • 浏览课程

  • 在线播放视频

  • 查看学习记录


四、核心业务流程(答辩必画)

用户注册 / 登录 ↓ 获取 JWT Token ↓ 携带 Token 请求接口 ↓ 浏览课程列表 ↓ 选择课程 → 在线播放视频 ↓ 记录学习进度

五、数据库设计(核心表)

1️⃣ 用户表user

CREATE TABLE user ( id BIGINT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(50) UNIQUE, password VARCHAR(100), real_name VARCHAR(50), role VARCHAR(20) DEFAULT 'STUDENT' );

2️⃣ 课程表course

CREATE TABLE course ( id BIGINT PRIMARY KEY AUTO_INCREMENT, title VARCHAR(100), description TEXT, cover_url VARCHAR(200), teacher_id BIGINT, status INT DEFAULT 1, create_time DATETIME );

3️⃣ 视频表video

CREATE TABLE video ( id BIGINT PRIMARY KEY AUTO_INCREMENT, course_id BIGINT, title VARCHAR(100), video_url VARCHAR(300), duration INT COMMENT '秒', sort INT );

4️⃣ 学习记录表learning_record

CREATE TABLE learning_record ( id BIGINT PRIMARY KEY AUTO_INCREMENT, user_id BIGINT, video_id BIGINT, progress INT COMMENT '播放进度(秒)', finished TINYINT DEFAULT 0, update_time DATETIME );

六、JWT 鉴权核心实现(⭐重点)

1️⃣ 引入依赖

<dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt</artifactId> <version>0.11.5</version> </dependency>

2️⃣ JWT 工具类

@Component public class JwtUtil { private final String SECRET = "edu-platform-secret-key"; public String generateToken(Long userId, String role) { return Jwts.builder() .setSubject(String.valueOf(userId)) .claim("role", role) .setIssuedAt(new Date()) .setExpiration(new Date(System.currentTimeMillis() + 86400000)) .signWith(Keys.hmacShaKeyFor(SECRET.getBytes()), SignatureAlgorithm.HS256) .compact(); } public Claims parseToken(String token) { return Jwts.parserBuilder() .setSigningKey(SECRET.getBytes()) .build() .parseClaimsJws(token) .getBody(); } }

3️⃣ 登录接口

@PostMapping("/login") public R<Map<String, String>> login(@RequestBody LoginRequest req) { User user = userService.login(req.getUsername(), req.getPassword()); if (user == null) { return R.fail("用户名或密码错误"); } String token = jwtUtil.generateToken(user.getId(), user.getRole()); Map<String, String> data = new HashMap<>(); data.put("token", token); data.put("role", user.getRole()); return R.ok(data); }

4️⃣ JWT 拦截器

@Component public class JwtInterceptor implements HandlerInterceptor { @Autowired private JwtUtil jwtUtil; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { String authHeader = request.getHeader("Authorization"); if (authHeader == null || !authHeader.startsWith("Bearer ")) { response.setStatus(401); return false; } String token = authHeader.substring(7); try { Claims claims = jwtUtil.parseToken(token); request.setAttribute("userId", claims.getSubject()); request.setAttribute("role", claims.get("role")); return true; } catch (Exception e) { response.setStatus(401); return false; } } }

5️⃣ 注册拦截器

@Configuration public class WebConfig implements WebMvcConfigurer { @Autowired private JwtInterceptor jwtInterceptor; @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(jwtInterceptor) .addPathPatterns("/api/**") .excludePathPatterns("/api/user/login", "/api/user/register"); } }

七、视频点播核心实现

1️⃣ 课程列表接口

@GetMapping("/api/course/list") public R<List<Course>> listCourses() { return R.ok(courseService.listPublished()); }

2️⃣ 视频播放接口

@GetMapping("/api/video/play/{id}") public R<VideoVO> playVideo(@PathVariable Long id, HttpServletRequest request) { Long userId = (Long) request.getAttribute("userId"); Video video = videoService.getById(id); if (video == null) { return R.fail("视频不存在"); } // 记录学习进度 learningService.recordPlay(userId, id); return R.ok(VideoVO.from(video)); }

3️⃣ 学习进度记录

@PostMapping("/api/learning/progress") public R<Void> updateProgress(@RequestBody ProgressRequest req, HttpServletRequest request) { Long userId = (Long) request.getAttribute("userId"); learningService.updateProgress(userId, req.getVideoId(), req.getProgress()); return R.ok(); }

4️⃣ 学习记录 Service

@Transactional public void recordPlay(Long userId, Long videoId) { LearningRecord record = recordMapper.selectByUserAndVideo(userId, videoId); if (record == null) { record = new LearningRecord(); record.setUserId(userId); record.setVideoId(videoId); record.setProgress(0); record.setFinished(false); recordMapper.insert(record); } recordMapper.updateTime(record.getId()); }

八、前端请求示例(Vue + Axios)

// 登录 const res = await axios.post('/api/user/login', { username: 'student1', password: '123456' }); localStorage.setItem('token', res.data.token); // 携带 Token 请求课程 axios.get('/api/course/list', { headers: { Authorization: 'Bearer ' + localStorage.getItem('token') } });

九、系统特色(⭐答辩亮点)

✅ 前后端完全分离

✅ JWT 无状态鉴权,适合分布式部署

✅ 视频点播 + 学习进度跟踪

✅ 角色权限分级(管理员 / 教师 / 学生)

✅ RESTful 风格接口

✅ 可扩展为微服务 / 接入云点播


十、安全防护(加分项)

✅ Token 过期机制

✅ 密码加密(BCrypt)

✅ 接口防刷(Redis + 限流)

✅ 视频防盗链(Token + 时效 URL)

✅ XSS / SQL 注入防护


十一、毕设论文结构建议

章节

内容

第1章

绪论

第2章

相关技术(SpringBoot、JWT、Vue)

第3章

需求分析

第4章

系统设计(E-R图、架构图)

第5章

系统实现(JWT鉴权 + 视频点播)

第6章

系统测试

第7章

总结与展望


十二、可扩展方向(体现工作量)

✅ 视频弹幕 / 评论

✅ 课程付费 & 订单系统

✅ 直播教学(WebRTC / RTMP)

✅ 学习数据分析(ECharts)

✅ 移动端适配 / 小程序

✅ 接入阿里云 / 腾讯云点播

相关新闻

  • 软考2026新增科目备考资源极度稀缺:仅3家机构获授权开发模拟题库,其中2套已遭命题组紧急叫停——现在入手还剩最后72小时
  • 守护健康的“生命元素”,你补对了吗?
  • HASP加密狗驱动仓库:解决工业软件授权驱动部署难题

最新新闻

  • 9大网盘直链获取神器:LinkSwift 浏览器脚本深度解析
  • 【官方未公开的机考底层逻辑】:基于2176份真题数据验证的3类题型响应延迟规律及抢分策略
  • 网盘直链下载助手终极指南:告别限速,8大网盘全速下载的简单方法
  • Python爬虫经典案例第56篇:Python包索引爬取——PyPI数据采集实战
  • 软考论文时间焦虑破局手册:基于127份高分卷时序拆解的“非线性写作路径图”(限时开放3天)
  • Selenium、Cypress、Playwright三大Web自动化测试框架深度对比与选型指南

日新闻

  • JMeter接口测试实战:从核心元件到复杂场景构建
  • Java Applet版刽子手游戏源码:含完整项目结构、吊杆绘图与胜负逻辑
  • 使用Apache JMeter对RoadRunner PHP应用进行性能测试与调优指南

周新闻

  • Windows字体自定义终极方案:No!! MeiryoUI完全指南
  • Deepin Boot Maker:告别命令行,3分钟制作Linux启动盘的智能解决方案
  • Plain Craft Launcher 2:重新定义你的Minecraft游戏体验

月新闻

  • 2026年6月公司网站搭建最新热门渠道测评:四大低成本/零代码平台对比+避坑
  • 【Linux】Linux arm 编译QT程序,出现expected “}“报错
  • 【MATLAB例程】四基站二维AOA定位与距离辅助增强对比仿真。基于角度观测和测距修正的固定目标平面定位精度分析

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号