refactor: 基于 novel 项目 & Spring Cloud 2022 & Spring Cloud Alibaba 2022 重构

This commit is contained in:
xiongxiaoyang
2023-03-30 16:15:56 +08:00
parent d68ce51c82
commit 3d098eea5e
505 changed files with 14127 additions and 24067 deletions

View File

@@ -1,24 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>novel-book</artifactId>
<groupId>com.java2nb.novel</groupId>
<version>1.3.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>book-api</artifactId>
<dependencies>
<dependency>
<groupId>com.java2nb.novel</groupId>
<artifactId>novel-common</artifactId>
</dependency>
</dependencies>
</project>

View File

@@ -1,95 +0,0 @@
package com.java2nb.novel.book.api;
import com.java2nb.novel.book.entity.Book;
import com.java2nb.novel.book.entity.BookComment;
import com.java2nb.novel.book.vo.BookCommentVO;
import com.java2nb.novel.common.bean.PageBean;
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.RequestParam;
import java.util.Date;
import java.util.List;
/**
* 小说微服务API接口定义内部
* @author xiongxiaoyang
* @version 1.0
* @since 2020/5/28
*/
public interface BookApi {
/**
* 根据最小更新时间分页查询书籍列表
* @param minDate 最小时间,包括该时间
* @param limit 查询数量
* @return 书籍列表
* */
@GetMapping("api/book/queryBookByMinUpdateTime")
List<Book> queryBookByMinUpdateTime(@RequestParam("minDate") Date minDate,@RequestParam("limit") int limit);
/**
* 根据小说ID集合查询书籍列表
* @param ids 小说ID集合
* @return 书籍列表
* */
@GetMapping("api/book/queryBookByIds")
List<Book> queryBookByIds(@RequestBody List<Long> ids);
/**
* 小说排行数据查询列表
* @param type 排行类型1更新排行2新书排行3评论排行
* @param limit 查询数量
* @return 书籍列表
* */
@GetMapping("api/book/listRank")
List<Book> listRank(@RequestParam("type") Byte type, @RequestParam("limit") Integer limit);
/**
* 根据小说ID查询书籍
* @param id 小说ID
* @return 书籍对象
* */
@GetMapping("api/book/queryBookById")
Book queryBookById(@RequestParam("id") Long id);
/**
* 新增评论
* @param userId 用户ID
* @param comment 评论数据
* @return true:评论成功false:评论失败
* */
@PostMapping("api/book/addBookComment")
boolean addBookComment(@RequestParam("userId") Long userId,@RequestBody BookComment comment);
/**
* 分页查询用户评论
* @param userId 用户ID
* @param page 查询页码
* @param pageSize 分页大小
* @return 评论数据
* */
@GetMapping("api/book/listUserCommentByPage")
PageBean<BookComment> listUserCommentByPage(@RequestParam("userId") Long userId, @RequestParam("page") int page, @RequestParam("pageSize") int pageSize);
/**
* 查询网络图片的小说
*
* @param localPicPrefix
* @param limit 查询条数
* @return 返回小说集合
* */
@GetMapping("api/book/queryNetworkPicBooks")
List<Book> queryNetworkPicBooks(@RequestParam("localPicPrefix") String localPicPrefix,@RequestParam("limit") int limit);
/**
* 更新图片路径
* @param picUrl 图片路径
* @param bookId 小说ID
* @return true:更新成功false:更新失败
*/
@PostMapping("api/book/updateBookPic")
boolean updateBookPic(@RequestParam("picUrl") String picUrl,@RequestParam("bookId") Long bookId);
}

View File

@@ -1,60 +0,0 @@
package com.java2nb.novel.book.api.fallback;
import com.java2nb.novel.book.api.BookApi;
import com.java2nb.novel.book.entity.Book;
import com.java2nb.novel.book.entity.BookComment;
import com.java2nb.novel.common.bean.PageBean;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* 小说微服务API接口降级处理类服务提供端默认降级处理
* @author xiongxiaoyang
* @version 1.0
* @since 2020/6/7
*/
public class BookApiFallback implements BookApi {
@Override
public List<Book> queryBookByMinUpdateTime(Date minDate, int limit) {
return null;
}
@Override
public List<Book> queryBookByIds(List<Long> ids) {
return new ArrayList<>();
}
@Override
public List<Book> listRank(Byte type, Integer limit) {
return new ArrayList<>();
}
@Override
public Book queryBookById(Long id) {
return null;
}
@Override
public boolean addBookComment(Long userId, BookComment comment) {
return false;
}
@Override
public PageBean<BookComment> listUserCommentByPage(Long userId, int page, int pageSize) {
return new PageBean<>(new ArrayList<>());
}
@Override
public List<Book> queryNetworkPicBooks(String localPicPrefix, int limit) {
return new ArrayList<>();
}
@Override
public boolean updateBookPic(String picUrl, Long bookId) {
return false;
}
}

View File

