Просмотр исходного кода

学生学习进度相关埋点

honorfire 7 месяцев назад
Родитель
Сommit
c9b7d117ba
23 измененных файлов с 1422 добавлено и 0 удалено
  1. 58 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/controller/CourseStudentBehaviorSocket.java
  2. 181 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/controller/CourseStudentProgressController.java
  3. 83 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/domain/CourseStudentBehavior.java
  4. 34 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/domain/CourseStudentBehaviorEnum.java
  5. 87 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/domain/CourseStudentProgress.java
  6. 34 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/domain/CourseStudentProgressEnum.java
  7. 25 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/mapper/CourseStudentBehaviorMapper.java
  8. 25 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/mapper/CourseStudentProgressMapper.java
  9. 5 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/mapper/mapping/CourseStudentBehaviorMapper.xml
  10. 5 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/mapper/mapping/CourseStudentProgressMapper.xml
  11. 54 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/param/coursestudentbehavior/CourseStudentBehaviorAddParam.java
  12. 59 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/param/coursestudentbehavior/CourseStudentBehaviorEditParam.java
  13. 35 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/param/coursestudentbehavior/CourseStudentBehaviorIdParam.java
  14. 51 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/param/coursestudentbehavior/CourseStudentBehaviorPageParam.java
  15. 62 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/param/coursestudentprogress/CourseStudentProgressAddParam.java
  16. 65 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/param/coursestudentprogress/CourseStudentProgressEditParam.java
  17. 35 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/param/coursestudentprogress/CourseStudentProgressIdParam.java
  18. 51 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/param/coursestudentprogress/CourseStudentProgressPageParam.java
  19. 83 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/CourseStudentBehaviorService.java
  20. 106 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/CourseStudentProgressService.java
  21. 99 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/impl/CourseStudentBehaviorServiceImpl.java
  22. 157 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/impl/CourseStudentProgressServiceImpl.java
  23. 28 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/util/SpringContextHolder.java

+ 58 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/controller/CourseStudentBehaviorSocket.java

@@ -0,0 +1,58 @@
+package vip.xiaonuo.disk.controller;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+import vip.xiaonuo.auth.core.util.StpLoginUserUtil;
+
+import javax.websocket.*;
+import javax.websocket.server.PathParam;
+import javax.websocket.server.ServerEndpoint;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * 测试websocket
+ *
+ * @author jinjilong
+ */
+@Slf4j
+@Component
+@ServerEndpoint("/webSocket/courseStudentBehavior/{clientId}?courseId={courseId}&userId=${userId}")
+public class CourseStudentBehaviorSocket {
+
+    private Session session;
+
+
+
+
+    private static ConcurrentHashMap<String, CourseStudentBehaviorSocket> meetingWebSocket = new ConcurrentHashMap<>();
+
+    @OnOpen
+    public void onOpen(Session session, @PathParam(value = "courseId") String courseId, @PathParam(value = "userId") String userId) {
+        System.out.println("用户:" + userId + "连接成功");
+
+//        session.getUserProperties().put("userId", userId);
+//        session.getUserProperties().put("courseId", courseId);
+    }
+
+
+    @OnClose
+    public void onClose() {
+
+    }
+
+
+    @OnMessage
+    public void onMessage(String message, Session session) throws Exception
+    {
+
+
+
+    }
+
+    @OnError
+    public void onError(Session session, Throwable throwable) {
+
+    }
+
+
+}

+ 181 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/controller/CourseStudentProgressController.java

