在线视频学习
2022-02-25 16:08:03 2 举报
AI智能生成
在线教育项目流程图
作者其他创作
大纲/内容
技术架构
本次项目技术用到了Springboot和Springcloud微服务开发,采用了B2D的开发模式
也就是后台管理员和用户的开发模式。有后台页面和前台页面,后台管理员进行增删改查数据,前台用户负责体验和购买。B2C是一种商业模块,还有一种B2B2C,自营模块,一般电商就是这种模式
本次技术用到了后台管理员登录用到了SpringSecurity进行登录权限管理和角色划分
前台普通用户用到了单点登录auth2的一种解决方案和微信扫码登录
总技术
核心技术:用到了阿里巴巴的Nacos替代SpringCloud注册中心和配置中心
用了第二代服务网关GateWay替代Zull网关,用到了熔断器Hystrix,远程调用用到了
OpenFeign做模块间的调用
第三方技术:
用到了MybatisPlus来简化Mybatis的操作,原因是因为可以自动生成包简化sql语句
用到了阿里巴巴的oss对象存储,来上传文件到阿里云
用到了EasyExcel 进行导入课程分类摸板到数据库,底层重写了POI导入导出操作,简化了POI的操作
用到了阿里巴巴的视频点播进行上传课程视频到阿里云和播放视频
用到了阿里巴巴的短息发送进行普通用户注册手机号发送验证码,redis进行缓存验证码
用阿里云的原因是因为解决服务带宽(用户多了,本地查询文件增加服务带宽压力)问题,和可靠性和安全性以及一致性
HttpClient
(1)发送请求返回响应的工具,不需要浏览器完成请求和响应的过程
(2)应用场景:微信登录获取扫描人信息,微信支付查询支付状态
Cookie
Cookie特点:
* 客户端技术
* 每次发送请求带着cookie值进行发送
* cookie有默认会话级别,关闭浏览器cookie默认不存在了,
* 但是可以设置cookie有效时长 setMaxAge
Git
(1)代码提交到远程Git仓库
Docker+Jenkins
(1)手动打包运行
(2)idea打包
(3)jenkins自动化部署过程
也就是后台管理员和用户的开发模式。有后台页面和前台页面,后台管理员进行增删改查数据,前台用户负责体验和购买。B2C是一种商业模块,还有一种B2B2C,自营模块,一般电商就是这种模式
本次技术用到了后台管理员登录用到了SpringSecurity进行登录权限管理和角色划分
前台普通用户用到了单点登录auth2的一种解决方案和微信扫码登录
总技术
核心技术:用到了阿里巴巴的Nacos替代SpringCloud注册中心和配置中心
用了第二代服务网关GateWay替代Zull网关,用到了熔断器Hystrix,远程调用用到了
OpenFeign做模块间的调用
第三方技术:
用到了MybatisPlus来简化Mybatis的操作,原因是因为可以自动生成包简化sql语句
用到了阿里巴巴的oss对象存储,来上传文件到阿里云
用到了EasyExcel 进行导入课程分类摸板到数据库,底层重写了POI导入导出操作,简化了POI的操作
用到了阿里巴巴的视频点播进行上传课程视频到阿里云和播放视频
用到了阿里巴巴的短息发送进行普通用户注册手机号发送验证码,redis进行缓存验证码
用阿里云的原因是因为解决服务带宽(用户多了,本地查询文件增加服务带宽压力)问题,和可靠性和安全性以及一致性
HttpClient
(1)发送请求返回响应的工具,不需要浏览器完成请求和响应的过程
(2)应用场景:微信登录获取扫描人信息,微信支付查询支付状态
Cookie
Cookie特点:
* 客户端技术
* 每次发送请求带着cookie值进行发送
* cookie有默认会话级别,关闭浏览器cookie默认不存在了,
* 但是可以设置cookie有效时长 setMaxAge
Git
(1)代码提交到远程Git仓库
Docker+Jenkins
(1)手动打包运行
(2)idea打包
(3)jenkins自动化部署过程
技术点
后端
Spring Security
Redis
Redis问题
Redis 是一个高性能的开源的非关系型数据库,数据保存在内存中。是以key-value形式存储
优势:
1.数据保存在内存,存取速度快,并发能力强
2.它支持存储的value类型相对更多(string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合))
3.支持集群(主从同步、负载均衡),支持主从复制,主机会自动将数据同步到从机, 可以进行读写分离。
4.支持持久化,可以将数据保存在硬盘的文件中
使用:
把经常查询的数据,很少修改的数据存放到缓存中,减少访问数据库,降低数据库压力。
通过JedisPool来管理,即通过池来管理,通过池对象获取jedis实例,然 后通过jedis实例直接操作redis服务
创建配置类注入jedisPool
创建jedis工具类引用jedisPool
使用jedisPool获得jedis对象
编写添加缓存和获取缓存等方法
在server层对数据进行缓存
优势:
1.数据保存在内存,存取速度快,并发能力强
2.它支持存储的value类型相对更多(string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合))
3.支持集群(主从同步、负载均衡),支持主从复制,主机会自动将数据同步到从机, 可以进行读写分离。
4.支持持久化,可以将数据保存在硬盘的文件中
使用:
把经常查询的数据,很少修改的数据存放到缓存中,减少访问数据库,降低数据库压力。
通过JedisPool来管理,即通过池来管理,通过池对象获取jedis实例,然 后通过jedis实例直接操作redis服务
创建配置类注入jedisPool
创建jedis工具类引用jedisPool
使用jedisPool获得jedis对象
编写添加缓存和获取缓存等方法
在server层对数据进行缓存
redis高并发问题
缓存穿透
缓存穿透是指查询一个一定不存在的数据,
由于缓存是不命中时被动写的,并且出于容错考虑,
如果从存储层查不到数据则不写入缓存,
这将导致这个不存在的数据每次请求都要到存储层去查询,失去了缓存的意义。
在流量大时,可能DB就挂掉了,要是有人利用不存在的key频繁攻击我们的应用,这就是漏洞。
由于缓存是不命中时被动写的,并且出于容错考虑,
如果从存储层查不到数据则不写入缓存,
这将导致这个不存在的数据每次请求都要到存储层去查询,失去了缓存的意义。
在流量大时,可能DB就挂掉了,要是有人利用不存在的key频繁攻击我们的应用,这就是漏洞。
解决
简单粗暴的方法(我们采用的就是这种),
如果一个查询返回的数据为空(不管是数 据不存在,还是系统故障),
我们仍然把这个空结果进行缓存,但它的过期时间会很短,最长不超过五分钟。
简单粗暴的方法(我们采用的就是这种),
如果一个查询返回的数据为空(不管是数 据不存在,还是系统故障),
我们仍然把这个空结果进行缓存,但它的过期时间会很短,最长不超过五分钟。
缓存雪崩
缓存雪崩是指在我们设置缓存时采用了相同的过期时间,
导致缓存在某一时刻同时失效,请求全部转发到DB,DB瞬时压力过重雪崩。
导致缓存在某一时刻同时失效,请求全部转发到DB,DB瞬时压力过重雪崩。
解决
缓存失效时的雪崩效应对底层系统的冲击非常可怕。
大多数系统设计者考虑用加锁或者队列的方式保证缓存的单线程(
进程)写,从而避免失效时大量的并发请求落到底层存储系统上。
这里分享一个简单方案就时讲缓存失效时间分散开,
比如我们可以在原有的失效时间基础上增加一个随机值,
比如1-5分钟随机,这样每一个缓存的过期时间的重复率就会降低,
就很难引发集体失效的事件。
缓存失效时的雪崩效应对底层系统的冲击非常可怕。
大多数系统设计者考虑用加锁或者队列的方式保证缓存的单线程(
进程)写,从而避免失效时大量的并发请求落到底层存储系统上。
这里分享一个简单方案就时讲缓存失效时间分散开,
比如我们可以在原有的失效时间基础上增加一个随机值,
比如1-5分钟随机,这样每一个缓存的过期时间的重复率就会降低,
就很难引发集体失效的事件。
缓存雪崩
对于一些设置了过期时间的key,如果这些key可能会在某些时间点被超高并发地访问,
是一种非常“热点”的数据。这个时候,需要考虑一个问题:缓存被“击穿”的问题,
这个和缓存雪崩的区别在于这里针对某一key缓存,前者则是很多key。
缓存在某个时间点过期的时候,
恰好在这个时间点对这个Key有大量的并发请求过来,
这些请求发现缓存过期一般都会从后端DB加载数据并回设到缓存,
这个时候大并发的请求可能会瞬间把后端DB压垮。
是一种非常“热点”的数据。这个时候,需要考虑一个问题:缓存被“击穿”的问题,
这个和缓存雪崩的区别在于这里针对某一key缓存,前者则是很多key。
缓存在某个时间点过期的时候,
恰好在这个时间点对这个Key有大量的并发请求过来,
这些请求发现缓存过期一般都会从后端DB加载数据并回设到缓存,
这个时候大并发的请求可能会瞬间把后端DB压垮。
解决
(1) 从redis上看,确实没有设置过期时间,
这就保证了,不会出现热点key过期问题,也就是“物理”不过期。
(2) 从功能上看,如果不过期,那不就成静态的了吗?
所以我们把过期时间存在key对应的value里,如果发现要过期了,
通过一个后台的异步线程进行缓存的构建,也就是“逻辑”过期
(1) 从redis上看,确实没有设置过期时间,
这就保证了,不会出现热点key过期问题,也就是“物理”不过期。
(2) 从功能上看,如果不过期,那不就成静态的了吗?
所以我们把过期时间存在key对应的value里,如果发现要过期了,
通过一个后台的异步线程进行缓存的构建,也就是“逻辑”过期
Nginx
OAuth2+JWT
HttpClient
Cookie
Git
SpringCloud
服务注册与发现
Nacos
配置中心
Nacos
API网关
SpringCloud Gateway
熔断限流
Hystrix
服务调用
Ribbon
OpenFeign
自动化部署
Jenkins
Docker
MybatisPlus
前端
Vue+Element
nodejs
NPM
Babel
Nuxt
Echarts
项目背景
业务概况
后台管理员
管理员登录
注销操作
清空token过期时间
登录操作
管理员登录操作,进行登录,登录后台接口根据登录的管理员查询相应权限给他
所以我们选择基于token的形式进行授权与认证,
用户根据用户名密码认证成功,然后获取当前用户角色的一系列权限值,并以用户名为key,
权限列表为value的形式存入redis缓存中,根据用户名相关信息生成token返回,浏览器将token记录到cookie中,
每次调用api接口都默认将token携带到header请求头中,Spring-security解析header头获取token信息,
解析token获取当前用户名,根据用户名就可以从redis中获取权限列表,
这样Spring-security就能够判断当前请求是否有权限访问
所以我们选择基于token的形式进行授权与认证,
用户根据用户名密码认证成功,然后获取当前用户角色的一系列权限值,并以用户名为key,
权限列表为value的形式存入redis缓存中,根据用户名相关信息生成token返回,浏览器将token记录到cookie中,
每次调用api接口都默认将token携带到header请求头中,Spring-security解析header头获取token信息,
解析token获取当前用户名,根据用户名就可以从redis中获取权限列表,
这样Spring-security就能够判断当前请求是否有权限访问
权限管理
用户管理
管理后台登录用户进行增删改查
角色管理
进行登录用户角色管理进行分配角色和增删改查
菜单管理
增删改查模块菜单和对登录用户按照角色进行授权菜单
讲师管理
讲师列表
进行删改查操作
添加讲师
利用阿里云对象存储进行上传讲师图片到阿里云
课程分类
分类列表
按照一二级分类进行查询课程分类列表,后台利用规定json格式进行前端页面的显示操作。
导入分类
利用了用到了EasyExcel 进行导入课程分类摸板到数据库,底 层重写了POI导入导出操作,简化了POI的操作,点击导入可以放入Excel文档吧课程分类导入到数据库,后端接口按照一行一行进行读取表格数据,利用工具继承阿里巴巴的导入的方法AnalysisEventListener,利用里面的一个方法判断表格是否有数据,然后进行导入,导入时判断数据库是否有重复数据,没有才能导入
课程管理(核心)
课程列表
增删改查课程列表
发布课程
发布课程有三个步骤,添加课程,添加小节,最终发布
添加课程时,利用阿里巴巴的对象存储进行上传课程图片到阿里云,添加小节,第二部操作,为课程添加小节利用到了阿里巴巴视频点播上传视频到阿里云,然后获取阿里云视频的id和课程信息添加到数据库,最终发布,更改课程数据库表单状态,才能进行发布。前台用户才能看的到
添加课程时,利用阿里巴巴的对象存储进行上传课程图片到阿里云,添加小节,第二部操作,为课程添加小节利用到了阿里巴巴视频点播上传视频到阿里云,然后获取阿里云视频的id和课程信息添加到数据库,最终发布,更改课程数据库表单状态,才能进行发布。前台用户才能看的到
统计分析
生成统计
在线教育,根据定时任务按照时间条件要统计每天注册的人数也可以手动
统计,统计出来 先从用户表用户模块查询某一天注册人数,然后保存到统计模块统
计表中, 然后把数据利用图表显示(利用定时任务固定每天生成)
统计,统计出来 先从用户表用户模块查询某一天注册人数,然后保存到统计模块统
计表中, 然后把数据利用图表显示(利用定时任务固定每天生成)
统计图表
前端利用统计图表elis插件,根据传入的日期到后端查询注册人数,吧数
据返 回给前端,进行生成图表
据返 回给前端,进行生成图表
订单管理
订单列表
普通用户购买的视频订单,有未购买和以购买,管理员进行订单的删改查
前端用户体验
用户登录
微信登录
微信登录
1.微信固定接口生产二维码,然后去微信请求oauth2.0授权登录,手机点击同意标识允许第三方应用进行登录
2.扫码之后,执行本地callback方法(模块域名要改成微信的域名),在callback获取code和state值
然后拿着code请求微信固定地址获取token和openID(唯一标识)
3.拿着第二部获取的二个值token和openid再去请求微信固定地址,就可以获取扫码人信息
4.判断扫码入信息数据库有没有,有的话,从数据库获取该扫码入的id和名称用jwt生成token令牌,没有则先添加在去查找最后生成
5.生成的token令牌进行模块访问
1.微信固定接口生产二维码,然后去微信请求oauth2.0授权登录,手机点击同意标识允许第三方应用进行登录
2.扫码之后,执行本地callback方法(模块域名要改成微信的域名),在callback获取code和state值
然后拿着code请求微信固定地址获取token和openID(唯一标识)
3.拿着第二部获取的二个值token和openid再去请求微信固定地址,就可以获取扫码人信息
4.判断扫码入信息数据库有没有,有的话,从数据库获取该扫码入的id和名称用jwt生成token令牌,没有则先添加在去查找最后生成
5.生成的token令牌进行模块访问
普通登录
用户登录,登录输入手机号,后端进行手机号判断数据库有没有,判断手机号该账户是否禁用,然后判断密码
是否正确,这里用md5加密 正确则用jwt生产一个有规则token返回给前端,前端利用拦截器获取token
保存到cookie头中,登录成功,在进入后端接口利用request 获取前端cookie里面token信息,利用jwt解析
该token 获取用户id,查询用户信息最后返回给前端
是否正确,这里用md5加密 正确则用jwt生产一个有规则token返回给前端,前端利用拦截器获取token
保存到cookie头中,登录成功,在进入后端接口利用request 获取前端cookie里面token信息,利用jwt解析
该token 获取用户id,查询用户信息最后返回给前端
用户注册
短息发送注册
获取手机号验证码,进行后端接口判断,由于手机号验证码存redis,手机是键,验证码是值
,后端通过键判断值,没有则进行第二步骤,随机生成一个验证码,发送给阿里云短息
发送成功验证码保存到redis中,阿里云发送短息摸板给手机,用户输入验证码在进入该接口进行判断
,有验证码则进行判断验证码是否和redis一样,一样则注册到数据库
,后端通过键判断值,没有则进行第二步骤,随机生成一个验证码,发送给阿里云短息
发送成功验证码保存到redis中,阿里云发送短息摸板给手机,用户输入验证码在进入该接口进行判断
,有验证码则进行判断验证码是否和redis一样,一样则注册到数据库
首页显示
轮播图显示
查询数据库表显示轮播图
热门课程讲师显示
显示热门课程和讲师,根据热门度升序进行显示
课程页面
课程显示
分页显示课程,并且普通用户进行条件查询课程
课程详情
分页显示课程,并且普通用户进行条件查询课程
购买课程
课程详情有价格用户进行购买
课程播放
利用阿里云视频播放,数据库查询视频id去阿里云获取播放凭证进行视频播放
名师显示
名师列表
查询所有名师进行分页显示
名师详情
点击名师获取id根据id进入名师详情页面
文章解读
名师热门文章
显示热门讲师文章
学员热门文章
显示热门学员文章
问答题目
预约讲师
显示热门学员文章,讲师点击确认更新数据库预约状态
学员提问
显示热门学员文章
用户注销
cookie注销
用户注销清空前端cookie和token里面的用户信息
0 条评论
下一页