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

上传代码改查代码提交

pans 7 месяцев назад
Родитель
Сommit
7899d0aeec
30 измененных файлов с 1635 добавлено и 29 удалено
  1. 2 6
      snowy-modules/snowy-web-app/src/main/java/vip/xiaonuo/web/core/config/GlobalConfigure.java
  2. 2 1
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/controller/MinioController.java
  3. 159 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/controller/QuestionAnswerController.java
  4. 132 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/controller/QuestionAnswerGiveController.java
  5. 95 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/domain/QuestionAnswer.java
  6. 71 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/domain/QuestionAnswerGive.java
  7. 2 3
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/domain/ResourceUserFile.java
  8. 34 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/enums/QuestionAnswerEnum.java
  9. 34 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/enums/QuestionAnswerGiveEnum.java
  10. 27 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/mapper/QuestionAnswerGiveMapper.java
  11. 34 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/mapper/QuestionAnswerMapper.java
  12. 4 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/mapper/ResourceUserFileMapper.java
  13. 10 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/mapper/mapping/QuestionAnswerGiveMapper.xml
  14. 40 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/mapper/mapping/QuestionAnswerMapper.xml
  15. 54 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/mapper/mapping/ResourceUserFileMapper.xml
  16. 63 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/param/QuestionAnswerAddParam.java
  17. 71 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/param/QuestionAnswerEditParam.java
  18. 42 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/param/QuestionAnswerGiveAddParam.java
  19. 44 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/param/QuestionAnswerGiveEditParam.java
  20. 35 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/param/QuestionAnswerGiveIdParam.java
  21. 51 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/param/QuestionAnswerGivePageParam.java
  22. 35 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/param/QuestionAnswerIdParam.java
  23. 53 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/param/QuestionAnswerPageParam.java
  24. 81 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/QuestionAnswerGiveService.java
  25. 87 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/QuestionAnswerService.java
  26. 96 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/impl/QuestionAnswerGiveServiceImpl.java
  27. 156 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/impl/QuestionAnswerServiceImpl.java
  28. 38 13
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/util/MinioUtil.java
  29. 81 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/vo/questionanswer/QuestionAnswerVo.java
  30. 2 6
      snowy-server/snowy-gateway-app/src/main/java/vip/xiaonuo/gateway/config/GatewayConfigure.java

+ 2 - 6
snowy-modules/snowy-web-app/src/main/java/vip/xiaonuo/web/core/config/GlobalConfigure.java

