00:00
好,接下来呢,我们先来编写添加商品到购物车的功能,因为我们要查看购物车的整个购物项列表,那我们先得将商品添加到购物车里边,那们就先来写它,那么还是通过页面的跳转逻辑我们来看,首先我们这个页面,比如我们来进入到我们整个商品的列表页,好,我们现在随便点击一个商品,当我们来点击加入购物车,它会跳到我们的这个请求,执行我们and to cut添加商品到购物车,执行成功以后呢,就会返回我们刚才把哪个商品填到购物车里边,但是现在的问题就是我们把一个商品填到购物车,不能直接简单的就来调用这个方法,因为至少得告诉购物车我们要把哪个商品添几件添到购物车里边,所以点击这个链接的时候,跳到我们这一块,我们这一块呢,至少需要两个数据,第一个是呢,我们当前的商品IDSQID,第二个呢,是我们要添几件,我们的数量应配的。
01:00
Number,所以这两个请求参数呢,是必须有的,好,我们来写上request poem请求参数的第一个,我们要将哪个商品,然后呢,添几个数量填到购物车里边,Request a power,好这个参数呢,就是number,那这两个呢,现在必须有,那同样的我们的商品的这个详情页,咱们来点加入购物车,我们就要执行这个功能,好我们找到我们的商品详情页来修改一下它的这一块,跳转来让他加上这两个参数来的商品详情页item里边来找一下我们的加入购物车按钮,加入购物车按钮,加入购物车按钮在这来点击是跳转到这个地方,好这个地方呢,我先复制上来,那先让它不跳,我们来ref,我们来写一个井号,给一个ID,这个ID呢,我们比如给一个我们的这个and to cut,我们的这个超链接A,然后呢,我们点它就要去跳到。
02:00
一个地方,因为我们要跳到那个地方,还要拼接上我们的购物车的添加商品的ID和数量,我们要拼装两个参数,所以我们就不在这来写超链接的值了,我们来给它绑定,单击事件ctrl end,好,我们在这使用Dollar符小括号来使用ID井号找到我们的这个元素,当我们来点击以后,我们来执行我们的回调方法,点击以后呢,我们想要跳转到一个地方,我们location h ref,我们就指定跳到哪个地方,同样的我们一定要return force,那禁用掉我们的默认行为,超链接的默认行为我们跳到哪呢?那就是HTTP,我们呢,现在添加商品到购物车是要跳到我们的这个购物车and to cut这个页面,好,我们把这个页面呢来复制过来,那现在想要跳到这儿,但现在跳到这儿,我们就必须加上两个参数,第一个是商品的ID是哪个,然后呢,并且我们还要加一个参数,就我们商品的。
03:00
的数量,这都是要参照我们的购物车服务,购物车服务的这一块还要有一个商品数量,那么就在这儿再来添一个参数叫商品数量,那这个ID和数量怎么获取,我还是来找到这个购物车按钮,这个加入购物车按钮呢,在它的这个旁边,这有一个数量,这块数量的增减方法我们已经写好了,所以我们只需要获取到这个值,这个数量的值呢,其实就是这个input框,好,我们给它给一个ID,比如呢,我们就叫number input。好,然后呢,我们把这个input框的值拿到,这就是数量,来ctrl end,好们先来拿到它Dollar幅小括号,井号,因为这是一个input的框,想要获取Y6值直接拿到,好,这个呢就是我们真正的数量nu,我们把这个数量呢,要拼到我们这个问号后边就来加上,除了数量之外,我们还要拿一个SQ的ID,这个商品的ID我们怎么知道是哪个好,来找到这个按钮,这个商品的ID呢?我们当前是商品的详情页,商品的什么信息都知道,我们商品的标题也好,包括它的价格,销售属性组合我们全知道,所以我们想要知道ID也不难,而且呢,为了我们点击链接,我们能获取道这个ID,我们给他给一个自定义属性,使用R,那加一个自定义属性,自定义属性呢,我们就叫SKUID表示当前商品的ID,真正的值呢,我们do了福大括号给它取出来,那么可以来看一下我们这个。
04:32
商品服务那们这个详情页的展示,我们web这一块来展示详情页的时候,能给我们的请求域中放了一个叫item item里边的详细信息非常多,在这一块呢,什么都有,那么就来还是直接取出item item里呢,会有一个点一个,那商品的详细信息有一个info封装的,我们主要要它的SQID,我们来找一下SQID,诶,确实有,那这样呢,我们来点击这个按钮的时候,CTRLF好能绑定单击事件,我们也可以找到当前按钮Dollar this this就是当前点击的按钮,我们取出它的自定义属性,我们使用at tr,我们有一个自定义属性叫SQID,它的值是多少?哎,我们拿过来就知道挖一个SQID,好,我们把这个SQID拿来,我们给这来拼装上,好,把这个页面写好,来CTRLF9来重新让我们商品服务的这个页面编译一下。
05:32
那现在来看一下我们的这个页面,我来刷新,那当我来点这个加入购物车的时候,来点击加入购物车,我们跳到我们指定的位置,我看到我们还拼装上了SQID以及我们的number这两个,那现在拼好了,但是我们的这个购物车的服务没有启动成功,好,我们购物车的服务我们再来重启一下,而且我们购物车的服务呢,由于我们这个重新都编写了,所以我们现在来重新启动,来重新启动。
06:03
我们现在来做一个完整测试,我们还是来到我们的商品首页,鼓励妙烫,我们现在先来看我们的商品信息。点一个好,随便来到一个商品,现在就是它来准备要把它加到购物车,我们比如我们来调整上五个数量来看一下,当我们来点击加入购物车,先保证我们购物车的这个服务启动起来。好,我们现在来加入购物车,来点击加入购物车,好,现在呢,我们调用了and to cut方法,而且呢,传递了SQID以及number这两个参数,那传递了以后呢,我们相当于我们的方法就能获取到这两个参数,接下来我们就希望购物车的service帮我们来执行把一个商品添加到购物车的功能,好我们让controller注入购物车的service car service service at,一个autowa,那么希望购物车service将来有一个方法就是呢,叫and to cut,把一个商品添加到购物车,哪个商品呢?那就是这个商品添加几件,那就是这个数量,我们把这两个呢都拿到,然后呢,我们只要添加成功了,我们应该返回的是什么,我们看页面需要什么,我们就返回什么,我们页面呢,需要我们刚才添加成功的这个商品的详细信息,那这个信息呢,其实就是当时的这个购物项,我们给购物车里边添了这个购物项把。
07:27
这个购物项的详详细信息拿来,所以我们应该返回添加的这个购物项,购物项呢,我们封装了一个cut item封装了一个这个,所以我们希望它返回我们这个购物项,然后最终为了在页面能展示这个信息,我们将购物项的信息我们放在请求域中,我们写一个model,好,我们这个model里边点一个and attribute,那我们就叫item们刚才添加的内容是什么,我们放在这,然后我们来到我们的success成功页们,把购物项里边的数据呢来编利一下就行了。好来到购物车,当然我们这个购物车的service,我们一会再来写我们购物车的页面,这一块我们添加成功了,来到这儿来看一下我们需要便利的是什么,他说这个商品添加成功这一块不需要便利,然后呢,接下来这一块呢,是商品的图片路径,这个是需要便利的,好,我们来TSRC,我们这个商品的图片径,我们应该是这样,Dollar福大括号我们。
08:27
就放了一个item放里边了,然后呢,Item有当前商品的这个图片信息,所以我们直接拿到图片就行了,这是它的图片路径,还有我们的这个商品的名字,来看一下这个div里边是名字ctrl all,我们来代码格式化整理一下,来看一下这个名字,名字的这些完整内容,那我们就应该给它变成th test,那真正的内容我们就应该到大咖取出来,怎么取呢?那就应该是item item,我们详细信息里边有当前商品的名字们商品的名字就是这个抬头,好,这是商品的名字信息,包括我们商品到底有几个数量,那在这也应该取出来PH test,我们这个数量呢,还要拼装上我们这个动态的值,诶,我们之前都预留好了,好,那现在呢,直接拿到我们item item里边的详细信息里边专门有一个count,我们商品数量的这个基数,包括我们商品的。
09:27
啊,详细信息我们来看,我们添加成功以后,点这个还能链接到商品的详细信息,这个链接呢就在这,详细信息就在item,我们叫鼓励mail,你们商品的详情我们来看一下我们商品的详情,我们鼓励ma com,我们商品的详情的整个完整路径就是这个叫item鼓励ma com,然后呢,加上商品的ID,好,我们把这块呢全部复制过来走,那我们商品呢,想要超链接,要练的地方就是在这,所以我们THTHRF,我们真正的值我们就来取出来,那先用单引号好拼装起来,然后单引号中间的这个二是一个动态的来单引号,两个单引号呢,我们来一分割来加上加上动态的值,就应该是刀符大括号,那item里边拿到当前商品的ID就行了,SQID好,没问题,我们就还会练到它之前的位置。
10:26
以至于我们这一块查看商品详情也是一样的,我们直接把这一块的超链接地址,我们给这一复制好,把这一块呢一复制都一样来CTRLF9,那我们这个页面呢,这块就写好了,然后我们主要的这个CTRL了,我们希望service有这个方法,好,我们现在呢还没有这个方法,它重启失败,那么就慢慢先添上这个方法,那页面呢,我们写好了,加来的功能就在我们这个方法了,那我们现在呢,给service添加上了这个方法,好,接下来我们就给我们的实现来添加上我们的这个实现,这个实现呢,就是给我们购物车里边添加数据,好添加数据呢,因为我们添加数据整个操作的都是red,所以我们将red也能注入过来,我们来进行操作,因为red呢,我们之前都自动配置好了,我们想要用直接自动注入就行了,这都是spring boot帮我们自动配置的,好拿过来,那现在想要操作购物车,那现在我们就得有一个问题,这个。
11:26
购物车操作,那我们到底是用户登录了还是没登录,我们要操作离线购物车,还是我们登录后的购物车,也就是说购物车是用临时的还是登录后的,我们要想知道用户登没登录非常简单,请求能放给controller的这个方法我们拦截器就已经执行了,我们拦截器都能得到用户信息,所以我们直接在service里边它的实现里来得到我们当前的用户信息,走,只要是我们同一次请求,我们在任何位置都能得到这个用户信息,然后我们接下来判断一下就行了,因为我们这个要操作购物车,我们最终是这样子的,我们希望呢,我们red里边有这么一个key呢,比如我们就叫cut,代表我们购物车,然后呢,加上我们的用户ID,用户ID是一代表一号,用户的,如果是临时用户,那就是一串UUID,所以不管是怎么样,前面呢都是我们的整个前缀,前缀呢作为K来找到我们这个内容就行了。
12:25
所以我们就在这先来判断,我们到底要在red里边增删改查要用哪个K,好,我们先来决定用哪个K,我们就来判断if,如果我们的这个user info,大家想啊,我们添加商品到购物车,如果用后登录了,肯定是给他用户的登录后的购物车里面添加的,我们不可能给临时购物车里面添加,只有没登录我们所有的操作才在临时购物车里面,所以我们在这儿来判断。如果user info这个to点一个他有这个用户ID get user ID,如果他有这个用户ID,不等于呢,说明人家登录了,登录了我们肯定就要用登录购物车的这个件,当购物车的所有的件,它有一个前缀private,我们现在呢就叫final,我们的string,我们购物车的前缀car prex,我们购物车的整个前缀是这样的,好,我们pre,那现在呢就叫它我们购物车的前缀,比如我们就叫鼓励mail冒号cut,购物车冒号加上自己的用户标识,一号用户,二号用户还是临时用户好,我们前缀呢就在这,我们现在就来决定们购物车要用的件到底是哪个好,我们就叫cut key cut k的值到底是哪个呢?那就应该是这样子的,如果我们用户登录了cut key就应该是我们的这个购物车的前缀。加上。
13:56
我们现在用户都登录了,再来加上他的这个用户ID,那相当于最终那就是我们组织的这样鼓励mail cut1,那否则用户没登录else,那就用它临时购物车,所以我们的这个cut key就应该等于临时购物车呢,还是我们的这个固定前缀,走,再来加上零时购物车,我们都给它放在了这个临时用户,我们所有的购物车的这个标识,用户标识,我们就用临时用户的user k ctrl all代码整理一下,好,我们在这呢就来决定用哪个购物车就行了,所以我们以后red增删改查某一个用户的购物车,那相当于就要增删改查这个件,那我们把这个件呢决定好了,那接下来就来做我们的事情,好,现在我们要操作购物车,我们将要将一个商品添加到购物车,所以我们要将商品添加到购物车,我们还应该有两个操作,大家考虑一下。
14:56
如我们购物车里边之前有了这个商品,相当于redis里边保存了,那么只需要把reddi里边购物车当前的这个商品数量改一下就行了,如果没有这个商品,我们还需要给redis里边新增我们这个商品的信息,所以我们现在就得判断们当前的这个购物车好,我们当然购物车在这我们要操作red,因为我们购物车我们的数据结构类型是一个哈希,我们之前分析过了,所以我们使用red tempt我们可以使用这个方法,我们可以options for哈希,我们要操作哈希,而且呢,我们购物车里边的这些哈希,我们要获取哪个用户的购物车,所以我们可以调用get方法,Get方法呢,前面传一个K,后边再传一个值,这个K相当于我们要获取用户的这个购物车,但是这个购物车里边有好多购物项,我们要获取一号信息,所以呢,我们应该是这么的一个操作,而且呢,每次考操作购物车相当于都。
15:56
啊,获取当前用户的这个购物车,我们要操作它里边的相关数据,我们之前呢,在这都模拟过,这样呢,我们每次这样调用比较麻烦,在我们这个red tablet里边,它有一个简比较简单的操作,就是这个red tablet,它有一个方法叫B哈希options,想绑定一个哈希操作,这个以后,接下来所有的对red的增删改查都是针对我们这个K的增删改查,所以呢,我们现在就绑定一个我们这个购物车的哈希操作,那以后呢,我们就来操作它就行了,所以这就是我们的整个哈希操作,那我们接下来呢,所有的增删改查我们操作都是联想red的,所以呢,这个相当于就是我们获取我们的购物车信息,而且呢,我们后来经常要操作购物车,我们可以把这一块封装一下,好,我们将所有的这一块我们全部抽取出来,我们在这儿factor来抽取成一个方法。
16:53
抽取成一个我们的方法,我们这个方法呢,我们最终我们就返回的是我们就叫get我们的cut,我们返回我们的这个购物车,我们返回购物车的这个操作,Get cut options,好,我们来抽取来的这个方法,当然这个方法最终要返回一个这个操作,好我们就来return,把这个操作呢返回出去,Return把我们对购物车的这个操作,我们以后呢,就要操作这个购物车,我们把这个呢拿过来以后,我们想要获取购物车,我们就来调用这个方法就行了,好,我们拿到我们要操作的购物车,接下来我们要给购物车里边要添加商品,好,这是我们这个方法获取到我们要操作的购物车,购物车好,那接下来我们就给购物车里边添加商品,我们先不考虑这个购物车里边有没有商品,我们就直接添加,假设都没有,我们第一次给购物车里边添加商品,因为这个购物车里边。
17:53
要保存的这个商品是一个cut item,所以呢,商品的这些详细信息,特别是商品的ID,商品的标题,商品的图片,其实我们都要调用我们的商品服务来查一次,所以在我们的这个service里边,既然我们得到SQID了,你要做的第一件事就是远程查询,查询当前要添加的添加的商品的信息,相当于是按照ID我们来查到商品的信息,好,那我们就来调用一次查询我们这个远程的商品product服务,我们来看有没有按照ID来查的我们这个product服务,我们以前的这个APP里边自动生成的来到SQ info有一个非常快速的方法叫SQ info,给一个info SQ ID,我们直接查出SQ英的这个实体类,然后呢,我们给你放进去,我们放到SQ英法这个详细信息里边,所以我们远程呢,就调用这个方法好。
18:53
我们现在要远程调用,我们就来写一个远程调用,我们接下来就来写一个远程调用,远程调用呢都在分包下,我们是一个接口,好这个接口呢,我们就是商品服务product,我们的份service,商品服务的远程调用。
19:12
好,我们先来标识,它是一个远程调用客户端调用个服务,我们现在是要调用商品服务,那接下来要调用哪个请求,我们直接将商品服务获取SQ详细信息的这一块,我们拿来CTRLC,我复制过来,然后呢,我们粘贴到我们的这个方法签名这一块,好,我们现在拿过来了,那拿过来以后呢,接下来我们的整个请求路径我们得写完整,我们也复制完整CTRLC,来复制完整CTRLC。走好,我们现在呢,把这个复制完整以后呢,我们想要远程查询我们商品信息,就可以很方便的查到,那来到我们的购物车的服务,那想要添加哪个商品的购物车,我们先查出这个商品信息,好,那现在先来注入我们的远程服务,这个远程服务呢,我们就叫product,我们的phone service,好,Product phone service at一个owaar,我们要能远程调用,一定要开启enable phone clean,好开启了以后呢,我们接下来远程调用它呢,有一个方法叫in法,好,我们把这个方法名改一下,不叫in法,我们就叫get SKU in法,我们获取SKU的详细信息,那么就来调用它,先来得到我们SKU的详细信息,好拿到squ的详细信息,那拿到以后我们就要获取到SQ详细信息的真正内容,那怎么获取?我们给这个R对象,我们封装了一个方法叫get data,我们获取返回的数据。因为远程服。
20:42
返回的SQ info的详细信息会封装在SQ info这个里边,所以呢我们就来获取SQ info获取到的真正的详细信息内容是什么?来看SQ info呢,返回的是SQ英O,整个实体类信息这一块呢,有SQ相当多的这些信息,所以我们这一块我们就应该有一个VO能来封装这些信息,那么呢,就把这些属性我们复制过来,好,我复制过来要能封装这个信息,我们以前其实common里边好像写过我们这个VO,我们公共抽取过,那在这里边呢,我们来找一下这个VO,这是member VO,还有我们的to,那么这块没有,那我们就自己在这来封装一下吧,好,那现在呢,会收到远程服务给我们来传来的SQ英我们的VO,这个VO内容呢,我们就将它所有的这些属性拿来就行了,我们对应封装属性名要一模一样,艾特一个贝。所以我们接下来。
21:42
我们调用远程服务得到的数据就是SQ英这个Vo.class那么最终就能得到它。哎,当然我们这一块呢,传的不是class,我们传的是一个new,一个type reference,好我们这个type reference,我们里边我们来看一下,那这个type reference里边我们来指定好泛型就行了,那么这个泛型呢,比如我们现在就叫skuo vo.club好我们就是这个泛型。
22:13
好,我们type reference,我们把这个内部类来创建出来,好,最终呢,我们就会得到我们的这个SQ数据。好,我们这个data数据我们放到这儿,所以我们要添加商品呢,我们先来查到商品的这个信息,查到以后呢,先来这就是我们当前的一个购物车里边的购物项,诶我们将商品信息,那相当于要把它添加到购物车,商品添加到购物车,购物车里边呢每一个。都是一个购物项,那我们就创建一个购物项,这个购物项的内容我们就给来给它封装好好购物项里边首先来set,我们既然添加了这个商品默认的选中状态,那也就是true啊,把它set上,然后呢,购物项里边继续来set,包括它的这个数量,我们第一次添加数量都为一,接下来继续set item cut item,点一个set我们当前商品的图像,我们都查到这个商品的VI信息了,拿到他的头片,Get商品的头片。
23:15
SQ default image,好,那再拿到商品的名字,点一个set我们的title,这个商品的名字呢,那就是data,我们远程服务查到的get SKU,我们商品的title就在这。好,我们继续来看cut item,我们当前购物项,我们再来set,我们现在title image count这些都有了,接下来就是价格,总价格呢,我们会自动计算,我们不用设置,我们接下来设置一个价格,以及SQIDSQID不用想我们查的是这个商品,那肯定都是这个商品,然后呢,还有他的其他信息,比如我们的价格,好,我们现在拿到价格,这个价格呢,我们拿来data,点一个我们远程服务呢,会来返回价格,好,我们就可以拿到价格,接下来我们继续这个价格,完了以后我们再来点一个set,那set呢,发现这块呢,还要设置一个list类型的,我们SQ at tr下面当前商品的SKU的销。
24:16
部属性组合信息这一块呢,我们要在我们购物车的这里边展示,比如我们京东里边,我们来添加一个商品到购物车以后,我们来查看我们的购物车,购物车里边这要展示我们的SQ组合信息,所以我们这一块呢,还要远程查出我们的当前SQ的所有组合信息。好,我们接下来第三步我们还是要远程查询SKU的组合信息,而且呢,根据我们以前讲的,如果我们这个远程查询比较慢,比如我们这个远程查询要一秒,我们这个要一秒,等我们整个方向返回可能就要两秒了,那为了快,我们可以使用多线程的方式,但我们不能直接上来就给他开多线程,我们要做的操作就是要将所有的线程全部放到我们自己指定的线程池里边,所以每一个服务我们自己也配置一个自己的线程池,那好,我们就直接将我们以前服务配置的所有线程池的内容,我们就拿来,那自定义呢,给我们里边添加一个线程池,线程池的。
25:16
啊,包括的这个属性绑定CTRLC我就复制来,那全部呢给这一放走,我们完全使用线程池来控住我们的所有请求,那线程池里面的所有属性都跟我们这一块呢进行了绑定,所以我配置文件里边呢,只需要配上我们这些信息,那把我们以前线程池的所有配置也可以拿过来,好我们把这个线程池配置过来,来到我们的购物车服务,我们也有自己的线程池,好那配好以后,我们的容器中就会放一个我们自己的线程池,以后我们所有的异步任务的调度都由我们这个线程池来进行调度,好那们这个线程池呢,我们先来自动注入thread po excu,好,我们把这个线程池我们注入进来,我们来写一个autowa,然后呢,我们现在给购物车里边添商品,我们要查到所有的商品的详细信息,最终封装到我们的cut item里边,所以呢,我们的这些操作我们可以使用。
26:16
多线程的方式,好,我们cut item里边,我们在这要封装,那多线程怎么办?我们使用compliable future,我们可以拿一个异步编排,好这个编排呢,我们点一个run as anthic,我们让它异步的运行一个任务,那运行什么任务走那第一个任务,那就是远程来查询我们的SQ信息,并把它封装起来走,这是我们的第一个异步任务,然后呢,还有第二个一异步任务,远程查询我们的SQ组合信息,好,我们让他第一个异步任务,这是get SQ info。Get SQ in for task,而且我们的这个异步任务要交给我们的线程池来进行调度,然后呢,我们的第二个异步任务是来远程查询我们SQ的组合信息,查到了以后呢,在这封装,那么接下来就希望有一个远程服务,还是我们的商品服务来到这儿吧,我们有一个controlrler,好,假设还是来到我们的SQ的这个controller,我们现在呢是商品属性的值,现在SQ销售属性值的这个CTRL来到这,好,我们现在呢,希望有一个方法,我也不返回R了,我直接返回一个list类型的string,那希望呢,能查到get SKU cell at tr values,得到我们SKU的销售属性的所有值信息,那怎么得呢?你给我发一个请求,就叫get map,好,然后呢,你给我得这是SQ销售属性值,作为一个死。
27:52
给我来进行返回的这个信息,好,你要得哪个SQ,你给我带上SID,那我们这块呢,路径变量浪一个我们就能获取到SQID一个pass variable,好,我们现在来获取到路径变量,走,那这个路径变量里边我们来获取SID,我们希望呢,就能得到我们这个最终的内容,那这个呢,我们可以先来写一个circle,我们如何快速得到一个SQ的销售属性的值,而且呢,它组合成字符串,我们来到我们的商品服务来看一下我们这个SKU销售属性,每一个商品按照它的这个商品ID把它销售属性都存起来了,我们想要返回呢,非常简单,我来调用一个方法,我们调用一个circle叫select,我们不select,行了,我们写一个contact contact呢叫连接,来连接上两个值,我们将属性的名和属性的值这两列的内容来连接起来。相当于把它们拼。
28:52
最终返回一个颜色是什么,版本是什么?好,然后呢,From我们哪张表,那就是我们SQ这张表,条件那就是为SQID,非常简单,SQID等于比如我们来查一号商品到底有哪些销售属性组合走诶我发现颜色星和营版本是什么?当然连接中间要有一个冒号,所以我们连接的时候给它再来加上一个冒号,而且加了一个中文冒号,好,我们来走,现在我们就来看到我们最终呢就会有这个返回,由于我们是一个list类型的string,我们每一列呢返回都是一个string,所以没什么问题,那接下来我们就希望我们的这个service能帮我们有一个方法,就叫get SQ cell at tr values,安姿string list,然后呢我们把它返回,然后呢,Sqidd最终返回的是一个list类型的string,我们希望有这么一个方法,好,我们来创建出这个方。
29:52
然后呢,我们再来创建出它的这个实现啊,我们来添加上这个实现,这个实现里边呢,我们拿到我们的这个SKU销售属性的这个do,这个base member,我们希望这个member呢,有我们这么一个方法,好我们把这个方法呢拿过来,然后最终能给我们返回我们要用的数据,好直接返回传入SQID,那现在没有这个方法,我们就给它创建出来,好,我们给member创建了我们的这个方法,当然我们要创建上它的映射,那么现在al in,好,我们来创建它的statement生成,那我们在这呢就生成了我们的这个映射,而且呢,它自动判断我们返回值的类型是一个string,虽然我们返回的是一个集合,我们只写集合里边元素的类型,那么的circle语句,我们直接给这一复制就行了,CTRLC好,然后呢,CTRLV主要是这个SQID井号大括号,我们一取值就行了,就叫SQID,那为了保险起见,我们还可以给这个参数我们命名。
30:52
为SQID,好,那们在这呢,让它自动生成我们的这个命名,那么现在命名为SQID了,我们在这来取SQID,它都有提示,好现在我们这个远程服务像是写好了,我们接下来呢,就来把这个远程功能我们CTRLC复制过来,我们来到我们的购物车服务,我们购物车呢将会来调用这个远程服务,把这些都关掉,来到我们购物车的远程调用份里边,好,我们调用商品服务,现在调用商品服务里边还有一个返回,就是返回我们所有的这个销售属性,但前面的这一块完整路径我们也复制过来。
31:30
CTRLC全部复制过来啊,而且呢,我们这一块是直接返回我们要的这个数据,我们也没有这个R对象,那也不用做返回值的这些封装提取,那么接下来来到我们的这个service服务,我们现在要两个功能,那们第一个我们远程查询我们这个商品的详细信息,查完了接下来我们的第二个远程查询SQ的组合信息,我们还是拿到商品的份,Service点一个SQ的组合,按照SQID来查,最终得到的这个list string,我们直接把它给我们cut item购物项里边一放就行了。但这个查询也是一个异步的compliable future点一个,让它以一个异步的方式运行run as anthnic和我们这个supply anthic,它们的区别就是我们run是没有返回值,不关心返回值,Supply,关心返回值,我现在不关心返回值,任务只要一运行结束。
32:30
我们都会自动的给它封装到我们的这个cut item里边,好,我们把这一块的代码截到这儿,然后呢,我们让它线程池进行调度,这是我们的第二个任务,这个任务呢,就是来获取我们的销售属性的get SQ c at tr value,当这两个任务都做完了,我们这个勾物项的数据就有了,然后呢,我们要将这个勾物项的数据保存到red里边。
33:00
因为我们对购物车的整个操作,我们都是这个K,我们封装成了这样子的,我们抽取了一个操作,我们让red全部操作我们这个key,然后呢,拿到了一个绑定的这个哈希操作,然后呢,我们接下来就给red里边来存取数据,好,那们现在绑定的这个哈希操作里边,我们接下来要做的第一件事情就是put,因为我们给购物车添加了一个商品,所以我们给red里边就应该保存这个商品信息。put key用什么K,我们之前约定我们在red里面存的时候用的是商品的这个ID,我们可以来看一下我们购物车整个大件用的是。Cut加上我们用户的标识,然后每一个购物项存的是我们这个商品ID和购物项的详细内容,所以我们的K就是当前商品的ID,好,我们拿到这个商品ID,它是一个浪类型的,我们把它的这个string拿到,然后呢,接下来我们再来加上,我们不用加,我们放的这个值是我们这个商品信息,而我们这个商品信息呢,我们现在这个cut item1我们已经放来了,我们放到这,但如果我们这么直接来放,很不方便,用red呢,要放要把这个对象要序列化回去,相当于要把这个对象呢转成一些字符流传给我们这个red,而这个字符流呢,默认用的是JDK的序列化,所以我们放的时候,为了我们能识别,我们可以把它转成一个杰森串,杰森点,一个to,杰森,String,我们把我们当前的这个购物项好,我们已经两个远程查询封装好的这个购物项,我们转成字符串,然后呢,我们放到red,放好以后呢,我们相当于。
34:41
给刚才给购物车里边放了当前的这个商品,而且有几件,到底有几件,我们这个件数呢?不应该是一,应该是我们指定的这个件数,我们已经放进去了,那放进去以后。我们把当前的这个商品详细信息都封装好了,来给他一返回就行了,好,来返回当前的卡item,这是我们添加购物车的操作方法,写好我们来测试一下,好,那现在呢,改了很多服务,你的商品服务我们添加了两个远程接口,好我们把商品服务呢启动一下,包括我们的购物车服务,我们也重新再来启动一下,好,我们现在再来启动一个购物车,来启动购物车服务,然后呢,我们来重新来测试一下,那先来访问我们的首页,先来等待我们所有的服务启动成功,我们来看一下我们的后台,好,后台呢,我们这个商品服务已经启动成功,那这个购物车服务,哎,马上呢也启动成功,好,OK了,然后呢,我们把整个流程来走一遍。
35:40
我们先来访问我们的商城的主页,我来刷新,好,我们现在呢,商城的这个主页我们现在已经访问到了,然后接下来我们来看,我们给购物车里边添加操作,来点手机,他报告我们这个list页面呢,有我们这个问题,意思就是我们session里边还有用户没有登录。那么也不写这个else,来写一个if吧。
36:02
如果这个不为空,那我们就那样展示好,我们把这个复制过来,我们把这一块放到这儿,如果它不等于空,我们就来展示CTRLF9,我们再来刷新一下我们的这个页面,好,那我们那块的else判断有问题,我们现在没登录好,现在我来随便点击一个商品,来到我们商品页的这一块,还是我们这个登录判断有问题,好,那我们就来到我们的商品页,看来我们的所有登录判断呢都有问题。我们的这个登录判断我们不能用这个else来写,来到这个详情页control home,我们来看一下我们的登录判断,我们一直来往下先来访问商品详情页的时候,我们在这一块的登录判断来找一下我们的登录判断CTRLF。来session,我们来取session里边的用户,好,我们不写else,来写if if什么呢?如果session里边的登录的用户不是空的,我们在这么来展示。Dollar符大括号,好不为空,CTRLF9,我们来一下页面刷新,我来刷新,好现在没登录呢,也一切正常,那现在想要添加到购物车,来点击加入购物车,然后这一块呢,给我们提示将数字转化异常来看哪一块转化异常了,包括我们来看我们购物车的控制台,我们购物车的控制台我们来到这一块来看我们的数字转化异常来到卡item,那就是在这儿相当于我们的这个价格要乘以我们这个数量的时候,这块呢转换异常了,好我们来重新尝试一下,我再来刷新一下刷新。
37:39
我们这个加入购物车操作有问题,我们来看red里边有没有数据,那red的购物车没有数据,我们在这呢打一个断点,主要是这个方法,好,我们现在将购物车以debug模式运行起来,我们再来重新来测试一下我们这个请求,我先来刷新页面,好,我们要添加到购物车deb断点来到我们这,我们先来先来看一下price,我们发现这个price和count都是空的,也就说我们这个购物车的这个购物项数据,我们这个购物项数据全部都是空的。
38:11
全部是空的的原因,那就在这儿了,我们能看到我们想要给red里面保存数据,我们肯定得等这两个远程服务查询完,把所有的商品信息查询到了以后,那才能写数据,所以这就是我们的异步问题。那么在这呢,要做的这一块操作一定要等他们都完成,Completeable future.o们是要等第一个任务。然后呢,还有我们的第二个任务,这两个任务我们都完成以后,我们再来干一件事情,来等他们都完成,来直接调用get方法,在这来阻塞等就行了,等它们都完成,我们将这异常呢,我们可以来直接抛出去,走那等它们都完成,我们再给red里边放数据。这是我们的这种写法,好,我们现在来重新启动,这样就没什么问题了,因为我们的异步查询,我们想要给red里边写数据,我们的这些数据呢都是空的,那就会有问题,那么ctrler呢,掉了我们这个方法方法声明抛异常了,那就把这个异常呢也抛出去,好,我们现在来重新启动我们的购物车服务。
39:19
走,我们现在来做一个完整的测试,如果我们将商品添加到购物车里边,我们二号商品添加购物车,先来观察red。来reload red里边呢,现在没什么数据,来等我们购物车服务重启完成,好把控制台清空,现在来测试,那相当于要添加一个商品进去,我先来刷新,而且大家注意我们当前没登录,没登录以后呢,我们先来看,我们这儿会给我们一个零时件,好,没问题,我先来刷新,好现在呢,我们发现商品成功加入购物车,而且呢,我们商品信息在这我们都展示出来,我们的图片数量也都有来看red里边的数据,那一看数据大家就知道我们这个购物车的数据模型为什么要这么封装了,我们的购物车在这儿鼓励mail购物车,由于我们没登录,所以是临时用户,临时用户里边首先我们保存了第一个购物项,二号,我们二号商品,二号商品的详细信息,我们是以JS字符串的方式保存在这儿,它被选中数量是一个,然后在这儿,那们在这儿呢,都有,包括它的销售属性的值信息,我们在这儿也有,那么购物车的添加我们就做完了。而且如果我。
40:29
那登录状态我们可以来看一下,假设我们现在是登录状态,我点一个欢迎登录,好我们现在微博登录,那社交登录呢,如果我们这个成功,我们在这来登录。好,这块登录成功,我们再来给购物车里边添商品,来点进来,那现在来找一个商品,那现在是这个几号商品,四号商品,我们把它们添加到购物车,好来我再来选一个别的版本,罗兰紫,那这个呢就成七号商品了,我给购物车里边添三个,如果是登录状态,我们在添加购物车的时候,我们在这儿会判断登录了肯定都会用登录状态的购物车,我们在这儿判断的时候,只要登录了肯定用登录的,没登录我们才用临时的,所以我们现在如果加入购物车,我点一个加入购物车,大家看现在加入成功,我们来看reddi里边的购物车数据刷新,那么这个购物车里边呢,就会有两个没登录的,是一个临时标识,它加了什么,登录了的是它的用户ID,购物车信息,然后呢,它保存了七号商品数量三个好没问题,那么购物车的添加操作我们就做完了。
我来说两句