第一天讲义:

https://itheima-sh.yuque.com/docs/share/acc9d38d-0e8a-445e-bf35-c9df264b5e9c?#(密码:fwiz) 《day01-第一章-项目概述 环境搭建》

第二天讲义

https://itheima-sh.yuque.com/docs/share/f811ec28-3692-4d35-9e40-93df117a02bd?#(密码:pdno) 《day02-第二章-内容管理-课程查询和新增》

第三天讲义

https://itheima-sh.yuque.com/docs/share/7e34d797-3453-4afd-bd42-8a23f9f99be0?#(密码:pg2y) 《day03-第二章-内容管理-课程新增修改和删除》

第四天讲义

https://itheima-sh.yuque.com/docs/share/760a177d-6424-4a9b-ae5f-6e6bdc90fb03?#(密码:foun) 《day04-第二章-内容管理-异常处理和课程计划管理》

第五天讲义

https://itheima-sh.yuque.com/docs/share/80fcd7ed-22ec-42b2-bda5-b1f9161f1a25?#(密码:gz79) 《day05-第二章-内容管理-课程图片&课程审核》

第六天讲义

https://itheima-sh.yuque.com/docs/share/3d810227-c46d-488e-b44f-257d0194f558?#(密码:idbk) 《day06-第三章-媒资管理-媒资信息管理》

第七天讲义:

https://itheima-sh.yuque.com/docs/share/b4fa5fc2-0047-4f46-94e7-2fa50bcf7b09?#(密码:ssgc) 《day07-第三章-媒资管理-课程绑定媒资信息》

第八天讲义:

https://itheima-sh.yuque.com/docs/share/4f4fefc7-3317-4dfa-b7b7-503418f39bad?#(密码:rc7q) 《学成网-第4章-freemarker》
https://itheima-sh.yuque.com/docs/share/c1b94fc1-3d32-47c4-a8ee-0991e3416702?#(密码:dfhr) 《day08-第四章-课程发布-课程预览》

第九天讲义:

https://itheima-sh.yuque.com/docs/share/50b35ad2-f737-490f-8635-3fc3fb6c2adb?#(密码:duo6) 《day09-第四章-课程发布-业务实现》
https://itheima-sh.yuque.com/docs/share/9b2bb0ce-6876-4931-aa20-c7d8353fa712?#(密码:fl9t) 《分布式事务》

第十天讲义:

https://itheima-sh.yuque.com/docs/share/a4da68df-2fce-4fc8-bc6b-7206f7706c26?#(密码:edf1) 《day10-第五章-课程搜索》

第十一天讲义:

https://itheima-sh.yuque.com/docs/share/b8737fc7-a175-47e5-9973-07441b3fd307?#(密码:yr6v) 《day11-第六章-学生选课-用户登录》
https://itheima-sh.yuque.com/docs/share/1f2c5898-715f-4aa8-8a87-11d2eb73e207?#(密码:kpbs) 《UAA服务指南》

前后端环境搭建

https://itheima-sh.yuque.com/docs/share/cb6a9e02-9859-4ee0-895c-59470e899af5?#(密码:kolb) 《01-前后端环境搭建》

集成测试-内容管理

https://itheima-sh.yuque.com/docs/share/253f5f10-f9a8-4e8c-9c3d-4b8f937b4ac2?#(密码:cu3u) 《02-集成测试-内容管理》

集成测试

https://itheima-sh.yuque.com/docs/share/aa116a94-162a-44ce-b084-8a51a26592c4?#(密码:ltny) 《集成测试》

课程搜索-集成测试

https://itheima-sh.yuque.com/docs/share/ed1bce51-b418-4611-a183-bc0d0d774386?#(密码:efy1) 《课程搜索-集成测试》

https://itheima-sh.yuque.com/docs/share/ed1bce51-b418-4611-a183-bc0d0d774386?#(密码:efy1) 《课程搜索-集成测试》

门户

http://xczx2-manage.itheima.net/ 门户

运营

http://xczx2-admin.itheima.net/#/login 运营

