java实现点赞(顶)功能

java 点赞图标下载 点赞狂java_时间间隔

需求分析
分析:
	1.必须先登录,否则提示
	2.第一次点赞(顶),点赞操作,点赞数+1,提示顶成功
	2.第二次点赞(顶),没有操作,提示今天顶过了
---------------------------------------------
核心问题:
	 1>怎么区分当前请求时顶成功操作(第一次顶)还是今天已经顶过(第二次顶)
     2>怎么考虑今天已顶过 
 ----------------------------------------------
 	核心问题需要区分是第一次顶还是的二次顶,这种请求操作属于有状态请求操作,
	需要后端设计一个记号,这个记号注意需要设置时效性(今天最后一秒到当前时间间隔[单位是秒])
   //如何设计记号?
------------------------------------------------
 方案1:可以参照之前攻略收藏记号操作方式,设计一个key,用户uid做区分(保证唯一),value值是攻略id集合,一顶将攻略uid添加集合中
 方案2:设计一个key,使用用户uid跟攻略sid进行区分,value值随意,需要设置有效性

java 点赞图标下载 点赞狂java_java 点赞图标下载_02

实现步骤
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键的唯一性,灵活性和时效性