如何高效的使用java实现类似抖音的评论点赞列表(互动消息)以及点赞的基本操作

您所在的位置:网站首页 如何快速取消抖音所有点赞记录功能 如何高效的使用java实现类似抖音的评论点赞列表(互动消息)以及点赞的基本操作

如何高效的使用java实现类似抖音的评论点赞列表(互动消息)以及点赞的基本操作

2024-04-10 14:11| 来源: 网络整理| 查看: 265

前言

这篇文章是基于Java实现的一个点赞功能,是在微服务上的评论功能的子模块,以及类似于抖音的评论点赞列表,可以联表查询用户点赞的评论列表和用户被点赞的评论列表,其中并没有使用redis和mq的中间件进行优化。

实现功能

实现添加取消点赞,判断是否点赞,查看用户点赞的评论列表和用户被点赞的评论列表等。

一、数据库设计 1.评论点赞表数据库

image.png

二、实体类和VO对象 1.实体类

实体类内容与数据库相同,在此不做展示。

2.VO对象 public class LikeVO { /** * 点赞表主键 */ Integer likeId; /** * 用户信息 */ UserSimpleVO userInfo; /** * 评论内容 */ String content; /** * 点赞创建时间 */ Timestamp createTime; }  三、代码实现 1.判断是否点赞 @Override public boolean isLike(Integer userId, Integer commentId) { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper(); queryWrapper.eq(Like::getUserId,userId) .eq(Like::getCommentId,commentId); Long count = likeMapper.selectCount(queryWrapper); return count>0; } 2.添加或取消点赞 @Override public boolean like(Integer userId, Integer commentId) { //lambda查询是否存在点赞记录 LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper(); queryWrapper.eq(Like::getCommentId,commentId) .eq(Like::getUserId,userId); Like like = likeMapper.selectOne(queryWrapper); //判断点赞记录是否为空,为空则添加,不为空则删除 if(like!=null){ int row = likeMapper.delete(queryWrapper); commentMapper.updateLikeNum(commentId,-1); return row>0; } like = new Like(); like.setCommentId(commentId); like.setUserId(userId); int row = likeMapper.insert(like); //进行评论点赞数的减少 commentMapper.updateLikeNum(commentId,1); return row>0; } 3.查询用户被点赞评论的记录

image.png

使用了ArrayList、HashMap和stream流等操作加快查询效率。

由于我点赞表中只有点赞用户的id和评论id,所以先进行了查询该用户所有评论的操作,若有什么优化方法可以评论教我一下。

@Override public List likeByCommons(Integer userId) { //查询出该用户的所有评论 LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper(); queryWrapper.eq(Comment::getUserId,userId); List comments = commentMapper.selectList(queryWrapper); //判断该用户是否有评论,若没有则返回空集合。 if (comments.size() == 0) { return new ArrayList(); } //统计这些评论的id List commentIds = new ArrayList(); //创建评论id和评论内容的映射 Map commentInfo = new HashMap(); for(Comment comment:comments) { commentIds.add(comment.getId()); commentInfo.put(comment.getId(),comment.getContent()); } //查询出点赞关系 LambdaQueryWrapper likeLambdaQueryWrapper = new LambdaQueryWrapper(); likeLambdaQueryWrapper.in(Like::getCommentId,commentIds); likeLambdaQueryWrapper.orderByDesc(Like::getCreateTime); List likes = likeMapper.selectList(likeLambdaQueryWrapper); //把查出的点赞关系按照时间排序 //likes = likes.stream().sorted(Comparator.comparing(Like::getCreateTime).reversed()).collect(Collectors.toList()); //查出点赞用户信息 Set userIds = new HashSet(); for(Like like:likes) { userIds.add(like.getUserId()); } List userList = new ArrayList(userIds); Map userInfo = userClient.getUserDeatilInfoMap(userList).getData(); //stream流把comment对象赋值到likeVO中 return likes.stream().map((item) -> { LikeVO likeVO = new LikeVO(); likeVO.setLikeId(item.getLikeId()); likeVO.setContent(commentInfo.get(item.getCommentId())); likeVO.setUserInfo(userInfo.get(item.getUserId())); likeVO.setCreateTime(item.getCreateTime()); return likeVO; }).collect(Collectors.toList()); } 4.查询用户点赞的评论列表 @Override public List likeCommons(Integer userId) { //查出该用户点赞的所有评论 LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper(); queryWrapper.eq(Like::getUserId,userId); queryWrapper.orderByDesc(Like::getCreateTime); List likeList = likeMapper.selectList(queryWrapper); if (likeList.size() == 0) { return new ArrayList(); } //查出对应的评论信息 List commentIds = new ArrayList(); for(Like like:likeList) { commentIds.add(like.getCommentId()); } List commentList = commentMapper.selectBatchIds(commentIds); //查询出被点赞评论的用户信息和创建评论关系的映射 Map commentInfo = new HashMap(); Set userIds = new HashSet(); for(Comment comment:commentList) { userIds.add(comment.getUserId()); commentInfo.put(comment.getId(),comment); } List userList = new ArrayList(userIds); Map userInfo = userClient.getUserDeatilInfoMap(userList).getData(); //stream流把comment对象赋值到likeVO中 return likeList.stream().map((item) -> { LikeVO likeVO = new LikeVO(); likeVO.setLikeId(item.getLikeId()); likeVO.setUserInfo(userInfo.get(item.getUserId())); likeVO.setContent(commentInfo.get(item.getCommentId()).getContent()); likeVO.setCreateTime(item.getCreateTime()); return likeVO; }).collect(Collectors.toList()); } 总结

这是我在写项目时的一些功能代码分享,若有不足请大家指出。

拓展

如何使用Redis的Hash来实现一个定时持久化到数据库的点赞功能 - 掘金 (juejin.cn)这是我新更新的对这篇文章点赞功能的优化,感兴趣可以看一看。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3