Kaynağa Gözat

Merge branch 'dev' of http://192.168.1.245:11111/jinjilong/onlineEducation-fwd into dev

honorfire 6 ay önce
ebeveyn
işleme
3455b25cdc
38 değiştirilmiş dosya ile 1542 ekleme ve 38 silme
  1. 44 3
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/controller/CourseChapterController.java
  2. 132 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/controller/CourseChapterKnowledgeController.java
  3. 126 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/controller/CourseLogController.java
  4. 2 3
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/controller/MinioController.java
  5. 72 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/domain/CourseChapterKnowledge.java
  6. 83 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/domain/CourseLog.java
  7. 2 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/domain/UploadFile.java
  8. 34 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/enums/CourseChapterKnowledgeEnum.java
  9. 34 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/enums/CourseLogEnum.java
  10. 26 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/mapper/CourseChapterKnowledgeMapper.java
  11. 26 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/mapper/CourseLogMapper.java
  12. 5 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/mapper/mapping/CourseChapterKnowledgeMapper.xml
  13. 5 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/mapper/mapping/CourseLogMapper.xml
  14. 5 4
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/param/ChapterAddParam.java
  15. 2 4
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/param/ChapterEditParam.java
  16. 64 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/param/courselog/CourseLogAddParam.java
  17. 71 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/param/courselog/CourseLogEditParam.java
  18. 35 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/param/courselog/CourseLogIdParam.java
  19. 51 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/param/courselog/CourseLogPageParam.java
  20. 46 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/param/konwledge/CourseChapterKnowledgeAddParam.java
  21. 51 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/param/konwledge/CourseChapterKnowledgeEditParam.java
  22. 35 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/param/konwledge/CourseChapterKnowledgeIdParam.java
  23. 51 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/param/konwledge/CourseChapterKnowledgePageParam.java
  24. 81 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/CourseChapterKnowledgeService.java
  25. 81 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/CourseLogService.java
  26. 96 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/impl/CourseChapterKnowledgeServiceImpl.java
  27. 116 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/impl/CourseLogServiceImpl.java
  28. 14 3
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/util/MinioUtil.java
  29. 2 0
      snowy-plugin/snowy-plugin-exam/snowy-plugin-exam-func/src/main/java/vip/xiaonuo/exam/controller/admin/ExamPaperController.java
  30. 12 0
      snowy-plugin/snowy-plugin-exam/snowy-plugin-exam-func/src/main/java/vip/xiaonuo/exam/controller/admin/TExamController.java
  31. 5 0
      snowy-plugin/snowy-plugin-exam/snowy-plugin-exam-func/src/main/java/vip/xiaonuo/exam/mapper/TExamMapper.java
  32. 18 0
      snowy-plugin/snowy-plugin-exam/snowy-plugin-exam-func/src/main/java/vip/xiaonuo/exam/mapper/mapping/TExamMapper.xml
  33. 2 1
      snowy-plugin/snowy-plugin-exam/snowy-plugin-exam-func/src/main/java/vip/xiaonuo/exam/service/TExamService.java
  34. 6 0
      snowy-plugin/snowy-plugin-exam/snowy-plugin-exam-func/src/main/java/vip/xiaonuo/exam/service/impl/TExamServiceImpl.java
  35. 22 0
      snowy-plugin/snowy-plugin-exam/snowy-plugin-exam-func/src/main/java/vip/xiaonuo/exam/vo/TExamPaperStastic.java
  36. 3 3
      snowy-plugin/snowy-plugin-forum/snowy-plugin-forum-func/src/main/java/vip/xiaonuo/forum/modular/postinfo/controller/ForumPostInfoController.java
  37. 1 1
      snowy-plugin/snowy-plugin-forum/snowy-plugin-forum-func/src/main/java/vip/xiaonuo/forum/modular/postinfo/service/ForumPostInfoService.java
  38. 81 16
      snowy-plugin/snowy-plugin-forum/snowy-plugin-forum-func/src/main/java/vip/xiaonuo/forum/modular/postinfo/service/impl/ForumPostInfoServiceImpl.java

+ 44 - 3
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/controller/CourseChapterController.java

@@ -15,6 +15,7 @@ package vip.xiaonuo.disk.controller;
 import cn.dev33.satoken.annotation.SaCheckPermission;
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.collection.CollStreamUtil;
+import cn.hutool.core.util.IdUtil;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import com.github.xiaoymin.knife4j.annotations.ApiSupport;
@@ -30,22 +31,25 @@ import vip.xiaonuo.common.annotation.CommonLog;
 import vip.xiaonuo.common.pojo.CommonResult;
 import vip.xiaonuo.common.pojo.CommonValidList;
 import vip.xiaonuo.disk.domain.Chapter;
-import vip.xiaonuo.disk.domain.CourseInfo;
+import vip.xiaonuo.disk.domain.CourseChapterKnowledge;
 import vip.xiaonuo.disk.domain.CourseRelate;
-import vip.xiaonuo.disk.domain.ResourceRecordUserRelate;
 import vip.xiaonuo.disk.param.ChapterAddParam;
 import vip.xiaonuo.disk.param.ChapterEditParam;
 import vip.xiaonuo.disk.param.ChapterIdParam;
 import vip.xiaonuo.disk.param.ChapterPageParam;
 import vip.xiaonuo.disk.service.ChapterService;
 import vip.xiaonuo.disk.service.ClassHourService;
