随着互联网技术的快速发展,在线教育已成为教育领域的重要形态,打破了传统教育在时间、空间上的限制,Java作为一门成熟、跨平台的编程语言,凭借其稳定性、丰富的生态和强大的企业级开发能力,成为构建在线教育系统的首选技术之一,本文将围绕在线教育系统的核心功能,结合Java技术栈,从系统架构、模块设计到关键代码实现进行详细解析,为相关开发提供参考。

系统架构设计

在线教育系统采用前后端分离架构,后端基于Java技术栈构建RESTful API,前端通过Vue/React等框架实现页面交互,整体架构分为表现层、业务逻辑层、数据访问层和存储层,具体如下:

  • 表现层:负责用户交互,通过HTTP/HTTPS协议接收前端请求,返回JSON格式数据。
  • 业务逻辑层:核心业务处理,包括用户管理、课程管理、直播互动、考试测评等模块。
  • 数据访问层:采用MyBatis框架操作MySQL数据库,实现数据持久化。
  • 存储层:MySQL存储业务数据,Redis缓存热点数据(如课程信息、用户会话),MinIO存储课程视频、课件等文件。

核心模块代码实现

用户模块:注册与登录

用户模块是系统的基础,需实现用户注册、登录、信息管理等功能,采用JWT(JSON Web Token)进行身份认证。

核心代码示例:用户登录接口

@RestController  
@RequestMapping("/api/user")  
public class UserController {  
    @Autowired  
    private UserService userService;  
    @Autowired  
    private JwtUtil jwtUtil;  
    @PostMapping("/login")  
    public ResponseEntity<?> login(@RequestBody LoginRequest request) {  
        // 1. 校验用户名密码(密码需加密存储)  
        User user = userService.login(request.getUsername(), request.getPassword());  
        if (user == null) {  
            return ResponseEntity.status(401).body("用户名或密码错误");  
        }  
        // 2. 生成JWT令牌  
        String token = jwtUtil.generateToken(user.getId(), user.getUsername());  
        // 3. 返回用户信息与令牌  
        Map<String, Object> response = new HashMap<>();  
        response.put("token", token);  
        response.put("user", user);  
        return ResponseEntity.ok(response);  
    }  
}  

说明

  • 密码存储采用BCrypt加密(Spring Security的BCryptPasswordEncoder),避免明文存储风险。
  • JWT令牌包含用户ID和用户名,前端请求时在Header中携带Authorization: Bearer <token>,后端通过拦截器校验令牌有效性。

课程模块:课程发布与分类管理

课程模块是在线教育的核心,需实现课程创建、分类管理、课程详情展示等功能,采用MySQL存储课程数据,Redis缓存热门课程列表。

核心代码示例:课程创建接口

@RestController  
@RequestMapping("/api/course")  
public class CourseController {  
    @Autowired  
    private CourseService courseService;  
    @PostMapping("/create")  
    @PreAuthorize("hasRole('TEACHER')") // 权限控制,仅教师可创建课程  
    public ResponseEntity<?> createCourse(@RequestBody CourseRequest request) {  
        // 1. 构建课程对象  
        Course course = new Course();  
        course.setTitle(request.getTitle());  
        course.setDescription(request.getDescription());  
        course.setCategoryId(request.getCategoryId());  
        course.setTeacherId(SecurityUtil.getCurrentUserId()); // 获取当前登录教师ID  
        // 2. 保存课程(MyBatis-Plus自动填充创建时间等字段)  
        courseService.save(course);  
        // 3. 更新Redis缓存(课程分类列表、最新课程)  
        courseService.updateCourseCache(course.getCategoryId());  
        return ResponseEntity.ok("课程创建成功");  
    }  
}  

说明

  • 使用Spring Security的@PreAuthorize注解实现权限控制,确保只有教师角色可创建课程。
  • 课程分类采用树形结构存储(如MySQL的parent_id字段),通过递归查询获取全部分类。
  • Redis缓存课程列表,减轻数据库压力,提高查询速度(如course:category:1表示分类ID为1的课程列表)。

直播模块:实时互动教学

直播模块是在线教育的关键功能,需实现课程直播、实时聊天、白板互动等,采用WebSocket实现实时通信,集成Nginx-RTMP推流服务。

核心代码示例:WebSocket聊天消息处理

@Component  
@ServerEndpoint("/ws/chat/{courseId}")  
public class ChatWebSocketServer {  
    private static final Map<Long, Set<Session>> courseRooms = new ConcurrentHashMap<>();  
    @OnOpen  
    public void onOpen(Session session, @PathParam("courseId") Long courseId) {  
        // 1. 将用户加入对应课程的聊天室  
        courseRooms.computeIfAbsent(courseId, k -> ConcurrentHashMap.newKeySet()).add(session);  
        // 2. 广播用户加入消息  
        broadcastMessage(courseId, "系统:用户" + session.getId() + "加入聊天室");  
    }  
    @OnMessage  
    public void onMessage(String message, Session session, @PathParam("courseId") Long courseId) {  
        // 1. 解析消息(用户ID、内容、时间戳)  
        ChatMessage chatMessage = JSON.parseObject(message, ChatMessage.class);  
        chatMessage.setUserId(SecurityUtil.getCurrentUserId());  
        chatMessage.setTimestamp(System.currentTimeMillis());  
        // 2. 广播消息给聊天室所有用户  
        broadcastMessage(courseId, JSON.toJSONString(chatMessage));  
    }  
    @OnClose  
    public void onClose(Session session, @PathParam("courseId") Long courseId) {  
        // 1. 从聊天室移除用户  
        courseRooms.get(courseId).remove(session);  
        // 2. 广播用户离开消息  
        broadcastMessage(courseId, "系统:用户" + session.getId() + "离开聊天室");  
    }  
    private void broadcastMessage(Long courseId, String message) {  
        Set<Session> sessions = courseRooms.get(courseId);  
        if (sessions != null) {  
            sessions.forEach(session -> {  
                try {  
                    if (session.isOpen()) {  
                        session.getBasicRemote().sendText(message);  
                    }  
                } catch (IOException e) {  
                    e.printStackTrace();  
                }  
            });  
        }  
    }  
}  

说明

  • WebSocket通过@ServerEndpoint注解定义端点,前端通过new WebSocket("ws://domain/ws/chat/1")连接(1为课程ID)。
  • 消息广播采用ConcurrentHashMap存储每个课程的聊天室用户集合,确保线程安全。
  • 直播推流采用OBS等工具推送到Nginx-RTMP服务器,前端通过HLS协议拉流播放(video.js或hls.js)。

考试模块:在线测评与自动批改

考试模块需实现试卷创建、在线答题、自动批改(客观题)、成绩统计等功能,采用MyBatis管理试题和考试记录。

核心代码示例:客观题自动批改

@Service  
public class ExamService {  
    @Autowired  
    private ExamRecordMapper examRecordMapper;