|
|
@@ -6,6 +6,7 @@ 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.dao.UserDAO;
|
|
|
import nju.seec.helper.dto.LoginUser;
|
|
|
import nju.seec.helper.dto.SlideDTO;
|
|
|
import nju.seec.helper.dto.SlideFileDTO;
|
|
|
@@ -15,6 +16,7 @@ import nju.seec.helper.entity.Slide;
|
|
|
import nju.seec.helper.service.MessageService;
|
|
|
import nju.seec.helper.service.SlideService;
|
|
|
import nju.seec.helper.service.util.AuthUtils;
|
|
|
+import nju.seec.helper.service.util.StringUtils;
|
|
|
import nju.seec.helper.util.CacheUtils;
|
|
|
import nju.seec.helper.util.Consts;
|
|
|
import nju.seec.helper.util.FileUtils;
|
|
|
@@ -26,6 +28,7 @@ import nju.seec.helper.vo.SlideVO;
|
|
|
import org.apache.pdfbox.pdmodel.PDDocument;
|
|
|
import org.springframework.data.domain.Page;
|
|
|
import org.springframework.data.domain.Pageable;
|
|
|
+import org.springframework.data.jpa.domain.Specification;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
import org.springframework.web.multipart.MultipartFile;
|
|
|
@@ -46,16 +49,18 @@ public class SlideServiceImpl implements SlideService {
|
|
|
private final CourseDAO courseDAO;
|
|
|
private final SlideDAO slideDAO;
|
|
|
private final ChooseDAO chooseDAO;
|
|
|
+ private final UserDAO userDAO;
|
|
|
|
|
|
private final FileUtils fileUtils;
|
|
|
private final CacheUtils cacheUtils;
|
|
|
|
|
|
private final MessageService messageService;
|
|
|
|
|
|
- public SlideServiceImpl(CourseDAO courseDAO, SlideDAO slideDAO, ChooseDAO chooseDAO, FileUtils fileUtils, CacheUtils cacheUtils, MessageService messageService) {
|
|
|
+ public SlideServiceImpl(CourseDAO courseDAO, SlideDAO slideDAO, ChooseDAO chooseDAO, UserDAO userDAO, FileUtils fileUtils, CacheUtils cacheUtils, MessageService messageService) {
|
|
|
this.courseDAO = courseDAO;
|
|
|
this.slideDAO = slideDAO;
|
|
|
this.chooseDAO = chooseDAO;
|
|
|
+ this.userDAO = userDAO;
|
|
|
this.fileUtils = fileUtils;
|
|
|
this.cacheUtils = cacheUtils;
|
|
|
this.messageService = messageService;
|
|
|
@@ -66,15 +71,13 @@ 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.getTeacher().getId(), "您无权创建该课程的课件");
|
|
|
|
|
|
checkSameName(0L, slideDTO.getCourseId(), slideDTO.getName());
|
|
|
|
|
|
Slide slide = new Slide()
|
|
|
- .setCourseId(slideDTO.getCourseId())
|
|
|
- .setCourseName(course.getName())
|
|
|
- .setTeacherId(teacher.getId())
|
|
|
- .setTeacherName(teacher.getName())
|
|
|
+ .setCourse(course)
|
|
|
+ .setTeacher(userDAO.findUserById(teacher.getId()))
|
|
|
.setName(slideDTO.getName())
|
|
|
.setState(slideDTO.getState());
|
|
|
|
|
|
@@ -97,9 +100,9 @@ public class SlideServiceImpl implements SlideService {
|
|
|
@Override
|
|
|
public SlideVO modifySlide(LoginUser user, SlideDTO slideDTO) {
|
|
|
Slide slide = slideDAO.findSlideById(slideDTO.getId());
|
|
|
- AuthUtils.checkDataAuth(user.getId(), slide.getTeacherId(), "您无权修改该课件");
|
|
|
+ AuthUtils.checkDataAuth(user.getId(), slide.getTeacher().getId(), "您无权修改该课件");
|
|
|
|
|
|
- checkSameName(slide.getId(), slide.getCourseId(), slideDTO.getName());
|
|
|
+ checkSameName(slide.getId(), slide.getCourse().getId(), slideDTO.getName());
|
|
|
|
|
|
slide.setName(slideDTO.getName());
|
|
|
String oldObjectName = slide.getObjectName();
|
|
|
@@ -119,15 +122,15 @@ 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.getTeacher().getId(), "您无权修改该课件状态");
|
|
|
|
|
|
slide.setState(slideStateDTO.getState());
|
|
|
slide = slideDAO.save(slide);
|
|
|
|
|
|
// 增加通知
|
|
|
if (slide.getState() == SlideState.IN_CLASS) {
|
|
|
- Set<Long> studentIds = chooseDAO.findStudentIdsByCourseId(slide.getCourseId());
|
|
|
- messageService.createMessage(studentIds, MessageType.SLIDE_IN_CLASS, String.format("课程 [%s] 的课件 [%s] 已开课", slide.getCourseName(), slide.getName()), slide.getId());
|
|
|
+ Set<Long> studentIds = chooseDAO.findStudentIdsByCourseId(slide.getCourse().getId());
|
|
|
+ messageService.createMessage(studentIds, MessageType.SLIDE_IN_CLASS, String.format("课程 [%s] 的课件 [%s] 已开课", slide.getCourse().getName(), slide.getName()), slide.getId());
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -136,7 +139,7 @@ public class SlideServiceImpl implements SlideService {
|
|
|
@Override
|
|
|
public void modifySlideFile(LoginUser user, SlideFileDTO slideFileDTO) {
|
|
|
Slide slide = slideDAO.findSlideById(slideFileDTO.getId());
|
|
|
- AuthUtils.checkDataAuth(user.getId(), slide.getTeacherId(), "您无权修改该课件文件");
|
|
|
+ AuthUtils.checkDataAuth(user.getId(), slide.getTeacher().getId(), "您无权修改该课件文件");
|
|
|
|
|
|
MultipartFile file = slideFileDTO.getFile();
|
|
|
FileInfo fileInfo = getFileInfo(file);
|
|
|
@@ -157,7 +160,7 @@ public class SlideServiceImpl implements SlideService {
|
|
|
@Override
|
|
|
public void removeSlide(LoginUser user, Long slideId) {
|
|
|
Slide slide = slideDAO.findSlideById(slideId);
|
|
|
- AuthUtils.checkDataAuth(user.getId(), slide.getTeacherId(), "您无权删除该课件");
|
|
|
+ AuthUtils.checkDataAuth(user.getId(), slide.getTeacher().getId(), "您无权删除该课件");
|
|
|
|
|
|
slide.setDeleteAt(System.currentTimeMillis());
|
|
|
slideDAO.save(slide);
|
|
|
@@ -189,13 +192,13 @@ public class SlideServiceImpl implements SlideService {
|
|
|
@Transactional(readOnly = true)
|
|
|
@Override
|
|
|
public Page<SlideVO> teacherGetSlides(LoginUser teacher, String key, Pageable pageable) {
|
|
|
- return slideDAO.findByTeacherIdAndNameContains(teacher.getId(), key, pageable).map(SlideVO::new);
|
|
|
+ return findByTeacherIdAndKey(teacher.getId(), key, pageable).map(SlideVO::new);
|
|
|
}
|
|
|
|
|
|
@Transactional(readOnly = true)
|
|
|
@Override
|
|
|
public Page<SlideVO> teacherGetSlidesByCourse(LoginUser teacher, Long courseId, String key, Pageable pageable) {
|
|
|
- return slideDAO.findByCourseIdAndTeacherIdAndNameContains(courseId, teacher.getId(), key, pageable).map(SlideVO::new);
|
|
|
+ return findByCourseIdAndTeacherIdAndKey(courseId, teacher.getId(), key, pageable).map(SlideVO::new);
|
|
|
}
|
|
|
|
|
|
@Transactional(readOnly = true)
|
|
|
@@ -205,7 +208,7 @@ public class SlideServiceImpl implements SlideService {
|
|
|
throw HelperException.of(ExceptionType.FORBIDDEN, "你无权查看该课程下的课件");
|
|
|
}
|
|
|
|
|
|
- return slideDAO.findByCourseIdAndStateNotInAndNameContains(courseId, ImmutableSet.of(SlideState.DRAFT), key, pageable).map(SlideVO::new);
|
|
|
+ return findByCourseIdAndKeyAndStateNotIn(courseId, ImmutableSet.of(SlideState.DRAFT), key, pageable).map(SlideVO::new);
|
|
|
}
|
|
|
|
|
|
@Transactional(readOnly = true)
|
|
|
@@ -235,22 +238,58 @@ public class SlideServiceImpl implements SlideService {
|
|
|
* 检查同名课件
|
|
|
*/
|
|
|
private void checkSameName(Long slideId, Long courseId, String name) {
|
|
|
- if (slideDAO.existsByCourseIdAndName(slideId, courseId, name)) {
|
|
|
+ long exists = slideDAO.count((Specification<Slide>) (root, query, cb) -> cb.and(
|
|
|
+ cb.notEqual(root.get("id"), slideId),
|
|
|
+ cb.equal(root.get("deleteAt"), 0L),
|
|
|
+ cb.equal(root.get("courseId"), courseId),
|
|
|
+ cb.equal(root.get("name"), name)));
|
|
|
+
|
|
|
+ if (exists > 0) {
|
|
|
throw HelperException.of(ExceptionType.CONFLICT, "该课件名已使用");
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ private Page<Slide> findByTeacherIdAndKey(Long teacherId, String key, Pageable pageable) {
|
|
|
+ return slideDAO.findAll(
|
|
|
+ (Specification<Slide>) (root, query, cb) -> cb.and(
|
|
|
+ cb.equal(root.get("deleteAt"), 0L),
|
|
|
+ cb.equal(root.get("teacher").get("id"), teacherId),
|
|
|
+ cb.like(root.get("name"), StringUtils.keyPattern(key))),
|
|
|
+ pageable);
|
|
|
+ }
|
|
|
+
|
|
|
+ private Page<Slide> findByCourseIdAndTeacherIdAndKey(Long courseId, Long teacherId, String key, Pageable pageable) {
|
|
|
+ return slideDAO.findAll(
|
|
|
+ (Specification<Slide>) (root, query, cb) -> cb.and(
|
|
|
+ cb.equal(root.get("deleteAt"), 0L),
|
|
|
+ cb.equal(root.get("courseId"), courseId),
|
|
|
+ cb.equal(root.get("teacher").get("id"), teacherId),
|
|
|
+ cb.like(root.get("name"), StringUtils.keyPattern(key))),
|
|
|
+ pageable);
|
|
|
+ }
|
|
|
+
|
|
|
+ private Page<Slide> findByCourseIdAndKeyAndStateNotIn(Long courseId, Set<SlideState> exclusiveStates, String key, Pageable pageable) {
|
|
|
+ return slideDAO.findAll(
|
|
|
+ (Specification<Slide>) (root, query, cb) -> cb.and(
|
|
|
+ cb.equal(root.get("deleteAt"), 0L),
|
|
|
+ cb.equal(root.get("courseId"), courseId),
|
|
|
+ cb.not(root.get("state").in(exclusiveStates)),
|
|
|
+ cb.like(root.get("name"), StringUtils.keyPattern(key))
|
|
|
+ ),
|
|
|
+ pageable);
|
|
|
+ }
|
|
|
+
|
|
|
private void checkDataAccessAuth(LoginUser user, Slide slide) {
|
|
|
HelperException forbiddenEx = HelperException.of(ExceptionType.FORBIDDEN, "您无权访问该课件");
|
|
|
|
|
|
switch (user.getType()) {
|
|
|
case TEACHER:
|
|
|
- if (!slide.getTeacherId().equals(user.getId())) {
|
|
|
+ if (!slide.getTeacher().getId().equals(user.getId())) {
|
|
|
throw forbiddenEx;
|
|
|
}
|
|
|
break;
|
|
|
case STUDENT:
|
|
|
- if (!chooseDAO.existsByStudentIdAndCourseId(user.getId(), slide.getCourseId())
|
|
|
+ if (!chooseDAO.existsByStudentIdAndCourseId(user.getId(), slide.getCourse().getId())
|
|
|
|| slide.getState() == SlideState.DRAFT) {
|
|
|
throw forbiddenEx;
|
|
|
}
|