00:00
好,同学们,我们接着刚才讲的内容啊,继续来看,刚才我们写了一个get user by ID get user by ID,然后呢,我们现在可以通,通过你给我传一个ID号,我可以把这个user给你返回去,但有的话就返回,没有的话呢,其实我返回的是个error,对。好的,那有了它呢,不是目的,不是目的,我们最关键的时候呢,还是得让他给我完成一个loging,就是它能够处理一个登录的这么一个请求,那么一个登录怎么来做呢?我们现在马上来完成它,诶完成它就是完成一个什么呢?完成一个登录的校验,登录的校验。啊校验,那么我们这样定这个函数啊,如果这个用户用户存在,并且密码也是正确的,我们也返回一个U。如果。不成功,没有的话呢,就返回一个错误信息,当然这个U呢,肯定是一个near是个空啊,注意听我这个含义啊,我先把这个写清楚,因为这个时候它涉及到业务逻辑里面去了,我这写个log,进这个login呢,肯定是要被别的地方来调用的,因此它这个函数的首字母呢,应该大写。
01:17
好,完成这个要校验,我对这个函数呢做几点说明。好,第一点呢,他完成的是对用户的校验。完成对用户的验证,验证,那么怎么说呢?如果用户名密码正确啊,ID和密码都正确,如果用户的ID和他的密码都OK,都正确。都正确,则,则返回一个user对象。有点实力啊,但是这个错误就没有了,第二个呢,如果有错误,如果有错误就有好好几种情况了哈,就说如果他不正确,如果用户的ID或或者密码。
02:05
但不知道是哪个有错,或者密码有错,有错误有错啊有错误,那么则返回一个什么呢?咱们就返回一个错误信息,则返回返回。返回对应的对应的错误信息。好的,那我现在开始写这个函数了啊,同学们啊,写这个方法了啊,应该说是一个方法,因为要跟它绑定在一起,所以说函数这个签名呢,这一部分几乎是呃差不多的啊,这个要改,有些地方不一样啊来走。啊,首先呢,写个名字叫logging。好,你要给我什么样信息我才能验证呢?显然你应该给我,呃,他的用户的ID号和他的密码,所以说我就这样写了,那就是userr ID,你看我的名字呢,都保持一致,所以说我也不去动脑筋了,ID它是一个int类型的,另外一个呢,它有一个密码,哎,它有个密码,密码呢就user WD。
03:08
好,这个时候它是一个字符串,好,那么如果是呃,有问题或者没有问题,我们返回的都是这样一个信息,跟它保持一致。好,放进去。好,放进去回来。那我就开始写这个东西了,因为现在呢,我已经我已经编写了一个get user by ID是在这个包包里面有这个东西,所以说我在这第一件事情,第一件事先先从这个user到user到里面先取一根连接出来。You到什么呢?它的连接词。它的连接注意听啊,它的连接池中中取出,取出一根连接。一根连接啊,可能叫一个连接都行,那怎么取呢?非常的简单轴,因为你这个this,它本身是有一个这个poor的。
04:05
对,它有个pull,因为到时间肯定要初始化,肯定要完成一个初始化,好拿这个pull pull里per里面呢,大家都知道这个pull它是有个方法的,我们前面学过叫get。呃,大家应该还有印象get啊,我们以前讲过就取出它的一个连接,那取到这个连接呢?呃,我们就马上就一个differ啊differ先,呃,延时就尽量把它及及时的,别忘了关闭这个事就close。这个没有问题啊,这个没问题,用完了它才会关闭好,拿到这个连接过后呢,我们就去调用这个盖子user ID,因为它需要一个连接,同时呢,需要一个ID,我都有,我都有,好那我就这样做了啊,那就调用我们这个this的,它写的这个get user by ID,我要传的就是刚才拿到的连接和这边给我的一个ID号。
05:01
ID号好了,那这个时候呢,根据刚才我写的这个函数,它应该给我返回一个user和一个error,那我就要做这个判断了,同学们。好,做一个判断了,OK,那因为我在这边做了很多工作吗?那返回的就是user和这个error,那现在首先我们判断有没有错,如果这个error不等于零。好,如果error不等于链,其实说实话,那么它的错误信息就应该是从哪里带过来呢?是从这带过来的,要么是,要么是这种错误就是用户根本就不存在,要么就是编译,那就是在在反序列化的时候错误,不管是什么错误,我们也不管它,我们直接return回去就行了,就不走了,下面就直接不走了。直接不走了,但是如果他这地方,呃,就是他这地方没有错误呢。没有错误,就说明这个UR我们应该是怎么样获取到了,那获取到是不是就意味着你这个用户是合法的呢?不一定,因为有可能只是你的ID写对了,你的密码没有正确是吧?现在呢,我们就要去校验密码。
06:12
这时啊,这时至少证明都到了这一步,证明我们什么呢?证明这个用户,证明这个用户我们是获取到了,没问题吧,用户是获取到了。获取到。或渠道,但是呢,它的密码不一定正确,不知道正不正确,我们做一个判断,如果取出来的。就是从这个RA里面取出来的这个用户,因为他已经被反虚化了,他已经是一个user的一个结构体了,在哪反虚化了,就在这序列化的。对不对,反虚化的好,它一旦反虚化过后呢,我们取出它的密码就是user。啊,它是这个应该是这个啊,大写的UR密码,它等不等于这个。如果不等它,如果不等于,就是这边得到的这个密码,这个是传进来的密码啊,是这个用户登录时候传进的密码,这个是从red里面取出的密码,如果这两个不匹配。
07:14
那说明什么呢?哦,说明你这个还是错误,什么错误呢?就是你这个用户根本它就是它就是密码不正确。它就是密码不正确,好那么我也把它写到这里,那我下面也就不走了,Return就说明现在我这个错误有两种,一种就是用户不存在,一种可能就是你的密码错误,当然还有可能就是未知错误,未知错误也有可能是在这导致的,对吧,可能这个错误,这个错误呢,我们就不好归结是什么错误,因为他跟这个登录,比如说也也说不好,可能是你的内部一个呃,信息存错了,好我们现在确定的就两个错误啊,OK,这样写完了,最后这一步呢,不要忘了也来一个return。啊,因为你他担心你这个衣服进不来,好这个就写完了代码。
08:03
这个代码就写完了,保存一下先。好,我们先看看这个函数有没有错,函数应该看起来没啥错,好,第二个问题来了,同学们,这个U到呢,我们尽量啊,让它能够完成出错,因为你这个铺现在是个空的,说白了啥都没有。你不因为你现在直接用上,你是看你是生命的,你只是生命,生命说这个普洱是一个red,但是实际上呢,你根本还没有做了,所以说呢,我们来用一个工厂啊使用。注意听,使用一个工厂模式。就是使用工厂模式,工厂模式返回或者获取到都可以啊,封工厂模式得到或者创建一个,创建一个什么呢?User道的实例。注意听啊,我们把前面讲的东西全部都综合起来了,那这个时候它是一个函数哦,它是一个函数,所以说它不属于有道的一个方法,这个以前讲过,那么就写一个六。
09:09
有什么呢,有点儿到。6U道,那你这个时候你你给我传一个什么进来呢?同学们想一想,你既然要去创建一个U道的这么一个实例,你必须给我传一个普洱进来,至于这个扑洱从来的我先不管,你肯定要想办法给我传一个普洱好,那么这个地方呢,先写到这儿,最后它返回来是个什么玩意儿呢?它它返回来就应该是它的一个指针类型。那我们可以写成有到。有点动心。U到好到时间返回这个,那这个时候就可以开始玩一把了啊,咱们就可以玩一把,怎么玩一把呢?就是user do,等于注意听爱的福,爱的福什么呢,有动。好在这里面呢,他要给我来一个pull,这个pull。
10:02
这个字段就等于你传进来这个普洱。最后,Return。好,写完了,当然有同学说了,老师,那你这个普从哪从哪获取比较合理呢?显然同学们想一想,我们肯定要在这个程序运行之前,就是服务器运行的时候,就把这个连接词给我搞定,大家知道这个意思吧,就说你们想一想这个画的这个图。这个图将来这个red连接池肯定是事先创建好的,不可能我在用的时候才去用,才去创建,因此呢,我们希望在服务器运行的时候,这个连接词呢,也把它给初始化里面呢,我们初始化16根连接。啊,当然也可以,呃,写个32根或者是八根,这个都都由你来决定,里面有多少个初始化的连接,你们自己玩啊,我定一个啊,我定16个,好,现在我们现在要开始搞他了,为什么呢?因为。你目前创建一个U2道,你必须得有个连接池啊,你没有连接词你怎么去玩呢?下面这个代码都跑不起来。
11:05
你你到这都根本取不到东西,是够空的,好,现在我们要开始做哪一个东西了,各位同学提倡老师的思路啊,现在呢,我们要开始开发这个re Dis式连接词,这个这个东西,那么这个red go放在哪里比较合适呢?都行,你放在这个model也可以,放在这个me也可以,看你的需求了啊这个呢,呃,我就先暂时放在这个跟main一个地方啊,都表示初始化的东西,我就放这了,好吧,我就放这,因为它是属于初始化的内容,我就直接放到main这个包包,好,那现在写一个东西了啊,同学们。现在men这个地方,咱们写一个ready.go啊,Ready go。看今天怎么这么渴,你们渴吗?那说真的很渴,我以前很少喝水,我一天一一天一讲讲个一天没没啥事儿,就讲讲一会儿渴了,讲一会儿渴了,可能是天气太干了啊,太干燥,来整一个吧。
12:03
啊。点GOOK,跟上思路,Package包包好包包,然后呢,我们import肯定要有一些信息,对吧?啊,肯定要引入一些东西了,那现在呢,我们初始化的工作,大家想想怎么做的,我们在前面呢,其实初始化一次刚好这段代码呢,可以把它拿过来用一下,先定一个全局的普洱。好,已经有的,我就不啰嗦了啊。这个是定义了全局的普尔,这个大家都是知道的,都是知道的,然后呢,我们再写一个函数,我们写一个函数,各位同学写一个叫inititt也可以啊,当然也喜欢写个,呃,写个in nit普也行,到时候我们统一的放在一个地方,统一将其初始化啊,我可以写个啊同学们我可以写个in it,但是呢,我为什么写个ID呢?我希望这个初始化的工作我统一放在main一起调用,这样呢利于我的管理,不至于说这放一点初始化,那放一点字化,自己也不知道初始化了什么东西还得一个一个去看,所以说呢,我就用。
13:10
In普写到这,那初始化什么东西呢?各位同学,我初始化的东西就是这个玩意儿。我我我这没写in nit,我只写了个in poor啊int po是不会自动调用的,再说一遍,这个in ni po是不会自动调用的啊。好普写进去ready,那么这个地方呢,同学们想啊,如果这样写死了特别的不好,所以说呢,我之所以写an普尔也有道理,我希望呢,将来这些是通过一个参数给我传进去的,所以说我要开始定东西了,第一个这个地方肯定是需要我们传进去的。这个地方是不是我们的一个地址呀,啊,所以说我先给他设置一个地址address。是最类型的,这是第一个,到时间这个address呢,就是地址,我就直接放这儿。看清楚了。
14:00
就是地址连接的这个地址好,第二一个呢,我们看哪个地方需要变化呢?看max I,就是说它最大的这个,最大的这个冲钱数是多少,我们可以自己来设置一个叫max ID。Le,这是一个字。然后呢,还有一个这个。最大的一个连接数,咱们也可以把它搞定好,我也写到这儿。好,小写。这两个呢,同学们都知道它都是属于int,所以说我这是这样写也是可以的啊,就这样写的话,就代表这个参数是一个int,这个也是个int,当你这也可以加一个这样写可以,那有点啰嗦,我就这样写。大家看懂了,好,第三个大家看到这个值是最大的空闲时间,最大空闲时间呢,我们可以这样写,一个叫做I。好的啊,这个I time,那这个地方呢,我们给他一个这个这个时间,这个时间啊是time time里面有一个类型叫duration,我记得应该是这样写的,它的它是有一个这样的东西啊,我们搜一下time。
15:11
Time找一下啊,Time包包,Time包包关于时间呢,它实际有个有个类型,大家应该别忘了啊,我记得是对,就它这边有这么多,所以说它类型呢,干脆我们就直接用这个。好,这样子呢,更更精准一点啊,更精准一点,好写到这到时间我这直接传东西进去就行了,好,那现在就就写完了,那现在把它填一下I address填进去了,Max idol填这。好,还有一个呢,就是max active填字。没问题,然后呢,这个爱时间填,这就最大空闲时间,到时我从这边给他传进来,比如说是多少多少秒,对吧,我这样传比较严谨一点嘛,啊,你那100其实不知道什么意思啊,那个100其实是不对的,不能填那样的东西,因为100它不是一个时间这样一个类型,你你都不不知道确定是什么时间,所以原先这个写法它是有问题的,现在这个写法才是正确的,好,这个就写完了,这个就写完了,初始化这个就写完了。
16:15
好,初始化写完过后呢,我们让它在哪里去完成这个事情呢?好,这个地方应该要引一个包包,这个包包呢,就是我们最不容易记住的,很长,好把它搞过来。对吧,好把它搞过来好放在哪里呢?放在刚才我们写的呃,这个ready里面去,诶为什么他这没报错乖啊。啊,这个地方应该报错才对。诶,怎么一一删,删了两个。好,这个就写完。Temp薄。还有什么不?碳包没错,好隐居,现在我完成初始化,我怎么完成大家看啊,我这样做,我复制看东西啊,同学们看,大家看懂了啊,这段代码就说initt普过后,这个普尔变量就已经被初始化,而且它是个全局的,那现在呢,我把这个动作就是把这个initt普这个动作噌的一下连贴复制到mean的最开始。
17:16
也就是说,也就是说这个服务器一旦开启,我们就去初始化我们这个连接池。当当服务器启动时,启动时。我们就就去干什么事呢,我们就去初始化,初始化初始化我们的这个连接词的连接词。连接词没有问题吧,连接词好写完了,那这个连接词做完了,过后没有完啊,同学们,你们不要忘了一件非常重要的事情哪里呢?它这个地方为什么报错了,看一下啊哦,没填值,那就把值填进去啊,第一个我们要填的值都把它写进去了啊,Local这些值将来都可以通过,呃这个呃配置文件读取,我就没有写那个东西了啊啊比如说这个6379没问题。
18:13
然后呢,它的这个最大空闲数我们给个16吧,好同学们,然后呢,这个连接,呃,连接数我们还写个零啊,表示最大,当然也可以写一个具体一点的啊,然后呢,时间我们让它最多300秒,一边最多空闲300秒time.SE好这个这个应该就填填进去了。好,填进去了,好,这边也要引一个time包,好这边也要印一个time包,好time包没有,别忘了引到这上面去啊。好,Time包引进去。好连接词我们这就搞定了,但是呢,有一个问题,就是我们这个时候你要去完成一个操作,这个U到现在还没有。那大家想一想,同学们,大家想一想,在我们整个这个操作中呢,我们只要有一个U2道其实就可以了。
19:07
我们只要有一个U2道就可以了,好,那现在呢,我来做一个这样的工作啊,就是我想在出在这个连服务器启动的时候呢,先给他创建一个幼儿道,说这句话啊,说这句话。我写到这里来。就是我想干什么呢,我有这样一个效,我想我有这样一个需求。我希望我们在。我们在哪里呢?在服务器启动时启动启动后,启动后就就什么呢?就初始化一个,注意听就初始化。就初始化一个user道的一个实例。在需要用的时候,我们直接用,把它做成全局的。把它做成全局的,把它把它做成一个全局的,全局的。
20:00
全局的变量,在需要跟数据库打交道的时候,注意听,在需要和RA交互时,呃在需要和red操作时,就直接使用,就直接使用即可,使用即可,就说我不需要每次呃要去连接的时候,我再去创建一个U2导,那这样子的话,连接池的效,连接池的这个这个效率呢,或者它优势就很难发挥出来了,那我就这样做了啊来第一个。来定义一个也非常的简单。那么我这写一个这样的东西,MY,呃,为了以示区别啊,我取一个叫UMY,这个有点道。有点到,然后呢,我这个类型是什么呢?这个类型就是它。啊,这个类型就是它啊,我可以指向来一个指针啊,指向它的,好这个就写完了。这是个全局的,这是个全局的,那这个全局的地方呢,有一个问题啊,这个普洱他说报错,我看这是为什么错。
21:07
哦,这是个冒号啊,逗号。呃,后面还有一个逗号。好,没问题了,注意啊,此时此刻这个MYU到目前是是个空的,你没有把它实例化,现在呢,我要准备去创建一个这样的实例东西啊,那我看把把这个任务放在哪里去呢?我还把它放在啊,注意听我还把它放在这个主主文件,就说我希望启动时候这个U卖U动呢也也已经有了。到时候我用的时候,我就直接拿来用啊好,那我写到这边来了啊,同学们跟上我的思路,在这写一个东西,那么我专门写一个文函数。我专门写一个函数,叫init u。好,我专门写这么一个东西。好,这里这里我们编写编写一个函数,完成完成对这个user到的一个user到的一个初始化任务。
22:06
初始化任务。初始化任务怎么写呢?那我就直接这样写了,Fun init UR。User user到。好呃,那我怎么写非常简单哈,非常简单,因为我我们这个地方,我们这地方这个U2道呢,它是一个全局的,所以说我直接就可以在总函数里面使用到,它怎么写呢。Model下面model下面有一个这样的全局变量,它等于。它等于什么呢?直接调用model里面的一个方法就可以了。放到哪里这个方法。哎,就给它初始化就完成了,就这么简单好做完了之后这个地方需要传参数吗?需要传参数吗?我们看一下需不需要传参数。好,打到打开这个地方,我们发现它是需要传一个普洱进去的,那就没问题,我就直接传一个普洱。
23:05
这个普洱呢,本身就是一个全局变量,我就直接传进去了。这个poor啊,同学们看,这个poor是在red里面已经定义好的,这点大家可能有点不好理解啊,我这传了一个poor,注意听这个poor不是乱写的啊,这里的poor,这里的那个poor。就是这个普本身就是本身就是一个全局的,全局的变量。全局的变量。在哪里写的,但在ready里面写的,看ready里面已经有它,而且已经初始化了,所以说这个时候呢,我们这地方是可以初始化成功,但是有一点注意,你一定要先初始化它,再初始化这个UR倒就可以了,但是要注意这个函数的调用要在initt普后面滞后,不然的话你先初始化它,这个普本身是个空的,你仍然是得不到一个这个UR啊,MYUR到的啊,这边要强调一点。
24:03
这里要注意一个调用的顺序问题,这里需要注意注意一个一个初始化,初始化的顺序问题,顺序。啊,顺序问题就是什么呢?先完成,对这个先调它再是。再调用init道,为什么呢?因为我要依赖于你,因为我这个init有依赖这个库啊,啊这个这个地方写的有点不太特别漂亮啊啊到时间我们这边还可以优化,还可以优化好,我先把它填进去。好,那这就完成一个破了。好,同学们,整个代码这个地方就这块儿初始化就完成了。也就是说,也就是说这帮我们当然还要引个model包啊,因为你要用到它,你肯定要引包,这个是跑不了的,好,我们来把这个包包引进去,Go cold,然后我们写的是chart room。
25:05
啊,然后我们是server这边,然后我们写了一个model,好这样子就没问题了,保存一下。代码应该OK,还有个错误啊,看哪里还有错误。好,他这面报了一个错误,他说哦对对对,这个是个大写才行。这个是个大型才行啊,否则他引不过来。好,把这个要改一改。改一下。哪里还有错误?哪里还有错误?Init倒是有参数的呀。I到in哦,我看看到我看一看啊,In到没没有写参数没有传没有传啊,这个坡是什么什么意思,就是你说这个坡没传进来是吧。
26:02
这个不是刚才解释了半天吗?就是这个破,这个破是一个全局的,我直接在里面用是可以的呀。啊。154行,哦对,这这我传这个干啥,有病好对不需要传好确实不需要传啊。全保存,全保存。好,再看看这里面还有什么问题没有,好同学们,我们整个这个呢,呃,这块关于代码部分咱们就基本上搞定,就说该写的东西都写完了,但是还没有调用。就差一点了啊。其实整个这个都全部差不多了,就差一点,哪一条线呢,就差这根线了。就差这根线,我们现在目前这个user user这个process,其实根本没有跟数据库发生任何联系,我们是直接在这边完成验证的,还记得吧?
27:02
OK,现在我们只需要把这根线打通就行了,也就是说,我们做了这么多的工作,就是为了把这根线连起来。但是写了很长时间啊。那这个时候怎么办呢?首先同学们找到user process。找到它,我们找到了一个最关键的地方,同学们可以看到我们原先是这样验证的,不行了,因为写死的,也就是这段代码要改一改,要改一改,就在这改一下就行了,啊,一句话的事儿。干些什么事情,注意听,你看就改了一点,但是写了好多东西,是不是先现在我们我们需要到数据库,到RA数据库去完成一个验证。那完成验证的时候呢,我们的步骤如下,第一步,第一步先创建。而不是都不用创建了,因为这个时候呢,我们我们在这个main里面,其实已经把这个东西都初始化好了,这就是我们的好处,因为我在NU的时候,这个MYMY已经有了,所以说。
28:12
连这个直接都不用,直接拿来用就行了,使用它来完成一个处理,看这代码写完,这个地方就变得异常的简单,就是干什么呢,使用。注意听啊使用。使用这个家伙到去到到哪里呢?到ready去验证,到ready去验证简单的很,一句话的事,点它logging完事了。把我们这边接收到的用户名和密码拿出来,我们用户名和密码在哪里呢?我们的用户名密码实际上已经从这个logging logging这个这个这个logging message里面是可以取得到的,第一个是他的ID。User,因为你看你原先是怎么比较的,你原先是把这个用户传过来的ID跟100比较,现在我传进去,第二个还有它传进来的密码,密码呢就是他也给他传进去。
29:12
好,而且我们这个log井确实只需要这两个参数,最后呢,我们这应该返回了两个信息,一个是UR,一个是error,好error呢,而且这个error咱们信息都都都全获的好,那现在我们就做一件事情了啊,跟他这样做一个判断就行了,如果看清楚了啊,如果这个error不等于near。那说明我们这地方是有错误的。这边肯定错误,已经这个错误呢,都已然给你这个这个返回来了,如果没有哈,没有就是error,就是没有错误,那如果没有错误的话呢,就相当于我们这个地方是正确的,所以说这个地方逻辑呢,仍然是可以这样做的,没有错误的话,就说明这个返回的这个码仍然是200。
30:00
这个没有改动,但这块呢,这个地方你可以把错误信息给他打回去,我们先慢一点啊,我们来简单一点,我们先不做这个处理,我们就先先给他来一个原先的逻辑。看这个能不能走通,然后到进一步,我我我再去判断这个L是什么,再给他返回相应的错误信息,再说一下啊,到时间我们在这还可以加点功能,就是到时这里先打通,这里我们先测试成功,测试成功测试成功,然后然后干什么呢?诶,然后我们再可以根据根据具体的错误信息返回,再返回具体的。具体的错误信息。啊,具体的错误信息。好,这个A这个地方信息,这个也可以给他带带回去。啊。啊,不等于空这边是200 200是正确的500啊,现在我们还把它原先这个逻辑保留。
31:00
后面这个错误信息,我们可以自己根据那边返回的信息返回好,最后呢,有一个问题,他说这个userr没有用到这个user,这个userr没有,他说猫都没有引哈,还有猫都没有引好,猫都没有引,我就引一下吧。Model。Model。好,保存一下,保存一下,他会说UR没有使用到,他果然告诉我userr没有使用,那么这个UR有有没有用呢?显然这个UR肯定是非常有用的,这个UR会非常有用,为什么呢?因为你将来在服务器这一端,你想去拿到登录的所有用户信息,你不可能只拿一个ID,拿个密码,你肯定想拿到一个结构体,想要什么要什么。只是现在我暂时没有用到而已,这个有点绝对有用啊,非常有用,那为了用它呢,我们先暂时把这个信息打出来一下啊,我在后台打出来一下,就说某某人登录成功了就完了。好吧,到后面呢,同学们可以把它展现在你的服务器的一个维护列表,比如说你现在要提的一个人,大家以前做那个服务器,那边服务器管理员一打开这个列表,发现谁谁谁在线,我一点踢掉都可以操作啊,那这个东西就就很有用了,那这个地方我们就先暂时的把它打出来就行了啊,说某人登录成功。
32:14
好说谁这个人登录成功。打精算user啊,登录成功了。啊,登录OK,登录成功。好,你把他的ID打出来就行了,或者或者就那样写也可以。好,同学们,看代码没问题了。现在呢,到了我们验证的时候,我们这个代码能不能跑起来不知道啊,因为代码呢写了还是比较多的代码,我们这边改动主要是集中在服务器这头的,看代码写的还是不少啊,我们写了MODEL3个文件,写了ready一个文件,然后呢,Main这边做了改进,这条线也连通了啊,包括这边我们也加了一些信息进去,好内容呢改动的比较大,那么我们来看一下到底能不能完成到数据库的验证啊,不清楚。
33:05
那么跑起来服客户端这边没有做改动,所以说不用去不用去重新编译客户端,客户端这边呢,还还这样老在老在这边就行了啊退出不用重新编译服务器端,我们来编译吧。服务器端我要重新编一下走,验证一下代码能不能跑起来。有可能会有错啊,有错我们再调一调。Server。嗯。十总。好,同学们看,现在他说我在这边等待你的连接,现在已经跟数据库连接了,那你这个一定要保证你的red是运行的,你如果red是关闭的,那肯定要报错啊好,现在呢,我们来登登一下走。我们现在登录一个一,登录一个一,好,现在呢,我输一个100,因为100还有这个123456,我们是存在的,我已经扔到数据库里1234。五六回车。
34:01
好,他说我登录应该是成功的,那么我们可以看到这边有没有信息,他说果然有一个人,他说1102345SC登录成功了,这个SC其实就是我们在添加时候登进去的是不是,所以说明这个是可以的。这一下就成功了,还是很有意思啊。啊,但是这期坑其实有好多坑,我已经给你们跳过去了,你们要自己写的话,会出现很多坑,我们再找一个不存在的,看看能不能进去啊同学们,那现在我先退出,我再找一个新的用户啊一好,比如说现在呢,呃,登录一个不存在的用户,各位同学啊,比如说是900。900好,他的密码我就瞎写一个好回车。用户不存在,请注册再使用,其实也很准确,好,用户不存在这个请注册再使用也是正确的,我们假设加一个900,看看能不能进去呢,假设我再加一个,我手动加一个900啊同学们。
35:01
当然我就是为了做测试,看看对不对,呃,然后它密码呢,我们写123456,名字我们叫做汤姆Jack,写一个汉字吧。汉字不知道行不行啊,比如是叫叫叫叫做牛魔王,我很喜欢牛魔王,牛魔王看看汉字能不能显示正确啊,不知道我试一下。好,我们直接往里面扔一个900号的这么一个玩意儿,好,900号的一个好来。跑起来走走一个啊h site,然后呢是users,然后是还是呃900号这个用户,然后呢给他来一个粘贴哇,这个能加进去吗。那怎么空的呀?这玩意儿看起来怪吓人的。啊,我这这能不能起来不知道,我看一看啊,900我看看这个地方能不能取出来啊。呃,Get一下。取出来是个乱码,那就说明这个还不行。
36:00
好啊,应该没问题,应该没问题啊,我们试试看从这个程序这块能不能取出来,好玩一把吧,玩一把走登录一。好,登录聊天室啊,登录登录聊天室走。好,他让我输入正确的ID,那就输一个900。密码是123456。好,现在我应该是登录成功了,大家看这个服务器这边由没把信息取出来,取不出来啊,那说明这种直接添加进去的还不行,注册可以啊,注册是可以的,但是呢,它确实验证有个900,呃,这个人用户在了,只是中文那块它显示有问题,那是属于他这个终端显示的问题啊,属于终端显示问题,好,那说明这个可以了,我们在这地方做一点简单的完善,大家看到我们这明明写了很多的这个定义了,很多的这个错误信息,我们没有用到,这个很不划算啊,用户不存在,用户已经存在,密码不正确,那么这些信息错误信息都已经给你用上了,你为什么不灵活的使用一下呢,还得这样傻乎乎的自己去一下,不划算,我们这样做一下啊,来朋友们,现在呢,错误信息有这么几种,我们来判断一下,如果注意听注意听啊。
37:12
如果我们这样开始写了error,如果它是等于哪个信息,哪种错误呢?好,如果它是等于这个错误信息,哎,我们就可以用它了,来把它放进来,它如果是这个错误信息。写到这来。对,它是model下面的这个错误信息说明它是用户不存在的,所以说用户不存在,好,我们可以把它封装到这个地方去。对,可以把它封到封到这面去,而且它的错误信息呢,你也不用写到这儿,因为写到这地方假设要统一改也很麻烦,以后我全部都把错误信息写到这,那就可以这样写了,就是直接从这个error里面把它信息取出来,它应该是这样取的吧。应该有个error e or,我记得是这样写的对吧,是有这么一个函数吧,同学们好,直接把文字取了,这样就很简单,到这样维护,维护起来很轻松啊,我将来要这个错误信息文字提示什么,我不写到这儿,好再来看第二种,他可能还有一种就是密码有问题的,那这样子呢,我们又可以做一个判断,诶,假设这次他的错误信息是。
38:18
啊,密码的一个错误,好,那么我把这个粘过来哦,密码不对,又是一种错误信息对吧?诶我们有不同的这个信息的提示,那就比较漂亮了,找到它来。好,找到它来,然后我们写写这个信息哦,如果你这个L是用户密码有问题呢,我们给他返回另外一个定义好的一个码值,比如说密码不正确是300啊,那错误新息我已经规定好了,所以不用管它了,当然还有一种情况就是未知信息,但我我就写的比较简单哈,还有别的我不知道呢,就是未知的信息,好未知信息呢,我们也给他来一个。比如说未知信息五是404吧,好,这个立码不对,一般是403,就是403是静止的一次啊,这样会比较好。三比如来一个未知错误,505未知的未知错误呢,我们这因为没有这个错误信息,所以说人家写这个未知错误。
39:15
啊,我们说叫无器肋骨啊,无器肋骨。服务器,服务器内部错误啊,不确定的一个错误,好这样呢,我们代码这样一写,诶大家感觉到从这个错误来管理呢,也比较的方便,对吧,也比较方便,好大家看看我们代码能不能跑起来啊玩一把,我们用不同的情况来测,看看它有没有正式的把这个错误信息也给我们返回去,来吧,组一个来朋友们,现在我把这个地方编译一把。编译吧,走OKOK啊,不着急,Server跑起来,Server跑起来,然后呢,我们在这个客户端,客户端这边呢,我们来玩一把,看看能不能根据不同的信息提示来走一。
40:01
好,现在呢,我输一个,呃,ID存在,但是密码错误的啊,ID写了100密码,我瞎给他来一个ABC,那这个时候呢,他应该给我返回一个密码不正确,密码不正确。好,可以看到他返回的信息。他给我返回一个什么信息呢,我们看一下。ABC。被他说。通讯端出错了。看一下是哪里有问题啊,Model保存一下先看。Model啊A等于这些这些这些,然后他给我报了一个错误啊,看是为什么退出来先。先退出来啊,再来一下,我编译过了应该。走,我先登录一个成功的123456,好,这个是登录成功。
41:05
啊,登录成功这边也是正确的,错误的是我是怎么处理的,我看一下我看一下我错误信息是怎么处理的,客户端这边。好,找一下客户端,同学们找一下客户端,找到我们的客户端啊,找到我们客户端,找到客户端呢,这边有一个user process啊,我们看是怎么处理的。好哦,我明白这边地方是返回了一个错误信息就离开了,但是我这写死了,看到没有,他说你一定是一个500,大家知道为什么刚才说了吗?因为我那个密码返回的错误,错误码不是500。不对吧,我不是500,所以说在这个地方其实完全就不需要再判断这个东西了,就不需要判断这个,因为你的A里面已经包含了所有的信息。所以说这职业就是一个else。就他的码只要不等于200都是错的,那错误信息是什么呢?直接就是通过他这个log进这个,因为我已经把错误给他封装到这个里面去了。
42:06
对吧,所以说这个地方就变得简单,就说错误信息全部从这打出来就行了,一句话的事,好这个就对了,啊,这个就对了,保存一下这个就对了,错误信息都在这里面直接输出就行了,来再来玩一把,这样刚才那个代码没有毛病,只是这提示的有问题,来玩一把。编译一下我们这一个client。好的,看服务器端还在运行吗?服务器端应该还在运行,抛下走来。找一个一好,我先输一个100密码ABC,应该提示一个什么信息呢?就密码不正确。我们可以看到完全的正确,他说密码不对,哦,啊密码对,再来一次。我们再重新登录,因为现在我是循环的做这个工作了,好循环登录的话呢,我们再输一个100,再输一个200。
43:00
啊,再输一个不存在的ID号啊,比如说我有个五这个543这个用户是没有的,这个ID没有啊,我来输一个随便输一个密码,这个应该提示用户名不存在,请你重新注册。果然是用户补充三也正确了,说明这边两个信息是通的了啊,最后再输一个正确的100好,然后呢,输一个123456正确好可以了可以了,好,那说明我们这条线呢,都是OK的,都是OK好我把代码给大家整理一下啊。好,把整体这个代码给大家整理一下,看看我们做了哪些工作,做了哪些工作啊。好,这边呢,我们代码的实现主要做了这么一些工作啊,头都写晕了,大家大家可能也也有点感觉对吧,感觉有点晕晕晕乎乎的感觉呢,为什么?因为代码稍微的这个多了一点,好我们来把这个思路捋一捋,我们看看我们做了哪些事情呢。我们打开这个RA啊,打开这个地方server,我们先做的是这么几个工作,先把model里面的三个文件搞定了,那么我们所的顺序是先写userr,来把思路捋一捋啊,第一个我们编写了代码实现的步骤。
44:16
好大时间说是先编写了,编写了我们这一个就是model包包,Model包下面的一个user.go好,我们编写了这个东西,然后又编写了这个model下面的error.go。好,我们还编写了什么呢?我们编写了,编写了model下面的一个重要的这个,呃,DAO叫user DAO DAO啊DADAO点够好这三个文件,那这三个文件呢,具体的内容我们把它给大家整理一下,第一个user.go。user.go好,同学们,这是它的一个user,表示user的一个数据信息。
45:03
好,刚才我们跳了一下,不知道跳哪去了啊,找到它在user,那具体来说呢,就它。好。没问题啊,同学们没有任何的问题,这个地方。好,这是第一个。这是我们的第一个文件。对,第一个文件,紧接着我们写了这个L点勾自定义了一些错误,这个还是很有用的,同学们在实际开发中呢,我们通常会把一些错误自定义一下,不会说是每次都是把那个错误信息在程序里面写,那是不可能的,那样太low了啊,你不然的话,你以后错误信息要统一改一个提示信息,你还得找每个地方,太累了啊,所以说还得把它统一管理起来啊,这是我们的第二个文件啊,第三个文件呢,我们写了个user。就是这个叫做呃,Userr到UR到这个代码呢,相对多一点啊,相对多一点,那具体来说就这些东西。
46:01
对吧,OK,那这个呢,我把它给大家多的地方太多了,我就懒得粘贴了啊,我直接给它来一个插入一个小表格。OK,同学们。好的,这个地方呢,是这个东西啊,这地方是这个东西,好,接着往下看啊,接着往下看。这个完了过后呢,我们紧接着又做了什么工作呢?哎,我们这个写完了过后,我们写了一个ready,我们写了一个re,这个地方是完成一个连接词的这么一个使用,对连接词使用好,把它写进去。那么在哪里写的呢?是在这个第四一步了。啊,前面这个是第几步,看一下啊,这个是第三步,这个就自然是第四步了。这个是第四步,第四步我们写了,就是在main这个文件夹下面写了个ready,点够没问题啊,点勾没问题,我们把它也放过来。
47:01
写的什么东西呢?就是完成一个初始化,用了连接词来干活,如果你不用连接词的话呢,效率肯定是,呃,有些小影响啊,所以说我写了这个代码,紧接着呢,第五一步,第五一步,我们在主函数里边,在主文件里面完成了一系列的初始化任务,主要是体现在这个地方。主要体现在这么几句话。啊,主要体现在这么几句话。一个是这。啊,然后呢,初始化的任务,实际上初始化的这边有一个需要大家注意的问题,就是需要一个注意大家初始化的顺序。为为什么要注意这个顺序呢?因为这个in u do里面用到一个pull,而这个poor呢,它是要依赖于你这个in破里面,它要对它进就利普呢,会去真正的把这个全局的普变量给真正初始化,所以它有个以来的顺序问题啊,如果你担心别人会改的话,你可以把它封装在一起,或者这样做,写在主函数写一个initt,把这两个提到上面去也可以,就是什么意思呢?你也可以这样写,写的更漂亮一点,可以这样写啊,我给大家改一改。
48:14
啊,改一改。啊,也,也可以这样写,同学们。就说我给大家提一个建议吧,就是说如果说你担心这个有问题呢,你可以这样写啊同学们。说韩老师干脆我们这样子,我们写个fun I。I,然后呢,把这两句话整个拎到这边去就完了。也可以啊,也可以这样子,那这样子的话呢,代码还更干净一点,就说iit就先调用它,再用它也可以,对不对,也可以啊,你觉得哪个好,你就用哪个就行了,好这样子也可以啊,没问题,保存一下吧,保存一下,这样就就把我们init这个知识点呢,也用上了,也用上了,好最后一个呢,就是我们完成了他们之间的一个调用,写完了,其实最终我们用的时候挺简单的,就直接把它连起来了,但工作还是很多的,就是最后呢,使用了一个最关键的地方是在哪里用了呢?在这个process。
49:16
里面的user process.go我们去使用了,使用了这个验证到red去验证的这个功能,Red验证的这个这个这个功能啊功能。那具体来说呢,其实就在这写了一点点东西,找到我们user process,我就写了这么一段代码,非常简洁的一段代码啊,各位朋友。就在这儿写了一个东西。OK。好,就在这儿写了一点东西。好的,那我就把它复制到这面了啊,诶怪了,我这写了一个UR,为什么没有用它也不报错呢。哦,在这写了一个啊,在这写了一个没错啊,还是用了一下,还是用了一下。
50:02
好,同学们,那关于到数据库ready去验证呢,我们就先给大家介绍到这里。在休息时。
我来说两句