类MOOC系统开发4-认证授权模块开发
本项目基于 SpringScurity 框架+ OAuth2 协议实现的用户单点登录。
认证授权的概念认证:就是身份认证,系统要知道登陆的用户是谁 :
常见的用户身份认证表现形式有
用户名密码登录
微信扫码登录等
授权:不同的系统资源访问以及操作需要角色权限。
认证先发生,才能有授权发生。
业务流程统一认证
项目包括学生、学习机构的老师、平台运营人员三类用户,三类用户将使用统一的认证入口
用户输入账号密码提交认证,认证通过后继续操作
认证通过由认证服务想用户颁发jwt令牌,相当于访问系统的通行证,用户拿着令牌去访问系统的资源
认证失败继续登录,如果用户强行跳过认证,没有令牌的话,很多资源没有权限访问
单点登录特点:
1、在一个统一登录(认证)界面登录
2、登陆一次就可以访问所有相互信任的应用系统。
第三方认证扫码登录
Spring Security认证Spring Security介绍
与业务无关,市面上有很多认证框架,如Apache Shiro、CAS、Spring Security等
本项目是基于Spring Cloud技术构建,Spring Security是spr ...
类MOOC系统开发3-课程发布模块开发
模块功能介绍1、(机构段)课程预览
2、(平台端)课程审核(机构请求发布,自动审核,后台审核—>发布成功)发布成功,用户端可查看发布的课程
3、(用户端)查看发布课程
课程预览课程预览是一个单独的门户页面
结构
说明如下:
1、点击课程预览,通过Nginx、后台服务网关请求内容管理服务进行课程预览。
2、内容管理服务查询课程相关信息进行整合,并通过模板引擎技术在服务端渲染生成页面,返回给浏览器。
3、通过课程预览页面点击”马上学习“打开视频播放页面。
4、视频播放页面通过Nginx请求后台服务网关,查询课程信息展示课程计划目录,请求媒资服务查询课程计划绑定的视频文件地址,在线浏览播放视频。
模板引擎Freemarker可以看到,根据前边的数据模型分析,课程预览就是把课程的相关信息进行整合,在课程预览界面进行展示,课程预览界面与课程发布的课程详情界面一致。
项目采用模板引擎技术实现课程预览界面。什么是模板引擎?
早期我们采用的jsp技术就是一种模板引擎技术,简单来说就是通过jsp浏览的页面的框架以及搭好,需要后端渲染(渲染的过程就是填充数据-模型的过程)
所以模板引擎就是:模板+ ...
类MOOC系统开发2-媒资管理模块开发
媒资管理大体功能介绍媒资查询:教学机构查询自己所拥有的媒资信息。文件上传:包括上传图片、上传文档、上传视频。视频处理:视频上传成功,系统自动对视频进行编码处理。审核: 自动审核(自动校验鉴黄接口)
为什么要媒资管理统一进行文件管理
将文件(图片、视频、文档)本身放进分布式文件系统当中。
叫文件信息存入数据库当中
其中的文件上传下载等功能接口需要给其他模块调用。
如:冗余文件上传校验 (避免重复上传)
搭建网关微服务(gateway)为什么要网关?
1、降低前端与后端对接成本,网关作为前后端连接的中间层,不需要前端写死调用的微服务资源地址(到时候上线微服务地址可能会变还要改,麻烦)
2、具体作用
路由转发(针对不同微服务功能)、负载均衡(针对于同一微服务的不同实例)
还能实现认证授权 限流
项目采用Spring Cloud Gateway作为网关,网关在请求路由时需要知道每个微服务实例的地址,项目使用Nacos作用服务注册/发现中心和配置中心,整体的架构图如下
网关的工作流程
1、微服务启动,将自己注册到Nacos,Nacos记录了各微服务实例的地址。
2、网关从Nacos读取服务 ...
类MOOC系统开发1-内容管理模块开发
创建内容管理工程是上一节中,我们讲到了后端工程结构,各个微服务工程依赖于基础(base)工程
下面我们来做第一个微服务工程 “内容管理工程” (content)
其中这个内容管理工程下面也可以再进行细分
流程分为前端、接口层、业务层三部分,所以模块工程结构如下图所示
xuecheng-plus-content-api:接口工程,为前端提供接口
xuecheng-plus-content-service:业务工程,为接口工程提供业务支撑
xuecheng-plus-content-model:数据模型工程,存储数据模型类、数据传输类型等
创建内容管理父工程现在开始创建内容管理工程,注意基于根目录创建xuecheng-plus-content
创建完成,只保留pom.xml文件,删除多余的文件。
在pom文件中引入对父工程的依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/200 ...
算法:单调栈问题
单调栈问题单调栈分为单调递增栈和单调递减栈
单调递增栈即栈内元素保持单调递增的栈
同理单调递减栈即栈内元素保持单调递减的栈
操作规则(下面都以单调递增栈为例)
如果新的元素比栈顶元素大,就入栈
如果新的元素较小,那就一直把栈内元素弹出来,直到栈顶比新元素小
加入这样一个规则之后,会有什么效果
栈内的元素是递增的
当元素出栈时,说明这个新元素是出栈元素向后找第一个比其小的元素
当元素出栈后,说明新栈顶元素是出栈元素向前找第一个比其小的元素
代码模板:
stack<int> st;
for(int i = 0; i < nums.size(); i++)
{
while(!st.empty() && st.top() > nums[i])
{
st.pop();
}
st.push(nums[i]);
}
序号
题目
题解
1
42. 接雨水(困难)
暴力解法、优化、双指针、单调栈
2
739. 每日温度(中等)
暴力解法 + 单调栈
3
496. 下一个更大元素 I(简单 ...
算法:回溯问题 (未完待续~~)
参考
回溯算法简介DFS 和回溯算法区别DFS 是一个劲的往某一个方向搜索,而回溯算法建立在 DFS 基础之上的,但不同的是在搜索过程中,达到结束条件后,恢复状态,回溯上一层,再次搜索。因此回溯算法与 DFS 的区别就是有无状态重置
何时使用回溯算法当问题需要 “回头”,以此来查找出所有的解的时候,使用回溯算法。即满足结束条件或者发现不是正确路径的时候(走不通),要撤销选择,回退到上一个状态,继续尝试,直到找出所有解为止
怎么样写回溯算法(从上而下,※代表难点,根据题目而变化)①画出递归树,找到状态变量(回溯函数的参数),这一步非常重要※②根据题意,确立结束条件③找准选择列表(与函数参数相关),与第一步紧密关联※④判断是否需要剪枝⑤作出选择,递归调用,进入下一层⑥撤销选择
回溯问题的类型这里先给出,我总结的回溯问题类型,并给出相应的 leetcode题目(一直更新),然后再说如何去编写。特别关注搜索类型的,搜索类的搞懂,你就真的搞懂回溯算法了,,是前面两类是基础,帮助你培养思维
类型
题目链接
子集、组合
子集、子集 II、组合、组合总和、组合总和 II
全排列
全 ...
AOP详解 待写
如果说IOC 是 Spring 的核心,那么 面向切面编程 AOP就是 Spring 另外一个最为重要的核心
AOP的定义AOP (Aspect Orient Programming),直译过来就是 面向切面编程,AOP 是一种编程思想,是面向对象编程(OOP)的一种补充。
常用于
事务
日志
安全
异常处理
面向切面编程,实现在不修改源代码的情况下给程序动态统一添加额外功能的一种技术
AOP可以拦截指定的方法并且对方法增强,而且无需侵入到业务代码中,使业务与非业务处理逻辑分离,比如Spring的事务,通过事务的注解配置,Spring会自动在业务方法中开启、提交业务,并且在业务处理失败时,执行相应的回滚策略。
AOP术语AOP核心概念
名称
说明
JoinPoint(连接点)
指那些被拦截到的点,在Spring 中,指可以被动态代理拦截目标类的方法。
Pointcut (切入点)
指要对哪些Joinpoint进行拦截,即被拦截的连接点。
Adive(通知)
指拦截到Joinpoint之后要做的事情,即对切入点 增强的内容。
Target (目标)
指代理 ...
类MOOC平台项目项目总结(内容管理模块大致搭建流程总结)
介绍项目介绍套用模板
我最近参与的项目是我们公司自研的专门针对成人职业技能教育的网络课堂系统,网站提供了成人职业技能培训的相关课程,如:软件开发培训、职业资格证书培训、成人学历教育培训等课程。项目基于B2B2C的业务模式,培训机构可以在平台入驻、发布课程,我们公司作为运营方由专门的人员对发布的课程进行审核,审核通过后课程才可以发布成功,课程包括免费和收费两种形式,对于免费课程普通用户可以直接选课学习,对于收费课程在选课后需要支付成功才可以继续学习。
本项目包括三个端:用户端(学生端)、机构端、运营端。
核心模块包括:内容管理、媒资管理、课程搜索、订单支付、选课管理、认证授权等。
本项目采用前后端分离架构,后端采用SpringBoot、SpringCloud技术栈开发,数据库使用了MySQL,还使用的Redis、消息队列、分布式文件系统、Elasticsearch等中间件系统。
划分的微服务包括:内容管理服务、媒资管理服务、搜索服务、订单支付服务、 学习中心服务、系统管理服务、认证授权服务、网关服务、注册中心服务、配置中心服务等。
我在这个项目中负责了内容管理、媒资管理、订单支付模块 ...
leetcode岛屿类问题
leetcode中「岛屿问题」是一个系列系列问题,比如:
L200. 岛屿数量 (Easy)
岛屿的周长 (Easy)
岛屿的最大面积 (Medium)
最大人工岛 (Hard)
本文将以岛屿问题为例,展示网格类问题 DFS 通用思路,以及如何让代码变得简洁。
网格类问题的 DFS 遍历方法网格问题的基本概念网格问题是由 m×n 个小方格组成一个网格,每个小方格与其上下左右四个方格认为是相邻的,要在这样的网格上进行某种搜索。
岛屿问题是一类典型的网格问题。每个格子中的数字可能是 0 或者 1。我们把数字为 0 的格子看成海洋格子,数字为 1 的格子看成陆地格子,这样相邻的陆地格子就连接成一个岛屿。
在这样一个设定下,就出现了各种岛屿问题的变种,包括岛屿的数量、面积、周长等。不过这些问题,基本都可以用 DFS 遍历来解决。
DFS 的基本结构网格结构要比二叉树结构稍微复杂一些,它其实是一种简化版的图结构。要写好网格上的 DFS 遍历,我们首先要理解二叉树上的 DFS 遍历方法,再类比写出网格结构上的 DFS 遍历。我们写的二叉树 DFS 遍历一般是这样的:
void travers ...