Browse Source

improvement: 完善幻灯片相关功能

ChenSiTong 6 years ago
parent
commit
7802024189
38 changed files with 420 additions and 317 deletions
  1. 2 2
      .gitignore
  2. 0 7
      pom.xml
  3. 25 14
      src/main/java/nju/seec/helper/InitDataComponent.java
  4. 0 2
      src/main/java/nju/seec/helper/aop/log/LogAspect.java
  5. 24 0
      src/main/java/nju/seec/helper/data/convert/IntMapConverter.java
  6. 24 0
      src/main/java/nju/seec/helper/data/convert/MapConverter.java
  7. 24 0
      src/main/java/nju/seec/helper/data/convert/SetConverter.java
  8. 14 4
      src/main/java/nju/seec/helper/data/dao/CourseDAO.java
  9. 10 1
      src/main/java/nju/seec/helper/data/dao/QuizDAO.java
  10. 21 7
      src/main/java/nju/seec/helper/data/dao/SlideDAO.java
  11. 3 1
      src/main/java/nju/seec/helper/data/dao/SubmitAnswerDAO.java
  12. 0 35
      src/main/java/nju/seec/helper/data/entity/Comment.java
  13. 4 1
      src/main/java/nju/seec/helper/data/entity/Course.java
  14. 3 1
      src/main/java/nju/seec/helper/data/entity/Item.java
  15. 8 6
      src/main/java/nju/seec/helper/data/entity/Question.java
  16. 3 1
      src/main/java/nju/seec/helper/data/entity/Quiz.java
  17. 9 6
      src/main/java/nju/seec/helper/data/entity/Slide.java
  18. 7 7
      src/main/java/nju/seec/helper/data/entity/SubmitAnswer.java
  19. 9 9
      src/main/java/nju/seec/helper/logic/service/CourseService.java
  20. 34 17
      src/main/java/nju/seec/helper/logic/service/SlideService.java
  21. 7 4
      src/main/java/nju/seec/helper/logic/service/impl/CourseServiceImpl.java
  22. 21 25
      src/main/java/nju/seec/helper/logic/service/impl/QuizServiceImpl.java
  23. 68 30
      src/main/java/nju/seec/helper/logic/service/impl/SlideServiceImpl.java
  24. 1 1
      src/main/java/nju/seec/helper/logic/vo/CourseVO.java
  25. 0 1
      src/main/java/nju/seec/helper/logic/vo/QuestionVO.java
  26. 3 1
      src/main/java/nju/seec/helper/logic/vo/QuizVO.java
  27. 4 2
      src/main/java/nju/seec/helper/logic/vo/SlideVO.java
  28. 37 57
      src/main/java/nju/seec/helper/logic/vo/StudentQuizVO.java
  29. 31 0
      src/main/java/nju/seec/helper/logic/vo/SubmitAnswerVO.java
  30. 0 20
      src/main/java/nju/seec/helper/util/JsonUtils.java
  31. 1 1
      src/main/java/nju/seec/helper/util/enums/ItemTransition.java
  32. 0 10
      src/main/java/nju/seec/helper/web/controller/CommentController.java
  33. 2 1
      src/main/java/nju/seec/helper/web/controller/QuestionController.java
  34. 16 16
      src/main/java/nju/seec/helper/web/controller/SlideController.java
  35. 0 20
      src/main/java/nju/seec/helper/web/dto/CommentDTO.java
  36. 1 1
      src/main/java/nju/seec/helper/web/dto/ItemDTO.java
  37. 1 2
      src/main/java/nju/seec/helper/web/dto/QuizDTO.java
  38. 3 4
      src/main/java/nju/seec/helper/web/dto/SlideDTO.java

+ 2 - 2
.gitignore

@@ -29,9 +29,9 @@ HELP.md
 .vscode/
 
 
-### MacOS
+### MacOS ###
 .DS_Store
 
-### NPM
+### NPM ###
 node_modules/
 package-lock.json

+ 0 - 7
pom.xml

@@ -92,13 +92,6 @@
             <version>28.1-jre</version>
         </dependency>
 
-        <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-text -->
-        <dependency>
-            <groupId>org.apache.commons</groupId>
-            <artifactId>commons-text</artifactId>
-            <version>1.8</version>
-        </dependency>
-
         <!-- 开发阶段用于接口展示和调用 -->
         <dependency>
             <groupId>io.springfox</groupId>

+ 25 - 14
src/main/java/nju/seec/helper/InitDataComponent.java

@@ -15,6 +15,7 @@ import java.time.LocalDateTime;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
+import java.util.Random;
 
 /**
  * @author cst
@@ -33,28 +34,38 @@ public class InitDataComponent implements ApplicationRunner {
     @Override
     public void run(ApplicationArguments args) {
         // init course
-        List<Course> courses = new ArrayList<>();
         int size = 10;
-        for (int i = 0; i < size; i++) {
+        List<Course> courses = new ArrayList<>(size);
+        for (int i = 1; i <= size; i++) {
             Course course = new Course();
-            course.setId("course" + i);
+            course.setId(i);
             course.setName(FakerUtils.getFaker().job().field());
+            course.setTeacherId(1);
             courses.add(course);
         }
         courseDAO.saveAll(courses);
 
         // init question
-        Question fakerQuestion = new Question();
-        fakerQuestion.setId(1);
-        fakerQuestion.setStem("1+1=?");
-        fakerQuestion.setType(QuestionType.choice);
-        fakerQuestion.setOptions(ImmutableMap.of("A", "0", "B", "1", "C", "2", "D", "3"));
-        fakerQuestion.setTags(Collections.singleton("加法"));
-        fakerQuestion.setKnowledgeId(Collections.singleton("plus"));
-        fakerQuestion.setAnswer("C");
-        fakerQuestion.setAnalysis("1+1=2");
-        fakerQuestion.setLastModified(LocalDateTime.now());
-        List<Question> questions = Collections.singletonList(fakerQuestion);
+        size = 10;
+        List<Question> questions = new ArrayList<>(size);
+        for (int i = 1; i <= size; i++) {
+            Question fakerQuestion = new Question();
+            fakerQuestion.setId(i);
+            int a = new Random().nextInt(10);
+            int b = new Random().nextInt(10);
+            int answer = a + b;
+            fakerQuestion.setStem(String.format("%d+%d=?", a, b));
+            fakerQuestion.setType(QuestionType.choice);
+            int offset = new Random().nextInt(4);
+            int index = 0;
+            fakerQuestion.setOptions(ImmutableMap.of("A", answer - offset + index++ + "", "B", answer - offset + index++ + "", "C", answer - offset + index++ + "", "D", answer - offset + index + ""));
+            fakerQuestion.setTags(Collections.singleton("加法"));
+            fakerQuestion.setKnowledgeId(Collections.singleton("plus"));
+            fakerQuestion.setAnswer((char) ('A' + offset) + "");
+            fakerQuestion.setAnalysis(String.format("%d+%d=%d", a, b, answer));
+            fakerQuestion.setLastModified(LocalDateTime.now());
+            questions.add(fakerQuestion);
+        }
         questionDAO.saveAll(questions);
     }
 }

+ 0 - 2
src/main/java/nju/seec/helper/aop/log/LogAspect.java

@@ -5,7 +5,6 @@ import org.aspectj.lang.JoinPoint;
 import org.aspectj.lang.annotation.AfterThrowing;
 import org.aspectj.lang.annotation.Aspect;
 import org.aspectj.lang.annotation.Before;
-import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Component;
 import org.springframework.web.context.request.RequestContextHolder;
 import org.springframework.web.context.request.ServletRequestAttributes;
@@ -16,7 +15,6 @@ import javax.servlet.http.HttpServletRequest;
  * @author cst
  */
 @Aspect
