评论功能的实现与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_id
ArticleComments 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;
*/
@Override
public ArrayList<CommonArticleComments> getAllCommentsByArticleID(int article_id) {
List<Integer> commentsIDs = commentsMapper.selectAllCommentsIDsByArticleID(article_id);
ArrayList<CommonArticleComments