00:00
接下来我们就来编写下单功能,那下单的这一系列复杂操作,我们就用order service来做,如果页面提交我们的下单请求,希望order service能有一个方法,比如我叫submit order,把页面传来的请求数据拿来给们完成整个下单操作,那但下完以后呢,我们希望返回一个数据,这个数据呢,我们可以来参照页面,因为页面的下单可能有两种情况,第一种是下单失败,第二种是成功,成功我们去支付页,支付页呢,我们至少要订单的订单号信息,以及我们要支付多少钱,我们这个款项信息,所以呢,我们的整个下单操作返回至少包含一个我们的订单信息。第二个如果我们这个下单失败,我们还要来到我们这些页面来显示你到底是什么原因失败,是重复提交请求验价失败,还是哪些库存不足,所以我们还要显示失败信息,所以我们这样呢,我们就可以让我们的整个下单操作能返回这么一个VO,比如我们这个VO。
01:00
呢就叫submit,你的order response为O,我们整个下单操作的整个返回数据,那这个返回数据我来写一个data,那这个里边呢,首先包含第一个我们叫order entity,那订单的实体类,也就是说如果我们下单成功,订单的信息那就在这儿放着,数据库刚才插入的是什么订单,那都在这儿放着,那如果下单失败,那还可以给一个应配code,你的这个错误状态码,错误状态码如果这个状态码不是零,只要是零就代表我们的成功,好,我们来写一个零就是成功,然后呢,只要不是零,那就各有各的错误。那我们希望呢,就能感知这两个信息,暂时用这两个好,接下来就来让它返回一个order submit,应该是我们这个submit order response啊submit order response为O,那么返回这个为O以后,我们接下来就可以来根据我们这个O进行判断,如果说我们这个response为O,点一个get code,我们的这个状态嘛,如果是零,那就是下单成功了,我们这个成功我们就去支付选择页,那么把这一块的操作拿来,成功我们去这个页,否则失败了,那就又跳回到我们的这个to try页,所以我们可以先把这个跳回,先重重新写在这,提前写在这,好redirect我们重定向到HTTP冒号双斜杠,那们现在呢是order,我们订单服务鼓励mail点一个。com下边的我们to出的请求,To出请求呢,什么不用带,然后呢,他在订单确认页,我们相关的数据呢,重新再查。
02:42
遍,所以这是我们这个成功,那成功来选择的这个支付选择页,把这个支付页呢,我们也可以先放在这儿,这一块,支付页呢是我们的这个叫pay.html我们可以来看一下是不是这个pay order confirm,好以前的confirm页面是我们这个页面,那现在呢,有一个叫配页面,配页面呢,这是我们的支付选择页面,那就是它没问题,那现在呢,直接让它返回到这个配页面,要用什么,我们一会儿再说,那现在呢,就希望有这么一个方法,好,这就是我们的下单方法,好我们在这呢要进行下单操作,那这个下单的方法实现来填上,那这个方法的实现呢,我们就写在这,它的整个实现要做我们这一系列的功能。
03:31
所有的下单,那就是这一系列功能的组合,好我放过来,然后这一块我们就return不闲闹了,那现在呢,我就来完善我们的整个下单方法,那么整个订单的下单流程应该是这样子的,我们大体呢给大家总结成我们这么一个下单流程,首先我们这个提交订单,我们页面点击了提交订单,相当于给我们发了一个请求,叫submit order,相当于发了这个请求,然后呢,页面只要给我们发这个请求,他就会带上一些数据,我们这些数据呢,我们也都收到了收货地址信息,特别是收货地址的ID,我们收到了发票,这些我们没做,包括备注没做,我们令牌跟总价这三个呢,我们都收到了,所以我们收到了这些信息以后,接来们就要处理,当然处理的第一步就是先来验证令牌,所以我们来下单的第一步,第一步验证令牌,那么这个验证令牌是否合法,我们从VI里边拿到我们这个令牌信息。
04:32
VO里边带了一个令牌,然后呢,我们再去跟redd里边我们保存的令牌来进行对比,那redd里边保存的令牌,我们当时呢,是这么来存的,按照用户ID存到他的这个订单令牌,所以们现在想要用到当前登录的用户,我们直接从拦截器里边拿到我们这个当前登录的用户好。现在呢,我们就去red里边,这是页面提交的令牌,我们去red里边再来查一个令牌,点options for value,点一个get,方法我们要查令牌呢,那就是用这一串,这一串再加上这个用户的ID,我们之前给你放的令牌是什么,那你接下来就会查出一个令牌,我们把这一块拿过来,好,我们把这个令牌的查询,它应该是在下边的get,那么最终呢,会查出一个令牌,这个令牌呢,我们是一个string类型,所以这是我们这个red里边给我们来存的这个token,我们这两个token呢,要进行对比,If,如果我们这个red token有可能我们red里面拿不到,所以我们这个页面提交的这个token点一个equals,我们来进行一个对比,当然对比之前它必须不能为空,它不等于,那然后呢,并且我们这个页面提交的这个东西跟我们red里边的这个令。
05:54
令牌它是一模一样的,那这样我们这个令牌就验证通过,令牌验证通过,否则呢,我们这个验证不通过,不通过呢,我们就直接给它继续往下返回就行了,我们直接可以给它返回一个好,我们先来返回一个now,这是不通过,通过我们才真正要来执行逻辑,那么把这个通过的逻辑执行,我们来放在这儿,其实通过不通过我们都要返回这个萨密塔VO,那么就来准备一个返回数据,我们放在这,好,我们response为,我们就叫response,等于你有一个submit order response为好,那如果我们这个令牌通过,我们往下走,那不通过我们就还是返回这个response,无论怎么样都返回这个response,好,我们这一块呢就不用做,所以我们接下来就是来判断令牌通过继续往下做,但是我们说这个令牌对比我们写的这个方法还是有问题的。比如我们两次。
06:54
的订单提交,非踌这个人带了123这个令牌,咔咔两次直接点进来,然后呢,他们都进来了这个方法,然后呢,从页面拿到的令牌都是123,然后呢去red里边查,查到的令牌呢,现在都是123,然后他们两个对比都通过了,通过以后呢都执行了。
07:15
执行完了以后呢,我们再来删令牌,那如果用red的这个东西,因为令牌用过以后呢,我们一定要删,我们再把这个令牌直接来删掉的话,那就会出现我们这个还是重复提交的问题,如果我们这个用户点击的速度快,或者呢,第一次去red里边查的慢,第二次查的快,那导致我们这个只要没删,那都会出现这个问题,所以我们现在令牌只要验证通过,我们就一定要删,这个操作呢,优先得执行,所以我们说这个令牌的对比和删除必须保证原子性,验证令牌它的核心就是令牌的对比和删除必须保证原子性,那这个原子性怎么保证呢?我们就准备了一段脚本,所以呢,并排的删,定排的脚本,我们就应该是这样子的,对比和山顶牌script好,那么这一段路R脚本我们在这儿呢,之前在讲接口密等性的时候,如果我们使用token机制,那就应该使用脚本的方式来。
08:15
对比令牌这个脚本呢,我复制过来脚本的内容是这样子的,如果ready调用我们get方法来获取一个K的值,这个值呢,等于我们这个get出来的值,等于我们传过来的值,然后呢,它就会返回我们这个删除,把这个令牌删除,否则呢返回零,所以呢,正好就是我们令牌的整个对比这一块的过程,那这一块过的过程呢,我就注掉,我们就应该用我们的脚本来做,所以我们直接使用red点,如果我们想要执行脚本,我们有一个excute excute里边我们有第一个就是可以来执行一个脚本,那我们excu里边要执行脚本,它要传入的第一个是一个red script来点进来这个red script ctrl h打开它的实现,这个实现呢,首先这一块TT呢是返回值类型,然后呢,接下来我们创建这个对象的时候,可以传一串string的脚本。
09:15
包括我们创建这个对象的时候,也可以传入我们返回值的类型,所以我们说这个脚本呢,最终返回的都是零和一,我们这个脚本呢,返回的是零和一,大家注意什么情况下返回零就是呢?如果我们获取我们一个指定的值,这个值如果不存在,我们来看这块的if,如果我们这个令牌删了不存在,它就返回零,如果存在,然后呢,它就会调用删除,但这个删除呢,如果删成功了,就返回一,否则呢就返回零,比就说不存在,我们就删不了,删不了就返回零,所以零呢总是代表这个令牌校验失败,令牌失败,令牌失败一呢,就代表我们这个删除成功了,能删除成功,那就是因为对比成功了,才删除成功了,所以我们现在呢,就来执行么,这个令牌呢,传先得传一个default red script,我们都知道,这一块呢,泛型写我们的这个反。
10:15
回至类型,我们是一个浪类型的数据,然后呢,脚本就是这个脚本,然后我们返回至类型,我们直接写一个浪点class,我们返回到这个零一,默认呢是一个long类型,好,然后呢,我们把脚本传进来了,接下来第二个和第三个,第二个呢,传一个list的case,相当于我们要调用哪一个获取哪一个东西的值,而且呢,这一块写的是一个数组,它中括号一相当于获取到数组里边的第一个元素的值,它呢没有使用下边索引的方式,我们呢就直接来准备一个list a risk,点一个安姿list,把我们要验证的这个K我们传进去,我们要验证的K呢,是按照当前用户作为这个K,好,这是我们的K,我们给他传一个list,人家要什么传什么,然后第三个,第三个呢,还要传一个,我们来看一下excuse里,里边传一个object可变数组X,这个X呢,就在。
11:15
在这相当于我们要对比的这个值,那我们这个值呢,就应该是页面传来的值,我们把页面的值跟服务端的值,自己获取来的值来做一个对比,只要这个脚本运行完成,它呢,就会返回一个long类型的这个数据result,那么脚本的这个结果,所以我们只需要在这来判断,我们这一块的删索就是一个原子删索好原子验证我们这个令牌,原子验证令牌和删除令牌,我们一定要保证这一块令牌的原子验证和删除好接下来我们就来判断,如果result等等一,那就说明我们是删除成功了,令牌验证成功,那否则,否则呢,那就是令牌验证失败,那验证失败就不用往下做了,只有验证成功才接下来要做的事情,好,我们把这个验证成功放到下边验证。
12:15
失败我们来放到上边,如果是零,那就是验证失败,那验证失败呢,我们就来直接把这个一返回,我们也不用往下做了,走把这个RESPONSE1返回,那如果是验证成功,接下来就要做上一堆的事情,那就是下单的这一堆操作,这是我们说的原子验证令牌,那下一节课我们再来继续剩下的流程。
我来说两句