Explorar o código

feat: 增加课程的数据结构及接口

weijin %!s(int64=4) %!d(string=hai) anos
pai
achega
088d4f0ce0
Modificáronse 20 ficheiros con 409 adicións e 31 borrados
  1. 17 0
      src/main/java/com/nju/edu/eval/data/dao/CourseDao.java
  2. 16 1
      src/main/java/com/nju/edu/eval/data/dao/ExamDao.java
  3. 61 0
      src/main/java/com/nju/edu/eval/data/entity/Course.java
  4. 6 1
      src/main/java/com/nju/edu/eval/data/entity/Exam.java
  5. 22 0
      src/main/java/com/nju/edu/eval/model/vo/course/CourseVO.java
  6. 2 0
      src/main/java/com/nju/edu/eval/model/vo/exam/CreateExamVO.java
  7. 3 0
      src/main/java/com/nju/edu/eval/model/vo/exam/ExamInfoVO.java
  8. 3 0
      src/main/java/com/nju/edu/eval/model/vo/exam/ExamVO.java
  9. 33 0
      src/main/java/com/nju/edu/eval/service/CourseService.java
  10. 13 0
      src/main/java/com/nju/edu/eval/service/ExamService.java
  11. 43 0
      src/main/java/com/nju/edu/eval/service/convertor/CourseConvertor.java
  12. 3 0
      src/main/java/com/nju/edu/eval/service/convertor/ExamConvertor.java
  13. 67 0
      src/main/java/com/nju/edu/eval/service/serviceImpl/CourseServiceImpl.java
  14. 41 14
      src/main/java/com/nju/edu/eval/service/serviceImpl/ExamServiceImpl.java
  15. 50 0
      src/main/java/com/nju/edu/eval/web/controller/CourseController.java
  16. 22 8
      src/main/java/com/nju/edu/eval/web/controller/ExamController.java
  17. 4 4
      src/main/java/com/nju/edu/eval/web/controller/JudgeController.java
  18. 1 1
      src/main/java/com/nju/edu/eval/web/controller/QuestionController.java
  19. 1 1
      src/main/java/com/nju/edu/eval/web/controller/ScoreController.java
  20. 1 1
      src/main/java/com/nju/edu/eval/web/controller/UserController.java

+ 17 - 0
src/main/java/com/nju/edu/eval/data/dao/CourseDao.java

@@ -0,0 +1,17 @@
+package com.nju.edu.eval.data.dao;
+
+import com.nju.edu.eval.data.entity.Course;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Repository
+public interface CourseDao extends JpaRepository<Course, Integer> {
+    /**
+     * 根据创建者Id查询所有的课程
+     * @param teacherId 教师id
+     * @return 课程列表
+     */
+    List<Course> findAllByTeacherId(Integer teacherId);
+}

+ 16 - 1
src/main/java/com/nju/edu/eval/data/dao/ExamDao.java

@@ -34,5 +34,20 @@ public interface ExamDao extends JpaRepository<Exam, Integer> {
      * @param isHidden 是否隐藏:0:显示;1:隐藏
      * @return 考试列表
      */
-    List<Exam> findByIsHidden(Integer isHidden);
+    List<Exam> findAllByIsHidden(Integer isHidden);
+
+    /**
+     * 根据课程获得所有考试
+     * @param courseId 课程id
+     * @return 考试列表
+     */
+    List<Exam> findAllByCourseId(Integer courseId);
+
+    /**
+     * 根据课程获得所有非隐藏的考试
+     * @param courseId 课程id
+     * @param isHidden 是否隐藏:0:显示;1:隐藏
+     * @return 考试列表
+     */
+    List<Exam> findAllByCourseIdAndIsHidden(Integer courseId, Integer isHidden);
 }

+ 61 - 0
src/main/java/com/nju/edu/eval/data/entity/Course.java