@@ -184,13 +184,9 @@ public class GlobalConfigure implements WebMvcConfigurer {
             /* 资源中心 */
             "/disk/resourcecentre/page",
             "/disk/resourcecentre/detail",
-            "/disk/courseauditrecord/addViewCount",
+            "/disk/courseauditrecord/addViewCount"
+
 
-            "/disk/minio/upload",
-            "/disk/minio/checkExits",
-            "/disk/minio/merge",
-            "/disk/minio/delete",
-            "/disk/minio/checkMd5List"
     };
 
     /**

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

@@ -7,6 +7,7 @@ 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;
@@ -57,7 +58,7 @@ public class MinioController {
     }
 
     @PostMapping("/checkMd5List")
-    public ResponseEntity<List<String>> checkFilesExits(@RequestBody List<UploadFile> genericItems){
+    public ResponseEntity<List<ResourceUserFile>> checkFilesExits(@RequestBody List<UploadFile> genericItems){
         return ResponseEntity.ok(minioUtil.checkFilesExits(genericItems));
     }
 }

+ 159 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/controller/QuestionAnswerController.java

@@ -0,0 +1,159 @@
+/*
+ * 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.QuestionAnswer;
+import vip.xiaonuo.disk.param.QuestionAnswerAddParam;
+import vip.xiaonuo.disk.param.QuestionAnswerEditParam;
+import vip.xiaonuo.disk.param.QuestionAnswerIdParam;
+import vip.xiaonuo.disk.param.QuestionAnswerPageParam;
+import vip.xiaonuo.disk.service.QuestionAnswerService;
+import vip.xiaonuo.disk.vo.questionanswer.QuestionAnswerVo;
+
+import javax.annotation.Resource;
+import javax.validation.Valid;
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+
+/**
+ * question_answer控制器
+ *
+ * @author pans
+ * @date  2025/07/11 18:52
+ */
+@Api(tags = "question_answer控制器")
+@ApiSupport(author = "SNOWY_TEAM", order = 1)
+@RestController
+@Validated
+public class QuestionAnswerController {
+
+    @Resource
+    private QuestionAnswerService questionAnswerService;
+
+    /**
+     * 获取question_answer分页
+     *
+     * @author pans
+     * @date  2025/07/11 18:52
+     */
+    @ApiOperationSupport(order = 1)
+    @ApiOperation("获取question_answer分页")
+    @GetMapping("/disk/answer/page")
+    public CommonResult<Page<QuestionAnswerVo>> page(QuestionAnswerPageParam questionAnswerPageParam) {
+        return CommonResult.data(questionAnswerService.page(questionAnswerPageParam));
+    }
+
+    /**
+     * 添加question_answer
+     *
+     * @author pans
+     * @date  2025/07/11 18:52
+     */
+    @ApiOperationSupport(order = 2)
+    @ApiOperation("添加question_answer")
+    @CommonLog("添加question_answer")
+    @PostMapping("/disk/answer/add")
+    public CommonResult<String> add(@RequestBody @Valid QuestionAnswerAddParam questionAnswerAddParam) {
+        questionAnswerService.add(questionAnswerAddParam);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 编辑question_answer
+     *
+     * @author pans
+     * @date  2025/07/11 18:52
+     */
+    @ApiOperationSupport(order = 3)
+    @ApiOperation("编辑question_answer")
+    @CommonLog("编辑question_answer")
+    @PostMapping("/disk/answer/edit")
+    public CommonResult<String> edit(@RequestBody @Valid QuestionAnswerEditParam questionAnswerEditParam) {
+        questionAnswerService.edit(questionAnswerEditParam);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 删除question_answer
+     *
+     * @author pans
+     * @date  2025/07/11 18:52
+     */
+    @ApiOperationSupport(order = 4)
+    @ApiOperation("删除question_answer")
+    @CommonLog("删除question_answer")
+    @PostMapping("/disk/answer/delete")
+    public CommonResult<String> delete(@RequestBody @Valid @NotEmpty(message = "集合不能为空")
+                                                   CommonValidList<QuestionAnswerIdParam> questionAnswerIdParamList) {
+        questionAnswerService.delete(questionAnswerIdParamList);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 获取question_answer详情
+     *
+     * @author pans
+     * @date  2025/07/11 18:52
+     */
+    @ApiOperationSupport(order = 5)
+    @ApiOperation("获取question_answer详情")
+    @GetMapping("/disk/answer/detail")
+    public CommonResult<QuestionAnswer> detail(@Valid QuestionAnswerIdParam questionAnswerIdParam) {
+        return CommonResult.data(questionAnswerService.detail(questionAnswerIdParam));
+    }
+
+
+    /**
+     * 点赞
+     *
+     * @author pans
+     * @date  2025/06/27 11:07
+     */
+    @ApiOperationSupport(order = 3)
+    @ApiOperation("点赞")
+    @CommonLog("点赞")
+    @GetMapping("/disk/answer/give")
+    public CommonResult<String> edit(@Valid @NotNull(message="主键id不能为空") Integer id) {
+        questionAnswerService.give(id);
+        return CommonResult.ok();
+    }
+
+
+    /**
+     * 取消点赞
+     *
+     * @author pans
+     * @date  2025/06/27 11:07
+     */
+    @ApiOperationSupport(order = 3)
+    @ApiOperation("点赞")
+    @CommonLog("点赞")
+    @GetMapping("/disk/answer/giveCancel")
+    public CommonResult<String> giveCancel(@Valid @NotNull(message="主键id不能为空") Integer id) {
+        return CommonResult.ok(questionAnswerService.giveCancel(id));
+    }
+
+}

+ 132 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/controller/QuestionAnswerGiveController.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.QuestionAnswerGive;
+import vip.xiaonuo.disk.param.QuestionAnswerGiveAddParam;
+import vip.xiaonuo.disk.param.QuestionAnswerGiveEditParam;
+import vip.xiaonuo.disk.param.QuestionAnswerGiveIdParam;
+import vip.xiaonuo.disk.param.QuestionAnswerGivePageParam;
+import vip.xiaonuo.disk.service.QuestionAnswerGiveService;
+
+import javax.annotation.Resource;
+import javax.validation.Valid;
+import javax.validation.constraints.NotEmpty;
+
+/**
+ * question_answer_give控制器
+ *
+ * @author pans
+ * @date  2025/07/11 19:32
+ */
+@Api(tags = "question_answer_give控制器")
+@ApiSupport(author = "SNOWY_TEAM", order = 1)
+@RestController
+@Validated
+public class QuestionAnswerGiveController {
+
+    @Resource
+    private QuestionAnswerGiveService questionAnswerGiveService;
+
+    /**
+     * 获取question_answer_give分页
+     *
+     * @author pans
+     * @date  2025/07/11 19:32
+     */
+    @ApiOperationSupport(order = 1)
+    @ApiOperation("获取question_answer_give分页")
+    @SaCheckPermission("/disk/answergive/page")
+    @GetMapping("/disk/answergive/page")
+    public CommonResult<Page<QuestionAnswerGive>> page(QuestionAnswerGivePageParam questionAnswerGivePageParam) {
+        return CommonResult.data(questionAnswerGiveService.page(questionAnswerGivePageParam));
+    }
+
+    /**
+     * 添加question_answer_give
+     *
+     * @author pans
+     * @date  2025/07/11 19:32
+     */
+    @ApiOperationSupport(order = 2)
+    @ApiOperation("添加question_answer_give")
+    @CommonLog("添加question_answer_give")
+    @SaCheckPermission("/disk/answergive/add")
+    @PostMapping("/disk/answergive/add")
+    public CommonResult<String> add(@RequestBody @Valid QuestionAnswerGiveAddParam questionAnswerGiveAddParam) {
+        questionAnswerGiveService.add(questionAnswerGiveAddParam);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 编辑question_answer_give
+     *
+     * @author pans
+     * @date  2025/07/11 19:32
+     */
+    @ApiOperationSupport(order = 3)
+    @ApiOperation("编辑question_answer_give")
+    @CommonLog("编辑question_answer_give")
+    @SaCheckPermission("/disk/answergive/edit")
+    @PostMapping("/disk/answergive/edit")
+    public CommonResult<String> edit(@RequestBody @Valid QuestionAnswerGiveEditParam questionAnswerGiveEditParam) {
+        questionAnswerGiveService.edit(questionAnswerGiveEditParam);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 删除question_answer_give
+     *
+     * @author pans
+     * @date  2025/07/11 19:32
+     */
+    @ApiOperationSupport(order = 4)
+    @ApiOperation("删除question_answer_give")
+    @CommonLog("删除question_answer_give")
+    @SaCheckPermission("/disk/answergive/delete")
+    @PostMapping("/disk/answergive/delete")
+    public CommonResult<String> delete(@RequestBody @Valid @NotEmpty(message = "集合不能为空")
+                                                   CommonValidList<QuestionAnswerGiveIdParam> questionAnswerGiveIdParamList) {
+        questionAnswerGiveService.delete(questionAnswerGiveIdParamList);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 获取question_answer_give详情
+     *
+     * @author pans
+     * @date  2025/07/11 19:32
+     */
+    @ApiOperationSupport(order = 5)
+    @ApiOperation("获取question_answer_give详情")
+    @SaCheckPermission("/disk/answergive/detail")
+    @GetMapping("/disk/answergive/detail")
+    public CommonResult<QuestionAnswerGive> detail(@Valid QuestionAnswerGiveIdParam questionAnswerGiveIdParam) {
+        return CommonResult.data(questionAnswerGiveService.detail(questionAnswerGiveIdParam));
+    }
+
+}

+ 95 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/domain/QuestionAnswer.java

@@ -0,0 +1,95 @@
+/*
+ * 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.util.Date;
+
+/**
+ * question_answer实体
+ *
+ * @author pans
+ * @date  2025/07/11 18:52
+ **/
+@Getter
+@Setter
+@TableName("question_answer")
+public class QuestionAnswer {
+
+    /** ID */
+    @TableId(type = IdType.AUTO)
+    @ApiModelProperty(value = "ID", position = 1)
+    private Integer id;
+
+    /** PID */
+    @ApiModelProperty(value = "PID", position = 2)
+    private Integer pid;
+
+    /** NAME */
+    @ApiModelProperty(value = "NAME", position = 3)
+    private String name;
+
+    /** USER_ID */
+    @ApiModelProperty(value = "USER_ID", position = 4)
+    @TableField(value="user_id")
+    private String userId;
+
+    /** TIME */
+    @ApiModelProperty(value = "TIME", position = 5)
+    private Date time;
+
+    /** DESC */
+    @ApiModelProperty(value = "REMARK", position = 6)
+    private String remark;
+
+    /** DELETE_FLAG */
+    @ApiModelProperty(value = "DELETE_FLAG", position = 7)
+    @TableLogic
+    @TableField(fill = FieldFill.INSERT)
+    private String deleteFlag;
+
+    /** CREATE_TIME */
+    @ApiModelProperty(value = "CREATE_TIME", position = 8)
+    @TableField(fill = FieldFill.INSERT)
+    private Date createTime;
+
+    /** CREATE_USER */
+    @ApiModelProperty(value = "CREATE_USER", position = 9)
+    @TableField(fill = FieldFill.INSERT)
+    private String createUser;
+
+    /** UPDATE_TIME */
+    @ApiModelProperty(value = "UPDATE_TIME", position = 10)
+    @TableField(fill = FieldFill.UPDATE)
+    private Date updateTime;
+
+    /** UPDATE_USER */
+    @ApiModelProperty(value = "UPDATE_USER", position = 11)
+    @TableField(fill = FieldFill.UPDATE)
+    private String updateUser;
+
+
+
+    /** GIVE_NUM */
+    @ApiModelProperty(value = "GIVE_NUM", position = 13)
+    private Integer giveNum;
+
+
+    private  String courseId;
+
+    private  String chapterId;
+}

+ 71 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/domain/QuestionAnswerGive.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.util.Date;
+
+/**
+ * question_answer_give实体
+ *
+ * @author pans
+ * @date  2025/07/11 19:32
+ **/
+@Getter
+@Setter
+@TableName("question_answer_give")
+public class QuestionAnswerGive {
+
+    /** ID */
+    @TableId(type = IdType.AUTO)
+    @ApiModelProperty(value = "ID", position = 1)
+    private Integer id;
+
+    /** QUESTION_ANSWERID */
+    @ApiModelProperty(value = "QUESTION_ANSWERID", position = 2)
+    private Integer questionAnswerid;
+
+    /** USER_ID */
+    @ApiModelProperty(value = "USER_ID", position = 3)
+    private String userId;
+
+    /** DELETE_FLAG */
+    @ApiModelProperty(value = "DELETE_FLAG", position = 4)
+    @TableLogic
+    @TableField(fill = FieldFill.INSERT)
+    private String deleteFlag;
+
+    /** CREATE_TIME */
+    @ApiModelProperty(value = "CREATE_TIME", position = 5)
+    @TableField(fill = FieldFill.INSERT)
+    private Date createTime;
+
+    /** CREATE_USER */
+    @ApiModelProperty(value = "CREATE_USER", position = 6)
+    @TableField(fill = FieldFill.INSERT)
+    private String createUser;
+
+    /** UPDATE_TIME */
+    @ApiModelProperty(value = "UPDATE_TIME", position = 7)
+    @TableField(fill = FieldFill.UPDATE)
+    private Date updateTime;
+
+    /** UPDATE_USER */
+    @ApiModelProperty(value = "UPDATE_USER", position = 8)
+    @TableField(fill = FieldFill.UPDATE)
+    private String updateUser;
+}

+ 2 - 3
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/domain/ResourceUserFile.java

@@ -21,9 +21,6 @@ import lombok.Setter;
 import vip.xiaonuo.common.util.PinyinUtils;
 import vip.xiaonuo.disk.io.QiwenFile;
 
-import java.math.BigDecimal;
-import java.util.Date;
-
 /**
  * RESOURCE_USERFILE实体
  *
@@ -111,6 +108,8 @@ public class ResourceUserFile {
     @ApiModelProperty(value = "FUNC_TYPE", position = 16)
     private String funcType;
 
+    @TableField(exist = false)
+    private String md5;
 
     public ResourceUserFile() {};
     public ResourceUserFile(QiwenFile qiwenFile, String userId, String fileId) {

+ 34 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/enums/QuestionAnswerEnum.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;
+
+/**
+ * question_answer枚举
+ *
+ * @author pans
+ * @date  2025/07/11 18:52
+ **/
+@Getter
+public enum QuestionAnswerEnum {
+
+    /** 测试 */
+    TEST("TEST");
+
+    private final String value;
+
+    QuestionAnswerEnum(String value) {
+        this.value = value;
+    }
+}

+ 34 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/enums/QuestionAnswerGiveEnum.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;
+
+/**
+ * question_answer_give枚举
+ *
+ * @author pans
+ * @date  2025/07/11 19:32
+ **/
+@Getter
+public enum QuestionAnswerGiveEnum {
+
+    /** 测试 */
+    TEST("TEST");
+
+    private final String value;
+
+    QuestionAnswerGiveEnum(String value) {
+        this.value = value;
+    }
+}

+ 27 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/mapper/QuestionAnswerGiveMapper.java

@@ -0,0 +1,27 @@
+/*
+ * 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.QuestionAnswerGive;
+
+
+/**
+ * question_answer_giveMapper接口
+ *
+ * @author pans
+ * @date  2025/07/11 19:32
+ **/
+public interface QuestionAnswerGiveMapper extends BaseMapper<QuestionAnswerGive> {
+    void updateQuestionAnswerGiveMapper(QuestionAnswerGive userCommentGive);
+}

+ 34 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/mapper/QuestionAnswerMapper.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.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.QuestionAnswer;
+import vip.xiaonuo.disk.vo.questionanswer.QuestionAnswerVo;
+
+import java.util.List;
+
+
+/**
+ * question_answerMapper接口
+ *
+ * @author pans
+ * @date  2025/07/11 18:52
+ **/
+public interface QuestionAnswerMapper extends BaseMapper<QuestionAnswer> {
+    Page<QuestionAnswerVo> selectCommentPid(@Param("page") Page<Object> page, @Param("chapterId") String chapterId,@Param("courseId") String courseId, @Param("userId") String userId);
+
+    List<QuestionAnswerVo> selectCommentNoPid(@Param("chapterId") String chapterId, @Param("courseId") String courseId, @Param("userId") String userId);
+}

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

@@ -29,4 +29,8 @@ public interface ResourceUserFileMapper extends BaseMapper<ResourceUserFile> {
     List<ResourceUserFile> selectUserFileByLikeRightFilePath(@Param("filePath") String filePath, @Param("userId") String userId);
 
     Long selectStorageSizeByUserId(@Param("userId") String userId);
+
+    ResourceUserFile selectUserFileId(String md5);
+
+    Integer selectUserFileIdCount(@Param("md5") String md5,@Param("userId") String userId);
 }

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

@@ -0,0 +1,10 @@
+<?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.QuestionAnswerGiveMapper">
+    <update id="updateQuestionAnswerGiveMapper">
+        UPDATE question_answer_give
+        SET DELETE_FLAG=#{deleteFlag}
+        WHERE
+            question_answerid = #{questionAnswerid}  AND  user_id = #{userId}
+    </update>
+</mapper>

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

@@ -0,0 +1,40 @@
+<?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.QuestionAnswerMapper">
+
+       <select id="selectCommentPid" resultType="vip.xiaonuo.disk.vo.questionanswer.QuestionAnswerVo">
+           SELECT
+               a.id,
+               a.pid,
+               a.name name,
+               a.user_id userId,
+               a.time,
+               ifnull(a.give_num,0) giveNum,
+               (SELECT count(1) FROM  question_answer_give WHERE question_answerid=a.id AND user_id=#{userId} and  delete_flag='NOT_DELETE') giveNumSelf,
+               b.name  userName
+           FROM
+               question_answer a LEFT JOIN  sys_user b ON a. user_id=b.id
+           WHERE
+               COURSE_ID=#{courseId} and CHAPTER_ID=#{chapterId}
+             and pid IS NULL
+           order by a.id desc
+       </select>
+
+    <select id="selectCommentNoPid" resultType="vip.xiaonuo.disk.vo.questionanswer.QuestionAnswerVo">
+        SELECT
+            a.id,
+            a.pid,
+            a.name commentName,
+            a.user_id userId,
+            a.time,
+            a.give_num giveNum,
+            (SELECT count(1) FROM  question_answer_give WHERE question_answerid=a.id AND user_id=#{userId} and  delete_flag='NOT_DELETE') giveNumSelf,
+            b.name  userName
+        FROM
+            question_answer a LEFT JOIN  sys_user b ON a. user_id=b.id
+        WHERE
+            COURSE_ID=#{courseId} and CHAPTER_ID=#{chapterId}
+          and	pid IS NOT NULL
+    </select>
+
+</mapper>

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

@@ -13,6 +13,60 @@
                                        LEFT JOIN RESOURCE_FILE ON RESOURCE_FILE.FILE_ID = RESOURCE_USERFILE.FILE_ID
         WHERE RESOURCE_USERFILE.USER_ID = #{userId}
     </select>
+      <select id="selectUserFileId" resultType="vip.xiaonuo.disk.domain.ResourceUserFile">
+          SELECT
+              CREATE_TIME createTime,
+              CREATE_USER_ID createUserId,
+              DELETE_BATCH_NUM deleteBatchNum,
+              DELETE_TIME deleteFlag,
+              EXTEND_NAME deleteTime,
+              FILE_ID fileId,
+              FILE_NAME fileName,
+              FILE_PATH filePath,
+              IS_DIR isDir,
+              MODIFY_TIME modifyTime,
+              MODIFY_USER_ID modifyUserId,
+              UPLOAD_TIME uploadTime,
+              USER_ID userId,
+              IS_COLLET isCollet,
+              FILE_NAME_PINYIN fileNamePinyin,
+              FUNC_TYPE funcType,
+              DELETE_FLAG deleteFlag,
+              CREATE_USER createUser,
+              UPDATE_TIME uploadTime,
+              UPDATE_USER uploadUser
+          FROM
+              RESOURCE_USERFILE
+          WHERE
+              FILE_ID =(
+                  SELECT
+                      FILE_ID
+                  FROM
+                      RESOURCE_FILE
+                  WHERE
+                      IDENTIFIER = #{md5}
+              )
+          order by  CREATE_TIME desc
+          LIMIT 1
+      </select>
 
 
+    <select id="selectUserFileIdCount" resultType="java.lang.Integer">
+        SELECT
+          count(distinct USER_FILE_ID) num
+        FROM
+            RESOURCE_USERFILE
+        WHERE
+            FILE_ID =(
+                SELECT
+                    FILE_ID
+                FROM
+                    RESOURCE_FILE
+                WHERE
+                    IDENTIFIER = #{md5}
+            ) and USER_ID = #{userId}
+            order by  CREATE_TIME desc
+            LIMIT 1
+    </select>
+
 </mapper>

+ 63 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/param/QuestionAnswerAddParam.java

@@ -0,0 +1,63 @@
+/*
+ * 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;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.Date;
+
+/**
+ * question_answer添加参数
+ *
+ * @author pans
+ * @date  2025/07/11 18:52
+ **/
+@Getter
+@Setter
+public class QuestionAnswerAddParam {
+
+    /** PID */
+    @ApiModelProperty(value = "PID", position = 2)
+    private Integer pid;
+
+    /** NAME */
+    @ApiModelProperty(value = "NAME", position = 3)
+    private String name;
+
+    /** USER_ID */
+    @ApiModelProperty(value = "USER_ID", position = 4)
+    private String userId;
+
+    /** TIME */
+    @ApiModelProperty(value = "TIME", position = 5)
+    private Date time;
+
+    /** DESC */
+    @ApiModelProperty(value = "REMARK", position = 6)
+    private String remark;
+
+    /** RESOURCE_ID */
+    @ApiModelProperty(value = "RESOURCE_ID", position = 12)
+    private String resourceId;
+
+    /** GIVE_NUM */
+    @ApiModelProperty(value = "GIVE_NUM", position = 13)
+    private String giveNum;
+
+    private  String courseId;
+
+    private  String chapterId;
+
+}

+ 71 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/param/QuestionAnswerEditParam.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;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotNull;
+import java.util.Date;
+
+/**
+ * question_answer编辑参数
+ *
+ * @author pans
+ * @date  2025/07/11 18:52
+ **/
+@Getter
+@Setter
+public class QuestionAnswerEditParam {
+
+    /** ID */
+    @ApiModelProperty(value = "ID", required = true, position = 1)
+    @NotNull(message = "id不能为空")
+    private Integer id;
+
+    /** PID */
+    @ApiModelProperty(value = "PID", position = 2)
+    private Integer pid;
+
+    /** NAME */
+    @ApiModelProperty(value = "NAME", position = 3)
+    private String name;
+
+    /** USER_ID */
+    @ApiModelProperty(value = "USER_ID", position = 4)
+    private String userId;
+
+    /** TIME */
+    @ApiModelProperty(value = "TIME", position = 5)
+    private Date time;
+
+    /** DESC */
+    @ApiModelProperty(value = "REMARK", position = 6)
+    private String remark;
+
+    /** RESOURCE_ID */
+    @ApiModelProperty(value = "RESOURCE_ID", position = 12)
+    private String resourceId;
+
+    /** GIVE_NUM */
+    @ApiModelProperty(value = "GIVE_NUM", position = 13)
+    private String giveNum;
+
+    private  String courseId;
+
+    private  String chapterId;
+
+
+
+}

+ 42 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/param/QuestionAnswerGiveAddParam.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;
+
+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;
+
+/**
+ * question_answer_give添加参数
+ *
+ * @author pans
+ * @date  2025/07/11 19:32
+ **/
+@Getter
+@Setter
+public class QuestionAnswerGiveAddParam {
+
+    /** QUESTION_ANSWERID */
+    @ApiModelProperty(value = "QUESTION_ANSWERID", position = 2)
+    private Integer questionAnswerid;
+
+    /** USER_ID */
+    @ApiModelProperty(value = "USER_ID", position = 3)
+    private String userId;
+
+}

+ 44 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/param/QuestionAnswerGiveEditParam.java

@@ -0,0 +1,44 @@
+/*
+ * 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;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * question_answer_give编辑参数
+ *
+ * @author pans
+ * @date  2025/07/11 19:32
+ **/
+@Getter
+@Setter
+public class QuestionAnswerGiveEditParam {
+
+    /** ID */
+    @ApiModelProperty(value = "ID", required = true, position = 1)
+    @NotNull(message = "id不能为空")
+    private Long id;
+
+    /** QUESTION_ANSWERID */
+    @ApiModelProperty(value = "QUESTION_ANSWERID", position = 2)
+    private Integer questionAnswerid;
+
+    /** USER_ID */
+    @ApiModelProperty(value = "USER_ID", position = 3)
+    private String userId;
+
+}

+ 35 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/param/QuestionAnswerGiveIdParam.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;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * question_answer_giveId参数
+ *
+ * @author pans
+ * @date  2025/07/11 19:32
+ **/
+@Getter
+@Setter
+public class QuestionAnswerGiveIdParam {
+
+    /** ID */
+    @ApiModelProperty(value = "ID", required = true)
+    @NotBlank(message = "id不能为空")
+    private Long id;
+}

+ 51 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/param/QuestionAnswerGivePageParam.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;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * question_answer_give查询参数
+ *
+ * @author pans
+ * @date  2025/07/11 19:32
+ **/
+@Getter
+@Setter
+public class QuestionAnswerGivePageParam {
+
+    /** 当前页 */
+    @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;
+
+}

+ 35 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/param/QuestionAnswerIdParam.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;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * question_answerId参数
+ *
+ * @author pans
+ * @date  2025/07/11 18:52
+ **/
+@Getter
+@Setter
+public class QuestionAnswerIdParam {
+
+    /** ID */
+    @ApiModelProperty(value = "ID", required = true)
+    @NotNull(message = "id不能为空")
+    private Integer id;
+}

+ 53 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/param/QuestionAnswerPageParam.java

@@ -0,0 +1,53 @@
+/*
+ * 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;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * question_answer查询参数
+ *
+ * @author pans
+ * @date  2025/07/11 18:52
+ **/
+@Getter
+@Setter
+public class QuestionAnswerPageParam {
+
+    /** 当前页 */
+    @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;
+
+    private String courseId;
+
+    private String chapterId;
+
+}

+ 81 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/QuestionAnswerGiveService.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.QuestionAnswerGive;
+import vip.xiaonuo.disk.param.QuestionAnswerGiveAddParam;
+import vip.xiaonuo.disk.param.QuestionAnswerGiveEditParam;
+import vip.xiaonuo.disk.param.QuestionAnswerGiveIdParam;
+import vip.xiaonuo.disk.param.QuestionAnswerGivePageParam;
+
+import java.util.List;
+
+/**
+ * question_answer_giveService接口
+ *
+ * @author pans
+ * @date  2025/07/11 19:32
+ **/
+public interface QuestionAnswerGiveService extends IService<QuestionAnswerGive> {
+
+    /**
+     * 获取question_answer_give分页
+     *
+     * @author pans
+     * @date  2025/07/11 19:32
+     */
+    Page<QuestionAnswerGive> page(QuestionAnswerGivePageParam questionAnswerGivePageParam);
+
+    /**
+     * 添加question_answer_give
+     *
+     * @author pans
+     * @date  2025/07/11 19:32
+     */
+    void add(QuestionAnswerGiveAddParam questionAnswerGiveAddParam);
+
+    /**
+     * 编辑question_answer_give
+     *
+     * @author pans
+     * @date  2025/07/11 19:32
+     */
+    void edit(QuestionAnswerGiveEditParam questionAnswerGiveEditParam);
+
+    /**
+     * 删除question_answer_give
+     *
+     * @author pans
+     * @date  2025/07/11 19:32
+     */
+    void delete(List<QuestionAnswerGiveIdParam> questionAnswerGiveIdParamList);
+
+    /**
+     * 获取question_answer_give详情
+     *
+     * @author pans
+     * @date  2025/07/11 19:32
+     */
+    QuestionAnswerGive detail(QuestionAnswerGiveIdParam questionAnswerGiveIdParam);
+
+    /**
+     * 获取question_answer_give详情
+     *
+     * @author pans
+     * @date  2025/07/11 19:32
+     **/
+    QuestionAnswerGive queryEntity(Long id);
+
+}

+ 87 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/QuestionAnswerService.java

@@ -0,0 +1,87 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.disk.service;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import vip.xiaonuo.disk.domain.QuestionAnswer;
+import vip.xiaonuo.disk.param.QuestionAnswerAddParam;
+import vip.xiaonuo.disk.param.QuestionAnswerEditParam;
+import vip.xiaonuo.disk.param.QuestionAnswerIdParam;
+import vip.xiaonuo.disk.param.QuestionAnswerPageParam;
+import vip.xiaonuo.disk.vo.questionanswer.QuestionAnswerVo;
+
+import javax.validation.Valid;
+import javax.validation.constraints.NotNull;
+import java.util.List;
+
+/**
+ * question_answerService接口
+ *
+ * @author pans
+ * @date  2025/07/11 18:52
+ **/
+public interface QuestionAnswerService extends IService<QuestionAnswer> {
+
+    /**
+     * 获取question_answer分页
+     *
+     * @author pans
+     * @date  2025/07/11 18:52
+     */
+    Page<QuestionAnswerVo> page(QuestionAnswerPageParam questionAnswerPageParam);
+
+    /**
+     * 添加question_answer
+     *
+     * @author pans
+     * @date  2025/07/11 18:52
+     */
+    void add(QuestionAnswerAddParam questionAnswerAddParam);
+
+    /**
+     * 编辑question_answer
+     *
+     * @author pans
+     * @date  2025/07/11 18:52
+     */
+    void edit(QuestionAnswerEditParam questionAnswerEditParam);
+
+    /**
+     * 删除question_answer
+     *
+     * @author pans
+     * @date  2025/07/11 18:52
+     */
+    void delete(List<QuestionAnswerIdParam> questionAnswerIdParamList);
+
+    /**
+     * 获取question_answer详情
+     *
+     * @author pans
+     * @date  2025/07/11 18:52
+     */
+    QuestionAnswer detail(QuestionAnswerIdParam questionAnswerIdParam);
+
+    /**
+     * 获取question_answer详情
+     *
+     * @author pans
+     * @date  2025/07/11 18:52
+     **/
+    QuestionAnswer queryEntity(Integer id);
+
+    void give(@Valid @NotNull(message="主键id不能为空") Integer id);
+
+    String giveCancel(@Valid @NotNull(message="主键id不能为空") Integer id);
+}

+ 96 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/impl/QuestionAnswerGiveServiceImpl.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.QuestionAnswerGive;
+import vip.xiaonuo.disk.mapper.QuestionAnswerGiveMapper;
+import vip.xiaonuo.disk.param.QuestionAnswerGiveAddParam;
+import vip.xiaonuo.disk.param.QuestionAnswerGiveEditParam;
+import vip.xiaonuo.disk.param.QuestionAnswerGiveIdParam;
+import vip.xiaonuo.disk.param.QuestionAnswerGivePageParam;
+import vip.xiaonuo.disk.service.QuestionAnswerGiveService;
+
+import java.util.List;
+
+/**
+ * question_answer_giveService接口实现类
+ *
+ * @author pans
+ * @date  2025/07/11 19:32
+ **/
+@Service
+public class QuestionAnswerGiveServiceImpl extends ServiceImpl<QuestionAnswerGiveMapper, QuestionAnswerGive> implements QuestionAnswerGiveService {
+
+
+    @Override
+    public Page<QuestionAnswerGive> page(QuestionAnswerGivePageParam questionAnswerGivePageParam) {
+        QueryWrapper<QuestionAnswerGive> queryWrapper = new QueryWrapper<>();
+        if(ObjectUtil.isAllNotEmpty(questionAnswerGivePageParam.getSortField(), questionAnswerGivePageParam.getSortOrder())) {
+            CommonSortOrderEnum.validate(questionAnswerGivePageParam.getSortOrder());
+            queryWrapper.orderBy(true, questionAnswerGivePageParam.getSortOrder().equals(CommonSortOrderEnum.ASC.getValue()),
+                    StrUtil.toUnderlineCase(questionAnswerGivePageParam.getSortField()));
+        } else {
+            queryWrapper.lambda().orderByAsc(QuestionAnswerGive::getId);
+        }
+        return this.page(CommonPageRequest.defaultPage(), queryWrapper);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void add(QuestionAnswerGiveAddParam questionAnswerGiveAddParam) {
+        QuestionAnswerGive questionAnswerGive = BeanUtil.toBean(questionAnswerGiveAddParam, QuestionAnswerGive.class);
+        this.save(questionAnswerGive);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void edit(QuestionAnswerGiveEditParam questionAnswerGiveEditParam) {
+        QuestionAnswerGive questionAnswerGive = this.queryEntity(questionAnswerGiveEditParam.getId());
+        BeanUtil.copyProperties(questionAnswerGiveEditParam, questionAnswerGive);
+        this.updateById(questionAnswerGive);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void delete(List<QuestionAnswerGiveIdParam> questionAnswerGiveIdParamList) {
+        // 执行删除
+        this.removeByIds(CollStreamUtil.toList(questionAnswerGiveIdParamList, QuestionAnswerGiveIdParam::getId));
+    }
+
+    @Override
+    public QuestionAnswerGive detail(QuestionAnswerGiveIdParam questionAnswerGiveIdParam) {
+        return this.queryEntity(questionAnswerGiveIdParam.getId());
+    }
+
+    @Override
+    public QuestionAnswerGive queryEntity(Long id) {
+        QuestionAnswerGive questionAnswerGive = this.getById(id);
+        if(ObjectUtil.isEmpty(questionAnswerGive)) {
+            throw new CommonException("question_answer_give不存在,id值为:{}", id);
+        }
+        return questionAnswerGive;
+    }
+
+}

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

@@ -0,0 +1,156 @@
+/*
+ * 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 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.exception.CommonException;
+import vip.xiaonuo.common.page.CommonPageRequest;
+import vip.xiaonuo.disk.domain.QuestionAnswer;
+import vip.xiaonuo.disk.domain.QuestionAnswerGive;
+import vip.xiaonuo.disk.mapper.QuestionAnswerGiveMapper;
+import vip.xiaonuo.disk.mapper.QuestionAnswerMapper;
+import vip.xiaonuo.disk.param.QuestionAnswerAddParam;
+import vip.xiaonuo.disk.param.QuestionAnswerEditParam;
+import vip.xiaonuo.disk.param.QuestionAnswerIdParam;
+import vip.xiaonuo.disk.param.QuestionAnswerPageParam;
+import vip.xiaonuo.disk.service.QuestionAnswerService;
+import vip.xiaonuo.disk.vo.questionanswer.QuestionAnswerVo;
+
+import javax.annotation.Resource;
+import java.util.Date;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * question_answerService接口实现类
+ *
+ * @author pans
+ * @date  2025/07/11 18:52
+ **/
+@Service
+public class QuestionAnswerServiceImpl extends ServiceImpl<QuestionAnswerMapper, QuestionAnswer> implements QuestionAnswerService {
+
+
+    @Resource
+    private  QuestionAnswerMapper questionAnswerMapper;
+
+    @Resource
+    private QuestionAnswerGiveMapper questionAnswerGiveMapper;
+
+    @Override
+    public Page<QuestionAnswerVo> page(QuestionAnswerPageParam questionAnswerPageParam) {
+        Page<QuestionAnswerVo> page=questionAnswerMapper.selectCommentPid(CommonPageRequest.defaultPage(),questionAnswerPageParam.getChapterId(), questionAnswerPageParam.getCourseId(),StpLoginUserUtil.getLoginUser().getId());
+        List<QuestionAnswerVo> list=questionAnswerMapper.selectCommentNoPid(questionAnswerPageParam.getChapterId(), questionAnswerPageParam.getCourseId(),StpLoginUserUtil.getLoginUser().getId());
+        page.getRecords().stream().forEach(item -> {
+            List<QuestionAnswerVo> child= list.stream().filter(itemchild-> itemchild.getPid().equals(item.getId())).collect(Collectors.toList());
+            item.setChild(child);
+            item.setChildSize(child.size());
+        });
+
+        return page;
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void add(QuestionAnswerAddParam questionAnswerAddParam) {
+        QuestionAnswer questionAnswer = BeanUtil.toBean(questionAnswerAddParam, QuestionAnswer.class);
+        questionAnswer.setUserId(StpLoginUserUtil.getLoginUser().getId());
+        questionAnswer.setTime(new Date());
+        this.save(questionAnswer);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void edit(QuestionAnswerEditParam questionAnswerEditParam) {
+        QuestionAnswer questionAnswer = this.queryEntity(questionAnswerEditParam.getId());
+        BeanUtil.copyProperties(questionAnswerEditParam, questionAnswer);
+        questionAnswer.setUserId(StpLoginUserUtil.getLoginUser().getId());
+        questionAnswer.setTime(new Date());
+        this.updateById(questionAnswer);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void delete(List<QuestionAnswerIdParam> questionAnswerIdParamList) {
+        // 执行删除
+        this.removeByIds(CollStreamUtil.toList(questionAnswerIdParamList, QuestionAnswerIdParam::getId));
+    }
+
+    @Override
+    public QuestionAnswer detail(QuestionAnswerIdParam questionAnswerIdParam) {
+        return this.queryEntity(questionAnswerIdParam.getId());
+    }
+
+    @Override
+    public QuestionAnswer queryEntity(Integer id) {
+        QuestionAnswer questionAnswer = this.getById(id);
+        if(ObjectUtil.isEmpty(questionAnswer)) {
+            throw new CommonException("question_answer不存在,id值为:{}", id);
+        }
+        return questionAnswer;
+    }
+
+
+
+
+
+    @Override
+    public void give(Integer id) {
+        QuestionAnswer userComment=queryEntity(id);
+        if(ObjectUtil.isEmpty(userComment.getGiveNum())) {
+            userComment.setGiveNum(1);
+        }else{
+            userComment.setGiveNum(userComment.getGiveNum()+1);
+        }
+        this.updateById(userComment);
+        //添加点赞记录表
+        QuestionAnswerGive userCommentGive=new QuestionAnswerGive();
+        userCommentGive.setUserId(StpLoginUserUtil.getLoginUser().getId());
+        userCommentGive.setCreateUser(StpLoginUserUtil.getLoginUser().getId());
+        userCommentGive.setQuestionAnswerid(id);
+        userCommentGive.setCreateTime(new Date());
+        userCommentGive.setDeleteFlag("NOT_DELETE");
+        questionAnswerGiveMapper.insert(userCommentGive);
+    }
+
+    @Override
+    public String giveCancel(Integer id) {
+        QuestionAnswer userComment=queryEntity(id);
+        if(userComment.getGiveNum()>0){
+            userComment.setGiveNum(userComment.getGiveNum()-1);
+            this.updateById(userComment);
+            //删除点赞记录表
+            QuestionAnswerGive userCommentGive=new QuestionAnswerGive();
+            userCommentGive.setQuestionAnswerid(id);
+            userCommentGive.setUserId(StpLoginUserUtil.getLoginUser().getId());
+            userCommentGive.setDeleteFlag("DELETED");
+            questionAnswerGiveMapper.updateQuestionAnswerGiveMapper(userCommentGive);
+            return "取消点赞成功!";
+        }else{
+            return "点赞数量为0,无法取消点赞!";
+        }
+    }
+
+
+
+
+
+
+}

+ 38 - 13
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/util/MinioUtil.java

@@ -1,6 +1,8 @@
 package vip.xiaonuo.disk.util;
 
 
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollectionUtil;
 import com.alibaba.fastjson2.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.qiwenshare.common.util.DateUtil;
@@ -102,21 +104,42 @@ public class MinioUtil {
      * @param md5List
      * @return
      */
-    public List<String> checkFilesExits(List<UploadFile> md5List) {
+    public List<ResourceUserFile> checkFilesExits(List<UploadFile> md5List) {
 
-        ArrayList<String> noExitList = new ArrayList<>();
+        List<ResourceUserFile> noExitList = new ArrayList<>();
         md5List.forEach(item -> {
-            try {
                 //根据文件名称查询userFileId
-                String fileSuffix=item.getFileSuffix().substring(1, item.getFileSuffix().length());
-                String fileUrl = UFOPUtils.getUploadFileUrl(item.getMd5(), fileSuffix);
-                logger.info("校验是否存在的文件名是: "+fileUrl);
-                minioClient.statObject(StatObjectArgs.builder().bucket(bucket).object(fileUrl).build());
-            } catch (Exception e) {
-                logger.info("该文件需要上传,md5值是:" + item.getMd5());
-                // 未存在的文件添加到队列中,前端仍需上传
-                noExitList.add(item.getMd5());
-            }
+                Map<String, Object> param = new HashMap<>();
+                //看看该md5批次号有没有对应存在的文件
+                param.put("identifier", item.getMd5());
+                List<ResourceFile> list = resourceFileMapper.selectByMap(param);
+               if(CollectionUtil.isNotEmpty(list)&&list.size()==1){
+                   //根据md5值查询已上传的文件
+                   ResourceUserFile userFile=resourceUserFileMapper.selectUserFileId(item.getMd5());
+                   Integer userFileCount=resourceUserFileMapper.selectUserFileIdCount(item.getMd5(),StpLoginUserUtil.getLoginUser().getId());
+                   if(userFileCount==0){
+                       ResourceUserFile newUserFile=new  ResourceUserFile();
+                       BeanUtil.copyProperties(userFile, newUserFile);
+                       newUserFile.setMd5(item.getMd5());
+                       resourceUserFileMapper.insert(newUserFile);
+                       noExitList.add(newUserFile);
+                   }else{
+                       ResourceUserFile newUserFile=new  ResourceUserFile();
+                       BeanUtil.copyProperties(userFile, newUserFile);
+                       newUserFile.setFileName(item.getFileName()+"("+userFileCount+")");
+                       newUserFile.setMd5(item.getMd5());
+                       resourceUserFileMapper.insert(newUserFile);
+                       noExitList.add(newUserFile);
+                   }
+               }else{
+                   logger.info("该文件需要上传,md5值是:" + item.getMd5());
+                   ResourceUserFile newUserFile=new  ResourceUserFile();
+                   newUserFile.setMd5(item.getMd5());
+                   newUserFile.setIsDir(0);
+                   // 未存在的文件添加到队列中,前端仍需上传
+                   noExitList.add(newUserFile);
+               }
+
         });
         return noExitList;
     }
@@ -352,11 +375,12 @@ public class MinioUtil {
             }
         }
         ExecutorService threadPool = CheckThreadPool.getExecutor();
+        String userId = StpLoginUserUtil.getLoginUser().getId();
         try {
             threadPool.execute(() -> {
                 TranscodingResourceReqDTO transcodingResourceReqDTO = new TranscodingResourceReqDTO();
                 transcodingResourceReqDTO.setUserFileId(resourceUserFile.getUserFileId());
-                transcodingResourceReqDTO.setUserId(StpLoginUserUtil.getLoginUser().getId());
+                transcodingResourceReqDTO.setUserId(userId);
                 kafKaProducerUtil.sendTranscodingResource(producer.getProducer(), JSON.toJSONString(transcodingResourceReqDTO));
             });
         } catch (Exception e) {
@@ -408,6 +432,7 @@ public class MinioUtil {
         }
         resourceFileDealComp.parseMusicFile(qiwenFile.getExtendName(), 3, url, file.getFileId());
         Map<String, Object> map = new HashMap();
+        map.put("md5", resourceUserFile.getMd5());
         map.put("userFileId", resourceUserFile.getUserFileId());
         map.put("rs", true);
         return map;

+ 81 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/vo/questionanswer/QuestionAnswerVo.java

@@ -0,0 +1,81 @@
+package vip.xiaonuo.disk.vo.questionanswer;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.Date;
+import java.util.List;
+
+
+@Getter
+@Setter
+public class QuestionAnswerVo {
+    /** 主键id */
+    @TableId(type = IdType.AUTO)
+    @ApiModelProperty(value = "主键id", position = 1)
+    private Integer id;
+
+    /** 父级id */
+    @ApiModelProperty(value = "父级id", position = 2)
+    private Integer pid;
+
+    /** 评论名称 */
+    @ApiModelProperty(value = "名称", position = 3)
+    private String name;
+
+    /** 用户id */
+    @ApiModelProperty(value = "用户id", position = 4)
+    private String userId;
+
+    /** 用户名称 */
+    @ApiModelProperty(value = "用户名称", position = 4)
+    private String userName;
+
+
+    /** 评论时间 */
+    @ApiModelProperty(value = "评论时间", position = 5)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date time;
+
+    /** 删除1, 未删除 0 */
+    @ApiModelProperty(value = "删除1, 未删除 0", position = 6)
+    @TableLogic
+    @TableField(fill = FieldFill.INSERT)
+    private String deleteFlag;
+
+    /** 点赞量 */
+    @ApiModelProperty(value = "点赞量", position = 7)
+    private Integer giveNum;
+
+    /** 创建时间 */
+    @ApiModelProperty(value = "创建时间", position = 8)
+    @TableField(fill = FieldFill.INSERT)
+    private Date createTime;
+
+    /** 创建人 */
+    @ApiModelProperty(value = "创建人", position = 9)
+    @TableField(fill = FieldFill.INSERT)
+    private String createUser;
+
+    /** 修改时间 */
+    @ApiModelProperty(value = "修改时间", position = 10)
+    @TableField(fill = FieldFill.UPDATE)
+    private Date updateTime;
+
+    /** 修改人 */
+    @ApiModelProperty(value = "修改人", position = 11)
+    @TableField(fill = FieldFill.UPDATE)
+    private String updateUser;
+
+    /** 查询对这个评论点没点过赞 */
+    private Integer giveNumSelf;
+
+    private Integer childSize;
+
+    /** 孩子评论 */
+    private List<QuestionAnswerVo> child;
+
+}

+ 2 - 6
snowy-server/snowy-gateway-app/src/main/java/vip/xiaonuo/gateway/config/GatewayConfigure.java

@@ -144,13 +144,9 @@ public class GatewayConfigure {
             /* 资源中心 */
             "/api/webapp/disk/resourcecentre/page",
             "/api/webapp/disk/resourcecentre/detail",
-            "/api/webapp/disk/courseauditrecord/addViewCount",
+            "/api/webapp/disk/courseauditrecord/addViewCount"
+
 
-            "/api/webapp/disk/minio/upload",
-            "/api/webapp/disk/minio/checkExits",
-            "/api/webapp/disk/minio/merge",
-            "/api/webapp/disk/minio/delete",
-            "/api/webapp/disk/minio/checkMd5List"
     };
 
     /**