Browse Source

增加领养日记查询点赞接口

glx_phase2
glx 1 week ago
parent
commit
7e5e1873b6
  1. 4
      src/main/java/com/youlai/boot/codegen/freemarker/MyBatisPlusGenerator.java
  2. 30
      src/main/java/com/youlai/boot/mini/controller/AdoptionDiaryController.java
  3. 14
      src/main/java/com/youlai/boot/mini/mapper/MiniAdoptionDiaryCollectMapper.java
  4. 20
      src/main/java/com/youlai/boot/mini/mapper/MiniAdoptionDiaryLikeMapper.java
  5. 12
      src/main/java/com/youlai/boot/mini/mapper/MiniAdoptionDiaryMapper.java
  6. 6
      src/main/java/com/youlai/boot/mini/mapper/MiniAdoptionDiaryMediaMapper.java
  7. 15
      src/main/java/com/youlai/boot/mini/mapper/MiniAdoptionDiaryViewMapper.java
  8. 70
      src/main/java/com/youlai/boot/mini/model/entity/MiniAdoptionDiaryCollect.java
  9. 70
      src/main/java/com/youlai/boot/mini/model/entity/MiniAdoptionDiaryLike.java
  10. 57
      src/main/java/com/youlai/boot/mini/model/entity/MiniAdoptionDiaryView.java
  11. 14
      src/main/java/com/youlai/boot/mini/model/form/DiaryLikeForm.java
  12. 7
      src/main/java/com/youlai/boot/mini/service/AdoptionDiaryService.java
  13. 195
      src/main/java/com/youlai/boot/mini/service/impl/AdoptionDiaryServiceImpl.java
  14. 9
      src/main/resources/mapper/mini/MiniAdoptionDiaryCollectMapper.xml
  15. 41
      src/main/resources/mapper/mini/MiniAdoptionDiaryLikeMapper.xml
  16. 81
      src/main/resources/mapper/mini/MiniAdoptionDiaryMapper.xml
  17. 16
      src/main/resources/mapper/mini/MiniAdoptionDiaryMediaMapper.xml
  18. 19
      src/main/resources/mapper/mini/MiniAdoptionDiaryViewMapper.xml

4
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")

30
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<AdoptionDiaryDetailsVO> getDetails(
@PathVariable String diaryUuid){
return Result.success(adoptionDiaryService.getDetails(diaryUuid, SecurityUtils.getUserId()));
} // 待修改
}
@Operation(summary = "获取某个用户创建的领养日记列表")
@GetMapping(value = "/getOthersCreatedPage/{authorUuid}")
public PageResult<AdoptionDiaryVO> 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<Map<String, Object>> toggleDiaryLike(
@Valid @RequestBody DiaryLikeForm form
) {
Long userId = SecurityUtils.getUserId();
Map<String, Object> result = adoptionDiaryService.toggleDiaryLike(form, userId);
return Result.success(result);
}
}

14
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<MiniAdoptionDiaryCollect> {
}

20
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<MiniAdoptionDiaryLike> {
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);
}

12
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<MiniAdoptionDiary> {
*/
IPage<AdoptionDiaryVO> getDiaryPage(Page<AdoptionDiaryVO> 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);
}

6
src/main/java/com/youlai/boot/mini/mapper/MiniAdoptionDiaryMediaMapper.java

@ -2,6 +2,10 @@ 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 接口
@ -11,4 +15,6 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
*/
public interface MiniAdoptionDiaryMediaMapper extends BaseMapper<MiniAdoptionDiaryMedia> {
List<MiniAdoptionDiaryMediaVO> getMediaByDiaryIdAndType(Map<String, Object> param);
}

15
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<MiniAdoptionDiaryView> {
void insertOrUpdateView(MiniAdoptionDiaryView view);
}

70
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;
}

70
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;
}

57
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;
}

14
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;
}

