前言

目前为止,做了两三个项目,有涉及教育的、论坛的、CMS的,每个项目里都有用到评论这个功能,所以我就想把评论这一块,单独拿出来,做成一个组件化的模块。既节约了开发的工作,还能让自己对这个模块的功能有更进一步的理解。
因为目前我主要是用tp框架在做开发,所以以下相关实例会以tp框架的语法来呈现。但其实核心方法部分我个人是觉得有所不足的,没有把关联模型的功能给利用起来。这块是我下一版更新的时候会实现的部分。
正文部分,主要会给大家讲讲目前接触到的评论系统的几种模式,分析他们各自的优劣势,并提供一个数据表设计以及数据提取的思路,希望对大家能够有所帮助。如有不当之处,也欢迎大家拍砖指正。

评论系统

常见的评论系统主要有三种:楼中楼模式流模式引用模式 (都是我自己起的名字),下面集中介绍这三种的优劣势以及实现方法。

一、楼中楼模式

所谓楼中楼模式,就是每条评论占一楼,针对该评论的所有回复都在该楼里展现,比如百度贴吧、简书的评论系统。

优势:回复评论的内容集中展现,易于了解评论引发的对话。
劣势:内容过多时需要做分页处理,较为复杂。
数据表设计:

  • id(自增主键)
  • target_id (评论主题的id,可根据需要修改为article_id、course_id等等)
  • parent_id(主评论id)
  • reply_uid (记录被评论的用户id,回复主评论时可以0)
  • uid(发表评论的用户id)
  • content (评论内容)
  • 其他字段… (时间、状态等)

后端业务逻辑:

