peixue-dev/peidu/docs/fixes/2026-01-23-我的课程与学习记录关联/✅后端代码实现.md

8.5 KiB

后端代码实现 - 我的课程与学习记录关联

📝 需要在 ParentAcademyCourseController 中添加的接口

ParentAcademyCourseController.java 文件末尾添加以下代码:

// ========== 课程学习记录相关接口 ==========

private final ICourseLearningRecordService learningRecordService;

@ApiOperation("开始学习课程")
@PostMapping("/start-learning")
public Result<Map<String, Object>> startLearning(
        @RequestBody Map<String, Object> params,
        HttpServletRequest request
) {
    // 从请求中获取用户ID
    Long userId = (Long) request.getAttribute("userId");
    if (userId == null) {
        return Result.error("请先登录");
    }
    
    Long courseId = Long.valueOf(params.get("courseId").toString());
    Long purchaseId = Long.valueOf(params.get("purchaseId").toString());
    
    try {
        // 检查是否已购买
        ParentAcademyCourse course = parentAcademyCourseService.getById(courseId);
        if (course == null) {
            return Result.error("课程不存在");
        }
        
        boolean isFree = course.getIsFree() != null && course.getIsFree() == 1;
        boolean hasPurchased = purchaseService.hasPurchased(userId, courseId);
        
        if (!isFree && !hasPurchased) {
            return Result.error("请先购买课程");
        }
        
        // 创建或获取学习记录
        CourseLearningRecord record = learningRecordService.startLearning(userId, courseId, purchaseId);
        
        Map<String, Object> result = new HashMap<>();
        result.put("learningRecordId", record.getId());
        result.put("lastPosition", record.getLastPosition());
        result.put("learningProgress", record.getLearningProgress());
        result.put("isCompleted", record.getIsCompleted());
        
        return Result.success(result);
    } catch (Exception e) {
        return Result.error(e.getMessage());
    }
}

@ApiOperation("更新学习进度")
@PostMapping("/update-progress")
public Result<Map<String, Object>> updateProgress(
        @RequestBody Map<String, Object> params,
        HttpServletRequest request
) {
    // 从请求中获取用户ID
    Long userId = (Long) request.getAttribute("userId");
    if (userId == null) {
        return Result.error("请先登录");
    }
    
    Long learningRecordId = Long.valueOf(params.get("learningRecordId").toString());
    Integer position = Integer.valueOf(params.get("position").toString());
    Integer duration = Integer.valueOf(params.get("duration").toString());
    
    try {
        boolean success = learningRecordService.updateProgress(learningRecordId, position, duration);
        
        // 获取更新后的记录
        CourseLearningRecord record = learningRecordService.getById(learningRecordId);
        
        Map<String, Object> result = new HashMap<>();
        result.put("success", success);
        result.put("progress", record != null ? record.getLearningProgress() : 0);
        
        return Result.success(result);
    } catch (Exception e) {
        return Result.error(e.getMessage());
    }
}

@ApiOperation("完成课程学习")
@PostMapping("/complete-learning")
public Result<Map<String, Object>> completeLearning(
        @RequestBody Map<String, Object> params,
        HttpServletRequest request
) {
    // 从请求中获取用户ID
    Long userId = (Long) request.getAttribute("userId");
    if (userId == null) {
        return Result.error("请先登录");
    }
    
    Long learningRecordId = Long.valueOf(params.get("learningRecordId").toString());
    String notes = params.get("notes") != null ? params.get("notes").toString() : "";
    
    try {
        int pointsAwarded = learningRecordService.completeLearning(learningRecordId, notes);
        
        Map<String, Object> result = new HashMap<>();
        result.put("success", true);
        result.put("pointsAwarded", pointsAwarded);
        result.put("message", pointsAwarded > 0 ? "恭喜完成课程学习,获得" + pointsAwarded + "积分!" : "课程已完成");
        
        return Result.success(result);
    } catch (Exception e) {
        return Result.error(e.getMessage());
    }
}