第一天面试记忆:
项目背景:
(1)环境
1.在线教育近五年来稳步增长
近几年来受疫等因素情影响,在线教育持续增长,稳健发展,一二线的在线教育市场渐趋成熟,三四线城市的在线教育却仍处于初步发展阶段,,总体来看空间非常巨大。
2.政治环境促进在线教育健康发展
同时国内也比较重视在线教育,近几年相关的政策出台,也让在线教育进一步发展,更加规范化。
3.在线教育用户规模再创新高
据统计,2020年在线教育的用用户人数已突破3.09亿,互联网的普及和发展带来的 "互联网十教育” 使得在线教育用户不断奉升。
4.在线教育市场规模将持续增长
iiMedia Research (艾媒咨询)数据显示, 在线教育市场规模逐年增长, 2020年达到4538亿元。

项目基础背景:

学成在线是基于mooc思想,采用B-B-C的业务模式,为企业或者个人提供供多化的学习模式的it高等教育提的在线学习平台

功能架构:

学成在线包括在线教育平台、业务支持系统、基础服务来构建整个功能架构

按照功能一共划分三大层:在线教育的入口,业务支撑层,基础服务层
入口:门户(用户使用):课程学习,购买课程等
教学机构管理平替(教学机构平台人员):上传课程,课程发布,直播,作业等
运营管理平替(运营平台的工作人员):审核
业务支撑层: 业务和功能的完善,开发人员的重心,并不是自身就能实现,是依靠基础功能实现的
基础服务:单独的功能项,以当前的服务为维度的,比如下单,支付,是围绕支付服务创建的一些功能。
三层是依靠链路的形式来调用的
image.png

技术架构:

以技术为维度划分层次:用户层,CDN层,负载层,UI层,微服务层、数据层
image.png
用户层:PC端(主要)、App、H5(HTML CSS3 ECMA高版本 )技术栈——移动端的浏览器使用,公众号
CDN:HTML、CSS、images、.json、vedio、Doc等静态资源——提速
负载层:四层负载均衡服务、七层负载均衡》》》》》》》》》》ribbon\nginx
image.png
UI层
微服务层:业务服务集群(重点)
基础服务集群
第三方代理服务
数据层:关系型数据库:账号、权限、用户、课程、媒资、订单、学习记录等信息,消息队列、缓存、索引、文件存储
image.png
项目主题业务流程:
针对三个对象进行开发:
教育机构:
image.png
①:教学机构先入住到学成在线平台中
②:教学机构人员在学成进行登录
③:在教学管理中心可以管理课程信息
④:课程管理是会使用阿里云和七牛云服务
⑤:教学机构在课程没有问题的情况下将课程进行提交审核
⑥:课程审核通过后,教学机构可以发布课程。

用户:
image.png
①:学员在学成的门户注册后进行登录
②:在门户搜索需要学习的课程内容
③:找到对应课程后,需要对课程进行 下单购买
④:在学习中心查看自己课程,并进行学习 视频播放时会使用到第三方的服务。

平台人员:
image.png
①:平台机构在学成进行登录
②:在教学管理中心管理教学机构课程内容
③:课程中需要从外部服务中获得课程内容数据,并进行预览
④:预览课程内容后,需要对课程进行审核

汇总:
使用人群:
1.第三方教学机构
2.学成在线管理平台人员
3.学员
主要业务操作:
1.由第三方的教学机构在学成在线系统中录入教学数据
在录入数据前,需要进行登录认证,然后录入教学数据包括直播和点播。
2.由学成在线管理平台人员对学成在线系统中第三方教学机构的课程内容进行审核操作
第三方的教学内容,需要平台人员进行审核。审核通过,学员才可以对其进行学习。
3.学员需要登录到学成在线平台,添加需要学习的课程进行学习
对于收费的课程需要进行下单购买,才可以进行学习
主业务和外部服务交互:
1.学成在线系统中对于用户的认证将使用第三方认证系统UAA来完成
系统中的三类用户都需要通过UAA系统来获得认证和授权
2.学成在线中的教学资料会使用第三方的分布式系统来保存
对于视频点播/直播会使用阿里元服务
对于文件会使用七牛云进行存储

