00:00
各位同学大家好,下面呢,我们继续来完成生成订单接口,下面呢,咱们来做这张图中的这个部分。根据用户ID得到用户信息,这个接口呢,之前咱们已经做过了,我们来看一下啊,咱直接看这个service client里边有一个模块叫service user client,然后在里边有,咱们之前曾经定义过这个接口,根据用户ID得到用户信息,也就是user用户对象,所以咱们一会儿直接调用就可以了。但是这里边啊,有个问题特别说明,这里提到我们是不是要得到当前用户的ID,比如说我这个用户ID,我们用微信第一次进行授权,授权之后呢,在咱们这个user表中会加入一条用户数据,在用户数据里边有一个ID,所以咱们得到就是当前用户这个ID值,那这个值怎么得到,下面给各位来说明一下啊,我写到定位值。
01:07
获取当前用户的ID址。用户ID。那这个怎么得到,下面给大家说一下这个过程啊,我们这个过程呢,要用到前端和后端联合开发,把这做到,首先我们先看一下前端中怎么做到的,给各位看一下啊,这前端就写好了,一会儿咱们重点看后端,然后其他里边我们的做法就是首先咱们看app.voe中咱之前做这个授权操作。大家看啊,当我们授权过程中要得到微信那个open ID,并且添加用户信息,最终返回,返回之后看这行代码,咱们把接口中返回的token值放到是不是这个local story里边呀?这单之前提到过,跟这个cookie类似,指它比cookie存储量更加大,所以咱们把这图N值放到local so里面去。而后面我们怎么做呢?大家看这个文件requests里边,咱们就是每次通过阿克请求先执行这个启用拦截器。
02:22
然后再启用拦截器,我们怎么做呢?从local service里边把to值取到,如果值不等于空,咱们把值放到ha中,然后进行传递,也就是把这个token值放到hier中,每次咱从hier里边需要token值,因为token值里边咱之前用JWT生成。里边包含用户ID,还有用户昵称,所以从里边可以取到,而这里提到啊,为什么咱要放到hier里边去呢?有一个特点,Local是不是叫本地的一种存储,它不支持跨域,所以咱们把它放到header里边进行操作,这是我们这么一个前端的过程,那我把这过程给大家写到这个图里边。
03:10
我来写一下啊,咱们里边的第一步。我们授权。成功之后会返回一个token的字符串,Token字符串里边包含用户的ID和昵称,就是这个nickname。我写一下啊,这是我们之前做到的,授权之后返回ton字母串,然后咱们怎么做呢?在前端里边把这个返回的token放到我们那个叫local里边,也就是这个里边local类似于咱的cookie。这是我们做法,然后咱们下面怎么做,每次发送阿贾克斯请求的时候,我们是从这个local里边获取到token字符串,放到我们的请求头里边进行传递,为什么放到请头里边?因为这个localage它不能跨域传输,所以咱们现在正在做,这是咱们前端中的这个过程,这过程已经写到了,大家把这过程给他要记住。
04:20
咱们目前这个做法,而咱们在接口中怎么做,我们进一步来看啊,就是我们的做法。首先我写一下啊,第一部分咱们接口中的做法,我这里做的比较完整,第一步我们先设置一下就是哪些路径需要获取到这个token字符串,因为咱有很多路径,咱并不是所有路径都需要,所以我设置一下哪些路径需要获取字符串,这个咱们用到就是词分里边的一个对象来进行继承实现,因为咱会看到。然后第二部分咱们在方法中实现一个获取的一个。
05:00
逻辑或者获取一个过程,怎么获取,从我们的请求图里边获取,偷开字符串,然后获取之后从这里边就是从这个token中获取到这个user ID,最终实现下文过程,所以咱们目前是这么一个流程,那这过程我们来看一下怎么来做啊,按照我课件中的过程给大家来把这个效果做到。首先第一步啊,因为获取用户快,ID在后面很多地方都需要用到,所以我写到。com里边,在com中第一步我们先引入依赖啊,其实这个依赖呢,我们暂时应该没有用到,咱为了不报错,把依赖先引入,我把依赖就放到咱的common模块中来,也就是这个模块。把这个我们先引入。先拿过来啊,虽然说这个可能暂时没有用到,要给他乙先放过来,然后这个完成之后,第二部分咱们复制工具类,这工具类我提前写好了,就是我刚才说的这个过程,设置哪些路径需要获取token值,并且从token里边获取到UCD。
06:11
然后过程中有很多的工具类,有很多咱目前用到这三个,其他的后面会用到,我们先一次性把工具类复制过来,然后这个工具类我给大家找一下啊,咱们找一下这个工具类。在我这个项目中的资料里边,有一个叫订单相关的工具类里边有个us,我把这工具类复制到我当前这个项目service里边这个包中。把这个我们做一个复制。转给他拿过来。这样的话,咱们完成了这个工具类的复制,然后复制之后我们看里边是怎么做的啊,首先大家看里边的第一个就是这个。叫log印mvc con,然后他继承了一个叫YYVC这个confi。
07:04
在里边我们看啊,第一部分核心就是这个代什么,我们设置哪些路径需要用到这个拦截器进行拦截,其实它里边就是一个拦截器,就是设置哪些路径给它连上,然后这里边有个规则,大家看这规则啊,咱们目前的路径两个规则,我们管理员系统都是以我的命开头,公众号的系统接口都是以API开头,所以把这两个进行注册,然后注册之后咱目前主要用的是公众号,就是API,这个路径在API里边呢,这个位置我溜了一个对象。然后这里边继承了一个叫,就实现了一个叫handler intercept拦截器,在里边有这个叫普handle,在它执行之前做了一个用户信息的初始化,然后咱们看这初始化里边我们做了什么事情。给大家啊做个说明。咱们看这初始化啊,首先你看这做法很明确,第一步我们从hier里边得到是不是token字符串,然后得到之后从token字符串里边把用户ID得到,得到之后把用户ID用方法做了一个设置,我要后面能给他取到,所以咱们目前是这么一个做法,说这过程中用了一个叫此外local存储,你的用快递,咱在当前环境中能取到这个值。
08:28
这是咱们目前的做法,所以咱们通过一个工具类把这个做到。这过程各位要知道啊,你把这个代码直接复制可以了,以上就是如何获取用户ID,咱目前就完成了,完成之后后面咱们会调用接口做实验。那我们看一下啊,就这过程中我们再说一遍,在这个普瑞handle豆里边进行用户信息的初始化,也就是得到用户ID,得到用ID给他set到这个叫author contact里边,后面咱通过get方法把这值可以取到,你看这里边啊,这是S的方法,这是get的方法。
09:11
以上是咱们对于接口这么一个基本实现,那我们做到这里呢,下面咱们进步来实现。下面要做的话就是完成这张图中的效果,把这几份值都得到,最终进行封装,然后把值最后加到我们的数据库中就可以了。那咱们啊,下面继续往下来写下,我们来做个实现。大家看怎么来做啊。首先第一个,因为这个过程中呢,我们要用到远程调用,而远程调用我在里边有三个模块,这三个模块中的接口咱们都需要调用,所以咱的第一步干什么呢?把三个模块它的依赖先引入到O的这个模块中,为了能进行调用,那下面我来引入一下,一个activity,一个cos,还有一个叫user。
10:07
这是我们的这个步骤。这代码我直接复制一下啊,然后你自己在写的时候,这个路径或者这个模块版本号等等,跟你那个要保持一致,我目前的叫这个名字,所以现在这个减重。然后引入之后,下面呢,咱们来到接口中进行实现,找到接口啊,就是咱们刚才写到的,咱们看一遍啊,第一个 o infoA片CTR了,里边调列方法叫sum me order,然后在sum me order里边我们来做个实现,实现过程中咱们把里边的几个接口先给它注入进来,为了一会儿进行实现。那我来注入啊,第一个接口,咱们做那个课程信息的接口,这介绍应该叫cos。这是第一个,然后第二个我加上这个O,我们在就后注入,然后这个接口我们用这个就是优惠券的这个接口comp写下啊。
11:11
应该是这个接口把这个注入,另外里边还有这个用户信息的相关接口,这个接口叫user info client。所以咱们现在把这个都住进来了,然后住之后呢,大家看啊。这里边是报错了,这报错的话怎么解决呢?咱们来到启动类上,在启动类上边加上一个注解,这注解咱之前加过啊,大家看这注解叫做an able,里边加一个叫base package,只有你的包的路径,咱们的包都叫com.at硅谷把这加上,这样的话能进行远程调用。然后咱们再来看。错误是不是就没有了,所以以上啊,是咱注入兜住之后,最后在里边按照咱们之前那个分析的这个八个步骤,把这个代码我们最后实现。
12:09
那咱来做一下啊,首先第一步获取生成订单这些条件值,那咱获取一下啊,通过这个O的VO,咱们得到第一个应该是这个,就这个Co ID也是咱说那个。课程的ID这些得到,然后这里边我们再得到第二个值,第二个值呢,这个就是这个优惠券的ID,把这两个值我们先得到,然后得到之后我们再继续往下进行。那我们继续写一下啊,在这过程中呢,除了这两支之外,它里边应该咱们最终还要用到这个用户ID,所以我现在把用ID取到这,咱刚才说过啊,我们写用户ID的时候呢,咱们找到刚才到工具类里边。
13:01
工具类里边呢,找到刚才这个方法叫author contact hold,我们刚才通过set往里面设置ID,那现在我们用get把这ID值给它取到,因为每次阿贾克斯请求的时候,我们在里边都是从中取到token,然后从token中取到这个值。那我们来写一下啊。Contact holder,点上get user ID这个得到就是当前用户的ID以上这几个值,然后得到之后我们继续往下来做,下面呢,咱们做个判断,判断一下当前这个订单是否已经生成过了,就是当前,比如说当前啊,我针对这门课,比如说我这门课呢,叫这个Java技术课程,这门课程如果说我的用户已经。下了这个订单,那这订单就不需要再生成,但是如果订单没有下订单,那咱们再生成,根据课程还有当前用户,我们做一个判断。
14:06
那我写一下啊,就是判断当前用户。写的完整点。针对。我们当前的这个课程是否已经生成的订单里边需要用到两个参数,一个是课程的ID。另外一个就是我当前这个用户的ID,用这两个值做个判断,那怎么做我们看一下啊,首先咱看这个订单的数据库和表,在它里边有一个order info这个表。Older info中咱发现啊,里边好像没有什么课程相关的,没有什么用户的,然后这里边还一个表叫order detail,这两表是一对一的关系,Order detail是详情表,里边有我们的课程信息,另外里边应该还有我们的用户ID,所以咱根据它就是这个order的detail表做个判断就可以了,那我来写一下啊,咱看怎么做。
15:05
首先做法肯定是最终调用service中的方法,Order detail service,这个咱之前注过了,然后里面加个方法,我们用这个叫。Get y,因为它肯定是唯一的,然后在里边传入一个rapper。这个最终会返回的是这么一个对象啊,就是order抵套对象,这个对象如果说不等于空,那就表示订单已经存在,咱们给他返回,如果等于空,咱再往下进行这条件一会儿封装啊,咱先做个判断。往下写下啊。Order detail这个对象。不等于,那表示订单已经存在,存在的话,那我们直接就返回订单这个ID。把这个返回写下啊,订单已经存在。直接返回订单的ID。
16:03
然后上面呢,咱们把这个条件做封装,这个封装我之前说过多种写法,你可以用这个query rapper实现,这么做没有问题啊,但是现在还是给各位啊,换一种写法。之前咱们还讲过这种方式,就是拉到rap也说过,所以咱换成这个来写一下啊,怎么写看你自己的习惯,我是故意想用不同的方式把这做个实现。那我来写上泛型older。然后rapper等于上一个拉姆的块,Rap在里边设置它的条件,咱们设置一下啊,第一个EQ。然后在里边怎么设置用拉姆的表达式的这种写法。我们加上一个叫order里边这个get cos ID后面传入课程的ID就是。Co ID,这是第一个条件,第二个条件就是里边的用户ID rapper,点上EQ,里边这个叫get找一下啊这个。
17:11
UID传入用户ID,最后调方法得到对象,对象不等于空,表示订单存在,我们直接返回,如果等于空,那咱往下再实现后面的步骤。这个步骤完成,而下面写第三步啊。比如说现在啊,我这个订单。针对这个用户和课程之前没有生成过,那下面呢,咱就得到里边的值,下面我们写第三步,第三步呢,根据课程ID得到课程信息,这个过程之前咱们写的那个接口,我们进行远程调用。来写一下啊这个。Fit。点上get by ID里边传入程ID得到的是咱们这个课程的对象,我们叫这个cos这个得到,然后得到之后在里边我做个判断,如果对象等于空,那表示课程不存在。
18:13
写一下啊,就是这个。等于,那那课程肯定不存在,我们直接给他抛出一个自定义异常。硅谷课堂exception。20001,然后写一下这个课程。不存在,这时候我们写到第三步,然后第四步,第五步跟这写法类似,只调用其他的接口进行实现,那咱们快速写一下啊,下面写第四步,我们调用user INF的方法,Getd,传入用户ID,得到用户的信息,我们起个名字user info user info,咱们同样做个判断。我在里边写一下啊,User等于空,那我们提示说这个用户。
19:04
不存在,然后同样方式得到它那个优惠券的信息,咱们同样调接口进行实现,我来调用一下啊这个部分。那咱们写一下啊。在这里边我们用这个。Co forfo cofo client里边这个方法还是get ID,传入优惠券的ID,最终得到是优惠券的信息。得到信息之后在里边啊,我们同样就做一个判断,包括在做其他的处理,所以以上呢,是咱们做到的这么一个基本过程。然后这里边我特别说明啊,这个优惠券的判断呢,跟之前的判断稍微有那么一点点区别,什么区别呢?强调啊,就是我们要生成订单的时候,课程信息肯定要有,然后这个用户信息肯定要存在,但是优惠券可能没有,就是我当前用户可能我没有优惠券可以使用,所以这里边我们怎么做呢?咱这么来判断啊,大家看这里边是不是有一个优惠券ID啊,那我们根据他做判断,我写一下啊,写到这里。
20:20
如果说里边这个优惠券ID不等于空,那就表示啊,我们在前端使用了优惠券,如果使用了优惠券,那咱们进行查询,如果它等于空,那表示没有可用优惠券,那我们就不进行查询,里边是这个过程,然后在过程中呢,这里边涉及到有一个金额的处理,就是那个优惠券的金额,这个我们复制一下啊,再用这个第一个这个带精度这种优惠券。用这个金额给他做个处理。这个依赖引入,然后最终把这给他得到啊,就把金额这个给他处理一下。
21:01
Con info。点上get,这个应该是amount这个方法,所以现在这部分做了一个说明,就是前端如果说咱们用到优惠券会传入ID,那我们查询,如果没有传入,那表示没有使用到,那我们就不用传递,所以以上是咱们完成的前五步操作,做到了这些都完成之后,第六步咱怎么做呢?那咱就把这个订单的信息进行封装,最终加到咱的订单表中。刚才咱们提到订单表咱有两个,一个是订单的基本信息表,一个是订单的详情表,那下面我们就向两张表中来添加数据。我在里边把步骤写下。这是第一个啊,我们来一个6.1。再写个6.26.1怎么做呢,就是封装数据。我们到这个这个对象。
22:03
里边去,最终添加到这个订单的基本信息表里边去,然后6.2咱怎么做封装数据到这个叫order detail这个对象里面去,我写一下啊,Detail。然后最终我们到这个订单的详情信息表里边进行添加,所以咱们第六步需要做这个事情,然后最后如果你这个优惠券使用过,把状态更新,然后最终之返回订单ID啊,所以目前我们把这个前五步先做一个实现。
我来说两句