评论功能完成,顺便总结下开发评论的经验

最近几天一点都没闲着,自从2月6日新版博客发布以来,一共5天时间写了83个commits?,不过也收获了19个star?,感谢各位老铁刷的star哈哈?

这两天最大的更新就是加了一个评论功能,包括后台的评论管理,加上旧版博客的评论,手撸过很多次评论了,也算有点心得,稍后就做一个详细的总结,如果有想要手撸评论的朋友希望能帮到你,先放两张图看看效果?

前台效果图如下,截的手机版的,电脑的也差不多,还是简约风:

后台截图如下,包括评论和评论回复的管理,可以删除和定位到前台位置:

下面总结下开发评论系统的一些心得体会:

  1. 关于评论中的用户认证
  2. 几种评论的分析和选择
  3. 评论系统的设计和数据结构

一、关于评论中的用户认证

做评论就必须要考虑用户认证的问题,旧版博客我是首先做了一个登陆系统,然后登陆后评论就可以附带个人信息进行展示,不登录的话可以匿名评论但是不会有任何信息

这次做评论我进行了很多的调整,首先我没做登录系统(其实还是有,不过没放出来?)因为考虑到绝大部分人懒的登录(比如我看吃鸡直播的时候经常宁愿看标清的都不想登陆2333),干脆直接不要登录了,但是又想尽可能的知道留言人的信息,于是就采用了常见的匿名留言附加自愿输入姓名,邮箱,个人网站等信息的方式,邮箱可以用来给留言人发提醒邮件(当留言被回复时)

二、几种评论的分析和选择

做评论之前一定要对评论的架构了解清楚,于是我分析了一些常见的评论系统,发现常见的评论分为两种类型:

① 每个评论占一楼,对这条评论的回复和对回复的回复都放在本楼的右下侧,以一个子模块的形式展现,典型例子:百度贴吧,简书,示意图如下:

优点:回复集中显示,看起来方便

缺点:样式较复杂,每层楼的回复多了还要加入分页

② 不管评论还是回复都完全一样,一条一条的罗列下去,只是回复通过提及或者引用的方式,示意图如下:

优点:简介,逻辑没那么复杂,样式也统一

缺点:回复不集中,如果想看例如两个用户完整的对话就比较困难

两种方式各有优劣,其实都是不错的方式,我选择了第一种

三、评论系统的设计和数据结构

这里以第一种评论进行设计和分析:

在第一种评论系统中,评论和回复看似是分开的,以一个评论对应多个回复这样的关系关联着,但是还是可以把数据统一,回复也是评论,只不过有一个父节点,下面是我的评论表结构:

  • id (唯一自增键)
  • article_id(对应的文章 id)
  • parent_id(父节点 id)
  • target_name(用来保存被回复者的昵称,如果有用户系统则保存 id)
  • content(回复内容)
  • ...(其他评论相关的)

注意一个地方就行,每层楼里的回复不管是回复谁的,父节点 id 都要保存该层楼对应的评论(父节点)的 id,至于被回复人的昵称加一个字段来保存,然后前台显示的时候使用两层循环就可以了,第一层循环显示文章所有的评论,然后循环内套一个循环显示该评论对应的所有回复即可

手撸评论系统的过程中收获还是很多的,没尝试过的朋友建议花点时间尝试一下,建议不要用那种第三方评论系统,自己掌握不到数据,毕竟我们有程序员的骄傲?

— END —

原文链接:评论功能完成,顺便总结下开发评论的经验
GitHub:https://github.com/SadCreeper/laravel-blog...

本作品采用《CC 协议》,转载必须注明作者和本文链接
长路漫漫,唯键盘作伴。:octocat: 我是猫哥,欢迎关注我的 「个人博客 」和微信公众号「前端猫哥」 :new_moon_with_face:
本帖由系统于 6年前 自动加精
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 14

先mark,后面计划自己做评论 :smile:

6年前 评论
前端猫哥

@fmaple 加油,laravel做评论还是很舒服

6年前 评论
Aaron

mark, 以后再学习

6年前 评论
前端猫哥

@Aaron 加油

6年前 评论

评论分页呢?

5年前 评论
前端猫哥

@tegic 分页不是laravel带的有吗,分页是另一个大块了

5年前 评论

两种方式各有优劣,其实都是不错的方式,我选择了第一种 :joy:

5年前 评论
  public function replys()
  {
      return $this->hasMany('App\Comment', 'parent_id');
  }

在comment模型里做了这个关联之后。

在页面调用时

@foreach( $comment->replys as $reply )

这里的N + 1 问题怎么处理啊。在嵌套的循环里是$reply->user->name 。后面这个在页面产生很多重复查询。

已解决。

预加载的时候,嵌套即可。

Comment::with('user','replays.user')

user关联在第一层循环的时候用来解决N+1的问题,replays.user关联是在第二层循环的时候解决N+1的问题。

5年前 评论

@xiaotian_code 回复测试

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!