社区网站项目4.4 我收到的赞
重构点赞功能(1)以用户为key,记录点赞数量(2)increment(key),decrement(key) 开发个人主页以用户为key,查询点赞数量 在RedisKeyUtil类里添加private static final String PREFIX_USER_LIKE = "like:user";//某个用户的赞//like:user:userIdpublic static Str
·
重构点赞功能
(1)以用户为key,记录点赞数量
(2)increment(key),decrement(key)
开发个人主页
以用户为key,查询点赞数量
在RedisKeyUtil类里添加
private static final String PREFIX_USER_LIKE = "like:user";
//某个用户的赞
//like:user:userId
public static String getUserLikeKey(int userId) {
return PREFIX_USER_LIKE + SPLIT + userId;
}
在LikeService类里。重构like方法
//点赞
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);
// }
//重构
redisTemplate.execute(new SessionCallback() {
@Override
public Object execute(RedisOperations operations) throws DataAccessException {
String entityLikeKey= RedisKeyUtil.getEntityLikeKey(entityType,entityId);
String userLikeKey = RedisKeyUtil.getUserLikeKey(entityUserId);
boolean isMember = operations.opsForSet().isMember(entityLikeKey,userId); //这个查询要放在事务之外
operations.multi();
if(isMember){
operations.opsForSet().remove(entityLikeKey,userId);
operations.opsForValue().decrement(userLikeKey);
}else{
operations.opsForSet().add(entityLikeKey,userId);
operations.opsForValue().increment(userLikeKey);
}
return operations.exec();
}
});
}
并添加findUserLikeCount方法
//查询某个用户获得的赞
public int findUserLikeCount(int userId){
String userLikeKey = RedisKeyUtil.getUserLikeKey(userId);
Integer count = (Integer) redisTemplate.opsForValue().get(userLikeKey);
return count==null? 0 : count.intValue();
}
接着改写LikeController中的like方法
@RequestMapping(path = "/like", method = RequestMethod.POST)
@ResponseBody
public String like(int entityType, int entityId, int entityUserId) {
User user = hostHolder.getUser();
// 点赞
likeService.like(user.getId(), entityType, entityId, entityUserId);
// 数量
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里点赞动作加一个参数,并把discuss.js里的like函数加一个入参entityUserId。
在UserController类里,追加一个方法
//个人主页
@RequestMapping(path="/profile/{userId}",method = RequestMethod.GET)
public String getProfilePage(@PathVariable("userId") int userId,Model model){
User user = userService.findUserById(userId);
if(user==null){
throw new RuntimeException("该用户不存在!");
}
//用户
model.addAttribute("user",user);
//点赞数量
int likeCount = likeService.findUserLikeCount(userId);
model.addAttribute("likeCount",likeCount);
return "/site/profile";
}
在index.html里把链接到个人主页的地方改成相应的。在profile.html里,把用户相关信息引用上(包括收到的赞等)。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
已为社区贡献5条内容
所有评论(0)