xiangpei
2025-05-30 32affb9328997ab51b2c88f7f034c16a1e7ed6d0
评论点赞
10个文件已修改
8个文件已添加
612 ■■■■■ 已修改文件
buyer-api/src/main/java/cn/lili/controller/lmk/VideoCommentController.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/cache/Cache.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/cache/CachePrefix.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/cache/impl/RedisCache.java 40 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/lmk/domain/entity/ThumbsUpRecord.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/lmk/domain/entity/VideoComment.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/lmk/domain/form/ThumbsUpRecordForm.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/lmk/domain/query/ThumbsUpRecordQuery.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/lmk/domain/query/VideoCommentQuery.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/lmk/domain/vo/ThumbsUpRecordVO.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/lmk/domain/vo/VideoCommentVO.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/lmk/mapper/ThumbsUpRecordMapper.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/lmk/service/ThumbsUpRecordService.java 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/lmk/service/VideoCommentService.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/lmk/service/impl/ThumbsUpRecordServiceImpl.java 91 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/lmk/service/impl/VideoCommentServiceImpl.java 88 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/resources/mapper/lmk/ThumbsUpRecordMapper.xml 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/resources/mapper/lmk/VideoCommentMapper.xml 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
buyer-api/src/main/java/cn/lili/controller/lmk/VideoCommentController.java
@@ -2,6 +2,7 @@
import cn.lili.group.Update;
import cn.lili.group.Add;
import cn.lili.modules.lmk.domain.form.ThumbsUpRecordForm;
import org.springframework.validation.annotation.Validated;
import org.springframework.security.access.prepost.PreAuthorize;
import lombok.RequiredArgsConstructor;
@@ -32,6 +33,18 @@
    private final VideoCommentService videoCommentService;
    @PostMapping("/thumbs_up")
    @ApiOperation(value = "点赞评论", notes = "点赞评论")
    public Result thumbsUp(@RequestBody @Validated(Add.class) ThumbsUpRecordForm form) {
        return videoCommentService.thumbsUp(form);
    }
    @PostMapping("/cancel/thumbs_up")
    @ApiOperation(value = "取消点赞评论", notes = "取消点赞评论")
    public Result cancelThumbsUp(@RequestBody @Validated(Add.class) ThumbsUpRecordForm form) {
        return videoCommentService.cancelThumbsUp(form);
    }
    @PostMapping("/comment")
    @ApiOperation(value = "评论", notes = "评论")
    public Result comment(@RequestBody @Validated(Add.class) VideoCommentForm form) {
framework/src/main/java/cn/lili/cache/Cache.java
@@ -228,6 +228,15 @@
     * @return 计数器结果
     */
    Long incr(String key);
    /**
     * redis 自减一
     *
     * @param key
     * @return
     */
    Long decr(String key);
    //-----------------------------------------------redis计数---------------------------------------------
    /**
@@ -302,4 +311,21 @@
     * @return 删除数量
     */
    Long zRemove(String key, String... value);
    /**
     * 设置key过期时间
     *
     * @param key
     * @param timeout 过期时长
     * @param timeUnit 时长单位
     */
    void setExpire(String key, long timeout, TimeUnit timeUnit);
    /**
     * 检查key是否存在
     *
     * @param key
     * @return
     */
    boolean exist(String key);
}
framework/src/main/java/cn/lili/cache/CachePrefix.java
@@ -514,6 +514,11 @@
    SENSITIVE,
    /**
     * 视频评论点赞数量
     */
    VIDEO_COMMENT_LIKE_NUM,
    /**
     * 扫码登录
     *
     * @param str
@@ -536,6 +541,16 @@
    }
    /**
     * 直接把id拼上
     *
     * @param id
     * @return
     */
    public String getPrefixWithId(String id) {
        return "{" + this.name() + "}_" + id;
    }
    /**
     * 通用获取缓存key值
     *
     * @param typeEnum 促销枚举
framework/src/main/java/cn/lili/cache/impl/RedisCache.java
@@ -1,8 +1,8 @@
package cn.lili.cache.impl;
import cn.lili.cache.Cache;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.core.*;
import org.springframework.data.redis.support.atomic.RedisAtomicLong;
@@ -21,14 +21,10 @@
 */
