课程管理

This commit is contained in:
none 2023-02-26 17:46:13 +08:00
parent 6b4d40d758
commit 3974f068e0
8 changed files with 357 additions and 0 deletions

View File

@ -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<CourseChapter> chapters = chapterService.getChaptersByCourseId(courseId);
return JsonResponse.data(chapters);
}
@GetMapping("/create")
public JsonResponse create(@PathVariable(name = "courseId") Integer courseId) {
List<CourseChapter> chapters = chapterService.getChaptersByCourseId(courseId);
HashMap<String, Object> 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();
}
}

View File

@ -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();
}
}

View File

@ -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;
}
}

View File

@ -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<CourseChapter> {
}

View File

@ -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;
}

View File

@ -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<CourseChapter> {
List<CourseChapter> 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;
}

View File

@ -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<CourseChapterMapper, CourseChapter>
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<CourseChapter> 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;
}
}

View File

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="xyz.playedu.api.mapper.CourseChapterMapper">
<resultMap id="BaseResultMap" type="xyz.playedu.api.domain.CourseChapter">
<id property="id" column="id" jdbcType="INTEGER"/>
<result property="courseId" column="course_id" jdbcType="INTEGER"/>
<result property="name" column="name" jdbcType="VARCHAR"/>
<result property="sort" column="sort" jdbcType="INTEGER"/>
<result property="createdAt" column="created_at" jdbcType="TIMESTAMP"/>
<result property="updatedAt" column="updated_at" jdbcType="TIMESTAMP"/>
</resultMap>
<sql id="Base_Column_List">
id,course_id,name,
sort,created_at,updated_at
</sql>
</mapper>