SpringBoot实现的后端开发

目录

一、设计阶段

1.设计ER图

2.创建数据库表

二、项目环境搭建

1.创建项目

2.在pom.xml中添加依赖

3.配置数据库连接

4.状态码的封装

5.开发自定义异常

6.密码加密

7.规范时间格式展示

8.添加Guava本地缓存

9.JWT

三、构建项目开发

1.创建项目结构

2.开发实体层和dao层(mapper层)

生成实体层和dao层

调整后的项目结构

具体讲解

3.开发controller层

4.开发service层

5.配置启动类

6.用postman进行测试


一、设计阶段

1.设计ER图

  • 实体对象:矩形
  • 属性:椭圆
  • 关系:菱形

2.创建数据库表

复制代码
DROP DATABASE IF EXISTS online_education ;
CREATE DATABASE online_education CHARACTER SET utf8;
use online_education ;
SET FOREIGN_KEY_CHECKS=0;

DROP TABLE IF EXISTS `chapter`;

CREATE TABLE `chapter` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `video_id` int(11) DEFAULT NULL COMMENT '视频主键',
  `title` varchar(128) DEFAULT NULL COMMENT '章节名称',
  `ordered` int(11) DEFAULT NULL COMMENT '章节顺序',
  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;



INSERT INTO `chapter` (`id`, `video_id`, `title`, `ordered`, `create_time`)
VALUES
	(370,40,'走进微信⼩小程序的世界',1,'2019-09-05 22:39:59'),
	(371,40,'开始第一个小程序之旅',2,'2019-09-05 22:39:59'),
	(372,40,'核⼼知识数据绑定与事件交互',3,'2019-09-05 22:39:59'),
	(373,40,'⼩程序基础组件及常⽤组件介绍',4,'2019-09-05 22:39:59'),
	(374,40,'常⽤视图容器及路由跳转',5,'2019-09-05 22:39:59'),
	(375,40,'构建模板化与模块化小程序',6,'2019-09-05 22:39:59'),
	(385,41,'搜索引擎之elasticsearch课程介绍',1,'2019-09-05 22:39:59'),
	(386,41,'你了解搜索引擎吗',2,'2019-09-05 22:39:59'),
	(387,41,'搜索引擎之elasticsearch的快速搭建',3,'2019-09-05 22:39:59'),
	(388,41,'搜索引擎之elastic search的快速⼊⻔',4,'2019-09-05 22:39:59'),
	(389,41,'玩转elastic search的搜索',5,'2019-09-05 22:39:59'),
	(390,41,'搜索引擎之elastic search的⾼级使⽤',6,'2019-09-05 22:39:59'),
	(391,41,'仿NBA中国官网之高级实战',7,'2019-09-05 22:39:59'),
	(392,41,'走入高可用分布式集群世界',8,'2019-09-05 22:39:59'),
	(393,41,'深入挖掘elasticsearch的原理',9,'2019-09-05 22:39:59'),
	(394,41,'elasticsearch的课程总结',10,'2019-09-05 22:39:59'),
	(395,40,'开始电影资讯小程序实战',7,'2019-09-05 22:39:59'),
	(396,40,'搜索页面及查询更多的实现',8,'2019-09-05 22:39:59'),
	(397,40,'电影详情页面构建',9,'2019-09-05 22:39:59'),
	(398,40,'组件化开发',10,'2019-09-05 22:39:59'),
	(399,40,'Weui组件库',11,'2019-09-05 22:39:59'),
	(400,40,'扩展内容之小程序常用api',12,'2019-09-05 22:39:59'),
	(401,40,'课程总结',13,'2019-09-05 22:39:59'),
	(450,42,'课程介绍',1,'2019-09-05 22:39:59'),
	(451,42,'Vue全家桶各部分核⼼知识详解',2,'2019-09-05 22:39:59'),
	(452,42,'Element常用组件详解',3,'2019-09-05 22:39:59'),
	(453,42,'实战项⽬之环境准备及配置改装',4,'2019-09-05 22:39:59'),
	(454,42,'⼩滴课堂后台视频管理系统之公用部分开发',5,'2019-09-05 22:39:59'),
	(455,42,'⼩D课堂后台视频管理系统之⾸页开发',6,'2019-09-05 22:39:59'),
	(456,42,'用户管理页及详解权限管理',7,'2019-09-05 22:39:59'),
	(457,42,'项⽬总结',8,'2019-09-05 22:39:59'),
	(470,43,'课程简介',1,'2019-09-05 22:39:59'),
	(471,43,'Python简介',2,'2019-09-05 22:39:59'),
	(472,43,'Python开发环境搭建',3,'2019-09-05 22:39:59'),
	(473,43,'Python基础数据类型',4,'2019-09-05 22:39:59'),
	(474,43,'深入理解Python运算符',5,'2019-09-05 22:39:59'),
	(475,43,'深入理解流程控制语句',6,'2019-09-05 22:39:59'),
	(476,43,'Python核心数据结构',7,'2019-09-05 22:39:59'),
	(477,43,'Python高级特性',8,'2019-09-05 22:39:59'),
	(478,43,'核心基础知识之函数',9,'2019-09-05 22:39:59'),
	(479,43,'核心基础知识之参数与变量',10,'2019-09-05 22:39:59'),
	(480,43,'高级知识点之函数式编程',11,'2019-09-05 22:39:59'),
	(481,43,'Python中的核心知识点',12,'2019-09-05 22:39:59'),
	(482,43,'错误的处理',13,'2019-09-05 22:39:59'),
	(483,43,'Python进阶之IO操作',14,'2019-09-05 22:39:59'),
	(484,43,'面向对象编程',15,NULL),
	(485,43,'面向对象高级特性',16,NULL),
	(486,43,'Python进阶之网络编程',17,NULL),
	(510,44,'Java高级核⼼玩转JDK8~13新特性课程介绍',1,'2019-10-10 22:14:00'),
	(511,44,'Java高级核⼼玩转JDK8新特性之接口和日期处理',2,'2019-10-10 22:14:00'),
	(512,44,' Java高级核心玩转JDK8 Lambda表达式',3,NULL),
	(513,44,'Java高级核心玩转JDK8 函数式编程',4,NULL),
	(514,44,'Java高级核心之玩转 JDK8 集合框架',5,NULL),
	(515,44,'Java高级核心之玩转 JDK8 集合框架进阶',6,NULL),
	(516,44,' Java高级核心之玩转 JDK8 收集器器和集合统计',7,NULL),
	(517,44,'Java高级核⼼之玩转 JDK8 Collection和Lambda实战',8,NULL),
	(518,44,'Java高级核⼼之玩转 JDK8 新的内存空间和异常处理',9,NULL),
	(519,44,'Java高级核⼼之玩转JDK9常见特性讲解',10,NULL),
	(520,44,'Java高级核⼼之玩转JDK9的Stream和集合API',11,NULL),
	(521,44,'Java高级核⼼之玩转JDK10和JDK11常⻅特性',12,NULL),
	(522,44,'Java高级核⼼之大话JDK12和JDK13',13,NULL),
	(523,44,'Java高级核⼼之JDK8~13课程总结',14,NULL),
	(600,45,'Docker容器的介绍与整套课程大纲',1,NULL),
	(601,45,'Docker容器基础入门实战',2,NULL),
	(602,45,'Docker核心必备之自定义镜像实战',3,NULL),
	(603,45,'Docker核心知识之网络模式与特权指令',4,NULL),
	(604,45,'实战系列之利用Compose操作容器',5,NULL),
	(605,45,'Docker企业核心知识之镜像仓库实战',6,NULL),
	(650,46,'跨平台编程语⾔Java编程史',1,NULL),
	(651,46,'Java开发环境准备和基础语法第⼀季',2,NULL),
	(652,46,'集成开发环境IDEA安装使⽤',3,NULL),
	(653,46,'Java开发环境准备和基础语法第⼆季',4,NULL),
	(654,46,'Java基础语法进阶',5,NULL),
	(655,46,'Java ⾯向对象编程OOP',6,NULL),
	(656,46,'Java 异常Exception讲解',7,NULL),
	(657,46,'Java进阶核⼼之集合框架Collection',8,NULL),
	(658,46,'Java进阶核⼼之三⼤集合框架拓展',9,NULL),
	(659,46,'Java进阶核⼼之File⽂件和⽬录',10,NULL),
	(660,46,'Java进阶核⼼之Input、Output Stream流',11,NULL),
	(661,46,'Java进阶核⼼之Reader、Writer字符流',12,NULL),
	(662,46,'Java核⼼之常⻅时间⽇期讲解',13,NULL),
	(663,46,'Java进阶核⼼之常⻅class类讲解',14,NULL),
	(664,46,'Java枚举类Enum',15,NULL),
	(665,46,'项⽬实战之开发⼈⼯智能问答机器⼈上',16,NULL),
	(666,46,'项⽬实战之开发⼈⼯智能问答机器⼈下',17,NULL),
	(667,46,'⼩滴课堂疯狂新版Java系列基础课程总结',18,NULL),
	(710,47,'初识NodeJs',1,NULL),
	(711,47,'NodeJs核⼼模块api-基础',2,NULL),
	(712,47,'http全⾯解析',3,NULL),
	(713,47,'Nodejs 核心模块api-路由与接口',4,NULL),
	(714,47,'Nodejs连接Mysql',5,NULL),
	(715,47,'分布式文件储存数据库MongoDB',6,NULL);


CREATE TABLE `episode` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `title` varchar(524) DEFAULT NULL COMMENT '集标题',
  `num` int(10) DEFAULT NULL COMMENT '第几集,全局顺序',
  `ordered` int(11) DEFAULT NULL COMMENT '顺序,章里面的顺序',
  `play_url` varchar(256) DEFAULT NULL COMMENT '播放地址',
  `chapter_id` int(11) DEFAULT NULL COMMENT '章节主键id',
  `free` tinyint(2) DEFAULT '0' COMMENT '0表示免费,1表示首付',
  `video_id` int(10) DEFAULT NULL COMMENT '视频id',
  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


