feat(note): 新增笔记删除功能
- 新增 DeleteNoteReqVO 请求参数类,用于接收笔记删除请求 - 在 NoteController 中添加 /delete 接口,实现笔记删除功能 - 在 NoteService 和 NoteServiceImpl 中实现 deleteNote 方法 - 删除笔记时进行权限校验,仅允许笔记创建者删除 - 删除操作为逻辑删除,更新笔记状态为已删除 - 删除笔记后清除 Redis 缓存,并通过 MQ 广播通知各实例清除本地缓存 -优化更新和可见性接口的权限校验逻辑,避免重复代码 - 添加 MQ 测试类 MQTests,用于批量发送关注/取关消息 - 引入 Guava 的 RateLimiter 实现 MQ 消费端限流- 配置 Nacos 配置中心依赖及动态刷新配置 - 更新 .gitignore 文件,忽略日志文件目录 - 在 application.yml 中添加 MQ 消费者限流配置项 - 在 bootstrap.yml 中完善 Nacos 配置中心相关配置 - 为 FollowUnfollowConsumer 添加限流逻辑,防止消费端压力过大
This commit is contained in:
@@ -38,6 +38,12 @@ public class NoteController {
|
||||
return noteService.updateNote(updateNoteReqVO);
|
||||
}
|
||||
|
||||
@PostMapping(value = "/delete")
|
||||
@ApiOperationLog(description = "笔记删除")
|
||||
public Response<?> deleteNote(@Validated @RequestBody DeleteNoteReqVO deleteNoteReqVO) {
|
||||
return noteService.deleteNote(deleteNoteReqVO);
|
||||
}
|
||||
|
||||
@PostMapping(value = "/visible/onlyme")
|
||||
@ApiOperationLog(description = "笔记仅对自己可见")
|
||||
public Response<?> visibleOnlyMe(@Validated @RequestBody UpdateNoteVisibleOnlyMeReqVO updateNoteVisibleOnlyMeReqVO) {
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
package com.hanserwei.hannote.note.biz.model.vo;
|
||||
|
||||
import jakarta.validation.constraints.NotNull;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
@Data
|
||||
@AllArgsConstructor
|
||||
@NoArgsConstructor
|
||||
@Builder
|
||||
public class DeleteNoteReqVO {
|
||||
|
||||
@NotNull(message = "笔记 ID 不能为空")
|
||||
private Long id;
|
||||
}
|
||||
@@ -28,6 +28,13 @@ public interface NoteService extends IService<NoteDO> {
|
||||
*/
|
||||
Response<?> updateNote(UpdateNoteReqVO updateNoteReqVO);
|
||||
|
||||
/**
|
||||
* 笔记删除
|
||||
* @param deleteNoteReqVO 笔记删除请求
|
||||
* @return 笔记删除结果
|
||||
*/
|
||||
Response<?> deleteNote(DeleteNoteReqVO deleteNoteReqVO);
|
||||
|
||||
/**
|
||||
* 笔记仅对自己可见
|
||||
* @param updateNoteVisibleOnlyMeReqVO 笔记仅对自己可见请求
|
||||
|
||||
@@ -334,6 +334,20 @@ public class NoteServiceImpl extends ServiceImpl<NoteDOMapper, NoteDO> implement
|
||||
}
|
||||
}
|
||||
|
||||
// 当前登录用户 ID
|
||||
Long currUserId = LoginUserContextHolder.getUserId();
|
||||
NoteDO selectNoteDO = this.getById(noteId);
|
||||
|
||||
// 笔记不存在
|
||||
if (Objects.isNull(selectNoteDO)) {
|
||||
throw new ApiException(ResponseCodeEnum.NOTE_NOT_FOUND);
|
||||
}
|
||||
|
||||
// 判断权限:非笔记发布者不允许更新笔记
|
||||
if (!Objects.equals(currUserId, selectNoteDO.getCreatorId())) {
|
||||
throw new ApiException(ResponseCodeEnum.NOTE_CANT_OPERATE);
|
||||
}
|
||||
|
||||
// 话题
|
||||
Long topicId = updateNoteReqVO.getTopicId();
|
||||
String topicName = null;
|
||||
@@ -428,11 +442,68 @@ public class NoteServiceImpl extends ServiceImpl<NoteDOMapper, NoteDO> implement
|
||||
return Response.success();
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public Response<?> deleteNote(DeleteNoteReqVO deleteNoteReqVO) {
|
||||
// 笔记 ID
|
||||
Long noteId = deleteNoteReqVO.getId();
|
||||
|
||||
NoteDO selectNoteDO = this.getById(noteId);
|
||||
|
||||
// 判断笔记是否存在
|
||||
if (Objects.isNull(selectNoteDO)) {
|
||||
throw new ApiException(ResponseCodeEnum.NOTE_NOT_FOUND);
|
||||
}
|
||||
|
||||
// 判断权限:非笔记发布者不允许删除笔记
|
||||
Long currUserId = LoginUserContextHolder.getUserId();
|
||||
if (!Objects.equals(currUserId, selectNoteDO.getCreatorId())) {
|
||||
throw new ApiException(ResponseCodeEnum.NOTE_CANT_OPERATE);
|
||||
}
|
||||
|
||||
// 逻辑删除
|
||||
NoteDO noteDO = NoteDO.builder()
|
||||
.id(noteId)
|
||||
.status(NoteStatusEnum.DELETED.getCode())
|
||||
.updateTime(LocalDateTime.now())
|
||||
.build();
|
||||
|
||||
boolean updateSuccess = this.updateById(noteDO);
|
||||
|
||||
// 若失败,则表示该笔记不存在
|
||||
if (!updateSuccess) {
|
||||
throw new ApiException(ResponseCodeEnum.NOTE_NOT_FOUND);
|
||||
}
|
||||
|
||||
// 删除缓存
|
||||
String noteDetailRedisKey = RedisKeyConstants.buildNoteDetailKey(noteId);
|
||||
redisTemplate.delete(noteDetailRedisKey);
|
||||
|
||||
// 同步发送广播模式 MQ,将所有实例中的本地缓存都删除掉
|
||||
rocketMQTemplate.syncSend(MQConstants.TOPIC_DELETE_NOTE_LOCAL_CACHE, noteId);
|
||||
log.info("====> MQ:删除笔记,删除本地缓存发送成功...");
|
||||
|
||||
return Response.success();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Response<?> visibleOnlyMe(UpdateNoteVisibleOnlyMeReqVO updateNoteVisibleOnlyMeReqVO) {
|
||||
// 笔记 ID
|
||||
Long noteId = updateNoteVisibleOnlyMeReqVO.getId();
|
||||
|
||||
NoteDO selectNoteDO = this.getById(noteId);
|
||||
|
||||
// 判断笔记是否存在
|
||||
if (Objects.isNull(selectNoteDO)) {
|
||||
throw new ApiException(ResponseCodeEnum.NOTE_NOT_FOUND);
|
||||
}
|
||||
|
||||
// 判断权限:非笔记发布者不允许修改笔记权限
|
||||
Long currUserId = LoginUserContextHolder.getUserId();
|
||||
if (!Objects.equals(currUserId, selectNoteDO.getCreatorId())) {
|
||||
throw new ApiException(ResponseCodeEnum.NOTE_CANT_OPERATE);
|
||||
}
|
||||
|
||||
// 构建更新的实体类
|
||||
NoteDO noteDO = NoteDO.builder()
|
||||
.id(noteId)
|
||||
|
||||
Reference in New Issue
Block a user