java实现简单点赞功能
本文实例为大家分享了java实现简单点赞功能的具体代码,供大家参考,具体内容如下
需求分析
分析:
1.必须先登录,否则提示
2.第一次点赞(顶),点赞操作,点赞数+1,提示顶成功
3.第二次点赞(顶),没有操作,提示今天顶过了
核心问题:
1>怎么区分当前请求时顶成功操作(第一次顶)还是今天已经顶过(第二次顶)
2>怎么考虑今天已顶过
----------------------------------------------
核心问题需要区分是第一次顶还是的二次顶,这种请求操作属于有状态请求操作,需要后端设计一个记号,这个记号注意需要设置时效性(今天最后一秒到当前时间间隔[单位是秒])
//如何设计记号?
方案1:可以参照之前攻略收藏记号操作方式,设计一个key,用户uid做区分(保证唯一),value值是攻略id集合,一顶将攻略uid添加集合中
方案2:设计一个key,使用用户uid跟攻略sid进行区分,value值随意,需要设置有效性
实现步骤
1.创建一个点赞接口,传入当前点赞攻略sid,获取当前登录用户uid
2.通过sid跟uid拼接记号的key
3.判断key是否存在
如果存在,说明今天已经点赞(顶)过,不做任何处理,页面提示
如果不存在,说明具体没点赞(顶)过,获取vo对象,点赞数属性+1,将记号缓存到redis中,
设置过期时间:今天最后一秒到当前时间间隔[单位是秒]
4.更新vo对象
具体实现
//判断是否顶过 @Override public boolean strategyThumbup(String id, String sid) { String key = RedisKeys.USER_STRATEGY_THUMBUP.join(id, sid); //如果不包含,表示没有顶过,执行点赞,点赞数+1,并设置key有效时间 if (!template.hasKey(key)) { StrategyStatisVO statisVO = this.getStrategyStatisVO(sid); statisVO.setThumbsupnum(statisVO.getThumbsupnum() + 1); this.setStrategyStatisVO(statisVO); //拿到最晚时间 Date endDate = DateUtil.getEndDate(new Date()); //计算时间间隔 long time = DateUtil.getDateBetween(endDate, new Date()); //设置有效时间 template.opsForValue().set(key, "1", time, TimeUnit.SECONDS); return true; } return false; } ----------------------------------------------------------------------------------- //时间工具类 public class DateUtil { /** * 获取两个时间的间隔(秒) */ public static long getDateBetween(Date d1, Date d2){ return Math.abs((d1.getTime()-d2.getTime())/1000);//取绝对值 } public static Date getEndDate(Date date) { if (date == null) { return null; } Calendar c = Calendar.getInstance(); c.setTime(date); c.set(Calendar.HOUR_OF_DAY,23); c.set(Calendar.MINUTE,59); c.set(Calendar.SECOND,59); return c.getTime(); } }
小结
1.核心问题需要区分是第一次顶还是的二次顶,这种请求操作属于有状态请求操作
2.有状态请求操作我们需要设置记号,问题的关键在于记号的设计
3.这个记号,我们也可以使用与点赞/收藏功能类似的记号,就是以用户id为key,然后将顶的文章id放到集合中为value
4.但是更推荐使用以用户id和攻略id拼接而成的为key,value随意取
5.我们操作时只需要判断key是否存在,存在,我们什么操作也不用做,不存在,我们就将点赞(数)+1,然后设置key的时间即可
6.最后更新vo对象
7.难点在于时间的设置,看工具类,这个key键设置体现了key键的唯一性,灵活性和时效性
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。