@Slf4j
@Component
@RequiredArgsConstructor
public class RedisCache implements Cache {
    @Autowired
    private RedisTemplate<Object, Object> redisTemplate;
    public RedisCache() {
    }
    private final RedisTemplate<Object, Object> redisTemplate;
    @Override
    public Object get(Object key) {
@@ -226,6 +222,13 @@
        return entityIdCounter.getAndIncrement();
    }
    @Override
    public Long decr(String key) {
        RedisAtomicLong entityIdCounter = new RedisAtomicLong(key, redisTemplate.getConnectionFactory());
        return entityIdCounter.getAndDecrement();
    }
    /**
     * 使用Sorted Set记录keyword
     * zincrby命令,对于一个Sorted Set,存在的就把分数加x(x可自行设定),不存在就创建一个分数为1的成员
@@ -314,4 +317,27 @@
    public Long zRemove(String key, String... value) {
        return redisTemplate.opsForZSet().remove(key, value);
    }
    /**
     * 设置过期时间
     *
     * @param key
     * @param timeout 过期时长
     * @param timeUnit 时长单位
     */
    @Override
    public void setExpire(String key, long timeout, TimeUnit timeUnit) {
        redisTemplate.expire(key, timeout, timeUnit);
    }
    /**
     * 判断某个key是否存在
     *
     * @param key
     * @return
     */
    @Override
    public boolean exist(String key) {
        return redisTemplate.hasKey(key);
    }
}
framework/src/main/java/cn/lili/modules/lmk/domain/entity/ThumbsUpRecord.java
New file
@@ -0,0 +1,32 @@
package cn.lili.modules.lmk.domain.entity;
import cn.lili.mybatis.BaseEntity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import lombok.Data;
/**
 * 点赞表
 *
 * @author xp
 * @since 2025-05-29
 */
@Data
@TableName("lmk_thumbs_up_record")
public class ThumbsUpRecord extends BaseEntity {
    private static final long serialVersionUID = 1L;
    @TableField("ref_id")
    /** 点赞的对象id */
    private String refId;
    @TableField("thumbs_up_type")
    /** 点赞对象类型 */
    private String thumbsUpType;
    @TableField("user_id")
    /** 点赞人 */
    private String userId;
}
framework/src/main/java/cn/lili/modules/lmk/domain/entity/VideoComment.java
@@ -50,6 +50,10 @@
    /** 评论状态 */
    private String status;
    @TableField("thumbs_up_num")
    /** 点赞数量 */
    private Long thumbsUpNum;
    @TableField("user_nickname")
    /** 评论人昵称 */
    private String userNickname;
@@ -57,4 +61,8 @@
    @TableField("user_avatar")
    /** 评论人头像 */
    private String userAvatar;
    @TableField("user_id")
    /** 评论人 */
    private String userId;
}
framework/src/main/java/cn/lili/modules/lmk/domain/form/ThumbsUpRecordForm.java
New file
@@ -0,0 +1,42 @@
package cn.lili.modules.lmk.domain.form;
import cn.lili.group.Update;
import cn.lili.group.Add;
import cn.lili.base.AbsForm;
import cn.lili.modules.lmk.domain.entity.ThumbsUpRecord;
import org.springframework.beans.BeanUtils;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import org.springframework.lang.NonNull;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
/**
 * 点赞表表单
 *
 * @author xp
 * @since 2025-05-29
 */
@Data
@ApiModel(value = "ThumbsUpRecord表单", description = "点赞表表单")
public class ThumbsUpRecordForm extends AbsForm {
    @NotBlank(message = "点赞的对象id不能为空", groups = {Add.class, Update.class})
    @ApiModelProperty("点赞的对象id")
    private String refId;
    @NotBlank(message = "点赞对象类型不能为空", groups = {Add.class, Update.class})
    @ApiModelProperty("点赞对象类型")
    private String thumbsUpType;
    public static ThumbsUpRecord getEntityByForm(@NonNull ThumbsUpRecordForm form, ThumbsUpRecord entity) {
        if(entity == null) {
          entity = new ThumbsUpRecord();
        }
        BeanUtils.copyProperties(form, entity);
        return entity;
    }
}
framework/src/main/java/cn/lili/modules/lmk/domain/query/ThumbsUpRecordQuery.java
New file
@@ -0,0 +1,22 @@
package cn.lili.modules.lmk.domain.query;
import cn.lili.base.AbsQuery;
import java.util.List;
import org.springframework.lang.NonNull;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * 点赞表查询
 *
 * @author xp
 * @since 2025-05-29
 */