7
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<MiniAdoptionDiary> {
@ -35,6 +37,9 @@ public interface AdoptionDiaryService extends IService<MiniAdoptionDiary> {
IPage<AdoptionDiaryVO> getSelfCreatedPage(OwnAdoptionDiaryQuery queryParams);
AdoptionDiaryDetailsVO getDetails(String diaryUuid, Long userId);
AdoptionDiaryDetailsVO getDetails(String diaryUuid, Long miniUserId);
IPage<AdoptionDiaryVO> getOthersCreatedPage(String authorUuid, OwnAdoptionDiaryQuery queryParams);
Map<String, Object> toggleDiaryLike(@Valid DiaryLikeForm form, Long userId);
}

195
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<MiniAdoptionDiaryMappe
private final AliyunFileService aliyunFileService;
private final MiniAdoptionDiaryMediaMapper miniAdoptionDiaryMediaMapper;
private final UserMapper userMapper;
private final MiniAdoptionDiaryViewMapper miniAdoptionDiaryViewMapper;
private final RedissonClient redissonClient;
private final MiniAdoptionDiaryLikeMapper miniAdoptionDiaryLikeMapper;
// 布隆过滤器常量
private static final String BLOOM_VIEW_KEY_PREFIX = "mini:diary:view:bloom:";
// 布隆重建分布式锁前缀
private static final String BLOOM_REBUILD_LOCK_PREFIX = "lock:rebuild:bloom:";
private final static String OSS_THUMBNAIL_DIR = "adoption_diary/thumbnail/";
private final static String OSS_IMAGE_DIR = "adoption_diary/image/";
@ -61,6 +75,15 @@ public class AdoptionDiaryServiceImpl extends ServiceImpl<MiniAdoptionDiaryMappe
@Value("${oss.aliyun.bucket-name}")
private String bucketName;
@Value("${bloom.view.expected-insertions:1000}")
private Integer bloomExpectedInsertions;
@Value("${bloom.view.fpp:0.001}")
private Double bloomFpp;
@Value("${bloom.view.expire-days:}")
private Integer bloomExpireDays;
public String getDefaultCoverHost() {
return "https://" + bucketName + "." + endpoint;
}
@ -376,6 +399,10 @@ public class AdoptionDiaryServiceImpl extends ServiceImpl<MiniAdoptionDiaryMappe
queryParams.setMiniUserId(userId);
queryParams.setCreatorId(userId);
return getDiaryPage(queryParams);
}
private IPage<AdoptionDiaryVO> getDiaryPage(OwnAdoptionDiaryQuery queryParams) {
int pageNum = queryParams.getPageNum();
int pageSize = queryParams.getPageSize();
Page<AdoptionDiaryVO> page = new Page<>(pageNum, pageSize);
@ -395,9 +422,155 @@ public class AdoptionDiaryServiceImpl extends ServiceImpl<MiniAdoptionDiaryMappe
}
@Override
public AdoptionDiaryDetailsVO getDetails(String diaryUuid, Long userId) {
AdoptionDiaryDetailsVO diaryVO = baseMapper.getDiaryDetails(diaryUuid, userId);
return diaryVO;
public IPage<AdoptionDiaryVO> getOthersCreatedPage(String authorUuid, OwnAdoptionDiaryQuery queryParams) {
SysUser sysUser = userMapper.selectOne(new LambdaQueryWrapper<SysUser>()
.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<String, Object> param = new HashMap<>();
param.put("diaryId", diary.getId());
param.put("mediaType", AnimalNoteMediaTypeEnum.IMAGE.name().toLowerCase());
List<MiniAdoptionDiaryMediaVO> images = miniAdoptionDiaryMediaMapper.getMediaByDiaryIdAndType(param);
if (CollectionUtils.isNotEmpty(images)) {
images.forEach(item -> {
item.setDiaryUuid(diary.getUuid());
});
}
param.put("mediaType", AnimalNoteMediaTypeEnum.VIDEO.name().toLowerCase());
List<MiniAdoptionDiaryMediaVO> 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<Long> 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<MiniAdoptionDiary>()
.eq(MiniAdoptionDiary::getUuid, diaryUuid)
.eq(MiniAdoptionDiary::getDeleted, 0)
);
if (diary == null) {
throw new MsgException("日记不存在");
}
return diary;
}
@Override
public Map<String, Object> 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<String, Object> result = new HashMap<>();
result.put("isLiked", targetLike);
result.put("likeCount", likeCount != null ? likeCount : 0);
return result;
}
}

9
src/main/resources/mapper/mini/MiniAdoptionDiaryCollectMapper.xml

@ -0,0 +1,9 @@
<?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="com.youlai.boot.mini.mapper.MiniAdoptionDiaryCollectMapper">
</mapper>

41
src/main/resources/mapper/mini/MiniAdoptionDiaryLikeMapper.xml