INSERT INTO `episode` (`id`, `title`, `num`, `ordered`, `play_url`, `chapter_id`, `free`, `video_id`, `create_time`)
VALUES
	(11000,'微信小程序课程介绍',1,1,'xdclass.net/aaa.mp4',370,0,40,NULL),
	(11001,'小程序是什么?小程序应用前景',2,2,'xdclass.net/aaa.mp4',370,0,40,NULL),
	(11002,'微信小程序的注册流程',3,3,'xdclass.net/aaa.mp4',370,0,40,NULL),
	(11003,'微信开发者工具安装及使用讲解',4,4,'xdclass.net/aaa.mp4',370,1,40,NULL),
	(11004,'小程序目录结构分析',5,5,'xdclass.net/aaa.mp4',370,1,40,NULL),
	(11005,'小程序配置文件分析',6,6,'xdclass.net/aaa.mp4',370,1,40,NULL),
	(11006,'新建一个小程序及框架组成介绍',7,1,'xdclass.net/aaa.mp4',371,1,40,NULL),
	(11007,'小程序生命周期和页面生命周期讲解',8,2,'xdclass.net/aaa.mp4',371,1,40,NULL),
	(11008,'了解小程序自适应尺寸单位rpx',9,3,'xdclass.net/aaa.mp4',371,1,40,NULL),
	(11009,'如何使用flex弹性布局',10,4,'xdclass.net/aaa.mp4',371,1,40,NULL),
	(11010,'必备知识点之数据绑定的概念和基础',11,1,'xdclass.net/aaa.mp4',372,1,40,NULL),
	(11011,'详细讲解动态数据绑定',12,2,'xdclass.net/aaa.mp4',372,1,40,NULL),
	(11012,'深度了解小程序的条件渲染',13,3,'xdclass.net/aaa.mp4',372,1,40,NULL),
	(11013,'深度了解小程序的列表渲染',14,4,'xdclass.net/aaa.mp4',372,1,40,NULL),
	(11014,'讲解绑定事件与事件交互',15,5,'xdclass.net/aaa.mp4',372,1,40,NULL),
	(11015,'深入了解事件机制--catch与bind',16,6,'xdclass.net/aaa.mp4',372,1,40,NULL),
	(11016,'小程序基础组件介绍',17,1,'xdclass.net/aaa.mp4',373,1,40,NULL),
	(11017,'小程序常用表单组件介绍(一)',18,2,'xdclass.net/aaa.mp4',373,1,40,NULL),
	(11018,'小程序常用表单组件介绍(二)',19,3,'xdclass.net/aaa.mp4',373,1,40,NULL),
	(11019,'小程序媒体组件介绍',20,4,'xdclass.net/aaa.mp4',373,1,40,NULL),
	(11020,'小程序地图组件map',21,5,'xdclass.net/aaa.mp4',373,1,40,NULL),
	(11021,'小程序画布组件canvas',22,6,'xdclass.net/aaa.mp4',373,1,40,NULL),
	(11022,'使用视图容器swiper实现轮播图',23,1,'xdclass.net/aaa.mp4',374,1,40,NULL),
	(11023,'深度讲解可滚动视图区域scroll-view',24,2,'xdclass.net/aaa.mp4',374,1,40,NULL),
	(11024,'使用scroll-view实现可滚动导航栏',25,3,'xdclass.net/aaa.mp4',374,1,40,NULL),
	(11025,'cover-view及cover-image',26,4,'xdclass.net/aaa.mp4',374,1,40,NULL),
	(11026,'小程序页面导航组件',27,5,'xdclass.net/aaa.mp4',374,1,40,NULL),
	(11027,'常用路由跳转方法',28,6,'xdclass.net/aaa.mp4',374,1,40,NULL),
	(11028,'小程序页面的传参与取参',29,7,'xdclass.net/aaa.mp4',374,1,40,NULL),
	(11029,'如何实现小程序的底部导航栏',30,8,'xdclass.net/aaa.mp4',374,1,40,NULL),
	(11030,'利用require方法加载js模块文件',31,1,'xdclass.net/aaa.mp4',375,1,40,NULL),
	(11031,'WXML模板编写与引入精讲',32,2,'xdclass.net/aaa.mp4',375,1,40,NULL),
	(11032,'讲解wxs模块引用',33,3,'xdclass.net/aaa.mp4',375,1,40,NULL),
	(11033,'wxs案例练习',34,4,'xdclass.net/aaa.mp4',375,1,40,NULL),
	(11600,'elasticsearch的课程介绍',1,1,'xdclass.net/aaa.mp4',385,0,41,NULL),
	(11601,'什么是全文搜索引擎',2,1,'xdclass.net/aaa.mp4',386,0,41,NULL),
	(11602,'为什么不用mysql做全文搜索',3,2,'xdclass.net/aaa.mp4',386,0,41,NULL),
	(11603,'常见的搜索引擎',4,3,'xdclass.net/aaa.mp4',386,1,41,NULL),
	(11604,'elasticsearch的快速安装',5,1,'xdclass.net/aaa.mp4',387,1,41,NULL),
	(11605,'elasticsearch之目录结构介绍',6,2,'xdclass.net/aaa.mp4',387,1,41,NULL),
	(11606,'elasticsearch核心概念的介绍',7,1,'xdclass.net/aaa.mp4',388,1,41,NULL),
	(11607,'RESTful风格的介绍',8,2,'xdclass.net/aaa.mp4',388,1,41,NULL),
	(11608,'索引的介绍和使用',9,3,'xdclass.net/aaa.mp4',388,1,41,NULL),
	(11609,'映射的介绍和使用',10,4,'xdclass.net/aaa.mp4',388,1,41,NULL),
	(11610,'文档的增删改查',11,5,'xdclass.net/aaa.mp4',388,1,41,NULL),
	(11611,'搜索的简单使用',12,6,'xdclass.net/aaa.mp4',388,1,41,NULL),
	(11612,'分词器的介绍和使用',13,7,'xdclass.net/aaa.mp4',388,1,41,NULL),
	(11613,'常见中文分词器的使用',14,8,'xdclass.net/aaa.mp4',388,1,41,NULL),
	(11614,'常见的字段类型',15,9,'xdclass.net/aaa.mp4',388,1,41,NULL),
	(11615,'kibana的安装和使用',16,10,'xdclass.net/aaa.mp4',388,1,41,NULL),
	(11616,'es之批量导入数据',17,1,'xdclass.net/aaa.mp4',389,1,41,NULL),
	(11617,'es之term的多种查询',18,2,'xdclass.net/aaa.mp4',389,1,41,NULL),
	(11618,'玩转es的范围查询',19,3,'xdclass.net/aaa.mp4',389,1,41,NULL),
	(11619,'玩转es的布尔查询',20,4,'xdclass.net/aaa.mp4',389,1,41,NULL),
	(11620,'玩转es的排序',21,5,'xdclass.net/aaa.mp4',389,1,41,NULL),
	(11621,'玩转es聚合查询之指标聚合',22,6,'xdclass.net/aaa.mp4',389,1,41,NULL),
	(11622,'玩转es聚合查询之桶聚合',23,7,'xdclass.net/aaa.mp4',389,1,41,NULL),
	(11623,'es之query_string查询',24,8,'xdclass.net/aaa.mp4',389,1,41,NULL),
	(11624,'es之索引别名的使用',25,1,'xdclass.net/aaa.mp4',390,1,41,NULL),
	(11625,'es之如何重建索引',26,2,'xdclass.net/aaa.mp4',390,1,41,NULL),
	(11626,'es之refresh操作',27,3,'xdclass.net/aaa.mp4',390,1,41,NULL),
	(11627,'es之高亮查询',28,4,'xdclass.net/aaa.mp4',390,1,41,NULL),
	(11628,'es之查询建议',29,5,'xdclass.net/aaa.mp4',390,1,41,NULL),
	(11629,'NBA搜索实战之设计思路',30,1,'xdclass.net/aaa.mp4',391,1,41,NULL),
	(11630,'springboot整合elasticsearch和mysql',31,2,'xdclass.net/aaa.mp4',391,1,41,NULL),
	(11631,'elasticsearch之javaapi的使用',32,3,'xdclass.net/aaa.mp4',391,1,41,NULL),
	(11632,'NBA搜索实战之导入球员数据',33,4,'xdclass.net/aaa.mp4',391,1,41,NULL),
	(11633,'NBA搜索实战之通过名字查找球员',34,5,'xdclass.net/aaa.mp4',391,1,41,NULL),
	(11634,'NBA搜索实战之通过国家或球队查找球员',35,6,'xdclass.net/aaa.mp4',391,1,41,NULL),
	(11635,'NBA搜索实战之通过字母查找球员',36,7,'xdclass.net/aaa.mp4',391,1,41,NULL),
	(11636,'通往集群世界的大门',37,1,'xdclass.net/aaa.mp4',392,1,41,NULL),
	(11637,'es集群的基本核心概念',38,2,'xdclass.net/aaa.mp4',392,1,41,NULL),
	(11638,'手把手教你搭建es集群',39,3,'xdclass.net/aaa.mp4',392,1,41,NULL),
	(11639,'es集群索引分片管理',40,4,'xdclass.net/aaa.mp4',392,1,41,NULL),
	(11640,'玩转es集群健康管理',41,5,'xdclass.net/aaa.mp4',392,1,41,NULL),
	(11641,'elasticsearch分布式工作原理',42,1,'xdclass.net/aaa.mp4',393,1,41,NULL),
	(11642,'elasticsearch文档的路由原理',43,2,'xdclass.net/aaa.mp4',393,1,41,NULL),
	(11643,'剖析elasticsearch的乐观锁',44,3,'xdclass.net/aaa.mp4',393,1,41,NULL),
	(11644,'倒排索引到底是什么',45,4,'xdclass.net/aaa.mp4',393,1,41,NULL),
	(11645,'谈谈elasticsearch的分词原理',46,5,'xdclass.net/aaa.mp4',393,1,41,NULL),
	(11646,'elasticsearch的课程总结',47,1,'xdclass.net/aaa.mp4',394,1,41,NULL),
	(11647,'小程序登录授权以及缓存storage讲解',35,1,'xdclass.net/aaa.mp4',395,1,40,NULL),
	(11648,'构建个人页面',36,2,'xdclass.net/aaa.mp4',395,1,40,NULL),
	(11649,'讲解首页搜索框及轮播图布局',37,3,'xdclass.net/aaa.mp4',395,1,40,NULL),
	(11650,'轮播图高度自适应方案',38,4,'xdclass.net/aaa.mp4',395,1,40,NULL),
	(11651,'深度讲解小程序request请求',39,5,'xdclass.net/aaa.mp4',395,1,40,NULL),
	(11652,'构建电影分类专区列表',40,6,'xdclass.net/aaa.mp4',395,1,40,NULL),
	(11653,'深度讲解电影分类专区模板复用',41,7,'xdclass.net/aaa.mp4',395,1,40,NULL),
	(11654,'星星评分组件的实现',42,8,'xdclass.net/aaa.mp4',395,1,40,NULL),
	(11655,'分离业务数据及数据接入',43,9,'xdclass.net/aaa.mp4',395,1,40,NULL),
	(11656,'电影搜索页面构建(上)',44,1,'xdclass.net/aaa.mp4',396,1,40,NULL),
	(11657,'电影搜索页面构建(下)',45,2,'xdclass.net/aaa.mp4',396,1,40,NULL),
	(11658,'动态更换电影分类标题',46,3,'xdclass.net/aaa.mp4',396,1,40,NULL),
	(11659,'构建查看更多页面',47,4,'xdclass.net/aaa.mp4',396,1,40,NULL),
	(11660,'深度讲解上拉加载功能实现',48,5,'xdclass.net/aaa.mp4',396,1,40,NULL),
	(11661,'构建电影详情页面',49,1,'xdclass.net/aaa.mp4',397,1,40,NULL),
	(11662,'电影详情页面数据接入',50,2,'xdclass.net/aaa.mp4',397,1,40,NULL),
	(11663,'小程序的版本上传',51,3,'xdclass.net/aaa.mp4',397,1,40,NULL),
	(11664,'电影实战总结',52,4,'xdclass.net/aaa.mp4',397,1,40,NULL),
	(11665,'手把手教你创建自定义组件',53,1,'xdclass.net/aaa.mp4',398,1,40,NULL),
	(11666,'必备知识之组件之间引用及slot插槽',54,2,'xdclass.net/aaa.mp4',398,1,40,NULL),
	(11667,'深度讲解组件的样式隔离',55,3,'xdclass.net/aaa.mp4',398,1,40,NULL),
	(11668,'深度讲解组件和页面通信',56,4,'xdclass.net/aaa.mp4',398,1,40,NULL),
	(11669,'组件事件传递数据交互',57,5,'xdclass.net/aaa.mp4',398,1,40,NULL),
	(11670,'组件tab标签栏实战演练',58,6,'xdclass.net/aaa.mp4',398,1,40,NULL),
	(11671,'组件对象动态设置组件数据',59,7,'xdclass.net/aaa.mp4',398,1,40,NULL),
	(11672,'讲解组件的生命周期',60,8,'xdclass.net/aaa.mp4',398,1,40,NULL),
	(11673,'讲解组件的数据监听器',61,9,'xdclass.net/aaa.mp4',398,1,40,NULL),
	(11674,'深度讲解组件的代码共享',62,10,'xdclass.net/aaa.mp4',398,1,40,NULL),
	(11675,'WeUI框架介绍、下载及部署',63,1,'xdclass.net/aaa.mp4',399,1,40,NULL),
	(11676,'WeUI组件使用介绍',64,2,'xdclass.net/aaa.mp4',399,1,40,NULL),
	(11677,'工具类库computed的使用',65,3,'xdclass.net/aaa.mp4',399,1,40,NULL),
	(11678,'小程序发起微信支付',66,1,'xdclass.net/aaa.mp4',400,1,40,NULL),
	(11679,'小程序获取收获地址',67,2,'xdclass.net/aaa.mp4',400,1,40,NULL),
	(11680,'不可不知的tabbar操作',68,3,'xdclass.net/aaa.mp4',400,1,40,NULL),
	(11681,'小程序图片应用api',69,4,'xdclass.net/aaa.mp4',400,1,40,NULL),
	(11682,'常用功能之小程序分享转发',70,5,'xdclass.net/aaa.mp4',400,1,40,NULL),
	(11683,'课程总结及行业前景展望',71,1,'xdclass.net/aaa.mp4',401,1,40,NULL),
	(11690,'小滴后台管理系统课程介绍',1,1,'xdclass.net/aaa.mp4',450,0,42,NULL),
	(11691,'构建vue项目的利器---脚手架vue-cli3详解',2,1,'xdclass.net/aaa.mp4',451,0,42,NULL),
	(11692,'vue中组件间传值常用的几种方式(上)',3,2,'xdclass.net/aaa.mp4',451,0,42,NULL),
	(11693,'vue中组件间传值常用的几种方式(下)',4,3,'xdclass.net/aaa.mp4',451,1,42,NULL),
	(11694,'玩转单页面应用的控制中心---vue-router',5,4,'xdclass.net/aaa.mp4',451,1,42,NULL),
	(11695,'状态管理中心---vuex的基础用法',6,5,'xdclass.net/aaa.mp4',451,1,42,NULL),
	(11696,'状态管理中心---vuex的高级用法',7,6,'xdclass.net/aaa.mp4',451,1,42,NULL),
	(11697,'Element常用组件布局组件详解',8,1,'xdclass.net/aaa.mp4',452,1,42,NULL),
	(11698,'Element常用组件之弹出类型组件详解',9,2,'xdclass.net/aaa.mp4',452,1,42,NULL),
	(11699,'Element常用组件---表格组件详解',10,3,'xdclass.net/aaa.mp4',452,1,42,NULL),
	(11700,'Element常用组件---表单组件详解',11,4,'xdclass.net/aaa.mp4',452,1,42,NULL),
	(11701,'项目搭建及技术选型',12,1,'xdclass.net/aaa.mp4',453,1,42,NULL),
	(11702,'配置项目的基本环境及项目目录结构总体介绍',13,2,'xdclass.net/aaa.mp4',453,1,42,NULL),
	(11703,'需求分析及模块划分',14,1,'xdclass.net/aaa.mp4',454,1,42,NULL),
	(11704,'路由设计及左侧公用导航菜单开发',15,2,'xdclass.net/aaa.mp4',454,1,42,NULL),
	(11705,'顶部导航菜单及与左侧导航联动的面包屑实现(上)',16,3,'xdclass.net/aaa.mp4',454,1,42,NULL),
	(11706,'顶部导航菜单及与左侧导航联动的面包屑实现(下)',17,4,'xdclass.net/aaa.mp4',454,1,42,NULL),
	(11707,'使用vuex实现切换tab页功能',18,5,'xdclass.net/aaa.mp4',454,1,42,NULL),
	(11708,'构建页面组件,连通公共组件',19,6,'xdclass.net/aaa.mp4',454,1,42,NULL),
	(11709,'页面布局整体样式优化',20,7,'xdclass.net/aaa.mp4',454,1,42,NULL),
	(11710,'介绍mock.js及axios全局配置',21,1,'xdclass.net/aaa.mp4',455,1,42,NULL),
	(11711,'使用Mock随机返回主页数据',22,2,'xdclass.net/aaa.mp4',455,1,42,NULL),
	(11712,'使用element布局组件实现首页布局',23,3,'xdclass.net/aaa.mp4',455,1,42,NULL),
	(11713,'完成首页除图表外的内容',24,4,'xdclass.net/aaa.mp4',455,1,42,NULL),
	(11714,'完成首页table部分及ECharts介绍',25,5,'xdclass.net/aaa.mp4',455,1,42,NULL),
	(11715,'谈谈封装一个EChart组件的一些想法',26,6,'xdclass.net/aaa.mp4',455,1,42,NULL),
	(11716,'上手封装一个EChart组件并处理数据展示图表',27,7,'xdclass.net/aaa.mp4',455,1,42,NULL),
	(11717,'修改EChart组件样式及自适应图表(上)',28,8,'xdclass.net/aaa.mp4',455,1,42,NULL),
	(11718,'修改EChart组件样式自适应图表(下)',29,9,'xdclass.net/aaa.mp4',455,1,42,NULL),
	(11719,'Echart组件封装总结',30,10,'xdclass.net/aaa.mp4',455,1,42,NULL),
	(11720,'用户管理页介绍及页面实现思路讲解',31,1,'xdclass.net/aaa.mp4',456,1,42,NULL),
	(11721,'更完善的表单组件封装及思路讲解',32,2,'xdclass.net/aaa.mp4',456,1,42,NULL),
	(11722,'通用表格组件封装及思路讲解',33,3,'xdclass.net/aaa.mp4',456,1,42,NULL),
	(11723,'完成表格组件的封装',34,4,'xdclass.net/aaa.mp4',456,1,42,NULL),
	(11724,'用户管理页页面功能实现(上)',35,5,'xdclass.net/aaa.mp4',456,1,42,NULL),
	(11725,'用户管理页页面功能实现(下)',36,6,'xdclass.net/aaa.mp4',456,1,42,NULL),
	(11726,'企业开发之权限管理思路讲解',37,7,'xdclass.net/aaa.mp4',456,1,42,NULL),
	(11727,'权限管理之动态返回菜单的实现',38,8,'xdclass.net/aaa.mp4',456,1,42,NULL),
	(11728,'权限管理之路由守卫判断用户登录状态',39,9,'xdclass.net/aaa.mp4',456,1,42,NULL),
	(11729,'小滴后台管理系统项目总结',40,1,'xdclass.net/aaa.mp4',457,1,42,NULL),
	(11801,'Python的发展史及其特点',2,1,'xdclass.net/aaa.mp4',471,0,43,NULL),
	(11802,'python的应用及就业场景',3,2,'xdclass.net/aaa.mp4',471,0,43,NULL),
	(11803,'Windows环境下搭建Python环境',4,1,'xdclass.net/aaa.mp4',472,0,43,NULL),
	(11804,'集成开发环境之PyCharm的安装',5,2,'xdclass.net/aaa.mp4',472,1,43,NULL),
	(11805,'万事开头难之HelloWorld程序',6,3,'xdclass.net/aaa.mp4',472,1,43,NULL),
	(11806,'Python开发之常用的其他几种方式',7,4,'xdclass.net/aaa.mp4',472,1,43,NULL),
	(11807,'Python核心基础知识之数字类型',8,1,'xdclass.net/aaa.mp4',473,1,43,NULL),
	(11808,'Python核心基础知识之神奇的整数之10',9,2,'xdclass.net/aaa.mp4',473,1,43,NULL),
	(11809,'Python核心基础知识之布尔类型及bool函数',10,3,'xdclass.net/aaa.mp4',473,1,43,NULL),
	(11810,'Python核心基础知识之字符串及其编码',11,4,'xdclass.net/aaa.mp4',473,1,43,NULL),
	(11811,'Python核心基础知识之单引号、双引号、三引号与转义字符串',12,5,'xdclass.net/aaa.mp4',473,1,43,NULL),
	(11812,'Python核心基础知识之字符串常见的操作',13,6,'xdclass.net/aaa.mp4',473,1,43,NULL),
	(11813,'Python核心基础知识之算术运算符',14,1,'xdclass.net/aaa.mp4',474,1,43,NULL),
	(11814,'Python核心基础知识之比较运算符',15,2,'xdclass.net/aaa.mp4',474,1,43,NULL),
	(11815,'Python核心基础知识之赋值运算符',16,3,'xdclass.net/aaa.mp4',474,1,43,NULL),
	(11816,'Python核心基础知识之位运算符',17,4,'xdclass.net/aaa.mp4',474,1,43,NULL),
	(11817,'Python核心基础知识之逻辑运算符',18,5,'xdclass.net/aaa.mp4',474,1,43,NULL),
	(11818,'Python核心基础知识之成员运算符与身份运算符',19,6,'xdclass.net/aaa.mp4',474,1,43,NULL),
	(11819,'Python核心基础知识之运算符的优先级',20,7,'xdclass.net/aaa.mp4',474,1,43,NULL),
	(11820,'Python核心基础知识之条件语句',21,1,'xdclass.net/aaa.mp4',475,1,43,NULL),
	(11821,'Python核心基础知识之for循环语句',22,2,'xdclass.net/aaa.mp4',475,1,43,NULL),
	(11822,'Python核心基础知识之while循环语句',23,3,'xdclass.net/aaa.mp4',475,1,43,NULL),
	(11823,'Python核心基础知识之嵌套循环',24,4,'xdclass.net/aaa.mp4',475,1,43,NULL),
	(11824,'Python核心基础知识之循环退出与continue语句',25,5,'xdclass.net/aaa.mp4',475,1,43,NULL),
	(11825,'Python核心数据结构之列表(list)',26,1,'xdclass.net/aaa.mp4',476,1,43,NULL),
	(11826,'Python核心数据结构之集合(set)',27,2,'xdclass.net/aaa.mp4',476,1,43,NULL),
	(11827,'Python核心数据结构之元组(tuple)',28,3,'xdclass.net/aaa.mp4',476,1,43,NULL),
	(11828,'Python核心数据结构之字典(dict)',29,4,'xdclass.net/aaa.mp4',476,1,43,NULL),
	(11829,'Python核心之range类型',30,5,'xdclass.net/aaa.mp4',476,1,43,NULL),
	(11830,'真的不可变?深入理解可变与不可变对象',31,6,'xdclass.net/aaa.mp4',476,1,43,NULL),
	(11831,'Python高级特性之切片',32,1,'xdclass.net/aaa.mp4',477,1,43,NULL),
	(11832,'Python高级特性之列表生成式',33,2,'xdclass.net/aaa.mp4',477,1,43,NULL),
	(11833,'Python高级特性之迭代',34,3,'xdclass.net/aaa.mp4',477,1,43,NULL),
	(11834,'Python高级特性之生成器',35,4,'xdclass.net/aaa.mp4',477,1,43,NULL),
	(11835,'Python中的函数及其调用',36,1,'xdclass.net/aaa.mp4',478,1,43,NULL),
	(11836,'Python中的自定义函数',37,2,'xdclass.net/aaa.mp4',478,1,43,NULL),
	(11837,'Python特性之让函数返回多个值',38,3,'xdclass.net/aaa.mp4',478,1,43,NULL),
	(11838,'核心基础知识之函数的递归',39,4,'xdclass.net/aaa.mp4',478,1,43,NULL),
	(11839,'课后习题解答',40,5,'xdclass.net/aaa.mp4',478,1,43,NULL),
	(11840,'核心基础知识之形参与实参以及位置参数',41,1,'xdclass.net/aaa.mp4',479,1,43,NULL),
	(11841,'核心基础知识之默认参数',42,2,'xdclass.net/aaa.mp4',479,1,43,NULL),
	(11842,'核心基础知识之可变参数',43,3,'xdclass.net/aaa.mp4',479,1,43,NULL),
	(11843,'核心基础知识之命名关键字参数',44,4,'xdclass.net/aaa.mp4',479,1,43,NULL),
	(11844,'核心基础知识之关键字参数',45,5,'xdclass.net/aaa.mp4',479,1,43,NULL),
	(11845,'高级知识点之匿名函数lambda表达式',46,1,'xdclass.net/aaa.mp4',480,1,43,NULL),
	(11846,'Python中的高阶函数之map',47,2,'xdclass.net/aaa.mp4',480,1,43,NULL),
	(11847,'Python中的高阶函数之reduce',48,3,'xdclass.net/aaa.mp4',480,1,43,NULL),
	(11848,'Python中的高阶函数之filter',49,4,'xdclass.net/aaa.mp4',480,1,43,NULL),
	(11849,'Python中的高阶函数之sorted',50,5,'xdclass.net/aaa.mp4',480,1,43,NULL),
	(11850,'高级知识点之闭包',51,6,'xdclass.net/aaa.mp4',480,1,43,NULL),
	(11851,'高频面试点之闭包经典问题',52,7,'xdclass.net/aaa.mp4',480,1,43,NULL),
	(11852,'Python中的装饰器及其应用',53,8,'xdclass.net/aaa.mp4',480,1,43,NULL),
	(11853,'初识Python工程组织结构之包、模块等核心概念',54,1,'xdclass.net/aaa.mp4',481,1,43,NULL),
	(11854,'核心知识之命名空间',55,2,'xdclass.net/aaa.mp4',481,1,43,NULL),
	(11855,'在Python工程中导入模块',56,3,'xdclass.net/aaa.mp4',481,1,43,NULL),
	(11856,'在Python工程中导入变量',57,4,'xdclass.net/aaa.mp4',481,1,43,NULL),
	(11857,'python中的导包机制',58,5,'xdclass.net/aaa.mp4',481,1,43,NULL),
	(11858,'高级知识点之__init__.py的作用及用法',59,6,'xdclass.net/aaa.mp4',481,1,43,NULL),
	(11859,'高级知识点之__all__和__name__的作用及其用法',60,7,'xdclass.net/aaa.mp4',481,1,43,NULL),
	(11860,'Python中异常的捕获与处理',61,1,'xdclass.net/aaa.mp4',482,1,43,NULL),
	(11861,'自定义异常与异常的抛出',62,2,'xdclass.net/aaa.mp4',482,1,43,NULL),
	(11862,'如何通过debug分析问题',63,3,'xdclass.net/aaa.mp4',482,1,43,NULL),
	(11863,'开发必备之为代码编写单元测试',64,4,'xdclass.net/aaa.mp4',482,1,43,NULL),
	(11864,'IO核心知识之输入输出',65,1,'xdclass.net/aaa.mp4',483,1,43,NULL),
	(11865,'IO核心知识之文件的读取',66,2,'xdclass.net/aaa.mp4',483,1,43,NULL),
	(11866,'课程总体介绍',1,1,'xdclass.net/aaa.mp4',470,0,43,NULL),
	(12101,'Java新特性玩转JDK8~13课程大纲讲解',1,1,'xdclass.net/aaa.mp4',510,0,44,'2019-10-10 22:14:00'),
	(12102,'Java新特性之JDK8相关开发环境准备',2,2,'xdclass.net/aaa.mp4',510,0,44,'2019-10-10 22:14:00'),
	(12103,'Java新特性玩转JDK8之default关键字',3,1,'xdclass.net/aaa.mp4',511,0,44,NULL),
	(12104,'Java新特性玩转JDK8之新增base64加解密API',4,2,'xdclass.net/aaa.mp4',511,1,44,NULL),
	(12105,'Java新特性玩转JDK8之时间日期处理类上集',5,3,'xdclass.net/aaa.mp4',511,1,44,NULL),
	(12106,'Java新特性玩转JDK8之时间日期处理类下集',6,4,'xdclass.net/aaa.mp4',511,1,44,NULL),
	(12107,'Java新特性玩转JDK8之Optional类',7,5,'xdclass.net/aaa.mp4',511,1,44,NULL),
	(12108,'Java高级核心玩转JDK8Lambda表达式',8,1,'xdclass.net/aaa.mp4',512,1,44,NULL),
	(12109,'Java新特性玩转JDK8之自定义函数式编程实战',9,2,'xdclass.net/aaa.mp4',512,1,44,NULL),
	(12110,'Java新特性玩转JDK8之函数式编程Function',10,1,'xdclass.net/aaa.mp4',513,1,44,NULL),
	(12111,'Java新特性玩转JDK8之函数式编程BiFunction',11,2,'xdclass.net/aaa.mp4',513,1,44,NULL),
	(12112,'Java新特性玩转JDK8之函数式编程Consumer',12,3,'xdclass.net/aaa.mp4',513,1,44,NULL),
	(12113,'Java新特性玩转JDK8之函数式编程Supplier',13,4,'xdclass.net/aaa.mp4',513,1,44,NULL),
	(12114,'Java新特性玩转JDK8之函数式编程Predicate',14,5,'xdclass.net/aaa.mp4',513,1,44,NULL),
	(12115,'Java新特性玩转JDK8之方法与构造函数引用',15,6,'xdclass.net/aaa.mp4',513,1,44,NULL),
	(12116,'Java新特性玩转JDK8之流Stream实战',16,1,'xdclass.net/aaa.mp4',514,1,44,NULL),
	(12117,'Java新特性玩转JDK8之流操作map和filter函数',17,2,'xdclass.net/aaa.mp4',514,1,44,NULL),
	(12118,'Java新特性玩转JDK8之流操作limit和sorted函数',18,3,'xdclass.net/aaa.mp4',514,1,44,NULL),
	(12119,'Java新特性玩转JDK8之流操作allMatch和anyMatch函数',19,4,'xdclass.net/aaa.mp4',514,1,44,NULL),
	(12120,'Java新特性玩转JDK8之流操作max和min函数',20,5,'xdclass.net/aaa.mp4',514,1,44,NULL),
	(12121,'Java新特性玩转JDK8之并行流parallelStream',21,1,'xdclass.net/aaa.mp4',515,1,44,NULL),
	(12122,'Java新特性玩转JDK8之reduce操作',22,2,'xdclass.net/aaa.mp4',515,1,44,NULL),
	(12123,'Java新特性玩转JDK8之集合的foreach',23,3,'xdclass.net/aaa.mp4',515,1,44,NULL),
	(12124,'Java新特性玩转JDK8之collector收集器',24,1,'xdclass.net/aaa.mp4',516,1,44,NULL),
	(12125,'Java新特性玩转JDK8之joining函数',25,2,'xdclass.net/aaa.mp4',516,1,44,NULL),
	(12126,'Java新特性玩转JDK8之收集器partitioningBy分组',26,3,'xdclass.net/aaa.mp4',516,1,44,NULL),
	(12127,'Java新特性玩转JDK8之收集器groupby分组',27,4,'xdclass.net/aaa.mp4',516,1,44,NULL),
	(12128,'Java新特性玩转JDK8之收集器groupby进阶',28,5,'xdclass.net/aaa.mp4',516,1,44,NULL),
	(12129,'Java新特性玩转JDK8之summarizing集合统计',29,6,'xdclass.net/aaa.mp4',516,1,44,NULL),
	(12130,'Collection和Lambda电商数据处理实战需求说明',30,1,'xdclass.net/aaa.mp4',517,1,44,NULL),
	(12131,'JDK8新特性处理电商订单数据之答案讲解上集',31,2,'xdclass.net/aaa.mp4',517,1,44,NULL),
	(12132,'JDK8新特性处理电商订单数据之答案讲解下集',32,3,'xdclass.net/aaa.mp4',517,1,44,NULL),
	(12133,'JDK8新特性之新内存空间Matespace',33,1,'xdclass.net/aaa.mp4',518,1,44,NULL),
	(12134,'JDK7新特性之try-with-resources',34,2,'xdclass.net/aaa.mp4',518,1,44,NULL),
	(12135,'新版JDK13下载和本章课程说明',35,1,'xdclass.net/aaa.mp4',519,1,44,NULL),
	(12136,'java高级核心之JDK9常用Jshell实战',36,2,'xdclass.net/aaa.mp4',519,1,44,NULL),
	(12137,'接口方法进阶之JDK9私有方法',37,3,'xdclass.net/aaa.mp4',519,1,44,NULL),
	(12138,'JDK9新特性之增强try-with-resource',38,4,'xdclass.net/aaa.mp4',519,1,44,NULL),
	(12139,'JDK9之快速创建只读集合',39,1,'xdclass.net/aaa.mp4',520,1,44,NULL),
	(12140,'JDK9之新增StreamAPI讲解',40,2,'xdclass.net/aaa.mp4',520,1,44,NULL),
	(12141,'JDK10之局部变量类型推断var讲解',41,1,'xdclass.net/aaa.mp4',521,1,44,NULL),
	(12142,'JDK11之新增HttpClient客户端快速入门',42,2,'xdclass.net/aaa.mp4',521,1,44,NULL),
	(12143,'JDK11之标准HttpClient提交Post和异步请求',43,3,'xdclass.net/aaa.mp4',521,1,44,NULL),
	(12144,'JDK11之标准HttpClient提交Http2请求',44,4,'xdclass.net/aaa.mp4',521,1,44,NULL),
	(12145,'JDK11之javac和java命令优化',45,5,'xdclass.net/aaa.mp4',521,1,44,NULL),
	(12146,'大话JDK各个版本常见问题讲解',46,1,'xdclass.net/aaa.mp4',522,1,44,NULL),
	(12147,'玩转JDK13新特性之多行文本块',47,2,'xdclass.net/aaa.mp4',522,1,44,NULL),
	(12148,'玩转JDK13新特性之增强switch表达式',48,3,'xdclass.net/aaa.mp4',522,1,44,NULL),
	(12149,'玩转JDK8~13新特性课程总结和学习路线规划',49,1,'xdclass.net/aaa.mp4',523,1,44,NULL),
	(12250,'课程大纲总览',1,1,'xdclass.net/aaa.mp4',600,0,45,NULL),
	(12251,'Docker容器化技术的介绍和使用场景',2,2,'xdclass.net/aaa.mp4',600,0,45,NULL),
	(12252,'Window10环境下安装Docker',3,1,'xdclass.net/aaa.mp4',601,1,45,NULL),
	(12253,'LinuxCentos7环境下安装Docker',4,2,'xdclass.net/aaa.mp4',601,1,45,NULL),
	(12254,'Docker镜像的搜索下载以及查看删除实战',5,3,'xdclass.net/aaa.mp4',601,1,45,NULL),
	(12255,'Docker核心基础之配置阿里云镜像加速',6,4,'xdclass.net/aaa.mp4',601,1,45,NULL),
	(12256,'Docker的体系结构之镜像与容器',7,5,'xdclass.net/aaa.mp4',601,1,45,NULL),
	(12257,'Docker核心基础之容器的构建等基本操作',8,6,'xdclass.net/aaa.mp4',601,1,45,NULL),
	(12258,'Docker核心基础之容器的文件复制与挂载',9,7,'xdclass.net/aaa.mp4',601,1,45,NULL),
	(12259,'构建自定义镜像的意义与应用场景',10,1,'xdclass.net/aaa.mp4',602,1,45,NULL),
	(12260,'Commit构建自定义镜像',11,2,'xdclass.net/aaa.mp4',602,1,45,NULL),
	(12261,'核心必备知识之Dockerfile构建镜像实战',12,3,'xdclass.net/aaa.mp4',602,1,45,NULL),
	(12262,'Docker核心知识之镜像分层结构剖析',13,4,'xdclass.net/aaa.mp4',602,1,45,NULL),
	(12263,'不得不掌握的Dockerfile基础指令',14,5,'xdclass.net/aaa.mp4',602,1,45,NULL),
	(12264,'实战系列之Dockerfile构建JAVA网站镜像',15,6,'xdclass.net/aaa.mp4',602,1,45,NULL),
	(12265,'实战系列之Dockerfile构建nginx镜像',16,7,'xdclass.net/aaa.mp4',602,1,45,NULL),
	(12266,'实战系列之Dockerfile构建redis镜像',17,8,'xdclass.net/aaa.mp4',602,1,45,NULL),
	(12267,'实战系列之docker快速部署mysql数据库并初始化',18,9,'xdclass.net/aaa.mp4',602,1,45,NULL),
	(12268,'Docker容器的网络模式介绍',19,1,'xdclass.net/aaa.mp4',603,1,45,NULL),
	(12269,'Docker容器的bridge模式实战演练',20,2,'xdclass.net/aaa.mp4',603,1,45,NULL),
	(12270,'Docker容器的host模式实战演练',21,3,'xdclass.net/aaa.mp4',603,1,45,NULL),
	(12271,'Docker容器的none模式介绍',22,4,'xdclass.net/aaa.mp4',603,1,45,NULL),
	(12272,'Docker容器间基于Link实现单向通信',23,5,'xdclass.net/aaa.mp4',603,1,45,NULL),
	(12273,'Docker容器间利用brige网桥实现双向通信',24,6,'xdclass.net/aaa.mp4',603,1,45,NULL),
	(12274,'Docker容器的特权模式介绍',25,7,'xdclass.net/aaa.mp4',603,1,45,NULL),
	(12275,'Docker核心知识之Volume数据共享',26,8,'xdclass.net/aaa.mp4',603,1,45,NULL),
	(12276,'实用工具Docker-Compose的介绍与安装',27,1,'xdclass.net/aaa.mp4',604,1,45,NULL),
	(12277,'实用工具Docker-Compose的快速上手',28,2,'xdclass.net/aaa.mp4',604,1,45,NULL),
	(12278,'实用工具Docker-Compose核实用技能',29,3,'xdclass.net/aaa.mp4',604,1,45,NULL),
	(12279,'实战项目篇之利用Docker-Compose快速搭建个人博客',30,4,'xdclass.net/aaa.mp4',604,1,45,NULL),
	(12280,'实战项目篇之Docker-Compose详细分析',31,5,'xdclass.net/aaa.mp4',604,1,45,NULL),
	(12281,'公司中Docker镜像仓库使用讲解',32,1,'xdclass.net/aaa.mp4',605,1,45,NULL),
	(12282,'阿里云镜像仓库的搭建与使用',33,2,'xdclass.net/aaa.mp4',605,1,45,NULL),
	(12283,'企业核心篇幅之harbor仓库搭建',34,3,'xdclass.net/aaa.mp4',605,1,45,NULL),
	(12284,'企业核心篇幅之harbor仓库配置与使用',35,4,'xdclass.net/aaa.mp4',605,1,45,NULL),
	(12285,'实战系列之本地镜像容器的载入与载出',36,5,'xdclass.net/aaa.mp4',605,1,45,NULL),
	(12350,'茫茫人海中为何选择java这门语言',1,1,'xdclass.net/aaa.mp4',650,0,46,NULL),
	(12351,'新版java8+从入门到告诉高手课程介绍',2,2,'xdclass.net/aaa.mp4',650,0,46,NULL),
	(12352,'Java语言编程发展历程和JVM概述',3,3,'xdclass.net/aaa.mp4',650,0,46,NULL),
	(12353,'概念理解面向对象编程和特点',4,4,'xdclass.net/aaa.mp4',650,1,46,NULL),
	(12354,'CMD和Sublime工具安装、环境变量介绍使用',5,1,'xdclass.net/aaa.mp4',651,1,46,NULL),
	(12355,'新版Java环境变量配置',6,2,'xdclass.net/aaa.mp4',651,1,46,NULL),
	(12356,'完成第一个java程序',7,3,'xdclass.net/aaa.mp4',651,1,46,NULL),
	(12357,'HelloWolrd程序剖析java语法',8,4,'xdclass.net/aaa.mp4',651,1,46,NULL),
	(12358,'什么是集成开发环境和java常见开发工具的介绍',9,1,'xdclass.net/aaa.mp4',652,1,46,NULL),
	(12359,'IDEA的社区版本安装和基本配置',10,2,'xdclass.net/aaa.mp4',652,1,46,NULL),
	(12360,'使用idea创建自己的第一个项目',11,3,'xdclass.net/aaa.mp4',652,1,46,NULL),
	(12361,'实战idea里面编写和运行代码',12,4,'xdclass.net/aaa.mp4',652,1,46,NULL),
	(12362,'公司开发必备技能之ideadebug基础调试',13,5,'xdclass.net/aaa.mp4',652,1,46,NULL),
	(12363,'写代码的小帮手之java注释的介绍',14,6,'xdclass.net/aaa.mp4',652,1,46,NULL),
	(12364,'java模块划分和包的使用',15,7,'xdclass.net/aaa.mp4',652,1,46,NULL),
	(12365,'本章课程作业练习题布置',16,8,'xdclass.net/aaa.mp4',652,1,46,NULL),
	(12366,'本章课程作业常见问题和答案解析',17,9,'xdclass.net/aaa.mp4',652,1,46,NULL),
	(12367,'java程序的标识符和关键字',18,1,'xdclass.net/aaa.mp4',653,1,46,NULL),
	(12368,'java核心基础知识之修饰符上集',19,2,'xdclass.net/aaa.mp4',653,1,46,NULL),
	(12369,'java核心基础知识之修饰符下集',20,3,'xdclass.net/aaa.mp4',653,1,46,NULL),
	(12370,'java核心基础之数据类型',21,4,'xdclass.net/aaa.mp4',653,1,46,NULL),
	(12371,'java核心基础之数组讲解',22,5,'xdclass.net/aaa.mp4',653,1,46,NULL),
	(12372,'java内存空间堆栈讲解',23,6,'xdclass.net/aaa.mp4',653,1,46,NULL),
	(12373,'Java核心基础之变量类型',24,7,'xdclass.net/aaa.mp4',653,1,46,NULL),
	(12374,'方法入参和返回值讲解',25,8,'xdclass.net/aaa.mp4',653,1,46,NULL),
	(12375,'java核心运算符上',26,9,'xdclass.net/aaa.mp4',653,1,46,NULL),
	(12376,'java核心基础运算符和优先级下集',27,10,'xdclass.net/aaa.mp4',653,1,46,NULL),
	(12377,'java核心基础之while循环讲解',28,1,'xdclass.net/aaa.mp4',654,1,46,NULL),
	(12378,'java核心基础之for循环讲解',29,2,'xdclass.net/aaa.mp4',654,1,46,NULL),
	(12379,'java核心基础之循环退出和跳过',30,3,'xdclass.net/aaa.mp4',654,1,46,NULL),
	(12380,'java核心基础之ifelse条件语句',31,4,'xdclass.net/aaa.mp4',654,1,46,NULL),
	(12381,'java核心基础之switch条件分支语句',32,5,'xdclass.net/aaa.mp4',654,1,46,NULL),
	(12382,'static静态代码块和静态方法讲解',33,6,'xdclass.net/aaa.mp4',654,1,46,NULL),
	(12383,'本章课程作业布置',34,7,'xdclass.net/aaa.mp4',654,1,46,NULL),
	(12384,'本章课程作业常见问题和答案解析',35,8,'xdclass.net/aaa.mp4',654,1,46,NULL),
	(12385,'什么是面向对象的编程OOP',36,1,'xdclass.net/aaa.mp4',655,1,46,NULL),
	(12386,'java面向对象中的构造函数和封装',37,2,'xdclass.net/aaa.mp4',655,1,46,NULL),
	(12387,'java面向对象核心关键字this讲解',38,3,'xdclass.net/aaa.mp4',655,1,46,NULL),
	(12388,'java面向对象之继承',39,4,'xdclass.net/aaa.mp4',655,1,46,NULL),
	(12389,'java面向对象编程之继承的super关键词',40,5,'xdclass.net/aaa.mp4',655,1,46,NULL),
	(12390,'java面向对象编程之抽象',41,6,'xdclass.net/aaa.mp4',655,1,46,NULL),
	(12391,'java面向对象编程之接口',42,7,'xdclass.net/aaa.mp4',655,1,46,NULL),
	(12392,'java面向对象编程之instanceOf关键词和多态',43,8,'xdclass.net/aaa.mp4',655,1,46,NULL),
	(12393,'本章课程作业练习题之简单计算器编写',44,9,'xdclass.net/aaa.mp4',655,1,46,NULL),
	(12394,'本章课程作业常见问题和答案解析',45,10,'xdclass.net/aaa.mp4',655,1,46,NULL),
	(12395,'java异常Exception讲解',46,1,'xdclass.net/aaa.mp4',656,1,46,NULL),
	(12396,'java內置异常体系分类和核心方法讲解',47,2,'xdclass.net/aaa.mp4',656,1,46,NULL),
	(12397,'java进阶基础之trycatch异常捕获',48,3,'xdclass.net/aaa.mp4',656,1,46,NULL),
	(12398,'java异常进阶之finally讲解和多重捕获',49,4,'xdclass.net/aaa.mp4',656,1,46,NULL),
	(12399,'Java异常处理之throws-throw关键词',50,5,'xdclass.net/aaa.mp4',656,1,46,NULL),
	(12400,'java进阶基础之自定义异常',51,6,'xdclass.net/aaa.mp4',656,1,46,NULL),
	(12401,'计算机核心基础之大话数据结构',52,1,'xdclass.net/aaa.mp4',657,1,46,NULL),
	(12402,'计算机核心基础之散列表HashTable讲解',53,2,'xdclass.net/aaa.mp4',657,1,46,NULL),
	(12403,'java进阶核心之Collection集合框架概要',54,3,'xdclass.net/aaa.mp4',657,1,46,NULL),
	(12404,'java进阶核心之集合框架List介绍',55,4,'xdclass.net/aaa.mp4',657,1,46,NULL),
	(12405,'Java进阶核心之集合框架Map介绍上集',56,5,'xdclass.net/aaa.mp4',657,1,46,NULL),
	(12406,'java进阶核心之集合框架Map介绍下集',57,6,'xdclass.net/aaa.mp4',657,1,46,NULL),
	(12407,'java进阶核心之集合框架set介绍',58,7,'xdclass.net/aaa.mp4',657,1,46,NULL),
	(12408,'Java集合框架遍历之迭代器(Iterator)',59,1,'xdclass.net/aaa.mp4',658,1,46,NULL),
	(12409,'Java迭代器进阶和注意事项',60,2,'xdclass.net/aaa.mp4',658,1,46,NULL),
	(12410,'Java集合框架之Collections工具类讲解上集',61,3,'xdclass.net/aaa.mp4',658,1,46,NULL),
	(12411,'Java集合框架之Collections工具类讲解下集',62,4,'xdclass.net/aaa.mp4',658,1,46,NULL),
	(12412,'Java集合框架元素排序之Comparable排序接口讲解',63,5,'xdclass.net/aaa.mp4',658,1,46,NULL),
	(12413,'新版JDK之Objects工具类实战',64,6,'xdclass.net/aaa.mp4',658,1,46,NULL),
	(12414,'新版JDK之重写HashCode和Equals实战',65,7,'xdclass.net/aaa.mp4',658,1,46,NULL),
	(12415,'本章课程作业练习题布置',66,8,'xdclass.net/aaa.mp4',658,1,46,NULL),
	(12416,'本章课程作业常见问题和答案解析',67,9,'xdclass.net/aaa.mp4',658,1,46,NULL),
	(12417,'集合框架Collection初步总结',68,10,'xdclass.net/aaa.mp4',658,1,46,NULL),
	(12418,'计算机文件和路径介绍',69,1,'xdclass.net/aaa.mp4',659,1,46,NULL),
	(12419,'java核心知识之File类讲解',70,2,'xdclass.net/aaa.mp4',659,1,46,NULL),
	(12420,'本章课程作业练习题布置',71,3,'xdclass.net/aaa.mp4',659,1,46,NULL),
	(12421,'本章课程作业常见问题和答案解析',72,4,'xdclass.net/aaa.mp4',659,1,46,NULL),
	(12422,'Java核心包java.io包介绍',73,1,'xdclass.net/aaa.mp4',660,1,46,NULL),
	(12423,'Java输入流InputStream讲解',74,2,'xdclass.net/aaa.mp4',660,1,46,NULL),
	(12424,'Java输出流OutputStream讲解',75,3,'xdclass.net/aaa.mp4',660,1,46,NULL),
	(12425,'JavaIO包之缓冲Buffer输入输出流',76,4,'xdclass.net/aaa.mp4',660,1,46,NULL),
	(12426,'缓冲输入输出流之Java文件拷贝实战',77,5,'xdclass.net/aaa.mp4',660,1,46,NULL),
	(12427,'本章课程作业练习题布置',78,6,'xdclass.net/aaa.mp4',660,1,46,NULL),
	(12428,'本章课程作业常见问题和答案解析',79,7,'xdclass.net/aaa.mp4',660,1,46,NULL),
	(12429,'Java字符输入流Reader讲解',80,1,'xdclass.net/aaa.mp4',661,1,46,NULL),
	(12430,'Java字符输出流Writer讲解',81,2,'xdclass.net/aaa.mp4',661,1,46,NULL),
	(12431,'Buffered Reader字符输⼊缓冲流实战',82,3,'xdclass.net/aaa.mp4',661,1,46,NULL),
	(12432,' BufferedWriter字符输出缓冲流实战',83,4,'xdclass.net/aaa.mp4',661,1,46,NULL),
	(12433,'字符流和字节流的桥梁InputStreamReader',84,5,'xdclass.net/aaa.mp4',661,1,46,NULL),
	(12434,'字符流和字节流的桥梁OutputStreamWriter',85,6,'xdclass.net/aaa.mp4',661,1,46,NULL),
	(12435,' JavaIO流内部异常处理',86,7,'xdclass.net/aaa.mp4',661,1,46,NULL),
	(12436,'新版JDK try-with-resource处理IO异常',87,8,'xdclass.net/aaa.mp4',661,1,46,NULL),
	(12437,'Java日期处理类Date详解',88,1,'xdclass.net/aaa.mp4',662,1,46,NULL),
	(12438,'新版JDK8之时间⽇期处理类',89,2,'xdclass.net/aaa.mp4',662,1,46,NULL),
	(12439,'新版JDK8之时间⽇期格式化',90,3,'xdclass.net/aaa.mp4',662,1,46,NULL),
	(12440,'Java顶级对象之Object对象-面试题',91,1,'xdclass.net/aaa.mp4',663,1,46,NULL),
	(12441,'Java基本数学运算之Math类详解',92,2,'xdclass.net/aaa.mp4',663,1,46,NULL),
	(12442,'Java核心字符串String进阶',93,3,'xdclass.net/aaa.mp4',663,1,46,NULL),
	(12443,'java系统类之System类讲解',94,4,'xdclass.net/aaa.mp4',663,1,46,NULL),
	(12444,'基本数据类型的包装数据类型讲解-面试题',95,5,'xdclass.net/aaa.mp4',663,1,46,NULL),
	(12445,'什么是枚举类和使用场景',96,1,'xdclass.net/aaa.mp4',664,1,46,NULL),
	(12446,'Java枚举的常见API的使用',97,2,'xdclass.net/aaa.mp4',664,1,46,NULL),
	(12447,'人工智能问答机器人项目介绍和演示',98,1,'xdclass.net/aaa.mp4',665,1,46,NULL),
	(12448,'网络请求http基础知识讲解',99,2,'xdclass.net/aaa.mp4',665,1,46,NULL),
	(12449,'网络请求核心类URL和URLConnnection',100,3,'xdclass.net/aaa.mp4',665,1,46,NULL),
	(12450,'企业开发主流轻量级的数据交换格式',101,4,'xdclass.net/aaa.mp4',665,1,46,NULL),
	(12451,'JavaSE整合第三方包和JSON开源库介绍',102,5,'xdclass.net/aaa.mp4',665,1,46,NULL),
	(12452,' System.in 和 Scanner实时获取⽤户输⼊',103,1,'xdclass.net/aaa.mp4',666,1,46,NULL),
	(12453,'智能问答API平台介绍',104,2,'xdclass.net/aaa.mp4',666,1,46,NULL),
	(12454,'项目基本框架搭建和模块划分',105,3,'xdclass.net/aaa.mp4',666,1,46,NULL),
	(12455,'智能问答机器人项目Http工具类封装',106,4,'xdclass.net/aaa.mp4',666,1,46,NULL),
	(12456,'智能问答机器人项目service层接口定义',107,5,'xdclass.net/aaa.mp4',666,1,46,NULL),
	(12457,'智能问答机器人项目核心入口类实现',108,6,'xdclass.net/aaa.mp4',666,1,46,NULL),
	(12458,'智能问答机器人项目打包和使用《完结》',109,7,'xdclass.net/aaa.mp4',666,1,46,NULL),
	(12459,'小滴课堂疯狂新版Java系列基础课程总结',110,1,'xdclass.net/aaa.mp4',667,1,46,NULL),
	(12460,'Java高级工程师学习路线',111,2,'xdclass.net/aaa.mp4',667,1,46,NULL),
	(12470,'面向对象及其三大特性',67,1,'xdclass.net/aaa.mp4',484,1,43,NULL),
	(12471,'揭开面向对象神秘的面纱之类和对象',68,2,'xdclass.net/aaa.mp4',484,1,43,NULL),
	(12472,'面向对象中类的构造函数',69,3,'xdclass.net/aaa.mp4',484,1,43,NULL),
	(12473,'面向对象中类变量与实例变量的区别',70,4,'xdclass.net/aaa.mp4',484,1,43,NULL),
	(12474,'面向对象中实例方法与self关键字',71,5,'xdclass.net/aaa.mp4',484,1,43,NULL),
	(12475,'面向对象中类方法与静态方法',72,6,'xdclass.net/aaa.mp4',484,1,43,NULL),
	(12476,'Python中的访问限制',73,7,'xdclass.net/aaa.mp4',484,1,43,NULL),
	(12477,'打破Python中的访问限制',74,8,'xdclass.net/aaa.mp4',484,1,43,NULL),
	(12478,'python中的继承',75,1,'xdclass.net/aaa.mp4',485,1,43,NULL),
	(12479,'高级知识点之super的作用及其用法',76,2,'xdclass.net/aaa.mp4',485,1,43,NULL),
	(12480,'抽象方法与多态',77,3,'xdclass.net/aaa.mp4',485,1,43,NULL),
	(12481,'Python中的多重继承',78,4,'xdclass.net/aaa.mp4',485,1,43,NULL),
	(12482,'多重继承所带来的问题',79,5,'xdclass.net/aaa.mp4',485,1,43,NULL),
	(12483,'核心知识点之枚举类',80,6,'xdclass.net/aaa.mp4',485,1,43,NULL),
	(12484,'初识socket',81,1,'xdclass.net/aaa.mp4',486,1,43,NULL),
	(12485,'基于UDP实现客户端与服务端通信',82,2,'xdclass.net/aaa.mp4',486,1,43,NULL),
	(12486,'基于TCP实现客户端与服务端通信',83,3,'xdclass.net/aaa.mp4',486,1,43,NULL),
	(12487,'课后作业解答',84,4,'xdclass.net/aaa.mp4',486,1,43,NULL),
	(12488,'使用requests模块发送http请求',85,5,'xdclass.net/aaa.mp4',486,1,43,NULL),
	(12590,'node.js课程介绍及案例演示',1,1,'xdclass.net/aaa.mp4',710,0,47,NULL),
	(12591,'nodejs环境安装配置',2,2,'xdclass.net/aaa.mp4',710,0,47,NULL),
	(12592,'vscode编辑器和插件安装',3,3,'xdclass.net/aaa.mp4',710,0,47,NULL),
	(12593,'初建NodeJs应用及调试',4,4,'xdclass.net/aaa.mp4',710,1,47,NULL),
	(12594,'深入理解commonjs模块规范',5,5,'xdclass.net/aaa.mp4',710,1,47,NULL),
	(12595,'Buffer缓冲器常用api(一)',6,1,'xdclass.net/aaa.mp4',711,1,47,NULL),
	(12596,'Buffer缓冲器常用api(二)',7,2,'xdclass.net/aaa.mp4',711,1,47,NULL),
	(12597,'node.js文件系统模块常用api操作',8,3,'xdclass.net/aaa.mp4',711,1,47,NULL),
	(12598,'node.js文件系统模块常用api操作',9,4,'xdclass.net/aaa.mp4',711,1,47,NULL),
	(12599,'核心知识之文件流讲解',10,5,'xdclass.net/aaa.mp4',711,1,47,NULL),
	(12600,'基础模块path常用api',11,6,'xdclass.net/aaa.mp4',711,1,47,NULL),
	(12601,'深度讲解node.js事件触发器',12,7,'xdclass.net/aaa.mp4',711,1,47,NULL),
	(12602,'核心模块util常用工具',13,8,'xdclass.net/aaa.mp4',711,1,47,NULL),
	(12603,'http的发展历史',14,1,'xdclass.net/aaa.mp4',712,1,47,NULL),
	(12604,'走进http之请求方法和响应头信息',15,2,'xdclass.net/aaa.mp4',712,1,47,NULL),
	(12605,'走进http之状态码和content-type',16,3,'xdclass.net/aaa.mp4',712,1,47,NULL),
	(12606,'搭建自己的第一个http服务器',17,4,'xdclass.net/aaa.mp4',712,1,47,NULL),
	(12607,'实战案例之nodejs简易爬虫',18,5,'xdclass.net/aaa.mp4',712,1,47,NULL),
	(12608,'如何处理客户端getpost请求',19,1,'xdclass.net/aaa.mp4',713,1,47,NULL),
	(12609,'nodemon自动重启工具安装配置',20,2,'xdclass.net/aaa.mp4',713,1,47,NULL),
	(12610,'讲解初始化路由及接口开发',21,3,'xdclass.net/aaa.mp4',713,1,47,NULL),
	(12611,'案例实战用户列表增删改查',22,4,'xdclass.net/aaa.mp4',713,1,47,NULL),
	(12612,'教你轻松解决接口跨域问题',23,5,'xdclass.net/aaa.mp4',713,1,47,NULL),
	(12613,'mysql介绍',24,1,'xdclass.net/aaa.mp4',714,1,47,NULL),
	(12614,'开发前准备之mysql数据库设计',25,2,'xdclass.net/aaa.mp4',714,1,47,NULL),
	(12615,'mysql常用数据库操作语句',26,3,'xdclass.net/aaa.mp4',714,1,47,NULL),
	(12616,'NodeJs连接mysql数据库讲解',27,4,'xdclass.net/aaa.mp4',714,1,47,NULL),
	(12617,'深度讲解mysql连接池',28,5,'xdclass.net/aaa.mp4',714,1,47,NULL),
	(12618,'结合数据库改造用户列表接口(增)',29,6,'xdclass.net/aaa.mp4',714,1,47,NULL),
	(12619,'结合数据库改造用户列表接口(删改)',30,7,'xdclass.net/aaa.mp4',714,1,47,NULL),
	(12620,'结合数据库改造用户列表接口(动态查询)',31,8,'xdclass.net/aaa.mp4',714,1,47,NULL),
	(12621,'MongoDB的介绍及安装',32,1,'xdclass.net/aaa.mp4',715,1,47,NULL),
	(12622,'玩转MongoDB可视化工具',33,2,'xdclass.net/aaa.mp4',715,1,47,NULL),
	(12623,'讲解第三方包mongoose的使用',34,3,'xdclass.net/aaa.mp4',715,1,47,NULL),
	(12624,'MongoDB常用数据库操作之创建集合、文档',35,4,'xdclass.net/aaa.mp4',715,1,47,NULL),
	(12625,'讲解MongoDB如何导入文件数据',36,5,'xdclass.net/aaa.mp4',715,1,47,NULL),
	(12626,'MongoDB常用数据库操作之查询文档',37,6,'xdclass.net/aaa.mp4',715,1,47,NULL),
	(12627,'MongoDB常用数据库操作之更新文档',38,7,'xdclass.net/aaa.mp4',715,1,47,NULL),
	(12628,'MongoDB常用数据库操作之删除文档',39,8,'xdclass.net/aaa.mp4',715,1,47,NULL),
	(12629,'深度讲解MongoDB字段验证',40,9,'xdclass.net/aaa.mp4',715,1,47,NULL);


