00:00
在完成购物车功能之后,就可以去结算啊。来看一下。结算的时候他并没有啊,给我们生成这个订单,只是给我们的一个预览的页面,就是告诉我们我们的商品还有数量,然后让我们去选择这个地址,最后才去提交订单,我们在提交这个订单的时候。才会真正的给我们。创建这个订单,也就是这个页面,其实都是一些临时数据,用来让用户去确认这个订单的一些信息的。是吧?所以我们需要准备一个API来提供这个页面所需要的一些数据,刚才我们从上面也看到了,这个页面需要用到地址,对吧?选择收货地址,然后是购物车的关联的一些商品的一些数据。我们来完成这个。API。首先创建一个订单的控制器。放到EP目录下。
01:11
接下来写路由。嗯,这个注释一下,这是购物车的有。订单的啊。订单预览页。Get就可以啊。嗯,数组订单。
02:00
控制器。API的这里面的那个啊,不要选到后台的那个去了。接下来是方法。好,那去这个控制器里面去写这个方法。我们需要返回地址信息。还是要返回啊购物车数据。对吧。哎,地址数据呢,我们现在没有地址表,等我们写到个人中心地址管理那里。购物中心地址管理里才会有这个地址的一个数据。
03:00
啊,现在我们先写一个数组啊,先模拟。然后写一个图图啊,以后方便我们回来改。暂时模拟。地址数据。收件人啊。然后是地址。北京。好,接着是收货的一个手机号,联系人。啊,我们就这样模拟一个地址啊。
04:02
给个ID啊。等我们有了地址数据之后,就把这里啊换成对应从数据库去查询的一个内容就可以了。啊,这是我们购物车的数据。从购物车里面去查询。查询当前这个登录人的。当前登录人的这个。购物车数据。同时查什么呢?查购物车里面就是被选中的那些商品。因为有些没有选中的商品,我们就不让他去预览这个结算的一个内容。好。Get啊,最后返回这个数据就可以了。
05:01
这里继承base control了。返回一个数组吧。啊,有地址数据,然后。还有购物车的一个数据。来看一下我们的接口。用这个吧。看一下路由是什么。这边加个S吧。Orders。PW。
06:03
重新生成一个。多了啊。是不是拿到这个地址数据了,也拿到我们购物车的这个被选中的,这上面我们选中了两条。因为只有。这两条都是选中的吗?啊,但是我们看一下啊,还需要什么,是不还需要商品的一些数据,商品的标题啊,价钱啊,以及我们这个数量。啊,数量我们购物车里是有的。对吧,这个数量是有的,那我们需要什么。商品的标题和。这个价格对吧。还有它的一些其他的属性,包括简单的一个描述。所以我们要。在这里加个位置啊。
07:05
关联商品的。按商品表。可以看到啊。哪个购物车是不是关联了商品的一个数据。啊,如果你感觉数据比较多的话,可以指定它的字段,比如只要ID。还有cover。还有抬头。啊,就拿这三个。这样它字段就会少一些。看到吗?Cover title,还有他还有ID。啊,这样的话。就比较简洁,就没有做拿这些描述什么之类的啊。这样我们订单的这个预览页。啊,就完成了。接下来就是。
08:01
啊,订单的一个提交页,也就是去生成这个订单的一个方法啊。哎,我们再写个路由提交订单,这个是生成订单的一个方法,我们使用post。使用套方法。去这里面去创建这个方法。提交订单。好,那提交的话需要request,把这个request加上request,我们来看一下提交订单都需要啊提交什么参数。找一下。订单的表设计。
09:05
好订单呢啊,我们需要这些为空的就不需要了,对吧,需要一个收货的一个地址,就是必填的,以及这个总金额,总金额我们要根据就是现有的用户的购物车里所有的选中的商品去计算。还有单号,单号呢,我们要自己生成。还有下单的用户啊,需要这些字段,那用户我们从当前登录的信息里面去获取单号,自己生成总金额,从购物车里面所有选中的商品去计算,所以真正你前台需要提交过来的是这个收货地址。是吧,是不是只要提交过来一个地址就可以了。其他的不需要吧啊。也就是说啊,这个提交订单验证的字段是比较少的,那我们就直接写到这里吧。他只需要验证一个地址字段吗?地址的一个ID。是不是?
10:04
对不对,并且它应该还要在这个地址表里存在,但是我们现在没有地址表,所以先写个todo啊。地址要存在。才行啊。1X。然后地址表啊,用ID做查询。这我先写个图度啊,那我们写了两个图度了,已经以后我们再回过来去改这个图度的时候,可以怎么去找呢。你要是说你找到这个文件,你再搜索这个todo就太low了啊,看到这里没有,这里有todo啊,你点的话,我们所有写过todo的地方,他都会给我们列出来。叫什么,然后点的话就会快速定位到这里。啊,这是我们写图图的一个目的,等我们后续有了相应的地址数据,再去回过头来去改这里啊。
11:00
你要养成一个写图do的习惯,有时候暂时我们不好处理的,比如说想着啊,或者过一会儿再处理啊,或者说过一两天再处理,我写好图do,以免到时候找起来比较费事啊。那这个消息也写一下吧。id.required收货地址必填,不能为空啊,验证通过之后就开始去插入数据库啊,但是插入数据库我们来想一想,我们这是订单。然后还有订单从表对吧,所以我们需要啊生成订单,然后。嗯,生成这个订单的详情是吧,需要创建这两个表,那在生成订单之前要处理这个数据。处理插入的数据是不是这样的好?首先看看要处理什么UID啊,这个比较简单,直接从also里面去获取就可以了,是这样吗?
12:04
右侧杠ID。嗯,不是啊,是APAAPI这个是选择首位,也就是看手器啊,这里是直接用ID就拿走用户的ID啊,接着这个,呃,还有什么呢,一个这个单号,单号的话是我们自己去定义规则去生成就可以了,叫什么。啊,这里,呃,我简单的生成一下啊。使用data。当前时间,然后我的格式化的这个。这样去格式化。这是年月日有了。然后再连上这个十分秒。接着呢,再去。啊,连上一些随机的一些数字。啊,Run的吧,从连上一个随机的六位数吧。
13:03
好,先简单的这么生成啊。这是我们订单的一个订单号。来先看一看我们这个订单号怎么样。请求一下这个地址。再来一个啊。把其他的给关掉吧,Close。Post的方式。认证消息。地址,API。API前缀。Orders。然后直接请求啊,他会告诉我们这个地址啊,不能为空,那我们把这个加上。转ID,然后写个随便写吧,因为现在没有地址表。是不是单号有了对不对。好,每次都不一样的啊。
14:04
当然你要是真正的一个商业项目的话,你可以写的再复杂一点啊,这个单号尽可能的保证每个人单号不。重复的啊,唯一的。单号有了,接着看看还需要什么数据啊。这个也有了,这个输入request里面获取就可以,那还需要一个总金额。总金额。这个比较麻烦。一开始等于零,他要怎么办呢?他要从我们的购物车里面。也就是。这个用户的这个购物车,然后所有他勾选的这个数据,然后按照商品的这个单价和。我们的这个数量去计算出来这个总金额清楚没有。是这样的啊。啊,所以说啊这里。
15:01
怎么办,我们要先,嗯,查出来这个数据。查出来一个购物车的这个数据啊。等于cut。Where u色杠ID。哎,购物车的这个数据,然后。Where?让他选中的啊,查他选中的。因为我们所有的这个购物车的这个提交也好,订单的这个预览啊,包括结算也好,全是基于购物车的这个数据去维持的嘛,对不对,如果你不建这个购物车的表,那么你只能所有需要的一些商品的这个ID,然后它的这个数量你都要每次都随着表单一起销过来,那是比较麻烦的。啊,等于一选中了,那既然需要计算总价,肯定得需要商品的单价,商品的单价在商品标志层的,所以我们要使用位置把商品这个数据给拿到,然后只要他的ID,还有它的价格。
16:15
就可以了是吧,哎,我们做计算用,又不要他的这个。啊。不要他的这个什么啊。图片之类的。哎,接着get就可以了。哎,最后我们去for啊,For一起去迭代这个数据,迭代的时候呢,我们把总价给计算出来。行吗?啊,当然它是一个模型,你可以直接使用这个一起方法去迭代也可以,好吧,这里我们写稍微简单一些。For each not cards。啊。TSS。
17:05
这里总价啊,它就加等于谁呢。加等于。TT里面的商品。它里面的这个价格。啊,它里面的这个价格。然后乘以谁乘以。这个里面的数量是不是这样的。好,我们来看一下这个总价对不对啊。那应该是没什么问题的。可以稍微去看一下。数量,首先数量大概都是一个两条,一个三条,然后ID一个八一个十嘛,去看看商城表,商品表。
18:05
一个八一个十。就这两个的看八的。是不是它的价格是。啊,一个是这个五万五一个是。这个两万六大概加起来就是。八万一八万二左右是吧,啊,当然我们存的是分。然后。这个它乘以二,它乘以三是吧,它乘以二的话,十,然后乘以三的话。这个大概是。八点几啊。然后看我们的结果。是大差不多的是吧,啊大概差不多的是对的啊,是这个这个总价。好。呃,总价计算完了,那是不是就可以生成订单了,对不对。啊,生成订单。订单啊,使用凹表。它的create方法。批量赋值啊,那既然说到这个批量赋值了,等会我们去看看它有没有设置允许批量赋值的一个字段,好吧。
19:09
来,先写上一个优色杠IDU色杠ID是不是,然后是我们的order。Number,接着是地址。我们这里商品表看一下。存的哦,是ID啊,没有错。行,先关一下,接着在这写他要从request里面表单提交过来的地址这个ID啊。才行,这样才行啊,接着还有总价。
20:04
哎,这样商品就能完成创建,但是我们要想要使用cur,在区域这里面去检查一下它有没有设置可以批量复制字段,是不是没有啊,又因为订单的这个字段呢。啊,你可以一个去写啊,一个一个去写,把我们这些批量复制的去写上也行啊这四个。好。啊,当然也可以直接使用啊,这个嘛。啊,这个是禁止皮复制字段,我们把它为空的话,就是所有所有字段都允许皮上复制是不是。嗯,也是可以的啊。那我们还是写这个背。充值的子弹。右侧ID。
21:02
订单号,然后是总价还有地址。好,这样就能创建完成对吧。但是我们在创建完成之后订单之后,还要为订单生成订单的一个详情。对吧,那订单详情存在是什么呢?实际上就是一条一条的商品,就是一条商品,我们存一个包括他的呃,所属的一个订单,然后商品的一个。就是说当前结单的时候的一个价格。啊,还有。啊,这个是上面一个价格,然后这个商品的一个ID。对不对。好,这是商品的一个数量。是不是我们需要这个数据,其实它是你想想我们这个订单详情,它是等于什么,是不是和我们购物车,我们选中的数据大概是一致的。是的吧,好,包括这些数据,除了这个订单的ID,我们在这里去循环。
22:01
这个购物车的时候是不是都可以拿到啊,所以我们定一个啊。插入啊,要插入的订单详情的一个数据。啊,到他银。等一个空数组。然后我们在循环的时候呢。啊,不断的往这个控诉组里面。啊,去附上这个值,也就是我们需要的这些值,这三个值都可以拿到的啊,比如说。商品ID是不是它里面的这个商品的这个ID。对吧,啊。啊,这是我们这样啊,打错了,然后。
23:00
是价格,商品的一个价格,那有人可能有疑问了,你订单为什么要存一个商品的价格?而你的购物车为什么不存?啊,这个问题其实我说过了购物车的话。如果商品我们调价了,购物车它是要跟着变的,对不对,但是订单我们已经结算完那些订单的话,它的价格就是我们,呃生成订单时候实时的那个商品价格,你不能随着你的说,你商品的加价或者减价,我订单也跟着变,所以说不能跟着变,所以我们订单要单独去存一个当前状态的商品的一个价格。明白吗?好,接着是一个数量。也是从购物车里面去取啊,因为购物车的话啊,随着这个我们支付完成,就是交易已经完成,购物车的数据随时都可能被用户清掉,或者我们系统给清掉,所以这个数量我们也会去存一下。嗯,就是他的购买的一个数量。这样就完成了,但是我们少一个什么,少一个O-ID对不对,那A-ID是在哪生成的,是在下面我们创建完订单。
24:04
哎,可以得到一个订单的一个模型实例,这里才有order ID对吧,那你是不是得想办法把它塞到这个速度里面,然后使用这个模型啊,这个order details这个模型去创建对不对。然后告诉你不用这么麻烦啊。我们既然订单里面,你看一看。看一下订单这个模型,它里面是不是有和这个细节的一个关联。对不对,那我们用这个模型的这个关联去创建这个数据,它会自动帮我们去把关联的这个字段给填充上,明白吗?好,那接下来我们就。啊,使用这个模型。他的。啊,它的这个关联关系。啊,先把这个关联关系给写上。好,加括号,加括号就得到了它关联关系的一个构造器,然后使用这个构造器的create many方法去批量插入数据,那插入的数据是什么呢?
25:02
是我们这个银色的data。就什么?关于这个在手侧的位置,我可以给大家说一下在哪啊,在模型关联里。这里啊。一块模型,然后有个模型关联,在它下面有一个插入数据,它有两个方法,一个save,一个create。啊所呢,你这里面是要给一个实例啊,就是一个模型,一个从表的一个模型。啊,而save many呢,是要给一个模型的一个数组,对不对?显然不符合我们的需求,但是接着往下看,有一个新增的话,Create create是直接接收数值就可以了,而我们要创建多条可以使用correct money是不是啊,它这个例子是为这个文章添加多条评论嘛,那我们的例子是为这个订单添加多条的一个订单详情是一样的啊。啊。这样就完成了订单的一个创建。对吧,好,但是他用到了create many,你要批量的去创建订单的一个详情,所以你要去检查一下谁。
26:01
订单的这个详情里面有没有配置。啊,可批量赋值的字段是不是也没有啊,我们写上啊可批量赋值的字段protect。等于我们批量复制的字段有什么?有or drd,还有?商品的这个ID价格数量是吧,这几个字段。哎,这样配置好之后才能去使用这个可买点去批量的创建这个数据好。最后在他也创建完成的时候,实际上我们就该删除这个购物车了啊,删除已经结算的。购物车数据啊,我记得这个像京东啊,他们也是就是说你从购物车里面你去结算,结算之后你再回来购物车,购物车里面数据是没了的,所以我们要删除,删除就比较简单,你没必要再去查一遍再删了,这里是不是已经查出来了这个购物车的,哎,我们这些被选中的这个这些数据是不是,这是不是一个集合。
27:06
对不对。啊。所以这里已经查了一次了啊,但它这个结果是一个集合,集合呢。啊,我们没办法去调用它的那个删除的一个方法。所以可以怎么办,所以我们可以把它给拆开写这里,哎,我们是它的一个query的一个构造器,对不对,然后这里里我们给上这个cut。让它啊,就说我们把它给分开。到这一步,我们这里到这个构造器这一步我们就结束了,给分号就结束了。清楚吗?然后我们继续使用构造器的这个get方法,是不是可以得到这个数据的一个结果?是不是这样的,好,那它这边既然是一个查询的一个构造性,我是不是可以调这个构造器的这个比例的方法,把符合条件的都给删掉。是不是这样的?啊,那所以下面我就可以去直接。啊调它的方法,其实不这么写也行啊,你直接再去复制一遍这个代码再去。
28:06
再去删除也行啊。行吧。我这里给大家说可以去这么去写,那我们嗯,如果感觉大家这个不好看的话。啊,那我们就还直接复制一遍吧,用它再去删吧。啊。嗯,那这个删的时候就不用加加这个数据了啊,那也不用get了啊,直接就是。Delete就删掉,把这个他选择的这些商品删掉,当前这个用户的好。只有到这一步,哎,我们的才算完成,但是我们来想一个问题啊,你看看。我们又生成了订单的数据,又为订单生成的详情,又清空了购物车的数据,这三个是不是都在操作数据库?其中任何有一步出错,就会出现一个数据的一个不可逆的一个问题,比如我们创建的订单,但是这里报错了,哎,这里没有创进来报错了,那是不是就没有了订单详细的数据,而且。
29:03
而且购物车的数据也被清了,这样是不是很危险的?对吧,而且购物车也不会被清或者被清,反正总之我们现在在操作三个数据库啊,三个表。是很危险的一个操作,那我们来举例给大家演示一下。假如。我们这里。我们不写啊,不写这个可批量赋值字段,不写可批量赋值的字段。那这里我用credit肯定会报错,对不对,他报错我们的脚本就结束执行了,所以下面的不执行,但是订单已经生成了,明白吗?来先看一下订单表,我们来做一个验证啊。呃,找到订单表。没有数据的,是不是找到这个订单详情也没有数据的。下面啊,我们来。请求这个方法。执行。好,他只要一个这个地址的ID就可以啊,哎,我们这里面也有。接下来请求啊。
30:01
可以看到报错了是吧,你看它不是这个可偏负的一个字段。也就是啊。再创建这个的时候报错了,我们没有设置,呃,允许可批量复制的字段是不是。但是它上面的代码是不是已经执行了,也是我们订单已经生成了,来看一下。数据库刷新一下,是不是订单已经生成了,但是订单详情没有。是不是会造成这样比较严重的一个问题。那我先把它删掉啊,先把它删掉啊。这时候怎么办?我们是不是要为这种,尤其是会像好几个表去写入的数据的这种情况去加。这个事物啊,加上数据或者事物,把他们三个给放到这个事物里面啊,事物呢,我们一般配合这个拆开机使用,这样的话可以去捕获这个,就是说在开启里面捕获这个异常,当出现异常的时候,我们进行数据的一个回滚串。这里写个K啊,我们使用love的这个异常内啊。Exception。
31:01
好,那当出现异常的时候。啊,我先让。这里我先开启开启这个数啊,使用DB这个门面啊,Begin,然后当你没有任何问题的时候,我在这里进行提交就可以了啊,当然我没有没有判断其他条件,比如说插插入成功什么的,我们直接判断它的这个异常的一个情况就可以了。好,没有任何异常,提交,提交之后返回是不是返回一个。A response,然后给他一个创建成功的一个响应嘛,因为毕竟是一个创建的一个操作,哎,接着如果出现异常,我要让数据库回滚啊,回滚之后我不仅要回滚,我还要给你把异常给你返回出去,让你能知道你你错在了哪。啊。好吧,来,接下来我们再来看一下。还是一样,它会报错啊。是不是这个异常,你看就通过API的形式给我们返回回来了,API在这看啊点这里。
32:08
哦,返回的话,他把字符串给返回来了。好,嗯,那我们改一改啊,我们。啊,抛出这个异常。啊,抛出这个异常不去反馈,这时候我们再来试。是不是就以成API的形式给我们把异常给抛除了?500啊。那我们来看看数据库order没有创建吧。因为。当出现异常的时候,我们这里就进行回滚啊,数据库并没有提掉,只有当我们全部都没有任何问题,这里才copy提掉。清楚吧,现在我们把这个可以被批量赋值的字段给打开,哎,这时候应该就能成功试一下啊。是不是201,我们来看看数据库的一个插入的情况,凹的表一条没问题,对不对。啊,单号用户ID订单ID状态地址都有啊,来接着看我们的详情。
33:05
是不是生成两条啊,每一条的一个单价,还有及以及它的数量,商品的这个ID,订单的所所属定的ID都有,是不是好,接着看我们的购物车信息。啊,在这呢,购车票啊。刷新一下是不是没有了啊,因为这两个已经结算过了,我就把它给删掉了,没有必要留这些用的一个数据了。好,这样的话。哎,我们的订单才算完整。
我来说两句