Browse Source

feat: 增加课程接口

ChenSiTong 6 years ago
parent
commit
fdd5d67242

+ 13 - 0
src/main/java/nju/seec/helper/data/dao/CourseDAO.java

@@ -0,0 +1,13 @@
+package nju.seec.helper.data.dao;
+
+import nju.seec.helper.data.entity.Course;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+/**
+ * @author cst
+ */
+@Repository
+public interface CourseDAO extends JpaRepository<Course, String> {
+
+}

+ 13 - 0
src/main/java/nju/seec/helper/data/dao/QuizDAO.java

@@ -0,0 +1,13 @@
+package nju.seec.helper.data.dao;
+
+import nju.seec.helper.data.entity.Quiz;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+/**
+ * @author cst
+ */
+@Repository
+public interface QuizDAO extends JpaRepository<Quiz, Integer> {
+
+}

+ 22 - 0
src/main/java/nju/seec/helper/data/entity/Course.java

@@ -0,0 +1,22 @@
+package nju.seec.helper.data.entity;
+
+import lombok.Data;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+/**
+ * @author cst
+ */
+@Data
+@Entity
+@Table(name = "course")
+public class Course {
+    @Id
+    private String id;
+
+    @Column(nullable = false)
+    private String name;
+}

+ 5 - 2
src/main/java/nju/seec/helper/data/entity/Slide.java