CREATE TABLE `play_record` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `user_id` int(11) DEFAULT NULL,
  `video_id` int(11) DEFAULT NULL,
  `current_num` int(11) DEFAULT NULL COMMENT '当前播放第几集',
  `episode_id` int(11) DEFAULT NULL COMMENT '当前播放第几集视频id',
  `create_time` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;


INSERT INTO `play_record` (`id`, `user_id`, `video_id`, `current_num`, `episode_id`, `create_time`)
VALUES
	(3,12,41,1,11600,'2020-04-17 23:01:48'),
	(4,12,42,1,11690,'2020-04-17 23:01:51'),
	(5,12,43,1,11866,'2020-04-21 08:09:15'),
	(6,12,44,1,12101,'2020-04-21 08:24:47'),
	(7,12,43,1,11866,'2020-04-21 08:34:15'),
	(8,12,44,1,12101,'2020-04-21 08:39:21'),
	(9,14,40,1,11000,'2020-04-21 08:42:08'),
	(10,15,43,1,11866,'2020-04-23 10:35:30'),
	(11,16,45,1,12250,'2020-04-25 02:54:48'),
	(12,17,40,1,11000,'2020-04-26 09:46:10'),
	(13,17,45,1,12250,'2020-04-26 09:46:25'),
	(14,18,40,1,11000,'2020-05-01 20:50:41'),
	(15,18,40,1,11000,'2020-05-01 20:51:50'),
	(16,18,42,1,11690,'2020-05-01 20:52:49'),
	(17,18,43,1,11866,'2020-05-01 21:32:09'),
	(18,18,45,1,12250,'2020-05-01 21:35:51');


