当前位置: 首页 > news >正文

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;@Overridepublic 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;}@Overridepublic 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">selectv.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_timefrom video vleft join chapter c on v.id=c.video_idleft join episode e on c.id= e.chapter_idwhere 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 {@AutowiredUserService 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 {@Autowiredprivate 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层涉及的陌生语法咱们下篇揭晓,各位看官敬请期待!  

    http://www.xdnf.cn/news/156007.html

    相关文章:

  • Ubuntu20.04 Ollama 配置相关
  • c++初始化数组
  • C语言中位段的应用
  • 【教程】Docker运行gitlab容器
  • 数据结构和算法(八)--2-3查找树
  • 什么时候使用Python 虚拟环境(venv)而不用conda
  • Qt软件开发-摄像头检测使用软件V1.1
  • python 与Redis操作整理
  • 血泪之arduino库文件找不到ArduinoJSON.h: No such file or directory错误原因
  • 学习记录:DAY18
  • AI日报 - 2025年04月26日
  • Yocto项目实战教程-第8章-树莓派启动定制镜像-8.4小节-使用Wic工具创建分区镜像
  • 毕业项目-基于java的入侵检测与防御系统
  • 字节 AI 原生 IDE Trae 发布 v1.3.0,新增 MCP 支持
  • 使用MyBatis注解方式的完整示例,涵盖CRUD、动态SQL、分页、事务管理等场景,并附详细注释和对比表格
  • Java爬虫入门:从网页抓取到数据提取(正则表达式篇)
  • 单例设计模式之懒汉式以及线程安全问题
  • 【计算机视觉】CV项目实战- 深度解析TorchVision_Maskrcnn:基于PyTorch的实例分割实战指南
  • 从“拼凑”到“构建”:大语言模型系统设计指南!
  • 【Vue】Vue3项目创建
  • 美团Java后端二面面经!
  • 【数论分块】数论分块算法模板及真题
  • # 家庭网络IPv6地址的一些知识
  • 思科路由器重分发(静态路由+OSPF动态路由+RIP动态路由)
  • 基于MTF的1D-2D-CNN-BiLSTM-Attention时序图像多模态融合的故障分类识别(Matlab完整源码和数据),适合研究学习,附模型研究报告
  • Leetcode刷题 由浅入深之哈希法——454. 四数相加Ⅱ
  • Logi Options+ 的 Flow:端口信息
  • 驱动开发(1)|鲁班猫rk356x内核编译,及helloworld驱动程序编译
  • 微信小程序核心技术栈
  • ORACLE数据库备份入门:第四部分:2-备份场景举例