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));
    }

小结

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对象即可

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

(0)

相关推荐

  • Android使用Realm数据库实现App中的收藏功能(代码详解)

    前 言 App数据持久化功能是每个App必不可少的功能,而Android最常用的数据持久化方式主要有以下的五种方式: 使用SharedPreferences存储数据: 文件存储数据: SQLite数据库存储数据: 使用ContentProvider存储数据: 网络存储数据. 其中前四种都是缓存数据到本地,这篇主要讲的是使用第三种方式来实现App中的收藏功能,不过不用Android原生自带SQLite数据库来存储数据,而是使用第三方的Realm数据库来来存储数据. Realm 本质上是一个嵌入式数

  • Android开发中使用sqlite实现新闻收藏和取消收藏的功能

    之前学习oracle,简单的认为数据库只存在服务器端,学习安卓之后才发现原来android和Ios本身是"携带"数据库的--SQLite,是轻量级的.嵌入式的.关系型数据库,是Android.IOS等广泛使用的的数据库系统.用于存储本地的一直状态.刚写出来一个实现新闻收藏的功能,写出来供大家参考. 在Android中我们通过SQLiteDatabase这个类的对象操作SQLite数据库.由于SQLite数据库并不需要像C/S数据库那样建立连接以及身份验证的特性,以及SQLite数据库单

  • Android WebView自定义长按选择实现收藏/分享选中文本功能

    效果图(1.3M) 一.前言 ** 戳这里可以去DEMO,来吧 ** 相信刚接触android不久的同志们,在面对产品提出的 : "自定义WebView页面中,长按文本的弹出选项.点击选择后,分享.转发.收藏选择文本" 这样的需求时,第一反应大部分是:这是系统行为,如果实现需要在web端实现. 但是web端实现的局限性太大,曾经也有过监听系统粘贴板,在用户点击复制的时候实现其他的逻辑,但是这样用户体验不好,所以自定义WebView中长按的弹出菜单,并在点击时返回选中文本的小控件闪亮登场

  • java实现收藏功能

    本文实例为大家分享了java实现收藏功能的具体代码,供大家参考,具体内容如下 需求分析 分析: 1.要求用户必须登录,否则提示2.第一次点击,表示收藏成功,收藏数+1,显示蓝色星星3.第二次点击,表示取消收藏操作,收藏数-1,显示白色星星-------------------------------------核心问题:当前请求时收藏操作,还是取消收藏操作[这类型的操作,称之为有状态的操作]解决方案:第一次请求过来时,留下一个记号,第二次请求时候,根据记号有无决定收藏还是取消收藏引出新问题:记号

  • java实现屏幕共享功能实例分析

    本文实例讲述了java实现屏幕共享功能的方法.分享给大家供大家参考.具体分析如下: 最近在做软件软件工程的课程设计,做一个用于实验室的屏幕监控系统,参考各种前人代码,最后领悟之后要转换自己的代码,初学者都是这样模仿过来的. 说到屏幕监控系统,有教师端和学生端,教师端就是Server端,学生端就做Client端.系统里比较有趣的一个地方应该算是屏幕广播与屏幕监控吧,其余什么点名签到,锁屏,定时关机的,就相对来说简单点. 屏幕广播,在功能实现上面,说白了,就是教师端的机器不断截取屏幕信息,以图片的形

  • javascript实现网站加入收藏功能

    本文为大家分享了三段javascript实现网站加入收藏功能的代码,具体内容如下 第一种情况:可兼容所有浏览器的加入收藏代码,原理:根据获取用户navigator.userAgent.toLowerCase()信息来判断浏览器,根据浏览器是否支持加入收藏js命令,如果可以自动收藏否则就提示ctrl+D手动收藏了. 代码如下: function addFavorite2() { var url = window.location; var title = document.title; var u

  • Java实现发送邮件功能时碰到的坑

    之前用163邮箱发邮件时明明是成功的,但是使用中国移动自己的邮箱时,无论如何在linux服务器中都发送不成功,一开始报如下错误: javax.mail.MessagingException: Unknown SMTP host: mail.chinamobilesz.com at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1959) ~ [mail-1.4.7.jar:1.4.7] at com.sun.mail.

  • Java实现记事本功能

    今天给大家介绍一下关于如何用Java实现记事本功能,是学习Java swing的一个非常好的案例,下面先看一下运行结果: 下面我们来看源码: import java.awt.*; import java.awt.event.*; import java.text.*; import java.util.*; import java.io.*; import javax.swing.undo.*; import javax.swing.border.*; import javax.swing.*;

  • Java生成验证码功能实例代码

    页面上输入验证码是比较常见的一个功能,实现起来也很简单.给大家写一个简单的生成验证码的示例程序,需要的朋友可以借鉴一下. 闲话少续,直接上代码.代码中的注释很详细. package com.SM_test.utils; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import ja

  • php 实现收藏功能的示例代码

    整理文档,搜刮出一个php 实现收藏功能的示例代码,稍微整理精简一下做下分享. HTML: <a class = "x" id="{$photo.id}" uid="{$Think.session.uid}" status = "{$collect_pic}" href = "javascript:void(0);"> <if condition = "$collect_num

  • Java实现AOP功能的封装与配置的小框架实例代码

    本文通过是动态代理实现的AOP功能的封装与配置的小框架.加深对动态代理和AOP编程的理解 设计 根据配置文件的键xxx对应的值(类全名)创建相应类的对象. 当且仅当xxx对应的值为com.iot.proxy.aopframework.ProxyFactoryBean时,则生成相应的动态代理类对象.代理对象的目标类和通知实现类分别由xxx.target和xxx.advice配置 配置文件 config.propertiest位于aopframework包下 xxx代表要加载的类 xxx.advic

  • Java 实现倒计时功能(由秒计算天、小时、分钟、秒)

    有时候会要求实现这样一个需求: 天.小时.分钟.秒的数值都是隔开的,服务器端只返回一个时间戳长度. 以下就是我的实现方案,力求减少对象生成.减小计算量: import java.util.Timer; import java.util.TimerTask; public class CountDownUtils { private static long day = 0; private static long hour = 0; private static long minute = 0;

随机推荐