当前位置: 首页 > news >正文

33.点赞功能

需求:

1.同一个用户只能点赞一次,再次点赞则取消点赞。

2.如果当前用户已经点赞,则点赞按钮高亮显示(前端实现,只需要根据Blog类中的isLike属性表示是否点赞过了)

CREATE TABLE `tb_blog` (`id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',`shop_id` bigint NOT NULL COMMENT '商户id',`user_id` bigint unsigned NOT NULL COMMENT '用户id',`title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '标题',`images` varchar(2048) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '探店的照片,最多9张,多张以","隔开',`content` varchar(2048) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '探店的文字描述',`liked` int unsigned DEFAULT '0' COMMENT '点赞数量',`comments` int unsigned DEFAULT NULL COMMENT '评论数量',`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=COMPACT;
package com.xkj.org.entity;import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;import java.time.LocalDateTime;/*** @author xiankejin* @descrition* @date 2025/10/25*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("tb_blog")
public class Blog {private static final long serialVersionUID = 1L;@TableId(value = "id", type = IdType.AUTO)private Long id;private Long shopId;private Long userId;private String title;/*** 探店的照片,最多9张,多张以","隔开'*/private String images;/*** 探店的文字描述*/private String content;/*** 点赞数量*/private Integer liked;/*** 评论数量*/private Integer comments;private LocalDateTime createTime;private LocalDateTime updateTime;/*** 用户图标*/@TableField(exist = false)private String icon;/*** 用户姓名*/@TableField(exist = false)private String name;/*** 是否点赞过了*/@TableField(exist = false)private Boolean isLike;}

@Overridepublic List<Blog> queryHotBlog(Integer current) {//根据点赞数量倒序排列Page<Blog> page = query().orderByDesc("liked").page(new Page<>(current, UserConstant.MAX_PAGE_SIZE));List<Blog> records = page.getRecords();//这里采用lambda表达式简写records.forEach(this::queryBlogUser);return records;}@Overridepublic Blog detail(Integer id) {Blog blog = getById(id);queryBlogUser(blog);return blog;}@Overridepublic void likeBlog(Integer id) {//1.判断当前用户是否已经点赞UserDTO user = UserHolder.getUser();//这里的userId一定要转成String类型,因为使用的是StringRedisTemplateString key = "blog:liked:" + id.toString();Boolean isMember = stringRedisTemplate.opsForSet().isMember(key, user.getId().toString());//如果未点赞,可以点赞//这里不要直接判断布尔值,而是使用工具类判断,防止isMember对象为null,报空指针异常if (BooleanUtil.isFalse(isMember)) {//数据库点赞数 + 1boolean isSuccess = update().setSql("liked = liked + 1").eq("id", id).update();//数据更新成功了在更新redisif (isSuccess) {//保存用户id到redis的set集合stringRedisTemplate.opsForSet().add(key, user.getId().toString());}} else {//如果点赞,则取消点赞//数据库点赞数 - 1boolean isSuccess = update().setSql("liked = liked - 1").eq("id", id).update();//数据更新成功了在更新redisif (isSuccess) {//将用户id从redis的set集合中移除stringRedisTemplate.opsForSet().remove(key, user.getId().toString());}}}/*** 给BLog对象添加用户信息** @param blog*/private void queryBlogUser(Blog blog) {User user = userService.getById(blog.getUserId());blog.setName(user.getNickName());blog.setIcon(user.getIcon());//查询blog是否被点赞//1.判断当前用户是否已经点赞UserDTO currentUser = UserHolder.getUser();String key = "blog:liked:" + blog.getId().toString();Boolean isMember = stringRedisTemplate.opsForSet().isMember(key, currentUser.getId().toString());blog.setIsLike(BooleanUtil.isTrue(isMember));}
http://www.dtcms.com/a/553673.html

相关文章:

  • 网站怎么快速做排名个人在线免费公司注册
  • 微信官网网站模板百度站长平台网页版
  • 黑马点评学习笔记03(Hutool工具库)
  • 太原模板建站系统无障碍网站建设标准
  • 企业级SQL审核优化工具 PawSQL 介绍(3)- 审核工单管理
  • XML文档差异分析工具:深入解析Word XML结构变化
  • 门户网站域名长治房产网站建设
  • 神经网络如何预测仓库拥堵?
  • 基于EasyExcel的动态列映射读取方案
  • 非凡免费建网站平台大型网站开发项目合同
  • 瑞芯微RK35xx升级RGA驱动版本和API版本
  • C++ 与 Go 相互调用实践指南:基于 SWIG + Director 模式
  • 做音乐的网站设计网站版权设置
  • SAP ABAP 视图表/表 表维护视图字段更新
  • 汇编、反汇编和机器码
  • 网站做跳转链接馆陶网站推广
  • 逻辑回归正则化解释性实验报告:L2 正则对模型系数收缩的可视化分析
  • LeetCode 412 - Fizz Buzz
  • 大型门户网站建设特点怎么知道一个网站是谁做的
  • IDC报告:阿里云市场份额升至26.8%,连续5季度上涨
  • 佛山房地产网站建设51建模网官方网站
  • 字格格子模板合集:多样练字格硬笔书法训练模板(可打印)
  • Arduino ESP32-C3 串口使用注意事项
  • MCP是什么及如何开发一个MCPServer
  • 程序逆向分析
  • 卷绕设备与叠片设备
  • 个人可以做购物网站吗西安曲江文化园区建设开发有限公司网站
  • 网站当前链接深圳坪地网站建设 自助建站 五合一建站平台
  • GD32F407VE天空星开发板的ADC按键(ADKey)的实现
  • 使用 Nginx 轻松处理跨域请求(CORS)