开发中评论点赞操作
评论点赞
需求分析
需求:攻略评论点赞
1.要求用户必须登录
2.第一次点赞,为点赞操作,点赞数+1,小手变成红色
3.第二次点赞,为取消点赞,点赞数-1,小手变成白色
4.如果换一个用户(前提:该用户没点赞该评论),小手是白色
核心问题:
1.跟多个登录用户扯上关系
2.区分当前请求是点赞还是取消点赞
具体步骤分析
1.点击评论点赞,传入评论id,并且拿到当前用户登录id
2.通过评论id查询出当前点赞的集合list
3.判断用户uid是否在list集合中
4.如果存在,则是取消点赞操作,将点赞数-1,并将uid从集合中移除
5.如果不存在,则是点赞操作,将该评论点赞数+1,并将uid添加到集合中
6.最后更新评论
domain设计
@Setter
@Getter
@Document("strategy_comment")
@ToString
public class StrategyComment implements Serializable {
@Id
private String id;
private String strategyId; //攻略(明细)id
private String strategyTitle; //攻略标题
private String userId; //用户id
private String nickname; //用户名
private String city;
private int level;
private String headImgUrl; //头像
private Date createTime; //创建时间
private String content; //评论内容
private int thumbupnum; //点赞数
private List<String> thumbuplist = new ArrayList<>();//点赞用户id集合,这个字段重要
}
表设计(mongodb)
{
"_id": ObjectId("5e9e559d4f46963229ffa2ab"),
"strategyId": "5e33bd2a9c300000e9003ae5",
"strategyTitle": "广州小吃名店红黑榜:你还是当年珠江畔那个老字号吗?",
"userId": "5e295f01a00e265228f963ea",
"nickname": "dafei",
"city": "广州",
"level": NumberInt("1"),
"headImgUrl": "/images/default.jpg",
"createTime": ISODate("2020-04-21T02:08:29.138Z"),
"content": "44",
"thumbupnum": NumberInt("0"),
"thumbuplist": [ ] //点赞用户id集合
}
具体接口
@RestController
@RequestMapping("strategies")
public class StrategyController {
@Autowired
private IStrategyCommentService commentService;
@PostMapping("/commentThumb")
@RequireLogin
public Object commentThumb(String cid, @UserParameter UserInfo user) {
//获取用户id
String uid = user.getId();
//调用service层方法,传入当前评论id与用户id
commentService.commentThumb(cid, uid);
return JsonResult.success();
}
}
// @RequireLogin自定义注解,必须登录,才能进来,详情请看登录拦截器原理文章
//@UserParameter自定义注解,使用springmvc自定义参数解析器,登录就可以获得user对象,详情请看springmvc自定义参数解析器文章
service层
@Override
public void commentThumb(String cid, String uid) {
//先根据cid查询出当前评论的信息
StrategyComment comment = this.get(cid);
//获取comment中的点赞集合id.判断当前用户id是否在这个集合中
List<String> list = comment.getThumbuplist();
//不在,则将点赞数+1,并将该id存到集合中
if (!list.contains(uid)) {
comment.setThumbupnum(comment.getThumbupnum() + 1);
list.add(uid);
} else {
//在集合中,则将点赞数-1,并将该id从集合中移除
comment.setThumbupnum(comment.getThumbupnum() - 1);
list.remove(uid);
}
//最后更新
this.update(comment);
}
将数据查询出来显示(点赞小手显示数据)
接口
//查询攻略点赞/评论等
@GetMapping("/statisVo")
@RequireLogin
public Object statisVo(String sid) {
//通过传过来的攻略id查询出vo对象
StrategyStatisVO vo = strategyRedisService.getStrategyStatisVO(sid);
return JsonResult.success(vo);
}
service层
@Override
public StrategyStatisVO getStrategyStatisVO(String sid) {
//使用枚举类拼接key
String key = RedisKeys.STRATEGY_STATIS_VO.join(sid);
StrategyStatisVO statisVO = new StrategyStatisVO();
//判断vo对象是否存在,即判断key是否存在
if (!template.hasKey(key)) {
//不存在,初始化数据,将数据查出来,然后赋值给vo对象,最后存起来
Strategy strategy = strategyService.get(sid);
//BeanUtils工具类,将源数据拷贝到根对象中,注意它们的字段要相同
BeanUtils.copyProperties(strategy, statisVO);
statisVO.setStrategyId(sid);
template.opsForValue().set(key, JSON.toJSONString(statisVO));
} else {
//存在,获取vo对象
String VO = template.opsForValue().get(key);
statisVO = JSON.parseObject(VO, StrategyStatisVO.class);
}
return statisVO;
}
vo对象
@Getter
@Setter
public class StrategyStatisVO implements Serializable {
private String strategyId; //攻略id
private int viewnum; //点击数
private int replynum; //攻略评论数
private int favornum; //收藏数
private int sharenum; //分享数
private int thumbsupnum; //点赞个数
}
//详情请看java中的映射思想文章