面试:
介绍i项目:
项目概述:
功能概述:
技术栈概述:
项目流程:
项目的结构:父工程、基础工程、微服务工程
项目规范的好处:

day2

内容管理:
内容管理系统(content management system )借助信息技术,实现内容的创建、储存、分享、应用、检索,并在企业个人、组织、业务、战略等诸方面产生价值的过程 。
本项目内容管理的定位:
本项目作为一个大型的在线教育平台,其内容管理主要对课程相关内容进行管理,从课程数据的录入、课程审批、课程内容发布等内容性的业务需求数据进行管理。
内容管理的业务介绍:
课程内容:
1、课程内容:包括课程的基本信息课程营销
2、课程计划:包括课程授课的主体大纲和关联的大纲的资料。
3、课程教师:包括课程授课的教师信息(课程不讲解,留作课程作业)。

项目的开发步骤
学成在线项目是基于前后端分离的架构进行开发,前后端分离架构总体上包括前端和服务端,由多人协作开发:
1.需求分析
梳理用户的需求,分析业务流程。
2.接口定义
根据需求分析定义服务端微服务接口,提供前端调用。
3.服务端和前端并行开发
●服务端依据接口进行服务端接口开发(Java后端开发人员)。
○对业务接口进行开发
○开发完接口要对其进行测试
●前端开发用户操作界面,并调用服务端接口完成业务处理(全栈或前端开发人员)。
○使用前端技术完成前端界面的构建
○调用服务端来获取数据
4.前后端集成测试
●在前后端完成各自的开发后,对其整个业务进行前后端集成测试。
PS:在上面的前后端开发步骤中,我们Java后端开发人员只关心以下事项(一般)
●功能的业务流程和分析
●后端接口定义
●后端微服务的开发
●后端接口的测试
●前后端集成测试

课程基础查询接口的基本需求:
1、分页查询 课程基本信息(CourseBase)集合数据
2、根据课程名称和审核状态条件进行数据条件查询
3、教学机构只能查询到属于自己机构下的课程基本信息
4、接口基于Http 请求,响应Json数据

DTO:

DTO是什么:数据传输对象,它封装了后端要传送到前端的数据,
DTO有什么好处:
(1)DTO 中的属性名称可以定义和 PO 属性名称不一致,不会暴露数据库字段名称,从而提高了应用的安全性。
(2)DTO属性更精简,这样在转换 Json 时,效率会好。

nacos中如何做配置区分的:

不同环境通过namespace进行区分
不同项目组通过group进行区分
一个项目的不同工程通过dateId区分

nacos如何减少冗余配置

抽取公共配置

数据隔离:主要是依据一句数据实现的,依据数据里面存在的一个公司id,依据数据的是通过token令牌是添加的发送给后端的,后端通过

Nacos多环境标准配置:

(1)新建命名空间:dev与pro
image.png
image.png
(2)创建公共配置——以学成在线为例
image.png

image.png

image.png

image.png

day3

1.设计数据表时,有哪些规范吗?

image.png
2.你的课程有审核状态,能简单聊下吗?
课程基础信息在内容管理中会有状态的显示,课程状态为 5 个状态,分别为:

image.png
1.未提交
2.已提交
3.审核通过
4.审核未通过
5.已发布
3.课程审核状态在项目中是如何控制的?

4.什么是数据字典表?

5.JavaBean的一些名词定义?
image.png
6.什么样的数据可以逻辑删除?

day4

day5

图片服务器是如何实现的?
本项目的图片服务器是采用七牛云的服务
(1)七牛云载商业图片服务器的成本低,不需要前期投入,七牛云的对象存储按需使用,按需付费,可以有效避免宽带资源的闲置浪费。
(2)七牛云的存储加速可以充分利用链路宽带,数据载边缘节点上传和下载可平均提速60%以上
(3)利用七牛云的对象储存,在存储空间无上限也不需要按需扩容。
(4)七牛云提供免费30天的域名使用,而阿里云需要备案域名才行

图片服务器的模块:前端 后端 七牛
由于微服务的单一职责的特点,图片的生成服务不可以和内容服务合并为一个服务

day6

image.png

