00:00
这节课我们来完成博客的评论功能。首先创建啊评论表的迁移,因为现在数据库的话还没有评论表对吧。Py artisan。Make。呃,Model吧,直接创建我们。评论表的model加上杠M参数,创建模型的时候加上杠M参数,同时会生成这个模型的迁移文件。看一下。不行。迁移文件已经创建完成了,先去看迁移文件。是不是有一个。Create commands这个评论表。它这个模型还没串联,我们先先去写。我们的这个评论表达结构。
01:03
有一个ID自动挡,然后有一个实验戳,接着。由于什么字段呢,整形啊,User-ID。就是谁发表的这个评论,所属用户。啊,接下来还有什么字段。Blog ID对哪个博客进行评论的是吧?评论所属博客。接下来。有一个。啊,尺寸类型的,我们评论不用太长,尺寸类型都可以。评论的一个内容。评论的内容。好,这几个字段就够用了是吧。
02:04
看看我们的模型有没有创建完成。啊,已经串联完成了,只不过这个终端呢,它还没有结束,手动结束掉CTRLC就这就行了。接下来。去运行这个迁移,让他帮我们创建这个表。MIG。哎,这时候就会多一张这个表刷新一下。的一个评论表,有评论,评论表之后呢。就可以开始去写我们的评论功能,先处理一下页面。找到。评论的这个页面是在详情里面啊,Resource。Blog。秀啊。是这个地方。哎,这个地方是形状评论,登录之后就可以评论了。
03:01
啊,把这个地方处理一下。评论提交的方式,看看路由里面,Root里面。找找。评论。是不是?啊。名字啊,名字是啊blog.com,因为这一个名名名称的前缀。然后方式是post对吧,并且还需要一个博客的ID作为路由参数。写一下方式啊,埋的。提交的地址是。用root生成辅助函数啊。那个点卡曼。同时它还需要一个博客的路由参数,对吧?那这个路由里面写着,那么需要一个博客的一个ID,同时它的这个路由的名字是blog.comment要连上这个路由的一个名称前缀。
04:05
啊。嗯。因为是post,所以是不是还需要一个CSR的这样一个to对不对?但是我们其实写这么多啊,都用不着,为什么呢。因为我们要用阿贾克斯去提交,阿贾克斯提交的话,我们是在JS里面获取到评论的这个内容进行提交就可以了,对吧,所以这里改成普通的button。然后。这个给个内。Con。如果用阿贾克斯提交,我们要给这个按钮一个事件是吧?给他一个ID。比港。Comment。接下来使用。二加啊。结块。在这里面,然后我们去写。
05:01
提交评论,Do加阿加。它有这么几个参数啊,URL,我们提到的这个地址,地址是不是可以直接从form的。这个属性里面去获取对吧。从那个放的属性获取。所以我们给父母一个ID。ID form,杠。Comment。哎,那ul就是。Dota。啊,井号form刚看完的,因为。可能有很多地方用到这个form,所以我们把它给放到这个外面。就是。等于。等于它啊,然后URL就是。form.a tr啊获取a action属性。啊,但是现在我们好像写的出问题了,我们不可能直接让他一进来就执行吧,就说一一进详情就发送这个评论吧,对吧,我们要给到这个八塔按钮这个事件啊,给八塔按钮去绑定这个可立克事件,就点击的时候才去提交这个评论。
06:18
注释,写写天气。发送评论。啊,这个时候在这里面去写。就是当我们点击发送的时候,才去获取这个form的一个对象,然后去获取这个FORM0R,接着二加还有一个什么属性。Tap是不是提交的一个类型post就可以了,那么的路由就是post吗?嗯,接下来是date,你提到的一个数据,对吧,先空着。接下来是这个啊,Data type。我们要要的数据类型使用阶层就可以,还有就是success成功之后的一个处理。
07:05
好,这个is就是服务器反馈给我们的一个结果,你打印这个is啊。接下来就是我们提交的一个date,因为我们是post提交,所以你date里面是要包含一个talking字段,对吧。使用。啊,这个。就是获取这个CSR这个投信字段。对不对,好,然后你还要提交什么,提交你评论的一个内容。啊,Content等于你输入的这个content。是不是啊?当然这样比较麻烦啊,我们还要去处理这个talking,还要处理content,既然我们拿到了这个form的这个对象,是不是可以使用这个form的这个串行化form点?对吧,把它form表单里面的啊,所有的啊,这个input就是输入框都给串行化。
08:03
可以吧?啊,我们先不去发送阿贾克斯。先注示一下啊。先干什么呢?打印一下这个form创新化后的一个结果,看一看。在这里啊,找logo。来打开我们的调试。刷新一下这个页面啊。接着在这里输入评论。看看我们。Form的这个serve串新化之后,是不是有talking给我们带着呢,对不对,等于什么,而且and这个content是不是也给我带呢?这样的话我们直接把这个数据提交到后台就可以了。比较省事啊。就不用一个字段一个字段去写,尤其是当我们字段比较多的时候,接下来就是提交。发送,发送到form表单的这个地址使用post好。接下来。
09:01
啊,我们来执行一下试试啊。打开我们的控制器,先看一看。提交到是command里面是提交到啊,这是模型不是控制器啊,因为你看我们的外部路由这里提交到哪是不是。卡曼的controller。点进去看一看,CTRL加左键点进去是不是提到这里啊,这里进行了一个DB,那我们看能不能请求到它。刷新页面。提交一下。报了一个GS错误,找不到阿贾克斯对吧,也就是。这个结块里面没有这个阿,那是为什么呢?是因为。我们之前写这个photo页面的时候。啊,在这个。引入到这个公共的脚本里面,找到lay out,找到script,你看我们引的是谁,是瘦身版的结合,他为了减少自己的文件的一个一个大小,他把这个阿贾克斯功能给砍掉了。啊,所以怎么办,我们要去找一个完整版的这块A才可以使用这个按功能。
10:02
啊,这里我已经准备了一份啊。复制一下这个这块人。放到public目录。里面的GS放在这里面啊。OK。好关掉,在这里面引入下谁呢。哎,就不引这个数字版了,引这个完整版的。哎,这个时候我们去再刷新一下页面。再去进行提交。是不报错了,能提到对吧,但是没有没有响应,没有没有返回结果我们明明在这里。你看打印了这个is,为什么没有呢?你接着看这个network里面。啊,往上。找看最后一个是不是请求已经发送出去了,你看是不是已经发送出去了,对吧,只不过什么呢,服务器给滴滴了,他强行服务器把这个脚本给终止了,它并没有给我们响应,所以这里我们拿到这个。这个is清楚了吗?好。
11:04
那等会我们再进行想一下,先看看服务器我们这边能不能接收到这个提交的参数啊,DD request。二。好。看一下。嗯,再次进行提交,因为没有改页面的这个代码,所以不用刷新啊,我只是改了这个控制器的是不是,所以直接提交就可以了,同时我们看到network把它清空一下。提交。这时候看network打印的数据,是不是拿到我们提交这个数据了。对不对,这时候我们把我们提交的这个评论给插入到评论表。就可了,对不对,好。接着来啊,我们想一个事情,你看我们路由里面。传了一个,呃,博客的一个ID,对吧,因为这里我们肯定要用上了,我们要对哪个博客进行评论,是不是这里需要把这个博客先查出来,然后好用这个博客的一个ID。这里可以使用啊,这个模型的一个注入,把博客模型帮我们注入进来。
12:03
啊,就是要给这个博客去添加评论的知道吗?你看。看这个路由里面是吧,一个博客的ID,包括我们系统里面是传的当前这个博客的这个ID啊,当前这篇博客的这个ID。所以说是。要给这个博客进行评论。对不对。好,那我们之前学这个。模型关联的时候是不是说过,我们可以直接使用模型的这个关联的这个方法去进行一个数据的插入操作,对吧。好,现在我们来定义这个模型里面的关联方法,去找到博客的模型。啊。烤焖子啊。写下注释。博客。博客和这个评论的关系是什么关系?博客是主表吧,评论手表吧,就博客有。
13:05
很多评论啊,博客拥拥有的评论是不是,所以这个关联关系我们怎么选是吧,它有一个博客是有很多评论,所以我们的。关联关系应该是这个博客啊张,我们是在这个博客模型下写的吗?这个博客has many有很多评论。啊,这么去写,当然我们的这个键也可以指定上,你看外键是谁。我们博客是组表是吧,我们的评论表是不是从表,也就是外键就是评论表里面的。Blog-ID组件呢,就是本地的这个博客的这个ID,这样关联关系可以写好了,接下来呢。啊,有了博客和评论的一个模型,我们就可以使用这个模型的create方法去。添加数据对不对?使用这个模型的考虑的方法。
14:04
去添加数据啊。里面是一个数组,也就是我们要插入这个数据,看看我们的这个字段,它需要什么优色ID。啊,Block ID block ID它会自动帮我维护,但user ID不会对吧,而且。啊。还需要什么?我们自己写吧,需要一个UIDUID怎么办?是不是可以从also里面当前登录的这个用户对吧,你谁评论的,你肯定是当前登录用户的这个ID啊,Blog ID我们不用管,因为我们用的这个模型的啊,这个blog这个对象的模型实例的这个考的方法,所以会自动帮我们维护那个关联的这个ID。接着还有什么是?Content就没了吧,就这两个啊,Request里面的啊,用input去取啊,因为我们是post提交的嘛。好,这样就可以完成一个添加对吧。
15:03
好。那添加之后呢,我们是要给这个请求一个响应。告诉你添加成功了,好吧,就不要再滴滴了。啊,我们也可以去判断一下这个添加结果啊。如果,哎,你这个添加结果。成功我就给你返回一个响应啊,Return。返回什什么想呢,返回我们。啊,上节课学响应红的时候自定义的这个API。啊,在这里。哎,使用我们自定义的这个API的这个响应。好吧。API。啊,这个是成功的话,我们就不用写也行啊。不用写也行。但是我们要给个消息吧,就是评论。评论成功后面的状态码和数据不用给啊,那如果失败的时候呢。
16:09
我们就告诉他评论失败,同时把状态码给上给成400。可以吧,这样啊。浏览器端啊,这里它接收到这个res就可以去判断这个状态嘛,我们先打印一下这个res,看看是什么啊。再次进行提交。啊,再次进行提交。好,报错了,应该是啊,看一下啊。报什么错?啊,他说这个。分类的ID。嗯。是要向博客表去插入数据了,我们这里写错了啊。这里啊,这里不能用博客的,要用博客。他关联的这个评论的啊,这个create去创建。
17:02
对吧,你如果是用博客的,就是向博客去添加去了。我们要评论这个。这个关联的方式去创建,接着再来看一下啊。再来几张。他是不是还会报错,会报什么错呢?就是我们的这个字段,比如说优色ID啊,还有这个我们的内容应该是啊,就是。不是允许不被允许批量保护嘛,我是要设置这个允许批量保护这些字段,就是我们评论的这些字段,因为使用可瑞的方法,它就会受到模型里面。啊,这个。可批量赋值的字段的这个一个影响。所以。把这个给加上啊和批量。复制的子的。啊,受保护的啊,德尔塔,Feel able等于。哪些可以进行,不像插入user-ID还有什么block-ID还有就是我们的内容。
18:04
啊,这三个把这个设置好之后,接着再来进行提交。好,还报错。而自带blog ID啊,不能为空。查这个表的时候。来看一下为什么?首先啊。我先看看这个博客,这个模型有没有拿到。不能为空,就是说说明我们这个博客ID是空,他就没有拿到这个博客这个ID,说明这个博客可能是空。知道吧。改一下来看一下。可以看到啊。这个博客是有这些字段,然后。是不是都是空的,它是一个空的一个对象。那说明什么?说明我们的路由这个模型注入没有注入进来。
19:02
接着去检查一下,我们提交的这个链接肯定都是对的,ID也过来了,对吧,那为什么没有注入进来呢?这里有个问题啊,你看我们这里用的是do blog这个名字是不是,而我们的路由中使用的什么是ID这个名字,名字对不上。是吧,这两个变量名对不上,所以注入注入不进来。这时候把它改成blog就可以了。这样也可以了,要不然你这边。你这个接触的这个变量和你这边路由参数名字不对,就就是这个路由的这个模型,我们依赖的这个博客的模型,输入不进来。清楚吧,这时候我们再去打一下这个博客去看一下啊。看到是不是这就拿到数据了,拿到37条这个具体的一个实例是吧,只有我们在这个一个具体的一个真实的一个实例上面去调用它的这个关联关系,它才能就是自动才从那个模型里面去获取到它的这个ID,你一个空的一个新的一个对象,空的对象哪有ID,所以获取不到对吧,之前我们就犯了这么一个错误啊,这个。
20:04
路由参数和这个模型的这个名字不一致啊,现在再来测试看能不能添加成功啊。先把那些都清掉。好。这些也都先清掉,先检查我们的网络请求,然后提交。好,是不是评论成功了,结果给我们返回了,然后看看GS中的打印是不是也打印出来这个结果了。对吧,这个时候我们就可以根据状态嘛,就是在GS端去进行一些判断啊。当200的时候成功的时候怎么办?说失败的时候怎么办,是不是成功的时候我们要给他显示一个成功的消息,失败的时候显示失败的消息,对吧。啊,接着看一下。把这些没用的关一关找到。前端的页面啊,这里进行一个判断。If。Res,点扣的。
21:01
等等于2.0,这个是成功了是吧。然后否则的话就是失败了。啊,那我们怎么提醒呢。先暂时使用A,我们后面再换,因为A不是特别友好。好,直接弹这个re的message message我们后台是有给返回的。看吧,这个就是我们返回的这个message。啊,这个也行啊,直接返回这麦接下来。在添加之后可以去检查数据库啊,也是有的。是不是有了这个一条评论。那在添加之后呢,还要做一些后续的一个操作,什么操作,比如。在博客完成添,就说这个评论完成添加的时候,我们是不是要把我们新添加评论显示到这里。对吧。而且在我们一刷新页面,一进入到这个博客的时候,是不是要显示这个博客的一个评论。对不对,不能再使用这种默认的了吧,好,我们先把这个刷新页面的时候,就是说一进来这个文章的时候,这个文章博客相关所有的一些评论给写上可以吧来。
22:11
走到前面这里。哎,主要是这里啊。这个是我我们写的一些死数据,前面的时候,那这时候就不用写死数据了,看什循环博客的一个评论。衣服。说一起啊,说起循环博客的一个评论。然后是N的。好,怎么拿博客的所有评论,你看我们博客的这个模型里面。是不是建立了一个和所有品种的一个关联,是不是通过它就可以了。我们要拿所有的评论,并且不去附加一些额外的查询条件。啊,直接用动态属性的方式就可以blog。里面的所有。评论就可以了,然后去循环它。
23:04
接着,嗯。这个是用户名。啊,这个是评论的一个内容,我们先把评论的内容给。处理上。先把这个给删掉啊。评论的内容。啊,是不是就是评论里面的content对吧。See what?体体,先看看评论的内容有没有。好内容有了,接着干什么呢?我们要去拿这个啊,用户的就说谁发的这个评论,然后这个用户的名字和头像。对不对。这时候怎么办?这时候。啊,我们是要建立一个评论和用户的一个关联,对吧。好,在评论的这个模型里面。去建立评论和用户的一个观点,直接复制这个改一改啊。
24:01
评论所属的这个用户,然后把它改成优色。啊,Belongs to user models。键的话是右侧杠ID啊,和这个用户的一个ID做对应,这样就有了,然后。去取。这个U就可以了,取这个评论的这个U色啊。取这个评论里面的这个user里面的这个name啊就可以了。是不是拿到了这个内幕,A评论的这个条码头像也是一样,头像是不是可以去。呃,获取到这个用户的这个头像。想想我们在写头部的头像的时候啊,头部的这个头像的时候是怎么写的。找到头部的。啊,我们的代码。还在里面啊这个。地方就是头像。
25:00
复制一下啊。我们做了判断,还做了一个就是说如果没有头像的话,显示这个默认头像。粘贴过来。放到这里。当然。这里我们显示的话。就不是这个当前登录的这个用户了啊,而是这个评论的所属这个用户。这里要改一下。看到了吧。好,然后。啊,这里也是啊,去连上它。可以吧?先看一看头像能不能出来。正常的是不是?啊,包括图片的这个地址,复制图片的地址。啊,也是我们这个啊,用的default的这个图像,我们这个A。说明没有设置头像,是不是所以用的DEF的这个头像。
26:03
但是我们很多地方会用到头像这么写,每次都写太麻烦了,来,去定一个help。专门负责啊,返回头像的一个help。说下这个。把这些没用的删掉。哎,啊。返回头像啊地址。啊,这个时候把这个里面的代码。就可以打过来了。啊,这个代码就可以拿到这里面。当然。这里我们定一个。头像的地址。然后去传接收一个头像的一个地址啊。啊,如果你传的这个参数存在。
27:03
啊,如果你传的这个参数存在。我就使用。你传的这个。地址,然后如果不存在就是有默认的啊,跟我们之前写的方式一样,之前在这个地方写的这个方式一样。就什么,只不过呢,我们把它给。啊,提到了这个辅助函数里面方便很多地方去用,然后去这个UR就可以了,对吧,这样在使用的时候。只需要使用这个辅助函数,比如说我们的这个。评论这里使用这个辅助函数。然后把。这个用户的。头像传进去就可以了,对不对,如果用户有头像,你在这个函数里面有头像的话,他就会给我们返回这个用户的头像是不是。返回这个用户的头像,如果没有头像就会返回默认的对吧。来验证一下啊。刷新一下。好是正确的啊,至少能显示这个默认的,你看图片地址。
28:02
明显是默认的了是吧?Deft接着去个人中心,我们去上传一个头像。修改头像,选择文件。找到图片里面。啊,去上传我们的这个头像,虽然这个头像一样,但我们更新完之后,我再刷新一下,你看一下头像的地址就知道了,复制图片地址。再开个页面。是不是不一样了,这就是用户上传后的一个图像啊,虽然我们用的是图片一样,你看上去效果是视觉效果一像,但实际上啊使用链接不一样的,这样我们把这个头像就处理成了一个辅助函数,同时这个头部也可以去修改一下的。对不对,使用我们的这个辅助函数。然后只需要把用户的当前登录用户的这个头像传进就行了,因为我们这是头部嘛,那后面是不是就可以不要了。不用去每次写这么多的一个代码去显示图像。用辅助函数去解决这个问题,非常简单。好,图像的问题处理了,接着来看。名字也处理了啊,那基本上就是。
29:03
这个评论这块就没有问题了,是不是好。接着来看看什么呢?我们去一下我们的首页。去找一篇没有评论的博客。这篇比如没有评论,是不是你看回复数量这边就空下来了,是不是不好看,我们是不是可以加一个提醒,比如说暂无评论。对不对,这时候继续优化啊。如果没有评论的时候,我们显示什么呢?显示。显示一个这个啊,暂无评论。对。给上一些class。Tax。居中,然后上下留两个间距。啊,留三个间距吧。接着字体的颜色使用这个啊,偏灰色一点,再试一下自己自己的这个大小不用设置了,这样就行了。
30:05
看一看。对不对,但我评论,但是如果你放到这里,你看你放到这里,你即使有评论的时候也会显示啊,你看。这样是不是不对,怎么办?所以我们再加一个判断,就是说判断如果你没有我才显示它,如果你有就循环你就可以了,对吧,你要怎么写,你是不是要写这个啊if。然后去判断它存不存在,对不对。是吧,然后存在就去循环else,否则就去输出它。是不是这样的,你看,然后加上一个N的衣服。就要这么去加一个判断。看看这个效果。那这时候就不显示了,然后当没有评论的时候就会显示对不对。啊,当然,这么写你不感觉很麻烦吗?我们可以使用什么使用这个。For。
31:01
把这些都先删掉,使用for else。For else呢,就是说它会判断它存不存在,存在的时候就会循环,不存在的时候呢,我们可以使用一个emptypity,就是当我们要迭代的数据为空的时候。啊,就会输出这个内容,当然还有一个结束的一个符号是n for else。不是n for each n for。End for。这样我们看看效果是不是一样的。是不是当我评论有了对吧,然后看我们这个内容。是不是就没有了,哎,用for else就比较简单了。好。这里的问题我们。解决了。然后还要继续优化,优化什么呢?当我们评论完啊评论完。我们想要评论成功之后,把我们评论的这个消息去显示到这个评论的下面。
32:02
啊,同时。啊,让这个内容清空。可以吧,来继续改我们的前端的代码。找到JS啊。先把。我们这个打印给给删掉啊,也就是说想要在评论成功之后,比如说成功之后。之后啊,评论内容显示到。评论列表里面好吧。接下来啊,我们要显示到这个列表。显示了哪个列表呢?这个列表里面是不是。你怎么办?肯定要给他一个ID啊,比如说是。Comment list,然后我们就往这个里面去追加内容就行,追加谁追加它对吧。
33:04
评论成功之后,像啊这个。Command list里面aend去追加内容,你不能用a time就会覆盖,所以用openend追加谁呢?没有模板字符串。去追加这个内容。使用这个模板字符串啊。然后这些啊。先写死啊,先写死,因为我们现在没有这些数据啊,头像先随便写,然后名字先随便写,评论的内容先随便写,先看看我们的效果可不可以啊。来。刷新。提交一个CCC。好,先把这个给点掉才有啊,是不是可以追加了,这头像地址也不对,对吧。那怎么办?我们现在前台你不好去获取到这个头像和这个名字。
34:01
对吧,所以是不是可以去,呃,我们提交评论的这里,然后把这个相关的数据给返回回来。比如说评论之后成功之后啊返回。嗯,用户头像和。昵称啊。当然你不在这里返回也行,因为是当前登录用户嘛。对吧,当前登录用户。是不是可以从这个also里面去获取他的头像?还有他的这个名字。包括这个内容的话,可以从输入框里面去获取,对不对,但是没有我们在后台处理起来方便啊,在后台处理它啊ET。看我们要返回什么数据。有一个。A、图像的一个URL。URL呢,我们直接就用我们写的头像的这个辅助函数。
35:02
啊,就是写在help里面的这个辅助函数去生成传入谁传入当前登录用户的。这个。头像对吧。接着。啊,再传,再返回一个什么。Name啊,User name用户的名称。也是当前登录用户里面的。这个内容好,还要返回一个什么评论的一个内容是吧,Content。是我们request里面评论的这个内容啊,把这些信息返回。用我们的自定义的这个响应宏,自定义的这个响应啊,这时候给个状态码200,附上我们要响应的一个数据。这个啊。
36:01
这时候。在这个里面,这个is就能接收到我们返回的一个数据,所以这里就可以用。啊,因为这里我们用了这个模板字符串嘛,所以这里可以使用啊dota加大括号去使用GS的一个变量res.date里面的T啊有L,为什么是点data,因为我们当时定义响应宏的时候,你看看是不是这种返回的是这个data,是携带的这个数据对吧。来继续。记得复制一下。头像。有了,我们的用户名是user name。我们的内容是data里面的content。再刷新一下,看一看。再提交一个ddd。评论成功是不是头像昵称,还有我们的这个内容都有了,然后把它再清空就可以了吗?
37:02
嗯。接着在这里写啊。清空。清空。输入框的内容。获取。Tax air。然后是内等于。Content的啊,这个T。将它的value。为空就可以了,测试一下来。小心一下。是不是这个内容清空了对吧。接下来再看一个问题,我们评论完之后,评论的内容会显示到上面对吧,那如果我们一个一开始没有评论的内容呢,我们如果去进行评论的话。
38:03
好评论,成功评论是不是在这儿,但是他没有消失。这肯定不符合我们的预期。所以怎么办?我们在。清空完输入框的内容之后啊,还要让这个让这个为空的这个提示。让没有。评论的提示。啊,隐藏。去找到这个地方。给他一个ID。I。然后让他。的隐藏。好了,这样就可以了。试一下,找一个没有评论的。
39:01
往后翻两页,基本都没有。来进行评论。评论成功是不是它会消失,然后这也会消失,这个上去现在就啊。基本上就没问题了,但是还有问题是什么呢?就是我们的这个提醒框不好看,对吧,我们把这个提醒框也换一下。这里我们使用什么呢?使用啊SWEET2,这里我已经准备好了它的这个GS和CSS分别放入我们对应的一个项目。找到public目录CS。给放进来复制一下。放到CS里面。然后JS。复制一下。放在这里面。分别在。我们的这个模板里面去引入一下。
40:03
先引入GS。在这里引入。那直接复制一下就行了。看看我们的GS叫什么名字叫?二。粘贴过来,粘贴名字。接着去。复制一下这个CS的名字。就他。然后去这个CS里面style里面。负这一行。把这个名字替换上,因为我们可能每个地方都会用到这种题型,所以我把它放到这种全局啊,然后关于SWEET2的用法呢,可以去它的官方手册去看,然后。二啊,这个是它的一个官网。嗯,往下找有它的各种的一个用法,然后我们去找一个啊,比较符合我们。
41:02
啊,预期的一个用法。比如说使用。看一看他还有什么方法。这个。好,我们就使用这个吧,好吧。复制一下。就是在我们引入了这个CSS,还有脚本里面引入的这个GS之后呢,就可以去使用啊,直接复制它官网提供的DEMO就可以了。嗯,接下来找到。详情页面啊,这里的题型a lot我们就不要了啊,太丑了,然后使用这种题型。稍微改一下东西,比如说它的位置。位置我们改成中间。Middle,然后时间的话两秒就可以了。啊,接着这个按钮是成功。然后显示的消息,消息的话,用我们res里面返回的这个消息。来看看效果。刷新一下,然后评论。
42:05
是不是就再看一下。是不是一个评论?啊,这里时间给的太短了,它是毫秒,我们刚才少写的零应该是啊,让他。两秒才消失啊。哎,我们这个评论这次就比较好看了。那接着是不是。下面的这个也要换。对吧,但是这里就是error了。啊,就不能是显示那个成功的了,然后你看这个代码这放这么多,这放这么多是不是。太勇于了。对不对。我们是不是可以把它给封装成一个函数,然后放到公共的这个GS里面,用的时候去调用这个函数就可以了,我们知道我们的脚本文件,这里是不是可以写一些公共的一些脚本,好,我们在这里定义一些函数,比如说。定一个这个notify提醒。然后把这个放到这里面可以吧。
43:01
是可以用的,因为这里面在他之前,在我们的这个脚本之前已经引入了它嘛,对不对,接着我们要接收几个参数呢,主要是要接收一个type,也就是成功或者失派tap,还要接收一个什么。消息的一个内容,是不是也就是我们的title?把这个给加上,换成它,然后tap。啊,也换成他。对吧。好,接下来就可以使用我们定义的这个函数。就不用在每个用到的地方去写这么多代码。首先成功的这个。我们给他一个success,然后消息是re里面的message。对吧,失败的也是一样,失败的我们只需要去。啊,换一下这个类型就可以了。换成艾若。来刷新一下。接着去评论。一样的,是不是校方?啊,这比那个俄勒特要好看一些。
44:01
好。那接下来。啊,关于他的这个使用啊,这手上都有啊,你用了自己去看看,接下来再思考一个问题,你看我这个评论已经很多了,对不对,但是我们在查询这个评论相关的用户的时候。看一看我们的代码是怎么写的。是不是在进行的时候去拿用户信息,这样就犯了一个啊,这个N加一查询的一个错误,因为我们的这个模型的话,关联的话,只有在我们用的时候,他才会去查数据库,对不对,我们现在有这么多条啊这个评论,也就是会查这么多的一个用户信息。当然我们这些评论现在都是一个人的啊,你你可能感觉没有事情,但如果这些评论是啊,各个人的呢,说一个人查一条,一个人查一条。对吧,所以我们要把这个啊查询去改成。啊,预加载。清楚吧,啊怎么改成预加载呢,不去我们的详情里面去改。
45:00
Blogger。Controller。APP里面。哎,就这里我们在显示博客的时候,在显示博客的这个内容的时候,啊,博客内容的时候,我们同时让他把这个博客所有相关的这个评论。给查询出来,同时把评论的所关联的用户也都给查询出来。所以这里我们就不能直接使用啊这个blog。我们可以使用预加载查询,那这里就不用让他去依赖注入这个block去浪费啊,一次查询还使用我们的ID啊。ID,接着我们通过这个ID去查这个博客blog。等于block啊where ID等于这个do ID好查一条first就可以了啊,因为这个ID本来就是取了一条,接着在查的时候呢,我可以去使用我的位置去进行它的关联数据的一个预加载,对不对,我要关联谁是不是要关联。
46:07
Com,对吧,关联这个博客里面的这个commentence。是不是拿到这个博客所有的相关的评论。好,在拿到这个博客相关所有评论的同时,我要去拿所有评论所属的一个用户嵌套预加载,是不是就这么去写啊,这样的话,在我们查询这个博客的时候,会同时把博客所有的评论给查出来,而在他查评论的时候,他还会把评论所有啊关联的用户给查出来,这样的话就可以啊,就说啊,减少很多次的查询,就一次性就把我们需要的数据都查询出来了,不用在页面中去再迭代循环去查了。这样能减少数据库的查询。可以吧,后面的代码我们不用变就行,还是让这个博客去啊,临时关闭它的这个自增时间的一个维持,然后自增长这个浏览量,然后再打开这个时间,最后把博返回,这些都一样,然后页面的代码也不用改,它该循环还循环,因为这时候其实数据已经在这里都查出来了,都在这个blog这个对象里面包含着呢这些数据,所以这时候你循环只对对象的一个循环,对数据没有影响啊,对数据库查询没有影响。
47:16
可以吧,来看看效果。是不是一样的。好。这时候我们的这个评论,还有详情这块的内容基本上就是写完了。然后最后我们再改一点东西,就是我们首页的这个博客的这个所属的用户之前没有学模型的关联,所以用户这里就空着了,现在我们把它补全。看一看博客里面是不是有所属用户,然后去找一下我们首页的页面。找到index这个页面。然后找到循环博客这里,这里有一个。啊,所属的用户。看看用户在哪?
48:06
是不是在这个时间的前面。也就说时间前面这里是不是输出的用户的一个ID,这时候我们就可以直接去拿用户的这个user。去。显示它的内幕对吧。首先要看看是不是名字拿到了,但是我们看这还是在进行循环的去查询这个用户。所以还是。不可以,对不对,那怎么办呢?可不可以在我们这个查询首页里面查询这个博客列表的时候,我们把。这个博客相关的这个。用户啊,使用位置。给预加载进来对不对,来预加载这个U。可以吧,但是user有很多字段,我们这里其实只是需要一个name字段,所以还可以限定上我们查的一个字段。只查这个ID和name就行了,一定要有这个关联的ID,不然的话就关联不上。
49:03
来看一下效果。是不一样的啊,这样就不会去循环去查数据库了。到这里我们就啊,基本上首页也优化完了,然后我们的详情评论也完成了啊,一定要注意不要在循环里面去循环去查询数据库,这样是很耗费数据库的性能。啊,如果你碰到循环的时候,尽可能的去使用啊,预加载来解决这个循环查询数据库的一个问题。
我来说两句