From 2a4ac18052601cb38b49479fa895c96690a37095 Mon Sep 17 00:00:00 2001 From: ybb <2532447764@qq.com> Date: Thu, 7 Aug 2025 09:50:34 +0800 Subject: [PATCH 1/5] =?UTF-8?q?8/7,ybb=E6=96=87=E4=BB=B6=E5=A4=B9=E5=92=8C?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E9=83=BD=E5=AE=9E=E7=8E=B0=E4=BA=86=E8=AE=B0?= =?UTF-8?q?=E5=BD=95Id=E5=8A=9F=E8=83=BD=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/entity/BusinessDataEntity.java | 2 +- .../domain/entity/BusinessDataFileEntity.java | 2 +- .../impl/BusinessDataFileServiceImpl.java | 4 +- .../service/impl/BusinessDataServiceImpl.java | 130 ++++++++---------- .../BusinessDataFileController.java | 9 +- web/src/main/resources/application-dev.yml | 1 - 6 files changed, 66 insertions(+), 82 deletions(-) diff --git a/core/src/main/java/com/dite/znpt/domain/entity/BusinessDataEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/BusinessDataEntity.java index 4b88a8e..c769f0a 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/BusinessDataEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/BusinessDataEntity.java @@ -25,7 +25,7 @@ public class BusinessDataEntity { // 父级文件夹 private Long parentId = null; // 创建人 - private Long creatorId = null; + private String creatorId = null; // 创建时间 private LocalDateTime createTime = null; // 更新时间 diff --git a/core/src/main/java/com/dite/znpt/domain/entity/BusinessDataFileEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/BusinessDataFileEntity.java index c9c589d..9fc787f 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/BusinessDataFileEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/BusinessDataFileEntity.java @@ -30,7 +30,7 @@ public class BusinessDataFileEntity { //上传时间 private Date uploadTime = null; //上传人id - private Long uploaderId = null; + private String uploaderId = null; //是否删除 private Boolean isDeleted = false; diff --git a/core/src/main/java/com/dite/znpt/service/impl/BusinessDataFileServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/BusinessDataFileServiceImpl.java index c138abf..b02db41 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/BusinessDataFileServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/BusinessDataFileServiceImpl.java @@ -43,9 +43,7 @@ public class BusinessDataFileServiceImpl implements BusinessDataFileService { //删除数据库数据 if (folderId != null){ businessDataFileMapper.delete(null,folderId); - System.out.println("888888888走对了"); - - return Result.okM("删除,走对了,成功"); + return Result.okM("删除成功"); } //删除文件 diff --git a/core/src/main/java/com/dite/znpt/service/impl/BusinessDataServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/BusinessDataServiceImpl.java index e5b60ce..2f17a2b 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/BusinessDataServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/BusinessDataServiceImpl.java @@ -1,5 +1,6 @@ package com.dite.znpt.service.impl; +import cn.dev33.satoken.stp.StpUtil; import com.dite.znpt.domain.Result; import com.dite.znpt.domain.entity.BusinessDataEntity; import com.dite.znpt.domain.page.PageBean; @@ -54,12 +55,13 @@ public class BusinessDataServiceImpl implements BusinessDataService { @ApiOperation(value = "创建文件夹") @Override public Result createFolder(String folderName, Long parentId) { - //获取ID - Long loginIdAsLong = 888L; -// loginIdAsLong = StpUtil.getLoginIdAsLong(); -// + // 获取ID + String loginIdAsLong = "未登录用户"; + if(StpUtil.isLogin()){ + loginIdAsLong = StpUtil.getLoginIdAsString(); + } // 文件夹名称不能为空 - //TODO: 添加文件夹名称校验,后续最好更规范些,写个工具类专门校验,用正则表达式 + // TODO: 添加文件夹名称校验,后续最好更规范些,写个工具类专门校验,用正则表达式 if (folderName == null || folderName.trim().isEmpty()) { return Result.error("文件夹名称不能为空"); } @@ -70,10 +72,19 @@ public class BusinessDataServiceImpl implements BusinessDataService { // 文件夹名称前置一个/ String folderName1 = "/" + folderName; // 目标文件夹 - File targetDir=Paths.get(businessDataPath, folderName1).toFile(); - if(parentId != 0L){ + File targetDir = Paths.get(businessDataPath, folderName1).toFile(); + if (parentId != 0L) { // 获取父文件夹路径 targetDir = Paths.get(businessDataMapper.getPath(parentId), folderName1).toFile(); + } else { + // 如果是根目录,检查默认路径是否存在,不存在则创建 + File defaultPathDir = new File(businessDataPath); + if (!defaultPathDir.exists()) { + boolean created = defaultPathDir.mkdirs(); + if (!created) { + return Result.error("默认路径创建失败: " + businessDataPath); + } + } } // 创建文件夹和新增文件夹路径 if (!targetDir.exists()) { @@ -82,7 +93,7 @@ public class BusinessDataServiceImpl implements BusinessDataService { if (!created) { throw new RuntimeException("文件夹创建失败: " + targetDir.getAbsolutePath()); } - //上面是新增文件夹功能,但没有往数据库插入文件夹相关数据,所以下面新增 + // 上面是新增文件夹功能,但没有往数据库插入文件夹相关数据,所以下面新增 // 创建BusinessDataEntity对象并设置属性 BusinessDataEntity businessDataEntity = new BusinessDataEntity( null, @@ -92,11 +103,10 @@ public class BusinessDataServiceImpl implements BusinessDataService { LocalDateTime.now(), LocalDateTime.now(), false, - targetDir.getAbsolutePath() - ); + targetDir.getAbsolutePath()); // 插入到数据库 businessDataMapper.insert(businessDataEntity); - return Result.okM( "文件夹创建成功"); + return Result.okM("文件夹创建成功"); } else { return Result.error("文件夹已存在: "); } @@ -107,75 +117,50 @@ public class BusinessDataServiceImpl implements BusinessDataService { return businessDataMapper.getPath(parentId); } -// @ApiOperation("删除文件夹") -// @Override -// public Result delete(Long folderId) { -// // 获取文件夹路径 -// String folderPath = businessDataMapper.getPath(folderId); -// -// // 创建File对象并删除文件夹 -// File folder = new File(folderPath); -// if (folder.exists()) { -// boolean deleted = folder.delete(); -// if (!deleted) { -// // throw new RuntimeException("文件夹删除失败: " + folderPath); -// // TODO: 以后可以用全局异常处理器捕获,或者用try catch捕获 -// return Result.error("文件夹删除失败: " + folderPath); -// } -// //删除数据库中文件夹的数据 -// businessDataMapper.delete(folderId); -// //删除文件夹下文件的数据 -// businessDataFileService.delete(folderId); -// return Result.okM("删除成功"); -// } else { -// // throw new RuntimeException("文件夹不存在: " + folderPath); -// return Result.error("文件夹不存在: " + folderPath); -// } -// } - @ApiOperation("删除文件夹") - @Override - public Result delete(Long folderId) { - // 获取文件夹路径 - String folderPath = businessDataMapper.getPath(folderId); + @ApiOperation("删除文件夹") + @Override + public Result delete(Long folderId) { + // 获取文件夹路径 + String folderPath = businessDataMapper.getPath(folderId); - // 创建Path对象并删除文件夹 - Path folder = Paths.get(folderPath); - if (Files.exists(folder)) { - try { - // 使用Files.walk获取所有文件和目录,按深度排序后删除 - java.util.stream.Stream filePaths = Files.walk(folder); - filePaths.sorted(Comparator.reverseOrder()) - .map(Path::toFile) - .forEach(File::delete); - filePaths.close(); + // 创建Path对象并删除文件夹 + Path folder = Paths.get(folderPath); + if (Files.exists(folder)) { + try { + // 使用Files.walk获取所有文件和目录,按深度排序后删除 + java.util.stream.Stream filePaths = Files.walk(folder); + filePaths.sorted(Comparator.reverseOrder()) + .map(Path::toFile) + .forEach(File::delete); + filePaths.close(); - //删除数据库中文件夹的数据 - businessDataMapper.delete(folderId); - //删除文件夹下文件的数据 - businessDataFileService.delete(null , folderId); - return Result.okM("删除成功"); - } catch (Exception e) { - return Result.okM("删除成功"); - } - } else { - return Result.error("文件夹不存在: " + folderPath); + // 删除数据库中文件夹的数据 + businessDataMapper.delete(folderId); + // 删除文件夹下文件的数据 + businessDataFileService.delete(null, folderId); + return Result.okM("删除成功"); + } catch (Exception e) { + return Result.okM("删除成功"); } + } else { + return Result.error("文件夹不存在: " + folderPath); } + } + @ApiOperation("重命名文件夹") @Override public Result reName(Long folderId, String newName) { // 获取文件夹路径 String folderPath = businessDataMapper.getPath(folderId); - String newPath = folderPath.substring(0, folderPath.lastIndexOf('\\'))+"\\" + newName; - System.out.printf("7777777"+newPath); -// -// //想命名的原文件的路径 -// File file = new File("f:/a/a.xlsx"); -// //将原文件更改为f:\a\b.xlsx,其中路径是必要的。注意 -// file.renameTo(new File("f:/a/b.xlsx")); - //想命名的原文件夹的路径 + String newPath = folderPath.substring(0, folderPath.lastIndexOf('\\')) + "\\" + newName; + // + // //想命名的原文件的路径 + // File file = new File("f:/a/a.xlsx"); + // //将原文件更改为f:\a\b.xlsx,其中路径是必要的。注意 + // file.renameTo(new File("f:/a/b.xlsx")); + // 想命名的原文件夹的路径 File file1 = new File(folderPath); - //将原文件夹更改为A,其中路径是必要的。注意 + // 将原文件夹更改为A,其中路径是必要的。注意 file1.renameTo(new File(newPath)); LocalDateTime now = LocalDateTime.now(); @@ -187,11 +172,8 @@ public class BusinessDataServiceImpl implements BusinessDataService { null, now, null, - newPath - ); - System.out.println(businessDataEntity); + newPath); businessDataMapper.reName(businessDataEntity); return Result.okM("重命名成功"); } - } diff --git a/web/src/main/java/com/dite/znpt/web/controller/BusinessDataFileController.java b/web/src/main/java/com/dite/znpt/web/controller/BusinessDataFileController.java index 6e1acb4..580e0b8 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/BusinessDataFileController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/BusinessDataFileController.java @@ -1,5 +1,6 @@ package com.dite.znpt.web.controller; +import cn.dev33.satoken.stp.StpUtil; import com.dite.znpt.domain.Result; import com.dite.znpt.domain.entity.BusinessDataFileEntity; import com.dite.znpt.domain.page.PageBean; @@ -53,6 +54,10 @@ public class BusinessDataFileController { @PostMapping("/add") public Result add(@RequestParam("file") MultipartFile file, @RequestParam Long folderId) { + String loginIdAsLong = "未登录用户"; + if(StpUtil.isLogin()){ + loginIdAsLong = StpUtil.getLoginIdAsString(); + } if (file.isEmpty()) { return Result.error("上传文件为空"); @@ -75,9 +80,9 @@ public class BusinessDataFileController { fileEntity.setFileName(file.getOriginalFilename()); fileEntity.setFilePath(uploadDir + "\\" + file.getOriginalFilename()); fileEntity.setFileType(file.getContentType()); - fileEntity.setFileSize(file.getSize()); + fileEntity.setFileSize(file.getSize()/1024); fileEntity.setUploadTime(new Date()); - fileEntity.setUploaderId(0L); + fileEntity.setUploaderId(loginIdAsLong); System.out.println(uploadDir + "\\" + file.getOriginalFilename()); businessDataFileService.add(fileEntity); diff --git a/web/src/main/resources/application-dev.yml b/web/src/main/resources/application-dev.yml index cba9a5f..f9bda52 100644 --- a/web/src/main/resources/application-dev.yml +++ b/web/src/main/resources/application-dev.yml @@ -1,7 +1,6 @@ # 开发环境配置 server: # 服务器的HTTP端口,默认为8080 - port: 8888 # 数据源配置 From 50659ef1a716d7f5c352e32d4a18bcf2bf67cc0d Mon Sep 17 00:00:00 2001 From: ybb <2532447764@qq.com> Date: Thu, 7 Aug 2025 11:26:02 +0800 Subject: [PATCH 2/5] =?UTF-8?q?8/7,ybb=E6=96=87=E4=BB=B6=E5=A4=B9=E5=92=8C?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E9=83=BD=E5=AE=9E=E7=8E=B0=E4=BA=86=E8=AE=B0?= =?UTF-8?q?=E5=BD=95Id=E5=8A=9F=E8=83=BD=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../znpt/service/BusinessDataFileService.java | 12 +++ .../znpt/service/BusinessDataService.java | 3 + .../impl/BusinessDataFileServiceImpl.java | 85 ++++++++++++++++++- .../BusinessDataFileController.java | 73 +--------------- 4 files changed, 102 insertions(+), 71 deletions(-) diff --git a/core/src/main/java/com/dite/znpt/service/BusinessDataFileService.java b/core/src/main/java/com/dite/znpt/service/BusinessDataFileService.java index 031a4c3..a5d995d 100644 --- a/core/src/main/java/com/dite/znpt/service/BusinessDataFileService.java +++ b/core/src/main/java/com/dite/znpt/service/BusinessDataFileService.java @@ -6,6 +6,7 @@ import com.dite.znpt.domain.page.PageBean; import io.swagger.annotations.ApiOperation; import org.springframework.stereotype.Service; import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; @@ -13,17 +14,28 @@ import javax.servlet.http.HttpServletResponse; @Service public interface BusinessDataFileService { + @ApiOperation("分页查询文件") PageBean pageSelect(Integer page, Integer pageSize, Long folderId, String fileName); + @ApiOperation("删除文件") Result delete(@RequestParam(value = "fileId", required = false) Long fileId,@RequestParam(value = "foldelId", required = false) Long folderId); + @ApiOperation("增加数据库文件信息") void add(BusinessDataFileEntity businessDataFileEntity); + @ApiOperation("获取文件路径") String getPath(Long fileId); + @ApiOperation("删除文件") // 在接口中添加重命名方法 Result reName(Long fileId, String newFileName); + @ApiOperation("下载文件") + void upload(Long fileId, HttpServletResponse response); + + @ApiOperation("上传文件") + Result addfile(MultipartFile file, Long folderId); + // 在接口中添加预览方法 // Result preview(Long fileId, HttpServletResponse response); } diff --git a/core/src/main/java/com/dite/znpt/service/BusinessDataService.java b/core/src/main/java/com/dite/znpt/service/BusinessDataService.java index 0aa585d..f4a826c 100644 --- a/core/src/main/java/com/dite/znpt/service/BusinessDataService.java +++ b/core/src/main/java/com/dite/znpt/service/BusinessDataService.java @@ -4,6 +4,8 @@ import com.dite.znpt.domain.Result; import com.dite.znpt.domain.page.PageBean; import io.swagger.annotations.ApiOperation; +import javax.servlet.http.HttpServletResponse; + @ApiOperation("商务资料文件夹service") public interface BusinessDataService { @@ -12,4 +14,5 @@ public interface BusinessDataService { String getPath(Long parentId); Result delete(Long folderId); Result reName(Long folderId, String newName); + } diff --git a/core/src/main/java/com/dite/znpt/service/impl/BusinessDataFileServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/BusinessDataFileServiceImpl.java index b02db41..95b343c 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/BusinessDataFileServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/BusinessDataFileServiceImpl.java @@ -2,20 +2,26 @@ package com.dite.znpt.service.impl; +import cn.dev33.satoken.stp.StpUtil; import com.dite.znpt.domain.Result; import com.dite.znpt.domain.entity.BusinessDataFileEntity; import com.dite.znpt.domain.page.PageBean; import com.dite.znpt.mapper.BusinessDataFileMapper; +import com.dite.znpt.mapper.BusinessDataMapper; import com.dite.znpt.service.BusinessDataFileService; +import com.dite.znpt.service.BusinessDataService; import com.github.pagehelper.Page; import com.github.pagehelper.PageHelper; import io.swagger.annotations.ApiOperation; import lombok.AllArgsConstructor; import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; -import java.io.File; -import java.io.IOException; +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.Date; import java.util.List; import static jodd.io.FileUtil.deleteFile; @@ -27,6 +33,8 @@ import static org.apache.tomcat.util.http.fileupload.FileUtils.deleteDirectory; public class BusinessDataFileServiceImpl implements BusinessDataFileService { @Resource private BusinessDataFileMapper businessDataFileMapper; + @Resource + private BusinessDataService businessDataService; @ApiOperation("分页查询文件") @@ -156,6 +164,79 @@ public class BusinessDataFileServiceImpl implements BusinessDataFileService { } } + @ApiOperation("下载文件") + @Override + public void upload(Long fileId, HttpServletResponse response) { + String path = getPath(fileId); + try { + // path是指想要下载的文件的路径 + File file = new File(path); + // 获取文件名 + String filename = file.getName(); + // 获取文件后缀名 + String ext = filename.substring(filename.lastIndexOf(".") + 1).toLowerCase(); + // 将文件写入输入流 + FileInputStream fileInputStream = new FileInputStream(file); + InputStream fis = new BufferedInputStream(fileInputStream); + byte[] buffer = new byte[fis.available()]; + fis.read(buffer); + fis.close(); + // 清空response + response.reset(); + // 设置response的Header + response.setCharacterEncoding("UTF-8"); + response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(filename, "UTF-8")); + // 告知浏览器文件的大小 + response.addHeader("Content-Length", "" + file.length()); + OutputStream outputStream = new BufferedOutputStream(response.getOutputStream()); + response.setContentType("application/octet-stream"); + outputStream.write(buffer); + outputStream.flush(); + } catch (IOException ex) { + ex.printStackTrace(); + } + } + @ApiOperation("上传文件") + @Override + public Result addfile(MultipartFile file, Long folderId) { + String loginIdAsLong = "未登录用户"; + if(StpUtil.isLogin()){ + loginIdAsLong = StpUtil.getLoginIdAsString(); + } + + if (file.isEmpty()) { + return Result.error("上传文件为空"); + } + // TODO 以后可以优化,就算文件名一样,加个(1),(2)这种 + + try { + byte[] bytes = file.getBytes(); + String uploadDir = businessDataService.getPath(folderId); + + File uploadedFile = new File(uploadDir + "\\" + file.getOriginalFilename()); + if (uploadedFile.exists()) { + return Result.error("文件已存在"); + } + file.transferTo(uploadedFile); + + // 保存文件信息到数据 + BusinessDataFileEntity fileEntity = new BusinessDataFileEntity(); + fileEntity.setFolderId(folderId); + fileEntity.setFileName(file.getOriginalFilename()); + fileEntity.setFilePath(uploadDir + "\\" + file.getOriginalFilename()); + fileEntity.setFileType(file.getContentType()); + fileEntity.setFileSize(file.getSize()/1024); + fileEntity.setUploadTime(new Date()); + fileEntity.setUploaderId(loginIdAsLong); + System.out.println(uploadDir + "\\" + file.getOriginalFilename()); + add(fileEntity); + + return Result.okM("上传成功"); + } catch (IOException e) { + e.printStackTrace(); + return Result.error("上传失败"); + } + } } diff --git a/web/src/main/java/com/dite/znpt/web/controller/BusinessDataFileController.java b/web/src/main/java/com/dite/znpt/web/controller/BusinessDataFileController.java index 580e0b8..eb647e7 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/BusinessDataFileController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/BusinessDataFileController.java @@ -6,8 +6,10 @@ import com.dite.znpt.domain.entity.BusinessDataFileEntity; import com.dite.znpt.domain.page.PageBean; import com.dite.znpt.mapper.BusinessDataFileMapper; import com.dite.znpt.mapper.BusinessDataMapper; + import com.dite.znpt.service.BusinessDataFileService; import com.dite.znpt.service.BusinessDataService; +import com.dite.znpt.service.impl.BusinessDataFileServiceImpl; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; @@ -54,43 +56,7 @@ public class BusinessDataFileController { @PostMapping("/add") public Result add(@RequestParam("file") MultipartFile file, @RequestParam Long folderId) { - String loginIdAsLong = "未登录用户"; - if(StpUtil.isLogin()){ - loginIdAsLong = StpUtil.getLoginIdAsString(); - } - - if (file.isEmpty()) { - return Result.error("上传文件为空"); - } - // TODO 以后可以优化,就算文件名一样,加个(1),(2)这种 - - try { - byte[] bytes = file.getBytes(); - String uploadDir = businessDataService.getPath(folderId); - - File uploadedFile = new File(uploadDir + "\\" + file.getOriginalFilename()); - if (uploadedFile.exists()) { - return Result.error("文件已存在"); - } - file.transferTo(uploadedFile); - - // 保存文件信息到数据 - BusinessDataFileEntity fileEntity = new BusinessDataFileEntity(); - fileEntity.setFolderId(folderId); - fileEntity.setFileName(file.getOriginalFilename()); - fileEntity.setFilePath(uploadDir + "\\" + file.getOriginalFilename()); - fileEntity.setFileType(file.getContentType()); - fileEntity.setFileSize(file.getSize()/1024); - fileEntity.setUploadTime(new Date()); - fileEntity.setUploaderId(loginIdAsLong); - System.out.println(uploadDir + "\\" + file.getOriginalFilename()); - businessDataFileService.add(fileEntity); - - return Result.okM("上传成功"); - } catch (IOException e) { - e.printStackTrace(); - return Result.error("上传失败"); - } + return businessDataFileService.addfile(file, folderId); } @ApiOperation(value = "删除文件") @@ -103,38 +69,7 @@ public class BusinessDataFileController { @ApiOperation(value = "下载文件") @GetMapping("/download") public void download(@RequestParam("fileId") Long fileId, HttpServletResponse response) { - String path = businessDataFileService.getPath(fileId); - try { - // path是指想要下载的文件的路径 - File file = new File(path); - log.info(file.getPath()); - // 获取文件名 - String filename = file.getName(); - // 获取文件后缀名 - String ext = filename.substring(filename.lastIndexOf(".") + 1).toLowerCase(); - log.info("文件后缀名:" + ext); - - // 将文件写入输入流 - FileInputStream fileInputStream = new FileInputStream(file); - InputStream fis = new BufferedInputStream(fileInputStream); - byte[] buffer = new byte[fis.available()]; - fis.read(buffer); - fis.close(); - - // 清空response - response.reset(); - // 设置response的Header - response.setCharacterEncoding("UTF-8"); - response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(filename, "UTF-8")); - // 告知浏览器文件的大小 - response.addHeader("Content-Length", "" + file.length()); - OutputStream outputStream = new BufferedOutputStream(response.getOutputStream()); - response.setContentType("application/octet-stream"); - outputStream.write(buffer); - outputStream.flush(); - } catch (IOException ex) { - ex.printStackTrace(); - } + businessDataFileService.upload(fileId, response); } @ApiOperation(value = "重命名文件", httpMethod = "PUT") From e356368b62def8e7434e4b7b8acfccc74e2349b6 Mon Sep 17 00:00:00 2001 From: ybb <2532447764@qq.com> Date: Thu, 7 Aug 2025 16:06:15 +0800 Subject: [PATCH 3/5] =?UTF-8?q?8/7,ybb=E6=96=87=E4=BB=B6=E5=A4=B9=E5=92=8C?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E9=83=BD=E5=AE=9E=E7=8E=B0=E4=BA=86=E8=AE=B0?= =?UTF-8?q?=E5=BD=95Id=E5=8A=9F=E8=83=BD=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/pom.xml | 7 + .../domain/entity/BusinessDataFileEntity.java | 2 + .../znpt/mapper/BusinessDataFileMapper.java | 4 + .../dite/znpt/mapper/BusinessDataMapper.java | 5 +- .../znpt/service/BusinessDataFileService.java | 4 +- .../impl/BusinessDataFileServiceImpl.java | 246 +++++++++++++++++- .../BusinessDataFileController.java | 7 + web/src/main/resources/application.yml | 6 +- 8 files changed, 271 insertions(+), 10 deletions(-) diff --git a/core/pom.xml b/core/pom.xml index 94afd03..599d2b6 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -161,6 +161,13 @@ opencv 4.7.0-0 + + + + commons-io + commons-io + 2.11.0 + diff --git a/core/src/main/java/com/dite/znpt/domain/entity/BusinessDataFileEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/BusinessDataFileEntity.java index 9fc787f..8daf3cf 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/BusinessDataFileEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/BusinessDataFileEntity.java @@ -33,5 +33,7 @@ public class BusinessDataFileEntity { private String uploaderId = null; //是否删除 private Boolean isDeleted = false; +// //有效日期 +// private Date validDate = null; } diff --git a/core/src/main/java/com/dite/znpt/mapper/BusinessDataFileMapper.java b/core/src/main/java/com/dite/znpt/mapper/BusinessDataFileMapper.java index 0420931..73e7191 100644 --- a/core/src/main/java/com/dite/znpt/mapper/BusinessDataFileMapper.java +++ b/core/src/main/java/com/dite/znpt/mapper/BusinessDataFileMapper.java @@ -11,6 +11,10 @@ import java.util.List; @ApiOperation("商务资料文件对象") public interface BusinessDataFileMapper { + + // 新增文件预览方法 + + public List List(@Param("folderId") Long folderId, @Param("fileName") String fileName); void delete(@Param("fileId") Long fileId,@Param("folderId") Long folderId); diff --git a/core/src/main/java/com/dite/znpt/mapper/BusinessDataMapper.java b/core/src/main/java/com/dite/znpt/mapper/BusinessDataMapper.java index 9d1d686..b7e4bae 100644 --- a/core/src/main/java/com/dite/znpt/mapper/BusinessDataMapper.java +++ b/core/src/main/java/com/dite/znpt/mapper/BusinessDataMapper.java @@ -4,9 +4,9 @@ import com.baomidou.mybatisplus.core.injector.methods.SelectList; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.dite.znpt.domain.entity.BusinessDataEntity; import io.swagger.annotations.ApiOperation; +import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; -import com.dite.znpt.domain.entity.BusinessDataEntity; import java.time.LocalDateTime; import java.util.List; @@ -16,7 +16,8 @@ import java.util.List; @ApiOperation("商务资料文件夹对象") -public interface BusinessDataMapper { +@Mapper +public interface BusinessDataMapper { public String getPath(Long parentId); public List List(); diff --git a/core/src/main/java/com/dite/znpt/service/BusinessDataFileService.java b/core/src/main/java/com/dite/znpt/service/BusinessDataFileService.java index a5d995d..7cb636f 100644 --- a/core/src/main/java/com/dite/znpt/service/BusinessDataFileService.java +++ b/core/src/main/java/com/dite/znpt/service/BusinessDataFileService.java @@ -36,6 +36,6 @@ public interface BusinessDataFileService { @ApiOperation("上传文件") Result addfile(MultipartFile file, Long folderId); - // 在接口中添加预览方法 -// Result preview(Long fileId, HttpServletResponse response); + @ApiOperation("预览文件") + Result preview(Long fileId, HttpServletResponse response); } diff --git a/core/src/main/java/com/dite/znpt/service/impl/BusinessDataFileServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/BusinessDataFileServiceImpl.java index 95b343c..cda9ef8 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/BusinessDataFileServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/BusinessDataFileServiceImpl.java @@ -1,7 +1,22 @@ package com.dite.znpt.service.impl; - +import javax.servlet.http.HttpServletResponse; +import java.io.FileInputStream; +import java.io.OutputStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import org.springframework.util.MimeTypeUtils; +import org.springframework.http.MediaType; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import java.util.Base64; +import java.nio.charset.StandardCharsets; +import java.util.HashMap; +import java.util.Map; +// import cn.dev33.satoken.stp.StpUtil; import com.dite.znpt.domain.Result; import com.dite.znpt.domain.entity.BusinessDataFileEntity; @@ -82,8 +97,6 @@ public class BusinessDataFileServiceImpl implements BusinessDataFileService { return Result.okM("删除成功"); } } - - } @ApiOperation("增加文件") @@ -239,4 +252,231 @@ public class BusinessDataFileServiceImpl implements BusinessDataFileService { return Result.error("上传失败"); } } + + + @ApiOperation("文件预览") + public Result preview(Long fileId, HttpServletResponse response) { + try { + // 获取文件路径 + String filePath = businessDataFileMapper.getPath(fileId); + if (filePath == null || filePath.isEmpty()) { + return Result.error("文件不存在"); + } + + File file = new File(filePath); + if (!file.exists()) { + return Result.error("文件不存在"); + } + + // 获取文件扩展名 + String extension = getFileExtension(filePath); + + // 根据文件类型处理预览 + switch (extension) { + case "pdf": + return previewPdf(file, response); + case "jpg": + case "jpeg": + case "png": + case "gif": + case "bmp": + case "webp": + return previewImage(file, response); + case "txt": + case "md": + case "log": + return previewText(file, response); + case "doc": + case "docx": + case "xls": + case "xlsx": + case "ppt": + case "pptx": + return previewOffice(file, response); + case "mp4": + case "avi": + case "mov": + case "wmv": + case "flv": + return previewVideo(file, response); + case "mp3": + case "wav": + case "flac": + case "aac": + return previewAudio(file, response); + default: + return Result.error("暂不支持该文件类型的预览"); + } + } catch (Exception e) { + return Result.error("文件预览失败: " + e.getMessage()); + } + } + + private String getFileExtension(String fileName) { + if (fileName == null || fileName.isEmpty()) { + return ""; + } + int lastDotIndex = fileName.lastIndexOf('.'); + if (lastDotIndex == -1) { + return ""; + } + return fileName.substring(lastDotIndex + 1).toLowerCase(); + } + + private Result previewPdf(File file, HttpServletResponse response) { + try { + response.setContentType("application/pdf"); + response.setHeader("Content-Disposition", "inline; filename=" + file.getName()); + + try (FileInputStream fis = new FileInputStream(file); + OutputStream os = response.getOutputStream()) { + byte[] buffer = new byte[1024]; + int bytesRead; + while ((bytesRead = fis.read(buffer)) != -1) { + os.write(buffer, 0, bytesRead); + } + } + return Result.ok("PDF预览成功"); + } catch (Exception e) { + return Result.error("PDF预览失败: " + e.getMessage()); + } + } + + private Result previewImage(File file, HttpServletResponse response) { + try { + String contentType = getImageContentType(file.getName()); + response.setContentType(contentType); + response.setHeader("Content-Disposition", "inline; filename=" + file.getName()); + + try (FileInputStream fis = new FileInputStream(file); + OutputStream os = response.getOutputStream()) { + byte[] buffer = new byte[1024]; + int bytesRead; + while ((bytesRead = fis.read(buffer)) != -1) { + os.write(buffer, 0, bytesRead); + } + } + return Result.ok("图片预览成功"); + } catch (Exception e) { + return Result.error("图片预览失败: " + e.getMessage()); + } + } + + private Result previewText(File file, HttpServletResponse response) { + try { + response.setContentType("text/plain; charset=UTF-8"); + response.setHeader("Content-Disposition", "inline; filename=" + file.getName()); + + try (FileInputStream fis = new FileInputStream(file); + OutputStream os = response.getOutputStream()) { + byte[] buffer = new byte[1024]; + int bytesRead; + while ((bytesRead = fis.read(buffer)) != -1) { + os.write(buffer, 0, bytesRead); + } + } + return Result.ok("文本预览成功"); + } catch (Exception e) { + return Result.error("文本预览失败: " + e.getMessage()); + } + } + + private Result previewOffice(File file, HttpServletResponse response) { + // Office文件预览比较复杂,这里返回提示信息 + return Result.error("Office文件预览功能暂未实现,请下载后查看"); + } + + private Result previewVideo(File file, HttpServletResponse response) { + try { + String contentType = getVideoContentType(file.getName()); + response.setContentType(contentType); + response.setHeader("Content-Disposition", "inline; filename=" + file.getName()); + + try (FileInputStream fis = new FileInputStream(file); + OutputStream os = response.getOutputStream()) { + byte[] buffer = new byte[1024]; + int bytesRead; + while ((bytesRead = fis.read(buffer)) != -1) { + os.write(buffer, 0, bytesRead); + } + } + return Result.ok("视频预览成功"); + } catch (Exception e) { + return Result.error("视频预览失败: " + e.getMessage()); + } + } + + private Result previewAudio(File file, HttpServletResponse response) { + try { + String contentType = getAudioContentType(file.getName()); + response.setContentType(contentType); + response.setHeader("Content-Disposition", "inline; filename=" + file.getName()); + + try (FileInputStream fis = new FileInputStream(file); + OutputStream os = response.getOutputStream()) { + byte[] buffer = new byte[1024]; + int bytesRead; + while ((bytesRead = fis.read(buffer)) != -1) { + os.write(buffer, 0, bytesRead); + } + } + return Result.ok("音频预览成功"); + } catch (Exception e) { + return Result.error("音频预览失败: " + e.getMessage()); + } + } + + private String getImageContentType(String fileName) { + String extension = getFileExtension(fileName); + switch (extension) { + case "jpg": + case "jpeg": + return "image/jpeg"; + case "png": + return "image/png"; + case "gif": + return "image/gif"; + case "bmp": + return "image/bmp"; + case "webp": + return "image/webp"; + default: + return "application/octet-stream"; + } + } + + private String getVideoContentType(String fileName) { + String extension = getFileExtension(fileName); + switch (extension) { + case "mp4": + return "video/mp4"; + case "avi": + return "video/x-msvideo"; + case "mov": + return "video/quicktime"; + case "wmv": + return "video/x-ms-wmv"; + case "flv": + return "video/x-flv"; + default: + return "application/octet-stream"; + } + } + + private String getAudioContentType(String fileName) { + String extension = getFileExtension(fileName); + switch (extension) { + case "mp3": + return "audio/mpeg"; + case "wav": + return "audio/wav"; + case "flac": + return "audio/flac"; + case "aac": + return "audio/aac"; + default: + return "application/octet-stream"; + } + } + } diff --git a/web/src/main/java/com/dite/znpt/web/controller/BusinessDataFileController.java b/web/src/main/java/com/dite/znpt/web/controller/BusinessDataFileController.java index eb647e7..f42b8fa 100644 --- a/web/src/main/java/com/dite/znpt/web/controller/BusinessDataFileController.java +++ b/web/src/main/java/com/dite/znpt/web/controller/BusinessDataFileController.java @@ -27,6 +27,7 @@ import org.springframework.web.multipart.MultipartFile; /* * @Description: 商务资料管理,文件夹层 + * 袁彬彬写的,其他人合并的时候,不允许改我的部分。 */ @Api(tags = "文件接口") @@ -78,4 +79,10 @@ public class BusinessDataFileController { return businessDataFileService.reName(fileId, newFileName); } + @ApiOperation(value = "文件预览") + @GetMapping("/preview") + public Result preview(@RequestParam("fileId") Long fileId, HttpServletResponse response) { + return businessDataFileService.preview(fileId, response); + } + } diff --git a/web/src/main/resources/application.yml b/web/src/main/resources/application.yml index 694c057..11a5b40 100644 --- a/web/src/main/resources/application.yml +++ b/web/src/main/resources/application.yml @@ -10,9 +10,9 @@ spring: servlet: multipart: # 单个文件大小 - max-file-size: 100MB + max-file-size: 1000MB # 设置总上传的文件大小 - max-request-size: 200MB + max-request-size: 2000MB application: name: znpt mvc: @@ -27,4 +27,4 @@ flowable: # true 会对数据库中所有表进行更新操作。如果表不存在,则自动创建(建议开发时使用) database-schema-update: false # 关闭定时任务JOB - async-executor-activate: false \ No newline at end of file + async-executor-activate: false From d4b06d9c662c9e617d2356965042efc9bbd10cfb Mon Sep 17 00:00:00 2001 From: wangna0328 <3402195679@qq.com> Date: Fri, 8 Aug 2025 14:52:14 +0800 Subject: [PATCH 4/5] =?UTF-8?q?=E6=B6=88=E9=99=A4=E4=BA=BA=E5=91=98?= =?UTF-8?q?=E9=87=8D=E5=A4=8Dbug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/ProjectMemberServiceImpl.java | 244 ++++++++++-------- .../resources/mapper/ProjectMemberMapper.xml | 2 +- 2 files changed, 140 insertions(+), 106 deletions(-) diff --git a/core/src/main/java/com/dite/znpt/service/impl/ProjectMemberServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/ProjectMemberServiceImpl.java index cdb1428..1c03097 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/ProjectMemberServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/ProjectMemberServiceImpl.java @@ -18,6 +18,7 @@ import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import java.math.BigDecimal; +import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.function.Function; @@ -50,11 +51,22 @@ public class ProjectMemberServiceImpl extends ServiceImpl list = this.baseMapper.queryTeamMembers(query); + // 按用户ID去重,保留第一个记录 + Map uniqueMembers = list.stream() + .collect(Collectors.toMap( + ProjectMemberResp::getUserId, + member -> member, + (existing, replacement) -> existing // 如果有重复,保留第一个 + )); + + // 转换为列表 + List uniqueList = new ArrayList<>(uniqueMembers.values()); + // 丰富成员信息 - enrichMemberInfo(list); + enrichMemberInfo(uniqueList); // 返回分页结果 - return PageResult.ok(list); + return PageResult.ok(uniqueList); } /** @@ -86,43 +98,81 @@ public class ProjectMemberServiceImpl extends ServiceImpl teamMembers = members.stream() - .map(member -> { - ProjectKanbanDataResp.ProjectKanbanItem.TeamMemberResp teamMember = new ProjectKanbanDataResp.ProjectKanbanItem.TeamMemberResp(); - // 先复制所有同名字段 - BeanUtil.copyProperties(member, teamMember); - // 手动处理字段名不一致的字段 - teamMember.setUserName(member.getName()); // name -> userName - return teamMember; - }) + .collect(Collectors.toMap( + ProjectMemberResp::getUserId, // 按用户ID去重 + member -> { + ProjectKanbanDataResp.ProjectKanbanItem.TeamMemberResp teamMember = new ProjectKanbanDataResp.ProjectKanbanItem.TeamMemberResp(); + // 先复制所有同名字段 + BeanUtil.copyProperties(member, teamMember); + // 手动处理字段名不一致的字段 + teamMember.setUserName(member.getName()); // name -> userName + return teamMember; + }, + (existing, replacement) -> existing // 如果有重复,保留第一个 + )) + .values() + .stream() .collect(Collectors.toList()); item.setTeamMembers(teamMembers); diff --git a/core/src/main/resources/mapper/ProjectMemberMapper.xml b/core/src/main/resources/mapper/ProjectMemberMapper.xml index 81892d0..9d2ef2e 100644 --- a/core/src/main/resources/mapper/ProjectMemberMapper.xml +++ b/core/src/main/resources/mapper/ProjectMemberMapper.xml @@ -4,7 +4,7 @@