-@Order(1)
 @Component
 @Slf4j
 public class LogAspect {

+ 24 - 0
src/main/java/nju/seec/helper/data/convert/IntMapConverter.java

@@ -0,0 +1,24 @@
+package nju.seec.helper.data.convert;
+
+import com.google.gson.Gson;
+import com.google.gson.reflect.TypeToken;
+
+import javax.persistence.AttributeConverter;
+import java.util.Map;
+
+/**
+ * @author cst
+ */
+public class IntMapConverter implements AttributeConverter<Map<Integer, String>, String> {
+    @Override
+    public String convertToDatabaseColumn(Map<Integer, String> attribute) {
+        return new Gson().toJson(attribute);
+    }
+
+    @Override
+    public Map<Integer, String> convertToEntityAttribute(String dbData) {
+        return new Gson().fromJson(dbData,
+                new TypeToken<Map<Integer, String>>() {
+                }.getType());
+    }
+}

+ 24 - 0
src/main/java/nju/seec/helper/data/convert/MapConverter.java

@@ -0,0 +1,24 @@
+package nju.seec.helper.data.convert;
+
+import com.google.gson.Gson;
+import com.google.gson.reflect.TypeToken;
+
+import javax.persistence.AttributeConverter;
+import java.util.Map;
+
+/**
+ * @author cst
+ */
+public class MapConverter implements AttributeConverter<Map<String, String>, String> {
+    @Override
+    public String convertToDatabaseColumn(Map<String, String> attribute) {
+        return new Gson().toJson(attribute);
+    }
+
+    @Override
+    public Map<String, String> convertToEntityAttribute(String dbData) {
+        return new Gson().fromJson(dbData,
+                new TypeToken<Map<String, String>>() {
+                }.getType());
+    }
+}

+ 24 - 0
src/main/java/nju/seec/helper/data/convert/SetConverter.java

@@ -0,0 +1,24 @@
+package nju.seec.helper.data.convert;
+
+import com.google.gson.Gson;
+import com.google.gson.reflect.TypeToken;
+
+import javax.persistence.AttributeConverter;
+import java.util.Set;
+
+/**
+ * @author cst
+ */
+public class SetConverter implements AttributeConverter<Set<String>, String> {
+    @Override
+    public String convertToDatabaseColumn(Set<String> attribute) {
+        return new Gson().toJson(attribute);
+    }
+
+    @Override
+    public Set<String> convertToEntityAttribute(String dbData) {
+        return new Gson().fromJson(dbData,
+                new TypeToken<Set<String>>() {
+                }.getType());
+    }
+}

+ 14 - 4
src/main/java/nju/seec/helper/data/dao/CourseDAO.java

@@ -3,6 +3,7 @@ package nju.seec.helper.data.dao;
 import nju.seec.helper.data.entity.Course;
 import nju.seec.helper.util.exception.HelperException;
 import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.stereotype.Repository;
 
@@ -10,14 +11,23 @@ import org.springframework.stereotype.Repository;
  * @author cst
  */
 @Repository
-public interface CourseDAO extends JpaRepository<Course, String> {
+public interface CourseDAO extends JpaRepository<Course, Integer> {
     /**
      * 封装findById方法
      *
-     * @param courseId
-     * @return
+     * @param courseId 课程ID
+     * @return 课程
      */
-    default Course findCourseById(String courseId) {
+    default Course findCourseById(Integer courseId) {
         return this.findById(courseId).orElseThrow(() -> HelperException.of(HelperException.ExceptionType.NOT_FOUND, "找不到课程"));
     }
+
+    /**
+     * 根据教师ID取得课程分页列表
+     *
+     * @param teacherId 教师ID
+     * @param pageable  分页
+     * @return 课程列表
+     */
+    Page<Course> findByTeacherId(Integer teacherId, Pageable pageable);
 }

+ 10 - 1
src/main/java/nju/seec/helper/data/dao/QuizDAO.java

@@ -5,10 +5,19 @@ import nju.seec.helper.util.enums.QuizType;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.stereotype.Repository;
 
+import java.util.Optional;
+
 /**
  * @author cst
  */
 @Repository
 public interface QuizDAO extends JpaRepository<Quiz, Integer> {
-    Quiz findBySlideIdAndType(int slideId, QuizType type);
+    /**
+     * 根据幻灯片ID和测验类型查询测验
+     *
+     * @param slideId
+     * @param type
+     * @return
+     */
+    Optional<Quiz> findBySlideIdAndType(int slideId, QuizType type);
 }

+ 21 - 7
src/main/java/nju/seec/helper/data/dao/SlideDAO.java

@@ -8,6 +8,8 @@ import org.springframework.data.domain.Pageable;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.stereotype.Repository;
 
+import java.util.Set;
+
 /**
  * @author cst
  */
@@ -16,10 +18,10 @@ public interface SlideDAO extends JpaRepository<Slide, Integer> {
     /**
      * 封装findById方法
      *
-     * @param slideId
+     * @param slideId 幻灯片ID
      * @return
      */
-    default Slide findSlideById(int slideId) {
+    default Slide findSlideById(Integer slideId) {
         return this.findById(slideId).orElseThrow(() -> HelperException.of(
                 HelperException.ExceptionType.NOT_FOUND, "找不到幻灯片")
         );
@@ -28,39 +30,51 @@ public interface SlideDAO extends JpaRepository<Slide, Integer> {
     /**
      * 根据课程ID和幻灯片名是否包含关键字分页查询
      *
+     * @param teacherId
      * @param courseId
      * @param key
      * @param pageable
      * @return
      */
-    Page<Slide> findByCourseIdAndNameContains(String courseId, String key, Pageable pageable);
+    Page<Slide> findByTeacherIdAndCourseIdAndNameContains(Integer teacherId, Integer courseId, String key, Pageable pageable);
 
     /**
      * 根据幻灯片名是否包含关键字分页查询
      *
+     * @param teacherId
      * @param key
      * @param pageable
      * @return
      */
-    Page<Slide> findByNameContains(String key, Pageable pageable);
+    Page<Slide> findByTeacherIdAndNameContains(Integer teacherId, String key, Pageable pageable);
 
     /**
      * 判断是否存在相同幻灯片名
      *
+     * @param courseId
      * @param name
      * @return
      */
-    boolean existsByName(String name);
+    boolean existsByCourseIdAndName(Integer courseId, String name);
 
 
     /**
      * 根据课程ID、幻灯片状态、幻灯片名是否包含关键字分页查询
      *
      * @param courseId
-     * @param state
+     * @param states
      * @param key
      * @param pageable
      * @return
      */
-    Page<Slide> findByCourseIdAndStateNotAndNameContains(String courseId, SlideState state, String key, Pageable pageable);
+    Page<Slide> findByCourseIdAndStateNotInAndNameContains(Integer courseId, Set<SlideState> states, String key, Pageable pageable);
+
+    /**
+     * 根据幻灯片ID,幻灯片状态查询
+     *
+     * @param slideId
+     * @param states
+     * @return
+     */
+    Slide findByIdAndStateNotIn(Integer slideId, Set<SlideState> states);
 }

+ 3 - 1
src/main/java/nju/seec/helper/data/dao/SubmitAnswerDAO.java

@@ -3,6 +3,8 @@ package nju.seec.helper.data.dao;
 import nju.seec.helper.data.entity.SubmitAnswer;
 import org.springframework.data.jpa.repository.JpaRepository;
 
+import java.util.Optional;
+
 /**
  * @author cst
  */
@@ -14,5 +16,5 @@ public interface SubmitAnswerDAO extends JpaRepository<SubmitAnswer, Integer> {
      * @param studentId
      * @return
      */
-    SubmitAnswer findByQuizIdAndStudentId(Integer quizId, Integer studentId);
+    Optional<SubmitAnswer> findByQuizIdAndStudentId(Integer quizId, Integer studentId);
 }

+ 0 - 35
src/main/java/nju/seec/helper/data/entity/Comment.java

@@ -1,35 +0,0 @@
-package nju.seec.helper.data.entity;
-
-import lombok.Data;
-import org.hibernate.annotations.CreationTimestamp;
-
-import javax.persistence.*;
-import java.time.LocalDateTime;
-
-/**
- * @author cst
- */
-@Data
-@Entity
-@Table(name = "comment")
-public class Comment {
-    @Id
-    @GeneratedValue(strategy = GenerationType.IDENTITY)
-    private Integer id;
-
-    @Column(name = "item_id", nullable = false)
-    private Integer itemId;
-
-    @Column(name = "before_comment_id")
-    private Integer beforeCommentId;
-
-    @Column(name = "commentator_name", nullable = false)
-    private String commentatorName;
-
-    @Column(name = "commentator_id", nullable = false)
-    private String commentatorId;
-
-    @Column(name = "create_time", updatable = false)
-    @CreationTimestamp
-    private LocalDateTime createTime;
-}

+ 4 - 1
src/main/java/nju/seec/helper/data/entity/Course.java

@@ -15,8 +15,11 @@ import javax.persistence.Table;
 @Table(name = "course")
 public class Course {
     @Id
-    private String id;
+    private Integer id;
 
     @Column(nullable = false)
     private String name;
+
+    @Column(nullable = false, name = "teacher_id")
+    private Integer teacherId;
 }

+ 3 - 1
src/main/java/nju/seec/helper/data/entity/Item.java

@@ -23,9 +23,11 @@ public class Item {
     private String placeholder;
 
     @Enumerated(EnumType.STRING)
-    private ItemTransition transition;
+    @Column(nullable = false)
+    private ItemTransition transition = ItemTransition.NONE;
 
     @Enumerated(EnumType.STRING)
+    @Column(nullable = false)
     private ItemType type = ItemType.MD;
 
     private String content;

+ 8 - 6
src/main/java/nju/seec/helper/data/entity/Question.java

@@ -1,6 +1,8 @@
 package nju.seec.helper.data.entity;
 
 import lombok.Data;
+import nju.seec.helper.data.convert.MapConverter;
+import nju.seec.helper.data.convert.SetConverter;
 import nju.seec.helper.util.enums.QuestionType;
 import org.hibernate.annotations.UpdateTimestamp;
 
@@ -25,22 +27,22 @@ public class Question {
     @Column(nullable = false)
     private String stem;
 
-    @ElementCollection
-    @CollectionTable(name = "quiz_option", joinColumns = @JoinColumn(name = "quiz_id"))
+    @Convert(converter = MapConverter.class)
     private Map<String, String> options;
 
-    @ElementCollection
-    @JoinTable(name = "quiz_tags", joinColumns = @JoinColumn(name = "quiz_id"))
+    @Convert(converter = SetConverter.class)
+    @Column(nullable = false)
     private Set<String> tags;
 
-    @ElementCollection
-    @JoinTable(name = "quiz_knowledgeId", joinColumns = @JoinColumn(name = "quiz_id"))
+    @Convert(converter = SetConverter.class)
+    @Column(name = "knowledge_id", nullable = false)
     private Set<String> knowledgeId;
 
     @Column(name = "last_modified")
     @UpdateTimestamp
     private LocalDateTime lastModified;
 
+    @Column(nullable = false)
     private String answer;
 
     private String analysis;

+ 3 - 1
src/main/java/nju/seec/helper/data/entity/Quiz.java

@@ -22,13 +22,15 @@ public class Quiz {
     @Column(name = "slide_id", nullable = false)
     private Integer slideId;
 
+    @Enumerated(EnumType.STRING)
     @Column(nullable = false)
     private QuizType type;
 
-    @ManyToMany
+    @ManyToMany(cascade = CascadeType.ALL)
     @JoinTable(name = "quiz_question",
             joinColumns = @JoinColumn(name = "quiz_id"),
             inverseJoinColumns = @JoinColumn(name = "question_id"))
+    @OrderColumn(name = "number")
     private List<Question> questions;
 
     @Column(name = "update_time")

+ 9 - 6
src/main/java/nju/seec/helper/data/entity/Slide.java

@@ -7,7 +7,7 @@ import org.hibernate.annotations.UpdateTimestamp;
 
 import javax.persistence.*;
 import java.time.LocalDateTime;
-import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 
 /**
@@ -21,22 +21,25 @@ public class Slide {
     @GeneratedValue(strategy = GenerationType.IDENTITY)
     private Integer id;
 
-    @Column(name = "course_id", nullable = false, updatable = false)
-    private String courseId;
+    @Column(name = "teacher_id", nullable = false)
+    private Integer teacherId;
 
-    @Column(name = "course_name", nullable = false, updatable = false)
+    @Column(name = "course_id", nullable = false)
+    private Integer courseId;
+
+    @Column(name = "course_name", nullable = false)
     private String courseName;
 
     @Enumerated(EnumType.STRING)
     @Column(nullable = false)
     private SlideState state = SlideState.DRAFT;
 
-    @Column(nullable = false, unique = true)
+    @Column(nullable = false)
     private String name;
 
     @OneToMany(mappedBy = "slide", cascade = CascadeType.ALL)
     @OrderColumn(name = "number")
-    private List<Item> items = new ArrayList<>();
+    private List<Item> items = Collections.emptyList();
 
     @Column(name = "create_time", updatable = false)
     @CreationTimestamp

+ 7 - 7
src/main/java/nju/seec/helper/data/entity/SubmitAnswer.java

@@ -1,11 +1,11 @@
 package nju.seec.helper.data.entity;
 
 import lombok.Data;
+import nju.seec.helper.data.convert.IntMapConverter;
 import org.hibernate.annotations.UpdateTimestamp;
 
 import javax.persistence.*;
 import java.time.LocalDateTime;
-import java.util.HashMap;
 import java.util.Map;
 
 /**
@@ -19,20 +19,20 @@ public class SubmitAnswer {
     @GeneratedValue(strategy = GenerationType.IDENTITY)
     private Integer id;
 
-    @Column(name = "student_id")
+    @Column(name = "student_id", nullable = false)
     private Integer studentId;
 
-    @Column(name = "quiz_id")
+    @Column(name = "quiz_id", nullable = false)
     private Integer quizId;
 
     @Column(name = "submit_num", nullable = false)
-    private Integer submitNum = 0;
+    private Integer submitNum;
 
     @Column(name = "submit_time")
     @UpdateTimestamp
     private LocalDateTime submitTime;
 
-    @ElementCollection
-    @CollectionTable(name = "choose_option", joinColumns = @JoinColumn(name = "submit_answer_id"))
-    private Map<Integer, String> chooseOptions = new HashMap<>();
+    @Convert(converter = IntMapConverter.class)
+    @Column(name = "choose_options", nullable = false)
+    private Map<Integer, String> chooseOptions;
 }

+ 9 - 9
src/main/java/nju/seec/helper/logic/service/CourseService.java

@@ -10,20 +10,20 @@ import java.util.List;
  */
 public interface CourseService {
     /**
-     * 师获取创建的课程
+     * 师获取创建的课程
      *
-     * @param teacherId
-     * @param pageable
-     * @return
+     * @param teacherId 教师ID
+     * @param pageable  分页
+     * @return List<CourseVO>
      */
-    List<CourseVO> getTeacherCourses(int teacherId, Pageable pageable);
+    List<CourseVO> getTeacherCourses(Integer teacherId, Pageable pageable);
 
     /**
      * 学生获取所选的课程
      *
-     * @param studentId
-     * @param pageable
-     * @return
+     * @param studentId 学生ID
+     * @param pageable  分页
+     * @return {@link CourseVO}
      */
-    List<CourseVO> getStudentCourses(int studentId, Pageable pageable);
+    List<CourseVO> getStudentCourses(Integer studentId, Pageable pageable);
 }

+ 34 - 17
src/main/java/nju/seec/helper/logic/service/SlideService.java

@@ -16,72 +16,89 @@ public interface SlideService {
     /**
      * 教师根据课程ID和关键字取得幻灯片列表
      *
-     * @param courseId
-     * @param key
-     * @param pageable
-     * @return
+     * @param teacherId 教师ID
+     * @param courseId  课程ID
+     * @param key       关键字
+     * @param pageable  分页
+     * @return 幻灯片列表
      */
-    List<SlideVO> getTeacherSlides(String courseId, String key, Pageable pageable);
+    List<SlideVO> teacherGetSlides(Integer teacherId, Integer courseId, String key, Pageable pageable);
 
     /**
      * 教师根据关键字取得幻灯片列表
      *
-     * @param key
-     * @param pageable
-     * @return
+     * @param teacherId 教师ID
+     * @param key       关键字
+     * @param pageable  分页
+     * @return 幻灯片列表
      */
-    List<SlideVO> getTeacherSlides(String key, Pageable pageable);
+    List<SlideVO> teacherGetSlides(Integer teacherId, String key, Pageable pageable);
 
     /**
      * 根据ID取得幻灯片
      *
-     * @param slideId
-     * @return
+     * @param teacherId 教师ID
+     * @param slideId   幻灯片ID
+     * @return {@link SlideVO}
      */
-    SlideVO getOneSlide(int slideId);
+    SlideVO teacherGetOneSlide(Integer teacherId, Integer slideId);
 
     /**
      * 创建新的幻灯片
      *
+     * @param teacherId
      * @param slideDTO
      * @return
      */
-    SlideVO create(SlideDTO slideDTO);
+    SlideVO create(Integer teacherId, SlideDTO slideDTO);
 
     /**
      * 更新幻灯片
      *
+     * @param teacherId
      * @param slideDTO
      * @return
      */
-    SlideVO update(SlideDTO slideDTO);
+    SlideVO update(Integer teacherId, SlideDTO slideDTO);
 
     /**
      * 更新幻灯片状态
      *
+     * @param teacherId
      * @param slideId
      * @param state
      * @return
      */
-    SlideVO updateState(int slideId, SlideState state);
+    SlideVO updateState(Integer teacherId, Integer slideId, SlideState state);
 
 
     /**
      * 删除幻灯片
      *
+     * @param teacherId
      * @param slideId
      */
-    void delete(int slideId);
+    void delete(Integer teacherId, Integer slideId);
 
     // 学生
 
     /**
      * 学生根据课程ID和关键字取得幻灯片列表
      *
+     * @param studentId
      * @param courseId
      * @param key
      * @param pageable
      * @return
      */
-    List<SlideVO> getStudentSlides(String courseId, String key, Pageable pageable);
+    List<SlideVO> studentGetSlides(Integer studentId, Integer courseId, String key, Pageable pageable);
+
+    /**
+     * 学生根据幻灯片ID查看幻灯片
+     *
+     * @param studentId
+     * @param slideId
+     * @return
+     */
+    SlideVO studentGetOneSlide(Integer studentId, Integer slideId);
 }

+ 7 - 4
src/main/java/nju/seec/helper/logic/service/impl/CourseServiceImpl.java

@@ -24,16 +24,19 @@ public class CourseServiceImpl implements CourseService {
     }
 
     @Override
-    public List<CourseVO> getTeacherCourses(int teacherId, Pageable pageable) {
-        Page<Course> page = courseDAO.findAll(pageable);
-        return page.getContent()
+    public List<CourseVO> getTeacherCourses(Integer teacherId, Pageable pageable) {
+        // TODO
+        Page<Course> page = courseDAO.findByTeacherId(teacherId, pageable);
+        return page
+                .getContent()
                 .stream()
                 .map(CourseVO::new)
                 .collect(Collectors.toList());
     }
 
     @Override
-    public List<CourseVO> getStudentCourses(int studentId, Pageable pageable) {
+    public List<CourseVO> getStudentCourses(Integer studentId, Pageable pageable) {
+        // TODO
         return getTeacherCourses(studentId, pageable);
     }
 }

+ 21 - 25
src/main/java/nju/seec/helper/logic/service/impl/QuizServiceImpl.java

@@ -6,7 +6,6 @@ import nju.seec.helper.data.dao.SlideDAO;
 import nju.seec.helper.data.dao.SubmitAnswerDAO;
 import nju.seec.helper.data.entity.Question;
 import nju.seec.helper.data.entity.Quiz;
-import nju.seec.helper.data.entity.Slide;
 import nju.seec.helper.data.entity.SubmitAnswer;
 import nju.seec.helper.logic.service.QuizService;
 import nju.seec.helper.logic.vo.QuizVO;
@@ -15,7 +14,6 @@ import nju.seec.helper.util.enums.QuizType;
 import nju.seec.helper.util.exception.HelperException;
 import nju.seec.helper.web.dto.QuizDTO;
 import nju.seec.helper.web.dto.SubmitAnswerDTO;
-import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
 
 import java.util.List;
@@ -40,11 +38,18 @@ public class QuizServiceImpl implements QuizService {
 
     @Override
     public QuizVO createQuiz(QuizDTO quizDTO) {
-        List<Question> questions = quizDTO.getQuestionIds()
+        List<Question> questions = quizDTO
+                .getQuestionIds()
                 .stream()
                 .map(questionDAO::findQuestionById)
                 .collect(Collectors.toList());
-        Quiz quiz = this.copyQuizDTOToQuiz(quizDTO);
+        Quiz quiz = quizDAO.findBySlideIdAndType(quizDTO.getSlideId(), quizDTO.getType())
+                .orElseGet(() -> {
+                    Quiz newQuiz = new Quiz();
+                    newQuiz.setSlideId(quizDTO.getSlideId());
+                    newQuiz.setType(quizDTO.getType());
+                    return newQuiz;
+                });
         quiz.setQuestions(questions);
         quiz = quizDAO.save(quiz);
         return new QuizVO(quiz);
@@ -52,8 +57,9 @@ public class QuizServiceImpl implements QuizService {
 
     @Override
     public QuizVO teacherGetQuiz(int slideId, QuizType quizType) {
-        Quiz quiz = quizDAO.findBySlideIdAndType(slideId, quizType);
-        return quiz == null ? null : new QuizVO(quiz);
+        return quizDAO.findBySlideIdAndType(slideId, quizType)
+                .map(QuizVO::new)
+                .orElseThrow(() -> HelperException.of(HelperException.ExceptionType.NOT_FOUND, "找不到测验"));
     }
 
     @Override
@@ -81,32 +87,22 @@ public class QuizServiceImpl implements QuizService {
 //                break;
 //        }
 
-        Quiz quiz = quizDAO.findBySlideIdAndType(slideId, quizType);
-        if (quiz == null) {
-            return null;
-        }
-        SubmitAnswer submitAnswer = submitAnswerDAO.findByQuizIdAndStudentId(quiz.getId(), 1);
-        return new StudentQuizVO(quiz, submitAnswer);
+        Quiz quiz = quizDAO.findBySlideIdAndType(slideId, quizType)
+                .orElseThrow(() -> HelperException.of(HelperException.ExceptionType.NOT_FOUND, "找不到测验"));
+        return submitAnswerDAO.findByQuizIdAndStudentId(quiz.getId(), 1)
+                .map(submitAnswer -> new StudentQuizVO(quiz, submitAnswer))
+                .orElseGet(() -> new StudentQuizVO(quiz));
     }
 
     @Override
     public void answerQuiz(Integer studentId, SubmitAnswerDTO submitAnswerDTO) {
-        SubmitAnswer submitAnswer = submitAnswerDAO.findByQuizIdAndStudentId(submitAnswerDTO.getQuizId(), studentId);
-        if (submitAnswer == null) {
-            submitAnswer = new SubmitAnswer();
-            submitAnswer.setSubmitNum(1);
-        } else {
-            submitAnswer.setSubmitNum(submitAnswer.getSubmitNum() + 1);
-        }
+        SubmitAnswer submitAnswer = submitAnswerDAO.findByQuizIdAndStudentId(submitAnswerDTO.getQuizId(), studentId)
+                .orElse(new SubmitAnswer());
+        Integer submitNum = submitAnswer.getSubmitNum();
+        submitAnswer.setSubmitNum((submitNum == null ? 0 : submitNum) + 1);
         submitAnswer.setChooseOptions(submitAnswerDTO.getChooseOptions());
         submitAnswer.setQuizId(submitAnswerDTO.getQuizId());
         submitAnswer.setStudentId(1);
         submitAnswerDAO.save(submitAnswer);
     }
-
-    private Quiz copyQuizDTOToQuiz(QuizDTO quizDTO) {
-        Quiz quiz = new Quiz();
-        BeanUtils.copyProperties(quizDTO, quiz, "questionIds");
-        return quiz;
-    }
 }

+ 68 - 30
src/main/java/nju/seec/helper/logic/service/impl/SlideServiceImpl.java

@@ -33,36 +33,48 @@ public class SlideServiceImpl implements SlideService {
     }
 
     @Override
-    public List<SlideVO> getTeacherSlides(String courseId, String key, Pageable pageable) {
-        Page<Slide> slidePage = slideDAO.findByCourseIdAndNameContains(courseId, key, pageable);
+    public List<SlideVO> teacherGetSlides(Integer teacherId, Integer courseId, String key, Pageable pageable) {
+        Page<Slide> slidePage = slideDAO.findByTeacherIdAndCourseIdAndNameContains(teacherId, courseId, key, pageable);
 
-        return slidePage.getContent().stream()
+        return slidePage
+                .getContent()
+                .stream()
                 .map(SlideVO::new)
                 .collect(Collectors.toList());
     }
 
     @Override
-    public List<SlideVO> getTeacherSlides(String key, Pageable pageable) {
-        Page<Slide> slidePage = slideDAO.findByNameContains(key, pageable);
+    public List<SlideVO> teacherGetSlides(Integer teacherId, String key, Pageable pageable) {
+        Page<Slide> slidePage = slideDAO.findByTeacherIdAndNameContains(teacherId, key, pageable);
 
-        return slidePage.getContent().stream()
+        return slidePage
+                .getContent()
+                .stream()
                 .map(SlideVO::new)
                 .collect(Collectors.toList());
     }
 
     @Override
-    public SlideVO getOneSlide(int slideId) {
+    public SlideVO teacherGetOneSlide(Integer teacherId, Integer slideId) {
         Slide slide = slideDAO.findSlideById(slideId);
+
+        if (!slide.getTeacherId().equals(teacherId)) {
+            throw HelperException.of(HelperException.ExceptionType.FORBIDDEN, "你无权查看该幻灯片");
+        }
         return new SlideVO(slide);
     }
 
     @Override
-    public SlideVO create(SlideDTO slideDTO) {
-        if (slideDAO.existsByName(slideDTO.getName())) {
-            throw HelperException.of(HelperException.ExceptionType.CONFLICT, "该幻灯片已存在");
+    public SlideVO create(Integer teacherId, SlideDTO slideDTO) {
+        if (slideDAO.existsByCourseIdAndName(slideDTO.getCourseId(), slideDTO.getName())) {
+            throw HelperException.of(HelperException.ExceptionType.CONFLICT, "该幻灯片名已被使用");
         }
+
         Slide slide = new Slide();
-        this.copySlideDTOToSlide(slideDTO, slide);
+        slide.setTeacherId(teacherId);
+        slide.setName(slideDTO.getName());
+        slide.setState(SlideState.DRAFT);
+
         Course course = courseDAO.findCourseById(slideDTO.getCourseId());
         slide.setCourseId(course.getId());
         slide.setCourseName(course.getName());
@@ -72,42 +84,68 @@ public class SlideServiceImpl implements SlideService {
     }
 
     @Override
-    public SlideVO update(SlideDTO slideDTO) {
-        Slide slide = slideDAO.findSlideById(slideDTO.getId());
-        this.copySlideDTOToSlide(slideDTO, slide);
-        slide = slideDAO.save(slide);
-        return new SlideVO(slide);
+    public SlideVO update(Integer teacherId, SlideDTO slideDTO) {
+        if (slideDAO.existsByCourseIdAndName(slideDTO.getCourseId(), slideDTO.getName())) {
+            throw HelperException.of(HelperException.ExceptionType.CONFLICT, "该幻灯片名已被使用");
+        }
+        final Slide slide = slideDAO.findSlideById(slideDTO.getId());
+        if (!slide.getTeacherId().equals(teacherId)) {
+            throw HelperException.of(HelperException.ExceptionType.FORBIDDEN, "你无权修改该幻灯片");
+        }
+        slide.setState(slideDTO.getState());
+        slide.setName(slideDTO.getName());
+        slide.setItems(
+                slideDTO.getItems()
+                        .stream()
+                        .map(itemDTO -> {
+                            Item item = new Item();
+                            BeanUtils.copyProperties(itemDTO, item);
+                            item.setSlide(slide);
+                            return item;
+                        })
+                        .collect(Collectors.toList())
+        );
+        return new SlideVO(slideDAO.save(slide));
     }
 
     @Override
-    public SlideVO updateState(int slideId, SlideState state) {
+    public SlideVO updateState(Integer teacherId, Integer slideId, SlideState state) {
         Slide slide = slideDAO.findSlideById(slideId);
+        if (!slide.getTeacherId().equals(teacherId)) {
+            throw HelperException.of(HelperException.ExceptionType.FORBIDDEN, "你无权修改该幻灯片");
+        }
         slide.setState(state);
         slide = slideDAO.save(slide);
         return new SlideVO(slide);
     }
 
     @Override
-    public void delete(int slideId) {
+    public void delete(Integer teacherId, Integer slideId) {
+        Slide slide = slideDAO.findSlideById(slideId);
+        if (!slide.getTeacherId().equals(teacherId)) {
+            throw HelperException.of(HelperException.ExceptionType.FORBIDDEN, "你无权删除该幻灯片");
+        }
         slideDAO.deleteById(slideId);
     }
 
     @Override
-    public List<SlideVO> getStudentSlides(String courseId, String key, Pageable pageable) {
-        Page<Slide> slidePage = slideDAO.findByCourseIdAndStateNotAndNameContains(courseId, SlideState.DRAFT, key, pageable);
-        return slidePage.getContent().stream()
+    public List<SlideVO> studentGetSlides(Integer studentId, Integer courseId, String key, Pageable pageable) {
+        Page<Slide> slidePage = slideDAO.findByCourseIdAndStateNotInAndNameContains(courseId, Collections.singleton(SlideState.DRAFT), key, pageable);
+        return slidePage
+                .getContent()
+                .stream()
                 .map(SlideVO::new)
                 .collect(Collectors.toList());
     }
 
-    private void copySlideDTOToSlide(SlideDTO slideDTO, Slide slide) {
-        BeanUtils.copyProperties(slideDTO, slide, "courseId", "courseName", "createTime", "updateTime", "items");
-        slide.setItems(slideDTO.getItems().stream()
-                .map(itemDTO -> {
-                    Item item = new Item();
-                    BeanUtils.copyProperties(itemDTO, item);
-                    item.setSlide(slide);
-                    return item;
-                }).collect(Collectors.toList()));
+    @Override
+    public SlideVO studentGetOneSlide(Integer studentId, Integer slideId) {
+        Slide slide = slideDAO.findByIdAndStateNotIn(slideId, Collections.singleton(SlideState.DRAFT));
+
+        if (slide == null) {
+            throw HelperException.of(HelperException.ExceptionType.NOT_FOUND, "找不到幻灯片");
+        } else {
+            return new SlideVO(slide);
+        }
     }
 }

+ 1 - 1
src/main/java/nju/seec/helper/logic/vo/CourseVO.java

@@ -8,7 +8,7 @@ import nju.seec.helper.data.entity.Course;
  */
 @Data
 public class CourseVO {
-    private String id;
+    private Integer id;
     private String name;
 
     public CourseVO(Course course) {

+ 0 - 1
src/main/java/nju/seec/helper/logic/vo/QuestionVO.java

@@ -5,7 +5,6 @@ import nju.seec.helper.data.entity.Question;
 import nju.seec.helper.util.enums.QuestionType;
 
 import java.time.LocalDateTime;
-import java.util.List;
 import java.util.Map;
 import java.util.Set;
 

+ 3 - 1
src/main/java/nju/seec/helper/logic/vo/QuizVO.java

@@ -24,7 +24,9 @@ public class QuizVO {
         this.slideId = quiz.getSlideId();
         this.type = quiz.getType();
         this.updateTime = quiz.getUpdateTime();
-        this.questions = quiz.getQuestions().stream()
+        this.questions = quiz
+                .getQuestions()
+                .stream()
                 .map(QuestionVO::new)
                 .collect(Collectors.toList());
     }

+ 4 - 2
src/main/java/nju/seec/helper/logic/vo/SlideVO.java

@@ -14,7 +14,7 @@ import java.util.stream.Collectors;
 @Data
 public class SlideVO {
     private Integer id;
-    private String courseId;
+    private Integer courseId;
     private String courseName;
     private SlideState state;
     private String name;
@@ -30,7 +30,9 @@ public class SlideVO {
         this.name = slide.getName();
         this.createTime = slide.getCreateTime();
         this.updateTime = slide.getUpdateTime();
-        this.items = slide.getItems().stream()
+        this.items = slide
+                .getItems()
+                .stream()
                 .map(ItemVO::new)
                 .collect(Collectors.toList());
 

+ 37 - 57
src/main/java/nju/seec/helper/logic/vo/StudentQuizVO.java

@@ -1,12 +1,12 @@
 package nju.seec.helper.logic.vo;
 
 import lombok.Data;
+import lombok.NonNull;
 import nju.seec.helper.data.entity.Question;
 import nju.seec.helper.data.entity.Quiz;
 import nju.seec.helper.data.entity.SubmitAnswer;
 import nju.seec.helper.util.enums.QuizType;
 
-import java.time.LocalDateTime;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
@@ -17,73 +17,53 @@ import java.util.stream.Collectors;
  */
 @Data
 public class StudentQuizVO {
-    private Integer id;
+    private Integer quizId;
     private Integer slideId;
     private List<NoAnswerQuestionVO> questions;
     private QuizType type;
 
     private SubmitAnswerVO submitAnswer;
 
-    public StudentQuizVO(Quiz quiz, SubmitAnswer submitAnswer) {
-        this.id = quiz.getId();
+    public StudentQuizVO(Quiz quiz) {
+        this.quizId = quiz.getId();
+        this.slideId = quiz.getSlideId();
+        this.type = quiz.getType();
+        this.questions = quiz
+                .getQuestions()
+                .stream()
+                .map(NoAnswerQuestionVO::new)
+                .collect(Collectors.toList());
+        this.submitAnswer = null;
+    }
+
+    public StudentQuizVO(Quiz quiz, @NonNull SubmitAnswer submitAnswer) {
+        this.quizId = quiz.getId();
         this.slideId = quiz.getSlideId();
         this.type = quiz.getType();
-        if (submitAnswer == null) {
-            this.questions = quiz.getQuestions().stream()
-                    .map(NoAnswerQuestionVO::new)
-                    .collect(Collectors.toList());
-            this.submitAnswer = null;
-        } else {
-            SubmitAnswerVO submitAnswerVO = new SubmitAnswerVO();
-            submitAnswerVO.id = submitAnswer.getId();
-            submitAnswerVO.quizId = submitAnswer.getQuizId();
-            submitAnswerVO.studentId = submitAnswer.getStudentId();
-            submitAnswerVO.submitTime = submitAnswer.getSubmitTime();
-            submitAnswerVO.submitNum = submitAnswer.getSubmitNum();
 
-            List<Question> questions = quiz.getQuestions();
-            Map<Integer, String> chooseOptions = submitAnswer.getChooseOptions();
-            this.questions = new ArrayList<>();
-            submitAnswerVO.chooseOptions = new ArrayList<>();
-            submitAnswerVO.rightNum = 0;
-            for (Question question : questions) {
-                this.questions.add(new NoAnswerQuestionVO(question));
-                String chooseOption = chooseOptions.get(question.getId());
-                submitAnswerVO.chooseOptions.add(chooseOption);
-                if (question.getAnswer().equals(chooseOption)) {
-                    submitAnswerVO.rightNum++;
-                }
+        SubmitAnswerVO submitAnswerVO = new SubmitAnswerVO();
+        submitAnswerVO.setId(submitAnswer.getId());
+        submitAnswerVO.setStudentId(submitAnswer.getStudentId());
+        submitAnswerVO.setSubmitTime(submitAnswer.getSubmitTime());
+        submitAnswerVO.setSubmitNum(submitAnswer.getSubmitNum());
+
+        List<Question> questions = quiz.getQuestions();
+        Map<Integer, String> chooseOptionsMap = submitAnswer.getChooseOptions();
+        this.questions = new ArrayList<>();
+        List<String> chooseOptions = new ArrayList<>(chooseOptionsMap.size());
+
+        int rightNum = 0;
+        for (Question question : questions) {
+            this.questions.add(new NoAnswerQuestionVO(question));
+            String chooseOption = chooseOptionsMap.get(question.getId());
+            chooseOptions.add(chooseOption);
+            if (question.getAnswer().equals(chooseOption)) {
+                rightNum++;
             }
-            this.submitAnswer = submitAnswerVO;
         }
+        submitAnswerVO.setChooseOptions(chooseOptions);
+        submitAnswerVO.setRightNum(rightNum);
+        this.submitAnswer = submitAnswerVO;
     }
 
-    @Data
-    public static class SubmitAnswerVO {
-        private Integer id;
-        /**
-         * 提交学生编号
-         */
-        private Integer studentId;
-        /**
-         *
-         */
-        private Integer quizId;
-        /**
-         * 学生上次提交选项列表,与问题列表一一对应
-         */
-        private List<String> chooseOptions;
-        /**
-         * 上次提交时间
-         */
-        private LocalDateTime submitTime;
-        /**
-         * 已提交次数
-         */
-        private Integer submitNum;
-        /**
-         * 正确个数
-         */
-        private Integer rightNum;
-    }
 }

+ 31 - 0
src/main/java/nju/seec/helper/logic/vo/SubmitAnswerVO.java

@@ -0,0 +1,31 @@
+package nju.seec.helper.logic.vo;
+
+import lombok.Data;
+
+import java.time.LocalDateTime;
+import java.util.List;
+
+@Data
+public class SubmitAnswerVO {
+    private Integer id;
+    /**
+     * 提交学生编号
+     */
+    private Integer studentId;
+    /**
+     * 学生上次提交选项列表,与问题列表一一对应
+     */
+    private List<String> chooseOptions;
+    /**
+     * 上次提交时间
+     */
+    private LocalDateTime submitTime;
+    /**
+     * 已提交次数
+     */
+    private Integer submitNum;
+    /**
+     * 正确个数
+     */
+    private Integer rightNum;
+}

+ 0 - 20
src/main/java/nju/seec/helper/util/JsonUtils.java

@@ -1,20 +0,0 @@
-package nju.seec.helper.util;
-
-import com.google.gson.Gson;
-import lombok.experimental.UtilityClass;
-
-/**
- * @author cst
- */
-@UtilityClass
-public class JsonUtils {
-    private static final Gson GSON = new Gson();
-
-    public String toJson(Object object) {
-        return GSON.toJson(object);
-    }
-
-    public <T> T fromJson(String json, Class<T> classOfT) {
-        return GSON.fromJson(json, classOfT);
-    }
-}

+ 1 - 1
src/main/java/nju/seec/helper/util/enums/ItemTransition.java

@@ -4,5 +4,5 @@ package nju.seec.helper.util.enums;
  * @author cst
  */
 public enum ItemTransition {
-    NORMAL
+    NONE
 }

+ 0 - 10
src/main/java/nju/seec/helper/web/controller/CommentController.java

@@ -1,10 +0,0 @@
-package nju.seec.helper.web.controller;
-
-import lombok.Data;
-
-/**
- * @author cst
- */
-@Data
-public class CommentController {
-}

+ 2 - 1
src/main/java/nju/seec/helper/web/controller/QuestionController.java

@@ -7,6 +7,7 @@ import nju.seec.helper.logic.vo.QuestionVO;
 import nju.seec.helper.web.response.ResourceResponse;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
 import java.util.List;
@@ -26,7 +27,7 @@ public class QuestionController {
 
     @ApiOperation("教师取得问题")
     @GetMapping
-    public ResourceResponse<List<QuestionVO>> getQuestions(String key) {
+    public ResourceResponse<List<QuestionVO>> getQuestions(@RequestParam(defaultValue = "", required = false) String key) {
         return ResourceResponse.of(questionService.getQuestions(key));
     }
 }

+ 16 - 16
src/main/java/nju/seec/helper/web/controller/SlideController.java

@@ -34,10 +34,10 @@ public class SlideController {
 
     @ApiOperation(value = "教师根据课程ID和关键字获取创建的幻灯片列表", notes = "支持定制化分页排序,例:?page=3&size=10&sort=id,asc&sort=name,desc,即以id正向排序再以name倒序排序,请求第3页,返回10条数据")
     @GetMapping("/teacher/course/{courseId}")
-    public PageResourceResponse<SlideVO> teacherGetSlides(@PathVariable String courseId,
+    public PageResourceResponse<SlideVO> teacherGetSlides(@PathVariable Integer courseId,
                                                           @RequestParam(required = false, defaultValue = "") String key,
                                                           @ApiParam(hidden = true) @PageableDefault(size = Integer.MAX_VALUE, sort = "updateTime", direction = Sort.Direction.DESC) Pageable pageable) {
-        List<SlideVO> slideVOs = slideService.getTeacherSlides(courseId, key, pageable);
+        List<SlideVO> slideVOs = slideService.teacherGetSlides(1, courseId, key, pageable);
         return PageResourceResponse.of(slideVOs, PageResourceResponse.PageInfo.of(pageable.getPageNumber(), slideVOs.size()));
     }
 
@@ -46,54 +46,54 @@ public class SlideController {
     @GetMapping("/teacher")
     public PageResourceResponse<SlideVO> teacherGetSlides(@RequestParam(required = false, defaultValue = "") String key,
                                                           @ApiParam(hidden = true) @PageableDefault(size = Integer.MAX_VALUE, sort = "updateTime", direction = Sort.Direction.DESC) Pageable pageable) {
-        List<SlideVO> slideVOs = slideService.getTeacherSlides(key, pageable);
+        List<SlideVO> slideVOs = slideService.teacherGetSlides(1, key, pageable);
         return PageResourceResponse.of(slideVOs, PageResourceResponse.PageInfo.of(pageable.getPageNumber(), slideVOs.size()));
     }
 
     @ApiOperation(value = "教师根据ID获取幻灯片")
     @GetMapping("/teacher/{slideId:\\d+}")
-    public ResourceResponse<SlideVO> teacherGetSlide(@PathVariable int slideId) {
-        return ResourceResponse.of(slideService.getOneSlide(slideId));
+    public ResourceResponse<SlideVO> teacherGetSlide(@PathVariable Integer slideId) {
+        return ResourceResponse.of(slideService.teacherGetOneSlide(1, slideId));
     }
 
 
     @ApiOperation(value = "创建幻灯片")
     @PostMapping
-    public ResourceResponse<SlideVO> create(@RequestBody @Validated SlideDTO slideDTO) {
-        return ResourceResponse.of(slideService.create(slideDTO));
+    public ResourceResponse<SlideVO> createSlide(@RequestBody @Validated SlideDTO slideDTO) {
+        return ResourceResponse.of(slideService.create(1, slideDTO));
     }
 
     @ApiOperation(value = "更新幻灯片")
     @PutMapping
-    public ResourceResponse<SlideVO> update(@RequestBody @Validated SlideDTO slideDTO) {
-        return ResourceResponse.of(slideService.update(slideDTO));
+    public ResourceResponse<SlideVO> updateSlide(@RequestBody @Validated SlideDTO slideDTO) {
+        return ResourceResponse.of(slideService.update(1, slideDTO));
     }
 
     @ApiOperation(value = "更新幻灯片状态")
     @PutMapping("/{slideId:\\d+}/state")
-    public ResourceResponse<SlideVO> updateState(@PathVariable("slideId") int slideId, String state) {
-        return ResourceResponse.of(slideService.updateState(slideId, SlideState.valueOf(state)));
+    public ResourceResponse<SlideVO> updateSlideState(@PathVariable("slideId") Integer slideId, String state) {
+        return ResourceResponse.of(slideService.updateState(1, slideId, SlideState.valueOf(state)));
     }
 
     @ApiOperation(value = "删除幻灯片")
     @DeleteMapping("/{slideId:\\d+}")
-    public EmptyResponse delete(@PathVariable int slideId) {
-        slideService.delete(slideId);
+    public EmptyResponse deleteSlide(@PathVariable Integer slideId) {
+        slideService.delete(1, slideId);
         return EmptyResponse.getInstance();
     }
 
     @ApiOperation(value = "学生根据课程ID和关键字获取可阅读的幻灯片列表", notes = "支持定制化分页排序,例:?page=3&size=10&sort=id,asc&sort=name,desc,即以id正向排序再以name倒序排序,请求第3页,返回10条数据")
     @GetMapping("/student/course/{courseId}")
-    public PageResourceResponse<SlideVO> studentGetSlides(@PathVariable String courseId,
+    public PageResourceResponse<SlideVO> studentGetSlides(@PathVariable Integer courseId,
                                                           @RequestParam(required = false, defaultValue = "") String key,
                                                           @ApiParam(hidden = true) @PageableDefault(size = Integer.MAX_VALUE, sort = "updateTime", direction = Sort.Direction.DESC) Pageable pageable) {
-        List<SlideVO> slideVOs = slideService.getStudentSlides(courseId, key, pageable);
+        List<SlideVO> slideVOs = slideService.studentGetSlides(1, courseId, key, pageable);
         return PageResourceResponse.of(slideVOs, PageResourceResponse.PageInfo.of(pageable.getPageNumber(), slideVOs.size()));
     }
 
     @ApiOperation(value = "学生根据ID获取幻灯片")
     @GetMapping("/student/{slideId:\\d+}")
     public ResourceResponse<SlideVO> studentGetSlide(@PathVariable("slideId") int slideId) {
-        return ResourceResponse.of(slideService.getOneSlide(slideId));
+        return ResourceResponse.of(slideService.studentGetOneSlide(1, slideId));
     }
 }

+ 0 - 20
src/main/java/nju/seec/helper/web/dto/CommentDTO.java

@@ -1,20 +0,0 @@
-package nju.seec.helper.web.dto;
-
-import lombok.Data;
-
-import javax.validation.constraints.NotEmpty;
-import javax.validation.constraints.NotNull;
-
-/**
- * @author cst
- */
-@Data
-public class CommentDTO {
-    @NotNull
-    private Integer slideId;
-    @NotNull
-    private Integer itemId;
-    private Integer beforeCommentId;
-    @NotEmpty
-    private String content;
-}

+ 1 - 1
src/main/java/nju/seec/helper/web/dto/ItemDTO.java

@@ -12,7 +12,7 @@ public class ItemDTO {
     private String frontendId;
     private String placeholder;
     private Integer id;
-    private ItemTransition transition = ItemTransition.NORMAL;
+    private ItemTransition transition;
     private ItemType type = ItemType.MD;
     private String content;
 }

+ 1 - 2
src/main/java/nju/seec/helper/web/dto/QuizDTO.java

@@ -4,7 +4,6 @@ import lombok.Data;
 import nju.seec.helper.util.enums.QuizType;
 
 import javax.validation.constraints.NotNull;
-import java.util.Collections;
 import java.util.List;
 
 /**
@@ -14,7 +13,7 @@ import java.util.List;
 public class QuizDTO {
     @NotNull
     private Integer slideId;
-    private List<Integer> questionIds = Collections.emptyList();
+    private List<Integer> questionIds;
     @NotNull
     private QuizType type;
 }

+ 3 - 4
src/main/java/nju/seec/helper/web/dto/SlideDTO.java

@@ -4,7 +4,6 @@ import lombok.Data;
 import nju.seec.helper.util.enums.SlideState;
 
 import javax.validation.constraints.NotEmpty;
-import java.util.Collections;
 import java.util.List;
 
 /**
@@ -12,10 +11,10 @@ import java.util.List;
  */
 @Data
 public class SlideDTO {
-    private String courseId;
+    private Integer courseId;
     private Integer id;
-    private SlideState state = SlideState.DRAFT;
+    private SlideState state;
     @NotEmpty
     private String name;
-    private List<ItemDTO> items = Collections.emptyList();
+    private List<ItemDTO> items;
 }