1. 简介
随着互联网技术的不断发展,CMS(Content Management System)已经成为了很多网站的标配。而评论模块是CMS系统中不可或缺的一部分,它可以打开网站和用户之间的双向交流,并增加网站的用户黏度和活跃度。本文将介绍如何使用Java编写CMS系统的评论模块。
2. 数据库设计
2.1. 数据表结构
在设计评论模块的数据库结构时,我们需要考虑以下几个因素:
评论所属文章的ID
评论者的ID
评论内容
评论时间
评论点赞数
评论状态(是否可见、是否被屏蔽等)
综上所述,我们可以设计出如下数据表:
CREATE TABLE `comment` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`article_id` int(11) NOT NULL,
`user_id` int(11) NOT NULL,
`content` varchar(255) NOT NULL,
`create_time` datetime NOT NULL,
`like_count` int(11) NOT NULL DEFAULT '0',
`status` tinyint(4) NOT NULL DEFAULT '1',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
其中,id字段为评论的唯一标识,article_id和user_id分别为文章和用户的唯一标识,content为评论内容,create_time为评论时间,like_count为评论点赞数,status为状态(1为可见,0为不可见)。
2.2. 数据库访问类
为了方便对评论数据进行增删改查操作,我们可以定义一个CommentDAO类,该类提供以下方法:
addComment:添加一条评论
deleteComment:删除一条评论
updateComment:更新一条评论
getCommentById:根据ID获取一条评论
getCommentsByArticleId:根据文章ID获取该文章下的所有评论
下面是一个简单的CommentDAO实现:
public class CommentDAO {
private Connection connection;
public CommentDAO(Connection connection) {
this.connection = connection;
}
/**
* 添加一条评论
*/
public void addComment(Comment comment) {
String sql = "INSERT INTO comment(article_id, user_id, content, create_time) VALUES (?,?,?,?)";
try (PreparedStatement ps = connection.prepareStatement(sql)) {
ps.setInt(1, comment.getArticleId());
ps.setInt(2, comment.getUserId());
ps.setString(3, comment.getContent());
ps.setTimestamp(4, new Timestamp(comment.getCreateTime().getTime()));
ps.executeUpdate();
} catch (SQLException e) {
throw new RuntimeException("Failed to add comment", e);
}
}
/**
* 删除一条评论
*/
public void deleteComment(int commentId) {
String sql = "DELETE FROM comment WHERE id=?";
try (PreparedStatement ps = connection.prepareStatement(sql)) {
ps.setInt(1, commentId);
ps.executeUpdate();
} catch (SQLException e) {
throw new RuntimeException("Failed to delete comment", e);
}
}
/**
* 更新一条评论
*/
public void updateComment(int commentId, String newContent) {
String sql = "UPDATE comment SET content=? WHERE id=?";
try (PreparedStatement ps = connection.prepareStatement(sql)) {
ps.setString(1, newContent);
ps.setInt(2, commentId);
ps.executeUpdate();
} catch (SQLException e) {
throw new RuntimeException("Failed to update comment", e);
}
}
/**
* 根据ID获取一条评论
*/
public Comment getCommentById(int commentId) {
String sql = "SELECT * FROM comment WHERE id=?";
try (PreparedStatement ps = connection.prepareStatement(sql)) {
ps.setInt(1, commentId);
ResultSet rs = ps.executeQuery();
if (rs.next()) {
return createCommentFromResultSet(rs);
}
return null;
} catch (SQLException e) {
throw new RuntimeException("Failed to get comment by ID", e);
}
}
/**
* 根据文章ID获取该文章下的所有评论
*/
public List getCommentsByArticleId(int articleId) {
String sql = "SELECT * FROM comment WHERE article_id=? AND STATUS=1 ORDER BY create_time DESC";
try (PreparedStatement ps = connection.prepareStatement(sql)) {
ps.setInt(1, articleId);
ResultSet rs = ps.executeQuery();
List comments = new ArrayList<>();
while (rs.next()) {
comments.add(createCommentFromResultSet(rs));
}
return comments;
} catch (SQLException e) {
throw new RuntimeException("Failed to get comments by article ID", e);
}
}
private Comment createCommentFromResultSet(ResultSet rs) throws SQLException {
Comment comment = new Comment();
comment.setId(rs.getInt("id"));
comment.setArticleId(rs.getInt("article_id"));
comment.setUserId(rs.getInt("user_id"));
comment.setContent(rs.getString("content"));
comment.setCreateTime(rs.getTimestamp("create_time"));
comment.setLikeCount(rs.getInt("like_count"));
comment.setStatus(rs.getInt("status"));
return comment;
}
}
3. 评论展示
为了在文章页面展示评论,我们需要编写一个CommentsController类,该类提供一个getComments方法,用于获取文章下的所有评论并返回JSON格式的数据。在前端页面中可以使用Ajax技术调用该接口,然后使用jQuery或其他JavaScript框架渲染评论列表。
下面是一个简单的CommentsController实现:
public class CommentsController {
private CommentDAO commentDAO;
public CommentsController(CommentDAO commentDAO) {
this.commentDAO = commentDAO;
}
/**
* 获取文章下的所有评论
*/
public List getComments(int articleId) {
return commentDAO.getCommentsByArticleId(articleId);
}
}
在前端页面中,可以使用如下JavaScript代码渲染评论列表:
$.get("comments?articleId=1", function(data) {
var comments = data.comments;
var html = "";
for (var i = 0; i < comments.length; i++) {
var comment = comments[i];
html += "<div class='comment'>" +
"<div class='author'>" + comment.author + "</div>" +
"<div class='content'>" + comment.content + "</div>" +
"</div>";
}
$("#comment-list").html(html);
});
4. 评论提交
在文章页面展示评论之后,我们需要在页面中快速添加评论的表单。评论表单中需要包含评论内容和验证码等字段,这些字段的值可以通过POST方式提交到后台。在后台接收到评论信息后,需要进行验证码校验,同时还需要记录评论的发布时间和发布者等信息。
下面是一个简单的CommentsController实现:
public class CommentsController {
private CommentDAO commentDAO;
public CommentsController(CommentDAO commentDAO) {
this.commentDAO = commentDAO;
}
/**
* 提交评论
*/
public void addComment(int articleId, int userId, String content) {
// TODO: 进行验证码校验
Comment comment = new Comment();
comment.setArticleId(articleId);
comment.setUserId(userId);
comment.setContent(content);
comment.setCreateTime(new Date());
commentDAO.addComment(comment);
}
}
5. 总结
通过本文的介绍,我们了解了如何使用Java编写CMS系统的评论模块。其中,数据表结构和DAO类用于提供评论数据的存储和访问功能,CommentsController用于提供获取评论列表和添加评论等接口。希望本文能够对开发者们有所帮助,感谢阅读。