这篇文章主要介绍“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<String> getStrategyFavorStatisVO(String userId, String sid) { //拼接key String key = RedisKeys.USER_STRATEGY_FAVOR.join(userId); //判断redis中有没有该key List<String> 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<String> 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)); }
到此,关于“java怎么实现收藏功能”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。