Browse Source

feat: 定义DTO、Entity、VO数据结构,添加POJO转化工厂

ChenSiTong 6 years ago
parent
commit
361b22aa4a
26 changed files with 627 additions and 0 deletions
  1. 30 0
      src/main/java/nju/seec/helper/data/entity/Comment.java
  2. 29 0
      src/main/java/nju/seec/helper/data/entity/Item.java
  3. 35 0
      src/main/java/nju/seec/helper/data/entity/Page.java
  4. 33 0
      src/main/java/nju/seec/helper/data/entity/Quiz.java
  5. 48 0
      src/main/java/nju/seec/helper/data/entity/Slide.java
  6. 72 0
      src/main/java/nju/seec/helper/logic/convert/DTOConvertFactory.java
  7. 15 0
      src/main/java/nju/seec/helper/logic/convert/DTOConverter.java
  8. 71 0
      src/main/java/nju/seec/helper/logic/convert/EntityConvertFactory.java
  9. 15 0
      src/main/java/nju/seec/helper/logic/convert/EntityConverter.java
  10. 14 0
      src/main/java/nju/seec/helper/logic/convert/Pair.java
  11. 12 0
      src/main/java/nju/seec/helper/logic/vo/CourseVO.java
  12. 15 0
      src/main/java/nju/seec/helper/logic/vo/ItemVO.java
  13. 16 0
      src/main/java/nju/seec/helper/logic/vo/Page.java
  14. 14 0
      src/main/java/nju/seec/helper/logic/vo/PageInfo.java
  15. 18 0
      src/main/java/nju/seec/helper/logic/vo/PageVO.java
  16. 17 0
      src/main/java/nju/seec/helper/logic/vo/QuizVO.java
  17. 22 0
      src/main/java/nju/seec/helper/logic/vo/SlideOutlineVO.java
  18. 24 0
      src/main/java/nju/seec/helper/logic/vo/SlideVO.java
  19. 7 0
      src/main/java/nju/seec/helper/util/enums/QuizType.java
  20. 9 0
      src/main/java/nju/seec/helper/util/enums/SlideState.java
  21. 18 0
      src/main/java/nju/seec/helper/web/dto/CommentDTO.java
  22. 13 0
      src/main/java/nju/seec/helper/web/dto/ItemDTO.java
  23. 16 0
      src/main/java/nju/seec/helper/web/dto/PageDTO.java
  24. 15 0
      src/main/java/nju/seec/helper/web/dto/QuizDTO.java
  25. 23 0
      src/main/java/nju/seec/helper/web/dto/SlideDTO.java
  26. 26 0
      src/main/resources/application-dev.yml

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

@@ -0,0 +1,30 @@
+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 int id;
+    @Column(name = "page_id", nullable = false)
+    private int pageId;
+    @Column(name = "before_comment_id")
+    private Integer beforeCommentId;
+    @Column(name = "student_name", nullable = false)
+    private String studentName;
+    @Column(name = "student_id", nullable = false)
+    private String studentId;
+    @Column(name = "create_time", updatable = false)
+    @CreationTimestamp()
+    private LocalDateTime createTime;
+}

+ 29 - 0
src/main/java/nju/seec/helper/data/entity/Item.java

@@ -0,0 +1,29 @@
+package nju.seec.helper.data.entity;
+
+import lombok.Data;
+
+import javax.persistence.*;
+
+/**
+ * @author cst
+ */
+@Data
+@Entity
+@Table(name = "item")
+public class Item {
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    private int id;
+
+    @Column(name = "frontend_id")
+    private String frontendId;
+
+    @Column(nullable = false)
+    private int number;
+
+    private String content;
+
+    @ManyToOne
+    @JoinColumn(name = "page_id")
+    private Page page;
+}

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

