Java微型博客系统——评论功能的实现

article/2025/9/11 12:48:08

评论功能的实现与Article展示页的修改

本章主要实现了博客的评论功能的实现,包括增删改查等功能。并且,由于权限不同,之前将文章页面分为了两个页面。其实是没有必要的,这次修改将两个页面合二为一。

1.数据库的建立

评论主要应该包括评论的作者、评论的内容、评论所在的文章id
数据库结构如下:
在这里插入图片描述其中comment_id是自增的主键
article_id是与文章编号关联的外键(删改联动)

2.数据库对应的pojo

这里的int类型最好写成它的包装类Integer,不然可能会出现一些问题。
数据的命名是比较重要的,最好不要出现驼峰命名,而是用"_"来分开两个词。

package com.zhz.f.provider.pojo;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import tk.mybatis.mapper.annotation.KeySql;import javax.persistence.Id;@Data
@AllArgsConstructor
@NoArgsConstructor
public class ArticleComments {@Id@KeySql(useGeneratedKeys = true)//自增键回填Integer comment_id;String comment_owner;String comment_contents;Integer article_id;public ArticleComments(String comment_owner, String comment_contents, int article_id) {this.comment_owner = comment_owner;this.comment_contents = comment_contents;this.article_id = article_id;}
}

3.server层和dao层的实现

这次采用了一个不同的顺序,首先设计好api的接口,实现可能需要的增删改查的功能。而不是像之前一样,等需要什么功能的时候再来写dao层。

MyData.java中增加的接口

//评论:
Boolean createAnArticleComment(String comment_owner, String comment_contents, Integer article_id);
Boolean deleteAnArticleComment(int comment_id);
Boolean updateAnArticleComment(int comment_id, String comment_contents);
Map<Integer, Map<String, String>> getAllCommentsByArticleID(int article_id);

*** 后续修改:之前因为嫌不好放在服务器上,不使用类传递数据而使用map套map的方法,现在感觉这个太垃圾所以又改了过来。***

//Map<Integer, Map<String, String>> getAllCommentsByArticleID(int article_id); 
ArrayList<CommonArticleComments> getAllCommentsByArticleID(int article_id);

这个CommonArticleComments放在common包下:
在这里插入图片描述

package com.zhz.f.common.classes;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.io.Serializable;@Data
@AllArgsConstructor
@NoArgsConstructor
// 需要传输的类必须支持序列化
public class CommonArticleComments implements Serializable {public Integer commentID;public String commentOwner;public String commentContent;
}

它们的实现:

@Override
public Boolean createAnArticleComment(String comment_owner, String comment_contents, Integer article_id) {commentsMapper.insert(new ArticleComments(comment_owner, comment_contents, article_id));return null;
}
@Override
public Boolean deleteAnArticleComment(int comment_id) {commentsMapper.deleteByPrimaryKey(comment_id);return null;
}
@Override
public Boolean updateAnArticleComment(int comment_id, String comment_contents) {commentsMapper.updateAnArticleComment(comment_id, comment_contents);return null;
}
/*@Override
public Map<Integer, Map<String, String>> getAllCommentsByArticleID(int article_id) {//用一个嵌套的map存数据返回。其实应该直接传一个类的数据是最好的,将类的定义放在comment里面。// 但是我不知道怎么将这种分布式的项目很好的去打包上传到服务器运行。为了之后可以在服务器上跑,这里就用了一个笨方法了。Map<Integer, Map<String, String>> result = new HashMap<>();List<Integer> commentsIDs = commentsMapper.selectAllCommentsIDsByArticleID(article_id);for (Integer comment_id : commentsIDs) {//使用通用mapper的话这里传的必须是comment_idArticleComments ac = commentsMapper.selectByPrimaryKey(comment_id);Map<String, String> ccm = new HashMap<>();ccm.put(ac.getComment_owner(), ac.getComment_contents());result.put(comment_id, ccm);}return result;*/@Overridepublic ArrayList<CommonArticleComments> getAllCommentsByArticleID(int article_id) {List<Integer> commentsIDs = commentsMapper.selectAllCommentsIDsByArticleID(article_id);ArrayList<CommonArticleComments> result = new ArrayList<>();for (Integer comment_id : commentsIDs) {//使用通用mapper的话这里传的必须是comment_idArticleComments ac = commentsMapper.selectByPrimaryKey(comment_id);result.add(new CommonArticleComments(ac.getComment_id(),ac.getComment_owner(),ac.getComment_co ntents()));}return result;}
}

dao层主要是调用了通用mapper的简单方法和自己写的一些方法。由于比较简单就不放上来

4.控制层和前端的联调

评论的功能应该是嵌入在文章页面的,所以需要修改之前的前端页面。
由于权限不同,之前将文章页面分为了两个页面。其实是没有必要的,可以加上一个thymeleaf的if语句判断即可。修改后并加上评论功能的article前端页面如下:
这里涉及到了很多的前后端的数据传输,看起来有些复杂,但其实很多都是一些判断条件,获得文章的各种信息和评论的各种信息和用户信息等。

article.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title th:text="${articleOwnerName}">的博文</title><!--判断文章是否属于该用户--><div th:if="${articleOwnerAccount} eq ${userAccount}"><form action="/zhz/editArticle"><input type="text" name="articleTitle" th:value="${articleTitle}" hidden><input type="submit" value="修改该文章"></form><form action="/zhz/deleteArticle"><input type="text" name="articleTitle" th:value="${articleTitle}" hidden><input type="submit" value="删除该文章"></form></div>
</head>
<body><h2><div th:text="${articleTitle}"></div>
</h2>
<h4>作者:<strong th:text="${articleOwnerName}"> </strong>作者账号:<strong th:text="${articleOwnerAccount}"></strong></h4><!--该标签<pre>可以有格式的输出对应的字符串-->
<textarea name="newContent" rows="50" cols="80" th:utext="${content}" readonly></textarea><h3>看看大家的精彩评论吧</h3>
<ol><li th:each="ac:${articleComments}"><form action="/zhz/editAndDeleteArticleComments" method="post"><strong th:text="${ac.commentOwner}" th:colspan="10"></strong><textarea name="articleCommentContents" th:text="${ac.commentContent}" style="overflow: visible"readonly></textarea><input name="articleCommentID" th:value="${ac.commentID}" hidden><input name="articleTitle" th:value="${articleTitle}" hidden><div th:if="${userAccount} eq ${ac.commentOwner}"><strong>如果需要修评论,则修改后点击提交</strong><br/><textarea name="newArticleCommentContents" th:text="${ac.commentContent}"style="overflow: visible"></textarea><!--articleID作为从public进入的标识符,必须要有--><input name="articleID" th:value="${articleID}" hidden><input type="submit" value="修改评论" name="editComment"></div></form></li>
</ol><h3>写下您的评论</h3>
<form action="/zhz/writeArticleComments" method="post"><textarea name="writeArticleComments" placeholder="请在此输入您的精彩评论"></textarea><input name="articleTitle" th:value="${articleTitle}" hidden><input name="articleOwnerAccount" th:value="${articleOwnerAccount}" hidden><!--articleID作为从public进入的标识符,必须要有--><input name="articleID" th:value="${articleID}" hidden><input type="submit" value="提交评论">
</form></body>
</html>

ToArticleController :

package com.zhz.f.client.controller.articles;import com.zhz.f.api.service.MyData;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;@Controller
public class ToArticleController {@DubboReferenceMyData myData;@RequestMapping("/zhz/toArticle")public String toArticle(HttpServletRequest request, HttpSession session, Model model) {String articleID = request.getParameter("articleID");if ("".equals(articleID)) articleID = null;String articleOwnerAccount = null;String userAccount = (String) session.getAttribute("userAccount");if (articleID != null) {//id不为空,说明是从public界面进来的articleOwnerAccount = myData.getUserAccountByArticleID(Integer.parseInt(articleID));} else {//id为空,说明是从用户主页进来的,直接获取本用户的用户账号articleOwnerAccount = (String) session.getAttribute("userAccount");}//获取文章信息String articleOwnerName = myData.getUserNameByAccount(articleOwnerAccount);String articleTitle = request.getParameter("articleTitle");String content = myData.getUserArticleByAccountAndArticleName(articleOwnerAccount, articleTitle);//获取评论信息Map<Integer, Map<String, String>> allComments = null;if (articleID != null) {//publicallComments = myData.getAllCommentsByArticleID(Integer.parseInt(articleID));} else {//userallComments = myData.getAllCommentsByArticleID(myData.getArticleIDByAccountAndArticleName(articleOwnerAccount, articleTitle));}//获取评论信息ArrayList<CommonArticleComments> articleComments = new ArrayList<>();if (articleID != null) {//publicarticleComments = myData.getAllCommentsByArticleID(Integer.parseInt(articleID));} else {//userarticleComments = myData.getAllCommentsByArticleID(myData.getArticleIDByAccountAndArticleName(articleOwnerAccount, articleTitle));}/*//读取数据,转化为ArticleComments类型。哎,要是直接传类多方便,真是自作自受List<ArticleComments> articleComments = new ArrayList<>();for (Integer cID : allComments.keySet()) {Map<String, String> stringStringMap = allComments.get(cID);for (String cOwner : stringStringMap.keySet()) {String cContents = stringStringMap.get(cOwner);articleComments.add(new ArticleComments(cID,cOwner,cContents));}}*///添加到显示model.addAttribute("articleComments",articleComments);model.addAttribute("articleOwnerAccount", articleOwnerAccount);model.addAttribute("articleOwnerName", articleOwnerName);model.addAttribute("userAccount", userAccount);model.addAttribute("articleTitle", articleTitle);model.addAttribute("content", content);model.addAttribute("articleID", articleID);//        if (articleID != null) return "/articles/article";return "/articles/article";}/*@Data@AllArgsConstructor@NoArgsConstructorpublic class ArticleComments{public int commentID;public String commentOwner;public String commentContent;}*/
}

EditAndDeleteArticleCommentsController

处理删除评论和修改评论的controller,本来想将删改两个功能放在两个controller里,但是前端遍历的时候两个按钮都在一个form表单中。不知道大佬们有没有什么方法可以将这两个功能分开。
虽然这样也挺好用的,但层次和功能清楚的代码还是更优质的。

package com.zhz.f.client.controller.articleComments;import com.zhz.f.api.service.MyData;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;import javax.servlet.http.HttpServletRequest;@Controller
public class EditAndDeleteArticleCommentsController {@DubboReferenceMyData myData;@RequestMapping("/zhz/editAndDeleteArticleComments")public String editAndDeleteArticleComments(HttpServletRequest request){String deleteComment = request.getParameter("deleteComment");String editComment = request.getParameter("editComment");String articleCommentID = request.getParameter("articleCommentID");if ("删除评论".equals(deleteComment)){myData.deleteAnArticleComment(Integer.parseInt(articleCommentID));}else if ("修改评论".equals(editComment)){String newArticleCommentContents = request.getParameter("newArticleCommentContents");myData.updateAnArticleComment(Integer.parseInt(articleCommentID),newArticleCommentContents);}//主要需要输入articleID(如果有),articleTitlereturn "forward:/zhz/toArticle";}
}

WriteArticleCommentsController

主要实现读取前端数据和将读取到的评论写入数据库的功能。

package com.zhz.f.client.controller.articleComments;import com.zhz.f.api.service.MyData;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;@Controller
public class WriteArticleCommentsController {@DubboReferenceMyData myData;@RequestMapping("/zhz/writeArticleComments")public String writeArticleComments(HttpServletRequest request, HttpSession session){String userAccount = (String) session.getAttribute("userAccount");String writeArticleComments = request.getParameter("writeArticleComments");String articleOwnerAccount = request.getParameter("articleOwnerAccount");String articleTitle = request.getParameter("articleTitle");int articleID = myData.getArticleIDByAccountAndArticleName(articleOwnerAccount, articleTitle);myData.createAnArticleComment(userAccount,writeArticleComments,articleID);return "forward:/zhz/toArticle";}}

总结

至此就基本实现了评论的功能。
前端页面不是很美观,没有学javaScript和Ajax等前端的东西,做其前端还是很简陋的。


http://chatgpt.dhexx.cn/article/SUAN4dQe.shtml

相关文章

想要搭建个人博客?我调研了 100 来个 Java 开源博客系统,发现这 5 个最好用!......

最近想倒腾一下博客&#xff0c;看了很多现成的比较成熟的开源博客系统&#xff0c;自己也简单从下面几个维度总结对比了一下&#xff1a; star 数量技术选型社区生态 当然啦&#xff01;好东西不能独享&#xff0c;下面简单分享一下我所做的笔记(文末有提供所有项目的压缩包)。…

Java实现小型博客系统

Java实现小型博客系统 本项目基于SpringBoot、Dubbo、Zookeeper、Redis、MySQL实现了一个分布式博客系统。功能包括账号的增删改查、文章的增删改查、文章评论的增删改查、热点文章的存取、文章的点赞等。 项目地址&#xff1a;https://github.com/ZhangHZ9802/MyLittleBlogSy…

[JAVA]从零开始创建个人博客——环境搭建

目录 一、购买服务器 二、远程登陆 三、安装相关环境 四&#xff0c;springboot项目创建 一、购买服务器 可以买腾讯云或者阿里云&#xff0c;本文以腾讯云举例。 买第一个就可以。 购买之后界面如下&#xff0c;因为需要用到mysql,点击防火墙进行配置&#xff1a; 配置如下…

Java实现个人博客网站

说明&#xff1a;该项目是实验楼用户“LOU3165780622”发布在实验楼上的项目教程&#xff1a;【Java实现个人博客】&#xff0c;未经允许&#xff0c;禁止转载&#xff1b; 该项目利用 SSM 框架和 Mysql 以及一些简单的前端知识搭建一个自己的个人博客网站&#xff0c;网站功能…

25 篇 Java 入门技术博文,送给正在自学的你

很多大学生或者正在自学的程序员问我&#xff1a;“二哥&#xff0c;能否提供一个 Java 入门的学习路线&#xff1f;”刚好我之前花了 7 周多的时间写了 25 篇 Java 入门的技术博文&#xff0c;于是我想不妨把这些整理成一个系列分享出来&#xff0c;给大家作为一个参考。 先来…

javaweb个人博客网站

该个人博客网站实现了前台用户注册登录&#xff0c;发布博文&#xff0c;发布照片&#xff0c;评论&#xff0c;关注&#xff0c;点赞&#xff0c;回复&#xff0c;留言&#xff0c;发私信等功能&#xff0c;适合新手学习SSM框架。 开发语言: Java 技术框架: SSM 开发工具…

Java项目---博客系统

博客系统url : 链接 项目已上传gitee : 链接 前言 之前笔者已经使用Servlet结合MySQL实现了第一版的个人博客。在这一版的博客系统中&#xff0c;将进行以下功能的升级&#xff1a; 框架升级&#xff1a;SSM版本&#xff0c;即&#xff08;Spring SpringMVC MyBatis&#…

javaweb——>个人博客项目

javaweb——>个人博客项目 具体代码参考&#xff1a;java_blog 目录 javaweb——>个人博客项目具体代码参考&#xff1a;[java_blog](https://github.com/zhuyunfeisn/java-project/tree/master/java_Blog)一.简单介绍1.功能简介2.使用的技术 二.项目准备1.需要的资源2.…

个人博客-javaWeb项目

一、目标 利用已有的前端页面实现一个个人博客系统的后端设计&#xff0c;可以实现用户登录&#xff0c;博客列表展示&#xff0c;博客详情页展示&#xff0c;写博客&#xff0c;删除博客的功能。 二、开发思路 采用前后端分离的方式&#xff0c;网页通过ajax构造HTTP请求和…

javaweb实现个人博客系统

JAVAweb项目——个人博客系统 技术路线&#xff1a; 项目主要采用jsphtml前台页面&#xff0c;后端服务器采用servlet&#xff0c;编辑相关样式以及函数功能的时候使用到了bootstap和jQuery。数据库操作通过dbutils和c3p0连接池实现。Md编辑通过第三方插件editor.md实现。 实现…

一个简单漂亮的Java博客系统

预览地址&#xff1a;http://forestblog.liuyanzhao.com 关于项目 该博客是基于SSM实现的一个个人博客系统&#xff0c;适合初学SSM和个人博客制作的同学学习。 主要涉及技术包括的包括 Maven、Spring、SpringMVC、MyBatis、JSP等 最新写了一篇该项目的毕业设计论文&#xf…

Java程序员博客系统推荐!我调研了100来个 Java 开源博客系统,发现这 5 个最好用!

最近想倒腾一下博客&#xff0c;看了很多现成的比较成熟的开源博客系统&#xff0c;自己也简单从下面几个维度总结对比了一下&#xff1a; star数量技术选型社区生态 当然啦&#xff01;好东西不能独享。下面简单分享一下我所做的笔记。 欢迎小伙伴们评论区补充完善。ღ( &a…

JavaWeb搭建简易个人博客

前台首页访问路径&#xff1a;/index.jsp 后台访问路径:/admin.jsp 运行项目前请把blog-parent目录下的database.sql加载到数据库中,并在blog-web/资源文件夹下的db.properties里配置数据库访问账号和密码 CSDN下载链接:点击链接下载

Java项目-Javaweb实现个人博客

作者主页&#xff1a;编程指南针 简介&#xff1a;Java领域优质创作者、CSDN博客专家 Java项目、简历模板、学习资料、面试题库、技术互助 文末获取源码 项目编号 &#xff1a;KS020 运行环境&#xff1a; 开发工具&#xff1a;IDEA /ECLIPSE 应用服务器&#xff1a;TOMCA…

用java写一个博客网站

可以先看一下这个网站长怎么样&#xff0c;哈哈哈&#xff0c;小屋知多少 先说一下这个博客有哪写功能&#xff1f;然后这个是代码后台下载地址&#xff1a;https://gitee.com/c-xiaobai-c/ssm-blog-website-background.git 前台下载地址&#xff1a;https://gitee.com/c-xia…

JavaWeb项目 -- 博客系统

JavaWeb项目 -- 博客系统 前言&#xff1a;页面展示一、创建 Maven 项目二、设计数据库三、封装数据库的操作3.1 创建 DBUtil 类3.2 创建 Blog 类3.3 创建 User 类3.4 创建类 BlogDao3.5 创建类 UserDao 四、导入准备好的前端代码五、实现博客列表界面5.1 约定好前后端交互接口…

【Java项目】从0到1构建一个博客系统

✨哈喽&#xff0c;进来的小伙伴们&#xff0c;你们好耶&#xff01;✨ &#x1f6f0;️&#x1f6f0;️系列专栏:【JavaWeb】 ✈️✈️本篇内容:从0到1构建一个博客系统&#xff01; &#x1f680;&#x1f680;代码托管平台github&#xff1a;博客系统源码托管&#xff01; ⛵…

史上最全的 Java 高质量博客与网站推荐(国内篇)

阅读文本大概需要 6.66 分钟。 前言 我最近在系统整理一些 Java 后台方面的面试题和参考答案&#xff0c;有找工作需求的童鞋&#xff0c;欢迎关注我的 Github 仓库&#xff0c;如果觉得不错可以点个 star 关注 &#xff1a; 1、awesome-java-interview2、awesome-java-notes…

博客系统[Java]

目录 一.准备工作 二.实现数据库代码(JDBC) 1.创建数据库/表结构>数据库设计 2.封装数据库(Model) 1>创建DBtil封装数据库连接操作 2>创建实体类-->表示一条记录 3>封装针对数据的增删改查 三.博客列表页 1.约定前后端 2.编写服务器代码 3.编写客户端…

JavaWeb项目—— 博客系统

文章目录 效果展示1. 创建 maven 项目2. 设计数据库3. 封装数据库的操作代码3.1 创建 DBUtil 类3.2 创建 Blog&#xff08;代表一篇博客&#xff09;3.3 创建 User&#xff08;代表一个用户&#xff09;3.4 创建类 BlogDao&#xff08;对博客表进行操作&#xff09;3.5 创建类 …