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

1.修复部分测试发现bug
2.按原型图完善课程相关一些接口细节,如加入更新课时数量,课程中心加入收藏相关信息等
3.完成课程收藏相关功能

honorfire 7 месяцев назад
Родитель
Сommit
83200c9acf
23 измененных файлов с 972 добавлено и 11 удалено
  1. 33 3
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/controller/CourseClassHourController.java
  2. 5 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/controller/CourseInfoController.java
  3. 174 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/controller/CourseStudentCollectController.java
  4. 1 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/controller/CourseStudentRelateController.java
  5. 0 3
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/domain/Chapter.java
  6. 4 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/domain/CourseInfo.java
  7. 71 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/domain/CourseStudentCollect.java
  8. 34 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/domain/CourseStudentCollectEnum.java
  9. 39 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/mapper/CourseStudentCollectMapper.java
  10. 9 5
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/mapper/mapping/CourseInfoMapper.xml
  11. 110 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/mapper/mapping/CourseStudentCollectMapper.xml
  12. 4 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/mapper/mapping/CourseStudentRelateMapper.xml
  13. 42 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/param/coursestudentcollect/CourseStudentCollectAddParam.java
  14. 47 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/param/coursestudentcollect/CourseStudentCollectEditParam.java
  15. 35 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/param/coursestudentcollect/CourseStudentCollectIdParam.java
  16. 51 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/param/coursestudentcollect/CourseStudentCollectPageParam.java
  17. 6 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/ChapterService.java
  18. 7 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/ClassHourService.java
  19. 114 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/CourseStudentCollectService.java
  20. 15 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/impl/ChapterServiceImpl.java
  21. 21 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/impl/ClassHourServiceImpl.java
  22. 147 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/impl/CourseStudentCollectServiceImpl.java
  23. 3 0
      snowy-plugin/snowy-plugin-sys/snowy-plugin-sys-func/src/main/java/vip/xiaonuo/sys/modular/user/controller/SysUserController.java

+ 33 - 3
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/controller/CourseClassHourController.java

@@ -28,14 +28,15 @@ 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.ClassHour;
-import vip.xiaonuo.disk.domain.College;
-import vip.xiaonuo.disk.domain.CourseRelate;
+import vip.xiaonuo.disk.domain.*;
 import vip.xiaonuo.disk.param.ClassHourAddParam;
 import vip.xiaonuo.disk.param.ClassHourEditParam;
 import vip.xiaonuo.disk.param.ClassHourIdParam;
 import vip.xiaonuo.disk.param.ClassHourPageParam;
+import vip.xiaonuo.disk.param.courseclasshourfilerelate.CourseRelateIdParam;
+import vip.xiaonuo.disk.service.ChapterService;
 import vip.xiaonuo.disk.service.ClassHourService;
+import vip.xiaonuo.disk.service.CourseInfoService;
 import vip.xiaonuo.disk.service.CourseRelateService;
 
 import javax.annotation.Resource;
