diff --git a/src/main/java/io/github/xxyopen/novel/controller/front/BookController.java b/src/main/java/io/github/xxyopen/novel/controller/front/BookController.java index 03c8eef..e329b50 100644 --- a/src/main/java/io/github/xxyopen/novel/controller/front/BookController.java +++ b/src/main/java/io/github/xxyopen/novel/controller/front/BookController.java @@ -101,8 +101,8 @@ public class BookController { * 获取下一章节ID接口 */ @GetMapping("next_chapter_id/{chapterId}") - public RestResp nextChapterId(@PathVariable("chapterId") Long chapterId) { - return bookService.nextChapterId(chapterId); + public RestResp getNextChapterId(@PathVariable("chapterId") Long chapterId) { + return bookService.getNextChapterId(chapterId); } /** @@ -129,4 +129,13 @@ public class BookController { return bookService.listUpdateRankBooks(); } + /** + * 小说最新评论查询接口 + */ + @GetMapping("comment/newest_list") + public RestResp listNewestComments(Long bookId) { + return bookService.listNewestComments(bookId); + } + + } diff --git a/src/main/java/io/github/xxyopen/novel/core/constant/DatabaseConsts.java b/src/main/java/io/github/xxyopen/novel/core/constant/DatabaseConsts.java index b7a63cc..c16152e 100644 --- a/src/main/java/io/github/xxyopen/novel/core/constant/DatabaseConsts.java +++ b/src/main/java/io/github/xxyopen/novel/core/constant/DatabaseConsts.java @@ -125,6 +125,19 @@ public class DatabaseConsts { } + /** + * 小说评论表 + */ + public static class BookCommentTable { + + private BookCommentTable() { + throw new IllegalStateException(SystemConfigConsts.CONST_INSTANCE_EXCEPTION_MSG); + } + + public static final String COLUMN_BOOK_ID = "book_id"; + + } + /** * 新闻内容表 */ @@ -166,6 +179,7 @@ public class DatabaseConsts { LIMIT_1("limit 1"), LIMIT_2("limit 2"), + LIMIT_5("limit 5"), LIMIT_30("limit 30"), LIMIT_500("limit 500"); diff --git a/src/main/java/io/github/xxyopen/novel/core/json/serializer/UsernameSerializer.java b/src/main/java/io/github/xxyopen/novel/core/json/serializer/UsernameSerializer.java new file mode 100644 index 0000000..7d9ce02 --- /dev/null +++ b/src/main/java/io/github/xxyopen/novel/core/json/serializer/UsernameSerializer.java @@ -0,0 +1,22 @@ +package io.github.xxyopen.novel.core.json.serializer; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.SerializerProvider; + +import java.io.IOException; + +/** + * 用户名序列化类(敏感信息,不应该在页面上完全显示) + * + * @author xiongxiaoyang + * @date 2022/5/20 + */ +public class UsernameSerializer extends JsonSerializer { + + @Override + public void serialize(String s, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException { + jsonGenerator.writeString(s.substring(0,4) + "****" + s.substring(8)); + } + +} diff --git a/src/main/java/io/github/xxyopen/novel/dto/resp/BookCommentRespDto.java b/src/main/java/io/github/xxyopen/novel/dto/resp/BookCommentRespDto.java new file mode 100644 index 0000000..1914658 --- /dev/null +++ b/src/main/java/io/github/xxyopen/novel/dto/resp/BookCommentRespDto.java @@ -0,0 +1,42 @@ +package io.github.xxyopen.novel.dto.resp; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import io.github.xxyopen.novel.core.json.serializer.UsernameSerializer; +import lombok.Builder; +import lombok.Data; + +import java.time.LocalDateTime; +import java.util.List; + +/** + * 小说评论 响应DTO + * @author xiongxiaoyang + * @date 2022/5/17 + */ +@Data +@Builder +public class BookCommentRespDto { + + + private Long commentTotal; + + private List comments; + + @Data + @Builder + public static class CommentInfo { + + private String commentContent; + + @JsonSerialize(using = UsernameSerializer.class) + private String commentUser; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime commentTime; + + } + + + +} diff --git a/src/main/java/io/github/xxyopen/novel/manager/UserDaoManager.java b/src/main/java/io/github/xxyopen/novel/manager/UserDaoManager.java new file mode 100644 index 0000000..fe29c2f --- /dev/null +++ b/src/main/java/io/github/xxyopen/novel/manager/UserDaoManager.java @@ -0,0 +1,34 @@ +package io.github.xxyopen.novel.manager; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import io.github.xxyopen.novel.core.constant.DatabaseConsts; +import io.github.xxyopen.novel.dao.entity.UserInfo; +import io.github.xxyopen.novel.dao.mapper.UserInfoMapper; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * 用户模块 DAO管理类 + * @author xiongxiaoyang + * @date 2022/5/20 + */ +@Component +@RequiredArgsConstructor +public class UserDaoManager { + + private final UserInfoMapper userInfoMapper; + + /** + * 根据用户ID集合批量查询用户信息列表 + * @param userIds 需要查询的用户ID集合 + * @return 满足条件的用户信息列表 + * */ + public List listUsers(List userIds){ + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.in(DatabaseConsts.CommonColumnEnum.ID.getName(),userIds); + return userInfoMapper.selectList(queryWrapper); + } + +} diff --git a/src/main/java/io/github/xxyopen/novel/service/BookService.java b/src/main/java/io/github/xxyopen/novel/service/BookService.java index 8cad846..b758544 100644 --- a/src/main/java/io/github/xxyopen/novel/service/BookService.java +++ b/src/main/java/io/github/xxyopen/novel/service/BookService.java @@ -100,7 +100,7 @@ public interface BookService { * @param chapterId 章节ID * @return 下一章节ID */ - RestResp nextChapterId(Long chapterId); + RestResp getNextChapterId(Long chapterId); /** * 小说章节列表查询 @@ -126,4 +126,11 @@ public interface BookService { */ RestResp saveComment(UserCommentReqDto dto); + /** + * 小说最新评论查询 + * + * @param bookId 小说ID + * @return 小说最新评论数据 + */ + RestResp listNewestComments(Long bookId); } diff --git a/src/main/java/io/github/xxyopen/novel/service/impl/BookServiceImpl.java b/src/main/java/io/github/xxyopen/novel/service/impl/BookServiceImpl.java index fbadb4d..d3a6a9c 100644 --- a/src/main/java/io/github/xxyopen/novel/service/impl/BookServiceImpl.java +++ b/src/main/java/io/github/xxyopen/novel/service/impl/BookServiceImpl.java @@ -8,6 +8,7 @@ import io.github.xxyopen.novel.core.constant.DatabaseConsts; import io.github.xxyopen.novel.dao.entity.BookChapter; import io.github.xxyopen.novel.dao.entity.BookComment; import io.github.xxyopen.novel.dao.entity.BookInfo; +import io.github.xxyopen.novel.dao.entity.UserInfo; import io.github.xxyopen.novel.dao.mapper.BookChapterMapper; import io.github.xxyopen.novel.dao.mapper.BookCommentMapper; import io.github.xxyopen.novel.dao.mapper.BookInfoMapper; @@ -23,10 +24,8 @@ import org.springframework.stereotype.Service; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; -import java.util.Optional; -import java.util.Random; +import java.util.*; +import java.util.stream.Collectors; /** * 小说模块 服务实现类 @@ -55,6 +54,8 @@ public class BookServiceImpl implements BookService { private final BookCommentMapper bookCommentMapper; + private final UserDaoManager userDaoManager; + private static final Integer REC_BOOK_COUNT = 4; @Override @@ -63,8 +64,8 @@ public class BookServiceImpl implements BookService { page.setCurrent(condition.getPageNum()); page.setSize(condition.getPageSize()); List bookInfos = bookInfoMapper.searchBooks(page, condition); - return RestResp.ok(PageRespDto.of(condition.getPageNum(),condition.getPageSize(),page.getTotal() - ,bookInfos.stream().map(v -> BookInfoRespDto.builder() + return RestResp.ok(PageRespDto.of(condition.getPageNum(), condition.getPageSize(), page.getTotal() + , bookInfos.stream().map(v -> BookInfoRespDto.builder() .id(v.getId()) .bookName(v.getBookName()) .categoryId(v.getCategoryId()) @@ -168,7 +169,7 @@ public class BookServiceImpl implements BookService { } @Override - public RestResp nextChapterId(Long chapterId) { + public RestResp getNextChapterId(Long chapterId) { // 查询小说ID 和 章节号 BookChapterRespDto chapter = bookChapterCacheManager.getChapter(chapterId); Long bookId = chapter.getBookId(); @@ -215,6 +216,38 @@ public class BookServiceImpl implements BookService { return RestResp.ok(); } + @Override + public RestResp listNewestComments(Long bookId) { + // 查询评论总数 + QueryWrapper commentCountQueryWrapper = new QueryWrapper<>(); + commentCountQueryWrapper.eq(DatabaseConsts.BookCommentTable.COLUMN_BOOK_ID, bookId); + Long commentTotal = bookCommentMapper.selectCount(commentCountQueryWrapper); + BookCommentRespDto bookCommentRespDto = BookCommentRespDto.builder().commentTotal(commentTotal).build(); + if (commentTotal > 0) { + + // 查询最新的评论列表 + QueryWrapper commentQueryWrapper = new QueryWrapper<>(); + commentQueryWrapper.eq(DatabaseConsts.BookCommentTable.COLUMN_BOOK_ID, bookId) + .orderByDesc(DatabaseConsts.CommonColumnEnum.CREATE_TIME.getName()) + .last(DatabaseConsts.SqlEnum.LIMIT_5.getSql()); + List bookComments = bookCommentMapper.selectList(commentQueryWrapper); + + // 查询评论用户信息,并设置需要返回的评论用户名 + List userIds = bookComments.stream().map(BookComment::getUserId).toList(); + List userInfos = userDaoManager.listUsers(userIds); + Map userInfoMap = userInfos.stream().collect(Collectors.toMap(UserInfo::getId, UserInfo::getUsername)); + List commentInfos = bookComments.stream() + .map(v -> BookCommentRespDto.CommentInfo.builder() + .commentUser(userInfoMap.get(v.getUserId())) + .commentContent(v.getCommentContent()) + .commentTime(v.getCreateTime()).build()).toList(); + bookCommentRespDto.setComments(commentInfos); + } else { + bookCommentRespDto.setComments(Collections.emptyList()); + } + return RestResp.ok(bookCommentRespDto); + } + @Override public RestResp getBookContentAbout(Long chapterId) { // 查询章节信息