@@ -0,0 +1,35 @@
+package nju.seec.helper.data.entity;
+
+import lombok.Data;
+
+import javax.persistence.*;
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * @author cst
+ */
+@Data
+@Entity
+@Table(name = "page")
+public class Page {
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    private int id;
+
+    @Column(name = "frontend_id")
+    private String frontendId;
+
+    @Column(nullable = false)
+    private int number;
+
+    @OneToMany(mappedBy = "page")
+    private Set<Item> items = new HashSet<>();
+
+    @OneToMany(mappedBy = "page")
+    private Set<Quiz> quizzes = new HashSet<>();
+
+    @ManyToOne
+    @JoinColumn(name = "slide_id")
+    private Slide slide;
+}

+ 33 - 0
src/main/java/nju/seec/helper/data/entity/Quiz.java

@@ -0,0 +1,33 @@
+package nju.seec.helper.data.entity;
+
+import lombok.Data;
+import nju.seec.helper.util.enums.QuizType;
+
+import javax.persistence.*;
+
+/**
+ * @author cst
+ */
+@Data
+@Entity
+@Table(name = "quiz")
+public class Quiz {
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    private int id;
+
+    @Column(name = "system_id", nullable = false)
+    private String systemId;
+
+    @Enumerated(EnumType.STRING)
+    private QuizType type;
+
+    @Column(nullable = false)
+    private int number;
+
+    private String content;
+
+    @ManyToOne
+    @JoinColumn(name = "page_id")
+    private Page page;
+}

+ 48 - 0
src/main/java/nju/seec/helper/data/entity/Slide.java

@@ -0,0 +1,48 @@
+package nju.seec.helper.data.entity;
+
+import lombok.Data;
+import nju.seec.helper.util.enums.SlideState;
+import org.hibernate.annotations.CreationTimestamp;
+import org.hibernate.annotations.Generated;
+import org.hibernate.annotations.UpdateTimestamp;
+
+import javax.persistence.*;
+import java.time.LocalDateTime;
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * @author cst
+ */
+@Data
+@Entity
+@Table(name = "slide")
+public class Slide {
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    private int id;
+
+    @Column(name = "course_id", nullable = false)
+    private String courseId;
+
+    @Column(name = "frontend_id")
+    private String frontendId;
+
+    @Enumerated(EnumType.STRING)
+    @Column(nullable = false)
+    private SlideState state;
+
+    @Column(nullable = false)
+    private String name;
+
+    @OneToMany(mappedBy = "slide")
+    private Set<Page> pages = new HashSet<>();
+
+    @Column(name = "create_time", updatable = false)
+    @CreationTimestamp
+    private LocalDateTime createTime;
+
+    @Column(name = "update_time")
+    @UpdateTimestamp
+    private LocalDateTime updateTime;
+}

+ 72 - 0
src/main/java/nju/seec/helper/logic/convert/DTOConvertFactory.java

@@ -0,0 +1,72 @@
+package nju.seec.helper.logic.convert;
+
+import com.google.common.collect.ImmutableMap;
+import lombok.experimental.UtilityClass;
+import nju.seec.helper.data.entity.Item;
+import nju.seec.helper.data.entity.Page;
+import nju.seec.helper.data.entity.Quiz;
+import nju.seec.helper.data.entity.Slide;
+import nju.seec.helper.web.dto.SlideDTO;
+
+import java.util.Map;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.stream.Collectors;
+
+/**
+ * @author cst
+ */
+@UtilityClass
+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();
+                slide.setId(slideDTO.getId());
+                slide.setCourseId(slideDTO.getCourseId());
+                slide.setFrontendId(slideDTO.getFrontendId());
+                slide.setState(slideDTO.getState());
+                slide.setName(slideDTO.getName());
+
+                AtomicInteger pageIndex = new AtomicInteger();
+                slide.setPages(slideDTO.getPages().stream()
+                        .map(pageDTO -> {
+                            Page page = new Page();
+                            page.setId(pageDTO.getId());
+                            page.setFrontendId(pageDTO.getFrontendId());
+                            page.setNumber(pageIndex.getAndIncrement());
+
+                            AtomicInteger quizIndex = new AtomicInteger();
+                            page.setQuizzes(pageDTO.getQuizzes().stream()
+                                    .map(quizDTO -> {
+                                        Quiz quiz = new Quiz();
+                                        quiz.setId(quizDTO.getId());
+                                        quiz.setSystemId(quizDTO.getSystemId());
+                                        quiz.setContent(quizDTO.getContent());
+                                        quiz.setNumber(quizIndex.getAndIncrement());
+                                        return quiz;
+                                    })
+                                    .collect(Collectors.toSet()));
+
+                            AtomicInteger itemIndex = new AtomicInteger();
+                            page.setItems(pageDTO.getItems().stream()
+                                    .map(itemDTO -> {
+                                        Item item = new Item();
+                                        item.setId(itemDTO.getId());
+                                        item.setFrontendId(itemDTO.getFrontendId());
+                                        item.setContent(itemDTO.getContent());
+                                        item.setNumber(itemIndex.getAndIncrement());
+                                        return item;
+                                    })
+                                    .collect(Collectors.toSet()));
+                            return page;
+                        }).collect(Collectors.toSet()));
+                return slide;
+            })
+            .build();
+
+    @SuppressWarnings("unchecked")
+    public <DTO, Entity> Entity convert(DTO dto) {
+        return (Entity) MAP.get(dto.getClass())
+                .convert(dto);
+    }
+}

