点赞
(1)支持对帖子、评论点赞。
(2)第1次点赞,第2次取消点赞
首页点赞数量
统计帖子的点赞数量
详情页点赞数量
(1)统计点赞数量
(2)显示点赞状态。
在util包下新建RedisKeyUtil类,添加
private static final String SPLIT = ":";
private static final String PREFIX_ENTITY_LIKE = "like:entity";
//某个实体的赞
//like:entity:entityType:entityId -> set(userId)(用一个集合来存)
public static String getEntityLikeKey(int entityType, int entityId) {
return PREFIX_ENTITY_LIKE + SPLIT + entityType + SPLIT + entityId;
}
新建likeService类,添加
public void like(int userId, int entityType, int entityId,int entityUserId){
String entityLikeKey= RedisKeyUtil.getEntityLikeKey(entityType,entityId);
boolean isMember = redisTemplate.opsForSet().isMember(entityLikeKey,userId);
if(isMember){
redisTemplate.opsForSet().remove(entityLikeKey,userId);
}else {
redisTemplate.opsForSet().add(entityLikeKey,userId);
}
//查询某实体点赞的数量,看里面有几个userId
public long findEntityLikeCount(int entityType, int entityId){
String entityLikeKey = RedisKeyUtil.getEntityLikeKey(entityType,entityId);
return redisTemplate.opsForSet().size(entityLikeKey);
}
//查询某人对某实体的点赞状态(有没有对这个实体(如帖子、评论)点过赞),这里可以用布尔值,但int类型更具有扩展性,比如以后可能还有“踩”等状态
public int findEntityLikeStatus(int userId, int entityType,int entityId){
String entityLikeKey = RedisKeyUtil.getEntityLikeKey(entityType,entityId);
return redisTemplate.opsForSet().isMember(entityLikeKey,userId)?1:0;
}
新建LikeController类,添加
@RequestMapping(path = "/like", method = RequestMethod.POST)
@ResponseBody
public String like(int entityType, int entityId) {
User user = hostHolder.getUser();
// 点赞
likeService.like(user.getId(), entityType, entityId);
// 数量
long likeCount = likeService.findEntityLikeCount(entityType, entityId);
// 状态
int likeStatus = likeService.findEntityLikeStatus(user.getId(), entityType, entityId);
// 返回的结果
Map<String, Object> map = new HashMap<>();
map.put("likeCount", likeCount);
map.put("likeStatus", likeStatus);
return CommunityUtil.getJSONString(0, null, map);
}
把discuss-detail.html里关于点赞的地方做处理,把触发的like函数写在discuss.js。
在HomeController类的getIndexPage方法里加上
long likeCount = likeService.findEntityLikeCount(ENTITY_TYPE_POST,post.getId());
map.put("likeCount",likeCount);
在index.html里,把赞的数量相应更改。
在DiscussPostController类的getDiscussPost方法里,添加
//点赞数量
long likeCount = likeService.findEntityLikeCount(ENTITY_TYPE_POST,discussPostId);
model.addAttribute("likeCount",likeCount);
//点赞状态
int likeStatus = hostHolder.getUser()==null?0: //若没有登录则都显示没有点赞
likeService.findEntityLikeStatus(hostHolder.getUser().getId(),ENTITY_TYPE_POST,discussPostId);
model.addAttribute("likeStatus",likeStatus);
以及对评论的点赞
//点赞数量
likeCount = likeService.findEntityLikeCount(ENTITY_TYPE_COMMENT,comment.getId());
commentVo.put("likeCount",likeCount);
//点赞状态
likeStatus = hostHolder.getUser()==null?0: //若没有登录则都显示没有点赞
likeService.findEntityLikeStatus(hostHolder.getUser().getId(),ENTITY_TYPE_COMMENT,comment.getId());
commentVo.put("likeStatus",likeStatus)
以及对评论的回复的点赞
//点赞数量
likeCount = likeService.findEntityLikeCount(ENTITY_TYPE_COMMENT,reply.getId());
replyVo.put("likeCount",likeCount);
//点赞状态
likeStatus = hostHolder.getUser()==null?0: //若没有登录则都显示没有点赞
likeService.findEntityLikeStatus(hostHolder.getUser().getId(),ENTITY_TYPE_COMMENT,reply.getId());
replyVo.put("likeStatus",likeStatus);
接着对discuss-detail.html里相应的点赞状态和数量进行修改。