mirror of
https://github.com/201206030/novel.git
synced 2025-04-27 07:30:50 +00:00
feat: 小说章节删除接口
This commit is contained in:
parent
1f2d8dc49a
commit
d6df259e94
src/main/java/io/github/xxyopen/novel
controller/author
manager/cache
service
@ -20,12 +20,7 @@ import io.swagger.v3.oas.annotations.tags.Tag;
|
|||||||
import jakarta.validation.Valid;
|
import jakarta.validation.Valid;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import org.springdoc.core.annotations.ParameterObject;
|
import org.springdoc.core.annotations.ParameterObject;
|
||||||
import org.springframework.web.bind.annotation.GetMapping;
|
import org.springframework.web.bind.annotation.*;
|
||||||
import org.springframework.web.bind.annotation.PathVariable;
|
|
||||||
import org.springframework.web.bind.annotation.PostMapping;
|
|
||||||
import org.springframework.web.bind.annotation.RequestBody;
|
|
||||||
import org.springframework.web.bind.annotation.RequestMapping;
|
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 作家后台-作家模块 API 控制器
|
* 作家后台-作家模块 API 控制器
|
||||||
@ -93,6 +88,16 @@ public class AuthorController {
|
|||||||
return bookService.saveBookChapter(dto);
|
return bookService.saveBookChapter(dto);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 小说章节删除接口
|
||||||
|
*/
|
||||||
|
@Operation(summary = "小说章节删除接口")
|
||||||
|
@DeleteMapping("book/chapter/{chapterId}")
|
||||||
|
public RestResp<Void> deleteBookChapter(
|
||||||
|
@Parameter(description = "章节ID") @PathVariable("chapterId") Long chapterId) {
|
||||||
|
return bookService.deleteBookChapter(chapterId);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 小说章节发布列表查询接口
|
* 小说章节发布列表查询接口
|
||||||
*/
|
*/
|
||||||
|
@ -5,6 +5,7 @@ import io.github.xxyopen.novel.dao.entity.BookChapter;
|
|||||||
import io.github.xxyopen.novel.dao.mapper.BookChapterMapper;
|
import io.github.xxyopen.novel.dao.mapper.BookChapterMapper;
|
||||||
import io.github.xxyopen.novel.dto.resp.BookChapterRespDto;
|
import io.github.xxyopen.novel.dto.resp.BookChapterRespDto;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import org.springframework.cache.annotation.CacheEvict;
|
||||||
import org.springframework.cache.annotation.Cacheable;
|
import org.springframework.cache.annotation.Cacheable;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
@ -37,5 +38,10 @@ public class BookChapterCacheManager {
|
|||||||
.build();
|
.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@CacheEvict(cacheManager = CacheConsts.CAFFEINE_CACHE_MANAGER,
|
||||||
|
value = CacheConsts.BOOK_CHAPTER_CACHE_NAME)
|
||||||
|
public void evictBookChapterCache(Long chapterId) {
|
||||||
|
// 调用此方法自动清除小说章节信息的缓存
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -6,6 +6,7 @@ import io.github.xxyopen.novel.core.constant.DatabaseConsts;
|
|||||||
import io.github.xxyopen.novel.dao.entity.BookContent;
|
import io.github.xxyopen.novel.dao.entity.BookContent;
|
||||||
import io.github.xxyopen.novel.dao.mapper.BookContentMapper;
|
import io.github.xxyopen.novel.dao.mapper.BookContentMapper;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import org.springframework.cache.annotation.CacheEvict;
|
||||||
import org.springframework.cache.annotation.Cacheable;
|
import org.springframework.cache.annotation.Cacheable;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
@ -34,5 +35,11 @@ public class BookContentCacheManager {
|
|||||||
return bookContent.getContent();
|
return bookContent.getContent();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@CacheEvict(cacheManager = CacheConsts.REDIS_CACHE_MANAGER,
|
||||||
|
value = CacheConsts.BOOK_CONTENT_CACHE_NAME)
|
||||||
|
public void evictBookContentCache(Long chapterId) {
|
||||||
|
// 调用此方法自动清除小说内容信息的缓存
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -8,13 +8,14 @@ import io.github.xxyopen.novel.dao.entity.BookInfo;
|
|||||||
import io.github.xxyopen.novel.dao.mapper.BookChapterMapper;
|
import io.github.xxyopen.novel.dao.mapper.BookChapterMapper;
|
||||||
import io.github.xxyopen.novel.dao.mapper.BookInfoMapper;
|
import io.github.xxyopen.novel.dao.mapper.BookInfoMapper;
|
||||||
import io.github.xxyopen.novel.dto.resp.BookInfoRespDto;
|
import io.github.xxyopen.novel.dto.resp.BookInfoRespDto;
|
||||||
import java.util.List;
|
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import org.springframework.cache.annotation.CacheEvict;
|
import org.springframework.cache.annotation.CacheEvict;
|
||||||
import org.springframework.cache.annotation.CachePut;
|
import org.springframework.cache.annotation.CachePut;
|
||||||
import org.springframework.cache.annotation.Cacheable;
|
import org.springframework.cache.annotation.Cacheable;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 小说信息 缓存管理类
|
* 小说信息 缓存管理类
|
||||||
*
|
*
|
||||||
@ -74,7 +75,7 @@ public class BookInfoCacheManager {
|
|||||||
|
|
||||||
@CacheEvict(cacheManager = CacheConsts.CAFFEINE_CACHE_MANAGER,
|
@CacheEvict(cacheManager = CacheConsts.CAFFEINE_CACHE_MANAGER,
|
||||||
value = CacheConsts.BOOK_INFO_CACHE_NAME)
|
value = CacheConsts.BOOK_INFO_CACHE_NAME)
|
||||||
public void evictBookInfoCache(Long ignoredId) {
|
public void evictBookInfoCache(Long bookId) {
|
||||||
// 调用此方法自动清除小说信息的缓存
|
// 调用此方法自动清除小说信息的缓存
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -189,4 +189,12 @@ public interface BookService {
|
|||||||
*/
|
*/
|
||||||
RestResp<PageRespDto<UserCommentRespDto>> listComments(Long userId, PageReqDto pageReqDto);
|
RestResp<PageRespDto<UserCommentRespDto>> listComments(Long userId, PageReqDto pageReqDto);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 小说章节删除
|
||||||
|
*
|
||||||
|
* @param chapterId 章节ID
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
RestResp<Void> deleteBookChapter(Long chapterId);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -437,6 +437,55 @@ public class BookServiceImpl implements BookService {
|
|||||||
Collections.emptyList()));
|
Collections.emptyList()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Transactional(rollbackFor = Exception.class)
|
||||||
|
@Override
|
||||||
|
public RestResp<Void> deleteBookChapter(Long chapterId) {
|
||||||
|
// 1.查询章节信息
|
||||||
|
BookChapterRespDto chapter = bookChapterCacheManager.getChapter(chapterId);
|
||||||
|
// 2.查询小说信息
|
||||||
|
BookInfoRespDto bookInfo = bookInfoCacheManager.getBookInfo(chapter.getBookId());
|
||||||
|
// 3.删除章节信息
|
||||||
|
bookChapterMapper.deleteById(chapterId);
|
||||||
|
// 4.删除章节内容
|
||||||
|
QueryWrapper<BookContent> bookContentQueryWrapper = new QueryWrapper<>();
|
||||||
|
bookContentQueryWrapper.eq(DatabaseConsts.BookContentTable.COLUMN_CHAPTER_ID, chapterId);
|
||||||
|
bookContentMapper.delete(bookContentQueryWrapper);
|
||||||
|
// 5.更新小说信息
|
||||||
|
BookInfo newBookInfo = new BookInfo();
|
||||||
|
newBookInfo.setId(chapter.getBookId());
|
||||||
|
newBookInfo.setUpdateTime(LocalDateTime.now());
|
||||||
|
newBookInfo.setWordCount(bookInfo.getWordCount() - chapter.getChapterWordCount());
|
||||||
|
if (Objects.equals(bookInfo.getLastChapterId(), chapterId)) {
|
||||||
|
// 设置最新章节信息
|
||||||
|
QueryWrapper<BookChapter> bookChapterQueryWrapper = new QueryWrapper<>();
|
||||||
|
bookChapterQueryWrapper.eq(DatabaseConsts.BookChapterTable.COLUMN_BOOK_ID, chapter.getBookId())
|
||||||
|
.orderByDesc(DatabaseConsts.BookChapterTable.COLUMN_CHAPTER_NUM)
|
||||||
|
.last(DatabaseConsts.SqlEnum.LIMIT_1.getSql());
|
||||||
|
BookChapter bookChapter = bookChapterMapper.selectOne(bookChapterQueryWrapper);
|
||||||
|
Long lastChapterId = 0L;
|
||||||
|
String lastChapterName = "";
|
||||||
|
LocalDateTime lastChapterUpdateTime = null;
|
||||||
|
if (Objects.nonNull(bookChapter)) {
|
||||||
|
lastChapterId = bookChapter.getId();
|
||||||
|
lastChapterName = bookChapter.getChapterName();
|
||||||
|
lastChapterUpdateTime = bookChapter.getUpdateTime();
|
||||||
|
}
|
||||||
|
newBookInfo.setLastChapterId(lastChapterId);
|
||||||
|
newBookInfo.setLastChapterName(lastChapterName);
|
||||||
|
newBookInfo.setLastChapterUpdateTime(lastChapterUpdateTime);
|
||||||
|
}
|
||||||
|
bookInfoMapper.updateById(newBookInfo);
|
||||||
|
// 6.清理章节信息缓存
|
||||||
|
bookChapterCacheManager.evictBookChapterCache(chapterId);
|
||||||
|
// 7.清理章节内容缓存
|
||||||
|
bookContentCacheManager.evictBookContentCache(chapterId);
|
||||||
|
// 8.清理小说信息缓存
|
||||||
|
bookInfoCacheManager.evictBookInfoCache(chapter.getBookId());
|
||||||
|
// 9.发送小说信息更新的 MQ 消息
|
||||||
|
amqpMsgManager.sendBookChangeMsg(chapter.getBookId());
|
||||||
|
return RestResp.ok();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public RestResp<BookContentAboutRespDto> getBookContentAbout(Long chapterId) {
|
public RestResp<BookContentAboutRespDto> getBookContentAbout(Long chapterId) {
|
||||||
log.debug("userId:{}", UserHolder.getUserId());
|
log.debug("userId:{}", UserHolder.getUserId());
|
||||||
|
Loading…
x
Reference in New Issue
Block a user