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键的唯一性,灵活性和时效性
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
相关文章