/*** @desc 获取主评论列表*/
public function getMainCommentList($page, $limit)
{$count = Db::name('comment')->where('target_id', $target_id)->where('parent_id', 0)->count('id');if (!$count) {$data = ['count' => 0,'list' => []];return $data;}$list = Db::name('comment')->where('target_id', $target_id)->where('parent_id', 0);if ($page && $limit) {$list = $list->page($page,$limit);}$list = $list->select();foreach ($list as $key => $value) {$list[$key]['reply'] = $this->getReplyCommentList($value['parent_id'], 1, 5); //设置取5条记录}$data = ['count' => $count,'list' => $list];return $data;
}/*** @desc 获取评论的回复内容*/
public function getReplyCommentList($parent_id, $page = null, $limit = null)
{//获取回复的总数$count = Db::name('comment')->where('parent_id', $parent_id)->count('id');$list = Db::name('comment')->alias('a')->where('a.parent_id', $parent_id)->join('user u1', 'a.uid = u1.id')->join('user u2', 'a.reply_uid = u2.id', 'LEFT')->field('a.id, a.parent_id, a.content, a,uid, a.reply_uid,u1.username, u2.username as reply_username'); //还有时间等字段if ($page && $limit) {$list = $list->page($page, $limit);}$list = $list->select(); //还需按照时间字段排序
}

二、流模式

流模式,顾名思义,展现形式类似于信息流,不管是评论还是回复,每条信息都占一层,比如laravel-china社区的评论系统。

优势: 逻辑简单,实现较为容易
劣势: 对话内容不能集中呈现,不便于了解对话内容。
数据表设计:

  • id(自增主键)
  • target_id (评论主题的id,可根据需要修改为article_id、course_id等等)
  • reply_uid (记录被评论的用户id,回复主评论时可以0)
  • uid(发表评论的用户id)
  • content (评论内容)
  • 其他字段… (时间、状态等)

后端业务逻辑

public function getCommentList($target_id, $page, $limit)
{$count = Db::name('comment')->where('target_id',$target_id)->count('id');if (!$count) {$data = ['count' => 0,'list' => []];return $data;}$list = Db::name('comment')->alias('a')->where('target_id', $target_id)->join('user u1', 'a.uid = u1.id')->join('user u2', 'a.reply_uid = u2.id')->field('a.id, a.uid, a.reply_uid, a.content, u1.username, u2.username as reply_username');if ($page && $limit) {$list = $list->page($page, $limit);}$list = $list->select(); //需加上按时间排序$data = ['count' => $count,'list' => $list];return $data;
}

三、引用模式

引用模式与流模式相似,只是回复的内容发布时会带上引用的内容。

优势:可以理解回复针对的是哪条评论,有助于了解对话内容。实现相对容易。
劣势:与流模式相似,不能完整呈现整个对话内容。
通过分析优劣势可以发现,引用模式是介于楼中楼以及流模式之间的一个折中方案。
数据表设计:

  • id(自增主键)
  • target_id (评论主题的id,可根据需要修改为article_id、course_id等等)
  • reply_id(被评论的评论id,主评论为0)
  • uid(发表评论的用户id)
  • content (评论内容)
  • 其他字段… (时间、状态等)

后端业务逻辑:

获取评论列表可以通过左连接评论表,获取引用评论的用户信息和评论等内容。再做简单的分页处理就可以了。

/*** @desc 获取评论列表*/
public function getCommentList($target_id, $page = null, $limit = null)
{//获取评论条数统计$count = Db::name('comment')->where('target_id', $target_id)->count('id');if (!$count) {$data = ['count' => 0,'list' => []];return $data;}//分页获取评论列表数据,同时获取引用的评论数据$list = Db::name('comment')->alias('a')->where('a.target_id', $target_id)->join('comment b', 'b.parent_id = a.id', 'LEFT')->join('user u1', 'a.uid = u1.id')->join('user u2', 'b.uid = u2.id')->field('a.id, a.target_id, a.content, a.uid, u1.username,b.content as quote_content, b.uid as quote_uid, u2.username as quote_username') //还有时间等字段if ($page && $limit) {$list = $list->page($page,$limit);}$list = $list->select();$data = ['count' => $count,'list' => $list];return $data;
}

以上是针对三种评论模式的初步总结,对于样式部分还没有进行整理,等完成博客项目后,会把前端样式的部分也加上。而对于以上的内容,如有不足之处,希望大家提出指导。

评论系统--开发总结相关推荐

  1. 游戏陪玩系统开发评论模块,提升用户互动体验!

    评论模块在具备互动属性的软件系统中经常能够看到,在游戏陪玩系统开发时,实现评论模块提高用户互动体验的同时,增加用户在平台内的留存,一般在开发评论模块时需要用到相关的数据库. 一.前端界面分析 先看看游 ...

  2. Nuxt.js开发中碰到的问题(二)引入gitment评论系统

    博客原文链接 概述 在初步完成功能之后就想着加上评论功能,最开始是想自己实现一个,但是综合考虑之后,还是决定引入 gitment 这个成熟的评论系统代替: 虽然之前在项目中有实现评论系统的相关经验,但 ...

  3. iOS10.3 的评论系统

    作者 xuyafei86 关注 2017.03.30 12:39* 字数 428 阅读 265评论 4喜欢 11 iOS10.3 对 App 的评论系统进行了较大的升级.主要在三个方面. 支持 App ...

  4. 短视频+直播——直播系统开发新模式

    直播经历了2016年的大爆之后,热度似乎在今年冷却下来,不可否认的是直播现在的确存在着内容同质化和变现难两大问题,于是在今年,越来越多直播软件中开始加入短视频功能.同时,以短视频快速发展起来的抖音AP ...

  5. WP老杨解迷:可知评论系统还能勾搭用户呢

    WP老杨解迷:可知评论系统还能勾搭用户呢 玩家可以忍受任何游戏内的磨难,但偏偏不能忍受游戏外的挫折,这个游戏外可不是因为系统原因怒摔手机的义举,更加不是线下见面互炫菊花转投阵营的冲动,有可能是登录的瞬 ...

  6. Hexo瞎折腾系列(8) - 添加评论系统

    前言 Hexo的NexT主题本身就集成了一些评论系统,多说啊之类的已经关闭服务的略过不提,目前比较多人用的有畅言.来必力livere.Gitment.Gitalk.Disqus等. 我刚用的评论系统的 ...

  7. C/C++各种系统开发环境搭建

    C/C++各种系统开发环境搭建 http://pan.baidu.com/s/1qWJKF4g posted on 2015-03-04 00:10 秦瑞It行程实录 阅读(...) 评论(...) ...

  8. 什么是常驻内存式的开发模式?_“直播+”模式下的直播系统开发需要注意什么问题?...

    "直播+"模式是指将直播系统开发与其它领域或者行业相结合,从而打造更真实的互动场景.输出更优质的视频内容来吸引用户.进行业务转化的模式.在企业的种种求生手段中,直播系统开发成为了一 ...

  9. RDIFramework.NET-.NET快速信息化系统开发整合框架 【开发实例 EasyUI】之产品管理(MVC版)...

    RDIFramework.NET-.NET快速信息化系统开发整合框架 [开发实例 EasyUI]之产品管理(MVC版) RDIFramework.NET-.NET快速开发整合框架 [开发实例]之产品管 ...

  10. 如何实现一个楼中楼的评论系统

    文章内容由蚊子的博客进行发布,或许你想看看他其他的博客呢: https://www.xiabingbao.com/comments/2017/09/01/blog-comments.html 1. 实 ...

最新文章

  1. 使用动态代理,提高工作效率
  2. 再见了 React、Angular,Vue3 才是 yyds
  3. java join 源码_join on 和where 一起使用的细节
  4. SPOJ 694/705 后缀数组
  5. 显示和隐藏菜单栏(两种方式div、table)
  6. 安卓逆向系列教程 4.5 糖果星星达人
  7. activeti user guide 中文_【澳洲大岩石】最好季节发团!省掉800澳币!无比震撼特价 再次应约出发 震撼之旅!一生难忘!全程中文导游!省心放心澳洲青年旅行社...
  8. 通向财务自由之路06_适应大环境的交易策略
  9. Python学习——K近邻算法
  10. hdu1004(c++)
  11. app版windows95
  12. 【愚公系列】2022年01月 Django商城项目14-用户中心-界面设计
  13. matlab 冒泡排序函数,MATLAB实现冒泡排序算法
  14. 对比三菱, 横河PLC快速入门 第一章
  15. 英文信件结尾的表达方式
  16. “指付通”还是“支付痛”?-【软件和信息服务】2014.10
  17. scrapy框架入门第一天笔记记录
  18. 【备忘录】浏览器不能上网但是微信能收到消息的一个解决办法
  19. 淘宝开发文档AlibcShowParams唤起淘宝的返回小把手
  20. Sql Server中的用户名和登录名

热门文章

  1. 「图与推荐指南针」: 顶级学者/研究组有哪些?
  2. SRAM和DRAM的真正区别
  3. 杭州电子科技大学ACM竞赛试题----百步穿杨
  4. led背光板的作用是什么呢?
  5. 支持多种登录模式的token方案设计(微信、支付宝登录等)和数据库设计含手机号绑定方法
  6. matlab画黎曼函数,[2018年最新整理]matlab画复数函数图象和黎曼面.docx
  7. 国家信息安全水平考试NISP一级模拟题(01)
  8. 基于两输出一输入BP神经网络的传感器检测数据融合(附带MATLAB代码)
  9. MySQL报错java.sql.SQLException: The server time zone value ‘乱码‘ is unrecognized or represents more tha
  10. 小米手机miui12系统usb共享网络