00:01
这节课我们来考虑一个问题。就是说。啊,假如我们的商品啊,我们这个手机我们的库存是100。然后一个用户下单了,对吧,买了100台。那是不是我们库存就没了。是不是当然他还没有还没有支付呢,他现在是刚下单,就是等待支付的一个情况,也是我们给他生成了订单。啊,他这个数量啊,存的是100,需要100台这个手机,好这个时候他没有支付,但是另外又来了一个人。他也下了一个单,也要了100台手机,然后更巧合的事情,他们在同一时间支付了,这样的话,也就是说我们现在有两个订单,这两个订单每个都需要100台的这个手机,对不对?当然我们库存只有100台。是不是?所以。怎么办?我们是不是得做一个优化?对吧,当我们生成这个订单的时候,要减去对应的一个库存量啊减去。商品对应的库存量。
01:05
对吧。来还有一个问题就是假如我一个商品的库存量已经是零了。但是有人呢,他在这个页面。啊,就是这个页面它停留了好几个小时,但是在这几个小时内呢,我的这个商品其实已经卖完了。这时候他提交订单,那我们肯定不能让他提交,对不对,这个商品已经没货了。你看因为我们没有刷新页面,现在页面一直在静止的呢,所以这里显示的是啊这个数量。啊,所以在生成订单的时候,这里应该还在加一个限制,就是在我们for的时候,这里去检查,如果啊,如果有商品。库存不足。不足。提示用户重新选择好吧,那这时候。我们就需要在这里接着去拿上这个库存量商品的这个库存。
02:02
好,还要拿什么呢?拿上这个title,为什么拿title?我要提示用户哪个商品库存不足。是不是好,这里加个判断啊,If。嗯,Cart所关联的。商品。然后。他的这个库存。啊,如果等等于零了,也不是说等等于零,这个库存已经不足以去应付你这个购物车里面的你这个number。是吧,这么去比,如果你的库存哎,小于。你是这个number,也就说你要100台,如果我只有50台。这种情况下怎么办?直接掉,直接掉。Return。
03:00
一个error。Either request。我们的消息,然后。直接啊使用这个商品的。他的这个抬头啊。然后连上这个空格空。存不足。请重新选择商品。所以下单是个很重要的话,一定要把各个条件都验证好。那接下来我们去,嗯,测试一下。好,怎么测试啊?首先我们去。啊,购物车里要加个数据啊,加一些数据才能去。
04:00
提交我们的订单啊。Po。api.test API。里面的car。啊,他是需要。看看需要什么商品的ID是吧?来找到我们购物车的控制线。加入购物车需要一个商品的ID就够了啊。你们还拿那个八和十这两个,我我记得是。可以用的啊。来加入。啊,添加成功,再加一个十。啊,因为我默认number都是一,所以他让我加入。
05:01
接下来再找一条数据。找一个。就这个吧。22。然后。我把它的这个数量给到非常大啊。Number。这已经很大了是吧。好。添加成功,为什么能添加成功呢?是因为我们这个加入购物车这里也没有做这个一个限制。啊,也就是你所加入的这个数量。你不能超过。商品的一个库存对吧,所以这里还要再加一个验证。也就是说。数量不能超过商品的库存。清楚吧。来,我们写到这里啊。
06:01
Number。Number这个我们用什么呢。自己去定义这个验证规则啊。嗯,在这里写。把这个购物车的先优化一下啊,然后再去优化这个订单的这个。库存的一个处理。这个是字段啊,这个是Y6。这个是我们的field。写全吧。好。这里要查询一下商品表。
07:07
比如说if。Request里面的啊。从request里面去获取这个商品的这个ID。啊,这里要柚子一下。如果。商品的啊,你这个number value。大于了商品的库存。啊,我们直接让你失败。数量不能超过。
08:04
库存对吧?啊。接下来我们再找一个试一试啊,找一个23啊。23、看看它库存是多少?5446啊。测一下啊。23,我还是填这么大好吧。是不是不能超过库存,就是要么我我不给number,不给number也能过去看是不是签成功,只要只要我给了。就不行。对吧,好。那接下来我们还有一个问题,也就是说,呃,先看一下现在购物车的一个数据啊。嗯。ID就是说商品ID是八十二十二二十三是不是。那现在我们的这个数量是实现了限制了,加不进去了,现在我再加一个23。好,又加进去了,现在会出现什么情况?
09:00
就23这条上面,它有两条记录。看到了吗?啊,我们先手动把它删掉,所以说加入购物车这里呢,还要进行一个优化,哎,就是呃。不能存在啊。同样的一条数据。其实呃,存在的话也可以,我们去干什么,去更新一下它的这个数量。啊,查询购物车。数据是否存在T等于什么呢?Car where要有两个条件,一个是user-ID符合条件对吧?再有一个就是商品的ID,就是用户加商品ID,你不能重复。清楚吧,再一个就是where商品的这个ID。
10:02
来,我们取一条就可以啊,If不为空,也就是数据库里已经有这条数据了。直接啊,更新它的这个数量。也就是它里面的这个number。等于。Input number,因为它新的一个提交,比如原来我是有一个这个数据,但是数量是一,但是我新提交了一个加入购物车的一个请求,是把数量改到了,改成了这个,比如说100对吧,所以我们去更新一下它的这个数量也可以啊,当你不想处理这个,直接返回也行。C5啊,然后不要忘了在这里返回啊。返回response。有的啊,这样。别人在使用片的时候可以做一个区分,哎,创建了农卡特做了一个修改,然后当这个出现错误的时候,我们也给他去返回了相应的一个错误。
11:09
这样的话加入购物车啊,这个逻辑才算就是说优化了一下之前啊,没有考虑那么多之前写的时候。那接着去考虑什么。考虑我们这个。订单啊。提交订单。提交订单,我们这加了个判断,也就是说我们在便利购物车这个商品的时候啊,便便利这个购物车这里面商品的时候,如果你的这个数量,你的这个库存。啊,就是说你的这个数量大于了商品的库存,我就直接给你返回了,兄弟们不让你继续往后走了,要不然会出现这种情况,比如说啊,已经库存是零了,你又下单了。是不是,所以要避免出现这种情况。嗯,接着我们测试一下。好。我们查的是选中的是不是。对吧,那这四条就选中了,那我们就直接去提交这个订单,提交订单呢,只需要一个地址的ID就可以啊。
12:05
看到吗?最后啊,减去商品相应的一个库存量,我们先看看这个拦截能不能拦截住啊,再来去完善后面的代码。啊,因为现在数据库里是有一条数据,这个数量是比较大的,肯定大于这个商品库存的,你七的这个商品的库存才多少,你来看看。70辆。在这儿呢啊。是不是很少,才5000多对吧,好。来。生成订单。POS的方式。把talking选上。然后参数。地址。是吧?
13:00
然后地址需要一个。钻石杠IDDDSD随便写啊。啊。他会啊,说这个商品库存不足,请推原商品对不对,因为我们商品名字是随机的这个英文的一个单词啊,随机的英文的这个字符,所以是这样的。我们现在拦截至少至少通过了。是不是这样的?啊,这样的话就不会是造成那个影响,比如说你的库存只有5000多条了,你要买1万条。好,那我们手动去改一下这个数据啊,手动把它改成一。嗯,那现在我把这些都不选。也都不选中,也就都不选中。我只选中了谁七这一个啊,为什么只选中一个,是为了。啊,看一下我们这个库存量的一个减少啊,当然库存量可以就说购买数量可以调大一些,比如说我调个1000,最后购买1000个啊。
14:00
啊,七的这个商品,它的这个库存量是多少。5000多是吧,所以。这里我们订单创建完成之后啊,要减去对应的库存量。就什么?但是。我们这个是。比较复杂的一个情况啊。因为这个是多个多条数据。啊,你看它这个是一个二维数组,也就是有多个商品,可能有多个商品。对吧。我们要循环去处理一下这个每个商品的一个数量减去对应的一个数量啊循环谁呢?循环这个数据也行,循环购物车也行。哎,我们查询了这个购物车这个数据也行。因为本来就是从购物车里面去减去的嘛。呃,一定要放到你的这个订单,这个创建完成以后啊,创建完成以后。知道吧,订单生成以后。
15:01
好,我们就循环这个这个数据吧,In色的对啊。你放最后去解。使用什么方法呢?使用模型啊。Where?ID等于dota v里面的。物质ID不,不能这么取啊。Dota v。嗯,我们不循环它循环这个购物购物车来。喜欢他。啊,这样的话,它里面是有这个商品的ID,我们就可以用对象去取啊,刚才我们循环的这个是数组,数组的话,你再用数组的方式去取,取它也行啊,其实这两个变量都可以啊。
16:04
啊,到时候看,然后让它的这个库存减去它里面的这个数量是不是啊,那你怎么减比较省事呢。我们拉有一个自增自减的一个方法,对不对,这是自检,然后你自检的字段,然后这个库存自检,自检的一个。这个值是多少?自检卡里面的number。什么?好,这样的话就会减去商品对应的一个库存量。明白吗?好。那接着我们来看一下,我们这个里面是加了1000对不对,而且是选中的一个状态,就是结算的时候会去。就是生成订单会按照这个来生成,然后它的数量是。5492是吧,我们来提交订单看一看。
17:04
库存不足。刷新下数据啊。1000。第七个。啊,不是这是22。哦,我刚才看错了,这个是购物车的ID啊,我们应该看这个商品的ID,商品ID22的话。我们来找一找,它应该是不够1000个的,我感觉。这啥?这里啊。看它的库存是多少。575是不是。对不对,无七五。啊,所以我们这里还要调一调575的话,那我就买500吧。等会我们来看看这个575它会不会变啊。下面接着提交。啊,201订单生成成功看一看。
18:01
购物车这条应该是被清掉了。因为我们。这个生成订单成功,它就会没有,接着我们看看它会不会数量减少。是不是,哎,这样就对了。啊。那我们来想一个问题啊,我们现在。只是订单创建的一个阶段,对不对?假如我们来想个情况,你这个商品有1000个库存,然后我来下单啊,我把这个1000个都给你下单了,但是我没有支付,我就在在在这儿下单的,我不支付,那别人还能买吗?别人是买不了。对不对,你让别人还怎么买。你这啊,一下子把人家的库存给减到零了,别人是不是买不了了。是不是有这种恶意下单的情况,对吧,所以呃,我们的商品呢,一般它会加一个字段,就是说限限购,你看各大交易平台。这个电商也会跟你说某一个商品限购啊,当然他们限购的数量一定是足够你去正常的去使用的,比如一个手机限购99,你买的了99台吗,是不是?
19:02
对不对,好,这是一种情况啊,假如。啊,即使是限购的情况下也会出现,好你手机限购99是吧,我一个人限购99。啊,我下单99,然后我100个人,我1000个人,我全给你下单不支付,那是不是你又没库存了,别人又买不了了,有这种恶意的用户对不对,所以一般我们还会有个什么机制,就是在你生成完这个订单,在你没有支付的时候,你的订单是有一个有效期的。啊,一般会给你告诉你订单多长时间后就会失效。清楚吗?啊,我们来看一看,比如说这个。啊,当我去提交订单的时候,他就会告诉我多长时间去失效啊,你们也可以找京东去试一试啊。所以说啊,我们也把这个失效的功能也给做上。啊,那怎么做呢?总不至于我们写个定时器啊,在这看着让你时间到了时效。是吧,那我们其实想一想,你要想做到这种啊,一到时间就失效你。
20:02
肌肉怎么办?你只能是基于这个。有一个东西就大家肯定一直在监听着我们的这个订单的一个状态,监听着我们数据库的一个状态,哎,当有这个。那超时的我们把它给。作废掉,是这样吧啊,那我们用什么来监听呢?在我们写这个项目的时候,一般我们会考虑去使用。嗯,计划任务知道吧,你如果是前台的话,你可能啊,我就用个计时器就可以了,对不对,但是后台我们脚本有些都是在后台运行的。所以这时候会考虑什么使用计划任务在中华林里面。也就是任务任务调度啊。在零里面我们习惯称为计划任务,这里面一般称为这任务调度。简单的理解就是说它会就是在指定的时间,按照指定时间去执行指定的一个。命令啊,好。简单看一下啊,这个写项目就直接用起来,首先你得启动调度器,我看一看我们的这个红死令它启动没有啊。
21:06
嗯,Control table,这个是进入计划任务的这个编辑啊,编辑计划任务,然后这个是让你选择编辑器啊。如果你不太熟的,你就用第一个吧啊。其实推荐使用VM,好,可以看到这里并没有任何计划调度。接下来呢,我们把这个计划调度给加进来啊。前面这个。就这么写啊,但是他这个我们再改一改。你如果在终端里面,你不太会用这个编辑器,不太好改的话呢,我建议你随便在这里去改啊,改好之后我们再就是说粘贴过去啊,剪贴过去。啊,他这个是进入这个目录,我们的项目录,然后执行PP阿迪对吧,然后主要是为了是执行这个阿迪son这个命令。清楚吧。好。嗯,我们怎么改呢,我们就不CD了啊,我们直接。
22:02
啊,直接。直接这么去写啊写用绝对路径PPPP执行谁呢?啊执行我们的项目。看看我们的项目目录在哪啊,这个我们先退出啊,CTRLX先退出。PWD,这是我们的项目目录,看到了吧?来选中复制一下啊。复制一下。粘贴到这里,也就是实际上是用绝对路径去执行我们这个项目目录下的这个。知道吧,用PP,因为这个计划任务它是在。啊,后台在进程中运行的,你如果不给绝对路径的话,他找不到这个命令在哪。好,这样我们改完之后。把它剪,就是说剪切一下啊。剪切,然后再去。Control table-一进入这个计划任务的编辑界面啊,在最后一行。你在第一行也行啊,都可以,他反正这些都是注释。都可以啊。
23:00
那我们就在最后一行加吧。好,直接。右键粘贴就可以了啊,你如果用的是这种。CMD这个就是右键粘贴,如果用的其他的终端啊,每个终端的粘贴方式不一样,自己看啊。主要是注意的就是这个我们artist命令的位置是我们项目所在的这个位置,好,这样我们就保存之后它就。啊,会有一个计划任务,他一直给我们监听着。然后CTRL加X,然后输入这个Y,然后回车就保存了啊好。它添加了新的一个计划任务,呃,这个呢,只是说我在Linux这个系统里面,系统层面去配置的这个计划任务啊,它会呃。每一分钟去执行。大家看一下每一分钟会执行这个命令,知道吧,好具体呢,其实。就是说每分钟去执行这个命令,所以说这个命令肯定是做了一些啊处理,去帮我们处理我们需要写的一些代码,对吧,那接下来看看怎么用啊,CTRLX结束掉。
24:01
接着往下看手册。嗯,我们可以使用计划任务的。啊,这个类。啊,这个对象去。调用这个靠壁包,然后在这个B包里面去执行我们的代码,然后后面可以设置上执行那个频率,比如每天呀每小时。清楚吧啊。嗯。这个方法中啊。这个啊,Console k里面这个方法中去定义所有的任务调动,我们先找到这个文件。Kel。就是这个方法中去定义我们所有的任务调动。看到了吗?嗯,我们简单的先写一个例子去测试一下吧,好吧。嗯,因为他这个计划就是任务调度,它可以执行这个B包里面的代码,也可以去执行一个卡的命令。啊,甚至去调一个队列,执行一个command,一个命令,或者执行队列的一个调度,或者使用这个cell的一些命令都可以啊。
25:06
啊,我们就不这么复杂了,不再去创这个artist命令,直接就在背包里面去写,好吧,在B包里去写,然后这是它可用的一些方法。来复制一下。嗯,当然也可以去啊,定一个对象,保证对象里面有一个这个方法也可以,这样的话你要找一个位置去存放你的这个类。我们就不这么麻烦了啊,直接在这写。就是把我们的代码写到背包里面啊,这个是每天我们去为了测试方便我去找个。呃,每分钟的啊。Every minute。啊,然后每分钟我让他执行什么呢?嗯,测试的话呢,我是。呃,写日志方便一些,清楚吧。
26:01
来看一下我们这个拉一个日志啊。我先把它都删掉啊,防止它出现这个。一个就是说繁忙的情况删不掉,就像这个啊。来。我用音符去每分钟写个hello,好保存就可以了啊。保存就可以了,可以上日志里面去写这个内容啊。接着啊,先让他去执行的,我们先去干什么呢看看。我们的这个逻辑啊,我们想干什么,让他的订单在。十分钟以后,时效就是把我们减去的库存再给还原回来。清楚没有?也就是我们得写一个啊计划任务。在这里啊,写个计划任务干什么呢?也是每分钟去监测,因为它这个你最小的单位已经就是每分钟了啊,这里每分钟。当然我们要频繁的去查询那个数据库也不是特别好。听什么,所以呃,真正的话,你要配合这个队列去使用。
27:04
配合这个。队列去使用啊。当然我们这里是简单的去使用一下这个这个任务调度,让大家看看怎么回事。
我来说两句