CREATE TABLE `user` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(128) DEFAULT NULL COMMENT '昵称',
  `pwd` varchar(124) DEFAULT NULL COMMENT '密码',
  `head_img` varchar(524) DEFAULT NULL COMMENT '头像',
  `phone` varchar(64) DEFAULT '' COMMENT '手机号',
  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `phone` (`phone`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


INSERT INTO `user` (`id`, `name`, `pwd`, `head_img`, `phone`, `create_time`)
VALUES
	(18,'xdclass','202CB962AC59075B964B07152D234B70','https://xd-video-pc-img.oss-cn-beijing.aliyuncs.com/xdclass_pro/default/head_img/14.jpeg','123','2020-04-30 22:44:28');



CREATE TABLE `video` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `title` varchar(524) DEFAULT NULL COMMENT '视频标题',
  `summary` varchar(1026) DEFAULT NULL COMMENT '概述',
  `cover_img` varchar(524) DEFAULT NULL COMMENT '封面图',
  `price` int(11) DEFAULT NULL COMMENT '价格,分',
  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  `point` double(11,2) DEFAULT '8.70' COMMENT '默认8.7,最高10分',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


INSERT INTO `video` (`id`, `title`, `summary`, `cover_img`, `price`, `create_time`, `point`)
VALUES
	(30,'互联网架构之JAVA虚拟机JVM零基础到高级实战','https://xdvideo-file.oss-cn-shenzhen.aliyuncs.com/video/2020/maven/%E8%AF%A6%E6%83%85%E5%9B%BE.png','https://xdvideo-file.oss-cn-shenzhen.aliyuncs.com/video/2020/maven/%E5%AE%98%E7%BD%91%E4%B8%BB%E5%9B%BE-mawen.png',3980,'2021-06-24 22:14:00',9.10),
	(31,'权限框架Shiro+SpringBoot2.x零基础到高级实战','https://xdvideo-file.oss-cn-shenzhen.aliyuncs.com/video/2020/Shiro/%E8%AF%A6%E6%83%85%E5%9B%BE.png','https://xdvideo-file.oss-cn-shenzhen.aliyuncs.com/video/2020/Shiro/%E5%AE%98%E7%BD%91%E4%B8%BB%E5%9B%BE-shiro.png',2980,'2021-06-24 22:14:00',8.90),
	(32,'新版Maven3.5+Nexus私服搭建全套核心技术','https://xdvideo-file.oss-cn-shenzhen.aliyuncs.com/video/2020/maven/%E8%AF%A6%E6%83%85%E5%9B%BE.png','https://xdvideo-file.oss-cn-shenzhen.aliyuncs.com/video/2020/maven/%E5%AE%98%E7%BD%91%E4%B8%BB%E5%9B%BE-mawen.png',1980,'2021-03-04 22:14:00',8.90),
	(33,'JavaScript核心基础到进阶之路','https://xdvideo-file.oss-cn-shenzhen.aliyuncs.com/video/2020/javascript/%E8%AF%A6%E6%83%85%E5%9B%BE.png','https://xdvideo-file.oss-cn-shenzhen.aliyuncs.com/video/2020/javascript/%E5%AE%98%E7%BD%91%E4%B8%BB%E5%9B%BE-JavaScript.png',2980,'2021-03-04 22:14:00',8.80),
	(34,'HTML5+CSS3前端开发教程flex布局项目实战','https://xdvideo-file.oss-cn-shenzhen.aliyuncs.com/video/2020/HTML5%2BCSS3/%E8%AF%A6%E6%83%85%E5%9B%BE.jpeg','https://xdvideo-file.oss-cn-shenzhen.aliyuncs.com/video/2020/HTML5%2BCSS3/%E5%AE%98%E7%BD%91%E4%B8%BB%E5%9B%BE-HTML5%2BCSS3-flex.png',3980,'2021-07-04 22:14:00',8.80),
	(35,'HTML5+CSS3电商项目综合实战','https://xdvideo-file.oss-cn-shenzhen.aliyuncs.com/video/2020/Html5%2Bcss3%2Bjs%E7%94%B5%E5%95%86%E7%BB%BC%E5%90%88%E9%A1%B9%E7%9B%AE%E5%AE%9E%E6%88%98/%E8%AF%A6%E6%83%85%E5%9B%BE.png','https://xdvideo-file.oss-cn-shenzhen.aliyuncs.com/video/2020/Html5%2Bcss3%2Bjs%E7%94%B5%E5%95%86%E7%BB%BC%E5%90%88%E9%A1%B9%E7%9B%AE%E5%AE%9E%E6%88%98/%E5%AE%98%E7%BD%91%E4%B8%BB%E5%9B%BE-HTML5%2BCSS3.png',3980,'2021-08-04 22:14:00',8.70),
	(36,'20年录制ES6教程ES7ES8实战应用','https://xdvideo-file.oss-cn-shenzhen.aliyuncs.com/video/2020/ES6/%E8%AF%A6%E6%83%85%E5%9B%BE.jpeg','https://xdvideo-file.oss-cn-shenzhen.aliyuncs.com/video/2020/ES6/%E5%AE%98%E7%BD%91%E4%B8%BB%E5%9B%BE-es6.png',3980,'2021-08-04 22:14:00',8.70),
	(37,'20年微服务Dubbo+SpringBoot2.X优惠券项目实战','https://xdvideo-file.oss-cn-shenzhen.aliyuncs.com/video/2020/Springboot%E5%BE%AE%E6%9C%8D%E5%8A%A1%E4%BC%98%E6%83%A0%E5%88%B8%E7%B3%BB%E7%BB%9F%E5%AE%9E%E6%88%98/%E8%AF%A6%E6%83%85%E5%9B%BE.png','https://xdvideo-file.oss-cn-shenzhen.aliyuncs.com/video/2020/Springboot%E5%BE%AE%E6%9C%8D%E5%8A%A1%E4%BC%98%E6%83%A0%E5%88%B8%E7%B3%BB%E7%BB%9F%E5%AE%9E%E6%88%98/%E5%AE%98%E7%BD%91%E4%B8%BB%E5%9B%BE-Springboot.png',14880,'2021-08-07 22:14:00',9.10),
	(38,'20年Linux/Centos7视频教程零基础入门到高实战','https://xdvideo-file.oss-cn-shenzhen.aliyuncs.com/video/2020/Linux/%E8%AF%A6%E6%83%85%E5%9B%BE.png','https://file.xdclass.net/video/2020/Linux/gw-linux.png',3980,'2021-08-17 22:14:00',9.10),
	(39,'20年全新React零基础到单页面项目实战','https://xdvideo-file.oss-cn-shenzhen.aliyuncs.com/video/2020/React/%E8%AF%A6%E6%83%85%E5%9B%BE.png','https://file.xdclass.net/video/2020/React/%E5%AE%98%E7%BD%91%E4%B8%BB%E5%9B%BE-react.png',6980,'2021-08-17 22:14:00',9.10),
	(40,'全新微信小程序零基础到项目实战','https://xdvideo-file.oss-cn-shenzhen.aliyuncs.com/video/2020/%E5%BE%AE%E4%BF%A1%E5%B0%8F%E7%A8%8B%E5%BA%8F/%E8%AF%A6%E6%83%85%E5%9B%BE.png','https://xdvideo-file.oss-cn-shenzhen.aliyuncs.com/video/2020/%E5%BE%AE%E4%BF%A1%E5%B0%8F%E7%A8%8B%E5%BA%8F/%E5%AE%98%E7%BD%91%E4%B8%BB%E5%9B%BE-%E5%B0%8F%E7%A8%8B%E5%BA%8F.png',5980,'2021-01-18 22:14:00',9.10),
	(41,'玩转搜索框架ElasticSearch7.x实战','https://xd-video-pc-img.oss-cn-beijing.aliyuncs.com/xdclass_pro/video/2019_backend/elasticsearch7_detail.jpeg','https://xd-video-pc-img.oss-cn-beijing.aliyuncs.com/xdclass_pro/video/2019_backend/elasticsearch7.png',4880,'2021-01-10 22:14:00',8.70),
	(42,'全新elementUI项目实战教程Vue整合Echarts后台权限','https://xdvideo-file.oss-cn-shenzhen.aliyuncs.com/video/2020/Element/%E8%AF%A6%E6%83%85%E5%9B%BE.png','https://file.xdclass.net/video/2020/Element/%E5%AE%98%E7%BD%91%E4%B8%BB%E5%9B%BE-elemenui.png',5980,'2021-01-10 22:14:00',8.70),
	(43,'20年Python3.7零基础入门到爬虫实战','https://file.xdclass.net/video/2020/Python/%E8%AF%A6%E6%83%85%E5%9B%BE.png','https://file.xdclass.net/video/2020/Python/gw-python.png',3980,'2021-01-10 22:14:00',8.90),
	(44,'2020版全新JDK8~JDK13全套新特性教程','https://xdvideo-file.oss-cn-shenzhen.aliyuncs.com/video/2020/JDK8/%E8%AF%A6%E6%83%85%E5%9B%BE.png','https://file.xdclass.net/video/2020/JDK8/%E5%AE%98%E7%BD%91%E4%B8%BB%E5%9B%BE-JDK.png',3980,'2021-01-10 22:14:00',9.30),
	(45,'Docker实战视频教程入门到高级dockerfile/compose-Harbor','https://xdvideo-file.oss-cn-shenzhen.aliyuncs.com/video/2020/Docker/%E8%AF%A6%E6%83%85%E5%9B%BE.jpeg','https://xdvideo-file.oss-cn-shenzhen.aliyuncs.com/video/2020/Docker/%E5%AE%98%E7%BD%91%E4%B8%BB%E5%9B%BE-docker.png',5980,'2021-01-10 22:14:00',9.30),
	(46,'新版javase零基础到高级教程小白自学编程','https://xdvideo-file.oss-cn-shenzhen.aliyuncs.com/video/2020/%E6%96%B0%E7%89%88javase/%E8%AF%A6%E6%83%85%E5%9B%BE.png','https://file.xdclass.net/video/2020/%E6%96%B0%E7%89%88javase/%E5%AE%98%E7%BD%91%E4%B8%BB%E5%9B%BE-javase.png',3980,'2021-01-24 22:14:00',8.80),
	(47,'Nodejs教程零基础入门到项目实战前端视频教程','https://xdvideo-file.oss-cn-shenzhen.aliyuncs.com/video/2020/node/%E5%AE%98%E7%BD%91%E8%AF%A6%E6%83%85%E5%9B%BE-node.png','https://xdvideo-file.oss-cn-shenzhen.aliyuncs.com/video/2020/node/%E5%AE%98%E7%BD%91%E4%B8%BB%E5%9B%BE-node.png',6980,'2021-01-24 22:14:00',8.90);


CREATE TABLE `video_banner` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `url` varchar(256) DEFAULT NULL COMMENT '跳转地址',
  `img` varchar(256) DEFAULT NULL COMMENT '图片地址',
  `create_time` datetime DEFAULT NULL,
  `weight` int(11) DEFAULT NULL COMMENT '数字越小排越前',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;


INSERT INTO `video_banner` (`id`, `url`, `img`, `create_time`, `weight`)
VALUES
	(1,'https://m.xdclass.net/#/coursedetail?video_id=49','https://file.xdclass.net/video/2020/%E9%9D%A2%E8%AF%95%E4%B8%93%E9%A2%98/%E9%9D%A2%E8%AF%95%E4%B8%93%E9%A2%98%E7%AC%AC%E4%B8%80%E5%AD%A3banner.png','2021-01-01 09:10:10',9),
	(2,'https://m.xdclass.net/#/member','https://file.xdclass.net/video/%E5%AE%98%E7%BD%91%E8%BD%AE%E6%92%AD%E5%9B%BE/%E8%BD%AE%E6%92%AD%E5%9B%BE-VIP.png','2021-11-01 09:10:10',1),
	(3,'https://m.xdclass.net/#/coursedetail?video_id=48','https://file.xdclass.net/video/2020/c%E8%AF%AD%E8%A8%80/WechatIMG5.png','2021-12-01 09:10:10',3),
	(4,'https://m.xdclass.net/#/coursedetail?video_id=47','https://file.xdclass.net/video/2020/node/node_banner.png','2021-01-01 20:10:10',4);



CREATE TABLE `video_order` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `out_trade_no` varchar(64) DEFAULT NULL COMMENT '订单唯一标识',
  `state` int(11) DEFAULT NULL COMMENT '0表示未支付,1表示已支付',
  `create_time` datetime DEFAULT NULL COMMENT '订单生成时间',
  `total_fee` int(11) DEFAULT NULL COMMENT '支付金额,单位分',
  `video_id` int(11) DEFAULT NULL COMMENT '视频主键',
  `video_title` varchar(256) DEFAULT NULL COMMENT '视频标题',
  `video_img` varchar(256) DEFAULT NULL COMMENT '视频图片',
  `user_id` int(12) DEFAULT NULL COMMENT '用户id',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `video_order` (`id`, `out_trade_no`, `state`, `create_time`, `total_fee`, `video_id`, `video_title`, `video_img`, `user_id`)
VALUES
	(38,'e21f9994-8054-4760-b37d-dbc24c5883c6',1,'2020-05-01 21:35:51',5980,45,'Docker实战视频教程入门到高级dockerfile/compose-Harbor','https://xdvideo-file.oss-cn-shenzhen.aliyuncs.com/video/2020/Docker/%E5%AE%98%E7%BD%91%E4%B8%BB%E5%9B%BE-docker.png',18);

二、项目环境搭建

1.创建项目

在线创建:https://start.spring.io/

2.在pom.xml中添加依赖

复制代码
<!--springboot核心包-->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
			<exclusions>
				<exclusion>
					<groupId>org.junit.vintage</groupId>
					<artifactId>junit-vintage-engine</artifactId>
				</exclusion>
			</exclusions>
		</dependency>


<!--mybatis依赖-->
		<dependency>
			<groupId>org.mybatis.spring.boot</groupId>
			<artifactId>mybatis-spring-boot-starter</artifactId>
			<version>2.1.2</version>
		</dependency>

<!--mysql驱动-->
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
		</dependency>


<!--通用工具包-->
		<dependency>
			<groupId>org.apache.commons</groupId>
			<artifactId>commons-lang3</artifactId>
			<version>3.9</version>
		</dependency>


		<!-- JWT相关 -->
		<dependency>
			<groupId>io.jsonwebtoken</groupId>
			<artifactId>jjwt</artifactId>
			<version>0.7.0</version>
		</dependency>


		<!--guava依赖包-->
		<dependency>
			<groupId>com.google.guava</groupId>
			<artifactId>guava</artifactId>
			<version>19.0</version>
		</dependency>


		<!--热部署相关:在运行时更新Java类文件,而不需要重新启动应用-->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-devtools</artifactId>
			<optional>true</optional>
		</dependency>
<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
				<configuration>
					<fork>true</fork><!--必须添加这个配置-->
				</configuration>
			</plugin>
		</plugins>
	</build>

实现热部署idea配置

3.配置数据库连接

创建配置文件:通过mybatis实现,添加数据库信息配置,有两种类型,yml格式和properties格式

xx.yml

YAML(Yet Another Markup Language)

写 YAML 用空格 Space 缩进表示分层,不同层次之间的缩进可以使用不同的空格数目;

key后面的冒号,后面一定要跟一个空格,树状结构

xx.properties(推荐)

Key=Value格式

语法简单,不容易出错

官方文档配置

https://docs.spring.io/spring-boot/docs/2.3.0.BUILD-SNAPSHOT/reference/htmlsingle/#core-properties

如果需要修改,直接复制对应的配置文件加到application.properties里面

application.properties

复制代码
server.port=8081

#==============================数据库相关配置========================================
spring.datasource.driver-class-name =com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/online_education?serverTimezone=Asia/Shanghai&characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=123

#使用阿里巴巴druid数据源,默认使用自带的
#spring.datasource.type =com.alibaba.druid.pool.DruidDataSource
#开启控制台打印sql
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

# mybatis 下划线转驼峰配置,两者都可以
#mybatis.configuration.mapUnderscoreToCamelCase=true
mybatis.configuration.map-underscore-to-camel-case=true
#配置扫描
mybatis.mapper-locations=classpath:mapper/*.xml

#配置xml的结果别名
mybatis.type-aliases-package=net.xdclass.online_xdclass.model.entity

4.状态码的封装

在utils下创建工具类

JsonData:规范运行返回结果

复制代码
package net.xdclass.online_xdclass.utils;

public class JsonData {

    /**
     * 状态码 0表示成功过,1表示处理中,-1 表示失败
     */
    private Integer code;

    /**
     * 业务数据
     */
    private Object data;

    /**
     * 信息表示
     */
    private String msg;

    public  JsonData(){}

    public  JsonData(Integer code, Object data, String msg){
        this.code = code;
        this.data = data;
        this.msg = msg;
    }


    /**
     * 成功,不用返回数据
     * @return
     */
    public static JsonData buildSuccess(){
        return new JsonData(0,null,null);
    }

    /**
     * 成功,返回数据
     * @param data
     * @return
     */
    public static JsonData buildSuccess(Object data){
        return new JsonData(0,data,null);
    }


    /**
     * 失败,固定状态码
     * @param msg
     * @return
     */
    public static JsonData buildError(String  msg){
        return new JsonData(-1 ,null,msg);
    }


    /**
     * 失败,自定义错误码和信息
     * @param code
     * @param msg
     * @return
     */
    public static JsonData buildError(Integer code , String  msg){
        return new JsonData(code ,null,msg);
    }


    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public Object getData() {
        return data;
    }

    public void setData(Object data) {
        this.data = data;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }
}