1.谈谈你们媒资管理都有哪些业务

1、上传和媒资信息管理:包括上传、机构内媒资信息 CRUD。
2、运营审核媒资:包括媒资检索、媒资预览、审核。
3、课程计划绑定媒资:包括已审核媒资的检索、课程计划绑定媒资文件。

企业使用云服务的原因:
流媒体服务:
1.对于流媒体的技术不了解
2.搭建流媒体服务成本非常高
3.中小型公司不会自己去搭建流媒体服务。
企业通常直接使用云服务,而不自行开发,原因在于:(背)
●快速实现产品,快速交付产品,不必重头开始研发
●减少技术投入,包括时间、人力
●直接使用成熟的技术方案,避免技术风险

2.视频点播技术选型阿里云原因,那它的视频点播服务都有哪些

3.你们项目的视频文件上传的流程是什么

image.png
播放流程
image.png

断点续传:
大文件上传的要求最基本的是断点续传。
断点续传指的是在下载或上传时,将下载或上传任务(一个文件或一个压缩包)人为的划分为几个部分,每一个部分采用一个线程进行上传或下载,如果碰到网络故障,可以从已经上传或下载的部分开始继续上传下载未完成的部分,而没有必要从头开始上传下载,断点续传可以提高节省操作时间,提高用户体验性。
image.png

文件上传安全性保证:
凭证+有效时间

6.4.2.1

本项目远程调用规范:

  • HTTP 请求方式规范对于前端请求后端微服务,除了接口的 HTTP 请求地址不同外,后端微服务对于不同的 HTTP 请求也有相应的要求。
    • GET 请求(SELECT):从服务器取出资源(一项或多项)
    • POST请求(CREATE):在服务器新建一个资源
    • PUT 请求(UPDATE):在服务器更新资源(客户端提供改变后的完整资源)
    • DELETE 请求(DELETE):从服务器删除资源
  • HTTP 请求地址 由于 HTTP 请求路径使用 Restful 风格,URI 中尽量避免使用动词,单词之间可以以中划线”-“分割。
  • 对标明路径的种类,需要在路径中加上标识

  • 运营平台管理接口地址:/项目根路径/m/…….
    - 学成在线内部微服务端间调用接口地址:/项目根路径/l/…….
    - 其他接口地址:没有特殊标识

正式:

  • HTTP 请求方式规范同 ‘6.4.2.1 前端调用接口规范’ 中的 HTTP 请求方式规范,对此不在阐述
  • HTTP 请求地址URI
    • URI 中尽量避免使用动词,单词之间不要以中划线”-“分割
    • URI 地址前缀:/服务名称/l/xxx
  • HTTP响应数据无论是进行 CRUD 还是 异常信息返回,其中必须包含:操作代码、提示信息、数据内容。
    • 响应数据格式为:Json
      • 如果是获得正常信息
        • 操作代码固定为:0
        • 提示信息固定为:success
        • 数据内容:远程调用获得数据
      • 如果获得错误信息
        • 操作代码:错误代码(不同业务错误代码不同)
        • 提示信息:错误信息(要看具体的错误信息)
        • 数据内容:null

          有效期:凭证3000秒, 视频播放地址3600s

          day09

          项目中的课程详情页面是如何实现高性能的?

          .高性能课程详情页访问。
          (1).将课程详情页生成html文件
          (2).将静态资源存储到CDN服务
          2.业务的解耦。
          使用消息队列解耦
          (1)课程发布时间执行短。
          (2)课程发布与其他业务逻辑解耦,新增下游订阅者,上游不需要修改任何代码。

能聊一聊分布式事务的定理和理论吗?

image.png

image.png

image.png

image.png

请说出业界中对于分布式事务的解决方案都有哪些?以及他们适用于哪些场景?

image.png
image.png
image.png
image.png

image.png

image.png
image.png
image.png

发布业务

4f98e394f8e4e5798c7b2119aca6ff8.png
确保消息可靠性
image.png
消费方一直失败如何处理:
(1)设置最大重试次数

如果确保消息幂等性:
image.png