+ 15 - 0
src/main/java/nju/seec/helper/logic/convert/DTOConverter.java

@@ -0,0 +1,15 @@
+package nju.seec.helper.logic.convert;
+
+/**
+ * @author cst
+ */
+@FunctionalInterface
+public interface DTOConverter<DTO, Entity> {
+    /**
+     * 将DTO转化为相应的Entity
+     *
+     * @param dto
+     * @return Entity
+     */
+    Entity convert(DTO dto);
+}

+ 71 - 0
src/main/java/nju/seec/helper/logic/convert/EntityConvertFactory.java

@@ -0,0 +1,71 @@
+package nju.seec.helper.logic.convert;
+
+import com.google.common.collect.ImmutableMap;
+import lombok.experimental.UtilityClass;
+import nju.seec.helper.data.entity.Item;
+import nju.seec.helper.data.entity.Page;
+import nju.seec.helper.data.entity.Quiz;
+import nju.seec.helper.data.entity.Slide;
+import nju.seec.helper.logic.vo.*;
+
+import java.util.Comparator;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * @author cst
+ */
+@UtilityClass
+public class EntityConvertFactory {
+    @SuppressWarnings("rawtypes")
+    private final static Map<Pair, EntityConverter> MAP = new ImmutableMap.Builder<Pair, EntityConverter>()
+            .put(Pair.of(Slide.class, SlideVO.class), (EntityConverter<Slide, SlideVO>) slide -> SlideVO.builder()
+                    .id(slide.getId())
+                    .courseId(slide.getCourseId())
+                    .frontendId(slide.getFrontendId())
+                    .name(slide.getName())
+                    .state(slide.getState())
+                    .createTime(slide.getCreateTime())
+                    .updateTime(slide.getUpdateTime())
+                    .pages(slide.getPages().stream()
+                            .sorted(Comparator.comparingInt(Page::getNumber))
+                            .map(page -> PageVO.builder()
+                                    .id(page.getId())
+                                    .frontendId(page.getFrontendId())
+                                    .items(page.getItems().stream()
+                                            .sorted(Comparator.comparingInt(Item::getNumber))
+                                            .map(item -> ItemVO.builder()
+                                                    .id(item.getId())
+                                                    .frontendId(item.getFrontendId())
+                                                    .content(item.getContent())
+                                                    .build())
+                                            .collect(Collectors.toList()))
+                                    .quizzes(page.getQuizzes().stream()
+                                            .sorted(Comparator.comparingInt(Quiz::getNumber))
+                                            .map(quiz -> QuizVO.builder()
+                                                    .id(quiz.getId())
+                                                    .systemId(quiz.getSystemId())
+                                                    .quizType(quiz.getType())
+                                                    .content(quiz.getContent())
+                                                    .build())
+                                            .collect(Collectors.toList()))
+                                    .build())
+                            .collect(Collectors.toList()))
+                    .build())
+            .put(Pair.of(Slide.class, SlideOutlineVO.class), (EntityConverter<Slide, SlideOutlineVO>) slide -> SlideOutlineVO.builder()
+                    .id(slide.getId())
+                    .courseId(slide.getCourseId())
+                    .frontendId(slide.getFrontendId())
+                    .name(slide.getName())
+                    .state(slide.getState())
+                    .createTime(slide.getCreateTime())
+                    .updateTime(slide.getUpdateTime())
+                    .build())
+            .build();
+
+    @SuppressWarnings("unchecked")
+    public <Entity, VO> VO convert(Entity entity, Class<VO> voClass) {
+        return (VO) MAP.get(Pair.of(entity.getClass(), voClass))
+                .convert(entity);
+    }
+}

