基于java进行点赞功能的实现


1.首先进行建表

大部分点赞都是文章,帖子,或者商品的点赞,然后登录用户进行点赞,创建表的话需要文章,帖子,或者商品的id和用户的id,我这里是文章postId和userId

2.接下来就是代码层面的实现

controller层(PostThumbAddRequest中放的是文章id)

 @PostMapping("/")
    public BaseResponse<Integer> doThumb(@RequestBody PostThumbAddRequest postThumbAddRequest,
            HttpServletRequest request) {
        if (postThumbAddRequest == null || postThumbAddRequest.getPostId() <= 0) {
            throw new BusinessException(ErrorCode.PARAMS_ERROR);
        }
        // 登录才能点赞
        final User loginUser = userService.getLoginUser(request);
        long postId = postThumbAddRequest.getPostId();
        int result = postThumbService.doPostThumb(postId, loginUser);
        return ResultUtils.success(result);
    }

service层

   int doPostThumb(long postId, User loginUser);

serviceImpl层(用户串行点赞必须加锁)

 @Override
    public int doPostThumb(long postId, User loginUser) {
        // 判断实体是否存在,根据类别获取实体
        Post post = postService.getById(postId);
        if (post == null) {
            throw new BusinessException(ErrorCode.NOT_FOUND_ERROR);
        }
        // 是否已点赞
        long userId = loginUser.getId();
        // 每个用户串行点赞
        // 锁必须要包裹住事务方法
        //在同一个类中,非事务方法A调用事务方法B,事务失效,得采用AopContext.currentProxy().xx()来进行调用,事务才能生效。
        PostThumbService postThumbService = (PostThumbService) AopContext.currentProxy();
        synchronized (String.valueOf(userId).intern()) {
            return postThumbService.doPostThumbInner(userId, postId);
        }
    }

doPostThumbInner是对数据库进行操作的,实现如下

   int doPostThumbInner(long userId, long postId);

 封装了事务的方法,出现错误立即回滚。

大概逻辑就是首先判断首先是否已经进行过点赞,如果已经点赞,当用户在进行点赞时,会取消点赞,首先移除点赞表里的信息,如果移除成功,将post里的点赞数进行更新,点赞数必须大于0才能进行减一操作,修改成功返回-1,失败返回0。如果用户未进行点赞更新post里的点赞数,点赞数进行加一操作

 @Override
    @Transactional(rollbackFor = Exception.class)
    public int doPostThumbInner(long userId, long postId) {
        PostThumb postThumb = new PostThumb();
        postThumb.setUserId(userId);
        postThumb.setPostId(postId);
        QueryWrapper<PostThumb> thumbQueryWrapper = new QueryWrapper<>(postThumb);
        PostThumb oldPostThumb = this.getOne(thumbQueryWrapper);
        boolean result;
        // 已点赞
        if (oldPostThumb != null) {
            result = this.remove(thumbQueryWrapper);
            if (result) {
                // 点赞数 - 1
                result = postService.update()
                        .eq("id", postId)
                        //点赞数大于0
                        .gt("thumbNum", 0)
                        .setSql("thumbNum = thumbNum - 1")
                        .update();
                return result ? -1 : 0;
            } else {
                throw new BusinessException(ErrorCode.SYSTEM_ERROR);
            }
        } else {
            // 未点赞
            result = this.save(postThumb);
            if (result) {
                // 点赞数 + 1
                result = postService.update()
                        .eq("id", postId)
                        .setSql("thumbNum = thumbNum + 1")
                        .update();
                //1为ture,0为false,如果更新成功返回1,失败返回0
                return result ? 1 : 0;
            } else {
                throw new BusinessException(ErrorCode.SYSTEM_ERROR);
            }
        }
    }

好了,点赞模块的代码就到这了

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java实现点赞功能的示例: 1. 创建一个点赞表,包含用户ID和被点赞的ID。 ``` CREATE TABLE `like_table` ( `id` int(11) NOT NULL AUTO_INCREMENT, `user_id` int(11) NOT NULL COMMENT '用户ID', `liked_id` int(11) NOT NULL COMMENT '被点赞的ID', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', PRIMARY KEY (`id`), KEY `idx_user_id` (`user_id`), KEY `idx_liked_id` (`liked_id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='点赞表'; ``` 2. 创建点赞服务,提供点赞和取消点赞的接口。 ``` @Service public class LikeService { private final LikeMapper likeMapper; @Autowired public LikeService(LikeMapper likeMapper) { this.likeMapper = likeMapper; } /** * 点赞 * * @param userId 用户ID * @param likedId 被点赞的ID */ public void like(int userId, int likedId) { Like like = new Like(); like.setUserId(userId); like.setLikedId(likedId); likeMapper.insert(like); } /** * 取消点赞 * * @param userId 用户ID * @param likedId 被点赞的ID */ public void unlike(int userId, int likedId) { LikeExample example = new LikeExample(); example.createCriteria() .andUserIdEqualTo(userId) .andLikedIdEqualTo(likedId); likeMapper.deleteByExample(example); } } ``` 3. 创建点赞控制器,处理点赞和取消点赞的请求。 ``` @RestController @RequestMapping("/like") public class LikeController { private final LikeService likeService; @Autowired public LikeController(LikeService likeService) { this.likeService = likeService; } /** * 点赞 * * @param userId 用户ID * @param likedId 被点赞的ID * @return */ @PostMapping("/like") public ResultVO like(@RequestParam("userId") int userId, @RequestParam("likedId") int likedId) { likeService.like(userId, likedId); return ResultVO.success(); } /** * 取消点赞 * * @param userId 用户ID * @param likedId 被点赞的ID * @return */ @PostMapping("/unlike") public ResultVO unlike(@RequestParam("userId") int userId, @RequestParam("likedId") int likedId) { likeService.unlike(userId, likedId); return ResultVO.success(); } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值