CourseServiceImpl.java 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  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.dto.ChooseDTO;
  5. import nju.seec.helper.dto.CourseDTO;
  6. import nju.seec.helper.dto.LoginUser;
  7. import nju.seec.helper.entity.Choose;
  8. import nju.seec.helper.entity.Course;
  9. import nju.seec.helper.service.CourseService;
  10. import nju.seec.helper.service.util.AuthUtils;
  11. import nju.seec.helper.service.util.RefreshUtils;
  12. import nju.seec.helper.util.EncryptUtils;
  13. import nju.seec.helper.util.enums.ExceptionType;
  14. import nju.seec.helper.util.exception.HelperException;
  15. import nju.seec.helper.vo.CourseVO;
  16. import org.springframework.data.domain.Page;
  17. import org.springframework.data.domain.Pageable;
  18. import org.springframework.stereotype.Service;
  19. import org.springframework.transaction.annotation.Transactional;
  20. /**
  21. * @author cst
  22. */
  23. @Service
  24. public class CourseServiceImpl implements CourseService {
  25. private final CourseDAO courseDAO;
  26. private final ChooseDAO chooseDAO;
  27. private final RefreshUtils refreshUtils;
  28. public CourseServiceImpl(CourseDAO courseDAO, ChooseDAO chooseDAO, RefreshUtils refreshUtils) {
  29. this.courseDAO = courseDAO;
  30. this.chooseDAO = chooseDAO;
  31. this.refreshUtils = refreshUtils;
  32. }
  33. @Transactional(rollbackFor = Exception.class)
  34. @Override
  35. public CourseVO createCourse(LoginUser teacher, CourseDTO courseDTO) {
  36. // 检查
  37. checkSameCourseName(0, teacher.getId(), courseDTO.getName());
  38. Course course = new Course()
  39. .setTeacherId(teacher.getId())
  40. .setTeacherName(teacher.getName())
  41. .setName(courseDTO.getName())
  42. .setBio(courseDTO.getBio())
  43. .setCode(EncryptUtils.encode(courseDTO.getCode()));
  44. course = courseDAO.save(course);
  45. return new CourseVO(course);
  46. }
  47. @Transactional(rollbackFor = Exception.class)
  48. @Override
  49. public CourseVO modifyCourse(LoginUser user, CourseDTO courseDTO) {
  50. Course course = courseDAO.findCourseById(courseDTO.getId());
  51. // 检查
  52. AuthUtils.checkDataAuth(user.getId(), course.getTeacherId(), "您无权修改该课程");
  53. checkSameCourseName(course.getId(), user.getId(), courseDTO.getName());
  54. course.setName(courseDTO.getName())
  55. .setBio(courseDTO.getBio())
  56. .setCode(EncryptUtils.encode(courseDTO.getCode()));
  57. course = courseDAO.save(course);
  58. refreshUtils.refreshCourse(course);
  59. return new CourseVO(course);
  60. }
  61. @Transactional(rollbackFor = Exception.class)
  62. @Override
  63. public void removeCourse(LoginUser user, Integer courseId) {
  64. Course course = courseDAO.findCourseById(courseId);
  65. AuthUtils.checkDataAuth(user.getId(), course.getTeacherId(), "您无权删除该课程");
  66. course.setDeleteAt(System.currentTimeMillis());
  67. courseDAO.save(course);
  68. }
  69. @Transactional(rollbackFor = Exception.class)
  70. @Override
  71. public void chooseCourse(LoginUser student, ChooseDTO chooseDTO) {
  72. Integer studentId = student.getId();
  73. if (chooseDAO.existsByStudentIdAndCourseId(studentId, chooseDTO.getCourseId())) {
  74. throw HelperException.of(ExceptionType.CONFLICT, "您已选课");
  75. }
  76. Course course = courseDAO.findCourseById(chooseDTO.getCourseId());
  77. if (!course.getCode().equals(EncryptUtils.encode(chooseDTO.getCode()))) {
  78. throw HelperException.of(ExceptionType.NOT_FOUND, "选课码错误");
  79. }
  80. Choose choose = new Choose()
  81. .setCourseId(chooseDTO.getCourseId())
  82. .setStudentId(studentId);
  83. chooseDAO.save(choose);
  84. }
  85. @Transactional(rollbackFor = Exception.class)
  86. @Override
  87. public void quitCourse(LoginUser user, Integer courseId) {
  88. Choose choose = chooseDAO.findByStudentIdAndCourseId(user.getId(), courseId)
  89. .orElseThrow(() -> HelperException.of(ExceptionType.NOT_FOUND, "找不到选课信息"));
  90. chooseDAO.deleteById(choose.getId());
  91. }
  92. @Transactional(readOnly = true)
  93. @Override
  94. public Page<CourseVO> getCourses(String key, Pageable pageable) {
  95. return courseDAO.findByKey(key, pageable).map(CourseVO::new);
  96. }
  97. @Transactional(readOnly = true)
  98. @Override
  99. public Page<CourseVO> teacherGetCourses(LoginUser teacher, String key, Pageable pageable) {
  100. return courseDAO.findByTeacherIdAndKey(teacher.getId(), key, pageable).map(CourseVO::new);
  101. }
  102. @Transactional(readOnly = true)
  103. @Override
  104. public Page<CourseVO> studentGetCourses(LoginUser student, String key, Pageable pageable) {
  105. return courseDAO
  106. .findByIdsAndKey(
  107. chooseDAO.findCourseIdsByStudentId(student.getId()),
  108. key,
  109. pageable)
  110. .map(CourseVO::new);
  111. }
  112. @Transactional(readOnly = true)
  113. @Override
  114. public String getCourseCode(LoginUser user, Integer courseId) {
  115. Course course = courseDAO.findCourseById(courseId);
  116. AuthUtils.checkDataAuth(user.getId(), course.getTeacherId(), "您无权查看该课程选课码");
  117. return EncryptUtils.decode(course.getCode());
  118. }
  119. @Transactional(readOnly = true)
  120. @Override
  121. public CourseVO getOneCourse(Integer courseId) {
  122. return new CourseVO(courseDAO.findCourseById(courseId));
  123. }
  124. /**
  125. * 检查同名课程
  126. */
  127. private void checkSameCourseName(Integer courseId, Integer teacherId, String name) {
  128. if (courseDAO.existsByTeacherIdAndName(courseId, teacherId, name)) {
  129. throw HelperException.of(ExceptionType.CONFLICT, "该课程名已使用");
  130. }
  131. }
  132. }