消息方的重试,减轻mq压力
image.png

  1. 1.添加Freemarker对于JDK8的支持依赖
  2. <dependency>
  3. <groupId>no.api.freemarker</groupId>
  4. <artifactId>freemarker-java8</artifactId>
  5. <version>1.3.0</version>
  6. </dependency>
  7. 2.添加Freemarker对于JDK8的支持配置类
  8. @Configuration
  9. public class FreemarkerConfig implements BeanPostProcessor {
  10. @Override
  11. public Object postProcessAfterInitialization(Object bean, String beanName)
  12. throws BeansException {
  13. if (bean instanceof FreeMarkerConfigurer) {
  14. FreeMarkerConfigurer configurer = (FreeMarkerConfigurer) bean;
  15. configurer.getConfiguration().setObjectWrapper(new Java8ObjectWrapper(freemarker.template.Configuration.getVersion()));
  16. }
  17. return bean;
  18. }
  19. }
  20. 3.通过ftl表达式来输出LocalDateTime的格式
  21. 显示年月日LocalDateTime: ${stu.testDate?date} <br>
  22. 显示时分秒LocalDateTime: ${(stu.testDate).format('yyyy年MM月dd HH:ss:mm')} <br>

day11:

认证

用户认证即用户去访问系统资源时系统要求验证用户的身份信息,身份合法方可继续访问。常见的用户身份认证表现形式有:用户名密码登录,二维码登录,手机短信登录,指纹认证等方式。


授权

用户认证通过后去访问系统的资源,系统会判断用户是否拥有访问资源的权限,只允许访问有权限的系统资源,没有权限的资源将无法访问,这个过程叫用户授权。

用户认证机制

基于session认证

目前大多数web应用的用户认证机制都是基于session的。用户认证成功后,在服务端生成用户相关的数据保存在session(当前会话),而发给客户端 sesssion_id 存放到 cookie 中,这样用客户端请求时带上 session_id 就可以验证服务器端是否存在 session 数据,以此完成用户的合法校验。当用户登出或过期服务端session销毁,客户端的session_id也就无效了。
image.png
优点:
基于session认证的认证方式,可以更好的在服务端对会话进行控制,且安全性较高
缺点:
session机制方式基于cookie,在移动应用上无法有效使用,并且无法跨域,对服务器的压力大。

基于Token认证

基于token的用户认证是一种服务端无状态的认证方式,所谓服务端无状态指的token本身包含所有的登陆用户相关数据,而客户端在认证后的每次请求都会携带token,因此服务器端无需存放token数据。

交互机制:
当用户认证后,服务端生成一个token发给客户端,客户端可以放到 cookie 或 localStorage 等存储中,每次请求时带上 token,服务端收到token通过验证后即可确认用户身份。
image.png

OAuth 2.0认证

OAuth 就是基于 token 认证实现的认证协议。
OAuth(开放授权)是一个开放标准,允许用户授权第三方应用可以访问存储在服务提供者上的信息,而不需要将用户名和密码提供给第三方应用。OAuth2.0是OAuth协议的延续版本,但不向后兼容OAuth 1.0即完全废止了OAuth1.0。
OAuth2.0正是实现了上面的机制,它的运行流程如下:
image.png
(A)张三打开BBS的APP,并使用新闻门户账号登录,BBS要求张三授权基本用户信息及喜好数据。
(B)张三同意给予BBS授权。
(C)客户端使用上一步获得的授权,向新闻门户的认证服务器申请令牌(access_token)。
(D)认证服务器对BBS客户端进行认证以后,确认无误,同意发放令牌(access_token)。
(E)BBS客户端使用令牌,向新闻门户的资源服务器申请获取基本用户信息及喜好数据这些资源。
(F)新闻门户的资源服务器确认令牌(access_token)无误,同意向BBS开放资源。

