00:00
下来写一下绑定邮箱的功能。绑定邮箱啊,也分两部分。一个是我们要先向他要绑定的邮箱去发送验证码。啊,第二步是他要把这个验证码,还有他要绑定的邮箱一起提交过来,我们验证通过后,也就是说。他传的这个邮箱和这个验证码确实是匹配的啊是。认证通过的是可用的邮箱,这样我们才去修改用户的这个邮箱。在传统的外部项目中,邮件发送的内容一般是一个链接,用户收到邮件以后点击这个链接,然后会跳回我们的项目啊,我们的这个项目就会对。这个链接进行一些校验,认为这个用户的邮箱是可用的,合法的啊之后。啊,就可以让他去更新这个邮箱,但是我们是API的项目,API项目我们没有这个三线啊,这些状态来维持。我们是无状态的。所以邮件发送的内容发送。这个数字会比较好一些,比如说是六位的四位的一个数字吧,当用户提交信息要更新邮箱的时候,连同他收到的这个验证码。
01:09
一块提交我们进行验证就可以了。接下来写我们的功能。先去。创建一个控制器。还是放到also里面创建一个半啊CTRL。接下来。在这个控制器里面去写两个方法。先继承base control吧。写两个方法。一个是。啊,扣的。Email code就是获取。邮件的一个验证码。
02:00
Request。写上验证,他需要啊,去接收一个邮件,就我们有邮件才能给他发送这个验证码,对吧。你。必填,并且是邮件格式就可以了,好吧,然后呃。收到用户提交的邮件以后。这里。发送一下啊。发送这个验证码到邮件啊。好。这个先放这,我们把第二个功能给写一下。嗯,这个应该就是更新用户的邮箱了啊,绑定或者是更新都可以。
03:02
更新邮箱。同样需要。这个表单验证啊,也是需要验证这个邮件,但他同时还要验证一个扣的。必填。验证通过之后啊,就是更新用户的邮箱。更新邮箱呢,和更新密码啊差不多啊,直接也是获取到这个U4。获取到这个user模型。实例从。Also里面去获取啊。User,然后user。Email等于request里面。传的这个email就可以了。
04:01
Save保存一下。最后返回更新成功。这个更新邮箱啊,我们就写完了,等会儿会进行一下测试。现在主要写的工程什么,发送邮件对吧。哎,那我们先把什么补一下,先把路由补一下。路由还是写到奥里面。在这发送邮件验证码。使用POS的方式吗?Email code。办的。好的,这个方法啊。把另一个路由也写一下。
05:01
更新邮箱。也是post email update。好,这两个方法。应该没有写错啊,对的,你没啊。Ma。改一改,好。路由。写完了,空制器写完了,接下来就是去发送邮件,嗯,关于发送邮件呢,配置我们之前都写好了,英文里面就是都配置完了。因为我们写后端API的时候。就是发货的时候有一个邮件通知对吧,所以这个邮箱的配置都是配置好的,这里直接去发送邮件就可以。创建一个发送邮件的类。Make,没有。啊,这个邮件我们就叫。啊,扣的吧,啊是的扣的。
06:01
发送验证码。把它折叠一下。在APP里面的mail里面就会多一个。这个。我们就要在这里面去生成。扣的。啊,并发送给用户啊生成code的,然后生成code之后呢。把它给发送就可以了啊。好。先把页面处理一下,就是我们发送邮件的一个页面的一个模板啊,我们放到哪呢。还是放到resource啊,Resource这里的个S一个emails放在这里面啊。MS第二。Send-code来接着去创建这么一个文件。PP,第二,Blade要以blade结尾啊,它这个是blade模板。
07:05
在这里去写我们模板的内容啊一三。验证码为。验证码是,哎,这里写个扣的我们的验证码啊。嗯。再写个H3吧。15分钟内有效,请及时使用好,我们是不是要传一个扣过来。对不对,那。这里要传一个code过来对吧?啊code呢,我们就随机给它生成。四位或者六位都可以啊,一般现在。啊,现在都是生成这个。
08:01
四位比较常见啊,六位的话就比较多。啊是用run啊,我们生成。四道就四维的一个随机数,然后发给模板。啊,但是我们想想,我们把验证码发送给用户之后。然后用户收到这个验证码,他下次提交过来的时候,也就是提交过来的时候。哎,我们在更新邮箱的时候,对吧,我们要验证他的验证码和这个邮箱是否匹配。你怎么验证,所以我们要有一个地方去存储一下这个邮箱和这个验证码啊,一一对应的一个关系,也就说比如说a.com这个邮箱对应的是验证码是一一是不是,或者是B什么邮箱对应的是二二,这些要有地方去存储啊,这时候。嗯,你如果是我们之前传统的那种外部项目,我们用三线就可以对吧,但是我们这种API的项目。可以使用什么可以使用。缓存是不是。啊,来使用缓存啊缓存。
09:03
邮箱对应的这个code。缓存可以使用辅助函数啊,开启辅助函数啊。他呢,接收一个数组。然后这个是K对吧,这个是这个这个value吧,Value肯定是我们的。扣的K呢,就是用户的这个邮箱是不是。哎,用户的这个邮箱。哎,也就是用户的这个email,所以说。我们在调用发送邮件的时候啊,要传一个邮箱过来嘛,这里面我们要接收到这个邮箱去缓存。可以吧?嗯,你可以使用辅助函数,也可以使用门面,比如开启的这个门面。
10:00
啊,找find门面使用它的put方法。第一个是K啊,第二个是你要缓存的内容对不对,那K的话我们就。用这个邮箱。做这个K。可以吧,好,所以这里我们先出示啊,先不写。先干什么呢?先去发送邮件,发送邮件。使用mail的这个门面。啊,使用它的to方法。然后这里可以接收优秀模型,也可以接收指定的邮箱,是不是,那我们要给谁发,是不是你request里面传过来的这个邮箱。对不对,好,然后使用肾的方法。那使用哪个邮箱发送类呢?使用我们的send code,这个应该是new啊。圣德扣的啊。啊,这样就可以了啊,呃,这里我们缓存的时候是不是需要用这个用户的邮箱做K,这个邮箱怎么来。
11:02
可以通过这个构造函数传过来是吧,然后这边传过来之后,这里构造函数接收用户的邮箱是不是这样的。啊。啊,当然也可以从这个他的这个图里面去获取,我们这个突是不是传了这个邮箱。啊,那我们来啊打印一下,先在这里滴滴一下,This,就是这个邮箱发送类的这个图,我们看看这个图是什么好吧。请求我们的发送获取验证码的这个地址是以mal扣的啊,POS的方式。来,还用这个post的方式请求,Also里面的email code啊,这些参数都不用传。啊。Talking过期登录一下。密码错误,密码之前我们是改过一次。复制一下这个topic。
12:07
邮箱不能为空是吧?我们要传一个邮箱,这些没用的参数就先删掉了。传一个email啊,我们随便传一个a.a。A at。a.com,一定要邮箱格式对,不然也传不过去。这是打印的数据,打印数据我们在这里看。好,你看。有。它是一个数组是吧,这是有数据的,不是孔,它是有数据的,只不过是因为这个postman没有给我们显示出来。叫什么?好。有数据的啊,那。它有两个。我们来看一看,这样看不出来的话,我们把它转成字符串啊,用杰森。一扣的。先把它转成字符串,我们看看它的这个值都是什么。
13:12
这个这个写错了。你扣的啊。是不是?然后。他有。什么一个这个。啊,有一个元素是一个对象啊,所以我们可以。从这里面取出来。零啊,第零个,也就是说第一个元素。接着再看。就拿到了它是不是,然后取它的这个键就可以了。是这样的吗?来。因为我们只给一个邮箱发,所以可以这么去取。
14:04
打印下来。是不是拿到这个邮箱了,对不对,然后。我们就是用这个邮箱做这个缓存的这个键就可以了。啊,当然你感觉这么去获取这个啊,这个邮箱有点麻烦的话啊do。如果你感觉这么破解比较麻烦的话,我们就不用了啊。好。那怎么用呢?我们使用。这里把邮箱给传过来吧。也可以啊。你这里传过来也行。清楚吗?来传过来,那这里就不用它了啊,你传到这个类里面,这里面有一个邮箱来接收一下,一个变量来接收一下没有。好,Dota this email等于do。
15:03
你没有,那你还要定义一个邮箱的一个属性。然后下面就可以直接用了啊缓存。用这个邮箱做K,用我们的验证码做值进行缓存。叫什么?啊也可以,就是说你怕和其他的缓存的键重复的话,可以再连上一些吗。啊,比如说email code啊,再连个前缀嘛,这两个邮箱。接着是不是要设置我们的过期时间,你看一下这个函数,这个方法,它有一个第三个参数是接收一个过期时间的,是不是好。来第三个,我写过去时间。啊弄。他可以去增加这个时间。
16:02
滴滴看看这个。分钟,嗯。这个分钟啊,增加15分钟啊,15分钟后过期。因为这里写的就是15分钟后过期嘛。缓存邮箱对应的扣的,然后去发送邮件。可以了,我们来测试一下啊。给哪个邮件发呢?给。这个有点烦。复制一下去登录一下。看看我们会不会收到这个邮件。
17:02
啊,就是这个。啊,现在没有邮件啊,现在我们来进行发送。200啊发送。成功。看一下邮件。刷新一下。哎,是不是收到这个邮件了。验证码是,然后15分钟内有效,请及时使用。好。那我们发送邮件就写完了,但这里没有给。没有给响应啊,我们给一个响应。Return。Response。
18:00
没有任何的内容的,一个响应就可以了。嗯,发送成功之后啊,接下来再去更新邮箱,更新的时候我们就要带上这个扣对吧,要验证。扣是否正确?好。来进行测试啊,怎么验证呢,其实就是。嗯,你从这个开启里面,缓存里面去取出来的这个邮箱的这个。存在这个coat。如果它不等于。Input里面输入的这个口等。那就说明什么呢?是。不符合规则的return。Response。啊,Request验证码错误。验证码或邮箱错误啊,也不一定是他验证码输错,也可能是邮箱出错了,都可能啊,啊这个K呢,就是我们缓存的这个K。
19:09
我们缓存时候用的哪个K,取的时候就用哪个K。清楚吧,这样你才能拿出来这个值啊,这里我们使用的开启的门面,这里使用的辅助函数啊,给大家都试一下。那这个邮箱就不是this email了,而是request里面input啊,传递过来的一个email。如果它俩不相等。就认为它不符合规则,来测试一下,再写一个这个啊。复制一下这个链接。POS的方式。把认证消息加上。嗯,地址换一换。是。Email update。啊,接着提交。
20:01
Code不能为空,邮箱不能为空。发现问题就改掉。给他加一个翻译的一个消息。扣点required。验证码不能为空。来,再试。那传一下邮箱,邮箱我现在随便写。然后验证码给他也随便写。对不对,验证码或邮箱错误,然后把邮箱写对。邮箱复制这个邮箱。然后验证码随便写。是吧,也是验证码通过,现在我把验证码写对。
21:03
诶204更新成功。那邮箱可能就被更改了。好,这里你看验证通过之后就会更新的邮箱。看一下用户表呢。邮箱是不是改了?当然我还把它改回来啊,手动改回来。嗯,要不然我要要不然我就要去改登录这里一样的啊。说明我们这个。是可行的,这个功能已经测试通过了啊,发送邮件也正常。然后邮件接收也正常,验证码也好使。更新没也好使,那现在还要进行一个优化什么呢?你看我们发送验证码,它速度是比较慢的。对不对。这里。你看就是发送验证码的时候。是不是比较慢的对吧,我们是不是可以把它改成队列,使用队列去发送。
22:03
是这样的吗?啊,现在我们使用队列就比较简单了啊,直接使用它就可以了,我们在第一开始一第一次使用队列的时候啊,就在写后台功能,第一次写使用队列的时候,是不是配置了很多东西,包括队列的这个啊。迁移的一个表什么的,包括这个教子表是不是好。嗯。在配完之后,我们后面其实使用就很简单,就不用操心这个配置的事儿了啊。但是我们要看一下我们队列的这个守护进程状态对不对啊,因为我们使用队列是不是要一直启动的那个队列才行,但那个队列荣誉啊,有时候会崩溃,会异常结束,所以我们开启了守护进程。是不是啊,如果回忆不起来,我在手头里面给大家稍微过一下队列这里。哎,综合话题这里。找到队列。好在使用队列的时候。
23:01
啊,我们是不是要运行。这个队列处理器,我们队列才能正常使用。对不对,而且正在排队执行的任务是不是在这个这个表里面。啊,执行失败的任务是不是在这个表里面。是这样的吗?啊,一个是正在进行的或者排队的一个任务,一个是执行失败的任务。啊,所以我们要一直去呃。运行的这个队列,我们队列才能正常运行,但是它有时候。啊。可能会异常的终止。所以我们使用了守护进程去守护它,它如果异常终止的话,我们守护进程自动帮我们重启。兄弟吗?所以现在我们来看一看守护进程的一个状态有没有,呃,正在运行啊。可以看到啊,Running啊是运行着呢啊。是监听到我们这个笑颦一拍的这个。所以啊,邮件这里我们直接使用对联啊,它是能发送成功的。
24:05
来我们进行测试一下啊。发送验证码。这个是不是很快就响应了,而且能收到这个验证码,来收件箱里看一看。查询一下。没有收到邮件。可能队列执行有问题,来看一下日志。队列的日志,我们当时在配的时候是写到了这个下面是不是。好,这个我。可以看到。他这有一个。就是我们那个send扣。失败。对不对,包括你看这个表的话,刷新一下有一条执行失败的一个。异常。来看一下这个异常是什么,你可以选择啊,在这里面看啊,或者是复制出来去外面看也可以去。这个拉的错误日志里面选,他既然是报错了,我们在这个里面日志里面可以看到的,我们稍微过一眼,大概的意思就是说认证,你看说你的这个账号认证失败。
25:09
对吧,你看认证失败。那为什么会认证失败?为什么我们之前直接发送就发送成功了?啊,为什么使用的队列就认证失败呢?啊,我告诉你为什么啊,是因为。我改了这个东西,我把之前。就是说我们之前写后台API的时候,是不是填了一个这个password对吧。啊,我在写前台之前,我把这个都给删了,重新写的一个这个东西啊,重新写的这个密码。啊,所以我们直接发送能发送成功,但是使用队列为什么就发送不成功,因为我们的队列一直没有重启,你如果看手册,手册也会告诉你,如果你改了队列的任何内容,你必须要重启队列才可以。清楚了吗?来这里啊,请记住队列处理器是。
26:00
啊,这个一个长生命周期的一个进程。它启动的应用状态存储在内存中,因此在启动他们之后,我们改了任何代码,里面的东西对其不起作用。清楚了吧?是不是因为我们这个队列啊。我们这个队列你看看他已经运行两天多了,是很早之前启动的这个队列,而后来啊,也就是今天我去修改了这个EA的这个密码。就导致了我们队列没有重启,我们队列里面它存的其实还是呃,旧的以前的那个密码,所以我们发送邮件认证。没有通过看到没有。这个就是队列啊,大家容易造成一个问题,就是在使用队列的过程中啊,明明我改了一些东西,为什么不生效是吧?是因为手册里面也告诉大家了。一定要记得重启。对电。啊,要不然我们的修改它不会啊,有任何的一个作用。清楚没有,这是,呃,也是我犯的一个错误。
27:02
好。接下来我们充下对电。因为队列是他守护的,所以直接用这个工具去重启队列就可以了啊,速度CKL啊rear后面可以跟上你要重启的队列的这个名字。啊,这个这个名字效果API也可以on。就什么啊,我们直接就想到啊。首先。它是先停止了,然后又重启,接着原来没有启动的这个它也被开启了,那你现在看一下队列的这个状态。是不是都在运行好,没事,这个是以前的,呃,一个项目的不用管。我们现在重启的这个队列。接着再来发送邮件,看看还会不会发送成功。啊,那这个错误里面的这个我就先删了啊。
28:09
把这个。删掉啊。提交。再来发送邮件。看一看。是不是收到了,是不是队列的问题。对不对,而且看一下现在明显使用队列之后,我们这个发送速度是比较快的。是不是一会儿就完成了。所以我们在使用这个邮箱,使用这种比较耗时间的一些。应用的时候一定要去加上这个队列。但是有一点一定要注意,一旦你改了任何队列相关的代码,一定要记得重启队列。不然你的啊,新写的这个代码是不会生效的。我刚才的问题就是这个,你想想我都是改了这个配置了,就队列相关的这个配置啊都改了。
29:05
所以说呃,发送失败就认证没有通过。重启队列之后就能发动成功。好,这样我们发送邮件并且使用队列就完成了啊,而且我们更新邮箱,包括这个code验证也写完了。啊,这里为什么我没有去写这个事件,就是使用事件进行事件的一个分发,去完成邮件,因为这个邮件比较简单逻辑,它就是发送一个验证码,你直接使用这个。呃,邮件发送类就可以啊,像我们写后台的时候,写到这个发货就是订单,我们发货那里,因为它涉及到很多的一个逻辑的一个处理啊,所以我们用了事件。关于啊更新邮箱我们就写到这里啊,它是分两步嘛,有一个验证的一个过程,就是先获取验证码,我们再进行验证啊,最后验证通过进行更新就可以了。
我来说两句