@@ -64,6 +65,10 @@ public class CourseClassHourController {
     private ClassHourService classHourService;
     @Resource
     private CourseRelateService courseRelateService;
+    @Resource
+    private ChapterService chapterService;
+    @Resource
+    private CourseInfoService courseInfoService;
 
     /**
      * 获取课时表分页
@@ -105,6 +110,18 @@ public class CourseClassHourController {
                     .collect(Collectors.toList());
             courseRelateService.addBatch(courseRelates);
         }
+        //更新课程的课时数量字段
+        Chapter chapter = chapterService.queryEntity(classHour.getChapterId());
+        CourseInfo courseInfo = courseInfoService.queryEntity(chapter.getCourseId());
+        Map param =new HashMap();
+        param.put("courseId", chapter.getCourseId());
+        List<Chapter> chapterList=chapterService.wrapperList(param);
+        List<String> chapterIdList= CollStreamUtil.toList(chapterList, Chapter::getId);
+        param.clear();
+        param.put("chapterIdList", chapterIdList);
+        List<ClassHour> classHourList =classHourService.wrapperList(param);
+        courseInfo.setHourCount(String.valueOf(classHourList.size()));
+        courseInfoService.editOne(courseInfo);
         return CommonResult.ok();
     }
 
@@ -156,7 +173,20 @@ public class CourseClassHourController {
     @PostMapping("/disk/hour/delete")
     public CommonResult<String> delete(@RequestBody @Valid @NotEmpty(message = "集合不能为空")
                                                    CommonValidList<ClassHourIdParam> classHourIdParamList) {
+        ClassHour classHour=classHourService.queryEntity(classHourIdParamList.get(0).getId());
+        Chapter chapter = chapterService.queryEntity(classHour.getChapterId());
         classHourService.delete(classHourIdParamList);
+        //更新课程的课时数量字段
+        CourseInfo courseInfo = courseInfoService.queryEntity(chapter.getCourseId());
+        Map param =new HashMap();
+        param.put("courseId", chapter.getCourseId());
+        List<Chapter> chapterList=chapterService.wrapperList(param);
+        List<String> chapterIdList= CollStreamUtil.toList(chapterList, Chapter::getId);
+        param.clear();
+        param.put("chapterIdList", chapterIdList);
+        List<ClassHour> classHourList =classHourService.wrapperList(param);
+        courseInfo.setHourCount(String.valueOf(classHourList.size()));
+        courseInfoService.editOne(courseInfo);
         return CommonResult.ok();
     }
 

+ 5 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/controller/CourseInfoController.java

@@ -68,6 +68,8 @@ public class CourseInfoController {
     private ClassHourService classHourService;
     @Resource
     private CourseRelateService courseRelateService;
+    @Resource
+    private CourseStudentCollectService courseStudentCollectService;
 
     /**
      * 课程信息-分页列表
@@ -269,6 +271,9 @@ public class CourseInfoController {
         Map param =new HashMap();
         param.put("courseId", req.getParameter("courseId"));
         Map<String,Object> result=courseInfoService.coursecentryDetail(param);
+        //加入是否收藏信息
+        Boolean isCollect=courseStudentCollectService.isCollect(param);
+        result.put("isCollect", isCollect);
         return CommonResult.data(result);
     }
 

+ 174 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/controller/CourseStudentCollectController.java

@@ -0,0 +1,174 @@
+/*
+ * 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 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.CourseStudentCollect;
+import vip.xiaonuo.disk.param.coursestudentcollect.CourseStudentCollectAddParam;
+import vip.xiaonuo.disk.param.coursestudentcollect.CourseStudentCollectEditParam;
+import vip.xiaonuo.disk.param.coursestudentcollect.CourseStudentCollectIdParam;
+import vip.xiaonuo.disk.param.coursestudentcollect.CourseStudentCollectPageParam;
+import vip.xiaonuo.disk.service.CourseStudentCollectService;
+
+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.Map;
+
+/**
+ * 课程学生-收藏表控制器
+ *
+ * @author honorfire
+ * @date  2025/07/19 16:36
+ */
+@Api(tags = "课程学生-收藏表控制器")
+@ApiSupport(author = "SNOWY_TEAM", order = 1)
+@RestController
+@Validated
+public class CourseStudentCollectController {
+
+    @Resource
+    private CourseStudentCollectService courseStudentCollectService;
+
+    /**
+     * 课程收藏-分页列表
+     *
+     * @author honorfire
+     * @date  2025/07/19 16:36
+     */
+    @ApiOperationSupport(order = 1)
+    @ApiOperation("课程收藏-分页列表")
+    @SaCheckPermission("/disk/coursestudentcollect/page")
+    @GetMapping("/disk/coursestudentcollect/page")
+    public CommonResult<Page<Map<String, Object>>> page(CourseStudentCollectPageParam courseStudentCollectPageParam, HttpServletRequest req) {
+        Map param =new HashMap();
+        param.put("userId", StpLoginUserUtil.getLoginUser().getId());
+        param.put("courseName", req.getParameter("courseName"));
+        param.put("collegeId", req.getParameter("collegeId"));
+        param.put("majorId", req.getParameter("majorId"));
+        param.put("courseType", req.getParameter("courseType"));
+        //排序类型,0最新,1热门
+        String sortflag="0";
+        if(StringUtils.isNotEmpty(req.getParameter("sortflag")))sortflag=req.getParameter("sortflag");
+        param.put("sortflag", sortflag);
+
+        Page<Map<String,Object>> list=courseStudentCollectService.queryList(param);
+        return CommonResult.data(list);
+    }
+
+    /**
+     * 课程收藏-添加
+     *
+     * @author honorfire
+     * @date  2025/07/19 16:36
+     */
+    @ApiOperationSupport(order = 2)
+    @ApiOperation("课程收藏-添加")
+    @CommonLog("课程收藏-添加")
+    @SaCheckPermission("/disk/coursestudentcollect/add")
+    @PostMapping("/disk/coursestudentcollect/add")
+    public CommonResult<String> add(@RequestBody @Valid CourseStudentCollectAddParam courseStudentCollectAddParam) {
+        CourseStudentCollect courseStudentCollect = BeanUtil.toBean(courseStudentCollectAddParam, CourseStudentCollect.class);
+        courseStudentCollectService.addOne(courseStudentCollect);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 课程收藏-编辑
+     *
+     * @author honorfire
+     * @date  2025/07/19 16:36
+     */
+    @ApiOperationSupport(order = 3)
+    @ApiOperation("课程收藏-编辑")
+    @CommonLog("课程收藏-编辑")
+    @SaCheckPermission("/disk/coursestudentcollect/edit")
+    @PostMapping("/disk/coursestudentcollect/edit")
+    public CommonResult<String> edit(@RequestBody @Valid CourseStudentCollectEditParam courseStudentCollectEditParam) {
+        CourseStudentCollect courseStudentCollect = BeanUtil.toBean(courseStudentCollectEditParam, CourseStudentCollect.class);
+        courseStudentCollectService.editOne(courseStudentCollect);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 课程收藏-删除
+     *
+     * @author honorfire
+     * @date  2025/07/19 16:36
+     */
+    @ApiOperationSupport(order = 4)
+    @ApiOperation("课程收藏-删除")
+    @CommonLog("课程收藏-删除")
+    @SaCheckPermission("/disk/coursestudentcollect/delete")
+    @PostMapping("/disk/coursestudentcollect/delete")
+    public CommonResult<String> delete(@RequestBody @Valid @NotEmpty(message = "集合不能为空")
+                                                   CommonValidList<CourseStudentCollectIdParam> courseStudentCollectIdParamList) {
+        courseStudentCollectService.delete(courseStudentCollectIdParamList);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 课程收藏-详情
+     *
+     * @author honorfire
+     * @date  2025/07/19 16:36
+     */
+    @ApiOperationSupport(order = 5)
+    @ApiOperation("课程收藏-详情")
+    @SaCheckPermission("/disk/coursestudentcollect/detail")
+    @GetMapping("/disk/coursestudentcollect/detail")
+    public CommonResult<Map<String,Object>> detail(@Valid CourseStudentCollectIdParam courseStudentCollectIdParam, HttpServletRequest req) {
+        Map param =new HashMap();
+        param.put("id", req.getParameter("id"));
+        Map<String,Object> result=courseStudentCollectService.queryInfo(param);
+        return CommonResult.data(result);
+    }
+
+    /**
+     * 课程收藏-是否收藏
+     *
+     * @author honorfire
+     * @date  2025/07/19 16:36
+     */
+    @ApiOperationSupport(order = 5)
+    @ApiOperation("课程收藏-详情")
+    @SaCheckPermission("/disk/coursestudentcollect/isCollect")
+    @GetMapping("/disk/coursestudentcollect/isCollect")
+    public CommonResult<Map<String,Object>> isCollect(@Valid CourseStudentCollectIdParam courseStudentCollectIdParam, HttpServletRequest req) {
+        Map result=new HashMap();
+        Map param =new HashMap();
+        param.put("id", req.getParameter("id"));
+        Boolean isCollect=courseStudentCollectService.isCollect(param);
+        result.put("isCollect", isCollect);
+        return CommonResult.data(result);
+    }
+
+}

+ 1 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/controller/CourseStudentRelateController.java

@@ -84,6 +84,7 @@ public class CourseStudentRelateController {
     @GetMapping("/disk/coursestudentrelate/page")
     public CommonResult<Page<Map<String,Object>>> page(CourseStudentRelatePageParam courseStudentRelatePageParam, HttpServletRequest req) {
         Map param =new HashMap();
+        param.put("courseId", req.getParameter("courseId"));
         param.put("queryInfo", req.getParameter("queryInfo"));
         param.put("gender", req.getParameter("gender"));
         param.put("userStatus", req.getParameter("userStatus"));

+ 0 - 3
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/domain/Chapter.java

@@ -72,7 +72,4 @@ public class Chapter {
     @TableField(fill = FieldFill.UPDATE)
     private String updateUser;
 
-    /** 文件id */
-    @ApiModelProperty(value = "文件id", position = 10)
-    private String userFileId;
 }

+ 4 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/domain/CourseInfo.java

@@ -138,4 +138,8 @@ public class CourseInfo {
     /** 上架状态 */
     @ApiModelProperty(value = "上架状态", position = 7)
     private String putawayStatus;
+
+    /** 课时数量 */
+    @ApiModelProperty(value = "课时数量", position = 7)
+    private String hourCount;
 }

+ 71 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/domain/CourseStudentCollect.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.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/19 16:36
+ **/
+@Getter
+@Setter
+@TableName("COURSE_STUDENT_COLLECT")
+public class CourseStudentCollect {
+
+    /** 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 courseId;
+
+    /** 删除标记(NOT_DELETE-未删除) */
+    @ApiModelProperty(value = "删除标记(NOT_DELETE-未删除)", position = 4)
+    @TableLogic
+    @TableField(fill = FieldFill.INSERT)
+    private String deleteFlag;
+
+    /** 记录更新时间 */
+    @ApiModelProperty(value = "记录更新时间", position = 5)
+    @TableField(fill = FieldFill.UPDATE)
+    private Date updateTime;
+
+    /** 记录创建时间 */
+    @ApiModelProperty(value = "记录创建时间", position = 6)
+    @TableField(fill = FieldFill.INSERT)
+    private Date createTime;
+
+    /** 记录创建人 */
+    @ApiModelProperty(value = "记录创建人", position = 7)
+    @TableField(fill = FieldFill.INSERT)
+    private String createUser;
+
+    /** 记录更新人 */
+    @ApiModelProperty(value = "记录更新人", position = 8)
+    @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/CourseStudentCollectEnum.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/19 16:36
+ **/
+@Getter
+public enum CourseStudentCollectEnum {
+
+    /** 测试 */
+    TEST("TEST");
+
+    private final String value;
+
+    CourseStudentCollectEnum(String value) {
+        this.value = value;
+    }
+}

+ 39 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/mapper/CourseStudentCollectMapper.java

@@ -0,0 +1,39 @@
+/*
+ * 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 com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.apache.ibatis.annotations.Param;
+import vip.xiaonuo.disk.domain.CourseStudentCollect;
+
+import java.util.Map;
+
+/**
+ * 课程学生-收藏表Mapper接口
+ *
+ * @author honorfire
+ * @date  2025/07/19 16:36
+ **/
+public interface CourseStudentCollectMapper extends BaseMapper<CourseStudentCollect> {
+
+    /**
+     * 课程收藏-分页列表
+     */
+    Page<Map<String,Object>> queryList(@Param("param") Map param, @Param("page") Page<Object> page);
+
+    /**
+     * 课程收藏-详情
+     */
+    Map<String,Object> queryInfo(Map param);
+}

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

@@ -26,7 +26,8 @@
         IFNULL(ci.PUBLISH_TIME,'') as publishTime,
         IFNULL(ci.TIME_LIMIT_TYPE,'') as timeLimitType,
         IFNULL(ci.START_TIME,'') as startTime,
-        IFNULL(ci.END_TIME,'') as endTime
+        IFNULL(ci.END_TIME,'') as endTime,
+        IFNULL(ci.VIEW_COUNT ,'') as viewCount
         FROM COURSE_INFO ci
         LEFT JOIN SYS_ORG co ON ci.COLLEGE_ID=co.ID AND co.DELETE_FLAG ='NOT_DELETE'
         LEFT JOIN SYS_ORG co2 ON ci.COLLEGE_TWO_ID=co2.id AND co2.DELETE_FLAG ='NOT_DELETE'
@@ -50,7 +51,7 @@
             and ci.COURSE_TYPE=#{param.courseType}
         </if>
         <if test="param.courseName !=null and param.courseName != ''">
-            and ci.COURSE_NAME=#{param.courseName}
+            and ci.COURSE_NAME like CONCAT('%', #{param.courseName}, '%')
         </if>
         <if test="param.sortflag !=null and param.sortflag != ''">
             <if test=" param.sortflag == 0">
@@ -88,7 +89,8 @@
         IFNULL(CAST(df.DOWNLOAD_PATH AS VARCHAR),'') AS coverImagePath,
         IFNULL(ci.TIME_LIMIT_TYPE,'') as timeLimitType,
         IFNULL(ci.START_TIME,'') as startTime,
-        IFNULL(ci.END_TIME,'') as endTime
+        IFNULL(ci.END_TIME,'') as endTime,
+        IFNULL(ci.VIEW_COUNT ,'') as viewCount
         FROM COURSE_INFO ci
         LEFT JOIN DEV_FILE df ON ci.COVER_IMAGE_ID =df.ID AND df.DELETE_FLAG ='NOT_DELETE'
         LEFT JOIN SYS_ORG co ON ci.COLLEGE_ID=co.ID AND co.DELETE_FLAG ='NOT_DELETE'
@@ -116,7 +118,8 @@
             IFNULL (CAST(df.DOWNLOAD_PATH AS VARCHAR),'') AS coverImagePath,
             IFNULL(ci.TIME_LIMIT_TYPE,'') as timeLimitType,
             IFNULL(ci.START_TIME,'') as startTime,
-            IFNULL(ci.END_TIME,'') as endTime
+            IFNULL(ci.END_TIME,'') as endTime,
+            IFNULL(ci.VIEW_COUNT ,'') as viewCount
         FROM COURSE_INFO ci
         LEFT JOIN COURSE_STUDENT_RELATE csr ON ci.COURSE_ID = CSR.COURSE_ID AND CSR.DELETE_FLAG ='NOT_DELETE'
         LEFT JOIN DEV_FILE df ON ci.COVER_IMAGE_ID =df.ID AND df.DELETE_FLAG ='NOT_DELETE'
@@ -171,7 +174,8 @@
             IFNULL (CAST(df.DOWNLOAD_PATH AS VARCHAR),'') AS coverImagePath,
             IFNULL(ci.TIME_LIMIT_TYPE,'') as timeLimitType,
             IFNULL(ci.START_TIME,'') as startTime,
-            IFNULL(ci.END_TIME,'') as endTime
+            IFNULL(ci.END_TIME,'') as endTime,
+            IFNULL(ci.VIEW_COUNT ,'') as viewCount
         FROM COURSE_INFO ci
         LEFT JOIN DEV_FILE df ON ci.COVER_IMAGE_ID =df.ID AND df.DELETE_FLAG ='NOT_DELETE'
         LEFT JOIN college co ON ci.COLLEGE_ID=co.ID AND co.DELETE_FLAG ='NOT_DELETE'

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

@@ -0,0 +1,110 @@
+<?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.CourseStudentCollectMapper">
+
+    <select id="queryList" resultType="java.util.Map">
+        select
+            csc.ID as id,
+            ci.COURSE_ID as courseId,
+            IFNULL(ci.COURSE_NAME,'') as courseName,
+            IFNULL(ci.COURSE_TYPE,'') as courseType,
+            IFNULL(( SELECT dd1.DICT_LABEL FROM (SELECT d1.DICT_LABEL,d1.DICT_VALUE  FROM  DEV_DICT d1 WHERE PARENT_ID = (SELECT d2.ID  FROM  DEV_DICT d2 WHERE d2.DICT_VALUE='COURSE_TYPE') )dd1 WHERE dd1.DICT_VALUE = TRIM(ci.COURSE_TYPE) ),'') AS courseTypeName,
+            IFNULL(ci.COURSE_DESC,'') as courseDesc,
+            IFNULL(ci.TEACHER_ID,'') as teacherId,
+            IFNULL(su.NAME,'') AS teacherIdName,
+            IFNULL(ci.COLLEGE_ID,'') AS collegeId,
+            IFNULL(co.NAME,'') AS collegeIdName,
+            IFNULL (ci.COLLEGE_TWO_ID,'') AS collegeTwoId,
+            IFNULL (co2.NAME,'') AS collegeTwoIdName,
+            IFNULL (ci.COLLEGE_THREE_ID,'') AS collegeThreeId,
+            IFNULL (co3.NAME,'') AS collegeThreeIdName,
+            CONCAT(ci.COLLEGE_ID,',',ci.COLLEGE_TWO_ID,',',ci.COLLEGE_THREE_ID) AS collegeAllId,
+            CONCAT(co.NAME,',',co2.NAME,',',co3.NAME) AS collegeAllIdName,
+            IFNULL(ci.MAJOR_ID,'') AS majorId,
+            IFNULL(ma.major_name,'') AS majorIdName,
+            IFNULL(ci.PUTAWAY_STATUS,'') as putawayStatus,
+            IFNULL(( SELECT dd1.DICT_LABEL FROM (SELECT d1.DICT_LABEL,d1.DICT_VALUE  FROM  DEV_DICT d1 WHERE PARENT_ID = (SELECT d2.ID  FROM  DEV_DICT d2 WHERE d2.DICT_VALUE='COURSE_PUTAWAY_STATUS') )dd1 WHERE dd1.DICT_VALUE = TRIM(ci.PUTAWAY_STATUS) ),'') AS putawayStatusName,
+            IFNULL(ci.PUBLISH_TIME,'') as publishTime,
+            IFNULL(ci.TIME_LIMIT_TYPE,'') as timeLimitType,
+            IFNULL(ci.START_TIME,'') as startTime,
+            IFNULL(ci.END_TIME,'') as endTime
+        FROM COURSE_STUDENT_COLLECT csc
+        LEFT JOIN COURSE_INFO ci ON ci.COURSE_ID = csc.COURSE_ID AND ci.DELETE_FLAG ='NOT_DELETE'
+        LEFT JOIN SYS_ORG co ON ci.COLLEGE_ID=co.ID AND co.DELETE_FLAG ='NOT_DELETE'
+        LEFT JOIN SYS_ORG co2 ON ci.COLLEGE_TWO_ID=co2.id AND co2.DELETE_FLAG ='NOT_DELETE'
+        LEFT JOIN SYS_ORG co3 ON ci.COLLEGE_THREE_ID=co3.id AND co3.DELETE_FLAG ='NOT_DELETE'
+        LEFT JOIN major ma ON ci.MAJOR_ID=ma.id AND ma.DELETE_FLAG ='NOT_DELETE'
+        LEFT JOIN SYS_USER su ON su.ID=ci.TEACHER_ID AND su.DELETE_FLAG ='NOT_DELETE'
+        WHERE csc.DELETE_FLAG ='NOT_DELETE'
+        AND ci.DELETE_FLAG ='NOT_DELETE'
+        <if test="param.userId !=null and param.userId != ''">
+            AND csc.USER_ID =#{param.userId}
+        </if>
+        <if test="param.collegeId !=null and param.collegeId != ''">
+            and ci.COLLEGE_ID=#{param.courseId}
+        </if>
+        <if test="param.collegeTwoId!=null and param.collegeTwoId != ''">
+            and ci.COLLEGE_TWO_ID=#{param.collegeTwoId}
+        </if>
+        <if test="param.collegeThreeId!=null and param.collegeThreeId != ''">
+            and ci.COLLEGE_THREE_ID=#{param.collegeThreeId}
+        </if>
+        <if test="param.majorId !=null and param.majorId != ''">
+            and ci.MAJOR_ID=#{param.majorId}
+        </if>
+        <if test="param.courseType !=null and param.courseType != ''">
+            and ci.COURSE_TYPE=#{param.courseType}
+        </if>
+        <if test="param.courseName !=null and param.courseName != ''">
+            and ci.COURSE_NAME like CONCAT('%', #{param.courseName}, '%')
+        </if>
+        <if test="param.sortflag !=null and param.sortflag != ''">
+            <if test=" param.sortflag == 0">
+                order by ci.CREATE_TIME desc
+            </if>
+            <if test=" param.sortflag == 1">
+                order by ci.VIEW_COUNT desc
+            </if>
+        </if>
+    </select>
+
+    <select id="queryInfo" resultType="java.util.Map">
+        select
+            csc.ID as id,
+            ci.COURSE_ID as courseId,
+            IFNULL(ci.COURSE_NAME,'') as courseName,
+            IFNULL(ci.COURSE_TYPE,'') as courseType,
+            IFNULL(( SELECT dd1.DICT_LABEL FROM (SELECT d1.DICT_LABEL,d1.DICT_VALUE  FROM  DEV_DICT d1 WHERE PARENT_ID = (SELECT d2.ID  FROM  DEV_DICT d2 WHERE d2.DICT_VALUE='COURSE_TYPE') )dd1 WHERE dd1.DICT_VALUE = TRIM(ci.COURSE_TYPE) ),'') AS courseTypeName,
+            IFNULL(ci.COURSE_DESC,'') as courseDesc,
+            IFNULL(ci.TEACHER_ID,'') as teacherId,
+            IFNULL(su.NAME,'') AS teacherIdName,
+            IFNULL(ci.COLLEGE_ID,'') AS collegeId,
+            IFNULL(co.NAME,'') AS collegeIdName,
+            IFNULL (ci.COLLEGE_TWO_ID,'') AS collegeTwoId,
+            IFNULL (co2.NAME,'') AS collegeTwoIdName,
+            IFNULL (ci.COLLEGE_THREE_ID,'') AS collegeThreeId,
+            IFNULL (co3.NAME,'') AS collegeThreeIdName,
+            CONCAT(ci.COLLEGE_ID,',',ci.COLLEGE_TWO_ID,',',ci.COLLEGE_THREE_ID) AS collegeAllId,
+            CONCAT(co.NAME,',',co2.NAME,',',co3.NAME) AS collegeAllIdName,
+            IFNULL(ci.MAJOR_ID,'') AS majorId,
+            IFNULL(ma.major_name,'') AS majorIdName,
+            IFNULL(ci.PUTAWAY_STATUS,'') as putawayStatus,
+            IFNULL(( SELECT dd1.DICT_LABEL FROM (SELECT d1.DICT_LABEL,d1.DICT_VALUE  FROM  DEV_DICT d1 WHERE PARENT_ID = (SELECT d2.ID  FROM  DEV_DICT d2 WHERE d2.DICT_VALUE='COURSE_PUTAWAY_STATUS') )dd1 WHERE dd1.DICT_VALUE = TRIM(ci.PUTAWAY_STATUS) ),'') AS putawayStatusName,
+            IFNULL(ci.PUBLISH_TIME,'') as publishTime,
+            IFNULL(ci.TIME_LIMIT_TYPE,'') as timeLimitType,
+            IFNULL(ci.START_TIME,'') as startTime,
+            IFNULL(ci.END_TIME,'') as endTime
+        FROM COURSE_STUDENT_COLLECT csc
+        LEFT JOIN COURSE_INFO ci ON ci.COURSE_ID = csc.COURSE_ID AND ci.DELETE_FLAG ='NOT_DELETE'
+        LEFT JOIN SYS_ORG co ON ci.COLLEGE_ID=co.ID AND co.DELETE_FLAG ='NOT_DELETE'
+        LEFT JOIN SYS_ORG co2 ON ci.COLLEGE_TWO_ID=co2.id AND co2.DELETE_FLAG ='NOT_DELETE'
+        LEFT JOIN SYS_ORG co3 ON ci.COLLEGE_THREE_ID=co3.id AND co3.DELETE_FLAG ='NOT_DELETE'
+        LEFT JOIN major ma ON ci.MAJOR_ID=ma.id AND ma.DELETE_FLAG ='NOT_DELETE'
+        LEFT JOIN SYS_USER su ON su.ID=ci.TEACHER_ID AND su.DELETE_FLAG ='NOT_DELETE'
+        WHERE csc.DELETE_FLAG ='NOT_DELETE'
+        AND ci.DELETE_FLAG ='NOT_DELETE'
+        <if test="id !=null and id != ''">
+            AND csc.ID =#{id}
+        </if>
+    </select>
+</mapper>

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

@@ -18,6 +18,9 @@
         LEFT JOIN SYS_USER su ON csr.USER_ID =su.ID
         WHERE csr.DELETE_FLAG ='NOT_DELETE'
         AND su.DELETE_FLAG ='NOT_DELETE'
+        <if test="param.courseId !=null and param.courseId != ''">
+            and csr.COURSE_ID=#{param.courseId}
+        </if>
         <if test="param.queryInfo !=null and param.gender != ''">
             and (su.NAME like CONCAT('%',#{param.queryInfo}, '%') or su.ACCOUNT like CONCAT('%',#{param.queryInfo}, '%') or su.PHONE like CONCAT('%',#{param.queryInfo}, '%'))
         </if>
@@ -33,6 +36,7 @@
         <if test="param.latestLoginEndTime !=null and param.latestLoginEndTime != ''">
             and su.LATEST_LOGIN_TIME &lt;=#{param.latestLoginEndTime}
         </if>
+        order by csr.CREATE_TIME desc
     </select>
     <select id="queryInfo" resultType="java.util.Map">
         SELECT

+ 42 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/param/coursestudentcollect/CourseStudentCollectAddParam.java

@@ -0,0 +1,42 @@
+/*
+ * 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.coursestudentcollect;
+
+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/19 16:36
+ **/
+@Getter
+@Setter
+public class CourseStudentCollectAddParam {
+
+    /** 人员id */
+    @ApiModelProperty(value = "人员id", position = 2)
+    private String userId;
+
+    /** 课程id */
+    @ApiModelProperty(value = "课程id", position = 3)
+    private String courseId;
+
+}

+ 47 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/param/coursestudentcollect/CourseStudentCollectEditParam.java

@@ -0,0 +1,47 @@
+/*
+ * 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.coursestudentcollect;
+
+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/19 16:36
+ **/
+@Getter
+@Setter
+public class CourseStudentCollectEditParam {
+
+    /** 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 courseId;
+
+}

+ 35 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/param/coursestudentcollect/CourseStudentCollectIdParam.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.coursestudentcollect;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * 课程学生-收藏表Id参数
+ *
+ * @author honorfire
+ * @date  2025/07/19 16:36
+ **/
+@Getter
+@Setter
+public class CourseStudentCollectIdParam {
+
+    /** 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/coursestudentcollect/CourseStudentCollectPageParam.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.coursestudentcollect;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 课程学生-收藏表查询参数
+ *
+ * @author honorfire
+ * @date  2025/07/19 16:36
+ **/
+@Getter
+@Setter
+public class CourseStudentCollectPageParam {
+
+    /** 当前页 */
+    @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;
+
+}

+ 6 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/ChapterService.java

@@ -17,6 +17,7 @@ import com.baomidou.mybatisplus.extension.service.IService;
 import vip.xiaonuo.disk.domain.Chapter;
 import vip.xiaonuo.disk.domain.ClassHour;
 import vip.xiaonuo.disk.domain.CourseInfo;
+import vip.xiaonuo.disk.domain.CourseRelate;
 import vip.xiaonuo.disk.param.ChapterAddParam;
 import vip.xiaonuo.disk.param.ChapterEditParam;
 import vip.xiaonuo.disk.param.ChapterIdParam;
@@ -43,6 +44,11 @@ public interface ChapterService extends IService<Chapter> {
      */
     Page<Chapter> page(ChapterPageParam chapterPageParam);
 
+    /**
+     * 获取课程章节-封装列表
+     */
+    List<Chapter> wrapperList(Map param);
+
     /**
      * 添加课程章节表
      *

+ 7 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/ClassHourService.java

@@ -42,6 +42,13 @@ public interface ClassHourService extends IService<ClassHour> {
      */
     Page<ClassHourVo> page(ClassHourPageParam classHourPageParam);
 
+    /**
+     * 获取课时-封装列表
+     */
+    List<ClassHour> wrapperList(Map param);
+
+
+
     /**
      * 添加课时表
      *

+ 114 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/CourseStudentCollectService.java

@@ -0,0 +1,114 @@
+/*
+ * 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.CourseStudentCollect;
+import vip.xiaonuo.disk.param.coursestudentcollect.CourseStudentCollectAddParam;
+import vip.xiaonuo.disk.param.coursestudentcollect.CourseStudentCollectEditParam;
+import vip.xiaonuo.disk.param.coursestudentcollect.CourseStudentCollectIdParam;
+import vip.xiaonuo.disk.param.coursestudentcollect.CourseStudentCollectPageParam;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 课程学生-收藏表Service接口
+ *
+ * @author honorfire
+ * @date  2025/07/19 16:36
+ **/
+public interface CourseStudentCollectService extends IService<CourseStudentCollect> {
+
+    /**
+     * 获取课程学生-收藏表分页
+     *
+     * @author honorfire
+     * @date  2025/07/19 16:36
+     */
+    Page<CourseStudentCollect> page(CourseStudentCollectPageParam courseStudentCollectPageParam);
+
+    /**
+     * 添加课程学生-收藏表
+     *
+     * @author honorfire
+     * @date  2025/07/19 16:36
+     */
+    void add(CourseStudentCollectAddParam courseStudentCollectAddParam);
+
+    /**
+     * 课程收藏-添加
+     *
+     * @author honorfire
+     * @date  2025/06/20 15:00
+     */
+    CourseStudentCollect addOne(CourseStudentCollect courseStudentCollect);
+
+    /**
+     * 编辑课程学生-收藏表
+     *
+     * @author honorfire
+     * @date  2025/07/19 16:36
+     */
+    void edit(CourseStudentCollectEditParam courseStudentCollectEditParam);
+
+    /**
+     * 课程收藏-编辑
+     *
+     * @author honorfire
+     * @date  2025/06/20 15:00
+     */
+    CourseStudentCollect editOne(CourseStudentCollect courseStudentCollect);
+
+    /**
+     * 课程收藏-删除
+     *
+     * @author honorfire
+     * @date  2025/07/19 16:36
+     */
+    void delete(List<CourseStudentCollectIdParam> courseStudentCollectIdParamList);
+
+    /**
+     * 获取课程学生-收藏表详情
+     *
+     * @author honorfire
+     * @date  2025/07/19 16:36
+     */
+    CourseStudentCollect detail(CourseStudentCollectIdParam courseStudentCollectIdParam);
+
+    /**
+     * 获取课程学生-收藏表详情
+     *
+     * @author honorfire
+     * @date  2025/07/19 16:36
+     **/
+    CourseStudentCollect queryEntity(String id);
+
+    /**
+     *  课程收藏-分页列表
+     */
+    Page<Map<String,Object>> queryList(Map param);
+
+    /**
+     *  课程收藏-详情
+     */
+    Map<String,Object> queryInfo(Map param);
+
+    /**
+     *  课程收藏-是否收藏
+     */
+    Boolean isCollect(Map param);
+
+
+}

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

@@ -62,6 +62,21 @@ public class ChapterServiceImpl extends ServiceImpl<ChapterMapper, Chapter> impl
         return this.page(CommonPageRequest.defaultPage(), queryWrapper);
     }
 
+    /**
+     * 获取课程章节-封装列表
+     */
+    @Override
+    public List<Chapter> wrapperList(Map param)
+    {
+        QueryWrapper<Chapter> queryWrapper = new QueryWrapper<>();
+        if(ObjectUtil.isNotEmpty(param.get("courseId")))
+        {
+            queryWrapper.lambda().eq(Chapter::getCourseId, param.get("courseId"));
+        }
+
+        return this.list(queryWrapper);
+    }
+
     @Transactional(rollbackFor = Exception.class)
     @Override
     public void add(ChapterAddParam chapterAddParam) {

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

@@ -56,6 +56,27 @@ public class ClassHourServiceImpl extends ServiceImpl<ClassHourMapper, ClassHour
         return page;
     }
 
+    /**
+     * 获取课时-封装列表
+     */
+    @Override
+    public List<ClassHour> wrapperList(Map param)
+    {
+        QueryWrapper<ClassHour> queryWrapper = new QueryWrapper<>();
+
+        if(ObjectUtil.isNotEmpty(param.get("chapterId")))
+        {
+            queryWrapper.lambda().eq(ClassHour::getChapterId, param.get("chapterId"));
+        }
+        if(ObjectUtil.isNotEmpty(param.get("chapterIdList")))
+        {
+            List<String> chapterIdList= (List<String>) param.get("chapterIdList");
+            queryWrapper.lambda().in(ClassHour::getChapterId, chapterIdList);
+        }
+
+        return this.list(queryWrapper);
+    }
+
     @Transactional(rollbackFor = Exception.class)
     @Override
     public void add(ClassHourAddParam classHourAddParam) {

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

@@ -0,0 +1,147 @@
+/*
+ * 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.CourseStudentCollect;
+import vip.xiaonuo.disk.mapper.CourseStudentCollectMapper;
+import vip.xiaonuo.disk.param.coursestudentcollect.CourseStudentCollectAddParam;
+import vip.xiaonuo.disk.param.coursestudentcollect.CourseStudentCollectEditParam;
+import vip.xiaonuo.disk.param.coursestudentcollect.CourseStudentCollectIdParam;
+import vip.xiaonuo.disk.param.coursestudentcollect.CourseStudentCollectPageParam;
+import vip.xiaonuo.disk.service.CourseStudentCollectService;
+
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 课程学生-收藏表Service接口实现类
+ *
+ * @author honorfire
+ * @date  2025/07/19 16:36
+ **/
+@Service
+public class CourseStudentCollectServiceImpl extends ServiceImpl<CourseStudentCollectMapper, CourseStudentCollect> implements CourseStudentCollectService {
+
+    @Resource
+    private CourseStudentCollectMapper courseStudentCollectMapper;
+
+    @Override
+    public Page<CourseStudentCollect> page(CourseStudentCollectPageParam courseStudentCollectPageParam) {
+        QueryWrapper<CourseStudentCollect> queryWrapper = new QueryWrapper<>();
+        if(ObjectUtil.isAllNotEmpty(courseStudentCollectPageParam.getSortField(), courseStudentCollectPageParam.getSortOrder())) {
+            CommonSortOrderEnum.validate(courseStudentCollectPageParam.getSortOrder());
+            queryWrapper.orderBy(true, courseStudentCollectPageParam.getSortOrder().equals(CommonSortOrderEnum.ASC.getValue()),
+                    StrUtil.toUnderlineCase(courseStudentCollectPageParam.getSortField()));
+        } else {
+            queryWrapper.lambda().orderByAsc(CourseStudentCollect::getId);
+        }
+        return this.page(CommonPageRequest.defaultPage(), queryWrapper);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void add(CourseStudentCollectAddParam courseStudentCollectAddParam) {
+        CourseStudentCollect courseStudentCollect = BeanUtil.toBean(courseStudentCollectAddParam, CourseStudentCollect.class);
+        this.save(courseStudentCollect);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public CourseStudentCollect addOne(CourseStudentCollect courseStudentCollect) {
+        this.save(courseStudentCollect);
+        return courseStudentCollect;
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void edit(CourseStudentCollectEditParam courseStudentCollectEditParam) {
+        CourseStudentCollect courseStudentCollect = this.queryEntity(courseStudentCollectEditParam.getId());
+        BeanUtil.copyProperties(courseStudentCollectEditParam, courseStudentCollect);
+        this.updateById(courseStudentCollect);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public CourseStudentCollect editOne(CourseStudentCollect courseStudentCollect) {
+        this.updateById(courseStudentCollect);
+        return courseStudentCollect;
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void delete(List<CourseStudentCollectIdParam> courseStudentCollectIdParamList) {
+        // 执行删除
+        this.removeByIds(CollStreamUtil.toList(courseStudentCollectIdParamList, CourseStudentCollectIdParam::getId));
+    }
+
+    @Override
+    public CourseStudentCollect detail(CourseStudentCollectIdParam courseStudentCollectIdParam) {
+        return this.queryEntity(courseStudentCollectIdParam.getId());
+    }
+
+    @Override
+    public CourseStudentCollect queryEntity(String id) {
+        CourseStudentCollect courseStudentCollect = this.getById(id);
+        if(ObjectUtil.isEmpty(courseStudentCollect)) {
+            throw new CommonException("课程学生-收藏表不存在,id值为:{}", id);
+        }
+        return courseStudentCollect;
+    }
+
+    @Override
+    public Page<Map<String,Object>> queryList(Map param)
+    {
+        return courseStudentCollectMapper.queryList(param,CommonPageRequest.defaultPage());
+    }
+
+    @Override
+    public Map<String,Object> queryInfo(Map param)
+    {
+        return courseStudentCollectMapper.queryInfo(param);
+    }
+
+    /**
+     *  课程收藏-是否收藏
+     */
+    @Override
+    public Boolean isCollect(Map param)
+    {
+        Boolean isCollect=false;
+        QueryWrapper<CourseStudentCollect> queryWrapper = new QueryWrapper<>();
+        if(ObjectUtil.isNotEmpty(param.get("userId")))
+        {
+            queryWrapper.lambda().eq(CourseStudentCollect::getUserId,param.get("userId"));
+        }
+        if(ObjectUtil.isNotEmpty(param.get("courseId")))
+        {
+            queryWrapper.lambda().eq(CourseStudentCollect::getCourseId,param.get("courseId"));
+        }
+        List<CourseStudentCollect> list=this.list(queryWrapper);
+        if(list.size()>0)isCollect=true;
+        return isCollect;
+    }
+
+}

+ 3 - 0
snowy-plugin/snowy-plugin-sys/snowy-plugin-sys-func/src/main/java/vip/xiaonuo/sys/modular/user/controller/SysUserController.java

@@ -20,6 +20,7 @@ import com.github.xiaoymin.knife4j.annotations.ApiSupport;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.http.MediaType;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
@@ -82,6 +83,8 @@ public class SysUserController {
     @ApiOperation("获取用户-全量列表")
     @GetMapping("/sys/user/allList")
     public CommonResult<List<SysUser>> queryAllList(SysUserPageParam sysUserPageParam) {
+        //默认不查出资源库特殊账号
+        if(StringUtils.isEmpty(sysUserPageParam.getIsResourceaccount()))sysUserPageParam.setIsResourceaccount("0");
         return CommonResult.data(sysUserService.queryAllList(sysUserPageParam));
     }