OAuth2.0有以下角色:
客户端(Client):第三方应用,本身不存储资源,需要通过资源拥有者的授权去请求资源服务器的资源。本例中指的是BBS
资源拥有者(Resource Owner):通常为用户,也可以是应用程序,即该资源的拥有者。本例指的是张三。
授权服务器(Authorization Server 也称认证服务器):用于服务提供商对资源拥有的身份进行认证、对访问资源进行授权,认证成功后会给客户端发放令牌(access_token),作为客户端访问资源服务器的凭据。本例指的是新闻门户用于提供OAuth2.0开放机制,而专门搭建的认证服务器。
资源服务器(Resource Server):服务提供商存储用户生成的资源的服务器。本例指的是新闻门户用于存放用户数据的服务器。
服务提供商会给准入的接入方一个身份,用于接入时的凭据:
client_id:客户端标识
client_secret:客户端秘钥
因此,准确来说,授权服务器对两种OAuth2.0中的两个角色进行认证授权,分别是资源拥有者客户端

认证体系设计

image.png
流程描述:
(1)用户登录通过接入方(目前指前端)在学成在线登录,接入方采取OAuth2.0 密码模式请求认证服务(UAA)。
(2)认证服务(UAA)调用统一账号服务去验证该用户,并获取用户权限信息。
(3)认证服务(UAA)获取接入方权限信息,并验证接入方是否合法,。
(4)若登录用户以及接入方都合法,生成令牌返回给接入方,其中包含了用户权限及接入方权限。
(5)后续,接入方携带令牌对学成在线微服务资源进行访问。
(6)API网关对令牌解析、并验证接入方的权限是否能够访问本次请求的微服务。
(6)网关校验通过后,就可以访问学成在线后端资源服务。
流程 红色图框 所涉及到统一账号服务、UAA服务、API网关这三个组件,因此下面介绍三个组件的职责。
UAA(统一认证服务):UAA组件之一,它承载了OAuth2.0接入方认证、登入用户的认证、授权以及生成令牌的职责,并连接“统一账号服务”,完成实际的用户认证、授权功能。
统一账号服务:UAA组件之一,提供门户、教育机构和平台运营人员的登录账号、密码、角色、权限、资源等系统级信息的管理,不包含用户业务信息。
API网关:UAA组件之一,实现接入客户端权限拦截、令牌解析并转发当前登录用户信息(jsonToken)给业务微服务,这样下游微服务就不需要关心令牌格式解析以及OAuth2.0相关机制了,它将作为之前网关的替代物

Oauth2授权模式
Oauth2.0 是一个第三方的认证协议。
在 Oauth2.0 认证协议中,主要包含下面的集中模式:
●授权码模式(Authorization Code) 适用于:第三方Web服务器端应用与第三方原生App。
●隐式授权模式(Implicit) 适用于:第三方单页面应用。
●密码模式(Resource Owner Password Credentials) 适用于:第一方单页应用与第一方原生App。
●客户端模式(Client Credentials) 没有用户参与的,完全信任的一方或合作方服务器端服务

Oauth2密码模式授权

用户登录需求分析:
用户登录就是使用注册时预留的身份(用户名)、凭证(凭证)信息登入系统的过程。
登录是一个与业务无关的功能,它可以被封装为公共服务,且应该满足以下初步需求:
●不同用户种类:平台中存在学生用户、教育机构用户、平台运营用户多种用户类型,应使用统一的认证模块,而不是针对不同用户专门开发不同的认证模块。
●分布式系统的要求:学成在线是一个分布式微服务应用系统,应满足分布式环境下的认证需求。
●不同种类的登录(可选):应预留多样化的认证方式,如用户名密码登录、手机快捷登录、指纹登录等。
除了上面统一认证需求外,公司一般命名统一认证系统为:UAA(User Account and Authentication)

UAA

对于用户的业务数据和账户数据的管理:

UAA 将用户信息进行分离,分离的信息种类如下:
1.用户信息的业务数据
如用户的昵称、性别、爱好、等级等等
2.用户信息的账号数据
用户信息的账号数据主要就两个数据:登录账号 和 登录密码。
image.png

UAA 对于用户的密码操作:


MD5(用户密码+随机盐)
用户密码:用户输入
随机盐:在服务端生成(UAA服务中)
MD5加密的特点:(面试)
1.加密后的内容不可逆
2.同一个内容加密多次得到的结果都是一样的
3.加密后的字符长度是一致的(不管要加密的内容长度是多少,加密后的长度是唯一的)