@Data
@ApiModel(value = "ThumbsUpRecord查询参数", description = "点赞表查询参数")
public class ThumbsUpRecordQuery extends AbsQuery {
}
framework/src/main/java/cn/lili/modules/lmk/domain/query/VideoCommentQuery.java
@@ -28,5 +28,8 @@
    @ApiModelProperty(hidden = true)
    private String replyId;
    @ApiModelProperty(hidden = true)
    private String userId;
}
framework/src/main/java/cn/lili/modules/lmk/domain/vo/ThumbsUpRecordVO.java
New file
@@ -0,0 +1,42 @@
package cn.lili.modules.lmk.domain.vo;
import cn.lili.base.AbsVo;
import cn.lili.modules.lmk.domain.entity.ThumbsUpRecord;
import java.util.List;
import org.springframework.lang.NonNull;
import org.springframework.beans.BeanUtils;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
/**
 * 点赞表展示
 *
 * @author xp
 * @since 2025-05-29
 */
@Data
@ApiModel(value = "点赞表响应数据", description = "点赞表响应数据")
public class ThumbsUpRecordVO extends AbsVo {
    /** 点赞的对象id */
    @ApiModelProperty("点赞的对象id")
    private String refId;
    /** 点赞对象类型 */
    @ApiModelProperty("点赞对象类型")
    private String thumbsUpType;
    @ApiModelProperty("点赞人")
    private String userId;
    public static ThumbsUpRecordVO getVoByEntity(@NonNull ThumbsUpRecord entity, ThumbsUpRecordVO vo) {
        if(vo == null) {
            vo = new ThumbsUpRecordVO();
        }
        BeanUtils.copyProperties(entity, vo);
        return vo;
    }
}
framework/src/main/java/cn/lili/modules/lmk/domain/vo/VideoCommentVO.java
@@ -56,7 +56,7 @@
    private String userAvatar;
    @ApiModelProperty("评论点赞数")
    private Long thumbsUpCount;
    private Long thumbsUpNum;
    @ApiModelProperty("主评论下面总共有多少条回复")
    private Long replyTotalCount;
