《基于 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)

✅ 移动端适配 / 小程序

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

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