+ 15 - 0
src/main/java/nju/seec/helper/logic/convert/EntityConverter.java

@@ -0,0 +1,15 @@
+package nju.seec.helper.logic.convert;
+
+/**
+ * @author cst
+ */
+@FunctionalInterface
+public interface EntityConverter<Entity, VO> {
+    /**
+     * 将Entity转化为相应的VO
+     *
+     * @param entity
+     * @return VO
+     */
+    VO convert(Entity entity);
+}

+ 14 - 0
src/main/java/nju/seec/helper/logic/convert/Pair.java

@@ -0,0 +1,14 @@
+package nju.seec.helper.logic.convert;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+/**
+ * @author cst
+ */
+@Data
+@AllArgsConstructor(staticName = "of")
+public class Pair<T1, T2> {
+    private T1 t1;
+    private T2 t2;
+}

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

@@ -0,0 +1,12 @@
+package nju.seec.helper.logic.vo;
+
+import lombok.Data;
+
+/**
+ * @author cst
+ */
+@Data
+public class CourseVO {
+    private String id;
+    private String name;
+}

+ 15 - 0
src/main/java/nju/seec/helper/logic/vo/ItemVO.java

@@ -0,0 +1,15 @@
+package nju.seec.helper.logic.vo;
+
+import lombok.Builder;
+import lombok.Data;
+
+/**
+ * @author cst
+ */
+@Data
+@Builder
+public class ItemVO {
+    private Integer id;
+    private String frontendId;
+    private String content;
+}

+ 16 - 0
src/main/java/nju/seec/helper/logic/vo/Page.java

@@ -0,0 +1,16 @@
+package nju.seec.helper.logic.vo;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @author cst
+ */
+@Data
+@AllArgsConstructor(staticName = "of")
+public class Page<VO> {
+    private List<VO> vos;
+    private PageInfo pager;
+}

+ 14 - 0
src/main/java/nju/seec/helper/logic/vo/PageInfo.java

@@ -0,0 +1,14 @@
+package nju.seec.helper.logic.vo;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+/**
+ * @author cst
+ */
+@Data
+@AllArgsConstructor(staticName = "of")
+public class PageInfo {
+    private int page;
+    private int size;
+}

+ 18 - 0
src/main/java/nju/seec/helper/logic/vo/PageVO.java

@@ -0,0 +1,18 @@
+package nju.seec.helper.logic.vo;
+
+import lombok.Builder;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @author cst
+ */
+@Data
+@Builder
+public class PageVO {
+    private Integer id;
+    private String frontendId;
+    private List<ItemVO> items;
+    private List<QuizVO> quizzes;
+}

+ 17 - 0
src/main/java/nju/seec/helper/logic/vo/QuizVO.java

@@ -0,0 +1,17 @@
+package nju.seec.helper.logic.vo;
+
+import lombok.Builder;
+import lombok.Data;
+import nju.seec.helper.util.enums.QuizType;
+
+/**
+ * @author cst
+ */
+@Data
+@Builder
+public class QuizVO {
+    private QuizType quizType;
+    private String systemId;
+    private Integer id;
+    private String content;
+}

+ 22 - 0
src/main/java/nju/seec/helper/logic/vo/SlideOutlineVO.java

