《项目总结-谷粒学院.docx》由会员分享,可在线阅读,更多相关《项目总结-谷粒学院.docx(11页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。
1、项目总结-谷粒学院谷粒学院项目总结-谷粒学院(前后端分离)1、项目描述在线教育系统,分为前台网站系统和后台运营平台,B2c模式。前台用户系统包括课程、讲师、问答、文章几大大部分,使用了微服务技术架 构,前后端分离开发。后端的主要技术架构是:SpringBoot + SpringCloud + MyBatis-Plus + HttpCIient + MySQL + Maven+EasyExcel+ nginx 前端的架构是:Node.js + Vue.js +element-ui+NUXT+ECharts其他涉及到的中间件包括Redis、阿里云OSS、阿里云视频点播业务中使用了 ECharts做
2、图表展示,使用EasyExcel完成分类批量添加、注册分布 式单点登录使用了 JWT 项目前后端分离开发:后端采用SpringCloud微服务架构,持久层用的是MyBatis-Plus,微服务分库设计, 使用Swagger生成接口文档接入了阿里云视频点播、阿里云OSS系统分为前台用户系统和后台管理系统两部分:前台用户系统包括:首页、课程、名师、问答、文章。后台管理系统包括:讲师管理、课程分类管理、课程管理、统计分析、Banner 管理、订单管理、权限管理等功能。前端我是用vue进行开发的使用日ement-UI快速搭建模板样式使用了 Nuxt轻量级框架使用node成为js的一个运行环境,将前端部
3、署在node上为什么使用Nuxt呢? Nuxt有什么特点会让你使用?答:Nuxt也就是服务器渲染技术也可以充当静态站点引擎,它可以很好的解决 SEO问题,SEO简称(搜索引擎优化)比如说我前端显示一张图片,是通过ajax 异步请求得到数据的,抓取工具并不会等待异步完成后才对页面内容进行抓取。 而用服务器渲染技术,我们无需等待所有的js加载完后执行,而是在服务端中 通过node.js将我们查询出来的数据全部封装,然后一次性返回到前端获得更快 的内容到达时间,这就是NUXT的简单操作流程,而且都是在服务端中实现的。模块1Redis做缓存,什么样的数据适合使用Redis做缓存? 经常访问,但不经常修
4、改的数据;如主页 项目遇到的问题跨域问题:I跨域问题Ihttp:/localhost:p528/ 不一样http:/localhost 18001/17、跨域解决方式(1)在后端接口control)CrossOrigin 解决善之 public class EduLoginCo(2)使用网关解决(后Ivue不管路由跳转了几次created。方法只会执行一次解决方法:vue监听watch:$route(to,from)init()mybatisPuls的xml问题:打包时不会将xml文件也打包解决:_!-项目打包时会将java目录中的*.xml文件也进行打包src/main/java*/*.xm
5、lfalse酉己置文件:mybatis-plus.mapper-locations=classpath:com/atguigu/edu/mapper/xml/*.xml用f4呢5181丫接受数据必须用PostMapping提交否则报missnginx也会限制文件上传大小总结:服务器大多都会限制文件上传大小,上传前要设置 文件上传大小配置nginx上传文件大小,否则上传时会有413 (Request Entity Too Larg(月T开nginx主酉己置文件nginx.conf,找至!Jhttp,添加通过一个地埴去访问另外一个地址,这个过程中如果有三个地方任何一个不一样访问协议http htt
6、psip 地址192. 168.1. 1 172.11. 11.11盛口号95288001搭建或Fl前台系般环境使用用ITT他架搭建防台环境 联多端溶染拉术服务器官户褚缺点,不利于SEOaxios拦截器axios的拦截器特性request请求拦截当我们请求的时候会检查cookie中是否有token如果有就将token设置进request 的head当中,发送到服务端做单点登录的逻辑处理。1) response响应拦截做一个全局异常处理拦截每一个响应信息,判断状态码是否正常,如果返回报错状态码,用弹窗的 形式给用户展现友好的信息,如果正常就将response返回给后面业务使用。/创建axios实
7、例const service = axios.create(/baseURL: / api 的 base_url/baseURL: ,http:/localhost:8210, / api 的 base_urlbaseURL:http:/192.168.56.133:9001,timeout:15000/请求超时时间)/ http request 拦截器service.interceptors.request.use(config =/debuggerif(cookie.get(guli_token)config.headerstoken= cookie.get(guli_token);) r
8、eturn config,err =return Promise.reject(err);)/ http response 拦截器service.interceptors.response.use(response =/debuggerif( response.data.code =28004)console.Iog(response.data.resultCode 是 28004)返回错误代码-1清除ticket信息并跳转到登录页面/debuggerwindow.location.href=7loginreturnelseif(response.data.code !=20000)25000
9、 :订单支付中,不做任何提示if(response.data.code !=25000)Message(message: response.data.message | |error,typeierror,duration:5*1000) _return Promise.rejectCerror)只要报错前直接抛出错误,就不会执行成功方法 了elsereturn response;) ) , error = return Promise.reject(error) ); NPM包管理工具,类似Maven后晒使用spring boot来搭建项目的环境和部署(注解开发)。持久层用的是MyBatis
10、-Plus用到了自动填充逻辑删除(未实现)和乐观锁(未实现) 自动填充创建时间和修改时间还有每当数据修改时,会将修改时间自动填充 其他的就是调用mp的api实现增删改查嘛。使用Swagger生成接口文档后端采用SpringCloud微服务架构1)注册中心使用了 nacos将每个微服务注册进去。2)使用fegin来实现每个模块之间的远程调用。3)使用ribbon实现负载均衡,因为导入fegin-start的依赖会将ribbon也导入,因为 fegin 封装了 ribbono4)后台使用gateway网关,解决跨越问题,还有使用gateway的过滤器检测用户是否登 录,gateway过滤器通过拦截
11、request请求看head中是否用token,如果没有就不放通 过。Springsecurity实现登录和授权后端重点功能实现JWT令牌:(三部分)请求头、有效载荷、签名哈希 单点登录(SSO) : (token+cookie)用户先进行登录,如果登录成功我们将用户名用JWT随机生成字符串也就是token,再 将token放到cookie当中,当发送请求时通过axios拦截器来拦截我们的request请求, 如果cookie中有token,我们会将他放到request的head当中再进行发送,后端通过 request的head得到token然后用JWT解析得到用户名然后到数据库查找对应的用户
12、信 息,并且将用户信息返回给前端。session. setAttribusession. getAttribu集群部署分布式单点登录SSO(single signI实现登录Iservice-edu登录session. setAttribute(user user)复制session*单点登录三种常见方式:单一服务器模式登录(1)使用session对象实现*登录成功之后,把用户数据放到session里面第一种;session广播机制实现session复制第一种;session广播机制实现session复制*判断是否登录,从session获取数据,可以获取到登录 微信扫码登录:第一步:先访问微信二
13、维码的页面,在手机上确定登录后会调用我们的callback (回调 方法)得到一个code (相当于手机验证码)。第二步:利用httpclient携带上这个code请求一个微信固定的地址得到access_token(访问凭证)和openjd (微信号的唯一标识)。第三步:利用httpclient携带上access_token和open_id请求一个微信固定的地址,这时 微信返回以json形式的用户信息再用json转换工具自其转换为用户对象,我们会先判 断用户表的是否有重复的opend如果有就说明注册了,如果没有就将当的用户信息加 入到我们的用户表中,第四步:当插入成功后mp会返回用户名给我们,
14、我们将用户名使用JWT加密生成 token放到url参数的位置,重定向到首页。课程详细视频在线播放功能:上传视频:当我们在创建小节的时候向数据库保存的不是视频的地址,而是我们请求阿里云播放器提供的第三方接口的videoldo播放视频:通过小节id到数据库中查找对应的videold,然后通过videold再访问阿里云的第三方接口得到访问凭证通过videold和访问凭证播放视频。为什么通过videold和访问凭证播放视频?答:如果说通过视频地址访问视频,只能访问未加密视频,但是不能访问加密视频,如果用videold和访问凭证,就能访问加密视频。Autowiredprivate VODPropert
15、ies vodProperties;通过vid拿到视频凭证public R getVODvid( String vid)throws Exception(DefaultAcsClientclient=lnitObject.initVodClient(vodProperties.getKeyid(),vod Properties.getKeysecret(); 请求 GetVideoPlayAuthRequest request =new GetVideoPlayAuthRequest(); request.setVideold(vid); 响应 GetVideoPlayAuthResponse
16、 response = null; response = client.getAcsResponse(request); 得到播放凭证 String playAuth = response.getPlayAuth(); 返回结果 return 。1().0165$州6(”获取凭证成功).|313(七匕113 playAuth); ) /* *流式上传接口 * param accessKeyldparam accessKeySecret* param titleparam fileName * param inputstream */ private static String testUplo
17、adStream(String accessKeyld, String accessKeySecret, String title, String fileName, Inputstream inputStream)UploadStreamRequest request =new UploadstreamRequest(accessKeyld, accessKeySecret, title, fileName, inputstream); UploadVideoImpI uploader =new UploadVideolmpl();UploadStreamResponse response
18、= uploader.uploadStream(request); if( response.isSuccess() return response.getVideold();else如果设置回调URL无效,不影响视频上传,可以返回Videold同时会返回错误码。 其他情况上传失败时,Videold为空,此时需要根据返回错误码分析具体错误原因 return response.getVideold(); ) ) 微信支付功能:(建议将订单加入到redis当中缓存,设置过期时间) 根据用户id到订单表查询是否有和当前课程对应的消费的记录,如果有说明已购买和 立即观看 如果没有,会提醒支付观看我们会
19、转跳到二维码支付页面,然后将订单信息加入到订 单表 前端设置定时器每三秒访问我们的接口访问订单状态,如果支付成功将订单状态改为 支付成功,并且将支付信息保存的订单日志表中。前台热点信息,使用redis缓存:原理:设置常量key比如说如果我们要存课程的热点信息,那我们就将key设置course,每次 查询前使用key查询在redis中先查询是否存在信息,如果存在就直接从redis当中获取。从redis中获取的是二进制字节,然后利用对象流反序列化返回对象。如果redis中不存在,那么我们就向数据库中查询数据,先利用对象流将我们的对象序 列化成二进制字节,然后存入redis当中,这样下一次我们用就会
20、直接从redis当中查询 了。如果进行序列化有就返第一次先访问re看是否有数据先集成 spring-boot-starter-data-redis 然后在查询的方法上打上*Cacheable(value = “teacher,key = leacherLisf )* value 为 redis 的存放的 key, key 为存放的数据名。Cacheable(value =teacher,key =teacherList,)Overridepublic ListgetTeacherData()QueryWrapper teacherQueryWrapper =new QueryWrapper()
21、;teacherQueryWrapper.orderByDesc(id);teacherQueryWrapper.last(limit 4);List teacherList = baseMapper.selectList(teacherQuery Wrapper);return teacherList;)通过gateway网关的过滤器来查看request的head当中是否有token,检查是否有登录。使用springsecurity实现认证和授权:1)认证(登录):1、如果登录成功。2、先利用用户名查出对应的用户权限列表加入redis当中,然后将用户名用JWT令牌加 密为tokeno3、通过登录过滤器然后将token设置到cookie当中每次请求再从cookie中拿到放到 request 的 head 当中。2)用户授权授权过滤器先从request的head中拿到token再用JWT解析得到用户名通过用户名做为 key到redis找到用户权限列表,然后给当前用户添加权限。
限制150内