00:00
前面我们讨论了接口密等性问题,接下来我们接下来继续来完成订单的提交,首先提交订单我们要保证密等性,那么接下来可以使用令牌机制,我们在订单确认页到来之前,我们可以为这个页面呢生成一个令牌,把令牌比如我们来放在这儿,提交订单的时候呢,我们来带上这个令牌,我们去来验令牌,保证密等,那接下来我们就来订单的确认页这一块好,这一块呢是给订单确认页里边放数据,然后我们确认页的整个逻辑来总结起来就应该是这样,我们点击了去结算,然后我们发送了to出的请求来到我们这,然后接下来我们去来准备订单确认页的数据,大家准备数据之前,我们先要判断是否登录,如果没登录还要登录,登录了我们把这些数据准备好,比如购物车里边的商品会员的收货地址列表,我们全部拿到以后,接下来我们还要给页面创建一个防虫令牌,我们把这个令牌呢,我们先保存到red里边,那下一次验证我们还要从red里边拿。
01:01
然后我们给页面里边再放一个令牌,令牌存在两个地方,服务器一个页面一个,那下来页面接下来提交带上这个令牌就行了,那么接下来完成这个功能confirm order,好在最下边防虫令牌,防虫令牌我们要给red中保存,我们先来注入,我们有一个叫string。Red tablet,好,来写一个autowa,接下来我们就在最后一步给它做一个防冲令牌,这个令牌呢,我们当然用UUID最方便,U u ID random u u ID点一个图string rele,我们把它里边的这些短横线我们都替换了,好,现在我们就做好了一个UID的令牌,那这个令牌呢要返给页面,所以我们confirm VO,给页面给一个confirm VO set一个order token,我们页面呢有一个字段叫订单令牌,这是给页面一个,然后呢再给服务器一个,接下来页面跟服务器的就要进行对比,所以给服务器一个,那就red option for value,那给red里边进行保存就行了,那保存着这个K我们也可以放在一个常量里边,我们这个K呢,要经常用constant来专门准备一个订单的常量,Order constant,好,订单里边相关要用的常量。第一个常。
02:22
Public final们public final strength,我们这个user,我们就叫user用户的订单。令牌,这个令牌的前缀。这个令牌的前缀呢,比如我们就叫这样,我们就叫order token,然后我们准备放令牌的时候呢,这样放它的K就叫order talkingken固定前缀,再加上用户ID,我们就知道这是当前用户的订单令牌,那么接下来把这一块的前缀我们先来保证好,然后接下来我们在这来set order,我们的这个order constant,点一个use order token的前缀,再来加上一个当前用户的ID,当前用户ID,因为我们能来到这个方法肯定登录了,我们拦截器已经能拿到当前用户了,我们直接拿到当前用户的ID给这一拼好,现在呢,我们是K准备好了,Y6呢,那当然就是我们的这个令牌token,然后我们这个Y6在准备好后,我们这个令牌呢,也给一个过期时间,比如呢,我们这个防重提交这个页面一般就是重复提交,咔咔连续两次,所以我们这个过。
03:37
时间不用太长,30分钟一个小时,这都已经足够了。我们就假设以30分钟为例,我们写一个30TIME units,好,我们就叫分钟。那现在我们这儿呢,准备了一个防冲令牌放在这儿,那接下来我们这个令牌呢,给服务器存了一份,给页面存了一份,然后接下来回到页面,我们就可以来展示这个令牌,当页面想要展示令牌,比如我们给提交订单,我们找到提交订单的这个位置,我们给它前边可以来准备上一个CTRLF。
04:11
好,提交订单,我们给他呢,前边比如我们来准备一个input框,这个input框呢就专门来保存令牌,那这个input框的name我们就叫order token,因为我们将来这个令牌还要提交th value,我们能来到这个页面,已经给他准备好了令牌,我们可以来取到这个令牌,令牌呢就在older confirm这个data里边,好,我们这个data里边专门有一个order token。我们来到这个页面之前,我们service已经放好了一个令牌,我们可以在页面进行显示,来CTRLF9来编译一下页面,并且呢,我们这个方法也修改了,它也会自动重启我们的这个项目。我们现在来做一个测试,来等待这个项目呢,重启完成,我们来刷新,首先这一块呢,没有登录,我现在登录进来。
05:01
登录进来,我们重新去购物车结算,选中两个商品,那只要来到我们这个订单页,那订单页这一块会有一个令牌,这个令牌没有显示的原因,我们这个服务器,我们写的这一块service代码没有让它重启,重启一下。手动重启,或者咱们按CTRLF9这个类呢,它也会重新编译,我们还是手动重启比较好。我们等待订单这个项目启动成功啊,这一块呢,启动成功,来刷新一下页面重新刷新。那现在呢,已经是登录状态,来到我们这个确认页,我们发现呢,就有一个令牌,以后提交订单就得带这个令牌,当然我们把这个东西呢,得隐藏起来,不能在这儿显示,所以我们把这个令牌呢,可以来写一个T,等于黑的,那这是我们给订单确认页,我们放了一个令牌,那接下来我们这个确认页的数据我们就准备好了,而且这个令牌放在这儿,只要我们不刷新页面,那刷新页面肯定就改了,因为我们刷新。
06:01
又发了一次请求,又生成了新的名牌,只要不刷新页面,我们在这连续两次提交,那都是重复提交,所以接下来我们要写的逻辑就是我们来点提交订单,就要把订单确认页需要提交的数据提交数上去。首先我们来分析,那么这个订单的结算页我们要提交哪些数据给我们真正的下单请求,假设呢,我们这有一个提交订单,它专门有一个请求来处理,我们先来写好这个controller,那假设呢,这有一个controller,这个controller呢就专门叫submit order,我们现在呢,准备提交订单了,我们要把订单的一些数据给我们提交上来,我们要真正去服务器创建订单,要做这些事情,好,提交订单要提交很多数据,我们就来先写一个post满,那么这个方法呢,就叫submit order。好,我们要提交的订单数据有哪些?我们提前先准备上一个VO,比如我们就叫order VO。
07:00
Submit VO,那么假设呢,有这个VO,然后我们就来提交这个数据,我们把这个VO呢创建出来。买这个VO创建的我们这一块的VO这个包下走,那么现在呢,准备了一个封装订单提交数据的这个VO,这个作用就是封装订单提交的数据,那订单提交的数据有哪些来分析页面。首先我们这个页面我们肯定要提交你选了哪个收货地址,说们第一个private浪类型的ADRID,我这个收货地址的ID,这是我们页面要提交的第一个,第二个我们提交使用哪种支付方式,我们其实要提交的,这是我们现在系统呢,我们就演示上一种都是在线支付,那叫拍tap,那这个支付方式在线支付还是货到付款等等,然后接下来。第二个我们要提交的送货清单,比如我们可以选快递等等,在这一块我们现在呢,没有做这一块的功能,我们也不用管了,接下来我们要不要提交我们这个订单,要购买哪些商品,没有提交的话,每一个商品的ID我肯定都得提交,但是大家注意,我们看京东是怎么做的,比如我们京东来到我的购物车,我呢现在先选中上两个商品,我来点击去结算,那么去结算以后呢?
08:25
我们现在看到我们这儿呢有三件商品,那我们之前购物车里边选了三件商品,但是大家注意。我们这三件商品呢,我想要结算,现在呢,价格是1613,如果我再来多选上两件商品,比如我们来选上这两件商品。我们订单的确认页我们没有刷新,我们购物车呢变了,我们在订单确认页,我直接点提交订单,然后它就会提示,诶有一些商品呢,库存不足,但是哪些商品呢,还包括我们之前选了的这个积木信息,那么现在呢,都来选一些库存足的商品,来把这个购物车里边所有的商品我们都来清空。
09:04
好,我们把这个全选选中,全部选的也选中。我们现在呢,就来选中两个有货的,这有一个有货的,我们现在假设只选中了一个商品238,我们现在呢要购物。我们现在来准备好购物车,购物车我来刷新,我们之前呢只选中了一个商品,就是这个238,但是呢,在我订单的确认页没提交之前,我再给购物车再来购一个商品,我们现在呢总价就成了我们带上满减成了202,我们这块呢看起来238,但我一提交订单,然后呢,我们发现价格变成了202,订单详情里边呢,我会发现有两个东西,所以呢我们会发现京东的这个订单,即使我们去来提交订单,它也是呢实时的去购物车里边再获取一遍数据,再算一遍金额,所以呢,我们的订单确认页,我们提交订单的时候,其实无需提交我们所要购买的所有商品,我们去购物车再取一遍就行了,所我们在这一块备注一下,无需提交。
10:06
需要购买的商品,购买的商品。然后呢,去购物车,去购物车。再获取一遍,所以我们这块呢就不提交,再来看页面还要提交什么,比如页面呢,可能还要提交一些发票信息,他要使用哪些优惠券,要使用哪些积分抵扣哪些金额,这些可能都要提交,那我们现在呢,这一块没有做,那就放在这儿,优惠发票等等,这些就是多一些input框,再来提交就行了。然后再接下来我们肯定订单提交的时候要带上我们的令牌,所以我们private得准备一个我们的令牌,那这个订单确认页,因为给他这一块呢放了一个令牌,这个令牌叫older token,所以他一提交呢,会把这个token还在带上,所以我们要拿这个token防虫,所以他下次提交还要带上这个防虫令牌,这是我们的防虫令牌。然后我们来看订单还需要哪些数据,我们可以再来提交这么一个数据,就是提交我们订单的应付总额。让我们这个订单结。
11:15
算页知道我们这个应付的总额是多少,我们提交了应付总额,我们还能做一个功能,什么功能呢?我们看京东之前是我们,即使我们订单这块我们确认是184,然后呢,我们真正一提交却变成了别的价格,我们都没有跟用户确认,所以我们接下来如果我们订单确认一下,能给我们提交订单的时候提交一个价格,然后我们自己订单再算一个价格,两个来对比,我们称为验价,如果我们验一个价,验价通过了,那说明我们要买的这些商品,用户的这些东西没有发生变化,我们可以直接给他购买,如果验价不通过,两个不一样,那我们还可以提示用户,可能购物车里边哪些商品价格发生了变化,让他注意一下,所以呢,我们也可以来让用户提交一个我们备个decim类型的pay price,我们的应付价格,那这个应付价格呢,最终我们想要做一个功能就是验价,但这个功能可做可不做。京东没有做,但。
12:15
哎,也可以不去做,那现在呢,这是我们的订单确认页要提交的数据,那要不要提交我们当前订单是哪个用户提交的订单呢?其实这些也不用,我们用户的所有信息都在session里边,只要一登录用户相关信息,只要一登录呢,我们每一次任意请求,我们都会带上我们的这个cookie cookie代表我们的解session ID,我们从session里边能取到用户,所以用户相关信息直接去session中取,取出咱们这个登录的用户,所以我们目前按照我们的这个订单确认页,我们现在呢只需要提交这几个数据,当然如果想额外再提交了,比如我们订单确认页里边还有一个订单的备注,诶,我们提示点,外卖呢,我们提示少放辣,多放两双筷子等等等等,那所以我们这一块呢,还可以来写一个订单的备注,Private string类型的note,好,这是我们这个订单备注,来我们这个页面呢。
13:15
啊,也没做这个备注信息,那么就放在这儿,想要做备注再加一个input框,所以我们最终呢,准备就是所有订单要提交的数据就是这些数据,这些数据呢,以一个表单的方式来提交,这是我们这个提交下单功能,我们这个下单。所以呢,我们这个方法一旦一执行,我就应该去服务器创建订单,创建订单然后按照我们之前的逻辑,要验令牌,验价格等等一大串,我们一会儿再来说验价格,包括呢,我们还要锁库存,因为我们要下单嘛,肯定库存得锁住,不能人家都支付成功了,说我们这个库存没东西,所以呢,我们接下来等等要做到复杂操作都到我们的这个下单操作,那么整个单下完了,那就像京东一样,只要我们下完了,就应该来到一个支付选择页,所以呢,最终下单成功工来到我们这个支付选择页。
14:18
如果下单失败,下单失败可以继续来,回到订单确认页,提示他这个订单,让他重新来确认一下,回到我们这个订单确认页,重新确认订单,重新确认订单信息好。所以呢,这就是接下来我们要做的下单功能,当然在下单之前,我们一定要保证我们页面把这些数据能给我们提交过来,所以我们现在呢,来confirm页面,我们来修改一下confirm页面我们要提交的数据呢,有很多这个呢比较简单的方式,我们可以找一下我们的这个提交订单的按钮,提交订单,假设呢,我们这个提交订单的按钮,我们给它做一个form表单,好form母表单,然后呢,这个form表单只要我们一点这个提交订单,这个提交订单这个按钮呢,必须type是submit,好,我们之前呢,好像没有type submit,我们可以给他自己加上type。
15:20
然后呢,我们这个表单要提交的地址,那就是我们可以来写一个全地址HTTP,那现在呢是订单符order,点鼓励ma点一个comment,我们。com下边的我们提交订单有一个叫submit order。我们直接把controller这一块的请求路径复制过来,这就是我们订单的地址,包括我们订单的请求方式,我们现在接收POS方式,订单里边要提交的数据,Order token算一个,所有数据呢,我们都在这儿来准备好。每一个input框,因为这些数据呢,我们都必须给它隐藏起来才合适。
16:00
要我们要提交的这个小表单,我们现在隐藏起来,要不然展示在页面,把表单的东西展示在页面,这一个input,那一个input,挺奇怪的。所以我们现在要提交的数据,我们就来参照我们的这一块VO。我们把我们的这个VO拿过来,我们看第一个ad drd,我们的收货地址的D,所以我们来name就叫ADDLDY6是多少,我们一会再说,然后呢,我们再来准备,我们还要提交type,我们还是一个黑name,我们看订单确认页,我们除了提交收货地址的ID,还有我们的支付方式,支付方式呢,我们这个就不提交了,我们现在呢,都以后来演示支付宝的在线支付,那接下来再来一个我们的防冲令牌,防虫令牌呢,在我们这儿已经有了order token,那我们的核心数据再来一个我们的价格应付价格。所以我们这个订单呢,到底要付多少钱,我们在这儿呢,再来做一个设置,只要这些数据准备好以后,包括订单呢,备注想加了,再加上我们现在呢,核心这三个数据准备好以后,我们来点击提交订单就行了。
17:12
那这三个数据从哪来?首先第一个收货地址的ID,就是当我们每选中一个收货地址的时候,一定要把ID回填过来。那为了回填方便,们给每一个input框都给一个ID,我们就叫它们的这个input好。我们现在呢,这个框的ID,我们就将pay price的,还有我们这个input框的ID行了,我们这个定order talking,我们直接可以Dollar大括号取出来,剩下的呢,我们都要在合适的时机取,首先取我们的地址,第一个就是当我们来随便选中一个地址。他在这来改运费,改总价的同时,应该把地址的ID也同时赋值给我们表单的这一块值,所我们来看我们地址的这一块。
18:02
我们地址的选择改变,我们地址的选择改变呢,在这儿这一块呢,拿到我们的地址ID,它获取地址相关的信息,除了获取这个信息外,我们还要回填我们地址,所以我们只要在这儿他要获取我们哪个地址的东西,所以我们现在的地址就是我们这一块的内容,我们一定要放到这个方法,因为这个方法呢,页面一加载,它也会调用,所以我们这个方法呢,我们要给表单,表单回填,回填我们这个选择的地址,回填选择的地址来,我们直接找到表单的这个元素就行了,那现在用ID找也非常方便,有一个ADD input,直接调用它的value方法,让这个值呢,给这一赋值。这就行了,这就是我们地址的回填,第一个就完了,接下来第二个,第二个再是我们的这个应付总额的回填。
19:00
我们应付总额呢,在这儿我们也会做一个计算,我们在这儿只要找到了地址的运费各种信息,我们在这儿设置收货人,收货人这一块呢,这就是设置运费,设置应付总额,所以这个应付总额这一块呢,除了设置这是我们应付的真正总额,我们把这个总额拿出来好,那就叫Y,就叫pay price,这才是我们要付的总额,我们算出来了,那算出来以后呢,除了给我们这个位置设置一个文本,给这个位置设置文本外,把应付总额呢,还应该设置给我们指定的这个表单应input框,你叫pay price的。这个input框好,第二一个我们Y6值,我们这个VALUE6值呢,把这个设置进去,那表达的这两个数据呢,就有了CRLF9那页面刷新一下,因为这个controlrler之类的方法也变了,我们最好呢把这个服务重启一下,特别我们只要提交表单,那s out在这来打印一下订单提交的数据,那就每次来看一下这个数据对不对,走我们重新把订单服务启动一下,我们现在在这儿呢,来重新做一个提交功能。
20:15
我们等待我们这个订单服务现在启动完成,好,既然启动完成了,我们现在重新来刷新一下。我们现在是我们这个表单的数据,数据呢肯定有回填,我们先来右键审查元素来看表单里边的每一个数据,Adt,包括我们应付价格也回填了,只要我们变上一个点一下ad应付价格也都回填了,我们的这个令牌也都在,所以只要我们这个提交订单,那就应该我们这个控制台能收到我们提交来的订单数据,来看一下提交订单,好,我们不管他这五百六百,那现在来看一下我们的控制台。控制台订单提交的数据好,ADD2没问题,订单的old token也也OK,包括我们的价格行,现在呢,都提交上来了,那就没问题了。
21:03
那下一节课呢,就来做完整的下单逻辑。
我来说两句