@ApiOperation("获取学习历史")
@GetMapping("/learning-history")
public Result<CourseLearningRecord> getLearningHistory(
        @RequestParam Long courseId,
        HttpServletRequest request
) {
    // 从请求中获取用户ID
    Long userId = (Long) request.getAttribute("userId");
    if (userId == null) {
        return Result.error("请先登录");
    }
    
    try {
        CourseLearningRecord record = learningRecordService.getLearningRecord(userId, courseId);
        return Result.success(record);
    } catch (Exception e) {
        return Result.error(e.getMessage());
    }
}

@ApiOperation("提交课程评价")
@PostMapping("/submit-review")
public Result<?> submitReview(
        @RequestBody Map<String, Object> params,
        HttpServletRequest request
) {
    // 从请求中获取用户ID
    Long userId = (Long) request.getAttribute("userId");
    if (userId == null) {
        return Result.error("请先登录");
    }
    
    Long learningRecordId = Long.valueOf(params.get("learningRecordId").toString());
    Integer rating = Integer.valueOf(params.get("rating").toString());
    String review = params.get("review") != null ? params.get("review").toString() : "";
    
    try {
        CourseLearningRecord record = learningRecordService.getById(learningRecordId);
        if (record == null) {
            return Result.error("学习记录不存在");
        }
        
        if (record.getIsCompleted() != 1) {
            return Result.error("请先完成课程学习");
        }
        
        record.setRating(rating);
        record.setReview(review);
        learningRecordService.updateById(record);
        
        return Result.success("评价提交成功");
    } catch (Exception e) {
        return Result.error(e.getMessage());
    }
}

🔧 修改说明

1. 添加依赖注入

ParentAcademyCourseController 类的构造函数中添加:

private final ICourseLearningRecordService learningRecordService;

2. 修改 getMyCourses 接口

增强返回数据,包含学习记录信息:

@ApiOperation("获取我的课程")
@GetMapping("/my-courses")
public Result<Page<Map<String, Object>>> getMyCourses(
        @ApiParam("页码") @RequestParam(defaultValue = "1") Integer page,
        @ApiParam("每页数量") @RequestParam(defaultValue = "10") Integer pageSize,
        HttpServletRequest request
) {
    // 从请求中获取用户ID
    Long userId = (Long) request.getAttribute("userId");
    if (userId == null) {
        return Result.error("请先登录");
    }
    
    // 查询购买记录
    Page<ParentAcademyPurchase> pageParam = new Page<>(page, pageSize);
    LambdaQueryWrapper<ParentAcademyPurchase> wrapper = new LambdaQueryWrapper<>();
    wrapper.eq(ParentAcademyPurchase::getUserId, userId)
           .eq(ParentAcademyPurchase::getPaymentStatus, 1)
           .orderByDesc(ParentAcademyPurchase::getCreateTime);
    
    Page<ParentAcademyPurchase> purchasePage = purchaseService.page(pageParam, wrapper);
    
    // 组装课程信息
    Page<Map<String, Object>> resultPage = new Page<>(page, pageSize);
    resultPage.setTotal(purchasePage.getTotal());
    
    List<Map<String, Object>> records = new java.util.ArrayList<>();
    for (ParentAcademyPurchase purchase : purchasePage.getRecords()) {
        ParentAcademyCourse course = parentAcademyCourseService.getById(purchase.getCourseId());
        if (course != null) {
            // 获取学习记录
            CourseLearningRecord learningRecord = learningRecordService.getLearningRecord(userId, course.getId());
            
            Map<String, Object> item = new HashMap<>();
            item.put("purchase", purchase);
            item.put("course", course);
            item.put("learningRecord", learningRecord); // 新增学习记录
            records.add(item);
        }
    }
    resultPage.setRecords(records);
    
    return Result.success(resultPage);
}

完成后的功能

  1. 开始学习 - 创建或获取学习记录,支持断点续播
  2. 更新进度 - 自动保存学习进度和位置
  3. 完成学习 - 标记完成并发放积分奖励
  4. 学习历史 - 查看课程的学习记录
  5. 课程评价 - 完成后可以评价课程

🎁 积分奖励规则

  • 完成课程: +50积分
  • 学习笔记(>20字): +10积分
  • 必修课程额外奖励: +150积分
  • 总计最高: +210积分