@@ -67,6 +67,9 @@
    @ApiModelProperty("是否展开子评论")
    private Boolean expandReply = false;
    @ApiModelProperty("当前用户是否已经点赞")
    private Boolean hasThumbsUp;
    public static VideoCommentVO getVoByEntity(@NonNull VideoComment entity, VideoCommentVO vo) {
        if(vo == null) {
            vo = new VideoCommentVO();
framework/src/main/java/cn/lili/modules/lmk/mapper/ThumbsUpRecordMapper.java
New file
@@ -0,0 +1,34 @@
package cn.lili.modules.lmk.mapper;
import cn.lili.modules.lmk.domain.entity.ThumbsUpRecord;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import cn.lili.modules.lmk.domain.vo.ThumbsUpRecordVO;
import cn.lili.modules.lmk.domain.form.ThumbsUpRecordForm;
import cn.lili.modules.lmk.domain.query.ThumbsUpRecordQuery;
import java.util.List;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
/**
 * 点赞表 Mapper 接口
 *
 * @author xp
 * @since 2025-05-29
 */
@Mapper
public interface ThumbsUpRecordMapper extends BaseMapper<ThumbsUpRecord> {
    /**
     * id查找点赞表
     * @param id
     * @return
     */
    ThumbsUpRecordVO getById(String id);
    /**
    *  分页
    */
    IPage getPage(IPage page, @Param("query") ThumbsUpRecordQuery query);
}
framework/src/main/java/cn/lili/modules/lmk/service/ThumbsUpRecordService.java
New file
@@ -0,0 +1,53 @@
package cn.lili.modules.lmk.service;
import cn.lili.base.Result;
import cn.lili.modules.lmk.domain.entity.ThumbsUpRecord;
import cn.lili.modules.lmk.domain.form.ThumbsUpRecordForm;
import cn.lili.modules.lmk.domain.query.ThumbsUpRecordQuery;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
/**
 * 点赞表 服务类
 *
 * @author xp
 * @since 2025-05-29
 */
public interface ThumbsUpRecordService extends IService<ThumbsUpRecord> {
    /**
     * 批量删除
     * @param ids
     * @return
     */
    Result remove(List<String> ids);
    /**
     * id删除
     * @param id
     * @return
     */
    Result removeById(String id);
    /**
     * 分页查询
     * @param query
     * @return
     */
    Result page(ThumbsUpRecordQuery query);
    /**
     * 根据id查找
     * @param id
     * @return
     */
    Result detail(String id);
    /**
     * 列表
     * @return
     */
    Result all();
}
framework/src/main/java/cn/lili/modules/lmk/service/VideoCommentService.java
@@ -1,6 +1,7 @@
package cn.lili.modules.lmk.service;
import cn.lili.modules.lmk.domain.entity.VideoComment;
import cn.lili.modules.lmk.domain.form.ThumbsUpRecordForm;
import cn.lili.modules.lmk.domain.vo.CollectTypeNumVO;
import com.baomidou.mybatisplus.extension.service.IService;
import cn.lili.base.Result;
@@ -71,4 +72,20 @@
     * @return
     */
    List<CollectTypeNumVO> countNumGroupByVideo();
    /**
     * 点赞评论
     *
     * @param form
     * @return
     */
    Result thumbsUp(ThumbsUpRecordForm form);
    /**
     * 取消点赞评论
     *
     * @param form
     * @return
     */
    Result cancelThumbsUp(ThumbsUpRecordForm form);
}
framework/src/main/java/cn/lili/modules/lmk/service/impl/ThumbsUpRecordServiceImpl.java
New file
@@ -0,0 +1,91 @@
package cn.lili.modules.lmk.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import cn.lili.modules.lmk.domain.entity.ThumbsUpRecord;
import cn.lili.modules.lmk.mapper .ThumbsUpRecordMapper;
import cn.lili.modules.lmk.service.ThumbsUpRecordService;
import cn.lili.base.Result;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import cn.lili.modules.lmk.domain.form.ThumbsUpRecordForm;
import cn.lili.modules.lmk.domain.vo.ThumbsUpRecordVO;
import cn.lili.modules.lmk.domain.query.ThumbsUpRecordQuery;
import org.springframework.stereotype.Service;
import lombok.RequiredArgsConstructor;
import cn.lili.utils.PageUtil;
import org.springframework.beans.BeanUtils;
import org.springframework.util.Assert;
import java.util.List;
import java.util.stream.Collectors;
/**
 * 点赞表 服务实现类
 *
 * @author xp
 * @since 2025-05-29
 */
@Service
@RequiredArgsConstructor
public class ThumbsUpRecordServiceImpl extends ServiceImpl<ThumbsUpRecordMapper, ThumbsUpRecord> implements ThumbsUpRecordService {
    private final ThumbsUpRecordMapper thumbsUpRecordMapper;
    /**
     * 批量删除
     * @param ids
     * @return
     */
    @Override
    public Result remove(List<String> ids) {
        baseMapper.deleteBatchIds(ids);
        return Result.ok("删除成功");
    }
    /**
     * id删除
     * @param id
     * @return
     */
    @Override
    public Result removeById(String id) {
        baseMapper.deleteById(id);
        return Result.ok("删除成功");
    }
    /**
     * 分页查询
     * @param query
     * @return
     */
    @Override
    public Result page(ThumbsUpRecordQuery query) {
        IPage<ThumbsUpRecordVO> page = PageUtil.getPage(query, ThumbsUpRecordVO.class);
        baseMapper.getPage(page, query);
        return Result.ok().data(page.getRecords()).total(page.getTotal());
    }
    /**
     * 根据id查找
     * @param id
     * @return
     */
    @Override
    public Result detail(String id) {
        ThumbsUpRecordVO vo = baseMapper.getById(id);
        Assert.notNull(vo, "记录不存在");
        return Result.ok().data(vo);
    }
    /**
     * 列表
     * @return
     */
    @Override
    public Result all() {
        List<ThumbsUpRecord> entities = baseMapper.selectList(null);
        List<ThumbsUpRecordVO> vos = entities.stream()
                .map(entity -> ThumbsUpRecordVO.getVoByEntity(entity, null))
                .collect(Collectors.toList());
        return Result.ok().data(vos);
    }
}
framework/src/main/java/cn/lili/modules/lmk/service/impl/VideoCommentServiceImpl.java
@@ -1,20 +1,29 @@
package cn.lili.modules.lmk.service.impl;
import cn.lili.cache.Cache;
import cn.lili.cache.CachePrefix;
import cn.lili.common.properties.RocketmqCustomProperties;
import cn.lili.common.security.AuthUser;
import cn.lili.common.security.context.UserContext;
import cn.lili.common.sensitive.SensitiveWordsFilter;
import cn.lili.modules.lmk.domain.entity.ThumbsUpRecord;
import cn.lili.modules.lmk.domain.form.ThumbsUpRecordForm;
import cn.lili.modules.lmk.domain.vo.CollectTypeNumVO;
import cn.lili.modules.lmk.enums.general.VideoCommentStatusEnum;
import cn.lili.modules.lmk.service.ThumbsUpRecordService;
import com.baomidou.mybatisplus.core.metadata.IPage;
import cn.lili.modules.lmk.domain.entity.VideoComment;
import cn.lili.modules.lmk.mapper.VideoCommentMapper;
import cn.lili.modules.lmk.service.VideoCommentService;
import cn.lili.base.Result;
import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import cn.lili.modules.lmk.domain.form.VideoCommentForm;
import cn.lili.modules.lmk.domain.vo.VideoCommentVO;
import cn.lili.modules.lmk.domain.query.VideoCommentQuery;
import org.apache.commons.lang3.StringUtils;
import org.apache.rocketmq.spring.core.RocketMQTemplate;
import org.springframework.stereotype.Service;
import lombok.RequiredArgsConstructor;
import cn.lili.utils.PageUtil;
@@ -24,6 +33,7 @@
import java.util.List;
import java.util.Objects;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
/**
@@ -37,6 +47,15 @@
public class VideoCommentServiceImpl extends ServiceImpl<VideoCommentMapper, VideoComment> implements VideoCommentService {
    private final VideoCommentMapper videoCommentMapper;
    private final Cache cache;
    private final ThumbsUpRecordService thumbsUpRecordService;
    private final RocketMQTemplate rocketMQTemplate;
    private final RocketmqCustomProperties rocketmqCustomProperties;
    /**
     * 评论点赞数的过期时间
     */
    public final static long EXPIRE_TIME = 15l;
    /**
     * 添加
@@ -58,13 +77,14 @@
            }
        }
        VideoComment entity = VideoCommentForm.getEntityByForm(form, null);
        entity.setStatus(VideoCommentStatusEnum.AUDITING.getValue());
        entity.setStatus(VideoCommentStatusEnum.NORMAL.getValue());
        entity.setUserId(UserContext.getCurrentUserId());
        AuthUser currentUser = UserContext.getCurrentUser();
        entity.setUserNickname(currentUser.getNickName());
        entity.setUserAvatar(currentUser.getFace());
        baseMapper.insert(entity);
        // 初始化redis中评论的点赞数量
        cache.put(CachePrefix.VIDEO_COMMENT_LIKE_NUM.getPrefixWithId(entity.getId()), 0, EXPIRE_TIME, TimeUnit.DAYS);
        return Result.ok("添加成功").data(this.detail(entity.getId()).get("data"));
    }
@@ -129,14 +149,21 @@
    @Override
    public Result wxPage(VideoCommentQuery query) {
        query.setUserId(UserContext.getCurrentUserId());
        IPage<VideoCommentVO> page = PageUtil.getPage(query, VideoCommentVO.class);
        if (StringUtils.isNotBlank(query.getMasterCommentId())) {
            // 加载子评论的情况
            baseMapper.replyCommentPage(page, query);
            for (VideoCommentVO comment : page.getRecords()) {
                comment.setThumbsUpNum(this.getCommentThumbsUpNum(comment.getId(), comment.getThumbsUpNum()));
            }
            return Result.ok().data(page.getRecords());
        } else {
            // 加载主评论的情况。主评论id = masterCommentId
            baseMapper.masterCommentPage(page, query);
            for (VideoCommentVO comment : page.getRecords()) {
                comment.setThumbsUpNum(this.getCommentThumbsUpNum(comment.getId(), comment.getThumbsUpNum()));
            }
        }
        return Result.ok().data(page.getRecords()).total(page.getTotal());
    }
@@ -146,4 +173,59 @@
    public List<CollectTypeNumVO> countNumGroupByVideo() {
        return baseMapper.countNumGroupByVideo();
    }
    @Override
    public Result thumbsUp(ThumbsUpRecordForm form) {
        boolean exists = new LambdaQueryChainWrapper<>(thumbsUpRecordService.getBaseMapper())
                .eq(ThumbsUpRecord::getRefId, form.getRefId())
                .eq(ThumbsUpRecord::getUserId, UserContext.getCurrentUserId())
                .exists();
        if (exists) {
            return Result.ok();
        }
        ThumbsUpRecord record = ThumbsUpRecordForm.getEntityByForm(form, null);
        record.setUserId(UserContext.getCurrentUserId());
        thumbsUpRecordService.save(record);
        if (cache.exist(CachePrefix.VIDEO_COMMENT_LIKE_NUM.getPrefixWithId(record.getRefId()))) {
            cache.incr(CachePrefix.VIDEO_COMMENT_LIKE_NUM.getPrefixWithId(record.getRefId()));
        } else {
            VideoComment comment = baseMapper.selectById(form.getRefId());
            if (Objects.nonNull(comment)) {
                cache.put(CachePrefix.VIDEO_COMMENT_LIKE_NUM.getPrefixWithId(comment.getId()), comment.getThumbsUpNum() + 1, EXPIRE_TIME, TimeUnit.DAYS);
            }
        }
        // TODO 使用rocketmq异步写入到mysql中
//        rocketMQTemplate.asyncSend();
        return Result.ok();
    }
    @Override
    public Result cancelThumbsUp(ThumbsUpRecordForm form) {
        new LambdaUpdateChainWrapper<>(thumbsUpRecordService.getBaseMapper())
                .eq(ThumbsUpRecord::getRefId, form.getRefId())
                .eq(ThumbsUpRecord::getThumbsUpType, form.getThumbsUpType())
                .eq(ThumbsUpRecord::getUserId, UserContext.getCurrentUserId())
                .remove();
        // redis数量减一
        cache.decr(CachePrefix.VIDEO_COMMENT_LIKE_NUM.getPrefixWithId(form.getRefId()));
        // TODO mq异步同步到mysql
        return Result.ok();
    }
    /**
     * 从redis中获取评论数量,如果redis中没有则将mysql中的数量写入到redis
     *
     * @param commentId
     * @param mysqlNum
     * @return
     */
    private long getCommentThumbsUpNum(String commentId, long mysqlNum) {
        Object redisNum = cache.get(CachePrefix.VIDEO_COMMENT_LIKE_NUM.getPrefixWithId(commentId));
        if (Objects.isNull(redisNum)) {
            // redis中没有就把数据库的写到redis中
            cache.put(CachePrefix.VIDEO_COMMENT_LIKE_NUM.getPrefixWithId(commentId), mysqlNum, EXPIRE_TIME, TimeUnit.DAYS);
            return mysqlNum;
        }
        return Long.valueOf((Integer) redisNum);
    }
}
framework/src/main/resources/mapper/lmk/ThumbsUpRecordMapper.xml
New file
@@ -0,0 +1,44 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.lili.modules.lmk.mapper.ThumbsUpRecordMapper">
    <!-- 通用查询映射结果 -->
    <resultMap id="BaseResultMap" type="cn.lili.modules.lmk.domain.vo.ThumbsUpRecordVO">
        <id column="id" property="id"/>
        <result column="ref_id" property="refId" />
        <result column="thumbs_up_type" property="thumbsUpType" />
        <result column="user_id" property="userId" />
    </resultMap>
    <select id="getById" resultMap="BaseResultMap">
        SELECT
            LTUR.ref_id,
            LTUR.thumbs_up_type,
            LTUR.user_id,
            LTUR.id
        FROM
            lmk_thumbs_up_record LTUR
        WHERE
            LTUR.id = #{id} AND LTUR.delete_flag = 0
    </select>
    <select id="getPage" resultMap="BaseResultMap">
        SELECT
            LTUR.ref_id,
            LTUR.user_id,
            LTUR.thumbs_up_type,
            LTUR.id
        FROM
            lmk_thumbs_up_record LTUR
        WHERE
            LTUR.delete_flag = 0
    </select>
