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

1.将课程信息与资源进行解耦,课程变成单独维护,修改课程相关接口
2.资源管理中,应2026.6.27内部定下需求,修改资源库为自己独立功能,并新增数据库字段,加入院系/专业/附件/介绍/附件关联形式/关键字/热门/推荐等,修改相应修改功能内字段,并应业务变动,修改对应所有增删改,审核,修改状态,列表详情等接口。涵盖整个资源管理以及资源中心
3.编写接口文档,与前端同事梳理业务
4.资源库文件上传迁移部分已确定功能

honorfire 8 месяцев назад
Родитель
Сommit
5ba585a41d
37 измененных файлов с 2073 добавлено и 92 удалено
  1. 4 0
      snowy-plugin/snowy-plugin-dev/snowy-plugin-dev-func/src/main/java/vip/xiaonuo/dev/modular/dict/param/DevDictListParam.java
  2. 8 0
      snowy-plugin/snowy-plugin-dev/snowy-plugin-dev-func/src/main/java/vip/xiaonuo/dev/modular/dict/service/impl/DevDictServiceImpl.java
  3. 273 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/component/ResourceFileDealComp.java
  4. 62 11
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/controller/CourseAuditRecordController.java
  5. 49 18
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/controller/CourseInfoController.java
  6. 67 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/controller/ResourceFileController.java
  7. 45 29
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/domain/CourseAuditRecord.java
  8. 12 1
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/domain/CourseInfo.java
  9. 109 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/domain/ResourceFile.java
  10. 125 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/domain/ResourceUserFile.java
  11. 6 1
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/dto/courseInfo/CourseInfoAddParam.java
  12. 5 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/dto/courseInfo/CourseInfoEditParam.java
  13. 50 4
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/dto/courseauditrecord/CourseAuditRecordAddParam.java
  14. 51 3
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/dto/courseauditrecord/CourseAuditRecordEditParam.java
  15. 70 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/dto/resourcefile/ResourceFileAddParam.java
  16. 75 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/dto/resourcefile/ResourceFileEditParam.java
  17. 35 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/dto/resourcefile/ResourceFileIdParam.java
  18. 51 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/dto/resourcefile/ResourceFilePageParam.java
  19. 86 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/dto/resourceuserfile/ResourceUserFileAddParam.java
  20. 91 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/dto/resourceuserfile/ResourceUserFileEditParam.java
  21. 35 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/dto/resourceuserfile/ResourceUserFileIdParam.java
  22. 51 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/dto/resourceuserfile/ResourceUserFilePageParam.java
  23. 25 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/mapper/ResourceFileMapper.java
  24. 25 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/mapper/ResourceUserFileMapper.java
  25. 80 22
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/mapper/mapping/CourseAuditRecordMapper.xml
  26. 11 3
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/mapper/mapping/CourseInfoMapper.xml
  27. 5 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/mapper/mapping/ResourceFileMapper.xml
  28. 5 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/mapper/mapping/ResourceUserFileMapper.xml
  29. 24 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/CourseAuditRecordService.java
  30. 5 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/CourseInfoService.java
  31. 19 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/ResourceFileService.java
  32. 81 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/ResourceUserfileService.java
  33. 40 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/impl/CourseAuditRecordServiceImpl.java
  34. 11 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/impl/CourseInfoServiceImpl.java
  35. 266 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/impl/ResourceFileServiceImpl.java
  36. 96 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/impl/ResourceUserfileServiceImpl.java
  37. 20 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/util/QiwenFileUtil.java

+ 4 - 0
snowy-plugin/snowy-plugin-dev/snowy-plugin-dev-func/src/main/java/vip/xiaonuo/dev/modular/dict/param/DevDictListParam.java

