ExamController.java 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. package com.nju.edu.eval.web.controller;
  2. import com.nju.edu.eval.aspect.auth.Authorized;
  3. import com.nju.edu.eval.data.entity.Exam;
  4. import com.nju.edu.eval.data.entity.User;
  5. import com.nju.edu.eval.model.vo.exam.CreateExamVO;
  6. import com.nju.edu.eval.model.vo.exam.QuestionScoreMapVO;
  7. import com.nju.edu.eval.publicdatas.enums.UserRole;
  8. import com.nju.edu.eval.service.ExamService;
  9. import com.nju.edu.eval.model.vo.exam.ExamVO;
  10. import com.nju.edu.eval.service.QuestionService;
  11. import com.nju.edu.eval.web.Response;
  12. import io.swagger.annotations.Api;
  13. import io.swagger.annotations.ApiOperation;
  14. import io.swagger.annotations.ApiParam;
  15. import org.springframework.beans.factory.annotation.Autowired;
  16. import org.springframework.format.annotation.DateTimeFormat;
  17. import org.springframework.web.bind.annotation.*;
  18. import springfox.documentation.annotations.ApiIgnore;
  19. import java.util.Date;
  20. import java.util.Optional;
  21. /**
  22. * @author mars
  23. */
  24. @RestController
  25. @RequestMapping(path = "/api/exam")
  26. @Api(tags = {"考试"})
  27. public class ExamController {
  28. private final ExamService examService;
  29. @Autowired
  30. public ExamController(ExamService examService) {
  31. this.examService = examService;
  32. }
  33. @ApiOperation("创建考试")
  34. @PostMapping("")
  35. @Authorized(roles = {UserRole.TEACHER, UserRole.HR, UserRole.ASSISTANT})
  36. public Response createExam(@ApiIgnore User user, @RequestBody CreateExamVO examVO) {
  37. return Response.buildSuccess(examService.createExam(examVO, user.getId()));
  38. }
  39. @ApiOperation("为创建的考试通过样卷来设置题目")
  40. @PostMapping("/question/sample/{examId}/")
  41. @Authorized(roles = {UserRole.TEACHER, UserRole.HR, UserRole.ASSISTANT})
  42. public Response setExamQuestionsBySampleExamPaper(@PathVariable int examId,
  43. @RequestParam(value = "sampleExamPaperId") int sampleExamPaperId) {
  44. examService.setExamQuestionsBySampleExamPaper(examId, sampleExamPaperId);
  45. return Response.buildSuccess(null);
  46. }
  47. @ApiOperation("获得所有考试(默认按时间降序)")
  48. @GetMapping("/list")
  49. @Authorized
  50. public Response getExamList(@ApiIgnore User user,
  51. @RequestParam(value = "pageSize") int pageSize,
  52. @RequestParam(value = "pageNum") int pageNum) {
  53. return Response.buildSuccess(examService.getExamList(user.getId(), pageSize, pageNum));
  54. }
  55. @ApiOperation("获得开始时间在某个时间段内的考试")
  56. @GetMapping("/list/range")
  57. public Response getExamListOfTimeRange(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @RequestParam Date startTime,
  58. @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @RequestParam Date endTime) {
  59. return Response.buildSuccess(examService.getExamListOfTimeRange(startTime, endTime));
  60. }
  61. @ApiOperation("根据考试id获得对应考试相关信息")
  62. @GetMapping("/{examId}")
  63. public Response getExamById(@PathVariable Integer examId) {
  64. return Response.buildSuccess(examService.getExamById(examId));
  65. }
  66. @ApiOperation("根据考试id获得对应考试的题目")
  67. @GetMapping("/{examId}/questions")
  68. public Response getExamQuestionAndScoreById(@PathVariable Integer examId) {
  69. return Response.buildSuccess(examService.getExamQuestionAndScoreById(examId));
  70. }
  71. @ApiOperation("根据考试id获得对应考试的代码题目Id")
  72. @GetMapping("/{examId}/questions/code")
  73. public Response getCodeQuestionIdsByExamId(@PathVariable Integer examId) {
  74. return Response.buildSuccess(examService.getCodeQuestionIdsByExamId(examId));
  75. }
  76. @ApiOperation("为考试更新题目及对应分值")
  77. @PutMapping("/{examId}/questions/")
  78. // @Authorized(roles = {UserRole.ADMIN, UserRole.HR, UserRole.TEACHER, UserRole.ASSISTANT})
  79. public Response updateQuestionsOfExam(@PathVariable Integer examId,
  80. @RequestBody QuestionScoreMapVO questionScoreMapVO) {
  81. examService.updateQuestionsOfExam(examId, questionScoreMapVO);
  82. return Response.buildSuccess(null);
  83. }
  84. @ApiOperation("延长考试时间")
  85. @PutMapping("/{examId}/time")
  86. @Authorized(roles = {UserRole.ADMIN, UserRole.HR, UserRole.TEACHER, UserRole.ASSISTANT})
  87. public Response extendExamTime(@PathVariable Integer examId,
  88. @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @RequestParam Date endTime) {
  89. Optional<Exam> examEntityOptional = examService.extendExamTime(examId, endTime);
  90. return Response.buildSuccess(null);
  91. // TODO 提醒参加该考试的同学 email?
  92. }
  93. @ApiOperation("获得学生参加的考试")
  94. @ApiParam()
  95. @GetMapping("/student/exams")
  96. @Authorized()
  97. public Response getExamsByCurrentStudent(@ApiIgnore User user,
  98. @RequestParam(value = "pageSize", required = false) int pageSize,
  99. @RequestParam(value = "pageNum", required = false) int pageNum,
  100. @ApiParam(name = "state", value = "0 所有, 1 未开始,2 进行中,3 已结束")
  101. @RequestParam(value = "state") int state) {
  102. return Response.buildSuccess(examService.getExamsByCurrentStudent(user.getId(), pageSize, pageNum, state));
  103. }
  104. @ApiOperation("获得老师/HR创建的考试")
  105. @GetMapping("/teacher/exams")
  106. @Authorized(roles = {UserRole.TEACHER, UserRole.HR, UserRole.ASSISTANT})
  107. public Response getExamsByCurrentTeacherOrHR(@ApiIgnore User user,
  108. @RequestParam(value = "pageSize", required = false) int pageSize,
  109. @RequestParam(value = "pageNum", required = false) int pageNum,
  110. @ApiParam(name = "state", value = "0 所有, 1 未开始,2 进行中,3 已结束")
  111. @RequestParam(value = "state") int state) {
  112. return Response.buildSuccess(examService.getExamsCreatedByCurrentTeacherOrHR(user.getId(), pageSize, pageNum, state));
  113. }
  114. @ApiOperation("通过邀请码加入考试")
  115. @PutMapping("/invite/code")
  116. @Authorized(roles = {UserRole.STUDENT})
  117. public Response takeExam(@ApiIgnore User user,
  118. @RequestParam(value = "inviteCode", required = false) String inviteCode,
  119. @RequestParam(value = "examId", required = true) Integer examId
  120. ) {
  121. return Response.buildSuccess(examService.takeExam(user.getId(), examId, inviteCode));
  122. }
  123. @ApiOperation("修改考试名称")
  124. @PutMapping("/update/name")
  125. @Authorized(roles = {UserRole.TEACHER, UserRole.ASSISTANT})
  126. public Response updateExamName(@ApiIgnore User user,
  127. @RequestParam(value = "examId", required = true) Integer examId,
  128. @RequestParam(value = "name", required = true) String name
  129. ) {
  130. //todo 暂时的接口,后面可扩展为更新考试信息
  131. return Response.buildSuccess(examService.updateExamName(user.getId(), examId, name));
  132. }
  133. @ApiOperation("隐藏考试")
  134. @PutMapping("/update/hidden")
  135. @Authorized(roles = {UserRole.TEACHER, UserRole.ASSISTANT})
  136. public Response setIsHidden(@ApiIgnore User user,
  137. @RequestParam(value = "examId", required = true) Integer examId,
  138. @RequestParam(value = "hidden", required = true) boolean hidden
  139. ) {
  140. return Response.buildSuccess(examService.setIsHidden(user.getId(), examId, hidden?1:0));
  141. }
  142. @ApiOperation("获取考试推荐")
  143. @GetMapping("/recommend")
  144. public Response getRecommendExam() {
  145. return Response.buildSuccess(examService.getRecommendExam());
  146. }
  147. }