java实现收藏功能

这篇文章主要为大家详细介绍了java实现收藏功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了java实现收藏功能的具体代码,供大家参考,具体内容如下

需求分析

分析:

1.要求用户必须登录,否则提示
2.第一次点击,表示收藏成功,收藏数+1,显示蓝色星星
3.第二次点击,表示取消收藏操作,收藏数-1,显示白色星星
-------------------------------------
核心问题:当前请求时收藏操作,还是取消收藏操作
[这类型的操作,称之为有状态的操作]
解决方案:第一次请求过来时,留下一个记号,第二次请求时候,根据记号有无决定收藏还是取消收藏
引出新问题:记号怎么设计
-------------------------------------
记号应该存在缓存中,而不是mongodb/mysql
原因:现在所有操作都是缓存里面操作,也即:使用redis来缓存集合,此时需要思考,key值与value值设计

步骤分析

//判断是否存在以用户id为key的key键,返回list    
1.创建一个收藏接口,传攻略sid,获取用户uid
2.请求进入之后需要判断是收藏操作还是取消收藏操作
3.通过uid拼接出用户收藏的攻略id集合(记号)的key
4.判断key是否存在,如果存在,直接获取sidList,如果不存在,返回空集合list
//判断是取消收藏还是收藏操作,返回boolean类型
5.判断当前传入的sid是否在sidList(攻略id集合)中
1>如果不在,当前请求为收藏请求,获取vo对象,收藏数+1,将sid添加到sidList(攻略id集合)
2>如果在,当前请求为取消收藏请求,获取vo对象,收藏数-1,将sid从sidList(攻略id集合)移除
6.更新sidList(攻略id集合),更新vo对象
//从redis中取出来的集合字符串转换为集合
JSON.parseArray(集合字符串,String.class)

具体实现

//获取收藏数id集合 @Override     public List getStrategyFavorStatisVO(String userId, String sid) {         //拼接key         String key = RedisKeys.USER_STRATEGY_FAVOR.join(userId);         //判断redis中有没有该key         List list = new ArrayList<>();         if (template.hasKey(key)) {             //如果存在,就直接获得key对应的收藏数集合             String sidListStr = template.opsForValue().get(key);             //将字符串解析为集合             list = JSON.parseArray(sidListStr, String.class);         }         //如果不存在,创建list,缓存到redis中,并返回空集合         return list;     }     //判断集合中是否存在攻略id     @Override     public boolean isExistsSid(String uid, String sid) {         List list = this.getStrategyFavorStatisVO(uid, sid);         StrategyStatisVO statisVO = this.getStrategyStatisVO(sid);         //判断是否在存在传过来的攻略id         if (!list.contains(sid)) {             //不存在,收藏操作,收藏数+1,添加到list集合中             statisVO.setFavornum(statisVO.getFavornum() + 1);             list.add(sid);         } else {             //存在,取消收藏操作,收藏数-1,并从list集合中移除             statisVO.setFavornum(statisVO.getFavornum() - 1);             list.remove(sid);         }         //更新vo对象,更新list         this.setStrategyStatisVO(statisVO);         template.opsForValue().set(RedisKeys.USER_STRATEGY_FAVOR.join(uid), JSON.toJSONString(list));         return list.contains(sid);     } ----------------------------------------     //获取vo对象      @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.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对象,将vo对象存储到redis数据库中      @Override     public void setStrategyStatisVO(StrategyStatisVO statisVO) {         String key = RedisKeys.STRATEGY_STATIS_VO.join(statisVO.getStrategyId());         template.opsForValue().set(key, JSON.toJSONString(statisVO));     }

小结

1.关于收藏功能的实现其实与点赞功能类似,都是点击一下,数据+1,再点击一下,数据-1
2.关于这类问题,我们称之为有状态的操作,就是第一次操作之后,我们需要留下一个记号(key键,value-list集合)
3.例如上面的操作,我们用key键作为标记,key键通过当前用户id拼接,站在用户角度
4.先判断key键是否存在,存在,就通过key取出list集合,不存在,返回空集合给前端,这个是用来显示收藏颜色的
5.当我们点击操作时,只需要判断传进来的攻略id是否存在集合中即可
6.如果不在,当前请求为收藏请求,获取vo对象,收藏数+1,将sid添加到sidList(攻略id集合)
   如果在,当前请求为取消收藏请求,获取vo对象,收藏数-1,将sid从sidList(攻略id集合)移除
7.最后更新sidList(攻略id集合),更新vo对象即可

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持0133技术站。

以上就是java实现收藏功能的详细内容,更多请关注0133技术站其它相关文章!

赞(0) 打赏
未经允许不得转载:0133技术站首页 » Java