list = fileMapper.selectByMap(param);
+
+ if (list != null && !list.isEmpty()) { //文件已存在
+ fileId = list.get(0).getFileId();
+ } else { //文件不存在
+ fileInputStream = new FileInputStream(currentFile);
+ CopyFile createFile = new CopyFile();
+ createFile.setExtendName(FilenameUtils.getExtension(totalFileUrl));
+ String saveFileUrl = ufopFactory.getCopier().copy(fileInputStream, createFile);
+
+ FileBean tempFileBean = new FileBean(saveFileUrl, currentFile.length(), storageType, md5Str, userFile.getUserId());
+;
+ fileMapper.insert(tempFileBean);
+ fileId = tempFileBean.getFileId();
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ } finally {
+ IOUtils.closeQuietly(fileInputStream);
+ System.gc();
+ try {
+ Thread.sleep(100);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ currentFile.delete();
+ }
+
+
+ }
+
+
+ QiwenFile qiwenFile = null;
+ if (unzipMode == 0) {
+ qiwenFile = new QiwenFile(userFile.getFilePath(), entryName, currentFile.isDirectory());
+ } else if (unzipMode == 1) {
+ qiwenFile = new QiwenFile(userFile.getFilePath() + "/" + userFile.getFileName(), entryName, currentFile.isDirectory());
+ } else if (unzipMode == 2) {
+ qiwenFile = new QiwenFile(filePath, entryName, currentFile.isDirectory());
+ }
+
+ UserFile saveUserFile = new UserFile(qiwenFile, userFile.getUserId(), fileId);
+ String fileName = fileDealComp.getRepeatFileName(saveUserFile, saveUserFile.getFilePath());
+
+ if (saveUserFile.getIsDir() == 1 && !fileName.equals(saveUserFile.getFileName())) {
+ //如果是目录,而且重复,什么也不做
+ } else {
+ saveUserFile.setFileName(fileName);
+ userFileMapper.insert(saveUserFile);
+ }
+ fileDealComp.restoreParentFilePath(qiwenFile, userFile.getUserId());
+
+ return new AsyncResult<>("saveUnzipFile");
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/zhgd/xmgl/modules/basicdata/qiwen/component/FileDealComp.java b/src/main/java/com/zhgd/xmgl/modules/basicdata/qiwen/component/FileDealComp.java
new file mode 100644
index 0000000..a0db7b0
--- /dev/null
+++ b/src/main/java/com/zhgd/xmgl/modules/basicdata/qiwen/component/FileDealComp.java
@@ -0,0 +1,555 @@
+package com.zhgd.xmgl.modules.basicdata.qiwen.component;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.IdUtil;
+import com.alibaba.fastjson2.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 com.zhgd.xmgl.modules.basicdata.qiwen.api.IShareFileService;
+import com.zhgd.xmgl.modules.basicdata.qiwen.api.IShareService;
+import com.zhgd.xmgl.modules.basicdata.qiwen.config.es.FileSearch;
+import com.zhgd.xmgl.modules.basicdata.qiwen.domain.*;
+import com.zhgd.xmgl.modules.basicdata.qiwen.io.QiwenFile;
+import com.zhgd.xmgl.modules.basicdata.qiwen.mapper.FileMapper;
+import com.zhgd.xmgl.modules.basicdata.qiwen.mapper.MusicMapper;
+import com.zhgd.xmgl.modules.basicdata.qiwen.mapper.UserFileMapper;
+import com.zhgd.xmgl.modules.basicdata.qiwen.util.QiwenFileUtil;
+import com.zhgd.xmgl.modules.basicdata.qiwen.util.TreeNode;
+import com.zhgd.xmgl.security.SecurityUtil;
+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.stereotype.Component;
+
+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 FileDealComp {
+ @Resource
+ private UserFileMapper userFileMapper;
+ @Resource
+ private FileMapper fileMapper;
+ @Resource
+ private IShareService shareService;
+ @Resource
+ private IShareFileService shareFileService;
+ @Resource
+ private UFOPFactory ufopFactory;
+ @Resource
+ private MusicMapper musicMapper;
+
+ public static Executor exec = Executors.newFixedThreadPool(10);
+
+ /**
+ * 获取重复文件名
+ *
+ * 场景1: 文件还原时,在 savefilePath 路径下,保存 测试.txt 文件重名,则会生成 测试(1).txt
+ * 场景2: 上传文件时,在 savefilePath 路径下,保存 测试.txt 文件重名,则会生成 测试(1).txt
+ *
+ * @param userFile
+ * @param savefilePath
+ * @return
+ */
+ public String getRepeatFileName(UserFile userFile, String savefilePath) {
+ String fileName = userFile.getFileName();
+ String extendName = userFile.getExtendName();
+
+ String userId = userFile.getUserId();
+ int isDir = userFile.getIsDir();
+ LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>();
+ lambdaQueryWrapper.eq(UserFile::getFilePath, savefilePath)
+ .eq(UserFile::getDeleteFlag, 0)
+ .eq(UserFile::getUserId, userId)
+ .eq(UserFile::getFileName, fileName)
+ .eq(UserFile::getIsDir, isDir);
+ if (userFile.isFile()) {
+ lambdaQueryWrapper.eq(UserFile::getExtendName, extendName);
+ }
+ List list = userFileMapper.selectList(lambdaQueryWrapper);
+ if (CollectionUtils.isEmpty(list)) {
+ return fileName;
+ }
+
+ int i = 0;
+
+ while (!CollectionUtils.isEmpty(list)) {
+ i++;
+ LambdaQueryWrapper lambdaQueryWrapper1 = new LambdaQueryWrapper<>();
+ lambdaQueryWrapper1.eq(UserFile::getFilePath, savefilePath)
+ .eq(UserFile::getDeleteFlag, 0)
+ .eq(UserFile::getUserId, userId)
+ .eq(UserFile::getFileName, fileName + "(" + i + ")")
+ .eq(UserFile::getIsDir, isDir);
+ if (userFile.isFile()) {
+ lambdaQueryWrapper1.eq(UserFile::getExtendName, extendName);
+ }
+ list = userFileMapper.selectList(lambdaQueryWrapper1);
+
+ }
+
+ return fileName + "(" + i + ")";
+
+ }
+
+ /**
+ * 还原父文件路径
+ *
+ * 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 lambdaQueryWrapper = new LambdaQueryWrapper<>();
+ lambdaQueryWrapper.eq(UserFile::getFilePath, parentFilePath)
+ .eq(UserFile::getFileName, fileName)
+ .eq(UserFile::getDeleteFlag, 0)
+ .eq(UserFile::getIsDir, 1)
+ .eq(UserFile::getUserId, sessionUserId);
+ List userFileList = userFileMapper.selectList(lambdaQueryWrapper);
+ if (userFileList.size() == 0) {
+ UserFile userFile = QiwenFileUtil.getQiwenDir(sessionUserId, parentFilePath, fileName);
+ try {
+ userFileMapper.insert(userFile);
+ } catch (Exception e) {
+ if (e.getMessage().contains("Duplicate entry")) {
+ //ignore
+ } else {
+ log.error(e.getMessage());
+ }
+ }
+ }
+ qiwenFile = new QiwenFile(parentFilePath, true);
+ }
+ }
+
+
+ /**
+ * 删除重复的子目录文件
+ *
+ * 当还原目录的时候,如果其子目录在文件系统中已存在,则还原之后进行去重操作
+ *
+ * @param filePath
+ * @param sessionUserId
+ */
+ public void deleteRepeatSubDirFile(String filePath, String sessionUserId) {
+ log.debug("删除子目录:" + filePath);
+ LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>();
+
+ lambdaQueryWrapper.select(UserFile::getFileName, UserFile::getFilePath)
+ .likeRight(UserFile::getFilePath, QiwenFileUtil.formatLikePath(filePath))
+ .eq(UserFile::getIsDir, 1)
+ .eq(UserFile::getDeleteFlag, 0)
+ .eq(UserFile::getUserId, sessionUserId)
+ .groupBy(UserFile::getFilePath, UserFile::getFileName)
+ .having("count(fileName) >= 2");
+ List repeatList = userFileMapper.selectList(lambdaQueryWrapper);
+
+ for (UserFile userFile : repeatList) {
+ LambdaQueryWrapper lambdaQueryWrapper1 = new LambdaQueryWrapper<>();
+ lambdaQueryWrapper1.eq(UserFile::getFilePath, userFile.getFilePath())
+ .eq(UserFile::getFileName, userFile.getFileName())
+ .eq(UserFile::getDeleteFlag, "0");
+ List userFiles = userFileMapper.selectList(lambdaQueryWrapper1);
+ for (int i = 0; i < userFiles.size() - 1; i++) {
+ userFileMapper.deleteById(userFiles.get(i).getUserFileId());
+ }
+ }
+ }
+
+ /**
+ * 组织一个树目录节点,文件移动的时候使用
+ *
+ * @param treeNode
+ * @param id
+ * @param filePath
+ * @param nodeNameQueue
+ * @return
+ */
+ public TreeNode insertTreeNode(TreeNode treeNode, long id, String filePath, Queue nodeNameQueue) {
+
+ List childrenTreeNodes = treeNode.getChildren();
+ String currentNodeName = nodeNameQueue.peek();
+ if (currentNodeName == null) {
+ return treeNode;
+ }
+
+ QiwenFile qiwenFile = new QiwenFile(filePath, currentNodeName, true);
+ filePath = qiwenFile.getPath();
+
+ if (!isExistPath(childrenTreeNodes, currentNodeName)) { //1、判断有没有该子节点,如果没有则插入
+ //插入
+ TreeNode resultTreeNode = new TreeNode();
+
+ resultTreeNode.setFilePath(filePath);
+ resultTreeNode.setLabel(nodeNameQueue.poll());
+ resultTreeNode.setId(++id);
+
+ childrenTreeNodes.add(resultTreeNode);
+
+ } else { //2、如果有,则跳过
+ nodeNameQueue.poll();
+ }
+
+ if (nodeNameQueue.size() != 0) {
+ for (int i = 0; i < childrenTreeNodes.size(); i++) {
+
+ TreeNode childrenTreeNode = childrenTreeNodes.get(i);
+ if (currentNodeName.equals(childrenTreeNode.getLabel())) {
+ childrenTreeNode = insertTreeNode(childrenTreeNode, id * 10, filePath, nodeNameQueue);
+ childrenTreeNodes.remove(i);
+ childrenTreeNodes.add(childrenTreeNode);
+ treeNode.setChildren(childrenTreeNodes);
+ }
+
+ }
+ } else {
+ treeNode.setChildren(childrenTreeNodes);
+ }
+
+ return treeNode;
+
+ }
+
+ /**
+ * 判断该路径在树节点中是否已经存在
+ *
+ * @param childrenTreeNodes
+ * @param path
+ * @return
+ */
+ public boolean isExistPath(List childrenTreeNodes, String path) {
+ boolean isExistPath = false;
+
+ try {
+ for (TreeNode childrenTreeNode : childrenTreeNodes) {
+ if (path.equals(childrenTreeNode.getLabel())) {
+ isExistPath = true;
+ }
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+
+
+ return isExistPath;
+ }
+
+
+ public void uploadESByUserFileId(String userFileId) {
+
+ try {
+
+ Map param = new HashMap<>();
+ param.put("userFileId", userFileId);
+ List userfileResult = userFileMapper.selectByMap(param);
+ if (userfileResult != null && userfileResult.size() > 0) {
+ FileSearch fileSearch = new FileSearch();
+ BeanUtil.copyProperties(userfileResult.get(0), fileSearch);
+ /*if (fileSearch.getIsDir() == 0) {
+
+ Reader reader = ufopFactory.getReader(fileSearch.getStorageType());
+ ReadFile readFile = new ReadFile();
+ readFile.setFileUrl(fileSearch.getFileUrl());
+ String content = reader.read(readFile);
+ //全文搜索
+ fileSearch.setContent(content);
+
+ }*/
+// elasticsearchClient.index(i -> i.index("filesearch").id(fileSearch.getUserFileId()).document(fileSearch));
+ }
+ } catch (Exception e) {
+ log.debug("ES更新操作失败,请检查配置");
+ }
+
+ }
+
+// public void deleteESByUserFileId(String userFileId) {
+// exec.execute(() -> {
+// try {
+// elasticsearchClient.delete(d -> d
+// .index("filesearch")
+// .id(userFileId));
+// } catch (Exception e) {
+// log.debug("ES删除操作失败,请检查配置");
+// }
+// });
+//
+//
+// }
+
+ /**
+ * 根据用户传入的参数,判断是否有下载或者预览权限
+ *
+ * @return
+ */
+ public boolean checkAuthDownloadAndPreview(String shareBatchNum,
+ String extractionCode,
+ String token,
+ String userFileIds,
+ Integer platform) {
+ log.debug("权限检查开始:shareBatchNum:{}, extractionCode:{}, token:{}, userFileIds{}", shareBatchNum, extractionCode, token, userFileIds);
+ if (platform != null && platform == 2) {
+ return true;
+ }
+ String[] userFileIdArr = userFileIds.split(",");
+ for (String userFileId : userFileIdArr) {
+
+ UserFile userFile = userFileMapper.selectById(userFileId);
+ log.debug(JSON.toJSONString(userFile));
+ if ("undefined".equals(shareBatchNum) || StringUtils.isEmpty(shareBatchNum)) {
+
+ String userId = SecurityUtil.getUser().getUserId();
+ log.debug(JSON.toJSONString("当前登录session用户id:" + userId));
+ if (userId == null) {
+ return false;
+ }
+ log.debug("文件所属用户id:" + userFile.getUserId());
+ log.debug("登录用户id:" + userId);
+ if (!userFile.getUserId().equals(userId)) {
+ log.info("用户id不一致,权限校验失败");
+ return false;
+ }
+ } else {
+ Map param = new HashMap<>();
+ param.put("shareBatchNum", shareBatchNum);
+ List shareList = shareService.listByMap(param);
+ //判断批次号
+ if (shareList.size() <= 0) {
+ log.info("分享批次号不存在,权限校验失败");
+ return false;
+ }
+ Integer shareType = shareList.get(0).getShareType();
+ if (1 == shareType) {
+ //判断提取码
+ if (!shareList.get(0).getExtractionCode().equals(extractionCode)) {
+ log.info("提取码错误,权限校验失败");
+ return false;
+ }
+ }
+ param.put("userFileId", userFileId);
+ List shareFileList = shareFileService.listByMap(param);
+ if (shareFileList.size() <= 0) {
+ log.info("用户id和分享批次号不匹配,权限校验失败");
+ return false;
+ }
+
+ }
+
+ }
+ return true;
+ }
+
+ /**
+ * 拷贝文件
+ * 场景:修改的文件被多处引用时,需要重新拷贝一份,然后在新的基础上修改
+ *
+ * @param fileBean
+ * @param userFile
+ * @return
+ */
+ public String copyFile(FileBean fileBean, UserFile userFile) {
+ Copier copier = ufopFactory.getCopier();
+ Downloader downloader = ufopFactory.getDownloader(fileBean.getStorageType());
+ DownloadFile downloadFile = new DownloadFile();
+ downloadFile.setFileUrl(fileBean.getFileUrl());
+ CopyFile copyFile = new CopyFile();
+ copyFile.setExtendName(userFile.getExtendName());
+ String fileUrl = copier.copy(downloader.getInputStream(downloadFile), copyFile);
+ if (downloadFile.getOssClient() != null) {
+ downloadFile.getOssClient().shutdown();
+ }
+ fileBean.setFileUrl(fileUrl);
+ fileBean.setFileId(IdUtil.getSnowflakeNextIdStr());
+ fileMapper.insert(fileBean);
+ userFile.setFileId(fileBean.getFileId());
+ userFile.setUploadTime(DateUtil.getCurrentTime());
+ userFile.setModifyTime(DateUtil.getCurrentTime());
+ userFile.setModifyUserId(SessionUtil.getUserId());
+ userFileMapper.updateById(userFile);
+ return fileUrl;
+ }
+
+ public String getIdentifierByFile(String fileUrl, int storageType) throws IOException {
+ DownloadFile downloadFile = new DownloadFile();
+ downloadFile.setFileUrl(fileUrl);
+ InputStream inputStream = ufopFactory.getDownloader(storageType).getInputStream(downloadFile);
+ return DigestUtils.md5Hex(inputStream);
+ }
+
+ public void saveFileInputStream(int storageType, String fileUrl, InputStream inputStream) throws IOException {
+ Writer writer1 = ufopFactory.getWriter(storageType);
+ WriteFile writeFile = new WriteFile();
+ writeFile.setFileUrl(fileUrl);
+ int fileSize = inputStream.available();
+ writeFile.setFileSize(fileSize);
+ writer1.write(inputStream, writeFile);
+ }
+
+ public boolean isDirExist(String fileName, String filePath, String userId) {
+ LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>();
+ lambdaQueryWrapper.eq(UserFile::getFileName, fileName)
+ .eq(UserFile::getFilePath, QiwenFile.formatPath(filePath))
+ .eq(UserFile::getUserId, userId)
+ .eq(UserFile::getDeleteFlag, 0)
+ .eq(UserFile::getIsDir, 1);
+ List list = userFileMapper.selectList(lambdaQueryWrapper);
+ if (list != null && !list.isEmpty()) {
+ return true;
+ }
+ return false;
+ }
+
+
+ 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.setComment(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.setComment(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 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();
+ }
+ }
+ }
+ }
+
+}
diff --git a/src/main/java/com/zhgd/xmgl/modules/basicdata/qiwen/component/JwtComp.java b/src/main/java/com/zhgd/xmgl/modules/basicdata/qiwen/component/JwtComp.java
new file mode 100644
index 0000000..8cb7f36
--- /dev/null
+++ b/src/main/java/com/zhgd/xmgl/modules/basicdata/qiwen/component/JwtComp.java
@@ -0,0 +1,69 @@
+package com.zhgd.xmgl.modules.basicdata.qiwen.component;
+
+import com.alibaba.fastjson2.JSON;
+import com.qiwenshare.common.util.math.CalculatorUtils;
+import com.zhgd.xmgl.modules.basicdata.qiwen.config.jwt.JwtProperties;
+import io.jsonwebtoken.Claims;
+import io.jsonwebtoken.JwtBuilder;
+import io.jsonwebtoken.Jwts;
+import io.jsonwebtoken.SignatureAlgorithm;
+import io.jsonwebtoken.impl.DefaultClaims;
+import org.apache.commons.codec.binary.Base64;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import javax.crypto.SecretKey;
+import javax.crypto.spec.SecretKeySpec;
+import java.util.Date;
+import java.util.Map;
+
+@Component
+public class JwtComp {
+
+ @Resource
+ JwtProperties jwtProperties;
+
+
+ // 由字符串生成加密key
+ private SecretKey generalKey() {
+ // 本地的密码解码
+ byte[] encodedKey = Base64.decodeBase64(jwtProperties.getSecret());
+ // 根据给定的字节数组使用AES加密算法构造一个密钥
+ return new SecretKeySpec(encodedKey, 0, encodedKey.length, "AES");
+ }
+
+ // 创建jwt
+ public String createJWT(Map param) {
+ String subject = JSON.toJSONString(param);
+ // 生成JWT的时间
+ long nowTime = System.currentTimeMillis();
+ Date nowDate = new Date(nowTime);
+ // 生成签名的时候使用的秘钥secret,切记这个秘钥不能外露,是你服务端的私钥,在任何场景都不应该流露出去,一旦客户端得知这个secret,那就意味着客户端是可以自我签发jwt的
+ SecretKey key = generalKey();
+ Double expireTime = CalculatorUtils.conversion(jwtProperties.getPayload().getRegisterdClaims().getExp());
+
+ // 为payload添加各种标准声明和私有声明
+ DefaultClaims defaultClaims = new DefaultClaims();
+ defaultClaims.setIssuer(jwtProperties.getPayload().getRegisterdClaims().getIss());
+ defaultClaims.setExpiration(new Date(System.currentTimeMillis() + expireTime.longValue()));
+ defaultClaims.setSubject(subject);
+ defaultClaims.setAudience(jwtProperties.getPayload().getRegisterdClaims().getAud());
+
+ JwtBuilder builder = Jwts.builder() // 表示new一个JwtBuilder,设置jwt的body
+ .setClaims(defaultClaims)
+ .setIssuedAt(nowDate) // iat(issuedAt):jwt的签发时间
+ .signWith(SignatureAlgorithm.forName(jwtProperties.getHeader().getAlg()), key); // 设置签名,使用的是签名算法和签名使用的秘钥
+
+ return builder.compact();
+ }
+
+ // 解密jwt
+ public Claims parseJWT(String jwt) throws Exception {
+ SecretKey key = generalKey(); // 签名秘钥,和生成的签名的秘钥一模一样
+ return Jwts.parser() // 得到DefaultJwtParser
+ .setSigningKey(key) // 设置签名的秘钥
+ .parseClaimsJws(jwt).getBody();
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/zhgd/xmgl/modules/basicdata/qiwen/component/UserDealComp.java b/src/main/java/com/zhgd/xmgl/modules/basicdata/qiwen/component/UserDealComp.java
new file mode 100644
index 0000000..b6f21fa
--- /dev/null
+++ b/src/main/java/com/zhgd/xmgl/modules/basicdata/qiwen/component/UserDealComp.java
@@ -0,0 +1,58 @@
+package com.zhgd.xmgl.modules.basicdata.qiwen.component;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.qiwenshare.common.constant.RegexConstant;
+import com.zhgd.xmgl.modules.basicdata.entity.SystemUser;
+import com.zhgd.xmgl.modules.basicdata.mapper.SystemUserMapper;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.regex.Pattern;
+
+@Component
+public class UserDealComp {
+ @Resource
+ SystemUserMapper systemUserMapper;
+
+
+ /**
+ * 检测用户名是否存在
+ *
+ * @param systemUser
+ */
+ public Boolean isUserNameExit(SystemUser systemUser) {
+ LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>();
+ lambdaQueryWrapper.eq(SystemUser::getAccount, systemUser.getAccount());
+ List list = systemUserMapper.selectList(lambdaQueryWrapper);
+ if (list != null && !list.isEmpty()) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ /**
+ * 检测手机号是否存在
+ *
+ * @param systemUser
+ * @return
+ */
+ public Boolean isPhoneExit(SystemUser systemUser) {
+
+ LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>();
+ lambdaQueryWrapper.eq(SystemUser::getUserTel, systemUser.getUserTel());
+ List list = systemUserMapper.selectList(lambdaQueryWrapper);
+ if (list != null && !list.isEmpty()) {
+ return true;
+ } else {
+ return false;
+ }
+
+ }
+
+ public Boolean isPhoneFormatRight(String phone){
+ boolean isRight = Pattern.matches(RegexConstant.PASSWORD_REGEX, phone);
+ return isRight;
+ }
+}
diff --git a/src/main/java/com/zhgd/xmgl/modules/basicdata/qiwen/config/es/FileSearch.java b/src/main/java/com/zhgd/xmgl/modules/basicdata/qiwen/config/es/FileSearch.java
new file mode 100644
index 0000000..ed5a0de
--- /dev/null
+++ b/src/main/java/com/zhgd/xmgl/modules/basicdata/qiwen/config/es/FileSearch.java
@@ -0,0 +1,26 @@
+package com.zhgd.xmgl.modules.basicdata.qiwen.config.es;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import lombok.Data;
+
+@Data
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class FileSearch {
+ private String indexName;
+ private String userFileId;
+ private String fileId;
+ private String fileName;
+ private String content;
+ private String fileUrl;
+ private Long fileSize;
+ private Integer storageType;
+ private String identifier;
+ private Long userId;
+ private String filePath;
+ private String extendName;
+ private Integer isDir;
+ private String uploadTime;
+ private Integer deleteFlag;
+ private String deleteTime;
+ private String deleteBatchNum;
+}
diff --git a/src/main/java/com/zhgd/xmgl/modules/basicdata/qiwen/config/jwt/JwtHeader.java b/src/main/java/com/zhgd/xmgl/modules/basicdata/qiwen/config/jwt/JwtHeader.java
new file mode 100644
index 0000000..67b816c
--- /dev/null
+++ b/src/main/java/com/zhgd/xmgl/modules/basicdata/qiwen/config/jwt/JwtHeader.java
@@ -0,0 +1,9 @@
+package com.zhgd.xmgl.modules.basicdata.qiwen.config.jwt;
+
+import lombok.Data;
+
+@Data
+public class JwtHeader {
+ private String alg;
+ private String typ;
+}
diff --git a/src/main/java/com/zhgd/xmgl/modules/basicdata/qiwen/config/jwt/JwtPayload.java b/src/main/java/com/zhgd/xmgl/modules/basicdata/qiwen/config/jwt/JwtPayload.java
new file mode 100644
index 0000000..e443207
--- /dev/null
+++ b/src/main/java/com/zhgd/xmgl/modules/basicdata/qiwen/config/jwt/JwtPayload.java
@@ -0,0 +1,10 @@
+package com.zhgd.xmgl.modules.basicdata.qiwen.config.jwt;
+
+import lombok.Data;
+
+@Data
+public class JwtPayload {
+ private RegisterdClaims registerdClaims;
+
+}
+
diff --git a/src/main/java/com/zhgd/xmgl/modules/basicdata/qiwen/config/jwt/JwtProperties.java b/src/main/java/com/zhgd/xmgl/modules/basicdata/qiwen/config/jwt/JwtProperties.java
new file mode 100644
index 0000000..dbcffb2
--- /dev/null
+++ b/src/main/java/com/zhgd/xmgl/modules/basicdata/qiwen/config/jwt/JwtProperties.java
@@ -0,0 +1,15 @@
+package com.zhgd.xmgl.modules.basicdata.qiwen.config.jwt;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+@Data
+@Component
+@ConfigurationProperties(prefix = "jwt")
+public class JwtProperties {
+ private String secret;
+ private JwtHeader header;
+ private JwtPayload payload;
+}
+
diff --git a/src/main/java/com/zhgd/xmgl/modules/basicdata/qiwen/config/jwt/RegisterdClaims.java b/src/main/java/com/zhgd/xmgl/modules/basicdata/qiwen/config/jwt/RegisterdClaims.java
new file mode 100644
index 0000000..0f56801
--- /dev/null
+++ b/src/main/java/com/zhgd/xmgl/modules/basicdata/qiwen/config/jwt/RegisterdClaims.java
@@ -0,0 +1,11 @@
+package com.zhgd.xmgl.modules.basicdata.qiwen.config.jwt;
+
+import lombok.Data;
+
+@Data
+public class RegisterdClaims {
+ private String iss;
+ private String exp;
+ private String sub;
+ private String aud;
+}
diff --git a/src/main/java/com/zhgd/xmgl/modules/basicdata/qiwen/config/threadpool/AsyncThreadPoolAutoConfiguration.java b/src/main/java/com/zhgd/xmgl/modules/basicdata/qiwen/config/threadpool/AsyncThreadPoolAutoConfiguration.java
new file mode 100644
index 0000000..19d08a8
--- /dev/null
+++ b/src/main/java/com/zhgd/xmgl/modules/basicdata/qiwen/config/threadpool/AsyncThreadPoolAutoConfiguration.java
@@ -0,0 +1,85 @@
+package com.zhgd.xmgl.modules.basicdata.qiwen.config.threadpool;
+
+
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.scheduling.annotation.AsyncConfigurer;
+import org.springframework.scheduling.annotation.EnableAsync;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+import org.springframework.stereotype.Component;
+
+import java.util.Objects;
+import java.util.concurrent.Executor;
+import java.util.concurrent.ThreadPoolExecutor;
+
+/**
+ * 异步线程池配置 AsyncConfigurer在applicationContext早期初始化,如果需要依赖于其它的bean,尽可能的将它们声明为lazy
+ */
+@Slf4j
+@EnableAsync
+@Component
+@EnableConfigurationProperties(AsyncThreadPoolProperties.class)
+public class AsyncThreadPoolAutoConfiguration implements AsyncConfigurer {
+
+ @Autowired
+ private AsyncThreadPoolProperties asyncThreadPoolProperties;
+
+ /**
+ * 定义线程池
+ * 使用{@link java.util.concurrent.LinkedBlockingQueue}(FIFO)队列,是一个用于并发环境下的阻塞队列集合类
+ * ThreadPoolTaskExecutor不是完全被IOC容器管理的bean,可以在方法上加上@Bean注解交给容器管理,这样可以将taskExecutor.initialize()方法调用去掉,容器会自动调用
+ *
+ * @return
+ */
+ @Bean("asyncTaskExecutor")
+ @Override
+ public Executor getAsyncExecutor() {
+ //Java虚拟机可用的处理器数
+ int processors = Runtime.getRuntime().availableProcessors();
+ //定义线程池
+ ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
+ //核心线程数
+ taskExecutor.setCorePoolSize(Objects.nonNull(asyncThreadPoolProperties.getCorePoolSize()) ? asyncThreadPoolProperties.getCorePoolSize() : processors);
+ //线程池最大线程数,默认:40000
+ taskExecutor.setMaxPoolSize(Objects.nonNull(asyncThreadPoolProperties.getMaxPoolSize()) ? asyncThreadPoolProperties.getMaxPoolSize() : 40000);
+ //线程队列最大线程数,默认:80000
+ taskExecutor.setQueueCapacity(Objects.nonNull(asyncThreadPoolProperties.getMaxPoolSize()) ? asyncThreadPoolProperties.getMaxPoolSize() : 80000);
+ //线程名称前缀
+ taskExecutor.setThreadNamePrefix(StringUtils.isNotEmpty(asyncThreadPoolProperties.getThreadNamePrefix()) ? asyncThreadPoolProperties.getThreadNamePrefix() : "Async-ThreadPool-");
+ //线程池中线程最大空闲时间,默认:60,单位:秒
+ taskExecutor.setKeepAliveSeconds(asyncThreadPoolProperties.getKeepAliveSeconds());
+ //核心线程是否允许超时,默认:false
+ taskExecutor.setAllowCoreThreadTimeOut(asyncThreadPoolProperties.isAllowCoreThreadTimeOut());
+ //IOC容器关闭时是否阻塞等待剩余的任务执行完成,默认:false(必须设置setAwaitTerminationSeconds)
+ taskExecutor.setWaitForTasksToCompleteOnShutdown(asyncThreadPoolProperties.isWaitForTasksToCompleteOnShutdown());
+ //阻塞IOC容器关闭的时间,默认:10秒(必须设置setWaitForTasksToCompleteOnShutdown)
+ taskExecutor.setAwaitTerminationSeconds(asyncThreadPoolProperties.getAwaitTerminationSeconds());
+ /**
+ * 拒绝策略,默认是AbortPolicy
+ * AbortPolicy:丢弃任务并抛出RejectedExecutionException异常
+ * DiscardPolicy:丢弃任务但不抛出异常
+ * DiscardOldestPolicy:丢弃最旧的处理程序,然后重试,如果执行器关闭,这时丢弃任务
+ * CallerRunsPolicy:执行器执行任务失败,则在策略回调方法中执行任务,如果执行器关闭,这时丢弃任务
+ */
+ taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy());
+ //初始化
+ //taskExecutor.initialize();
+
+ return taskExecutor;
+ }
+
+ /**
+ * 异步方法执行的过程中抛出的异常捕获
+ *
+ * @return AsyncUncaughtExceptionHandler
+ */
+ @Override
+ public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
+ return new BaseAsyncUncaughtExceptionHandler();
+ }
+}
+
diff --git a/src/main/java/com/zhgd/xmgl/modules/basicdata/qiwen/config/threadpool/AsyncThreadPoolProperties.java b/src/main/java/com/zhgd/xmgl/modules/basicdata/qiwen/config/threadpool/AsyncThreadPoolProperties.java
new file mode 100644
index 0000000..8996fff
--- /dev/null
+++ b/src/main/java/com/zhgd/xmgl/modules/basicdata/qiwen/config/threadpool/AsyncThreadPoolProperties.java
@@ -0,0 +1,51 @@
+package com.zhgd.xmgl.modules.basicdata.qiwen.config.threadpool;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+
+/**
+ * 异步线程池配置文件
+ */
+@Data
+@ConfigurationProperties(prefix = "spring.async-thread-pool")
+public class AsyncThreadPoolProperties {
+ /**
+ * 是否启动异步线程池,默认 false
+ */
+ private boolean enable;
+ /**
+ * 核心线程数,默认:Java虚拟机可用线程数
+ */
+ private Integer corePoolSize=8;
+ /**
+ * 线程池最大线程数,默认:40000
+ */
+ private Integer maxPoolSize=500;
+ /**
+ * 线程队列最大线程数,默认:80000
+ */
+ private Integer queueCapacity = 5;
+
+ /**
+ * 线程池中线程最大空闲时间,默认:60,单位:秒
+ */
+ private Integer keepAliveSeconds = 600;
+ /**
+ * 自定义线程名前缀,默认:Async-ThreadPool-
+ */
+ private String threadNamePrefix = "async-threadpool-";
+ /**
+ * 核心线程是否允许超时,默认false
+ */
+ private boolean allowCoreThreadTimeOut;
+ /**
+ * IOC容器关闭时是否阻塞等待剩余的任务执行完成,默认:false(必须设置setAwaitTerminationSeconds)
+ */
+ private boolean waitForTasksToCompleteOnShutdown;
+ /**
+ * 阻塞IOC容器关闭的时间,默认:10秒(必须设置setWaitForTasksToCompleteOnShutdown)
+ */
+ private int awaitTerminationSeconds = 10;
+
+}
+
diff --git a/src/main/java/com/zhgd/xmgl/modules/basicdata/qiwen/config/threadpool/BaseAsyncUncaughtExceptionHandler.java b/src/main/java/com/zhgd/xmgl/modules/basicdata/qiwen/config/threadpool/BaseAsyncUncaughtExceptionHandler.java
new file mode 100644
index 0000000..f38f346
--- /dev/null
+++ b/src/main/java/com/zhgd/xmgl/modules/basicdata/qiwen/config/threadpool/BaseAsyncUncaughtExceptionHandler.java
@@ -0,0 +1,16 @@
+package com.zhgd.xmgl.modules.basicdata.qiwen.config.threadpool;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;
+
+import java.lang.reflect.Method;
+import java.util.Arrays;
+
+@Slf4j
+public class BaseAsyncUncaughtExceptionHandler implements AsyncUncaughtExceptionHandler {
+ @Override
+ public void handleUncaughtException(Throwable throwable, Method method, Object... objects) {
+ log.error("捕获线程异常method[{}] params{}", method, Arrays.toString(objects));
+ log.error("线程异常");
+ }
+}
diff --git a/src/main/java/com/zhgd/xmgl/modules/basicdata/qiwen/controller/CommonFileController.java b/src/main/java/com/zhgd/xmgl/modules/basicdata/qiwen/controller/CommonFileController.java
new file mode 100644
index 0000000..c7eee5c
--- /dev/null
+++ b/src/main/java/com/zhgd/xmgl/modules/basicdata/qiwen/controller/CommonFileController.java
@@ -0,0 +1,110 @@
+package com.zhgd.xmgl.modules.basicdata.qiwen.controller;
+
+import cn.hutool.core.util.IdUtil;
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.qiwenshare.common.anno.MyLog;
+import com.qiwenshare.common.result.RestResult;
+import com.qiwenshare.common.util.security.JwtUser;
+import com.qiwenshare.common.util.security.SessionUtil;
+import com.zhgd.xmgl.modules.basicdata.qiwen.api.ICommonFileService;
+import com.zhgd.xmgl.modules.basicdata.qiwen.api.IFilePermissionService;
+import com.zhgd.xmgl.modules.basicdata.qiwen.api.IUserFileService;
+import com.zhgd.xmgl.modules.basicdata.qiwen.domain.CommonFile;
+import com.zhgd.xmgl.modules.basicdata.qiwen.domain.FilePermission;
+import com.zhgd.xmgl.modules.basicdata.qiwen.domain.UserFile;
+import com.zhgd.xmgl.modules.basicdata.qiwen.dto.commonfile.CommonFileDTO;
+import com.zhgd.xmgl.modules.basicdata.qiwen.io.QiwenFile;
+import com.zhgd.xmgl.modules.basicdata.qiwen.vo.commonfile.CommonFileListVo;
+import com.zhgd.xmgl.modules.basicdata.qiwen.vo.commonfile.CommonFileUser;
+import com.zhgd.xmgl.modules.basicdata.qiwen.vo.file.FileListVO;
+import io.swagger.annotations.Api;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.List;
+
+@Api(description = "该接口为文件共享接口")
+@RestController
+@Slf4j
+@RequestMapping("/common")
+public class CommonFileController {
+
+ public static final String CURRENT_MODULE = "文件共享";
+
+ @Resource
+ ICommonFileService commonFileService;
+ @Resource
+ IFilePermissionService filePermissionService;
+ @Resource
+ IUserFileService userFileService;
+
+ @Operation(summary = "将文件共享给他人", description = "共享文件统一接口", tags = {"common"})
+ @PostMapping(value = "/commonfile")
+ @ResponseBody
+ public RestResult commonFile(@RequestBody CommonFileDTO commonFileDTO) {
+ CommonFile commonFile = new CommonFile();
+ commonFile.setUserFileId(commonFileDTO.getUserFileId());
+ commonFile.setCommonFileId(IdUtil.getSnowflakeNextIdStr());
+
+ commonFileService.save(commonFile);
+
+ List list = JSON.parseArray(commonFileDTO.getCommonUserList(), FilePermission.class);
+
+ List filePermissionList = new ArrayList<>();
+ for (FilePermission filePermission : list) {
+ filePermission.setFilePermissionId(IdUtil.getSnowflakeNextId());
+ filePermission.setCommonFileId(commonFile.getCommonFileId());
+ filePermissionList.add(filePermission);
+ }
+ filePermissionService.saveBatch(filePermissionList);
+
+ return RestResult.success();
+ }
+
+ @Operation(summary = "获取共享空间的全量用户列表", description = "共享文件用户接口", tags = {"common"})
+ @GetMapping(value = "/commonfileuser")
+ @MyLog(operation = "共享文件用户", module = CURRENT_MODULE)
+ @ResponseBody
+ public RestResult> commonFileUserList() {
+
+ JwtUser sessionUserBean = SessionUtil.getSession();
+ List list = commonFileService.selectCommonFileUser(sessionUserBean.getUserId());
+ return RestResult.success().data(list);
+ }
+
+ @Operation(summary = "获取共享用户文件列表", description = "用来做前台列表展示", tags = {"file"})
+ @RequestMapping(value = "/getCommonFileByUser", method = RequestMethod.GET)
+ @ResponseBody
+ public RestResult getCommonFileByUser(
+ @Parameter(description = "用户id", required = true) String userId){
+ JwtUser sessionUserBean = SessionUtil.getSession();
+ List commonFileVo = commonFileService.selectCommonFileByUser(userId, sessionUserBean.getUserId());
+
+ return RestResult.success().data(commonFileVo);
+
+ }
+
+ @Operation(summary = "获取共享空间中某个用户的文件列表", description = "用来做前台列表展示", tags = {"file"})
+ @RequestMapping(value = "/commonFileList", method = RequestMethod.GET)
+ @ResponseBody
+ public RestResult commonFileList(
+ @Parameter(description = "用户id", required = true) Long commonFileId,
+ @Parameter(description = "文件路径", required = true) String filePath,
+ @Parameter(description = "当前页", required = true) long currentPage,
+ @Parameter(description = "页面数量", required = true) long pageCount){
+
+ CommonFile commonFile = commonFileService.getById(commonFileId);
+ UserFile userFile = userFileService.getById(commonFile.getUserFileId());
+ QiwenFile qiwenFile = new QiwenFile(userFile.getFilePath(), filePath, true);
+ IPage fileList = userFileService.userFileList(userFile.getUserId(), qiwenFile.getPath(), currentPage, pageCount);
+
+ return RestResult.success().data(fileList);
+
+ }
+
+}
diff --git a/src/main/java/com/zhgd/xmgl/modules/basicdata/qiwen/controller/FileNoticeController.java b/src/main/java/com/zhgd/xmgl/modules/basicdata/qiwen/controller/FileNoticeController.java
new file mode 100644
index 0000000..0ecbc85
--- /dev/null
+++ b/src/main/java/com/zhgd/xmgl/modules/basicdata/qiwen/controller/FileNoticeController.java
@@ -0,0 +1,65 @@
+package com.zhgd.xmgl.modules.basicdata.qiwen.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.qiwenshare.common.result.RestResult;
+import com.zhgd.xmgl.modules.basicdata.entity.Notice;
+import com.zhgd.xmgl.modules.basicdata.qiwen.api.IFileNoticeService;
+import com.zhgd.xmgl.modules.basicdata.qiwen.domain.FileNotice;
+import com.zhgd.xmgl.modules.basicdata.qiwen.dto.notice.NoticeListDTO;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+
+@Tag(name = "公告管理")
+@RestController
+@RequestMapping("/fileNotice")
+public class FileNoticeController {
+ public static final String CURRENT_MODULE = "公告管理";
+ @Resource
+ IFileNoticeService noticeService;
+
+ /**
+ * 得到所有的公告
+ *
+ * @return
+ */
+ @Operation(summary = "得到所有的公告列表", tags = {"公告管理"})
+ @RequestMapping(value = "/list", method = RequestMethod.GET)
+ @ResponseBody
+ public RestResult selectUserList(@Parameter(description = "当前页,从1开始") @RequestParam(defaultValue = "1") int page,
+ @Parameter(description = "页大小") @RequestParam(defaultValue = "10") int pageSize,
+ @Parameter(description = "标题") @RequestParam(required = false) String title,
+ @Parameter(description = "发布者") @RequestParam(required = false) Long publisher,
+ @Parameter(description = "开始发布时间") @RequestParam(required = false) String beginTime,
+ @Parameter(description = "开始发布时间") @RequestParam(required = false) String endTime) {
+ NoticeListDTO noticeListDTO = new NoticeListDTO();
+ noticeListDTO.setPage(page);
+ noticeListDTO.setPageSize(pageSize);
+ noticeListDTO.setTitle(title);
+ noticeListDTO.setPlatform(3);
+ noticeListDTO.setPublisher(publisher);
+ noticeListDTO.setBeginTime(beginTime);
+ noticeListDTO.setEndTime(endTime);
+ IPage noticeIPage = noticeService.selectUserPage(noticeListDTO);
+
+ return RestResult.success().dataList(noticeIPage.getRecords(), noticeIPage.getTotal());
+ }
+
+ @Operation(summary = "查询公告详情", tags = {"公告管理"})
+ @RequestMapping(value = "/detail", method = RequestMethod.GET)
+ @ResponseBody
+ public RestResult getNoticeDetail(@Parameter(description = "公告id", required = true) long noticeId) {
+ RestResult result = new RestResult();
+
+ FileNotice notice = noticeService.getById(noticeId);
+
+ return RestResult.success().data(notice);
+ }
+
+
+
+
+}
diff --git a/src/main/java/com/zhgd/xmgl/modules/basicdata/qiwen/controller/FilesController.java b/src/main/java/com/zhgd/xmgl/modules/basicdata/qiwen/controller/FilesController.java
new file mode 100644
index 0000000..94a42ae
--- /dev/null
+++ b/src/main/java/com/zhgd/xmgl/modules/basicdata/qiwen/controller/FilesController.java
@@ -0,0 +1,490 @@
+package com.zhgd.xmgl.modules.basicdata.qiwen.controller;
+
+import cn.hutool.core.util.IdUtil;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.qiwenshare.common.anno.MyLog;
+import com.qiwenshare.common.exception.QiwenException;
+import com.qiwenshare.common.result.RestResult;
+import com.qiwenshare.common.util.DateUtil;
+import com.qiwenshare.common.util.security.JwtUser;
+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.zhgd.xmgl.modules.basicdata.qiwen.api.IFileService;
+import com.zhgd.xmgl.modules.basicdata.qiwen.api.IUserFileService;
+import com.zhgd.xmgl.modules.basicdata.qiwen.component.AsyncTaskComp;
+import com.zhgd.xmgl.modules.basicdata.qiwen.component.FileDealComp;
+import com.zhgd.xmgl.modules.basicdata.qiwen.domain.FileBean;
+import com.zhgd.xmgl.modules.basicdata.qiwen.domain.UserFile;
+import com.zhgd.xmgl.modules.basicdata.qiwen.dto.file.*;
+import com.zhgd.xmgl.modules.basicdata.qiwen.io.QiwenFile;
+import com.zhgd.xmgl.modules.basicdata.qiwen.util.QiwenFileUtil;
+import com.zhgd.xmgl.modules.basicdata.qiwen.util.TreeNode;
+import com.zhgd.xmgl.modules.basicdata.qiwen.vo.file.FileDetailVO;
+import com.zhgd.xmgl.modules.basicdata.qiwen.vo.file.FileListVO;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.util.ClassUtils;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.validation.Valid;
+import java.io.ByteArrayInputStream;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.net.URLDecoder;
+import java.util.*;
+
+@RestController
+@Slf4j
+@RequestMapping("files")
+public class FilesController {
+
+ @Resource
+ IFileService fileService;
+ @Resource
+ IUserFileService userFileService;
+ @Resource
+ UFOPFactory ufopFactory;
+ @Resource
+ FileDealComp fileDealComp;
+ @Resource
+ AsyncTaskComp asyncTaskComp;
+
+ @Value("${ufop.storage-type}")
+ private Integer storageType;
+ public static final String CURRENT_MODULE = "文件接口";
+
+ @Operation(summary = "创建文件", description = "创建文件", tags = {"file"})
+ @ResponseBody
+ @RequestMapping(value = "/createFile", method = RequestMethod.POST)
+ public RestResult