mirror of
https://github.com/201206030/novel-cloud.git
synced 2025-09-14 05:02:42 +00:00
refactor: 基于 novel 项目 & Spring Cloud 2022 & Spring Cloud Alibaba 2022 重构
This commit is contained in:
@@ -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>
|
@@ -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);
|
||||
}
|
@@ -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;
|
||||
}
|
||||
}
|
@@ -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;
|
||||
}
|
||||
}
|
@@ -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;
|
||||
}
|
||||
}
|
@@ -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;
|
||||
}
|
||||
}
|
@@ -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;
|
||||
}
|
||||
}
|
@@ -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();
|
||||
}
|
||||
}
|
@@ -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;
|
||||
}
|
||||
}
|
@@ -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();
|
||||
}
|
||||
}
|
@@ -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;
|
||||
|
||||
|
||||
}
|
@@ -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>
|
@@ -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);
|
||||
}
|
||||
}
|
@@ -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));
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
@@ -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;
|
||||
}
|
||||
|
||||
}
|
@@ -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 {
|
||||
|
||||
}
|
@@ -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);
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
@@ -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");
|
||||
}
|
||||
}
|
||||
}
|
@@ -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();
|
||||
}
|
||||
}
|
@@ -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");
|
||||
}
|
||||
}
|
||||
}
|
@@ -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();
|
||||
}
|
||||
|
||||
}
|
@@ -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");
|
||||
}
|
||||
}
|
||||
}
|
@@ -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();
|
||||
}
|
||||
}
|
@@ -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");
|
||||
}
|
||||
}
|
||||
}
|
@@ -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();
|
||||
}
|
||||
}
|
@@ -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");
|
||||
}
|
||||
}
|
||||
}
|
@@ -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");
|
||||
}
|
||||
}
|
||||
}
|
@@ -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();
|
||||
}
|
||||
}
|
@@ -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);
|
||||
}
|
@@ -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);
|
||||
}
|
@@ -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));
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
@@ -1,4 +0,0 @@
|
||||
spring:
|
||||
profiles:
|
||||
include: [common]
|
||||
|
@@ -1,17 +0,0 @@
|
||||
spring:
|
||||
application:
|
||||
name: book-service
|
||||
profiles:
|
||||
active: dev
|
||||
|
||||
cloud:
|
||||
nacos:
|
||||
config:
|
||||
ext‐config[0]:
|
||||
data‐id: novel-redis.yml
|
||||
group: novel-common
|
||||
refresh: true
|
||||
ext‐config[1]:
|
||||
data‐id: novel-rabbitmq.yml
|
||||
group: novel-common
|
||||
refresh: true
|
@@ -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>
|
35
novel-book/novel-book-api/pom.xml
Normal file
35
novel-book/novel-book-api/pom.xml
Normal 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>
|
@@ -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;
|
||||
|
||||
}
|
@@ -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;
|
||||
|
||||
}
|
@@ -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;
|
||||
|
||||
|
||||
}
|
@@ -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;
|
||||
}
|
@@ -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;
|
||||
|
||||
}
|
@@ -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;
|
||||
|
||||
|
||||
}
|
@@ -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;
|
||||
|
||||
}
|
@@ -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;
|
||||
|
||||
}
|
@@ -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;
|
||||
|
||||
}
|
@@ -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;
|
||||
|
||||
}
|
||||
|
||||
}
|
@@ -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;
|
||||
|
||||
}
|
@@ -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;
|
||||
|
||||
|
||||
}
|
@@ -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;
|
||||
|
||||
|
||||
}
|
@@ -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;
|
||||
|
||||
}
|
@@ -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)));
|
||||
}
|
||||
}
|
||||
|
||||
}
|
57
novel-book/novel-book-service/pom.xml
Normal file
57
novel-book/novel-book-service/pom.xml
Normal 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>
|
@@ -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);
|
||||
}
|
||||
|
||||
}
|
@@ -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/*");
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
@@ -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);
|
||||
}
|
||||
|
||||
}
|
@@ -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);
|
||||
}
|
||||
|
||||
}
|
@@ -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 +
|
||||
"}";
|
||||
}
|
||||
}
|
@@ -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 +
|
||||
"}";
|
||||
}
|
||||
}
|
@@ -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 +
|
||||
"}";
|
||||
}
|
||||
}
|
@@ -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 +
|
||||
"}";
|
||||
}
|
||||
}
|
@@ -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 +
|
||||
"}";
|
||||
}
|
||||
}
|
@@ -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 +
|
||||
"}";
|
||||
}
|
||||
}
|
@@ -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 +
|
||||
"}";
|
||||
}
|
||||
}
|
@@ -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> {
|
||||
|
||||
}
|
@@ -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> {
|
||||
|
||||
}
|
@@ -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> {
|
||||
|
||||
}
|
@@ -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> {
|
||||
|
||||
}
|
@@ -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> {
|
||||
|
||||
}
|
@@ -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> {
|
||||
|
||||
}
|
@@ -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);
|
||||
|
||||
}
|
@@ -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();
|
||||
}
|
||||
|
||||
}
|
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
}
|
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
}
|
@@ -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();
|
||||
}
|
||||
|
||||
}
|
@@ -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();
|
||||
}
|
||||
|
||||
}
|
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
}
|
@@ -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);
|
||||
}
|
||||
|
||||
}
|
@@ -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);
|
||||
}
|
@@ -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());
|
||||
}
|
||||
}
|
@@ -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
|
@@ -0,0 +1,6 @@
|
||||
spring:
|
||||
application:
|
||||
name: novel-book-service
|
||||
profiles:
|
||||
include: common
|
||||
|
@@ -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>
|
@@ -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>
|
@@ -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>
|
Reference in New Issue
Block a user