Преглед на файлове

0806 整合书籍评论列表

Qing преди 9 месеца
родител
ревизия
ca721ed2de
променени са 18 файла, в които са добавени 284 реда и са изтрити 21 реда
  1. 6 0
      novel-cloud-demo/novel-book/novel-book-service/pom.xml
  2. 2 0
      novel-cloud-demo/novel-book/novel-book-service/src/main/java/com/sf/book/NovelBookServiceApplication.java
  3. 20 4
      novel-cloud-demo/novel-book/novel-book-service/src/main/java/com/sf/book/controller/BookCommentController.java
  4. 3 4
      novel-cloud-demo/novel-book/novel-book-service/src/main/java/com/sf/book/controller/inner/InnerBookController.java
  5. 1 2
      novel-cloud-demo/novel-book/novel-book-service/src/main/java/com/sf/book/dto/inner/InnerBookCommentRespDto.java
  6. 24 0
      novel-cloud-demo/novel-book/novel-book-service/src/main/java/com/sf/book/dto/resp/BookCommentRespDto.java
  7. 32 0
      novel-cloud-demo/novel-book/novel-book-service/src/main/java/com/sf/book/dto/resp/CommentInfoRespDto.java
  8. 3 1
      novel-cloud-demo/novel-book/novel-book-service/src/main/java/com/sf/book/service/IBookCommentService.java
  9. 2 3
      novel-cloud-demo/novel-book/novel-book-service/src/main/java/com/sf/book/service/IInnerBookService.java
  10. 58 0
      novel-cloud-demo/novel-book/novel-book-service/src/main/java/com/sf/book/service/impl/BookCommentServiceImpl.java
  11. 5 6
      novel-cloud-demo/novel-book/novel-book-service/src/main/java/com/sf/book/service/impl/InnerBookServiceImpl.java
  12. 5 1
      novel-cloud-demo/novel-user/novel-user-api/pom.xml
  13. 17 0
      novel-cloud-demo/novel-user/novel-user-api/src/main/java/com/sf/user/client/UserFeign.java
  14. 17 0
      novel-cloud-demo/novel-user/novel-user-api/src/main/java/com/sf/user/client/dto/InnerUserCommentRespDto.java
  15. 27 0
      novel-cloud-demo/novel-user/novel-user-service/src/main/java/com/sf/user/controller/inner/InnerUserController.java
  16. 17 0
      novel-cloud-demo/novel-user/novel-user-service/src/main/java/com/sf/user/dto/inner/InnerUserCommentRespDto.java
  17. 12 0
      novel-cloud-demo/novel-user/novel-user-service/src/main/java/com/sf/user/service/IInnerUserService.java
  18. 33 0
      novel-cloud-demo/novel-user/novel-user-service/src/main/java/com/sf/user/service/impl/InnerUserServiceImpl.java

+ 6 - 0
novel-cloud-demo/novel-book/novel-book-service/pom.xml

@@ -35,6 +35,12 @@
             <version>${project.version}</version>
         </dependency>
 
+        <dependency>
+            <groupId>com.sf</groupId>
+            <artifactId>novel-user-api</artifactId>
+            <version>${parent.version}</version>
+        </dependency>
+
     </dependencies>
 
     <build>

+ 2 - 0
novel-cloud-demo/novel-book/novel-book-service/src/main/java/com/sf/book/NovelBookServiceApplication.java

@@ -6,9 +6,11 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.CommandLineRunner;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.openfeign.EnableFeignClients;
 
 // 放大主程序入口的扫描范围
 // 设定扫描包范围 要包含novel-core中config所在的包路径