@@ -30,6 +30,10 @@ public class DevDictListParam {
     @ApiModelProperty(value = "父id")
     private String parentId;
 
+    /** 父字典值 */
+    @ApiModelProperty(value = "父字典值")
+    private String parentDictValue;
+
     /** 字典分类 */
     @ApiModelProperty(value = "字典分类")
     private String category;

+ 8 - 0
snowy-plugin/snowy-plugin-dev/snowy-plugin-dev-func/src/main/java/vip/xiaonuo/dev/modular/dict/service/impl/DevDictServiceImpl.java

@@ -85,6 +85,14 @@ public class DevDictServiceImpl extends ServiceImpl<DevDictMapper, DevDict> impl
     @Override
     public List<DevDict> list(DevDictListParam devDictListParam) {
         LambdaQueryWrapper<DevDict> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+        if(ObjectUtil.isNotEmpty(devDictListParam.getParentDictValue()))
+        {
+            LambdaQueryWrapper<DevDict> temWrapper = new LambdaQueryWrapper<>();
+            List<DevDict> parentDictTemList=this.list(temWrapper.eq(DevDict::getDictValue, devDictListParam.getParentDictValue()));
+            DevDict parentDict=parentDictTemList.get(0);
+            devDictListParam.setParentId(parentDict.getId());
+        }
+
         if (ObjectUtil.isNotEmpty(devDictListParam.getParentId())) {
             lambdaQueryWrapper.eq(DevDict::getParentId, devDictListParam.getParentId());
         }

+ 273 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/component/ResourceFileDealComp.java

@@ -0,0 +1,273 @@
+package vip.xiaonuo.disk.component;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.IdUtil;
+import co.elastic.clients.elasticsearch.ElasticsearchClient;
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.qiwenshare.common.util.DateUtil;
+import com.qiwenshare.common.util.MusicUtils;
+import com.qiwenshare.common.util.security.SessionUtil;
+import com.qiwenshare.ufop.factory.UFOPFactory;
+import com.qiwenshare.ufop.operation.copy.Copier;
+import com.qiwenshare.ufop.operation.copy.domain.CopyFile;
+import com.qiwenshare.ufop.operation.download.Downloader;
+import com.qiwenshare.ufop.operation.download.domain.DownloadFile;
+import com.qiwenshare.ufop.operation.write.Writer;
+import com.qiwenshare.ufop.operation.write.domain.WriteFile;
+import com.qiwenshare.ufop.util.UFOPUtils;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.codec.digest.DigestUtils;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.io.IOUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.jaudiotagger.audio.AudioFile;
+import org.jaudiotagger.audio.AudioFileIO;
+import org.jaudiotagger.audio.AudioHeader;
+import org.jaudiotagger.audio.flac.FlacFileReader;
+import org.jaudiotagger.audio.mp3.MP3File;
+import org.jaudiotagger.tag.FieldKey;
+import org.jaudiotagger.tag.Tag;
+import org.jaudiotagger.tag.datatype.Artwork;
+import org.jaudiotagger.tag.id3.AbstractID3v2Frame;
+import org.jaudiotagger.tag.id3.AbstractID3v2Tag;
+import org.jaudiotagger.tag.id3.framebody.FrameBodyAPIC;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import vip.xiaonuo.auth.core.util.StpLoginUserUtil;
+import vip.xiaonuo.disk.config.es.FileSearch;
+import vip.xiaonuo.disk.domain.*;
+import vip.xiaonuo.disk.io.QiwenFile;
+import vip.xiaonuo.disk.mapper.*;
+import vip.xiaonuo.disk.service.IShareFileService;
+import vip.xiaonuo.disk.service.IShareService;
+import vip.xiaonuo.disk.service.IUserService;
+import vip.xiaonuo.disk.util.QiwenFileUtil;
+import vip.xiaonuo.disk.util.TreeNode;
+
+import javax.annotation.Resource;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.*;
+import java.util.concurrent.Executor;
+import java.util.concurrent.Executors;
+
+/**
+ * 文件逻辑处理组件
+ */
+@Slf4j
+@Component
+public class ResourceFileDealComp {
+
+    @Resource
+    ResourceFileMapper resourceFileMapper;
+
+    @Resource
+    ResourceUserFileMapper resourceUserFileMapper;
+
+    @Resource
+    private UFOPFactory ufopFactory;
+
+    @Resource
+    private MusicMapper musicMapper;
+
+
+    /**
+     * 还原父文件路径
+     * <p>
+     * 1、回收站文件还原操作会将文件恢复到原来的路径下,当还原文件的时候,如果父目录已经不存在了,则需要把父母录给还原
+     * 2、上传目录
+     *
+     * @param sessionUserId
+     */
+    public void restoreParentFilePath(QiwenFile qiwenFile, String sessionUserId) {
+
+        if (qiwenFile.isFile()) {
+            qiwenFile = qiwenFile.getParentFile();
+        }
+        while (qiwenFile.getParent() != null) {
+            String fileName = qiwenFile.getName();
+            String parentFilePath = qiwenFile.getParent();
+
+            LambdaQueryWrapper<ResourceUserFile> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+            lambdaQueryWrapper.eq(ResourceUserFile::getFilePath, parentFilePath)
+                    .eq(ResourceUserFile::getFileName, fileName)
+                    .eq(ResourceUserFile::getDeleteFlag, 0)
+                    .eq(ResourceUserFile::getIsDir, 1)
+                    .eq(ResourceUserFile::getUserId, sessionUserId);
+            List<ResourceUserFile> userFileList = resourceUserFileMapper.selectList(lambdaQueryWrapper);
+            if (userFileList.size() == 0) {
+                ResourceUserFile userFile = QiwenFileUtil.getQiwenDirResource(sessionUserId, parentFilePath, fileName);
+                try {
+                    resourceUserFileMapper.insert(userFile);
+                } catch (Exception e) {
+                    //ignore
+                }
+            }
+            qiwenFile = new QiwenFile(parentFilePath, true);
+        }
+    }
+
+
+    /**
+     * 获取重复文件名
+     * <p>
+     * 场景1: 文件还原时,在 savefilePath 路径下,保存 测试.txt 文件重名,则会生成 测试(1).txt
+     * 场景2: 上传文件时,在 savefilePath 路径下,保存 测试.txt 文件重名,则会生成 测试(1).txt
+     *
+     * @param userFile
+     * @param savefilePath
+     * @return
+     */
+    public String getRepeatFileName(ResourceUserFile userFile, String savefilePath) {
+        String fileName = userFile.getFileName();
+        String extendName = userFile.getExtendName();
+
+        String userId = userFile.getUserId();
+        int isDir = userFile.getIsDir();
+        LambdaQueryWrapper<ResourceUserFile> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+        lambdaQueryWrapper.eq(ResourceUserFile::getFilePath, savefilePath)
+                .eq(ResourceUserFile::getDeleteFlag, 0)
+                .eq(ResourceUserFile::getUserId, userId)
+                .eq(ResourceUserFile::getFileName, fileName)
+                .eq(ResourceUserFile::getIsDir, isDir);
+        if (userFile.isFile()) {
+            lambdaQueryWrapper.eq(ResourceUserFile::getExtendName, extendName);
+        }
+        List<ResourceUserFile> list = resourceUserFileMapper.selectList(lambdaQueryWrapper);
+        if (CollectionUtils.isEmpty(list)) {
+            return fileName;
+        }
+
+        int i = 0;
+
+        while (!CollectionUtils.isEmpty(list)) {
+            i++;
+            LambdaQueryWrapper<ResourceUserFile> lambdaQueryWrapper1 = new LambdaQueryWrapper<>();
+            lambdaQueryWrapper1.eq(ResourceUserFile::getFilePath, savefilePath)
+                    .eq(ResourceUserFile::getDeleteFlag, 0)
+                    .eq(ResourceUserFile::getUserId, userId)
+                    .eq(ResourceUserFile::getFileName, fileName + "(" + i + ")")
+                    .eq(ResourceUserFile::getIsDir, isDir);
+            if (userFile.isFile()) {
+                lambdaQueryWrapper1.eq(ResourceUserFile::getExtendName, extendName);
+            }
+            list = resourceUserFileMapper.selectList(lambdaQueryWrapper1);
+
+        }
+
+        return fileName + "(" + i + ")";
+
+    }
+
+    public void parseMusicFile(String extendName, int storageType, String fileUrl, String fileId) {
+        File outFile = null;
+        InputStream inputStream = null;
+        FileOutputStream fileOutputStream = null;
+        try {
+            if ("mp3".equalsIgnoreCase(extendName) || "flac".equalsIgnoreCase(extendName)) {
+                Downloader downloader = ufopFactory.getDownloader(storageType);
+                DownloadFile downloadFile = new DownloadFile();
+                downloadFile.setFileUrl(fileUrl);
+                inputStream = downloader.getInputStream(downloadFile);
+                outFile = UFOPUtils.getTempFile(fileUrl);
+                if (!outFile.exists()) {
+                    outFile.createNewFile();
+                }
+                fileOutputStream = new FileOutputStream(outFile);
+                IOUtils.copy(inputStream, fileOutputStream);
+                Music music = new Music();
+                //  music.setMusicId(IdUtil.getSnowflakeNextIdStr());
+                music.setFileId(fileId);
+
+                Tag tag = null;
+                AudioHeader audioHeader = null;
+                if ("mp3".equalsIgnoreCase(extendName)) {
+                    MP3File f = (MP3File) AudioFileIO.read(outFile);
+                    tag = f.getTag();
+                    audioHeader = f.getAudioHeader();
+                    MP3File mp3file = new MP3File(outFile);
+                    if (mp3file.hasID3v2Tag()) {
+                        AbstractID3v2Tag id3v2Tag = mp3file.getID3v2TagAsv24();
+                        AbstractID3v2Frame frame = (AbstractID3v2Frame) id3v2Tag.getFrame("APIC");
+                        FrameBodyAPIC body;
+                        if (frame != null && !frame.isEmpty()) {
+                            body = (FrameBodyAPIC) frame.getBody();
+                            byte[] imageData = body.getImageData();
+                            music.setAlbumImage(Base64.getEncoder().encodeToString(imageData));
+                        }
+                        if (tag != null) {
+                            music.setArtist(tag.getFirst(FieldKey.ARTIST));
+                            music.setTitle(tag.getFirst(FieldKey.TITLE));
+                            music.setAlbum(tag.getFirst(FieldKey.ALBUM));
+                            music.setYear(tag.getFirst(FieldKey.YEAR));
+                            try {
+                                music.setTrack(tag.getFirst(FieldKey.TRACK));
+                            } catch (Exception e) {
+                                // ignore
+                            }
+
+                            music.setGenre(tag.getFirst(FieldKey.GENRE));
+                            music.setComment1(tag.getFirst(FieldKey.COMMENT));
+                            music.setLyrics(tag.getFirst(FieldKey.LYRICS));
+                            music.setComposer(tag.getFirst(FieldKey.COMPOSER));
+                            music.setAlbumArtist(tag.getFirst(FieldKey.ALBUM_ARTIST));
+                            music.setEncoder(tag.getFirst(FieldKey.ENCODER));
+                        }
+                    }
+                } else if ("flac".equalsIgnoreCase(extendName)) {
+                    AudioFile f = new FlacFileReader().read(outFile);
+                    tag = f.getTag();
+                    audioHeader = f.getAudioHeader();
+                    if (tag != null) {
+                        music.setArtist(StringUtils.join(tag.getFields(FieldKey.ARTIST), ","));
+                        music.setTitle(StringUtils.join(tag.getFields(FieldKey.TITLE), ","));
+                        music.setAlbum(StringUtils.join(tag.getFields(FieldKey.ALBUM), ","));
+                        music.setYear(StringUtils.join(tag.getFields(FieldKey.YEAR), ","));
+                        music.setTrack(StringUtils.join(tag.getFields(FieldKey.TRACK), ","));
+                        music.setGenre(StringUtils.join(tag.getFields(FieldKey.GENRE), ","));
+                        music.setComment1(StringUtils.join(tag.getFields(FieldKey.COMMENT), ","));
+                        music.setLyrics(StringUtils.join(tag.getFields(FieldKey.LYRICS), ","));
+                        music.setComposer(StringUtils.join(tag.getFields(FieldKey.COMPOSER), ","));
+                        music.setAlbumArtist(StringUtils.join(tag.getFields(FieldKey.ALBUM_ARTIST), ","));
+                        music.setEncoder(StringUtils.join(tag.getFields(FieldKey.ENCODER), ","));
+                        List<Artwork> artworkList = tag.getArtworkList();
+                        if (artworkList != null && !artworkList.isEmpty()) {
+                            Artwork artwork = artworkList.get(0);
+                            byte[] binaryData = artwork.getBinaryData();
+                            music.setAlbumImage(Base64.getEncoder().encodeToString(binaryData));
+                        }
+                    }
+
+                }
+
+                if (audioHeader != null) {
+                    music.setTrackLength(Float.parseFloat(audioHeader.getTrackLength() + ""));
+                }
+
+                if (StringUtils.isEmpty(music.getLyrics())) {
+                    try {
+
+                        String lyc = MusicUtils.getLyc(music.getArtist(), music.getTitle(), music.getAlbum());
+                        music.setLyrics(lyc);
+                    } catch (Exception e) {
+                        log.info(e.getMessage());
+                    }
+                }
+                musicMapper.insert(music);
+            }
+        } catch (Exception e) {
+            log.error("解析音乐信息失败!", e);
+        } finally {
+            IOUtils.closeQuietly(inputStream);
+            IOUtils.closeQuietly(fileOutputStream);
+            if (outFile != null) {
+                if (outFile.exists()) {
+                    outFile.delete();
+                }
+            }
+        }
+    }
+}

+ 62 - 11
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/controller/CourseAuditRecordController.java

@@ -28,14 +28,17 @@ 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.common.util.PinyinUtils;
 import vip.xiaonuo.disk.domain.CourseAuditRecord;
 import vip.xiaonuo.disk.domain.CourseInfo;
+import vip.xiaonuo.disk.domain.ResourceUserFile;
 import vip.xiaonuo.disk.dto.courseauditrecord.CourseAuditRecordAddParam;
 import vip.xiaonuo.disk.dto.courseauditrecord.CourseAuditRecordEditParam;
 import vip.xiaonuo.disk.dto.courseauditrecord.CourseAuditRecordIdParam;
 import vip.xiaonuo.disk.dto.courseauditrecord.CourseAuditRecordPageParam;
 import vip.xiaonuo.disk.service.CourseAuditRecordService;
 import vip.xiaonuo.disk.service.CourseInfoService;
+import vip.xiaonuo.disk.service.ResourceUserfileService;
 
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
@@ -61,6 +64,13 @@ public class CourseAuditRecordController {
     @Resource
     private CourseInfoService courseInfoService;
 
+    @Resource
+    private ResourceUserfileService resourceUserfileService;
+
+    @Resource
+    private PinyinUtils pinyinUtils;
+
+
     /**
      * 获取课程审核记录表分页
      *
@@ -79,6 +89,12 @@ public class CourseAuditRecordController {
         param.put("verifyStatus", verifyStatus);
         //文件名称
         param.put("fileName", req.getParameter("fileName"));
+        param.put("collegeId", req.getParameter("collegeId"));
+        param.put("collegeTwoId", req.getParameter("collegeTwoId"));
+        param.put("collegeThreeId", req.getParameter("collegeThreeId"));
+        param.put("majorId", req.getParameter("majorId"));
+        param.put("courseType", req.getParameter("courseType"));
+        param.put("suffix", req.getParameter("suffix"));
         Page<Map<String,Object>> list=courseAuditRecordService.queryList(param);
         return CommonResult.data(list);
     }
@@ -95,25 +111,39 @@ public class CourseAuditRecordController {
     @SaCheckPermission("/disk/courseauditrecord/add")
     @PostMapping("/disk/courseauditrecord/add")
     public CommonResult<String> add(@RequestBody @Valid CourseAuditRecordAddParam courseAuditRecordAddParam) {
-        CourseAuditRecord courseAuditRecord = BeanUtil.toBean(courseAuditRecordAddParam, CourseAuditRecord.class);
-        courseAuditRecord.setVerifyStatus("0");
-        courseAuditRecordService.addOne(courseAuditRecord);
+
+        //该次上传附件信息
+        String userFileIdsStr=courseAuditRecordAddParam.getUserfileIds();
+        String[] userFileIdList = userFileIdsStr.split(",");
+        List<CourseAuditRecord> courseAuditRecordList = new ArrayList<>();
+        for (String userFileId : userFileIdList) {
+            CourseAuditRecord courseAuditRecord = BeanUtil.toBean(courseAuditRecordAddParam, CourseAuditRecord.class);
+        //2025.6.27废弃,改用userfile表,直接有相关信息
+//            ResourceUserFile resourceUserFile =resourceUserfileService.queryEntity(userFileId);
+//            courseAuditRecord.setFileName(resourceUserFile.getFileName());
+            courseAuditRecord.setUserfileId(userFileId);
+            courseAuditRecord.setVerifyStatus("0");
+            if(StringUtils.isNotEmpty(courseAuditRecordAddParam.getKeywordValue()))courseAuditRecord.setKeywordPinyin(StringUtils.deleteWhitespace(pinyinUtils.toPinyin(courseAuditRecordAddParam.getKeywordValue(),false)));
+            courseAuditRecordList.add(courseAuditRecord);
+        }
+        courseAuditRecordService.addBatch(courseAuditRecordList);
         return CommonResult.ok();
     }
 
     /**
-     * 编辑课程审核记录表
+     * 课程审核记录-编辑
      *
      * @author honorfire
      * @date  2025/06/20 14:58
      */
     @ApiOperationSupport(order = 3)
-    @ApiOperation("编辑课程审核记录表")
+    @ApiOperation("课程审核记录-编辑")
     @CommonLog("编辑课程审核记录表")
     @SaCheckPermission("/disk/courseauditrecord/edit")
     @PostMapping("/disk/courseauditrecord/edit")
     public CommonResult<String> edit(@RequestBody @Valid CourseAuditRecordEditParam courseAuditRecordEditParam) {
         CourseAuditRecord courseAuditRecord = BeanUtil.toBean(courseAuditRecordEditParam, CourseAuditRecord.class);
+        if(StringUtils.isNotEmpty(courseAuditRecordEditParam.getKeywordValue()))courseAuditRecord.setKeywordPinyin(StringUtils.deleteWhitespace(pinyinUtils.toPinyin(courseAuditRecordEditParam.getKeywordValue(),false)));
         courseAuditRecordService.editOne(courseAuditRecord);
         return CommonResult.ok();
     }
@@ -131,19 +161,40 @@ public class CourseAuditRecordController {
     @PostMapping("/disk/courseauditrecord/updateStatus")
     public CommonResult<String> updateStatus(@RequestBody @Valid CourseAuditRecordEditParam courseAuditRecordEditParam) {
         if(StringUtils.isEmpty(courseAuditRecordEditParam.getVerifyStatus()))return CommonResult.error("审核状态不能为空");
+        //校验
         //0未发布,1待审核,2已发布,3未通过,4已删除
         List<String> VerifyStatusList = Arrays.asList("1","2","3","4");
         if(!VerifyStatusList.contains(courseAuditRecordEditParam.getVerifyStatus()))return CommonResult.error("审核状态错误");
-        //修改审核状态需要同步改变课程状态
+        if("1".equals(courseAuditRecordEditParam.getVerifyStatus()))
+        {
+            if(StringUtils.isEmpty(courseAuditRecordEditParam.getResourceDesc()) )return CommonResult.error("发布未传资源信息");
+            if(StringUtils.isEmpty(courseAuditRecordEditParam.getCoverImage()) )return CommonResult.error("发布未传封面");
+        }
+
+        //修改审核状态需要同步改变课程状态(2025.6.26废弃)
         //1.查回课程审核记录设置审核状态
         CourseAuditRecord courseAuditRecord=courseAuditRecordService.queryEntity(courseAuditRecordEditParam.getId());
         courseAuditRecord.setVerifyStatus(courseAuditRecordEditParam.getVerifyStatus());
         courseAuditRecordService.editOne(courseAuditRecord);
-        //2.查回对应课程信息设置审核状态
+        //2.查回对应课程信息
         CourseInfo courseInfo=courseInfoService.queryEntity(courseAuditRecord.getCourseId());
-        courseInfo.setVerifyStatus(courseAuditRecord.getVerifyStatus());
-        if("2".equals(courseAuditRecordEditParam.getVerifyStatus()))courseInfo.setPublishTime(new Date());
-        courseInfoService.editOne(courseInfo);
+        //设置审核状态(2025.6.26废弃)
+//        courseInfo.setVerifyStatus(courseAuditRecord.getVerifyStatus());
+//        if("2".equals(courseAuditRecordEditParam.getVerifyStatus()))courseInfo.setPublishTime(new Date());
+        //查看是否课程有关联资源(2025.6.27废弃,课程和资源解耦,不在强绑定)
+//        Map queryRelateParam = new HashMap();
+//        queryRelateParam.put("courseId", courseInfo.getCourseId());
+//        queryRelateParam.put("verifyStatus", "2");
+//        List<CourseAuditRecord> relateResourceList=courseAuditRecordService.queryCourseAuditRecordList(queryRelateParam);
+//        if(relateResourceList != null && relateResourceList.size() > 0)
+//        {
+//            courseInfo.setHaveresource("1");
+//        }
+//        else
+//        {
+//            courseInfo.setHaveresource("0");
+//        }
+//        courseInfoService.editOne(courseInfo);
 
         return CommonResult.ok();
     }
@@ -177,7 +228,7 @@ public class CourseAuditRecordController {
     @GetMapping("/disk/courseauditrecord/detail")
     public CommonResult<Map<String,Object>> detail(@Valid CourseAuditRecordIdParam courseAuditRecordIdParam, HttpServletRequest req) {
         Map param =new HashMap();
-        param.put("courseId", req.getParameter("courseId"));
+        param.put("id", req.getParameter("id"));
         Map<String,Object> result=courseAuditRecordService.queryInfo(param);
         return CommonResult.data(result);
     }

+ 49 - 18
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/controller/CourseInfoController.java

@@ -42,8 +42,7 @@ 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;
+import java.util.*;
 
 /**
  * 课程信息表控制器
@@ -63,13 +62,13 @@ public class CourseInfoController {
     private CourseAuditRecordService courseAuditRecordService;
 
     /**
-     * 获取课程信息表分页
+     * 课程信息-分页列表
      *
      * @author honorfire
      * @date  2025/06/20 15:00
      */
     @ApiOperationSupport(order = 1)
-    @ApiOperation("获取课程信息表分页")
+    @ApiOperation("课程信息-分页列表")
     @SaCheckPermission("/disk/courseinfo/page")
     @GetMapping("/disk/courseinfo/page")
     public CommonResult<Page<Map<String,Object>>> page(CourseInfoPageParam courseInfoPageParam, HttpServletRequest req) {
@@ -78,10 +77,31 @@ public class CourseInfoController {
         param.put("collegeId", req.getParameter("collegeId"));
         param.put("majorId", req.getParameter("majorId"));
         param.put("courseType", req.getParameter("courseType"));
+        //排序类型,0最新,1热门
+        param.put("sortflag", req.getParameter("sortflag"));
+        //格式类型,待定
+        param.put("suffixType", req.getParameter("suffixType"));
+
         Page<Map<String,Object>> list=courseInfoService.queryList(param);
         return CommonResult.data(list);
     }
 
+    /**
+     * 课程信息-全量列表
+     *
+     * @author honorfire
+     * @date  2025/06/20 15:00
+     */
+    @ApiOperationSupport(order = 1)
+    @ApiOperation("课程信息-全量列表")
+    @SaCheckPermission("/disk/courseinfo/allList")
+    @GetMapping("/disk/courseinfo/allList")
+    public CommonResult<List<CourseInfo>> allList(CourseInfoPageParam courseInfoPageParam, HttpServletRequest req) {
+        Map param =new HashMap();
+        List<CourseInfo> list=courseInfoService.queryCourseInfoList(param);
+        return CommonResult.data(list);
+    }
+
     /**
      * 课程信息-添加
      *
@@ -96,15 +116,26 @@ public class CourseInfoController {
     public CommonResult<String> add(@RequestBody @Valid CourseInfoAddParam courseInfoAddParam) {
         //1.先添加课程信息
         CourseInfo courseInfo = BeanUtil.toBean(courseInfoAddParam, CourseInfo.class);
-        //设置审核状态变成待审核
-        courseInfo.setVerifyStatus("1");
+        //设置审核状态变成待审核(2025.6.26废弃,现在只要资源发布就有课程,只是最后审关联课程一个都没通过,没有关联的资源会查不出来)
+//        courseInfo.setVerifyStatus("1");
+        //设置初始关联课程(2025.6.27废弃)
+//        courseInfo.setHaveresource("0");
+        courseInfo.setPublishTime(new Date());
         courseInfoService.addOne(courseInfo);
-        //2.要查回关联的那条课程审核记录,然后进行绑定
-        CourseAuditRecord courseAuditRecord=courseAuditRecordService.queryEntity(courseInfoAddParam.getCourseAuditId());
-        courseAuditRecord.setCourseId(courseInfo.getCourseId());
-        //设置审核状态变成待审核
-        courseAuditRecord.setVerifyStatus("1");
-        courseAuditRecordService.editOne(courseAuditRecord);
+//        //2.要查回关联的多条课程资源审核记录,然后进行绑定2025.6.26(废弃2025.6.27,课程和资源解耦,不在强绑定)
+//        String courseAuditIdsStr=courseInfoAddParam.getCourseAuditIds();
+//        String[] courseAuditIdList = courseAuditIdsStr.split(",");
+//        List<CourseAuditRecord> courseAuditRecordList = new ArrayList<>();
+//        for(String courseAuditId : courseAuditIdList)
+//        {
+//            CourseAuditRecord courseAuditRecord=courseAuditRecordService.queryEntity(courseAuditId);
+//            courseAuditRecord.setCourseId(courseInfo.getCourseId());
+//            //设置审核状态变成待审核
+//            courseAuditRecord.setVerifyStatus("1");
+//            courseAuditRecordList.add(courseAuditRecord);
+//        }
+//
+//        courseAuditRecordService.editBatch(courseAuditRecordList);
         return CommonResult.ok();
     }
 
@@ -122,13 +153,13 @@ public class CourseInfoController {
     public CommonResult<String> edit(@RequestBody @Valid CourseInfoEditParam courseInfoEditParam) {
         //1.先更新课程基础信息
         CourseInfo courseInfo = BeanUtil.toBean(courseInfoEditParam, CourseInfo.class);
-        //设置审核状态重新变成待审核
-        courseInfo.setVerifyStatus("1");
+        //设置审核状态重新变成待审核(2025.6.26废弃)
+//        courseInfo.setVerifyStatus("1");
         courseInfoService.editOne(courseInfo);
-        //2.要查回关联的那条课程审核记录,同样修改状态变成待审核
-        CourseAuditRecord courseAuditRecord=courseAuditRecordService.queryEntity(courseInfoEditParam.getCourseAuditId());
-        courseAuditRecord.setVerifyStatus("1");
-        courseAuditRecordService.editOne(courseAuditRecord);
+        //2.要查回关联的那条课程审核记录,同样修改状态变成待审核(2025.6.26废弃,修改课程只修改课程信息)
+//        CourseAuditRecord courseAuditRecord=courseAuditRecordService.queryEntity(courseInfoEditParam.getCourseAuditId());
+//        courseAuditRecord.setVerifyStatus("1");
+//        courseAuditRecordService.editOne(courseAuditRecord);
         return CommonResult.ok();
     }
 

+ 67 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/controller/ResourceFileController.java

@@ -0,0 +1,67 @@
+package vip.xiaonuo.disk.controller;
+
+import com.qiwenshare.common.anno.MyLog;
+import com.qiwenshare.common.result.RestResult;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.RestController;
+import vip.xiaonuo.auth.core.util.StpLoginUserUtil;
+import vip.xiaonuo.disk.dto.file.UploadFileDTO;
+import vip.xiaonuo.disk.service.ResourceFileService;
+import vip.xiaonuo.disk.vo.file.UploadFileVo;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+
+@Slf4j
+@Tag(name = "filetransfer", description = "该接口为文件传输接口,主要用来做文件的上传、下载和预览,用于在线教育单拆")
+@RestController
+@RequestMapping("/resourceFile")
+public class ResourceFileController {
+
+    @Resource
+    private ResourceFileService resourceFileService;
+
+    public static final String SUCCESS = "操作成功";
+
+    public static final String CURRENT_MODULE = "文件传输接口";
+
+    /**
+     * 上传前校验状况接口
+     * 校验是否已上传过无需上传
+     * 校验是否已有分片,并将上传好的分片返给前端
+     * */
+    @Operation(summary = "极速上传", description = "校验文件MD5判断文件是否存在,如果存在直接上传成功并返回skipUpload=true,如果不存在返回skipUpload=false需要再次调用该接口的POST方法", tags = {"filetransfer"})
+    @RequestMapping(value = "/uploadfile", method = RequestMethod.GET)
+    @MyLog(operation = "极速上传", module = CURRENT_MODULE)
+    @ResponseBody
+    public RestResult<UploadFileVo> uploadFileSpeed(HttpServletRequest request, UploadFileDTO uploadFileDto) {
+        String userId = StpLoginUserUtil.getLoginUser().getId();
+
+        UploadFileVo uploadFileVo = resourceFileService.uploadFileSpeed(request,userId,uploadFileDto);
+        return RestResult.success().data(uploadFileVo);
+
+    }
+
+
+    @Operation(summary = "上传文件", description = "真正的上传文件接口", tags = {"filetransfer"})
+    @RequestMapping(value = "/uploadfile", method = RequestMethod.POST)
+    @MyLog(operation = "上传文件", module = CURRENT_MODULE)
+    @ResponseBody
+    public RestResult<UploadFileVo> uploadFile(HttpServletRequest request, UploadFileDTO uploadFileDto) {
+        String userId = StpLoginUserUtil.getLoginUser().getId();
+
+        resourceFileService.uploadFile(request, uploadFileDto, userId);
+
+        UploadFileVo uploadFileVo = new UploadFileVo();
+
+
+        return RestResult.success().data(uploadFileVo);
+
+    }
+
+}

+ 45 - 29
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/domain/CourseAuditRecord.java

@@ -16,6 +16,8 @@ import com.baomidou.mybatisplus.annotation.*;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Getter;
 import lombok.Setter;
+import vip.xiaonuo.common.pojo.CommonEntity;
+
 import java.math.BigDecimal;
 import java.util.Date;
 
@@ -28,16 +30,16 @@ import java.util.Date;
 @Getter
 @Setter
 @TableName("COURSE_AUDIT_RECORD")
-public class CourseAuditRecord {
+public class CourseAuditRecord extends CommonEntity {
 
     /** 主键ID */
     @TableId
     @ApiModelProperty(value = "主键ID", position = 1)
     private String id;
 
-    /** 附件ID */
-    @ApiModelProperty(value = "附件ID", position = 2)
-    private String fileId;
+    /** 用户附件ID(RESOURCE_USERFILE的id) */
+    @ApiModelProperty(value = "用户附件ID(RESOURCE_USERFILE的id)", position = 2)
+    private String userfileId;
 
     /** 附件名称 */
     @ApiModelProperty(value = "附件名称", position = 2)
@@ -51,29 +53,43 @@ public class CourseAuditRecord {
     @ApiModelProperty(value = "审核状态id,0未发布,1待审核,2已发布,3未通过,4已删除", position = 3)
     private String verifyStatus;
 
-    /** 删除标记 */
-    @ApiModelProperty(value = "删除标记", position = 4)
-    @TableLogic
-    @TableField(fill = FieldFill.INSERT)
-    private String deleteFlag;
-
-    /** 创建时间 */
-    @ApiModelProperty(value = "创建时间", position = 5)
-    @TableField(fill = FieldFill.INSERT)
-    private Date createTime;
-
-    /** 创建人 */
-    @ApiModelProperty(value = "创建人", position = 6)
-    @TableField(fill = FieldFill.INSERT)
-    private String createUser;
-
-    /** 更新时间 */
-    @ApiModelProperty(value = "更新时间", position = 7)
-    @TableField(fill = FieldFill.UPDATE)
-    private Date updateTime;
-
-    /** 更新人 */
-    @ApiModelProperty(value = "更新人", position = 8)
-    @TableField(fill = FieldFill.UPDATE)
-    private String updateUser;
+    /** 所属院系ID */
+    @ApiModelProperty(value = "所属院系ID", position = 7)
+    private String collegeId;
+
+    /** 所属专业ID */
+    @ApiModelProperty(value = "所属专业ID", position = 19)
+    private String majorId;
+
+    /** 关键字 */
+    @ApiModelProperty(value = "关键字", position = 19)
+    private String keyword;
+
+    /** 关键字值 */
+    @ApiModelProperty(value = "关键字值", position = 19)
+    private String keywordValue;
+
+    /** 关键字拼音 */
+    @ApiModelProperty(value = "关键字拼音", position = 19)
+    private String keywordPinyin;
+
+    /** 二级院系ID */
+    @ApiModelProperty(value = "二级院系ID", position = 7)
+    private String collegeTwoId;
+
+    /** 三级院系ID */
+    @ApiModelProperty(value = "三级院系ID", position = 7)
+    private String collegeThreeId;
+
+    /** 课程类别ID */
+    @ApiModelProperty(value = "课程类别ID", position = 7)
+    private String courseType;
+
+    /** 是否推荐 */
+    @ApiModelProperty(value = "是否推荐,0否1是", position = 7)
+    private String isRecommend;
+
+    /** 是否热门 */
+    @ApiModelProperty(value = "是否热门,0否1是", position = 7)
+    private String isHot;
 }

+ 12 - 1
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/domain/CourseInfo.java

@@ -81,7 +81,7 @@ public class CourseInfo {
 
     /** 课程播放/浏览次数 */
     @ApiModelProperty(value = "课程播放/浏览次数", position = 13)
-    private Long viewCount;
+    private String viewCount;
 
     /** 删除标记 */
     @ApiModelProperty(value = "删除标记", position = 14)
@@ -116,4 +116,15 @@ public class CourseInfo {
     /** 审核状态id,0未发布,1待审核,2已发布,3未通过,4已删除 */
     @ApiModelProperty(value = "审核状态id,0未发布,1待审核,2已发布,3未通过,4已删除", position = 20)
     private String verifyStatus;
+
+    /**
+     * 是否有课程资源,0没有1有
+     */
+    @ApiModelProperty(value = "是否有课程资源,0没有1有", position = 13)
+    private String haveresource;
+
+    /** 课程信息 */
+    @ApiModelProperty(value = "课程信息", position = 13)
+    private String info;
+
 }

+ 109 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/domain/ResourceFile.java

@@ -0,0 +1,109 @@
+/*
+ * 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 cn.hutool.core.util.IdUtil;
+import com.baomidou.mybatisplus.annotation.*;
+import com.qiwenshare.common.util.DateUtil;
+import com.qiwenshare.ufop.operation.upload.domain.UploadFileResult;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * RESOURCE_FILE实体
+ *
+ * @author honorfire
+ * @date  2025/06/26 09:26
+ **/
+@Getter
+@Setter
+@TableName("RESOURCE_FILE")
+public class ResourceFile {
+
+    /** FILE_ID */
+    @TableId
+    @ApiModelProperty(value = "FILE_ID", position = 1)
+    private String fileId;
+
+    /** CREATE_TIME */
+    @ApiModelProperty(value = "CREATE_TIME", position = 2)
+    @TableField(fill = FieldFill.INSERT)
+    private String createTime;
+
+    /** CREATE_USER_ID */
+    @ApiModelProperty(value = "CREATE_USER_ID", position = 3)
+    private String createUserId;
+
+    /** FILE_SIZE */
+    @ApiModelProperty(value = "FILE_SIZE", position = 4)
+    private Long fileSize;
+
+    /** FILE_STATUS */
+    @ApiModelProperty(value = "FILE_STATUS", position = 5)
+    private Integer fileStatus;
+
+    /** FILE_URL */
+    @ApiModelProperty(value = "FILE_URL", position = 6)
+    private String fileUrl;
+
+    /** IDENTIFIER */
+    @ApiModelProperty(value = "IDENTIFIER", position = 7)
+    private String identifier;
+
+    /** MODIFY_TIME */
+    @ApiModelProperty(value = "MODIFY_TIME", position = 8)
+    private String modifyTime;
+
+    /** MODIFY_USER_ID */
+    @ApiModelProperty(value = "MODIFY_USER_ID", position = 9)
+    private String modifyUserId;
+
+    /** STORAGE_TYPE */
+    @ApiModelProperty(value = "STORAGE_TYPE", position = 10)
+    private Integer storageType;
+
+    /** FILE_RESOURCE */
+    @ApiModelProperty(value = "FILE_RESOURCE", position = 11)
+    private Integer fileResource;
+
+
+    public ResourceFile(){
+
+    }
+
+    public ResourceFile(UploadFileResult uploadFileResult) {
+        this.fileId = IdUtil.getSnowflakeNextIdStr();
+        this.fileUrl = uploadFileResult.getFileUrl();
+        this.fileSize = uploadFileResult.getFileSize();
+        this.fileStatus = 1;
+        this.storageType = uploadFileResult.getStorageType().getCode();
+        this.identifier = uploadFileResult.getIdentifier();
+        this.createTime = DateUtil.getCurrentTime();
+
+    }
+
+    public ResourceFile(String fileUrl, Long fileSize, Integer storageType, String identifier, String userId) {
+        this.fileId = IdUtil.getSnowflakeNextIdStr();
+        this.fileUrl = fileUrl;
+        this.fileSize = fileSize;
+        this.fileStatus = 1;
+        this.storageType = storageType;
+        this.identifier = identifier;
+        this.createTime = DateUtil.getCurrentTime();
+        this.createUserId = userId;
+
+    }
+}

+ 125 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/domain/ResourceUserFile.java

@@ -0,0 +1,125 @@
+/*
+ * 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 cn.hutool.core.util.IdUtil;
+import com.baomidou.mybatisplus.annotation.*;
+import com.qiwenshare.common.util.DateUtil;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+import vip.xiaonuo.disk.io.QiwenFile;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * RESOURCE_USERFILE实体
+ *
+ * @author honorfire
+ * @date  2025/06/26 09:29
+ **/
+@Getter
+@Setter
+@TableName("RESOURCE_USERFILE")
+public class ResourceUserFile {
+
+    /** USER_FILE_ID */
+    @TableId
+    @ApiModelProperty(value = "USER_FILE_ID", position = 1)
+    private String userFileId;
+
+    /** CREATE_TIME */
+    @ApiModelProperty(value = "CREATE_TIME", position = 2)
+    @TableField(fill = FieldFill.INSERT)
+    private String createTime;
+
+    /** CREATE_USER_ID */
+    @ApiModelProperty(value = "CREATE_USER_ID", position = 3)
+    private String createUserId;
+
+    /** DELETE_BATCH_NUM */
+    @ApiModelProperty(value = "DELETE_BATCH_NUM", position = 4)
+    private String deleteBatchNum;
+
+    /** DELETE_FLAG */
+    @ApiModelProperty(value = "DELETE_FLAG", position = 5)
+    @TableLogic
+    @TableField(fill = FieldFill.INSERT)
+    private Integer deleteFlag;
+
+    /** DELETE_TIME */
+    @ApiModelProperty(value = "DELETE_TIME", position = 6)
+    private String deleteTime;
+
+    /** EXTEND_NAME */
+    @ApiModelProperty(value = "EXTEND_NAME", position = 7)
+    private String extendName;
+
+    /** FILE_ID */
+    @ApiModelProperty(value = "FILE_ID", position = 8)
+    private String fileId;
+
+    /** FILE_NAME */
+    @ApiModelProperty(value = "FILE_NAME", position = 9)
+    private String fileName;
+
+    /** FILE_PATH */
+    @ApiModelProperty(value = "FILE_PATH", position = 10)
+    private String filePath;
+
+    /** IS_DIR */
+    @ApiModelProperty(value = "IS_DIR", position = 11)
+    private Integer isDir;
+
+    /** MODIFY_TIME */
+    @ApiModelProperty(value = "MODIFY_TIME", position = 12)
+    private String modifyTime;
+
+    /** MODIFY_USER_ID */
+    @ApiModelProperty(value = "MODIFY_USER_ID", position = 13)
+    private String modifyUserId;
+
+    /** UPLOAD_TIME */
+    @ApiModelProperty(value = "UPLOAD_TIME", position = 14)
+    private String uploadTime;
+
+    /** USER_ID */
+    @ApiModelProperty(value = "USER_ID", position = 15)
+    private String userId;
+
+    /** IS_COLLET */
+    @ApiModelProperty(value = "IS_COLLET", position = 16)
+    private String isCollet;
+
+
+    public ResourceUserFile() {};
+    public ResourceUserFile(QiwenFile qiwenFile, String userId, String fileId) {
+        this.userFileId = IdUtil.getSnowflakeNextIdStr();
+        this.userId = userId;
+        this.fileId = fileId;
+        this.filePath = qiwenFile.getParent();
+        this.fileName = qiwenFile.getNameNotExtend();
+        this.extendName = qiwenFile.getExtendName();
+        this.isDir = qiwenFile.isDirectory() ? 1 : 0;
+        String currentTime = DateUtil.getCurrentTime();
+        this.setUploadTime(currentTime);
+        this.setCreateUserId(userId);
+        this.setCreateTime(currentTime);
+        this.deleteFlag = 0;
+    }
+
+    public boolean isFile() {
+        return this.isDir == 0;
+    }
+}

+ 6 - 1
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/dto/courseInfo/CourseInfoAddParam.java

@@ -91,6 +91,11 @@ public class CourseInfoAddParam {
     /** 课程审核记录id */
     @ApiModelProperty(value = "课程审核记录id", position = 2)
     @NotBlank(message = "课程审核记录id不能为空")
-    private String courseAuditId;
+    private String courseAuditIds;
+
+    /** 课程信息 */
+    @ApiModelProperty(value = "课程信息", position = 13)
+    private String info;
+
 
 }

+ 5 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/dto/courseInfo/CourseInfoEditParam.java

@@ -97,4 +97,9 @@ public class CourseInfoEditParam {
     @NotBlank(message = "课程审核记录id不能为空")
     private String courseAuditId;
 
+    /** 课程信息 */
+    @ApiModelProperty(value = "课程信息", position = 13)
+    private String info;
+
+
 }

+ 50 - 4
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/dto/courseauditrecord/CourseAuditRecordAddParam.java

@@ -31,10 +31,10 @@ import java.util.Date;
 @Setter
 public class CourseAuditRecordAddParam {
 
-    /** 附件ID */
-    @ApiModelProperty(value = "附件ID", position = 2)
-    @NotBlank(message = "附件ID不能为空")
-    private String fileId;
+    /** 用户附件ID */
+    @ApiModelProperty(value = "用户附件ID", position = 2)
+    @NotBlank(message = "用户附件ID不能为空")
+    private String userfileIds;
 
     /** 附件名称 */
     @ApiModelProperty(value = "附件名称", position = 2)
@@ -48,4 +48,50 @@ public class CourseAuditRecordAddParam {
     @ApiModelProperty(value = "审核状态id,0未发布,1待审核,2已发布,3未通过,4已删除", position = 3)
     private String verifyStatus;
 
+    /** 所属院系ID */
+    @ApiModelProperty(value = "所属院系ID", position = 7)
+    @NotBlank(message = "所属院系ID不能为空")
+    private String collegeId;
+
+    /** 所属专业ID */
+    @ApiModelProperty(value = "所属专业ID", position = 19)
+    @NotBlank(message = "所属专业ID不能为空")
+    private String majorId;
+
+    /** 关键字 */
+    @ApiModelProperty(value = "关键字", position = 19)
+    @NotBlank(message = "关键字不能为空")
+    private String keyword;
+
+    /** 关键字值 */
+    @ApiModelProperty(value = "关键字值", position = 19)
+    @NotBlank(message = "关键字值不能为空")
+    private String keywordValue;
+
+    /** 关键字拼音 */
+    @ApiModelProperty(value = "关键字拼音", position = 19)
+    private String keywordPinyin;
+
+    /** 二级院系ID */
+    @ApiModelProperty(value = "二级院系ID", position = 7)
+    @NotBlank(message = "二级院系ID不能为空")
+    private String collegeTwoId;
+
+    /** 三级院系ID */
+    @ApiModelProperty(value = "三级院系ID", position = 7)
+    @NotBlank(message = "三级院系ID不能为空")
+    private String collegeThreeId;
+
+    /** 课程类别ID */
+    @ApiModelProperty(value = "课程类别ID", position = 7)
+    @NotBlank(message = "课程类别ID不能为空")
+    private String courseType;
+
+    /** 是否推荐 */
+    @ApiModelProperty(value = "是否推荐,0否1是", position = 7)
+    private String isRecommend;
+
+    /** 是否热门 */
+    @ApiModelProperty(value = "是否热门,0否1是", position = 7)
+    private String isHot;
 }

+ 51 - 3
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/dto/courseauditrecord/CourseAuditRecordEditParam.java

@@ -36,9 +36,9 @@ public class CourseAuditRecordEditParam {
     @NotBlank(message = "id不能为空")
     private String id;
 
-    /** 附件ID */
-    @ApiModelProperty(value = "附件ID", position = 2)
-    private String fileId;
+    /** 用户附件ID(RESOURCE_USERFILE的id) */
+    @ApiModelProperty(value = "用户附件ID(RESOURCE_USERFILE的id)", position = 2)
+    private String userFileId;
 
     /** 关联的课程ID */
     @ApiModelProperty(value = "关联的课程ID", position = 2)
@@ -48,4 +48,52 @@ public class CourseAuditRecordEditParam {
     @ApiModelProperty(value = "审核状态id,0未发布,1待审核,2已发布,3未通过,4已删除", position = 3)
     private String verifyStatus;
 
+    /** 所属院系ID */
+    @ApiModelProperty(value = "所属院系ID", position = 7)
+    private String collegeId;
+
+    /** 所属专业ID */
+    @ApiModelProperty(value = "所属专业ID", position = 19)
+    private String majorId;
+
+    /** 关键字 */
+    @ApiModelProperty(value = "关键字", position = 19)
+    private String keyword;
+
+    /** 关键字值 */
+    @ApiModelProperty(value = "关键字值", position = 19)
+    private String keywordValue;
+
+    /** 关键字拼音 */
+    @ApiModelProperty(value = "关键字拼音", position = 19)
+    private String keywordPinyin;
+
+    /** 二级院系ID */
+    @ApiModelProperty(value = "二级院系ID", position = 7)
+    private String collegeTwoId;
+
+    /** 三级院系ID */
+    @ApiModelProperty(value = "三级院系ID", position = 7)
+    private String collegeThreeId;
+
+    /** 课程类别ID */
+    @ApiModelProperty(value = "课程类别ID", position = 7)
+    private String courseType;
+
+    /** 是否推荐 */
+    @ApiModelProperty(value = "是否推荐,0否1是", position = 7)
+    private String isRecommend;
+
+    /** 是否热门 */
+    @ApiModelProperty(value = "是否热门,0否1是", position = 7)
+    private String isHot;
+
+    /** 资源信息 */
+    @ApiModelProperty(value = "资源信息", position = 7)
+    private String resourceDesc;
+
+    /** 资源封面id */
+    @ApiModelProperty(value = "资源封面id", position = 7)
+    private String coverImage;
+
 }

+ 70 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/dto/resourcefile/ResourceFileAddParam.java

@@ -0,0 +1,70 @@
+/*
+ * 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.dto.resourcefile;
+
+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;
+
+/**
+ * RESOURCE_FILE添加参数
+ *
+ * @author honorfire
+ * @date  2025/06/26 09:26
+ **/
+@Getter
+@Setter
+public class ResourceFileAddParam {
+
+    /** CREATE_USER_ID */
+    @ApiModelProperty(value = "CREATE_USER_ID", position = 3)
+    private String createUserId;
+
+    /** FILE_SIZE */
+    @ApiModelProperty(value = "FILE_SIZE", position = 4)
+    private Long fileSize;
+
+    /** FILE_STATUS */
+    @ApiModelProperty(value = "FILE_STATUS", position = 5)
+    private Integer fileStatus;
+
+    /** FILE_URL */
+    @ApiModelProperty(value = "FILE_URL", position = 6)
+    private String fileUrl;
+
+    /** IDENTIFIER */
+    @ApiModelProperty(value = "IDENTIFIER", position = 7)
+    private String identifier;
+
+    /** MODIFY_TIME */
+    @ApiModelProperty(value = "MODIFY_TIME", position = 8)
+    private String modifyTime;
+
+    /** MODIFY_USER_ID */
+    @ApiModelProperty(value = "MODIFY_USER_ID", position = 9)
+    private String modifyUserId;
+
+    /** STORAGE_TYPE */
+    @ApiModelProperty(value = "STORAGE_TYPE", position = 10)
+    private Integer storageType;
+
+    /** FILE_RESOURCE */
+    @ApiModelProperty(value = "FILE_RESOURCE", position = 11)
+    private Integer fileResource;
+
+}

+ 75 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/dto/resourcefile/ResourceFileEditParam.java

@@ -0,0 +1,75 @@
+/*
+ * 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.dto.resourcefile;
+
+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;
+
+/**
+ * RESOURCE_FILE编辑参数
+ *
+ * @author honorfire
+ * @date  2025/06/26 09:26
+ **/
+@Getter
+@Setter
+public class ResourceFileEditParam {
+
+    /** FILE_ID */
+    @ApiModelProperty(value = "FILE_ID", required = true, position = 1)
+    @NotBlank(message = "fileId不能为空")
+    private String fileId;
+
+    /** CREATE_USER_ID */
+    @ApiModelProperty(value = "CREATE_USER_ID", position = 3)
+    private String createUserId;
+
+    /** FILE_SIZE */
+    @ApiModelProperty(value = "FILE_SIZE", position = 4)
+    private Long fileSize;
+
+    /** FILE_STATUS */
+    @ApiModelProperty(value = "FILE_STATUS", position = 5)
+    private Integer fileStatus;
+
+    /** FILE_URL */
+    @ApiModelProperty(value = "FILE_URL", position = 6)
+    private String fileUrl;
+
+    /** IDENTIFIER */
+    @ApiModelProperty(value = "IDENTIFIER", position = 7)
+    private String identifier;
+
+    /** MODIFY_TIME */
+    @ApiModelProperty(value = "MODIFY_TIME", position = 8)
+    private String modifyTime;
+
+    /** MODIFY_USER_ID */
+    @ApiModelProperty(value = "MODIFY_USER_ID", position = 9)
+    private String modifyUserId;
+
+    /** STORAGE_TYPE */
+    @ApiModelProperty(value = "STORAGE_TYPE", position = 10)
+    private Integer storageType;
+
+    /** FILE_RESOURCE */
+    @ApiModelProperty(value = "FILE_RESOURCE", position = 11)
+    private Integer fileResource;
+
+}

+ 35 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/dto/resourcefile/ResourceFileIdParam.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.dto.resourcefile;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * RESOURCE_FILEId参数
+ *
+ * @author honorfire
+ * @date  2025/06/26 09:26
+ **/
+@Getter
+@Setter
+public class ResourceFileIdParam {
+
+    /** FILE_ID */
+    @ApiModelProperty(value = "FILE_ID", required = true)
+    @NotBlank(message = "fileId不能为空")
+    private String fileId;
+}

+ 51 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/dto/resourcefile/ResourceFilePageParam.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.dto.resourcefile;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * RESOURCE_FILE查询参数
+ *
+ * @author honorfire
+ * @date  2025/06/26 09:26
+ **/
+@Getter
+@Setter
+public class ResourceFilePageParam {
+
+    /** 当前页 */
+    @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;
+
+}

+ 86 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/dto/resourceuserfile/ResourceUserFileAddParam.java

@@ -0,0 +1,86 @@
+/*
+ * 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.dto.resourceuserfile;
+
+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;
+
+/**
+ * RESOURCE_USERFILE添加参数
+ *
+ * @author honorfire
+ * @date  2025/06/26 09:29
+ **/
+@Getter
+@Setter
+public class ResourceUserFileAddParam {
+
+    /** CREATE_USER_ID */
+    @ApiModelProperty(value = "CREATE_USER_ID", position = 3)
+    private String createUserId;
+
+    /** DELETE_BATCH_NUM */
+    @ApiModelProperty(value = "DELETE_BATCH_NUM", position = 4)
+    private String deleteBatchNum;
+
+    /** DELETE_TIME */
+    @ApiModelProperty(value = "DELETE_TIME", position = 6)
+    private String deleteTime;
+
+    /** EXTEND_NAME */
+    @ApiModelProperty(value = "EXTEND_NAME", position = 7)
+    private String extendName;
+
+    /** FILE_ID */
+    @ApiModelProperty(value = "FILE_ID", position = 8)
+    private String fileId;
+
+    /** FILE_NAME */
+    @ApiModelProperty(value = "FILE_NAME", position = 9)
+    private String fileName;
+
+    /** FILE_PATH */
+    @ApiModelProperty(value = "FILE_PATH", position = 10)
+    private String filePath;
+
+    /** IS_DIR */
+    @ApiModelProperty(value = "IS_DIR", position = 11)
+    private Integer isDir;
+
+    /** MODIFY_TIME */
+    @ApiModelProperty(value = "MODIFY_TIME", position = 12)
+    private String modifyTime;
+
+    /** MODIFY_USER_ID */
+    @ApiModelProperty(value = "MODIFY_USER_ID", position = 13)
+    private String modifyUserId;
+
+    /** UPLOAD_TIME */
+    @ApiModelProperty(value = "UPLOAD_TIME", position = 14)
+    private String uploadTime;
+
+    /** USER_ID */
+    @ApiModelProperty(value = "USER_ID", position = 15)
+    private Long userId;
+
+    /** IS_COLLET */
+    @ApiModelProperty(value = "IS_COLLET", position = 16)
+    private String isCollet;
+
+}

+ 91 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/dto/resourceuserfile/ResourceUserFileEditParam.java

@@ -0,0 +1,91 @@
+/*
+ * 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.dto.resourceuserfile;
+
+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;
+
+/**
+ * RESOURCE_USERFILE编辑参数
+ *
+ * @author honorfire
+ * @date  2025/06/26 09:29
+ **/
+@Getter
+@Setter
+public class ResourceUserFileEditParam {
+
+    /** USER_FILE_ID */
+    @ApiModelProperty(value = "USER_FILE_ID", required = true, position = 1)
+    @NotBlank(message = "userFileId不能为空")
+    private String userFileId;
+
+    /** CREATE_USER_ID */
+    @ApiModelProperty(value = "CREATE_USER_ID", position = 3)
+    private String createUserId;
+
+    /** DELETE_BATCH_NUM */
+    @ApiModelProperty(value = "DELETE_BATCH_NUM", position = 4)
+    private String deleteBatchNum;
+
+    /** DELETE_TIME */
+    @ApiModelProperty(value = "DELETE_TIME", position = 6)
+    private String deleteTime;
+
+    /** EXTEND_NAME */
+    @ApiModelProperty(value = "EXTEND_NAME", position = 7)
+    private String extendName;
+
+    /** FILE_ID */
+    @ApiModelProperty(value = "FILE_ID", position = 8)
+    private String fileId;
+
+    /** FILE_NAME */
+    @ApiModelProperty(value = "FILE_NAME", position = 9)
+    private String fileName;
+
+    /** FILE_PATH */
+    @ApiModelProperty(value = "FILE_PATH", position = 10)
+    private String filePath;
+
+    /** IS_DIR */
+    @ApiModelProperty(value = "IS_DIR", position = 11)
+    private Integer isDir;
+
+    /** MODIFY_TIME */
+    @ApiModelProperty(value = "MODIFY_TIME", position = 12)
+    private String modifyTime;
+
+    /** MODIFY_USER_ID */
+    @ApiModelProperty(value = "MODIFY_USER_ID", position = 13)
+    private String modifyUserId;
+
+    /** UPLOAD_TIME */
+    @ApiModelProperty(value = "UPLOAD_TIME", position = 14)
+    private String uploadTime;
+
+    /** USER_ID */
+    @ApiModelProperty(value = "USER_ID", position = 15)
+    private Long userId;
+
+    /** IS_COLLET */
+    @ApiModelProperty(value = "IS_COLLET", position = 16)
+    private String isCollet;
+
+}

+ 35 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/dto/resourceuserfile/ResourceUserFileIdParam.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.dto.resourceuserfile;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * RESOURCE_USERFILEId参数
+ *
+ * @author honorfire
+ * @date  2025/06/26 09:29
+ **/
+@Getter
+@Setter
+public class ResourceUserFileIdParam {
+
+    /** USER_FILE_ID */
+    @ApiModelProperty(value = "USER_FILE_ID", required = true)
+    @NotBlank(message = "userFileId不能为空")
+    private String userFileId;
+}

+ 51 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/dto/resourceuserfile/ResourceUserFilePageParam.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.dto.resourceuserfile;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * RESOURCE_USERFILE查询参数
+ *
+ * @author honorfire
+ * @date  2025/06/26 09:29
+ **/
+@Getter
+@Setter
+public class ResourceUserFilePageParam {
+
+    /** 当前页 */
+    @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;
+
+}

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

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

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

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

+ 80 - 22
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/mapper/mapping/CourseAuditRecordMapper.xml

@@ -5,28 +5,32 @@
     <select id="queryList" resultType="java.util.Map">
         SELECT
             t1.ID as id,
-            t1.FILE_ID AS fileId,
-            t1.FILE_NAME AS fileName,
-            t2.SUFFIX AS suffix,
-            t1.VERIFY_STATUS as verifyStatus,
+            t1.USERFILE_ID AS fileId,
+            t2.FILE_NAME AS fileName,
+            t2.EXTEND_NAME AS suffix,
+            t2.CREATE_TIME as uploadTime,
+            IFNULL (t1.VERIFY_STATUS,'') as verifyStatus,
             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_VERIFY_STATUS') )dd1 WHERE dd1.DICT_VALUE = TRIM(t1.VERIFY_STATUS) ),'') AS verifyStatusName,
-        <if test=" param.verifyStatus == 2 or param.verifyStatus == 3 or param.verifyStatus == 4">
-            t3.COLLEGE_ID AS collegeId,
-            t4.college_name AS collegeIdName,
-            t3.MAJOR_ID AS majorId,
-            t5.major_name AS majorIdName,
-            t3.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(t3.COURSE_TYPE) ),'') AS courseTypeName,
-            t1.COURSE_ID as courseId,
-        </if>
-            t2.CREATE_TIME as uploadTime
+            IFNULL (t1.COLLEGE_ID,'') AS collegeId,
+            IFNULL (t4.NAME,'') AS collegeIdName,
+            IFNULL (t1.COLLEGE_TWO_ID,'') AS collegeTwoId,
+            IFNULL (t42.NAME,'') AS collegeTwoIdName,
+            IFNULL (t1.COLLEGE_THREE_ID,'') AS collegeThreeId,
+            IFNULL (t43.NAME,'') AS collegeThreeIdName,
+            IFNULL (t1.MAJOR_ID,'') AS majorId,
+            IFNULL (t5.major_name,'') AS majorIdName,
+            IFNULL (t1.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(t1.COURSE_TYPE) ),'') AS courseTypeName,
+            IFNULL (t1.COURSE_ID,'') as courseId,
+            IFNULL (t3.COURSE_NAME,'') AS courseIdName
         FROM COURSE_AUDIT_RECORD t1
-        LEFT JOIN DEV_FILE t2 ON t2.id=t1.FILE_ID AND t2.DELETE_FLAG ='NOT_DELETE'
-        <if test=" param.verifyStatus == 2 or param.verifyStatus == 3 or param.verifyStatus == 4">
-            LEFT JOIN COURSE_INFO t3 ON t1.COURSE_ID =t3.COURSE_ID AND t3.DELETE_FLAG ='NOT_DELETE'
-            LEFT JOIN college t4 ON t3.COLLEGE_ID=t4.id AND t4.DELETE_FLAG ='NOT_DELETE'
-            LEFT JOIN major t5 ON t3.MAJOR_ID=t5.id AND t5.DELETE_FLAG ='NOT_DELETE'
-        </if>
+        LEFT JOIN RESOURCE_USERFILE t2 ON t2.USER_FILE_ID = t1.USERFILE_ID AND t2.DELETE_FLAG ='0'
+        LEFT JOIN COURSE_INFO t3 ON t1.COURSE_ID =t3.COURSE_ID AND t3.DELETE_FLAG ='NOT_DELETE'
+        LEFT JOIN college t4 ON t1.COLLEGE_ID=t4.id AND t4.DELETE_FLAG ='NOT_DELETE'
+        LEFT JOIN major t5 ON t1.MAJOR_ID=t5.id AND t5.DELETE_FLAG ='NOT_DELETE'
+        LEFT JOIN college t42 ON t1.COLLEGE_TWO_ID=t42.id AND t42.DELETE_FLAG ='NOT_DELETE'
+        LEFT JOIN college t43 ON t1.COLLEGE_THREE_ID=t43.id AND t43.DELETE_FLAG ='NOT_DELETE'
+        LEFT JOIN DEV_FILE t6 ON t1.COVER_IMAGE=t6.ID AND t6.DELETE_FLAG ='NOT_DELETE'
         WHERE t1.DELETE_FLAG ='NOT_DELETE'
         <if test="param.verifyStatus!=null and param.verifyStatus != ''">
             and t1.VERIFY_STATUS=#{param.verifyStatus}
@@ -38,9 +42,63 @@
             </foreach>
         </if>
         <if test="param.fileName!=null and param.fileName != ''">
-            and t2.NAME like CONCAT('%', #{param.fileName}, '%')
+            and t2.FILE_NAME like CONCAT('%', #{param.fileName}, '%')
+        </if>
+        <if test="param.collegeId!=null and param.collegeId != ''">
+            and t1.COLLEGE_ID=#{param.collegeId}
+        </if>
+        <if test="param.collegeTwoId!=null and param.collegeTwoId != ''">
+            and t1.COLLEGE_TWO_ID=#{param.collegeTwoId}
+        </if>
+        <if test="param.collegeThreeId!=null and param.collegeThreeId != ''">
+            and t1.COLLEGE_THREE_ID=#{param.collegeThreeId}
+        </if>
+        <if test="param.majorId!=null and param.majorId != ''">
+            and t1.MAJOR_ID=#{param.majorId}
+        </if>
+        <if test="param.courseType!=null and param.courseType != ''">
+            and t1.COURSE_TYPE=#{param.courseType}
+        </if>
+        <if test="param.suffix!=null and param.suffix != ''">
+            and t1.EXTEND_NAME like CONCAT('%',#{param.suffix}, '%')
         </if>
         order by t1.ID desc
     </select>
-    <select id="queryInfo" resultType="java.util.Map"></select>
+    <select id="queryInfo" resultType="java.util.Map">
+        SELECT
+            t1.ID as id,
+            t1.USERFILE_ID AS fileId,
+            t2.FILE_NAME AS fileName,
+            t2.EXTEND_NAME AS suffix,
+            t2.CREATE_TIME as uploadTime,
+            IFNULL (t1.VERIFY_STATUS,'') as verifyStatus,
+            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_VERIFY_STATUS') )dd1 WHERE dd1.DICT_VALUE = TRIM(t1.VERIFY_STATUS) ),'') AS verifyStatusName,
+            IFNULL (t1.COLLEGE_ID,'') AS collegeId,
+            IFNULL (t4.NAME,'') AS collegeIdName,
+            IFNULL (t1.COLLEGE_TWO_ID,'') AS collegeTwoId,
+            IFNULL (t42.NAME,'') AS collegeTwoIdName,
+            IFNULL (t1.COLLEGE_THREE_ID,'') AS collegeThreeId,
+            IFNULL (t43.NAME,'') AS collegeThreeIdName,
+            IFNULL (t1.MAJOR_ID,'') AS majorId,
+            IFNULL (t5.major_name,'') AS majorIdName,
+            IFNULL (t1.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(t1.COURSE_TYPE) ),'') AS courseTypeName,
+            IFNULL (t1.COURSE_ID,'') as courseId,
+            IFNULL (t3.COURSE_NAME,'') AS courseIdName,
+            IFNULL (t1.RESOURCE_DESC,'') AS resourceDesc,
+            IFNULL (t1.COVER_IMAGE,'') AS coverImage,
+            IFNULL (CAST(t6.DOWNLOAD_PATH AS VARCHAR),'') AS coverImagePath
+        FROM COURSE_AUDIT_RECORD t1
+        LEFT JOIN RESOURCE_USERFILE t2 ON t2.USER_FILE_ID = t1.USERFILE_ID AND t2.DELETE_FLAG ='0'
+        LEFT JOIN COURSE_INFO t3 ON t1.COURSE_ID =t3.COURSE_ID AND t3.DELETE_FLAG ='NOT_DELETE'
+        LEFT JOIN college t4 ON t1.COLLEGE_ID=t4.id AND t4.DELETE_FLAG ='NOT_DELETE'
+        LEFT JOIN major t5 ON t1.MAJOR_ID=t5.id AND t5.DELETE_FLAG ='NOT_DELETE'
+        LEFT JOIN college t42 ON t1.COLLEGE_TWO_ID=t42.id AND t42.DELETE_FLAG ='NOT_DELETE'
+        LEFT JOIN college t43 ON t1.COLLEGE_THREE_ID=t43.id AND t43.DELETE_FLAG ='NOT_DELETE'
+        LEFT JOIN DEV_FILE t6 ON t1.COVER_IMAGE=t6.ID AND t6.DELETE_FLAG ='NOT_DELETE'
+        WHERE t1.DELETE_FLAG ='NOT_DELETE'
+        <if test="id!=null and id != ''">
+            and t1.ID =#{id}
+        </if>
+    </select>
 </mapper>

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

@@ -11,14 +11,14 @@
             t1.TEACHER_ID as teacherId,
             t7.NAME AS teacherIdName,
             t1.COLLEGE_ID as collegeId,
-            t2.college_name AS collegeIdName,
+--             t2.college_name AS collegeIdName,
             t1.PUBLISH_TIME as publishTime,
             t1.TIME_LIMIT_TYPE as timeLimitType,
             t1.START_TIME as startTime,
             t1.END_TIME as endTime,
             t1.VIEW_COUNT as viewCount
         FROM COURSE_INFO t1
-        LEFT JOIN college t2 ON t1.COLLEGE_ID=t2.id AND t2.DELETE_FLAG ='NOT_DELETE'
+--         LEFT JOIN college t2 ON t1.COLLEGE_ID=t2.id AND t2.DELETE_FLAG ='NOT_DELETE'
         LEFT JOIN DEV_FILE t4 ON t1.COVER_IMAGE_ID =t4.ID AND t4.DELETE_FLAG ='NOT_DELETE'
         LEFT JOIN SYS_USER t7 ON t7.ID=t1.TEACHER_ID AND t7.DELETE_FLAG ='NOT_DELETE'
         WHERE t1.DELETE_FLAG ='NOT_DELETE'
@@ -34,7 +34,15 @@
         <if test="param.courseName !=null and param.courseName != ''">
             and t1.COURSE_NAME=#{param.courseName}
         </if>
-        order by t1.PUBLISH_TIME desc
+        <if test="param.sortflag !=null and param.sortflag != ''">
+            <if test=" param.sortflag == 0">
+                order by t1.PUBLISH_TIME desc
+            </if>
+            <if test=" param.sortflag == 1">
+                order by t1.VIEW_COUNT desc
+            </if>
+        </if>
+
     </select>
 
     <select id="queryInfo" parameterType="java.util.Map" resultType="java.util.Map">

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

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

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

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

+ 24 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/CourseAuditRecordService.java

@@ -39,6 +39,14 @@ public interface CourseAuditRecordService extends IService<CourseAuditRecord> {
      */
     Page<CourseAuditRecord> page(CourseAuditRecordPageParam courseAuditRecordPageParam);
 
+    /**
+     * 获取课程审核记录表列表
+     *
+     * @author honorfire
+     * @date  2025/06/20 14:58
+     */
+    List<CourseAuditRecord> queryCourseAuditRecordList(Map param);
+
     /**
      * 课程审核记录-添加
      *
@@ -47,6 +55,14 @@ public interface CourseAuditRecordService extends IService<CourseAuditRecord> {
      */
     CourseAuditRecord addOne(CourseAuditRecord courseAuditRecord);
 
+    /**
+     * 课程审核记录-批量添加
+     *
+     * @author honorfire
+     * @date  2025/06/20 14:58
+     */
+    void addBatch(List<CourseAuditRecord> courseAuditRecordList);
+
     /**
      * 添加课程审核记录表
      *
@@ -71,6 +87,14 @@ public interface CourseAuditRecordService extends IService<CourseAuditRecord> {
      */
     CourseAuditRecord editOne(CourseAuditRecord courseAuditRecord);
 
+    /**
+     * 课程审核记录-批量编辑
+     *
+     * @author honorfire
+     * @date  2025/06/20 14:58
+     */
+    void editBatch(List<CourseAuditRecord> courseAuditRecordList);
+
     /**
      * 删除课程审核记录表
      *

+ 5 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/CourseInfoService.java

@@ -101,6 +101,11 @@ public interface CourseInfoService extends IService<CourseInfo> {
      */
     Page<Map<String,Object>> queryList(Map param);
 
+    /**
+     *  课程信息-全量列表
+     */
+    List<CourseInfo> queryCourseInfoList(Map param);
+
     /**
      *  课程信息-详情
      */

+ 19 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/ResourceFileService.java

@@ -0,0 +1,19 @@
+package vip.xiaonuo.disk.service;
+
+import vip.xiaonuo.disk.domain.FileBean;
+import vip.xiaonuo.disk.dto.file.DownloadFileDTO;
+import vip.xiaonuo.disk.dto.file.PreviewDTO;
+import vip.xiaonuo.disk.dto.file.UploadFileDTO;
+import vip.xiaonuo.disk.vo.file.UploadFileVo;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+
+public interface ResourceFileService {
+
+    UploadFileVo uploadFileSpeed(HttpServletRequest request,String userId,UploadFileDTO uploadFileDTO);
+
+    void uploadFile(HttpServletRequest request, UploadFileDTO UploadFileDto, String userId);
+
+}

+ 81 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/ResourceUserfileService.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.ResourceUserFile;
+import vip.xiaonuo.disk.dto.resourceuserfile.ResourceUserFileAddParam;
+import vip.xiaonuo.disk.dto.resourceuserfile.ResourceUserFileEditParam;
+import vip.xiaonuo.disk.dto.resourceuserfile.ResourceUserFileIdParam;
+import vip.xiaonuo.disk.dto.resourceuserfile.ResourceUserFilePageParam;
+
+import java.util.List;
+
+/**
+ * RESOURCE_USERFILEService接口
+ *
+ * @author honorfire
+ * @date  2025/06/26 09:29
+ **/
+public interface ResourceUserfileService extends IService<ResourceUserFile> {
+
+    /**
+     * 获取RESOURCE_USERFILE分页
+     *
+     * @author honorfire
+     * @date  2025/06/26 09:29
+     */
+    Page<ResourceUserFile> page(ResourceUserFilePageParam ResourceUserFilePageParam);
+
+    /**
+     * 添加RESOURCE_USERFILE
+     *
+     * @author honorfire
+     * @date  2025/06/26 09:29
+     */
+    void add(ResourceUserFileAddParam ResourceUserFileAddParam);
+
+    /**
+     * 编辑RESOURCE_USERFILE
+     *
+     * @author honorfire
+     * @date  2025/06/26 09:29
+     */
+    void edit(ResourceUserFileEditParam ResourceUserFileEditParam);
+
+    /**
+     * 删除RESOURCE_USERFILE
+     *
+     * @author honorfire
+     * @date  2025/06/26 09:29
+     */
+    void delete(List<ResourceUserFileIdParam> ResourceUserFileIdParamList);
+
+    /**
+     * 获取RESOURCE_USERFILE详情
+     *
+     * @author honorfire
+     * @date  2025/06/26 09:29
+     */
+    ResourceUserFile detail(ResourceUserFileIdParam ResourceUserFileIdParam);
+
+    /**
+     * 获取RESOURCE_USERFILE详情
+     *
+     * @author honorfire
+     * @date  2025/06/26 09:29
+     **/
+    ResourceUserFile queryEntity(String id);
+
+}

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

@@ -30,8 +30,10 @@ import vip.xiaonuo.disk.dto.courseauditrecord.CourseAuditRecordAddParam;
 import vip.xiaonuo.disk.dto.courseauditrecord.CourseAuditRecordEditParam;
 import vip.xiaonuo.disk.dto.courseauditrecord.CourseAuditRecordIdParam;
 import vip.xiaonuo.disk.dto.courseauditrecord.CourseAuditRecordPageParam;
+import vip.xiaonuo.disk.dto.shareGroupuser.ShareGroupUser;
 import vip.xiaonuo.disk.mapper.CourseAuditRecordMapper;
 import vip.xiaonuo.disk.service.CourseAuditRecordService;
+import vip.xiaonuo.sys.modular.user.entity.SysUser;
 
 import javax.annotation.Resource;
 import java.util.List;
@@ -62,6 +64,31 @@ public class CourseAuditRecordServiceImpl extends ServiceImpl<CourseAuditRecordM
         return this.page(CommonPageRequest.defaultPage(), queryWrapper);
     }
 
+    @Override
+    public List<CourseAuditRecord> queryCourseAuditRecordList(Map param) {
+        QueryWrapper<CourseAuditRecord> queryWrapper = new QueryWrapper<>();
+        if (ObjectUtil.isNotEmpty(param.get("verifyStatus"))) {
+            queryWrapper.lambda().eq(CourseAuditRecord::getVerifyStatus, param.get("verifyStatus"));
+        }
+        if (ObjectUtil.isNotEmpty(param.get("courseId"))) {
+            queryWrapper.lambda().eq(CourseAuditRecord::getCourseId, param.get("courseId"));
+        }
+        return this.list(queryWrapper);
+    }
+
+    /**
+     * 课程审核记录-批量添加
+     *
+     * @author honorfire
+     * @date  2025/06/18 14:16
+     */
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void addBatch(List<CourseAuditRecord> courseAuditRecordList)
+    {
+        this.saveBatch(courseAuditRecordList);
+    }
+
     @Transactional(rollbackFor = Exception.class)
     @Override
     public void add(CourseAuditRecordAddParam courseAuditRecordAddParam) {
@@ -91,6 +118,19 @@ public class CourseAuditRecordServiceImpl extends ServiceImpl<CourseAuditRecordM
         return courseAuditRecord;
     }
 
+    /**
+     * 课程审核记录-批量更新
+     *
+     * @author honorfire
+     * @date  2025/06/18 14:16
+     */
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void editBatch(List<CourseAuditRecord> courseAuditRecordList)
+    {
+        this.updateBatchById(courseAuditRecordList);
+    }
+
     @Transactional(rollbackFor = Exception.class)
     @Override
     public void delete(List<CourseAuditRecordIdParam> courseAuditRecordIdParamList) {

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

@@ -24,6 +24,7 @@ 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.CourseAuditRecord;
 import vip.xiaonuo.disk.domain.CourseInfo;
 import vip.xiaonuo.disk.dto.courseInfo.CourseInfoAddParam;
 import vip.xiaonuo.disk.dto.courseInfo.CourseInfoEditParam;
@@ -117,6 +118,16 @@ public class CourseInfoServiceImpl extends ServiceImpl<CourseInfoMapper, CourseI
         return courseInfoMapper.queryList(param,CommonPageRequest.defaultPage());
     }
 
+    /**
+     *  课程信息-全量列表
+     */
+    @Override
+    public List<CourseInfo> queryCourseInfoList(Map param)
+    {
+        QueryWrapper<CourseInfo> queryWrapper = new QueryWrapper<>();
+        return this.list(queryWrapper);
+    }
+
 
     @Override
     public Map<String,Object> queryInfo(Map param)

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

@@ -0,0 +1,266 @@
+package vip.xiaonuo.disk.service.impl;
+
+import com.alibaba.fastjson2.JSON;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.qiwenshare.common.result.RestResult;
+import com.qiwenshare.common.util.DateUtil;
+import com.qiwenshare.ufop.constant.UploadFileStatusEnum;
+import com.qiwenshare.ufop.exception.operation.UploadException;
+import com.qiwenshare.ufop.factory.UFOPFactory;
+import com.qiwenshare.ufop.operation.upload.Uploader;
+import com.qiwenshare.ufop.operation.upload.domain.UploadFile;
+import com.qiwenshare.ufop.operation.upload.domain.UploadFileResult;
+import com.qiwenshare.ufop.util.UFOPUtils;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import vip.xiaonuo.auth.core.util.StpLoginUserUtil;
+import vip.xiaonuo.disk.component.FileDealComp;
+import vip.xiaonuo.disk.component.ResourceFileDealComp;
+import vip.xiaonuo.disk.domain.*;
+import vip.xiaonuo.disk.dto.file.UploadFileDTO;
+import vip.xiaonuo.disk.io.QiwenFile;
+import vip.xiaonuo.disk.mapper.*;
+import vip.xiaonuo.disk.service.ResourceFileService;
+import vip.xiaonuo.disk.util.OperationLogUtil;
+import vip.xiaonuo.disk.vo.file.UploadFileVo;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.awt.image.BufferedImage;
+import java.util.*;
+import java.util.concurrent.Executor;
+import java.util.concurrent.Executors;
+
+@Slf4j
+@Service
+@Transactional(rollbackFor=Exception.class)
+public class ResourceFileServiceImpl implements ResourceFileService {
+
+    @Resource
+    ResourceFileMapper resourceFileMapper;
+
+    @Resource
+    ResourceUserFileMapper resourceUserFileMapper;
+
+    @Resource
+    UFOPFactory ufopFactory;
+    @Resource
+    ResourceFileDealComp resourceFileDealComp;
+    @Resource
+    UploadTaskDetailMapper uploadTaskDetailMapper;
+    @Resource
+    UploadTaskMapper uploadTaskMapper;
+    @Resource
+    ImageMapper imageMapper;
+
+    @Resource
+    OperationLogUtil operationLogUtil;
+
+    public static final String SUCCESS = "操作成功";
+
+    public static final String CURRENT_MODULE = "文件传输接口";
+
+    public static final String FAIL = "操作失败";
+    public static Executor exec = Executors.newFixedThreadPool(300);
+
+    @Override
+    public UploadFileVo uploadFileSpeed(HttpServletRequest request,String userId,UploadFileDTO uploadFileDTO) {
+        UploadFileVo uploadFileVo = new UploadFileVo();
+        Map<String, Object> param = new HashMap<>();
+        param.put("identifier", uploadFileDTO.getIdentifier());
+        List<ResourceFile> list = resourceFileMapper.selectByMap(param);
+
+        String filePath = uploadFileDTO.getFilePath();
+        String relativePath = uploadFileDTO.getRelativePath();
+        QiwenFile qiwenFile = null;
+        if (relativePath.contains("/")) {
+            qiwenFile = new QiwenFile(filePath, relativePath, false);
+        } else {
+            qiwenFile = new QiwenFile(filePath, uploadFileDTO.getFilename(), false);
+        }
+
+        if (list != null && !list.isEmpty()) {
+            ResourceFile file = list.get(0);
+            ResourceUserFile resourceUserFile = new ResourceUserFile(qiwenFile, userId, file.getFileId());
+
+            try {
+                resourceUserFile.setIsCollet("0");
+                resourceUserFileMapper.insert(resourceUserFile);
+            } catch (Exception e) {
+                log.warn("极速上传文件冲突重命名处理: {}", JSON.toJSONString(resourceUserFile));
+
+            }
+
+//            if (relativePath.contains("/")) {
+//                QiwenFile finalQiwenFile = qiwenFile;
+//                exec.execute(()->{
+//                    resourceFileDealComp.restoreParentFilePath(finalQiwenFile, userId);
+//                });
+//
+//            }
+            uploadFileVo.setSkipUpload(true);
+
+        } else {
+            uploadFileVo.setSkipUpload(false);
+
+            List<Integer> uploaded = uploadTaskDetailMapper.selectUploadedChunkNumList(uploadFileDTO.getIdentifier());
+            if (uploaded != null && !uploaded.isEmpty()) {
+                uploadFileVo.setUploaded(uploaded);
+            } else {
+
+                LambdaQueryWrapper<UploadTask> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+                lambdaQueryWrapper.eq(UploadTask::getIdentifier, uploadFileDTO.getIdentifier());
+                List<UploadTask> rslist = uploadTaskMapper.selectList(lambdaQueryWrapper);
+                if (rslist == null || rslist.isEmpty()) {
+                    UploadTask uploadTask = new UploadTask();
+                    uploadTask.setIdentifier(uploadFileDTO.getIdentifier());
+                    uploadTask.setUploadTime(DateUtil.getCurrentTime());
+                    uploadTask.setUploadStatus(UploadFileStatusEnum.UNCOMPLATE.getCode());
+                    uploadTask.setFileName(qiwenFile.getNameNotExtend());
+                    uploadTask.setFilePath(qiwenFile.getParent());
+                    uploadTask.setExtendName(qiwenFile.getExtendName());
+                    uploadTask.setUserId(userId);
+                    uploadTaskMapper.insert(uploadTask);
+                }
+            }
+
+        }
+
+
+        return uploadFileVo;
+    }
+
+    @Override
+    public void uploadFile(HttpServletRequest request, UploadFileDTO uploadFileDto, String userId) {
+
+        UploadFile uploadFile = new UploadFile();
+        uploadFile.setChunkNumber(uploadFileDto.getChunkNumber());
+        uploadFile.setChunkSize(uploadFileDto.getChunkSize());
+        uploadFile.setTotalChunks(uploadFileDto.getTotalChunks());
+        uploadFile.setIdentifier(uploadFileDto.getIdentifier());
+        uploadFile.setTotalSize(uploadFileDto.getTotalSize());
+        uploadFile.setCurrentChunkSize(uploadFileDto.getCurrentChunkSize());
+
+        Uploader uploader = ufopFactory.getUploader();
+        if (uploader == null) {
+            log.error("上传失败,请检查storageType是否配置正确");
+            throw new UploadException("上传失败");
+        }
+        List<UploadFileResult> uploadFileResultList;
+        try {
+            uploadFileResultList = uploader.upload(request, uploadFile);
+        } catch (Exception e) {
+            log.error("上传失败,请检查UFOP连接配置是否正确");
+            throw new UploadException("上传失败", e);
+        }
+        for (int i = 0; i < uploadFileResultList.size(); i++){
+            UploadFileResult uploadFileResult = uploadFileResultList.get(i);
+            String relativePath = uploadFileDto.getRelativePath();
+            QiwenFile qiwenFile = null;
+            if (relativePath.contains("/")) {
+                qiwenFile = new QiwenFile(uploadFileDto.getFilePath(), relativePath, false);
+            } else {
+                qiwenFile = new QiwenFile(uploadFileDto.getFilePath(), uploadFileDto.getFilename(), false);
+            }
+
+            if (UploadFileStatusEnum.SUCCESS.equals(uploadFileResult.getStatus())){
+                ResourceFile resourceFile = new ResourceFile(uploadFileResult);
+                resourceFile.setCreateUserId(userId);
+                try {
+                    resourceFileMapper.insert(resourceFile);
+                } catch (Exception e) {
+                    log.warn("identifier Duplicate: {}", resourceFile.getIdentifier());
+                    resourceFile = resourceFileMapper.selectOne(new QueryWrapper<ResourceFile>().lambda().eq(ResourceFile::getIdentifier, resourceFile.getIdentifier()));
+                }
+
+                ResourceUserFile resourceUserFile = new ResourceUserFile(qiwenFile, userId, resourceFile.getFileId());
+
+
+                try {
+                    resourceUserFile.setIsCollet("0");
+                    resourceUserFileMapper.insert(resourceUserFile);
+
+                } catch (Exception e) {
+                    ResourceUserFile userFile1 = resourceUserFileMapper.selectOne(new QueryWrapper<ResourceUserFile>().lambda()
+                            .eq(ResourceUserFile::getUserId, resourceUserFile.getUserId())
+                            .eq(ResourceUserFile::getFilePath, resourceUserFile.getFilePath())
+                            .eq(ResourceUserFile::getFileName, resourceUserFile.getFileName())
+                            .eq(ResourceUserFile::getExtendName, resourceUserFile.getExtendName())
+                            .eq(ResourceUserFile::getDeleteFlag, resourceUserFile.getDeleteFlag())
+                            .eq(ResourceUserFile::getIsDir, resourceUserFile.getIsDir()));
+                    ResourceFile file1 = resourceFileMapper.selectById(userFile1.getFileId());
+                    if (!StringUtils.equals(resourceFile.getIdentifier(), file1.getIdentifier())) {
+                        log.warn("文件冲突重命名处理: {}", JSON.toJSONString(userFile1));
+                        String fileName = resourceFileDealComp.getRepeatFileName(resourceUserFile, resourceUserFile.getFilePath());
+                        resourceUserFile.setFileName(fileName);
+                        resourceUserFileMapper.insert(resourceUserFile);
+                    }
+                }
+
+
+                if (relativePath.contains("/")) {
+                    QiwenFile finalQiwenFile = qiwenFile;
+                    exec.execute(()->{
+                        resourceFileDealComp.restoreParentFilePath(finalQiwenFile, userId);
+                    });
+                }
+
+                LambdaQueryWrapper<UploadTaskDetail> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+                lambdaQueryWrapper.eq(UploadTaskDetail::getIdentifier, uploadFileDto.getIdentifier());
+                uploadTaskDetailMapper.delete(lambdaQueryWrapper);
+
+                LambdaUpdateWrapper<UploadTask> lambdaUpdateWrapper = new LambdaUpdateWrapper<>();
+                lambdaUpdateWrapper.set(UploadTask::getUploadStatus, UploadFileStatusEnum.SUCCESS.getCode())
+                        .eq(UploadTask::getIdentifier, uploadFileDto.getIdentifier());
+                uploadTaskMapper.update(null, lambdaUpdateWrapper);
+
+
+                try {
+                    if (UFOPUtils.isImageFile(uploadFileResult.getExtendName())) {
+                        BufferedImage src = uploadFileResult.getBufferedImage();
+                        Image image = new Image();
+                        image.setImageWidth(src.getWidth());
+                        image.setImageHeight(src.getHeight());
+                        image.setFileId(resourceFile.getFileId());
+                        imageMapper.insert(image);
+                    }
+                } catch (Exception e) {
+                    log.error("生成图片缩略图失败!", e);
+                }
+
+                resourceFileDealComp.parseMusicFile(uploadFileResult.getExtendName(), uploadFileResult.getStorageType().getCode(), uploadFileResult.getFileUrl(), resourceFile.getFileId());
+
+            } else if (UploadFileStatusEnum.UNCOMPLATE.equals(uploadFileResult.getStatus())) {
+                UploadTaskDetail uploadTaskDetail = new UploadTaskDetail();
+                uploadTaskDetail.setFilePath(qiwenFile.getParent());
+                uploadTaskDetail.setFilename(qiwenFile.getNameNotExtend());
+                uploadTaskDetail.setChunkNumber(uploadFileDto.getChunkNumber());
+                uploadTaskDetail.setChunkSize((int)uploadFileDto.getChunkSize());
+                uploadTaskDetail.setRelativePath(uploadFileDto.getRelativePath());
+                uploadTaskDetail.setTotalChunks(uploadFileDto.getTotalChunks());
+                uploadTaskDetail.setTotalSize((int)uploadFileDto.getTotalSize());
+                uploadTaskDetail.setIdentifier(uploadFileDto.getIdentifier());
+                uploadTaskDetailMapper.insert(uploadTaskDetail);
+
+            } else if (UploadFileStatusEnum.FAIL.equals(uploadFileResult.getStatus())) {
+                LambdaQueryWrapper<UploadTaskDetail> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+                lambdaQueryWrapper.eq(UploadTaskDetail::getIdentifier, uploadFileDto.getIdentifier());
+                uploadTaskDetailMapper.delete(lambdaQueryWrapper);
+
+                LambdaUpdateWrapper<UploadTask> lambdaUpdateWrapper = new LambdaUpdateWrapper<>();
+                lambdaUpdateWrapper.set(UploadTask::getUploadStatus, UploadFileStatusEnum.FAIL.getCode())
+                        .eq(UploadTask::getIdentifier, uploadFileDto.getIdentifier());
+                uploadTaskMapper.update(null, lambdaUpdateWrapper);
+            }
+        }
+
+    }
+
+
+
+}

+ 96 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/impl/ResourceUserfileServiceImpl.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.ResourceUserFile;
+import vip.xiaonuo.disk.dto.resourceuserfile.ResourceUserFileAddParam;
+import vip.xiaonuo.disk.dto.resourceuserfile.ResourceUserFileEditParam;
+import vip.xiaonuo.disk.dto.resourceuserfile.ResourceUserFileIdParam;
+import vip.xiaonuo.disk.dto.resourceuserfile.ResourceUserFilePageParam;
+import vip.xiaonuo.disk.mapper.ResourceUserFileMapper;
+import vip.xiaonuo.disk.service.ResourceUserfileService;
+
+import java.util.List;
+
+/**
+ * RESOURCE_USERFILEService接口实现类
+ *
+ * @author honorfire
+ * @date  2025/06/26 09:29
+ **/
+@Service
+public class ResourceUserfileServiceImpl extends ServiceImpl<ResourceUserFileMapper, ResourceUserFile> implements ResourceUserfileService {
+
+
+    @Override
+    public Page<ResourceUserFile> page(ResourceUserFilePageParam ResourceUserFilePageParam) {
+        QueryWrapper<ResourceUserFile> queryWrapper = new QueryWrapper<>();
+        if(ObjectUtil.isAllNotEmpty(ResourceUserFilePageParam.getSortField(), ResourceUserFilePageParam.getSortOrder())) {
+            CommonSortOrderEnum.validate(ResourceUserFilePageParam.getSortOrder());
+            queryWrapper.orderBy(true, ResourceUserFilePageParam.getSortOrder().equals(CommonSortOrderEnum.ASC.getValue()),
+                    StrUtil.toUnderlineCase(ResourceUserFilePageParam.getSortField()));
+        } else {
+            queryWrapper.lambda().orderByAsc(ResourceUserFile::getUserFileId);
+        }
+        return this.page(CommonPageRequest.defaultPage(), queryWrapper);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void add(ResourceUserFileAddParam ResourceUserFileAddParam) {
+        ResourceUserFile ResourceUserFile = BeanUtil.toBean(ResourceUserFileAddParam, ResourceUserFile.class);
+        this.save(ResourceUserFile);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void edit(ResourceUserFileEditParam ResourceUserFileEditParam) {
+        ResourceUserFile ResourceUserFile = this.queryEntity(ResourceUserFileEditParam.getUserFileId());
+        BeanUtil.copyProperties(ResourceUserFileEditParam, ResourceUserFile);
+        this.updateById(ResourceUserFile);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void delete(List<ResourceUserFileIdParam> ResourceUserFileIdParamList) {
+        // 执行删除
+        this.removeByIds(CollStreamUtil.toList(ResourceUserFileIdParamList, ResourceUserFileIdParam::getUserFileId));
+    }
+
+    @Override
+    public ResourceUserFile detail(ResourceUserFileIdParam ResourceUserFileIdParam) {
+        return this.queryEntity(ResourceUserFileIdParam.getUserFileId());
+    }
+
+    @Override
+    public ResourceUserFile queryEntity(String id) {
+        ResourceUserFile ResourceUserFile = this.getById(id);
+        if(ObjectUtil.isEmpty(ResourceUserFile)) {
+            throw new CommonException("RESOURCE_USERFILE不存在,id值为:{}", id);
+        }
+        return ResourceUserFile;
+    }
+
+}

+ 20 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/util/QiwenFileUtil.java

@@ -2,9 +2,12 @@ package vip.xiaonuo.disk.util;
 
 import cn.hutool.core.util.IdUtil;
 import com.qiwenshare.common.util.DateUtil;
+import vip.xiaonuo.disk.domain.ResourceUserFile;
 import vip.xiaonuo.disk.domain.UserFile;
 import vip.xiaonuo.disk.io.QiwenFile;
 
+import javax.annotation.Resource;
+
 public class QiwenFileUtil {
 
 
@@ -25,6 +28,23 @@ public class QiwenFileUtil {
         return userFile;
     }
 
+    public static ResourceUserFile getQiwenDirResource(String userId, String filePath, String fileName) {
+        ResourceUserFile userFile = new ResourceUserFile();
+        userFile.setUserFileId(IdUtil.getSnowflakeNextIdStr());
+        userFile.setUserId(userId);
+        userFile.setFileId(null);
+        userFile.setFileName(fileName);
+        userFile.setFilePath(QiwenFile.formatPath(filePath));
+        userFile.setExtendName(null);
+        userFile.setIsDir(1);
+        userFile.setUploadTime(DateUtil.getCurrentTime());
+        userFile.setCreateUserId(userId);
+        userFile.setCreateTime(DateUtil.getCurrentTime());
+        userFile.setDeleteFlag(0);
+        userFile.setDeleteBatchNum(null);
+        return userFile;
+    }
+
     public static UserFile getQiwenFile(String userId, String fileId, String filePath, String fileName, String extendName) {
         UserFile userFile = new UserFile();
         userFile.setUserFileId(IdUtil.getSnowflakeNextIdStr());