</mapper>
framework/src/main/resources/mapper/lmk/VideoCommentMapper.xml
@@ -13,11 +13,13 @@
        <result column="reply_user_avatar" property="replyUserAvatar" />
        <result column="master_comment_id" property="masterCommentId" />
        <result column="status" property="status" />
        <result column="create_by" property="userId" />
        <result column="thumbs_up_num" property="thumbsUpNum" />
        <result column="userId" property="userId" />
        <result column="user_nickname" property="userNickname" />
        <result column="user_avatar" property="userAvatar" />
        <result column="create_time" property="createTime" />
        <result column="replyTotalCount" property="replyTotalCount" />
        <result column="has_thumbs_up" property="hasThumbsUp" />
    </resultMap>
@@ -35,8 +37,9 @@
            LVC.reply_user_nickname,
            LVC.master_comment_id,
            LVC.status,
            LVC.thumbs_up_num,
            LVC.id,
            LVC.create_by,
            LVC.user_id,
            LVC.user_nickname,
            LVC.user_avatar,
            LVC.create_time
@@ -56,8 +59,9 @@
            LVC.reply_user_nickname,
            LVC.master_comment_id,
            LVC.status,
            LVC.thumbs_up_num,
            LVC.id,
            LVC.create_by,
            LVC.user_id,
            LVC.user_nickname,
            LVC.user_avatar,
            LVC.create_time