5.开发自定义异常

对异常进行封装处理:可实现统一的错误页面

在exception包下

创建自定义异常类-XDException

复制代码
package net.xdclass.online_xdclass.exception;

/**
 * 自定义异常类
 */
public class XDException extends RuntimeException{

    private Integer code;

    private String msg;

    public XDException(Integer code, String msg){
        this.code = code;
        this.msg = msg;
    }

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;

    }
}

创建异常处理类-CustomExceptionHandler

通过注解进行标注,对指定异常进行捕获处理

复制代码
package net.xdclass.online_xdclass.exception;


import net.xdclass.online_xdclass.utils.JsonData;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * 异常处理类
 */
@ControllerAdvice//全局异常处理类
public class CustomExceptionHandler {

    //日志记录器
    private final static Logger logger = LoggerFactory.getLogger(CustomExceptionHandler.class);

    @ExceptionHandler(value = Exception.class)//捕获指定异常
    @ResponseBody//返回json数据
    public JsonData handle(Exception e){

        logger.error("[ 系统异常 ]{}",e.getMessage());

        if( e instanceof XDException ){

            XDException xdException = (XDException) e;

            return JsonData.buildError(xdException.getCode(),xdException.getMsg());

        }else {

            return JsonData.buildError("全局异常,未知错误");

        }


    }

}

