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