|
|
@@ -1,15 +1,11 @@
|
|
|
package nju.seec.helper.service.impl;
|
|
|
|
|
|
import com.google.common.collect.ImmutableSet;
|
|
|
-import lombok.Cleanup;
|
|
|
import lombok.SneakyThrows;
|
|
|
import nju.seec.helper.dao.ChooseDAO;
|
|
|
import nju.seec.helper.dao.CourseDAO;
|
|
|
import nju.seec.helper.dao.SlideDAO;
|
|
|
-import nju.seec.helper.dto.LoginUser;
|
|
|
-import nju.seec.helper.dto.ModifySlideDTO;
|
|
|
-import nju.seec.helper.dto.SlideDTO;
|
|
|
-import nju.seec.helper.dto.SlideStateDTO;
|
|
|
+import nju.seec.helper.dto.*;
|
|
|
import nju.seec.helper.entity.Course;
|
|
|
import nju.seec.helper.entity.Slide;
|
|
|
import nju.seec.helper.service.MessageService;
|
|
|
@@ -30,8 +26,7 @@ import org.springframework.stereotype.Service;
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
import org.springframework.web.multipart.MultipartFile;
|
|
|
|
|
|
-import java.io.InputStream;
|
|
|
-import java.time.LocalDateTime;
|
|
|
+import java.io.File;
|
|
|
import java.util.Objects;
|
|
|
import java.util.Set;
|
|
|
import java.util.concurrent.TimeUnit;
|
|
|
@@ -66,7 +61,9 @@ public class SlideServiceImpl implements SlideService {
|
|
|
@Override
|
|
|
public SlideVO createSlide(LoginUser teacher, SlideDTO slideDTO) {
|
|
|
Course course = courseDAO.findCourseById(slideDTO.getCourseId());
|
|
|
- AuthUtils.checkDataAuth(teacher.getId(), course.getTeacherId(), "您无权创建该课程的幻灯片");
|
|
|
+ AuthUtils.checkDataAuth(teacher.getId(), course.getTeacherId(), "您无权创建该课程的课件");
|
|
|
+
|
|
|
+ checkSameName(0, slideDTO.getCourseId(), slideDTO.getName());
|
|
|
|
|
|
Slide slide = new Slide()
|
|
|
.setCourseId(slideDTO.getCourseId())
|
|
|
@@ -76,25 +73,7 @@ public class SlideServiceImpl implements SlideService {
|
|
|
.setName(slideDTO.getName())
|
|
|
.setState(slideDTO.getState());
|
|
|
|
|
|
- // 解析文件页数
|
|
|
- MultipartFile file = slideDTO.getFile();
|
|
|
- int pages;
|
|
|
- switch (Objects.requireNonNull(file.getContentType())) {
|
|
|
- // pdf
|
|
|
- case "application/pdf":
|
|
|
- @Cleanup InputStream fileInputStream = file.getInputStream();
|
|
|
- PDDocument doc = PDDocument.load(fileInputStream);
|
|
|
- pages = doc.getNumberOfPages();
|
|
|
- break;
|
|
|
- default:
|
|
|
- throw HelperException.of(ExceptionType.PARAM_ERROR, "不支持的文件类型");
|
|
|
- }
|
|
|
-
|
|
|
- slide.setPages(pages);
|
|
|
-
|
|
|
- // 上传文件
|
|
|
- String objectName = fileUtils.upload(LocalDateTime.now().toString() + "-" + file.getOriginalFilename(), file.getInputStream());
|
|
|
- slide.setObjectName(objectName);
|
|
|
+ handleFile(slide, slideDTO.getFile());
|
|
|
|
|
|
return new SlideVO(slideDAO.save(slide));
|
|
|
}
|
|
|
@@ -103,8 +82,9 @@ public class SlideServiceImpl implements SlideService {
|
|
|
@Override
|
|
|
public SlideVO modifySlide(LoginUser user, ModifySlideDTO modifySlideDTO) {
|
|
|
Slide slide = slideDAO.findSlideById(modifySlideDTO.getId());
|
|
|
- AuthUtils.checkDataAuth(user.getId(), slide.getTeacherId(), "您无权修改该幻灯片");
|
|
|
+ AuthUtils.checkDataAuth(user.getId(), slide.getTeacherId(), "您无权修改该课件");
|
|
|
|
|
|
+ checkSameName(slide.getId(), slide.getCourseId(), modifySlideDTO.getName());
|
|
|
slide.setName(modifySlideDTO.getName());
|
|
|
slide = slideDAO.save(slide);
|
|
|
return new SlideVO(slide);
|
|
|
@@ -114,7 +94,7 @@ public class SlideServiceImpl implements SlideService {
|
|
|
@Override
|
|
|
public void modifySlideState(LoginUser user, SlideStateDTO slideStateDTO) {
|
|
|
Slide slide = slideDAO.findSlideById(slideStateDTO.getId());
|
|
|
- AuthUtils.checkDataAuth(user.getId(), slide.getTeacherId(), "您无权修改该幻灯片状态");
|
|
|
+ AuthUtils.checkDataAuth(user.getId(), slide.getTeacherId(), "您无权修改该课件状态");
|
|
|
|
|
|
slide.setState(slideStateDTO.getState());
|
|
|
slide = slideDAO.save(slide);
|
|
|
@@ -126,11 +106,46 @@ public class SlideServiceImpl implements SlideService {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ @Override
|
|
|
+ public void modifySlideFile(LoginUser user, SlideFileDTO slideFileDTO) {
|
|
|
+ Slide slide = slideDAO.findSlideById(slideFileDTO.getId());
|
|
|
+ AuthUtils.checkDataAuth(user.getId(), slide.getTeacherId(), "您无权修改该课件文件");
|
|
|
+
|
|
|
+ if (slide.getState() != SlideState.DRAFT) {
|
|
|
+ throw HelperException.of(ExceptionType.FORBIDDEN, "该课件非草稿状态,无法修改其文件");
|
|
|
+ }
|
|
|
+
|
|
|
+ handleFile(slide, slideFileDTO.getFile());
|
|
|
+
|
|
|
+ slideDAO.save(slide);
|
|
|
+ }
|
|
|
+
|
|
|
+ @SneakyThrows
|
|
|
+ private void handleFile(Slide slide, 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 = slide.getCourseId() + File.separator + slide.getName() + ".pdf";
|
|
|
+ fileUtils.upload(objectName, file.getInputStream());
|
|
|
+ slide.setObjectName(objectName);
|
|
|
+
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ throw HelperException.of(ExceptionType.PARAM_ERROR, "不支持的文件类型");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
@Override
|
|
|
public void removeSlide(LoginUser user, Integer slideId) {
|
|
|
Slide slide = slideDAO.findSlideById(slideId);
|
|
|
- AuthUtils.checkDataAuth(user.getId(), slide.getTeacherId(), "您无权删除该幻灯片");
|
|
|
+ AuthUtils.checkDataAuth(user.getId(), slide.getTeacherId(), "您无权删除该课件");
|
|
|
|
|
|
slide.setDeleteAt(System.currentTimeMillis());
|
|
|
slideDAO.save(slide);
|
|
|
@@ -152,7 +167,7 @@ public class SlideServiceImpl implements SlideService {
|
|
|
@Override
|
|
|
public Page<SlideVO> studentGetSlidesByCourse(LoginUser student, Integer courseId, String key, Pageable pageable) {
|
|
|
if (!chooseDAO.existsByStudentIdAndCourseId(student.getId(), courseId)) {
|
|
|
- throw HelperException.of(ExceptionType.FORBIDDEN, "你无权查看该课程下的幻灯片");
|
|
|
+ throw HelperException.of(ExceptionType.FORBIDDEN, "你无权查看该课程下的课件");
|
|
|
}
|
|
|
|
|
|
return slideDAO.findByCourseIdAndStateNotInAndNameContains(courseId, ImmutableSet.of(SlideState.DRAFT), key, pageable).map(SlideVO::new);
|
|
|
@@ -181,8 +196,17 @@ public class SlideServiceImpl implements SlideService {
|
|
|
return new SlideVO(slide);
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 检查同名课件
|
|
|
+ */
|
|
|
+ private void checkSameName(Integer slideId, Integer courseId, String name) {
|
|
|
+ if (slideDAO.existsByCourseIdAndName(slideId, courseId, name)) {
|
|
|
+ throw HelperException.of(ExceptionType.CONFLICT, "该课件名已使用");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
private void checkDataAccessAuth(LoginUser user, Slide slide) {
|
|
|
- HelperException forbiddenEx = HelperException.of(ExceptionType.FORBIDDEN, "您无权访问该幻灯片");
|
|
|
+ HelperException forbiddenEx = HelperException.of(ExceptionType.FORBIDDEN, "您无权访问该课件");
|
|
|
|
|
|
switch (user.getType()) {
|
|
|
case TEACHER:
|