@@ -0,0 +1,61 @@
+package com.nju.edu.eval.data.entity;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.*;
+import java.util.LinkedList;
+import java.util.List;
+
+/**
+ * @author weijin
+ */
+@Data
+@Entity
+@EqualsAndHashCode
+@NoArgsConstructor
+@AllArgsConstructor
+@Table(name = "course")
+public class Course {
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    @Column(name = "id")
+    private Integer id;
+
+    /**
+     * 课程名
+     */
+    private String name;
+
+    /**
+     * 选课码
+     */
+    private String code;
+
+    /**
+     * 课程对应的老师
+     */
+    private Integer teacherId;
+
+    /**
+     * 是否为公开的课程
+     */
+    private Integer isPublic;
+
+    /**
+     * 选课学生
+     */
+    @ElementCollection
+    @CollectionTable(name = "user_course", joinColumns = @JoinColumn(name = "course_id"))
+    @Column(name = "user_id")
+    private List<Integer> studentIds;
+
+    public Course(String name, String code, Integer teacherId, Integer isPublic) {
+        this.name = name;
+        this.code = code;
+        this.teacherId = teacherId;
+        this.isPublic = isPublic;
+    }
+}

+ 6 - 1
src/main/java/com/nju/edu/eval/data/entity/Exam.java

