当前位置: 首页 > news >正文

仿牛客网项目---显示评论和添加评论功能的实现

这篇文章,我来介绍一下我的项目中的另外一个功能:显示评论和添加评论。

其实这两个功能都不怎么重要,我感觉最重要的应该是用户注册登录功能,这个也了解一下,知道这么一回事儿就好。

首先设计DAO层。

@Mapper
public interface CommentMapper {List<Comment> selectCommentsByEntity(int entityType, int entityId, int offset, int limit);//根据实体类型、实体ID以及分页偏移量和限制数量,查询对应实体的评论列表,并返回一个评论对象的列表int selectCountByEntity(int entityType, int entityId);//根据实体类型和实体ID,查询对应实体的评论数量,并返回结果int insertComment(Comment comment);//插入一条评论记录到数据库中,参数为一个评论对象Comment selectCommentById(int id);//根据评论ID,查询并返回对应的评论对象}

这些方法用于对评论表进行常见的数据库操作,例如查询某个实体的评论列表、查询评论数量、插入评论以及根据评论ID查询评论详情。

 

再来设计service层。

public List<Comment> findCommentsByEntity(int entityType, int entityId, int offset, int limit) {return commentMapper.selectCommentsByEntity(entityType, entityId, offset, limit);}public int findCommentCount(int entityType, int entityId) {return commentMapper.selectCountByEntity(entityType, entityId);}@Transactional(isolation = Isolation.READ_COMMITTED, propagation = Propagation.REQUIRED)public int addComment(Comment comment) {if (comment == null) {throw new IllegalArgumentException("参数不能为空!");}// 添加评论comment.setContent(HtmlUtils.htmlEscape(comment.getContent()));comment.setContent(sensitiveFilter.filter(comment.getContent()));int rows = commentMapper.insertComment(comment);// 更新帖子评论数量if (comment.getEntityType() == ENTITY_TYPE_POST) {int count = commentMapper.selectCountByEntity(comment.getEntityType(), comment.getEntityId());discussPostService.updateCommentCount(comment.getEntityId(), count);}return rows;}public Comment findCommentById(int id) {return commentMapper.selectCommentById(id);}

上面的代码是一个评论服务类,用于处理与评论相关的业务逻辑。

findCommentCount() 方法用于根据实体类型和实体ID,调用 commentMapper.selectCountByEntity() 方法查询对应实体的评论数量,并返回结果。

addComment() 方法用于添加一条评论。在方法中,首先对评论内容进行处理,使用 HtmlUtils.htmlEscape() 方法进行 HTML 转义,以防止 XSS 攻击,然后使用 sensitiveFilter.filter() 方法过滤敏感词。接下来调用 commentMapper.insertComment() 方法将评论插入到数据库中。

findCommentById() 方法用于根据评论ID查询对应的评论对象,调用 commentMapper.selectCommentById() 方法进行查询,并返回结果。

这些方法结合了评论数据库访问对象(DAO)的方法,处理评论的查询、添加和统计等业务逻辑,并且在添加评论时还会更新帖子的评论数量。

最后写controller层。

 public String addComment(@PathVariable("discussPostId") int discussPostId, Comment comment) {comment.setUserId(hostHolder.getUser().getId());comment.setStatus(0);comment.setCreateTime(new Date());commentService.addComment(comment);// 触发评论事件Event event = new Event().setTopic(TOPIC_COMMENT).setUserId(hostHolder.getUser().getId()).setEntityType(comment.getEntityType()).setEntityId(comment.getEntityId()).setData("postId", discussPostId);if (comment.getEntityType() == ENTITY_TYPE_POST) {DiscussPost target = discussPostService.findDiscussPostById(comment.getEntityId());event.setEntityUserId(target.getUserId());} else if (comment.getEntityType() == ENTITY_TYPE_COMMENT) {Comment target = commentService.findCommentById(comment.getEntityId());event.setEntityUserId(target.getUserId());}eventProducer.fireEvent(event);if (comment.getEntityType() == ENTITY_TYPE_POST) {// 触发发帖事件event = new Event().setTopic(TOPIC_PUBLISH).setUserId(comment.getUserId()).setEntityType(ENTITY_TYPE_POST).setEntityId(discussPostId);eventProducer.fireEvent(event);// 计算帖子分数String redisKey = RedisKeyUtil.getPostScoreKey();redisTemplate.opsForSet().add(redisKey, discussPostId);}return "redirect:/discuss/detail/" + discussPostId;}}

在方法体中,首先设置评论的用户ID为当前登录用户的ID,评论的状态为0(表示正常状态),创建时间为当前时间。然后调用 commentService.addComment() 方法将评论添加到数据库中。

接下来,根据评论的实体类型(帖子或评论),创建一个事件对象 event,设置事件的相关属性,例如话题(topic)、用户ID、实体类型、实体ID等。如果评论的实体类型是帖子,则还会获取该帖子的作者ID,如果是评论,则获取评论的目标对象(评论的回复对象)的作者ID。

最后,返回一个重定向的视图,将页面重定向到帖子详情页,以展示添加评论后的页面效果。

这就是显示评论和添加评论的功能。简单了解一下既可!

相关文章:

仿牛客网项目---显示评论和添加评论功能的实现

这篇文章&#xff0c;我来介绍一下我的项目中的另外一个功能&#xff1a;显示评论和添加评论。 其实这两个功能都不怎么重要&#xff0c;我感觉最重要的应该是用户注册登录功能&#xff0c;这个也了解一下&#xff0c;知道这么一回事儿就好。 首先设计DAO层。 Mapper public …...

idea集成git详解教程(实用篇)

0.Git常用命令 Git常用命令-CSDN博客 1.下载git Git - Downloads 一路傻瓜式安装即可&#xff08;NEXT&#xff09; 2.软件测试 在Windows桌面空白处&#xff0c;点击鼠标右键&#xff0c;弹出右键菜单 Git软件安装后&#xff0c;会在右键菜单中增加两个菜单 Git GUI He…...

搭建LNMP环境并配置个人博客系统

LNMP是Linux&#xff08;操作系统&#xff09;、Nginx&#xff08;Web服务器&#xff09;、MySQL&#xff08;数据库&#xff09;和PHP&#xff08;脚本解释器&#xff09;的组合&#xff0c;常用于部署高性能的动态网站&#xff0c;如WordPress等博客平台 一、安装Linux操作系…...

为什么网络安全缺口这么大,还是这么缺网络安全工程师?

为啥网安领域缺口多达300多万人&#xff0c;但网安工程师&#xff08;白帽黑客&#xff09;却很少&#xff0c;难道又是砖家在忽悠人&#xff1f;&#xff1f;&#xff1f; 主要原因为这三点: 首先是学校的原因&#xff0c;很多学校网络安全课程用的还都是十年前的老教材&…...

创新洞察|诺奖获得者埃德蒙·费尔普斯谈未来:中国创新从何而来?

当下&#xff0c;全球宏观经济形势正在发生深刻变化&#xff0c;以创新推进高质量发展被推向前所未有的高度。作为多年与中国经济结伴而行的经济学家、2006年诺贝尔经济学奖得主&#xff0c;埃德蒙费尔普斯认为&#xff1a;创新无处不在&#xff0c;而中国人具有巨大的创新活力…...

SpringMVC 学习(六)之视图

目录 1 SpringMVC 视图介绍 2 JSP 视图 3 Thymeleaf 视图 4 FreeMarker 视图 5 XSLT 视图 6 请求转发与重定向 6.1 请求转发 (Forward) 6.2 重定向 (Redirect) 7 视图控制器 (view-controller) 1 SpringMVC 视图介绍 在 SpringMVC 框架中&#xff0c;视图可以是一个 J…...

ROS 2基础概念#1:计算图(Compute Graph)| ROS 2学习笔记

在ROS中&#xff0c;计算图&#xff08;ROS Compute Graph&#xff09;是一个核心概念&#xff0c;它描述了ROS节点之间的数据流动和通信方式。它不仅仅是一个通信网络&#xff0c;它也反映了ROS设计哲学的核心——灵活性、模块化和可重用性。通过细致探讨计算图的高级特性和实…...

一本通 1403:素数对

在判断素数对的两个数是否都为素数时可以只判断数的一半 #include<bits/stdc.h> using namespace std; bool su(int a,int b){ for(int i2;i<sqrt(a);i){ if(a%i0){ return 0; } } for(int i2;i<sqrt(b);i){ if(…...

华为---RSTP(四)---RSTP的保护功能简介和示例配置

目录 1. 技术背景 2. RSTP的保护功能 3. BPDU保护机制原理和配置命令 3.1 BPDU保护机制原理 3.2 BPDU保护机制配置命令 3.3 BPDU保护机制配置步骤 4. 根保护机制原理和配置命令 4.1 根保护机制原理 4.2 根保护机制配置命令 4.3 根保护机制配置步骤 5. 环路保护机…...

Android基础控件介绍

在Android应用程序开发中&#xff0c;使用基础控件是非常常见的。这些控件允许您在用户界面中显示文本、图像、按钮等元素&#xff0c;以及接收用户输入。本文将介绍几种常见的基础控件&#xff0c;并给出每个控件在示例XML中使用的属性的详细说明。 1. TextView TextView 是…...

【总结】Maxwell学习笔记

1.Maxwell简介 Maxwell 是一款用Java编写的MySQL变更数据抓取软件&#xff0c;它会实时监控Mysql数据库的数据变更操作&#xff08;包括insert、update、delete&#xff09;&#xff0c;并将变更数据以 JSON 格式发送给 Kafka、Kinesi等流数据处理平台 官网地址&#xff1a;M…...

AFL fork server和fuzzer的交互

看了一些博客&#xff0c;都是在说fuzzer和fork server进行交互&#xff0c;由fork server fork出子进程来执行程序&#xff0c;但是不太明白这两者到底是如何在代码层面进行交互的。 run_target中有这么一段代码&#xff0c;大概意思是fuzzer给fork server传递prev_timed_out…...

Java SE:多线程(Thread)

1. 线程两个基本概念 并发&#xff1a;即线程交替运行多个指令并行&#xff1a;即多个线程同时运行指令 并发并行不矛盾&#xff0c;两者可同时发生&#xff0c;即多个线程交替运行指令 2. 多线程3种实现方式 2.1 直接创建线程对象 /*** 方式1&#xff1a;* 1. 创建thread类的…...

你敢信?软件测试万能面试脚本他来了?

写在前面&#xff1a; 过春节了&#xff0c;四舍五入接下来马上要年底了&#xff0c;新一波的跳槽旺季马上来临&#xff0c;不知道你是不是已经安于现状&#xff0c;还是蓄势待发呢&#xff1f;最近我和我的哈皮群友们一顿讨论&#xff0c;拟写了大家可能会遇到的面试情况&…...

C++/Python简单练手题

前言 最近需要开始使用python&#xff0c;但是对python了解的并不多&#xff0c;于是先从很早之前刚学C时写过的一些练手题开始&#xff0c;使用python来实现相同的功能&#xff0c;在温习python基础语法的同时&#xff0c;也一起来感受感受python的魅力 99乘法表 c&#xf…...

视频在线压缩

video2edit 一款免费的在线视频编辑软件&#xff0c;可以进行视频合并、视频剪辑、视频压缩以及转换视频格式等。 链接地址&#xff1a;在线视频编辑器和转换器 - 编辑&#xff0c;转换和压缩视频文件 打开视频压缩页面&#xff0c;上传想要压缩视频&#xff0c;支持MP4&…...

Python列表的合并、重复、判断与切片操作你学会了吗

1.合并列表 通过 实现 list1 ["佛跳墙", "肠粉", "刀削面", "烤鸭"]list2 [32, 4, 5, 7.43, True]list3 list1 list2print(list3) # [佛跳墙, 肠粉, 刀削面, 烤鸭, 32, 4, 5, 7.43, True] 2.重复输出列表中的元素 通过 * 实…...

Vue(3.3.4)+three.js(0.161.0)实现3D可视化地图

一.前言 由于最近在学习three.js,所以观摩了一下掘金&#xff0c;csdn等网站上的有关这部分的内容&#xff0c;刚好看到一个带你入门three.js——从0到1实现一个3d可视化地图 - 掘金 (juejin.cn)&#xff0c;再加上我的专业属性是地理相关&#xff0c;可以说是专业对口&#xf…...

瑞吉苍穹外卖如何拓展?已经经过不同公司多轮面试。项目中会问到哪些问题?以及问题如何解决?

别催了&#xff0c;别催了&#xff0c;先收藏吧。 作者大大正在加班加点完成。 文章会尽快发布&#xff0c;关注收藏&#xff0c;尽请期待。 想要加入并查阅作者的知识库可以联系作者 不要白嫖&#xff0c;通过后&#xff0c;附上关注和收藏截图。 已有众多小伙伴加入 目前…...

动态内存分配

目录 存在动态内存分配的原因动态内存函数mallocfreecallocrealloc 常见的动态内存错误C/C程序的内存开辟柔性数组柔性数组的特点柔性数组的使用柔性数组的优势 存在动态内存分配的原因 内存开辟方式,例如&#xff1a; int val 20;在栈空间上开辟四个字节 char arr[10] { 0 …...

基于粒子群算法的配电网无功优化研究——以IEEE33节点系统为例,探讨无功补偿器接入位置与容量...

基于粒子群算法的配电网无功优化 基于IEEE33节点配电网&#xff0c;以无功补偿器的接入位置和容量作为优化变量&#xff0c;以牛拉法进行潮流计算&#xff0c;以配电网网损最小为优化目标&#xff0c;通过优化求解&#xff0c;得到最佳接入位置和容量&#xff0c;优化结果如下所…...

开关电源EMI降噪实战:AC/DC和DC/DC滤波电路设计避坑指南

开关电源EMI降噪实战&#xff1a;AC/DC和DC/DC滤波电路设计避坑指南 在工业自动化设备和医疗电子系统中&#xff0c;开关电源的电磁干扰&#xff08;EMI&#xff09;问题常常成为产品通过认证的"拦路虎"。一位资深电源工程师曾分享过他的经历&#xff1a;某型医疗监…...

Qwen3.5推理模型实战体验:手把手教你搭建个人AI代码助手

Qwen3.5推理模型实战体验&#xff1a;手把手教你搭建个人AI代码助手 1. 为什么选择Qwen3.5-4B推理模型 在众多开源大模型中&#xff0c;Qwen3.5系列以其出色的中文理解和推理能力脱颖而出。今天我们要体验的是Qwen3.5-4B-Claude-4.6-Opus-Reasoning-Distilled-GGUF版本&#…...

Swin-Unet实战:基于纯Transformer的医学图像分割模型解析与应用

1. Swin-Unet&#xff1a;当Transformer遇见医学图像分割 医学图像分割一直是计算机视觉领域的硬骨头。还记得我第一次处理CT扫描数据时&#xff0c;传统卷积神经网络&#xff08;CNN&#xff09;在细小血管分割上的表现让我头疼不已——要么漏掉关键病灶&#xff0c;要么把正常…...

Qwen3-Reranker-0.6B完整指南:支持多租户隔离的API网关集成方案

Qwen3-Reranker-0.6B完整指南&#xff1a;支持多租户隔离的API网关集成方案 1. 为什么你需要Qwen3-Reranker-0.6B 在构建现代搜索、推荐或RAG&#xff08;检索增强生成&#xff09;系统时&#xff0c;排序环节往往决定最终体验的上限。你可能已经部署了高效的向量检索服务&am…...

计算机组成原理知识学习助手:基于GTE-Base-ZH的问答系统

计算机组成原理知识学习助手&#xff1a;基于GTE-Base-ZH的问答系统 1. 引言 学计算机组成原理&#xff0c;是不是经常感觉概念又多又绕&#xff1f;CPU流水线、Cache映射、指令周期……这些名词单独看好像都懂&#xff0c;但一遇到综合性的问题或者复杂的应用题&#xff0c;…...

Flink CDC 3.0.0 同步Oracle 19c数据,我踩过的那些坑(时区、字符集、权限)

Flink CDC 3.0.0同步Oracle 19c实战避坑指南 最近在金融级数据中台项目中实施Flink CDC 3.0.0对接Oracle 19c时&#xff0c;遇到了不少官方文档未提及的"深坑"。这些坑轻则导致数据不一致&#xff0c;重则引发生产事故。本文将分享五个典型问题的完整解决方案&#x…...

郭老师-普通人翻身的关键:认知、杠杆与时机

普通人翻身的关键 ——认知、杠杆与时机“这堂课很贵&#xff0c; 但耐心听完&#xff0c; 它会改变你的一生。”&#x1f33f; 勤奋只能感动自己&#xff0c; 真正赚钱的本质&#xff0c; 藏在规律和认知里。⚠️ 一、体力换钱的死循环&#xff1a;为何努力无法让你翻身&#…...

终极指南:3步快速解锁Intel/AMD电脑隐藏性能的免费开源工具

终极指南&#xff1a;3步快速解锁Intel/AMD电脑隐藏性能的免费开源工具 【免费下载链接】Universal-x86-Tuning-Utility Unlock the full potential of your Intel/AMD based device. 项目地址: https://gitcode.com/gh_mirrors/un/Universal-x86-Tuning-Utility Univer…...

plog架构深度解析:从宏定义到完整日志流

plog架构深度解析&#xff1a;从宏定义到完整日志流 【免费下载链接】plog Portable, simple and extensible C logging library 项目地址: https://gitcode.com/gh_mirrors/pl/plog plog是一款轻量级、可移植且高度可扩展的C日志库&#xff0c;其设计理念围绕着简洁API…...