广告
返回顶部
首页 > 资讯 > 后端开发 > Python >java实现点赞功能
  • 699
分享到

java实现点赞功能

2024-04-02 19:04:59 699人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

本文实例为大家分享了java实现点赞功能的具体代码,供大家参考,具体内容如下 实现思路: 将点赞的数据先保存到Redis中,然后定时同步到数据库 第一步: 在redis中创建二个ha

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

实现思路:

将点赞的数据先保存到Redis中,然后定时同步到数据库

第一步:

在redis中创建二个hash 用于存储 用户点赞记录及记录点赞数
MAP_USER_LIKED :用户点赞的记录 key:记录id::用户id value:1
MAP_USER_LIKED_COUNT:记录点赞数 key: 记录id value:数量

第二步:

创建枚举类

@Getter
public enum LikeStatusEnum {
    LIKE(1,"点赞"),
    UNLIKE(0,"取消点赞/未点赞");

    private Integer code;
    private String msg;

    LikeStatusEnum(Integer code,String msg){
        this.code = code;
        this.msg = msg;
    }
}
@Getter
public enum RedisHashEnum {
    MAP_USER_LIKED("MAP_USER_LIKED"),
    MAP_USER_LIKED_COUNT("MAP_USER_LIKED_COUNT");
    private String value;

    RedisHashEnum(String value){
        this.value =value;
    }
}

第三步:

将实现类写好

@Service
public class PostRedisServiceImpl implements PostRedisService {

    @Resource
    private RedisTemplate redisTemplate;

    @Autowired(required = false)
    public void  setRedisTemplate(RedisTemplate redisTemplate){
        RedisSerializer serializer = new StringRedisSerializer();
        redisTemplate.seTKEySerializer(serializer);
        redisTemplate.setValueSerializer(serializer);
        redisTemplate.setHashKeySerializer(serializer);
        redisTemplate.setHashValueSerializer(serializer);
        this.redisTemplate = redisTemplate;
    }
    
    @Override
    public void saveLikeRedis(String recordId, String userId,Integer status) {
        String key =recordId+"::"+userId;
        redisTemplate.opsForHash().put(RedisHashEnum.MAP_USER_LIKED,key, status);
    }

    
    @Override
    public void deleteLikeFromRedis(String recordId, String userId) {
        String key =recordId+"::"+userId;
        redisTemplate.opsForHash().delete(RedisHashEnum.MAP_USER_LIKED,key);
    }

    
    @Override
    public void incrementLikedCount(String recordId) {
        redisTemplate.opsForHash().increment(RedisHashEnum.MAP_USER_LIKED_COUNT,recordId,1);
    }

    
    @Override
    public void decrementLikeCount(String recordId) {
        redisTemplate.opsForHash().increment(RedisHashEnum.MAP_USER_LIKED_COUNT,recordId,-1);
    }
}

第四步提供接口:

 
    @Override
    public Result addKudos(KudosVo vo) {
        if(vo == null){
            return Result.error(ResponseMessage.PARAMERROR);
        }
        if("1".equals(vo.getStatus())){
            // 点赞
            postRedisService.saveLikeRedis(vo.getRecordId(),vo.getUserId(), LikeStatusEnum.LIKE.getCode());
            // 记录+1
            postRedisService.incrementLikedCount(vo.getRecordId());
        }else if("0".equals(vo.getStatus())){
            // 取消点赞 更新状态
            postRedisService.saveLikeRedis(vo.getRecordId(),vo.getUserId(), LikeStatusEnum.UNLIKE.getCode());

//            postRedisService.deleteLikeFromRedis(vo.getRecordId(),vo.getUserId());
            // 记录 -1
            postRedisService.decrementLikeCount(vo.getRecordId());
        }
        return Result.success(ResponseMessage.SUCCESS);
    }