@@ -0,0 +1,22 @@
+package nju.seec.helper.logic.vo;
+
+import lombok.Builder;
+import lombok.Data;
+import nju.seec.helper.util.enums.SlideState;
+
+import java.time.LocalDateTime;
+
+/**
+ * @author cst
+ */
+@Data
+@Builder
+public class SlideOutlineVO {
+    private Integer id;
+    private String courseId;
+    private String frontendId;
+    private SlideState state;
+    private String name;
+    private LocalDateTime createTime;
+    private LocalDateTime updateTime;
+}

+ 24 - 0
src/main/java/nju/seec/helper/logic/vo/SlideVO.java

@@ -0,0 +1,24 @@
+package nju.seec.helper.logic.vo;
+
+import lombok.Builder;
+import lombok.Data;
+import nju.seec.helper.util.enums.SlideState;
+
+import java.time.LocalDateTime;
+import java.util.List;
+
+/**
+ * @author cst
+ */
+@Data
+@Builder
+public class SlideVO {
+    private Integer id;
+    private String courseId;
+    private String frontendId;
+    private SlideState state;
+    private String name;
+    private List<PageVO> pages;
+    private LocalDateTime createTime;
+    private LocalDateTime updateTime;
+}

+ 7 - 0
src/main/java/nju/seec/helper/util/enums/QuizType.java

@@ -0,0 +1,7 @@
+package nju.seec.helper.util.enums;
+
+/**
+ * @author cst
+ */
+public enum QuizType {
+}

+ 9 - 0
src/main/java/nju/seec/helper/util/enums/SlideState.java

@@ -0,0 +1,9 @@
+package nju.seec.helper.util.enums;
+
+/**
+ * @author cst
+ */
+
+public enum SlideState {
+    DRAFT
+}

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

@@ -0,0 +1,18 @@
+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 pageId;
+    private Integer beforeCommentId;
+    @NotEmpty
+    private String content;
+}

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

@@ -0,0 +1,13 @@
+package nju.seec.helper.web.dto;
+
+import lombok.Data;
+
+/**
+ * @author cst
+ */
+@Data
+public class ItemDTO {
+    private String frontendId;
+    private Integer id;
+    private String content;
+}

+ 16 - 0
src/main/java/nju/seec/helper/web/dto/PageDTO.java

@@ -0,0 +1,16 @@
+package nju.seec.helper.web.dto;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @author cst
+ */
+@Data
+public class PageDTO {
+    private String frontendId;
+    private Integer id;
+    private List<QuizDTO> quizzes;
+    private List<ItemDTO> items;
+}

+ 15 - 0
src/main/java/nju/seec/helper/web/dto/QuizDTO.java

@@ -0,0 +1,15 @@
+package nju.seec.helper.web.dto;
+
+import lombok.Data;
+import nju.seec.helper.util.enums.QuizType;
+
+/**
+ * @author cst
+ */
+@Data
+public class QuizDTO {
+    private QuizType quizType;
+    private String systemId;
+    private Integer id;
+    private String content;
+}

+ 23 - 0
src/main/java/nju/seec/helper/web/dto/SlideDTO.java

@@ -0,0 +1,23 @@
+package nju.seec.helper.web.dto;
+
+import lombok.Data;
+import nju.seec.helper.util.enums.SlideState;
+
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import java.util.List;
+
+/**
+ * @author cst
+ */
+@Data
+public class SlideDTO {
+    @NotNull
+    private String courseId;
+    private String frontendId;
+    private Integer id;
+    @NotEmpty
+    private String name;
+    private SlideState state;
+    private List<PageDTO> pages;
+}

+ 26 - 0
src/main/resources/application-dev.yml

@@ -0,0 +1,26 @@
+spring:
+  jpa:
+    open-in-view: true
+    hibernate:
+      ddl-auto: update
+    database: h2
+    show-sql: true
+  datasource:
+    url: jdbc:h2:mem:seec_helper
+    driver-class-name: org.h2.Driver
+  h2:
+    console:
+      enabled: true
+      path: /h2
+  servlet:
+    multipart:
+      max-file-size: 100MB
+      max-request-size: 100MB
+server:
+  port: 18080
+file:
+  store-dir: file/
+logging:
+  file:
+    path: target/classes/static
+