@@ -21,14 +21,17 @@ public class Slide {
     @GeneratedValue(strategy = GenerationType.IDENTITY)
     private int id;
 
-    @Column(name = "course_id", nullable = false)
+    @Column(name = "course_id", nullable = false, updatable = false)
     private String courseId;
 
+    @Column(name = "course_name", nullable = false, updatable = false)
+    private String courseName;
+
     @Enumerated(EnumType.STRING)
     @Column(nullable = false)
     private SlideState state;
 
-    @Column(nullable = false)
+    @Column(nullable = false, unique = true)
     private String name;
 
     @OneToMany(mappedBy = "slide")

+ 7 - 9
src/main/java/nju/seec/helper/logic/convert/DTOConvertFactory.java

@@ -4,8 +4,10 @@ import com.google.common.collect.ImmutableMap;
 import lombok.experimental.UtilityClass;
 import nju.seec.helper.data.entity.Item;
 import nju.seec.helper.data.entity.Slide;
+import nju.seec.helper.data.entity.SlideQuiz;
+import nju.seec.helper.util.CopyUtils;
 import nju.seec.helper.web.dto.SlideDTO;
-import org.springframework.beans.BeanUtils;
+import nju.seec.helper.web.dto.SlideQuizDTO;
 
 import java.util.Map;
 import java.util.stream.Collectors;
@@ -18,16 +20,12 @@ public class DTOConvertFactory {
     @SuppressWarnings("rawtypes")
     private static final Map<Class, DTOConverter> MAP = new ImmutableMap.Builder<Class, DTOConverter>()
             .put(SlideDTO.class, (DTOConverter<SlideDTO, Slide>) slideDTO -> {
-                Slide slide = new Slide();
-                BeanUtils.copyProperties(slideDTO, slide, "items");
-                slide.setItems(slideDTO.getItems().stream()
-                        .map(itemDTO -> {
-                            Item item = new Item();
-                            BeanUtils.copyProperties(itemDTO, item);
-                            return item;
-                        }).collect(Collectors.toList()));
+                Slide slide = CopyUtils.copy(slideDTO, Slide.class, "items");
+                slide.setItems(slideDTO.getItems().stream().map(itemDTO -> CopyUtils.copy(itemDTO, Item.class)).collect(Collectors.toList()));
                 return slide;
             })
+            .put(SlideQuizDTO.class, (DTOConverter<SlideQuizDTO, SlideQuiz>) slideQuizDTO ->
+                    CopyUtils.copy(slideQuizDTO, SlideQuiz.class))
             .build();
 
     @SuppressWarnings("unchecked")

+ 21 - 6
src/main/java/nju/seec/helper/logic/service/impl/CourseServiceImpl.java

@@ -1,5 +1,8 @@
 package nju.seec.helper.logic.service.impl;
 
+import nju.seec.helper.data.dao.CourseDAO;
+import nju.seec.helper.data.entity.Course;
+import nju.seec.helper.logic.convert.EntityConvertFactory;
 import nju.seec.helper.logic.service.CourseService;
 import nju.seec.helper.logic.vo.CourseVO;
 import nju.seec.helper.util.FakerUtils;
@@ -8,6 +11,7 @@ import org.springframework.stereotype.Service;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * @author cst
@@ -15,17 +19,28 @@ import java.util.List;
  */
 @Service
 public class CourseServiceImpl implements CourseService {
+    private final CourseDAO courseDAO;
+
+    public CourseServiceImpl(CourseDAO courseDAO) {
+        this.courseDAO = courseDAO;
+    }
+
     @Override
     public List<CourseVO> getTeacherCourses(int teacherId, Pageable pageable) {
-        List<CourseVO> courseVOs = new ArrayList<>();
+        List<Course> courses = new ArrayList<>();
         int size = Math.min(pageable.getPageSize(), 10);
         for (int i = 0; i < size; i++) {
-            CourseVO courseVO = new CourseVO();
-            courseVO.setId(FakerUtils.getFaker().idNumber().invalidSvSeSsn());
-            courseVO.setName(FakerUtils.getFaker().job().field());
-            courseVOs.add(courseVO);
+            Course course = new Course();
+            course.setId(FakerUtils.getFaker().idNumber().invalidSvSeSsn());
+            course.setName(FakerUtils.getFaker().job().field());
+            courses.add(course);
         }
-        return courseVOs;
+
+        courses = courseDAO.saveAll(courses);
+
+        return courses.stream()
+                .map(course -> EntityConvertFactory.convert(course, CourseVO.class))
+                .collect(Collectors.toList());
     }
 
     @Override

+ 15 - 2
src/main/java/nju/seec/helper/logic/service/impl/SlideServiceImpl.java

@@ -1,6 +1,8 @@
 package nju.seec.helper.logic.service.impl;
 
+import nju.seec.helper.data.dao.CourseDAO;
 import nju.seec.helper.data.dao.SlideDAO;
+import nju.seec.helper.data.entity.Course;
 import nju.seec.helper.data.entity.Slide;
 import nju.seec.helper.logic.convert.DTOConvertFactory;
 import nju.seec.helper.logic.convert.EntityConvertFactory;
@@ -26,9 +28,12 @@ import java.util.stream.Collectors;
 @Service
 @CacheConfig(cacheNames = "slide")
 public class SlideServiceImpl implements SlideService {
+    private final CourseDAO courseDAO;
+
     private final SlideDAO slideDAO;
 
-    public SlideServiceImpl(SlideDAO slideDAO) {
+    public SlideServiceImpl(CourseDAO courseDAO, SlideDAO slideDAO) {
+        this.courseDAO = courseDAO;
         this.slideDAO = slideDAO;
     }
 
@@ -60,7 +65,9 @@ public class SlideServiceImpl implements SlideService {
     @Override
     public SlideVO create(SlideDTO slideDTO) {
         Slide slide = new Slide();
-        slide.setCourseId(slideDTO.getCourseId());
+        Course course = findCourseById(slideDTO.getCourseId());
+        slide.setCourseId(course.getId());
+        slide.setCourseName(course.getName());
         slide.setName(slideDTO.getName());
         slide.setState(SlideState.DRAFT);
         slide = slideDAO.save(slide);
@@ -86,4 +93,10 @@ public class SlideServiceImpl implements SlideService {
                 HelperException.ExceptionType.NOT_FOUND, "找不到幻灯片")
         );
     }
+
+    private Course findCourseById(String courseId) {
+        return courseDAO.findById(courseId).orElseThrow(() -> HelperException.of(
+                HelperException.ExceptionType.NOT_FOUND, "找不到课程")
+        );
+    }
 }

+ 18 - 0
src/main/java/nju/seec/helper/util/CopyUtils.java

@@ -0,0 +1,18 @@
+package nju.seec.helper.util;
+
+import lombok.SneakyThrows;
+import lombok.experimental.UtilityClass;
+import org.springframework.beans.BeanUtils;
+
+/**
+ * @author cst
+ */
+@UtilityClass
+public class CopyUtils {
+    @SneakyThrows
+    public <T> T copy(Object source, Class<T> classOfT, String... ignoreProperties) {
+        T t = classOfT.newInstance();
+        BeanUtils.copyProperties(source, t, ignoreProperties);
+        return t;
+    }
+}

+ 0 - 16
src/main/java/nju/seec/helper/util/FileUtils.java

@@ -1,16 +0,0 @@
-package nju.seec.helper.util;
-
-import lombok.experimental.UtilityClass;
-
-import java.io.File;
-import java.nio.file.Paths;
-
-/**
- * @author cst
- */
-@UtilityClass
-public class FileUtils {
-    public File getFile(String path) {
-        return Paths.get(path).toFile();
-    }
-}

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

@@ -26,7 +26,7 @@ public class CourseController {
         this.courseService = courseService;
     }
 
-    @ApiOperation(value = "教师获取创建课程", notes = "支持定制化分页排序,例:" + "/course/seec?page=3&size=10&sort=id,asc&sort=name,desc" + ",即以id正向排序再以name倒序排序,请求第3页,返回10条数据")
+    @ApiOperation(value = "教师获取创建课程", notes = "支持定制化分页排序,例:/course/seec?page=3&size=10&sort=id,asc&sort=name,desc,即以id正向排序再以name倒序排序,请求第3页,返回10条数据")
     @GetMapping("/teacher")
     public PageResourceResponse<CourseVO> getTeacherCourses(@ApiParam(hidden = true) @PageableDefault(size = Integer.MAX_VALUE) Pageable pageable) {
         List<CourseVO> courseVOs = courseService.getTeacherCourses(1, pageable);

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

@@ -31,7 +31,7 @@ public class SlideController {
         this.slideService = slideService;
     }
 
-    @ApiOperation(value = "根据课程ID和关键字获取创建的幻灯片列表", notes = "支持定制化分页排序,例:" + "/course/seec?page=3&size=10&sort=id,asc&sort=name,desc" + ",即以id正向排序再以name倒序排序,请求第3页,返回10条数据")
+    @ApiOperation(value = "根据课程ID和关键字获取创建的幻灯片列表", notes = "支持定制化分页排序,例:/course/seec?page=3&size=10&sort=id,asc&sort=name,desc,即以id正向排序再以name倒序排序,请求第3页,返回10条数据")
     @GetMapping("/course/{courseId}")
     public PageResourceResponse<SlideVO> getSlides(@PathVariable String courseId,
                                                    @RequestParam(defaultValue = "") String key,
@@ -41,7 +41,7 @@ public class SlideController {
     }
 
 
-    @ApiOperation(value = "根据关键字获取创建的幻灯片列表", notes = "支持定制化分页排序,例:" + "/course/seec?page=3&size=10&sort=id,asc&sort=name,desc" + ",即以id正向排序再以name倒序排序,请求第3页,返回10条数据")
+    @ApiOperation(value = "根据关键字获取创建的幻灯片列表", notes = "支持定制化分页排序,例:/course/seec?page=3&size=10&sort=id,asc&sort=name,desc,即以id正向排序再以name倒序排序,请求第3页,返回10条数据")
     @GetMapping("")
     public PageResourceResponse<SlideVO> getSlides(@RequestParam(defaultValue = "") String key,
                                                    @ApiParam(hidden = true) @PageableDefault(size = Integer.MAX_VALUE, sort = "updateTime", direction = Sort.Direction.DESC) Pageable pageable) {