mirror of
https://github.com/201206030/novel.git
synced 2025-04-27 07:30:50 +00:00
feat: 新增小说推荐列表查询接口
This commit is contained in:
parent
2dbcd3f701
commit
960b9124d5
@ -13,6 +13,7 @@ import org.springframework.web.bind.annotation.PathVariable;
|
|||||||
import org.springframework.web.bind.annotation.RequestMapping;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
|
import java.security.NoSuchAlgorithmException;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -44,6 +45,14 @@ public class BookController {
|
|||||||
return bookService.getLastChapterAbout(bookId);
|
return bookService.getLastChapterAbout(bookId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 小说推荐列表查询接口
|
||||||
|
* */
|
||||||
|
@GetMapping("recList")
|
||||||
|
public RestResp<List<BookInfoRespDto>> listRecBooks(Long bookId) throws NoSuchAlgorithmException {
|
||||||
|
return bookService.listRecBooks(bookId);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 小说内容相关信息查询接口
|
* 小说内容相关信息查询接口
|
||||||
* */
|
* */
|
||||||
|
@ -69,6 +69,11 @@ public class CacheConsts {
|
|||||||
*/
|
*/
|
||||||
public static final String BOOK_CONTENT_CACHE_NAME = "bookContentCache";
|
public static final String BOOK_CONTENT_CACHE_NAME = "bookContentCache";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 最近更新小说ID列表缓存
|
||||||
|
* */
|
||||||
|
public static final String LAST_UPDATE_BOOK_ID_LIST_CACHE_NAME = "lastUpdateBookIdListCache";
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 缓存配置常量
|
* 缓存配置常量
|
||||||
@ -91,7 +96,9 @@ public class CacheConsts {
|
|||||||
|
|
||||||
BOOK_CHAPTER_CACHE(0,BOOK_CHAPTER_CACHE_NAME,60 * 60 * 6,5000),
|
BOOK_CHAPTER_CACHE(0,BOOK_CHAPTER_CACHE_NAME,60 * 60 * 6,5000),
|
||||||
|
|
||||||
BOOK_CONTENT_CACHE(2, BOOK_CONTENT_CACHE_NAME, 60 * 60 * 12, 3000);
|
BOOK_CONTENT_CACHE(2, BOOK_CONTENT_CACHE_NAME, 60 * 60 * 12, 3000),
|
||||||
|
|
||||||
|
LAST_UPDATE_BOOK_ID_LIST_CACHE(0,LAST_UPDATE_BOOK_ID_LIST_CACHE_NAME,60 * 60, 10);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 缓存类型 0-本地 1-本地和远程 2-远程
|
* 缓存类型 0-本地 1-本地和远程 2-远程
|
||||||
|
@ -11,6 +11,8 @@ import lombok.RequiredArgsConstructor;
|
|||||||
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;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 小说信息 缓存管理类
|
* 小说信息 缓存管理类
|
||||||
*
|
*
|
||||||
@ -59,5 +61,17 @@ public class BookInfoCacheManager {
|
|||||||
.build();
|
.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询每个类别下最新更新的 500 个小说ID列表,并放入缓存中 1 个小时
|
||||||
|
*/
|
||||||
|
@Cacheable(cacheManager = CacheConsts.CAFFEINE_CACHE_MANAGER
|
||||||
|
, value = CacheConsts.LAST_UPDATE_BOOK_ID_LIST_CACHE_NAME)
|
||||||
|
public List<Long> getLastUpdateIdList(Long categoryId) {
|
||||||
|
QueryWrapper<BookInfo> queryWrapper = new QueryWrapper<>();
|
||||||
|
queryWrapper.eq("category_id", categoryId)
|
||||||
|
.orderByDesc("last_chapter_update_time")
|
||||||
|
.last("limit 500");
|
||||||
|
return bookInfoMapper.selectList(queryWrapper).stream().map(BookInfo::getId).toList();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -6,6 +6,7 @@ import io.github.xxyopen.novel.dto.resp.BookContentAboutRespDto;
|
|||||||
import io.github.xxyopen.novel.dto.resp.BookInfoRespDto;
|
import io.github.xxyopen.novel.dto.resp.BookInfoRespDto;
|
||||||
import io.github.xxyopen.novel.dto.resp.BookRankRespDto;
|
import io.github.xxyopen.novel.dto.resp.BookRankRespDto;
|
||||||
|
|
||||||
|
import java.security.NoSuchAlgorithmException;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -45,4 +46,9 @@ public interface BookService {
|
|||||||
* 小说最新章节相关信息查询
|
* 小说最新章节相关信息查询
|
||||||
* */
|
* */
|
||||||
RestResp<BookChapterAboutRespDto> getLastChapterAbout(Long bookId);
|
RestResp<BookChapterAboutRespDto> getLastChapterAbout(Long bookId);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 小说推荐列表查询
|
||||||
|
* */
|
||||||
|
RestResp<List<BookInfoRespDto>> listRecBooks(Long bookId) throws NoSuchAlgorithmException;
|
||||||
}
|
}
|
||||||
|
@ -11,9 +11,14 @@ import io.github.xxyopen.novel.manager.BookInfoCacheManager;
|
|||||||
import io.github.xxyopen.novel.manager.BookRankCacheManager;
|
import io.github.xxyopen.novel.manager.BookRankCacheManager;
|
||||||
import io.github.xxyopen.novel.service.BookService;
|
import io.github.xxyopen.novel.service.BookService;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import java.security.NoSuchAlgorithmException;
|
||||||
|
import java.security.SecureRandom;
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Random;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 小说模块 服务实现类
|
* 小说模块 服务实现类
|
||||||
@ -23,6 +28,7 @@ import java.util.List;
|
|||||||
*/
|
*/
|
||||||
@Service
|
@Service
|
||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
|
@Slf4j
|
||||||
public class BookServiceImpl implements BookService {
|
public class BookServiceImpl implements BookService {
|
||||||
|
|
||||||
private final BookRankCacheManager bookRankCacheManager;
|
private final BookRankCacheManager bookRankCacheManager;
|
||||||
@ -35,6 +41,8 @@ public class BookServiceImpl implements BookService {
|
|||||||
|
|
||||||
private final BookChapterMapper bookChapterMapper;
|
private final BookChapterMapper bookChapterMapper;
|
||||||
|
|
||||||
|
private static final Integer REC_BOOK_COUNT = 4;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public RestResp<List<BookRankRespDto>> listVisitRankBooks() {
|
public RestResp<List<BookRankRespDto>> listVisitRankBooks() {
|
||||||
return RestResp.ok(bookRankCacheManager.listVisitRankBooks());
|
return RestResp.ok(bookRankCacheManager.listVisitRankBooks());
|
||||||
@ -79,6 +87,27 @@ public class BookServiceImpl implements BookService {
|
|||||||
.build());
|
.build());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public RestResp<List<BookInfoRespDto>> listRecBooks(Long bookId) throws NoSuchAlgorithmException {
|
||||||
|
Long categoryId = bookInfoCacheManager.getBookInfo(bookId).getCategoryId();
|
||||||
|
List<Long> lastUpdateIdList = bookInfoCacheManager.getLastUpdateIdList(categoryId);
|
||||||
|
List<BookInfoRespDto> respDtoList = new ArrayList<>();
|
||||||
|
List<Integer> recIdIndexList = new ArrayList<>();
|
||||||
|
int count = 0;
|
||||||
|
Random rand = SecureRandom.getInstanceStrong();
|
||||||
|
while (count < REC_BOOK_COUNT){
|
||||||
|
int recIdIndex = rand.nextInt(lastUpdateIdList.size());
|
||||||
|
if (!recIdIndexList.contains(recIdIndex)) {
|
||||||
|
recIdIndexList.add(recIdIndex);
|
||||||
|
bookId = lastUpdateIdList.get(recIdIndex);
|
||||||
|
BookInfoRespDto bookInfo = bookInfoCacheManager.getBookInfo(bookId);
|
||||||
|
respDtoList.add(bookInfo);
|
||||||
|
count ++ ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return RestResp.ok(respDtoList);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public RestResp<BookContentAboutRespDto> getBookContentAbout(Long chapterId) {
|
public RestResp<BookContentAboutRespDto> getBookContentAbout(Long chapterId) {
|
||||||
// 查询章节信息
|
// 查询章节信息
|
||||||
|
Loading…
x
Reference in New Issue
Block a user