@@ -1,359 +0,0 @@
package com.java2nb.novel.book.entity;
import io.swagger.annotations.ApiModelProperty;
import javax.annotation.Generated;
import java.io.Serializable;
import java.util.Date;
public class Book implements Serializable {
@ApiModelProperty(value = "主键")
@Generated("org.mybatis.generator.api.MyBatisGenerator")
private Long id;
@ApiModelProperty(value = "作品方向0男频1女频'")
@Generated("org.mybatis.generator.api.MyBatisGenerator")
private Byte workDirection;
@ApiModelProperty(value = "分类ID")
@Generated("org.mybatis.generator.api.MyBatisGenerator")
private Integer catId;
@ApiModelProperty(value = "分类名")
@Generated("org.mybatis.generator.api.MyBatisGenerator")
private String catName;
@ApiModelProperty(value = "小说封面")
@Generated("org.mybatis.generator.api.MyBatisGenerator")
private String picUrl;
@ApiModelProperty(value = "小说名")
@Generated("org.mybatis.generator.api.MyBatisGenerator")
private String bookName;
@ApiModelProperty(value = "作者id")
@Generated("org.mybatis.generator.api.MyBatisGenerator")
private Long authorId;
@ApiModelProperty(value = "作者名")
@Generated("org.mybatis.generator.api.MyBatisGenerator")
private String authorName;
@ApiModelProperty(value = "书籍描述")
@Generated("org.mybatis.generator.api.MyBatisGenerator")
private String bookDesc;
@ApiModelProperty(value = "评分")
@Generated("org.mybatis.generator.api.MyBatisGenerator")
private Float score;
@ApiModelProperty(value = "书籍状态0连载中1已完结")
@Generated("org.mybatis.generator.api.MyBatisGenerator")
private Byte bookStatus;
@ApiModelProperty(value = "点击量")
@Generated("org.mybatis.generator.api.MyBatisGenerator")
private Long visitCount;
@ApiModelProperty(value = "总字数")
@Generated("org.mybatis.generator.api.MyBatisGenerator")
private Integer wordCount;
@ApiModelProperty(value = "评论数")
@Generated("org.mybatis.generator.api.MyBatisGenerator")
private Integer commentCount;
@ApiModelProperty(value = "最新目录ID")
@Generated("org.mybatis.generator.api.MyBatisGenerator")
private Long lastIndexId;
@ApiModelProperty(value = "最新目录名")
@Generated("org.mybatis.generator.api.MyBatisGenerator")
private String lastIndexName;
@ApiModelProperty(value = "最新目录更新时间")
@Generated("org.mybatis.generator.api.MyBatisGenerator")
private Date lastIndexUpdateTime;
@ApiModelProperty(value = "是否收费1收费0免费")
@Generated("org.mybatis.generator.api.MyBatisGenerator")
private Byte isVip;
@ApiModelProperty(value = "状态0入库1上架")
@Generated("org.mybatis.generator.api.MyBatisGenerator")
private Byte status;
@ApiModelProperty(value = "更新时间")
@Generated("org.mybatis.generator.api.MyBatisGenerator")
private Date updateTime;
@ApiModelProperty(value = "创建时间")
@Generated("org.mybatis.generator.api.MyBatisGenerator")
private Date createTime;
@ApiModelProperty(value = "爬虫源站ID")
@Generated("org.mybatis.generator.api.MyBatisGenerator")
private Integer crawlSourceId;
@ApiModelProperty(value = "抓取的源站小说ID")
@Generated("org.mybatis.generator.api.MyBatisGenerator")
private String crawlBookId;
@ApiModelProperty(value = "最后一次的抓取时间")
@Generated("org.mybatis.generator.api.MyBatisGenerator")
private Date crawlLastTime;
@ApiModelProperty(value = "是否已停止更新0未停止1已停止")
@Generated("org.mybatis.generator.api.MyBatisGenerator")
private Byte crawlIsStop;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public Long getId() {
return id;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public void setId(Long id) {
this.id = id;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public Byte getWorkDirection() {
return workDirection;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public void setWorkDirection(Byte workDirection) {
this.workDirection = workDirection;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public Integer getCatId() {
return catId;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public void setCatId(Integer catId) {
this.catId = catId;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public String getCatName() {
return catName;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public void setCatName(String catName) {
this.catName = catName == null ? null : catName.trim();
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public String getPicUrl() {
return picUrl;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public void setPicUrl(String picUrl) {
this.picUrl = picUrl == null ? null : picUrl.trim();
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public String getBookName() {
return bookName;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public void setBookName(String bookName) {
this.bookName = bookName == null ? null : bookName.trim();
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public Long getAuthorId() {
return authorId;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public void setAuthorId(Long authorId) {
this.authorId = authorId;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public String getAuthorName() {
return authorName;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public void setAuthorName(String authorName) {
this.authorName = authorName == null ? null : authorName.trim();
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public String getBookDesc() {
return bookDesc;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public void setBookDesc(String bookDesc) {
this.bookDesc = bookDesc == null ? null : bookDesc.trim();
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public Float getScore() {
return score;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public void setScore(Float score) {
this.score = score;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public Byte getBookStatus() {
return bookStatus;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public void setBookStatus(Byte bookStatus) {
this.bookStatus = bookStatus;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public Long getVisitCount() {
return visitCount;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public void setVisitCount(Long visitCount) {
this.visitCount = visitCount;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public Integer getWordCount() {
return wordCount;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public void setWordCount(Integer wordCount) {
this.wordCount = wordCount;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public Integer getCommentCount() {
return commentCount;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public void setCommentCount(Integer commentCount) {
this.commentCount = commentCount;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public Long getLastIndexId() {
return lastIndexId;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public void setLastIndexId(Long lastIndexId) {
this.lastIndexId = lastIndexId;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public String getLastIndexName() {
return lastIndexName;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public void setLastIndexName(String lastIndexName) {
this.lastIndexName = lastIndexName == null ? null : lastIndexName.trim();
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public Date getLastIndexUpdateTime() {
return lastIndexUpdateTime;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public void setLastIndexUpdateTime(Date lastIndexUpdateTime) {
this.lastIndexUpdateTime = lastIndexUpdateTime;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public Byte getIsVip() {
return isVip;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public void setIsVip(Byte isVip) {
this.isVip = isVip;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public Byte getStatus() {
return status;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public void setStatus(Byte status) {
this.status = status;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public Date getUpdateTime() {
return updateTime;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public void setUpdateTime(Date updateTime) {
this.updateTime = updateTime;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public Date getCreateTime() {
return createTime;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public Integer getCrawlSourceId() {
return crawlSourceId;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public void setCrawlSourceId(Integer crawlSourceId) {
this.crawlSourceId = crawlSourceId;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public String getCrawlBookId() {
return crawlBookId;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public void setCrawlBookId(String crawlBookId) {
this.crawlBookId = crawlBookId == null ? null : crawlBookId.trim();
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public Date getCrawlLastTime() {
return crawlLastTime;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public void setCrawlLastTime(Date crawlLastTime) {
this.crawlLastTime = crawlLastTime;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public Byte getCrawlIsStop() {
return crawlIsStop;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public void setCrawlIsStop(Byte crawlIsStop) {
this.crawlIsStop = crawlIsStop;
}
}

View File

@@ -1,116 +0,0 @@
package com.java2nb.novel.book.entity;
import io.swagger.annotations.ApiModelProperty;
import javax.annotation.Generated;
import java.util.Date;
public class BookCategory {
@ApiModelProperty(value = "主键")
@Generated("org.mybatis.generator.api.MyBatisGenerator")
private Integer id;
@ApiModelProperty(value = "作品方向0男频1女频'")
@Generated("org.mybatis.generator.api.MyBatisGenerator")
private Byte workDirection;
@ApiModelProperty(value = "分类名")
@Generated("org.mybatis.generator.api.MyBatisGenerator")
private String name;
@ApiModelProperty(value = "排序")
@Generated("org.mybatis.generator.api.MyBatisGenerator")
private Byte sort;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
private Long createUserId;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
private Date createTime;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
private Long updateUserId;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
private Date updateTime;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public Integer getId() {
return id;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public void setId(Integer id) {
this.id = id;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public Byte getWorkDirection() {
return workDirection;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public void setWorkDirection(Byte workDirection) {
this.workDirection = workDirection;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public String getName() {
return name;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public void setName(String name) {
this.name = name == null ? null : name.trim();
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public Byte getSort() {
return sort;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public void setSort(Byte sort) {
this.sort = sort;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public Long getCreateUserId() {
return createUserId;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public void setCreateUserId(Long createUserId) {
this.createUserId = createUserId;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public Date getCreateTime() {
return createTime;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public Long getUpdateUserId() {
return updateUserId;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public void setUpdateUserId(Long updateUserId) {
this.updateUserId = updateUserId;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public Date getUpdateTime() {
return updateTime;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public void setUpdateTime(Date updateTime) {
this.updateTime = updateTime;
}
}

View File

@@ -1,107 +0,0 @@
package com.java2nb.novel.book.entity;
import io.swagger.annotations.ApiModelProperty;
import javax.annotation.Generated;
import java.io.Serializable;
import java.util.Date;
public class BookComment implements Serializable {
@ApiModelProperty(value = "主键")
@Generated("org.mybatis.generator.api.MyBatisGenerator")
private Long id;
@ApiModelProperty(value = "小说ID")
@Generated("org.mybatis.generator.api.MyBatisGenerator")
private Long bookId;
@ApiModelProperty(value = "评价内容")
@Generated("org.mybatis.generator.api.MyBatisGenerator")
private String commentContent;
@ApiModelProperty(value = "回复数量")
@Generated("org.mybatis.generator.api.MyBatisGenerator")
private Integer replyCount;
@ApiModelProperty(value = "审核状态0待审核1审核通过2审核不通过")
@Generated("org.mybatis.generator.api.MyBatisGenerator")
private Byte auditStatus;
@ApiModelProperty(value = "评价时间")
@Generated("org.mybatis.generator.api.MyBatisGenerator")
private Date createTime;
@ApiModelProperty(value = "评价人")
@Generated("org.mybatis.generator.api.MyBatisGenerator")
private Long createUserId;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public Long getId() {
return id;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public void setId(Long id) {
this.id = id;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public Long getBookId() {
return bookId;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public void setBookId(Long bookId) {
this.bookId = bookId;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public String getCommentContent() {
return commentContent;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public void setCommentContent(String commentContent) {
this.commentContent = commentContent == null ? null : commentContent.trim();
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public Integer getReplyCount() {
return replyCount;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public void setReplyCount(Integer replyCount) {
this.replyCount = replyCount;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public Byte getAuditStatus() {
return auditStatus;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public void setAuditStatus(Byte auditStatus) {
this.auditStatus = auditStatus;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public Date getCreateTime() {
return createTime;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public Long getCreateUserId() {
return createUserId;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public void setCreateUserId(Long createUserId) {
this.createUserId = createUserId;
}
}

View File

@@ -1,92 +0,0 @@
package com.java2nb.novel.book.entity;
import io.swagger.annotations.ApiModelProperty;
import javax.annotation.Generated;
import java.util.Date;
public class BookCommentReply {
@ApiModelProperty(value = "主键")
@Generated("org.mybatis.generator.api.MyBatisGenerator")
private Long id;
@ApiModelProperty(value = "评论ID")
@Generated("org.mybatis.generator.api.MyBatisGenerator")
private Long commentId;
@ApiModelProperty(value = "回复内容")
@Generated("org.mybatis.generator.api.MyBatisGenerator")
private String replyContent;
@ApiModelProperty(value = "审核状态0待审核1审核通过2审核不通过")
@Generated("org.mybatis.generator.api.MyBatisGenerator")
private Byte auditStatus;
@ApiModelProperty(value = "回复用户ID")
@Generated("org.mybatis.generator.api.MyBatisGenerator")
private Date createTime;
@ApiModelProperty(value = "回复时间")
@Generated("org.mybatis.generator.api.MyBatisGenerator")
private Long createUserId;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public Long getId() {
return id;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public void setId(Long id) {
this.id = id;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public Long getCommentId() {
return commentId;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public void setCommentId(Long commentId) {
this.commentId = commentId;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public String getReplyContent() {
return replyContent;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public void setReplyContent(String replyContent) {
this.replyContent = replyContent == null ? null : replyContent.trim();
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public Byte getAuditStatus() {
return auditStatus;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public void setAuditStatus(Byte auditStatus) {
this.auditStatus = auditStatus;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public Date getCreateTime() {
return createTime;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public Long getCreateUserId() {
return createUserId;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public void setCreateUserId(Long createUserId) {
this.createUserId = createUserId;
}
}

View File

@@ -1,49 +0,0 @@
package com.java2nb.novel.book.entity;
import io.swagger.annotations.ApiModelProperty;
import javax.annotation.Generated;
public class BookContent {
@ApiModelProperty(value = "主键")
@Generated("org.mybatis.generator.api.MyBatisGenerator")
private Long id;
@ApiModelProperty(value = "目录ID")
@Generated("org.mybatis.generator.api.MyBatisGenerator")
private Long indexId;
@ApiModelProperty(value = "小说章节内容")
@Generated("org.mybatis.generator.api.MyBatisGenerator")
private String content;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public Long getId() {
return id;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public void setId(Long id) {
this.id = id;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public Long getIndexId() {
return indexId;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public void setIndexId(Long indexId) {
this.indexId = indexId;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public String getContent() {
return content;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public void setContent(String content) {
this.content = content == null ? null : content.trim();
}
}

View File

@@ -1,118 +0,0 @@
package com.java2nb.novel.book.entity;
import io.swagger.annotations.ApiModelProperty;
import javax.annotation.Generated;
import java.util.Date;
public class BookIndex {
@ApiModelProperty(value = "主键")
@Generated("org.mybatis.generator.api.MyBatisGenerator")
private Long id;
@ApiModelProperty(value = "小说ID")
@Generated("org.mybatis.generator.api.MyBatisGenerator")
private Long bookId;
@ApiModelProperty(value = "目录号")
@Generated("org.mybatis.generator.api.MyBatisGenerator")
private Integer indexNum;
@ApiModelProperty(value = "目录名")
@Generated("org.mybatis.generator.api.MyBatisGenerator")
private String indexName;
@ApiModelProperty(value = "字数")
@Generated("org.mybatis.generator.api.MyBatisGenerator")
private Integer wordCount;
@ApiModelProperty(value = "是否收费1收费0免费")
@Generated("org.mybatis.generator.api.MyBatisGenerator")
private Byte isVip;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
private Date createTime;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
private Date updateTime;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public Long getId() {
return id;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public void setId(Long id) {
this.id = id;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public Long getBookId() {
return bookId;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public void setBookId(Long bookId) {
this.bookId = bookId;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public Integer getIndexNum() {
return indexNum;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public void setIndexNum(Integer indexNum) {
this.indexNum = indexNum;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public String getIndexName() {
return indexName;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public void setIndexName(String indexName) {
this.indexName = indexName == null ? null : indexName.trim();
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public Integer getWordCount() {
return wordCount;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public void setWordCount(Integer wordCount) {
this.wordCount = wordCount;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public Byte getIsVip() {
return isVip;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public void setIsVip(Byte isVip) {
this.isVip = isVip;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public Date getCreateTime() {
return createTime;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public Date getUpdateTime() {
return updateTime;
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public void setUpdateTime(Date updateTime) {
this.updateTime = updateTime;
}
}

View File

@@ -1,31 +0,0 @@
package com.java2nb.novel.book.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.java2nb.novel.book.entity.BookComment;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
/**
* 小说评论VO对象
* @author xiongxiaoyang
* @version 1.0
* @since 2020/5/28
*/
@Data
public class BookCommentVO extends BookComment {
private String createUserName;
private String createUserPhoto;
@ApiModelProperty(value = "评价时间")
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
@Override
public String toString() {
return super.toString();
}
}

View File

@@ -1,24 +0,0 @@
package com.java2nb.novel.book.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.java2nb.novel.book.entity.Book;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
/**
* 小说VO对象
* @author xiongxiaoyang
* @version 1.0
* @since 2020/5/27
*/
@Data
public class BookVO extends Book{
@ApiModelProperty(value = "最新目录更新时间")
@JsonFormat(timezone = "GMT+8", pattern = "MM/dd HH:mm")
private Date lastIndexUpdateTime;
}

View File

@@ -1,93 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>novel-book</artifactId>
<groupId>com.java2nb.novel</groupId>
<version>1.3.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>book-service</artifactId>
<dependencies>
<dependency>
<groupId>com.java2nb.novel</groupId>
<artifactId>book-api</artifactId>
</dependency>
<dependency>
<groupId>com.java2nb.novel</groupId>
<artifactId>user-api</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-netflix-hystrix</artifactId>
</dependency>
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson-spring-boot-starter</artifactId>
</dependency>
<!-- 分库分表-->
<!-- sharding jdbc依赖 -->
<dependency>
<groupId>io.shardingsphere</groupId>
<artifactId>sharding-jdbc-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>io.shardingsphere</groupId>
<artifactId>sharding-jdbc-spring-namespace</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<!--<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>${docker.maven.plugin.version}</version>
<executions>
<execution>
<id>build-image</id>
<phase>package</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
</executions>
<configuration>
<imageName>201206030/${project.artifactId}:${project.version}</imageName>
<dockerHost>${docker.host}</dockerHost>
<baseImage>java:8</baseImage>
<entryPoint>["java", "-jar","/${project.build.finalName}.jar"]</entryPoint>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>-->
</plugins>
</build>
</project>

View File

@@ -1,30 +0,0 @@
package com.java2nb.novel;
import com.java2nb.novel.common.cache.CacheService;
import com.java2nb.novel.common.cache.impl.RedisServiceImpl;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration;
import org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.FilterType;
/**
* 小说微服务启动器
* @author xiongxiaoyang
* @version 1.0
* @since 2020/5/27
*/
@SpringBootApplication(exclude={
RedisAutoConfiguration.class,
RedisRepositoriesAutoConfiguration.class
})
//@ComponentScan(excludeFilters = {@ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, classes = {CacheService.class})})
@EnableFeignClients
public class BookApplication {
public static void main(String[] args) {
SpringApplication.run(BookApplication.class);
}
}

View File

@@ -1,171 +0,0 @@
package com.java2nb.novel.book.controller;
import com.java2nb.novel.book.entity.*;
import com.java2nb.novel.book.service.BookService;
import com.java2nb.novel.book.vo.BookCommentVO;
import com.java2nb.novel.common.bean.PageBean;
import com.java2nb.novel.common.bean.ResultBean;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.web.bind.annotation.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 小说微服务Controller
* @author xiongxiaoyang
* @version 1.0
* @since 2020/5/27
*/
@RestController
@RequestMapping("book")
@RequiredArgsConstructor
@Slf4j
@Api(tags = "小说相关接口")
public class BookController {
private final BookService bookService;
private final RabbitTemplate rabbitTemplate;
/**
* 小说分类列表查询接口
*/
@ApiOperation("小说分类列表查询接口")
@GetMapping("listBookCategory")
public ResultBean<List<BookCategory>> listBookCategory() {
return ResultBean.ok(bookService.listBookCategory());
}
/**
* 小说详情信息查询接口
*/
@ApiOperation("小说详情信息查询接口")
@GetMapping("{id}")
public ResultBean<Book> queryBookDetail(@ApiParam("小说ID") @PathVariable("id") Long id) {
return ResultBean.ok(bookService.queryBookDetail(id));
}
/**
* 小说排行信息查询接口
*/
@ApiOperation("小说排行信息查询接口")
@GetMapping("listRank")
public ResultBean<List<Book>> listRank(@ApiParam(value = "排行类型0:点击排行1更新排行2新书排行3评论排行", defaultValue = "0") @RequestParam(value = "type", defaultValue = "0") Byte type) {
return ResultBean.ok(bookService.listRank(type, 30));
}
/**
* 点击量新增接口
*/
@ApiOperation("点击量新增接口")
@PostMapping("addVisitCount")
public ResultBean addVisitCount(@ApiParam("小说ID") @RequestParam("bookId") Long bookId) {
rabbitTemplate.convertAndSend("ADD-BOOK-VISIT-EXCHANGE", null, bookId);
return ResultBean.ok();
}
/**
* 章节相关信息查询接口
* */
@ApiOperation("章节相关信息查询接口")
@GetMapping("queryBookIndexAbout")
public ResultBean<Map<String,Object>> queryBookIndexAbout(@ApiParam("小说ID") @RequestParam("bookId") Long bookId,@ApiParam("最新章节目录ID") @RequestParam("lastBookIndexId") Long lastBookIndexId) {
Map<String,Object> data = new HashMap<>(2);
//查询章节总数
data.put("bookIndexCount",bookService.queryIndexCount(bookId));
//查询最新章节内容
String lastBookContent = bookService.queryBookContent(lastBookIndexId).getContent();
if(lastBookContent.length()>42){
lastBookContent=lastBookContent.substring(0,42);
}
data.put("lastBookContent",lastBookContent);
return ResultBean.ok(data);
}
/**
* 同类推荐书籍查询接口
* */
@ApiOperation("同类推荐书籍查询接口")
@GetMapping("listRecBookByCatId")
public ResultBean<List<Book>> listRecBookByCatId(@ApiParam("小说分类ID") @RequestParam("catId") Integer catId) {
return ResultBean.ok(bookService.listRecBookByCatId(catId));
}
/**
*书籍评论列表分页查询接口
* */
@ApiOperation("书籍评论列表分页查询接口")
@GetMapping("listCommentByPage")
public ResultBean<PageBean<BookComment>> listCommentByPage(@ApiParam("小说ID") @RequestParam("bookId") Long bookId, @ApiParam("当前页码") @RequestParam(value = "curr", defaultValue = "1") int page, @ApiParam("分页大小") @RequestParam(value = "limit", defaultValue = "5") int pageSize) {
return ResultBean.ok(bookService.listBookCommentByPage(bookId,page,pageSize));
}
/**
* 小说目录列表查询接口
* */
@ApiOperation("小说目录列表查询接口")
@GetMapping("listNewIndex")
public ResultBean<List<BookIndex>> listNewIndex(@ApiParam("小说ID") @RequestParam("bookId") Long bookId,@ApiParam(value = "排序字符串,为空则按目录号排序") @RequestParam("orderBy") String orderBy,@ApiParam(value = "查询数量,为空则全部查询") @RequestParam("limit") Integer limit){
return ResultBean.ok(bookService.listNewIndex(bookId,orderBy,limit));
}
/**
* 首章目录ID查询接口
* */
@ApiOperation("首章目录ID查询接口")
@GetMapping("queryFirstBookIndexId")
public ResultBean<Long> queryFirstBookIndexId(@ApiParam("小说ID") @RequestParam("bookId") Long bookId){
return ResultBean.ok(bookService.queryFirstBookIndexId(bookId));
}
/**
* 目录查询接口
* */
@ApiOperation("目录查询接口")
@GetMapping("queryBookIndex")
public ResultBean<BookIndex> queryBookIndex(@ApiParam("目录ID") @RequestParam("bookIndexId") Long bookIndexId){
return ResultBean.ok(bookService.queryBookIndex(bookIndexId));
}
/**
* 上一章节和下一章节目录ID查询接口
* */
@ApiOperation("上一章节和下一章节目录ID查询接口")
@GetMapping("queryPreAndNextBookIndexId")
public ResultBean<Map<String,Long>> queryPreAndNextBookIndexId(@ApiParam("小说ID") @RequestParam("bookId") Long bookId,@ApiParam("目录号") @RequestParam("indexNum") Integer indexNum){
return ResultBean.ok(bookService.queryPreAndNextBookIndexId(bookId,indexNum));
}
/**
* 内容查询接口
* */
@ApiOperation("内容查询接口")
@GetMapping("queryBookContent")
public ResultBean<BookContent> queryBookContent(@ApiParam("目录ID") @RequestParam("bookIndexId") Long bookIndexId){
return ResultBean.ok(bookService.queryBookContent(bookIndexId));
}
}

View File

@@ -1,120 +0,0 @@
package com.java2nb.novel.book.controller.api;
import com.java2nb.novel.book.entity.Book;
import com.java2nb.novel.book.entity.BookComment;
import com.java2nb.novel.book.service.BookService;
import com.java2nb.novel.book.vo.BookCommentVO;
import com.java2nb.novel.common.bean.PageBean;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
import springfox.documentation.annotations.ApiIgnore;
import java.util.Date;
import java.util.List;
/**
* 小说微服务API接口内部调用
* @author xiongxiaoyang
* @version 1.0
* @since 2020/5/27
*/
@RestController
@RequestMapping(("api/book"))
@ApiIgnore
@RequiredArgsConstructor
public class BookApi {
private final BookService bookService;
/**
* 根据最小更新时间分页查询书籍列表
* @param minDate 最小时间,包括该时间
* @param limit 查询数量
* @return 书籍列表
* */
@GetMapping("queryBookByMinUpdateTime")
List<Book> queryBookByMinUpdateTime(Date minDate, int limit){
return bookService.queryBookByMinUpdateTime(minDate,limit);
}
/**
* 根据小说ID集合查询书籍列表
* @param ids 小说ID集合
* @return 书籍列表
* */
@GetMapping("queryBookByIds")
List<Book> queryBookByIds(@RequestBody List<Long> ids){
return bookService.queryBookByIds(ids);
}
/**
* 小说排行数据查询列表
* @param type 排行类型1更新排行2新书排行3评论排行
* @param limit 查询数量
* @return 书籍列表
* */
@GetMapping("listRank")
List<Book> listRank(Byte type, Integer limit){
return bookService.listRank(type,limit);
}
/**
* 根据小说ID查询书籍
* @param id 小说ID
* @return 书籍对象
* */
@GetMapping("queryBookById")
Book queryBookById(@RequestParam("id") Long id){
return bookService.queryBookDetail(id);
}
/**
* 新增评论
* @param userId 用户ID
* @param comment 评论数据
* */
@PostMapping("addBookComment")
boolean addBookComment(@RequestParam("userId") Long userId, @RequestBody BookComment comment){
bookService.addBookComment(userId,comment);
return true;
}
/**
* 分页查询用户评论
* @param userId 用户ID
* @param page 查询页码
* @param pageSize 分页大小
* @return 评论数据
* */
@GetMapping("listUserCommentByPage")
PageBean<BookComment> listUserCommentByPage(@RequestParam("userId") Long userId, @RequestParam("page") int page, @RequestParam("pageSize") int pageSize){
return bookService.listUserCommentByPage(userId,page,pageSize);
}
/**
* 查询网络图片的小说
*
* @param localPicPrefix
* @param limit 查询条数
* @return 返回小说集合
* */
@GetMapping("queryNetworkPicBooks")
List<Book> queryNetworkPicBooks(@RequestParam("localPicPrefix") String localPicPrefix,@RequestParam("limit") int limit){
return bookService.queryNetworkPicBooks(localPicPrefix,limit);
}
/**
* 更新图片路径
* @param picUrl 图片路径
* @param bookId 小说ID
*/
@PostMapping("updateBookPic")
boolean updateBookPic(@RequestParam("picUrl") String picUrl,@RequestParam("bookId") Long bookId){
bookService.updateBookPic(picUrl,bookId);
return true;
}
}

View File

@@ -1,15 +0,0 @@
package com.java2nb.novel.book.feign;
import com.java2nb.novel.user.api.UserApi;
import org.springframework.cloud.openfeign.FeignClient;
/**
* 用户服务Feign客户端
* @author xiongxiaoyang
* @version 1.0
* @since 2020/5/28
*/
@FeignClient("user-service")
public interface UserFeignClient extends UserApi {
}

View File

@@ -1,73 +0,0 @@
package com.java2nb.novel.book.listener;
import com.java2nb.novel.book.service.BookService;
import com.java2nb.novel.common.cache.CacheKey;
import com.java2nb.novel.common.cache.CacheService;
import com.java2nb.novel.common.utils.Constants;
import com.rabbitmq.client.Channel;
import lombok.RequiredArgsConstructor;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
/**
* 消息监听器
* @author xiongxiaoyang
* @version 1.0
* @since 2020/6/2
*/
@Component
@Slf4j
@RequiredArgsConstructor
public class BookVisitAddListener {
private final BookService bookService;
private final CacheService cacheService;
private final RedissonClient redissonClient;
/**
* 更新数据库
* 流量削峰每本小说累积10个点击更新一次
*/
@SneakyThrows
@RabbitListener(queues = {"UPDATE-DB-QUEUE"})
public void updateDb(Long bookId, Channel channel, Message message) {
log.debug("收到更新数据库消息:" + bookId);
RLock lock = redissonClient.getLock("addVisitCountToDb");
lock.lock();
try {
Integer visitCount = (Integer) cacheService.getObject(CacheKey.BOOK_ADD_VISIT_COUNT + bookId);
if (visitCount == null) {
visitCount = 0;
}
cacheService.setObject(CacheKey.BOOK_ADD_VISIT_COUNT + bookId, ++visitCount);
if (visitCount >= Constants.ADD_MAX_VISIT_COUNT) {
bookService.addVisitCount(bookId, visitCount);
cacheService.del(CacheKey.BOOK_ADD_VISIT_COUNT + bookId);
}
}catch (Exception e){
log.error("更新数据库失败"+bookId);
}
lock.unlock();
Thread.sleep(1000 * 2);
}
}

View File

@@ -1,60 +0,0 @@
package com.java2nb.novel.book.mapper;
import org.mybatis.dynamic.sql.SqlColumn;
import org.mybatis.dynamic.sql.SqlTable;
import javax.annotation.Generated;
import java.sql.JDBCType;
import java.util.Date;
public final class BookCategoryDynamicSqlSupport {
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final BookCategory bookCategory = new BookCategory();
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final SqlColumn<Integer> id = bookCategory.id;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final SqlColumn<Byte> workDirection = bookCategory.workDirection;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final SqlColumn<String> name = bookCategory.name;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final SqlColumn<Byte> sort = bookCategory.sort;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final SqlColumn<Long> createUserId = bookCategory.createUserId;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final SqlColumn<Date> createTime = bookCategory.createTime;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final SqlColumn<Long> updateUserId = bookCategory.updateUserId;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final SqlColumn<Date> updateTime = bookCategory.updateTime;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final class BookCategory extends SqlTable {
public final SqlColumn<Integer> id = column("id", JDBCType.INTEGER);
public final SqlColumn<Byte> workDirection = column("work_direction", JDBCType.TINYINT);
public final SqlColumn<String> name = column("name", JDBCType.VARCHAR);
public final SqlColumn<Byte> sort = column("sort", JDBCType.TINYINT);
public final SqlColumn<Long> createUserId = column("create_user_id", JDBCType.BIGINT);
public final SqlColumn<Date> createTime = column("create_time", JDBCType.TIMESTAMP);
public final SqlColumn<Long> updateUserId = column("update_user_id", JDBCType.BIGINT);
public final SqlColumn<Date> updateTime = column("update_time", JDBCType.TIMESTAMP);
public BookCategory() {
super("book_category");
}
}
}

View File

@@ -1,191 +0,0 @@
package com.java2nb.novel.book.mapper;
import com.java2nb.novel.book.entity.BookCategory;
import org.apache.ibatis.annotations.*;
import org.apache.ibatis.type.JdbcType;
import org.mybatis.dynamic.sql.SqlBuilder;
import org.mybatis.dynamic.sql.delete.DeleteDSL;
import org.mybatis.dynamic.sql.delete.MyBatis3DeleteModelAdapter;
import org.mybatis.dynamic.sql.delete.render.DeleteStatementProvider;
import org.mybatis.dynamic.sql.insert.render.InsertStatementProvider;
import org.mybatis.dynamic.sql.render.RenderingStrategy;
import org.mybatis.dynamic.sql.select.MyBatis3SelectModelAdapter;
import org.mybatis.dynamic.sql.select.QueryExpressionDSL;
import org.mybatis.dynamic.sql.select.SelectDSL;
import org.mybatis.dynamic.sql.select.render.SelectStatementProvider;
import org.mybatis.dynamic.sql.update.MyBatis3UpdateModelAdapter;
import org.mybatis.dynamic.sql.update.UpdateDSL;
import org.mybatis.dynamic.sql.update.render.UpdateStatementProvider;
import org.mybatis.dynamic.sql.util.SqlProviderAdapter;
import javax.annotation.Generated;
import java.util.List;
import static com.java2nb.novel.book.mapper.BookCategoryDynamicSqlSupport.*;
import static org.mybatis.dynamic.sql.SqlBuilder.isEqualTo;
@Mapper
public interface BookCategoryMapper {
@Generated("org.mybatis.generator.api.MyBatisGenerator")
@SelectProvider(type=SqlProviderAdapter.class, method="select")
long count(SelectStatementProvider selectStatement);
@Generated("org.mybatis.generator.api.MyBatisGenerator")
@DeleteProvider(type=SqlProviderAdapter.class, method="delete")
int delete(DeleteStatementProvider deleteStatement);
@Generated("org.mybatis.generator.api.MyBatisGenerator")
@InsertProvider(type=SqlProviderAdapter.class, method="insert")
int insert(InsertStatementProvider<BookCategory> insertStatement);
@Generated("org.mybatis.generator.api.MyBatisGenerator")
@SelectProvider(type=SqlProviderAdapter.class, method="select")
@ResultMap("BookCategoryResult")
BookCategory selectOne(SelectStatementProvider selectStatement);
@Generated("org.mybatis.generator.api.MyBatisGenerator")
@SelectProvider(type=SqlProviderAdapter.class, method="select")
@Results(id="BookCategoryResult", value = {
@Result(column="id", property="id", jdbcType=JdbcType.INTEGER, id=true),
@Result(column="work_direction", property="workDirection", jdbcType=JdbcType.TINYINT),
@Result(column="name", property="name", jdbcType=JdbcType.VARCHAR),
@Result(column="sort", property="sort", jdbcType=JdbcType.TINYINT),
@Result(column="create_user_id", property="createUserId", jdbcType=JdbcType.BIGINT),
@Result(column="create_time", property="createTime", jdbcType=JdbcType.TIMESTAMP),
@Result(column="update_user_id", property="updateUserId", jdbcType=JdbcType.BIGINT),
@Result(column="update_time", property="updateTime", jdbcType=JdbcType.TIMESTAMP)
})
List<BookCategory> selectMany(SelectStatementProvider selectStatement);
@Generated("org.mybatis.generator.api.MyBatisGenerator")
@UpdateProvider(type=SqlProviderAdapter.class, method="update")
int update(UpdateStatementProvider updateStatement);
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default QueryExpressionDSL<MyBatis3SelectModelAdapter<Long>> countByExample() {
return SelectDSL.selectWithMapper(this::count, SqlBuilder.count())
.from(bookCategory);
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default DeleteDSL<MyBatis3DeleteModelAdapter<Integer>> deleteByExample() {
return DeleteDSL.deleteFromWithMapper(this::delete, bookCategory);
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default int deleteByPrimaryKey(Integer id_) {
return DeleteDSL.deleteFromWithMapper(this::delete, bookCategory)
.where(id, isEqualTo(id_))
.build()
.execute();
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default int insert(BookCategory record) {
return insert(SqlBuilder.insert(record)
.into(bookCategory)
.map(id).toProperty("id")
.map(workDirection).toProperty("workDirection")
.map(name).toProperty("name")
.map(sort).toProperty("sort")
.map(createUserId).toProperty("createUserId")
.map(createTime).toProperty("createTime")
.map(updateUserId).toProperty("updateUserId")
.map(updateTime).toProperty("updateTime")
.build()
.render(RenderingStrategy.MYBATIS3));
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default int insertSelective(BookCategory record) {
return insert(SqlBuilder.insert(record)
.into(bookCategory)
.map(id).toPropertyWhenPresent("id", record::getId)
.map(workDirection).toPropertyWhenPresent("workDirection", record::getWorkDirection)
.map(name).toPropertyWhenPresent("name", record::getName)
.map(sort).toPropertyWhenPresent("sort", record::getSort)
.map(createUserId).toPropertyWhenPresent("createUserId", record::getCreateUserId)
.map(createTime).toPropertyWhenPresent("createTime", record::getCreateTime)
.map(updateUserId).toPropertyWhenPresent("updateUserId", record::getUpdateUserId)
.map(updateTime).toPropertyWhenPresent("updateTime", record::getUpdateTime)
.build()
.render(RenderingStrategy.MYBATIS3));
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default QueryExpressionDSL<MyBatis3SelectModelAdapter<List<BookCategory>>> selectByExample() {
return SelectDSL.selectWithMapper(this::selectMany, id, workDirection, name, sort, createUserId, createTime, updateUserId, updateTime)
.from(bookCategory);
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default QueryExpressionDSL<MyBatis3SelectModelAdapter<List<BookCategory>>> selectDistinctByExample() {
return SelectDSL.selectDistinctWithMapper(this::selectMany, id, workDirection, name, sort, createUserId, createTime, updateUserId, updateTime)
.from(bookCategory);
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default BookCategory selectByPrimaryKey(Integer id_) {
return SelectDSL.selectWithMapper(this::selectOne, id, workDirection, name, sort, createUserId, createTime, updateUserId, updateTime)
.from(bookCategory)
.where(id, isEqualTo(id_))
.build()
.execute();
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default UpdateDSL<MyBatis3UpdateModelAdapter<Integer>> updateByExample(BookCategory record) {
return UpdateDSL.updateWithMapper(this::update, bookCategory)
.set(id).equalTo(record::getId)
.set(workDirection).equalTo(record::getWorkDirection)
.set(name).equalTo(record::getName)
.set(sort).equalTo(record::getSort)
.set(createUserId).equalTo(record::getCreateUserId)
.set(createTime).equalTo(record::getCreateTime)
.set(updateUserId).equalTo(record::getUpdateUserId)
.set(updateTime).equalTo(record::getUpdateTime);
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default UpdateDSL<MyBatis3UpdateModelAdapter<Integer>> updateByExampleSelective(BookCategory record) {
return UpdateDSL.updateWithMapper(this::update, bookCategory)
.set(id).equalToWhenPresent(record::getId)
.set(workDirection).equalToWhenPresent(record::getWorkDirection)
.set(name).equalToWhenPresent(record::getName)
.set(sort).equalToWhenPresent(record::getSort)
.set(createUserId).equalToWhenPresent(record::getCreateUserId)
.set(createTime).equalToWhenPresent(record::getCreateTime)
.set(updateUserId).equalToWhenPresent(record::getUpdateUserId)
.set(updateTime).equalToWhenPresent(record::getUpdateTime);
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default int updateByPrimaryKey(BookCategory record) {
return UpdateDSL.updateWithMapper(this::update, bookCategory)
.set(workDirection).equalTo(record::getWorkDirection)
.set(name).equalTo(record::getName)
.set(sort).equalTo(record::getSort)
.set(createUserId).equalTo(record::getCreateUserId)
.set(createTime).equalTo(record::getCreateTime)
.set(updateUserId).equalTo(record::getUpdateUserId)
.set(updateTime).equalTo(record::getUpdateTime)
.where(id, isEqualTo(record::getId))
.build()
.execute();
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default int updateByPrimaryKeySelective(BookCategory record) {
return UpdateDSL.updateWithMapper(this::update, bookCategory)
.set(workDirection).equalToWhenPresent(record::getWorkDirection)
.set(name).equalToWhenPresent(record::getName)
.set(sort).equalToWhenPresent(record::getSort)
.set(createUserId).equalToWhenPresent(record::getCreateUserId)
.set(createTime).equalToWhenPresent(record::getCreateTime)
.set(updateUserId).equalToWhenPresent(record::getUpdateUserId)
.set(updateTime).equalToWhenPresent(record::getUpdateTime)
.where(id, isEqualTo(record::getId))
.build()
.execute();
}
}

View File

@@ -1,55 +0,0 @@
package com.java2nb.novel.book.mapper;
import org.mybatis.dynamic.sql.SqlColumn;
import org.mybatis.dynamic.sql.SqlTable;
import javax.annotation.Generated;
import java.sql.JDBCType;
import java.util.Date;
public final class BookCommentDynamicSqlSupport {
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final BookComment bookComment = new BookComment();
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final SqlColumn<Long> id = bookComment.id;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final SqlColumn<Long> bookId = bookComment.bookId;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final SqlColumn<String> commentContent = bookComment.commentContent;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final SqlColumn<Integer> replyCount = bookComment.replyCount;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final SqlColumn<Byte> auditStatus = bookComment.auditStatus;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final SqlColumn<Date> createTime = bookComment.createTime;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final SqlColumn<Long> createUserId = bookComment.createUserId;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final class BookComment extends SqlTable {
public final SqlColumn<Long> id = column("id", JDBCType.BIGINT);
public final SqlColumn<Long> bookId = column("book_id", JDBCType.BIGINT);
public final SqlColumn<String> commentContent = column("comment_content", JDBCType.VARCHAR);
public final SqlColumn<Integer> replyCount = column("reply_count", JDBCType.INTEGER);
public final SqlColumn<Byte> auditStatus = column("audit_status", JDBCType.TINYINT);
public final SqlColumn<Date> createTime = column("create_time", JDBCType.TIMESTAMP);
public final SqlColumn<Long> createUserId = column("create_user_id", JDBCType.BIGINT);
public BookComment() {
super("book_comment");
}
}
}

View File

@@ -1,186 +0,0 @@
package com.java2nb.novel.book.mapper;
import com.java2nb.novel.book.entity.BookComment;
import com.java2nb.novel.book.vo.BookCommentVO;
import org.apache.ibatis.annotations.*;
import org.apache.ibatis.type.JdbcType;
import org.mybatis.dynamic.sql.SqlBuilder;
import org.mybatis.dynamic.sql.delete.DeleteDSL;
import org.mybatis.dynamic.sql.delete.MyBatis3DeleteModelAdapter;
import org.mybatis.dynamic.sql.delete.render.DeleteStatementProvider;
import org.mybatis.dynamic.sql.insert.render.InsertStatementProvider;
import org.mybatis.dynamic.sql.render.RenderingStrategy;
import org.mybatis.dynamic.sql.select.MyBatis3SelectModelAdapter;
import org.mybatis.dynamic.sql.select.QueryExpressionDSL;
import org.mybatis.dynamic.sql.select.SelectDSL;
import org.mybatis.dynamic.sql.select.render.SelectStatementProvider;
import org.mybatis.dynamic.sql.update.MyBatis3UpdateModelAdapter;
import org.mybatis.dynamic.sql.update.UpdateDSL;
import org.mybatis.dynamic.sql.update.render.UpdateStatementProvider;
import org.mybatis.dynamic.sql.util.SqlProviderAdapter;
import javax.annotation.Generated;
import java.util.List;
import static com.java2nb.novel.book.mapper.BookCommentDynamicSqlSupport.*;
import static org.mybatis.dynamic.sql.SqlBuilder.isEqualTo;
@Mapper
public interface BookCommentMapper {
@Generated("org.mybatis.generator.api.MyBatisGenerator")
@SelectProvider(type=SqlProviderAdapter.class, method="select")
long count(SelectStatementProvider selectStatement);
@Generated("org.mybatis.generator.api.MyBatisGenerator")
@DeleteProvider(type=SqlProviderAdapter.class, method="delete")
int delete(DeleteStatementProvider deleteStatement);
@Generated("org.mybatis.generator.api.MyBatisGenerator")
@InsertProvider(type=SqlProviderAdapter.class, method="insert")
int insert(InsertStatementProvider<BookComment> insertStatement);
@Generated("org.mybatis.generator.api.MyBatisGenerator")
@SelectProvider(type=SqlProviderAdapter.class, method="select")
@ResultMap("BookCommentResult")
BookComment selectOne(SelectStatementProvider selectStatement);
@Generated("org.mybatis.generator.api.MyBatisGenerator")
@SelectProvider(type=SqlProviderAdapter.class, method="select")
@Results(id="BookCommentResult", value = {
@Result(column="id", property="id", jdbcType=JdbcType.BIGINT, id=true),
@Result(column="book_id", property="bookId", jdbcType=JdbcType.BIGINT),
@Result(column="comment_content", property="commentContent", jdbcType=JdbcType.VARCHAR),
@Result(column="reply_count", property="replyCount", jdbcType=JdbcType.INTEGER),
@Result(column="audit_status", property="auditStatus", jdbcType=JdbcType.TINYINT),
@Result(column="create_time", property="createTime", jdbcType=JdbcType.TIMESTAMP),
@Result(column="create_user_id", property="createUserId", jdbcType=JdbcType.BIGINT)
})
List<BookComment> selectMany(SelectStatementProvider selectStatement);
@Generated("org.mybatis.generator.api.MyBatisGenerator")
@UpdateProvider(type=SqlProviderAdapter.class, method="update")
int update(UpdateStatementProvider updateStatement);
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default QueryExpressionDSL<MyBatis3SelectModelAdapter<Long>> countByExample() {
return SelectDSL.selectWithMapper(this::count, SqlBuilder.count())
.from(bookComment);
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default DeleteDSL<MyBatis3DeleteModelAdapter<Integer>> deleteByExample() {
return DeleteDSL.deleteFromWithMapper(this::delete, bookComment);
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default int deleteByPrimaryKey(Long id_) {
return DeleteDSL.deleteFromWithMapper(this::delete, bookComment)
.where(id, isEqualTo(id_))
.build()
.execute();
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default int insert(BookComment record) {
return insert(SqlBuilder.insert(record)
.into(bookComment)
.map(id).toProperty("id")
.map(bookId).toProperty("bookId")
.map(commentContent).toProperty("commentContent")
.map(replyCount).toProperty("replyCount")
.map(auditStatus).toProperty("auditStatus")
.map(createTime).toProperty("createTime")
.map(createUserId).toProperty("createUserId")
.build()
.render(RenderingStrategy.MYBATIS3));
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default int insertSelective(BookComment record) {
return insert(SqlBuilder.insert(record)
.into(bookComment)
.map(id).toPropertyWhenPresent("id", record::getId)
.map(bookId).toPropertyWhenPresent("bookId", record::getBookId)
.map(commentContent).toPropertyWhenPresent("commentContent", record::getCommentContent)
.map(replyCount).toPropertyWhenPresent("replyCount", record::getReplyCount)
.map(auditStatus).toPropertyWhenPresent("auditStatus", record::getAuditStatus)
.map(createTime).toPropertyWhenPresent("createTime", record::getCreateTime)
.map(createUserId).toPropertyWhenPresent("createUserId", record::getCreateUserId)
.build()
.render(RenderingStrategy.MYBATIS3));
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default QueryExpressionDSL<MyBatis3SelectModelAdapter<List<BookComment>>> selectByExample() {
return SelectDSL.selectWithMapper(this::selectMany, id, bookId, commentContent, replyCount, auditStatus, createTime, createUserId)
.from(bookComment);
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default QueryExpressionDSL<MyBatis3SelectModelAdapter<List<BookComment>>> selectDistinctByExample() {
return SelectDSL.selectDistinctWithMapper(this::selectMany, id, bookId, commentContent, replyCount, auditStatus, createTime, createUserId)
.from(bookComment);
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default BookComment selectByPrimaryKey(Long id_) {
return SelectDSL.selectWithMapper(this::selectOne, id, bookId, commentContent, replyCount, auditStatus, createTime, createUserId)
.from(bookComment)
.where(id, isEqualTo(id_))
.build()
.execute();
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default UpdateDSL<MyBatis3UpdateModelAdapter<Integer>> updateByExample(BookComment record) {
return UpdateDSL.updateWithMapper(this::update, bookComment)
.set(id).equalTo(record::getId)
.set(bookId).equalTo(record::getBookId)
.set(commentContent).equalTo(record::getCommentContent)
.set(replyCount).equalTo(record::getReplyCount)
.set(auditStatus).equalTo(record::getAuditStatus)
.set(createTime).equalTo(record::getCreateTime)
.set(createUserId).equalTo(record::getCreateUserId);
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default UpdateDSL<MyBatis3UpdateModelAdapter<Integer>> updateByExampleSelective(BookComment record) {
return UpdateDSL.updateWithMapper(this::update, bookComment)
.set(id).equalToWhenPresent(record::getId)
.set(bookId).equalToWhenPresent(record::getBookId)
.set(commentContent).equalToWhenPresent(record::getCommentContent)
.set(replyCount).equalToWhenPresent(record::getReplyCount)
.set(auditStatus).equalToWhenPresent(record::getAuditStatus)
.set(createTime).equalToWhenPresent(record::getCreateTime)
.set(createUserId).equalToWhenPresent(record::getCreateUserId);
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default int updateByPrimaryKey(BookComment record) {
return UpdateDSL.updateWithMapper(this::update, bookComment)
.set(bookId).equalTo(record::getBookId)
.set(commentContent).equalTo(record::getCommentContent)
.set(replyCount).equalTo(record::getReplyCount)
.set(auditStatus).equalTo(record::getAuditStatus)
.set(createTime).equalTo(record::getCreateTime)
.set(createUserId).equalTo(record::getCreateUserId)
.where(id, isEqualTo(record::getId))
.build()
.execute();
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default int updateByPrimaryKeySelective(BookComment record) {
return UpdateDSL.updateWithMapper(this::update, bookComment)
.set(bookId).equalToWhenPresent(record::getBookId)
.set(commentContent).equalToWhenPresent(record::getCommentContent)
.set(replyCount).equalToWhenPresent(record::getReplyCount)
.set(auditStatus).equalToWhenPresent(record::getAuditStatus)
.set(createTime).equalToWhenPresent(record::getCreateTime)
.set(createUserId).equalToWhenPresent(record::getCreateUserId)
.where(id, isEqualTo(record::getId))
.build()
.execute();
}
}

View File

@@ -1,50 +0,0 @@
package com.java2nb.novel.book.mapper;
import org.mybatis.dynamic.sql.SqlColumn;
import org.mybatis.dynamic.sql.SqlTable;
import javax.annotation.Generated;
import java.sql.JDBCType;
import java.util.Date;
public final class BookCommentReplyDynamicSqlSupport {
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final BookCommentReply bookCommentReply = new BookCommentReply();
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final SqlColumn<Long> id = bookCommentReply.id;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final SqlColumn<Long> commentId = bookCommentReply.commentId;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final SqlColumn<String> replyContent = bookCommentReply.replyContent;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final SqlColumn<Byte> auditStatus = bookCommentReply.auditStatus;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final SqlColumn<Date> createTime = bookCommentReply.createTime;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final SqlColumn<Long> createUserId = bookCommentReply.createUserId;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final class BookCommentReply extends SqlTable {
public final SqlColumn<Long> id = column("id", JDBCType.BIGINT);
public final SqlColumn<Long> commentId = column("comment_id", JDBCType.BIGINT);
public final SqlColumn<String> replyContent = column("reply_content", JDBCType.VARCHAR);
public final SqlColumn<Byte> auditStatus = column("audit_status", JDBCType.TINYINT);
public final SqlColumn<Date> createTime = column("create_time", JDBCType.TIMESTAMP);
public final SqlColumn<Long> createUserId = column("create_user_id", JDBCType.BIGINT);
public BookCommentReply() {
super("book_comment_reply");
}
}
}

View File

@@ -1,177 +0,0 @@
package com.java2nb.novel.book.mapper;
import com.java2nb.novel.book.entity.BookCommentReply;
import org.apache.ibatis.annotations.*;
import org.apache.ibatis.type.JdbcType;
import org.mybatis.dynamic.sql.SqlBuilder;
import org.mybatis.dynamic.sql.delete.DeleteDSL;
import org.mybatis.dynamic.sql.delete.MyBatis3DeleteModelAdapter;
import org.mybatis.dynamic.sql.delete.render.DeleteStatementProvider;
import org.mybatis.dynamic.sql.insert.render.InsertStatementProvider;
import org.mybatis.dynamic.sql.render.RenderingStrategy;
import org.mybatis.dynamic.sql.select.MyBatis3SelectModelAdapter;
import org.mybatis.dynamic.sql.select.QueryExpressionDSL;
import org.mybatis.dynamic.sql.select.SelectDSL;
import org.mybatis.dynamic.sql.select.render.SelectStatementProvider;
import org.mybatis.dynamic.sql.update.MyBatis3UpdateModelAdapter;
import org.mybatis.dynamic.sql.update.UpdateDSL;
import org.mybatis.dynamic.sql.update.render.UpdateStatementProvider;
import org.mybatis.dynamic.sql.util.SqlProviderAdapter;
import javax.annotation.Generated;
import java.util.List;
import static com.java2nb.novel.book.mapper.BookCommentReplyDynamicSqlSupport.*;
import static org.mybatis.dynamic.sql.SqlBuilder.isEqualTo;
@Mapper
public interface BookCommentReplyMapper {
@Generated("org.mybatis.generator.api.MyBatisGenerator")
@SelectProvider(type=SqlProviderAdapter.class, method="select")
long count(SelectStatementProvider selectStatement);
@Generated("org.mybatis.generator.api.MyBatisGenerator")
@DeleteProvider(type=SqlProviderAdapter.class, method="delete")
int delete(DeleteStatementProvider deleteStatement);
@Generated("org.mybatis.generator.api.MyBatisGenerator")
@InsertProvider(type=SqlProviderAdapter.class, method="insert")
int insert(InsertStatementProvider<BookCommentReply> insertStatement);
@Generated("org.mybatis.generator.api.MyBatisGenerator")
@SelectProvider(type=SqlProviderAdapter.class, method="select")
@ResultMap("BookCommentReplyResult")
BookCommentReply selectOne(SelectStatementProvider selectStatement);
@Generated("org.mybatis.generator.api.MyBatisGenerator")
@SelectProvider(type=SqlProviderAdapter.class, method="select")
@Results(id="BookCommentReplyResult", value = {
@Result(column="id", property="id", jdbcType=JdbcType.BIGINT, id=true),
@Result(column="comment_id", property="commentId", jdbcType=JdbcType.BIGINT),
@Result(column="reply_content", property="replyContent", jdbcType=JdbcType.VARCHAR),
@Result(column="audit_status", property="auditStatus", jdbcType=JdbcType.TINYINT),
@Result(column="create_time", property="createTime", jdbcType=JdbcType.TIMESTAMP),
@Result(column="create_user_id", property="createUserId", jdbcType=JdbcType.BIGINT)
})
List<BookCommentReply> selectMany(SelectStatementProvider selectStatement);
@Generated("org.mybatis.generator.api.MyBatisGenerator")
@UpdateProvider(type=SqlProviderAdapter.class, method="update")
int update(UpdateStatementProvider updateStatement);
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default QueryExpressionDSL<MyBatis3SelectModelAdapter<Long>> countByExample() {
return SelectDSL.selectWithMapper(this::count, SqlBuilder.count())
.from(bookCommentReply);
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default DeleteDSL<MyBatis3DeleteModelAdapter<Integer>> deleteByExample() {
return DeleteDSL.deleteFromWithMapper(this::delete, bookCommentReply);
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default int deleteByPrimaryKey(Long id_) {
return DeleteDSL.deleteFromWithMapper(this::delete, bookCommentReply)
.where(id, isEqualTo(id_))
.build()
.execute();
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default int insert(BookCommentReply record) {
return insert(SqlBuilder.insert(record)
.into(bookCommentReply)
.map(id).toProperty("id")
.map(commentId).toProperty("commentId")
.map(replyContent).toProperty("replyContent")
.map(auditStatus).toProperty("auditStatus")
.map(createTime).toProperty("createTime")
.map(createUserId).toProperty("createUserId")
.build()
.render(RenderingStrategy.MYBATIS3));
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default int insertSelective(BookCommentReply record) {
return insert(SqlBuilder.insert(record)
.into(bookCommentReply)
.map(id).toPropertyWhenPresent("id", record::getId)
.map(commentId).toPropertyWhenPresent("commentId", record::getCommentId)
.map(replyContent).toPropertyWhenPresent("replyContent", record::getReplyContent)
.map(auditStatus).toPropertyWhenPresent("auditStatus", record::getAuditStatus)
.map(createTime).toPropertyWhenPresent("createTime", record::getCreateTime)
.map(createUserId).toPropertyWhenPresent("createUserId", record::getCreateUserId)
.build()
.render(RenderingStrategy.MYBATIS3));
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default QueryExpressionDSL<MyBatis3SelectModelAdapter<List<BookCommentReply>>> selectByExample() {
return SelectDSL.selectWithMapper(this::selectMany, id, commentId, replyContent, auditStatus, createTime, createUserId)
.from(bookCommentReply);
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default QueryExpressionDSL<MyBatis3SelectModelAdapter<List<BookCommentReply>>> selectDistinctByExample() {
return SelectDSL.selectDistinctWithMapper(this::selectMany, id, commentId, replyContent, auditStatus, createTime, createUserId)
.from(bookCommentReply);
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default BookCommentReply selectByPrimaryKey(Long id_) {
return SelectDSL.selectWithMapper(this::selectOne, id, commentId, replyContent, auditStatus, createTime, createUserId)
.from(bookCommentReply)
.where(id, isEqualTo(id_))
.build()
.execute();
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default UpdateDSL<MyBatis3UpdateModelAdapter<Integer>> updateByExample(BookCommentReply record) {
return UpdateDSL.updateWithMapper(this::update, bookCommentReply)
.set(id).equalTo(record::getId)
.set(commentId).equalTo(record::getCommentId)
.set(replyContent).equalTo(record::getReplyContent)
.set(auditStatus).equalTo(record::getAuditStatus)
.set(createTime).equalTo(record::getCreateTime)
.set(createUserId).equalTo(record::getCreateUserId);
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default UpdateDSL<MyBatis3UpdateModelAdapter<Integer>> updateByExampleSelective(BookCommentReply record) {
return UpdateDSL.updateWithMapper(this::update, bookCommentReply)
.set(id).equalToWhenPresent(record::getId)
.set(commentId).equalToWhenPresent(record::getCommentId)
.set(replyContent).equalToWhenPresent(record::getReplyContent)
.set(auditStatus).equalToWhenPresent(record::getAuditStatus)
.set(createTime).equalToWhenPresent(record::getCreateTime)
.set(createUserId).equalToWhenPresent(record::getCreateUserId);
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default int updateByPrimaryKey(BookCommentReply record) {
return UpdateDSL.updateWithMapper(this::update, bookCommentReply)
.set(commentId).equalTo(record::getCommentId)
.set(replyContent).equalTo(record::getReplyContent)
.set(auditStatus).equalTo(record::getAuditStatus)
.set(createTime).equalTo(record::getCreateTime)
.set(createUserId).equalTo(record::getCreateUserId)
.where(id, isEqualTo(record::getId))
.build()
.execute();
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default int updateByPrimaryKeySelective(BookCommentReply record) {
return UpdateDSL.updateWithMapper(this::update, bookCommentReply)
.set(commentId).equalToWhenPresent(record::getCommentId)
.set(replyContent).equalToWhenPresent(record::getReplyContent)
.set(auditStatus).equalToWhenPresent(record::getAuditStatus)
.set(createTime).equalToWhenPresent(record::getCreateTime)
.set(createUserId).equalToWhenPresent(record::getCreateUserId)
.where(id, isEqualTo(record::getId))
.build()
.execute();
}
}

View File

@@ -1,34 +0,0 @@
package com.java2nb.novel.book.mapper;
import org.mybatis.dynamic.sql.SqlColumn;
import org.mybatis.dynamic.sql.SqlTable;
import javax.annotation.Generated;
import java.sql.JDBCType;
public final class BookContentDynamicSqlSupport {
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final BookContent bookContent = new BookContent();
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final SqlColumn<Long> id = bookContent.id;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final SqlColumn<Long> indexId = bookContent.indexId;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final SqlColumn<String> content = bookContent.content;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final class BookContent extends SqlTable {
public final SqlColumn<Long> id = column("id", JDBCType.BIGINT);
public final SqlColumn<Long> indexId = column("index_id", JDBCType.BIGINT);
public final SqlColumn<String> content = column("content", JDBCType.VARCHAR);
public BookContent() {
super("book_content");
}
}
}

View File

@@ -1,156 +0,0 @@
package com.java2nb.novel.book.mapper;
import com.java2nb.novel.book.entity.BookContent;
import org.apache.ibatis.annotations.*;
import org.apache.ibatis.type.JdbcType;
import org.mybatis.dynamic.sql.SqlBuilder;
import org.mybatis.dynamic.sql.delete.DeleteDSL;
import org.mybatis.dynamic.sql.delete.MyBatis3DeleteModelAdapter;
import org.mybatis.dynamic.sql.delete.render.DeleteStatementProvider;
import org.mybatis.dynamic.sql.insert.render.InsertStatementProvider;
import org.mybatis.dynamic.sql.render.RenderingStrategy;
import org.mybatis.dynamic.sql.select.MyBatis3SelectModelAdapter;
import org.mybatis.dynamic.sql.select.QueryExpressionDSL;
import org.mybatis.dynamic.sql.select.SelectDSL;
import org.mybatis.dynamic.sql.select.render.SelectStatementProvider;
import org.mybatis.dynamic.sql.update.MyBatis3UpdateModelAdapter;
import org.mybatis.dynamic.sql.update.UpdateDSL;
import org.mybatis.dynamic.sql.update.render.UpdateStatementProvider;
import org.mybatis.dynamic.sql.util.SqlProviderAdapter;
import javax.annotation.Generated;
import java.util.List;
import static com.java2nb.novel.book.mapper.BookContentDynamicSqlSupport.*;
import static org.mybatis.dynamic.sql.SqlBuilder.isEqualTo;
@Mapper
public interface BookContentMapper {
@Generated("org.mybatis.generator.api.MyBatisGenerator")
@SelectProvider(type=SqlProviderAdapter.class, method="select")
long count(SelectStatementProvider selectStatement);
@Generated("org.mybatis.generator.api.MyBatisGenerator")
@DeleteProvider(type=SqlProviderAdapter.class, method="delete")
int delete(DeleteStatementProvider deleteStatement);
@Generated("org.mybatis.generator.api.MyBatisGenerator")
@InsertProvider(type=SqlProviderAdapter.class, method="insert")
int insert(InsertStatementProvider<BookContent> insertStatement);
@Generated("org.mybatis.generator.api.MyBatisGenerator")
@SelectProvider(type=SqlProviderAdapter.class, method="select")
@ResultMap("BookContentResult")
BookContent selectOne(SelectStatementProvider selectStatement);
@Generated("org.mybatis.generator.api.MyBatisGenerator")
@SelectProvider(type=SqlProviderAdapter.class, method="select")
@Results(id="BookContentResult", value = {
@Result(column="id", property="id", jdbcType=JdbcType.BIGINT, id=true),
@Result(column="index_id", property="indexId", jdbcType=JdbcType.BIGINT),
@Result(column="content", property="content", jdbcType=JdbcType.VARCHAR)
})
List<BookContent> selectMany(SelectStatementProvider selectStatement);
@Generated("org.mybatis.generator.api.MyBatisGenerator")
@UpdateProvider(type=SqlProviderAdapter.class, method="update")
int update(UpdateStatementProvider updateStatement);
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default QueryExpressionDSL<MyBatis3SelectModelAdapter<Long>> countByExample() {
return SelectDSL.selectWithMapper(this::count, SqlBuilder.count())
.from(bookContent);
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default DeleteDSL<MyBatis3DeleteModelAdapter<Integer>> deleteByExample() {
return DeleteDSL.deleteFromWithMapper(this::delete, bookContent);
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default int deleteByPrimaryKey(Long id_) {
return DeleteDSL.deleteFromWithMapper(this::delete, bookContent)
.where(id, isEqualTo(id_))
.build()
.execute();
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default int insert(BookContent record) {
return insert(SqlBuilder.insert(record)
.into(bookContent)
.map(id).toProperty("id")
.map(indexId).toProperty("indexId")
.map(content).toProperty("content")
.build()
.render(RenderingStrategy.MYBATIS3));
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default int insertSelective(BookContent record) {
return insert(SqlBuilder.insert(record)
.into(bookContent)
.map(id).toPropertyWhenPresent("id", record::getId)
.map(indexId).toPropertyWhenPresent("indexId", record::getIndexId)
.map(content).toPropertyWhenPresent("content", record::getContent)
.build()
.render(RenderingStrategy.MYBATIS3));
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default QueryExpressionDSL<MyBatis3SelectModelAdapter<List<BookContent>>> selectByExample() {
return SelectDSL.selectWithMapper(this::selectMany, id, indexId, content)
.from(bookContent);
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default QueryExpressionDSL<MyBatis3SelectModelAdapter<List<BookContent>>> selectDistinctByExample() {
return SelectDSL.selectDistinctWithMapper(this::selectMany, id, indexId, content)
.from(bookContent);
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default BookContent selectByPrimaryKey(Long id_) {
return SelectDSL.selectWithMapper(this::selectOne, id, indexId, content)
.from(bookContent)
.where(id, isEqualTo(id_))
.build()
.execute();
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default UpdateDSL<MyBatis3UpdateModelAdapter<Integer>> updateByExample(BookContent record) {
return UpdateDSL.updateWithMapper(this::update, bookContent)
.set(id).equalTo(record::getId)
.set(indexId).equalTo(record::getIndexId)
.set(content).equalTo(record::getContent);
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default UpdateDSL<MyBatis3UpdateModelAdapter<Integer>> updateByExampleSelective(BookContent record) {
return UpdateDSL.updateWithMapper(this::update, bookContent)
.set(id).equalToWhenPresent(record::getId)
.set(indexId).equalToWhenPresent(record::getIndexId)
.set(content).equalToWhenPresent(record::getContent);
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default int updateByPrimaryKey(BookContent record) {
return UpdateDSL.updateWithMapper(this::update, bookContent)
.set(indexId).equalTo(record::getIndexId)
.set(content).equalTo(record::getContent)
.where(id, isEqualTo(record::getId))
.build()
.execute();
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default int updateByPrimaryKeySelective(BookContent record) {
return UpdateDSL.updateWithMapper(this::update, bookContent)
.set(indexId).equalToWhenPresent(record::getIndexId)
.set(content).equalToWhenPresent(record::getContent)
.where(id, isEqualTo(record::getId))
.build()
.execute();
}
}

View File

@@ -1,145 +0,0 @@
package com.java2nb.novel.book.mapper;
import org.mybatis.dynamic.sql.SqlColumn;
import org.mybatis.dynamic.sql.SqlTable;
import javax.annotation.Generated;
import java.sql.JDBCType;
import java.util.Date;
public final class BookDynamicSqlSupport {
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final Book book = new Book();
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final SqlColumn<Long> id = book.id;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final SqlColumn<Byte> workDirection = book.workDirection;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final SqlColumn<Integer> catId = book.catId;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final SqlColumn<String> catName = book.catName;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final SqlColumn<String> picUrl = book.picUrl;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final SqlColumn<String> bookName = book.bookName;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final SqlColumn<Long> authorId = book.authorId;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final SqlColumn<String> authorName = book.authorName;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final SqlColumn<String> bookDesc = book.bookDesc;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final SqlColumn<Float> score = book.score;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final SqlColumn<Byte> bookStatus = book.bookStatus;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final SqlColumn<Long> visitCount = book.visitCount;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final SqlColumn<Integer> wordCount = book.wordCount;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final SqlColumn<Integer> commentCount = book.commentCount;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final SqlColumn<Long> lastIndexId = book.lastIndexId;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final SqlColumn<String> lastIndexName = book.lastIndexName;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final SqlColumn<Date> lastIndexUpdateTime = book.lastIndexUpdateTime;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final SqlColumn<Byte> isVip = book.isVip;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final SqlColumn<Byte> status = book.status;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final SqlColumn<Date> updateTime = book.updateTime;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final SqlColumn<Date> createTime = book.createTime;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final SqlColumn<Integer> crawlSourceId = book.crawlSourceId;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final SqlColumn<String> crawlBookId = book.crawlBookId;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final SqlColumn<Date> crawlLastTime = book.crawlLastTime;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final SqlColumn<Byte> crawlIsStop = book.crawlIsStop;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final class Book extends SqlTable {
public final SqlColumn<Long> id = column("id", JDBCType.BIGINT);
public final SqlColumn<Byte> workDirection = column("work_direction", JDBCType.TINYINT);
public final SqlColumn<Integer> catId = column("cat_id", JDBCType.INTEGER);
public final SqlColumn<String> catName = column("cat_name", JDBCType.VARCHAR);
public final SqlColumn<String> picUrl = column("pic_url", JDBCType.VARCHAR);
public final SqlColumn<String> bookName = column("book_name", JDBCType.VARCHAR);
public final SqlColumn<Long> authorId = column("author_id", JDBCType.BIGINT);
public final SqlColumn<String> authorName = column("author_name", JDBCType.VARCHAR);
public final SqlColumn<String> bookDesc = column("book_desc", JDBCType.VARCHAR);
public final SqlColumn<Float> score = column("score", JDBCType.REAL);
public final SqlColumn<Byte> bookStatus = column("book_status", JDBCType.TINYINT);
public final SqlColumn<Long> visitCount = column("visit_count", JDBCType.BIGINT);
public final SqlColumn<Integer> wordCount = column("word_count", JDBCType.INTEGER);
public final SqlColumn<Integer> commentCount = column("comment_count", JDBCType.INTEGER);
public final SqlColumn<Long> lastIndexId = column("last_index_id", JDBCType.BIGINT);
public final SqlColumn<String> lastIndexName = column("last_index_name", JDBCType.VARCHAR);
public final SqlColumn<Date> lastIndexUpdateTime = column("last_index_update_time", JDBCType.TIMESTAMP);
public final SqlColumn<Byte> isVip = column("is_vip", JDBCType.TINYINT);
public final SqlColumn<Byte> status = column("status", JDBCType.TINYINT);
public final SqlColumn<Date> updateTime = column("update_time", JDBCType.TIMESTAMP);
public final SqlColumn<Date> createTime = column("create_time", JDBCType.TIMESTAMP);
public final SqlColumn<Integer> crawlSourceId = column("crawl_source_id", JDBCType.INTEGER);
public final SqlColumn<String> crawlBookId = column("crawl_book_id", JDBCType.VARCHAR);
public final SqlColumn<Date> crawlLastTime = column("crawl_last_time", JDBCType.TIMESTAMP);
public final SqlColumn<Byte> crawlIsStop = column("crawl_is_stop", JDBCType.TINYINT);
public Book() {
super("book");
}
}
}

View File

@@ -1,60 +0,0 @@
package com.java2nb.novel.book.mapper;
import org.mybatis.dynamic.sql.SqlColumn;
import org.mybatis.dynamic.sql.SqlTable;
import javax.annotation.Generated;
import java.sql.JDBCType;
import java.util.Date;
public final class BookIndexDynamicSqlSupport {
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final BookIndex bookIndex = new BookIndex();
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final SqlColumn<Long> id = bookIndex.id;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final SqlColumn<Long> bookId = bookIndex.bookId;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final SqlColumn<Integer> indexNum = bookIndex.indexNum;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final SqlColumn<String> indexName = bookIndex.indexName;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final SqlColumn<Integer> wordCount = bookIndex.wordCount;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final SqlColumn<Byte> isVip = bookIndex.isVip;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final SqlColumn<Date> createTime = bookIndex.createTime;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final SqlColumn<Date> updateTime = bookIndex.updateTime;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final class BookIndex extends SqlTable {
public final SqlColumn<Long> id = column("id", JDBCType.BIGINT);
public final SqlColumn<Long> bookId = column("book_id", JDBCType.BIGINT);
public final SqlColumn<Integer> indexNum = column("index_num", JDBCType.INTEGER);
public final SqlColumn<String> indexName = column("index_name", JDBCType.VARCHAR);
public final SqlColumn<Integer> wordCount = column("word_count", JDBCType.INTEGER);
public final SqlColumn<Byte> isVip = column("is_vip", JDBCType.TINYINT);
public final SqlColumn<Date> createTime = column("create_time", JDBCType.TIMESTAMP);
public final SqlColumn<Date> updateTime = column("update_time", JDBCType.TIMESTAMP);
public BookIndex() {
super("book_index");
}
}
}

View File

@@ -1,191 +0,0 @@
package com.java2nb.novel.book.mapper;
import com.java2nb.novel.book.entity.BookIndex;
import org.apache.ibatis.annotations.*;
import org.apache.ibatis.type.JdbcType;
import org.mybatis.dynamic.sql.SqlBuilder;
import org.mybatis.dynamic.sql.delete.DeleteDSL;
import org.mybatis.dynamic.sql.delete.MyBatis3DeleteModelAdapter;
import org.mybatis.dynamic.sql.delete.render.DeleteStatementProvider;
import org.mybatis.dynamic.sql.insert.render.InsertStatementProvider;
import org.mybatis.dynamic.sql.render.RenderingStrategy;
import org.mybatis.dynamic.sql.select.MyBatis3SelectModelAdapter;
import org.mybatis.dynamic.sql.select.QueryExpressionDSL;
import org.mybatis.dynamic.sql.select.SelectDSL;
import org.mybatis.dynamic.sql.select.render.SelectStatementProvider;
import org.mybatis.dynamic.sql.update.MyBatis3UpdateModelAdapter;
import org.mybatis.dynamic.sql.update.UpdateDSL;
import org.mybatis.dynamic.sql.update.render.UpdateStatementProvider;
import org.mybatis.dynamic.sql.util.SqlProviderAdapter;
import javax.annotation.Generated;
import java.util.List;
import static com.java2nb.novel.book.mapper.BookIndexDynamicSqlSupport.*;
import static org.mybatis.dynamic.sql.SqlBuilder.isEqualTo;
@Mapper
public interface BookIndexMapper {
@Generated("org.mybatis.generator.api.MyBatisGenerator")
@SelectProvider(type=SqlProviderAdapter.class, method="select")
long count(SelectStatementProvider selectStatement);
@Generated("org.mybatis.generator.api.MyBatisGenerator")
@DeleteProvider(type=SqlProviderAdapter.class, method="delete")
int delete(DeleteStatementProvider deleteStatement);
@Generated("org.mybatis.generator.api.MyBatisGenerator")
@InsertProvider(type=SqlProviderAdapter.class, method="insert")
int insert(InsertStatementProvider<BookIndex> insertStatement);
@Generated("org.mybatis.generator.api.MyBatisGenerator")
@SelectProvider(type=SqlProviderAdapter.class, method="select")
@ResultMap("BookIndexResult")
BookIndex selectOne(SelectStatementProvider selectStatement);
@Generated("org.mybatis.generator.api.MyBatisGenerator")
@SelectProvider(type=SqlProviderAdapter.class, method="select")
@Results(id="BookIndexResult", value = {
@Result(column="id", property="id", jdbcType=JdbcType.BIGINT, id=true),
@Result(column="book_id", property="bookId", jdbcType=JdbcType.BIGINT),
@Result(column="index_num", property="indexNum", jdbcType=JdbcType.INTEGER),
@Result(column="index_name", property="indexName", jdbcType=JdbcType.VARCHAR),
@Result(column="word_count", property="wordCount", jdbcType=JdbcType.INTEGER),
@Result(column="is_vip", property="isVip", jdbcType=JdbcType.TINYINT),
@Result(column="create_time", property="createTime", jdbcType=JdbcType.TIMESTAMP),
@Result(column="update_time", property="updateTime", jdbcType=JdbcType.TIMESTAMP)
})
List<BookIndex> selectMany(SelectStatementProvider selectStatement);
@Generated("org.mybatis.generator.api.MyBatisGenerator")
@UpdateProvider(type=SqlProviderAdapter.class, method="update")
int update(UpdateStatementProvider updateStatement);
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default QueryExpressionDSL<MyBatis3SelectModelAdapter<Long>> countByExample() {
return SelectDSL.selectWithMapper(this::count, SqlBuilder.count())
.from(bookIndex);
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default DeleteDSL<MyBatis3DeleteModelAdapter<Integer>> deleteByExample() {
return DeleteDSL.deleteFromWithMapper(this::delete, bookIndex);
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default int deleteByPrimaryKey(Long id_) {
return DeleteDSL.deleteFromWithMapper(this::delete, bookIndex)
.where(id, isEqualTo(id_))
.build()
.execute();
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default int insert(BookIndex record) {
return insert(SqlBuilder.insert(record)
.into(bookIndex)
.map(id).toProperty("id")
.map(bookId).toProperty("bookId")
.map(indexNum).toProperty("indexNum")
.map(indexName).toProperty("indexName")
.map(wordCount).toProperty("wordCount")
.map(isVip).toProperty("isVip")
.map(createTime).toProperty("createTime")
.map(updateTime).toProperty("updateTime")
.build()
.render(RenderingStrategy.MYBATIS3));
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default int insertSelective(BookIndex record) {
return insert(SqlBuilder.insert(record)
.into(bookIndex)
.map(id).toPropertyWhenPresent("id", record::getId)
.map(bookId).toPropertyWhenPresent("bookId", record::getBookId)
.map(indexNum).toPropertyWhenPresent("indexNum", record::getIndexNum)
.map(indexName).toPropertyWhenPresent("indexName", record::getIndexName)
.map(wordCount).toPropertyWhenPresent("wordCount", record::getWordCount)
.map(isVip).toPropertyWhenPresent("isVip", record::getIsVip)
.map(createTime).toPropertyWhenPresent("createTime", record::getCreateTime)
.map(updateTime).toPropertyWhenPresent("updateTime", record::getUpdateTime)
.build()
.render(RenderingStrategy.MYBATIS3));
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default QueryExpressionDSL<MyBatis3SelectModelAdapter<List<BookIndex>>> selectByExample() {
return SelectDSL.selectWithMapper(this::selectMany, id, bookId, indexNum, indexName, wordCount, isVip, createTime, updateTime)
.from(bookIndex);
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default QueryExpressionDSL<MyBatis3SelectModelAdapter<List<BookIndex>>> selectDistinctByExample() {
return SelectDSL.selectDistinctWithMapper(this::selectMany, id, bookId, indexNum, indexName, wordCount, isVip, createTime, updateTime)
.from(bookIndex);
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default BookIndex selectByPrimaryKey(Long id_) {
return SelectDSL.selectWithMapper(this::selectOne, id, bookId, indexNum, indexName, wordCount, isVip, createTime, updateTime)
.from(bookIndex)
.where(id, isEqualTo(id_))
.build()
.execute();
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default UpdateDSL<MyBatis3UpdateModelAdapter<Integer>> updateByExample(BookIndex record) {
return UpdateDSL.updateWithMapper(this::update, bookIndex)
.set(id).equalTo(record::getId)
.set(bookId).equalTo(record::getBookId)
.set(indexNum).equalTo(record::getIndexNum)
.set(indexName).equalTo(record::getIndexName)
.set(wordCount).equalTo(record::getWordCount)
.set(isVip).equalTo(record::getIsVip)
.set(createTime).equalTo(record::getCreateTime)
.set(updateTime).equalTo(record::getUpdateTime);
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default UpdateDSL<MyBatis3UpdateModelAdapter<Integer>> updateByExampleSelective(BookIndex record) {
return UpdateDSL.updateWithMapper(this::update, bookIndex)
.set(id).equalToWhenPresent(record::getId)
.set(bookId).equalToWhenPresent(record::getBookId)
.set(indexNum).equalToWhenPresent(record::getIndexNum)
.set(indexName).equalToWhenPresent(record::getIndexName)
.set(wordCount).equalToWhenPresent(record::getWordCount)
.set(isVip).equalToWhenPresent(record::getIsVip)
.set(createTime).equalToWhenPresent(record::getCreateTime)
.set(updateTime).equalToWhenPresent(record::getUpdateTime);
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default int updateByPrimaryKey(BookIndex record) {
return UpdateDSL.updateWithMapper(this::update, bookIndex)
.set(bookId).equalTo(record::getBookId)
.set(indexNum).equalTo(record::getIndexNum)
.set(indexName).equalTo(record::getIndexName)
.set(wordCount).equalTo(record::getWordCount)
.set(isVip).equalTo(record::getIsVip)
.set(createTime).equalTo(record::getCreateTime)
.set(updateTime).equalTo(record::getUpdateTime)
.where(id, isEqualTo(record::getId))
.build()
.execute();
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default int updateByPrimaryKeySelective(BookIndex record) {
return UpdateDSL.updateWithMapper(this::update, bookIndex)
.set(bookId).equalToWhenPresent(record::getBookId)
.set(indexNum).equalToWhenPresent(record::getIndexNum)
.set(indexName).equalToWhenPresent(record::getIndexName)
.set(wordCount).equalToWhenPresent(record::getWordCount)
.set(isVip).equalToWhenPresent(record::getIsVip)
.set(createTime).equalToWhenPresent(record::getCreateTime)
.set(updateTime).equalToWhenPresent(record::getUpdateTime)
.where(id, isEqualTo(record::getId))
.build()
.execute();
}
}

View File

@@ -1,316 +0,0 @@
package com.java2nb.novel.book.mapper;
import com.java2nb.novel.book.entity.Book;
import org.apache.ibatis.annotations.*;
import org.apache.ibatis.type.JdbcType;
import org.mybatis.dynamic.sql.SqlBuilder;
import org.mybatis.dynamic.sql.delete.DeleteDSL;
import org.mybatis.dynamic.sql.delete.MyBatis3DeleteModelAdapter;
import org.mybatis.dynamic.sql.delete.render.DeleteStatementProvider;
import org.mybatis.dynamic.sql.insert.render.InsertStatementProvider;
import org.mybatis.dynamic.sql.render.RenderingStrategy;
import org.mybatis.dynamic.sql.select.MyBatis3SelectModelAdapter;
import org.mybatis.dynamic.sql.select.QueryExpressionDSL;
import org.mybatis.dynamic.sql.select.SelectDSL;
import org.mybatis.dynamic.sql.select.render.SelectStatementProvider;
import org.mybatis.dynamic.sql.update.MyBatis3UpdateModelAdapter;
import org.mybatis.dynamic.sql.update.UpdateDSL;
import org.mybatis.dynamic.sql.update.render.UpdateStatementProvider;
import org.mybatis.dynamic.sql.util.SqlProviderAdapter;
import javax.annotation.Generated;
import java.util.List;
import static com.java2nb.novel.book.mapper.BookDynamicSqlSupport.*;
import static org.mybatis.dynamic.sql.SqlBuilder.isEqualTo;
@Mapper
public interface BookMapper {
@Generated("org.mybatis.generator.api.MyBatisGenerator")
@SelectProvider(type=SqlProviderAdapter.class, method="select")
long count(SelectStatementProvider selectStatement);
@Generated("org.mybatis.generator.api.MyBatisGenerator")
@DeleteProvider(type=SqlProviderAdapter.class, method="delete")
int delete(DeleteStatementProvider deleteStatement);
@Generated("org.mybatis.generator.api.MyBatisGenerator")
@InsertProvider(type=SqlProviderAdapter.class, method="insert")
int insert(InsertStatementProvider<Book> insertStatement);
@Generated("org.mybatis.generator.api.MyBatisGenerator")
@SelectProvider(type=SqlProviderAdapter.class, method="select")
@ResultMap("BookResult")
Book selectOne(SelectStatementProvider selectStatement);
@Generated("org.mybatis.generator.api.MyBatisGenerator")
@SelectProvider(type=SqlProviderAdapter.class, method="select")
@Results(id="BookResult", value = {
@Result(column="id", property="id", jdbcType=JdbcType.BIGINT, id=true),
@Result(column="work_direction", property="workDirection", jdbcType=JdbcType.TINYINT),
@Result(column="cat_id", property="catId", jdbcType=JdbcType.INTEGER),
@Result(column="cat_name", property="catName", jdbcType=JdbcType.VARCHAR),
@Result(column="pic_url", property="picUrl", jdbcType=JdbcType.VARCHAR),
@Result(column="book_name", property="bookName", jdbcType=JdbcType.VARCHAR),
@Result(column="author_id", property="authorId", jdbcType=JdbcType.BIGINT),
@Result(column="author_name", property="authorName", jdbcType=JdbcType.VARCHAR),
@Result(column="book_desc", property="bookDesc", jdbcType=JdbcType.VARCHAR),
@Result(column="score", property="score", jdbcType=JdbcType.REAL),
@Result(column="book_status", property="bookStatus", jdbcType=JdbcType.TINYINT),
@Result(column="visit_count", property="visitCount", jdbcType=JdbcType.BIGINT),
@Result(column="word_count", property="wordCount", jdbcType=JdbcType.INTEGER),
@Result(column="comment_count", property="commentCount", jdbcType=JdbcType.INTEGER),
@Result(column="last_index_id", property="lastIndexId", jdbcType=JdbcType.BIGINT),
@Result(column="last_index_name", property="lastIndexName", jdbcType=JdbcType.VARCHAR),
@Result(column="last_index_update_time", property="lastIndexUpdateTime", jdbcType=JdbcType.TIMESTAMP),
@Result(column="is_vip", property="isVip", jdbcType=JdbcType.TINYINT),
@Result(column="status", property="status", jdbcType=JdbcType.TINYINT),
@Result(column="update_time", property="updateTime", jdbcType=JdbcType.TIMESTAMP),
@Result(column="create_time", property="createTime", jdbcType=JdbcType.TIMESTAMP),
@Result(column="crawl_source_id", property="crawlSourceId", jdbcType=JdbcType.INTEGER),
@Result(column="crawl_book_id", property="crawlBookId", jdbcType=JdbcType.VARCHAR),
@Result(column="crawl_last_time", property="crawlLastTime", jdbcType=JdbcType.TIMESTAMP),
@Result(column="crawl_is_stop", property="crawlIsStop", jdbcType=JdbcType.TINYINT)
})
List<Book> selectMany(SelectStatementProvider selectStatement);
@Generated("org.mybatis.generator.api.MyBatisGenerator")
@UpdateProvider(type=SqlProviderAdapter.class, method="update")
int update(UpdateStatementProvider updateStatement);
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default QueryExpressionDSL<MyBatis3SelectModelAdapter<Long>> countByExample() {
return SelectDSL.selectWithMapper(this::count, SqlBuilder.count())
.from(book);
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default DeleteDSL<MyBatis3DeleteModelAdapter<Integer>> deleteByExample() {
return DeleteDSL.deleteFromWithMapper(this::delete, book);
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default int deleteByPrimaryKey(Long id_) {
return DeleteDSL.deleteFromWithMapper(this::delete, book)
.where(id, isEqualTo(id_))
.build()
.execute();
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default int insert(Book record) {
return insert(SqlBuilder.insert(record)
.into(book)
.map(id).toProperty("id")
.map(workDirection).toProperty("workDirection")
.map(catId).toProperty("catId")
.map(catName).toProperty("catName")
.map(picUrl).toProperty("picUrl")
.map(bookName).toProperty("bookName")
.map(authorId).toProperty("authorId")
.map(authorName).toProperty("authorName")
.map(bookDesc).toProperty("bookDesc")
.map(score).toProperty("score")
.map(bookStatus).toProperty("bookStatus")
.map(visitCount).toProperty("visitCount")
.map(wordCount).toProperty("wordCount")
.map(commentCount).toProperty("commentCount")
.map(lastIndexId).toProperty("lastIndexId")
.map(lastIndexName).toProperty("lastIndexName")
.map(lastIndexUpdateTime).toProperty("lastIndexUpdateTime")
.map(isVip).toProperty("isVip")
.map(status).toProperty("status")
.map(updateTime).toProperty("updateTime")
.map(createTime).toProperty("createTime")
.map(crawlSourceId).toProperty("crawlSourceId")
.map(crawlBookId).toProperty("crawlBookId")
.map(crawlLastTime).toProperty("crawlLastTime")
.map(crawlIsStop).toProperty("crawlIsStop")
.build()
.render(RenderingStrategy.MYBATIS3));
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default int insertSelective(Book record) {
return insert(SqlBuilder.insert(record)
.into(book)
.map(id).toPropertyWhenPresent("id", record::getId)
.map(workDirection).toPropertyWhenPresent("workDirection", record::getWorkDirection)
.map(catId).toPropertyWhenPresent("catId", record::getCatId)
.map(catName).toPropertyWhenPresent("catName", record::getCatName)
.map(picUrl).toPropertyWhenPresent("picUrl", record::getPicUrl)
.map(bookName).toPropertyWhenPresent("bookName", record::getBookName)
.map(authorId).toPropertyWhenPresent("authorId", record::getAuthorId)
.map(authorName).toPropertyWhenPresent("authorName", record::getAuthorName)
.map(bookDesc).toPropertyWhenPresent("bookDesc", record::getBookDesc)
.map(score).toPropertyWhenPresent("score", record::getScore)
.map(bookStatus).toPropertyWhenPresent("bookStatus", record::getBookStatus)
.map(visitCount).toPropertyWhenPresent("visitCount", record::getVisitCount)
.map(wordCount).toPropertyWhenPresent("wordCount", record::getWordCount)
.map(commentCount).toPropertyWhenPresent("commentCount", record::getCommentCount)
.map(lastIndexId).toPropertyWhenPresent("lastIndexId", record::getLastIndexId)
.map(lastIndexName).toPropertyWhenPresent("lastIndexName", record::getLastIndexName)
.map(lastIndexUpdateTime).toPropertyWhenPresent("lastIndexUpdateTime", record::getLastIndexUpdateTime)
.map(isVip).toPropertyWhenPresent("isVip", record::getIsVip)
.map(status).toPropertyWhenPresent("status", record::getStatus)
.map(updateTime).toPropertyWhenPresent("updateTime", record::getUpdateTime)
.map(createTime).toPropertyWhenPresent("createTime", record::getCreateTime)
.map(crawlSourceId).toPropertyWhenPresent("crawlSourceId", record::getCrawlSourceId)
.map(crawlBookId).toPropertyWhenPresent("crawlBookId", record::getCrawlBookId)
.map(crawlLastTime).toPropertyWhenPresent("crawlLastTime", record::getCrawlLastTime)
.map(crawlIsStop).toPropertyWhenPresent("crawlIsStop", record::getCrawlIsStop)
.build()
.render(RenderingStrategy.MYBATIS3));
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default QueryExpressionDSL<MyBatis3SelectModelAdapter<List<Book>>> selectByExample() {
return SelectDSL.selectWithMapper(this::selectMany, id, workDirection, catId, catName, picUrl, bookName, authorId, authorName, bookDesc, score, bookStatus, visitCount, wordCount, commentCount, lastIndexId, lastIndexName, lastIndexUpdateTime, isVip, status, updateTime, createTime, crawlSourceId, crawlBookId, crawlLastTime, crawlIsStop)
.from(book);
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default QueryExpressionDSL<MyBatis3SelectModelAdapter<List<Book>>> selectDistinctByExample() {
return SelectDSL.selectDistinctWithMapper(this::selectMany, id, workDirection, catId, catName, picUrl, bookName, authorId, authorName, bookDesc, score, bookStatus, visitCount, wordCount, commentCount, lastIndexId, lastIndexName, lastIndexUpdateTime, isVip, status, updateTime, createTime, crawlSourceId, crawlBookId, crawlLastTime, crawlIsStop)
.from(book);
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default Book selectByPrimaryKey(Long id_) {
return SelectDSL.selectWithMapper(this::selectOne, id, workDirection, catId, catName, picUrl, bookName, authorId, authorName, bookDesc, score, bookStatus, visitCount, wordCount, commentCount, lastIndexId, lastIndexName, lastIndexUpdateTime, isVip, status, updateTime, createTime, crawlSourceId, crawlBookId, crawlLastTime, crawlIsStop)
.from(book)
.where(id, isEqualTo(id_))
.build()
.execute();
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default UpdateDSL<MyBatis3UpdateModelAdapter<Integer>> updateByExample(Book record) {
return UpdateDSL.updateWithMapper(this::update, book)
.set(id).equalTo(record::getId)
.set(workDirection).equalTo(record::getWorkDirection)
.set(catId).equalTo(record::getCatId)
.set(catName).equalTo(record::getCatName)
.set(picUrl).equalTo(record::getPicUrl)
.set(bookName).equalTo(record::getBookName)
.set(authorId).equalTo(record::getAuthorId)
.set(authorName).equalTo(record::getAuthorName)
.set(bookDesc).equalTo(record::getBookDesc)
.set(score).equalTo(record::getScore)
.set(bookStatus).equalTo(record::getBookStatus)
.set(visitCount).equalTo(record::getVisitCount)
.set(wordCount).equalTo(record::getWordCount)
.set(commentCount).equalTo(record::getCommentCount)
.set(lastIndexId).equalTo(record::getLastIndexId)
.set(lastIndexName).equalTo(record::getLastIndexName)
.set(lastIndexUpdateTime).equalTo(record::getLastIndexUpdateTime)
.set(isVip).equalTo(record::getIsVip)
.set(status).equalTo(record::getStatus)
.set(updateTime).equalTo(record::getUpdateTime)
.set(createTime).equalTo(record::getCreateTime)
.set(crawlSourceId).equalTo(record::getCrawlSourceId)
.set(crawlBookId).equalTo(record::getCrawlBookId)
.set(crawlLastTime).equalTo(record::getCrawlLastTime)
.set(crawlIsStop).equalTo(record::getCrawlIsStop);
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default UpdateDSL<MyBatis3UpdateModelAdapter<Integer>> updateByExampleSelective(Book record) {
return UpdateDSL.updateWithMapper(this::update, book)
.set(id).equalToWhenPresent(record::getId)
.set(workDirection).equalToWhenPresent(record::getWorkDirection)
.set(catId).equalToWhenPresent(record::getCatId)
.set(catName).equalToWhenPresent(record::getCatName)
.set(picUrl).equalToWhenPresent(record::getPicUrl)
.set(bookName).equalToWhenPresent(record::getBookName)
.set(authorId).equalToWhenPresent(record::getAuthorId)
.set(authorName).equalToWhenPresent(record::getAuthorName)
.set(bookDesc).equalToWhenPresent(record::getBookDesc)
.set(score).equalToWhenPresent(record::getScore)
.set(bookStatus).equalToWhenPresent(record::getBookStatus)
.set(visitCount).equalToWhenPresent(record::getVisitCount)
.set(wordCount).equalToWhenPresent(record::getWordCount)
.set(commentCount).equalToWhenPresent(record::getCommentCount)
.set(lastIndexId).equalToWhenPresent(record::getLastIndexId)
.set(lastIndexName).equalToWhenPresent(record::getLastIndexName)
.set(lastIndexUpdateTime).equalToWhenPresent(record::getLastIndexUpdateTime)
.set(isVip).equalToWhenPresent(record::getIsVip)
.set(status).equalToWhenPresent(record::getStatus)
.set(updateTime).equalToWhenPresent(record::getUpdateTime)
.set(createTime).equalToWhenPresent(record::getCreateTime)
.set(crawlSourceId).equalToWhenPresent(record::getCrawlSourceId)
.set(crawlBookId).equalToWhenPresent(record::getCrawlBookId)
.set(crawlLastTime).equalToWhenPresent(record::getCrawlLastTime)
.set(crawlIsStop).equalToWhenPresent(record::getCrawlIsStop);
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default int updateByPrimaryKey(Book record) {
return UpdateDSL.updateWithMapper(this::update, book)
.set(workDirection).equalTo(record::getWorkDirection)
.set(catId).equalTo(record::getCatId)
.set(catName).equalTo(record::getCatName)
.set(picUrl).equalTo(record::getPicUrl)
.set(bookName).equalTo(record::getBookName)
.set(authorId).equalTo(record::getAuthorId)
.set(authorName).equalTo(record::getAuthorName)
.set(bookDesc).equalTo(record::getBookDesc)
.set(score).equalTo(record::getScore)
.set(bookStatus).equalTo(record::getBookStatus)
.set(visitCount).equalTo(record::getVisitCount)
.set(wordCount).equalTo(record::getWordCount)
.set(commentCount).equalTo(record::getCommentCount)
.set(lastIndexId).equalTo(record::getLastIndexId)
.set(lastIndexName).equalTo(record::getLastIndexName)
.set(lastIndexUpdateTime).equalTo(record::getLastIndexUpdateTime)
.set(isVip).equalTo(record::getIsVip)
.set(status).equalTo(record::getStatus)
.set(updateTime).equalTo(record::getUpdateTime)
.set(createTime).equalTo(record::getCreateTime)
.set(crawlSourceId).equalTo(record::getCrawlSourceId)
.set(crawlBookId).equalTo(record::getCrawlBookId)
.set(crawlLastTime).equalTo(record::getCrawlLastTime)
.set(crawlIsStop).equalTo(record::getCrawlIsStop)
.where(id, isEqualTo(record::getId))
.build()
.execute();
}
@Generated("org.mybatis.generator.api.MyBatisGenerator")
default int updateByPrimaryKeySelective(Book record) {
return UpdateDSL.updateWithMapper(this::update, book)
.set(workDirection).equalToWhenPresent(record::getWorkDirection)
.set(catId).equalToWhenPresent(record::getCatId)
.set(catName).equalToWhenPresent(record::getCatName)
.set(picUrl).equalToWhenPresent(record::getPicUrl)
.set(bookName).equalToWhenPresent(record::getBookName)
.set(authorId).equalToWhenPresent(record::getAuthorId)
.set(authorName).equalToWhenPresent(record::getAuthorName)
.set(bookDesc).equalToWhenPresent(record::getBookDesc)
.set(score).equalToWhenPresent(record::getScore)
.set(bookStatus).equalToWhenPresent(record::getBookStatus)
.set(visitCount).equalToWhenPresent(record::getVisitCount)
.set(wordCount).equalToWhenPresent(record::getWordCount)
.set(commentCount).equalToWhenPresent(record::getCommentCount)
.set(lastIndexId).equalToWhenPresent(record::getLastIndexId)
.set(lastIndexName).equalToWhenPresent(record::getLastIndexName)
.set(lastIndexUpdateTime).equalToWhenPresent(record::getLastIndexUpdateTime)
.set(isVip).equalToWhenPresent(record::getIsVip)
.set(status).equalToWhenPresent(record::getStatus)
.set(updateTime).equalToWhenPresent(record::getUpdateTime)
.set(createTime).equalToWhenPresent(record::getCreateTime)
.set(crawlSourceId).equalToWhenPresent(record::getCrawlSourceId)
.set(crawlBookId).equalToWhenPresent(record::getCrawlBookId)
.set(crawlLastTime).equalToWhenPresent(record::getCrawlLastTime)
.set(crawlIsStop).equalToWhenPresent(record::getCrawlIsStop)
.where(id, isEqualTo(record::getId))
.build()
.execute();
}
void addVisitCount(@Param("bookId") Long bookId, @Param("visitCount") Integer visitCount);
List<Book> listRecBookByCatId(@Param("catId") Integer catId);
void addCommentCount(@Param("bookId") Long bookId);
}

View File

@@ -1,157 +0,0 @@
package com.java2nb.novel.book.service;
import com.java2nb.novel.book.entity.*;
import com.java2nb.novel.book.vo.BookCommentVO;
import com.java2nb.novel.common.bean.PageBean;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
* 小说服务接口
* @author xiongxiaoyang
* @version 1.0
* @since 2020/5/28
*/
public interface BookService {
/**
* 根据最小更新时间分页查询书籍列表
* @param minDate 最小时间,包括该时间
* @param limit 查询数量
* @return 书籍数据集合
* */
List<Book> queryBookByMinUpdateTime(Date minDate, int limit);
/**
* 根据小说ID集合查询书籍列表
* @param ids 小说ID集合
* @return 书籍数据集合
* */
List<Book> queryBookByIds(List<Long> ids);
/**
* 小说排行数据查询列表
* @param type 排行类型0:点击排行1更新排行2新书排行3评论排行
* @param limit 查询数量
* @return 书籍数据集合
* */
List<Book> listRank(Byte type, Integer limit);
/**
* 小说分类列表查询
* @return 分类数据集合
* */
List<BookCategory> listBookCategory();
/**
* 小说详情信息查询
* @param id 小说ID
* @return 小说数据对象
* */
Book queryBookDetail(Long id);
/**
* 增加小说点击量
* @param bookId 小说ID
* @param addCount 新增的数量
* */
void addVisitCount(Long bookId, int addCount);
/**
* 查询章节数
* @param bookId 书籍ID
* @return 章节数量
* */
long queryIndexCount(Long bookId);
/**
* 查询章节内容
* @param bookIndexId 目录ID
* @return 书籍内容
* */
BookContent queryBookContent(Long bookIndexId);
/**
* 根据分类id查询同类推荐书籍
* @param catId 分类id
* @return 书籍集合
* */
List<Book> listRecBookByCatId(Integer catId);
/**
*分页查询书籍评论列表
* @param bookId 书籍ID
* @param page 页码
* @param pageSize 分页大小
* @return 评论集合分页数据
* */
PageBean<BookComment> listBookCommentByPage(Long bookId, int page, int pageSize);
/**
* 查询目录列表
* @param bookId 书籍ID
* @param orderBy 排序
*@param limit 查询条数
*@return 目录集合
* */
List<BookIndex> listNewIndex(Long bookId, String orderBy, Integer limit);
/**
* 查询首章目录ID
* @param bookId 书籍ID
* @return 首章目录ID
* */
Long queryFirstBookIndexId(Long bookId);
/**
* 查询目录
* @param bookIndexId 目录ID
* @return 目录信息
* */
BookIndex queryBookIndex(Long bookIndexId);
/**
* 上一章节和下一章节目录ID查询接口
* @param bookId 书籍ID
* @param indexNum 目录号
* @return 上一章节和下一章节目录ID数据
* */
Map<String,Long> queryPreAndNextBookIndexId(Long bookId, Integer indexNum);
/**
* 新增评价
* @param userId 用户ID
* @param comment 评论内容
* */
void addBookComment(Long userId, BookComment comment);
/**
* 分页查询用户评论
* @param userId 用户ID
* @param page 查询页码
* @param pageSize 分页大小
* @return 评论数据
* */
PageBean<BookComment> listUserCommentByPage(Long userId, int page, int pageSize);
/**
* 查询网络图片的小说
*
* @param localPicPrefix
* @param limit 查询条数
* @return 返回小说集合
* */
List<Book> queryNetworkPicBooks(String localPicPrefix, Integer limit);
/**
* 更新图片路径
* @param picUrl 图片路径
* @param bookId 小说ID
*/
void updateBookPic(String picUrl, Long bookId);
}

View File

@@ -1,357 +0,0 @@
package com.java2nb.novel.book.service.impl;
import com.github.pagehelper.PageHelper;
import com.java2nb.novel.book.entity.*;
import com.java2nb.novel.book.feign.UserFeignClient;
import com.java2nb.novel.book.mapper.*;
import com.java2nb.novel.book.service.BookService;
import com.java2nb.novel.book.vo.BookCommentVO;
import com.java2nb.novel.common.bean.PageBean;
import com.java2nb.novel.common.enums.ResponseStatus;
import com.java2nb.novel.common.exception.BusinessException;
import com.java2nb.novel.common.utils.BeanUtil;
import com.java2nb.novel.user.entity.User;
import lombok.RequiredArgsConstructor;
import org.apache.commons.lang3.StringUtils;
import org.mybatis.dynamic.sql.SortSpecification;
import org.mybatis.dynamic.sql.render.RenderingStrategies;
import org.mybatis.dynamic.sql.select.render.SelectStatementProvider;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import tk.mybatis.orderbyhelper.OrderByHelper;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
import static com.java2nb.novel.book.mapper.BookDynamicSqlSupport.book;
import static org.mybatis.dynamic.sql.SqlBuilder.*;
import static org.mybatis.dynamic.sql.select.SelectDSL.select;
/**
* 小说服务接口实现
*
* @author xiongxiaoyang
* @version 1.0
* @since 2020/5/28
*/
@Service
@RequiredArgsConstructor
public class BookServiceImpl implements BookService {
private final BookMapper bookMapper;
private final BookCategoryMapper bookCategoryMapper;
private final BookIndexMapper bookIndexMapper;
private final BookContentMapper bookContentMapper;
private final BookCommentMapper bookCommentMapper;
private final UserFeignClient userFeignClient;
@Override
public List<Book> queryBookByMinUpdateTime(Date minDate, int limit) {
return bookMapper.selectMany(select(book.allColumns())
.from(book)
.where(BookDynamicSqlSupport.updateTime, isGreaterThan(minDate))
.orderBy(BookDynamicSqlSupport.updateTime)
.limit(limit)
.build()
.render(RenderingStrategies.MYBATIS3));
}
@Override
public List<Book> queryBookByIds(List<Long> ids) {
return bookMapper.selectMany(select(BookDynamicSqlSupport.id, BookDynamicSqlSupport.catId, BookDynamicSqlSupport.catName,
BookDynamicSqlSupport.bookName, BookDynamicSqlSupport.authorName,
BookDynamicSqlSupport.lastIndexId, BookDynamicSqlSupport.lastIndexName, BookDynamicSqlSupport.lastIndexUpdateTime,
BookDynamicSqlSupport.picUrl, BookDynamicSqlSupport.bookDesc, BookDynamicSqlSupport.score)
.from(book)
.where(BookDynamicSqlSupport.id, isIn(ids))
.build()
.render(RenderingStrategies.MYBATIS3)
);
}
@Override
public List<Book> listRank(Byte type, Integer limit) {
SortSpecification sortSpecification = BookDynamicSqlSupport.visitCount.descending();
switch (type) {
case 1: {
//最新入库排序
sortSpecification = BookDynamicSqlSupport.createTime.descending();
break;
}
case 2: {
//最新更新时间排序
sortSpecification = BookDynamicSqlSupport.lastIndexUpdateTime.descending();
break;
}
case 3: {
//评论数量排序
sortSpecification = BookDynamicSqlSupport.commentCount.descending();
break;
}
default: {
break;
}
}
SelectStatementProvider selectStatement =
select(BookDynamicSqlSupport.id, BookDynamicSqlSupport.catId,
BookDynamicSqlSupport.catName, BookDynamicSqlSupport.bookName,
BookDynamicSqlSupport.lastIndexId, BookDynamicSqlSupport.lastIndexName,
BookDynamicSqlSupport.authorId, BookDynamicSqlSupport.authorName,
BookDynamicSqlSupport.picUrl, BookDynamicSqlSupport.bookDesc,
BookDynamicSqlSupport.wordCount, BookDynamicSqlSupport.lastIndexUpdateTime)
.from(book)
.where(BookDynamicSqlSupport.wordCount, isGreaterThan(0))
.orderBy(sortSpecification)
.limit(limit)
.build()
.render(RenderingStrategies.MYBATIS3);
return bookMapper.selectMany(selectStatement);
}
@Override
public List<BookCategory> listBookCategory() {
SelectStatementProvider selectStatementProvider = select(BookCategoryDynamicSqlSupport.id, BookCategoryDynamicSqlSupport.name, BookCategoryDynamicSqlSupport.workDirection)
.from(BookCategoryDynamicSqlSupport.bookCategory)
.orderBy(BookCategoryDynamicSqlSupport.sort)
.build()
.render(RenderingStrategies.MYBATIS3);
return bookCategoryMapper.selectMany(selectStatementProvider);
}
@Override
public Book queryBookDetail(Long id) {
SelectStatementProvider selectStatement = select(BookDynamicSqlSupport.book.allColumns())
.from(BookDynamicSqlSupport.book)
.where(BookDynamicSqlSupport.id, isEqualTo(id))
.limit(1)
.build()
.render(RenderingStrategies.MYBATIS3);
List<Book> books = bookMapper.selectMany(selectStatement);
return books.size() > 0 ? books.get(0) : null;
}
@Override
public void addVisitCount(Long bookId, int addCount) {
bookMapper.addVisitCount(bookId, addCount);
}
@Override
public long queryIndexCount(Long bookId) {
SelectStatementProvider selectStatement = select(count(BookIndexDynamicSqlSupport.id))
.from(BookIndexDynamicSqlSupport.bookIndex)
.where(BookIndexDynamicSqlSupport.bookId, isEqualTo(bookId))
.build()
.render(RenderingStrategies.MYBATIS3);
return bookIndexMapper.count(selectStatement);
}
@Override
public BookContent queryBookContent(Long bookIndexId) {
SelectStatementProvider selectStatement = select(BookContentDynamicSqlSupport.id, BookContentDynamicSqlSupport.content)
.from(BookContentDynamicSqlSupport.bookContent)
.where(BookContentDynamicSqlSupport.indexId, isEqualTo(bookIndexId))
.limit(1)
.build()
.render(RenderingStrategies.MYBATIS3);
return bookContentMapper.selectMany(selectStatement).get(0);
}
@Override
public List<Book> listRecBookByCatId(Integer catId) {
return bookMapper.listRecBookByCatId(catId);
}
@Override
public PageBean<BookComment> listBookCommentByPage(Long bookId, int page, int pageSize) {
//分页查询小说评论数据
PageHelper.startPage(page, pageSize);
List<BookComment> bookCommentList = bookCommentMapper.selectMany(
select(BookCommentDynamicSqlSupport.id, BookCommentDynamicSqlSupport.bookId,
BookCommentDynamicSqlSupport.createUserId,
BookCommentDynamicSqlSupport.commentContent, BookCommentDynamicSqlSupport.replyCount,
BookCommentDynamicSqlSupport.createTime)
.from(BookCommentDynamicSqlSupport.bookComment)
.where(BookCommentDynamicSqlSupport.bookId, isEqualTo(bookId))
.orderBy(BookCommentDynamicSqlSupport.createTime.descending())
.build()
.render(RenderingStrategies.MYBATIS3));
//根据评论人ID集合查询出评论人集合数据
List<User> users = userFeignClient.queryById(bookCommentList.stream().map(BookComment::getCreateUserId).collect(Collectors.toList()));
Map<Long, User> userMap = users.stream().collect(Collectors.toMap(User::getId, Function.identity(), (key1, key2) -> key2));
//将评论数据和评论人数据关联起来 TODO 评论表增加用户相关的冗余字段用户信息更新后用户服务通过mq发送message其他服务消费message更新所有的冗余字段
List<BookCommentVO> resultList = new ArrayList<>(bookCommentList.size());
bookCommentList.forEach(bookComment->{
BookCommentVO bookCommentVO = new BookCommentVO();
BeanUtils.copyProperties(bookComment, bookCommentVO);
User user = userMap.get(bookComment.getCreateUserId());
if (user != null) {
bookCommentVO.setCreateUserName(user.getUsername());
bookCommentVO.setCreateUserPhoto(user.getUserPhoto());
}
resultList.add(bookCommentVO);
});
PageBean<BookComment> pageBean = new PageBean<>(bookCommentList);
pageBean.setList(resultList);
return pageBean;
}
@Override
public List<BookIndex> listNewIndex(Long bookId, String orderBy, Integer limit) {
if (StringUtils.isNotBlank(orderBy)) {
OrderByHelper.orderBy(orderBy);
}
if (limit != null) {
PageHelper.startPage(1, limit);
}
SelectStatementProvider selectStatement = select(BookIndexDynamicSqlSupport.id, BookIndexDynamicSqlSupport.bookId,
BookIndexDynamicSqlSupport.indexNum, BookIndexDynamicSqlSupport.indexName,
BookIndexDynamicSqlSupport.updateTime, BookIndexDynamicSqlSupport.isVip)
.from(BookIndexDynamicSqlSupport.bookIndex)
.where(BookIndexDynamicSqlSupport.bookId, isEqualTo(bookId))
.build()
.render(RenderingStrategies.MYBATIS3);
return bookIndexMapper.selectMany(selectStatement);
}
@Override
public Long queryFirstBookIndexId(Long bookId) {
SelectStatementProvider selectStatement = select(BookIndexDynamicSqlSupport.id)
.from(BookIndexDynamicSqlSupport.bookIndex)
.where(BookIndexDynamicSqlSupport.bookId, isEqualTo(bookId))
.orderBy(BookIndexDynamicSqlSupport.indexNum)
.limit(1)
.build()
.render(RenderingStrategies.MYBATIS3);
return bookIndexMapper.selectMany(selectStatement).get(0).getId();
}
@Override
public BookIndex queryBookIndex(Long bookIndexId) {
SelectStatementProvider selectStatement = select(BookIndexDynamicSqlSupport.id, BookIndexDynamicSqlSupport.bookId, BookIndexDynamicSqlSupport.indexNum, BookIndexDynamicSqlSupport.indexName, BookIndexDynamicSqlSupport.wordCount, BookIndexDynamicSqlSupport.updateTime, BookIndexDynamicSqlSupport.isVip)
.from(BookIndexDynamicSqlSupport.bookIndex)
.where(BookIndexDynamicSqlSupport.id, isEqualTo(bookIndexId))
.limit(1)
.build()
.render(RenderingStrategies.MYBATIS3);
return bookIndexMapper.selectMany(selectStatement).get(0);
}
@Override
public Map<String, Long> queryPreAndNextBookIndexId(Long bookId, Integer indexNum) {
Map<String, Long> result = new HashMap<>(2);
SelectStatementProvider selectStatement = select(BookIndexDynamicSqlSupport.id)
.from(BookIndexDynamicSqlSupport.bookIndex)
.where(BookIndexDynamicSqlSupport.bookId, isEqualTo(bookId))
.and(BookIndexDynamicSqlSupport.indexNum, isLessThan(indexNum))
.orderBy(BookIndexDynamicSqlSupport.indexNum.descending())
.limit(1)
.build()
.render(RenderingStrategies.MYBATIS3);
List<BookIndex> list = bookIndexMapper.selectMany(selectStatement);
if (list.size() == 0) {
result.put("preBookIndexId", 0L);
} else {
result.put("preBookIndexId", list.get(0).getId());
}
selectStatement = select(BookIndexDynamicSqlSupport.id)
.from(BookIndexDynamicSqlSupport.bookIndex)
.where(BookIndexDynamicSqlSupport.bookId, isEqualTo(bookId))
.and(BookIndexDynamicSqlSupport.indexNum, isGreaterThan(indexNum))
.orderBy(BookIndexDynamicSqlSupport.indexNum)
.limit(1)
.build()
.render(RenderingStrategies.MYBATIS3);
list = bookIndexMapper.selectMany(selectStatement);
if (list.size() == 0) {
result.put("nextBookIndexId", 0L);
} else {
result.put("nextBookIndexId", list.get(0).getId());
}
return result;
}
@Transactional(rollbackFor = Exception.class)
@Override
public void addBookComment(Long userId, BookComment comment) {
//判断该用户是否已评论过该书籍
SelectStatementProvider selectStatement = select(count(BookCommentDynamicSqlSupport.id))
.from(BookCommentDynamicSqlSupport.bookComment)
.where(BookCommentDynamicSqlSupport.createUserId, isEqualTo(userId))
.and(BookCommentDynamicSqlSupport.bookId, isEqualTo(comment.getBookId()))
.build()
.render(RenderingStrategies.MYBATIS3);
if (bookCommentMapper.count(selectStatement) > 0) {
throw new BusinessException(ResponseStatus.HAS_COMMENTS);
}
//增加评论
comment.setCreateUserId(userId);
comment.setCreateTime(new Date());
bookCommentMapper.insertSelective(comment);
//增加书籍评论数
bookMapper.addCommentCount(comment.getBookId());
}
@Override
public PageBean<BookComment> listUserCommentByPage(Long userId, int page, int pageSize) {
PageHelper.startPage(page, pageSize);
return new PageBean<>(bookCommentMapper.selectMany(
select(BookCommentDynamicSqlSupport.id, BookCommentDynamicSqlSupport.bookId,
BookCommentDynamicSqlSupport.createUserId,
BookCommentDynamicSqlSupport.commentContent, BookCommentDynamicSqlSupport.replyCount,
BookCommentDynamicSqlSupport.createTime)
.from(BookCommentDynamicSqlSupport.bookComment)
.where(BookCommentDynamicSqlSupport.createUserId, isEqualTo(userId))
.orderBy(BookCommentDynamicSqlSupport.createTime.descending())
.build()
.render(RenderingStrategies.MYBATIS3)));
}
@Override
public List<Book> queryNetworkPicBooks(String localPicPrefix, Integer limit) {
return bookMapper.selectMany(
select(BookDynamicSqlSupport.id, BookDynamicSqlSupport.picUrl)
.from(book)
.where(BookDynamicSqlSupport.picUrl, isLike("http%"))
.and(BookDynamicSqlSupport.picUrl, isNotLike(localPicPrefix))
.limit(limit)
.build()
.render(RenderingStrategies.MYBATIS3));
}
@Override
public void updateBookPic(String picUrl, Long bookId) {
bookMapper.update(update(book)
.set(BookDynamicSqlSupport.picUrl)
.equalTo(picUrl)
.set(BookDynamicSqlSupport.updateTime)
.equalTo(new Date())
.where(BookDynamicSqlSupport.id, isEqualTo(bookId))
.build()
.render(RenderingStrategies.MYBATIS3));
}
}

View File

@@ -1,4 +0,0 @@
spring:
profiles:
include: [common]

View File

@@ -1,17 +0,0 @@
spring:
application:
name: book-service
profiles:
active: dev
cloud:
nacos:
config:
extconfig[0]:
dataid: novel-redis.yml
group: novel-common
refresh: true
extconfig[1]:
dataid: novel-rabbitmq.yml
group: novel-common
refresh: true

View File

@@ -1,38 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.java2nb.novel.book.mapper.BookMapper">
<update id="addVisitCount" >
update book set visit_count = visit_count + ${visitCount}
where id = #{bookId}
</update>
<select id="listRecBookByCatId" parameterType="int" resultType="com.java2nb.novel.book.entity.Book">
select id,pic_url,book_name,book_desc
from book
where cat_id = #{catId}
order by RAND() LIMIT 4
</select>
<update id="addCommentCount" parameterType="long">
update book set comment_count = comment_count+1
where id = #{bookId}
</update>
<select id="queryNetworkPicBooks" resultType="com.java2nb.novel.book.entity.Book">
select
id,pic_url from book
where pic_url like 'http%'
and pic_url not like concat('%',#{localPicPrefix},'%')
limit #{limit}
</select>
<select id="selectIdsByScoreAndRandom" parameterType="int" resultType="com.java2nb.novel.book.entity.Book">
select id,book_name,author_name,pic_url,book_desc,score from book ORDER BY score,RAND() LIMIT #{limit};
</select>
</mapper>

View File

@@ -0,0 +1,35 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>novel-book</artifactId>
<groupId>io.github.xxyopen</groupId>
<version>2.0.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>novel-book-api</artifactId>
<dependencies>
<dependency>
<groupId>io.github.xxyopen</groupId>
<artifactId>novel-common</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<scope>provided</scope>
</dependency>
</dependencies>
</project>

View File

@@ -0,0 +1,76 @@
package io.github.xxyopen.novel.book.dto.req;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
/**
* 小说发布 请求DTO
*
* @author xiongxiaoyang
* @date 2022/5/23
*/
@Data
public class BookAddReqDto {
/**
* 作家ID
*/
private Long authorId;
/**
* 作家笔名
*/
private String penName;
/**
* 作品方向;0-男频 1-女频
*/
@Schema(description = "作品方向;0-男频 1-女频", required = true)
@NotNull
private Integer workDirection;
/**
* 类别ID
*/
@Schema(description = "类别ID", required = true)
@NotNull
private Long categoryId;
/**
* 类别名
*/
@Schema(description = "类别名", required = true)
@NotBlank
private String categoryName;
/**
* 小说封面地址
*/
@Schema(description = "小说封面地址", required = true)
@NotBlank
private String picUrl;
/**
* 小说名
*/
@Schema(description = "小说名", required = true)
@NotBlank
private String bookName;
/**
* 书籍描述
*/
@Schema(description = "书籍描述", required = true)
@NotBlank
private String bookDesc;
/**
* 是否收费;1-收费 0-免费
*/
@Schema(description = "是否收费;1-收费 0-免费", required = true)
@NotNull
private Integer isVip;
}

View File

@@ -0,0 +1,27 @@
package io.github.xxyopen.novel.book.dto.req;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import org.hibernate.validator.constraints.Length;
/**
* 小说评论 请求DTO
* @author xiongxiaoyang
* @date 2022/5/17
*/
@Data
public class BookCommentReqDto {
private Long commentId;
private Long userId;
@Schema(description = "小说ID")
private Long bookId;
@Schema(description = "评论内容")
private String commentContent;
}

View File

@@ -0,0 +1,24 @@
package io.github.xxyopen.novel.book.dto.req;
import io.github.xxyopen.novel.common.req.PageReqDto;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import lombok.Data;
/**
* 章节发布页 请求DTO
*
* @author xiongxiaoyang
* @date 2022/5/23
*/
@Data
public class BookPageReqDto extends PageReqDto {
/**
* 作家ID
*/
@Schema(description = "作家ID", required = true)
private Long authorId;
}

View File

@@ -0,0 +1,78 @@
package io.github.xxyopen.novel.book.dto.req;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.github.xxyopen.novel.common.req.PageReqDto;
import io.swagger.v3.oas.annotations.Parameter;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
/**
* 小说搜索 请求DTO
*
* @author xiongxiaoyang
* @date 2022/5/16
*/
@Data
public class BookSearchReqDto extends PageReqDto {
/**
* 搜索关键字
*/
@Parameter(description = "搜索关键字")
private String keyword;
/**
* 作品方向
*/
@Parameter(description = "作品方向")
private Integer workDirection;
/**
* 分类ID
*/
@Parameter(description = "分类ID")
private Integer categoryId;
/**
* 是否收费1收费0免费
*/
@Parameter(description = "是否收费1收费0免费")
private Integer isVip;
/**
* 小说更新状态0连载中1已完结
*/
@Parameter(description = "小说更新状态0连载中1已完结")
private Integer bookStatus;
/**
* 字数最小值
*/
@Parameter(description = "字数最小值")
private Integer wordCountMin;
/**
* 字数最大值
*/
@Parameter(description = "字数最大值")
private Integer wordCountMax;
/**
* 最小更新时间
* 如果使用Get请求直接使用对象接收则可以使用@DateTimeFormat注解进行格式化
* 如果使用Post请求@RequestBody接收请求体参数默认解析日期格式为yyyy-MM-dd HH:mm:ss ,
* 如果需要接收其他格式的参数,则可以使用@JsonFormat注解
* */
@Parameter(description = "最小更新时间")
@DateTimeFormat(pattern = "yyyy-MM-dd")
@JsonFormat(pattern = "yyyy-MM-dd")
private Date updateTimeMin;
/**
* 排序字段
*/
@Parameter(description = "排序字段")
private String sort;
}

View File

@@ -0,0 +1,50 @@
package io.github.xxyopen.novel.book.dto.req;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import org.hibernate.validator.constraints.Length;
/**
* 章节发布 请求DTO
*
* @author xiongxiaoyang
* @date 2022/5/23
*/
@Data
public class ChapterAddReqDto {
/**
* 小说ID
*/
private Long bookId;
/**
* 作家ID
*/
private Long authorId;
/**
* 章节名
*/
@NotBlank
@Schema(description = "章节名", required = true)
private String chapterName;
/**
* 章节内容
*/
@Schema(description = "章节内容", required = true)
@NotBlank
@Length(min = 50)
private String chapterContent;
/**
* 是否收费;1-收费 0-免费
*/
@Schema(description = "是否收费;1-收费 0-免费", required = true)
@NotNull
private Integer isVip;
}

View File

@@ -0,0 +1,25 @@
package io.github.xxyopen.novel.book.dto.req;
import io.github.xxyopen.novel.common.req.PageReqDto;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import lombok.Data;
/**
* 章节发布页 请求DTO
*
* @author xiongxiaoyang
* @date 2022/5/23
*/
@Data
public class ChapterPageReqDto extends PageReqDto {
/**
* 小说ID
*/
@NotBlank
@Schema(description = "小说ID", required = true)
private Long bookId;
}

View File

@@ -0,0 +1,29 @@
package io.github.xxyopen.novel.book.dto.resp;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Builder;
import lombok.Data;
/**
* 小说分类 响应DTO
*
* @author xiongxiaoyang
* @date 2022/5/16
*/
@Data
@Builder
public class BookCategoryRespDto {
/**
* 类别ID
*/
@Schema(description = "类别ID")
private Long id;
/**
* 类别名
*/
@Schema(description = "类别名")
private String name;
}

View File

@@ -0,0 +1,31 @@
package io.github.xxyopen.novel.book.dto.resp;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Builder;
import lombok.Data;
/**
* 小说章节相关 响应DTO
*
* @author xiongxiaoyang
* @date 2022/5/15
*/
@Data
@Builder
public class BookChapterAboutRespDto {
private BookChapterRespDto chapterInfo;
/**
* 章节总数
*/
@Schema(description = "章节总数")
private Long chapterTotal;
/**
* 内容概要30字
*/
@Schema(description = " 内容概要30字")
private String contentSummary;
}

View File

@@ -0,0 +1,78 @@
package io.github.xxyopen.novel.book.dto.resp;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serial;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* 小说章节 响应DTO
*
* @author xiongxiaoyang
* @date 2022/5/15
*/
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class BookChapterRespDto implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 章节ID
*/
@Schema(description = "章节ID")
private Long id;
/**
* 小说ID
*/
@Schema(description = "小说ID")
private Long bookId;
/**
* 章节号
*/
@Schema(description = "章节号")
private Integer chapterNum;
/**
* 章节名
*/
@Schema(description = "章节名")
private String chapterName;
/**
* 章节字数
*/
@Schema(description = "章节字数")
private Integer chapterWordCount;
/**
* 章节更新时间
* <p>
* ⚠️这里的 @JsonFormat 注解必须在该类有无参构造函数的情况下才能生效
*
* @Builder 注解会自动帮该类生成全参构造函数,导致丢失了默认的无参构造函数。
* <p>
* 所以,必须显示为该类生成无参构造函数。如果没有显示为该类生成无参构造函数,会报 Json 反序列化的错误
*/
@Schema(description = "章节更新时间")
@JsonFormat(pattern = "yyyy/MM/dd HH:mm")
private LocalDateTime chapterUpdateTime;
/**
* 是否收费;1-收费 0-免费
*/
@Schema(description = "是否收费;1-收费 0-免费")
private Integer isVip;
}

View File

@@ -0,0 +1,54 @@
package io.github.xxyopen.novel.book.dto.resp;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import io.github.xxyopen.novel.common.json.serializer.UsernameSerializer;
import io.swagger.v3.oas.annotations.media.Schema;
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 {
@Schema(description = "评论总数")
private Long commentTotal;
@Schema(description = "评论列表")
private List<CommentInfo> comments;
@Data
@Builder
public static class CommentInfo {
@Schema(description = "评论ID")
private Long id;
@Schema(description = "评论内容")
private String commentContent;
@Schema(description = "评论用户")
@JsonSerialize(using = UsernameSerializer.class)
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;
}
}

View File

@@ -0,0 +1,35 @@
package io.github.xxyopen.novel.book.dto.resp;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Builder;
import lombok.Data;
/**
* 小说内容相关 响应DTO
*
* @author xiongxiaoyang
* @date 2022/5/15
*/
@Data
@Builder
public class BookContentAboutRespDto {
/**
* 小说信息
*/
@Schema(description = "小说信息")
private BookInfoRespDto bookInfo;
/**
* 章节信息
*/
@Schema(description = "章节信息")
private BookChapterRespDto chapterInfo;
/**
* 章节内容
*/
@Schema(description = "章节内容")
private String bookContent;
}

View File

@@ -0,0 +1,105 @@
package io.github.xxyopen.novel.book.dto.resp;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* Elasticsearch 存储小说 DTO
* @author xiongxiaoyang
* @date 2022/5/23
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class BookEsRespDto {
/**
* id
*/
private Long id;
/**
* 作品方向;0-男频 1-女频
*/
private Integer workDirection;
/**
* 类别ID
*/
private Long categoryId;
/**
* 类别名
*/
private String categoryName;
/**
* 小说名
*/
private String bookName;
/**
* 作家id
*/
private Long authorId;
/**
* 作家名
*/
private String authorName;
/**
* 书籍描述
*/
private String bookDesc;
/**
* 评分;总分:10 ,真实评分 = score/10
*/
private Integer score;
/**
* 书籍状态;0-连载中 1-已完结
*/
private Integer bookStatus;
/**
* 点击量
*/
private Long visitCount;
/**
* 总字数
*/
private Integer wordCount;
/**
* 评论数
*/
private Integer commentCount;
/**
* 最新章节ID
*/
private Long lastChapterId;
/**
* 最新章节名
*/
private String lastChapterName;
/**
* 最新章节更新时间
*/
private Long lastChapterUpdateTime;
/**
* 是否收费;1-收费 0-免费
*/
private Integer isVip;
}

View File

@@ -0,0 +1,122 @@
package io.github.xxyopen.novel.book.dto.resp;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.LocalDateTime;
/**
* 小说信息 响应DTO
*
* @author xiongxiaoyang
* @date 2022/5/15
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class BookInfoRespDto {
/**
* ID
*/
@Schema(description = "小说ID")
private Long id;
/**
* 类别ID
*/
@Schema(description = "类别ID")
private Long categoryId;
/**
* 类别名
*/
@Schema(description = "类别名")
private String categoryName;
/**
* 小说封面地址
*/
@Schema(description = "小说封面地址")
private String picUrl;
/**
* 小说名
*/
@Schema(description = "小说名")
private String bookName;
/**
* 作家id
*/
@Schema(description = "作家id")
private Long authorId;
/**
* 作家名
*/
@Schema(description = "作家名")
private String authorName;
/**
* 书籍描述
*/
@Schema(description = "书籍描述")
private String bookDesc;
/**
* 书籍状态;0-连载中 1-已完结
*/
@Schema(description = "书籍状态;0-连载中 1-已完结")
private Integer bookStatus;
/**
* 点击量
*/
@Schema(description = "点击量")
private Long visitCount;
/**
* 总字数
*/
@Schema(description = "总字数")
private Integer wordCount;
/**
* 评论数
*/
@Schema(description = "评论数")
private Integer commentCount;
/**
* 首章节ID
*/
@Schema(description = "首章节ID")
private Long firstChapterId;
/**
* 最新章节ID
*/
@Schema(description = "最新章节ID")
private Long lastChapterId;
/**
* 最新章节名
*/
@Schema(description = "最新章节名")
private String lastChapterName;
/**
* 最新章节更新时间
*/
@Schema(description = "最新章节更新时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm")
private LocalDateTime updateTime;
}

View File

@@ -0,0 +1,84 @@
package io.github.xxyopen.novel.book.dto.resp;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* 小说排行榜 响应DTO
*
* @author xiongxiaoyang
* @date 2022/5/14
*/
@Data
public class BookRankRespDto implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* ID
*/
@Schema(description = "小说ID")
private Long id;
/**
* 类别ID
*/
@Schema(description = "类别ID")
private Long categoryId;
/**
* 类别名
*/
@Schema(description = "类别名")
private String categoryName;
/**
* 小说封面地址
*/
@Schema(description = "小说封面地址")
private String picUrl;
/**
* 小说名
*/
@Schema(description = "小说名")
private String bookName;
/**
* 作家名
*/
@Schema(description = "作家名")
private String authorName;
/**
* 书籍描述
*/
@Schema(description = "书籍描述")
private String bookDesc;
/**
* 总字数
*/
@Schema(description = "总字数")
private Integer wordCount;
/**
* 最新章节名
*/
@Schema(description = "最新章节名")
private String lastChapterName;
/**
* 最新章节更新时间
*/
@Schema(description = "最新章节更新时间")
@JsonFormat(pattern = "MM/dd HH:mm")
private LocalDateTime lastChapterUpdateTime;
}

View File

@@ -0,0 +1,132 @@
package io.github.xxyopen.novel.book.feign;
import io.github.xxyopen.novel.book.dto.req.*;
import io.github.xxyopen.novel.book.dto.resp.BookChapterRespDto;
import io.github.xxyopen.novel.book.dto.resp.BookEsRespDto;
import io.github.xxyopen.novel.book.dto.resp.BookInfoRespDto;
import io.github.xxyopen.novel.common.constant.ApiRouterConsts;
import io.github.xxyopen.novel.common.constant.ErrorCodeEnum;
import io.github.xxyopen.novel.common.resp.PageRespDto;
import io.github.xxyopen.novel.common.resp.RestResp;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import java.util.ArrayList;
import java.util.List;
/**
* 小说微服务调用客户端
*
* @author xiongxiaoyang
* @date 2023/3/29
*/
@Component
@FeignClient(value = "novel-book-service", fallback = BookFeign.BookFeignFallback.class)
public interface BookFeign {
/**
* 查询下一批保存到 ES 中的小说列表
*/
@PostMapping(ApiRouterConsts.API_INNER_BOOK_URL_PREFIX + "/listNextEsBooks")
RestResp<List<BookEsRespDto>> listNextEsBooks(Long maxBookId);
/**
* 批量查询小说信息
*/
@PostMapping(ApiRouterConsts.API_INNER_BOOK_URL_PREFIX + "/listBookInfoByIds")
RestResp<List<BookInfoRespDto>> listBookInfoByIds(List<Long> bookIds);
/**
* 发表评论
*/
@PostMapping(ApiRouterConsts.API_INNER_BOOK_URL_PREFIX + "/publishComment")
RestResp<Void> publishComment(BookCommentReqDto dto);
/**
* 修改评论
*/
@PostMapping(ApiRouterConsts.API_INNER_BOOK_URL_PREFIX + "/updateComment")
RestResp<Void> updateComment(BookCommentReqDto dto);
/**
* 删除评论接口
*/
@PostMapping(ApiRouterConsts.API_INNER_BOOK_URL_PREFIX + "/deleteComment")
RestResp<Void> deleteComment(@RequestBody BookCommentReqDto dto);
/**
* 小说发布接口
*/
@PostMapping(ApiRouterConsts.API_INNER_BOOK_URL_PREFIX + "/publishBook")
RestResp<Void> publishBook(BookAddReqDto dto);
/**
* 小说发布列表查询接口
*/
@PostMapping(ApiRouterConsts.API_INNER_BOOK_URL_PREFIX + "/listPublishBooks")
RestResp<PageRespDto<BookInfoRespDto>> listPublishBooks(BookPageReqDto dto);
/**
* 小说章节发布接口
*/
@PostMapping(ApiRouterConsts.API_INNER_BOOK_URL_PREFIX + "/publishBookChapter")
RestResp<Void> publishBookChapter(ChapterAddReqDto dto);
/**
* 小说章节发布列表查询接口
*/
@PostMapping(ApiRouterConsts.API_INNER_BOOK_URL_PREFIX + "/listPublishBookChapters")
RestResp<PageRespDto<BookChapterRespDto>> listPublishBookChapters(ChapterPageReqDto dto);
@Component
class BookFeignFallback implements BookFeign {
@Override
public RestResp<List<BookEsRespDto>> listNextEsBooks(Long maxBookId) {
return RestResp.ok(new ArrayList<>(0));
}
@Override
public RestResp<List<BookInfoRespDto>> listBookInfoByIds(List<Long> bookIds) {
return RestResp.ok(new ArrayList<>(0));
}
@Override
public RestResp<Void> publishComment(BookCommentReqDto dto) {
return RestResp.fail(ErrorCodeEnum.THIRD_SERVICE_ERROR);
}
@Override
public RestResp<Void> updateComment(BookCommentReqDto dto) {
return RestResp.fail(ErrorCodeEnum.THIRD_SERVICE_ERROR);
}
@Override
public RestResp<Void> deleteComment(BookCommentReqDto dto) {
return RestResp.fail(ErrorCodeEnum.THIRD_SERVICE_ERROR);
}
@Override
public RestResp<Void> publishBook(BookAddReqDto dto) {
return RestResp.fail(ErrorCodeEnum.THIRD_SERVICE_ERROR);
}
@Override
public RestResp<PageRespDto<BookInfoRespDto>> listPublishBooks(BookPageReqDto dto) {
return RestResp.ok(PageRespDto.of(dto.getPageNum(), dto.getPageSize(), 0, new ArrayList<>(0)));
}
@Override
public RestResp<Void> publishBookChapter(ChapterAddReqDto dto) {
return RestResp.fail(ErrorCodeEnum.THIRD_SERVICE_ERROR);
}
@Override
public RestResp<PageRespDto<BookChapterRespDto>> listPublishBookChapters(ChapterPageReqDto dto) {
return RestResp.ok(PageRespDto.of(dto.getPageNum(), dto.getPageSize(), 0, new ArrayList<>(0)));
}
}
}

View File

@@ -0,0 +1,57 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>novel-book</artifactId>
<groupId>io.github.xxyopen</groupId>
<version>2.0.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>novel-book-service</artifactId>
<name>novel-book-service</name>
<description>小说微服务</description>
<dependencies>
<dependency>
<groupId>io.github.xxyopen</groupId>
<artifactId>novel-config</artifactId>
</dependency>
<dependency>
<groupId>io.github.xxyopen</groupId>
<artifactId>novel-book-api</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>io.github.xxyopen</groupId>
<artifactId>novel-user-api</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>

View File

@@ -0,0 +1,21 @@
package io.github.xxyopen.novel.book;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
@SpringBootApplication(scanBasePackages = {"io.github.xxyopen.novel"})
@MapperScan("io.github.xxyopen.novel.book.dao.mapper")
@EnableCaching
@EnableDiscoveryClient
@EnableFeignClients(basePackages = {"io.github.xxyopen.novel.user.feign"})
public class NovelBookApplication {
public static void main(String[] args) {
SpringApplication.run(NovelBookApplication.class, args);
}
}

View File

@@ -0,0 +1,33 @@
package io.github.xxyopen.novel.book.config;
import io.github.xxyopen.novel.common.constant.ApiRouterConsts;
import io.github.xxyopen.novel.config.interceptor.TokenParseInterceptor;
import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
/**
* Spring Web Mvc 相关配置不要加 @EnableWebMvc 注解,否则会导致 jackson 的全局配置失效。因为 @EnableWebMvc 注解会导致 WebMvcAutoConfiguration 自动配置失效
*
* @author xiongxiaoyang
* @date 2022/5/18
*/
@Configuration
@RequiredArgsConstructor
public class WebConfig implements WebMvcConfigurer {
private final TokenParseInterceptor tokenParseInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
// Token 解析拦截器
registry.addInterceptor(tokenParseInterceptor)
// 拦截小说内容查询接口,需要解析 token 以判断该用户是否有权阅读该章节(付费章节是否已购买)
.addPathPatterns(ApiRouterConsts.API_FRONT_BOOK_URL_PREFIX + "/content/*");
}
}

View File

@@ -0,0 +1,156 @@
package io.github.xxyopen.novel.book.controller.front;
import io.github.xxyopen.novel.book.dto.resp.*;
import io.github.xxyopen.novel.book.service.BookService;
import io.github.xxyopen.novel.common.constant.ApiRouterConsts;
import io.github.xxyopen.novel.common.resp.RestResp;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
import java.security.NoSuchAlgorithmException;
import java.util.List;
/**
* 前台门户-小说模块 API 控制器
*
* @author xiongxiaoyang
* @date 2022/5/14
*/
@Tag(name = "FrontBookController", description = "前台门户-小说模块")
@RestController
@RequestMapping(ApiRouterConsts.API_FRONT_BOOK_URL_PREFIX)
@RequiredArgsConstructor
public class FrontBookController {
private final BookService bookService;
/**
* 小说分类列表查询接口
*/
@Operation(summary = "小说分类列表查询接口")
@GetMapping("category/list")
public RestResp<List<BookCategoryRespDto>> listCategory(
@Parameter(description = "作品方向", required = true) Integer workDirection) {
return bookService.listCategory(workDirection);
}
/**
* 小说信息查询接口
*/
@Operation(summary = "小说信息查询接口")
@GetMapping("{id}")
public RestResp<BookInfoRespDto> getBookById(
@Parameter(description = "小说 ID") @PathVariable("id") Long bookId) {
return bookService.getBookById(bookId);
}
/**
* 增加小说点击量接口
*/
@Operation(summary = "增加小说点击量接口")
@PostMapping("visit")
public RestResp<Void> addVisitCount(@Parameter(description = "小说ID") Long bookId) {
return bookService.addVisitCount(bookId);
}
/**
* 小说最新章节相关信息查询接口
*/
@Operation(summary = "小说最新章节相关信息查询接口")
@GetMapping("last_chapter/about")
public RestResp<BookChapterAboutRespDto> getLastChapterAbout(
@Parameter(description = "小说ID") Long bookId) {
return bookService.getLastChapterAbout(bookId);
}
/**
* 小说推荐列表查询接口
*/
@Operation(summary = "小说推荐列表查询接口")
@GetMapping("rec_list")
public RestResp<List<BookInfoRespDto>> listRecBooks(
@Parameter(description = "小说ID") Long bookId) throws NoSuchAlgorithmException {
return bookService.listRecBooks(bookId);
}
/**
* 小说章节列表查询接口
*/
@Operation(summary = "小说章节列表查询接口")
@GetMapping("chapter/list")
public RestResp<List<BookChapterRespDto>> listChapters(
@Parameter(description = "小说ID") Long bookId) {
return bookService.listChapters(bookId);
}
/**
* 小说内容相关信息查询接口
*/
@Operation(summary = "小说内容相关信息查询接口")
@GetMapping("content/{chapterId}")
public RestResp<BookContentAboutRespDto> getBookContentAbout(
@Parameter(description = "章节ID") @PathVariable("chapterId") Long chapterId) {
return bookService.getBookContentAbout(chapterId);
}
/**
* 获取上一章节ID接口
*/
@Operation(summary = "获取上一章节ID接口")
@GetMapping("pre_chapter_id/{chapterId}")
public RestResp<Long> getPreChapterId(
@Parameter(description = "章节ID") @PathVariable("chapterId") Long chapterId) {
return bookService.getPreChapterId(chapterId);
}
/**
* 获取下一章节ID接口
*/
@Operation(summary = "获取下一章节ID接口")
@GetMapping("next_chapter_id/{chapterId}")
public RestResp<Long> getNextChapterId(
@Parameter(description = "章节ID") @PathVariable("chapterId") Long chapterId) {
return bookService.getNextChapterId(chapterId);
}
/**
* 小说点击榜查询接口
*/
@Operation(summary = "小说点击榜查询接口")
@GetMapping("visit_rank")
public RestResp<List<BookRankRespDto>> listVisitRankBooks() {
return bookService.listVisitRankBooks();
}
/**
* 小说新书榜查询接口
*/
@Operation(summary = "小说新书榜查询接口")
@GetMapping("newest_rank")
public RestResp<List<BookRankRespDto>> listNewestRankBooks() {
return bookService.listNewestRankBooks();
}
/**
* 小说更新榜查询接口
*/
@Operation(summary = "小说更新榜查询接口")
@GetMapping("update_rank")
public RestResp<List<BookRankRespDto>> listUpdateRankBooks() {
return bookService.listUpdateRankBooks();
}
/**
* 小说最新评论查询接口
*/
@Operation(summary = "小说最新评论查询接口")
@GetMapping("comment/newest_list")
public RestResp<BookCommentRespDto> listNewestComments(
@Parameter(description = "小说ID") Long bookId) {
return bookService.listNewestComments(bookId);
}
}

View File

@@ -0,0 +1,116 @@
package io.github.xxyopen.novel.book.controller.inner;
import io.github.xxyopen.novel.book.dto.req.*;
import io.github.xxyopen.novel.book.dto.resp.BookChapterRespDto;
import io.github.xxyopen.novel.book.dto.resp.BookEsRespDto;
import io.github.xxyopen.novel.book.dto.resp.BookInfoRespDto;
import io.github.xxyopen.novel.book.service.BookService;
import io.github.xxyopen.novel.common.constant.ApiRouterConsts;
import io.github.xxyopen.novel.common.resp.PageRespDto;
import io.github.xxyopen.novel.common.resp.RestResp;
import io.github.xxyopen.novel.user.dto.resp.UserInfoRespDto;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* 小说微服务内部调用接口
*
* @author xiongxiaoyang
* @date 2023/3/29
*/
@Tag(name = "InnerBookController", description = "内部调用-小说模块")
@RestController
@RequestMapping(ApiRouterConsts.API_INNER_BOOK_URL_PREFIX)
@RequiredArgsConstructor
public class InnerBookController {
private final BookService bookService;
/**
* 查询下一批保存到 ES 中的小说列表
*/
@Operation(summary = "查询下一批保存到 ES 中的小说列表")
@PostMapping("listNextEsBooks")
RestResp<List<BookEsRespDto>> listNextEsBooks(@Parameter(description = "已查询的最大小说ID") Long maxBookId) {
return bookService.listNextEsBooks(maxBookId);
}
/**
* 批量查询小说信息
*/
@Operation(summary = "批量查询小说信息")
@PostMapping("listBookInfoByIds")
RestResp<List<BookInfoRespDto>> listBookInfoByIds(@RequestBody List<Long> bookIds) {
return bookService.listBookInfoByIds(bookIds);
}
/**
* 发表评论接口
*/
@Operation(summary = "发表评论接口")
@PostMapping("publishComment")
public RestResp<Void> publishComment(@Valid @RequestBody BookCommentReqDto dto) {
return bookService.saveComment(dto);
}
/**
* 修改评论接口
*/
@Operation(summary = "修改评论接口")
@PostMapping("updateComment")
public RestResp<Void> updateComment(@Valid @RequestBody BookCommentReqDto dto) {
return bookService.updateComment(dto);
}
/**
* 删除评论接口
*/
@Operation(summary = "删除评论接口")
@PostMapping("deleteComment")
public RestResp<Void> deleteComment(@RequestBody BookCommentReqDto dto) {
return bookService.deleteComment(dto);
}
/**
* 小说发布接口
*/
@Operation(summary = "小说发布接口")
@PostMapping("publishBook")
public RestResp<Void> publishBook(@Valid @RequestBody BookAddReqDto dto) {
return bookService.saveBook(dto);
}
/**
* 小说发布列表查询接口
*/
@Operation(summary = "小说发布列表查询接口")
@PostMapping("listPublishBooks")
public RestResp<PageRespDto<BookInfoRespDto>> listPublishBooks(@RequestBody BookPageReqDto dto) {
return bookService.listAuthorBooks(dto);
}
/**
* 小说章节发布接口
*/
@Operation(summary = "小说章节发布接口")
@PostMapping("publishBookChapter")
public RestResp<Void> publishBookChapter(@Valid @RequestBody ChapterAddReqDto dto) {
return bookService.saveBookChapter(dto);
}
/**
* 小说章节发布列表查询接口
*/
@Operation(summary = "小说章节发布列表查询接口")
@PostMapping("listPublishBookChapters")
public RestResp<PageRespDto<BookChapterRespDto>> listPublishBookChapters(@RequestBody ChapterPageReqDto dto) {
return bookService.listBookChapters(dto);
}
}

View File

@@ -0,0 +1,111 @@
package io.github.xxyopen.novel.book.dao.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* <p>
* 小说类别
* </p>
*
* @author xiongxiaoyang
* @date 2022/05/12
*/
@TableName("book_category")
public class BookCategory implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 作品方向;0-男频 1-女频
*/
private Integer workDirection;
/**
* 类别名
*/
private String name;
/**
* 排序
*/
private Integer sort;
/**
* 创建时间
*/
private LocalDateTime createTime;
/**
* 更新时间
*/
private LocalDateTime updateTime;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Integer getWorkDirection() {
return workDirection;
}
public void setWorkDirection(Integer workDirection) {
this.workDirection = workDirection;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getSort() {
return sort;
}
public void setSort(Integer sort) {
this.sort = sort;
}
public LocalDateTime getCreateTime() {
return createTime;
}
public void setCreateTime(LocalDateTime createTime) {
this.createTime = createTime;
}
public LocalDateTime getUpdateTime() {
return updateTime;
}
public void setUpdateTime(LocalDateTime updateTime) {
this.updateTime = updateTime;
}
@Override
public String toString() {
return "BookCategory{" +
"id=" + id +
", workDirection=" + workDirection +
", name=" + name +
", sort=" + sort +
", createTime=" + createTime +
", updateTime=" + updateTime +
"}";
}
}

View File

@@ -0,0 +1,133 @@
package io.github.xxyopen.novel.book.dao.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* <p>
* 小说章节
* </p>
*
* @author xiongxiaoyang
* @date 2022/05/11
*/
@TableName("book_chapter")
public class BookChapter implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 小说ID
*/
private Long bookId;
/**
* 章节号
*/
private Integer chapterNum;
/**
* 章节名
*/
private String chapterName;
/**
* 章节字数
*/
private Integer wordCount;
/**
* 是否收费;1-收费 0-免费
*/
private Integer isVip;
private LocalDateTime createTime;
private LocalDateTime updateTime;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Long getBookId() {
return bookId;
}
public void setBookId(Long bookId) {
this.bookId = bookId;
}
public Integer getChapterNum() {
return chapterNum;
}
public void setChapterNum(Integer chapterNum) {
this.chapterNum = chapterNum;
}
public String getChapterName() {
return chapterName;
}
public void setChapterName(String chapterName) {
this.chapterName = chapterName;
}
public Integer getWordCount() {
return wordCount;
}
public void setWordCount(Integer wordCount) {
this.wordCount = wordCount;
}
public Integer getIsVip() {
return isVip;
}
public void setIsVip(Integer isVip) {
this.isVip = isVip;
}
public LocalDateTime getCreateTime() {
return createTime;
}
public void setCreateTime(LocalDateTime createTime) {
this.createTime = createTime;
}
public LocalDateTime getUpdateTime() {
return updateTime;
}
public void setUpdateTime(LocalDateTime updateTime) {
this.updateTime = updateTime;
}
@Override
public String toString() {
return "BookChapter{" +
"id=" + id +
", bookId=" + bookId +
", chapterNum=" + chapterNum +
", chapterName=" + chapterName +
", wordCount=" + wordCount +
", isVip=" + isVip +
", createTime=" + createTime +
", updateTime=" + updateTime +
"}";
}
}

View File

@@ -0,0 +1,142 @@
package io.github.xxyopen.novel.book.dao.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* <p>
* 小说评论
* </p>
*
* @author xiongxiaoyang
* @date 2022/05/11
*/
@TableName("book_comment")
public class BookComment implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 主键
*/
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 评论小说ID
*/
private Long bookId;
/**
* 评论用户ID
*/
private Long userId;
/**
* 评价内容
*/
private String commentContent;
/**
* 回复数量
*/
private Integer replyCount;
/**
* 审核状态;0-待审核 1-审核通过 2-审核不通过
*/
private Integer auditStatus;
/**
* 创建时间
*/
private LocalDateTime createTime;
/**
* 更新时间
*/
private LocalDateTime updateTime;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Long getBookId() {
return bookId;
}
public void setBookId(Long bookId) {
this.bookId = bookId;
}
public Long getUserId() {
return userId;
}
public void setUserId(Long userId) {
this.userId = userId;
}
public String getCommentContent() {
return commentContent;
}
public void setCommentContent(String commentContent) {
this.commentContent = commentContent;
}
public Integer getReplyCount() {
return replyCount;
}
public void setReplyCount(Integer replyCount) {
this.replyCount = replyCount;
}
public Integer getAuditStatus() {
return auditStatus;
}
public void setAuditStatus(Integer auditStatus) {
this.auditStatus = auditStatus;
}
public LocalDateTime getCreateTime() {
return createTime;
}
public void setCreateTime(LocalDateTime createTime) {
this.createTime = createTime;
}
public LocalDateTime getUpdateTime() {
return updateTime;
}
public void setUpdateTime(LocalDateTime updateTime) {
this.updateTime = updateTime;
}
@Override
public String toString() {
return "BookComment{" +
"id=" + id +
", bookId=" + bookId +
", userId=" + userId +
", commentContent=" + commentContent +
", replyCount=" + replyCount +
", auditStatus=" + auditStatus +
", createTime=" + createTime +
", updateTime=" + updateTime +
"}";
}
}

View File

@@ -0,0 +1,142 @@
package io.github.xxyopen.novel.book.dao.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* <p>
* 小说评论
* </p>
*
* @author xiongxiaoyang
* @date 2022/05/11
*/
@TableName("book_comment_copy1")
public class BookCommentCopy1 implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 主键
*/
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 评论小说ID
*/
private Long bookId;
/**
* 评论用户ID
*/
private Long userId;
/**
* 评价内容
*/
private String commentContent;
/**
* 回复数量
*/
private Integer replyCount;
/**
* 审核状态;0-待审核 1-审核通过 2-审核不通过
*/
private Integer auditStatus;
/**
* 创建时间
*/
private LocalDateTime createTime;
/**
* 更新时间
*/
private LocalDateTime updateTime;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Long getBookId() {
return bookId;
}
public void setBookId(Long bookId) {
this.bookId = bookId;
}
public Long getUserId() {
return userId;
}
public void setUserId(Long userId) {
this.userId = userId;
}
public String getCommentContent() {
return commentContent;
}
public void setCommentContent(String commentContent) {
this.commentContent = commentContent;
}
public Integer getReplyCount() {
return replyCount;
}
public void setReplyCount(Integer replyCount) {
this.replyCount = replyCount;
}
public Integer getAuditStatus() {
return auditStatus;
}
public void setAuditStatus(Integer auditStatus) {
this.auditStatus = auditStatus;
}
public LocalDateTime getCreateTime() {
return createTime;
}
public void setCreateTime(LocalDateTime createTime) {
this.createTime = createTime;
}
public LocalDateTime getUpdateTime() {
return updateTime;
}
public void setUpdateTime(LocalDateTime updateTime) {
this.updateTime = updateTime;
}
@Override
public String toString() {
return "BookCommentCopy1{" +
"id=" + id +
", bookId=" + bookId +
", userId=" + userId +
", commentContent=" + commentContent +
", replyCount=" + replyCount +
", auditStatus=" + auditStatus +
", createTime=" + createTime +
", updateTime=" + updateTime +
"}";
}
}

View File

@@ -0,0 +1,125 @@
package io.github.xxyopen.novel.book.dao.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* <p>
* 小说评论回复
* </p>
*
* @author xiongxiaoyang
* @date 2022/05/11
*/
@TableName("book_comment_reply")
public class BookCommentReply implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 主键
*/
private Long id;
/**
* 评论ID
*/
private Long commentId;
/**
* 回复用户ID
*/
private Long userId;
/**
* 回复内容
*/
private String replyContent;
/**
* 审核状态;0-待审核 1-审核通过 2-审核不通过
*/
private Integer auditStatus;
/**
* 创建时间
*/
private LocalDateTime createTime;
/**
* 更新时间
*/
private LocalDateTime updateTime;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Long getCommentId() {
return commentId;
}
public void setCommentId(Long commentId) {
this.commentId = commentId;
}
public Long getUserId() {
return userId;
}
public void setUserId(Long userId) {
this.userId = userId;
}
public String getReplyContent() {
return replyContent;
}
public void setReplyContent(String replyContent) {
this.replyContent = replyContent;
}
public Integer getAuditStatus() {
return auditStatus;
}
public void setAuditStatus(Integer auditStatus) {
this.auditStatus = auditStatus;
}
public LocalDateTime getCreateTime() {
return createTime;
}
public void setCreateTime(LocalDateTime createTime) {
this.createTime = createTime;
}
public LocalDateTime getUpdateTime() {
return updateTime;
}
public void setUpdateTime(LocalDateTime updateTime) {
this.updateTime = updateTime;
}
@Override
public String toString() {
return "BookCommentReply{" +
"id=" + id +
", commentId=" + commentId +
", userId=" + userId +
", replyContent=" + replyContent +
", auditStatus=" + auditStatus +
", createTime=" + createTime +
", updateTime=" + updateTime +
"}";
}
}

View File

@@ -0,0 +1,94 @@
package io.github.xxyopen.novel.book.dao.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* <p>
* 小说内容
* </p>
*
* @author xiongxiaoyang
* @date 2022/05/11
*/
@TableName("book_content")
public class BookContent implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 主键
*/
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 章节ID
*/
private Long chapterId;
/**
* 小说章节内容
*/
private String content;
private LocalDateTime createTime;
private LocalDateTime updateTime;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Long getChapterId() {
return chapterId;
}
public void setChapterId(Long chapterId) {
this.chapterId = chapterId;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public LocalDateTime getCreateTime() {
return createTime;
}
public void setCreateTime(LocalDateTime createTime) {
this.createTime = createTime;
}
public LocalDateTime getUpdateTime() {
return updateTime;
}
public void setUpdateTime(LocalDateTime updateTime) {
this.updateTime = updateTime;
}
@Override
public String toString() {
return "BookContent{" +
"id=" + id +
", chapterId=" + chapterId +
", content=" + content +
", createTime=" + createTime +
", updateTime=" + updateTime +
"}";
}
}

View File

@@ -0,0 +1,310 @@
package io.github.xxyopen.novel.book.dao.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* <p>
* 小说信息
* </p>
*
* @author xiongxiaoyang
* @date 2022/05/11
*/
@TableName("book_info")
public class BookInfo implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 主键
*/
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 作品方向;0-男频 1-女频
*/
private Integer workDirection;
/**
* 类别ID
*/
private Long categoryId;
/**
* 类别名
*/
private String categoryName;
/**
* 小说封面地址
*/
private String picUrl;
/**
* 小说名
*/
private String bookName;
/**
* 作家id
*/
private Long authorId;
/**
* 作家名
*/
private String authorName;
/**
* 书籍描述
*/
private String bookDesc;
/**
* 评分;总分:10 ,真实评分 = score/10
*/
private Integer score;
/**
* 书籍状态;0-连载中 1-已完结
*/
private Integer bookStatus;
/**
* 点击量
*/
private Long visitCount;
/**
* 总字数
*/
private Integer wordCount;
/**
* 评论数
*/
private Integer commentCount;
/**
* 最新章节ID
*/
private Long lastChapterId;
/**
* 最新章节名
*/
private String lastChapterName;
/**
* 最新章节更新时间
*/
private LocalDateTime lastChapterUpdateTime;
/**
* 是否收费;1-收费 0-免费
*/
private Integer isVip;
/**
* 创建时间
*/
private LocalDateTime createTime;
/**
* 更新时间
*/
private LocalDateTime updateTime;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Integer getWorkDirection() {
return workDirection;
}
public void setWorkDirection(Integer workDirection) {
this.workDirection = workDirection;
}
public Long getCategoryId() {
return categoryId;
}
public void setCategoryId(Long categoryId) {
this.categoryId = categoryId;
}
public String getCategoryName() {
return categoryName;
}
public void setCategoryName(String categoryName) {
this.categoryName = categoryName;
}
public String getPicUrl() {
return picUrl;
}
public void setPicUrl(String picUrl) {
this.picUrl = picUrl;
}
public String getBookName() {
return bookName;
}
public void setBookName(String bookName) {
this.bookName = bookName;
}
public Long getAuthorId() {
return authorId;
}
public void setAuthorId(Long authorId) {
this.authorId = authorId;
}
public String getAuthorName() {
return authorName;
}
public void setAuthorName(String authorName) {
this.authorName = authorName;
}
public String getBookDesc() {
return bookDesc;
}
public void setBookDesc(String bookDesc) {
this.bookDesc = bookDesc;
}
public Integer getScore() {
return score;
}
public void setScore(Integer score) {
this.score = score;
}
public Integer getBookStatus() {
return bookStatus;
}
public void setBookStatus(Integer bookStatus) {
this.bookStatus = bookStatus;
}
public Long getVisitCount() {
return visitCount;
}
public void setVisitCount(Long visitCount) {
this.visitCount = visitCount;
}
public Integer getWordCount() {
return wordCount;
}
public void setWordCount(Integer wordCount) {
this.wordCount = wordCount;
}
public Integer getCommentCount() {
return commentCount;
}
public void setCommentCount(Integer commentCount) {
this.commentCount = commentCount;
}
public Long getLastChapterId() {
return lastChapterId;
}
public void setLastChapterId(Long lastChapterId) {
this.lastChapterId = lastChapterId;
}
public String getLastChapterName() {
return lastChapterName;
}
public void setLastChapterName(String lastChapterName) {
this.lastChapterName = lastChapterName;
}
public LocalDateTime getLastChapterUpdateTime() {
return lastChapterUpdateTime;
}
public void setLastChapterUpdateTime(LocalDateTime lastChapterUpdateTime) {
this.lastChapterUpdateTime = lastChapterUpdateTime;
}
public Integer getIsVip() {
return isVip;
}
public void setIsVip(Integer isVip) {
this.isVip = isVip;
}
public LocalDateTime getCreateTime() {
return createTime;
}
public void setCreateTime(LocalDateTime createTime) {
this.createTime = createTime;
}
public LocalDateTime getUpdateTime() {
return updateTime;
}
public void setUpdateTime(LocalDateTime updateTime) {
this.updateTime = updateTime;
}
@Override
public String toString() {
return "BookInfo{" +
"id=" + id +
", workDirection=" + workDirection +
", categoryId=" + categoryId +
", categoryName=" + categoryName +
", picUrl=" + picUrl +
", bookName=" + bookName +
", authorId=" + authorId +
", authorName=" + authorName +
", bookDesc=" + bookDesc +
", score=" + score +
", bookStatus=" + bookStatus +
", visitCount=" + visitCount +
", wordCount=" + wordCount +
", commentCount=" + commentCount +
", lastChapterId=" + lastChapterId +
", lastChapterName=" + lastChapterName +
", lastChapterUpdateTime=" + lastChapterUpdateTime +
", isVip=" + isVip +
", createTime=" + createTime +
", updateTime=" + updateTime +
"}";
}
}

View File

@@ -0,0 +1,16 @@
package io.github.xxyopen.novel.book.dao.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import io.github.xxyopen.novel.book.dao.entity.BookCategory;
/**
* <p>
* 小说类别 Mapper 接口
* </p>
*
* @author xiongxiaoyang
* @date 2022/05/12
*/
public interface BookCategoryMapper extends BaseMapper<BookCategory> {
}

View File

@@ -0,0 +1,17 @@
package io.github.xxyopen.novel.book.dao.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import io.github.xxyopen.novel.book.dao.entity.BookChapter;
/**
* <p>
* 小说章节 Mapper 接口
* </p>
*
* @author xiongxiaoyang
* @date 2022/05/11
*/
public interface BookChapterMapper extends BaseMapper<BookChapter> {
}

View File

@@ -0,0 +1,16 @@
package io.github.xxyopen.novel.book.dao.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import io.github.xxyopen.novel.book.dao.entity.BookCommentCopy1;
/**
* <p>
* 小说评论 Mapper 接口
* </p>
*
* @author xiongxiaoyang
* @date 2022/05/11
*/
public interface BookCommentCopy1Mapper extends BaseMapper<BookCommentCopy1> {
}

View File

@@ -0,0 +1,16 @@
package io.github.xxyopen.novel.book.dao.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import io.github.xxyopen.novel.book.dao.entity.BookComment;
/**
* <p>
* 小说评论 Mapper 接口
* </p>
*
* @author xiongxiaoyang
* @date 2022/05/11
*/
public interface BookCommentMapper extends BaseMapper<BookComment> {
}

View File

@@ -0,0 +1,16 @@
package io.github.xxyopen.novel.book.dao.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import io.github.xxyopen.novel.book.dao.entity.BookCommentReply;
/**
* <p>
* 小说评论回复 Mapper 接口
* </p>
*
* @author xiongxiaoyang
* @date 2022/05/11
*/
public interface BookCommentReplyMapper extends BaseMapper<BookCommentReply> {
}

View File

@@ -0,0 +1,16 @@
package io.github.xxyopen.novel.book.dao.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import io.github.xxyopen.novel.book.dao.entity.BookContent;
/**
* <p>
* 小说内容 Mapper 接口
* </p>
*
* @author xiongxiaoyang
* @date 2022/05/11
*/
public interface BookContentMapper extends BaseMapper<BookContent> {
}

View File

@@ -0,0 +1,37 @@
package io.github.xxyopen.novel.book.dao.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import io.github.xxyopen.novel.book.dao.entity.BookInfo;
import io.github.xxyopen.novel.book.dto.req.BookSearchReqDto;
import io.github.xxyopen.novel.book.dto.resp.BookInfoRespDto;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* <p>
* 小说信息 Mapper 接口
* </p>
*
* @author xiongxiaoyang
* @date 2022/05/11
*/
public interface BookInfoMapper extends BaseMapper<BookInfo> {
/**
* 增加小说点击量
*
* @param bookId 小说ID
*/
void addVisitCount(@Param("bookId") Long bookId);
/**
* 小说搜索
* @param page mybatis-plus 分页对象
* @param condition 搜索条件
* @return 返回结果
* */
List<BookInfo> searchBooks(IPage<BookInfoRespDto> page, BookSearchReqDto condition);
}

View File

@@ -0,0 +1,42 @@
package io.github.xxyopen.novel.book.manager.cache;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import io.github.xxyopen.novel.book.dao.entity.BookCategory;
import io.github.xxyopen.novel.book.dao.mapper.BookCategoryMapper;
import io.github.xxyopen.novel.book.dto.resp.BookCategoryRespDto;
import io.github.xxyopen.novel.common.constant.CacheConsts;
import io.github.xxyopen.novel.common.constant.DatabaseConsts;
import lombok.RequiredArgsConstructor;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Component;
import java.util.List;
/**
* 小说分类 缓存管理类
*
* @author xiongxiaoyang
* @date 2022/5/12
*/
@Component
@RequiredArgsConstructor
public class BookCategoryCacheManager {
private final BookCategoryMapper bookCategoryMapper;
/**
* 根据作品方向查询小说分类列表,并放入缓存中
*/
@Cacheable(cacheManager = CacheConsts.CAFFEINE_CACHE_MANAGER,
value = CacheConsts.BOOK_CATEGORY_LIST_CACHE_NAME)
public List<BookCategoryRespDto> listCategory(Integer workDirection) {
QueryWrapper<BookCategory> queryWrapper = new QueryWrapper<>();
queryWrapper.eq(DatabaseConsts.BookCategoryTable.COLUMN_WORK_DIRECTION, workDirection);
return bookCategoryMapper.selectList(queryWrapper).stream().map(v ->
BookCategoryRespDto.builder()
.id(v.getId())
.name(v.getName())
.build()).toList();
}
}

View File

@@ -0,0 +1,41 @@
package io.github.xxyopen.novel.book.manager.cache;
import io.github.xxyopen.novel.book.dao.entity.BookChapter;
import io.github.xxyopen.novel.book.dao.mapper.BookChapterMapper;
import io.github.xxyopen.novel.book.dto.resp.BookChapterRespDto;
import io.github.xxyopen.novel.common.constant.CacheConsts;
import lombok.RequiredArgsConstructor;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Component;
/**
* 小说章节 缓存管理类
*
* @author xiongxiaoyang
* @date 2022/5/12
*/
@Component
@RequiredArgsConstructor
public class BookChapterCacheManager {
private final BookChapterMapper bookChapterMapper;
/**
* 查询小说章节信息,并放入缓存中
*/
@Cacheable(cacheManager = CacheConsts.CAFFEINE_CACHE_MANAGER,
value = CacheConsts.BOOK_CHAPTER_CACHE_NAME)
public BookChapterRespDto getChapter(Long chapterId) {
BookChapter bookChapter = bookChapterMapper.selectById(chapterId);
return BookChapterRespDto.builder()
.id(chapterId)
.bookId(bookChapter.getBookId())
.chapterNum(bookChapter.getChapterNum())
.chapterName(bookChapter.getChapterName())
.chapterWordCount(bookChapter.getWordCount())
.chapterUpdateTime(bookChapter.getUpdateTime())
.build();
}
}

View File

@@ -0,0 +1,38 @@
package io.github.xxyopen.novel.book.manager.cache;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import io.github.xxyopen.novel.book.dao.entity.BookContent;
import io.github.xxyopen.novel.book.dao.mapper.BookContentMapper;
import io.github.xxyopen.novel.common.constant.CacheConsts;
import io.github.xxyopen.novel.common.constant.DatabaseConsts;
import lombok.RequiredArgsConstructor;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Component;
/**
* 小说内容 缓存管理类
*
* @author xiongxiaoyang
* @date 2022/5/12
*/
@Component
@RequiredArgsConstructor
public class BookContentCacheManager {
private final BookContentMapper bookContentMapper;
/**
* 查询小说内容,并放入缓存中
*/
@Cacheable(cacheManager = CacheConsts.REDIS_CACHE_MANAGER,
value = CacheConsts.BOOK_CONTENT_CACHE_NAME)
public String getBookContent(Long chapterId) {
QueryWrapper<BookContent> contentQueryWrapper = new QueryWrapper<>();
contentQueryWrapper.eq(DatabaseConsts.BookContentTable.COLUMN_CHAPTER_ID, chapterId)
.last(DatabaseConsts.SqlEnum.LIMIT_1.getSql());
BookContent bookContent = bookContentMapper.selectOne(contentQueryWrapper);
return bookContent.getContent();
}
}

View File

@@ -0,0 +1,96 @@
package io.github.xxyopen.novel.book.manager.cache;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import io.github.xxyopen.novel.book.dao.entity.BookChapter;
import io.github.xxyopen.novel.book.dao.entity.BookInfo;
import io.github.xxyopen.novel.book.dao.mapper.BookChapterMapper;
import io.github.xxyopen.novel.book.dao.mapper.BookInfoMapper;
import io.github.xxyopen.novel.book.dto.resp.BookInfoRespDto;
import io.github.xxyopen.novel.common.constant.CacheConsts;
import io.github.xxyopen.novel.common.constant.DatabaseConsts;
import lombok.RequiredArgsConstructor;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Component;
import java.util.List;
/**
* 小说信息 缓存管理类
*
* @author xiongxiaoyang
* @date 2022/5/12
*/
@Component
@RequiredArgsConstructor
public class BookInfoCacheManager {
private final BookInfoMapper bookInfoMapper;
private final BookChapterMapper bookChapterMapper;
/**
* 从缓存中查询小说信息(先判断缓存中是否已存在,存在则直接从缓存中取,否则执行方法体中的逻辑后缓存结果)
*/
@Cacheable(cacheManager = CacheConsts.CAFFEINE_CACHE_MANAGER,
value = CacheConsts.BOOK_INFO_CACHE_NAME)
public BookInfoRespDto getBookInfo(Long id) {
return cachePutBookInfo(id);
}
/**
* 缓存小说信息(不管缓存中是否存在都执行方法体中的逻辑,然后缓存起来)
*/
@CachePut(cacheManager = CacheConsts.CAFFEINE_CACHE_MANAGER,
value = CacheConsts.BOOK_INFO_CACHE_NAME)
public BookInfoRespDto cachePutBookInfo(Long id) {
// 查询基础信息
BookInfo bookInfo = bookInfoMapper.selectById(id);
// 查询首章ID
QueryWrapper<BookChapter> queryWrapper = new QueryWrapper<>();
queryWrapper
.eq(DatabaseConsts.BookChapterTable.COLUMN_BOOK_ID, id)
.orderByAsc(DatabaseConsts.BookChapterTable.COLUMN_CHAPTER_NUM)
.last(DatabaseConsts.SqlEnum.LIMIT_1.getSql());
BookChapter firstBookChapter = bookChapterMapper.selectOne(queryWrapper);
// 组装响应对象
return BookInfoRespDto.builder()
.id(bookInfo.getId())
.bookName(bookInfo.getBookName())
.bookDesc(bookInfo.getBookDesc())
.bookStatus(bookInfo.getBookStatus())
.authorId(bookInfo.getAuthorId())
.authorName(bookInfo.getAuthorName())
.categoryId(bookInfo.getCategoryId())
.categoryName(bookInfo.getCategoryName())
.commentCount(bookInfo.getCommentCount())
.firstChapterId(firstBookChapter.getId())
.lastChapterId(bookInfo.getLastChapterId())
.picUrl(bookInfo.getPicUrl())
.visitCount(bookInfo.getVisitCount())
.wordCount(bookInfo.getWordCount())
.build();
}
@CacheEvict(cacheManager = CacheConsts.CAFFEINE_CACHE_MANAGER,
value = CacheConsts.BOOK_INFO_CACHE_NAME)
public void evictBookInfoCache(Long ignoredId) {
// 调用此方法自动清除小说信息的缓存
}
/**
* 查询每个类别下最新更新的 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(DatabaseConsts.BookTable.COLUMN_CATEGORY_ID, categoryId)
.gt(DatabaseConsts.BookTable.COLUMN_WORD_COUNT, 0)
.orderByDesc(DatabaseConsts.BookTable.COLUMN_LAST_CHAPTER_UPDATE_TIME)
.last(DatabaseConsts.SqlEnum.LIMIT_500.getSql());
return bookInfoMapper.selectList(queryWrapper).stream().map(BookInfo::getId).toList();
}
}

View File

@@ -0,0 +1,84 @@
package io.github.xxyopen.novel.book.manager.cache;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import io.github.xxyopen.novel.book.dao.entity.BookInfo;
import io.github.xxyopen.novel.book.dao.mapper.BookInfoMapper;
import io.github.xxyopen.novel.book.dto.resp.BookRankRespDto;
import io.github.xxyopen.novel.common.constant.CacheConsts;
import io.github.xxyopen.novel.common.constant.DatabaseConsts;
import lombok.RequiredArgsConstructor;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Component;
import java.util.List;
/**
* 小说排行榜 缓存管理类
*
* @author xiongxiaoyang
* @date 2022/5/12
*/
@Component
@RequiredArgsConstructor
public class BookRankCacheManager {
private final BookInfoMapper bookInfoMapper;
/**
* 查询小说点击榜列表,并放入缓存中
*/
@Cacheable(cacheManager = CacheConsts.REDIS_CACHE_MANAGER,
value = CacheConsts.BOOK_VISIT_RANK_CACHE_NAME)
public List<BookRankRespDto> listVisitRankBooks() {
QueryWrapper<BookInfo> bookInfoQueryWrapper = new QueryWrapper<>();
bookInfoQueryWrapper.orderByDesc(DatabaseConsts.BookTable.COLUMN_VISIT_COUNT);
return listRankBooks(bookInfoQueryWrapper);
}
/**
* 查询小说新书榜列表,并放入缓存中
*/
@Cacheable(cacheManager = CacheConsts.CAFFEINE_CACHE_MANAGER,
value = CacheConsts.BOOK_NEWEST_RANK_CACHE_NAME)
public List<BookRankRespDto> listNewestRankBooks() {
QueryWrapper<BookInfo> bookInfoQueryWrapper = new QueryWrapper<>();
bookInfoQueryWrapper
.gt(DatabaseConsts.BookTable.COLUMN_WORD_COUNT, 0)
.orderByDesc(DatabaseConsts.CommonColumnEnum.CREATE_TIME.getName());
return listRankBooks(bookInfoQueryWrapper);
}
/**
* 查询小说更新榜列表,并放入缓存中
*/
@Cacheable(cacheManager = CacheConsts.CAFFEINE_CACHE_MANAGER,
value = CacheConsts.BOOK_UPDATE_RANK_CACHE_NAME)
public List<BookRankRespDto> listUpdateRankBooks() {
QueryWrapper<BookInfo> bookInfoQueryWrapper = new QueryWrapper<>();
bookInfoQueryWrapper
.gt(DatabaseConsts.BookTable.COLUMN_WORD_COUNT, 0)
.orderByDesc(DatabaseConsts.CommonColumnEnum.UPDATE_TIME.getName());
return listRankBooks(bookInfoQueryWrapper);
}
private List<BookRankRespDto> listRankBooks(QueryWrapper<BookInfo> bookInfoQueryWrapper) {
bookInfoQueryWrapper
.gt(DatabaseConsts.BookTable.COLUMN_WORD_COUNT, 0)
.last(DatabaseConsts.SqlEnum.LIMIT_30.getSql());
return bookInfoMapper.selectList(bookInfoQueryWrapper).stream().map(v -> {
BookRankRespDto respDto = new BookRankRespDto();
respDto.setId(v.getId());
respDto.setCategoryId(v.getCategoryId());
respDto.setCategoryName(v.getCategoryName());
respDto.setBookName(v.getBookName());
respDto.setAuthorName(v.getAuthorName());
respDto.setPicUrl(v.getPicUrl());
respDto.setBookDesc(v.getBookDesc());
respDto.setLastChapterName(v.getLastChapterName());
respDto.setLastChapterUpdateTime(v.getLastChapterUpdateTime());
respDto.setWordCount(v.getWordCount());
return respDto;
}).toList();
}
}

View File

@@ -0,0 +1,36 @@
package io.github.xxyopen.novel.book.manager.feign;
import io.github.xxyopen.novel.common.constant.ErrorCodeEnum;
import io.github.xxyopen.novel.common.resp.RestResp;
import io.github.xxyopen.novel.user.dto.resp.UserInfoRespDto;
import io.github.xxyopen.novel.user.feign.UserFeign;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
/**
* 用户微服务调用 Feign 客户端管理
*
* @author xiongxiaoyang
* @date 2023/3/29
*/
@Component
@AllArgsConstructor
public class UserFeignManager {
private final UserFeign userFeign;
public List<UserInfoRespDto> listUserInfoByIds(List<Long> userIds) {
RestResp<List<UserInfoRespDto>> resp = userFeign.listUserInfoByIds(userIds);
if (Objects.equals(ErrorCodeEnum.OK.getCode(), resp.getCode())) {
return resp.getData();
}
return new ArrayList<>(0);
}
}

View File

@@ -0,0 +1,51 @@
package io.github.xxyopen.novel.book.manager.mq;
import io.github.xxyopen.novel.common.constant.AmqpConsts;
import lombok.RequiredArgsConstructor;
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.transaction.support.TransactionSynchronization;
import org.springframework.transaction.support.TransactionSynchronizationManager;
/**
* AMQP 消息管理类
*
* @author xiongxiaoyang
* @date 2022/5/25
*/
@Component
@RequiredArgsConstructor
public class AmqpMsgManager {
private final AmqpTemplate amqpTemplate;
@Value("${spring.amqp.enabled:false}")
private boolean amqpEnabled;
/**
* 发送小说信息改变消息
*/
public void sendBookChangeMsg(Long bookId) {
if (amqpEnabled) {
sendAmqpMessage(amqpTemplate, AmqpConsts.BookChangeMq.EXCHANGE_NAME, null, bookId);
}
}
private void sendAmqpMessage(AmqpTemplate amqpTemplate, String exchange, String routingKey,
Object message) {
// 如果在事务中则在事务执行完成后再发送,否则可以直接发送
if (TransactionSynchronizationManager.isActualTransactionActive()) {
TransactionSynchronizationManager.registerSynchronization(
new TransactionSynchronization() {
@Override
public void afterCommit() {
amqpTemplate.convertAndSend(exchange, routingKey, message);
}
});
return;
}
amqpTemplate.convertAndSend(exchange, routingKey, message);
}
}

View File

@@ -0,0 +1,192 @@
package io.github.xxyopen.novel.book.service;
import io.github.xxyopen.novel.book.dto.req.*;
import io.github.xxyopen.novel.book.dto.resp.*;
import io.github.xxyopen.novel.common.resp.PageRespDto;
import io.github.xxyopen.novel.common.resp.RestResp;
import java.security.NoSuchAlgorithmException;
import java.util.List;
/**
* 小说模块 服务类
*
* @author xiongxiaoyang
* @date 2022/5/14
*/
public interface BookService {
/**
* 小说点击榜查询
*
* @return 小说点击排行列表
*/
RestResp<List<BookRankRespDto>> listVisitRankBooks();
/**
* 小说新书榜查询
*
* @return 小说新书排行列表
*/
RestResp<List<BookRankRespDto>> listNewestRankBooks();
/**
* 小说更新榜查询
*
* @return 小说更新排行列表
*/
RestResp<List<BookRankRespDto>> listUpdateRankBooks();
/**
* 小说信息查询
*
* @param bookId 小说ID
* @return 小说信息
*/
RestResp<BookInfoRespDto> getBookById(Long bookId);
/**
* 小说内容相关信息查询
*
* @param chapterId 章节ID
* @return 内容相关联的信息
*/
RestResp<BookContentAboutRespDto> getBookContentAbout(Long chapterId);
/**
* 小说最新章节相关信息查询
*
* @param bookId 小说ID
* @return 章节相关联的信息
*/
RestResp<BookChapterAboutRespDto> getLastChapterAbout(Long bookId);
/**
* 小说推荐列表查询
*
* @param bookId 小说ID
* @return 小说信息列表
*/
RestResp<List<BookInfoRespDto>> listRecBooks(Long bookId) throws NoSuchAlgorithmException;
/**
* 增加小说点击量
*
* @param bookId 小说ID
* @return 成功状态
*/
RestResp<Void> addVisitCount(Long bookId);
/**
* 获取上一章节ID
*
* @param chapterId 章节ID
* @return 上一章节ID
*/
RestResp<Long> getPreChapterId(Long chapterId);
/**
* 获取下一章节ID
*
* @param chapterId 章节ID
* @return 下一章节ID
*/
RestResp<Long> getNextChapterId(Long chapterId);
/**
* 小说章节列表查询
*
* @param bookId 小说ID
* @return 小说章节列表
*/
RestResp<List<BookChapterRespDto>> listChapters(Long bookId);
/**
* 小说分类列表查询
*
* @param workDirection 作品方向;0-男频 1-女频
* @return 分类列表
*/
RestResp<List<BookCategoryRespDto>> listCategory(Integer workDirection);
/**
* 发表评论
*
* @param dto 评论相关 DTO
* @return void
*/
RestResp<Void> saveComment(BookCommentReqDto dto);
/**
* 小说最新评论查询
*
* @param bookId 小说ID
* @return 小说最新评论数据
*/
RestResp<BookCommentRespDto> listNewestComments(Long bookId);
/**
* 删除评论
*
* @param dto 评论相关 DTO
* @return void
*/
RestResp<Void> deleteComment(BookCommentReqDto dto);
/**
* 修改评论
*
* @param dto 评论相关 DTO
* @return void
*/
RestResp<Void> updateComment(BookCommentReqDto dto);
/**
* 小说信息保存
*
* @param dto 小说信息
* @return void
*/
RestResp<Void> saveBook(BookAddReqDto dto);
/**
* 小说章节信息保存
*
* @param dto 章节信息
* @return void
*/
RestResp<Void> saveBookChapter(ChapterAddReqDto dto);
/**
* 查询作家发布小说列表
*
* @param dto 分页请求参数
* @return 小说分页列表数据
*/
RestResp<PageRespDto<BookInfoRespDto>> listAuthorBooks(BookPageReqDto dto);
/**
* 查询小说发布章节列表
*
* @param dto 分页请求参数
* @return 章节分页列表数据
*/
RestResp<PageRespDto<BookChapterRespDto>> listBookChapters(ChapterPageReqDto dto);
/**
* 查询下一批保存到 ES 中的小说列表
*
* @param maxBookId 已查询的最大小说ID
* @return 小说列表
*/
RestResp<List<BookEsRespDto>> listNextEsBooks(Long maxBookId);
/**
* 批量查询小说信息
*
* @param bookIds 小说ID列表
* @return 小说信息列表
*/
RestResp<List<BookInfoRespDto>> listBookInfoByIds(List<Long> bookIds);
}

View File

@@ -0,0 +1,472 @@
package io.github.xxyopen.novel.book.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.github.xxyopen.novel.book.dao.entity.BookChapter;
import io.github.xxyopen.novel.book.dao.entity.BookComment;
import io.github.xxyopen.novel.book.dao.entity.BookContent;
import io.github.xxyopen.novel.book.dao.entity.BookInfo;
import io.github.xxyopen.novel.book.dao.mapper.BookChapterMapper;
import io.github.xxyopen.novel.book.dao.mapper.BookCommentMapper;
import io.github.xxyopen.novel.book.dao.mapper.BookContentMapper;
import io.github.xxyopen.novel.book.dao.mapper.BookInfoMapper;
import io.github.xxyopen.novel.book.dto.req.*;
import io.github.xxyopen.novel.book.dto.resp.*;
import io.github.xxyopen.novel.book.manager.cache.*;
import io.github.xxyopen.novel.book.manager.feign.UserFeignManager;
import io.github.xxyopen.novel.book.manager.mq.AmqpMsgManager;
import io.github.xxyopen.novel.book.service.BookService;
import io.github.xxyopen.novel.common.auth.UserHolder;
import io.github.xxyopen.novel.common.constant.DatabaseConsts;
import io.github.xxyopen.novel.common.constant.ErrorCodeEnum;
import io.github.xxyopen.novel.common.resp.PageRespDto;
import io.github.xxyopen.novel.common.resp.RestResp;
import io.github.xxyopen.novel.config.annotation.Key;
import io.github.xxyopen.novel.config.annotation.Lock;
import io.github.xxyopen.novel.user.dto.resp.UserInfoRespDto;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
* 小说模块 服务实现类
*
* @author xiongxiaoyang
* @date 2022/5/14
*/
@Service
@RequiredArgsConstructor
@Slf4j
public class BookServiceImpl implements BookService {
private final BookCategoryCacheManager bookCategoryCacheManager;
private final BookRankCacheManager bookRankCacheManager;
private final BookInfoCacheManager bookInfoCacheManager;
private final BookChapterCacheManager bookChapterCacheManager;
private final BookContentCacheManager bookContentCacheManager;
private final BookInfoMapper bookInfoMapper;
private final BookChapterMapper bookChapterMapper;
private final BookContentMapper bookContentMapper;
private final BookCommentMapper bookCommentMapper;
private final AmqpMsgManager amqpMsgManager;
private final UserFeignManager userFeignManager;
private static final Integer REC_BOOK_COUNT = 4;
@Override
public RestResp<List<BookRankRespDto>> listVisitRankBooks() {
return RestResp.ok(bookRankCacheManager.listVisitRankBooks());
}
@Override
public RestResp<List<BookRankRespDto>> listNewestRankBooks() {
return RestResp.ok(bookRankCacheManager.listNewestRankBooks());
}
@Override
public RestResp<List<BookRankRespDto>> listUpdateRankBooks() {
return RestResp.ok(bookRankCacheManager.listUpdateRankBooks());
}
@Override
public RestResp<BookInfoRespDto> getBookById(Long bookId) {
return RestResp.ok(bookInfoCacheManager.getBookInfo(bookId));
}
@Override
public RestResp<BookChapterAboutRespDto> getLastChapterAbout(Long bookId) {
// 查询小说信息
BookInfoRespDto bookInfo = bookInfoCacheManager.getBookInfo(bookId);
// 查询最新章节信息
BookChapterRespDto bookChapter = bookChapterCacheManager.getChapter(
bookInfo.getLastChapterId());
// 查询章节内容
String content = bookContentCacheManager.getBookContent(bookInfo.getLastChapterId());
// 查询章节总数
QueryWrapper<BookChapter> chapterQueryWrapper = new QueryWrapper<>();
chapterQueryWrapper.eq(DatabaseConsts.BookChapterTable.COLUMN_BOOK_ID, bookId);
Long chapterTotal = bookChapterMapper.selectCount(chapterQueryWrapper);
// 组装数据并返回
return RestResp.ok(BookChapterAboutRespDto.builder()
.chapterInfo(bookChapter)
.chapterTotal(chapterTotal)
.contentSummary(content.substring(0, 30))
.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
public RestResp<Void> addVisitCount(Long bookId) {
bookInfoMapper.addVisitCount(bookId);
return RestResp.ok();
}
@Override
public RestResp<Long> getPreChapterId(Long chapterId) {
// 查询小说ID 和 章节号
BookChapterRespDto chapter = bookChapterCacheManager.getChapter(chapterId);
Long bookId = chapter.getBookId();
Integer chapterNum = chapter.getChapterNum();
// 查询上一章信息并返回章节ID
QueryWrapper<BookChapter> queryWrapper = new QueryWrapper<>();
queryWrapper.eq(DatabaseConsts.BookChapterTable.COLUMN_BOOK_ID, bookId)
.lt(DatabaseConsts.BookChapterTable.COLUMN_CHAPTER_NUM, chapterNum)
.orderByDesc(DatabaseConsts.BookChapterTable.COLUMN_CHAPTER_NUM)
.last(DatabaseConsts.SqlEnum.LIMIT_1.getSql());
return RestResp.ok(
Optional.ofNullable(bookChapterMapper.selectOne(queryWrapper))
.map(BookChapter::getId)
.orElse(null)
);
}
@Override
public RestResp<Long> getNextChapterId(Long chapterId) {
// 查询小说ID 和 章节号
BookChapterRespDto chapter = bookChapterCacheManager.getChapter(chapterId);
Long bookId = chapter.getBookId();
Integer chapterNum = chapter.getChapterNum();
// 查询下一章信息并返回章节ID
QueryWrapper<BookChapter> queryWrapper = new QueryWrapper<>();
queryWrapper.eq(DatabaseConsts.BookChapterTable.COLUMN_BOOK_ID, bookId)
.gt(DatabaseConsts.BookChapterTable.COLUMN_CHAPTER_NUM, chapterNum)
.orderByAsc(DatabaseConsts.BookChapterTable.COLUMN_CHAPTER_NUM)
.last(DatabaseConsts.SqlEnum.LIMIT_1.getSql());
return RestResp.ok(
Optional.ofNullable(bookChapterMapper.selectOne(queryWrapper))
.map(BookChapter::getId)
.orElse(null)
);
}
@Override
public RestResp<List<BookChapterRespDto>> listChapters(Long bookId) {
QueryWrapper<BookChapter> queryWrapper = new QueryWrapper<>();
queryWrapper.eq(DatabaseConsts.BookChapterTable.COLUMN_BOOK_ID, bookId)
.orderByAsc(DatabaseConsts.BookChapterTable.COLUMN_CHAPTER_NUM);
return RestResp.ok(bookChapterMapper.selectList(queryWrapper).stream()
.map(v -> BookChapterRespDto.builder()
.id(v.getId())
.chapterName(v.getChapterName())
.isVip(v.getIsVip())
.build()).toList());
}
@Override
public RestResp<List<BookCategoryRespDto>> listCategory(Integer workDirection) {
return RestResp.ok(bookCategoryCacheManager.listCategory(workDirection));
}
@Lock(prefix = "userComment")
@Override
public RestResp<Void> saveComment(
@Key(expr = "#{userId + '::' + bookId}") BookCommentReqDto dto) {
// 校验用户是否已发表评论
QueryWrapper<BookComment> queryWrapper = new QueryWrapper<>();
queryWrapper.eq(DatabaseConsts.BookCommentTable.COLUMN_USER_ID, dto.getUserId())
.eq(DatabaseConsts.BookCommentTable.COLUMN_BOOK_ID, dto.getBookId());
if (bookCommentMapper.selectCount(queryWrapper) > 0) {
// 用户已发表评论
return RestResp.fail(ErrorCodeEnum.USER_COMMENTED);
}
BookComment bookComment = new BookComment();
bookComment.setBookId(dto.getBookId());
bookComment.setUserId(dto.getUserId());
bookComment.setCommentContent(dto.getCommentContent());
bookComment.setCreateTime(LocalDateTime.now());
bookComment.setUpdateTime(LocalDateTime.now());
bookCommentMapper.insert(bookComment);
return RestResp.ok();
}
@Override
public RestResp<BookCommentRespDto> listNewestComments(Long bookId) {
// 查询评论总数
QueryWrapper<BookComment> 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<BookComment> commentQueryWrapper = new QueryWrapper<>();
commentQueryWrapper.eq(DatabaseConsts.BookCommentTable.COLUMN_BOOK_ID, bookId)
.orderByDesc(DatabaseConsts.CommonColumnEnum.CREATE_TIME.getName())
.last(DatabaseConsts.SqlEnum.LIMIT_5.getSql());
List<BookComment> bookComments = bookCommentMapper.selectList(commentQueryWrapper);
// 查询评论用户信息,并设置需要返回的评论用户名
List<Long> userIds = bookComments.stream().map(BookComment::getUserId).toList();
List<UserInfoRespDto> userInfos = userFeignManager.listUserInfoByIds(userIds);
Map<Long, UserInfoRespDto> userInfoMap = userInfos.stream()
.collect(Collectors.toMap(UserInfoRespDto::getId, Function.identity()));
List<BookCommentRespDto.CommentInfo> commentInfos = bookComments.stream()
.map(v -> BookCommentRespDto.CommentInfo.builder()
.id(v.getId())
.commentUserId(v.getUserId())
.commentUser(userInfoMap.get(v.getUserId()).getUsername())
.commentUserPhoto(userInfoMap.get(v.getUserId()).getUserPhoto())
.commentContent(v.getCommentContent())
.commentTime(v.getCreateTime()).build()).toList();
bookCommentRespDto.setComments(commentInfos);
} else {
bookCommentRespDto.setComments(Collections.emptyList());
}
return RestResp.ok(bookCommentRespDto);
}
@Override
public RestResp<Void> deleteComment(BookCommentReqDto dto) {
QueryWrapper<BookComment> queryWrapper = new QueryWrapper<>();
queryWrapper.eq(DatabaseConsts.CommonColumnEnum.ID.getName(), dto.getCommentId())
.eq(DatabaseConsts.BookCommentTable.COLUMN_USER_ID, dto.getUserId());
bookCommentMapper.delete(queryWrapper);
return RestResp.ok();
}
@Override
public RestResp<Void> updateComment(BookCommentReqDto dto) {
QueryWrapper<BookComment> queryWrapper = new QueryWrapper<>();
queryWrapper.eq(DatabaseConsts.CommonColumnEnum.ID.getName(), dto.getCommentId())
.eq(DatabaseConsts.BookCommentTable.COLUMN_USER_ID, dto.getUserId());
BookComment bookComment = new BookComment();
bookComment.setCommentContent(dto.getCommentContent());
bookCommentMapper.update(bookComment, queryWrapper);
return RestResp.ok();
}
@Override
public RestResp<Void> saveBook(BookAddReqDto dto) {
// 校验小说名是否已存在
QueryWrapper<BookInfo> queryWrapper = new QueryWrapper<>();
queryWrapper.eq(DatabaseConsts.BookTable.COLUMN_BOOK_NAME, dto.getBookName());
if (bookInfoMapper.selectCount(queryWrapper) > 0) {
return RestResp.fail(ErrorCodeEnum.AUTHOR_BOOK_NAME_EXIST);
}
BookInfo bookInfo = new BookInfo();
// 设置作家信息
bookInfo.setAuthorId(dto.getAuthorId());
bookInfo.setAuthorName(dto.getPenName());
// 设置其他信息
bookInfo.setWorkDirection(dto.getWorkDirection());
bookInfo.setCategoryId(dto.getCategoryId());
bookInfo.setCategoryName(dto.getCategoryName());
bookInfo.setBookName(dto.getBookName());
bookInfo.setPicUrl(dto.getPicUrl());
bookInfo.setBookDesc(dto.getBookDesc());
bookInfo.setIsVip(dto.getIsVip());
bookInfo.setScore(0);
bookInfo.setCreateTime(LocalDateTime.now());
bookInfo.setUpdateTime(LocalDateTime.now());
// 保存小说信息
bookInfoMapper.insert(bookInfo);
return RestResp.ok();
}
@Transactional(rollbackFor = Exception.class)
@Override
public RestResp<Void> saveBookChapter(ChapterAddReqDto dto) {
// 校验该作品是否属于当前作家
BookInfo bookInfo = bookInfoMapper.selectById(dto.getBookId());
if (!Objects.equals(bookInfo.getAuthorId(), dto.getAuthorId())) {
return RestResp.fail(ErrorCodeEnum.USER_UN_AUTH);
}
// 1) 保存章节相关信息到小说章节表
// a) 查询最新章节号
int chapterNum = 0;
QueryWrapper<BookChapter> chapterQueryWrapper = new QueryWrapper<>();
chapterQueryWrapper.eq(DatabaseConsts.BookChapterTable.COLUMN_BOOK_ID, dto.getBookId())
.orderByDesc(DatabaseConsts.BookChapterTable.COLUMN_CHAPTER_NUM)
.last(DatabaseConsts.SqlEnum.LIMIT_1.getSql());
BookChapter bookChapter = bookChapterMapper.selectOne(chapterQueryWrapper);
if (Objects.nonNull(bookChapter)) {
chapterNum = bookChapter.getChapterNum() + 1;
}
// b) 设置章节相关信息并保存
BookChapter newBookChapter = new BookChapter();
newBookChapter.setBookId(dto.getBookId());
newBookChapter.setChapterName(dto.getChapterName());
newBookChapter.setChapterNum(chapterNum);
newBookChapter.setWordCount(dto.getChapterContent().length());
newBookChapter.setIsVip(dto.getIsVip());
newBookChapter.setCreateTime(LocalDateTime.now());
newBookChapter.setUpdateTime(LocalDateTime.now());
bookChapterMapper.insert(newBookChapter);
// 2) 保存章节内容到小说内容表
BookContent bookContent = new BookContent();
bookContent.setContent(dto.getChapterContent());
bookContent.setChapterId(newBookChapter.getId());
bookContent.setCreateTime(LocalDateTime.now());
bookContent.setUpdateTime(LocalDateTime.now());
bookContentMapper.insert(bookContent);
// 3) 更新小说表最新章节信息和小说总字数信息
// a) 更新小说表关于最新章节的信息
BookInfo newBookInfo = new BookInfo();
newBookInfo.setId(dto.getBookId());
newBookInfo.setLastChapterId(newBookChapter.getId());
newBookInfo.setLastChapterName(newBookChapter.getChapterName());
newBookInfo.setLastChapterUpdateTime(LocalDateTime.now());
newBookInfo.setWordCount(bookInfo.getWordCount() + newBookChapter.getWordCount());
newBookChapter.setUpdateTime(LocalDateTime.now());
bookInfoMapper.updateById(newBookInfo);
// b) 清除小说信息缓存
bookInfoCacheManager.evictBookInfoCache(dto.getBookId());
// c) 发送小说信息更新的 MQ 消息
amqpMsgManager.sendBookChangeMsg(dto.getBookId());
return RestResp.ok();
}
@Override
public RestResp<PageRespDto<BookInfoRespDto>> listAuthorBooks(BookPageReqDto dto) {
IPage<BookInfo> page = new Page<>();
page.setCurrent(dto.getPageNum());
page.setSize(dto.getPageSize());
QueryWrapper<BookInfo> queryWrapper = new QueryWrapper<>();
queryWrapper.eq(DatabaseConsts.BookTable.AUTHOR_ID, dto.getAuthorId())
.orderByDesc(DatabaseConsts.CommonColumnEnum.CREATE_TIME.getName());
IPage<BookInfo> bookInfoPage = bookInfoMapper.selectPage(page, queryWrapper);
return RestResp.ok(PageRespDto.of(dto.getPageNum(), dto.getPageSize(), page.getTotal(),
bookInfoPage.getRecords().stream().map(v -> BookInfoRespDto.builder()
.id(v.getId())
.bookName(v.getBookName())
.picUrl(v.getPicUrl())
.categoryName(v.getCategoryName())
.wordCount(v.getWordCount())
.visitCount(v.getVisitCount())
.updateTime(v.getUpdateTime())
.build()).toList()));
}
@Override
public RestResp<PageRespDto<BookChapterRespDto>> listBookChapters(ChapterPageReqDto dto) {
IPage<BookChapter> page = new Page<>();
page.setCurrent(dto.getPageNum());
page.setSize(dto.getPageSize());
QueryWrapper<BookChapter> queryWrapper = new QueryWrapper<>();
queryWrapper.eq(DatabaseConsts.BookChapterTable.COLUMN_BOOK_ID, dto.getBookId())
.orderByDesc(DatabaseConsts.BookChapterTable.COLUMN_CHAPTER_NUM);
IPage<BookChapter> bookChapterPage = bookChapterMapper.selectPage(page, queryWrapper);
return RestResp.ok(PageRespDto.of(dto.getPageNum(), dto.getPageSize(), page.getTotal(),
bookChapterPage.getRecords().stream().map(v -> BookChapterRespDto.builder()
.id(v.getId())
.chapterName(v.getChapterName())
.chapterUpdateTime(v.getUpdateTime())
.isVip(v.getIsVip())
.build()).toList()));
}
@Override
public RestResp<List<BookEsRespDto>> listNextEsBooks(Long maxBookId) {
QueryWrapper<BookInfo> queryWrapper = new QueryWrapper<>();
queryWrapper.clear();
queryWrapper
.orderByAsc(DatabaseConsts.CommonColumnEnum.ID.getName())
.gt(DatabaseConsts.CommonColumnEnum.ID.getName(), maxBookId)
.gt(DatabaseConsts.BookTable.COLUMN_WORD_COUNT, 0)
.last(DatabaseConsts.SqlEnum.LIMIT_30.getSql());
return RestResp.ok(bookInfoMapper.selectList(queryWrapper).stream().map(bookInfo -> BookEsRespDto.builder()
.id(bookInfo.getId())
.categoryId(bookInfo.getCategoryId())
.categoryName(bookInfo.getCategoryName())
.bookDesc(bookInfo.getBookDesc())
.bookName(bookInfo.getBookName())
.authorId(bookInfo.getAuthorId())
.authorName(bookInfo.getAuthorName())
.bookStatus(bookInfo.getBookStatus())
.commentCount(bookInfo.getCommentCount())
.isVip(bookInfo.getIsVip())
.score(bookInfo.getScore())
.visitCount(bookInfo.getVisitCount())
.wordCount(bookInfo.getWordCount())
.workDirection(bookInfo.getWorkDirection())
.lastChapterId(bookInfo.getLastChapterId())
.lastChapterName(bookInfo.getLastChapterName())
.lastChapterUpdateTime(bookInfo.getLastChapterUpdateTime()
.toInstant(ZoneOffset.ofHours(8)).toEpochMilli())
.build()).collect(Collectors.toList()));
}
@Override
public RestResp<List<BookInfoRespDto>> listBookInfoByIds(List<Long> bookIds) {
QueryWrapper<BookInfo> queryWrapper = new QueryWrapper<>();
queryWrapper.in(DatabaseConsts.CommonColumnEnum.ID.getName(), bookIds);
return RestResp.ok(
bookInfoMapper.selectList(queryWrapper).stream().map(v -> BookInfoRespDto.builder()
.id(v.getId())
.bookName(v.getBookName())
.authorName(v.getAuthorName())
.picUrl(v.getPicUrl())
.bookDesc(v.getBookDesc())
.build()).collect(Collectors.toList()));
}
@Override
public RestResp<BookContentAboutRespDto> getBookContentAbout(Long chapterId) {
log.debug("userId:{}", UserHolder.getUserId());
// 查询章节信息
BookChapterRespDto bookChapter = bookChapterCacheManager.getChapter(chapterId);
// 查询章节内容
String content = bookContentCacheManager.getBookContent(chapterId);
// 查询小说信息
BookInfoRespDto bookInfo = bookInfoCacheManager.getBookInfo(bookChapter.getBookId());
// 组装数据并返回
return RestResp.ok(BookContentAboutRespDto.builder()
.bookInfo(bookInfo)
.chapterInfo(bookChapter)
.bookContent(content)
.build());
}
}

View File

@@ -0,0 +1,15 @@
server:
port: 9020
spring:
profiles:
include: common
active: dev
management:
# 端点启用配置
endpoint:
logfile:
# 启用返回日志文件内容的端点
enabled: true
# 外部日志文件路径
external-file: logs/novel-book-service.log

View File

@@ -0,0 +1,6 @@
spring:
application:
name: novel-book-service
profiles:
include: common

View File

@@ -1,20 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 彩色日志依赖的渲染类 -->
<conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
<conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
<conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />
<conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
<conversionRule conversionWord="wex"
converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
<conversionRule conversionWord="wEx"
converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>
<!-- 彩色日志格式 -->
<property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}" />
<property name="CONSOLE_LOG_PATTERN"
value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
<!-- %m输出的信息,%p日志级别,%t线程名,%d日期,%c类的全名,%i索引【从数字0开始递增】,,, -->
<!-- appender是configuration的子节点是负责写日志的组件。 -->
<!-- ConsoleAppender把日志输出到控制台 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<!--
<pattern>%d %p (%file:%line\)- %m%n</pattern>
-->
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
<!-- 控制台也要使用UTF-8不要使用GBK否则会中文乱码 -->
<charset>UTF-8</charset>
@@ -26,7 +26,7 @@
<!-- 2.如果日期没有发生变化但是当前日志的文件大小超过1KB时对当前日志进行分割 重命名 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>logs/book-service.log</File>
<File>logs/novel-book-service.log</File>
<!-- rollingPolicy:当发生滚动时,决定 RollingFileAppender 的行为,涉及文件移动和重命名。 -->
<!-- TimeBasedRollingPolicy 最常用的滚动策略,它根据时间来制定滚动策略,既负责滚动也负责出发滚动 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
@@ -49,24 +49,31 @@
<charset>UTF-8</charset>
</encoder>
</appender>
<!--输出到logstash的appender-->
<appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<!--可以访问的logstash日志收集端口-->
<destination>198.245.61.51:4560</destination>
<encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder"/>
</appender>
<!-- 控制台输出日志级别 -->
<root level="INFO">
<appender-ref ref="STDOUT" />
<appender-ref ref="FILE" />
<appender-ref ref="LOGSTASH"/>
</root>
<!-- 指定项目中某个包,当有日志操作行为时的日志记录级别 -->
<!-- com.maijinjie.springboot 为根包也就是只要是发生在这个根包下面的所有日志操作行为的权限都是DEBUG -->
<!-- 级别依次为【从高到低】FATAL > ERROR > WARN > INFO > DEBUG > TRACE -->
<logger name="com.java2nb" level="DEBUG">
<appender-ref ref="STDOUT" />
<appender-ref ref="FILE" />
<appender-ref ref="LOGSTASH"/>
</logger>
<springProfile name="dev">
<!-- ROOT 日志级别 -->
<root level="INFO">
<appender-ref ref="STDOUT"/>
<appender-ref ref="FILE"/>
</root>
<!-- 指定项目中某个包,当有日志操作行为时的日志记录级别 -->
<!-- com.maijinjie.springboot 为根包也就是只要是发生在这个根包下面的所有日志操作行为的权限都是DEBUG -->
<!-- 级别依次为【从高到低】FATAL > ERROR > WARN > INFO > DEBUG > TRACE -->
<logger name="io.github.xxyopen" level="DEBUG" additivity="false">
<appender-ref ref="STDOUT"/>
<appender-ref ref="FILE"/>
</logger>
</springProfile>
<springProfile name="prod">
<!-- ROOT 日志级别 -->
<root level="INFO">
<appender-ref ref="FILE"/>
</root>
<!-- 指定项目中某个包,当有日志操作行为时的日志记录级别 -->
<!-- com.maijinjie.springboot 为根包也就是只要是发生在这个根包下面的所有日志操作行为的权限都是DEBUG -->
<!-- 级别依次为【从高到低】FATAL > ERROR > WARN > INFO > DEBUG > TRACE -->
<logger name="io.github.xxyopen" level="ERROR" additivity="false">
<appender-ref ref="FILE"/>
</logger>
</springProfile>
</configuration>

View File

@@ -0,0 +1,45 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="io.github.xxyopen.novel.book.dao.mapper.BookInfoMapper">
<select id="searchBooks" resultType="io.github.xxyopen.novel.book.dao.entity.BookInfo">
select
id,category_id,category_name,book_name,author_id,author_name,word_count,last_chapter_name
from book_info where word_count > 0
<if test="condition.keyword != null and condition.keyword != ''">
and (book_name like concat('%',#{condition.keyword},'%') or author_name like
concat('%',#{condition.keyword},'%'))
</if>
<if test="condition.workDirection != null">
and work_direction = #{condition.workDirection}
</if>
<if test="condition.categoryId != null">
and category_id = #{condition.categoryId}
</if>
<if test="condition.isVip != null">
and is_vip = #{condition.isVip}
</if>
<if test="condition.bookStatus != null">
and book_status = #{condition.bookStatus}
</if>
<if test="condition.wordCountMin != null">
and word_count >= #{condition.wordCountMin}
</if>
<if test="condition.wordCountMax != null">
and word_count <![CDATA[ < ]]> #{condition.wordCountMax}
</if>
<if test="condition.updateTimeMin != null">
and last_chapter_update_time >= #{condition.updateTimeMin}
</if>
<if test="condition.sort != null">
order by ${condition.sort}
</if>
</select>
<update id="addVisitCount">
update book_info
set visit_count = visit_count + 1
where id = #{bookId}
</update>
</mapper>

View File

@@ -4,17 +4,32 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>novel-cloud</artifactId>
<groupId>com.java2nb.novel</groupId>
<version>1.3.0</version>
<groupId>io.github.xxyopen</groupId>
<version>2.0.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>novel-book</artifactId>
<name>novel-book</name>
<packaging>pom</packaging>
<modules>
<module>book-api</module>
<module>book-service</module>
<module>novel-book-api</module>
<module>novel-book-service</module>
</modules>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>io.github.xxyopen</groupId>
<artifactId>novel-common</artifactId>
<version>${project.parent.version}</version>
</dependency>
<dependency>
<groupId>io.github.xxyopen</groupId>
<artifactId>novel-config</artifactId>
<version>${project.parent.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>