From 7e5e1873b66618d296cff4ddbb86add6f3f614a7 Mon Sep 17 00:00:00 2001 From: glx <783262171@qq.com> Date: Thu, 21 May 2026 14:53:09 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E9=A2=86=E5=85=BB=E6=97=A5?= =?UTF-8?q?=E8=AE=B0=E6=9F=A5=E8=AF=A2=E7=82=B9=E8=B5=9E=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../freemarker/MyBatisPlusGenerator.java | 4 + .../controller/AdoptionDiaryController.java | 30 ++- .../MiniAdoptionDiaryCollectMapper.java | 14 ++ .../mapper/MiniAdoptionDiaryLikeMapper.java | 20 ++ .../mini/mapper/MiniAdoptionDiaryMapper.java | 12 +- .../mapper/MiniAdoptionDiaryMediaMapper.java | 8 +- .../mapper/MiniAdoptionDiaryViewMapper.java | 15 ++ .../entity/MiniAdoptionDiaryCollect.java | 70 +++++++ .../model/entity/MiniAdoptionDiaryLike.java | 70 +++++++ .../model/entity/MiniAdoptionDiaryView.java | 57 +++++ .../boot/mini/model/form/DiaryLikeForm.java | 14 ++ .../mini/service/AdoptionDiaryService.java | 7 +- .../impl/AdoptionDiaryServiceImpl.java | 195 +++++++++++++++++- .../mini/MiniAdoptionDiaryCollectMapper.xml | 9 + .../mini/MiniAdoptionDiaryLikeMapper.xml | 41 ++++ .../mapper/mini/MiniAdoptionDiaryMapper.xml | 81 +++----- .../mini/MiniAdoptionDiaryMediaMapper.xml | 16 ++ .../mini/MiniAdoptionDiaryViewMapper.xml | 19 ++ 18 files changed, 613 insertions(+), 69 deletions(-) create mode 100644 src/main/java/com/youlai/boot/mini/mapper/MiniAdoptionDiaryCollectMapper.java create mode 100644 src/main/java/com/youlai/boot/mini/mapper/MiniAdoptionDiaryLikeMapper.java create mode 100644 src/main/java/com/youlai/boot/mini/mapper/MiniAdoptionDiaryViewMapper.java create mode 100644 src/main/java/com/youlai/boot/mini/model/entity/MiniAdoptionDiaryCollect.java create mode 100644 src/main/java/com/youlai/boot/mini/model/entity/MiniAdoptionDiaryLike.java create mode 100644 src/main/java/com/youlai/boot/mini/model/entity/MiniAdoptionDiaryView.java create mode 100644 src/main/java/com/youlai/boot/mini/model/form/DiaryLikeForm.java create mode 100644 src/main/resources/mapper/mini/MiniAdoptionDiaryCollectMapper.xml create mode 100644 src/main/resources/mapper/mini/MiniAdoptionDiaryLikeMapper.xml create mode 100644 src/main/resources/mapper/mini/MiniAdoptionDiaryViewMapper.xml diff --git a/src/main/java/com/youlai/boot/codegen/freemarker/MyBatisPlusGenerator.java b/src/main/java/com/youlai/boot/codegen/freemarker/MyBatisPlusGenerator.java index d0b3131..394c241 100644 --- a/src/main/java/com/youlai/boot/codegen/freemarker/MyBatisPlusGenerator.java +++ b/src/main/java/com/youlai/boot/codegen/freemarker/MyBatisPlusGenerator.java @@ -106,6 +106,10 @@ public class MyBatisPlusGenerator { ,new TableConfig("mini_stray_animal_note_view", IdType.AUTO, "mini") ,new TableConfig("mini_adoption_diary", IdType.AUTO, "mini") ,new TableConfig("mini_adoption_diary_media", IdType.AUTO, "mini") + ,new TableConfig("mini_adoption_diary_view", IdType.AUTO, "mini") + ,new TableConfig("mini_adoption_diary_like", IdType.AUTO, "mini") + ,new TableConfig("mini_adoption_diary_like", IdType.AUTO, "mini") + ,new TableConfig("mini_adoption_diary_collect", IdType.AUTO, "mini") // ,new TableConfig("mini_stray_animal", IdType.AUTO, "mini") // ,new TableConfig("mini_stray_animal", IdType.INPUT, "minitest") diff --git a/src/main/java/com/youlai/boot/mini/controller/AdoptionDiaryController.java b/src/main/java/com/youlai/boot/mini/controller/AdoptionDiaryController.java index 99607e9..a0e4338 100644 --- a/src/main/java/com/youlai/boot/mini/controller/AdoptionDiaryController.java +++ b/src/main/java/com/youlai/boot/mini/controller/AdoptionDiaryController.java @@ -9,20 +9,26 @@ import com.youlai.boot.common.result.Result; import com.youlai.boot.framework.security.util.SecurityUtils; import com.youlai.boot.mini.model.dto.*; import com.youlai.boot.mini.model.form.AdoptionDiaryForm; +import com.youlai.boot.mini.model.form.DiaryLikeForm; +import com.youlai.boot.mini.model.form.NoteLikeForm; import com.youlai.boot.mini.model.query.OwnAdoptionDiaryQuery; +import com.youlai.boot.mini.model.query.OwnStrayAnimalQuery; import com.youlai.boot.mini.model.vo.AdoptionDiaryVO; import com.youlai.boot.mini.model.vo.AdoptionDiaryDetailsVO; +import com.youlai.boot.mini.model.vo.StrayAnimalShortVO; import com.youlai.boot.mini.service.AdoptionDiaryService; 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.http.MediaType; +import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import java.util.List; +import java.util.Map; @Tag(name = "领养日记的相关接口") @RestController @@ -126,6 +132,28 @@ public class AdoptionDiaryController { public Result getDetails( @PathVariable String diaryUuid){ return Result.success(adoptionDiaryService.getDetails(diaryUuid, SecurityUtils.getUserId())); - } // 待修改 + } + + @Operation(summary = "获取某个用户创建的领养日记列表") + @GetMapping(value = "/getOthersCreatedPage/{authorUuid}") + public PageResult getOthersCreatedPage( + @PathVariable String authorUuid, + OwnAdoptionDiaryQuery queryParams + ) { + return PageResult.success(adoptionDiaryService.getOthersCreatedPage(authorUuid, queryParams)); + } + + @Operation(summary = "领养日记点赞/取消点赞接口") + @PostMapping(value = "/diary/like/toggle") + @PreAuthorize("isAuthenticated()") + @Log(module = LogModuleEnum.ADOPTION_DIARY_INFO, value = ActionTypeEnum.UPDATE) + public Result> toggleDiaryLike( + @Valid @RequestBody DiaryLikeForm form + ) { + Long userId = SecurityUtils.getUserId(); + Map result = adoptionDiaryService.toggleDiaryLike(form, userId); + return Result.success(result); + } + } diff --git a/src/main/java/com/youlai/boot/mini/mapper/MiniAdoptionDiaryCollectMapper.java b/src/main/java/com/youlai/boot/mini/mapper/MiniAdoptionDiaryCollectMapper.java new file mode 100644 index 0000000..eef61fc --- /dev/null +++ b/src/main/java/com/youlai/boot/mini/mapper/MiniAdoptionDiaryCollectMapper.java @@ -0,0 +1,14 @@ +package com.youlai.boot.mini.mapper; + +import com.youlai.boot.mini.model.entity.MiniAdoptionDiaryCollect; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** +* 领养日记收藏表 Mapper 接口 +* +* @author jwy +* @since +*/ +public interface MiniAdoptionDiaryCollectMapper extends BaseMapper { + +} diff --git a/src/main/java/com/youlai/boot/mini/mapper/MiniAdoptionDiaryLikeMapper.java b/src/main/java/com/youlai/boot/mini/mapper/MiniAdoptionDiaryLikeMapper.java new file mode 100644 index 0000000..3492ec6 --- /dev/null +++ b/src/main/java/com/youlai/boot/mini/mapper/MiniAdoptionDiaryLikeMapper.java @@ -0,0 +1,20 @@ +package com.youlai.boot.mini.mapper; + +import com.youlai.boot.mini.model.entity.MiniAdoptionDiaryLike; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Param; + +/** +* 领养日记点赞表 Mapper 接口 +* +* @author jwy +* @since +*/ +public interface MiniAdoptionDiaryLikeMapper extends BaseMapper { + + Integer selectUserLikeCount(@Param("diaryId") Long diaryId, @Param("userId") Long userId); + + void insertOrUpdateLike(MiniAdoptionDiaryLike like); + + void deleteLike(@Param("diaryId") Long diaryId, @Param("userId") Long userId, @Param("currentTime") long currentTime); +} diff --git a/src/main/java/com/youlai/boot/mini/mapper/MiniAdoptionDiaryMapper.java b/src/main/java/com/youlai/boot/mini/mapper/MiniAdoptionDiaryMapper.java index e343283..31b0431 100644 --- a/src/main/java/com/youlai/boot/mini/mapper/MiniAdoptionDiaryMapper.java +++ b/src/main/java/com/youlai/boot/mini/mapper/MiniAdoptionDiaryMapper.java @@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.youlai.boot.mini.model.query.OwnAdoptionDiaryQuery; import com.youlai.boot.mini.model.vo.AdoptionDiaryDetailsVO; import com.youlai.boot.mini.model.vo.AdoptionDiaryVO; +import jakarta.validation.constraints.NotBlank; import org.apache.ibatis.annotations.Param; /** @@ -22,9 +23,12 @@ public interface MiniAdoptionDiaryMapper extends BaseMapper { */ IPage getDiaryPage(Page page, @Param("query") OwnAdoptionDiaryQuery query); - /** - * 查询领养日记详情 - */ - AdoptionDiaryDetailsVO getDiaryDetails(@Param("diaryUuid") String diaryUuid, @Param("miniUserId") Long miniUserId); + Long selectIdByUuid(String diaryUuid); + + void incrementLikeCount(@Param("diaryId") Long diaryId); + + void decrementLikeCount(@Param("diaryId") Long diaryId); + + Long selectLikeCount(@Param("diaryId") Long diaryId); } diff --git a/src/main/java/com/youlai/boot/mini/mapper/MiniAdoptionDiaryMediaMapper.java b/src/main/java/com/youlai/boot/mini/mapper/MiniAdoptionDiaryMediaMapper.java index 73da2b0..5553613 100644 --- a/src/main/java/com/youlai/boot/mini/mapper/MiniAdoptionDiaryMediaMapper.java +++ b/src/main/java/com/youlai/boot/mini/mapper/MiniAdoptionDiaryMediaMapper.java @@ -2,13 +2,19 @@ package com.youlai.boot.mini.mapper; import com.youlai.boot.mini.model.entity.MiniAdoptionDiaryMedia; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.youlai.boot.mini.model.vo.MiniAdoptionDiaryMediaVO; + +import java.util.List; +import java.util.Map; /** * 领养日记资源表 Mapper 接口 * * @author jwy -* @since +* @since */ public interface MiniAdoptionDiaryMediaMapper extends BaseMapper { + List getMediaByDiaryIdAndType(Map param); + } diff --git a/src/main/java/com/youlai/boot/mini/mapper/MiniAdoptionDiaryViewMapper.java b/src/main/java/com/youlai/boot/mini/mapper/MiniAdoptionDiaryViewMapper.java new file mode 100644 index 0000000..0c52403 --- /dev/null +++ b/src/main/java/com/youlai/boot/mini/mapper/MiniAdoptionDiaryViewMapper.java @@ -0,0 +1,15 @@ +package com.youlai.boot.mini.mapper; + +import com.youlai.boot.mini.model.entity.MiniAdoptionDiaryView; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** +* 领养日记浏览记录表 Mapper 接口 +* +* @author jwy +* @since +*/ +public interface MiniAdoptionDiaryViewMapper extends BaseMapper { + + void insertOrUpdateView(MiniAdoptionDiaryView view); +} diff --git a/src/main/java/com/youlai/boot/mini/model/entity/MiniAdoptionDiaryCollect.java b/src/main/java/com/youlai/boot/mini/model/entity/MiniAdoptionDiaryCollect.java new file mode 100644 index 0000000..1f6123b --- /dev/null +++ b/src/main/java/com/youlai/boot/mini/model/entity/MiniAdoptionDiaryCollect.java @@ -0,0 +1,70 @@ +package com.youlai.boot.mini.model.entity; + +import com.baomidou.mybatisplus.annotation.*; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +@Getter +@Setter +@ToString +@Accessors(chain = true) +@TableName("mini_adoption_diary_collect") +@Schema(description = "领养日记收藏表") +public class MiniAdoptionDiaryCollect implements Serializable { + + @TableId(value = "id", type = IdType.AUTO) + @Schema(description = "领养日记收藏表主键id") + private Long id; + + + @TableField("uuid") + @Schema(description = "uuid唯一标识,前后端用这个进行数据交互") + private String uuid; + + @TableField("diary_id") + @Schema(description = "领养日记id") + private Long diaryId; + + @TableField("mini_user_id") + @Schema(description = "收藏用户id") + private Long miniUserId; + + @TableField("create_time") + @Schema(description = "创建时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date createTime; + + @TableField("create_timestamp") + @Schema(description = "创建时间毫秒级时间戳") + private Long createTimestamp; + + @TableField("create_by") + @Schema(description = "创建人ID") + private Long createBy; + + @TableField("update_time") + @Schema(description = "更新时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date updateTime; + + @TableField("update_timestamp") + @Schema(description = "更新时间毫秒级时间戳") + private Long updateTimestamp; + + @TableField("update_by") + @Schema(description = "修改人ID") + private Long updateBy; + + @TableField("is_deleted") + @Schema(description = "逻辑删除标识(0-未删除 1-已删除)") + private Boolean deleted; + + +} diff --git a/src/main/java/com/youlai/boot/mini/model/entity/MiniAdoptionDiaryLike.java b/src/main/java/com/youlai/boot/mini/model/entity/MiniAdoptionDiaryLike.java new file mode 100644 index 0000000..1598072 --- /dev/null +++ b/src/main/java/com/youlai/boot/mini/model/entity/MiniAdoptionDiaryLike.java @@ -0,0 +1,70 @@ +package com.youlai.boot.mini.model.entity; + +import com.baomidou.mybatisplus.annotation.*; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +@Getter +@Setter +@ToString +@Accessors(chain = true) +@TableName("mini_adoption_diary_like") +@Schema(description = "领养日记点赞表") +public class MiniAdoptionDiaryLike implements Serializable { + + @TableId(value = "id", type = IdType.AUTO) + @Schema(description = "领养日记点赞表主键id") + private Long id; + + + @TableField("uuid") + @Schema(description = "uuid唯一标识,前后端用这个进行数据交互") + private String uuid; + + @TableField("diary_id") + @Schema(description = "日记id") + private Long diaryId; + + @TableField("mini_user_id") + @Schema(description = "点赞用户id") + private Long miniUserId; + + @TableField("create_time") + @Schema(description = "创建时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date createTime; + + @TableField("create_timestamp") + @Schema(description = "创建时间毫秒级时间戳") + private Long createTimestamp; + + @TableField("create_by") + @Schema(description = "创建人ID") + private Long createBy; + + @TableField("update_time") + @Schema(description = "更新时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date updateTime; + + @TableField("update_timestamp") + @Schema(description = "更新时间毫秒级时间戳") + private Long updateTimestamp; + + @TableField("update_by") + @Schema(description = "修改人ID") + private Long updateBy; + + @TableField("is_deleted") + @Schema(description = "逻辑删除标识(0-未删除 1-已删除)") + private Boolean deleted; + + +} diff --git a/src/main/java/com/youlai/boot/mini/model/entity/MiniAdoptionDiaryView.java b/src/main/java/com/youlai/boot/mini/model/entity/MiniAdoptionDiaryView.java new file mode 100644 index 0000000..fdac702 --- /dev/null +++ b/src/main/java/com/youlai/boot/mini/model/entity/MiniAdoptionDiaryView.java @@ -0,0 +1,57 @@ +package com.youlai.boot.mini.model.entity; + +import com.baomidou.mybatisplus.annotation.*; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +@Getter +@Setter +@ToString +@Accessors(chain = true) +@TableName("mini_adoption_diary_view") +@Schema(description = "领养日记浏览记录表") +public class MiniAdoptionDiaryView implements Serializable { + + @TableId(value = "id", type = IdType.AUTO) + @Schema(description = "领养日记浏览记录主键id") + private Long id; + + + @TableField("uuid") + @Schema(description = "uuid唯一标识,前后端用这个进行数据交互") + private String uuid; + + @TableField("mini_user_id") + @Schema(description = "用户ID") + private Long miniUserId; + + @TableField("diary_id") + @Schema(description = "日记ID") + private Long diaryId; + + @TableField("create_time") + @Schema(description = "创建时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date createTime; + + @TableField("create_timestamp") + @Schema(description = "创建时间毫秒级时间戳") + private Long createTimestamp; + + @TableField("create_by") + @Schema(description = "创建人ID") + private Long createBy; + + @TableField("is_deleted") + @Schema(description = "逻辑删除标识(0-未删除 1-已删除)") + private Boolean deleted; + + +} diff --git a/src/main/java/com/youlai/boot/mini/model/form/DiaryLikeForm.java b/src/main/java/com/youlai/boot/mini/model/form/DiaryLikeForm.java new file mode 100644 index 0000000..afb97a0 --- /dev/null +++ b/src/main/java/com/youlai/boot/mini/model/form/DiaryLikeForm.java @@ -0,0 +1,14 @@ +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 DiaryLikeForm { + + @NotBlank(message = "日记UUID不能为空") + @Schema(description = "日记UUID", requiredMode = Schema.RequiredMode.REQUIRED, example = "a1b2c3d4e5f6g7h8i9j0") + private String diaryUuid; +} diff --git a/src/main/java/com/youlai/boot/mini/service/AdoptionDiaryService.java b/src/main/java/com/youlai/boot/mini/service/AdoptionDiaryService.java index 262beee..5648851 100644 --- a/src/main/java/com/youlai/boot/mini/service/AdoptionDiaryService.java +++ b/src/main/java/com/youlai/boot/mini/service/AdoptionDiaryService.java @@ -7,6 +7,7 @@ import com.youlai.boot.mini.model.dto.DeleteAdoptionDiaryMediaDTO; import com.youlai.boot.mini.model.dto.EditVisibilityDTO; import com.youlai.boot.mini.model.entity.MiniAdoptionDiary; import com.youlai.boot.mini.model.form.AdoptionDiaryForm; +import com.youlai.boot.mini.model.form.DiaryLikeForm; import com.youlai.boot.mini.model.query.OwnAdoptionDiaryQuery; import com.youlai.boot.mini.model.vo.AdoptionDiaryDetailsVO; import com.youlai.boot.mini.model.vo.AdoptionDiaryVO; @@ -16,6 +17,7 @@ import jakarta.validation.Valid; import org.springframework.web.multipart.MultipartFile; import java.util.List; +import java.util.Map; public interface AdoptionDiaryService extends IService { @@ -35,6 +37,9 @@ public interface AdoptionDiaryService extends IService { IPage getSelfCreatedPage(OwnAdoptionDiaryQuery queryParams); - AdoptionDiaryDetailsVO getDetails(String diaryUuid, Long userId); + AdoptionDiaryDetailsVO getDetails(String diaryUuid, Long miniUserId); + IPage getOthersCreatedPage(String authorUuid, OwnAdoptionDiaryQuery queryParams); + + Map toggleDiaryLike(@Valid DiaryLikeForm form, Long userId); } diff --git a/src/main/java/com/youlai/boot/mini/service/impl/AdoptionDiaryServiceImpl.java b/src/main/java/com/youlai/boot/mini/service/impl/AdoptionDiaryServiceImpl.java index d485ac4..84ae704 100644 --- a/src/main/java/com/youlai/boot/mini/service/impl/AdoptionDiaryServiceImpl.java +++ b/src/main/java/com/youlai/boot/mini/service/impl/AdoptionDiaryServiceImpl.java @@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +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; @@ -14,23 +15,29 @@ import com.youlai.boot.common.util.JavaVCUtils; import com.youlai.boot.common.util.RandomNumberUtils; import com.youlai.boot.file.service.impl.AliyunFileService; import com.youlai.boot.framework.security.util.SecurityUtils; +import com.youlai.boot.mini.mapper.MiniAdoptionDiaryLikeMapper; import com.youlai.boot.mini.mapper.MiniAdoptionDiaryMapper; import com.youlai.boot.mini.mapper.MiniAdoptionDiaryMediaMapper; +import com.youlai.boot.mini.mapper.MiniAdoptionDiaryViewMapper; import com.youlai.boot.mini.model.dto.DeleteAdoptionDiaryDTO; import com.youlai.boot.mini.model.dto.DeleteAdoptionDiaryMediaDTO; import com.youlai.boot.mini.model.dto.EditVisibilityDTO; -import com.youlai.boot.mini.model.entity.MiniAdoptionDiary; -import com.youlai.boot.mini.model.entity.MiniAdoptionDiaryMedia; +import com.youlai.boot.mini.model.entity.*; import com.youlai.boot.mini.model.enums.AnimalNoteMediaTypeEnum; import com.youlai.boot.mini.model.form.AdoptionDiaryForm; +import com.youlai.boot.mini.model.form.DiaryLikeForm; import com.youlai.boot.mini.model.query.OwnAdoptionDiaryQuery; -import com.youlai.boot.mini.model.vo.AdoptionDiaryDetailsVO; -import com.youlai.boot.mini.model.vo.AdoptionDiaryVO; +import com.youlai.boot.mini.model.vo.*; import com.youlai.boot.mini.service.AdoptionDiaryService; +import com.youlai.boot.system.mapper.UserMapper; +import com.youlai.boot.system.model.entity.SysUser; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.FilenameUtils; +import org.redisson.api.RBloomFilter; +import org.redisson.api.RedissonClient; import org.springframework.beans.factory.annotation.Value; +import org.springframework.dao.DuplicateKeyException; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; @@ -38,10 +45,8 @@ import org.springframework.web.multipart.MultipartFile; import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.File; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; -import java.util.UUID; +import java.util.*; +import java.util.concurrent.TimeUnit; @Slf4j @Service @@ -50,6 +55,15 @@ public class AdoptionDiaryServiceImpl extends ServiceImpl getDiaryPage(OwnAdoptionDiaryQuery queryParams) { int pageNum = queryParams.getPageNum(); int pageSize = queryParams.getPageSize(); Page page = new Page<>(pageNum, pageSize); @@ -395,9 +422,155 @@ public class AdoptionDiaryServiceImpl extends ServiceImpl getOthersCreatedPage(String authorUuid, OwnAdoptionDiaryQuery queryParams) { + SysUser sysUser = userMapper.selectOne(new LambdaQueryWrapper() + .eq(SysUser::getUuid, authorUuid) + .eq(SysUser::getIsDeleted, 0)); + if (sysUser == null) { + throw new MsgException("用户不存在"); + } + + queryParams.setMiniUserId(SecurityUtils.getUserId()); + queryParams.setCreatorId(sysUser.getId()); + return getDiaryPage(queryParams); + } + + @Override + public AdoptionDiaryDetailsVO getDetails(String diaryUuid, Long miniUserId) { + // 校验动物是否存在 + MiniAdoptionDiary diary = getValidDiary(diaryUuid); + + AdoptionDiaryDetailsVO adoptionDiaryDetailsVO = new AdoptionDiaryDetailsVO(); + + if (diary != null) { + Map param = new HashMap<>(); + param.put("diaryId", diary.getId()); + + param.put("mediaType", AnimalNoteMediaTypeEnum.IMAGE.name().toLowerCase()); + List images = miniAdoptionDiaryMediaMapper.getMediaByDiaryIdAndType(param); + if (CollectionUtils.isNotEmpty(images)) { + images.forEach(item -> { + item.setDiaryUuid(diary.getUuid()); + }); + } + + param.put("mediaType", AnimalNoteMediaTypeEnum.VIDEO.name().toLowerCase()); + List videos = miniAdoptionDiaryMediaMapper.getMediaByDiaryIdAndType(param); + if (CollectionUtils.isNotEmpty(videos)) { + videos.forEach(item -> { + item.setDiaryUuid(diary.getUuid()); + }); + } + + adoptionDiaryDetailsVO.setImages(images); + adoptionDiaryDetailsVO.setVideos(videos); + } + + // 记录用户浏览历史 + if (miniUserId != null && diary != null) { + Long diaryId = diary.getId(); + long currentTime = System.currentTimeMillis(); + // 1. 写数据库 + try { + MiniAdoptionDiaryView view = new MiniAdoptionDiaryView(); + view.setUuid(IdWorker.get32UUID()); + view.setMiniUserId(miniUserId); + view.setDiaryId(diaryId); + view.setCreateTimestamp(currentTime); + view.setCreateTime(new Date(currentTime)); + view.setCreateBy(miniUserId); + miniAdoptionDiaryViewMapper.insertOrUpdateView(view); + } catch (DuplicateKeyException e) { + log.debug("用户已浏览过该领养日记,userId:{}, diaryId:{}", miniUserId, diaryId); + } catch (Exception e) { + log.error("记录浏览历史到数据库失败,userId:{}, diaryId:{}", miniUserId, diaryId, e); + } + + // 2. 写布隆过滤器 + try { + String bloomKey = BLOOM_VIEW_KEY_PREFIX + miniUserId; + RBloomFilter bloomFilter = redissonClient.getBloomFilter(bloomKey); + if (!bloomFilter.isExists()) { + // 初始化新布隆,用配置的参数 + bloomFilter.tryInit(bloomExpectedInsertions, bloomFpp); + // 只有配置了过期时间且大于0时才设置,否则永久有效 + if (bloomExpireDays != null && bloomExpireDays > 0) { + bloomFilter.expire(bloomExpireDays, TimeUnit.DAYS); + } + } + bloomFilter.add(diaryId); + } catch (Exception e) { + log.error("记录浏览历史到布隆失败,userId:{}, noteId:{}", miniUserId, diaryId, e); + } + } + + return adoptionDiaryDetailsVO; + } + + private MiniAdoptionDiary getValidDiary(String diaryUuid) { + MiniAdoptionDiary diary = baseMapper.selectOne( + new LambdaQueryWrapper() + .eq(MiniAdoptionDiary::getUuid, diaryUuid) + .eq(MiniAdoptionDiary::getDeleted, 0) + ); + + if (diary == null) { + throw new MsgException("日记不存在"); + } + + return diary; + } + + + @Override + public Map toggleDiaryLike(DiaryLikeForm form, Long userId) { + Long diaryId = baseMapper.selectIdByUuid(form.getDiaryUuid()); + if (diaryId == null) { + throw new MsgException("日记不存在或已删除"); + } + + long currentTime = System.currentTimeMillis(); + Boolean currentLiked; + + Integer count = miniAdoptionDiaryLikeMapper.selectUserLikeCount(diaryId, userId); + if (count != null && count > 0) { + currentLiked = true; + } else { + currentLiked = false; + } + + boolean targetLike = !currentLiked; + + if (targetLike) { + if (!Boolean.TRUE.equals(currentLiked)) { + MiniAdoptionDiaryLike like = new MiniAdoptionDiaryLike(); + like.setUuid(IdWorker.get32UUID()); + like.setDiaryId(diaryId); + like.setMiniUserId(userId); + like.setCreateBy(userId); + like.setCreateTimestamp(currentTime); + like.setCreateTime(new Date(currentTime)); + like.setUpdateBy(userId); + like.setUpdateTimestamp(currentTime); + like.setUpdateTime(new Date(currentTime)); + like.setDeleted(false); + miniAdoptionDiaryLikeMapper.insertOrUpdateLike(like); + + baseMapper.incrementLikeCount(diaryId); + } + } else { + if (Boolean.TRUE.equals(currentLiked)) { + miniAdoptionDiaryLikeMapper.deleteLike(diaryId, userId, currentTime); + + baseMapper.decrementLikeCount(diaryId); + } + } + + Long likeCount = baseMapper.selectLikeCount(diaryId); + Map result = new HashMap<>(); + result.put("isLiked", targetLike); + result.put("likeCount", likeCount != null ? likeCount : 0); + return result; } } diff --git a/src/main/resources/mapper/mini/MiniAdoptionDiaryCollectMapper.xml b/src/main/resources/mapper/mini/MiniAdoptionDiaryCollectMapper.xml new file mode 100644 index 0000000..72f623c --- /dev/null +++ b/src/main/resources/mapper/mini/MiniAdoptionDiaryCollectMapper.xml @@ -0,0 +1,9 @@ + + + + + + + diff --git a/src/main/resources/mapper/mini/MiniAdoptionDiaryLikeMapper.xml b/src/main/resources/mapper/mini/MiniAdoptionDiaryLikeMapper.xml new file mode 100644 index 0000000..f6a4f7e --- /dev/null +++ b/src/main/resources/mapper/mini/MiniAdoptionDiaryLikeMapper.xml @@ -0,0 +1,41 @@ + + + + + + + + + + INSERT INTO mini_adoption_diary_like + (uuid, diary_id, mini_user_id, create_time, create_timestamp, create_by, update_time, update_timestamp, update_by, is_deleted) + VALUES + (#{uuid}, #{diaryId}, #{miniUserId}, #{createTime}, #{createTimestamp}, #{createBy}, #{updateTime}, #{updateTimestamp}, #{updateBy}, #{deleted}) + ON DUPLICATE KEY UPDATE + is_deleted = 0, + update_time = VALUES(update_time), + update_timestamp = VALUES(update_timestamp), + update_by = VALUES(update_by) + + + + + UPDATE mini_adoption_diary_like + SET is_deleted = 1, + update_time = NOW(), + update_timestamp = #{currentTime}, + update_by = #{userId} + WHERE diary_id = #{diaryId} + AND mini_user_id = #{userId} + AND is_deleted = 0 + + + diff --git a/src/main/resources/mapper/mini/MiniAdoptionDiaryMapper.xml b/src/main/resources/mapper/mini/MiniAdoptionDiaryMapper.xml index 5267331..8926b6b 100644 --- a/src/main/resources/mapper/mini/MiniAdoptionDiaryMapper.xml +++ b/src/main/resources/mapper/mini/MiniAdoptionDiaryMapper.xml @@ -89,57 +89,36 @@ ORDER BY d.create_timestamp DESC - + SELECT id + FROM mini_adoption_diary + WHERE uuid = #{uuid} + AND is_deleted = 0 + + + + + UPDATE mini_adoption_diary + SET like_count = like_count + 1 + WHERE id = #{diaryId} + AND is_deleted = 0 + + + + + UPDATE mini_adoption_diary + SET like_count = like_count - 1 + WHERE id = #{diaryId} + AND is_deleted = 0 + AND like_count > 0 + + + + diff --git a/src/main/resources/mapper/mini/MiniAdoptionDiaryMediaMapper.xml b/src/main/resources/mapper/mini/MiniAdoptionDiaryMediaMapper.xml index 84d3a58..2c1424b 100644 --- a/src/main/resources/mapper/mini/MiniAdoptionDiaryMediaMapper.xml +++ b/src/main/resources/mapper/mini/MiniAdoptionDiaryMediaMapper.xml @@ -5,5 +5,21 @@ + diff --git a/src/main/resources/mapper/mini/MiniAdoptionDiaryViewMapper.xml b/src/main/resources/mapper/mini/MiniAdoptionDiaryViewMapper.xml new file mode 100644 index 0000000..ff98dc6 --- /dev/null +++ b/src/main/resources/mapper/mini/MiniAdoptionDiaryViewMapper.xml @@ -0,0 +1,19 @@ + + + + + + + INSERT INTO mini_adoption_diary_view + (uuid, mini_user_id, diary_id, create_timestamp, create_time, create_by, is_deleted) + VALUES + (#{uuid}, #{miniUserId}, #{diaryId}, #{createTimestamp}, #{createTime}, #{createBy}, 0) + ON DUPLICATE KEY UPDATE + create_timestamp = VALUES(create_timestamp), + create_time = VALUES(create_time), + is_deleted = 0 + + +