Przeglądaj źródła

feat: 增加幻灯片编辑器相关功能

ChenSiTong 6 lat temu
rodzic
commit
b64d3830b7

+ 22 - 0
src/main/java/nju/seec/helper/data/dao/SlideDAO.java

@@ -0,0 +1,22 @@
+package nju.seec.helper.data.dao;
+
+import nju.seec.helper.data.entity.Slide;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+/**
+ * @author cst
+ */
+@Repository
+public interface SlideDAO extends JpaRepository<Slide, Integer> {
+    /**
+     * 以幻灯片名作为关键字分页查询
+     *
+     * @param key
+     * @param pageable
+     * @return
+     */
+    Page<Slide> findByNameContains(String key, Pageable pageable);
+}

+ 53 - 0
src/main/java/nju/seec/helper/logic/service/SlideService.java

@@ -0,0 +1,53 @@
+package nju.seec.helper.logic.service;
+
+import nju.seec.helper.logic.vo.Page;
+import nju.seec.helper.logic.vo.SlideOutlineVO;
+import nju.seec.helper.logic.vo.SlideVO;
+import nju.seec.helper.web.dto.SlideDTO;
+import org.springframework.cache.annotation.Cacheable;
+
+/**
+ * @author cst
+ */
+public interface SlideService {
+    /**
+     * 根据课程id,分页取得幻灯片概要列表
+     *
+     * @param courseId
+     * @param page
+     * @param size
+     * @param key
+     * @return
+     */
+    @Cacheable()
+    Page<SlideOutlineVO> getSlides(String courseId, int page, int size, String key);
+
+    /**
+     * 根据id取得幻灯片
+     *
+     * @param slideId
+     * @return
+     */
+    SlideVO getOneSlide(int slideId);
+
+    /**
+     * 创建新的幻灯片
+     *
+     * @param slideDTO
+     * @return
+     */
+    SlideVO create(SlideDTO slideDTO);
+
+    /**
+     * 更新幻灯片
+     *
+     * @param slideDTO
+     * @return
+     */
+    SlideVO update(SlideDTO slideDTO);
+
+//    /**
+//     * 仅更新幻灯片状态
+//     */
+//    SlideVO updateState(int slideId, SlideState state);
+}

+ 79 - 0
src/main/java/nju/seec/helper/logic/service/impl/SlideServiceImpl.java

@@ -0,0 +1,79 @@
+package nju.seec.helper.logic.service.impl;
+
+import nju.seec.helper.data.dao.SlideDAO;
+import nju.seec.helper.data.entity.Slide;
+import nju.seec.helper.logic.convert.DTOConvertFactory;
+import nju.seec.helper.logic.convert.EntityConvertFactory;
+import nju.seec.helper.logic.service.SlideService;
+import nju.seec.helper.logic.vo.Page;
+import nju.seec.helper.logic.vo.PageInfo;
+import nju.seec.helper.logic.vo.SlideOutlineVO;
+import nju.seec.helper.logic.vo.SlideVO;
+import nju.seec.helper.util.enums.SlideState;
+import nju.seec.helper.util.exception.HelperException;
+import nju.seec.helper.web.dto.SlideDTO;
+import org.springframework.cache.annotation.CacheConfig;
+import org.springframework.cache.annotation.CachePut;
+import org.springframework.cache.annotation.Cacheable;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * @author cst
+ */
+@Service
+@CacheConfig(cacheNames = "slide")
+public class SlideServiceImpl implements SlideService {
+    private final SlideDAO slideDAO;
+
+    public SlideServiceImpl(SlideDAO slideDAO) {
+        this.slideDAO = slideDAO;
+    }
+
+    @Override
+    public Page<SlideOutlineVO> getSlides(String courseId, int page, int size, String key) {
+        org.springframework.data.domain.Page<Slide> slidePage = slideDAO.findByNameContains(key, PageRequest.of(page - 1, size));
+
+        List<SlideOutlineVO> slideOutlineVOs = slidePage.getContent().stream()
+                .map(slide -> EntityConvertFactory.convert(slide, SlideOutlineVO.class))
+                .collect(Collectors.toList());
+
+        PageInfo pageInfo = PageInfo.of(slidePage.getNumber() + 1, slidePage.getNumberOfElements());
+
+        return Page.of(slideOutlineVOs, pageInfo);
+    }
+
+    @Cacheable(key = "#slideId")
+    @Override
+    public SlideVO getOneSlide(int slideId) {
+        Slide slide = findSlideById(slideId);
+        return EntityConvertFactory.convert(slide, SlideVO.class);
+    }
+
+    @Override
+    public SlideVO create(SlideDTO slideDTO) {
+        Slide slide = new Slide();
+        slide.setCourseId(slideDTO.getCourseId());
+        slide.setName(slideDTO.getName());
+        slide.setState(SlideState.DRAFT);
+        slide = slideDAO.save(slide);
+        return EntityConvertFactory.convert(slide, SlideVO.class);
+    }
+
+    @CachePut(key = "#slideDTO.id")
+    @Override
+    public SlideVO update(SlideDTO slideDTO) {
+        Slide slide = DTOConvertFactory.convert(slideDTO);
+        slideDAO.save(slide);
+        return getOneSlide(slideDTO.getId());
+    }
+
+    private Slide findSlideById(int slideId) {
+        return slideDAO.findById(slideId).orElseThrow(() -> HelperException.of(
+                HelperException.ExceptionType.NOT_FOUND, "找不到幻灯片")
+        );
+    }
+}

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

