在线教育
基于Java的项目
destiny- freedom
希冀
展开
-
(145)Part38-Nacos配置中心-04-加载多配置集
一、多配制文件加载1、创建aliyun.yaml将aliyun的相关配置从service-sms中删除,移到aliyun.yaml文件中2、配置bootstrap.yml3、创建redis.yaml4、配置bootstrap.yml5、测试controller中添加如下测试,测试数据是否写入了redis@Autowiredprivate RedisTemplate redisTemplate;@GetMapping("test3")public R test3(){ r原创 2020-07-09 22:03:01 · 166 阅读 · 0 评论 -
(144)Part38-Nacos配置中心-03-命名空间和配置分组
一、使用命名空间做环境隔离1、创建命名空间2、克隆配置文件在public命名空间中克隆文件到新的命名空间3、配置命名空间默认情况下微服务读取配置中心中 public 命名空间中的配置文件,可以指定命名空间id使用特定命名空间中的配置二、使用命名空间做微服务隔离1、创建命名空间2、克隆配置文件在public命名空间中克隆文件到sms命名空间3、配置命名空间将sms命名空间id配置给sms微服务的boorstrap.yml文件4、命名空间和环境配置也可以命名空间和多环境配置联原创 2020-07-09 22:00:10 · 919 阅读 · 0 评论 -
(143)Part38-Nacos配置中心-02-基本配置和多环境配置
一、创建测试Controller1、创建测试控制器在service-sms微服务中创建SampleController使用@Value读取配置信息package com.atguigu.guli.service.sms.controller.api;@RestController@RequestMapping("/api/sms/sample")public class ApiSampleController { @Value("${aliyun.sms.signName}")原创 2020-07-09 21:57:50 · 125 阅读 · 0 评论 -
(142)Part38-Nacos配置中心-01-配置中心介绍
一、配置中心介绍问题微服务架构下关于配置文件的问题:配置文件相对分散在一个微服务架构下,配置文件会随着微服务的增多变的越来越多,而且分散在各个微服务中,不好统一配置和管理。配置文件无法区分环境微服务项目可能会有多个环境,例如:测试环境、预发布环境、生产环境。每一个环境所使用的配置理论上都是不同的,一旦需要修改,就需要我们去各个微服务下手动维护,这比较困难。配置文件无法实时更新我们修改了配置文件之后,必须重新启动微服务才能使配置生效,这对一个正在运行的项目来说非常不友好。配置中原创 2020-07-09 21:40:19 · 172 阅读 · 0 评论 -
(141)Part37-ECharts图表-02-统计图表展示
一、后端聚合数据service-statistics模块1、web层DailyController@ApiOperation("显示统计数据")@GetMapping("show-chart/{begin}/{end}")public R showChart( @ApiParam("开始时间") @PathVariable String begin, @ApiParam("结束时间") @PathVariable String end){ Map<String,原创 2020-07-09 21:37:09 · 166 阅读 · 0 评论 -
(140)Part37-ECharts图表-01-ECharts的使用
一、五分钟入门ECharts1、简介ECahrs是百度的一个项目,用于图表展示,提供了常规的折线图、柱状图、散点图、饼图、K线图,用于统计的盒形图,用于地理数据可视化的地图、热力图、线图,用于关系数据可视化的关系图、treemap、旭日图,多维数据可视化的平行坐标,还有用于 BI 的漏斗图,仪表盘,并且支持图与图之间的混搭。官方网站:https://echarts.baidu.com/2、基本使用入门参考:官网->文档->教程->5分钟上手ECharts(1)创建html页面:原创 2020-07-09 21:35:55 · 195 阅读 · 0 评论 -
(139)Part36-数据统计和定时任务-05-定时任务
一、需求每天凌晨1点自动生成前一天的统计数据二、定时任务实现方式1、Timer使用jdk的Timer和TimerTask可以实现简单的间隔执行任务,无法实现按日历去调度执行任务2、ScheduledThreadPool线程池创建可以延迟或定时执行任务的线程,无法实现按日历去调度执行任务3、quartz使用Quartz实现 Quartz 是一个异步任务调度框架,功能丰富,可以实现按日历调度4、Spring TaskSpring 3.0后提供Spring Task实现任务调度,支持按日历调度原创 2020-07-09 21:34:30 · 269 阅读 · 0 评论 -
(138)Part36-数据统计和定时任务-04-统计管理前端页面实现
一、apisrc/api/statistics.jsimport request from '@/utils/request'export default { createStatistics(day) { return request({ url: `/admin/statistics/daily/create/${day}`, method: 'post' }) }}二、路由1、新建页面组件2、路由配置src/router/inde原创 2020-07-09 21:33:14 · 293 阅读 · 0 评论 -
(137)Part36-数据统计和定时任务-03-统计分析微服务
一、数据库设计1、数据库创建数据库:guli_statistics2、数据表执行sql脚本guli_statistics.sql二、创建微服务1、创建模块service-statistics2、配置 pom.xml<build> <!-- 项目打包时会将java目录中的*.xml文件也进行打包 --> <resources> <resource> <directory>s原创 2020-07-09 21:31:35 · 203 阅读 · 0 评论 -
(136)Part36-数据统计和定时任务-02-用户注册统计
一、用户注册统计使用QueryWrapper查询出的用户是非逻辑删除的用户,这里我们想统计所有的用户,因此使用Mapperservice-ucenter模块:1、mapper接口:MemberMapperInteger selectRegisterNumByDay(String day);映射文件:MemberMapper.xml<select id="selectRegisterNumByDay" resultType="java.lang.Integer"> SELE原创 2020-07-09 21:29:53 · 199 阅读 · 0 评论 -
(135)Part36-数据统计和定时任务-01-需求
页面需求1、生成统计结果2、展示统计信息原创 2020-07-09 21:28:51 · 78 阅读 · 0 评论 -
(134)Part35-微信支付-06-更新课程销量
一、修改课程销量1、service层接口:service-edu中CourseServicevoid updateBuyCountById(String id);实现:CourseServiceImpl@Overridepublic void updateBuyCountById(String id) { Course course = baseMapper.selectById(id); course.setBuyCount(course.getBuyCount() + 1)原创 2020-07-09 21:27:54 · 105 阅读 · 0 评论 -
(133)Part35-微信支付-05-查询支付状态
一、查询支付状态1、业务层接口:OrderServiceboolean queryPayStatus(String orderNo);实现:OrderServiceImpl@Overridepublic boolean queryPayStatus(String orderNo) { QueryWrapper<Order> queryWrapper = new QueryWrapper<>(); queryWrapper.eq("order_no", o原创 2020-07-09 21:26:46 · 532 阅读 · 0 评论 -
(132)Part35-微信支付-04-支付回调
一、准备1、配置ngrok将ngrok映射到本地8170端口,并启动2、添加工具类在common-util中添加工具类StreamUtils.java二、支付回调1、回调方法该链接是通过【统一下单API】中提交的参数notify_url设置,如果链接无法访问,商户将无法接收到微信通知。参考文档:https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=9_7&index=8ApiWeixinPayController@A原创 2020-07-09 21:24:05 · 212 阅读 · 0 评论 -
(131)Part35-微信支付-03-生成支付二维码并支付
一、准备1、添加微信支付SDK方式一:service-trade中添加依赖:<dependencies> <!--微信支付--> <dependency> <groupId>com.github.wxpay</groupId> <artifactId>wxpay-sdk</artifactId> <version>0.0.3</versi原创 2020-07-09 21:22:27 · 688 阅读 · 0 评论 -
(130)Part35-微信支付-02-开发文档
一、场景介绍参考官方文档:https://pay.weixin.qq.com/wiki/doc/api/index.html Native支付用户扫描商户展示在各种场景的二维码进行支付。步骤1:商户根据微信支付的规则,为不同商品生成不同的二维码,展示在各种场景,用于用户扫描购买。步骤2:用户使用微信“扫一扫”扫描二维码后,获取商品支付信息,引导用户完成支付。步骤3:用户确认支付,输入支付密码。步骤4:支付完成后会提示用户支付成功,商户后台得到支付成功的通知。二、开发步骤推荐使用模式二1、模原创 2020-07-09 21:19:08 · 144 阅读 · 0 评论 -
(129)Part35-微信支付-01-微信扫码支付开通
一、方式一第一步:注册公众号https://mp.weixin.qq.com/ 类型须为:服务号请根据营业执照类型选择以下主体注册:个体工商户| 企业/公司| 政府| 媒体| 其他类型第二步:认证公众号公众号认证后才可申请微信支付,认证费:300元/次。第三步:注册商户号https://pay.weixin.qq.com PC网站接入支付第四步:账户验证step1:汇款验证step2:等待审核,1-2个工作日第五步:签署协议第六步:关联APPID将微信公众号appid关联至原创 2020-07-09 21:17:55 · 279 阅读 · 0 评论 -
(128)Part34【作业】-个人中心-04-我的收藏前端
一、apiapi/collect.jsimport request from '@/utils/request'export default { isCollect(courseId) { return request({ url: `/api/edu/course-collect/auth/is-collect/${courseId}`, method: 'get' }) }, addCollect(courseId) { retur原创 2020-07-09 21:16:35 · 132 阅读 · 0 评论 -
(127)Part34【作业】-个人中心-03-我的收藏后端接口
一、判断是否收藏service-edu模块1、web层ApiCourseCollectControllerpackage com.atguigu.guli.service.edu.controller.api;@RestController@RequestMapping("/api/edu/course-collect")@Slf4jpublic class ApiCourseCollectController { @Autowired private CourseCo.原创 2020-07-09 21:15:19 · 340 阅读 · 0 评论 -
(126)Part34【作业】-个人中心-02-我的订单
一、订单列表接口1、web层ApiOrderController@ApiOperation(value = "获取当前用户订单列表")@GetMapping("auth/list")public R list(HttpServletRequest request) { String memberId = JwtHelper.getId(request); List<Order> list = orderService.selectByMemberId(memberId)原创 2020-07-09 21:13:28 · 667 阅读 · 1 评论 -
(125)Part34【作业】-个人中心-01-嵌套路由
一、嵌套路由创建内嵌子路由,你需要添加一个 Vue 文件,同时添加一个与该文件同名的目录用来存放子视图组件。例如,将ucenter.vue文件创建到与ucenter目录的父目录下,即和ucenter目录保持平级。假设文件结构如:pages/‐‐| ucenter.vue‐‐| ucenter/‐‐‐‐‐| index.vue‐‐‐‐‐| order.vue‐‐‐‐‐| collect.vueNuxt.js 自动生成的路由配置如下:router: { routes: [ .原创 2020-07-09 21:12:10 · 98 阅读 · 1 评论 -
(124)Part33-订单-05-判断课程是否购买
一、后端接口判断数据库中是否存在已支付订单1、ControllerApiOrderController@ApiOperation( "判断课程是否购买")@GetMapping("auth/is-buy/{courseId}")public R isBuyByCourseId(@PathVariable String courseId, HttpServletRequest request) { String memberId = JwtHelper.getId(request);原创 2020-07-09 21:10:52 · 218 阅读 · 0 评论 -
(123)Part33-订单-04-显示当前订单信息
一、后端接口根据订单id获取订单1、ControllerApiOrderController必须是自己的订单才能查看@ApiOperation("获取订单")@GetMapping("auth/get/{orderId}")public R get(@PathVariable String orderId, HttpServletRequest request) { String memberId = JwtHelper.getId(request); Order order原创 2020-07-09 21:09:10 · 387 阅读 · 0 评论 -
(122)Part33-订单-03-前端整合下单流程
一、课程页面1、apiapi/order.jsimport request from '~/utils/request'export default { createOrder(courseId) { return request({ url: `/api/trade/order/auth/save/${courseId}`, method: 'post' }) }}2、购买按钮pages/course/_id.vue<section原创 2020-07-09 22:14:05 · 254 阅读 · 1 评论 -
(121)Part33-订单-02-新增订单接口
一、准备1、工具类在service-trade中添加util包添加工具类:OrderNoUtils.java2、定义dto对象在service-base中创建DTO(Data Transfer Object):服务和服务之间的数据传输对象课程:CourseDtopackage com.atguigu.guli.service.base.dto;@Datapublic class CourseDto { private String id;//课程ID private Str原创 2020-07-09 21:06:24 · 283 阅读 · 0 评论 -
(120)Part33-订单-01-创建交易微服务
一、数据库1、数据库创建数据库:guli_trade2、数据表执行sql脚本guli_trade.sql由于交易模块与教学模块、会员模块是不同的服务模块和不同数据库,所以我们在订单表冗余了课程与会员相关的表字段,这样有利于数据库表查询效率。支付成功后我们会把支付平台返回的数据全部记录,并且更新订单状态。二、创建交易微服务课程分为免费观看与付费观看,如果是付费观看的课程,会员需下单支付后才可以观看1、创建模块service-trade2、配置 pom.xml<build>原创 2020-07-09 21:03:21 · 180 阅读 · 0 评论 -
(119)Part32-Gateway微服务网关-04-微服务网关鉴权
一、网关鉴权1、问题当我们在未登录状态下点击“立即购买”按钮时,会显示“需要登录”,当未登录时需要跳转到登录页面2、解决方案微服务网关中添加自定义全局过滤器,统一处理需要鉴权的服务3、鉴权逻辑描述当客户端第一次请求服务时,服务端对用户进行信息认证(登录)认证通过,生成token,返回给客户端作为登录凭证以后每次请求,客户端都携带认证的token服务端对token进行校验,并解析自包含信息,判断是否有效对于验证用户是否已经登录鉴权的过程可以在网关统一检验。检验的标准就是请求中是否携原创 2020-07-09 21:02:08 · 772 阅读 · 0 评论 -
(118)Part32-Gateway微服务网关-03-配置路由和跨域
一、路由配置1、基本配置application.yml文件中添加路由配置-:表示数组元素,可以配置多个节点id:配置的唯一标识,可以和微服务同名,也可以起别的名字,区别于其他 Route。uri:路由指向的目的地 uri,即客户端请求最终被转发到的微服务。predicates:断言的作用是进行条件判断,只有断言都返回真,才会真正的执行路由。Path:路径形式的断言。当匹配这个路径时,断言条件成立/**:一个或多个层次的路径以下配置表示:如果当前请求访问网关的9110端口,并且路径规则匹原创 2020-07-09 21:00:35 · 260 阅读 · 0 评论 -
(117)Part32-Gateway微服务网关-02-搭建Gateway服务
一、创建父模块infrastructure1、创建模块在guli-parent下创建普通maven模块Artifact:infrastructure2、删除src目录二、创建模块api-gateway1、创建模块在infrastructure下创建普通maven模块Artifact:api-gateway2、配置pom在api-gateway的pom中添加如下依赖<dependencies> <!-- 网关 --> <dependency&原创 2020-07-09 20:58:14 · 188 阅读 · 0 评论 -
(116)Part32-Gateway微服务网关-01-API网关
一、网关基本概念1、API网关介绍API 网关出现的原因是微服务架构的出现,不同的微服务一般会有不同的网络地址,而外部客户端可能需要调用多个服务的接口才能完成一个业务需求,如果让客户端直接与各个微服务通信,会有以下的问题:(1)客户端会多次请求不同的微服务,增加了客户端的复杂性。(2)存在跨域请求,在一定场景下处理相对复杂。(3)认证复杂,每个服务都需要独立认证。(4)难以重构,随着项目的迭代,可能需要重新划分微服务。例如,可能将多个服务合并成一个或者将一个服务拆分成多个。如果客户端直接与微服务原创 2020-07-09 20:57:12 · 124 阅读 · 0 评论 -
(115)Part31-微信登录-04-开发回调URL
一、准备1、httpclient工具类放入common-util项目的util包HttpClientUtils.java2、pom依赖common-util项目中加入依赖<dependencies> <!--httpclient--> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>h原创 2020-07-09 20:56:03 · 192 阅读 · 0 评论 -
(114)Part31-微信登录-03-回调方式说明
一、回调方法定义ApiWxController中添加方法@GetMapping("callback")public String callback(String code, String state){ //回调被拉起,并获得code和state参数 System.out.println("callback被调用"); System.out.println("code = " + code); System.out.println("state = " + state原创 2020-07-09 20:54:31 · 426 阅读 · 0 评论 -
(113)Part31-微信登录-02-生成授权URL
一、准备工作1、注册微信开放平台:https://open.weixin.qq.com2、邮箱激活3、完善开发者资料4、开发者资质认证准备营业执照,1-2个工作日审批、300元5、创建网站应用提交审核,7个工作日审批6、熟悉微信登录流程参考文档:https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open141931650原创 2020-07-09 20:51:39 · 380 阅读 · 0 评论 -
(112)Part31-微信登录-01-OAuth2
一、OAuth2解决什么问题1、开放系统间授权照片拥有者想要在云冲印服务上打印照片,云冲印服务需要访问云存储服务上的资源2、图例资源拥有者:照片拥有者客户应用:云冲印受保护的资源:照片3、方式一:用户名密码复制用户将自己的"云存储"服务的用户名和密码,告诉"云冲印",(即资源服务器的用户名和密码存储在客户应用服务器上)后者就可以读取用户的照片了。这样的做法有以下几个严重的缺点。(1)"云冲印"为了后续的服务,会保存用户的密码,这样很不安全。(2)Google不得不部署密码登录,而我原创 2020-07-09 20:50:03 · 134 阅读 · 0 评论 -
(111)Part30-用户认证-02-登录后显示用户信息
流程说明一、获取用户信息接口1、web层ApiMemberController@ApiOperation(value = "根据token获取登录信息")@GetMapping("auth/get-login-info")public R getLoginInfo(HttpServletRequest request){ try{ JwtInfo jwtInfo = JwtHelper.getJwtInfo(request); return R.ok(原创 2020-07-09 20:47:18 · 501 阅读 · 0 评论 -
(110)Part30-用户认证-01-用户认证
一、准备1、引入依赖service-base中引入jwt依赖<dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt</artifactId></dependency>2、引入辅助类service-base中创建包:com.atguigu.guli.service.base.helper引入helper:JwtHelper.java、原创 2020-07-09 20:45:35 · 109 阅读 · 0 评论 -
(109)Part29-微服务安全-访问令牌-03-JWT测试
一、创建Maven项目1、项目项目类型:MavengroupId:com.atguiguartifactId:jwt2、基本依赖<dependencies> <!-- JWT --> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt</artifactId> <ve原创 2020-07-09 20:41:08 · 131 阅读 · 0 评论 -
(108)Part29-微服务安全-访问令牌-02-JWT令牌
一、访问令牌的类型二、JWT令牌1、什么是JWT令牌JWT是JSON Web Token的缩写,即JSON Web令牌,是一种自包含令牌。JWT的使用场景:一种情况是webapi,类似之前的阿里云播放凭证的功能另一种情况是多web服务器下实现无状态分布式身份验证JWT官网有一张图描述了JWT的认证过程JWT的作用:JWT 最重要的作用就是对 token信息的防伪作用JWT的原理:一个JWT由三个部分组成:JWT头、有效载荷、签名哈希最后由这三者组合进行base64编码得到JWT2原创 2020-07-09 20:40:02 · 131 阅读 · 0 评论 -
(107)Part29-微服务安全-访问令牌-01-单点登录
一、用户身份认证1、单一服务器模式一般过程如下:用户向服务器发送用户名和密码。验证服务器后,相关数据(如用户名,用户角色等)将保存在当前会话(session)中。服务器向用户返回session_id,session信息都会写入到用户的Cookie。用户的每个后续请求都将通过在Cookie中取出session_id传给服务器。服务器收到session_id并对比之前保存的数据,确认用户的身份。缺点:单点性能压力,无法扩展。分布式架构中,需要session共享方案,session共享原创 2020-07-09 20:37:02 · 193 阅读 · 1 评论 -
(106)Part28-阿里云短信和用户注册-04-用户注册
一、后端接口1、定义RegisterFormpackage com.atguigu.guli.service.ucenter.entity.form;@Data@ApiModel("用户注册对象")public class RegisterForm { @ApiModelProperty(value = "昵称") private String nickname; @ApiModelProperty(value = "电话号码") private String mo原创 2020-07-09 20:35:19 · 289 阅读 · 0 评论