Java实现评论回复功能的完整步骤

前言

使用递归循环开发评论回复功能,适用于大部分的简单单体应用

评论功能或许是大多数的单体应用之中会用到的功能,我们会在自己所开发的项目之中进行集成该功能

大多数时候我们会将评论功能划分成以下几种:

  • 单一型
  • 嵌套型
  • 两层型

一、分类方式

1、单一型

单一型评论方式就是日常论坛之中的盖楼的方式

用户只能根据所在的文章或者问题进行单一回复,评论之间没有互动

类似于问答形式。提出问题,然后回答,一对多关系。这些回答之间没有任何联系

2、嵌套型

嵌套型评论方式会对有回复的评论进行递归,会造成后端性能不佳,而且对于前端的展示也不是很友好

3、两层型

两层型评论方式就是除了一级评论之外,无论是对于该评论的回复还是对于回复的回复都统一在第二层

二、实现原理

就以最常见的博客来说,不同的分类方式实现原理不一样

1、单一型

我们只需要在评论的数据表格中添加博客id即可,查询出相对应的数据直接进行展示即可

create table `comment` (
 `id` int(11) not null auto_increment comment '主键id',
 `nickname` varchar(255) default null comment '评论者昵称',
 `avatar` varchar(255) comment '评论头像',
 `content` varchar(255) default null comment '评论的内容',
 `blog_id` int(11) default null comment '评论的博客id',
 primary key (`id`)
 ) comment '评论表';

在业务之中根据博客id查询出来,传递给前端展示出来即可

select * from comment where blog_id=#{blog_id}

2、嵌套型

嵌套型的评论方式所需要的数据结构是树状型的,评论多起来的话层级结构会变得很复杂,对于性能消耗也是很巨大,【不推荐】

实现原理为我们会在评论表之中添加一个【parent_id】字段,定义评论和回复为父子级的关系,评论为父级,回复为子级,默认为【-1】,表示为没有父级,

create table `comment` (
 `id` int(11) not null auto_increment comment '主键id',
 `nickname` varchar(255) default null comment '评论者昵称',
 `avatar` varchar(255) comment '评论头像',
 `content` varchar(255) default null comment '评论的内容',
 `blog_id` int(11) default null comment '评论的博客id',
 `parent_id` int(11) default '-1' comment '父级评论id',
 primary key (`id`)
 ) comment '评论表';

需要使用递归和链表进行循环遍历插入回复

设计如下:

Content.java

	private static final long serialVersionUID = 1L;

	@ApiModelProperty(value = "主键id")
	@TableId(value = "id", type = IdType.ASSIGN_ID)
	private Integer id;

	@ApiModelProperty(value = "用户昵称")
	@TableField("nickname")
	private String nickname;

	@ApiModelProperty(value = "头像")
	@TableField("avatar")
	private String avatar;

	@ApiModelProperty(value = "评论")
	@TableField("comment")
	private String comment;

	@ApiModelProperty(value = "博客id ")
	@TableField("blog_id")
	private Integer blogId;

	@ApiModelProperty(value = "回复评论id")
	@TableField("parent_id")
	private Integer parentId;

DTO设计

ContentDTO.java

@Data
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
@ApiModel(value = "评论模型")
@JsonIgnoreProperties(value = { "handler" })
public class ContentDTO {
	private int id;
 private String nickname;
 private String content;
	private List<ContentDTO> children;
}

使用mybatis做为持久层框架,编写sql查询语句进行嵌套查询,

 <resultMap id="commentDTOMap" type="com.zukxu.items.comment.entity.ContentDTO">
  <id property="id" column="comment_id"></id>
  <result property="nickname" column="nickname"></result>
  <result property="content" column="content"></result>

  <association property="children"
      select="com.zukxu.items.comment.mapper.ContentMapper.selectCommentById" column="{blogId=blog_id,parentId=comment_id}"
      fetchType="lazy">
  </association>
 </resultMap>

 <select id="selectCommentById" resultMap="commentDTOMap">
  SELECT comment_id,nickname,content,blog_id,parent_id FROM blog WHERE blog_id = #{blogId} AND parent_id = #{parentId}
 </select>

结果如下:

[
    {
      "id": "1309302063977304065",
      "nickname": "1",
      "content": "这次该可以了吧",
      "children": [
        {
          "id": "1309319425866698753",
          "nickname": "1",
          "content": "好了?",
          "children": []
        }
      ]
    },
    {
      "id": "1309341283121154994",
      "nickname": "4",
      "content": "为什么呢",
      "children": [
        {
          "id": "1309373849414787073",
          "nickname": "1",
          "content": "好了?",
          "children": []
        },
        {
          "id": "1309308402422091778",
          "nickname": "1",
          "content": "可以了吧",
          "children": []
        },
        {
          "id": "1309373675783184385",
          "nickname": "1",
          "content": "好了?",
          "children": [
            {
              "id": "1309373886580514817",
              "nickname": "1",
              "content": "???",
              "children": []
            }
          ]
        }
      ]
    }
  ]

结果会造成多重嵌套,不是很友好

3、两层型

比单一型多了互动的功能,比嵌套型更加简洁,方便操作管理
设计和嵌套型保持一致,只需要在查询出来数据之后对数据进行处理即可
将嵌套型转为两层型结构

处理每个父级评论的子级及其嵌套子级

 public List<CommentDTO> findParent(List<CommentDTO> comments) {

  for (CommentDTO comment : comments) {

   // 防止checkForComodification(),而建立一个新集合
   ArrayList<CommentDTO> fatherChildren = new ArrayList<>();

   // 递归处理子级的回复,即回复内有回复
   findChildren(comment, fatherChildren);

   // 将递归处理后的集合放回父级的孩子中
   comment.setChildren(fatherChildren);
  }
  return comments;
 }

 public void findChildren(CommentDTO parent, List<CommentDTO> fatherChildren) {

  // 找出直接子级
  List<CommentDTO> comments = parent.getChildren();

  // 遍历直接子级的子级
  for (CommentDTO comment : comments) {

   // 若非空,则还有子级,递归
   if (!comment.getChildren().isEmpty()) {
    findChildren(comment, fatherChildren);
   }

   // 已经到了最底层的嵌套关系,将该回复放入新建立的集合
   fatherChildren.add(comment);

   // 容易忽略的地方:将相对底层的子级放入新建立的集合之后
   // 则表示解除了嵌套关系,对应的其父级的子级应该设为空
   comment.setChildren(new ArrayList<>());
  }
 }
}

最后的结果如下:

[
    {
      "id": "1309302063977304065",
      "userId": "1",
      "comment": "这次该可以了吧",
      "children": [
        {
          "id": "1309319425866698753",
          "userId": "1",
          "comment": "好了?",
          "children": []
        }
      ]
    },
    {
      "id": "1309341283121154994",
      "userId": "4",
      "comment": "为什么呢",
      "children": [
        {
          "id": "1309373849414787073",
          "userId": "1",
          "comment": "好了?",
          "children": []
        },
        {
          "id": "1309308402422091778",
          "userId": "1",
          "comment": "可以了吧",
          "children": []
        },
        {
          "id": "1309373886580514817",
          "userId": "1",
          "comment": "???",
          "children": []
        },
        {
          "id": "1309373675783184385",
          "userId": "1",
          "comment": "好了?",
          "children": []
        }
      ]
    }
  ]

绝大多数时候我们都会去使用两层型的评论方式做评论

总结

