8.5 KiB
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);
}
✅ 完成后的功能
- 开始学习 - 创建或获取学习记录,支持断点续播
- 更新进度 - 自动保存学习进度和位置
- 完成学习 - 标记完成并发放积分奖励
- 学习历史 - 查看课程的学习记录
- 课程评价 - 完成后可以评价课程
🎁 积分奖励规则
- 完成课程: +50积分
- 学习笔记(>20字): +10积分
- 必修课程额外奖励: +150积分
- 总计最高: +210积分