@@ -78,18 +82,21 @@
            LVC.reply_user_avatar,
            LVC.master_comment_id,
            LVC.status,
            LVC.thumbs_up_num,
            LVC.id,
            LVC.create_by,
            LVC.user_id,
            LVC.user_nickname,
            LVC.user_avatar,
            LVC.create_time,
            COUNT(replies.id) as replyTotalCount
            COUNT(replies.id) as replyTotalCount,
            CASE
                WHEN TUC.id IS NOT NULL THEN 1
                ELSE 0
                END AS has_thumbs_up
        FROM
            lmk_video_comment LVC
                LEFT JOIN
            lmk_video_comment replies ON replies.master_comment_id = LVC.id
                AND replies.status = 'normal'
                AND replies.delete_flag = 0
                LEFT JOIN lmk_video_comment replies ON replies.master_comment_id = LVC.id AND replies.status = 'normal' AND replies.delete_flag = 0
                LEFT JOIN lmk_thumbs_up_record TUC ON LVC.id = TUC.ref_id AND TUC.thumbs_up_type = 'video_comment' AND TUC.user_id = #{query.userId} AND TUC.delete_flag = 0
        WHERE
            LVC.master_comment_id IS NULL
          AND LVC.video_id = #{query.videoId}
@@ -98,7 +105,7 @@
        GROUP BY
            LVC.id, LVC.video_id, LVC.comment_content, LVC.reply_id,
            LVC.reply_user_id, LVC.reply_user_nickname, LVC.master_comment_id,
            LVC.status, LVC.create_by, LVC.user_nickname, LVC.user_avatar, LVC.create_time
            LVC.status, LVC.user_id, LVC.user_nickname, LVC.user_avatar, LVC.create_time
        ORDER BY
            LVC.create_time DESC
    </select>
@@ -113,14 +120,20 @@
            LVC.reply_user_avatar,
            LVC.master_comment_id,
            LVC.status,
            LVC.thumbs_up_num,
            LVC.id,
            LVC.create_by,
            LVC.user_id,
            LVC.user_nickname,
            LVC.user_avatar,
            LVC.create_time,
            0 as replyTotalCount
            0 as replyTotalCount,
            CASE
                WHEN TUC.id IS NOT NULL THEN 1
                ELSE 0
                END AS has_thumbs_up
        FROM
            lmk_video_comment LVC
                LEFT JOIN lmk_thumbs_up_record TUC ON LVC.id = TUC.ref_id AND TUC.thumbs_up_type = 'video_comment' AND TUC.user_id = #{query.userId} AND TUC.delete_flag = 0
        WHERE
              LVC.video_id = #{query.videoId}
              AND LVC.master_comment_id = #{query.masterCommentId}