开发中评论点赞操作

开发中评论点赞操作

评论点赞

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gTDY2J74-1597721607194)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1597718186593.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JTryATb5-1597721607196)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1597718199114.png)]

需求分析
需求:攻略评论点赞
	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中的映射思想文章
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值