+@EnableFeignClients(basePackages = {"com.sf.user.client"})
 @SpringBootApplication(scanBasePackages = {"com.sf"})
 @MapperScan("com.sf.book.mapper")
 public class NovelBookServiceApplication{

+ 20 - 4
novel-cloud-demo/novel-book/novel-book-service/src/main/java/com/sf/book/controller/BookCommentController.java

@@ -1,7 +1,14 @@
 package com.sf.book.controller;
 
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.stereotype.Controller;
+import com.sf.book.dto.inner.InnerBookCommentRespDto;
+import com.sf.book.dto.resp.BookCommentRespDto;
+import com.sf.book.service.IBookCommentService;
+import com.sf.core.dto.RestResp;
+import io.swagger.v3.oas.annotations.Operation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
 
 /**
  * <p>
@@ -11,8 +18,17 @@ import org.springframework.stereotype.Controller;
  * @author baomidou
  * @since 2024-08-06
  */
-@Controller
-@RequestMapping("/bookComment")
+@RestController
+@RequiredArgsConstructor
 public class BookCommentController {
 
+    private final IBookCommentService bookCommentService;
+
+    // http://127.0.0.1:8888/api/front/book/comment/newest_list?bookId=1431630596354977795
+    @Operation(summary = "评论列表接口")
+    @GetMapping("/api/front/book/comment/newest_list")
+    public RestResp<BookCommentRespDto> commentNewestList(@RequestParam("bookId") Long bookId) {
+        BookCommentRespDto bookCommentRespDto = bookCommentService.commentNewestList(bookId);
+        return RestResp.ok(bookCommentRespDto);
+    }
 }

+ 3 - 4
novel-cloud-demo/novel-book/novel-book-service/src/main/java/com/sf/book/controller/inner/InnerBookController.java

@@ -1,9 +1,8 @@
 package com.sf.book.controller.inner;
 
-import com.sf.book.dto.inner.BookCommentRespDto;
+import com.sf.book.dto.inner.InnerBookCommentRespDto;
 import com.sf.book.dto.resp.BookInfoRespDto;
 import com.sf.book.service.IInnerBookService;
-import com.sf.core.dto.PageReqDto;
 import com.sf.core.dto.PageRespDto;
 import com.sf.core.dto.RestResp;
 import lombok.RequiredArgsConstructor;
@@ -28,10 +27,10 @@ public class InnerBookController {
 
     // 传递用户id 返回相关的评论信息
     @GetMapping("/api/inner/book/listCommentsByUserId")
-    public RestResp<PageRespDto<BookCommentRespDto>> listCommentsByUserId(
+    public RestResp<PageRespDto<InnerBookCommentRespDto>> listCommentsByUserId(
             @RequestParam("userId") Long userId, @RequestParam("pageNum") Integer pageNum, @RequestParam("pageSize") Integer pageSize) {
         System.out.println("listCommentsByUserId:" + userId + ",pageNum:" + pageNum + ",pageSize:" + pageSize);
-        PageRespDto<BookCommentRespDto> commentList = innerBookService.getCommentList(userId, pageNum, pageSize);
+        PageRespDto<InnerBookCommentRespDto> commentList = innerBookService.getCommentList(userId, pageNum, pageSize);
         System.out.println(commentList);
         return RestResp.ok(commentList);
     }

+ 1 - 2
novel-cloud-demo/novel-book/novel-book-service/src/main/java/com/sf/book/dto/inner/BookCommentRespDto.java → novel-cloud-demo/novel-book/novel-book-service/src/main/java/com/sf/book/dto/inner/InnerBookCommentRespDto.java

@@ -1,6 +1,5 @@
 package com.sf.book.dto.inner;
 
-import com.fasterxml.jackson.annotation.JsonFormat;
 import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
 import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
 import io.swagger.v3.oas.annotations.media.Schema;
@@ -11,7 +10,7 @@ import java.time.LocalDateTime;
 
 @Data
 @Builder
-public class BookCommentRespDto {
+public class InnerBookCommentRespDto {
 
     @Schema(description = "评论内容")
     private String commentContent;

+ 24 - 0
novel-cloud-demo/novel-book/novel-book-service/src/main/java/com/sf/book/dto/resp/BookCommentRespDto.java

@@ -0,0 +1,24 @@
+package com.sf.book.dto.resp;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Builder;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 小说评论 响应DTO
+ * @author xiongxiaoyang
+ * @date 2022/5/17
+ */
+@Data
+@Builder
+public class BookCommentRespDto {
+
+    @Schema(description = "评论总数")
+    private Long commentTotal;
+
+    @Schema(description = "评论列表")
+    private List<CommentInfoRespDto> comments;
+
+}

+ 32 - 0
novel-cloud-demo/novel-book/novel-book-service/src/main/java/com/sf/book/dto/resp/CommentInfoRespDto.java

@@ -0,0 +1,32 @@
+package com.sf.book.dto.resp;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Builder;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Data
+@Builder
+public class CommentInfoRespDto {
+
+    @Schema(description = "评论ID")
+    private Long id;
+
+    @Schema(description = "评论内容")
+    private String commentContent;
+
+    @Schema(description = "评论用户")
+    private String commentUser;
+
+    @Schema(description = "评论用户ID")
+    private Long commentUserId;
+
+    @Schema(description = "评论用户头像")
+    private String commentUserPhoto;
+
+    @Schema(description = "评论时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime commentTime;
+}

+ 3 - 1
novel-cloud-demo/novel-book/novel-book-service/src/main/java/com/sf/book/service/IBookCommentService.java

@@ -1,5 +1,7 @@
 package com.sf.book.service;
 
+import com.sf.book.dto.inner.InnerBookCommentRespDto;
+import com.sf.book.dto.resp.BookCommentRespDto;
 import com.sf.book.entity.BookComment;
 import com.baomidou.mybatisplus.extension.service.IService;
 
@@ -12,5 +14,5 @@ import com.baomidou.mybatisplus.extension.service.IService;
  * @since 2024-08-06
  */
 public interface IBookCommentService extends IService<BookComment> {
-
+    BookCommentRespDto commentNewestList(Long bookId);
 }

+ 2 - 3
novel-cloud-demo/novel-book/novel-book-service/src/main/java/com/sf/book/service/IInnerBookService.java

@@ -1,8 +1,7 @@
 package com.sf.book.service;
 
-import com.sf.book.dto.inner.BookCommentRespDto;
+import com.sf.book.dto.inner.InnerBookCommentRespDto;
 import com.sf.book.dto.resp.BookInfoRespDto;
-import com.sf.core.dto.PageReqDto;
 import com.sf.core.dto.PageRespDto;
 
 import java.util.List;
@@ -11,5 +10,5 @@ public interface IInnerBookService {
 
     List<BookInfoRespDto> listBookInfoByIds(List<Long> bookIds);
 
-    PageRespDto<BookCommentRespDto> getCommentList(Long userId, Integer pageNum, Integer pageSize);
+    PageRespDto<InnerBookCommentRespDto> getCommentList(Long userId, Integer pageNum, Integer pageSize);
 }

+ 58 - 0
novel-cloud-demo/novel-book/novel-book-service/src/main/java/com/sf/book/service/impl/BookCommentServiceImpl.java

@@ -1,11 +1,22 @@
 package com.sf.book.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.sf.book.dto.inner.InnerBookCommentRespDto;
+import com.sf.book.dto.resp.BookCommentRespDto;
+import com.sf.book.dto.resp.CommentInfoRespDto;
 import com.sf.book.entity.BookComment;
 import com.sf.book.mapper.BookCommentMapper;
 import com.sf.book.service.IBookCommentService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.sf.core.dto.RestResp;
+import com.sf.user.client.UserFeign;
+import com.sf.user.client.dto.InnerUserCommentRespDto;
+import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
 
+import java.util.*;
+import java.util.stream.Collectors;
+
 /**
  * <p>
  * 小说评论 服务实现类
@@ -15,6 +26,53 @@ import org.springframework.stereotype.Service;
  * @since 2024-08-06
  */
 @Service
+@RequiredArgsConstructor
 public class BookCommentServiceImpl extends ServiceImpl<BookCommentMapper, BookComment> implements IBookCommentService {
 
+    private final BookCommentMapper bookCommentMapper;
+    private final UserFeign userFeign;
+
+    @Override
+    public BookCommentRespDto commentNewestList(Long bookId) {
+        // select count(*) from book_comment where book_id = ''
+        LambdaQueryWrapper<BookComment> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(BookComment::getBookId, bookId);
+//        Long count = bookCommentMapper.selectCount(queryWrapper);
+
+        // select * from book_comment where book_id = ''
+        List<BookComment> bookComments = bookCommentMapper.selectList(queryWrapper);
+        int count = bookComments.size();
+
+        Set<Long> userSet = new HashSet<>();
+        for (BookComment bookComment : bookComments) {
+            userSet.add(bookComment.getUserId());
+        }
+
+        List<CommentInfoRespDto> commentInfoRespDtoList = new ArrayList<>();
+        RestResp<List<InnerUserCommentRespDto>> listRestResp = userFeign.listUserInfoByIds(userSet);
+        List<InnerUserCommentRespDto> data = listRestResp.getData();
+        Map<Long, InnerUserCommentRespDto> collected =
+                data.stream().collect(Collectors.toMap(InnerUserCommentRespDto::getUserId, t -> t));
+
+        for (BookComment bookComment : bookComments) {
+            // select * from user_info where id = ''
+//            UserInfo userInfo = userInfoMapper.selectById(bookComment.getUserId());
+            InnerUserCommentRespDto commentRespDto = collected.get(bookComment.getUserId());
+            CommentInfoRespDto commentInfoRespDto = CommentInfoRespDto.builder()
+                    .id(bookComment.getId()).commentContent(bookComment.getCommentContent())
+                    .commentUserId(bookComment.getUserId())
+                    .commentUser(commentRespDto.getUsername())
+                    .commentUserPhoto(commentRespDto.getUserPhoto())
+                    .commentTime(bookComment.getUpdateTime())
+                    .build();
+            commentInfoRespDtoList.add(commentInfoRespDto);
+        }
+
+        BookCommentRespDto bookCommentRespDto = BookCommentRespDto.builder()
+                .commentTotal((long) count)
+                .comments(commentInfoRespDtoList)
+                .build();
+
+        return bookCommentRespDto;
+    }
 }

+ 5 - 6
novel-cloud-demo/novel-book/novel-book-service/src/main/java/com/sf/book/service/impl/InnerBookServiceImpl.java

@@ -3,14 +3,13 @@ package com.sf.book.service.impl;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.sf.book.dto.inner.BookCommentRespDto;
+import com.sf.book.dto.inner.InnerBookCommentRespDto;
 import com.sf.book.dto.resp.BookInfoRespDto;
 import com.sf.book.entity.BookComment;
 import com.sf.book.entity.BookInfo;
 import com.sf.book.mapper.BookCommentMapper;
 import com.sf.book.mapper.BookInfoMapper;
 import com.sf.book.service.IInnerBookService;
-import com.sf.core.dto.PageReqDto;
 import com.sf.core.dto.PageRespDto;
 import lombok.RequiredArgsConstructor;
 import org.springframework.beans.BeanUtils;
@@ -40,7 +39,7 @@ public class InnerBookServiceImpl implements IInnerBookService {
     }
 
     @Override
-    public PageRespDto<BookCommentRespDto> getCommentList(Long userId, Integer pageNum, Integer pageSize) {
+    public PageRespDto<InnerBookCommentRespDto> getCommentList(Long userId, Integer pageNum, Integer pageSize) {
         // 根据userId获取评论信息
         LambdaQueryWrapper<BookComment> queryWrapper = new LambdaQueryWrapper<>();
         queryWrapper.eq(BookComment::getUserId, userId);
@@ -52,13 +51,13 @@ public class InnerBookServiceImpl implements IInnerBookService {
         List<BookComment> bookComments = selected.getRecords();
 
         // 将每一个查询到的book_comment 映射成最终要返回的dto
-        List<BookCommentRespDto> userCommentRespDtos = bookComments.stream().map(bookComment -> {
+        List<InnerBookCommentRespDto> userCommentRespDtos = bookComments.stream().map(bookComment -> {
             // 映射的逻辑是
             // 先通过查询到的book_id 找到book信息
             BookInfo bookInfo = bookInfoMapper.selectById(bookComment.getBookId());
             // 将book_info中的名字和封皮放入对应参数
             // 将book_comment中评论的内容和时间 放入对应参数
-            return BookCommentRespDto.builder()
+            return InnerBookCommentRespDto.builder()
                     .commentBook(bookInfo.getBookName())
                     .commentBookPic(bookInfo.getPicUrl())
                     .commentContent(bookComment.getCommentContent())
@@ -66,7 +65,7 @@ public class InnerBookServiceImpl implements IInnerBookService {
                     .build();
         }).toList();
         // 再将数据赋值给要返回的分页对象
-        PageRespDto<BookCommentRespDto> pageRespDto = PageRespDto.of(
+        PageRespDto<InnerBookCommentRespDto> pageRespDto = PageRespDto.of(
                 pageNum, pageSize, page.getTotal(), userCommentRespDtos);
         return pageRespDto;
     }

+ 5 - 1
novel-cloud-demo/novel-user/novel-user-api/pom.xml

@@ -18,6 +18,10 @@
     </properties>
 
     <dependencies>
-
+        <dependency>
+            <groupId>com.sf</groupId>
+            <artifactId>novel-core</artifactId>
+            <version>${project.version}</version>
+        </dependency>
     </dependencies>
 </project>

+ 17 - 0
novel-cloud-demo/novel-user/novel-user-api/src/main/java/com/sf/user/client/UserFeign.java

@@ -0,0 +1,17 @@
+package com.sf.user.client;
+
+import com.sf.core.dto.RestResp;
+import com.sf.user.client.dto.InnerUserCommentRespDto;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+
+import java.util.List;
+import java.util.Set;
+
+@FeignClient("novel-user-service")
+public interface UserFeign {
+
+    @PostMapping("/api/inner/user/listUserInfoByIds")
+    RestResp<List<InnerUserCommentRespDto>> listUserInfoByIds(@RequestBody Set<Long> userSet);
+}

+ 17 - 0
novel-cloud-demo/novel-user/novel-user-api/src/main/java/com/sf/user/client/dto/InnerUserCommentRespDto.java

@@ -0,0 +1,17 @@
+package com.sf.user.client.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class InnerUserCommentRespDto {
+
+    private Long userId;
+    private String username;
+    private String userPhoto;
+}

+ 27 - 0
novel-cloud-demo/novel-user/novel-user-service/src/main/java/com/sf/user/controller/inner/InnerUserController.java

@@ -0,0 +1,27 @@
+package com.sf.user.controller.inner;
+
+import com.sf.core.dto.RestResp;
+import com.sf.user.dto.inner.InnerUserCommentRespDto;
+import com.sf.user.service.IInnerUserService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+import java.util.Set;
+
+@RestController
+@RequiredArgsConstructor
+public class InnerUserController {
+
+    private final IInnerUserService iInnerUserService;
+
+    //根据一系列用户id返回用户信息
+    @PostMapping("/api/inner/user/listUserInfoByIds")
+    RestResp<List<InnerUserCommentRespDto>> listUserInfoByIds(@RequestBody Set<Long> userSet) {
+        List<InnerUserCommentRespDto> userCommentRespDtos = iInnerUserService.listUserInfoByIds(userSet);
+        return RestResp.ok(userCommentRespDtos);
+    }
+}

+ 17 - 0
novel-cloud-demo/novel-user/novel-user-service/src/main/java/com/sf/user/dto/inner/InnerUserCommentRespDto.java

@@ -0,0 +1,17 @@
+package com.sf.user.dto.inner;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class InnerUserCommentRespDto {
+
+    private Long userId;
+    private String username;
+    private String userPhoto;
+}

+ 12 - 0
novel-cloud-demo/novel-user/novel-user-service/src/main/java/com/sf/user/service/IInnerUserService.java

@@ -0,0 +1,12 @@
+package com.sf.user.service;
+
+import com.sf.user.dto.inner.InnerUserCommentRespDto;
+import org.springframework.web.bind.annotation.RequestBody;
+
+import java.util.List;
+import java.util.Set;
+
+public interface IInnerUserService {
+
+    List<InnerUserCommentRespDto> listUserInfoByIds(Set<Long> userSet);
+}

+ 33 - 0
novel-cloud-demo/novel-user/novel-user-service/src/main/java/com/sf/user/service/impl/InnerUserServiceImpl.java

@@ -0,0 +1,33 @@
+package com.sf.user.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.sf.user.dto.inner.InnerUserCommentRespDto;
+import com.sf.user.entity.UserInfo;
+import com.sf.user.mapper.UserInfoMapper;
+import com.sf.user.service.IInnerUserService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Set;
+
+@Service
+@RequiredArgsConstructor
+public class InnerUserServiceImpl implements IInnerUserService {
+
+    private final UserInfoMapper userInfoMapper;
+
+    @Override
+    public List<InnerUserCommentRespDto> listUserInfoByIds(Set<Long> userSet) {
+        // select * from book_info where id in ('','','');
+        LambdaQueryWrapper<UserInfo> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.in(UserInfo::getId, userSet);
+        List<UserInfo> userInfoList = userInfoMapper.selectList(queryWrapper);
+        List<InnerUserCommentRespDto> userCommentRespDtos = userInfoList.stream().map(
+                userInfo -> InnerUserCommentRespDto.builder()
+                        .userId(userInfo.getId()).username(userInfo.getUsername()).userPhoto(userInfo.getUserPhoto())
+                        .build()).toList();
+        return userCommentRespDtos;
+    }
+}