package com.nju.edu.eval.web.controller; import com.nju.edu.eval.aspect.auth.Authorized; import com.nju.edu.eval.data.entity.Exam; import com.nju.edu.eval.data.entity.User; import com.nju.edu.eval.model.vo.exam.CreateExamVO; import com.nju.edu.eval.model.vo.exam.QuestionScoreMapVO; import com.nju.edu.eval.publicdatas.enums.UserRole; import com.nju.edu.eval.service.ExamService; import com.nju.edu.eval.model.vo.exam.ExamVO; import com.nju.edu.eval.service.QuestionService; import com.nju.edu.eval.web.Response; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.format.annotation.DateTimeFormat; import org.springframework.web.bind.annotation.*; import springfox.documentation.annotations.ApiIgnore; import java.util.Date; import java.util.Optional; /** * @author mars */ @RestController @RequestMapping(path = "/api/exam") @Api(tags = {"考试"}) public class ExamController { private final ExamService examService; @Autowired public ExamController(ExamService examService) { this.examService = examService; } @ApiOperation("创建考试") @PostMapping("") @Authorized(roles = {UserRole.TEACHER, UserRole.HR, UserRole.ASSISTANT}) public Response createExam(@ApiIgnore User user, @RequestBody CreateExamVO examVO) { return Response.buildSuccess(examService.createExam(examVO, user.getId())); } @ApiOperation("为创建的考试通过样卷来设置题目") @PostMapping("/question/sample/{examId}/") @Authorized(roles = {UserRole.TEACHER, UserRole.HR, UserRole.ASSISTANT}) public Response setExamQuestionsBySampleExamPaper(@PathVariable int examId, @RequestParam(value = "sampleExamPaperId") int sampleExamPaperId) { examService.setExamQuestionsBySampleExamPaper(examId, sampleExamPaperId); return Response.buildSuccess(null); } @ApiOperation("获得所有考试(默认按时间降序)") @GetMapping("/list") @Authorized public Response getExamList(@ApiIgnore User user, @RequestParam(value = "pageSize") int pageSize, @RequestParam(value = "pageNum") int pageNum) { return Response.buildSuccess(examService.getExamList(user.getId(), pageSize, pageNum)); } @ApiOperation("获得开始时间在某个时间段内的考试") @GetMapping("/list/range") public Response getExamListOfTimeRange(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @RequestParam Date startTime, @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @RequestParam Date endTime) { return Response.buildSuccess(examService.getExamListOfTimeRange(startTime, endTime)); } @ApiOperation("根据考试id获得对应考试相关信息") @GetMapping("/{examId}") public Response getExamById(@PathVariable Integer examId) { return Response.buildSuccess(examService.getExamById(examId)); } @ApiOperation("根据考试id获得对应考试的题目") @GetMapping("/{examId}/questions") public Response getExamQuestionAndScoreById(@PathVariable Integer examId) { return Response.buildSuccess(examService.getExamQuestionAndScoreById(examId)); } @ApiOperation("根据考试id获得对应考试的代码题目Id") @GetMapping("/{examId}/questions/code") public Response getCodeQuestionIdsByExamId(@PathVariable Integer examId) { return Response.buildSuccess(examService.getCodeQuestionIdsByExamId(examId)); } @ApiOperation("为考试更新题目及对应分值") @PutMapping("/{examId}/questions/") // @Authorized(roles = {UserRole.ADMIN, UserRole.HR, UserRole.TEACHER, UserRole.ASSISTANT}) public Response updateQuestionsOfExam(@PathVariable Integer examId, @RequestBody QuestionScoreMapVO questionScoreMapVO) { examService.updateQuestionsOfExam(examId, questionScoreMapVO); return Response.buildSuccess(null); } @ApiOperation("延长考试时间") @PutMapping("/{examId}/time") @Authorized(roles = {UserRole.ADMIN, UserRole.HR, UserRole.TEACHER, UserRole.ASSISTANT}) public Response extendExamTime(@PathVariable Integer examId, @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @RequestParam Date endTime) { Optional examEntityOptional = examService.extendExamTime(examId, endTime); return Response.buildSuccess(null); // TODO 提醒参加该考试的同学 email? } @ApiOperation("获得学生参加的考试") @ApiParam() @GetMapping("/student/exams") @Authorized() public Response getExamsByCurrentStudent(@ApiIgnore User user, @RequestParam(value = "pageSize", required = false) int pageSize, @RequestParam(value = "pageNum", required = false) int pageNum, @ApiParam(name = "state", value = "0 所有, 1 未开始,2 进行中,3 已结束") @RequestParam(value = "state") int state) { return Response.buildSuccess(examService.getExamsByCurrentStudent(user.getId(), pageSize, pageNum, state)); } @ApiOperation("获得老师/HR创建的考试") @GetMapping("/teacher/exams") @Authorized(roles = {UserRole.TEACHER, UserRole.HR, UserRole.ASSISTANT}) public Response getExamsByCurrentTeacherOrHR(@ApiIgnore User user, @RequestParam(value = "pageSize", required = false) int pageSize, @RequestParam(value = "pageNum", required = false) int pageNum, @ApiParam(name = "state", value = "0 所有, 1 未开始,2 进行中,3 已结束") @RequestParam(value = "state") int state) { return Response.buildSuccess(examService.getExamsCreatedByCurrentTeacherOrHR(user.getId(), pageSize, pageNum, state)); } @ApiOperation("通过邀请码加入考试") @PutMapping("/invite/code") @Authorized(roles = {UserRole.STUDENT}) public Response takeExam(@ApiIgnore User user, @RequestParam(value = "inviteCode", required = false) String inviteCode, @RequestParam(value = "examId", required = true) Integer examId ) { return Response.buildSuccess(examService.takeExam(user.getId(), examId, inviteCode)); } @ApiOperation("修改考试名称") @PutMapping("/update/name") @Authorized(roles = {UserRole.TEACHER, UserRole.ASSISTANT}) public Response updateExamName(@ApiIgnore User user, @RequestParam(value = "examId", required = true) Integer examId, @RequestParam(value = "name", required = true) String name ) { //todo 暂时的接口,后面可扩展为更新考试信息 return Response.buildSuccess(examService.updateExamName(user.getId(), examId, name)); } @ApiOperation("隐藏考试") @PutMapping("/update/hidden") @Authorized(roles = {UserRole.TEACHER, UserRole.ASSISTANT}) public Response setIsHidden(@ApiIgnore User user, @RequestParam(value = "examId", required = true) Integer examId, @RequestParam(value = "hidden", required = true) boolean hidden ) { return Response.buildSuccess(examService.setIsHidden(user.getId(), examId, hidden?1:0)); } @ApiOperation("获取考试推荐") @GetMapping("/recommend") public Response getRecommendExam() { return Response.buildSuccess(examService.getRecommendExam()); } }