+import vip.xiaonuo.disk.service.CourseChapterKnowledgeService;
 import vip.xiaonuo.disk.service.CourseRelateService;
 
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 import javax.validation.Valid;
 import javax.validation.constraints.NotEmpty;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 import java.util.stream.Collectors;
 
 /**
@@ -67,6 +71,10 @@ public class CourseChapterController {
     @Resource
     private CourseRelateService courseRelateService;
 
+    @Resource
+    private CourseChapterKnowledgeService courseChapterKnowledgeService;
+
+
     /**
      * 课程章节表-分页列表
      *
@@ -238,6 +246,18 @@ public class CourseChapterController {
                     .collect(Collectors.toList());
             courseRelateService.addBatch(courseRelates);
         }
+        //添加章节,设计知识点关联表
+        List<CourseChapterKnowledge> list=new ArrayList<>();
+        chapterAddParam.getKnowledgeIds().stream().forEach(knowledgeId -> {
+
+            CourseChapterKnowledge courseChapterKnowledge = new CourseChapterKnowledge();
+            courseChapterKnowledge.setCourseId(chapterAddParam.getCourseId());
+            courseChapterKnowledge.setChapterId(chapter.getId());
+            courseChapterKnowledge.setKnowledgeId(knowledgeId);
+            courseChapterKnowledge.setId(IdUtil.getSnowflake().nextIdStr());
+            list.add(courseChapterKnowledge);
+        });
+        courseChapterKnowledgeService.saveBatch(list);
         return CommonResult.ok();
     }
 
@@ -274,6 +294,27 @@ public class CourseChapterController {
                     .collect(Collectors.toList());
             courseRelateService.addBatch(courseRelates);
         }
+
+
+        //根据章节id和课程id删除关联表
+        Map<String, Object> knowledgeParam = new HashMap<>();
+        knowledgeParam.put("COURSE_ID", chapterEditParam.getCourseId());
+        knowledgeParam.put("CHAPTER_ID", chapter.getId());
+        courseChapterKnowledgeService.removeByMap(knowledgeParam);
+
+        //添加章节,设计知识点关联表
+        List<CourseChapterKnowledge> list=new ArrayList<>();
+        chapterEditParam.getKnowledgeIds().stream().forEach(knowledgeId -> {
+
+            CourseChapterKnowledge courseChapterKnowledge = new CourseChapterKnowledge();
+            courseChapterKnowledge.setCourseId(chapterEditParam.getCourseId());
+            courseChapterKnowledge.setChapterId(chapter.getId());
+            courseChapterKnowledge.setKnowledgeId(knowledgeId);
+            courseChapterKnowledge.setId(IdUtil.getSnowflake().nextIdStr());
+            list.add(courseChapterKnowledge);
+        });
+        courseChapterKnowledgeService.saveBatch(list);
+
         return CommonResult.ok();
     }
 

+ 132 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/controller/CourseChapterKnowledgeController.java

@@ -0,0 +1,132 @@
+/*
+ * 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 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.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.common.annotation.CommonLog;
+import vip.xiaonuo.common.pojo.CommonResult;
+import vip.xiaonuo.common.pojo.CommonValidList;
+import vip.xiaonuo.disk.domain.CourseChapterKnowledge;
+import vip.xiaonuo.disk.param.konwledge.CourseChapterKnowledgeAddParam;
+import vip.xiaonuo.disk.param.konwledge.CourseChapterKnowledgeEditParam;
+import vip.xiaonuo.disk.param.konwledge.CourseChapterKnowledgeIdParam;
+import vip.xiaonuo.disk.param.konwledge.CourseChapterKnowledgePageParam;
+import vip.xiaonuo.disk.service.CourseChapterKnowledgeService;
+
+import javax.annotation.Resource;
+import javax.validation.Valid;
+import javax.validation.constraints.NotEmpty;
+
+/**
+ * COURSE_CHAPTER_KNOWLEDGE控制器
+ *
+ * @author pans
+ * @date  2025/08/04 17:14
+ */
+@Api(tags = "COURSE_CHAPTER_KNOWLEDGE控制器")
+@ApiSupport(author = "SNOWY_TEAM", order = 1)
+@RestController
+@Validated
+public class CourseChapterKnowledgeController {
+
+    @Resource
+    private CourseChapterKnowledgeService courseChapterKnowledgeService;
+
+    /**
+     * 获取COURSE_CHAPTER_KNOWLEDGE分页
+     *
+     * @author pans
+     * @date  2025/08/04 17:14
+     */
+    @ApiOperationSupport(order = 1)
+    @ApiOperation("获取COURSE_CHAPTER_KNOWLEDGE分页")
+    @SaCheckPermission("/disk/chapterknowledge/page")
+    @GetMapping("/disk/chapterknowledge/page")
+    public CommonResult<Page<CourseChapterKnowledge>> page(CourseChapterKnowledgePageParam courseChapterKnowledgePageParam) {
+        return CommonResult.data(courseChapterKnowledgeService.page(courseChapterKnowledgePageParam));
+    }
+
+    /**
+     * 添加COURSE_CHAPTER_KNOWLEDGE
+     *
+     * @author pans
+     * @date  2025/08/04 17:14
+     */
+    @ApiOperationSupport(order = 2)
+    @ApiOperation("添加COURSE_CHAPTER_KNOWLEDGE")
+    @CommonLog("添加COURSE_CHAPTER_KNOWLEDGE")
+    @SaCheckPermission("/disk/chapterknowledge/add")
+    @PostMapping("/disk/chapterknowledge/add")
+    public CommonResult<String> add(@RequestBody @Valid CourseChapterKnowledgeAddParam courseChapterKnowledgeAddParam) {
+        courseChapterKnowledgeService.add(courseChapterKnowledgeAddParam);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 编辑COURSE_CHAPTER_KNOWLEDGE
+     *
+     * @author pans
+     * @date  2025/08/04 17:14
+     */
+    @ApiOperationSupport(order = 3)
+    @ApiOperation("编辑COURSE_CHAPTER_KNOWLEDGE")
+    @CommonLog("编辑COURSE_CHAPTER_KNOWLEDGE")
+    @SaCheckPermission("/disk/chapterknowledge/edit")
+    @PostMapping("/disk/chapterknowledge/edit")
+    public CommonResult<String> edit(@RequestBody @Valid CourseChapterKnowledgeEditParam courseChapterKnowledgeEditParam) {
+        courseChapterKnowledgeService.edit(courseChapterKnowledgeEditParam);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 删除COURSE_CHAPTER_KNOWLEDGE
+     *
+     * @author pans
+     * @date  2025/08/04 17:14
+     */
+    @ApiOperationSupport(order = 4)
+    @ApiOperation("删除COURSE_CHAPTER_KNOWLEDGE")
+    @CommonLog("删除COURSE_CHAPTER_KNOWLEDGE")
+    @SaCheckPermission("/disk/chapterknowledge/delete")
+    @PostMapping("/disk/chapterknowledge/delete")
+    public CommonResult<String> delete(@RequestBody @Valid @NotEmpty(message = "集合不能为空")
+                                                   CommonValidList<CourseChapterKnowledgeIdParam> courseChapterKnowledgeIdParamList) {
+        courseChapterKnowledgeService.delete(courseChapterKnowledgeIdParamList);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 获取COURSE_CHAPTER_KNOWLEDGE详情
+     *
+     * @author pans
+     * @date  2025/08/04 17:14
+     */
+    @ApiOperationSupport(order = 5)
+    @ApiOperation("获取COURSE_CHAPTER_KNOWLEDGE详情")
+    @SaCheckPermission("/disk/chapterknowledge/detail")
+    @GetMapping("/disk/chapterknowledge/detail")
+    public CommonResult<CourseChapterKnowledge> detail(@Valid CourseChapterKnowledgeIdParam courseChapterKnowledgeIdParam) {
+        return CommonResult.data(courseChapterKnowledgeService.detail(courseChapterKnowledgeIdParam));
+    }
+
+}

+ 126 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/controller/CourseLogController.java

@@ -0,0 +1,126 @@
+/*
+ * 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 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.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.common.annotation.CommonLog;
+import vip.xiaonuo.common.pojo.CommonResult;
+import vip.xiaonuo.common.pojo.CommonValidList;
+import vip.xiaonuo.disk.domain.CourseLog;
+import vip.xiaonuo.disk.param.courselog.CourseLogAddParam;
+import vip.xiaonuo.disk.param.courselog.CourseLogEditParam;
+import vip.xiaonuo.disk.param.courselog.CourseLogIdParam;
+import vip.xiaonuo.disk.param.courselog.CourseLogPageParam;
+import vip.xiaonuo.disk.service.CourseLogService;
+
+import javax.annotation.Resource;
+import javax.validation.Valid;
+import javax.validation.constraints.NotEmpty;
+
+/**
+ * 课程足迹控制器
+ *
+ * @author pans
+ * @date  2025/08/05 10:48
+ */
+@Api(tags = "课程足迹控制器")
+@ApiSupport(author = "SNOWY_TEAM", order = 1)
+@RestController
+@Validated
+public class CourseLogController {
+
+    @Resource
+    private CourseLogService courseLogService;
+
+    /**
+     * 获取课程足迹分页
+     *
+     * @author pans
+     * @date  2025/08/05 10:48
+     */
+    @ApiOperationSupport(order = 1)
+    @ApiOperation("获取课程足迹分页")
+    @GetMapping("/disk/courselog/page")
+    public CommonResult<Page<CourseLog>> page(CourseLogPageParam courseLogPageParam) {
+        return CommonResult.data(courseLogService.page(courseLogPageParam));
+    }
+
+    /**
+     * 添加课程足迹
+     *
+     * @author pans
+     * @date  2025/08/05 10:48
+     */
+    @ApiOperationSupport(order = 2)
+    @ApiOperation("添加课程足迹")
+    @CommonLog("添加课程足迹")
+    @PostMapping("/disk/courselog/add")
+    public CommonResult<String> add(@RequestBody @Valid CourseLogAddParam courseLogAddParam) {
+        courseLogService.add(courseLogAddParam);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 编辑课程足迹
+     *
+     * @author pans
+     * @date  2025/08/05 10:48
+     */
+    @ApiOperationSupport(order = 3)
+    @ApiOperation("编辑课程足迹")
+    @CommonLog("编辑课程足迹")
+    @PostMapping("/disk/courselog/edit")
+    public CommonResult<String> edit(@RequestBody @Valid CourseLogEditParam courseLogEditParam) {
+        courseLogService.edit(courseLogEditParam);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 删除课程足迹
+     *
+     * @author pans
+     * @date  2025/08/05 10:48
+     */
+    @ApiOperationSupport(order = 4)
+    @ApiOperation("删除课程足迹")
+    @CommonLog("删除课程足迹")
+    @PostMapping("/disk/courselog/delete")
+    public CommonResult<String> delete(@RequestBody @Valid @NotEmpty(message = "集合不能为空")
+                                                   CommonValidList<CourseLogIdParam> courseLogIdParamList) {
+        courseLogService.delete(courseLogIdParamList);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 获取课程足迹详情
+     *
+     * @author pans
+     * @date  2025/08/05 10:48
+     */
+    @ApiOperationSupport(order = 5)
+    @ApiOperation("获取课程足迹详情")
+    @GetMapping("/disk/courselog/detail")
+    public CommonResult<CourseLog> detail(@Valid CourseLogIdParam courseLogIdParam) {
+        return CommonResult.data(courseLogService.detail(courseLogIdParam));
+    }
+
+}

+ 2 - 3
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/controller/MinioController.java

@@ -7,7 +7,6 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
-import vip.xiaonuo.disk.domain.ResourceUserFile;
 import vip.xiaonuo.disk.domain.UploadFile;
 import vip.xiaonuo.disk.service.MinioService;
 import vip.xiaonuo.disk.util.MinioUtil;
@@ -58,7 +57,7 @@ public class MinioController {
     }
 
     @PostMapping("/checkMd5List")
-    public ResponseEntity<List<ResourceUserFile>> checkFilesExits(@RequestBody List<UploadFile> genericItems){
-        return ResponseEntity.ok(minioUtil.checkFilesExits(genericItems));
+    public ResponseEntity<?> checkFilesExits(@RequestBody List<UploadFile> genericItems){
+        return minioUtil.checkFilesExits(genericItems);
     }
 }

+ 72 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/domain/CourseChapterKnowledge.java

@@ -0,0 +1,72 @@
+/*
+ * 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.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.Date;
+
+/**
+ * COURSE_CHAPTER_KNOWLEDGE实体
+ *
+ * @author pans
+ * @date  2025/08/04 17:14
+ **/
+@Getter
+@Setter
+@TableName("COURSE_CHAPTER_KNOWLEDGE")
+public class CourseChapterKnowledge {
+
+    /** ID */
+    @TableId
+    @ApiModelProperty(value = "ID", position = 1)
+    private String id;
+
+    /** COURSE_ID */
+    @ApiModelProperty(value = "COURSE_ID", position = 2)
+    private String courseId;
+
+    /** CHAPTER_ID */
+    @ApiModelProperty(value = "CHAPTER_ID", position = 3)
+    private String chapterId;
+
+    /** KNOWLEDGE_ID */
+    @ApiModelProperty(value = "KNOWLEDGE_ID", position = 4)
+    private String knowledgeId;
+
+    /** UPDATE_TIME */
+    @ApiModelProperty(value = "UPDATE_TIME", position = 5)
+    @TableField(fill = FieldFill.UPDATE)
+    private Date updateTime;
+
+    /** CREATE_TIME */
+    @ApiModelProperty(value = "CREATE_TIME", position = 6)
+    @TableField(fill = FieldFill.INSERT)
+    private Date createTime;
+
+    /** CREATE_USER */
+    @ApiModelProperty(value = "CREATE_USER", position = 7)
+    @TableField(fill = FieldFill.INSERT)
+    private String createUser;
+
+    /** UPDATE_USER */
+    @ApiModelProperty(value = "UPDATE_USER", position = 8)
+    @TableField(fill = FieldFill.UPDATE)
+    private String updateUser;
+}

+ 83 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/domain/CourseLog.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.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.Date;
+
+/**
+ * 课程足迹实体
+ *
+ * @author pans
+ * @date  2025/08/05 10:48
+ **/
+@Getter
+@Setter
+@TableName("COURSE_LOG")
+public class CourseLog {
+
+    /** ID */
+    @TableId
+    @ApiModelProperty(value = "ID", position = 1)
+    private String id;
+
+    /** 课时名称 */
+    @ApiModelProperty(value = "课时名称", position = 2)
+    private String hourName;
+
+    /** 章节名称 */
+    @ApiModelProperty(value = "章节名称", position = 3)
+    private String chapterName;
+
+    /** 课程名称 */
+    @ApiModelProperty(value = "课程名称", position = 4)
+    private String courseName;
+
+    /** 课时id */
+    @ApiModelProperty(value = "课时id", position = 5)
+    private String hourId;
+
+    /** 章节id */
+    @ApiModelProperty(value = "章节id", position = 6)
+    private String chapterId;
+
+    /** 课程id */
+    @ApiModelProperty(value = "课程id", position = 7)
+    private String courseId;
+
+    /** 创建时间 */
+    @ApiModelProperty(value = "创建时间", position = 8)
+    @TableField(fill = FieldFill.INSERT)
+    private Date createTime;
+
+    /** 创建者 */
+    @ApiModelProperty(value = "创建者", position = 9)
+    @TableField(fill = FieldFill.INSERT)
+    private String createUser;
+    /** 文件id */
+    private String fileId;
+    /** 文件名称 */
+    @ApiModelProperty(value = "文件名称", position = 10)
+    private String fileName;
+
+    /** 文件路径 */
+    @ApiModelProperty(value = "文件路径", position = 11)
+    private String filePath;
+}

+ 2 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/domain/UploadFile.java

@@ -14,6 +14,8 @@ public class UploadFile {
     @Schema(description = "文件名")
     private String fileName;
 
+    private Long size;
+
     @Schema(description = "切片数量")
     private int chunkNumber;
 

+ 34 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/enums/CourseChapterKnowledgeEnum.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.enums;
+
+import lombok.Getter;
+
+/**
+ * COURSE_CHAPTER_KNOWLEDGE枚举
+ *
+ * @author pans
+ * @date  2025/08/04 17:14
+ **/
+@Getter
+public enum CourseChapterKnowledgeEnum {
+
+    /** 测试 */
+    TEST("TEST");
+
+    private final String value;
+
+    CourseChapterKnowledgeEnum(String value) {
+        this.value = value;
+    }
+}

+ 34 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/enums/CourseLogEnum.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.enums;
+
+import lombok.Getter;
+
+/**
+ * 课程足迹枚举
+ *
+ * @author pans
+ * @date  2025/08/05 10:48
+ **/
+@Getter
+public enum CourseLogEnum {
+
+    /** 测试 */
+    TEST("TEST");
+
+    private final String value;
+
+    CourseLogEnum(String value) {
+        this.value = value;
+    }
+}

+ 26 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/mapper/CourseChapterKnowledgeMapper.java

@@ -0,0 +1,26 @@
+/*
+ * 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.CourseChapterKnowledge;
+
+
+/**
+ * COURSE_CHAPTER_KNOWLEDGEMapper接口
+ *
+ * @author pans
+ * @date  2025/08/04 17:14
+ **/
+public interface CourseChapterKnowledgeMapper extends BaseMapper<CourseChapterKnowledge> {
+}

+ 26 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/mapper/CourseLogMapper.java

@@ -0,0 +1,26 @@
+/*
+ * 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.CourseLog;
+
+
+/**
+ * 课程足迹Mapper接口
+ *
+ * @author pans
+ * @date  2025/08/05 10:48
+ **/
+public interface CourseLogMapper extends BaseMapper<CourseLog> {
+}

+ 5 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/mapper/mapping/CourseChapterKnowledgeMapper.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.CourseChapterKnowledgeMapper">
+
+</mapper>

+ 5 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/mapper/mapping/CourseLogMapper.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.CourseLogMapper">
+
+</mapper>

+ 5 - 4
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/param/ChapterAddParam.java

@@ -17,10 +17,6 @@ import lombok.Getter;
 import lombok.Setter;
 import vip.xiaonuo.disk.domain.CourseRelate;
 
-import javax.validation.constraints.NotBlank;
-import javax.validation.constraints.NotNull;
-import java.math.BigDecimal;
-import java.util.Date;
 import java.util.List;
 
 /**
@@ -53,4 +49,9 @@ public class ChapterAddParam {
     @ApiModelProperty(value = "关联信息", position = 6)
     private List<CourseRelate> courseRelates;
 
+    /** 设及知识点 */
+    private List<String> knowledgeIds;
+
+
+
 }

+ 2 - 4
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/param/ChapterEditParam.java

@@ -17,10 +17,7 @@ import lombok.Getter;
 import lombok.Setter;
 import vip.xiaonuo.disk.domain.CourseRelate;
 
-import javax.validation.constraints.NotBlank;
 import javax.validation.constraints.NotNull;
-import java.math.BigDecimal;
-import java.util.Date;
 import java.util.List;
 
 /**
@@ -58,5 +55,6 @@ public class ChapterEditParam {
     @ApiModelProperty(value = "关联信息", position = 6)
     private List<CourseRelate> courseRelates;
 
-
+    /** 设及知识点 */
+    private List<String> knowledgeIds;
 }

+ 64 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/param/courselog/CourseLogAddParam.java

@@ -0,0 +1,64 @@
+/*
+ * 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.courselog;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 课程足迹添加参数
+ *
+ * @author pans
+ * @date  2025/08/05 10:48
+ **/
+@Getter
+@Setter
+public class CourseLogAddParam {
+
+    /** 课时名称 */
+    @ApiModelProperty(value = "课时名称", position = 2)
+    private String hourName;
+
+    /** 章节名称 */
+    @ApiModelProperty(value = "章节名称", position = 3)
+    private String chapterName;
+
+    /** 课程名称 */
+    @ApiModelProperty(value = "课程名称", position = 4)
+    private String courseName;
+
+    /** 课时id */
+    @ApiModelProperty(value = "课时id", position = 5)
+    private String hourId;
+
+    /** 章节id */
+    @ApiModelProperty(value = "章节id", position = 6)
+    private String chapterId;
+
+    /** 课程id */
+    @ApiModelProperty(value = "课程id", position = 7)
+    private String courseId;
+
+    /** 文件id */
+    private String fileId;
+
+    /** 文件名称 */
+    @ApiModelProperty(value = "文件名称", position = 10)
+    private String fileName;
+
+    /** 文件路径 */
+    @ApiModelProperty(value = "文件路径", position = 11)
+    private String filePath;
+
+}

+ 71 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/param/courselog/CourseLogEditParam.java

@@ -0,0 +1,71 @@
+/*
+ * 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.courselog;
+
+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 pans
+ * @date  2025/08/05 10:48
+ **/
+@Getter
+@Setter
+public class CourseLogEditParam {
+
+    /** ID */
+    @ApiModelProperty(value = "ID", required = true, position = 1)
+    @NotBlank(message = "id不能为空")
+    private String id;
+
+    /** 课时名称 */
+    @ApiModelProperty(value = "课时名称", position = 2)
+    private String hourName;
+
+    /** 章节名称 */
+    @ApiModelProperty(value = "章节名称", position = 3)
+    private String chapterName;
+
+    /** 课程名称 */
+    @ApiModelProperty(value = "课程名称", position = 4)
+    private String courseName;
+
+    /** 课时id */
+    @ApiModelProperty(value = "课时id", position = 5)
+    private String hourId;
+
+    /** 章节id */
+    @ApiModelProperty(value = "章节id", position = 6)
+    private String chapterId;
+
+    /** 课程id */
+    @ApiModelProperty(value = "课程id", position = 7)
+    private String courseId;
+
+    /** 文件名称 */
+    @ApiModelProperty(value = "文件名称", position = 10)
+    private String fileName;
+
+    /** 文件路径 */
+    @ApiModelProperty(value = "文件路径", position = 11)
+    private String filePath;
+
+}

+ 35 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/param/courselog/CourseLogIdParam.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.courselog;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * 课程足迹Id参数
+ *
+ * @author pans
+ * @date  2025/08/05 10:48
+ **/
+@Getter
+@Setter
+public class CourseLogIdParam {
+
+    /** 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/courselog/CourseLogPageParam.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.courselog;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 课程足迹查询参数
+ *
+ * @author pans
+ * @date  2025/08/05 10:48
+ **/
+@Getter
+@Setter
+public class CourseLogPageParam {
+
+    /** 当前页 */
+    @ApiModelProperty(value = "当前页码")
+    private Integer current;
+
+    /** 每页条数 */
+    @ApiModelProperty(value = "每页条数")
+    private Integer size;
+
+    /** 排序字段 */
+    @ApiModelProperty(value = "排序字段,字段驼峰名称,如:userName")
+    private String sortField;
+
+    /** 排序方式 */
+    @ApiModelProperty(value = "排序方式,升序:ASCEND;降序:DESCEND")
+    private String sortOrder;
+
+    private String fileName;
+
+    private String courseName;
+
+    private String chapterName;
+
+}

+ 46 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/param/konwledge/CourseChapterKnowledgeAddParam.java

@@ -0,0 +1,46 @@
+/*
+ * 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.konwledge;
+
+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;
+
+/**
+ * COURSE_CHAPTER_KNOWLEDGE添加参数
+ *
+ * @author pans
+ * @date  2025/08/04 17:14
+ **/
+@Getter
+@Setter
+public class CourseChapterKnowledgeAddParam {
+
+    /** COURSE_ID */
+    @ApiModelProperty(value = "COURSE_ID", position = 2)
+    private String courseId;
+
+    /** CHAPTER_ID */
+    @ApiModelProperty(value = "CHAPTER_ID", position = 3)
+    private String chapterId;
+
+    /** KNOWLEDGE_ID */
+    @ApiModelProperty(value = "KNOWLEDGE_ID", position = 4)
+    private String knowledgeId;
+
+}

+ 51 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/param/konwledge/CourseChapterKnowledgeEditParam.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.konwledge;
+
+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;
+
+/**
+ * COURSE_CHAPTER_KNOWLEDGE编辑参数
+ *
+ * @author pans
+ * @date  2025/08/04 17:14
+ **/
+@Getter
+@Setter
+public class CourseChapterKnowledgeEditParam {
+
+    /** ID */
+    @ApiModelProperty(value = "ID", required = true, position = 1)
+    @NotBlank(message = "id不能为空")
+    private String id;
+
+    /** COURSE_ID */
+    @ApiModelProperty(value = "COURSE_ID", position = 2)
+    private String courseId;
+
+    /** CHAPTER_ID */
+    @ApiModelProperty(value = "CHAPTER_ID", position = 3)
+    private String chapterId;
+
+    /** KNOWLEDGE_ID */
+    @ApiModelProperty(value = "KNOWLEDGE_ID", position = 4)
+    private String knowledgeId;
+
+}

+ 35 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/param/konwledge/CourseChapterKnowledgeIdParam.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.konwledge;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * COURSE_CHAPTER_KNOWLEDGEId参数
+ *
+ * @author pans
+ * @date  2025/08/04 17:14
+ **/
+@Getter
+@Setter
+public class CourseChapterKnowledgeIdParam {
+
+    /** 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/konwledge/CourseChapterKnowledgePageParam.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.konwledge;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * COURSE_CHAPTER_KNOWLEDGE查询参数
+ *
+ * @author pans
+ * @date  2025/08/04 17:14
+ **/
+@Getter
+@Setter
+public class CourseChapterKnowledgePageParam {
+
+    /** 当前页 */
+    @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;
+
+}

+ 81 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/CourseChapterKnowledgeService.java

@@ -0,0 +1,81 @@
+/*
+ * 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.CourseChapterKnowledge;
+import vip.xiaonuo.disk.param.konwledge.CourseChapterKnowledgeAddParam;
+import vip.xiaonuo.disk.param.konwledge.CourseChapterKnowledgeEditParam;
+import vip.xiaonuo.disk.param.konwledge.CourseChapterKnowledgeIdParam;
+import vip.xiaonuo.disk.param.konwledge.CourseChapterKnowledgePageParam;
+
+import java.util.List;
+
+/**
+ * COURSE_CHAPTER_KNOWLEDGEService接口
+ *
+ * @author pans
+ * @date  2025/08/04 17:14
+ **/
+public interface CourseChapterKnowledgeService extends IService<CourseChapterKnowledge> {
+
+    /**
+     * 获取COURSE_CHAPTER_KNOWLEDGE分页
+     *
+     * @author pans
+     * @date  2025/08/04 17:14
+     */
+    Page<CourseChapterKnowledge> page(CourseChapterKnowledgePageParam courseChapterKnowledgePageParam);
+
+    /**
+     * 添加COURSE_CHAPTER_KNOWLEDGE
+     *
+     * @author pans
+     * @date  2025/08/04 17:14
+     */
+    void add(CourseChapterKnowledgeAddParam courseChapterKnowledgeAddParam);
+
+    /**
+     * 编辑COURSE_CHAPTER_KNOWLEDGE
+     *
+     * @author pans
+     * @date  2025/08/04 17:14
+     */
+    void edit(CourseChapterKnowledgeEditParam courseChapterKnowledgeEditParam);
+
+    /**
+     * 删除COURSE_CHAPTER_KNOWLEDGE
+     *
+     * @author pans
+     * @date  2025/08/04 17:14
+     */
+    void delete(List<CourseChapterKnowledgeIdParam> courseChapterKnowledgeIdParamList);
+
+    /**
+     * 获取COURSE_CHAPTER_KNOWLEDGE详情
+     *
+     * @author pans
+     * @date  2025/08/04 17:14
+     */
+    CourseChapterKnowledge detail(CourseChapterKnowledgeIdParam courseChapterKnowledgeIdParam);
+
+    /**
+     * 获取COURSE_CHAPTER_KNOWLEDGE详情
+     *
+     * @author pans
+     * @date  2025/08/04 17:14
+     **/
+    CourseChapterKnowledge queryEntity(String id);
+
+}

+ 81 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/CourseLogService.java

@@ -0,0 +1,81 @@
+/*
+ * 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.CourseLog;
+import vip.xiaonuo.disk.param.courselog.CourseLogAddParam;
+import vip.xiaonuo.disk.param.courselog.CourseLogEditParam;
+import vip.xiaonuo.disk.param.courselog.CourseLogIdParam;
+import vip.xiaonuo.disk.param.courselog.CourseLogPageParam;
+
+import java.util.List;
+
+/**
+ * 课程足迹Service接口
+ *
+ * @author pans
+ * @date  2025/08/05 10:48
+ **/
+public interface CourseLogService extends IService<CourseLog> {
+
+    /**
+     * 获取课程足迹分页
+     *
+     * @author pans
+     * @date  2025/08/05 10:48
+     */
+    Page<CourseLog> page(CourseLogPageParam courseLogPageParam);
+
+    /**
+     * 添加课程足迹
+     *
+     * @author pans
+     * @date  2025/08/05 10:48
+     */
+    void add(CourseLogAddParam courseLogAddParam);
+
+    /**
+     * 编辑课程足迹
+     *
+     * @author pans
+     * @date  2025/08/05 10:48
+     */
+    void edit(CourseLogEditParam courseLogEditParam);
+
+    /**
+     * 删除课程足迹
+     *
+     * @author pans
+     * @date  2025/08/05 10:48
+     */
+    void delete(List<CourseLogIdParam> courseLogIdParamList);
+
+    /**
+     * 获取课程足迹详情
+     *
+     * @author pans
+     * @date  2025/08/05 10:48
+     */
+    CourseLog detail(CourseLogIdParam courseLogIdParam);
+
+    /**
+     * 获取课程足迹详情
+     *
+     * @author pans
+     * @date  2025/08/05 10:48
+     **/
+    CourseLog queryEntity(String id);
+
+}

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

@@ -0,0 +1,96 @@
+/*
+ * 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.CourseChapterKnowledge;
+import vip.xiaonuo.disk.mapper.CourseChapterKnowledgeMapper;
+import vip.xiaonuo.disk.param.konwledge.CourseChapterKnowledgeAddParam;
+import vip.xiaonuo.disk.param.konwledge.CourseChapterKnowledgeEditParam;
+import vip.xiaonuo.disk.param.konwledge.CourseChapterKnowledgeIdParam;
+import vip.xiaonuo.disk.param.konwledge.CourseChapterKnowledgePageParam;
+import vip.xiaonuo.disk.service.CourseChapterKnowledgeService;
+
+import java.util.List;
+
+/**
+ * COURSE_CHAPTER_KNOWLEDGEService接口实现类
+ *
+ * @author pans
+ * @date  2025/08/04 17:14
+ **/
+@Service
+public class CourseChapterKnowledgeServiceImpl extends ServiceImpl<CourseChapterKnowledgeMapper, CourseChapterKnowledge> implements CourseChapterKnowledgeService {
+
+
+    @Override
+    public Page<CourseChapterKnowledge> page(CourseChapterKnowledgePageParam courseChapterKnowledgePageParam) {
+        QueryWrapper<CourseChapterKnowledge> queryWrapper = new QueryWrapper<>();
+        if(ObjectUtil.isAllNotEmpty(courseChapterKnowledgePageParam.getSortField(), courseChapterKnowledgePageParam.getSortOrder())) {
+            CommonSortOrderEnum.validate(courseChapterKnowledgePageParam.getSortOrder());
+            queryWrapper.orderBy(true, courseChapterKnowledgePageParam.getSortOrder().equals(CommonSortOrderEnum.ASC.getValue()),
+                    StrUtil.toUnderlineCase(courseChapterKnowledgePageParam.getSortField()));
+        } else {
+            queryWrapper.lambda().orderByAsc(CourseChapterKnowledge::getId);
+        }
+        return this.page(CommonPageRequest.defaultPage(), queryWrapper);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void add(CourseChapterKnowledgeAddParam courseChapterKnowledgeAddParam) {
+        CourseChapterKnowledge courseChapterKnowledge = BeanUtil.toBean(courseChapterKnowledgeAddParam, CourseChapterKnowledge.class);
+        this.save(courseChapterKnowledge);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void edit(CourseChapterKnowledgeEditParam courseChapterKnowledgeEditParam) {
+        CourseChapterKnowledge courseChapterKnowledge = this.queryEntity(courseChapterKnowledgeEditParam.getId());
+        BeanUtil.copyProperties(courseChapterKnowledgeEditParam, courseChapterKnowledge);
+        this.updateById(courseChapterKnowledge);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void delete(List<CourseChapterKnowledgeIdParam> courseChapterKnowledgeIdParamList) {
+        // 执行删除
+        this.removeByIds(CollStreamUtil.toList(courseChapterKnowledgeIdParamList, CourseChapterKnowledgeIdParam::getId));
+    }
+
+    @Override
+    public CourseChapterKnowledge detail(CourseChapterKnowledgeIdParam courseChapterKnowledgeIdParam) {
+        return this.queryEntity(courseChapterKnowledgeIdParam.getId());
+    }
+
+    @Override
+    public CourseChapterKnowledge queryEntity(String id) {
+        CourseChapterKnowledge courseChapterKnowledge = this.getById(id);
+        if(ObjectUtil.isEmpty(courseChapterKnowledge)) {
+            throw new CommonException("COURSE_CHAPTER_KNOWLEDGE不存在,id值为:{}", id);
+        }
+        return courseChapterKnowledge;
+    }
+
+}

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

@@ -0,0 +1,116 @@
+/*
+ * 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.IdUtil;
+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.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.CourseLog;
+import vip.xiaonuo.disk.mapper.CourseLogMapper;
+import vip.xiaonuo.disk.param.courselog.CourseLogAddParam;
+import vip.xiaonuo.disk.param.courselog.CourseLogEditParam;
+import vip.xiaonuo.disk.param.courselog.CourseLogIdParam;
+import vip.xiaonuo.disk.param.courselog.CourseLogPageParam;
+import vip.xiaonuo.disk.service.CourseLogService;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 课程足迹Service接口实现类
+ *
+ * @author pans
+ * @date  2025/08/05 10:48
+ **/
+@Service
+public class CourseLogServiceImpl extends ServiceImpl<CourseLogMapper, CourseLog> implements CourseLogService {
+
+
+    @Override
+    public Page<CourseLog> page(CourseLogPageParam courseLogPageParam) {
+        QueryWrapper<CourseLog> queryWrapper = new QueryWrapper<>();
+
+        if(ObjectUtil.isNotEmpty(courseLogPageParam.getCourseName())){
+            queryWrapper.lambda().like(CourseLog::getCourseName, courseLogPageParam.getCourseName());
+        }
+
+        if(ObjectUtil.isNotEmpty(courseLogPageParam.getChapterName())){
+            queryWrapper.lambda().like(CourseLog::getChapterName, courseLogPageParam.getChapterName());
+        }
+
+        if(ObjectUtil.isNotEmpty(courseLogPageParam.getFileName())){
+            queryWrapper.lambda().like(CourseLog::getFileName, courseLogPageParam.getFileName());
+        }
+
+
+        if(ObjectUtil.isAllNotEmpty(courseLogPageParam.getSortField(), courseLogPageParam.getSortOrder())) {
+            CommonSortOrderEnum.validate(courseLogPageParam.getSortOrder());
+            queryWrapper.orderBy(true, courseLogPageParam.getSortOrder().equals(CommonSortOrderEnum.ASC.getValue()),
+                    StrUtil.toUnderlineCase(courseLogPageParam.getSortField()));
+        } else {
+            queryWrapper.lambda().orderByAsc(CourseLog::getId);
+        }
+        return this.page(CommonPageRequest.defaultPage(), queryWrapper);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void add(CourseLogAddParam courseLogAddParam) {
+        CourseLog courseLog = BeanUtil.toBean(courseLogAddParam, CourseLog.class);
+        courseLog.setId(IdUtil.getSnowflakeNextIdStr());
+        courseLog.setCreateUser(StpLoginUserUtil.getLoginUser().getId());
+        courseLog.setCreateTime(new Date());
+        this.save(courseLog);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void edit(CourseLogEditParam courseLogEditParam) {
+        CourseLog courseLog = this.queryEntity(courseLogEditParam.getId());
+        BeanUtil.copyProperties(courseLogEditParam, courseLog);
+        this.updateById(courseLog);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void delete(List<CourseLogIdParam> courseLogIdParamList) {
+        // 执行删除
+        this.removeByIds(CollStreamUtil.toList(courseLogIdParamList, CourseLogIdParam::getId));
+    }
+
+    @Override
+    public CourseLog detail(CourseLogIdParam courseLogIdParam) {
+        return this.queryEntity(courseLogIdParam.getId());
+    }
+
+    @Override
+    public CourseLog queryEntity(String id) {
+        CourseLog courseLog = this.getById(id);
+        if(ObjectUtil.isEmpty(courseLog)) {
+            throw new CommonException("课程足迹不存在,id值为:{}", id);
+        }
+        return courseLog;
+    }
+
+}

+ 14 - 3
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/util/MinioUtil.java

@@ -19,6 +19,8 @@ import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Value;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
 import org.springframework.stereotype.Component;
 import vip.xiaonuo.auth.core.util.StpLoginUserUtil;
 import vip.xiaonuo.disk.commpen.ProducerCommpen;
@@ -30,6 +32,7 @@ import vip.xiaonuo.disk.mapper.ImageMapper;
 import vip.xiaonuo.disk.mapper.ResourceFileMapper;
 import vip.xiaonuo.disk.mapper.ResourceUserFileMapper;
 import vip.xiaonuo.disk.mapper.UploadTaskMapper;
+import vip.xiaonuo.disk.service.IStorageReService;
 
 import javax.annotation.Resource;
 import javax.imageio.ImageIO;
@@ -74,7 +77,8 @@ public class MinioUtil {
     private ProducerCommpen producer;
     @Resource
     private KafKaProducerUtil kafKaProducerUtil;
-
+    @Resource
+    private IStorageReService storageReService;
     @Resource
     UploadTaskMapper uploadTaskMapper;
 
@@ -104,7 +108,14 @@ public class MinioUtil {
      * @param md5List
      * @return
      */
-    public List<ResourceUserFile> checkFilesExits(List<UploadFile> md5List) {
+    public ResponseEntity<?> checkFilesExits(List<UploadFile> md5List) {
+        long totalSize = md5List.stream()
+                .mapToLong(UploadFile::getSize)
+                .sum();
+        boolean isCheckSuccess = storageReService.checkStorage(StpLoginUserUtil.getLoginUser().getId(),totalSize);
+        if (!isCheckSuccess) {
+            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("存储空间不足");
+        }
 
         List<ResourceUserFile> noExitList = new ArrayList<>();
         md5List.forEach(item -> {
@@ -144,7 +155,7 @@ public class MinioUtil {
                }
 
         });
-        return noExitList;
+        return ResponseEntity.ok(noExitList);
     }
 
 

+ 2 - 0
snowy-plugin/snowy-plugin-exam/snowy-plugin-exam-func/src/main/java/vip/xiaonuo/exam/controller/admin/ExamPaperController.java

@@ -74,4 +74,6 @@ public class ExamPaperController extends BaseApiController {
         examPaperService.updateByIdFilter(examPaper);
         return CommonResult.ok();
     }
+
+
 }

+ 12 - 0
snowy-plugin/snowy-plugin-exam/snowy-plugin-exam-func/src/main/java/vip/xiaonuo/exam/controller/admin/TExamController.java

@@ -29,11 +29,13 @@ import vip.xiaonuo.exam.domain.exam.TExamEditParam;
 import vip.xiaonuo.exam.domain.exam.TExamIdParam;
 import vip.xiaonuo.exam.domain.exam.TExamPageParam;
 import vip.xiaonuo.exam.service.TExamService;
+import vip.xiaonuo.exam.vo.TExamPaperStastic;
 import vip.xiaonuo.exam.vo.TExamVo;
 
 import javax.annotation.Resource;
 import javax.validation.Valid;
 import javax.validation.constraints.NotEmpty;
+import java.util.List;
 
 /**
  * 考试表控制器 教师端
@@ -129,4 +131,14 @@ public class TExamController extends BaseApiController {
     }
 
 
+
+
+    @ApiOperationSupport(order = 5)
+    @ApiOperation("调查问卷统计")
+    @GetMapping("/stasticByPaperId")
+    public CommonResult<List<TExamPaperStastic>> stastic(String paperId) {
+        return CommonResult.data(tExamService.stasticByPaperId(paperId));
+    }
+
+
 }

+ 5 - 0
snowy-plugin/snowy-plugin-exam/snowy-plugin-exam-func/src/main/java/vip/xiaonuo/exam/mapper/TExamMapper.java

@@ -17,8 +17,11 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import org.apache.ibatis.annotations.Param;
 import vip.xiaonuo.exam.domain.TExam;
 import vip.xiaonuo.exam.domain.exam.TExamPageParam;
+import vip.xiaonuo.exam.vo.TExamPaperStastic;
 import vip.xiaonuo.exam.vo.TExamVo;
 
+import java.util.List;
+
 /**
  * 考试表Mapper接口
  *
@@ -29,4 +32,6 @@ public interface TExamMapper extends BaseMapper<TExam> {
     Page<TExamVo> queryList(@Param("page") Page<Object> objectPage, @Param("tExamPageParam") TExamPageParam tExamPageParam);
 
     TExamVo detail(String id);
+
+    List<TExamPaperStastic> stasticByPaperId(String paperId);
 }

+ 18 - 0
snowy-plugin/snowy-plugin-exam/snowy-plugin-exam-func/src/main/java/vip/xiaonuo/exam/mapper/mapping/TExamMapper.xml

@@ -67,4 +67,22 @@
         LEFT JOIN  SEMESTER c ON a.SEMESTER_ID =c.ID
         where a.ID=#{id}
     </select>
+
+
+    <select id="stasticByPaperId" resultType="vip.xiaonuo.exam.vo.TExamPaperStastic">
+        SELECT
+            te.item_order itemOrder,
+            te.question_id questionId,
+            tt."content" content,
+            CASE
+                WHEN te.question_type = 5 THEN CONCAT('["',LISTAGG(te.answer, '","'),'"]')
+                ELSE LISTAGG(te.answer, ',')
+                END AS answerList
+        FROM t_exam_paper_question_customer_answer te
+         JOIN t_question tq ON te.question_id = tq.id
+         JOIN t_text_content tt ON tt.id = te.question_text_content_id
+        WHERE te.exam_paper_id = #{paperId}
+        GROUP BY te.question_id, te.question_type, tt."content",te.item_order
+        ORDER BY te.item_order;
+    </select>
 </mapper>

+ 2 - 1
snowy-plugin/snowy-plugin-exam/snowy-plugin-exam-func/src/main/java/vip/xiaonuo/exam/service/TExamService.java

@@ -19,9 +19,9 @@ import vip.xiaonuo.exam.domain.exam.TExamAddParam;
 import vip.xiaonuo.exam.domain.exam.TExamEditParam;
 import vip.xiaonuo.exam.domain.exam.TExamIdParam;
 import vip.xiaonuo.exam.domain.exam.TExamPageParam;
+import vip.xiaonuo.exam.vo.TExamPaperStastic;
 import vip.xiaonuo.exam.vo.TExamVo;
 
-
 import java.util.List;
 
 /**
@@ -80,4 +80,5 @@ public interface TExamService extends IService<TExam> {
      **/
     TExam queryEntity(String id);
 
+    List<TExamPaperStastic> stasticByPaperId(String paperId);
 }

+ 6 - 0
snowy-plugin/snowy-plugin-exam/snowy-plugin-exam-func/src/main/java/vip/xiaonuo/exam/service/impl/TExamServiceImpl.java

@@ -41,6 +41,7 @@ import vip.xiaonuo.exam.mapper.TExamMapper;
 import vip.xiaonuo.exam.service.ExamPaperService;
 import vip.xiaonuo.exam.service.TExamService;
 import vip.xiaonuo.exam.utility.DateTimeUtil;
+import vip.xiaonuo.exam.vo.TExamPaperStastic;
 import vip.xiaonuo.exam.vo.TExamVo;
 
 import javax.annotation.Resource;
@@ -272,6 +273,11 @@ public class TExamServiceImpl extends ServiceImpl<TExamMapper, TExam> implements
         return tExam;
     }
 
+    @Override
+    public List<TExamPaperStastic> stasticByPaperId(String paperId) {
+        return  tExamMapper.stasticByPaperId(paperId);
+    }
+
 
     public TExam addJob(TExam tExam, String startOnEnd){
         JSONObject jobParam = new JSONObject();

+ 22 - 0
snowy-plugin/snowy-plugin-exam/snowy-plugin-exam-func/src/main/java/vip/xiaonuo/exam/vo/TExamPaperStastic.java

@@ -0,0 +1,22 @@
+package vip.xiaonuo.exam.vo;
+
+import lombok.Getter;
+import lombok.Setter;
+
+@Setter
+@Getter
+public class TExamPaperStastic implements java.io.Serializable{
+
+  private String itemOrder;
+
+
+    private String questionId;
+
+
+
+    private String content;
+
+
+    private String answerList;
+
+}

+ 3 - 3
snowy-plugin/snowy-plugin-forum/snowy-plugin-forum-func/src/main/java/vip/xiaonuo/forum/modular/postinfo/controller/ForumPostInfoController.java

@@ -175,9 +175,9 @@ public class ForumPostInfoController {
     /**
      * 查询所有发帖数和回帖数
      */
-    @GetMapping("/forum/postinfo/getCount")
-    public CommonResult<JSONObject> getCount() {
-        return forumPostInfoService.getCount();
+    @PostMapping("/forum/postinfo/getCount")
+    public CommonResult<JSONObject> getCount(@RequestBody JSONObject json) {
+        return forumPostInfoService.getCount(json);
     }
 
 

+ 1 - 1
snowy-plugin/snowy-plugin-forum/snowy-plugin-forum-func/src/main/java/vip/xiaonuo/forum/modular/postinfo/service/ForumPostInfoService.java

@@ -111,5 +111,5 @@ public interface ForumPostInfoService extends IService<ForumPostInfo> {
     /**
      * 查询所有发帖数和回帖数
      */
-    CommonResult<JSONObject> getCount();
+    CommonResult<JSONObject> getCount(JSONObject json);
 }

+ 81 - 16
snowy-plugin/snowy-plugin-forum/snowy-plugin-forum-func/src/main/java/vip/xiaonuo/forum/modular/postinfo/service/impl/ForumPostInfoServiceImpl.java

@@ -16,7 +16,7 @@ import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.collection.CollStreamUtil;
 import cn.hutool.core.util.IdUtil;
 import cn.hutool.core.util.ObjectUtil;
-import cn.hutool.core.util.StrUtil;
+import cn.hutool.json.JSONArray;
 import cn.hutool.json.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.StringUtils;
@@ -27,7 +27,6 @@ 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.common.pojo.CommonResult;
@@ -42,7 +41,6 @@ import vip.xiaonuo.forum.modular.postinfo.param.ForumPostInfoIdParam;
 import vip.xiaonuo.forum.modular.postinfo.param.ForumPostInfoPageParam;
 import vip.xiaonuo.forum.modular.postinfo.service.ForumPostInfoService;
 import vip.xiaonuo.forum.modular.postlike.entity.ForumPostLike;
-import vip.xiaonuo.forum.modular.postlike.mapper.ForumPostLikeMapper;
 import vip.xiaonuo.forum.modular.postlike.service.ForumPostLikeService;
 import vip.xiaonuo.forum.modular.postreply.entity.ForumPostReply;
 import vip.xiaonuo.forum.modular.postreply.param.ForumPostReplyPageParam;
@@ -58,6 +56,9 @@ import vip.xiaonuo.forum.modular.supportenv.mapper.ForumSupportEnvMapper;
 import vip.xiaonuo.sys.api.SysUserApi;
 
 import javax.annotation.Resource;
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+import java.time.format.DateTimeParseException;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.stream.Collectors;
@@ -540,19 +541,83 @@ public class ForumPostInfoServiceImpl extends ServiceImpl<ForumPostInfoMapper, F
     }
 
     @Override
-    public CommonResult<com.alibaba.fastjson.JSONObject> getCount() {
-        // 查询帖子未关闭的总数量
-        QueryWrapper<ForumPostInfo> queryWrapper = new QueryWrapper<>();
-        queryWrapper.lambda().eq(ForumPostInfo::getPostStatus, 0);
-        long count = this.count(queryWrapper);
-        // 查询所有回复数量
-        QueryWrapper<ForumPostReply> queryWrapper1 = new QueryWrapper<>();
-        long replyCount = forumPostReplyService.count(queryWrapper1);
-        // 封装返回参数
-        com.alibaba.fastjson.JSONObject jsonObject = new com.alibaba.fastjson.JSONObject();
-        jsonObject.put("postCount", count);
-        jsonObject.put("replyCount", replyCount);
-        return CommonResult.data(jsonObject);
+    public CommonResult<com.alibaba.fastjson.JSONObject> getCount(com.alibaba.fastjson.JSONObject json) {
+        com.alibaba.fastjson.JSONObject result = new com.alibaba.fastjson.JSONObject();
+        // 取出查询条件,起始时间和结束时间
+        String startTime = json.getString("startTime");
+        String endTime = json.getString("endTime");
+        // 如果没有默认查询所有总共的
+        if (StringUtils.isBlank(startTime) && StringUtils.isBlank(endTime)) {
+            // 查询帖子未关闭的总数量
+            QueryWrapper<ForumPostInfo> queryWrapper = new QueryWrapper<>();
+            queryWrapper.lambda().eq(ForumPostInfo::getPostStatus, 0);
+            long count = this.count(queryWrapper);
+            // 查询所有回复数量
+            QueryWrapper<ForumPostReply> queryWrapper1 = new QueryWrapper<>();
+            long replyCount = forumPostReplyService.count(queryWrapper1);
+            // 封装返回参数,查询总数
+            result.put("type", 0);
+            result.put("postCount", count);
+            result.put("replyCount", replyCount);
+            return CommonResult.data(result);
+        } else {
+            JSONArray jsonArray = new JSONArray();
+            // 取出开始日期到结束日期的每一天日期
+            List<String> dateList = getDatesBetween(startTime, endTime);
+            for (String date : dateList) {
+                // 查询帖子未关闭的总数量
+                QueryWrapper<ForumPostInfo> queryWrapper = new QueryWrapper<>();
+                queryWrapper.lambda().eq(ForumPostInfo::getPostStatus, 0).apply("TO_CHAR(create_time, 'YYYY-MM-DD') = {0}", date);
+                long count = this.count(queryWrapper);
+                // 查询所有回复数量
+                QueryWrapper<ForumPostReply> queryWrapper1 = new QueryWrapper<>();
+                queryWrapper1.lambda().apply("TO_CHAR(create_time, 'YYYY-MM-DD') = {0}", date);
+                long replyCount = forumPostReplyService.count(queryWrapper1);
+                // 封装返回参数
+                com.alibaba.fastjson.JSONObject jsonObject = new com.alibaba.fastjson.JSONObject();
+                jsonObject.put("date", date);
+                jsonObject.put("postCount", count);
+                jsonObject.put("replyCount", replyCount);
+                jsonArray.add(jsonObject);
+            }
+            // 封装返回参数,按日期查询
+            result.put("type", 1);
+            result.put("list", jsonArray);
+            return CommonResult.data(result);
+        }
+    }
+
+
+    public static List<String> getDatesBetween(String startDateStr, String endDateStr) {
+        // 定义日期格式
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+
+        try {
+            // 解析字符串为日期对象
+            LocalDate startDate = LocalDate.parse(startDateStr, formatter);
+            LocalDate endDate = LocalDate.parse(endDateStr, formatter);
+
+            // 确保开始日期不晚于结束日期
+            if (startDate.isAfter(endDate)) {
+                LocalDate temp = startDate;
+                startDate = endDate;
+                endDate = temp;
+            }
+
+            // 生成日期列表
+            List<String> dateList = new ArrayList<>();
+            LocalDate currentDate = startDate;
+
+            while (!currentDate.isAfter(endDate)) {
+                dateList.add(currentDate.format(formatter));
+                currentDate = currentDate.plusDays(1);
+            }
+
+            return dateList;
+
+        } catch (DateTimeParseException e) {
+            throw new IllegalArgumentException("日期格式错误,请使用 yyyy-MM-dd 格式");
+        }
     }
 
 }