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 3bd598e..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 @@ -1,38 +1,38 @@ -package com.dite.znpt.domain.entity; - - -import com.baomidou.mybatisplus.annotation.TableName; -import io.swagger.annotations.ApiModel; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; - -import java.time.LocalDateTime; - -@Data -@EqualsAndHashCode(callSuper = false) -@TableName("business_data_part") -@ApiModel(value="商务资料文件夹对象") -@AllArgsConstructor -@NoArgsConstructor -public class BusinessDataEntity { - - // 主键 - private Long folderId = null; - // 文件夹名称 - private String folderName = null; - // 父级文件夹 - private Long parentId = null; - // 创建人 - private Long creatorId = null; - // 创建时间 - private LocalDateTime createTime = null; - // 更新时间 - private LocalDateTime updateTime = null; - // 是否删除 - private Boolean isDeleted = false; - // 文件夹路径 - private String folderPath = null; - -} +package com.dite.znpt.domain.entity; + + +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; + +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("business_data_part") +@ApiModel(value="商务资料文件夹对象") +@AllArgsConstructor +@NoArgsConstructor +public class BusinessDataEntity { + + // 主键 + private Long folderId = null; + // 文件夹名称 + private String folderName = null; + // 父级文件夹 + private Long parentId = null; + // 创建人 + private String creatorId = null; + // 创建时间 + private LocalDateTime createTime = null; + // 更新时间 + private LocalDateTime updateTime = null; + // 是否删除 + private Boolean isDeleted = false; + // 文件夹路径 + private String folderPath = 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 6b14ed8..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 @@ -1,37 +1,39 @@ -package com.dite.znpt.domain.entity; - - -import com.baomidou.mybatisplus.annotation.TableName; -import io.swagger.annotations.ApiModel; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import java.util.Date; - -@Data -@EqualsAndHashCode(callSuper = false) -@TableName("business_data_part_file") -@ApiModel(value="商务资料对象") - -public class BusinessDataFileEntity { - - //文件id - private Long fileId = null; - //文件夹id - private Long folderId = null; - //文件名 - private String fileName = null; - //文件路径 - private String filePath = null; - //文件类型 - private String fileType = "unknown"; - //文件大小 - private Long fileSize = null; - //上传时间 - private Date uploadTime = null; - //上传人id - private Long uploaderId = null; - //是否删除 - private Boolean isDeleted = false; - -} +package com.dite.znpt.domain.entity; + + +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.Date; + +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("business_data_part_file") +@ApiModel(value="商务资料对象") + +public class BusinessDataFileEntity { + + //文件id + private Long fileId = null; + //文件夹id + private Long folderId = null; + //文件名 + private String fileName = null; + //文件路径 + private String filePath = null; + //文件类型 + private String fileType = "unknown"; + //文件大小 + private Long fileSize = null; + //上传时间 + private Date uploadTime = null; + //上传人id + 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 6192769..02d682b 100644 --- a/core/src/main/java/com/dite/znpt/mapper/BusinessDataFileMapper.java +++ b/core/src/main/java/com/dite/znpt/mapper/BusinessDataFileMapper.java @@ -1,20 +1,29 @@ -package com.dite.znpt.mapper; - -import com.dite.znpt.domain.entity.BusinessDataFileEntity; -import io.swagger.annotations.ApiOperation; -import org.apache.ibatis.annotations.Param; - -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); - - void add(BusinessDataFileEntity businessDataFileEntity); - - String getPath(Long fileId); - - // 在接口中添加重命名方法 - void reName(@Param("fileId") Long fileId, @Param("newFileName") String newFileName, @Param("newFilePath") String newFilePath); -} +package com.dite.znpt.mapper; + +import com.dite.znpt.domain.entity.BusinessDataFileEntity; +import com.dite.znpt.domain.entity.BusinessDataEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiOperation; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +import java.util.List; + +@ApiOperation("商务资料文件对象") +@Mapper +public interface BusinessDataFileMapper { + + // 新增文件预览方法 + + + public List List(@Param("folderId") Long folderId, @Param("fileName") String fileName); + void delete(@Param("fileId") Long fileId,@Param("folderId") Long folderId); + + void add(BusinessDataFileEntity businessDataFileEntity); + + String getPath(Long fileId); + + // 在接口中添加重命名方法 + void reName(@Param("fileId") Long fileId, @Param("newFileName") String newFileName, @Param("newFilePath") String newFilePath); +} 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 b92887f..b7e4bae 100644 --- a/core/src/main/java/com/dite/znpt/mapper/BusinessDataMapper.java +++ b/core/src/main/java/com/dite/znpt/mapper/BusinessDataMapper.java @@ -1,26 +1,32 @@ -package com.dite.znpt.mapper; - -import com.dite.znpt.domain.entity.BusinessDataEntity; -import io.swagger.annotations.ApiOperation; -import org.apache.ibatis.annotations.Param; - -import java.util.List; - - - - - -@ApiOperation("商务资料文件夹对象") -public interface BusinessDataMapper { - public String getPath(Long parentId); - - public List List(); - - void insert(BusinessDataEntity businessDataEntity); - - void delete(Long folderId); - - void reName(BusinessDataEntity businessDataEntity); - - public List ListWithCondition(@Param("folderName") String folderName); -} +package com.dite.znpt.mapper; + +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 java.time.LocalDateTime; +import java.util.List; + + + + + +@ApiOperation("商务资料文件夹对象") +@Mapper +public interface BusinessDataMapper { + public String getPath(Long parentId); + + public List List(); + + void insert(BusinessDataEntity businessDataEntity); + + void delete(Long folderId); + + void reName(BusinessDataEntity businessDataEntity); + + public List ListWithCondition(@Param("folderName") String folderName); +} 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 5b8d99c..9eafc83 100644 --- a/core/src/main/java/com/dite/znpt/service/BusinessDataFileService.java +++ b/core/src/main/java/com/dite/znpt/service/BusinessDataFileService.java @@ -1,27 +1,41 @@ -package com.dite.znpt.service; - -import com.dite.znpt.domain.Result; -import com.dite.znpt.domain.entity.BusinessDataFileEntity; -import com.dite.znpt.domain.page.PageBean; -import io.swagger.annotations.ApiOperation; -import org.springframework.stereotype.Service; -import org.springframework.web.bind.annotation.RequestParam; - -@ApiOperation("商务资料文件service") -@Service -public interface BusinessDataFileService { - - PageBean pageSelect(Integer page, Integer pageSize, Long folderId, String fileName); - - Result delete(@RequestParam(value = "fileId", required = false) Long fileId,@RequestParam(value = "foldelId", required = false) Long folderId); - - void add(BusinessDataFileEntity businessDataFileEntity); - - String getPath(Long fileId); - - // 在接口中添加重命名方法 - Result reName(Long fileId, String newFileName); - - // 在接口中添加预览方法 -// Result preview(Long fileId, HttpServletResponse response); -} +package com.dite.znpt.service; + +import com.dite.znpt.domain.Result; +import com.dite.znpt.domain.entity.BusinessDataFileEntity; +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; + +@ApiOperation("商务资料文件service") +@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); + + @ApiOperation("预览文件") + void 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 ec37987..f4a826c 100644 --- a/core/src/main/java/com/dite/znpt/service/BusinessDataService.java +++ b/core/src/main/java/com/dite/znpt/service/BusinessDataService.java @@ -1,15 +1,18 @@ -package com.dite.znpt.service; - -import com.dite.znpt.domain.Result; -import com.dite.znpt.domain.page.PageBean; -import io.swagger.annotations.ApiOperation; - -@ApiOperation("商务资料文件夹service") -public interface BusinessDataService { - - PageBean pageSelect(Integer page, Integer pageSize, String folderName); - Result createFolder(String folderName, Long parentId); - String getPath(Long parentId); - Result delete(Long folderId); - Result reName(Long folderId, String newName); -} +package com.dite.znpt.service; + +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 { + + PageBean pageSelect(Integer page, Integer pageSize, String folderName); + Result createFolder(String folderName, Long parentId); + 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 2392b49..660f034 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,163 +1,530 @@ -package com.dite.znpt.service.impl; - - - -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.service.BusinessDataFileService; -import com.github.pagehelper.Page; -import com.github.pagehelper.PageHelper; -import io.swagger.annotations.ApiOperation; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; -import java.io.File; -import java.io.IOException; -import java.util.List; - -import static jodd.io.FileUtil.deleteFile; -import static org.apache.tomcat.util.http.fileupload.FileUtils.deleteDirectory; - -@AllArgsConstructor -@Service -@ApiOperation("商务资料文件service实现类") -public class BusinessDataFileServiceImpl implements BusinessDataFileService { - @Resource - private BusinessDataFileMapper businessDataFileMapper; - - - @ApiOperation("分页查询文件") - @Override - public PageBean pageSelect(Integer page, Integer pageSize, Long folderId, String fileName) { - PageHelper.startPage(page, pageSize); - List list = businessDataFileMapper.List(folderId, fileName); - Page p = (Page) list; - PageBean pageBean = new PageBean(p.getTotal(), p.getResult()); - return pageBean; - } - @ApiOperation("删除文件") - public Result delete(Long fileId, Long folderId) { - //删除数据库数据 - if (folderId != null){ - businessDataFileMapper.delete(null,folderId); - System.out.println("888888888走对了"); - - return Result.okM("删除,走对了,成功"); - } - - //删除文件 - String sPath = businessDataFileMapper.getPath(fileId); - - businessDataFileMapper.delete(fileId,null); - - boolean flag = false; - File file = new File(sPath); - // 判断目录或文件是否存在 - if (!file.exists()) { // 不存在返回 false - return Result.error("文件不存在"); - } else { - // 判断是否为文件 - if (file.isFile()) { // 为文件时调用删除文件方法 - try { - deleteFile(file); - } catch (IOException e) { - throw new RuntimeException(e); - } - return Result.okM("删除成功"); - } else { // 为目录时调用删除目录方法 - try { - deleteDirectory(file); - } catch (IOException e) { - throw new RuntimeException(e); - } - return Result.okM("删除成功"); - } - } - - - } - - @ApiOperation("增加文件") - public void add(BusinessDataFileEntity businessDataFileEntity) { - businessDataFileMapper.add(businessDataFileEntity); - } - - @ApiOperation("获取文件路径") - public String getPath(Long fileId) { - return businessDataFileMapper.getPath(fileId); - } - - @ApiOperation("重命名文件") - @Override - public Result reName(Long fileId, String newFileName) { - // 参数校验 - if (fileId == null) { - return Result.error("文件ID不能为空"); - } - if (newFileName == null || newFileName.trim().isEmpty()) { - return Result.error("新文件名不能为空"); - } - if (newFileName.length() > 100) { - return Result.error("文件名过长"); - } - - try { - // 获取原文件信息 - String oldFilePath = businessDataFileMapper.getPath(fileId); - if (oldFilePath == null) { - return Result.error("文件不存在"); - } - - // 创建原文件对象 - File oldFile = new File(oldFilePath); - if (!oldFile.exists()) { - return Result.error("文件不存在"); - } - - // 构建新文件路径 - String parentPath = oldFile.getParent(); - String fileExtension = ""; - String fileNameWithoutExt = newFileName; - - // 获取原文件扩展名 - int lastDotIndex = oldFile.getName().lastIndexOf('.'); - if (lastDotIndex > 0) { - fileExtension = oldFile.getName().substring(lastDotIndex); - } - - // 如果新文件名没有扩展名,则添加原文件扩展名 - if (!newFileName.contains(".")) { - newFileName = newFileName + fileExtension; - } - - // 构建新文件路径 - String newFilePath = parentPath + File.separator + newFileName; - File newFile = new File(newFilePath); - - // 检查新文件名是否已存在 - if (newFile.exists()) { - return Result.error("文件名已存在"); - } - - // 重命名实际文件 - boolean renameSuccess = oldFile.renameTo(newFile); - if (!renameSuccess) { - return Result.error("文件重命名失败"); - } - - // 更新数据库中的文件信息 - businessDataFileMapper.reName(fileId, newFileName, newFilePath); - - return Result.okM("文件重命名成功"); - - } catch (Exception e) { - return Result.error("文件重命名失败: " + e.getMessage()); - } - } - - - -} +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; +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 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; +import static org.apache.tomcat.util.http.fileupload.FileUtils.deleteDirectory; + +@AllArgsConstructor +@Service +@ApiOperation("商务资料文件service实现类") +public class BusinessDataFileServiceImpl implements BusinessDataFileService { + @Resource + private BusinessDataFileMapper businessDataFileMapper; + @Resource + private BusinessDataService businessDataService; + + + @ApiOperation("分页查询文件") + @Override + public PageBean pageSelect(Integer page, Integer pageSize, Long folderId, String fileName) { + PageHelper.startPage(page, pageSize); + List list = businessDataFileMapper.List(folderId, fileName); + Page p = (Page) list; + PageBean pageBean = new PageBean(p.getTotal(), p.getResult()); + return pageBean; + } + @ApiOperation("删除文件") + public Result delete(Long fileId, Long folderId) { + //删除数据库数据 + if (folderId != null){ + businessDataFileMapper.delete(null,folderId); + return Result.okM("删除成功"); + } + + //删除文件 + String sPath = businessDataFileMapper.getPath(fileId); + + businessDataFileMapper.delete(fileId,null); + + boolean flag = false; + File file = new File(sPath); + // 判断目录或文件是否存在 + if (!file.exists()) { // 不存在返回 false + return Result.error("文件不存在"); + } else { + // 判断是否为文件 + if (file.isFile()) { // 为文件时调用删除文件方法 + try { + deleteFile(file); + } catch (IOException e) { + throw new RuntimeException(e); + } + return Result.okM("删除成功"); + } else { // 为目录时调用删除目录方法 + try { + deleteDirectory(file); + } catch (IOException e) { + throw new RuntimeException(e); + } + return Result.okM("删除成功"); + } + } + } + + @ApiOperation("增加文件") + public void add(BusinessDataFileEntity businessDataFileEntity) { + businessDataFileMapper.add(businessDataFileEntity); + } + + @ApiOperation("获取文件路径") + public String getPath(Long fileId) { + return businessDataFileMapper.getPath(fileId); + } + + @ApiOperation("重命名文件") + @Override + public Result reName(Long fileId, String newFileName) { + // 参数校验 + if (fileId == null) { + return Result.error("文件ID不能为空"); + } + if (newFileName == null || newFileName.trim().isEmpty()) { + return Result.error("新文件名不能为空"); + } + if (newFileName.length() > 100) { + return Result.error("文件名过长"); + } + + try { + // 获取原文件信息 + String oldFilePath = businessDataFileMapper.getPath(fileId); + if (oldFilePath == null) { + return Result.error("文件不存在"); + } + + // 创建原文件对象 + File oldFile = new File(oldFilePath); + if (!oldFile.exists()) { + return Result.error("文件不存在"); + } + + // 构建新文件路径 + String parentPath = oldFile.getParent(); + String fileExtension = ""; + String fileNameWithoutExt = newFileName; + + // 获取原文件扩展名 + int lastDotIndex = oldFile.getName().lastIndexOf('.'); + if (lastDotIndex > 0) { + fileExtension = oldFile.getName().substring(lastDotIndex); + } + + // 如果新文件名没有扩展名,则添加原文件扩展名 + if (!newFileName.contains(".")) { + newFileName = newFileName + fileExtension; + } + + // 构建新文件路径 + String newFilePath = parentPath + File.separator + newFileName; + File newFile = new File(newFilePath); + + // 检查新文件名是否已存在 + if (newFile.exists()) { + return Result.error("文件名已存在"); + } + + // 重命名实际文件 + boolean renameSuccess = oldFile.renameTo(newFile); + if (!renameSuccess) { + return Result.error("文件重命名失败"); + } + + // 更新数据库中的文件信息 + businessDataFileMapper.reName(fileId, newFileName, newFilePath); + + return Result.okM("文件重命名成功"); + + } catch (Exception e) { + return Result.error("文件重命名失败: " + e.getMessage()); + } + } + + @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("上传失败"); + } + } + + + @ApiOperation("文件预览") + public void preview(Long fileId, HttpServletResponse response) { + try { + // 获取文件路径 + String filePath = businessDataFileMapper.getPath(fileId); + if (filePath == null || filePath.isEmpty()) { + response.setContentType("application/json; charset=UTF-8"); + response.getWriter().write("{\"status\":500,\"msg\":\"文件不存在\"}"); + return; + } + + File file = new File(filePath); + if (!file.exists()) { + response.setContentType("application/json; charset=UTF-8"); + response.getWriter().write("{\"status\":500,\"msg\":\"文件不存在\"}"); + return; + } + + // 获取文件扩展名 + String extension = getFileExtension(filePath); + // ... 后续 switch 语句 + + // 根据文件类型处理预览 + switch (extension) { + case "pdf": + previewPdf(file, response); + break; + case "jpg": + case "jpeg": + case "png": + case "gif": + case "bmp": + case "webp": + previewImage(file, response); + break; + case "txt": + case "md": + case "log": + previewText(file, response); + break; + case "doc": + case "docx": + case "xls": + case "xlsx": + case "ppt": + case "pptx": + previewOffice(file, response); + break; + case "mp4": + case "avi": + case "mov": + case "wmv": + case "flv": + previewVideo(file, response); + break; + case "mp3": + case "wav": + case "flac": + case "aac": + previewAudio(file, response); + break; + default: + try { + response.setContentType("application/json; charset=UTF-8"); + response.getWriter().write("{\"status\":500,\"msg\":\"暂不支持该文件类型的预览\"}"); + } catch (IOException e) { + e.printStackTrace(); + } + break; + } + } catch (Exception e) { + try { + response.setContentType("application/json; charset=UTF-8"); + response.getWriter().write("{\"status\":500,\"msg\":\"文件预览失败: " + e.getMessage() + "\"}"); + } catch (IOException ex) { + ex.printStackTrace(); + } + } + } + + private String getFileExtension(String filePath) { + if (filePath == null || filePath.isEmpty()) { + return ""; + } + // 从路径中提取文件名 + String fileName = new File(filePath).getName(); + int lastDotIndex = fileName.lastIndexOf('.'); + if (lastDotIndex == -1) { + return ""; + } + return fileName.substring(lastDotIndex + 1).toLowerCase(); + } + + private void previewPdf(File file, HttpServletResponse response) { + try { + response.setContentType("application/pdf"); + response.setHeader("Content-Disposition", "inline; filename=" + URLEncoder.encode(file.getName(), "UTF-8")); + + 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); + } + } + } catch (Exception e) { + try { + response.setContentType("application/json; charset=UTF-8"); + response.getWriter().write("{\"status\":500,\"msg\":\"PDF预览失败: " + e.getMessage() + "\"}"); + } catch (IOException ex) { + ex.printStackTrace(); + } + } + } + + private void previewImage(File file, HttpServletResponse response) { + try { + String contentType = getImageContentType(file.getName()); + response.setContentType(contentType); + response.setHeader("Content-Disposition", "inline; filename=" + URLEncoder.encode(file.getName(), "UTF-8")); + + 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); + } + } + } catch (Exception e) { + try { + response.setContentType("application/json; charset=UTF-8"); + response.getWriter().write("{\"status\":500,\"msg\":\"图片预览失败: " + e.getMessage() + "\"}"); + } catch (IOException ex) { + ex.printStackTrace(); + } + } + } + + private void previewText(File file, HttpServletResponse response) { + try { + response.setContentType("text/plain; charset=UTF-8"); + response.setHeader("Content-Disposition", "inline; filename=" + URLEncoder.encode(file.getName(), "UTF-8")); + + 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); + } + } + } catch (Exception e) { + try { + response.setContentType("application/json; charset=UTF-8"); + response.getWriter().write("{\"status\":500,\"msg\":\"文本预览失败: " + e.getMessage() + "\"}"); + } catch (IOException ex) { + ex.printStackTrace(); + } + } + } + + private void previewOffice(File file, HttpServletResponse response) { + try { + response.setContentType("application/json; charset=UTF-8"); + response.getWriter().write("{\"status\":500,\"msg\":\"Office文件预览功能暂未实现,请下载后查看\"}"); + } catch (IOException e) { + e.printStackTrace(); + } + } + + private void previewVideo(File file, HttpServletResponse response) { + try { + String contentType = getVideoContentType(file.getName()); + response.setContentType(contentType); + response.setHeader("Content-Disposition", "inline; filename=" + URLEncoder.encode(file.getName(), "UTF-8")); + + 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); + } + } + } catch (Exception e) { + try { + response.setContentType("application/json; charset=UTF-8"); + response.getWriter().write("{\"status\":500,\"msg\":\"视频预览失败: " + e.getMessage() + "\"}"); + } catch (IOException ex) { + ex.printStackTrace(); + } + } + } + + private void previewAudio(File file, HttpServletResponse response) { + try { + String contentType = getAudioContentType(file.getName()); + response.setContentType(contentType); + response.setHeader("Content-Disposition", "inline; filename=" + URLEncoder.encode(file.getName(), "UTF-8")); + + 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); + } + } + } catch (Exception e) { + try { + response.setContentType("application/json; charset=UTF-8"); + response.getWriter().write("{\"status\":500,\"msg\":\"音频预览失败: " + e.getMessage() + "\"}"); + } catch (IOException ex) { + ex.printStackTrace(); + } + } + } + + 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/core/src/main/java/com/dite/znpt/service/impl/BusinessDataServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/BusinessDataServiceImpl.java index 3d74793..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,197 +1,179 @@ -package com.dite.znpt.service.impl; - -import com.dite.znpt.domain.Result; -import com.dite.znpt.domain.entity.BusinessDataEntity; -import com.dite.znpt.domain.page.PageBean; -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 lombok.NoArgsConstructor; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; -import java.io.File; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.time.LocalDateTime; -import java.util.Comparator; -import java.util.List; - -/** - * 商务资料文件夹实现类 - */ -@Service -@ApiOperation("商务资料文件夹service实现类") -@AllArgsConstructor -@NoArgsConstructor -public class BusinessDataServiceImpl implements BusinessDataService { - @Resource - private BusinessDataMapper businessDataMapper; - @Resource - private BusinessDataFileService businessDataFileService; - - // 从配置文件中读取基础路径(默认值:D:/upload/businessData) - // ,新建文件夹的时候,如果没指定父文件夹Id,就用这个 - @Value("${file.upload.businessDataPath:D:/upload/businessData}") - private String businessDataPath; - - @ApiOperation(value = "分页查询") - @Override - public PageBean pageSelect(Integer page, Integer pageSize, String folderName) { - PageHelper.startPage(page, pageSize); - List businessDataEntityList = businessDataMapper.ListWithCondition(folderName); - Page p = (Page) businessDataEntityList; - PageBean pageBean = new PageBean(p.getTotal(), p.getResult()); - return pageBean; - } - - @ApiOperation(value = "创建文件夹") - @Override - public Result createFolder(String folderName, Long parentId) { - //获取ID - Long loginIdAsLong = 888L; -// loginIdAsLong = StpUtil.getLoginIdAsLong(); -// - // 文件夹名称不能为空 - //TODO: 添加文件夹名称校验,后续最好更规范些,写个工具类专门校验,用正则表达式 - if (folderName == null || folderName.trim().isEmpty()) { - return Result.error("文件夹名称不能为空"); - } - if (folderName.length() > 50) { - return Result.error("文件夹名称过长"); - } - - // 文件夹名称前置一个/ - String folderName1 = "/" + folderName; - // 目标文件夹 - File targetDir=Paths.get(businessDataPath, folderName1).toFile(); - if(parentId != 0L){ - // 获取父文件夹路径 - targetDir = Paths.get(businessDataMapper.getPath(parentId), folderName1).toFile(); - } - // 创建文件夹和新增文件夹路径 - if (!targetDir.exists()) { - // 创建文件夹 - boolean created = targetDir.mkdirs(); - if (!created) { - throw new RuntimeException("文件夹创建失败: " + targetDir.getAbsolutePath()); - } - //上面是新增文件夹功能,但没有往数据库插入文件夹相关数据,所以下面新增 - // 创建BusinessDataEntity对象并设置属性 - BusinessDataEntity businessDataEntity = new BusinessDataEntity( - null, - folderName, - parentId, - loginIdAsLong, - LocalDateTime.now(), - LocalDateTime.now(), - false, - targetDir.getAbsolutePath() - ); - // 插入到数据库 - businessDataMapper.insert(businessDataEntity); - return Result.okM( "文件夹创建成功"); - } else { - return Result.error("文件夹已存在: "); - } - } - - @ApiOperation("获取文件夹路径") - public String getPath(Long parentId) { - 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); - - // 创建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); - } - } - @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")); - //想命名的原文件夹的路径 - File file1 = new File(folderPath); - //将原文件夹更改为A,其中路径是必要的。注意 - file1.renameTo(new File(newPath)); - LocalDateTime now = LocalDateTime.now(); - - BusinessDataEntity businessDataEntity = new BusinessDataEntity( - folderId, - newName, - null, - null, - null, - now, - null, - newPath - ); - System.out.println(businessDataEntity); - businessDataMapper.reName(businessDataEntity); - return Result.okM("重命名成功"); - } - -} +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; +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 lombok.NoArgsConstructor; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.io.File; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.time.LocalDateTime; +import java.util.Comparator; +import java.util.List; + +/** + * 商务资料文件夹实现类 + */ +@Service +@ApiOperation("商务资料文件夹service实现类") +@AllArgsConstructor +@NoArgsConstructor +public class BusinessDataServiceImpl implements BusinessDataService { + @Resource + private BusinessDataMapper businessDataMapper; + @Resource + private BusinessDataFileService businessDataFileService; + + // 从配置文件中读取基础路径(默认值:D:/upload/businessData) + // ,新建文件夹的时候,如果没指定父文件夹Id,就用这个 + @Value("${file.upload.businessDataPath:D:/upload/businessData}") + private String businessDataPath; + + @ApiOperation(value = "分页查询") + @Override + public PageBean pageSelect(Integer page, Integer pageSize, String folderName) { + PageHelper.startPage(page, pageSize); + List businessDataEntityList = businessDataMapper.ListWithCondition(folderName); + Page p = (Page) businessDataEntityList; + PageBean pageBean = new PageBean(p.getTotal(), p.getResult()); + return pageBean; + } + + @ApiOperation(value = "创建文件夹") + @Override + public Result createFolder(String folderName, Long parentId) { + // 获取ID + String loginIdAsLong = "未登录用户"; + if(StpUtil.isLogin()){ + loginIdAsLong = StpUtil.getLoginIdAsString(); + } + // 文件夹名称不能为空 + // TODO: 添加文件夹名称校验,后续最好更规范些,写个工具类专门校验,用正则表达式 + if (folderName == null || folderName.trim().isEmpty()) { + return Result.error("文件夹名称不能为空"); + } + if (folderName.length() > 50) { + return Result.error("文件夹名称过长"); + } + + // 文件夹名称前置一个/ + String folderName1 = "/" + folderName; + // 目标文件夹 + 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()) { + // 创建文件夹 + boolean created = targetDir.mkdirs(); + if (!created) { + throw new RuntimeException("文件夹创建失败: " + targetDir.getAbsolutePath()); + } + // 上面是新增文件夹功能,但没有往数据库插入文件夹相关数据,所以下面新增 + // 创建BusinessDataEntity对象并设置属性 + BusinessDataEntity businessDataEntity = new BusinessDataEntity( + null, + folderName, + parentId, + loginIdAsLong, + LocalDateTime.now(), + LocalDateTime.now(), + false, + targetDir.getAbsolutePath()); + // 插入到数据库 + businessDataMapper.insert(businessDataEntity); + return Result.okM("文件夹创建成功"); + } else { + return Result.error("文件夹已存在: "); + } + } + + @ApiOperation("获取文件夹路径") + public String getPath(Long parentId) { + return businessDataMapper.getPath(parentId); + } + + @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(); + + // 删除数据库中文件夹的数据 + 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; + // + // //想命名的原文件的路径 + // 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,其中路径是必要的。注意 + file1.renameTo(new File(newPath)); + LocalDateTime now = LocalDateTime.now(); + + BusinessDataEntity businessDataEntity = new BusinessDataEntity( + folderId, + newName, + null, + null, + null, + now, + null, + newPath); + businessDataMapper.reName(businessDataEntity); + return Result.okM("重命名成功"); + } +} 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 @@