最后定时将redis 中的数据同步到数据库

 
//    @Transactional(rollbackFor =Exception.class)
    @Scheduled(cron = "0 */5 * * * ?")
    public void transLikdedFromRedis()throws IOException{
        List<RedisLikedUserDTO> dtoList = getLikedUserFromRedis();
        dtoList.stream().forEach(x->{
            // 通过记录及人员id 查询 该 人员是否点赞
            LambdaQueryWrapper<WorkCircleRecord> queryWrapper = new LambdaQueryWrapper<>();
            queryWrapper.eq(WorkCircleRecord::getDeleteIf,true);
            queryWrapper.eq(WorkCircleRecord::getId,x.getRecordId());
            queryWrapper.like(WorkCircleRecord::getWorkKudosUserIds,x.getUserId());
            WorkCircleRecord record = workCircleRecordMapper.selectOne(queryWrapper);
            // 点赞
            if(record == null&&"1".equals(x.getStatus())){
                // 根据记录id  查询
                LambdaQueryWrapper<WorkCircleRecord> wrapper = new LambdaQueryWrapper<>();
                wrapper.eq(WorkCircleRecord::getDeleteIf,true);
                wrapper.eq(WorkCircleRecord::getId,x.getRecordId());
                WorkCircleRecord workCircleRecord = workCircleRecordMapper.selectOne(wrapper);
                if(workCircleRecord != null){
                    // 没有此人员 添加
                    if(StringUtils.isBlank(workCircleRecord.getWorkKudosUserIds())){
                        // 没有点赞人员
                        workCircleRecord.setWorkKudosUserIds(x.getUserId());
                        SysUser user = sysUserMapper.selectById(x.getUserId());
                        if(user !=null){
                            workCircleRecord.setWorkKudosUser(user.getRealname());
                        }
                    }else {
                        // 有点赞人员
                        String userIds = x.getUserId()+","+workCircleRecord.getWorkKudosUserIds();
                        workCircleRecord.setWorkKudosUserIds(userIds);
                        SysUser user = sysUserMapper.selectById(x.getUserId());
                        String userNames = user.getRealname()+workCircleRecord.getWorkKudosUser();
                        workCircleRecord.setWorkKudosUser(userNames);
                    }
                    workCircleRecordMapper.updateById(workCircleRecord);
                }

            }else if("0".equals(x.getStatus())) {
                // 有记录 并取消点赞
                // 根据记录id  查询
                LambdaQueryWrapper<WorkCircleRecord> wrapper = new LambdaQueryWrapper<>();
                wrapper.eq(WorkCircleRecord::getDeleteIf,true);
                wrapper.eq(WorkCircleRecord::getId,x.getRecordId());
                WorkCircleRecord workCircleRecord = workCircleRecordMapper.selectOne(wrapper);
                // 将此点赞人员去除
                if(workCircleRecord !=null){
                    SysUser user = sysUserMapper.selectById(x.getUserId());
                    List<String> userIds = Arrays.asList(workCircleRecord.getWorkKudosUserIds().split(","));
                    List<String> userNames =Arrays.asList(workCircleRecord.getWorkKudosUser().split(","));
                    userIds.remove(x.getUserId());
                    userNames.remove(user.getRealname());
                    workCircleRecord.setWorkKudosUserIds(String.join(",",userIds));
                    workCircleRecord.setWorkKudosUser(String.join(",",userNames));
                    workCircleRecordMapper.updateById(workCircleRecord);
                }
            }
        });
    }

    public List<RedisLikedUserDTO> getLikedUserFromRedis() throws IOException{
        List<RedisLikedUserDTO> dtoList = new ArrayList<>();
        // 通过游标获取所有键值对
        Cursor<Map.Entry<Object,Object>> cursor = redisTemplate.opsForHash().scan(RedisHashEnum.MAP_USER_LIKED.getValue(),ScanOptions.NONE);
        while (cursor.hasNext()){
            Map.Entry<Object,Object> map = cursor.next();
            String key = map.getKey().toString();
            String[] split = key.split("::");
            RedisLikedUserDTO dto = new RedisLikedUserDTO();
            dto.setRecordId(split[0]);
            dto.setUserId(split[1]);
            dto.setStatus(Integer.parseInt(map.getValue().toString()));
            dtoList.add(dto);

            // 将redis 中的记录删除
            redisTemplate.opsForHash().delete(RedisHashEnum.MAP_USER_LIKED.getValue(),key);
        }
        cursor.close();
        return dtoList;
    }

    @Transactional(rollbackFor =Exception.class)
    @Scheduled(cron = "0 */5 * * * ?")
    public void transLikedCountFromRedis() throws IOException{
        // 获取所有的点赞数
        List<RedisLikeCountDTO> dtoList = getLikedCountFromRedis();
        // 获取所有的记录id
        List<String> recordIdList = dtoList.stream().map(x->x.getRecordId()).collect(Collectors.toList());
        if(CollectionUtils.isNotEmpty(recordIdList)){
            List<WorkCircleRecord> recordList = workCircleRecordMapper.selectBatchIds(recordIdList);
            if(CollectionUtils.isNotEmpty(recordList)){
                // 通过id 匹配
                dtoList.stream().forEach(x->{
                    recordList.stream().forEach(k->{
                        if(x.getRecordId().equals(k.getId())){
                            Integer num = x.getCount()+k.getWorkKudos();
                            if(num<0){
                                k.setWorkKudos(0);
                            }else {
                                k.setWorkKudos(num);
                            }
                            workCircleRecordMapper.updateById(k);
                        }
                    });
                });
            }
        }
    }

    public List<RedisLikeCountDTO> getLikedCountFromRedis() throws IOException {
        List<RedisLikeCountDTO> dtoList = new ArrayList<>();
        Cursor<Map.Entry<Object,Object>> cursor=  redisTemplate.opsForHash().scan(RedisHashEnum.MAP_USER_LIKED_COUNT, ScanOptions.NONE);
        while (cursor.hasNext()){
            Map.Entry<Object,Object> map = cursor.next();
            // 获取 点赞数
            String key = map.getKey().toString();
            RedisLikeCountDTO dto = new RedisLikeCountDTO();
            dto.setRecordId(key);
            dto.setCount(Integer.parseInt(map.getValue().toString()));
            dtoList.add(dto);
            redisTemplate.opsForHash().delete(RedisHashEnum.MAP_USER_LIKED_COUNT,key);
        }
        cursor.close();
        return dtoList;
    }

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