@@ -81,6 +81,10 @@ public class Exam {
     @JoinColumn(name = "creator_id")
     private User creator;
 
+    @ManyToOne(cascade = CascadeType.DETACH, fetch = FetchType.LAZY)
+    @JoinColumn(name = "course_id")
+    private Course course;
+
     @OneToOne(cascade = CascadeType.ALL)
     @JoinColumn(name = "general_report_id")
     private GeneralReport generalReport;
@@ -89,7 +93,7 @@ public class Exam {
 
 //    private List<Question>
 
-    public Exam(String examName, String position, List<String> skills, Date startTime, Date endTime, String comment, User user) {
+    public Exam(String examName, String position, List<String> skills, Date startTime, Date endTime, String comment, User user, Course course) {
         this.examName = examName;
         this.position = position;
         this.skills = skills;
@@ -97,6 +101,7 @@ public class Exam {
         this.endTime = endTime;
         this.comment = comment;
         this.creator = user;
+        this.course = course;
     }
 
     public ExamState getState() {

+ 22 - 0
src/main/java/com/nju/edu/eval/model/vo/course/CourseVO.java

@@ -0,0 +1,22 @@
+package com.nju.edu.eval.model.vo.course;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class CourseVO {
+    private Integer id;
+
+    private String name;
+
+    private String code;
+
+    private Integer teacherId;
+
+    private Boolean isJoined;
+
+    private Boolean isPublic;
+}

+ 2 - 0
src/main/java/com/nju/edu/eval/model/vo/exam/CreateExamVO.java

@@ -35,4 +35,6 @@ public class CreateExamVO {
     private Boolean antiCheating;
 
     private Boolean isPublic;
+
+    private Integer courseId;
 }

+ 3 - 0
src/main/java/com/nju/edu/eval/model/vo/exam/ExamInfoVO.java

@@ -1,6 +1,7 @@
 package com.nju.edu.eval.model.vo.exam;
 
 import com.fasterxml.jackson.annotation.JsonFormat;
+import com.nju.edu.eval.model.vo.course.CourseVO;
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
@@ -33,4 +34,6 @@ public class ExamInfoVO implements Serializable {
     private Date endTime;
 
     private String comment;
+
+    private CourseVO course;
 }

+ 3 - 0
src/main/java/com/nju/edu/eval/model/vo/exam/ExamVO.java

@@ -2,6 +2,7 @@ package com.nju.edu.eval.model.vo.exam;
 
 
 import com.fasterxml.jackson.annotation.JsonFormat;
+import com.nju.edu.eval.model.vo.course.CourseVO;
 import lombok.Data;
 import lombok.ToString;
 
@@ -52,4 +53,6 @@ public class ExamVO {
     private Boolean isPublic;
 
     private Boolean isHidden;
+
+    private CourseVO course;
 }

+ 33 - 0
src/main/java/com/nju/edu/eval/service/CourseService.java

@@ -0,0 +1,33 @@
+package com.nju.edu.eval.service;
+
+import com.nju.edu.eval.model.vo.course.CourseVO;
+
+import java.util.List;
+
+/**
+ * @author weijin
+ */
+public interface CourseService {
+    /**
+     * 创建课程
+     * @param courseVO course的vo
+     * @param teacherId 教师id
+     * @return 课程信息
+     */
+    CourseVO createCourse(CourseVO courseVO, Integer teacherId);
+
+    /**
+     * 更新课程
+     * @param courseVO course的vo
+     * @param teacherId 教师id
+     * @return 课程信息
+     */
+    boolean updateCourse(CourseVO courseVO, Integer teacherId);
+
+    /**
+     * 创建课程
+     * @param teacherId 教师id
+     * @return 课程信息
+     */
+    List<CourseVO> getCourseByTeacher(Integer teacherId);
+}

+ 13 - 0
src/main/java/com/nju/edu/eval/service/ExamService.java

@@ -131,4 +131,17 @@ public interface ExamService {
      * 获取推荐的考试
      */
     List<ExamInfoVO> getRecommendExam ();
+
+    /**
+     * 教师根据课程获取考试列表
+     * @param courseId 课程id
+     */
+    List<ExamVO> getExamByCourseId (Integer courseId);
+
+    /**
+     * 学生根据课程获取考试列表
+     * @param courseId 课程id
+     * @param userId 用户id
+     */
+    List<ExamVO> getExamByCourseIdAndIsHiddenFalse (Integer courseId, Integer userId);
 }

+ 43 - 0
src/main/java/com/nju/edu/eval/service/convertor/CourseConvertor.java

@@ -0,0 +1,43 @@
+package com.nju.edu.eval.service.convertor;
+
+import com.nju.edu.eval.data.entity.Course;
+import com.nju.edu.eval.data.entity.Exam;
+import com.nju.edu.eval.model.vo.course.CourseVO;
+import com.nju.edu.eval.model.vo.exam.ExamInfoVO;
+import org.springframework.beans.BeanUtils;
+
+/**
+ * @author weijin
+ */
+public class CourseConvertor {
+    public static Course convertToEntity(CourseVO courseVO) {
+        Course course = new Course();
+        BeanUtils.copyProperties(courseVO, course);
+        course.setIsPublic(courseVO.getIsPublic()?1:0);
+        return course;
+    }
+
+    public static CourseVO convertToVO(Course course) {
+        CourseVO courseVO = new CourseVO();
+        BeanUtils.copyProperties(course, courseVO);
+        courseVO.setIsPublic(course.getIsPublic() == 1);
+        courseVO.setIsJoined(false);
+        return courseVO;
+    }
+
+    public static CourseVO convertToJoinedVO(Course course) {
+        CourseVO courseVO = new CourseVO();
+        BeanUtils.copyProperties(course, courseVO);
+        courseVO.setIsPublic(course.getIsPublic() == 1);
+        courseVO.setIsJoined(true);
+        return courseVO;
+    }
+
+    public static ExamInfoVO convertToExamInfoVO(Exam exam) {
+        ExamInfoVO examInfoVO = new ExamInfoVO();
+        BeanUtils.copyProperties(exam, examInfoVO);
+        examInfoVO.setExamId(exam.getId());
+        return examInfoVO;
+    }
+
+}

+ 3 - 0
src/main/java/com/nju/edu/eval/service/convertor/ExamConvertor.java

@@ -25,6 +25,7 @@ public class ExamConvertor {
         examVO.setIsPublic(exam.getIsPublic() == 1);
         examVO.setIsJoined(false);
         examVO.setIsHidden(exam.getIsHidden() == 1);
+        examVO.setCourse(CourseConvertor.convertToVO(exam.getCourse()));
         return examVO;
     }
 
@@ -37,6 +38,7 @@ public class ExamConvertor {
         examVO.setIsPublic(exam.getIsPublic() == 1);
         examVO.setIsJoined(true);
         examVO.setIsHidden(exam.getIsHidden() == 1);
+        examVO.setCourse(CourseConvertor.convertToVO(exam.getCourse()));
         return examVO;
     }
 
@@ -44,6 +46,7 @@ public class ExamConvertor {
         ExamInfoVO examInfoVO = new ExamInfoVO();
         BeanUtils.copyProperties(exam, examInfoVO);
         examInfoVO.setExamId(exam.getId());
+        examInfoVO.setCourse(CourseConvertor.convertToVO(exam.getCourse()));
         return examInfoVO;
     }
 

+ 67 - 0
src/main/java/com/nju/edu/eval/service/serviceImpl/CourseServiceImpl.java

@@ -0,0 +1,67 @@
+package com.nju.edu.eval.service.serviceImpl;
+
+import com.nju.edu.eval.data.dao.CourseDao;
+import com.nju.edu.eval.data.dao.UserDao;
+import com.nju.edu.eval.data.entity.Course;
+import com.nju.edu.eval.data.entity.User;
+import com.nju.edu.eval.exception.MyServiceException;
+import com.nju.edu.eval.model.vo.course.CourseVO;
+import com.nju.edu.eval.service.CourseService;
+import com.nju.edu.eval.service.convertor.CourseConvertor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * @author weijin
+ */
+@Service
+public class CourseServiceImpl implements CourseService {
+    private final CourseDao courseDao;
+
+    private final UserDao userDao;
+
+    @Autowired
+    public CourseServiceImpl(CourseDao courseDao, UserDao userDao) {
+        this.courseDao = courseDao;
+        this.userDao = userDao;
+    }
+
+    @Override
+    public CourseVO createCourse(CourseVO courseVO, Integer teacherId) {
+        Course course = new Course(courseVO.getName(), courseVO.getCode(), teacherId, courseVO.getIsPublic()?1:0);
+        courseDao.save(course);
+        courseVO.setId(course.getId());
+        return courseVO;
+    }
+
+    @Override
+    public boolean updateCourse(CourseVO courseVO, Integer teacherId) {
+        Course course = courseDao.findById(courseVO.getId()).orElse(null);
+        if (course == null) {
+            throw new MyServiceException("A0201", "无对应的课程");
+        }
+        else if (!teacherId.equals(course.getTeacherId())) {
+            throw new MyServiceException("A0301", "访问未授权");
+        } else {
+            Course course1 = CourseConvertor.convertToEntity(courseVO);
+            course1.setTeacherId(course.getTeacherId());
+            courseDao.save(course1);
+            return true;
+        }
+    }
+
+    @Override
+    public List<CourseVO> getCourseByTeacher(Integer teacherId) {
+        User user = userDao.findById(teacherId).orElse(null);
+        if (user == null) {
+            throw new MyServiceException("A0201", "用户账号不存在");
+        } else {
+            return courseDao.findAllByTeacherId(teacherId).stream()
+                    .map(CourseConvertor::convertToVO).collect(Collectors.toList());
+        }
+    }
+
+}

+ 41 - 14
src/main/java/com/nju/edu/eval/service/serviceImpl/ExamServiceImpl.java

@@ -2,14 +2,8 @@ package com.nju.edu.eval.service.serviceImpl;
 
 import cn.seecoder.bok.common.QuestionType;
 import com.alibaba.fastjson.JSON;
-import com.nju.edu.eval.data.dao.ExamDao;
-import com.nju.edu.eval.data.dao.SampleExamPaperDao;
-import com.nju.edu.eval.data.dao.ScoreDao;
-import com.nju.edu.eval.data.dao.UserDao;
-import com.nju.edu.eval.data.entity.Exam;
-import com.nju.edu.eval.data.entity.SampleExamPaper;
-import com.nju.edu.eval.data.entity.Score;
-import com.nju.edu.eval.data.entity.User;
+import com.nju.edu.eval.data.dao.*;
+import com.nju.edu.eval.data.entity.*;
 import com.nju.edu.eval.exception.MyServiceException;
 import com.nju.edu.eval.manager.QuestionManager;
 import com.nju.edu.eval.model.vo.exam.*;
@@ -34,14 +28,16 @@ import java.util.stream.Collectors;
 @Service
 public class ExamServiceImpl implements ExamService {
     private final ExamDao examDao;
+    private final CourseDao courseDao;
     private final UserDao userDao;
     private final ScoreDao scoreDao;
     private final SampleExamPaperDao sampleExamPaperDao;
     private final QuestionManager questionManager;
 
     @Autowired
-    public ExamServiceImpl(ExamDao examDao, UserDao userDao, ScoreDao scoreDao, QuestionManager questionManager, SampleExamPaperDao sampleExamPaperDao) {
+    public ExamServiceImpl(ExamDao examDao, CourseDao courseDao, UserDao userDao, ScoreDao scoreDao, QuestionManager questionManager, SampleExamPaperDao sampleExamPaperDao) {
         this.examDao = examDao;
+        this.courseDao = courseDao;
         this.userDao = userDao;
         this.scoreDao = scoreDao;
         this.questionManager = questionManager;
@@ -51,9 +47,10 @@ public class ExamServiceImpl implements ExamService {
     @Override
     public NewExamVO createExam(CreateExamVO examVO, Integer creatorId) {
         User user = userDao.findById(creatorId).get();
+        Course course = courseDao.findById(examVO.getCourseId()).get();
         Exam exam = new Exam(examVO.getExamName(), examVO.getPosition(),
                                                       examVO.getSkills(), examVO.getStartTime(),
-                                                      examVO.getEndTime(), examVO.getComment(), user);
+                                                      examVO.getEndTime(), examVO.getComment(), user, course);
         exam.setIsHidden(0);
         // 只有非公开的考试才需要邀请码
         if (!examVO.getIsPublic()) {
@@ -84,7 +81,7 @@ public class ExamServiceImpl implements ExamService {
 //        List<ExamVO> examVOList = examEntities.get()
 //                .map(ExamConvertor::convertToVO).collect(Collectors.toList());
 //        return new ExamListAndNumVO(examVOList, (int) examEntities.getTotalElements());
-        List<Exam> exams = examDao.findByIsHidden(0);
+        List<Exam> exams = examDao.findAllByIsHidden(0);
         List<ExamVO> examVOList = exams.stream()
                 .sorted(Comparator.comparing(Exam::getStartTime).reversed())
                 .filter(exam -> exam.getIsHidden() == 0)
@@ -286,12 +283,42 @@ public class ExamServiceImpl implements ExamService {
 
     @Override
     public List<ExamInfoVO> getRecommendExam() {
-        List<Exam> examList = examDao.findByIsHidden(0);
+        List<Exam> examList = examDao.findAllByIsHidden(0);
         if(examList.size() > 8) {
-            return examList.stream().map(ExamConvertor::convertToExamInfoVO).collect(Collectors.toList()).subList(0, 8);
+            return examList.stream()
+                    .sorted(Comparator.comparing(Exam::getStartTime).reversed())
+                    .map(ExamConvertor::convertToExamInfoVO).collect(Collectors.toList()).subList(0, 8);
         } else {
-            return examList.stream().map(ExamConvertor::convertToExamInfoVO).collect(Collectors.toList());
+            return examList.stream()
+                    .sorted(Comparator.comparing(Exam::getStartTime).reversed())
+                    .map(ExamConvertor::convertToExamInfoVO).collect(Collectors.toList());
         }
     }
 
+    @Override
+    public List<ExamVO> getExamByCourseId (Integer courseId) {
+        return examDao.findAllByCourseId(courseId).stream()
+                .sorted(Comparator.comparing(Exam::getStartTime).reversed())
+                .map(ExamConvertor::convertToVO).collect(Collectors.toList());
+    }
+
+    @Override
+    public List<ExamVO> getExamByCourseIdAndIsHiddenFalse (Integer courseId, Integer userId) {
+        List<ExamVO> examVOList = examDao.findAllByCourseIdAndIsHidden(courseId, 0).stream()
+                .sorted(Comparator.comparing(Exam::getStartTime).reversed())
+                .map(ExamConvertor::convertToVO).collect(Collectors.toList());
+        User user = userDao.findById(userId).orElse(null);
+        if (user == null) {
+            throw new MyServiceException("A0201", "用户账号不存在");
+        } else {
+            List<Exam> currentUserExams = user.getExams();
+            for (ExamVO examVO : examVOList) {
+                Exam exam = examDao.findById(examVO.getExamId()).orElse(null);
+                if (currentUserExams.contains(exam)) {
+                    examVO.setIsJoined(true);
+                }
+            }
+            return examVOList;
+        }
+    }
 }

+ 50 - 0
src/main/java/com/nju/edu/eval/web/controller/CourseController.java

@@ -0,0 +1,50 @@
+package com.nju.edu.eval.web.controller;
+
+import com.nju.edu.eval.aspect.auth.Authorized;
+import com.nju.edu.eval.data.entity.User;
+import com.nju.edu.eval.model.vo.course.CourseVO;
+import com.nju.edu.eval.publicdatas.enums.UserRole;
+import com.nju.edu.eval.service.CourseService;
+import com.nju.edu.eval.web.Response;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import springfox.documentation.annotations.ApiIgnore;
+
+/**
+ * @author weijin
+ */
+@RestController
+@RequestMapping(path = "/api/course")
+@Api(tags = {"考试"})
+public class CourseController {
+    private final CourseService courseService;
+
+    @Autowired
+    public CourseController(CourseService courseService) {
+        this.courseService = courseService;
+    }
+
+
+    @ApiOperation("创建课程")
+    @PostMapping("")
+    @Authorized(roles = {UserRole.TEACHER, UserRole.HR})
+    public Response createCourse(@ApiIgnore User user, @RequestBody CourseVO courseVO) {
+        return Response.buildSuccess(courseService.createCourse(courseVO, user.getId()));
+    }
+
+    @ApiOperation("更新课程")
+    @PutMapping("")
+    @Authorized(roles = {UserRole.TEACHER, UserRole.HR})
+    public Response updateCourse(@ApiIgnore User user, @RequestBody CourseVO courseVO) {
+        return Response.buildSuccess(courseService.updateCourse(courseVO, user.getId()));
+    }
+
+    @ApiOperation("根据教师获取课程")
+    @GetMapping("")
+    @Authorized(roles = {UserRole.TEACHER, UserRole.HR})
+    public Response getCourseByTeacher(@ApiIgnore User user) {
+        return Response.buildSuccess(courseService.getCourseByTeacher(user.getId()));
+    }
+}

+ 22 - 8
src/main/java/com/nju/edu/eval/web/controller/ExamController.java

@@ -37,14 +37,14 @@ public class ExamController {
 
     @ApiOperation("创建考试")
     @PostMapping("")
-    @Authorized(roles = {UserRole.TEACHER, UserRole.HR, UserRole.ASSISTANT})
+    @Authorized(roles = {UserRole.TEACHER, UserRole.HR})
     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})
+    @Authorized(roles = {UserRole.TEACHER, UserRole.HR})
     public Response setExamQuestionsBySampleExamPaper(@PathVariable int examId,
                                                       @RequestParam(value = "sampleExamPaperId") int sampleExamPaperId) {
         examService.setExamQuestionsBySampleExamPaper(examId, sampleExamPaperId);
@@ -88,7 +88,7 @@ public class ExamController {
 
     @ApiOperation("为考试更新题目及对应分值")
     @PutMapping("/{examId}/questions/")
-//    @Authorized(roles = {UserRole.ADMIN, UserRole.HR, UserRole.TEACHER, UserRole.ASSISTANT})
+//    @Authorized(roles = {UserRole.ADMIN, UserRole.HR, UserRole.TEACHER})
     public Response updateQuestionsOfExam(@PathVariable Integer examId,
                                       @RequestBody QuestionScoreMapVO questionScoreMapVO) {
         examService.updateQuestionsOfExam(examId, questionScoreMapVO);
@@ -97,7 +97,7 @@ public class ExamController {
 
     @ApiOperation("延长考试时间")
     @PutMapping("/{examId}/time")
-    @Authorized(roles = {UserRole.ADMIN, UserRole.HR, UserRole.TEACHER, UserRole.ASSISTANT})
+    @Authorized(roles = {UserRole.ADMIN, UserRole.HR, UserRole.TEACHER})
     public Response extendExamTime(@PathVariable Integer examId,
                                    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @RequestParam Date endTime)  {
         Optional<Exam> examEntityOptional = examService.extendExamTime(examId, endTime);
@@ -119,7 +119,7 @@ public class ExamController {
 
     @ApiOperation("获得老师/HR创建的考试")
     @GetMapping("/teacher/exams")
-    @Authorized(roles = {UserRole.TEACHER, UserRole.HR, UserRole.ASSISTANT})
+    @Authorized(roles = {UserRole.TEACHER, UserRole.HR})
     public Response getExamsByCurrentTeacherOrHR(@ApiIgnore User user,
                                                  @RequestParam(value = "pageSize", required = false) int pageSize,
                                                  @RequestParam(value = "pageNum", required = false) int pageNum,
@@ -130,7 +130,7 @@ public class ExamController {
 
     @ApiOperation("通过邀请码加入考试")
     @PutMapping("/invite/code")
-    @Authorized(roles = {UserRole.STUDENT})
+    @Authorized(roles = {UserRole.STUDENT, UserRole.STAFF, UserRole.ASSISTANT, UserRole.SEEC, UserRole.SEECX})
     public Response takeExam(@ApiIgnore User user,
                              @RequestParam(value = "inviteCode", required = false) String inviteCode,
                              @RequestParam(value = "examId", required = true) Integer examId
@@ -140,7 +140,7 @@ public class ExamController {
 
     @ApiOperation("修改考试名称")
     @PutMapping("/update/name")
-    @Authorized(roles = {UserRole.TEACHER, UserRole.ASSISTANT})
+    @Authorized(roles = {UserRole.TEACHER, UserRole.HR})
     public Response updateExamName(@ApiIgnore User user,
                                    @RequestParam(value = "examId", required = true) Integer examId,
                                    @RequestParam(value = "name", required = true) String name
@@ -151,7 +151,7 @@ public class ExamController {
 
     @ApiOperation("隐藏考试")
     @PutMapping("/update/hidden")
-    @Authorized(roles = {UserRole.TEACHER, UserRole.ASSISTANT})
+    @Authorized(roles = {UserRole.TEACHER, UserRole.HR})
     public Response setIsHidden(@ApiIgnore User user,
                                 @RequestParam(value = "examId", required = true) Integer examId,
                                 @RequestParam(value = "hidden", required = true) boolean hidden
@@ -164,4 +164,18 @@ public class ExamController {
     public Response getRecommendExam() {
         return Response.buildSuccess(examService.getRecommendExam());
     }
+
+    @ApiOperation("教师根据课程获取考试列表")
+    @GetMapping("/teacher/course/{courseId}")
+    @Authorized(roles = {UserRole.TEACHER, UserRole.HR})
+    public Response getExamByCourseId(@PathVariable Integer courseId) {
+        return Response.buildSuccess(examService.getExamByCourseId(courseId));
+    }
+
+    @ApiOperation("学生根据课程获取考试列表")
+    @GetMapping("/course/{courseId}")
+    @Authorized(roles = {UserRole.STUDENT, UserRole.STAFF, UserRole.ASSISTANT, UserRole.SEEC, UserRole.SEECX})
+    public Response getExamByCourseIdAndIsHiddenFalse(@ApiIgnore User user, @PathVariable Integer courseId) {
+        return Response.buildSuccess(examService.getExamByCourseIdAndIsHiddenFalse(courseId, user.getId()));
+    }
 }

+ 4 - 4
src/main/java/com/nju/edu/eval/web/controller/JudgeController.java

@@ -35,7 +35,7 @@ public class JudgeController {
 
     @ApiOperation("考试中的客观题判题")
     @PostMapping(value = "/objective")
-    @Authorized(roles = {UserRole.STUDENT})
+    @Authorized(roles = {UserRole.STUDENT, UserRole.STAFF, UserRole.ASSISTANT, UserRole.SEEC, UserRole.SEECX})
     public Response judgeObjectiveQuestionAnswers(@ApiIgnore User user, @RequestParam(value = "examId") Integer examId,
                                                   @RequestBody ObjectiveJudgeVO objectiveJudgeVO) {
         return Response.buildSuccess(judgeService.judgeObjectiveQuestionAnswers(user.getId(), examId, objectiveJudgeVO));
@@ -43,7 +43,7 @@ public class JudgeController {
 
     @ApiOperation("考试中的代码题判题")
     @PostMapping("/code")
-    @Authorized(roles = {UserRole.STUDENT})
+    @Authorized(roles = {UserRole.STUDENT, UserRole.STAFF, UserRole.ASSISTANT, UserRole.SEEC, UserRole.SEECX})
     public Response judgeCodeQuestionAnswers(@ApiIgnore User user, @RequestParam(value = "examId") Integer examId,
                                              @RequestParam(value = "questionId") String questionId,
                                                   @RequestBody CodeJudgeVO codeJudgeVO) {
@@ -52,7 +52,7 @@ public class JudgeController {
 
     @ApiOperation("练习中的客观题判题")
     @PostMapping(value = "/objective/test")
-    @Authorized(roles = {UserRole.STUDENT})
+    @Authorized(roles = {UserRole.STUDENT, UserRole.STAFF, UserRole.ASSISTANT, UserRole.SEEC, UserRole.SEECX})
     public Response judgeObjectiveQuestionAnswersOfExercise(@ApiIgnore User user,
                                                   @RequestBody ObjectiveJudgeVO objectiveJudgeVO) {
         return Response.buildSuccess(judgeService.judgeObjectiveQuestionAnswersOfExercise(user.getId(), objectiveJudgeVO));
@@ -60,7 +60,7 @@ public class JudgeController {
 
     @ApiOperation("练习中的代码题判题")
     @PostMapping("/code/test")
-    @Authorized(roles = {UserRole.STUDENT})
+    @Authorized(roles = {UserRole.STUDENT, UserRole.STAFF, UserRole.ASSISTANT, UserRole.SEEC, UserRole.SEECX})
     public Response judgeCodeQuestionAnswersOfExercise(@ApiIgnore User user,
                                              @RequestParam(value = "questionId") String questionId,
                                              @RequestBody CodeJudgeVO codeJudgeVO) {

+ 1 - 1
src/main/java/com/nju/edu/eval/web/controller/QuestionController.java

@@ -25,7 +25,7 @@ public class QuestionController {
 
     @ApiOperation("根据Id获得题目的全部信息,包括解答")
     @GetMapping("{id}")
-//    @Authorized(roles = {UserRole.HR, UserRole.TEACHER, UserRole.ASSISTANT})
+//    @Authorized(roles = {UserRole.HR, UserRole.TEACHER})
     public Response getQuestionById(@PathVariable String id) {
         return Response.buildSuccess(questionService.getQuestionById(id));
     }

+ 1 - 1
src/main/java/com/nju/edu/eval/web/controller/ScoreController.java

@@ -37,7 +37,7 @@ public class ScoreController {
 
     @ApiOperation("获得某次考试的成绩报告(教师视角)")
     @GetMapping("/all")
-    @Authorized(roles = {UserRole.TEACHER, UserRole.ASSISTANT})
+    @Authorized(roles = {UserRole.TEACHER, UserRole.HR})
     public Response getReportByExamId(@RequestParam(value = "examId") Integer examId) {
         return Response.buildSuccess(scoreService.getReportByExamId(examId));
     }

+ 1 - 1
src/main/java/com/nju/edu/eval/web/controller/UserController.java

@@ -36,7 +36,7 @@ public class UserController {
 
     @ApiOperation("获得报名某次考试的所有学生")
     @GetMapping("/{examId}")
-    @Authorized(roles = {UserRole.ADMIN, UserRole.HR, UserRole.TEACHER, UserRole.ASSISTANT})
+    @Authorized(roles = {UserRole.ADMIN, UserRole.HR, UserRole.TEACHER})
     public Response getUsersByExamId(@PathVariable Integer examId) {
         return Response.buildSuccess(userService.getUsersByExamId(examId));
     }