@@ -0,0 +1,70 @@
+package nju.seec.helper.web.controller;
+
+import lombok.NonNull;
+import nju.seec.helper.logic.service.SlideService;
+import nju.seec.helper.logic.vo.Page;
+import nju.seec.helper.logic.vo.SlideOutlineVO;
+import nju.seec.helper.logic.vo.SlideVO;
+import nju.seec.helper.util.enums.SlideState;
+import nju.seec.helper.web.dto.SlideDTO;
+import nju.seec.helper.web.response.EmptyResponse;
+import nju.seec.helper.web.response.PageResourceResponse;
+import nju.seec.helper.web.response.ResourceResponse;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * @author cst
+ */
+@RestController
+@RequestMapping("/api/slide")
+public class SlideController {
+    private final SlideService slideService;
+
+    public SlideController(SlideService slideService) {
+        this.slideService = slideService;
+    }
+
+    @GetMapping("/course/{courseId:\\d+}")
+    public PageResourceResponse<SlideOutlineVO> getSlides(@PathVariable String courseId,
+                                                          @RequestParam(defaultValue = "1") int page,
+                                                          @RequestParam(defaultValue = Integer.MAX_VALUE + "") int size,
+                                                          @RequestParam(defaultValue = "") String key) {
+        Page<SlideOutlineVO> slideOutlineVOPage = slideService.getSlides(courseId, page, size, key);
+        return PageResourceResponse.of(slideOutlineVOPage.getVos(), slideOutlineVOPage.getPager());
+    }
+
+    /**
+     * 迭代一只考虑返回给老师的结果
+     *
+     * @param slideId
+     * @return
+     */
+    @GetMapping("/{slideId:\\d+}")
+    public ResourceResponse<SlideVO> getSlide(@PathVariable int slideId) {
+        return ResourceResponse.of(slideService.getOneSlide(slideId));
+    }
+
+    @PostMapping("/create")
+    public ResourceResponse<SlideVO> create(@RequestBody @Validated SlideDTO slideDTO) {
+        return ResourceResponse.of(slideService.create(slideDTO));
+    }
+
+    @PostMapping("/update")
+    public EmptyResponse update(@RequestBody @Validated SlideDTO slideDTO) {
+        slideService.update(slideDTO);
+        return EmptyResponse.getInstance();
+    }
+
+//    @PostMapping("/{slideId:\\d+}/updateState")
+//    public EmptyResponse updateState(@PathVariable int slideId, @NonNull SlideState slideState) {
+//        slideService.updateState(slideId, slideState);
+//        return EmptyResponse.getInstance();
+//    }
+
+
+//    @PostMapping("/{slideId:\\d+}/quiz/create")
+//    public EmptyResponse createQuiz(@PathVariable int slideId, @RequestBody Quiz quiz) {
+//        return null;
+//    }
+}