diff --git a/src/main/java/com/youlai/boot/mini/controller/StrayAnimalNoteCommentController.java b/src/main/java/com/youlai/boot/mini/controller/StrayAnimalNoteCommentController.java index 077a33c..cac7ac4 100644 --- a/src/main/java/com/youlai/boot/mini/controller/StrayAnimalNoteCommentController.java +++ b/src/main/java/com/youlai/boot/mini/controller/StrayAnimalNoteCommentController.java @@ -1,17 +1,23 @@ package com.youlai.boot.mini.controller; +import com.baomidou.mybatisplus.core.metadata.IPage; import com.youlai.boot.common.annotation.Log; import com.youlai.boot.common.annotation.RepeatSubmit; import com.youlai.boot.common.enums.ActionTypeEnum; import com.youlai.boot.common.enums.LogModuleEnum; import com.youlai.boot.common.result.Result; +import com.youlai.boot.framework.security.util.SecurityUtils; +import com.youlai.boot.mini.model.form.DeleteStrayAnimalNoteCommentForm; import com.youlai.boot.mini.model.form.StrayAnimalNoteCommentForm; +import com.youlai.boot.mini.model.query.AnimalNoteFirstLevelCommentQueryParam; +import com.youlai.boot.mini.model.vo.AnimalNoteFirstLevelCommentVO; import com.youlai.boot.mini.model.vo.StrayAnimalNoteCommentVO; import com.youlai.boot.mini.service.StrayAnimalNoteCommentService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; +import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; @Tag(name = "流浪动物笔记评论相关接口") @@ -33,5 +39,28 @@ public class StrayAnimalNoteCommentController { return Result.success(vo); } + @Operation(summary = "删除笔记评论接口") + @PostMapping(value = "delete") + @PreAuthorize("isAuthenticated()") + @RepeatSubmit + @Log(module = LogModuleEnum.STRAY_ANIMAL_NOTE_COMMENT, value = ActionTypeEnum.DELETE) + public Result deleteNoteComment( + @Valid @RequestBody DeleteStrayAnimalNoteCommentForm formData + ) { + Long userId = SecurityUtils.getUserId(); + strayAnimalNoteCommentService.deleteNoteComment(formData, userId); + return Result.success(); + } + + @Operation(summary = "分页查询笔记一级评论列表接口") + @PostMapping(value = "firstLevel/list") + @Log(module = LogModuleEnum.STRAY_ANIMAL_NOTE_COMMENT, value = ActionTypeEnum.LIST) + public Result> getFirstLevelCommentList( + @Valid @RequestBody AnimalNoteFirstLevelCommentQueryParam queryParam + ) { + Long userId = SecurityUtils.getUserId(); + IPage result = strayAnimalNoteCommentService.getFirstLevelCommentList(queryParam, userId); + return Result.success(result); + } } diff --git a/src/main/java/com/youlai/boot/mini/mapper/MiniStrayAnimalNoteCommentMapper.java b/src/main/java/com/youlai/boot/mini/mapper/MiniStrayAnimalNoteCommentMapper.java index a06dc22..c53c594 100644 --- a/src/main/java/com/youlai/boot/mini/mapper/MiniStrayAnimalNoteCommentMapper.java +++ b/src/main/java/com/youlai/boot/mini/mapper/MiniStrayAnimalNoteCommentMapper.java @@ -1,10 +1,14 @@ package com.youlai.boot.mini.mapper; +import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.youlai.boot.mini.model.entity.MiniStrayAnimalNoteComment; +import com.youlai.boot.mini.model.entity.MiniStrayAnimalNoteCommentLike; +import com.youlai.boot.mini.model.query.AnimalNoteFirstLevelCommentQueryParam; +import com.youlai.boot.mini.model.vo.AnimalNoteFirstLevelCommentVO; +import com.youlai.boot.mini.model.vo.AnimalNoteSecondLevelCommentVO; import org.apache.ibatis.annotations.Param; - -/** +import java.util.List;/** * 流浪动物笔记评论表 Mapper 接口 * * @author jwy @@ -22,4 +26,12 @@ public interface MiniStrayAnimalNoteCommentMapper extends BaseMapper getFirstLevelComment(IPage page, @Param("query") AnimalNoteFirstLevelCommentQueryParam query); + + List batchGetUserCommentLikes(@Param("noteCommentIds") List noteCommentIds, @Param("appUserId") Long appUserId); + } diff --git a/src/main/java/com/youlai/boot/mini/model/form/DeleteStrayAnimalNoteCommentForm.java b/src/main/java/com/youlai/boot/mini/model/form/DeleteStrayAnimalNoteCommentForm.java new file mode 100644 index 0000000..2f59d7c --- /dev/null +++ b/src/main/java/com/youlai/boot/mini/model/form/DeleteStrayAnimalNoteCommentForm.java @@ -0,0 +1,18 @@ +package com.youlai.boot.mini.model.form; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import lombok.Data; + +@Data +@Schema(description = "删除笔记评论请求参数") +public class DeleteStrayAnimalNoteCommentForm { + + @NotBlank(message = "笔记UUID不能为空") + @Schema(description = "笔记UUID", requiredMode = Schema.RequiredMode.REQUIRED, example = "0677d62d63ec693bf1bd6dab8a877dc1") + private String noteUuid; + + @NotBlank(message = "评论UUID不能为空") + @Schema(description = "评论UUID", requiredMode = Schema.RequiredMode.REQUIRED, example = "0677d62d63ec693bf1bd6dab8a877dc2") + private String commentUuid; +} diff --git a/src/main/java/com/youlai/boot/mini/model/query/AnimalNoteFirstLevelCommentQueryParam.java b/src/main/java/com/youlai/boot/mini/model/query/AnimalNoteFirstLevelCommentQueryParam.java new file mode 100644 index 0000000..0990e8b --- /dev/null +++ b/src/main/java/com/youlai/boot/mini/model/query/AnimalNoteFirstLevelCommentQueryParam.java @@ -0,0 +1,18 @@ +package com.youlai.boot.mini.model.query; + +import com.youlai.boot.common.base.BaseQuery; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import lombok.Data; +import lombok.EqualsAndHashCode; + + +@Data +@EqualsAndHashCode(callSuper = true) +@Schema(description = "动物笔记一级评论分页查询参数") +public class AnimalNoteFirstLevelCommentQueryParam extends BaseQuery { + + @NotBlank(message = "笔记UUID不能为空") + @Schema(description = "动物笔记UUID", requiredMode = Schema.RequiredMode.REQUIRED, example = "0677d62d63ec693bf1bd6dab8a877dc1") + private String noteUUId; +} diff --git a/src/main/java/com/youlai/boot/mini/model/vo/AnimalNoteFirstLevelCommentVO.java b/src/main/java/com/youlai/boot/mini/model/vo/AnimalNoteFirstLevelCommentVO.java new file mode 100644 index 0000000..8926e43 --- /dev/null +++ b/src/main/java/com/youlai/boot/mini/model/vo/AnimalNoteFirstLevelCommentVO.java @@ -0,0 +1,51 @@ +package com.youlai.boot.mini.model.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import java.util.Date; + +@Data +@Schema(description = "动物笔记一级评论VO") +public class AnimalNoteFirstLevelCommentVO { + + @Schema(description = "评论UUID") + private String uuid; + + @JsonIgnore + @Schema(hidden = true) + private Long commentId; + + @Schema(description = "评论用户UUID") + private String appUserId; + + @Schema(description = "评论内容") + private String content; + + @Schema(description = "点赞数") + private Long likeCount; + + @Schema(description = "二级评论数量") + private Long secondLevelCount; + + @Schema(description = "创建时间戳") + private Long createTimestamp; + + @Schema(description = "创建时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date createTime; + + @Schema(description = "评论用户头像") + private String avatarUrl; + + @Schema(description = "评论用户昵称") + private String nickname; + + @Schema(description = "是否点赞评论,true点赞,false未点赞") + private Boolean isLiked; + + @Schema(description = "评论用户所在省", example = "福建省") + private String province; + +} diff --git a/src/main/java/com/youlai/boot/mini/model/vo/AnimalNoteSecondLevelCommentVO.java b/src/main/java/com/youlai/boot/mini/model/vo/AnimalNoteSecondLevelCommentVO.java new file mode 100644 index 0000000..37479ca --- /dev/null +++ b/src/main/java/com/youlai/boot/mini/model/vo/AnimalNoteSecondLevelCommentVO.java @@ -0,0 +1,62 @@ +package com.youlai.boot.mini.model.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.Date; + + +@Data +@Schema(description = "动物笔记二级评论VO") +public class AnimalNoteSecondLevelCommentVO { + + @Schema(description = "动物笔记uuid") + private String noteUuId; + + @Schema(description = "动物笔记评论uuid") + private String uuid; + + @Schema(description = "评论用户uuid") + private String miniUserUuId; + + @Schema(description = "评论用户头像") + private String avatarUrl; + + @Schema(description = "评论用户昵称") + private String nickname; + + @Schema(description = "评论内容") + private String content; + + @Schema(description = "父评论ID,0为一级评论") + private Long parentId; + + @Schema(description = "根评论ID,一级评论为自身ID,二级及以上为所属一级评论ID") + private Long rootId; + + @Schema(description = "被回复的用户ID") + private Long replyToUserId; + + @Schema(description = "被回复用户头像") + private String replyToAvatarUrl; + + @Schema(description = "被回复用户昵称") + private String replyToNickname; + + @Schema(description = "点赞数") + private Integer likeCount; + + @Schema(description = "创建时间戳") + private Long createTimestamp; + + @Schema(description = "创建时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date createTime; + + @Schema(description = "是否点赞评论,true点赞,false未点赞") + private Boolean isLiked; + + @Schema(description = "评论用户所在省", example = "福建省") + private String province; +} diff --git a/src/main/java/com/youlai/boot/mini/service/StrayAnimalNoteCommentService.java b/src/main/java/com/youlai/boot/mini/service/StrayAnimalNoteCommentService.java index 2efad53..7df1a60 100644 --- a/src/main/java/com/youlai/boot/mini/service/StrayAnimalNoteCommentService.java +++ b/src/main/java/com/youlai/boot/mini/service/StrayAnimalNoteCommentService.java @@ -1,8 +1,12 @@ package com.youlai.boot.mini.service; +import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.IService; import com.youlai.boot.mini.model.entity.MiniStrayAnimalNoteComment; +import com.youlai.boot.mini.model.form.DeleteStrayAnimalNoteCommentForm; import com.youlai.boot.mini.model.form.StrayAnimalNoteCommentForm; +import com.youlai.boot.mini.model.query.AnimalNoteFirstLevelCommentQueryParam; +import com.youlai.boot.mini.model.vo.AnimalNoteFirstLevelCommentVO; import com.youlai.boot.mini.model.vo.StrayAnimalNoteCommentVO; import jakarta.validation.Valid; @@ -10,4 +14,8 @@ public interface StrayAnimalNoteCommentService extends IService getFirstLevelCommentList(AnimalNoteFirstLevelCommentQueryParam queryParam, Long userId); + } diff --git a/src/main/java/com/youlai/boot/mini/service/impl/StrayAnimalNoteCommentServiceImpl.java b/src/main/java/com/youlai/boot/mini/service/impl/StrayAnimalNoteCommentServiceImpl.java index da950ed..0570f4b 100644 --- a/src/main/java/com/youlai/boot/mini/service/impl/StrayAnimalNoteCommentServiceImpl.java +++ b/src/main/java/com/youlai/boot/mini/service/impl/StrayAnimalNoteCommentServiceImpl.java @@ -1,7 +1,9 @@ package com.youlai.boot.mini.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.IdWorker; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.youlai.boot.common.exception.MsgException; import com.youlai.boot.common.util.HttpContext; @@ -12,7 +14,12 @@ import com.youlai.boot.mini.mapper.MiniStrayAnimalNoteCommentMapper; import com.youlai.boot.mini.mapper.MiniStrayAnimalNoteMapper; import com.youlai.boot.mini.model.entity.MiniStrayAnimalNote; import com.youlai.boot.mini.model.entity.MiniStrayAnimalNoteComment; +import com.youlai.boot.mini.model.entity.MiniStrayAnimalNoteCommentLike; +import com.youlai.boot.mini.model.form.DeleteStrayAnimalNoteCommentForm; import com.youlai.boot.mini.model.form.StrayAnimalNoteCommentForm; +import com.youlai.boot.mini.model.query.AnimalNoteFirstLevelCommentQueryParam; +import com.youlai.boot.mini.model.vo.AnimalNoteFirstLevelCommentVO; +import com.youlai.boot.mini.model.vo.AnimalNoteSecondLevelCommentVO; import com.youlai.boot.mini.model.vo.StrayAnimalNoteCommentVO; import com.youlai.boot.mini.service.StrayAnimalNoteCommentService; import com.youlai.boot.system.mapper.UserMapper; @@ -22,7 +29,9 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.Date; +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; @Slf4j @Service @@ -47,6 +56,39 @@ public class StrayAnimalNoteCommentServiceImpl extends ServiceImpl getFirstLevelCommentList(AnimalNoteFirstLevelCommentQueryParam queryParam, Long userId) { + // 1. 构造分页参数,默认值兼容 + Page page = new Page<>(queryParam.getPageNum(), queryParam.getPageSize()); + + // 2. 查询一级评论分页(SQL已自动统计二级评论数量) + IPage result = baseMapper.getFirstLevelComment(page, queryParam); + List commentList = result.getRecords(); + if (commentList.isEmpty() || userId == null) { + return result; + } + + // 3. 提取一级评论内部主键ID(用于查询点赞状态) + List firstLevelCommentIds = commentList.stream() + .map(AnimalNoteFirstLevelCommentVO::getCommentId) + .collect(Collectors.toList()); + + // 4. 批量查询登录用户的点赞状态 + Map likeStatusMap = Collections.emptyMap(); + try { + List likeList = baseMapper.batchGetUserCommentLikes(firstLevelCommentIds, userId); + likeStatusMap = likeList.stream() + .collect(Collectors.toMap( + MiniStrayAnimalNoteCommentLike::getNoteCommentId, + like -> Boolean.TRUE, + (v1, v2) -> v1 + )); + } catch (Exception e) { + log.error("批量查询评论点赞状态失败,用户ID:{}", userId, e); + } + + // 5. 给每个评论设置点赞状态 + for (AnimalNoteFirstLevelCommentVO comment : commentList) { + Boolean isLiked = likeStatusMap.get(comment.getCommentId()); + comment.setIsLiked(Boolean.TRUE.equals(isLiked)); + } + + return result; + } + } diff --git a/src/main/resources/mapper/mini/MiniStrayAnimalNoteCommentMapper.xml b/src/main/resources/mapper/mini/MiniStrayAnimalNoteCommentMapper.xml index b634a69..12fed01 100644 --- a/src/main/resources/mapper/mini/MiniStrayAnimalNoteCommentMapper.xml +++ b/src/main/resources/mapper/mini/MiniStrayAnimalNoteCommentMapper.xml @@ -44,7 +44,7 @@ SELECT id FROM mini_stray_animal_note_comment WHERE uuid = #{uuid} - AND deleted = 0 + AND is_deleted = 0 LIMIT 1 @@ -53,7 +53,7 @@ SELECT id, note_id, root_id, mini_user_id FROM mini_stray_animal_note_comment WHERE uuid = #{uuid} - AND deleted = 0 + AND is_deleted = 0 LIMIT 1 @@ -62,8 +62,76 @@ SELECT uuid FROM mini_stray_animal_note_comment WHERE id = #{id} - AND deleted = 0 + AND is_deleted = 0 LIMIT 1 + + + UPDATE mini_stray_animal_note_comment c + INNER JOIN mini_stray_animal_note n ON c.note_id = n.id + SET c.is_deleted = 1, + c.update_by = #{userId}, + c.update_time = NOW(), + c.update_timestamp = UNIX_TIMESTAMP(NOW(3)) * 1000 + WHERE n.uuid = #{noteUuid} + AND c.uuid = #{commentUuid} + AND c.is_deleted = 0 + AND n.is_deleted = 0 + AND (c.mini_user_id = #{userId} OR n.mini_user_id = #{userId}) + + + + + UPDATE mini_stray_animal_note + SET comment_count = comment_count - 1 + WHERE id = #{noteId} + AND comment_count > 0 + + + + + + + + diff --git a/src/main/resources/mapper/mini/MiniStrayAnimalNoteMapper.xml b/src/main/resources/mapper/mini/MiniStrayAnimalNoteMapper.xml index 936fd8f..ff50d3c 100644 --- a/src/main/resources/mapper/mini/MiniStrayAnimalNoteMapper.xml +++ b/src/main/resources/mapper/mini/MiniStrayAnimalNoteMapper.xml @@ -7,10 +7,10 @@