00:00
咱们下午的第一部分先来创建登录注册接口,因为我们现在呢,做的是一个新的部分,就是登录和注册部分,所以咱们现在我们就建一个新的模块,比如说咱的模块就叫service u center,然后在这个模块中做这个登录和注册的部分啊,U3就是用户或者说用户中心,那咱们下面我给大家来写一下啊。来做这个操作。我想这位置啊,首先第一部分咱们还是在service的模块下面。在创建一个子模块。比如这个模块,我起名字就叫service,这个u center,就是用户中心,做用户的全操作,这是咱做的第一部分,这个模块我已经提前创建过了,就这个部分叫service u参头各位按照我们之前这个流程,就你点右键建个model,然后里边建个慰问工程,把这个U3的模块给它创建出来,这是咱们的第一步啊。
01:03
然后创建过程中呢,就是可能会遇到一个问题,上午咱也说到过了,就是在这里边啊,你创建之后,可能它里面这个图标不会变,按照我们的方式点右键找这个open model setting,把它去改一下就可以得到啊,但是你创建之后需要等待它先加载完成,就是下面会一直在加载,等加载之后你再进行修改。这个啊,第一步先建一个子模块,这我已经提前创建过了,然后创建子模块中,咱们做到第二步操作,因为咱们现在呢,要操作的是这么一张,就是用户的这个测算操作,所以咱们要一个用户表,所以第二部分咱就在数据库中建这么一张用户表,然后根据用户表用代码生成器把我们的相关代码先给他生出来,这是咱们的第二部分。然后写到这个位置啊。第二步就是在数据库中咱创建一个用户表,然后使用代码生成器。
02:03
生成相关的这个代码,那这步我们来做一下啊,首先我们看一下这个数据库表,就是在我这个资料里边给大家有一个叫数据库脚本,已经听出来了,然后在里边呢,有这么一个脚本叫鼓励U3,咱们把这个脚本文件,就数据库脚本文件打开。然后咱看一下哈,这里边有张表就叫u center member,就是用户中心这个会员表,然后咱们根据语句把这表创建就可以了,我这表已经之之前创建过了,就叫u center member。那我们来看一下啊,在里边就是鼓励数据库中的这个表,U center member,这是我们要建的这张表。这个我已经提前创建过了,如果各位没创建,按照我这个脚本语句把这个创建,然后创建之后我们就用这个代码生成器,把这个表对应的代码,就是它的controller service map实体类,我们都给它生出来,那咱们来生成这个过程应该比较简单了,这些都做过。
03:06
那比如现在我到7M块中,咱把那个代码生成器就复制过来,我就到这个CMS里边复制。这个代码生成器。然后给它复制到我们当前这个u center的T里边来啊,做个复制,呃,这个我提前复制过了啊,就你把它直接拿过来可以了,然后你复制之后在里边我们需要改几个地方,主要这么几个地方,第一个它这个就是路径。咱们现在的项目是service_u center,改成你的路径,这是第一个,然后改完之后下面数据库这些不需要变,这是你的包的那个结构,我这包我就叫EDU3头,我就叫这个名字。然后改完之后,这里边加上你那个表的名字,因为咱的表我从里边再复制一下啊,叫U3头member,把这个表我给它也复制过来,这样的话这个就改出来了,改完之后咱们把代码执行,把相关的代生出来啊,这些不要写错,咱检查一下啊u center就是service center。
04:14
然后这个EDO3头应该没有问题啊,然后这个我们来执行一下,把代码改下生成,生成之后再往下写我们的具体的接口。我们等他执行完成。然后执行之后呢,在里边它就会根据我们的表,把它的controller service map实体内都会生成,大家看这些应该都有了啊,所以这是我们的第二部分,我们就是做这个事情。创建表,把代码生成。这步做到了啊,然后做到之后,咱下面继续往下来写,下面要写的就来写它那个具体的接口部分,咱们主要两个接口,一个是注册,一个是登录啊,那我一会儿先写一个就是登录,然后写个注册,或者先写注册写登录啊,都一样的啊,咱们把这个写完。
05:08
那这里边还有一些其他准备工作,我就直接写下了啊,在这里边肯定有一个。相关的配置文件,那我把配置文件的配置从我这个课件中我就直接注过来了啊,就是这段配置咱给他拿过来,然后咱检查一下啊,咱们上午写那个就是msm发送短信的时候,当时咱用的端口号应该是8005,所以说这个u center就不能再用805,咱改成叫806啊,改个端口号。这是服务名字,这是数据库,然后这是red,我们red,我这地址是132,你改成你的地址,然后下面啊,这一些相关内容啊,包括这里边它叫做改成名字啊,Edu center。Number啊,这里边map这个值,这配置文件写出来了,然后写完之后还有一个启动类,就我之前写过了,就是里边加上你的com sc,加个foot vacation,因为这过程中呢,用到map,所以咱要加一个map扫描,就是map看当然map扫描呢,你可以写个配置类,或者说写启用类上边都可以啊,那我就写到启用类上面了,或者你按照这些方式写个配置类。
06:22
都是一样的啊,把这个我直接这么写了,然后加上我们的map这个包类,就是包的这个地址。这个啊,我们都加上了,所以这样的话,咱们把这个项目的准备工作完成了,代码生成了,包括行类也创建了,这些配置文件都写出来了,咱现在用的是8006端口,这个完成啊,然后完成之后下面咱们开始写它的接口部分。在接口里边呢,首先我们先写这么一个,就是注册接口,然后再写个登录接口,把这两功能我们都可以做到,那当然写一下啊。在这个位置找到这个CTR了,把它打开,然后CTRL里边我们稍微改一下,比如现在我就叫edu center这个。
07:09
Member啊,就是用户相关的,再上面再加上一个cross,就是跨域的那个注解。把这个我们也加上啊。Cross跨越这个注解,然后加上之后在里边我们写它的具体方法,首先按照咱之前一知的过程,还是先注入,就是o to where。我们先注入进来,然后注入我们那个service。Private它应该叫edu啊,就叫又叫u center member u center member。Service,我们就叫member service,把这注入,然后注入之后下面再有两个方法,一个就是登录的方法,还有一个是注册的方法。这两个咱给他完成啊,一个登录一个注册。那我们啊先做一个登录,那咱看这登录怎么来做。
08:03
咱看一下啊,其实咱要做登录的话,那我们最原始方式登录,登录的时候咱是不是要有那个用户名和密码啊,根据用密码到数据库中查,然后做判断,如果他们相同,咱数做登录啊,所以这里边啊,我们有一个登录的这个方法,里边就传个用密码。那我来写一下啊,比如现在我就写一个。Get提交就是get mapping。然后盖在提交里边,给它起个名字,我们就叫烙印啊,就是这个登录。啊,登录。然后这个写完之后,下面写的方法,Have,一个R,我就叫log in user登录,登录的过程中呢,咱肯定要传递那个用户名和密码,而这传递我还是通过这个对象行传递,还是用咱们之前一直的方式,我就写一个request的body。然后直接传入咱这个实体类,因为在实体类中我们有这个用户名密码啊,包括这个数据啊,包括咱一会儿是根据这个登录,就是手机号密码啊,用用它做一个登录,那这个写一下啊u center member。
09:16
然后我们叫这个member啊,把这个传过来,然后传完之后,下面咱就可以调用这个service里边的方法实现我们的登录,那我们来调一下啊,我们写一个member service里边这方法我就叫login,然后把这个member传过来,咱们把这过程都在我们的service中做个实现,就是service里边写上那个登录那个最终过程。但是这个过程中啊,有这么一个特点,咱们上午说过的,我们再看一下,上午有张图啊,用这个来看到我们的需求该怎么去写。就这张图啊。单点登录的三种方式,咱上午说到第三种方式中啊,它是用token实现,也就是说呢,你在登录之后,它要返回一个token的字符串,然后咱们把字符串通过地址栏进行传递,所以说咱们现在把这登录方法,在他登录成功之后,然后就返回一个值,也就是把我们那个token值给他返回。
10:18
啊,返回一个token值,而token值咱就使用我们的JWT的方式给它生出来,啊,这是我们要做到的,那在里边我就写上这么一个。String,比如说叫token,把这个啊,咱最后给他返回,这是咱们写的一个登录方法,然后最后token给他直接re就可以了。然后写一个啊,就是这个。Return r.OK点上这个it里边加一个token。然后它的值就是这个token。这个啊,就是CTRL里边这些过程我再说一遍啊,然后写service,它的过程就是咱通过这个对象得到你传过来的用户信息,包括用户名或者说手机号密码这些信息,然后得到之后咱们调思维中的方法做这个查询,然后判断登录是否正确,就是用户密码或者手机号密码是否正确,如果正确的话,在方法中咱就把这个token值返回,因为咱做单点登录,它是需要这个token这个值的,而token这个值咱要通过咱们上午写那个JWT生成。
11:25
这是我们写的,就是。第一个啊,这个方法做一个登录,直接把这开,然后写完之后,下面咱写这个service,在service里边写下这个最终代码。那我来写一下啊,把这个我先创建在service里边,先创建这个登录的一个方法。然后创建之后,咱们来到它的实现类,在实现类中把这个登录方法,我们最终给他完成出来。写一下啊,就是登录的方法,那登录怎么来怎么来写呢?因为各位应该能想到啊,咱们最原始方式做登录的话,咱们是不是就是根据用户名密码做个查询是不是可以了,就是咱们现在这么做可以也是根据你这里边的手机号或者用户名密码到数据库中查看数据有没有,如果有的话就是登录成功,没有的话就登录失败,咱现在这么写完全可以啊,但是下面呢,给大家写的就是更细致一点。
12:26
因为大家注意啊,咱们这个登录过程中里边呢,它有这个用户名,有密码,包括在我的表里边啊,还有一个字段,咱看我表里边啊。就是这个用户表,大家看里面的字段。我现在表里边呢,没有用户名,有一个叫手机号,所以咱一会儿用手机号密码登录啊,跟用户名一样,而除了这个之外,在里边还有一个字段,大家看这个字段。这叫什么意思?Disabled,它就表示啊,咱的用户是否被禁用,而这个字段的值呢,看一下我的表的设计的时候,它的默认值是零,就是默认不禁用,但是可以禁用,所以咱们多做几个判断,判断手机号对不对,判断密码对不对,再判断这用户是否被禁用啊,咱判断这么三个值,把这些写的更细致一点。
13:20
那下面我们给他就具体来做一下啊,看这个继续登录。当然这个登录过程中,在这个就是。Member里边有用户的这些数据,咱们比如第一部分写一下啊,咱要登录判断吧,第一个我先从里边把那个值咱先取出来。就是获取咱们登录那个手机号。还有你的密码,把两值先取出来,然后咱再做判断,第一个值member里边这个叫get。应该叫mobile啊,这是一个手机,这是第一个。然后第二个有一个密码,就是member里边这个叫get password啊,咱们把两值先取出来,然后判断,那怎么判断给大家写的严格点啊,首先第一个判断大家注意,如果说啊,这两个值本身都为空,或者说某一个为空,那咱是不是就不需要往下取了,咱直接给它返回错误是不是可以,如果这值比如你的某也好,或者你的密码也好,有一个值是空,里面没有数据,咱是不是就不需要往下执行了啊,所以咱们先做一个你的这个。
14:31
手机号。和密码的一个非空的这么一个判断啊,把这个先做个判断。非空的判断,那我们就来写一下啊,直接我们加上一个if。If里边呢,用咱们之前用的那个工具类就是strings。里边一个方法叫这个意思,Empty。Me啊TT,然后里边判断第一个这个叫mobile,就是如果说这个手机号是空。
15:05
然后后面怎么写呢?注意这个逻辑啊,就是我手机号也好,密码也好,有任何一个为空,咱是不是都不需要往下执行,比方说你没有数据,那这位置我们要加个符号。不知各位是否记得啊,这个符号就是两个竖线。这表示什么?是不是或者呀,就是要么你这位空,要么你那位空,有一个位空它就会执行,那第二个咱再做个判断,还是这个string u.e empty里边加一个叫password啊,这一个判断就是你手机号为空,或者密码为空,有一个等于空,那咱这里边给他就直接,比如就直接抛个异常的子肉妞,一个叫鼓励edu exception。啊,就鼓励exception。直接给他抛异常,然后在异常里边把那值给它写一下状态码,我们就是20001,然后这里边写一个,比如说叫。
16:02
登录失败。这个啊,咱先做一个费用判断,让它们的值都不能为空,咱写一个或者一个条件有U为空对不对,然后这个写完之后,咱再做下一个判断,下一个判断什么呢?因为咱现在有手机号,有密码,所以咱下一个判断,我就判断这个手机号是否正确啊,咱们把判断写的更仔细一点啊,那怎么判断呢,我就可以啊。拿着这个手机号到我表中进行查询,如果说能查出手机号,咱往下判断,如果查不出来这个手机号,那就表示它失败,所以咱们这步就是判断手机号,拿着手机号到里面查询啊,咱就一个判断,那我来查一下啊。那怎么查呢?因为现在是在咱们的Switch里边,那我肯定调map,我就写一个base map,或者写一个this啊,咱都写我都一样,我就来一个base map里边这个方法它叫做select。
17:03
大家看啊,应该是这个方法,因为咱的手机号肯定不能重复嘛,在Y里边加上你那个条件,条件我写到上面啊。加一个叫query。Rapper。Query rapper。然后在rap里边写上的那个对象,我那对象应该叫U3MEMBER。啊,就是它这里边我们加个rapper,等于上一个query rapper啊把这个条件我们先做个构建。这个啊,我先溜出来。然后构建之后呢,将里边我们设置它的条件就是rapper,点这个EQ,根据我们的手机号做个判断,大家看表里边手机号的字段就是这个mobile啊,把这个字段我直接复制过来。然后后面传这个值叫做mobile,这样的话啊,我们写一个条件,最终把rapper传过来,它会返回,你查出来那个对象,假如这个对象我就叫,呃,咱就换个名字啊,我就叫这个。
18:09
呃,Member啊,就是mobile member,就根据手机号查出这个对象。把这个啊,我们做个查询,然后查出对象之后,咱做判断,如果说这对象等于空,那就表示表里边没这手机号,咱就不需要往下执行,就直接提示他登录失败。啊,就是判断。查出来这个对象是否为空,那咱们给它快速写一下啊,我加上一个if,然后加上一个string。啊,不用润啊,直接等于空就可以了,这就是一个对象,就是它等于空,那表示现在数据库中就是没有这个手机号。啊,就是你查到这些东西它是没有,那没有的话,我就直接给他抛异常肉。妞上这么一个。鼓励exception里边加一个20001,比如提示他这个登录失败啊,或者提示更准确说手机号不存在都可以啊,我就直接写个登录失败了,这样的话咱就判断了手机号,如果手机号里边存在,咱再往下判断不存在,直接抛异常。
19:16
啊,这是第二个判断,对,知道这种写法啊,咱就换一种判断,就是每个都仔细的判断一下,然后这个判断之后呢,咱再判断下面一个。下面一个咱判断什么呢?大家注意啊,就是现在我这个查出的对象是通过手机号查出来的,如果说这等于空,那咱直接失败,如果这不等于空,这对象中是会包含我这个手机号,是不是还有他的其他信息啊,假如我们查这个它也有手机号,有密码,有别的信息,那在下面再来判断它那个密码,看密码对不对。啊,那我们来判断啊,下一步操作咱来判断它那个密码,因为这个对象如果不等于空,里边就会有密码,那咱拿着密码跟他判断,看它们是否一样。
20:05
然后写一下啊密码。那密码呢,我这里边得到值叫password啊,这是咱刚才传过来的password,然后我就点上equals,通过这个叫mobile member,点上get password,也就是把我们输入的密码跟数据库中查出密码做比较,看这密码是不一样,因为你如果手机号一样,那你就看密码,如果密码他们不一样。我这么写啊,就是来一个非不一样,但也是抛异常说你登录失败,或者提示他说密码错误。这个啊,我们做了一个判断。所以这一步就完成了啊。然后这个完成之后,刚才咱们说的还有最后一个判断,就是判断你的用户。是否被禁用,也就是啊判断咱们的。这个字段叫is disabled是否禁用啊就可以了,而这个值呢,我们是true和false,如果这个值是true,那表示就是禁用,如果它是false,那就没有禁用啊,那咱们下面做个判断,就是它是true和false。
21:14
我快速写一下啊,加一个if。然后if里边用这个叫mobile。Member,我就叫这个名字了啊,点get is disabled,注意这么写它是不是等于true,因为默认就是触摸,如果true的话表示它被禁用,那禁用的话咱肯定不能登录,我也是直接抛异常说他登录失败。这样的话啊,咱把这几个判断就写完了,如果这几个判断,比如说这个对象不等于空,密码也正确,用户也没有被禁用,那到这步如果还能执行,就表示我们现在已经登录成功了,你查数据都能查出来了啊,这个判断就写完了,咱是一个个判断,先判断这两个值是否等于空,再判断手机号在数据库中有没有,再判断手机号对应的密码是否对,然后最后判断用户是否禁用啊,这些我们都做了判断。
22:10
然后都判断之后,最后就成功了,成功之后怎么做,刚才咱们说到了我这里边啊,登录成之后是不是要返回一个token值哦,因为咱token值为了做到单点登录嘛,把这值要返回,但是token值生成,然后用到这个JWT,就是那个工具类把它做到,而JWT咱看一下啊,上午写过的。在这个common里边这个。有一个叫JWTS,这单下面可以用里面的方法。那我们看第一个方法啊,咱上午说过这个方法作用是什么呢?根据你的ID和昵称生成一个token的字符串啊,就按照我们说的那种规则,三部分头主体和那个切名哈希把那个生成,所以咱们一会儿就调这个方法,然后传一个ID,还有它那个昵称,把这个我们就用给它生成啊,那咱们来写一下啊,来到这个位置。
23:09
最终就是登录成功之后。咱们给他就是按照我们的规则生成一个。Token的字符串啊,咱们使用JWT的。工具类做到,那咱写一下啊a wt,因为这个依赖咱们把那个common应该都引入过我们service中,所以咱直接用就可以了,我就写一个WT。U大家看到啊,就这个在里边有个方法就是它要get j wt开在里边呢,咱们传两个值,把这做到啊传两值,然后这传值,各位注意啊,要传什么。第一个你注意这个值呢,你别传这个member。注意啊,为什么呢?Member是不是咱们传过来,就是从页面是不是传过来的对象,这对象中应该只有手机号和密码,没有ID和昵称,而咱要传什么,咱是不是传这个mobile member,因为这是咱们从数据库中根据手机号查出对象,这对象中有咱所有数据,所以你注意啊,传的话要传你查出来这个对象中的值,你别去传member,传member里边没有东西。
24:21
这注意啊,我把这个传过来,Member就是mobile member里边的第一个值是ID。然后第二个值是这个mename,咱一传就能根据两个值把这token我们就生成啊,就是这个,最后把它做一个铝between。所以这样的话,咱们把这个登录的接口,我们就完成了主要这个过程啊。希望各位能做到啊,我再我们再看一遍啊,最后咱测试这个过程怎么做到的,首先第一部分在我们页面中,咱肯定要输入手机号和密码,所以咱用这个对象就是传手机号和密码。我写个注释啊。在我们的member对象里边,咱们要封装手机号和密码,然后把这个传回来之后,咱们调service,在service里边我们做判断,先从里边啊把手机号密码得到,先判断两个值是不等于空,不等于空,判断手机号在表中有没有,如果说没有的话,直接抛出异常,有的话再判断里边的密码,如果密码不正确,抛异常,再判断它是否禁用,如果被禁用后异常,如果这些条件啊,比如都不满足,那最后就是成功了,成功之后呢,咱们就根据我们查出来这个member mobile,得到ID,得到昵称,把ton生成。
25:43
注意啊,这里对象别写错,你别写这个参数中的member,因为这里边只有手机号密码,咱要把我们查出来,这个对象从里边取,因为这里边才有我们的数据啊,最终把这个给它退,所以这样的话,咱们把这个接口我们就初步做到了啊,就是这么一个过程。
26:03
啊要各位啊,把这个做到,咱是做一个就是更细致的判断,把每个我们都做了判断。这种方式啊,实际中也经常都是这么来写啊,就是这么一个过程啊。我把这个给大家递过来。主要这部分,然后在里边就是有各种判断啊,这就不写了啊,那就我就写最后一部分啊,就是最后我们登录成功之后,生成这个token值,咱使用JWT的这个工具类把这生成。然后其他部分啊,都是一些判断。所以这样的话啊,这个功能我们应该就初步做到了啊,就是这么一个过程咱们完成了啊。然后完成之后呢,我这里说明啊,就是我们现在如果说咱一会测试这个是会有个问题的啊,这问题我就直接给大家避免掉了啊,咱们看下什么问题啊。这里强调啊。就是各位在写代码的时候呢,有的时候我觉得随着你代码经验的积累,很多这种bug,很多问题,其实很多时候你能自己给他慢慢避免掉。
27:08
我说的一句很直接的话啊,就是你们遇到的问题,其实我95%以上我都没有遇到过,我说实话,因为很多bug我在写的过程中都给它尽量避免掉了啊,所以各位也学会,虽然你代码经验积累,很多问题需要你能给它避免掉,那这里面有问题是什么呢?咱看一下啊,给大家来说明一下这个问题,希望你能想到,包括以后肯定工作中都是这么来做。那什么问题呢?就关于这个密码中有问题。注意啊,这个密码里边有问题,那什么问题呢?大家看我的数据库表里边,咱看数据,咱仔细看密码,这数据就找这有数据的啊,大家看啊,你看这密码。各位清楚的看到啊,目前的密码。是这个样子,而这个密码如果让你去输入,你没法输,你肯定也记不住,这绝对不是我们写的密码,咱的密码一般比如什么123456,或者说你复杂点什么abcd,什么123456,可能这样,而这个肯定不是我们密码,那这是什么呢?注意啊,它是把我们的密码做了一种加密之后,然后存到数据库中啊,就是加密之后密码要存储,而也是在实际中咱们在数据库中存密码,一般肯定不存铭文的密码啊,就是不存储铭文。
28:27
什么叫铭文呢?就是你能看懂这个词,比如说我存一个123456,是不是咱能看懂,咱一般肯定不存它,而存什么,把密码要做加密,所以这是加密之后密码,但是现在有问题了。注意啊,你注意我在输入的时候,我不可能输这个加密之后这东西吧,咱输入的是不是肯定是123456,或者说111这些值,但是你现在一比较,你拿111跟这一比是不是肯定不一样,所以咱们现在要这么写的话,这一行肯定会抛异常,因为你的密码,你输入的密码没有加密,数据库中密码是加密的,这肯定会有问题,所以咱们啊把这个要做个处理。
29:08
我在里边写一下啊。就是因为咱们存储到数据库里面的密码肯定是进行。加密的,所以说咱要怎么来做呢?大家注意啊,咱的做法就是数据库中的东西肯定不变,那咱要把我们自己写的密码是不是要加密之后,跟数据库中是不是在做比较啊,咱肯定要这么来做啊,这是一种。就是方式啊,写一下就是把我们输入的密码先进行加密,然后再和我们数据库中的密码。再进行这么一个比较啊,这样的话才可以,如果你不加密,那你比较肯定是111,然后跟这个比较两个肯定不一样,因为它一个加密一个没加密啊。这个是咱一种思路啊,那怎么加密呢?在咱们密码加密中,一般来讲经常用的是一种加密的方式,这方式你的各位应该都听过啊,这种方式。
30:09
叫什么MD5的加密啊,咱在实际中密码加密一般都这么做到,MD5的加密方式有一个最大的特点是什么呢?不知各位是否了解过啊,这种加密的特点是什么?它只能加密,不能解密,也就是说这个值你加密之后它是无法解密的,所以咱只能说把你这幺幺加密之后跟大家比较,它是无法解密的。虽然有同学可能在网上看过什么MD5,什么解密,其实它不是解密,它是本身有一个资源库,里面有各种加密和不加密的字符对应关系,用这个来找到,但是它本身不能解密,所以咱现在就需要对我们的密码做个加密啊,然后跟数据库中做比较,这个啊是咱要做到的,那怎么加密呢?这个MD股加密其实是一种算法或者是一种方式,我在今天的源码里边给大家也提供了一个工具类,这工具类我们也是直接用就可以了,就这个啊叫MD5。
31:06
那我现在把MD5这工具类,我就直接复制到我们项目中,咱直接用就可以了,我就放到这个common里边了啊,为了后面方便,然后咱们看一下啊,就是MD5嘛,里边就是这种加密方式,然后它加密就做这种未运算,就用到这个结果啊,咱直接一会用这个方法就可以了。那这个工具类写完之后,咱们把这个代码最终完善一下啊。就这位置,我们给它加上一个叫MD5。点上里面这个方法,然后我们把这个password传过来,这样的话咱把密码就做了加密,然后跟数据库中做了比较,啊,这一步各位要注意注意。
我来说两句