feat(代码优化): 返回结果优化及新建文件逻辑优化

This commit is contained in:
马超 2023-01-31 16:39:10 +08:00
parent 0608f6a8bc
commit fd071a63a9
9 changed files with 260 additions and 114 deletions

View File

@ -1,6 +1,7 @@
package com.qiwenshare.file.controller;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.IdUtil;
import co.elastic.clients.elasticsearch.ElasticsearchClient;
import co.elastic.clients.elasticsearch.core.SearchResponse;
import co.elastic.clients.elasticsearch.core.search.HighlighterEncoder;
@ -24,10 +25,14 @@ import com.qiwenshare.file.domain.UserFile;
import com.qiwenshare.file.dto.file.*;
import com.qiwenshare.file.io.QiwenFile;
import com.qiwenshare.file.util.QiwenFileUtil;
import com.qiwenshare.file.util.RestResult2;
import com.qiwenshare.file.util.TreeNode;
import com.qiwenshare.file.vo.file.FileDetailVO;
import com.qiwenshare.file.vo.file.FileListVo;
import com.qiwenshare.file.vo.file.SearchFileVO;
import com.qiwenshare.ufop.factory.UFOPFactory;
import com.qiwenshare.ufop.operation.copy.Copier;
import com.qiwenshare.ufop.operation.copy.domain.CopyFile;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
@ -35,12 +40,16 @@ import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.digest.DigestUtils;
import org.eclipse.jetty.util.StringUtil;
import org.springframework.beans.factory.annotation.Autowired;
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.*;
@Tag(name = "file", description = "该接口为文件接口,主要用来做一些文件的基本操作,如创建目录,删除,移动,复制等。")
@ -53,33 +62,103 @@ public class FileController {
IFileService fileService;
@Resource
IUserFileService userFileService;
@Resource
UFOPFactory ufopFactory;
@Resource
FileDealComp fileDealComp;
@Resource
AsyncTaskComp asyncTaskComp;
@Autowired
private ElasticsearchClient elasticsearchClient;
@Value("${ufop.storage-type}")
private Integer storageType;
public static final String CURRENT_MODULE = "文件接口";
@Operation(summary = "创建文件", description = "目录(文件夹)的创建", tags = {"file"})
@RequestMapping(value = "/createfile", method = RequestMethod.POST)
@MyLog(operation = "创建文件", module = CURRENT_MODULE)
@Operation(summary = "创建文件", description = "创建文件", tags = {"file"})
@ResponseBody
public RestResult<String> createFile(@Valid @RequestBody CreateFileDTO createFileDto) {
@RequestMapping(value = "/createFile", method = RequestMethod.POST)
public RestResult<Object> createFile(@Valid @RequestBody CreateFileDTO createFileDTO) {
JwtUser sessionUserBean = SessionUtil.getSession();
try {
boolean isDirExist = fileDealComp.isDirExist(createFileDto.getFileName(), createFileDto.getFilePath(), sessionUserBean.getUserId());
if (isDirExist) {
Long userId = SessionUtil.getSession().getUserId();
String filePath = createFileDTO.getFilePath();
String fileName = createFileDTO.getFileName();
String extendName = createFileDTO.getExtendName();
List<UserFile> userFiles = userFileService.selectSameUserFile(fileName, filePath, extendName, userId);
if (userFiles != null && !userFiles.isEmpty()) {
return RestResult.fail().message("同名文件已存在");
}
String uuid = UUID.randomUUID().toString().replaceAll("-", "");
UserFile userFile = QiwenFileUtil.getQiwenDir(sessionUserBean.getUserId(), createFileDto.getFilePath(), createFileDto.getFileName());
String templateFilePath = "";
if ("docx".equals(extendName)) {
templateFilePath = "template/Word.docx";
} else if ("xlsx".equals(extendName)) {
templateFilePath = "template/Excel.xlsx";
} else if ("pptx".equals(extendName)) {
templateFilePath = "template/PowerPoint.pptx";
} else if ("txt".equals(extendName)) {
templateFilePath = "template/Text.txt";
} else if ("drawio".equals(extendName)) {
templateFilePath = "template/Drawio.drawio";
}
String url2 = ClassUtils.getDefaultClassLoader().getResource("static/" + templateFilePath).getPath();
url2 = URLDecoder.decode(url2, "UTF-8");
FileInputStream fileInputStream = new FileInputStream(url2);
Copier copier = ufopFactory.getCopier();
CopyFile copyFile = new CopyFile();
copyFile.setExtendName(extendName);
String fileUrl = copier.copy(fileInputStream, copyFile);
FileBean fileBean = new FileBean();
fileBean.setFileId(IdUtil.getSnowflakeNextIdStr());
fileBean.setFileSize(0L);
fileBean.setFileUrl(fileUrl);
fileBean.setStorageType(storageType);
fileBean.setIdentifier(uuid);
fileBean.setCreateTime(DateUtil.getCurrentTime());
fileBean.setCreateUserId(SessionUtil.getSession().getUserId());
fileBean.setFileStatus(1);
boolean saveFlag = fileService.save(fileBean);
UserFile userFile = new UserFile();
if (saveFlag) {
userFile.setUserFileId(IdUtil.getSnowflakeNextIdStr());
userFile.setUserId(userId);
userFile.setFileName(fileName);
userFile.setFilePath(filePath);
userFile.setDeleteFlag(0);
userFile.setIsDir(0);
userFile.setExtendName(extendName);
userFile.setUploadTime(DateUtil.getCurrentTime());
userFile.setFileId(fileBean.getFileId());
userFileService.save(userFile);
}
return RestResult.success().message("文件创建成功");
} catch (Exception e) {
log.error(e.getMessage());
return RestResult.fail().message(e.getMessage());
}
}
@Operation(summary = "创建文件夹", description = "目录(文件夹)的创建", tags = {"file"})
@RequestMapping(value = "/createFold", method = RequestMethod.POST)
@MyLog(operation = "创建文件夹", module = CURRENT_MODULE)
@ResponseBody
public RestResult<String> createFold(@Valid @RequestBody CreateFoldDTO createFoldDto) {
Long userId = SessionUtil.getSession().getUserId();
String filePath = createFoldDto.getFilePath();
boolean isDirExist = fileDealComp.isDirExist(createFoldDto.getFileName(), createFoldDto.getFilePath(), userId);
if (isDirExist) {
return RestResult.fail().message("同名文件夹已存在");
}
UserFile userFile = QiwenFileUtil.getQiwenDir(userId, filePath, createFoldDto.getFileName());
userFileService.save(userFile);
fileDealComp.uploadESByUserFileId(userFile.getUserFileId());
@ -90,7 +169,7 @@ public class FileController {
@GetMapping(value = "/search")
@MyLog(operation = "文件搜索", module = CURRENT_MODULE)
@ResponseBody
public RestResult<List<SearchFileVO>> searchFile(SearchFileDTO searchFileDTO) {
public RestResult2<SearchFileVO> searchFile(SearchFileDTO searchFileDTO) {
JwtUser sessionUserBean = SessionUtil.getSession();
int currentPage = (int)searchFileDTO.getCurrentPage() - 1;
@ -146,7 +225,7 @@ public class FileController {
searchFileVOList.add(searchFileVO);
asyncTaskComp.checkESUserFileId(searchFileVO.getUserFileId());
}
return RestResult.success().data(searchFileVOList);
return RestResult2.success().dataList(searchFileVOList, searchFileVOList.size());
}
@ -185,7 +264,7 @@ public class FileController {
@Operation(summary = "获取文件列表", description = "用来做前台列表展示", tags = {"file"})
@RequestMapping(value = "/getfilelist", method = RequestMethod.GET)
@ResponseBody
public RestResult getFileList(
public RestResult2 getFileList(
@Parameter(description = "文件路径", required = true) String filePath,
@Parameter(description = "当前页", required = true) long currentPage,
@Parameter(description = "页面数量", required = true) long pageCount){
@ -193,13 +272,7 @@ public class FileController {
IPage<FileListVo> fileList = userFileService.userFileList(null, filePath, currentPage, pageCount);
Map<String, Object> map = new HashMap<>();
map.put("total", fileList.getTotal());
map.put("list", fileList.getRecords());
return RestResult.success().data(map);
return RestResult2.success().dataList(fileList.getRecords(), fileList.getTotal());
}
@ -336,7 +409,7 @@ public class FileController {
@Operation(summary = "通过文件类型选择文件", description = "该接口可以实现文件格式分类查看", tags = {"file"})
@RequestMapping(value = "/selectfilebyfiletype", method = RequestMethod.GET)
@ResponseBody
public RestResult<List<Map<String, Object>>> selectFileByFileType(@Parameter(description = "文件类型", required = true) int fileType,
public RestResult2<FileListVo> selectFileByFileType(@Parameter(description = "文件类型", required = true) int fileType,
@Parameter(description = "当前页", required = true) @RequestParam(defaultValue = "1") long currentPage,
@Parameter(description = "页面数量", required = true) @RequestParam(defaultValue = "10") long pageCount) {
@ -345,10 +418,8 @@ public class FileController {
long userId = sessionUserBean.getUserId();
IPage<FileListVo> result = userFileService.getFileByFileType(fileType, currentPage, pageCount, userId);
Map<String, Object> map = new HashMap<>();
map.put("list", result.getRecords());
map.put("total", result.getTotal());
return RestResult.success().data(map);
return RestResult2.success().dataList(result.getRecords(), result.getTotal());
}

View File

@ -5,6 +5,7 @@ import com.qiwenshare.common.result.RestResult;
import com.qiwenshare.file.api.INoticeService;
import com.qiwenshare.file.domain.Notice;
import com.qiwenshare.file.dto.notice.NoticeListDTO;
import com.qiwenshare.file.util.RestResult2;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
@ -30,7 +31,7 @@ public class NoticeController {
@Operation(summary = "得到所有的公告列表", tags = {"公告管理"})
@RequestMapping(value = "/list", method = RequestMethod.GET)
@ResponseBody
public RestResult<Map> selectUserList(@Parameter(description = "当前页从1开始") @RequestParam(defaultValue = "1") int page,
public RestResult2<NoticeListDTO> 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,
@ -46,10 +47,7 @@ public class NoticeController {
noticeListDTO.setEndTime(endTime);
IPage<Notice> noticeIPage = noticeService.selectUserPage(noticeListDTO);
Map<String, Object> map = new HashMap<>();
map.put("total", noticeIPage.getTotal());
map.put("list", noticeIPage.getRecords());
return RestResult.success().data(map);
return RestResult2.success().dataList(noticeIPage.getRecords(), noticeIPage.getTotal());
}
@Operation(summary = "查询公告详情", tags = {"公告管理"})

View File

@ -87,69 +87,6 @@ public class OfficeController {
@Autowired
private HistoryManager historyManager;
@Operation(summary = "创建office文件", description = "创建office文件", tags = {"office"})
@ResponseBody
@RequestMapping(value = "/createofficefile", method = RequestMethod.POST)
public RestResult<Object> createOfficeFile(@RequestBody CreateOfficeFileDTO createOfficeFileDTO) {
RestResult<Object> result = new RestResult<>();
try{
JwtUser loginUser = SessionUtil.getSession();
String fileName = createOfficeFileDTO.getFileName();
String filePath = createOfficeFileDTO.getFilePath();
String extendName = createOfficeFileDTO.getExtendName();
List<UserFile> userFiles = userFileService.selectSameUserFile(fileName, filePath, extendName, loginUser.getUserId());
if (userFiles != null && !userFiles.isEmpty()) {
return RestResult.fail().message("同名文件已存在");
}
String uuid = UUID.randomUUID().toString().replaceAll("-","");
String templateFilePath = "";
if ("docx".equals(extendName)) {
templateFilePath = "template/Word.docx";
} else if ("xlsx".equals(extendName)) {
templateFilePath = "template/Excel.xlsx";
} else if ("pptx".equals(extendName)) {
templateFilePath = "template/PowerPoint.pptx";
}
String url2 = ClassUtils.getDefaultClassLoader().getResource("static/" + templateFilePath).getPath();
url2 = URLDecoder.decode(url2, "UTF-8");
FileInputStream fileInputStream = new FileInputStream(url2);
Copier copier = ufopFactory.getCopier();
CopyFile copyFile = new CopyFile();
copyFile.setExtendName(extendName);
String fileUrl = copier.copy(fileInputStream, copyFile);
FileBean fileBean = new FileBean();
fileBean.setFileId(IdUtil.getSnowflakeNextIdStr());
fileBean.setFileSize(0L);
fileBean.setFileUrl(fileUrl);
fileBean.setStorageType(storageType);
fileBean.setIdentifier(uuid);
fileBean.setCreateTime(DateUtil.getCurrentTime());
fileBean.setCreateUserId(loginUser.getUserId());
fileBean.setFileStatus(1);
boolean saveFlag = fileService.save(fileBean);
UserFile userFile = new UserFile();
if(saveFlag) {
userFile.setUserFileId(IdUtil.getSnowflakeNextIdStr());
userFile.setUserId(loginUser.getUserId());
userFile.setFileName(fileName);
userFile.setFilePath(filePath);
userFile.setDeleteFlag(0);
userFile.setIsDir(0);
userFile.setExtendName(extendName);
userFile.setUploadTime(DateUtil.getCurrentTime());
userFile.setFileId(fileBean.getFileId());
userFileService.save(userFile);
}
return RestResult.success().message("文件创建成功");
} catch (Exception e) {
log.error(e.getMessage());
return RestResult.fail().message(e.getMessage());
}
}
@Operation(summary = "预览office文件", description = "预览office文件", tags = {"office"})
@RequestMapping(value = "/previewofficefile", method = RequestMethod.POST)
@ResponseBody

View File

@ -11,6 +11,7 @@ import com.qiwenshare.file.domain.RecoveryFile;
import com.qiwenshare.file.dto.file.DeleteRecoveryFileDTO;
import com.qiwenshare.file.dto.recoveryfile.BatchDeleteRecoveryFileDTO;
import com.qiwenshare.file.dto.recoveryfile.RestoreFileDTO;
import com.qiwenshare.file.util.RestResult2;
import com.qiwenshare.file.vo.file.RecoveryFileListVo;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
@ -78,14 +79,10 @@ public class RecoveryFileController {
@Operation(summary = "回收文件列表", description = "回收文件列表", tags = {"recoveryfile"})
@RequestMapping(value = "/list", method = RequestMethod.POST)
@ResponseBody
public RestResult<List<RecoveryFileListVo>> getRecoveryFileList() {
public RestResult2<RecoveryFileListVo> getRecoveryFileList() {
JwtUser sessionUserBean = SessionUtil.getSession();
RestResult<List<RecoveryFileListVo>> restResult = new RestResult<List<RecoveryFileListVo>>();
List<RecoveryFileListVo> recoveryFileList = recoveryFileService.selectRecoveryFileList(sessionUserBean.getUserId());
restResult.setData(recoveryFileList);
restResult.setSuccess(true);
return restResult;
return RestResult2.success().dataList(recoveryFileList, recoveryFileList.size());
}
@Operation(summary = "还原文件", description = "还原文件", tags = {"recoveryfile"})

View File

@ -19,6 +19,7 @@ import com.qiwenshare.file.domain.ShareFile;
import com.qiwenshare.file.domain.UserFile;
import com.qiwenshare.file.dto.sharefile.*;
import com.qiwenshare.file.io.QiwenFile;
import com.qiwenshare.file.util.RestResult2;
import com.qiwenshare.file.vo.share.ShareFileListVO;
import com.qiwenshare.file.vo.share.ShareFileVO;
import com.qiwenshare.file.vo.share.ShareListVO;
@ -150,30 +151,27 @@ public class ShareController {
@Operation(summary = "查看已分享列表", description = "查看已分享列表", tags = {"share"})
@GetMapping(value = "/shareList")
@ResponseBody
public RestResult shareList(ShareListDTO shareListDTO) {
public RestResult2<ShareListVO> shareList(ShareListDTO shareListDTO) {
JwtUser sessionUserBean = SessionUtil.getSession();
List<ShareListVO> shareList = shareService.selectShareList(shareListDTO, sessionUserBean.getUserId());
int total = shareService.selectShareListTotalCount(shareListDTO, sessionUserBean.getUserId());
Map<String, Object> map = new HashMap<>();
map.put("total", total);
map.put("list", shareList);
return RestResult.success().data(map);
return RestResult2.success().dataList(shareList, total);
}
@Operation(summary = "分享文件列表", description = "分享列表", tags = {"share"})
@GetMapping(value = "/sharefileList")
@ResponseBody
public RestResult<List<ShareFileListVO>> shareFileList(ShareFileListDTO shareFileListBySecretDTO) {
public RestResult2<ShareFileListVO> shareFileList(ShareFileListDTO shareFileListBySecretDTO) {
String shareBatchNum = shareFileListBySecretDTO.getShareBatchNum();
String shareFilePath = shareFileListBySecretDTO.getShareFilePath();
List<ShareFileListVO> list = shareFileService.selectShareFileList(shareBatchNum, shareFilePath);
for (ShareFileListVO shareFileListVO : list) {
shareFileListVO.setShareFilePath(shareFilePath);
}
return RestResult.success().data(list);
return RestResult2.success().dataList(list, list.size());
}
@Operation(summary = "分享类型", description = "可用此接口判断是否需要提取码", tags = {"share"})

View File

@ -5,17 +5,20 @@ import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.Pattern;
@Data
@Schema(name = "创建文件DTO",required = true)
public class CreateFileDTO {
@Schema(description="文件名", required=true)
@NotBlank(message = "文件名不能为空")
@Pattern(regexp = RegexConstant.FILE_NAME_REGEX, message = "文件名不合法!")
private String fileName;
@Schema(description="文件路径", required=true)
@Schema(description = "文件路径", required = true)
private String filePath;
@Schema(description = "文件名", required = true)
@NotBlank(message = "文件名不能为空")
@Pattern(regexp = RegexConstant.FILE_NAME_REGEX, message = "文件名不合法!", flags = {Pattern.Flag.CASE_INSENSITIVE})
private String fileName;
@Schema(description = "扩展名", required = true)
private String extendName;
}

View File

@ -0,0 +1,20 @@
package com.qiwenshare.file.dto.file;
import com.qiwenshare.common.constant.RegexConstant;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Pattern;
@Data
@Schema(name = "创建文件DTO",required = true)
public class CreateFoldDTO {
@Schema(description="文件名", required=true)
@NotBlank(message = "文件名不能为空")
@Pattern(regexp = RegexConstant.FILE_NAME_REGEX, message = "文件名不合法!")
private String fileName;
@Schema(description="文件路径", required=true)
private String filePath;
}

View File

@ -0,0 +1,84 @@
package com.qiwenshare.file.util;
import com.qiwenshare.common.result.ResultCodeEnum;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.util.List;
@Data
public class RestResult2<T> {
@Schema(
description = "请求是否成功",
example = "true"
)
private Boolean success = true;
@Schema(
description = "返回码",
example = "000000"
)
private Integer code = 0;
@Schema(
description = "返回信息",
example = "成功"
)
private String message;
@Schema(
description = "返回数据"
)
private T data;
@Schema(
description = "返回数据列表"
)
private List<T> dataList;
private long total;
public static RestResult2 success() {
RestResult2 r = new RestResult2();
r.setSuccess(ResultCodeEnum.SUCCESS.getSuccess());
r.setCode(ResultCodeEnum.SUCCESS.getCode());
r.setMessage(ResultCodeEnum.SUCCESS.getMessage());
return r;
}
public static RestResult2 fail() {
RestResult2 r = new RestResult2();
r.setSuccess(ResultCodeEnum.UNKNOWN_ERROR.getSuccess());
r.setCode(ResultCodeEnum.UNKNOWN_ERROR.getCode());
r.setMessage(ResultCodeEnum.UNKNOWN_ERROR.getMessage());
return r;
}
public static RestResult2 setResult(ResultCodeEnum result) {
RestResult2 r = new RestResult2();
r.setSuccess(result.getSuccess());
r.setCode(result.getCode());
r.setMessage(result.getMessage());
return r;
}
public RestResult2 data(T param) {
this.setData(param);
return this;
}
public RestResult2 dataList(List<T> param, long total) {
this.setDataList(param);
this.setTotal(total);
return this;
}
public RestResult2 message(String message) {
this.setMessage(message);
return this;
}
public RestResult2 code(Integer code) {
this.setCode(code);
return this;
}
public RestResult2 success(Boolean success) {
this.setSuccess(success);
return this;
}
}

View File

@ -132,3 +132,41 @@ qiwen.file.version=1.1.2
deployment.host=192.168.1.6
filesize-max=5242880
files.storage=
files.storage.folder=documents
files.docservice.fillforms-docs=.oform|.docx
files.docservice.viewed-docs=.pdf|.djvu|.xps|.oxps
files.docservice.edited-docs=.docx|.xlsx|.csv|.pptx|.txt|.docxf
files.docservice.convert-docs=.docm|.dotx|.dotm|.dot|.doc|.odt|.fodt|.ott|.xlsm|.xlsb|.xltx|.xltm|.xlt|.xls|.ods|.fods|.ots|.pptm|.ppt|.ppsx|.ppsm|.pps|.potx|.potm|.pot|.odp|.fodp|.otp|.rtf|.mht|.html|.htm|.xml|.epub|.fb2
files.docservice.timeout=120000
files.docservice.history.postfix=-hist
files.docservice.url.site=https://officeview.qiwenshare.com/
files.docservice.url.converter=ConvertService.ashx
files.docservice.url.command=coauthoring/CommandService.ashx
files.docservice.url.api=web-apps/apps/api/documents/api.js
files.docservice.url.preloader=web-apps/apps/api/documents/cache-scripts.html
files.docservice.url.example=
files.docservice.secret=secret
files.docservice.header=Authorization
files.docservice.verify-peer-off=true
files.docservice.languages=en:English|hy:Armenian|az:Azerbaijani|eu:Basque|be:Belarusian|bg:Bulgarian|ca:Catalan|zh:Chinese (People's Republic of China)|zh-TW:Chinese (Traditional, Taiwan)|cs:Czech|da:Danish|nl:Dutch|fi:Finnish|fr:French|gl:Galego|de:German|el:Greek|hu:Hungarian|id:Indonesian|it:Italian|ja:Japanese|ko:Korean|lv:Latvian|lo:Lao|ms:Malay (Malaysia)|nb:Norwegian|pl:Polish|pt:Portuguese (Brazil)|pt-PT:Portuguese (Portugal)|ro:Romanian|ru:Russian|sk:Slovak|sl:Slovenian|es:Spanish|sv:Swedish|tr:Turkish|uk:Ukrainian|vi:Vietnamese
url.index=/
url.converter=/converter
url.editor=/editor
url.track=/track
url.download=/download
logo.image=
logo.imageEmbedded=
logo.url=https://www.onlyoffice.com