6.密码加密

为了防止密码被爆破,在utils包下添加

CommonUtils:MD5加密工具类

复制代码
package net.xdclass.online_xdclass.utils;

import java.security.MessageDigest;

/**
 * 工具类
 */
public class CommonUtils {


    /**
     * MD5加密工具类
     * @param data
     * @return
     */
    public static String MD5(String data)  {
        try {
            java.security.MessageDigest md = MessageDigest.getInstance("MD5");
            byte[] array = md.digest(data.getBytes("UTF-8"));
            StringBuilder sb = new StringBuilder();
            for (byte item : array) {
                sb.append(Integer.toHexString((item & 0xFF) | 0x100).substring(1, 3));
            }

            return sb.toString().toUpperCase();
        } catch (Exception exception) {
        }
        return null;

    }

}

7.规范时间格式展示

需要对api接口协议和日期格式进行调整,对实体层进行添加注解实现。

通过@JsonProperty统一输出格式,驼峰转下划线;通过@JsonFormat格式化日期

复制代码
package net.xdclass.online_xdclass.model.entity;

import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;

import java.util.Date;

/**
 * `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
 *   `name` varchar(128) DEFAULT NULL COMMENT '昵称',
 *   `pwd` varchar(124) DEFAULT NULL COMMENT '密码',
 *   `head_img` varchar(524) DEFAULT NULL COMMENT '头像',
 *   `phone` varchar(64) DEFAULT '' COMMENT '手机号',
 *   `create_time` datetime DEFAULT NULL COMMENT '创建时间',
 */
