问题:在做文章评论回复模块时,需要将文章下的所有评论以及评论下的回复数据都查出来,把对应的回复数据都显示在对应的评论下方,然后对评论数据进行分页。
思路:
1.根据文章id去评论表中查询该文章下的所有评论,然后再根据每个评论id去回复表中查询该评论下的所有回复内容,查询的数据均按照更新时间进行排序。
2.用list去封装评论信息,然后循环遍历集合,在用list封装该改评论下所有回复数据,最后在将回复list封装到评论list中,这样我就得到了包含所有回复数据的评论集合。
3.最后一步就是编写分页类,调用即可。
话不多说,上代码:
数据库信息:
评论表:
回复表:
实体类:
@Data
public class KbmsCommentAndReplyuserVo implements Serializable {
/**
* 评论表id
*/
@TableId
private Integer commentId;
/**
* 用户(评论者)id
*/
private Integer userId;
/**
* 文章(资源)id
*/
private Integer issueId;
/**
* 用户名字
*/
private String username;
/**
* 用户头像
*/
private String avatar;
/**
* 评论内容
*/
private String content;
/**
* 标识字段, 0 文章 1 资源
*/
private Byte label;
/**
* 评论是否回复
*/
private String commentisreply;
/**
* 回复集合
*/
private List<KbmsReplyuser> kbmsReplyusers;
/**
* 记录创建时间
* */
private Date createtime;
private Date updatetime;
@TableField(exist = false)
private static final long serialVersionUID = 1L;
}
mapper:
@Repository
public interface CommentAndReplyuserMapper extends BaseMapper<KbmsCommentAndReplyuserVo> {
List<KbmsCommentAndReplyuserVo> CommentAndReplyuser(String issueId);
}
Xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.*.*.mapper.CommentAndReplyuserMapper">
<select id="CommentAndReplyuser" parameterType="String" resultType="com.*.*.vo.KbmsCommentAndReplyuserVo">
SELECT *
FROM kbms_comment where issue_id=#{issueId}
order by createTime desc
</select>
</mapper>
service:
public interface CommentService extends IService<KbmsComment> {
R CommentAdd(String token, RequestCommonPort commonPort);
R CommentDel(String token, RequestCommonPort commonPort);
R CommentfindAll(String token, RequestCommonPort commonPort, HttpServletRequest request);
}
serviceImpl:
@Slf4j
@Service
public class CommentServiceImpl extends ServiceImpl<CommentMapper, KbmsComment>
implements CommentService {
@Autowired
CommentMapper commentMapper;
@Autowired
UserMapper userMapper;
@Autowired
IssueMapper issueMapper;
@Autowired
ReplyuserMapper replyuserMapper;
@Autowired
CommentAndReplyuserMapper commentAndReplyuserMapper;
/**
* 获取评论列表接口
* 1. 根据token判断是否有用户登录
*
* @param token
* @param commonPort
* @param request
* @return
*/
@Override
public R CommentfindAll(String token, RequestCommonPort commonPort, HttpServletRequest request) {
try {
//接收参数
String IssueId = commonPort.getArticleid(); //文章id
Integer page = commonPort.getPage(); //页数
if(ObjectUtils.isEmpty(IssueId)||ObjectUtils.isEmpty(page)){
return R.error("请求参数异常");
}
//查询评论信息
List<KbmsCommentAndReplyuserVo> voArrayList = commentAndReplyuserMapper.CommentAndReplyuser(IssueId);
voArrayList = CommentServiceImpl.FileImgURLComment(voArrayList,request);
List<KbmsReplyuser> replyuserList;
for( KbmsCommentAndReplyuserVo commentAndReplyuserVo : voArrayList){
//遍历评论,查询回复数据,封装回复集合
QueryWrapper<KbmsReplyuser> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("comment_id",commentAndReplyuserVo.getCommentId())
.orderByAsc(true,"createTime");
replyuserList = replyuserMapper.selectList(queryWrapper);
replyuserList = CommentServiceImpl.FileImgURLReplyuser(replyuserList,request);
commentAndReplyuserVo.setKbmsReplyusers(replyuserList);
}
//调用分页工具类
Page<KbmsCommentAndReplyuserVo> pages = PageListUtils.getPages(page,10,voArrayList);
return R.success(pages.getRecords(),"请求成功").add("length",pages.getTotal()).add("pages",pages.getPages());
// QueryWrapper<KbmsComment> commentQueryWrapper = new QueryWrapper<>();
// commentQueryWrapper.eq("issue_id",IssueId)
// .orderByDesc(true,"createTime");
// //设置分页参数
// Page<KbmsComment> pages = new Page<>(page, 10);
// commentMapper.selectPage(pages, commentQueryWrapper);
// //获取分页数据
// List<KbmsComment> list = pages.getRecords();
// list = CommentServiceImpl.FileImgURL(list,request);
// return R.success(list,"请求成功").add("length",pages.getTotal()).add("pages",pages.getPages());
}catch (Exception e) {
e.printStackTrace();
return R.error("请求异常");
}
}
public static List<KbmsCommentAndReplyuserVo> FileImgURLComment(List<KbmsCommentAndReplyuserVo> list,HttpServletRequest request){
for (KbmsCommentAndReplyuserVo posts:list) {
String fileimg = posts.getAvatar();
if(!ObjectUtils.isEmpty(fileimg)){
String filePath = request.getScheme() + "://" + request.getServerName()
+ ":" + request.getServerPort() +"/upload/"+ fileimg;
posts.setAvatar(filePath);
}
}
return list;
}
public static List<KbmsReplyuser> FileImgURLReplyuser(List<KbmsReplyuser> list,HttpServletRequest request){
for (KbmsReplyuser posts:list) {
String fileimg = posts.getAvatar();
if(!ObjectUtils.isEmpty(fileimg)){
String filePath = request.getScheme() + "://" + request.getServerName()
+ ":" + request.getServerPort() +"/upload/"+ fileimg;
posts.setAvatar(filePath);
}
}
return list;
}
}
PageListUtility 工具类:(重要)
public class PageListUtils {
/**
* 分页函数
* @param current
* @param size
* @param list
* @return
*/
public static Page getPages(Integer current, Integer size, List<KbmsCommentAndReplyuserVo> list) {
Page<KbmsCommentAndReplyuserVo> pages = new Page<>(current,size);
int count = list.size();
List<KbmsCommentAndReplyuserVo> pageList = new ArrayList<>();
//计算当前页第一条数据的下标
int currId = current>1 ? (current-1)*size:0;
for (int i=0; i<size && i<count - currId;i++){
pageList.add(list.get(currId+i));
}
pages.setSize(size);
pages.setCurrent(current);
pages.setTotal(count);
//计算分页总页数
pages.setPages(count %10 == 0 ? count/10 :count/10+1);
pages.setRecords(pageList);
return pages;
}
}
Controller:
/**
* 添加回复接口
* @param commonPort
* @param request
* @return
*/
@PostMapping("/replys/add")
public R replysAdd(@RequestBody RequestCommonPort commonPort, HttpServletRequest request){
String token = request.getHeader("token");
return replyuserService.replysAdd(token,commonPort);
}
接口测试一波:
重要点:主要在于将查询出的list数据进行分页的操作。