到此这篇关于Java实现评论回复功能的文章就介绍到这了,更多相关Java实现评论回复功能内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java实现评论回复功能的完整步骤

    前言 使用递归循环开发评论回复功能,适用于大部分的简单单体应用 评论功能或许是大多数的单体应用之中会用到的功能,我们会在自己所开发的项目之中进行集成该功能 大多数时候我们会将评论功能划分成以下几种: 单一型 嵌套型 两层型 一.分类方式 1.单一型 单一型评论方式就是日常论坛之中的盖楼的方式 用户只能根据所在的文章或者问题进行单一回复,评论之间没有互动 类似于问答形式.提出问题,然后回答,一对多关系.这些回答之间没有任何联系 2.嵌套型 嵌套型评论方式会对有回复的评论进行递归,会造成后端性能不佳

  • VUE+Java实现评论回复功能

    背景 最近需要做一个多级评论的功能,技术路线:VUE(Element)+Java(SpringBoot) 效果 后台 SQL Java Controller /**   * 根据关联id获取评论信息   * @param relationId 关联id   * @param type 类型   * @return: com.harvey.result.ResultSupport<java.lang.Object>   * @date: 2020/12/10 14:37   */  @GetMa

  • thinkPHP实现基于ajax的评论回复功能

    本文实例讲述了thinkPHP实现基于ajax的评论回复功能.分享给大家供大家参考,具体如下: 控制器代码: <?php namespace Home\Controller; use Think\Controller; class IndexController extends Controller { public function index(){ $num = M('comment')->count(); //获取评论总数 $this->assign('num',$num); $d

  • SpringBoot实现评论回复功能(数据库设计)

    前后端分离项目–二手交易平台小程序 SpringBoot----物品点赞功能实现 SpringBoot----物品收藏功能实现 SpringBoot----文件(图片)上传与显示(下载) 评论回复 这个是模仿b站的那种,感觉挺好看的,同时也是因为csdn搜到了一个类似的,对于第一次做有参考要好做的多. 效果图: 数据库设计 分为评论主表和子表.主表存放的是对物品的评论,而子表存放的是对该评论的回复,就是物品 1–n主表 1 – n子表. 主表: SET FOREIGN_KEY_CHECKS=0;

  • C#实现微信分账功能的完整步骤

    普通商户分账功能 分账比例:目前只有"低比例分账"小于等于30%分账,分账金额需要减去(千6)手续费. 每一张订单只能分发,当前订单总额的百分之30可以分账: 比如:一张订单支付金额100元,这张订单只能分发29.82元. (100-100*0.006)*30% 的金额 开发文档地址:https://pay.weixin.qq.com/wiki/doc/api/allocation.php?chapter=27_6&index=2 第一:确认是普通商户分账 第二步:添加分账接收

  • C#中实现登录功能的完整步骤

    1. 准备工作 新建一个数据库StudentDB -- 使用master 数据库 use master go if exists(select *from sysdatabases where name='StudentDB') drop database StudentDB go create database StudentDB go 在StudentDB中新建三张表 use StudentDB go -- 新建学生表 if exists (select *from sysobjects w

  • Android如何实现社交应用中的评论与回复功能详解

    前言 在Android的日常开发中,评论与回复功能是我们经常遇到的需求之一,其中评论与回复列表的展示一般在功能模块中占比较大.对于需求改动和迭代较频繁的公司来说,如何快速开发一个二级界面来适应我们的功能需求无疑优先级更高一些.首先我们来看看其他社交类app的评论与回复列表如何展示的: Twitter不用说了,全球知名社交平台,上亿用户量,他们的评论回复都只展示一级数据(评论数据),其他更多内容(回复内容),是需要页面跳转去查看,知乎也类似.第一张图是我们设计给我找的,他说要按照这个风格来,尽量将

  • Java递归实现评论多级回复功能

    目录 评论实体 添加非回复评论 递归添加回复评论 结果展示: github 源码 最近工作需要做一个评论功能,除了展示评论之外,还需要展示评论回复,评论的回复的回复,这里就用到了递归实现评论的多级回复. 评论实体 数据库存储字段: id 评论id.parent_id 回复评论id.message 消息.其中如果评论不是回复评论,parent_id 为-1. 创建一个评论实体 Comment: public class Comment { /** * id */ private Integer i

  • PHP仿qq空间或朋友圈发布动态、评论动态、回复评论、删除动态或评论的功能(上)

    我们大部分人都发过动态,想必都知道发动态.回复评论.删除动态的整个过程,那么作为初学者,要模仿这些功能有点复杂的,最起码表的关系得弄清楚~~ 先把思路理一下: (1)用户登录,用session读取当前用户----目的是:该用户可以发表动态,重点是显示该用户好友及他自己发表的动态,并且按发表时间排序. (2)做个发表动态框实现发表动态功能 (3)显示该用户和他好友已经发表对的动态信息,并按发表时间由近到远显示 (4)再每条动态后面做一个评论按钮和删除按钮:实现对动态的评论,回复和删除(斜体部分下一

  • php无限级分类实现评论及回复功能

    经常在各大论坛或新闻板块详情页面下边看到评论功能,当然不单单是直接发表评论内容那么简单,可以对别人的评论进行回复,别人又可以对你的回复再次评论或回复,如此反复,理论上可以说是没有休止,从技术角度分析很容易想到运用无限级分类技术存储数据,运用递归获取评论层级结构数据,运用ajax实现评论页面交互,这里用thinkphp框架做个简单的demo练练手,为了简化流程这里第三级评论开始停止回复,当然只要在这个基础上稍作修改就可以实现无限回复功能,主要是view层样式修改较麻烦,需花些时间. 一.效果需求分

随机推荐