From 3974f068e0d184a75cd3381a7499083b7d7bd752 Mon Sep 17 00:00:00 2001 From: none Date: Sun, 26 Feb 2023 17:46:13 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AF=BE=E7=A8=8B=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../backend/CourseChapterController.java | 73 +++++++++++++ .../xyz/playedu/api/domain/CourseChapter.java | 101 ++++++++++++++++++ .../api/event/CourseChapterDestroyEvent.java | 26 +++++ .../api/mapper/CourseChapterMapper.java | 20 ++++ .../request/backend/CourseChapterRequest.java | 23 ++++ .../api/service/CourseChapterService.java | 26 +++++ .../impl/CourseChapterServiceImpl.java | 68 ++++++++++++ .../resources/mapper/CourseChapterMapper.xml | 20 ++++ 8 files changed, 357 insertions(+) create mode 100644 src/main/java/xyz/playedu/api/controller/backend/CourseChapterController.java create mode 100644 src/main/java/xyz/playedu/api/domain/CourseChapter.java create mode 100644 src/main/java/xyz/playedu/api/event/CourseChapterDestroyEvent.java create mode 100644 src/main/java/xyz/playedu/api/mapper/CourseChapterMapper.java create mode 100644 src/main/java/xyz/playedu/api/request/backend/CourseChapterRequest.java create mode 100644 src/main/java/xyz/playedu/api/service/CourseChapterService.java create mode 100644 src/main/java/xyz/playedu/api/service/impl/CourseChapterServiceImpl.java create mode 100644 src/main/resources/mapper/CourseChapterMapper.xml diff --git a/src/main/java/xyz/playedu/api/controller/backend/CourseChapterController.java b/src/main/java/xyz/playedu/api/controller/backend/CourseChapterController.java new file mode 100644 index 0000000..3ab5f0d --- /dev/null +++ b/src/main/java/xyz/playedu/api/controller/backend/CourseChapterController.java @@ -0,0 +1,73 @@ +package xyz.playedu.api.controller.backend; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationContext; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import xyz.playedu.api.PlayEduBackendThreadLocal; +import xyz.playedu.api.domain.CourseChapter; +import xyz.playedu.api.event.CourseChapterDestroyEvent; +import xyz.playedu.api.exception.NotFoundException; +import xyz.playedu.api.request.backend.CourseChapterRequest; +import xyz.playedu.api.service.CourseChapterService; +import xyz.playedu.api.types.JsonResponse; + +import java.util.Date; +import java.util.HashMap; +import java.util.List; + +/** + * @Author 杭州白书科技有限公司 + * @create 2023/2/26 17:28 + */ +@RestController +@RequestMapping("/backend/v1/course/{courseId}/chapter") +public class CourseChapterController { + + @Autowired + private CourseChapterService chapterService; + + @Autowired + private ApplicationContext ctx; + + @GetMapping("/index") + public JsonResponse index(@PathVariable(name = "courseId") Integer courseId) { + List chapters = chapterService.getChaptersByCourseId(courseId); + return JsonResponse.data(chapters); + } + + @GetMapping("/create") + public JsonResponse create(@PathVariable(name = "courseId") Integer courseId) { + List chapters = chapterService.getChaptersByCourseId(courseId); + HashMap data = new HashMap<>(); + data.put("chapters", chapters); + return JsonResponse.data(data); + } + + @PostMapping("/create") + public JsonResponse store(@PathVariable(name = "courseId") Integer courseId, @RequestBody @Validated CourseChapterRequest req) { + chapterService.create(courseId, req.getName(), req.getSort()); + return JsonResponse.success(); + } + + @GetMapping("/{id}") + public JsonResponse edit(@PathVariable(name = "courseId") Integer courseId, @PathVariable(name = "id") Integer id) throws NotFoundException { + CourseChapter chapter = chapterService.findOrFail(id, courseId); + return JsonResponse.data(chapter); + } + + @PutMapping("/{id}") + public JsonResponse update(@PathVariable(name = "courseId") Integer courseId, @PathVariable(name = "id") Integer id, @RequestBody @Validated CourseChapterRequest req) throws NotFoundException { + CourseChapter chapter = chapterService.findOrFail(id, courseId); + chapterService.update(chapter, req.getName(), req.getSort()); + return JsonResponse.data(chapter); + } + + @DeleteMapping("/{id}") + public JsonResponse destroy(@PathVariable(name = "courseId") Integer courseId, @PathVariable(name = "id") Integer id) throws NotFoundException { + CourseChapter chapter = chapterService.findOrFail(id, courseId); + chapterService.removeById(chapter.getId()); + ctx.publishEvent(new CourseChapterDestroyEvent(this, PlayEduBackendThreadLocal.getAdminUserID(), chapter.getCourseId(), new Date())); + return JsonResponse.success(); + } +} diff --git a/src/main/java/xyz/playedu/api/domain/CourseChapter.java b/src/main/java/xyz/playedu/api/domain/CourseChapter.java new file mode 100644 index 0000000..0fc6217 --- /dev/null +++ b/src/main/java/xyz/playedu/api/domain/CourseChapter.java @@ -0,0 +1,101 @@ +package xyz.playedu.api.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.util.Date; +import lombok.Data; + +/** + * + * @TableName course_chapters + */ +@TableName(value ="course_chapters") +@Data +public class CourseChapter implements Serializable { + /** + * + */ + @TableId(type = IdType.AUTO) + private Integer id; + + /** + * 课程ID + */ + private Integer courseId; + + /** + * 章节名 + */ + private String name; + + /** + * 升序 + */ + private Integer sort; + + /** + * + */ + private Date createdAt; + + /** + * + */ + private Date updatedAt; + + @TableField(exist = false) + private static final long serialVersionUID = 1L; + + @Override + public boolean equals(Object that) { + if (this == that) { + return true; + } + if (that == null) { + return false; + } + if (getClass() != that.getClass()) { + return false; + } + CourseChapter other = (CourseChapter) that; + return (this.getId() == null ? other.getId() == null : this.getId().equals(other.getId())) + && (this.getCourseId() == null ? other.getCourseId() == null : this.getCourseId().equals(other.getCourseId())) + && (this.getName() == null ? other.getName() == null : this.getName().equals(other.getName())) + && (this.getSort() == null ? other.getSort() == null : this.getSort().equals(other.getSort())) + && (this.getCreatedAt() == null ? other.getCreatedAt() == null : this.getCreatedAt().equals(other.getCreatedAt())) + && (this.getUpdatedAt() == null ? other.getUpdatedAt() == null : this.getUpdatedAt().equals(other.getUpdatedAt())); + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((getId() == null) ? 0 : getId().hashCode()); + result = prime * result + ((getCourseId() == null) ? 0 : getCourseId().hashCode()); + result = prime * result + ((getName() == null) ? 0 : getName().hashCode()); + result = prime * result + ((getSort() == null) ? 0 : getSort().hashCode()); + result = prime * result + ((getCreatedAt() == null) ? 0 : getCreatedAt().hashCode()); + result = prime * result + ((getUpdatedAt() == null) ? 0 : getUpdatedAt().hashCode()); + return result; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append(getClass().getSimpleName()); + sb.append(" ["); + sb.append("Hash = ").append(hashCode()); + sb.append(", id=").append(id); + sb.append(", courseId=").append(courseId); + sb.append(", name=").append(name); + sb.append(", sort=").append(sort); + sb.append(", createdAt=").append(createdAt); + sb.append(", updatedAt=").append(updatedAt); + sb.append(", serialVersionUID=").append(serialVersionUID); + sb.append("]"); + return sb.toString(); + } +} \ No newline at end of file diff --git a/src/main/java/xyz/playedu/api/event/CourseChapterDestroyEvent.java b/src/main/java/xyz/playedu/api/event/CourseChapterDestroyEvent.java new file mode 100644 index 0000000..40f54cc --- /dev/null +++ b/src/main/java/xyz/playedu/api/event/CourseChapterDestroyEvent.java @@ -0,0 +1,26 @@ +package xyz.playedu.api.event; + +import lombok.Getter; +import lombok.Setter; +import org.springframework.context.ApplicationEvent; + +import java.util.Date; + +/** + * @Author 杭州白书科技有限公司 + * @create 2023/2/26 17:42 + */ +@Getter +@Setter +public class CourseChapterDestroyEvent extends ApplicationEvent { + private Integer adminId; + private Integer chapterId; + private Date date; + + public CourseChapterDestroyEvent(Object source, Integer adminId, Integer chapterId, Date date) { + super(source); + this.adminId = adminId; + this.chapterId = chapterId; + this.date = date; + } +} diff --git a/src/main/java/xyz/playedu/api/mapper/CourseChapterMapper.java b/src/main/java/xyz/playedu/api/mapper/CourseChapterMapper.java new file mode 100644 index 0000000..9c4af7b --- /dev/null +++ b/src/main/java/xyz/playedu/api/mapper/CourseChapterMapper.java @@ -0,0 +1,20 @@ +package xyz.playedu.api.mapper; + +import org.apache.ibatis.annotations.Mapper; +import xyz.playedu.api.domain.CourseChapter; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** +* @author tengteng +* @description 针对表【course_chapters】的数据库操作Mapper +* @createDate 2023-02-26 17:34:01 +* @Entity xyz.playedu.api.domain.CourseChapter +*/ +@Mapper +public interface CourseChapterMapper extends BaseMapper { + +} + + + + diff --git a/src/main/java/xyz/playedu/api/request/backend/CourseChapterRequest.java b/src/main/java/xyz/playedu/api/request/backend/CourseChapterRequest.java new file mode 100644 index 0000000..5bf7be8 --- /dev/null +++ b/src/main/java/xyz/playedu/api/request/backend/CourseChapterRequest.java @@ -0,0 +1,23 @@ +package xyz.playedu.api.request.backend; + +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +/** + * @Author 杭州白书科技有限公司 + * @create 2023/2/26 17:36 + */ +@Data +public class CourseChapterRequest { + + @NotBlank(message = "请输入章节名") + @NotNull(message = "name参数不存在") + @Length(min = 1, max = 64, message = "章节名长度在1-64个字符之间") + private String name; + + @NotNull(message = "sort参数不存在") + private Integer sort; + +} diff --git a/src/main/java/xyz/playedu/api/service/CourseChapterService.java b/src/main/java/xyz/playedu/api/service/CourseChapterService.java new file mode 100644 index 0000000..2c129eb --- /dev/null +++ b/src/main/java/xyz/playedu/api/service/CourseChapterService.java @@ -0,0 +1,26 @@ +package xyz.playedu.api.service; + +import xyz.playedu.api.domain.CourseChapter; +import com.baomidou.mybatisplus.extension.service.IService; +import xyz.playedu.api.exception.NotFoundException; + +import java.util.List; + +/** + * @author tengteng + * @description 针对表【course_chapters】的数据库操作Service + * @createDate 2023-02-26 17:30:19 + */ +public interface CourseChapterService extends IService { + + List getChaptersByCourseId(Integer courseId); + + void create(Integer courseId, String name, Integer sort); + + void update(CourseChapter chapter, String name, Integer sort); + + CourseChapter findOrFail(Integer id) throws NotFoundException; + + CourseChapter findOrFail(Integer id, Integer courseId) throws NotFoundException; + +} diff --git a/src/main/java/xyz/playedu/api/service/impl/CourseChapterServiceImpl.java b/src/main/java/xyz/playedu/api/service/impl/CourseChapterServiceImpl.java new file mode 100644 index 0000000..e4651c5 --- /dev/null +++ b/src/main/java/xyz/playedu/api/service/impl/CourseChapterServiceImpl.java @@ -0,0 +1,68 @@ +package xyz.playedu.api.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import xyz.playedu.api.domain.CourseChapter; +import xyz.playedu.api.exception.NotFoundException; +import xyz.playedu.api.service.CourseChapterService; +import xyz.playedu.api.mapper.CourseChapterMapper; +import org.springframework.stereotype.Service; + +import java.util.Date; +import java.util.List; + +/** + * @author tengteng + * @description 针对表【course_chapters】的数据库操作Service实现 + * @createDate 2023-02-26 17:30:18 + */ +@Service +public class CourseChapterServiceImpl extends ServiceImpl + implements CourseChapterService { + + @Override + public void create(Integer courseId, String name, Integer sort) { + CourseChapter chapter = new CourseChapter(); + chapter.setCourseId(courseId); + chapter.setName(name); + chapter.setSort(sort); + chapter.setCreatedAt(new Date()); + chapter.setUpdatedAt(new Date()); + save(chapter); + } + + @Override + public void update(CourseChapter chapter, String name, Integer sort) { + CourseChapter newChapter = new CourseChapter(); + newChapter.setId(chapter.getId()); + newChapter.setName(name); + newChapter.setSort(sort); + updateById(newChapter); + } + + @Override + public CourseChapter findOrFail(Integer id) throws NotFoundException { + CourseChapter chapter = getOne(query().getWrapper().eq("id", id)); + if (chapter == null) { + throw new NotFoundException("章节不存在"); + } + return chapter; + } + + @Override + public List getChaptersByCourseId(Integer courseId) { + return list(query().getWrapper().eq("course_id", courseId).orderByAsc("sort")); + } + + @Override + public CourseChapter findOrFail(Integer id, Integer courseId) throws NotFoundException { + CourseChapter chapter = getOne(query().getWrapper().eq("id", id).eq("course_id", courseId)); + if (chapter == null) { + throw new NotFoundException("章节不存在"); + } + return chapter; + } +} + + + + diff --git a/src/main/resources/mapper/CourseChapterMapper.xml b/src/main/resources/mapper/CourseChapterMapper.xml new file mode 100644 index 0000000..b3a5b24 --- /dev/null +++ b/src/main/resources/mapper/CourseChapterMapper.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + id,course_id,name, + sort,created_at,updated_at + +