前言
这篇文章是基于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());
}
总结
这是我在写项目时的一些功用代码共享,若有缺乏请我们指出。
拓宽
如何运用Redis的Hash来完成一个守时持久化到数据库的点赞功用 – ()这是我新更新的对这篇文章点赞功用的优化,感兴趣能够看一看。