@@ -0,0 +1,181 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.disk.controller;
+
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollStreamUtil;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import com.github.xiaoymin.knife4j.annotations.ApiSupport;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RestController;
+import vip.xiaonuo.auth.core.util.StpLoginUserUtil;
+import vip.xiaonuo.common.annotation.CommonLog;
+import vip.xiaonuo.common.pojo.CommonResult;
+import vip.xiaonuo.common.pojo.CommonValidList;
+import vip.xiaonuo.disk.domain.CourseStudentProgress;
+import vip.xiaonuo.disk.param.courseclasshourfilerelate.CourseRelateIdParam;
+import vip.xiaonuo.disk.param.coursestudentprogress.CourseStudentProgressAddParam;
+import vip.xiaonuo.disk.param.coursestudentprogress.CourseStudentProgressEditParam;
+import vip.xiaonuo.disk.param.coursestudentprogress.CourseStudentProgressIdParam;
+import vip.xiaonuo.disk.param.coursestudentprogress.CourseStudentProgressPageParam;
+import vip.xiaonuo.disk.service.CourseStudentProgressService;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import javax.validation.Valid;
+import javax.validation.constraints.NotEmpty;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * 课程学生-学习进度表控制器
+ *
+ * @author honorfire
+ * @date  2025/07/30 14:57
+ */
+@Api(tags = "课程学生-学习进度表控制器")
+@ApiSupport(author = "SNOWY_TEAM", order = 1)
+@RestController
+@Validated
+public class CourseStudentProgressController {
+
+    @Resource
+    private CourseStudentProgressService courseStudentProgressService;
+
+    /**
+     * 获取课程学生-学习进度表分页
+     *
+     * @author honorfire
+     * @date  2025/07/30 14:57
+     */
+    @ApiOperationSupport(order = 1)
+    @ApiOperation("获取课程学生-学习进度表分页")
+    @SaCheckPermission("/disk/coursestudentprogress/page")
+    @GetMapping("/disk/coursestudentprogress/page")
+    public CommonResult<Page<CourseStudentProgress>> page(CourseStudentProgressPageParam courseStudentProgressPageParam) {
+        return CommonResult.data(courseStudentProgressService.page(courseStudentProgressPageParam));
+    }
+
+    /**
+     * 课程学生学习进度表-添加
+     *
+     * @author honorfire
+     * @date  2025/07/30 14:57
+     */
+    @ApiOperationSupport(order = 2)
+    @ApiOperation("课程学生学习进度表-添加")
+    @CommonLog("课程学生学习进度表-添加")
+    @PostMapping("/disk/coursestudentprogress/add")
+    public CommonResult<String> add(@RequestBody @Valid CourseStudentProgressAddParam courseStudentProgressAddParam) {
+        Map param=new HashMap();
+        CourseStudentProgress courseStudentProgress=BeanUtil.toBean(courseStudentProgressAddParam, CourseStudentProgress.class);
+        String userId =StpLoginUserUtil.getLoginUser().getId();
+        courseStudentProgress.setUserId(userId);
+        //进度不能覆盖,查询该学生该课程上一次的学习进度,如果本次进度不大于最高的进度,就只存最高的进度
+        param.put("userId", userId);
+        param.put("hourId", courseStudentProgress.getHourId());
+        List<CourseStudentProgress> alreadyList=courseStudentProgressService.wrapperList(param);
+        List<String> alreadyProgressList=CollStreamUtil.toList(alreadyList, CourseStudentProgress::getProgress);
+        //将String转为Long
+        List<Long> alreadyProgressLongList=alreadyProgressList.stream().map(Long::parseLong).collect(Collectors.toList());
+        //取出最大的进度
+        Long maxProgress=alreadyProgressLongList.stream().max(Long::compareTo).orElse(0L);
+        if(Long.valueOf(courseStudentProgressAddParam.getProgress()).longValue()<maxProgress.longValue())courseStudentProgress.setProgress(String.valueOf(maxProgress));
+
+        courseStudentProgressService.addOne(courseStudentProgress);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 课程学生学习进度-查询最近一次进度
+     *
+     * @author honorfire
+     * @date  2025/07/30 14:57
+     */
+    @ApiOperationSupport(order = 5)
+    @ApiOperation("课程学生学习进度-查询最近一次进度")
+    @GetMapping("/disk/coursestudentprogress/theLastDetail")
+    public CommonResult<CourseStudentProgress> theLastDetail(@Valid CourseStudentProgressPageParam courseStudentProgressPageParam, HttpServletRequest req) {
+        Map param=new HashMap();
+        param.put("userId", StpLoginUserUtil.getLoginUser().getId());
+        param.put("hourId", req.getParameter("hourId"));
+        //是否查询最近一次进度,0否1是
+        param.put("isLast", "1");
+        List<CourseStudentProgress> alreadyList=courseStudentProgressService.wrapperList(param);
+        CourseStudentProgress courseStudentProgress=null;
+        if(alreadyList.size()>0)
+        {
+            courseStudentProgress=alreadyList.get(0);
+        }
+        return CommonResult.data(courseStudentProgress);
+    }
+
+
+    /**
+     * 编辑课程学生-学习进度表
+     *
+     * @author honorfire
+     * @date  2025/07/30 14:57
+     */
+    @ApiOperationSupport(order = 3)
+    @ApiOperation("编辑课程学生-学习进度表")
+    @CommonLog("编辑课程学生-学习进度表")
+    @PostMapping("/disk/coursestudentprogress/edit")
+    public CommonResult<String> edit(@RequestBody @Valid CourseStudentProgressEditParam courseStudentProgressEditParam) {
+        CourseStudentProgress courseStudentProgress=BeanUtil.toBean(courseStudentProgressEditParam, CourseStudentProgress.class);
+        courseStudentProgressService.editOne(courseStudentProgress);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 删除课程学生-学习进度表
+     *
+     * @author honorfire
+     * @date  2025/07/30 14:57
+     */
+    @ApiOperationSupport(order = 4)
+    @ApiOperation("删除课程学生-学习进度表")
+    @CommonLog("删除课程学生-学习进度表")
+    @SaCheckPermission("/disk/coursestudentprogress/delete")
+    @PostMapping("/disk/coursestudentprogress/delete")
+    public CommonResult<String> delete(@RequestBody @Valid @NotEmpty(message = "集合不能为空")
+                                                   CommonValidList<CourseStudentProgressIdParam> courseStudentProgressIdParamList) {
+        courseStudentProgressService.delete(courseStudentProgressIdParamList);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 获取课程学生-学习进度表详情
+     *
+     * @author honorfire
+     * @date  2025/07/30 14:57
+     */
+    @ApiOperationSupport(order = 5)
+    @ApiOperation("获取课程学生-学习进度表详情")
+    @SaCheckPermission("/disk/coursestudentprogress/detail")
+    @GetMapping("/disk/coursestudentprogress/detail")
+    public CommonResult<CourseStudentProgress> detail(@Valid CourseStudentProgressIdParam courseStudentProgressIdParam) {
+        return CommonResult.data(courseStudentProgressService.detail(courseStudentProgressIdParam));
+    }
+
+}

+ 83 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/domain/CourseStudentBehavior.java

@@ -0,0 +1,83 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.disk.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 课程学生-学习行为表实体
+ *
+ * @author honorfire
+ * @date  2025/07/23 16:41
+ **/
+@Getter
+@Setter
+@TableName("COURSE_STUDENT_BEHAVIOR")
+public class CourseStudentBehavior {
+
+    /** ID */
+    @TableId
+    @ApiModelProperty(value = "ID", position = 1)
+    private String id;
+
+    /** 人员id */
+    @ApiModelProperty(value = "人员id", position = 2)
+    private String userId;
+
+    /** 课时id */
+    @ApiModelProperty(value = "课时id", position = 3)
+    private String hourId;
+
+    /** 本次学习视频开始时间 */
+    @ApiModelProperty(value = "本次学习视频开始时间", position = 4)
+    private String startTime;
+
+    /** 本次学习视频结束时间 */
+    @ApiModelProperty(value = "本次学习视频结束时间", position = 5)
+    private String endTime;
+
+    /** 本次学习视频经过时间 */
+    @ApiModelProperty(value = "本次学习视频经过时间", position = 6)
+    private Long duration;
+
+    /** 删除标记(NOT_DELETE-未删除) */
+    @ApiModelProperty(value = "删除标记(NOT_DELETE-未删除)", position = 7)
+    @TableLogic
+    @TableField(fill = FieldFill.INSERT)
+    private String deleteFlag;
+
+    /** 记录更新时间 */
+    @ApiModelProperty(value = "记录更新时间", position = 8)
+    @TableField(fill = FieldFill.UPDATE)
+    private Date updateTime;
+
+    /** 记录创建时间 */
+    @ApiModelProperty(value = "记录创建时间", position = 9)
+    @TableField(fill = FieldFill.INSERT)
+    private Date createTime;
+
+    /** 记录创建人 */
+    @ApiModelProperty(value = "记录创建人", position = 10)
+    @TableField(fill = FieldFill.INSERT)
+    private String createUser;
+
+    /** 记录更新人 */
+    @ApiModelProperty(value = "记录更新人", position = 11)
+    @TableField(fill = FieldFill.UPDATE)
+    private String updateUser;
+}

+ 34 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/domain/CourseStudentBehaviorEnum.java

@@ -0,0 +1,34 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.disk.domain;
+
+import lombok.Getter;
+
+/**
+ * 课程学生-学习行为表枚举
+ *
+ * @author honorfire
+ * @date  2025/07/23 16:41
+ **/
+@Getter
+public enum CourseStudentBehaviorEnum {
+
+    /** 测试 */
+    TEST("TEST");
+
+    private final String value;
+
+    CourseStudentBehaviorEnum(String value) {
+        this.value = value;
+    }
+}

+ 87 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/domain/CourseStudentProgress.java

@@ -0,0 +1,87 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.disk.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 课程学生-学习进度表实体
+ *
+ * @author honorfire
+ * @date  2025/07/30 14:57
+ **/
+@Getter
+@Setter
+@TableName("COURSE_STUDENT_PROGRESS")
+public class CourseStudentProgress {
+
+    /** ID */
+    @TableId
+    @ApiModelProperty(value = "ID", position = 1)
+    private String id;
+
+    /** 人员id */
+    @ApiModelProperty(value = "人员id", position = 2)
+    private String userId;
+
+    /** 课时id */
+    @ApiModelProperty(value = "课时id", position = 3)
+    private String hourId;
+
+    /** 当前学习进度 */
+    @ApiModelProperty(value = "当前学习进度", position = 4)
+    private String progress;
+
+    /** 删除标记(NOT_DELETE-未删除) */
+    @ApiModelProperty(value = "删除标记(NOT_DELETE-未删除)", position = 5)
+    @TableLogic
+    @TableField(fill = FieldFill.INSERT)
+    private String deleteFlag;
+
+    /** 记录更新时间 */
+    @ApiModelProperty(value = "记录更新时间", position = 6)
+    @TableField(fill = FieldFill.UPDATE)
+    private Date updateTime;
+
+    /** 记录创建时间 */
+    @ApiModelProperty(value = "记录创建时间", position = 7)
+    @TableField(fill = FieldFill.INSERT)
+    private Date createTime;
+
+    /** 记录创建人 */
+    @ApiModelProperty(value = "记录创建人", position = 8)
+    @TableField(fill = FieldFill.INSERT)
+    private String createUser;
+
+    /** 记录更新人 */
+    @ApiModelProperty(value = "记录更新人", position = 9)
+    @TableField(fill = FieldFill.UPDATE)
+    private String updateUser;
+
+    /** 批次记录(用来预留可能开始结束时间不能一起给我,需要存多次的情况) */
+    @ApiModelProperty(value = "批次记录", position = 10)
+    private String batch;
+
+    /** 本次学习视频开始时间(应2025.7.30内部会议要求,将进度和记录存进同一个表) */
+    @ApiModelProperty(value = "本次学习视频开始时间", position = 4)
+    private String startTime;
+
+    /** 本次学习视频结束时间(应2025.7.30内部会议要求,将进度和记录存进同一个表) */
+    @ApiModelProperty(value = "本次学习视频结束时间", position = 5)
+    private String endTime;
+}

+ 34 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/domain/CourseStudentProgressEnum.java

@@ -0,0 +1,34 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.disk.domain;
+
+import lombok.Getter;
+
+/**
+ * 课程学生-学习进度表枚举
+ *
+ * @author honorfire
+ * @date  2025/07/30 14:57
+ **/
+@Getter
+public enum CourseStudentProgressEnum {
+
+    /** 测试 */
+    TEST("TEST");
+
+    private final String value;
+
+    CourseStudentProgressEnum(String value) {
+        this.value = value;
+    }
+}

+ 25 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/mapper/CourseStudentBehaviorMapper.java

@@ -0,0 +1,25 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.disk.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import vip.xiaonuo.disk.domain.CourseStudentBehavior;
+
+/**
+ * 课程学生-学习行为表Mapper接口
+ *
+ * @author honorfire
+ * @date  2025/07/23 16:41
+ **/
+public interface CourseStudentBehaviorMapper extends BaseMapper<CourseStudentBehavior> {
+}

+ 25 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/mapper/CourseStudentProgressMapper.java

@@ -0,0 +1,25 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.disk.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import vip.xiaonuo.disk.domain.CourseStudentProgress;
+
+/**
+ * 课程学生-学习进度表Mapper接口
+ *
+ * @author honorfire
+ * @date  2025/07/30 14:57
+ **/
+public interface CourseStudentProgressMapper extends BaseMapper<CourseStudentProgress> {
+}

+ 5 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/mapper/mapping/CourseStudentBehaviorMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="vip.xiaonuo.disk.mapper.CourseStudentBehaviorMapper">
+
+</mapper>

+ 5 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/mapper/mapping/CourseStudentProgressMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="vip.xiaonuo.disk.mapper.CourseStudentProgressMapper">
+
+</mapper>

+ 54 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/param/coursestudentbehavior/CourseStudentBehaviorAddParam.java

@@ -0,0 +1,54 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.disk.param.coursestudentbehavior;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 课程学生-学习行为表添加参数
+ *
+ * @author honorfire
+ * @date  2025/07/23 16:41
+ **/
+@Getter
+@Setter
+public class CourseStudentBehaviorAddParam {
+
+    /** 人员id */
+    @ApiModelProperty(value = "人员id", position = 2)
+    private String userId;
+
+    /** 课时id */
+    @ApiModelProperty(value = "课时id", position = 3)
+    private String hourId;
+
+    /** 本次学习视频开始时间 */
+    @ApiModelProperty(value = "本次学习视频开始时间", position = 4)
+    private String startTime;
+
+    /** 本次学习视频结束时间 */
+    @ApiModelProperty(value = "本次学习视频结束时间", position = 5)
+    private String endTime;
+
+    /** 本次学习视频经过时间 */
+    @ApiModelProperty(value = "本次学习视频经过时间", position = 6)
+    private Long duration;
+
+}

+ 59 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/param/coursestudentbehavior/CourseStudentBehaviorEditParam.java

@@ -0,0 +1,59 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.disk.param.coursestudentbehavior;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 课程学生-学习行为表编辑参数
+ *
+ * @author honorfire
+ * @date  2025/07/23 16:41
+ **/
+@Getter
+@Setter
+public class CourseStudentBehaviorEditParam {
+
+    /** ID */
+    @ApiModelProperty(value = "ID", required = true, position = 1)
+    @NotBlank(message = "id不能为空")
+    private String id;
+
+    /** 人员id */
+    @ApiModelProperty(value = "人员id", position = 2)
+    private String userId;
+
+    /** 课时id */
+    @ApiModelProperty(value = "课时id", position = 3)
+    private String hourId;
+
+    /** 本次学习视频开始时间 */
+    @ApiModelProperty(value = "本次学习视频开始时间", position = 4)
+    private String startTime;
+
+    /** 本次学习视频结束时间 */
+    @ApiModelProperty(value = "本次学习视频结束时间", position = 5)
+    private String endTime;
+
+    /** 本次学习视频经过时间 */
+    @ApiModelProperty(value = "本次学习视频经过时间", position = 6)
+    private Long duration;
+
+}

+ 35 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/param/coursestudentbehavior/CourseStudentBehaviorIdParam.java

@@ -0,0 +1,35 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.disk.param.coursestudentbehavior;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * 课程学生-学习行为表Id参数
+ *
+ * @author honorfire
+ * @date  2025/07/23 16:41
+ **/
+@Getter
+@Setter
+public class CourseStudentBehaviorIdParam {
+
+    /** ID */
+    @ApiModelProperty(value = "ID", required = true)
+    @NotBlank(message = "id不能为空")
+    private String id;
+}

+ 51 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/param/coursestudentbehavior/CourseStudentBehaviorPageParam.java

@@ -0,0 +1,51 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.disk.param.coursestudentbehavior;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 课程学生-学习行为表查询参数
+ *
+ * @author honorfire
+ * @date  2025/07/23 16:41
+ **/
+@Getter
+@Setter
+public class CourseStudentBehaviorPageParam {
+
+    /** 当前页 */
+    @ApiModelProperty(value = "当前页码")
+    private Integer current;
+
+    /** 每页条数 */
+    @ApiModelProperty(value = "每页条数")
+    private Integer size;
+
+    /** 排序字段 */
+    @ApiModelProperty(value = "排序字段,字段驼峰名称,如:userName")
+    private String sortField;
+
+    /** 排序方式 */
+    @ApiModelProperty(value = "排序方式,升序:ASCEND;降序:DESCEND")
+    private String sortOrder;
+
+    /** 关键词 */
+    @ApiModelProperty(value = "关键词")
+    private String searchKey;
+
+}

+ 62 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/param/coursestudentprogress/CourseStudentProgressAddParam.java

@@ -0,0 +1,62 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.disk.param.coursestudentprogress;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 课程学生-学习进度表添加参数
+ *
+ * @author honorfire
+ * @date  2025/07/30 14:57
+ **/
+@Getter
+@Setter
+public class CourseStudentProgressAddParam {
+
+    /** 人员id */
+    @ApiModelProperty(value = "人员id", position = 2)
+    private String userId;
+
+    /** 课时id */
+    @ApiModelProperty(value = "课时id", position = 3)
+    @NotBlank(message = "课时id不能为空")
+    private String hourId;
+
+    /** 当前学习进度 */
+    @ApiModelProperty(value = "当前学习进度", position = 4)
+    @NotBlank(message = "当前学习进度不能为空")
+    private String progress;
+
+    /** 批次记录(用来预留可能开始结束时间不能一起给我,需要存多次的情况) */
+    @ApiModelProperty(value = "批次记录", position = 10)
+    private String batch;
+
+    /** 本次学习视频开始时间(应2025.7.30内部会议要求,将进度和记录存进同一个表) */
+    @ApiModelProperty(value = "本次学习视频开始时间", position = 4)
+    private String startTime;
+
+    /** 本次学习视频结束时间(应2025.7.30内部会议要求,将进度和记录存进同一个表) */
+    @ApiModelProperty(value = "本次学习视频结束时间", position = 5)
+    private String endTime;
+
+
+
+}

+ 65 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/param/coursestudentprogress/CourseStudentProgressEditParam.java

@@ -0,0 +1,65 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.disk.param.coursestudentprogress;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 课程学生-学习进度表编辑参数
+ *
+ * @author honorfire
+ * @date  2025/07/30 14:57
+ **/
+@Getter
+@Setter
+public class CourseStudentProgressEditParam {
+
+    /** ID */
+    @ApiModelProperty(value = "ID", required = true, position = 1)
+    @NotBlank(message = "id不能为空")
+    private String id;
+
+    /** 人员id */
+    @ApiModelProperty(value = "人员id", position = 2)
+    private String userId;
+
+    /** 课时id */
+    @ApiModelProperty(value = "课时id", position = 3)
+    private String hourId;
+
+    /** 当前学习进度 */
+    @ApiModelProperty(value = "当前学习进度", position = 4)
+    private String progress;
+
+    /** 批次记录(用来预留可能开始结束时间不能一起给我,需要存多次的情况) */
+    @ApiModelProperty(value = "批次记录", position = 10)
+    private String batch;
+
+    /** 本次学习视频开始时间(应2025.7.30内部会议要求,将进度和记录存进同一个表) */
+    @ApiModelProperty(value = "本次学习视频开始时间", position = 4)
+    private String startTime;
+
+    /** 本次学习视频结束时间(应2025.7.30内部会议要求,将进度和记录存进同一个表) */
+    @ApiModelProperty(value = "本次学习视频结束时间", position = 5)
+    private String endTime;
+
+
+
+}

+ 35 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/param/coursestudentprogress/CourseStudentProgressIdParam.java

@@ -0,0 +1,35 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.disk.param.coursestudentprogress;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * 课程学生-学习进度表Id参数
+ *
+ * @author honorfire
+ * @date  2025/07/30 14:57
+ **/
+@Getter
+@Setter
+public class CourseStudentProgressIdParam {
+
+    /** ID */
+    @ApiModelProperty(value = "ID", required = true)
+    @NotBlank(message = "id不能为空")
+    private String id;
+}

+ 51 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/param/coursestudentprogress/CourseStudentProgressPageParam.java

@@ -0,0 +1,51 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.disk.param.coursestudentprogress;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 课程学生-学习进度表查询参数
+ *
+ * @author honorfire
+ * @date  2025/07/30 14:57
+ **/
+@Getter
+@Setter
+public class CourseStudentProgressPageParam {
+
+    /** 当前页 */
+    @ApiModelProperty(value = "当前页码")
+    private Integer current;
+
+    /** 每页条数 */
+    @ApiModelProperty(value = "每页条数")
+    private Integer size;
+
+    /** 排序字段 */
+    @ApiModelProperty(value = "排序字段,字段驼峰名称,如:userName")
+    private String sortField;
+
+    /** 排序方式 */
+    @ApiModelProperty(value = "排序方式,升序:ASCEND;降序:DESCEND")
+    private String sortOrder;
+
+    /** 关键词 */
+    @ApiModelProperty(value = "关键词")
+    private String searchKey;
+
+}

+ 83 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/CourseStudentBehaviorService.java

@@ -0,0 +1,83 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.disk.service;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import vip.xiaonuo.auth.core.pojo.SaBaseLoginUser;
+import vip.xiaonuo.disk.domain.CourseStudentBehavior;
+import vip.xiaonuo.disk.param.coursestudentbehavior.CourseStudentBehaviorAddParam;
+import vip.xiaonuo.disk.param.coursestudentbehavior.CourseStudentBehaviorEditParam;
+import vip.xiaonuo.disk.param.coursestudentbehavior.CourseStudentBehaviorIdParam;
+import vip.xiaonuo.disk.param.coursestudentbehavior.CourseStudentBehaviorPageParam;
+
+import java.util.List;
+
+/**
+ * 课程学生-学习行为表Service接口
+ *
+ * @author honorfire
+ * @date  2025/07/23 16:41
+ **/
+public interface CourseStudentBehaviorService extends IService<CourseStudentBehavior> {
+
+    /**
+     * 获取课程学生-学习行为表分页
+     *
+     * @author honorfire
+     * @date  2025/07/23 16:41
+     */
+    Page<CourseStudentBehavior> page(CourseStudentBehaviorPageParam courseStudentBehaviorPageParam);
+
+
+    /**
+     * 添加课程学生-学习行为表
+     *
+     * @author honorfire
+     * @date  2025/07/23 16:41
+     */
+    void add(CourseStudentBehaviorAddParam courseStudentBehaviorAddParam);
+
+    /**
+     * 编辑课程学生-学习行为表
+     *
+     * @author honorfire
+     * @date  2025/07/23 16:41
+     */
+    void edit(CourseStudentBehaviorEditParam courseStudentBehaviorEditParam);
+
+    /**
+     * 删除课程学生-学习行为表
+     *
+     * @author honorfire
+     * @date  2025/07/23 16:41
+     */
+    void delete(List<CourseStudentBehaviorIdParam> courseStudentBehaviorIdParamList);
+
+    /**
+     * 获取课程学生-学习行为表详情
+     *
+     * @author honorfire
+     * @date  2025/07/23 16:41
+     */
+    CourseStudentBehavior detail(CourseStudentBehaviorIdParam courseStudentBehaviorIdParam);
+
+    /**
+     * 获取课程学生-学习行为表详情
+     *
+     * @author honorfire
+     * @date  2025/07/23 16:41
+     **/
+    CourseStudentBehavior queryEntity(String id);
+
+}

+ 106 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/CourseStudentProgressService.java

@@ -0,0 +1,106 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.disk.service;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import vip.xiaonuo.disk.domain.CourseStudentProgress;
+import vip.xiaonuo.disk.param.coursestudentprogress.CourseStudentProgressAddParam;
+import vip.xiaonuo.disk.param.coursestudentprogress.CourseStudentProgressEditParam;
+import vip.xiaonuo.disk.param.coursestudentprogress.CourseStudentProgressIdParam;
+import vip.xiaonuo.disk.param.coursestudentprogress.CourseStudentProgressPageParam;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 课程学生-学习进度表Service接口
+ *
+ * @author honorfire
+ * @date  2025/07/30 14:57
+ **/
+public interface CourseStudentProgressService extends IService<CourseStudentProgress> {
+
+    /**
+     * 获取课程学生-学习进度表分页
+     *
+     * @author honorfire
+     * @date  2025/07/30 14:57
+     */
+    Page<CourseStudentProgress> page(CourseStudentProgressPageParam courseStudentProgressPageParam);
+
+    /**
+     * 课程学生学习进度-封装列表
+     *
+     * @author honorfire
+     * @date  2025/07/30 14:57
+     */
+    List<CourseStudentProgress> wrapperList(Map param);
+
+    /**
+     * 添加课程学生-学习进度表
+     *
+     * @author honorfire
+     * @date  2025/07/30 14:57
+     */
+    void add(CourseStudentProgressAddParam courseStudentProgressAddParam);
+
+    /**
+     * 课程学生-学习进度表-添加
+     *
+     * @author honorfire
+     * @date  2025/07/30 14:57
+     */
+    CourseStudentProgress addOne(CourseStudentProgress courseStudentProgress);
+
+    /**
+     * 编辑课程学生-学习进度表
+     *
+     * @author honorfire
+     * @date  2025/07/30 14:57
+     */
+    void edit(CourseStudentProgressEditParam courseStudentProgressEditParam);
+
+    /**
+     * 课程学生-学习进度表-编辑
+     *
+     * @author honorfire
+     * @date  2025/07/30 14:57
+     */
+    CourseStudentProgress editOne(CourseStudentProgress courseStudentProgress);
+
+    /**
+     * 删除课程学生-学习进度表
+     *
+     * @author honorfire
+     * @date  2025/07/30 14:57
+     */
+    void delete(List<CourseStudentProgressIdParam> courseStudentProgressIdParamList);
+
+    /**
+     * 获取课程学生-学习进度表详情
+     *
+     * @author honorfire
+     * @date  2025/07/30 14:57
+     */
+    CourseStudentProgress detail(CourseStudentProgressIdParam courseStudentProgressIdParam);
+
+    /**
+     * 获取课程学生-学习进度表详情
+     *
+     * @author honorfire
+     * @date  2025/07/30 14:57
+     **/
+    CourseStudentProgress queryEntity(String id);
+
+}

+ 99 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/impl/CourseStudentBehaviorServiceImpl.java

@@ -0,0 +1,99 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.disk.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollStreamUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import vip.xiaonuo.auth.core.pojo.SaBaseLoginUser;
+import vip.xiaonuo.auth.core.util.StpLoginUserUtil;
+import vip.xiaonuo.common.enums.CommonSortOrderEnum;
+import vip.xiaonuo.common.exception.CommonException;
+import vip.xiaonuo.common.page.CommonPageRequest;
+import vip.xiaonuo.disk.domain.CourseStudentBehavior;
+import vip.xiaonuo.disk.mapper.CourseStudentBehaviorMapper;
+import vip.xiaonuo.disk.param.coursestudentbehavior.CourseStudentBehaviorAddParam;
+import vip.xiaonuo.disk.param.coursestudentbehavior.CourseStudentBehaviorEditParam;
+import vip.xiaonuo.disk.param.coursestudentbehavior.CourseStudentBehaviorIdParam;
+import vip.xiaonuo.disk.param.coursestudentbehavior.CourseStudentBehaviorPageParam;
+import vip.xiaonuo.disk.service.CourseStudentBehaviorService;
+
+import java.util.List;
+
+/**
+ * 课程学生-学习行为表Service接口实现类
+ *
+ * @author honorfire
+ * @date  2025/07/23 16:41
+ **/
+@Service
+public class CourseStudentBehaviorServiceImpl extends ServiceImpl<CourseStudentBehaviorMapper, CourseStudentBehavior> implements CourseStudentBehaviorService {
+
+
+
+    @Override
+    public Page<CourseStudentBehavior> page(CourseStudentBehaviorPageParam courseStudentBehaviorPageParam) {
+        QueryWrapper<CourseStudentBehavior> queryWrapper = new QueryWrapper<>();
+        if(ObjectUtil.isAllNotEmpty(courseStudentBehaviorPageParam.getSortField(), courseStudentBehaviorPageParam.getSortOrder())) {
+            CommonSortOrderEnum.validate(courseStudentBehaviorPageParam.getSortOrder());
+            queryWrapper.orderBy(true, courseStudentBehaviorPageParam.getSortOrder().equals(CommonSortOrderEnum.ASC.getValue()),
+                    StrUtil.toUnderlineCase(courseStudentBehaviorPageParam.getSortField()));
+        } else {
+            queryWrapper.lambda().orderByAsc(CourseStudentBehavior::getId);
+        }
+        return this.page(CommonPageRequest.defaultPage(), queryWrapper);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void add(CourseStudentBehaviorAddParam courseStudentBehaviorAddParam) {
+        CourseStudentBehavior courseStudentBehavior = BeanUtil.toBean(courseStudentBehaviorAddParam, CourseStudentBehavior.class);
+        this.save(courseStudentBehavior);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void edit(CourseStudentBehaviorEditParam courseStudentBehaviorEditParam) {
+        CourseStudentBehavior courseStudentBehavior = this.queryEntity(courseStudentBehaviorEditParam.getId());
+        BeanUtil.copyProperties(courseStudentBehaviorEditParam, courseStudentBehavior);
+        this.updateById(courseStudentBehavior);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void delete(List<CourseStudentBehaviorIdParam> courseStudentBehaviorIdParamList) {
+        // 执行删除
+        this.removeByIds(CollStreamUtil.toList(courseStudentBehaviorIdParamList, CourseStudentBehaviorIdParam::getId));
+    }
+
+    @Override
+    public CourseStudentBehavior detail(CourseStudentBehaviorIdParam courseStudentBehaviorIdParam) {
+        return this.queryEntity(courseStudentBehaviorIdParam.getId());
+    }
+
+    @Override
+    public CourseStudentBehavior queryEntity(String id) {
+        CourseStudentBehavior courseStudentBehavior = this.getById(id);
+        if(ObjectUtil.isEmpty(courseStudentBehavior)) {
+            throw new CommonException("课程学生-学习行为表不存在,id值为:{}", id);
+        }
+        return courseStudentBehavior;
+    }
+
+}

+ 157 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/impl/CourseStudentProgressServiceImpl.java

@@ -0,0 +1,157 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.disk.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollStreamUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import vip.xiaonuo.common.enums.CommonSortOrderEnum;
+import vip.xiaonuo.common.exception.CommonException;
+import vip.xiaonuo.common.page.CommonPageRequest;
+import vip.xiaonuo.disk.domain.Chapter;
+import vip.xiaonuo.disk.domain.CourseStudentProgress;
+import vip.xiaonuo.disk.mapper.CourseStudentProgressMapper;
+import vip.xiaonuo.disk.param.coursestudentprogress.CourseStudentProgressAddParam;
+import vip.xiaonuo.disk.param.coursestudentprogress.CourseStudentProgressEditParam;
+import vip.xiaonuo.disk.param.coursestudentprogress.CourseStudentProgressIdParam;
+import vip.xiaonuo.disk.param.coursestudentprogress.CourseStudentProgressPageParam;
+import vip.xiaonuo.disk.service.CourseStudentProgressService;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 课程学生-学习进度表Service接口实现类
+ *
+ * @author honorfire
+ * @date  2025/07/30 14:57
+ **/
+@Service
+public class CourseStudentProgressServiceImpl extends ServiceImpl<CourseStudentProgressMapper, CourseStudentProgress> implements CourseStudentProgressService {
+
+
+    @Override
+    public Page<CourseStudentProgress> page(CourseStudentProgressPageParam courseStudentProgressPageParam) {
+        QueryWrapper<CourseStudentProgress> queryWrapper = new QueryWrapper<>();
+        if(ObjectUtil.isAllNotEmpty(courseStudentProgressPageParam.getSortField(), courseStudentProgressPageParam.getSortOrder())) {
+            CommonSortOrderEnum.validate(courseStudentProgressPageParam.getSortOrder());
+            queryWrapper.orderBy(true, courseStudentProgressPageParam.getSortOrder().equals(CommonSortOrderEnum.ASC.getValue()),
+                    StrUtil.toUnderlineCase(courseStudentProgressPageParam.getSortField()));
+        } else {
+            queryWrapper.lambda().orderByAsc(CourseStudentProgress::getId);
+        }
+        return this.page(CommonPageRequest.defaultPage(), queryWrapper);
+    }
+
+    /**
+     * 课程学生学习进度-封装列表
+     *
+     * @author honorfire
+     * @date  2025/07/30 14:57
+     */
+    @Override
+    public List<CourseStudentProgress> wrapperList(Map param)
+    {
+        QueryWrapper<CourseStudentProgress> queryWrapper = new QueryWrapper<>();
+        if(ObjectUtil.isNotEmpty(param.get("userId")))
+        {
+            queryWrapper.lambda().eq(CourseStudentProgress::getUserId, param.get("userId"));
+        }
+        if(ObjectUtil.isNotEmpty(param.get("hourId")))
+        {
+            queryWrapper.lambda().eq(CourseStudentProgress::getHourId, param.get("hourId"));
+        }
+        if(ObjectUtil.isNotEmpty(param.get("isLast")))
+        {
+            if("1".equals(param.get("isLast")))
+            {
+                queryWrapper.lambda().orderByDesc(CourseStudentProgress::getCreateTime);
+            }
+        }
+
+
+        return this.list(queryWrapper);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void add(CourseStudentProgressAddParam courseStudentProgressAddParam) {
+        CourseStudentProgress courseStudentProgress = BeanUtil.toBean(courseStudentProgressAddParam, CourseStudentProgress.class);
+        this.save(courseStudentProgress);
+    }
+
+    /**
+     * 课程学生-学习进度表-添加
+     *
+     * @author honorfire
+     * @date  2025/07/30 14:57
+     */
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public CourseStudentProgress addOne(CourseStudentProgress courseStudentProgress)
+    {
+        this.save(courseStudentProgress);
+        return courseStudentProgress;
+    }
+
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void edit(CourseStudentProgressEditParam courseStudentProgressEditParam) {
+        CourseStudentProgress courseStudentProgress = this.queryEntity(courseStudentProgressEditParam.getId());
+        BeanUtil.copyProperties(courseStudentProgressEditParam, courseStudentProgress);
+        this.updateById(courseStudentProgress);
+    }
+
+    /**
+     * 课程学生-学习进度表-编辑
+     *
+     * @author honorfire
+     * @date  2025/07/30 14:57
+     */
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public CourseStudentProgress editOne(CourseStudentProgress courseStudentProgress)
+    {
+        this.updateById(courseStudentProgress);
+        return courseStudentProgress;
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void delete(List<CourseStudentProgressIdParam> courseStudentProgressIdParamList) {
+        // 执行删除
+        this.removeByIds(CollStreamUtil.toList(courseStudentProgressIdParamList, CourseStudentProgressIdParam::getId));
+    }
+
+    @Override
+    public CourseStudentProgress detail(CourseStudentProgressIdParam courseStudentProgressIdParam) {
+        return this.queryEntity(courseStudentProgressIdParam.getId());
+    }
+
+    @Override
+    public CourseStudentProgress queryEntity(String id) {
+        CourseStudentProgress courseStudentProgress = this.getById(id);
+        if(ObjectUtil.isEmpty(courseStudentProgress)) {
+            throw new CommonException("课程学生-学习进度表不存在,id值为:{}", id);
+        }
+        return courseStudentProgress;
+    }
+
+}

+ 28 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/util/SpringContextHolder.java

@@ -0,0 +1,28 @@
+package vip.xiaonuo.disk.util;
+
+import org.springframework.beans.BeansException;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.ApplicationContextAware;
+import org.springframework.stereotype.Component;
+
+/**
+ * 手动从非 Spring 管理类中获取 Spring Bean
+ */
+@Component
+public class SpringContextHolder implements ApplicationContextAware {
+
+    private static ApplicationContext context;
+
+    @Override
+    public void setApplicationContext(ApplicationContext ctx) throws BeansException {
+        SpringContextHolder.context = ctx;
+    }
+
+    public static <T> T getBean(Class<T> clazz) {
+        return context.getBean(clazz);
+    }
+
+    public static ApplicationContext getContext() {
+        return context;
+    }
+}