当前位置: 首页 > 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层涉及的陌生语法咱们下篇揭晓,各位看官敬请期待!  

    相关文章:

    SpringBoot实现的后端开发

    目录 一、设计阶段 1.设计ER图 2.创建数据库表 二、项目环境搭建 1.创建项目 2.在pom.xml中添加依赖 3.配置数据库连接 4.状态码的封装 5.开发自定义异常 6.密码加密 7.规范时间格式展示 8.添加Guava本地缓存 9.JWT 三、构建项目开发 1.创建项目结构 2.开发实…...

    IntelliJ IDEA修改实体类成员变量的名称(引入了该实体类的全部文件也会自动更新变量的名称)

    文章目录 1. 问题引入2. 修改实体类成员变量的名称2.1 鼠标双击要修改的变量2.2 按下SHIFT F6快捷键 更多 IntelliJ IDEA 的使用技巧可以查看 IntelliJ IDEA 专栏&#xff1a; IntelliJ IDEA 1. 问题引入 在使用IntelliJ IDEA开发项目时&#xff0c;你是否遇到过以下难题 需…...

    Weaviate使用入门:从零搭建向量数据库的完整指南

    一、Weaviate简介与核心优势 Weaviate是一款开源向量搜索引擎&#xff0c;专为存储和检索高维向量数据设计&#xff0c;支持文本、图像等多种媒体类型。其核心功能包括语义搜索、问答提取、分类等&#xff0c;具备以下独特优势&#xff1a; 低延迟&#xff1a;毫秒级响应时间…...

    element ui el-col的高度不一致导致换行

    问题&#xff1a;ell-col的高度不一致导致换行&#xff0c;刷新后审查el-col的高度一致 我这边是el-col写的span超过了24&#xff0c;自行换行&#xff0c;测试发现初次进入里面的高度渲染的不一致&#xff0c;有的是51px有的是51.5px 问题原因分析 Flex布局换行机制 Elemen…...

    Windows 安装 MongoDB 教程

    Windows 安装 MongoDB 教程 MongoDB 是一个开源的 NoSQL 数据库&#xff0c;它使用文档存储模型而不是传统的关系表格。它非常适合需要处理大量数据并且需要高性能、可扩展性的应用场景。下面是如何在 Windows 系统上安装 MongoDB 的详细步骤。 一、准备工作 确保你的 Windo…...

    23种设计模式-行为型模式之观察者模式(Java版本)

    Java 观察者模式&#xff08;Observer Pattern&#xff09;详解 &#x1f9e0; 什么是观察者模式&#xff1f; 观察者模式是一种行为型设计模式&#xff0c;定义对象之间的一种一对多的依赖关系&#xff0c;使得每当一个对象状态发生变化时&#xff0c;所有依赖它的对象都会得…...

    从“拼凑”到“构建”:大语言模型系统设计指南!

    你有没有试过在没有说明书的情况下组装宜家家具?那种手忙脚乱却又充满期待的感觉,和设计大语言模型(LLM)系统时如出一辙。如果没有一个清晰的计划,很容易陷入混乱。我曾经也一头扎进去,满心期待却又手足无措,被网上那些复杂的架构图搞得晕头转向。于是,我坐下来,把它们…...

    云原生--核心组件-容器篇-3-Docker三大核心之--镜像

    1、定义与作用 定义&#xff1a; Docker镜像是一个只读的模板&#xff0c;包含运行应用程序所需的所有内容&#xff0c;包括代码、依赖库、环境变量、配置文件等。简单来说&#xff0c;Docker镜像是一个轻量级、独立、可执行的软件包&#xff0c;它包含了运行某个软件所需的所有…...

    在QML中获取当前时间、IP和位置(基于网络请求)

    目录 引言相关阅读最终效果代码详解1. 基础框架与窗口设置2. IP定位功能实现3. IP获取功能4. 时间更新与应用初始化5. 用户界面布局 总结工程下载 引言 在本文中&#xff0c;我们将探讨如何使用Qt Quick构建一个简单的系统信息显示应用。该应用能够获取当前系统时间、IP地址以…...

    Nuxt3中使用UnoCSS指南

    Nuxt3中使用UnoCSS指南 UnoCSS是一个高度可定制的、原子化CSS引擎&#xff0c;可以轻松集成到Nuxt3项目中。下面介绍如何在Nuxt3中安装和配置UnoCSS。 安装步骤 安装UnoCSS的Nuxt模块&#xff1a; # 使用pnpm pnpm add -D unocss unocss/nuxt# 使用yarn yarn add -D unocss…...

    【计算机网络】TCP的四种拥塞控制算法

    TCP&#xff08;传输控制协议&#xff09;是互联网协议套件中用于在网络中两个主机之间提供可靠、有序和错误检测数据传输的协议。TCP使用拥塞控制机制来避免网络拥塞&#xff0c;确保网络资源的有效利用。以下是TCP中常见的四种拥塞控制算法&#xff1a; 慢启动&#xff08;S…...

    WebAssembly全栈革命:在Rust与JavaScript之间构建高性能桥梁

    一、WASM的全栈渗透图谱 1. 性能临界点的突破 // Rust实现的斐波那契计算 #[wasm_bindgen] pub fn wasm_fib(n: i32) -> i32 {match n {0 > 0,1 > 1,_ > wasm_fib(n-1) wasm_fib(n-2)} }// JavaScript等效实现对比 console.time(js); jsFib(40); // 1024ms cons…...

    深度理解linux系统—— 了解操作系统

    一、冯诺依曼体系结构 现在我们常见的计算机&#xff08;笔记本电脑等&#xff09;和不常见的计算机&#xff08;服务器&#xff09;它们都满足冯诺依曼体系。 我们可以把计算机理解成一个个硬件组成的 输入设备&#xff1a;键盘、鼠标、摄像头、网卡、磁盘等输出设备&#xf…...

    【fork初体验】

    文章目录 Linux 实验&#xff1a;深入理解 fork 系统调用一、实验目的二、实验环境三、实验内容与步骤&#xff08;一&#xff09;打印进程的进程 ID 和父进程 ID1. 编写程序2. 编译与运行3. 运行结果 &#xff08;二&#xff09;使用 fork 系统调用创建进程并加入循环语句1. 编…...

    区块链VS传统数据库:金融数据存储的“信任”与“效率”博弈

    在金融行业数字化转型的浪潮中&#xff0c;数据存储技术选型已成为核心议题。区块链技术凭借其去中心化、不可篡改等特性强势崛起&#xff0c;而传统数据库&#xff08;如关系型数据库MySQL、分布式数据库&#xff09;凭借成熟生态和高效性能仍占据主导地位。如何在两者之间做出…...

    Linux渗透测试

    Linux渗透测试 比赛题库-Linux渗透测试 文章目录 Linux渗透测试比赛题库-Linux渗透测试 前言一、解题过程1.通过本地PC中渗透测试平台Kali对靶机场景进行系统服务及版本扫描渗透测试&#xff0c;并将该操作显示结果中Apache服务对应的版本信息字符串作为Flag值提交&#xff1b…...

    ORA-02069错误排查实录:从 Database Link 到 Global Names 的陷阱

    文章目录 错误重现根因解决方案1.设置GLOBAL_NAMEStrue2.全部业务逻辑放在在远端执行 在日常的 Oracle 数据同步任务中&#xff0c;我们经常透过 Database Link&#xff08;DBLink&#xff09; 进行跨数据库查询与写入。某日&#xff0c;我们在执行一段 INSERT INTO … SELECT …...

    【CF闯关练习】—— 1200分

    &#x1f30f;博客主页&#xff1a;PH_modest的博客主页 &#x1f6a9;当前专栏&#xff1a;cf闯关练习 &#x1f48c;其他专栏&#xff1a; &#x1f534;每日一题 &#x1f7e1; C跬步积累 &#x1f7e2; C语言跬步积累 &#x1f308;座右铭&#xff1a;广积粮&#xff0c;缓…...

    正则表达式三剑客之——grep和sed

    目录 一.grep 1.1定义 1.2核心功能 1.3基本语法 1.4常用选项 二.sed 2.1 定义 2.2 工作原理 2.3 基本语法 2.3.1常用选项 2.3.2sed自身脚本语法 1. 基本组成 2. 地址 3. 命令 2.3.3 sed替换查找 1 基本语法 2.sed替换查找的实例 3.分组后向引用 4 变量调…...

    i18n-ai-translate开源程序,可以使用DeepSeek等模型将您的 i18nJSON翻译成任何语言

    一、软件介绍 文末提供程序和源码下载 i18n-ai-translate开源程序使用 DeepSeek等模型可以将您的 i18n JSON 翻译成任何语言。 无缝翻译本地化文件。支持嵌套翻译文件的目录。需要i18next样式的JSON 文件&#xff08;文末一并提供下载&#xff09;。 二、模式 CSV 模式 三个…...

    关于Android Studio的Gradle各项配置

    Gradle 构建概览 Android 应用通常使用 Gradle 构建系统构建。在深入了解如何配置 build 之前&#xff0c;我们先来探索 build 背后的概念&#xff0c;以便您全面了解系统。 什么是 build&#xff1f; 构建系统会将源代码转换为可执行应用。构建通常涉及多个工具&#xff0c;用…...

    数据安全和合规性市场分析

    一、什么是数据安全和合规性 在数据安全和合规性方面&#xff0c;存在着一系列重要的法律、法规和行业标准&#xff0c;这些规定了组织如何收集、存储、处理和保护个人数据及其他敏感信息。企业之所以要遵守这些规定&#xff0c;是出于多方面的考量&#xff0c;既有法律责任&a…...

    venv环境基础指令以及常见问题汇总(持续更新)

    常见指令 在 Python 原生虚拟环境&#xff08;venv&#xff09; 中&#xff0c;没有直接列出所有虚拟环境的命令&#xff08;因为 venv 不像 Conda 那样有集中管理机制&#xff09;&#xff0c;但可以通过 文件操作 或 脚本 实现类似功能。以下是常用命令和技巧&#xff1a; &…...

    思科路由器重分发(RIP动态路由+静态路由)

    路由器重分发&#xff08;RIP动态路由静态路由&#xff09; 静态路由不能作翻译官 RIP需要宣告自己的ip&#xff1b;还需要帮静态路由也宣告一下开启端口并配置IP地址 RIP路由 Router>en Router#conf t Router(config)#int g0/0 Router(config-if)#no shutdown Router(c…...

    产销协同的作用是什么?又如何对各部门发挥作用?

    目录 一、产销协同的对象有哪些&#xff1f; 1. 客户需求 2. 市场趋势 3. 供应链伙伴 4. 企业战略目标 二、产销协同的作用是什么&#xff1f; 1. 提高客户满意度 2. 降低企业成本 3. 增强市场竞争力 4. 优化资源配置 三、产销协同对各部门怎么发挥作用&#xff1f;…...

    19.【.NET 8 实战--孢子记账--从单体到微服务--转向微服务】--单体转微服务--当前项目拆分规划

    随着业务规模的不断扩大和系统复杂度的提升&#xff0c;孢子记账系统需要进行微服务架构的转型。本文将详细规划从单体应用向微服务架构迁移的具体方案&#xff0c;包括功能模块分析、服务拆分、技术选型以及实施步骤等内容。通过合理的服务拆分和架构设计&#xff0c;未来我们…...

    JFLAP SOFTWARE 编译原理用(自动机绘图)

    csdn全是蛆虫&#xff0c;2mb的软件&#xff0c;都在那里搞收费&#xff0c;我就看不惯&#xff0c;我就放出来&#xff0c;那咋了&#xff01;&#xff01;&#xff01; https://pan.baidu.com/s/1IuEfHScynjCCUF5ScF26KA 通过网盘分享的文件&#xff1a;JFLAP7.1.jar 链接: h…...

    从 Vue 到 React:React 合成事件

    目录 一、什么是 React 合成事件&#xff1f;二、处理流程React 事件系统的大致流程和 Vue 3 的区别 三、用法示例四、SyntheticEvent 的特点五、为什么 React 要统一事件到根节点&#xff1f;1.减少事件监听器数量2. 简化事件解绑逻辑3. 保证一致的行为 六、React 18 后事件系…...

    react的fiber 用法

    在 React 里&#xff0c;Fiber 是 React 16.x 及后续版本采用的协调算法&#xff0c;它把渲染工作分割成多个小任务&#xff0c;让 React 可以在渲染过程中暂停、恢复和复用任务&#xff0c;以此提升渲染性能与响应能力。在实际开发中&#xff0c;你无需直接操作 Fiber 节点&am…...

    深度学习-学习笔记

    文章目录 1、概述2、学习笔记2.1、pytorch 的环境配置 1、概述 本篇博客用来记录我学习深度学习的学习笔记 参考视频&#xff1a;PyTorch深度学习快速入门教程 PyTorch 是一个开源的机器学习框架&#xff0c;主要用于构建和训练深度学习模型。 2、学习笔记 2.1、pytorch 的环…...

    [创业之路-390]:人力资源 - 社会性生命系统的解构与重构:人的角色嬗变与组织进化论

    前言&#xff1a; 人、财、物、信息、机制、流程、制度、方法共同组合了一个持续的消耗资源、持续的价值创造、持续面临生存与发展、遗传与变异的社会性生命系统。 "人"是所有社会性生命系统最最基础性的要素&#xff0c;它弥漫在系统中多维立体空间的不同节点上&am…...

    Redis常见面试题——List对象

    当然可以&#xff01;这里我帮你整理了一份【Redis中 List 结构】相关的高频面试题&#xff0c;并附上简明回答&#xff1a; &#x1f4da; Redis List 结构面试题&#xff08;高频总结版&#xff09; 1. Redis 中的 List 是什么&#xff1f;底层是什么实现的&#xff1f; 答&…...

    案例速成GO操作redis,个人笔记

    更多个人笔记&#xff1a;&#xff08;仅供参考&#xff0c;非盈利&#xff09; gitee&#xff1a; https://gitee.com/harryhack/it_note github&#xff1a; https://github.com/ZHLOVEYY/IT_note 安装redis客户端&#xff1a;go get github.com/redis/go-redis/v9 注意go …...

    什么是WebSocket?NGINX如何支持WebSocket协议?

    大家好&#xff0c;我是锋哥。今天分享关于【什么是WebSocket&#xff1f;NGINX如何支持WebSocket协议&#xff1f;】面试题。希望对大家有帮助&#xff1b; 什么是WebSocket&#xff1f;NGINX如何支持WebSocket协议&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java…...

    ssm驾校预约管理系统的设计与实现(源码+lw+部署文档+讲解),源码可白嫖!

    摘要 伴随着我国社会的发展&#xff0c;人民生活质量日益提高。在人们出行方式上的体现就是&#xff0c;价格较为昂贵的代步工具——汽车&#xff0c;它的拥有率在我国越来越高了。而汽车的行驶速度很快&#xff0c;并且随着汽车拥有率的增加&#xff0c;城市中行驶和停靠的车…...

    babel核心知识点

    Babel 是一个 JavaScript 编译器&#xff0c;主要用于将 ECMAScript 2015 版本的代码转换为向后兼容的 JavaScript 代码&#xff0c;以便在旧版本的浏览器或环境中运行。以下是 Babel 的核心知识点&#xff1a; 1. 基本概念 编译器&#xff1a;Babel 本质上是一个编译器&…...

    学习笔记(算法学习+Maven)

    单调队列优化多重背包 #include <bits/stdc.h> using namespace std; const int M 2010; const int N 20010; int q[N]; int hh 0, tt -1; int f[N]; int g[N]; int v[M], w[M], s[M]; int n, m; int main() { cin >> n >> m; for (int i 1; …...

    买币永续合约成全球交易热点,XBIT去中心化交易所平台显著提升市场流动性

    在全球加密货币市场日益扩大的背景下&#xff0c;买币永续合约正展现出惊人的增长势头。虽然比特币自2021年黄金时期以来整体兴趣有所减弱&#xff0c;但永续合约市场表现亮眼&#xff0c;专业和机构交易者正从传统日历期货转向这一领域&#xff0c;使得永续合约占据了约66%的未…...

    详解 `from datasets import load_dataset`:数据格式、公开数据集与自定义数据集实战指南

    在自然语言处理(NLP)和机器学习领域,Hugging Face 的 datasets 库凭借其高效的数据加载和预处理能力成为开发者必备工具。本文通过代码示例详解 load_dataset 的核心用法,涵盖数据格式解析、公开数据集调用和自定义数据集构建。 一、数据格式解析与加载示例 datasets 库支…...

    Eclipse 插件开发 1

    Eclipse 插件开发 1 1 创建 Eclipse 插件2 特点对比表3 总结对比表 Eclipse 是一个功能强大的集成开发环境(IDE)&#xff0c;最初为 Java 开发设计&#xff0c;但现在已经支持多种语言和平台。它的核心优势在于高度可扩展的插件架构&#xff0c;使开发者能够定制开发环境以满足…...

    单链表专题(1)

    1.什么是链表&#xff1f; 链表是结构体变量与结构体变量连接在一起 2.动态创建一个链表 动态内存申请模块化设计 1.创建链表&#xff08;创建一个表头表示整个链表&#xff09; 2.创建结点 3.插入结点 4.删除结点 5.打印遍历链表&#xff08;测试&#xff09; 3.创建链…...

    [贪心_8] 跳跃游戏 | 单调递增的数字 | 坏了的计算器

    目录 1.跳跃游戏 题解 2.单调递增的数字 证明 3.坏了的计算器 题解 解法一&#xff1a;正向推导 解法二&#xff1a;正难则反 1.跳跃游戏 链接&#xff1a; 55. 跳跃游戏 给你一个非负整数数组 nums &#xff0c;你最初位于数组的 第一个下标 。数组中的每个元素代表你…...

    Python基于Django的全国二手房可视化分析系统【附源码】

    博主介绍&#xff1a;✌Java老徐、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&…...

    Spring Boot 升级指南(2.x → 3.x)

    &#x1f680; Spring Boot 升级指南&#xff08;2.x → 3.x&#xff09; &#x1f522; 1️⃣ 必读文档 &#x1f4d8; 当您需要从 Spring Boot 2.x 升级时&#xff1a; • 官方迁移指南 → https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.0-Migration-…...

    基于亚马逊云科技构建音频转文本无服务器应用程序

    Amazon Transcribe是一项基于机器学习模型自动将语音转换为文本的服务。它提供了多种可以提高文本转录准确性的功能&#xff0c;例如语言自定义、内容过滤、多通道音频分析和说话人语音分割。Amazon Transcribe 可用作独立的转录服务&#xff0c;也可以集成到应用程序中提供语音…...

    io_uring概述:现代 Linux 异步 IO 的新范式

    一、引言 在 Linux 系统中&#xff0c;I/O 性能一直是高性能服务器、数据库、存储系统的关键瓶颈。传统的 I/O 接口&#xff08;如 read、write、poll、epoll&#xff09;已经难以满足现代高吞吐低延迟场景的需求。io_uring 的诞生&#xff0c;正是为了解决这些传统 I/O 模型中…...

    定制一款国密浏览器(12):分析SM2签名算法的实现

    SM2 是一种非对称加密算法,除了用来进行加密解密外,主要作用还用作数字签名。数字签名是私钥签名,公钥用来验签。由于私钥是不公开的,所以私钥签名还可以防抵赖。 一般的签名流程如下: 发送者对消息计算摘要值。发送者用私钥对摘要值进行签名得到签名值。发送者将原始消息…...

    SSE协议

    目录 SSE协议协议实现传输格式data 字段id 字段event 字段retry 字段 前后端实现使用案例FastAPI SSE-STARLETTE 模拟大模型推理流&#x1f5a5; 代码&#xff1a;FastAPI SSE-STARLETTE 模拟大模型推理流 SSE协议 SSE&#xff0c;全称是 Server-Sent Events&#xff0c;是一…...

    精益数据分析(25/126):关键指标驱动业务发展

    精益数据分析&#xff08;25/126&#xff09;&#xff1a;关键指标驱动业务发展 在创业和数据分析的道路上&#xff0c;我们都在不断探索如何利用数据实现业务的增长与优化。今天&#xff0c;让我们一起深入学习《精益数据分析》中的关键知识点&#xff0c;通过实际案例来理解…...

    基于Spring AI Alibaba + Spring Boot + Ollama搭建本地AI对话机器人API

    前言 Spring AI Alibaba 开源项目基于 Spring AI 构建&#xff0c;是阿里云通义系列模型及服务在 Java AI 应用开发领域的最佳实践&#xff0c;提供高层次的 AI API 抽象与云原生基础设施集成方案&#xff0c;帮助开发者快速构建 AI 应用。 项目地址 gitcode平台&#xff1a;ht…...