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

目录

前言

实现功能

一、数据库设计

1.评论点赞表数据库

二、实体类和VO对象

1.实体类

2.VO对象

 三、代码实现

1.判断是否点赞

2.添加或取消点赞

3.查询用户被点赞评论的记录

4.查询用户点赞的评论列表

总结


前言

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


实现功能

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

一、数据库设计

1.评论点赞表数据库

二、实体类和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<Like> 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<Like> 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.查询用户被点赞评论的记录

类似于抖音的互动消息查看

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

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

@Override
    public List<LikeVO> likeByCommons(Integer userId) {
        //查询出该用户的所有评论
        LambdaQueryWrapper<Comment> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(Comment::getUserId,userId);
        List<Comment> comments = commentMapper.selectList(queryWrapper);
        //判断该用户是否有评论,若没有则返回空集合。
        if (comments.size() == 0) {
            return new ArrayList<>();
        }
        //统计这些评论的id
        List<Integer> commentIds = new ArrayList<>();
        //创建评论id和评论内容的映射
        Map<Integer,String> commentInfo = new HashMap<>();
        for(Comment comment:comments)
        {
            commentIds.add(comment.getId());
            commentInfo.put(comment.getId(),comment.getContent());
        }
        //查询出点赞关系
        LambdaQueryWrapper<Like> likeLambdaQueryWrapper = new LambdaQueryWrapper<>();
        likeLambdaQueryWrapper.in(Like::getCommentId,commentIds);
        likeLambdaQueryWrapper.orderByDesc(Like::getCreateTime);
        List<Like> likes = likeMapper.selectList(likeLambdaQueryWrapper);
        //把查出的点赞关系按照时间排序
        //likes = likes.stream().sorted(Comparator.comparing(Like::getCreateTime).reversed()).collect(Collectors.toList());

        //查出点赞用户信息
        Set<Integer> userIds = new HashSet<>();
        for(Like like:likes)
        {
            userIds.add(like.getUserId());
        }
        List<Integer> userList = new ArrayList<>(userIds);
        Map<Integer, UserSimpleVO> 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<LikeVO> likeCommons(Integer userId) {
        //查出该用户点赞的所有评论
        LambdaQueryWrapper<Like> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(Like::getUserId,userId);
        queryWrapper.orderByDesc(Like::getCreateTime);
        List<Like> likeList = likeMapper.selectList(queryWrapper);
        if (likeList.size() == 0) {
            return new ArrayList<>();
        }
        //查出对应的评论信息
        List<Integer> commentIds = new ArrayList<>();
        for(Like like:likeList)
        {
            commentIds.add(like.getCommentId());
        }
        List<Comment> commentList = commentMapper.selectBatchIds(commentIds);

        //查询出被点赞评论的用户信息和创建评论关系的映射
        Map<Integer,Comment> commentInfo = new HashMap<>();
        Set<Integer> userIds = new HashSet<>();
        for(Comment comment:commentList)
        {
            userIds.add(comment.getUserId());
            commentInfo.put(comment.getId(),comment);
        }
        List<Integer> userList = new ArrayList<>(userIds);
        Map<Integer, UserSimpleVO> 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());
    }

总结

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

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
实现仿抖音双击点赞特效,可以使用Android中的GestureDetector类,它可以检测手势事件。具体实现步骤如下: 1.在布局文件中,创建一个ImageView控件,并设置图片资源。 2.在Java代码中,实例化GestureDetector类,并在onTouchEvent()方法中传入MotionEvent事件。 3.在GestureDetector的onDoubleTap()方法中,实现双击点赞的逻辑。 4.在GestureDetector的onSingleTapConfirmed()方法中,实现单击事件的逻辑。 下面是实现代码示例: ``` public class MainActivity extends AppCompatActivity implements GestureDetector.OnGestureListener, GestureDetector.OnDoubleTapListener { ImageView imageView; GestureDetector gestureDetector; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); imageView = findViewById(R.id.imageView); gestureDetector = new GestureDetector(this, this); gestureDetector.setOnDoubleTapListener(this); } @Override public boolean onTouchEvent(MotionEvent event) { gestureDetector.onTouchEvent(event); return super.onTouchEvent(event); } @Override public boolean onSingleTapConfirmed(MotionEvent e) { // 单击事件逻辑 return true; } @Override public boolean onDoubleTap(MotionEvent e) { // 双击事件逻辑 return true; } @Override public boolean onDoubleTapEvent(MotionEvent e) { return true; } @Override public boolean onDown(MotionEvent e) { return true; } @Override public void onShowPress(MotionEvent e) { } @Override public boolean onSingleTapUp(MotionEvent e) { return true; } @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { return true; } @Override public void onLongPress(MotionEvent e) { } @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { return true; } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值