@[TOC]《每天一个小项目》第一章 课程管理
《每天一个小项目》第一章 课程管理
今天是2021.03.16 从今天开始开启 《每天一个小项目》 计划 每天变强一点点 但愿不要变秃 但不一定每天都能更 估计也没几个人看 那我就开始冲冲冲了!!!!!
主题: 课程管理
各位可能已经听够了各种各样的管理了 但是没法儿啊 谁能逃过增删改查呢???
- 课程发布 (附效果图)
1.1 基本信息
1.2 大纲管理
1.3 提交审核
必备环节 :小敲一下
项目前后端分离 软件后端万年不变 IDER ,前端 VsCode
用的技术 :
- 后端 :SpringBoot, JWT, SpringCloud, Maven,RabbitMQ
数据库不多说了Myspl - 前端:Vue ,Es6 , ElementUi ,ajax
下面附上 代码
数据库
# 课程章节表
CREATE TABLE `edu_chapter` (
`id` VARCHAR(32) PRIMARY KEY COMMENT '章节ID',
`course_id` VARCHAR(32) COMMENT '课程ID',
`title` VARCHAR(50) COMMENT '章节名称',
`sort` INT(10) DEFAULT 0 COMMENT '显示排序',
`gmt_create` DATETIME COMMENT '创建时间',
`gmt_modified` DATETIME COMMENT '更新时间'
)COMMENT = '课程章节';
INSERT INTO `edu_chapter` VALUES ('1', '14', '第一章:HTML', 1, '2020-01-01 12:27:40', '2020-01-01 12:55:30');
INSERT INTO `edu_chapter` VALUES ('15', '18', '第一章:Java入门', 1, '2020-01-01 12:27:40', '2020-01-01 12:27:40');
INSERT INTO `edu_chapter` VALUES ('3', '14', '第二章:CSS', 2, '2020-01-01 12:55:35', '2020-01-01 12:27:40');
INSERT INTO `edu_chapter` VALUES ('32', '18', '第二章:控制台输入和输出', 2, '2020-01-01 12:27:40', '2020-01-01 12:27:40');
INSERT INTO `edu_chapter` VALUES ('44', '18', '第三章:控制流', 3, '2020-01-01 12:27:40', '2020-01-01 12:27:40');
INSERT INTO `edu_chapter` VALUES ('48', '18', '第四章:类的定义', 4, '2020-01-01 12:27:40', '2020-01-01 12:27:40');
INSERT INTO `edu_chapter` VALUES ('63', '18', '第五章:数组', 5, '2020-01-01 12:27:40', '2020-01-01 12:27:40');
INSERT INTO `edu_chapter` VALUES ('64', '18', '第六章:继承', 6, '2020-01-01 12:27:40', '2020-01-01 12:27:40');
INSERT INTO `edu_chapter` VALUES ('65', '18', '第七章:多态性和抽象类', 7, '2020-01-01 12:27:40', '2020-01-01 12:27:40');
#课程表
CREATE TABLE `edu_course` (
`id` VARCHAR(32) PRIMARY KEY COMMENT '课程ID',
`teacher_id` INT(19) COMMENT '课程讲师ID',
`subject_id` VARCHAR(32) COMMENT '课程专业ID二级分类ID',
`subject_parent_id` VARCHAR(32) COMMENT '一级分类ID',
`title` VARCHAR(50) COMMENT '课程标题',
`price` DECIMAL(10, 4) DEFAULT 0.0000 COMMENT '课程销售价格,设置为0则可免费观看',
`lesson_num` INT(10) DEFAULT 0 COMMENT '总课时',
`cover` VARCHAR(255) COMMENT '课程封面图片路径',
`buy_count` BIGINT(10) DEFAULT 0 COMMENT '销售数量',
`view_count` BIGINT(10) DEFAULT 0 COMMENT '浏览数量',
`version` BIGINT(20) DEFAULT 1 COMMENT '乐观锁',
`status` VARCHAR(10) DEFAULT 'Draft' COMMENT '视频状态 Draft未发布 Normal已发布',
`gmt_create` DATETIME COMMENT '创建时间',
`gmt_modified` DATETIME COMMENT '更新时间'
)COMMENT = '课程';
INSERT INTO `edu_course` VALUES ('10', 1, '221', NULL, '零基础入门学习Python课程学习', 1.0000, 10, '', 80, 165, 21, 'Draft', '2020-03-26 00:00:28', '2020-02-21 20:46:36');
INSERT INTO `edu_course` VALUES ('1282276374928773122', 1, '401', '4', '测试003', 10.0000, 100, '', 0, 0, 1, 'Draft', '2020-07-12 19:31:25', '2020-07-12 19:46:44');
INSERT INTO `edu_course` VALUES ('1282620880706351106', 1, '', '', '', 0.0000, 0, '', 0, 0, 1, 'Draft', '2020-07-13 18:20:22', '2020-07-13 18:20:22');
INSERT INTO `edu_course` VALUES ('14', 1, '221', NULL, 'XHTML CSS2 JS整站制作教程课程学习', 0.0000, 3, '', 3, 29, 15, 'Draft', '2020-04-02 18:33:34', '2020-02-21 20:46:36');
INSERT INTO `edu_course` VALUES ('15', 1, '251', NULL, 'HTML5入门课程学习', 0.0000, 23, '', 0, 39, 17, 'Draft', '2020-04-02 18:34:32', '2020-02-21 20:46:37');
INSERT INTO `edu_course` VALUES ('17', 2, '223', NULL, 'MySql从入门到精通', 0.0000, 100, '', 34, 130, 4, 'Draft', '2020-04-02 21:13:58', '2020-02-21 20:46:38');
INSERT INTO `edu_course` VALUES ('18', 2, '202', NULL, 'Java精品课程', 0.0000, 20, '', 150, 522, 6, 'Draft', '2020-04-02 21:28:46', '2020-02-21 20:46:39');
INSERT INTO `edu_course` VALUES ('21', 3, '221', NULL, '搜索引擎优化技术', 0.0000, 23, '', 23, 123, 1, 'Draft', '2020-09-15 11:38:57', '2020-02-21 20:46:40');
INSERT INTO `edu_course` VALUES ('22', 3, '223', NULL, '影响力摄影小课堂', 0.0000, 0, '', 0, 2, 3, 'Draft', '2020-11-02 10:49:41', '2020-02-21 20:46:40');
INSERT INTO `edu_course` VALUES ('24', 3, '223', NULL, '国家教师资格考试', 0.0000, 12, '', 324, 25, 3, 'Draft', '2020-11-04 09:48:44', '2020-02-21 20:46:41');
INSERT INTO `edu_course` VALUES ('25', 3, '223', NULL, '听力口语训练营', 0.0000, 0, '', 0, 13, 14, 'Draft', '2020-02-26 19:23:48', '2020-02-21 20:46:42');
INSERT INTO `edu_course` VALUES ('26', 4, '223', NULL, 'CAD4零基础教学', 0.0000, 0, '', 0, 34, 35, 'Draft', '2020-02-26 19:24:44', '2020-02-21 20:46:43');
#课程简介
CREATE TABLE `edu_course_description` (
`id` VARCHAR(32) PRIMARY KEY COMMENT '课程ID',
`description` MEDIUMTEXT COMMENT '课程简介',
`gmt_create` DATETIME COMMENT '创建时间',
`gmt_modified` DATETIME COMMENT '更新时间'
) COMMENT = '课程简介';
INSERT INTO `edu_course_description` VALUES ('1282276374928773122', '<p>好课程--传智造</p>', '2020-07-12 19:31:25', '2020-07-12 19:46:44');
INSERT INTO `edu_course_description` VALUES ('1282620880706351106', '', '2020-07-13 18:20:22', '2020-07-13 18:20:22');
#课程视频
CREATE TABLE `edu_video` (
`id` VARCHAR(32) PRIMARY KEY COMMENT '视频ID',
`course_id` VARCHAR(32) COMMENT '课程ID',
`chapter_id` VARCHAR(32) COMMENT '章节ID',
`title` VARCHAR(50) COMMENT '节点名称',
`sort` INT(10) DEFAULT 0 COMMENT '排序字段',
`play_count` BIGINT(20) DEFAULT 0 COMMENT '播放次数',
`is_free` TINYINT(1) DEFAULT 0 COMMENT '是否可以试听:0免费 1收费',
`video_source_id` VARCHAR(100) COMMENT '视频资源',
`video_original_name` VARCHAR(50) COMMENT '视频原始文件名字',
`duration` FLOAT NOT NULL DEFAULT 0 COMMENT '视频时长(秒)',
`status` VARCHAR(20) DEFAULT '' COMMENT '视频状态:见阿里云文档',
`size` BIGINT(20) DEFAULT 0 COMMENT '视频源文件大小(字节)',
`version` BIGINT(20) NOT NULL DEFAULT 1 COMMENT '乐观锁',
`gmt_create` DATETIME NOT NULL COMMENT '创建时间',
`gmt_modified` DATETIME NOT NULL COMMENT '更新时间'
)COMMENT = '课程视频';
INSERT INTO `edu_video` VALUES ('17', '18', '15', '第一节:Java简介', 1, 1000, 1, '', 100, 'Draft', 0, 1, '2020-01-01 13:08:57', '2020-02-21 20:46:08');
INSERT INTO `edu_video` VALUES ('18', '18', '15', '第二节:表达式和赋值语句', 2, 999, 1, '', 100, 'Draft', 0, 1, '2020-01-01 13:09:02', '2020-02-21 20:46:09');
INSERT INTO `edu_video` VALUES ('19', '18', '15', '第三节:String类', 3, 888, 0, '', 100, 'Draft', 0, 1, '2020-01-01 13:09:05', '2020-02-21 20:46:10');
INSERT INTO `edu_video` VALUES ('20', '18', '15', '第四节:程序风格', 4, 666, 0, '', 100, 'Draft', 0, 1, '2020-01-01 13:09:05', '2020-02-21 20:46:10');
搭建后端 domain
•EduVideo
package com.czxy.zx.domain;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
* 课程视频
*
*/
@Data
@ApiModel(value="EduVideo对象", description="课程视频")
public class EduVideo {
@ApiModelProperty(value = "视频ID")
@TableId(value = "id", type = IdType.ASSIGN_UUID)
private String id;
@ApiModelProperty(value = "课程ID")
private String courseId;
@ApiModelProperty(value = "章节ID")
private String chapterId;
@ApiModelProperty(value = "节点名称")
private String title;
@ApiModelProperty(value = "排序字段")
private Integer sort;
@ApiModelProperty(value = "播放次数")
private Long playCount;
@ApiModelProperty(value = "是否可以试听:0免费 1收费")
private Integer isFree;
@ApiModelProperty(value = "视频资源")
private String videoSourceId;
@ApiModelProperty(value = "视频原始文件名字")
private String videoOriginalName;
@ApiModelProperty(value = "视频时长(秒)")
private Float duration;
@ApiModelProperty(value = "视频状态:见阿里云文档")
private String status;
@ApiModelProperty(value = "视频源文件大小(字节)")
private Long size;
@ApiModelProperty(value = "乐观锁")
private Long version;
@ApiModelProperty(value = "创建时间")
@TableField(value = "gmt_create",fill = FieldFill.INSERT)
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
private Date gmtCreate;
@ApiModelProperty(value = "更新时间")
@TableField(value = "gmt_modified",fill = FieldFill.INSERT_UPDATE)
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
private Date gmtModified;
}
•EduChapter
package com.czxy.zx.domain;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
* 课程
*
*/
@Data
@ApiModel(value="EduChapter对象", description="课程")
public class EduChapter {
@ApiModelProperty(value = "章节ID")
@TableId(value = "id", type = IdType.ASSIGN_UUID)
private String id;
@ApiModelProperty(value = "课程ID")
private String courseId;
@ApiModelProperty(value = "章节名称")
private String title;
@ApiModelProperty(value = "显示排序")
private Integer sort;
@ApiModelProperty(value = "创建时间")
@TableField(fill = FieldFill.INSERT, value = "gmt_create")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
private Date gmtCreate;
@ApiModelProperty(value = "更新时间")
@TableField(fill = FieldFill.INSERT_UPDATE, value = "gmt_modified")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
private Date gmtModified;
}
•EduCourse
package com.czxy.zx.domain;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
/**
* 课程
*
*/
@Data
@ApiModel(value="EduCourse对象", description="课程")
public class EduCourse {
@ApiModelProperty(value = "课程ID")
@TableId(value = "id", type = IdType.ASSIGN_UUID)
private String id;
@ApiModelProperty(value = "课程讲师ID")
private String teacherId;
@ApiModelProperty(value = "课程专业ID二级分类ID")
private String subjectId;
@ApiModelProperty(value = "一级分类ID")
private String subjectParentId;
@ApiModelProperty(value = "课程标题")
private String title;
@ApiModelProperty(value = "课程销售价格,设置为0则可免费观看")
private BigDecimal price;
@ApiModelProperty(value = "总课时")
private Integer lessonNum;
@ApiModelProperty(value = "课程封面图片路径")
private String cover;
@ApiModelProperty(value = "销售数量")
private Long buyCount;
@ApiModelProperty(value = "浏览数量")
private Long viewCount;
@ApiModelProperty(value = "乐观锁")
private Long version;
@ApiModelProperty(value = "视频状态 Draft未发布 Normal已发布")
private String status;
@ApiModelProperty(value = "创建时间")
@TableField(fill = FieldFill.INSERT, value = "gmt_create")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
private Date gmtCreate;
@ApiModelProperty(value = "更新时间")
@TableField(fill = FieldFill.INSERT_UPDATE, value = "gmt_modified")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
private Date gmtModified;
}
•EduCourseDescription
package com.czxy.zx.domain;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
* 课程简介
*
*/
@Data
@ApiModel(value="EduCourseDescription对象", description="课程简介")
public class EduCourseDescription {
@ApiModelProperty(value = "课程ID")
//将CourseDescription和Course的ID保持一致
@TableId(value = "id", type = IdType.INPUT)
private String id;
@ApiModelProperty(value = "课程简介")
private String description;
@ApiModelProperty(value = "创建时间")
@TableField(fill = FieldFill.INSERT, value = "gmt_create")
private Date gmtCreate;
@ApiModelProperty(value = "更新时间")
@TableField(fill = FieldFill.INSERT_UPDATE, value = "gmt_modified")
private Date gmtModified;
}
后端 mapper 接口
package com.czxy.course.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.czxy.domain.Chapter;
import org.apache.ibatis.annotations.Mapper;
/**
* 课程章节 Mapper 接口
*/
@Mapper
public interface ChapterMapper extends BaseMapper<Chapte> {
}
package com.czxy.course.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.czxy.domain.CourseDescription;
import org.apache.ibatis.annotations.Mapper;
/**
* 课程介绍 Mapper 接口
*/
@Mapper
public interface CourseDecriptionMapper extends BaseMapper<CourseDescription> {
}
package com.czxy.course.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.czxy.domain.Video;
import org.apache.ibatis.annotations.Mapper;
/**
* 课程视频 Mapper 接口
*
*/
@Mapper
public interface VideoMapper extends BaseMapper<Video> {
}
package com.czxy.course.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.czxy.domain.Course;
import org.apache.ibatis.annotations.Mapper;
/**
* 课程 Mapper 接口
*/
@Mapper
public interface CourseMapper extends BaseMapper<Course> {
}
BaseMapper 里的要跟 daoman里命名对应
后端 service 接口
package com.czxy.course.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.czxy.domain.Chapter;
/*
* 课程章节 service
*
* */
public interface ChapterService extends IService<Chapter> {
}
package com.czxy.course.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.czxy.domain.CourseDescription;
/*
* 课程介绍 service
* */
public interface CourseDecriptionService extends IService<CourseDescription> {
}
package com.czxy.course.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.czxy.domain.Course;
import org.apache.ibatis.annotations.Mapper;
/*
*
* 课程 service
* */
@Mapper
public interface CourseMapper extends BaseMapper<Course> {
}
package com.czxy.course.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.czxy.domain.Video;
/*
*
* 课程视频 service
* */
public interface VideoService extends IService<Video> {
}
后端 serviceImpl 实现类
package com.czxy.course.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.czxy.course.mapper.ChapterMapper;
import com.czxy.course.service.ChapterService;
import com.czxy.domain.Chapter;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
@Transactional
public class ChapterServiceImpl extends ServiceImpl<ChapterMapper, Chapter> implements ChapterService {
}
package com.czxy.course.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.czxy.course.mapper.CourseDecriptionMapper;
import com.czxy.course.service.CourseDecriptionService;
import com.czxy.domain.CourseDescription;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
@Transactional
public class CourseDecriptionServiceImpl extends ServiceImpl<CourseDecriptionMapper, CourseDescription> implements CourseDecriptionService {
}
package com.czxy.course.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.czxy.course.mapper.CourseMapper;
import com.czxy.course.service.CourseService;
import com.czxy.domain.Course;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
@Transactional
public class CourseServiceImpl extends ServiceImpl<CourseMapper, Course> implements CourseService {
}
package com.czxy.course.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.czxy.course.mapper.VideoMapper;
import com.czxy.course.service.VideoService;
import com.czxy.domain.Video;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
@Transactional
public class VideoServiceImpl extends ServiceImpl<VideoMapper, Video> implements VideoService {
}
后端 Controller 实现类
package com.czxy.course.controller;
import com.czxy.course.service.ChapterService;
import io.swagger.annotations.Api;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
@RestController
@RequestMapping("/chapter")
@Api(tags = "课程列表接口", description = "课程列表CRUD操作")
public class ChapterController {
@Resource
private ChapterService chapterService;
}
package com.czxy.course.controller;
import com.czxy.course.service.CourseService;
import io.swagger.annotations.Api;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
@RestController
@RequestMapping("/course")
@Api(tags = "课程接口", description = "课程CRUD操作")
public class CourseController {
@Resource
private CourseService courseService;
}
package com.czxy.course.controller;
import com.czxy.course.service.CourseDecriptionService;
import io.swagger.annotations.Api;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
@RestController
@RequestMapping("/courseDecription")
@Api(tags = "课程介绍接口", description = "课程介绍CRUD操作")
public class CourseDecriptionController {
@Resource
private CourseDecriptionService courseDecriptionService;
}
package com.czxy.course.controller;
import com.czxy.course.service.VideoService;
import io.swagger.annotations.Api;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
@RestController
@RequestMapping("/video")
@Api(tags = "课程视频接口", description = "课程视频的CRUD操作")
public class VideoController {
@Resource
private VideoService videoService;
}