前端VUE
VUE的MVVM模式:
Model:负责数据存储–script
View:负责页面展示–template标签
View Model:负责业务逻辑处理(比如Ajax请求等),对数据进行加工后交给视图展示–script
@表示当前工程的src目录下
template:编写view部分
script:vm部分,定义变量与方法
style:编写页面样式
:model是v-bind:model的缩写,常用在form标签中
v-model指令在表单 、 及 元素上创建双向数据绑定
v-on:click指令后跟触发事件,可以简写为@click
输入框怎么加的红色星号?在方法体里添加pageFormRules方法
mounted:当DOM元素渲染完成后调用该方法
mounted() {} == mounted:function(){}
接口开发步骤
1、需求分析
2、接口定义
3、服务端和前端并行开发
4、前后端集成测试
技术栈:
学成在线服务端基于Spring Boot构建,采用Spring Cloud微服务框架;
持久层:MySQL、MongoDB、Redis、ElasticSearch;
数据访问层:使用Spring Data JPA、Mybatis、Spring Data Mongodb等;
业务层:Spring IOC、Aop事务控制、Spring Task任务调度、Feign、Ribbon、Spring AMQP、Spring Data Redis等。
控制层:Spring MVC、FastJSON、RestTemplate、Spring Security Oauth2+JWT等;
微服务治理:Eureka、Zuul、Hystrix、Spring Cloud Config等;
1、内容管理系统cms中使用到了Spring Data Mongodb查询自定义分页数据
课程管理:
在线教育平台的课程信息相当于电商平台的商品。课程管理是后台管理功能中最重要的模块
课程管理服务端工程采用Spring Boot技术构建,技术层技术使用Spring data Jpa、Mybatis、druid
环境搭建:
1、创建数据库
课程分类、基本信息、营销信息、图片、计划
导入课程管理前端工程xc-ui-pc-teach
课程计划:
课程计划包括两级,第一级是课程的大章节、第二级是大章节下属的小章节,每个小章节通常是一段视频,学生点 击小章节在线学习
课程计划是一个树型结构,方便扩展课程计划的级别
本功能使用element-ui 的tree组件来完成
课程计划是树型结构,SQL语句主要采用表的自连接方式进行查询
Mapper文件中:针对输入参数为简单类型#{}中可以是任意类型,判断参数是否为空要用 _parameter
Nginx配置虚拟主机:通过server_name名字去访问location下指定路径下的index文件
Swagger接口生成工作原理:
1、系统启动,扫描到api工程中的Swagger2Configuration类
2、在此类中指定了包路径com.xuecheng,找到在此包下及子包下标记有@Api注解的ControllerApi接口
3、根据改接口中的Swagger注解生成接口文档
webpack打包工具
npm包管理工具
热部署webpack-dev-server服务器
前后端跨域问题:
由于前后端分离,前端和后端启动项目所访问的域名或端口号不同时会出现此问题,使用http代理中间件proxyTable来解决,就是在请求前加/api/模块名自动去匹配对应的服务
vue中的两个钩子函数:
created:DOM元素还没有渲染生成时调用
mounted:DOM元素渲染完成后调用该方法
前后端请求响应流程:(理解即可)
1、在浏览器输入前端url
2、前端框架vue.js根据url解析路由,根据路由找到page_list.vue页面
3、首先执行page_list.vue中的钩子方法
4、在钩子方法中调用query方法。
5、在query方法中调用cms.js中的page_list方法
6、cms.js中的page_list方法通过axios请求服务端接口
7、采用proxyTable解决跨域问题,node.js将请求转发到服务端(http://localhost:31001/cms/page/list)
8、服务端处理,将查询结果响应给前端
9、成功响应调用then方法,在then方法中处理响应结果,将查询结果赋值给数据模型中的total和list变量。
10、vue.js通过双向数据绑定将list数据渲染输出
RabbitMQ
1、Spring Boot默认集成RabbitMQ
2、社区活跃,文档完善
3、使用简单,功能强大,高并发能力强
组成部分:生产者、通道、服务进程(交换机+队列)、消费者
消息发布进程:
1、生产者与服务进程建立TCP连接
2、生产者与服务进程建立通道
3、生产者通过通道将消息发送到服务进程,由交换机将消息转发给队列
消息接收过程:
1、消费者与服务进程建立TCP连接
2、消费者与服务进程建立通道
3、消费者监听指定的队列
4、当有消息到达队列时服务进程默认将消息推送给消费者
工作模式:
6种工作模式:
工作队列、两个消费端共同消费同一个队列中的消息
发布订阅、每个消费者监听自己的队列
路由、每个消费者监听自己的队列,并且设置routingkey,由交换机根据routingkey来转发消息到指定的队列
主题、每个消费者监听自己的队列,并且设置带通配符的routingkey,由交换机根据routingkey来转发消息到指定的队列
头部、header模式与routing不同的地方在于,header模式取消routingkey,使用header中的key/value(键值对)匹配队列
RPC、即客户端远程调用服务端的方法 ,使用MQ可以实现RPC的异步调用
应用场景:异步处理:在注册的时候,用户信息的存储和用户手机号验证码异步同时执行,提高处理效率
页面发布流程:
1、前端请求cms执行页面发布
2、cms执行静态化程序生成html文件
3、cms将html文件存储到GridFS中
4、cms向MQ发送页面发布消息
5、MQ将页面发布消息通知给Cms Client
6、Cms Client从GridFS中下载html文件
7、Cms Client将html保存到阿里云OSS中
PageHelper分页:单表查询直接用Spring Data JPA,多表关联查询使用Mybatis有利于后期优化处理
Spring Cloud中提供服务注册中心来管理微服务信息,比如管理这些服务IP和端口,如果不用注册中心就只能在各个模块的配置文件中配置固定的IP地址跟端口号
Eureka服务与客户端的关系:Eureka客户端注册和发现服务治理中信
为了实现高可用,至少部署两台以上Eureka服务器,来相互注册
Feign远程调用:
小程序商品页面在cms工程里进行配置
@EnableEurekaServer//启动Eureka注册中心服务器,在govern-center中配置
@EnableDiscoveryClient//启动Eureka客户端,在cms工程中配置
@LoadBalanced//开启客户端负载均衡
工作流程:
1、cms服务将自己注册到注册中心。
2、课程管理服务从注册中心获取cms服务的地址。
3、课程管理服务远程调用cms服务
负载均衡是微服务架构中必须使用的技术,通过负载均衡来实现系统的高可用、集群扩容等功能
Ribbon是一个基于HTTP、 TCP的客户端负载均衡器,nginx是服务端负载均衡,两者最大区别是Ribbon要从Eureka服务器获取服务列表来进行维护,利用负载均衡的轮训算法去调用微服务
添加@LoadBalanced注解后,restTemplate会走LoadBalancerInterceptor拦截器,此拦截器中会通过 RibbonLoadBalancerClient查询服务地址,可以在此类打断点观察每次调用的服务地址
和端口,两个cms服务会轮流被调用
有统计显示打开一个页面超过4秒用户就走掉了
对于不会频繁改变的信息可以采用页面静态化的技术,提前让页面生成html静态页面存储在nginx服务器,用户直 接访问nginx即可,对于一些动态信息可以访问服务端获取json数据在页面渲染
一、认证登录
1、申请令牌
从eureka中获取认证服务的地址,设置header和body,利用restTemplate.exchange远程调用获取令牌信息:jti、refresh_token和access_token
2、令牌信息存储到redis中
将token(jti):短令牌作为key,令牌信息作为value值存储到redis中并校验是否过期
3、短令牌存到Cookie
获取到短令牌jti并存储到cookie中,uid对应短令牌
二、退出
1、清楚cookie信息
从cookie中取出用户身份令牌uid
将cookie中maxAge设置为0
2、清除redis信息
从redis中删除uid,token=user_token:uid,redis将token作为key,access_token作为value
三、用户认证
用户去访问系统资源时系统要求验证用户的身份信息,身份合法方可继续访问
四、用户授权
判断用户是否拥有访问资源的权限
单点登录
第三方认证:
首先通过微信的认证系统(微信认证)进行认证,微信认证通过后本系统便可获取该微信用户的基本信息,从而在本系统将该微信用户的头像、昵称等信息显示出来,
该用户便不用在本系统注册即可直接学习
微信认证流程:
1、用户点击微信登录
2、页面由后端生成微信二维码
3、用户扫描二维码授权登录
4、微信后台接收到授权码然后认证
5、后台接收到微信回调函数返回的用户信息
6、验证该用户如果第一次登陆存储该用户信息,如果不是第一次登陆请求认证服务器给予权限
7、后台处理用户信息将信息展示到页面
xc-service-ucenter-auth:认证服务工程
6个以“oauth_”开头的表都是spring Security 自带的表
主要使用oauth_client_details表
申请令牌获得6个字段,主要使用token和jti,jti存放到redis中作为key
微服务之间的认证用密码模式,微信三方登录用授权码模式
资源服务授权配置:接口请求时添加令牌进行请求,报表工程接入认证添加oauth2依赖、资源服务配置类,在该配置类中configure方法中进行配置即可进行放行,所有请求均可放行使用/**
JWT令牌就是为了解决不用每次请求认证服务完成授权,请求的时候就携带JWT令牌
xc-service-ucenter:用户中心工程
查询用户信息接口
getUserext:该方法是由认证服务xc-service-ucenter-auth中的loadUserByUsername方法调用获取用户权限的
跨工程调用Feign:定义客户端UserClient接口,添加FeignClient注解,在service中通过@Autowired引入之后,调用该接口中的方法
密码加密使用BCryptPasswordEncoder
JWT查询接口userjwt:
取出cookie中的用户身份令牌
拿身份令牌从redis中查询jwt令牌
Zuul网关会对请求进行过滤、校验、路由等处理。有了服务网关可以提高微服务的安全性和网关校验请求的合法性,当请求不合法时将被拦截,拒绝访问
客户发送请求,首先通过Nginx进行请求分发到各个微服务,在请求资源时先通过ZuulFilter过滤器进行拦截
代理作用:
客户请求网关/api/report,路由转发到/report
主要是在工程配置文件中添加了路由配置
客户请求server_name(域名)/api,代理转发到location,然后转发到upstream,最后请求到gateway工程
客户请求域名/api,通过ngnix代理转发到gateway工程,然后通过该工程的ZuulFilter进行过滤认证,最后通过Zuul进行路由转发去掉/api去请求对应的资源
过滤器ZuulFilter作用
1、查询Cookie中令牌是否存在
2、查询Http header中jwt是否存在
3、查询redis中token是否过期
xc-govern-gateway:网关工程
添加添加@EnableZuulProxy注解启动网关
下面三个方法在LoginFilter类中的run方法进行调用
getTokenFromCookie:从Cookie中获取token
getJwtFromHeader:从请求头中获取jwt
getExpire:从Redis查询token令牌是否过期,使用stringRedisTemplate