@ -0,0 +1,41 @@
<?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="com.youlai.boot.mini.mapper.MiniAdoptionDiaryLikeMapper">
<select id="selectUserLikeCount" resultType="java.lang.Integer">
SELECT COUNT(1)
FROM mini_adoption_diary_like
WHERE diary_id = #{diaryId}
AND mini_user_id = #{userId}
AND is_deleted = 0
</select>
<!-- 新增或更新点赞记录(原子操作,依赖note_id和mini_user_id联合唯一索引) -->
<insert id="insertOrUpdateLike" parameterType="com.youlai.boot.mini.model.entity.MiniAdoptionDiaryLike">
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)
</insert>
<!-- 逻辑删除点赞记录(取消点赞) -->
<update id="deleteLike">
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
</update>
</mapper>

81
src/main/resources/mapper/mini/MiniAdoptionDiaryMapper.xml

@ -89,57 +89,36 @@
ORDER BY d.create_timestamp DESC
</select>
<select id="getDiaryDetails" resultType="com.youlai.boot.mini.model.vo.AdoptionDiaryDetailsVO">
SELECT
d.id,
d.uuid AS diaryUuid,
sa.uuid AS animalUuid,
sa.animal_name AS animalName,
d.title,
d.content,
d.visibility,
d.view_count AS viewCount,
d.like_count AS likeCount,
d.comment_count AS commentCount,
d.collect_count AS collectCount,
d.create_time AS createTime,
d.audit_status AS auditStatus,
u.uuid AS authorUuid,
u.nickname AS authorName,
u.avatar AS authorAvatar,
(
SELECT source_url FROM mini_adoption_diary_media
WHERE diary_id = d.id AND media_type = 'image' AND is_deleted = 0
ORDER BY id ASC LIMIT 1
) AS firstImageUrl,
<if test="miniUserId != null">
-- 当前用户是否点赞
EXISTS (
SELECT 1
FROM mini_adoption_diary_like l
WHERE l.diary_id = d.id
AND l.mini_user_id = #{miniUserId}
AND l.is_deleted = 0
) AS isLiked,
-- 当前用户是否收藏
EXISTS (
SELECT 1
FROM mini_adoption_diary_collect c
WHERE c.diary_id = d.id
AND c.mini_user_id = #{miniUserId}
AND c.is_deleted = 0
) AS isCollected,
</if>
<if test="miniUserId == null">
0 AS isLiked,
0 AS isCollected,
</if>
d.create_timestamp
FROM mini_adoption_diary d
INNER JOIN sys_user u ON d.mini_user_id = u.id AND u.is_deleted = 0
LEFT JOIN mini_stray_animal sa ON d.stray_animal_id = sa.id AND sa.is_deleted = 0
WHERE d.uuid = #{diaryUuid}
AND d.is_deleted = 0
<select id="selectIdByUuid" resultType="java.lang.Long">
SELECT id
FROM mini_adoption_diary
WHERE uuid = #{uuid}
AND is_deleted = 0
</select>
<!-- 原子增加点赞数 -->
<update id="incrementLikeCount">
UPDATE mini_adoption_diary
SET like_count = like_count + 1
WHERE id = #{diaryId}
AND is_deleted = 0
</update>
<!-- 原子减少点赞数 -->
<update id="decrementLikeCount">
UPDATE mini_adoption_diary
SET like_count = like_count - 1
WHERE id = #{diaryId}
AND is_deleted = 0
AND like_count > 0
</update>
<!-- 查询点赞数 -->
<select id="selectLikeCount" resultType="java.lang.Long">
SELECT like_count
FROM mini_adoption_diary
WHERE id = #{diaryId}
AND is_deleted = 0
</select>
</mapper>

16
src/main/resources/mapper/mini/MiniAdoptionDiaryMediaMapper.xml

@ -5,5 +5,21 @@
<mapper namespace="com.youlai.boot.mini.mapper.MiniAdoptionDiaryMediaMapper">
<select id="getMediaByDiaryIdAndType" resultType="com.youlai.boot.mini.model.vo.MiniAdoptionDiaryMediaVO">
SELECT
uuid AS diaryMediaUuid,
media_type,
source_url,
storage_key,
thumbnail_url,
width,
height,
duration
FROM
mini_adoption_diary_media
WHERE
diary_id = #{diaryId} AND media_type = #{mediaType} AND is_deleted = 0
ORDER BY id desc
</select>
</mapper>

19
src/main/resources/mapper/mini/MiniAdoptionDiaryViewMapper.xml

@ -0,0 +1,19 @@
<?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="com.youlai.boot.mini.mapper.MiniAdoptionDiaryViewMapper">
<!-- 新增或更新浏览记录,重复则更新最后浏览时间 -->
<insert id="insertOrUpdateView">
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
</insert>
</mapper>
Loading…
Cancel
Save