public class User {

    private Integer id;

    private String name;

    @JsonIgnore//配置json数据的忽略字段,如果不配置,默认返回
    private String pwd;

    @JsonProperty("head_img")//配置json数据的字段名,如果不配置,默认使用属性名
    private String headImg;

    private String phone;

    @JsonProperty("create_time")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")//配置json数据的时间格式,如果不配置,默认使用时间戳
    private Date createTime;


    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", pwd='" + pwd + '\'' +
                ", headImg='" + headImg + '\'' +
                ", phone='" + phone + '\'' +
                ", createTime=" + createTime +
                '}';
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPwd() {
        return pwd;
    }

    public void setPwd(String pwd) {
        this.pwd = pwd;
    }

    public String getHeadImg() {
        return headImg;
    }

    public void setHeadImg(String headImg) {
        this.headImg = headImg;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public Date getCreateTime() {
        return createTime;
    }

    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }
}

8.添加Guava本地缓存

  • 缓存:使程序不必去数据库或者其他持久化设备中查询,直接在内存中调用对象,从而提高性能。
  • 类别:DNS缓存、前端缓存、代理服务器缓存Nginx、应用程序缓存(本地缓存、分布式缓存)、数据库缓存
  • 分布式缓存:应用分离的缓存组件或服务,常见的有 Redis、Memcached。
  • 本地缓存:和业务程序一起的缓存,常见的有myabtis的一级或者二级缓存、框架本身的缓存、 redis本地单机服务、ehchche、guava cache,访问速度快,但是不能在多个节点共享。

参考的github地址:https://github.com/google/guava/wiki/CachesExplained

在pom.xml中添加依赖

在utils下添加api封装工具类

BaseCache

复制代码
package net.xdclass.online_xdclass.utils;

import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import org.springframework.stereotype.Component;

