java实现收藏功能

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

步骤分析
//判断是否存在以用户id为key的key键,返回list    1.创建一个收藏接口,传攻略sid,获取用户uid2.请求进入之后需要判断是收藏操作还是取消收藏操作3.通过uid拼接出用户收藏的攻略id集合(记号)的key4.判断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集合@Overridepublic List<String> getStrategyFavorStatisVO(String userId, String sid) {//拼接keyString key = RedisKeys.USER_STRATEGY_FAVOR.join(userId);//判断redis中有没有该keyList<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@Overridepublic boolean isExistsSid(String uid, String sid) {List<String> list = this.getStrategyFavorStatisVO(uid, sid);StrategyStatisVO statisVO = this.getStrategyStatisVO(sid);//判断是否在存在传过来的攻略idif (!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对象,更新listthis.setStrategyStatisVO(statisVO);template.opsForValue().set(RedisKeys.USER_STRATEGY_FAVOR.join(uid), JSON.toJSONString(list));return list.contains(sid);}
------------------------------------------------------------------------------------//获取vo对象@Overridepublic StrategyStatisVO getStrategyStatisVO(String sid) {//使用枚举类拼接keyString 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数据库中@Overridepublic void setStrategyStatisVO(StrategyStatisVO statisVO) {String key = RedisKeys.STRATEGY_STATIS_VO.join(statisVO.getStrategyId());template.opsForValue().set(key, JSON.toJSONString(statisVO));}
小结
   1.关于收藏功能的实现其实与点赞功能类似,都是点击一下,数据+1,再点击一下,数据-12.关于这类问题,我们称之为有状态的操作,就是第一次操作之后,我们需要留下一个记号(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对象即可

java实现收藏功能相关推荐

  1. java点赞关注功能_谈谈用户倾向系统“点赞”“收藏”“喜欢”“关注”的区别...

    由于正好在做社区产品,于是对用户倾向系统做了点总结.这是我之前在某论坛上简单地回答过的问题,现在做一些补充形成文章吧. 点赞 私以为"点赞"的初衷是"评论"功能 ...

  2. java收藏功能思路,互联网产品中的“收藏”功能思路

    简单谈谈"收藏"(互联网产品中的收藏功能)的思路,抛砖引玉,欢迎交流. 1."收藏"是什么? 收藏是个性化地整理信息资源. every coin has two ...

  3. qq阅读java带签名_qq阅读手机版JAVA1.9在线阅读可跳转目录 添加收藏功能

    秋高气爽好读书,JAVA1.9清凉上线,重磅推出图书收藏功能,看到喜欢的书,轻轻一点,放入收藏,闲暇时分伴随阵阵秋风,打开QQ阅读藏书,即进入一种爽朗的书香意境.同时打通了同WAP书城预付费开通VIP ...

  4. java的网络功能与编程_Java的网络功能与编程(转载)

    Java的 网络 功能与编程 徐迎晓 (上海大学计算中心25#) 摘  要:Java语言是Internet上最热门的编程语言,本文针对 Java的 网络 功能,对Java从 网络 上获取图象.声音. ...

  5. 收藏功能前端实现代码

    基于jQuery+Bootstrap+ajax+SSM 收藏功能前端实现 收藏功能需求 Bootstrap 下面直接贴下代码吧 代码解释 收藏功能需求 收藏功能需求:用户点击收藏按钮,前端通过一个五角 ...

  6. android收藏功能demo,Android使用Realm数据库实现App中的收藏功能(代码详解)

    前 言 App数据持久化功能是每个App必不可少的功能,而Android最常用的数据持久化方式主要有以下的五种方式: 使用SharedPreferences存储数据: 文件存储数据: SQLite数据 ...

  7. 巡云轻论坛系统 2.3 发布,新增话题收藏功能

    百度智能云 云生态狂欢季 热门云产品1折起>>>   1.新增话题收藏功能 2.去除后台管理添加和修改用户时必须填写邮箱校验 3.后台查询服务器时间增加UTC支持 4.修正删除用户时 ...

  8. 仿小米增加短信的收藏功能

    本人一直在手机ODM公司做Android开发,不是纯应用开发,和大多数Android应用开发有点区别.偶尔也会做一些系统应用上的需求开发以及个人兴趣会看看app应用和动手操作.平时的总结都是保存在本地 ...

  9. java 日历签到功能_基于jquery实现日历签到功能

    使用Jquery实现每日签到功能 基于jquery实现日历签到功能 jquery记事日历插件e-calendar 思路:1.获取当月第一天是周几2.获取当月共几天 通过获取下月的第0天,即是当月最后一 ...

最新文章

  1. c语言饭卡管理系统链表文件,C语言《学生信息管理系统》链表+文件操作
  2. ios unrecognized selector sent to instance出现的原因和解决方案
  3. 比较经典的三层交换机实验
  4. 初级软件工程师的成长
  5. 软件工程-pair work
  6. 【转】如何在编程生涯中有一个好的开端
  7. RocketMQ消息轨迹-设计篇
  8. 星宿UI V1.1.2 跳转小商店+ wordpress微信小程序
  9. python一个函数调用另一个函数的返回值_python-调用另一个函数后立即从函数返回...
  10. max os取消开机启动
  11. 智能优化算法:鸡群优化算法-附代码
  12. mysql中查看虚拟环境_进程、虚拟环境、mysql
  13. a5松下驱动器参数设置表_松下a5伺服参数设置详解
  14. 第九届蓝桥杯,赛后感!!含泪写完。
  15. 使用netstat命令统计established状态的连接数
  16. SEO外推福利:外链高收录平台与外链类型分析
  17. cocos2d 高德地图_高德地图SDK使用经验
  18. 服务器返回状态码说明
  19. 密码学基础(二)单表---置换密码 凯撒密码 棋盘密码 乘法密码 仿射密码 多表---vigenere方阵
  20. Bongo Cat桌面小猫咪单手双手全键盘,写代码效果太舒服

热门文章

  1. centos下安装xcrysden出现的问题
  2. 没有mysql不能设置root密码怎么办_无法给MySQL root用户修改密码的解决方法
  3. Dynamics CRM: 表单(Form)中的显示字段变成只读的几种情况
  4. 共享店铺靠谱么?共享店铺哪家好?全方位测评企雀共享店铺,黑谷共享店铺!
  5. spring深入学习(十九) IOC 之 Factory 实例化 bean
  6. Win10 安装虚拟机ROS
  7. 什么是二极管钳位电路
  8. DM数据库 HUGE TABLE简析
  9. 如何破解自如的反爬机制
  10. 作为一名Java开发工程师需要掌握哪些专业技能