|
|
@@ -1,6 +1,7 @@
|
|
|
package nju.seec.helper.service.impl;
|
|
|
|
|
|
import com.google.common.collect.ImmutableSet;
|
|
|
+import lombok.AllArgsConstructor;
|
|
|
import lombok.SneakyThrows;
|
|
|
import nju.seec.helper.dao.ChooseDAO;
|
|
|
import nju.seec.helper.dao.CourseDAO;
|
|
|
@@ -30,7 +31,6 @@ import org.springframework.transaction.annotation.Transactional;
|
|
|
import org.springframework.web.multipart.MultipartFile;
|
|
|
|
|
|
import java.io.File;
|
|
|
-import java.time.LocalDateTime;
|
|
|
import java.util.Objects;
|
|
|
import java.util.Set;
|
|
|
import java.util.concurrent.TimeUnit;
|
|
|
@@ -40,6 +40,7 @@ import java.util.concurrent.TimeUnit;
|
|
|
*/
|
|
|
@Service
|
|
|
public class SlideServiceImpl implements SlideService {
|
|
|
+ private static final String SLIDE_STORE_DIR = "slide";
|
|
|
private static final long SLIDE_URL_LIVING_SECONDS = 20 * 60;
|
|
|
|
|
|
private final CourseDAO courseDAO;
|
|
|
@@ -77,9 +78,18 @@ public class SlideServiceImpl implements SlideService {
|
|
|
.setName(slideDTO.getName())
|
|
|
.setState(slideDTO.getState());
|
|
|
|
|
|
- handleFile(slide, slideDTO.getFile());
|
|
|
+ MultipartFile file = slideDTO.getFile();
|
|
|
+ FileInfo fileInfo = getFileInfo(file);
|
|
|
+ slide.setPages(fileInfo.pages);
|
|
|
+ slide = slideDAO.save(slide);
|
|
|
+
|
|
|
+ String objectName = getObjectName(slide.getId(), slide.getName(), fileInfo.suffix);
|
|
|
+ slide.setObjectName(objectName);
|
|
|
+ slide = slideDAO.save(slide);
|
|
|
+
|
|
|
+ fileUtils.upload(objectName, file.getInputStream());
|
|
|
|
|
|
- return new SlideVO(slideDAO.save(slide));
|
|
|
+ return new SlideVO(slide);
|
|
|
}
|
|
|
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
@@ -92,10 +102,11 @@ public class SlideServiceImpl implements SlideService {
|
|
|
if (!slideDTO.getName().equals(slide.getName())) {
|
|
|
slide.setName(slideDTO.getName());
|
|
|
String oldObjectName = slide.getObjectName();
|
|
|
- String newObjectName = getObjectName(slide.getCourseId(), slide.getName(), oldObjectName.substring(oldObjectName.lastIndexOf('.') + 1));
|
|
|
+ String newObjectName = getObjectName(slide.getId(), slide.getName(), oldObjectName.substring(oldObjectName.lastIndexOf('.') + 1));
|
|
|
slide.setObjectName(newObjectName);
|
|
|
- fileUtils.move(oldObjectName, newObjectName);
|
|
|
slide = slideDAO.save(slide);
|
|
|
+
|
|
|
+ fileUtils.move(oldObjectName, newObjectName);
|
|
|
}
|
|
|
return new SlideVO(slide);
|
|
|
}
|
|
|
@@ -117,6 +128,7 @@ public class SlideServiceImpl implements SlideService {
|
|
|
}
|
|
|
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
+ @SneakyThrows
|
|
|
@Override
|
|
|
public void modifySlideFile(LoginUser user, SlideFileDTO slideFileDTO) {
|
|
|
Slide slide = slideDAO.findSlideById(slideFileDTO.getId());
|
|
|
@@ -126,9 +138,19 @@ public class SlideServiceImpl implements SlideService {
|
|
|
throw HelperException.of(ExceptionType.FORBIDDEN, "该课件非草稿状态,无法修改其文件");
|
|
|
}
|
|
|
|
|
|
- handleFile(slide, slideFileDTO.getFile());
|
|
|
+ MultipartFile file = slideFileDTO.getFile();
|
|
|
+ FileInfo fileInfo = getFileInfo(file);
|
|
|
+ slide.setPages(fileInfo.pages);
|
|
|
|
|
|
+ String oldObjectName = slide.getObjectName();
|
|
|
+ String newObjectName = getObjectName(slide.getId(), slide.getName(), fileInfo.suffix);
|
|
|
+ slide.setObjectName(newObjectName);
|
|
|
slideDAO.save(slide);
|
|
|
+
|
|
|
+ fileUtils.upload(newObjectName, file.getInputStream());
|
|
|
+ if (!oldObjectName.equals(newObjectName)) {
|
|
|
+ fileUtils.delete(oldObjectName);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
@@ -137,41 +159,31 @@ public class SlideServiceImpl implements SlideService {
|
|
|
Slide slide = slideDAO.findSlideById(slideId);
|
|
|
AuthUtils.checkDataAuth(user.getId(), slide.getTeacherId(), "您无权删除该课件");
|
|
|
|
|
|
- String oldObjectName = slide.getObjectName();
|
|
|
- String deleteObjectName = getDeleteObjectName(slide.getCourseId(), slide.getName(), oldObjectName.substring(oldObjectName.lastIndexOf('.') + 1));
|
|
|
- slide.setObjectName(deleteObjectName);
|
|
|
slide.setDeleteAt(System.currentTimeMillis());
|
|
|
- fileUtils.move(oldObjectName, deleteObjectName);
|
|
|
slideDAO.save(slide);
|
|
|
}
|
|
|
|
|
|
@SuppressWarnings("all")
|
|
|
@SneakyThrows
|
|
|
- private void handleFile(Slide slide, MultipartFile file) {
|
|
|
+ private FileInfo getFileInfo(MultipartFile file) {
|
|
|
switch (Objects.requireNonNull(file.getContentType())) {
|
|
|
case "application/pdf":
|
|
|
// 解析页数
|
|
|
PDDocument doc = PDDocument.load(file.getInputStream());
|
|
|
- int pages = doc.getNumberOfPages();
|
|
|
- slide.setPages(pages);
|
|
|
-
|
|
|
- // 上传文件
|
|
|
- String objectName = getObjectName(slide.getCourseId(), slide.getName(), "pdf");
|
|
|
- fileUtils.upload(objectName, file.getInputStream());
|
|
|
- slide.setObjectName(objectName);
|
|
|
-
|
|
|
- break;
|
|
|
+ return FileInfo.of(doc.getNumberOfPages(), "pdf");
|
|
|
default:
|
|
|
throw HelperException.of(ExceptionType.PARAM_ERROR, "不支持的文件类型");
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- private String getObjectName(Integer courseId, String slideName, String suffix) {
|
|
|
- return courseId + File.separator + slideName + "." + suffix;
|
|
|
+ @AllArgsConstructor(staticName = "of")
|
|
|
+ private static class FileInfo {
|
|
|
+ private int pages;
|
|
|
+ private String suffix;
|
|
|
}
|
|
|
|
|
|
- private String getDeleteObjectName(Integer courseId, String slideName, String suffix) {
|
|
|
- return courseId + File.separator + "delete" + File.separator + LocalDateTime.now() + File.separator + slideName + "." + suffix;
|
|
|
+ private String getObjectName(Integer slideId, String slideName, String suffix) {
|
|
|
+ return SLIDE_STORE_DIR + File.separator + slideId + File.separator + slideName + "." + suffix;
|
|
|
}
|
|
|
|
|
|
@Transactional(readOnly = true)
|