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}