import java.util.concurrent.TimeUnit;

@Component
public class BaseCache {



    private Cache<String,Object> tenMinuteCache = CacheBuilder.newBuilder()

            //设置缓存初始大小,应该合理设置,后续会扩容
            .initialCapacity(10)
            //最大值
            .maximumSize(100)
            //并发数设置
            .concurrencyLevel(5)

            //缓存过期时间,写入后10分钟过期
            .expireAfterWrite(600,TimeUnit.SECONDS)

            //统计缓存命中率
            .recordStats()

            .build();





    private Cache<String,Object> oneHourCache = CacheBuilder.newBuilder()

            //设置缓存初始大小,应该合理设置,后续会扩容
            .initialCapacity(30)
            //最大值
            .maximumSize(100)
            //并发数设置
            .concurrencyLevel(5)

            //缓存过期时间,写入后1小时 过期
            .expireAfterWrite(3600,TimeUnit.SECONDS)

            //统计缓存命中率
            .recordStats()

            .build();





    public Cache<String, Object> getOneHourCache() {
        return oneHourCache;
    }

    public void setOneHourCache(Cache<String, Object> oneHourCache) {
        this.oneHourCache = oneHourCache;
    }

    public Cache<String, Object> getTenMinuteCache() {
        return tenMinuteCache;
    }

    public void setTenMinuteCache(Cache<String, Object> tenMinuteCache) {
        this.tenMinuteCache = tenMinuteCache;
    }
}

9.JWT

实现通信双方之间以 JSON 对象的形式安全传递信息的工具,其实质是通过一定规范来生成token,然后可以通过解密算法逆向解密token,来获取用户信息。

在utils下添加

复制代码
package net.xdclass.online_xdclass.utils;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import net.xdclass.online_xdclass.model.entity.User;

import java.util.Date;

/**
 * Jwt工具类
 * 注意点:
 * 1、生成的token, 是可以通过base64进行解密出明文信息
 * 2、base64进行解密出明文信息,修改再进行编码,则会解密失败
 * 3、无法作废已颁布的token,除非改秘钥
 */
public class JWTUtils {


    /**
     * 过期时间,一周
     */
    private  static final long EXPIRE = 60000 * 60 * 24 * 7;
    //private  static final long EXPIRE = 1;


    /**
     * 加密秘钥
     */
    private  static final String SECRET = "xdclass.net168";


    /**
     * 令牌前缀
     */
    private  static final String TOKEN_PREFIX = "xdclass";


    /**
     * subject
     */
    private  static final String SUBJECT = "xdclass";


    /**
     * 根据用户信息,生成令牌
     * @param user
     * @return
     */
    public static String geneJsonWebToken(User user){

        String token = Jwts.builder().setSubject(SUBJECT)
                .claim("head_img",user.getHeadImg())
                .claim("id",user.getId())
                .claim("name",user.getName())
                .setIssuedAt(new Date())
                .setExpiration(new Date(System.currentTimeMillis() + EXPIRE))
                .signWith(SignatureAlgorithm.HS256,SECRET).compact();

        token = TOKEN_PREFIX + token;


        return token;
    }


    /**
     * 校验token的方法
     * @param token
     * @return
     */
    public static Claims checkJWT(String token){

        try{

            final  Claims claims = Jwts.parser().setSigningKey(SECRET)
                    .parseClaimsJws(token.replace(TOKEN_PREFIX,"")).getBody();

            return claims;

        }catch (Exception e){
            return null;
        }

    }
}

三、构建项目开发

1.创建项目结构

  • controller:存放控制器的相关代码

  • service:存放业务逻辑代码,再建impl 包存放业务接口或数据访问接口实现类

  • controller-service-dao:也称mapper层,存放数据访问接口

  • domain:存放实体类

  • utils:存放工具类

  • utils-config-interceptor:存放拦截器

规范资源访问路径

/api/v1/pub/AA/BB 这个是不需要登录

/api/v1/pri/AA/BB 这个是需要登录

2.开发实体层和dao层(mapper层)

可以使用mybatis插件实现自动生成这两层,参照以下步骤:

配置数据库连接

生成实体层和dao层

用mybatix插件实现,安装mybatix插件

选中表,右键

调整后的项目结构

具体讲解

如:Video实体类

复制代码
package net.xdclass.online_xdclass.model.entity;

import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonProperty;

import java.util.Date;
import java.util.List;

/**
 *  小滴课堂 视频对象
 *
 *  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
 *   `title` varchar(524) DEFAULT NULL COMMENT '视频标题',
 *   `summary` varchar(1026) DEFAULT NULL COMMENT '概述',
 *   `cover_img` varchar(524) DEFAULT NULL COMMENT '封面图',
 *   `price` int(11) DEFAULT NULL COMMENT '价格,分',
 *   `create_time` datetime DEFAULT NULL COMMENT '创建时间',
 *   `point` double(11,2) DEFAULT '8.70' COMMENT '默认8.7,最高10分',
 */
public class Video {


    private Integer id;

    private String title;


    private String summary;


    private String coverImg;

    private Integer  price;


    private Date createTime;


    private Double point;


    private List<Chapter> chapterList;


    public List<Chapter> getChapterList() {
        return chapterList;
    }

    public void setChapterList(List<Chapter> chapterList) {
        this.chapterList = chapterList;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getSummary() {
        return summary;
    }

    public void setSummary(String summary) {
        this.summary = summary;
    }

    public String getCoverImg() {
        return coverImg;
    }

    public void setCoverImg(String coverImg) {
        this.coverImg = coverImg;
    }

    public Integer getPrice() {
        return price;
    }

    public void setPrice(Integer price) {
        this.price = price;
    }

    public Date getCreateTime() {
        return createTime;
    }

    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }

    public Double getPoint() {
        return point;
    }

    public void setPoint(Double point) {
        this.point = point;
    }

    @Override
    public String toString() {
        return "Video{" +
                "id=" + id +
                ", title='" + title + '\'' +
                ", summary='" + summary + '\'' +
                ", coverImg='" + coverImg + '\'' +
                ", price=" + price +
                ", createTime=" + createTime +
                ", point=" + point +
                '}';
    }
}

开发数据库接口层:

创建xml文件:存放sql语句

复制代码
<?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="net.xdclass.online_xdclass.mapper.VideoMapper">



    <select id="listVideo" resultType="Video">

        select * from video

    </select>


    <select id="findById" resultType="Video">
                select * from video where id=#{video_id}
    </select>

    <select id="listVideoBanner" resultType="VideoBanner">

        select  * from video_banner order by weight asc

    </select>



    <resultMap id="VideoDetailResultMap" type="Video">

        <id column="id" jdbcType="INTEGER" property="id"/>

        <result column="title" jdbcType="VARCHAR" property="title"/>
        <result column="summary" jdbcType="VARCHAR" property="summary"/>
        <result column="cover_img" jdbcType="VARCHAR" property="coverImg"/>
        <result column="price" jdbcType="INTEGER" property="price"/>
        <result column="point" jdbcType="DOUBLE" property="point"/>
        <result column="create_time" jdbcType="TIMESTAMP" property="createTime"/>


        <collection property="chapterList" ofType="Chapter">
            <id column="chapter_id" jdbcType="INTEGER" property="id"/>
            <result column="chapter_title" jdbcType="VARCHAR" property="title"/>
            <result column="ordered" jdbcType="INTEGER" property="ordered"/>
            <result column="chapter_create_time" jdbcType="TIMESTAMP" property="createTime"/>

            <collection property="episodeList" ofType="Episode">
                <id column="episode_id" jdbcType="INTEGER" property="id"/>
                <result column="num" jdbcType="INTEGER" property="num"/>
                <result column="episode_title" jdbcType="VARCHAR" property="title"/>
                <result column="episode_ordered" jdbcType="INTEGER" property="ordered"/>
                <result column="play_url" jdbcType="VARCHAR" property="playUrl"/>
                <result column="free" jdbcType="INTEGER" property="free"/>
                <result column="episode_create_time" jdbcType="TIMESTAMP" property="createTime"/>
            </collection>

        </collection>
        
    </resultMap>


    <select id="findDetailById" resultMap="VideoDetailResultMap">

        select
        v.id, v.title,v.summary,v.cover_img,v.price,v.point,v.create_time,
        c.id as chapter_id, c.title as chapter_title, c.ordered,c.create_time as chapter_create_time,
        e.id as episode_id,e.num, e.title as episode_title,e.ordered as episode_ordered,e.play_url,e.free,e.create_time as episode_create_time

        from video v

        left join chapter c on v.id=c.video_id

        left join episode e on c.id= e.chapter_id

        where v.id = #{video_id}
        order by c.ordered,e.num asc


    </select>
    

</mapper>

创建mapper接口:数据库访问接口,实现sql映射。

复制代码
package net.xdclass.online_xdclass.mapper;

import net.xdclass.online_xdclass.model.entity.Video;
import net.xdclass.online_xdclass.model.entity.VideoBanner;
import org.apache.ibatis.annotations.Param;

import java.util.List;

public interface VideoMapper{

    /**
     * 查询视频列表
     * @return
     */
    List<Video> listVideo();

    /**
     * 首页轮播图列表
     * @return
     */
    List<VideoBanner> listVideoBanner();

    /**
     * 查询视频详情
     * @param videoId
     * @return
     */
    //注意这里的参数名必须和xml文件中的参数名一致,@Param注解是为属性起一个别名
    Video findDetailById(@Param("video_id") int videoId);

    /**
     * 简单查询视频信息
     * @param videoId
     * @return
     */
    Video findById(@Param("video_id") int videoId);
}

3.开发controller层

VideoController

复制代码
package com.example.classdemo.controller;

import com.example.classdemo.domain.request.LoginRequest;
import com.example.classdemo.service.UserService;
import com.example.classdemo.utils.JsonData;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Map;

@RestController
@RequestMapping("api/v1/pri/user")
public class UserController {
    @Autowired
    UserService userservice;
    //实现用户注册
    @PostMapping("/register")
    public JsonData register(@RequestBody Map<String,String> userInfo){//将前端传来的json数据转化为map,通过@RequestBody注解封装成map对象
        int rows=userservice.save(userInfo);//调用service层的方法实现注册
        return rows==1?JsonData.buildSuccess():JsonData.buildError("注册失败");
    }
    //实现用户登录:前端页面提交数据
    @PostMapping("/login")
    public JsonData login(@RequestBody LoginRequest loginRequest){
        String token=userservice.findUserByPhoneAndPwd(loginRequest.getPhone(),loginRequest.getPwd());
        return token==null?JsonData.buildError("登录失败"):JsonData.buildSuccess(token);
    }

}

4.开发service层

创建service接口:编写业务功能

VideoService

复制代码
package com.example.classdemo.service;

import com.example.classdemo.domain.Video;

import java.util.List;

//操作视频的业务接口:增删改查基本方法
public interface VideoService {
    //查询视频列表
    List<Video> listVideo();
}

创建对应实现类

VideoServiceImpl:重写接口中的方法

复制代码
package com.example.classdemo.service.impl;

import com.example.classdemo.domain.Video;
import com.example.classdemo.mapper.VideoMapper;
import com.example.classdemo.service.VideoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class VideoServiceImpl implements VideoService {
    @Autowired
    private VideoMapper videoMapper;

    public List<Video> listVideo(){
        List<Video> videolist=videoMapper.select();
        if(videolist!=null){
            return videolist;
        }else{
            return null;
        }
    }
}

5.配置启动类

OnlineXdclassApplication类:配置扫描包位置,才能实现将各类注入Spring容器中去

@EnableTransactionManagement开启事务管理

复制代码
package com.example.classdemo;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.transaction.annotation.EnableTransactionManagement;

@SpringBootApplication
@MapperScan("com.example.classdemo.mapper")
@EnableTransactionManagement//开启事务管理
public class ClassDemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(ClassDemoApplication.class, args);
    }

}

6.用postman进行测试

四、个人小结

根据以上配置,大家是可以用Postman来测试到跟我一样的效果的。对于想熟悉MyBatis的原始开发操作,大家可以按照编写实体类--->编写Controller---->编写Service---->编写DAO(Mapper接口)----->编写XML文件,来实现MyBatis的CRUD。

至于用MyBatis插件生成的实体层与Mapper层涉及的陌生语法咱们下篇揭晓,各位看官敬请期待!

相关推荐
@淡 定8 分钟前
Spring Boot 的配置加载顺序
java·spring boot·后端
MaCa .BaKa2 小时前
35-疫苗预约管理系统(微服务)
spring boot·redis·微服务·云原生·架构·springcloud
秋野酱2 小时前
基于 Spring Boot 的银行柜台管理系统设计与实现(源码+文档+部署讲解)
java·spring boot·后端
獨枭2 小时前
Spring Boot 连接 Microsoft SQL Server 实现登录验证
spring boot·后端·microsoft
shanzhizi3 小时前
springboot入门-controller层
java·spring boot·后端
爱的叹息3 小时前
Spring和Spring Boot集成MyBatis的完整对比示例,包含从项目创建到测试的全流程代码
spring boot·spring·mybatis
游王子3 小时前
springboot3 声明式 HTTP 接口
网络·spring boot·网络协议·http
CHQIUU5 小时前
告别手动映射:在 Spring Boot 3 中优雅集成 MapStruct
spring boot·后端·状态模式
XiaoLeisj6 小时前
【设计模式】深入解析代理模式(委托模式):代理模式思想、静态模式和动态模式定义与区别、静态代理模式代码实现
java·spring boot·后端·spring·设计模式·代理模式·委托模式
李少兄6 小时前
解决Spring Boot版本冲突导致的`NoSuchFieldError`
java·spring boot·后端