00:00
我们再来编写注册,首先页面填完信息以后,当我们来点击立即注册,那会请求发给我们的author server,我们的register这个接口,然后接下来我们来收到这个数据来做了校验以后呢,我们就应该来调用远程的服务来进行注册,当然在做所有注册之前,我们看到我们在这儿呢会传一个验证码,那如果校验通过有验证码,那我们先得校验验证码是否正确,所以们在这儿要调用远程服务进行真注册之前,那么在这儿还要做一件事情,那就是校验验证码。那如果这个验证码传传的是一切正确的,那么就可以来调用远程的member服务,那真正的注册功能,由于它是member的微服务,它来操作们跟会员有关的这个数据库,所以呢,我们要注册会员还是要远程调用这个服务,好我们先来校验验证码,首先我们页面提交的这个验证码,我们来看一下,它呢有一个叫get code这种页面提交的,我能获取过来就肯定不是空的,因为我们已经把这个GSR303的这个数据校验,我们都已经做了好,那只要来到这儿,我们这个验证码就有,那接下来我们就要进行对比,那怎么对比呢?因为我们当时存验证码的时候是前缀加我们的手机号,所以我们接下来按照这个前缀加手机号再去获取就行了,好,我们先来进行获取,Rest tablelilet们点一个get。
01:32
那我们现在的这个get,我们是option for value,我们要操作这个KV,然后呢,我来调用get方法,那我们的整个前缀,那就是这样,我们想要获取到K,那就前缀加上我们手机号,手机号呢,也是我们这个VI里边传过来的,来get份拿到这个手机号,那这是我们存数据是用的这个前缀,好拿到这个数据以后呢,接下来我们就得判断,如果说我们传过来的这个验证码点一个equals,那等于我们red里面存的,但red里边呢,存的这个东西,那当时还加了系统时间,所以呢,我们就应该把它分割一下,那在这先来判断,如果string us点一个its empty,我们red里边存的这个不为空,那说明我们red里边存了这个手机号对应的验证码,那接下来我们就来进行校验,那如果为空,说明我们这个验证码就已经过期了,所以呢,我们就应该返回的还是这个注册页面,但是。
02:33
这个注册页面呢,我们给他放的这个错误消息,我们以前错误消息是放进这个map里边,那我们还拿到这个map,只不过这个map呢,就不用这么来取数据了,Map里边呢,就放一个跟验证码有关的错误消息,我们将所有的这一块我们都不用收集,把这个呢,我们来去掉,好我们就直接来拗一个哈希map,拗一个哈希map,那页面取出错误回显都是来取出它的,那么就给它里边放一个点一个put as点一个put,我们验证码呢叫put,然后我们的这个值我们就叫验证码错误,好你就叫它,这是我们给页面放了一个这个数据。
03:18
行,然后接下来我们把错误信息放在这儿,然后呢,重新我们是以重定向的方式又来到这个注册页,那我们这个放完以后呢,这就是我们这个验证码出错,那验证码正确,有验证码,那么接下来就要截串点split们用短横线进行截串,那么截串里边的第一个数据,这是我们的验证码,然后呢,我们拿到这个验证码要来进行对比,那么就直接把这个拿过来,如果ECO4我们这个,那说明我们这个验证码校验成功,那么这个验证码呢,就对比成功了,验证码通过验证码,那验证码通过以后,我们才可以来调用我们的远程服务,我们真正注册呢,要调用远程服务来进行注册,那么验证码通过进行注册,包括我们注册完了以后,我们一定要在这儿来删除验证码,那要不删除,那我们带着这个老式验证码还是一直有用的,所以我们只要验证码用过一次。
04:18
校验成功了,你就应该删除验证码,删除验证码那我们可以来先删验证码,先删了,我们再来去来调真正的服务,那删除验证码呢,那就是删除我们这个K保存的数据就行了,直接用red templt点一个delete,我们要删除的K呢,那就是这个。我们指定的这个K,当时人用什么取得值,那我们就用这个来删,那这样呢,下一次你带了相同的验证码过来,那我们就不可能验证通过,因为我们已经将这个手机号对应的验证码删过了,这就是我们之前一直说的令牌机制,这个令牌机制呢,就是我们验证码工作的核心原理,好我们用过以后呢,这个令牌就直接删,删了以后你下次再带着老验证码,这个旧令牌,那就不可能通过,那接下来只要验证通过了,去来调用真正的业务逻辑。
05:12
那如果验证码验证不通过,这时候呢,我们的验证通过,如果验证不通过,那我们还是一样跟下边的这个else,我们用的是一个逻辑,所以我们把这一段代码呢,我还是复制过来好,我们就叫验证码错误,还是这一块我们把它呢return出去。这就是我们验证不通过的逻辑,那接下来我们就要真正来进行调用,那这个调用呢,由于是远程服务,所以我们接下来先来写远程接口,好我们来到这个member里边,那现在member controller里边来看这个member有一个member controller们来找到会员的真正controller在这,那我们在这呢,就应该有我们的注册会员功能,好我们就来写一个public啊,我们就叫register,我们会员的注册,那这个注册呢,其实就是保存一个会员信息,那保存成功了,我就返回r.OK我们来写一个叫post map,因为注册要提交很多数据过来,我就叫post,我们就叫member member,我们叫register。好,那接下来注册要传哪些数据,我们能看到在我们的author服务,我们author服务呢,从前端页面收来了这个user VO,那接下来呢,我们要传给这个会员服务,会员服务呢,我们这个验证码已经验证通过了。
06:32
其他不用管了,那会员服务至少要用这三个用户名,密码以及我们手机号,所以呢,我们可以原封不动的将这个VI呢给他传过去,那么就在member里边跟他写一个同类的一模一样的VO,我们就把这个VO呢不抽取到com里边了,来模拟真正的V服务,我们都不能接触这个。com模块的,好,那我们的这一块我们就来写一个VO,我们就叫它VO。
07:00
那么这个呢,叫member register VO o,那会员的注册为O,那这个注册VOO呢,我就把这一块要用的这几个数据我们就复制过来,CTRLC我们直接复制到我们这,这个数据校验呢,我们也可以不用调了,因为我们这个数据校验只要能调用我们远程服务都是通过author来转过来的,它都是校验通过的,那我们把这三个属性呢,来给它填上get set方法好,我们同样的来到controller里边,我们先将会员服务的注册功能来写完,我们接收一个member register VO,而且呢,由于我们是post数据。我们微服务之间呢,都是HTTP加杰森,所以我们远程服务给我们传对象会转为杰森,你要接受杰森呢,一定要加一个注解,叫request和body,那意思我们请求题里边的数据,这是一个JS帮我们来转成这个对象,转好以后呢,家人们就来进行注册,那希望member service直接呢有一个方法就叫register来注册我们的会员信息,那注册成功了以后呢,那我们就直接来返回,OK,好。
08:10
那么这个注册我们来创建出这个业务逻辑。我们把这个注册功能呢,我们来进行完善,我们来添加上它的实现,好我们来完成注册,注册里边呢,主要就是我们要创建一个member entity,我们来保存到数据库里边就行了,好,我来创建一个member entity,我们的member实体类,这实体类里边呢,主要有这么几个内容,最终把它插入到数据库就行了,所以我们直接可以用它的base member base member呢,那就是我们自己的这个do,我们可以完全看到这个base member呢就是member do,我们可以拿这个member do可以来给数据库里边操作插入一条会员信息,好我们拿它来保存我们会员信息member do,我们直接调用它的insert方法,把这个会员信息一保存就行了,然后呢,我们来看一下我们的这个会员对应的这张表,好,我们来um Ms这个服务里边,那真正的会员表呢,在这儿我来以改变表的方式看,那的字段呢会有非常多。而页面呢,只。
09:15
提交了用户名,密码和手机号,那剩下的东西呢,我们都没有提交,那后来呢,这些东西可以在页面完善的时候,比如我们每一个人都有个人信息中心,我们可以修改我们的资料,可以在后续来添加,所以呢,保存之前,那么页面带来什么,我们就来整什么,包括我们这个。有一些东西呢,应该有一些默认值,比如我们这个会员等级ID,我们刚注册过来的会员,我们这儿呢,有一个会员等级,我们来打开表,那么在这个会员等级表里面呢,刚注册过来的都应该是一号普通会员,而且呢,大家注意每一个会员等级呢,这都有一个叫default status,哎,我们当前这个等级是不是默认等级,所以如果是默认等级我们就拿过来,那我们这个会员呢,就应该是默认等级,所以我们就来给这来创建一些数据,我们真正的这个nity里边的一些数据我们都要保存,比如这个nickname birthday。
10:12
这些我们没带,我们就先不写,它呢会带这几个我们ID不用写,然后呢,首先set level ID,我们会员等级的ID,这个会员等级的ID呢,应该是查出我们系统里边的默认等级,但我们现在知道它是一但到底是多少,我们还要查,所以呢,我们在这来设置默认等级,这是我们第一个初始化的默认数据,设置默认等级,那默认等级呢,我们就来查出来,我们要查呢,我们调用的是会员等级的这个do,所以我们来写一个member member的level com do,诶我们现在是调do来查会员等级,那我们现在呢,来查一个,我们希望它有一个方法就获取到默认的会员等级,Get default level,我获取默认等级,然后呢。
11:04
我们最终返回一个会员等级信息,我们就叫member level的这个实体类,那我们查呢,肯定就返回的是它,我们就来叫level,好,然后呢,我们最终把这个level的ID放到这,这是我们默认的D,好,我们就来创建出这个方法啊。那这个方法呢?创建在这,我们来编写它的实现,我们先来写它的创建它的statement这个映射。好,在这个statement里边,我们创建了一个select标签,返回我们这个数据,而我们想要查默认的会员等级,那应该是这个circle,我们相当于查这张表,我们直接写一个select,先from我们这张表。也就是我们这张表好,Where where,我们的条件就是按照我们的默认等级状态default status等于一,那这就我们查出默认等级了,走来发现呢,它就是普通会员,好没问题,那我们就现在就来把这个circlel呢,我们给这一复制,CTRLC,好,我们来给这一复制,然后我们这个方法呢,就写好了,来调用它,我们就有实现了,好来看这个do,我们点CTRL点过去,那这个do呢,是这个service在调用好我们先查出了默认等级,我再来设置其他的默认信息,比如NT里边点一个我们这个等级ID设置了,我们继续往下看,Email什么没传,我们现在呢,传了一个手机号,那么就把这个手机号给这儿拿过来一保存,然后呢,前端页面还传了我们其他的,那么就其他的都已保存前端页面呢,现在传了一个我们叫set的username,相当于我们这个用户名,好我们把这个用户名呢。
12:47
也拿来已保存,但是我们现在又有一个问题,就是我们这个用户名和手机号直接能拿来进行保存吗?这是不能的,因为我们登录是要按照用户名或者手机号来进行登录,所以我们这个用户名和手机号必须是唯一的,所以我们在在保存所有数据之前,我们应该去来检查它的唯一性好,那么在这呢?
13:12
来写上我们检查用户名,检查这个用户名和咱们这个手机号是否唯一,只要有一个被别人占用了,那都不行,所以呢,我们现在就来写一个service方法,那我们希望呢,我们这个member service它呢本身也应该有一个方法,就是呢可以来检查我们的这个。是否为一,好,我们在这个service里边,我现在接口里边,我来编写一个方法,那呢就返回一个布尔值,这个布尔值呢,我们就第一个叫check email,我们来检查邮箱是否为一,诶我们就叫unique,那我们传一个string的邮箱,好,这是第一个检查邮箱,然后呢,接下来第二个我们检查用户名,Check我们的username是不是唯一的,好,我们接下来编写它的两个实现。
14:07
这是第一个实现,然后呢,还有我们的第二个实现,这个呢肯定要传入username。这两个呢,都必须是唯一的,我们就来调用这个检查方法,好check,如果我们来检查它的这个邮箱,那么现在呢,没有邮箱,其实是我们的手机号,手机号和用户名是来作为唯一的这个方法,我们来改一下,这个我们就叫份,我们现在呢,是这个手机号来进行唯一检查,好我们来创建出这个方法的实现。我们把这个邮箱我们就来删掉,那现在呢,先来第一个检查我们这个手机号,Check,我们检查手机号是否唯一,我们把原来的手机号拿过来,点一个get份。好,我们在这来检查手机号。而且呢,我们还要检查邮箱是否唯一,关键现在的问题就是如果手机号和邮箱哪个不唯一,我们呢要在crler里边感知到,我们要给远程来去报错,告诉他哪个不唯一,所以呢,底层的这些东西,如果我们是以前返回的布尔方法,那我们可以这样,如果不唯一我们就不掉了,然后呢,我们来最终这个注册呢,要返回是哪个不唯一,那这一块又没返回值怎么办呢?所以我们在这一块我应该使用异常机制,如果有一个东西不唯一,我们就给上层抛异常,上层感知到不同的异常,那那就来进行不同的处理就行了。所以呢,我们为了让咱们这个controller能感知异常,感知异常,所以呢,我们可以使用咱们这个异常机制,到底是哪个部为一,我们可以使用异常机制,只要有一个检查失败了,我们就直接来抛出异常。好,我们现在呢,趁。
15:59
份和我们的check username我们都来进行检查,好我们可以来先检查手机号,再来检查用户名,只要有一个失败,那我们都给它不通过,就叫get user在内,所以我们在这一块呢,我们可以直接来抛出异异常,我们呢也无需把它定义成这些布尔德返回,所以我们来就使用整个异常机制来做这个事情。好现在我们来到这一块的方法,我们就将它们全部改成word,我们只是一个检查,只要没异常,那就能往下边走,只要有异常我们就中断了,下边呢就不走,Ctrler呢就能感知到异常,好,而且呢,我们这个异常啊,可能经常要用,所以我们将我们自己里边的这个异常,我们也专门的单独抽取出来,我所有的异常呢,我们可以放在exception这个包下,比如我们的第一个异常叫username exist exception,我们这个用户名已经存在这个异常。
16:59
好,然后呢,我们再来创建一个这异常叫我们的手机号已经存在,我就叫份a this,我们的exception,好,我们的手机号已经存在异常,而且这异常呢,要能抛出去,我们呢都可以让他继承,我们是runtime exception,我们应该是一个运行时异常,那这个呢也一样,我们来继承是运行时异常,Runtime呢exception。
17:26
而且每一个异常呢,抛出去都应该有异常的提示,所以我来out insert,我们来把它的构造器拿过来,这个构造器呢,我们可以使用一个午餐构造器,然后这个无参构造器在构造的时候,我来调用super super呢我们来传一个自己的异常消息,比如我们呢,就叫手机号存在好。这是我们的这个异常,我们的username也一样,好我们来生成它的构造器,Out insert,好们来constructor来生成它的构造器,我们使用无参构造器构造就行了,然后呢,我们去来调用super方法,我们给它里边传入的异常消息,这个就叫用户名存在,所以呢,只要接下来有人出现问题,我们直接可以through,我们一个new,一个我们现在呢,手机,那就是份我们的手机的这个异常份exist exception。
18:23
那下边呢,这个检查如果没通过,那就应该是抛一个那叫。New,一个我们现在是用户名已存在,就叫username exist的exception,而且呢,由于我们会抛异常,最好呢,我们在我们的这个接口上,我们来声明一下,这样呢,别人去来调用我们这个方法的时候,他呢就会选择对我们这个异常是否要进行处理,所以我们只要主动可能会抛异常,我们就在这儿来声明一下,我们呢会throws,好,我们这个会抛出我们这个手机号存在的异常啊这个呢也一样throws,它会抛出我们用户名存在的异常,好我们现在使用异常机制,那来到我们的这个实现类里边,我们要抛了,也可以在这儿来加上我们的这个声明,那这呢会抛这个异常,那这一块呢也一样throws,我们会抛这个异常,好,那接下来呢,我们就来进行验证,验证手机号,好说你的SQL语句我先来调用我们的do,我们直接。
19:29
再拿我们本service的do,我们是member service,那member service呢,那就是操作我们这个member表,那在这个表里边我们要检查手机号用户名是否唯一,那就直接select,我们直接来进行count进行计数,记什么数呢?比如我们来count芯来记我们这个数量,计数的条件就是well,我们这儿呢有一个手机号,Username等于如果我们是用户名计数,Username等于我们指定的值,如果有的话,那么就会统计出一个数,同样的如果是手机号,所以我们都是在这来进行统计的,我就可以来where,我们现在呢,有一个叫份,我们可以来确认一下,我们这儿呢有一个保存手机号的字段叫mobile。
20:16
好,那现在呢,手机号就等于我们指定的值,所以呢,我们这样就来检查它有没有,当然这个计数呢,我就直接不用写自己的circle了,我们直接调用它的count方法,那这呢有一个select count叫统计技术,那这个技术呢,我们有一个corrywaer,我们直接传入我们的查询条件,这个查询条件呢,传的是member enity,我们去哪张表传,我们就传哪个好,我们现在呢是ECO,我们现在用户名,我们这个呢是手机号,那就我们的手机号等于我们传过来的值,那如果有我们呢,就会来返回来看一下,那在这一块呢,Mobile这个东西返回的这个计数,如果说我们这个mobile这个计数大于零,那说明我们数据库有这条记录,我们就来抛一常,否则我们什么都不做,Ctrl all代码整理一下,下边这个也一样,我们还是来进。
21:16
行计数,好,Member do拿过来点一个select count,来统计一下它的这个用户名有没有被占用。你有一个corry rapper,我们还是传入member entity,我们要查这张表,点一个equal,现在要用的是用户名,我们在这张表里边把这个字段复制过来,用户名呢,等于我们传过来的值,我们来看一下这种情况的数量,如果这个有的话。我们就把它叫做count,好,如果我们这个count是大于零,那么就可以来抛下边的异常,否则呢,我们什么都不用做,那就是检查通过了,好,那么来到我们的member service,我们真正的在这来注册,先两个预先检查,如果不通过就会抛异常,那我们ctrller要来调用这个方法,我们在这儿呢,要注册,我们这个注册里边呢会抛异常,来crl out点进来,那么注册里边这两个东西呢,会抛异常,所以这两个异常呢,也会抛给service,先从我们的这两个方法抛给我们注册,然后呢,再从注册抛给我们的controller,那我们controller呢,就应该在这串来尝试注册。
22:35
我们来尝试来进行一个注册,我们来获取异常,好,而且呢,这个异常可能类型有很多,所以我们接下来判断不同的异常类型,我们就来返回不同的结果,否则呢,那就是一切都是正常的,好,我们还是来到注册,那么真正的注册,把我们这个手机号用户名设置以后,接下来我们要设置密码N里点一个set passwword,但大家注意这一块呢,又是一个细节,我们这个密码呢,页面传过来是一个铭文,比如我当时输了123456,那页面呢就会传入123456,但我们不能给数据库保存铭文密码,所以我们密码要进行加密存储,密码要进行加密存储,那下一节课你就来说一下密码加密的整个细节。
我来说两句