前言
谷粒学院知识点总结,准备实习面试
一、项目功能点
1.后台管理系统功能
- 登录功能(SpringSecurity框架)
-
权限管理功能
(1)菜单管理:列表、添加、修改、删除
(2)角色管理:列表、添加、修改、删除(批量删除)、分配菜单
(3)用户管理:列表、添加、修改、删除、分配角色
(4)权限管理表和关系 (重点)5张表:权限、角色、用户、角色-权限、用户-角色
- 讲师管理模块(条件查询分页列表、添加、修改、删除)
- 课程分类模块
(1)添加课程分类(读取Excel数据添加到数据库——EasyExcel)
(2)课程分类列表(使用树型结构)
-
课程管理模块
(1)课程列表功能
(2)添加课程(填写课程基本信息——添加课程大纲(章节和小节)——课程信息确认——课程发布)课程如何判断是否已经被发布了? 课程信息中使用status字段,默认为draft,发布时更改为norm >如何找到之前没有发布完成课程,继续进行发布? 点击下一步时已经将课程存入数据库,所以到课程列表中根据课程状态查询未发布的课程,点击课程右边超链接把课程继续发布完成
可不可以在没点下一步时依然保存数据?
(3)添加小节上传课程视频(阿里云OSS)
- 统计分析模块 (生成统计数据、统计数据图表显示echarts)
2.前台系统功能
-
首页数据显示 (幻灯片、热门课程、名师,根据sort/view_count/id排序选择前几位展示)
-
注册功能 (获取手机验证码——阿里云短信)
-
登录功能
(1)普通登录(单点登录SSO:session广播机制、cookie+redis、token)session(重点)
(1) 当一个session开始时,Servlet容器将创建一个HttpServlet对象,在HttpServlet对象中可以存放客户的状态信息;
(2) Servlet容器为HttpSession分配一个唯一的标识符,称为Session ID。Servlet容器将Session ID作为Cookie保存在客户的浏览器中。
(3) 每次客户发出Http请求时,Servlet容器可以从HttpServletRequest对象中读取Session ID ,然后根据Session ID找到相应的HttpServlet对象,从而获取客户额状态信息。参考exmexm简书token(重点) 服务端根据用户身份信息生成 Token,通过响应体发放给客户端。客户端收好 Token,并在之后的数据请求中在请求头的Authentication字段带上 Token,服务端接到请求后校验并解析 Token 得出用户身份 参考黯羽轻扬的博客
JWT(重点):生成字符串的规则,头信息(Token 类型、加密方式)、有效载荷(Token 携带的数据及其它 Token 元信息)、签名哈希(通过 HMAC SHA-256 算法(Header 中alg字段指定的加密算法)加密得到)
(2)微信扫码登录(OAuth2:特定问题的解决方案(令牌)——开放系统间授权、分布式访问)
如何获取扫码人信息? 扫描之后微信接口返回code(临时票据),拿着code值请求微信固定地址,得到两个值:access_token(访问凭证)和openid(微信唯一标识),通过这两个值再去请求微信固定的地址,得到微信扫描人信息(比如昵称,头像等等)
-
名师列表功能
-
名师详情功能
-
课程列表功能(条件查询分页列表)
-
课程详情页 (课程信息显示、判断课程是否需要购买)
-
课程视频在线播放 (阿里云视频点播)
-
课程支付功能 (生成课程订单、生成微信支付二维码、微信支付)
微信支付流程: 课程收费时,点击立即购买生成课程订单;点击去支付生成微信支付二维码,扫码支付;支付后每3s查询支付状态,等待 or 更新订单状态并向支付记录表添加支付成功记录
3.总结项目技术点
-
前后端分离开发
-
前端:Vue + Element-ui + Node.js + Nuxt + Echarts
-
后端:微服务架构 + SpringBoot + SpringCloud + MyBatisPlus + EasyExcel + SpringSecurity + Redis + Nginx + OAuth2+JWT + HttpClient + Cookie + 微信登录/支付 + 阿里云OSS /视频点播 /短信服务 + Git + Docker+Jenkins
SpringBoot: 本质是就是Spring,只是快速构建Spring工程脚手架
(1)启动类包扫描机制: 从启动类所在包开始,扫描当前包及其子级包下的所有文件。可以通过@ComponentScan注解设置
(2)配置文件详解: 可以读取到的配置文件路径按读取顺序:项目根目录中config目录下、项目根目录下、resources目录中config目录下、项目的resources目录下,以第一次读取到的为准并优先 properties 再 yml;bootstrap – application – application-devSpringCloud: 是很多框架总称,使用这些框架实现微服务架构,基于SpringBoot实现。项目中使用Nacos作为注册中心和配置中心,Feign做服务调用(一个微服务调用另外一个微服务,实现远程调用),Gateway做网关(SpringCloud之前zuul网关,目前Gateway网关)。组成框架包括:
MyBatisPlus(待补充): MyBatisPlus就是对MyBatis做增强,要点:自动填充、乐观锁、逻辑删除、代码生成器
EasyExcel: 添加课程时读取Excel,阿里巴巴提供操作excel工具,代码简洁效率高。poi框架有一套SAX模式的API可以一定程度的解决一些内存溢出的问题,easyexcel重写了poi对07版Excel的解析,依赖POI的sax模式,在上层做了模型转换的封装。(SAX按行取数据,DOM把文件数据都取出)
Spring Security(待补充): 整合了权限管理,框架包括认证和授权
(1)登录认证过程:
(2)SpringSecurity代码执行过程Redis: 访问量最大的首页数据通过Redis进行缓存,不太重要或者不经常改变数据适合放到Redis作为缓存。Redis数据类型
Nginx: 反向代理服务器,功能:请求转发,负载均衡,动静分离。项目中使用请求转发,根据请求路径转发到对应服务器。Nginx介绍
OAuth2 & JWT: 特定问题解决方案 & 三部分
HttpClient: 发送请求返回响应的工具,不需要浏览器完成请求和响应的过程。项目中应用:微信登录获取扫描人信息,微信支付查询支付状态。
cookie: 关闭浏览器cookie默认不存在了,但是可以设置cookie有效时长(setMaxAge)
微信登录 /支付
阿里云系列
(1)OSS:文件存储服务器,添加讲师时候上传讲师头像
(2)视频点播:视频上传、删除、播放(凭证),整合阿里云视频播放器进行视频播放
(3)短信服务:注册时候,发送手机验证码Git 代码同步
Docker & Jenkins(待补充) 手动打包和自动化部署
二、项目问题
-
前端问题-路由切换问题
(1)多次路由跳转到同一个vue页面,页面中created方法只会执行一次
(2)解决方案:使用vue监听 -
前端问题-ES6模块化运行问题
(1)Nodejs不能直接运行ES6模块化代码,需要使用Babel把ES6模块化代码转换ES5代码 执行 -
mp生成19位id值
(1)mp生成id值是19位,JavaScript处理数字类型值时候只会处理到16位
(2)js的number类型有个最大值(安全值),即2的53次方。更改ID为String,并更改策略为ID_WORKER_STR -
跨域问题
(1)访问协议,ip地址,端口号,这三个如果有任何一个不一样,产生跨域
(2)跨域解决:在Controller添加注解;通过网关解决 -
413问题
(1)上传视频时候,因为Nginx有上传文件大小限制,如果超过Nginx大小,出现413
(2)413错误:请求体过大
(3)在Nginx配置客户端大小
(4)响应状态码:302(临时重定向)、401(用户凭证不正确)、403 (请求被拒绝)、404(资源未找到)、408(请求超时)、502(网关从上游服务器接收到无效的响应)、511(客户端需要进行身份验证才能获得网络访问权限) -
Maven加载问题
(1)maven加载项目时候,默认不会加载src-java文件夹里面xml类型文件的
(2)解决方案: 直接复制xml文件到target目录;通过配置实现
三、项目描述
1. 总体介绍
- 在线教育商城,分为前台网站系统和后台运营平台,采用B2C模式。
- 使用了微服务架构,前后端分离开发,前端有资源,后端自己做。
2. 项目功能模块 & 主要深入的模块
- 分为前台系统和后台系统,前台系统包括:首页数据显示、课程列表和详情、课程支付、课程视频播放、微信登录 /支付等;
- 后台系统包括:权限管理、课程管理、统计分析、课程分类管理等
- 主要深入的模块为…
3. 项目涉及技术
- 后端主要技术架构是:SpringBoot + SpringCloud + MyBatisPlus + EasyExcel + Nginx
- 前端主要技术架构是:Node.js + Vue.js + element-ui + NUXT + ECharts
- 其它涉及的中间件包括Redis、阿里云OSS和视频点播,业务中使用ECharts做图表展示;使用easyExcel完成分类批量添加;注册分布式单点登录使用了JWT。
- 系统中包含前台会员和后台系统管理员与运营人员,数据库采用后台分库,每个微服务一个独立的数据库,使用了分布式id生成器
- RPC
- 系统架构图