QuizController.java 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. package nju.seec.helper.controller;
  2. import nju.seec.helper.sys.dataanalysis.constant.EventAction;
  3. import nju.seec.helper.sys.dataanalysis.constant.EventType;
  4. import nju.seec.helper.aspect.auth.Auth;
  5. import nju.seec.helper.aspect.auth.LoginUser;
  6. import nju.seec.helper.aspect.event.Event;
  7. import nju.seec.helper.aspect.record.ExerciseRecord;
  8. import nju.seec.helper.controller.response.PageResponse;
  9. import nju.seec.helper.dto.groups.Create;
  10. import nju.seec.helper.dto.groups.Modify;
  11. import nju.seec.helper.dto.quiz.QuizDTO;
  12. import nju.seec.helper.dto.question.StudentAnswerDTO;
  13. import nju.seec.helper.enums.QuizState;
  14. import nju.seec.helper.enums.UserRole;
  15. import nju.seec.helper.service.QuizService;
  16. import nju.seec.helper.service.QuizStudentAnswerService;
  17. import nju.seec.helper.vo.quiz.QuizStudentAnswerStatisticVO;
  18. import nju.seec.helper.vo.quiz.QuizStudentAnswerVO;
  19. import nju.seec.helper.vo.quiz.QuizVO;
  20. import org.springframework.data.domain.Pageable;
  21. import org.springframework.data.web.PageableDefault;
  22. import org.springframework.validation.annotation.Validated;
  23. import org.springframework.web.bind.annotation.*;
  24. /**
  25. * 测试
  26. *
  27. * @author xst
  28. * <p>
  29. * updated by cst
  30. */
  31. @RestController
  32. @RequestMapping("/api/quiz")
  33. public class QuizController {
  34. private final QuizService quizService;
  35. private final QuizStudentAnswerService quizStudentAnswerService;
  36. public QuizController(QuizService quizService, QuizStudentAnswerService quizStudentAnswerService) {
  37. this.quizService = quizService;
  38. this.quizStudentAnswerService = quizStudentAnswerService;
  39. }
  40. /**
  41. * 基于课件获取测试列表
  42. */
  43. @Auth(roles = {UserRole.TEACHER, UserRole.STUDENT}, message = "获得测试列表")
  44. @GetMapping("/slide/{slideId}")
  45. public PageResponse<QuizVO> getQuizzesBySlide(LoginUser user,
  46. @PathVariable Long slideId,
  47. @RequestParam(required = false, defaultValue = "") String key,
  48. @PageableDefault(Integer.MAX_VALUE) Pageable pageable) {
  49. switch (user.getRole()) {
  50. case TEACHER:
  51. return PageResponse.of(quizService.teacherGetQuizzesBySlide(user, slideId, key, pageable));
  52. case STUDENT:
  53. return PageResponse.of(quizService.studentGetQuizzesBySlide(user, slideId, key, pageable));
  54. default:
  55. return PageResponse.empty();
  56. }
  57. }
  58. /**
  59. * 基于状态获取测试列表
  60. */
  61. @Auth(roles = {UserRole.TEACHER, UserRole.STUDENT}, message = "获取测试列表")
  62. @GetMapping("/state")
  63. public PageResponse<QuizVO> getQuizzesByState(LoginUser user,
  64. QuizState state,
  65. @RequestParam(required = false, defaultValue = "") String key,
  66. @PageableDefault(Integer.MAX_VALUE) Pageable pageable) {
  67. switch (user.getRole()) {
  68. case TEACHER:
  69. return PageResponse.of(quizService.teacherGetQuizzesByState(user, state, key, pageable));
  70. case STUDENT:
  71. return PageResponse.of(quizService.studentGetQuizzesByState(user, state, key, pageable));
  72. default:
  73. return PageResponse.empty();
  74. }
  75. }
  76. /**
  77. * 获得某一测试的详细内容
  78. */
  79. @Auth(roles = {UserRole.STUDENT, UserRole.TEACHER}, message = "获得测试")
  80. @GetMapping("/{quizId}")
  81. public QuizVO getOneQuiz(LoginUser user, @PathVariable("quizId") Long quizId) {
  82. return quizService.getOneQuiz(user, quizId);
  83. }
  84. /**
  85. * 创建测试
  86. */
  87. @Auth(roles = {UserRole.TEACHER}, message = "创建测试")
  88. @PostMapping
  89. public QuizVO createQuiz(LoginUser user, @Validated(Create.class) @RequestBody QuizDTO quizDTO) {
  90. return quizService.createQuiz(user, quizDTO);
  91. }
  92. /**
  93. * 修改测试 (仅限无人提交时可以修改)
  94. */
  95. @Auth(roles = {UserRole.TEACHER}, message = "修改测试")
  96. @PutMapping("/{quizId}")
  97. public QuizVO updateQuiz(LoginUser user, @PathVariable Long quizId, @Validated(Modify.class) @RequestBody QuizDTO quizDTO) {
  98. return quizService.modifyQuiz(user, quizId, quizDTO);
  99. }
  100. /**
  101. * 删除测试 (伪删除)
  102. */
  103. @Auth(roles = {UserRole.TEACHER}, message = "删除测试")
  104. @DeleteMapping("/{quizId}")
  105. public void deleteQuiz(LoginUser user, @PathVariable("quizId") String quizId) {
  106. quizService.deleteQuiz(user, Long.valueOf(quizId));
  107. }
  108. /**
  109. * 提交作答
  110. */
  111. @ExerciseRecord
  112. @Event(type = EventType.QUIZ, action = EventAction.COMPLETE)
  113. @Auth(roles = {UserRole.STUDENT}, message = "提交作答")
  114. @PostMapping("/{quizId}/student-answer")
  115. public QuizStudentAnswerVO submitQuizStudentAnswer(LoginUser user, @PathVariable Long quizId, @Validated @RequestBody StudentAnswerDTO studentAnswerDTO) {
  116. return quizStudentAnswerService.submitQuizStudentAnswer(user, quizId, studentAnswerDTO);
  117. }
  118. /**
  119. * 获取测试作答列表
  120. */
  121. @Auth(roles = {UserRole.TEACHER}, message = "获取学生作答")
  122. @GetMapping("/{quizId}/student-answers")
  123. public PageResponse<QuizStudentAnswerVO> getQuizStudentAnswers(LoginUser user,
  124. @PathVariable Long quizId,
  125. @RequestParam(required = false, defaultValue = "") String key,
  126. @PageableDefault(size = Integer.MAX_VALUE) Pageable pageable) {
  127. return PageResponse.of(quizStudentAnswerService.getQuizStudentAnswers(user, quizId, key, pageable));
  128. }
  129. /**
  130. * 学生获取某一测试自己的作答
  131. */
  132. @Auth(roles = {UserRole.STUDENT}, message = "获取作答")
  133. @GetMapping("/{quizId}/student-answer")
  134. public QuizStudentAnswerVO getOneQuizStudentAnswer(LoginUser user, @PathVariable Long quizId) {
  135. return quizStudentAnswerService.getQuizStudentAnswer(user, quizId);
  136. }
  137. /**
  138. * 获取测试作答提交的统计信息
  139. */
  140. @Auth(roles = {UserRole.TEACHER}, message = "获取测试统计消息")
  141. @GetMapping("/{quizId}/statistic")
  142. public QuizStudentAnswerStatisticVO getQuizStatistic(LoginUser user, @PathVariable Long quizId) {
  143. return quizStudentAnswerService.getQuizStudentAnswerStatistic(user, quizId);
  144. }
  145. }