CourseServiceImpl.java 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. package nju.seec.helper.service.impl;
  2. import nju.seec.helper.dao.ChooseDAO;
  3. import nju.seec.helper.dao.CourseDAO;
  4. import nju.seec.helper.dao.UserDAO;
  5. import nju.seec.helper.dto.course.ChooseDTO;
  6. import nju.seec.helper.dto.course.CourseDTO;
  7. import nju.seec.helper.dto.user.LoginUser;
  8. import nju.seec.helper.entity.Choose;
  9. import nju.seec.helper.entity.Course;
  10. import nju.seec.helper.service.CourseService;
  11. import nju.seec.helper.service.util.AuthUtils;
  12. import nju.seec.helper.service.util.StringUtils;
  13. import nju.seec.helper.util.EncryptUtils;
  14. import nju.seec.helper.util.enums.ExceptionType;
  15. import nju.seec.helper.util.exception.HelperException;
  16. import nju.seec.helper.vo.CourseVO;
  17. import nju.seec.helper.vo.UserVO;
  18. import org.springframework.data.domain.Page;
  19. import org.springframework.data.domain.Pageable;
  20. import org.springframework.data.jpa.domain.Specification;
  21. import org.springframework.stereotype.Service;
  22. import org.springframework.transaction.annotation.Transactional;
  23. import javax.persistence.criteria.JoinType;
  24. import java.util.Set;
  25. /**
  26. * @author cst
  27. */
  28. @Service
  29. public class CourseServiceImpl implements CourseService {
  30. private final UserDAO userDAO;
  31. private final CourseDAO courseDAO;
  32. private final ChooseDAO chooseDAO;
  33. public CourseServiceImpl(UserDAO userDAO, CourseDAO courseDAO, ChooseDAO chooseDAO) {
  34. this.userDAO = userDAO;
  35. this.courseDAO = courseDAO;
  36. this.chooseDAO = chooseDAO;
  37. }
  38. @Transactional(rollbackFor = Exception.class)
  39. @Override
  40. public CourseVO createCourse(LoginUser teacher, CourseDTO courseDTO) {
  41. // 检查
  42. checkSameCourseName(0L, teacher.getId(), courseDTO.getName());
  43. Course course = new Course()
  44. .setTeacher(userDAO.findUserById(teacher.getId()))
  45. .setName(courseDTO.getName())
  46. .setBio(courseDTO.getBio())
  47. .setCode(EncryptUtils.encode(courseDTO.getCode()));
  48. course = courseDAO.save(course);
  49. return new CourseVO(course);
  50. }
  51. @Transactional(rollbackFor = Exception.class)
  52. @Override
  53. public CourseVO modifyCourse(LoginUser user, Long courseId, CourseDTO courseDTO) {
  54. Course course = courseDAO.findCourseById(courseId);
  55. // 检查
  56. AuthUtils.checkDataAuth(user.getId(), course.getTeacher().getId(), "您无权修改该课程");
  57. checkSameCourseName(course.getId(), user.getId(), courseDTO.getName());
  58. course.setName(courseDTO.getName())
  59. .setBio(courseDTO.getBio())
  60. .setCode(EncryptUtils.encode(courseDTO.getCode()));
  61. course = courseDAO.save(course);
  62. return new CourseVO(course);
  63. }
  64. @Transactional(rollbackFor = Exception.class)
  65. @Override
  66. public void removeCourse(LoginUser user, Long courseId) {
  67. Course course = courseDAO.findCourseById(courseId);
  68. AuthUtils.checkDataAuth(user.getId(), course.getTeacher().getId(), "您无权删除该课程");
  69. course.setDeleteAt(System.currentTimeMillis());
  70. courseDAO.save(course);
  71. }
  72. @Transactional(rollbackFor = Exception.class)
  73. @Override
  74. public void chooseCourse(LoginUser student, Long courseId, ChooseDTO chooseDTO) {
  75. Long studentId = student.getId();
  76. if (chooseDAO.existsByStudentIdAndCourseId(studentId, courseId)) {
  77. throw HelperException.of(ExceptionType.CONFLICT, "您已选课");
  78. }
  79. if (!courseDAO.existsByIdAndCode(courseId, EncryptUtils.encode(chooseDTO.getCode()))) {
  80. throw HelperException.of(ExceptionType.NOT_FOUND, "选课码错误");
  81. }
  82. Choose choose = new Choose()
  83. .setCourseId(courseId)
  84. .setStudentId(studentId);
  85. chooseDAO.save(choose);
  86. }
  87. @Transactional(rollbackFor = Exception.class)
  88. @Override
  89. public void quitCourse(LoginUser user, Long courseId) {
  90. chooseDAO.deleteByStudentIdAndCourseId(user.getId(), courseId);
  91. }
  92. @Transactional(readOnly = true)
  93. @Override
  94. public Page<CourseVO> getCourses(String key, Pageable pageable) {
  95. return findByKey(key, pageable).map(CourseVO::new);
  96. }
  97. @Transactional(readOnly = true)
  98. @Override
  99. public Page<CourseVO> getCourses(LoginUser user, String key, Pageable pageable) {
  100. switch (user.getType()) {
  101. case TEACHER:
  102. return teacherGetCourses(user.getId(), key, pageable);
  103. case STUDENT:
  104. return studentGetCourses(user.getId(), key, pageable);
  105. default:
  106. return Page.empty();
  107. }
  108. }
  109. private Page<CourseVO> teacherGetCourses(Long teacherId, String key, Pageable pageable) {
  110. return findByTeacherIdAndKey(teacherId, key, pageable).map(CourseVO::new);
  111. }
  112. private Page<CourseVO> studentGetCourses(Long studentId, String key, Pageable pageable) {
  113. return findByIdsAndKey(chooseDAO.findCourseIdsByStudentId(studentId), key, pageable).map(CourseVO::new);
  114. }
  115. @Transactional(readOnly = true)
  116. @Override
  117. public String getCourseCode(LoginUser user, Long courseId) {
  118. Course course = courseDAO.findCourseById(courseId);
  119. AuthUtils.checkDataAuth(user.getId(), course.getTeacher().getId(), "您无权获取该课程选课码");
  120. return EncryptUtils.decode(course.getCode());
  121. }
  122. @Transactional(readOnly = true)
  123. @Override
  124. public CourseVO getOneCourse(Long courseId) {
  125. return new CourseVO(courseDAO.findCourseById(courseId));
  126. }
  127. @Transactional(readOnly = true)
  128. @Override
  129. public Page<UserVO> getChooseStudents(LoginUser user, Long courseId, String key, Pageable pageable) {
  130. Course course = courseDAO.findCourseById(courseId);
  131. AuthUtils.checkDataAuth(user.getId(), course.getTeacher().getId(), "您无权获取该课程的选课名单");
  132. return userDAO.findByIdIn(chooseDAO.findStudentIdsByCourseId(courseId), pageable).map(UserVO::new);
  133. }
  134. @Override
  135. public boolean existsCourseResourcesGetAuth(LoginUser user, Long courseId) {
  136. switch (user.getType()) {
  137. case TEACHER:
  138. return courseDAO.findCourseById(courseId).getTeacher().getId().equals(user.getId());
  139. case STUDENT:
  140. return chooseDAO.existsByStudentIdAndCourseId(user.getId(), courseId);
  141. default:
  142. return false;
  143. }
  144. }
  145. private void checkSameCourseName(Long courseId, Long teacherId, String name) {
  146. long exists = courseDAO.count((Specification<Course>) (root, query, cb) ->
  147. cb.and(cb.notEqual(root.get("id"), courseId)
  148. , cb.equal(root.get("teacher").get("id"), teacherId)
  149. , cb.equal(root.get("deleteAt"), 0L)
  150. , cb.equal(root.get("name"), name)
  151. ));
  152. if (exists > 0) {
  153. throw HelperException.of(ExceptionType.CONFLICT, "该课程名已使用");
  154. }
  155. }
  156. private Page<Course> findByTeacherIdAndKey(Long teacherId, String key, Pageable pageable) {
  157. return courseDAO.findAll(
  158. (Specification<Course>) (root, query, cb) -> cb.and(
  159. cb.equal(root.get("teacher").get("id"), teacherId)
  160. , cb.equal(root.get("deleteAt"), 0L)
  161. // , cb.like(root.get("name"), StringUtils.keyPattern(key))
  162. ),
  163. pageable);
  164. }
  165. private Page<Course> findByKey(String key, Pageable pageable) {
  166. final String keyPattern = StringUtils.keyPattern(key);
  167. return courseDAO.findAll(
  168. (Specification<Course>) (root, query, cb) -> cb.and(
  169. cb.equal(root.get("deleteAt"), 0L)
  170. , cb.or(cb.like(root.get("name"), keyPattern), cb.like(root.join("teacher", JoinType.LEFT).get("name"), keyPattern))
  171. ),
  172. pageable);
  173. }
  174. private Page<Course> findByIdsAndKey(Set<Long> courseIds, String key, Pageable pageable) {
  175. final String keyPattern = StringUtils.keyPattern(key);
  176. return courseDAO.findAll(
  177. (Specification<Course>) (root, query, cb) -> cb.and(
  178. root.get("id").in(courseIds)
  179. , cb.equal(root.get("deleteAt"), 0L)
  180. , cb.or(cb.like(root.get("name"), keyPattern), cb.like(root.join("teacher", JoinType.LEFT).get("name"), keyPattern))
  181. ),
  182. pageable);
  183. }
  184. }