--结束END--

本文标题: java实现点赞功能

本文链接: https://www.lsjlt.com/news/166413.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • java实现点赞功能
    本文实例为大家分享了java实现点赞功能的具体代码,供大家参考,具体内容如下 实现思路: 将点赞的数据先保存到redis中,然后定时同步到数据库 第一步: 在redis中创建二个ha...
    99+
    2022-11-13
  • java实现简单点赞功能
    本文实例为大家分享了java实现简单点赞功能的具体代码,供大家参考,具体内容如下 需求分析 分析: 1.必须先登录,否则提示2.第一次点赞(顶),点赞操作,点赞数+1,提示顶成功3...
    99+
    2022-11-13
  • Redis中怎么实现点赞、取消点赞功能
    Redis中怎么实现点赞、取消点赞功能,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一、Redis 缓存设计及实现1.1 Redis 安装及运...
    99+
    2022-10-18
  • SpringBoot实现物品点赞功能
    前后端分离项目–二手交易平台小程序 SpringBoot----物品收藏功能实现 SpringBoot----评论回复功能实现(数据库设计) SpringBoot----文件(图片)...
    99+
    2022-11-12
  • iOS实现抖音点赞功能
    目录前言实现原理三角形的贝塞尔曲线原理代码实现创建 CAShapeLayer创建初始位置的贝塞尔path结束前言 很多人肯定都是玩过抖音的吧,那也肯定为了某位美女或者帅哥偷偷作死的点...
    99+
    2022-11-13
  • 非常全面的Java SpringBoot点赞功能实现
    目录前言解决方案青铜版白银版黄金版源码总结前言 最近公司在做一个NFT商城的项目,大致就是一个只买卖数字产品的平台,项目中有个需求是用户可以给商品点赞,还需要获取商品的点赞总数,类似...
    99+
    2022-11-13
  • vue实现静态页面点赞和取消点赞功能
    本文实例为大家分享了vue实现静态页面点赞和取消点赞的具体代码,供大家参考,具体内容如下 效果如下: 点击之后 点赞数量+1,红心亮再次点击,点赞数量-1,红心灭 逻辑: 由于列...
    99+
    2022-11-13
  • Android中Listview点赞功能的实现
    最近这段时间一直在看Android,利用Listview去实现点赞功能,下面给大家介绍下基本思路。 基本思路: 进入界面–》获取数据–》 在Listview中显示–》 通过...
    99+
    2022-06-06
    listview Android
  • 利用Java实现一个短视频点赞功能
    这篇文章将为大家详细讲解有关利用Java实现一个短视频点赞功能,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。 这行代码是弹出点赞的时间为18s.18秒后发生了什么呢 ?继续看&nb...
    99+
    2023-05-31
    java ava 点赞
  • vue怎么实现静态页面点赞和取消点赞功能
    本文小编为大家详细介绍“vue怎么实现静态页面点赞和取消点赞功能”,内容详细,步骤清晰,细节处理妥当,希望这篇“vue怎么实现静态页面点赞和取消点赞功能”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。效果如下:点击...
    99+
    2023-06-29
  • Android PraiseTextView实现朋友圈点赞功能
    PraiseTextView 说明 我是将朋友圈分成了几个独立模块单独自定义的View,通过回调完成交互,耦合性算是非常低了,主要有以下及部分: 1.评论布局(自定义TextV...
    99+
    2022-06-06
    朋友圈 Android
  • JavaScript如何实现评论点赞功能
    这篇文章主要为大家展示了“JavaScript如何实现评论点赞功能”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“JavaScript如何实现评论点赞功能”这篇文...
    99+
    2022-10-19
  • php如何实现点赞取消功能
    本篇内容介绍了“php如何实现点赞取消功能”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!php实现点赞取消功能的方法:首先判断用户是否点赞;...
    99+
    2023-06-20
  • 怎么利用Redis实现点赞功能
    这篇文章主要介绍“怎么利用Redis实现点赞功能”,在日常操作中,相信很多人在怎么利用Redis实现点赞功能问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么利用Redis实现点赞功能”的疑惑有所帮助!接下来...
    99+
    2023-07-02
  • Spring Cloud中怎么使用Redis实现点赞和取消点赞功能
    Spring Cloud中怎么使用Redis实现点赞和取消点赞功能,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一、Redis 缓存设计及实现...
    99+
    2022-10-18
  • vue实现文章点赞和差评功能
    本文实例为大家分享了vue实现文章点赞和差评功能的具体代码,供大家参考,具体内容如下 纯前端实现文章点赞与差评(支持与不支持)。 需求:状态1:用户没有操作过,即既没点赞和差评;状态...
    99+
    2022-11-13
  • 基于UIControl控件实现ios点赞功能
    在开发当中,可能很多时候都需要做个点赞的需求,如果用按钮实现,按钮作为一个系统复合控件,外部是一个 View--》UIControl的容器,内部包含了UILabel和UIImage,...
    99+
    2022-05-27
    ios 点赞
  • Springboot+ElementUi实现评论、回复、点赞功能
    目录1.概述2.前端代码1.html2.css3.js4.api调用后台接口3.后端代码1.数据库SQL2.实体类3.daoMapper4.daoMapper实现5.service接...
    99+
    2022-11-13
  • Ajax实现phpcms点赞功能的示例方法
    这篇文章给大家分享的是有关Ajax实现phpcms点赞功能的示例方法的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。首先 是将后台中 模块--->新闻心情--->心情配置  去掉多余的剩一个,...
    99+
    2023-06-08
  • 利用Redis实现点赞功能的示例代码
    目录mysql 和 Redis优缺点1、Redis 缓存设计及实现部分代码如下Redis 存储结构如图2、数据库设计3、开启定时任务持久化存储到数据库部分代码如下提到点赞,大家一想到的是不是就是朋友圈的点赞呀?其实点赞对...
    99+
    2022-06-28
    Redis 点赞功能 Redis 点赞
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作