diff --git a/doc/sql/20210913.sql b/doc/sql/20210913.sql new file mode 100644 index 0000000..97d00e6 --- /dev/null +++ b/doc/sql/20210913.sql @@ -0,0 +1,3 @@ +alter table book_index add column storage_type varchar(10) NOT NULL DEFAULT 'db' COMMENT '存储方式' after book_price ; + + diff --git a/doc/sql/novel_plus.sql b/doc/sql/novel_plus.sql index f812822..7c05a4a 100644 --- a/doc/sql/novel_plus.sql +++ b/doc/sql/novel_plus.sql @@ -1840,4 +1840,7 @@ delete from sys_menu where menu_id = 202; INSERT INTO crawl_source(`id`, `source_name`, `crawl_rule`, `source_status`, `create_time`, `update_time`) VALUES (16, 'i笔趣阁', '{\"bookListUrl\":\"http://m.ibiquge.net/xclass/{catId}/{page}.html\",\"catIdRule\":{\"catId1\":\"1\",\"catId2\":\"2\",\"catId3\":\"3\",\"catId4\":\"4\",\"catId5\":\"6\",\"catId6\":\"5\",\"catId7\":\"7\"},\"bookIdPatten\":\"href=\\\"/(\\\\d+_\\\\d+)/\\\"\",\"pagePatten\":\"value=\\\"(\\\\d+)/\\\\d+\\\"\",\"totalPagePatten\":\"value=\\\"\\\\d+/(\\\\d+)\\\"\",\"bookDetailUrl\":\"http://m.ibiquge.net/{bookId}/\",\"bookNamePatten\":\"([^/]+)\",\"authorNamePatten\":\"([^/]+)\",\"picUrlPatten\":\"]+)\\\"\\\\s+onerror=\\\"this.src=\",\"picUrlPrefix\":\"http://m.ibiquge.net\",\"statusPatten\":\">状态:([^/]+)\",\"bookStatusRule\":{\"连载\":0,\"完结\":1},\"visitCountPatten\":\">点击:(\\\\d+)\",\"descStart\":\"

\",\"descEnd\":\"

\",\"bookIndexUrl\":\"http://www.ibiquge.net/{bookId}/\",\"bookIndexStart\":\"正文\",\"indexIdPatten\":\"[^/]+\",\"indexNamePatten\":\"([^/]+)\",\"bookContentUrl\":\"http://www.ibiquge.net/{bookId}/{indexId}.html\",\"contentStart\":\"

\",\"contentEnd\":\"
\"}', 0, '2021-02-04 21:31:23', '2021-02-04 21:31:23'); -alter table news add column `read_count` BIGINT NOT NULL DEFAULT '0' COMMENT '阅读量' after content; \ No newline at end of file +alter table news add column `read_count` BIGINT NOT NULL DEFAULT '0' COMMENT '阅读量' after content; + + +alter table book_index add column storage_type varchar(10) NOT NULL DEFAULT 'db' COMMENT '存储方式' after book_price ; diff --git a/novel-common/src/main/java/com/java2nb/novel/entity/BookIndex.java b/novel-common/src/main/java/com/java2nb/novel/entity/BookIndex.java index cbbd033..840649a 100644 --- a/novel-common/src/main/java/com/java2nb/novel/entity/BookIndex.java +++ b/novel-common/src/main/java/com/java2nb/novel/entity/BookIndex.java @@ -25,6 +25,9 @@ public class BookIndex { @Generated("org.mybatis.generator.api.MyBatisGenerator") private Integer bookPrice; + @Generated("org.mybatis.generator.api.MyBatisGenerator") + private String storageType; + @Generated("org.mybatis.generator.api.MyBatisGenerator") private Date createTime; @@ -101,6 +104,16 @@ public class BookIndex { this.bookPrice = bookPrice; } + @Generated("org.mybatis.generator.api.MyBatisGenerator") + public String getStorageType() { + return storageType; + } + + @Generated("org.mybatis.generator.api.MyBatisGenerator") + public void setStorageType(String storageType) { + this.storageType = storageType == null ? null : storageType.trim(); + } + @Generated("org.mybatis.generator.api.MyBatisGenerator") public Date getCreateTime() { return createTime; diff --git a/novel-common/src/main/java/com/java2nb/novel/mapper/BookIndexDynamicSqlSupport.java b/novel-common/src/main/java/com/java2nb/novel/mapper/BookIndexDynamicSqlSupport.java index 1c2ac2a..6d15ef1 100644 --- a/novel-common/src/main/java/com/java2nb/novel/mapper/BookIndexDynamicSqlSupport.java +++ b/novel-common/src/main/java/com/java2nb/novel/mapper/BookIndexDynamicSqlSupport.java @@ -31,6 +31,9 @@ public final class BookIndexDynamicSqlSupport { @Generated("org.mybatis.generator.api.MyBatisGenerator") public static final SqlColumn bookPrice = bookIndex.bookPrice; + @Generated("org.mybatis.generator.api.MyBatisGenerator") + public static final SqlColumn storageType = bookIndex.storageType; + @Generated("org.mybatis.generator.api.MyBatisGenerator") public static final SqlColumn createTime = bookIndex.createTime; @@ -53,6 +56,8 @@ public final class BookIndexDynamicSqlSupport { public final SqlColumn bookPrice = column("book_price", JDBCType.INTEGER); + public final SqlColumn storageType = column("storage_type", JDBCType.VARCHAR); + public final SqlColumn createTime = column("create_time", JDBCType.TIMESTAMP); public final SqlColumn updateTime = column("update_time", JDBCType.TIMESTAMP); diff --git a/novel-common/src/main/java/com/java2nb/novel/mapper/BookIndexMapper.java b/novel-common/src/main/java/com/java2nb/novel/mapper/BookIndexMapper.java index 7870bf7..7cb3213 100644 --- a/novel-common/src/main/java/com/java2nb/novel/mapper/BookIndexMapper.java +++ b/novel-common/src/main/java/com/java2nb/novel/mapper/BookIndexMapper.java @@ -37,46 +37,47 @@ import org.mybatis.dynamic.sql.util.mybatis3.MyBatis3Utils; @Mapper public interface BookIndexMapper { @Generated("org.mybatis.generator.api.MyBatisGenerator") - BasicColumn[] selectList = BasicColumn.columnList(id, bookId, indexNum, indexName, wordCount, isVip, bookPrice, createTime, updateTime); + BasicColumn[] selectList = BasicColumn.columnList(id, bookId, indexNum, indexName, wordCount, isVip, bookPrice, storageType, createTime, updateTime); @Generated("org.mybatis.generator.api.MyBatisGenerator") - @SelectProvider(type = SqlProviderAdapter.class, method = "select") + @SelectProvider(type=SqlProviderAdapter.class, method="select") long count(SelectStatementProvider selectStatement); @Generated("org.mybatis.generator.api.MyBatisGenerator") - @DeleteProvider(type = SqlProviderAdapter.class, method = "delete") + @DeleteProvider(type=SqlProviderAdapter.class, method="delete") int delete(DeleteStatementProvider deleteStatement); @Generated("org.mybatis.generator.api.MyBatisGenerator") - @InsertProvider(type = SqlProviderAdapter.class, method = "insert") + @InsertProvider(type=SqlProviderAdapter.class, method="insert") int insert(InsertStatementProvider insertStatement); @Generated("org.mybatis.generator.api.MyBatisGenerator") - @InsertProvider(type = SqlProviderAdapter.class, method = "insertMultiple") + @InsertProvider(type=SqlProviderAdapter.class, method="insertMultiple") int insertMultiple(MultiRowInsertStatementProvider multipleInsertStatement); @Generated("org.mybatis.generator.api.MyBatisGenerator") - @SelectProvider(type = SqlProviderAdapter.class, method = "select") + @SelectProvider(type=SqlProviderAdapter.class, method="select") @ResultMap("BookIndexResult") Optional 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 = "book_price", property = "bookPrice", jdbcType = JdbcType.INTEGER), - @Result(column = "create_time", property = "createTime", jdbcType = JdbcType.TIMESTAMP), - @Result(column = "update_time", property = "updateTime", jdbcType = JdbcType.TIMESTAMP) + @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="book_price", property="bookPrice", jdbcType=JdbcType.INTEGER), + @Result(column="storage_type", property="storageType", jdbcType=JdbcType.VARCHAR), + @Result(column="create_time", property="createTime", jdbcType=JdbcType.TIMESTAMP), + @Result(column="update_time", property="updateTime", jdbcType=JdbcType.TIMESTAMP) }) List selectMany(SelectStatementProvider selectStatement); @Generated("org.mybatis.generator.api.MyBatisGenerator") - @UpdateProvider(type = SqlProviderAdapter.class, method = "update") + @UpdateProvider(type=SqlProviderAdapter.class, method="update") int update(UpdateStatementProvider updateStatement); @Generated("org.mybatis.generator.api.MyBatisGenerator") @@ -92,52 +93,55 @@ public interface BookIndexMapper { @Generated("org.mybatis.generator.api.MyBatisGenerator") default int deleteByPrimaryKey(Long id_) { return delete(c -> - c.where(id, isEqualTo(id_)) + c.where(id, isEqualTo(id_)) ); } @Generated("org.mybatis.generator.api.MyBatisGenerator") default int insert(BookIndex record) { return MyBatis3Utils.insert(this::insert, record, bookIndex, c -> - c.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(bookPrice).toProperty("bookPrice") - .map(createTime).toProperty("createTime") - .map(updateTime).toProperty("updateTime") + c.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(bookPrice).toProperty("bookPrice") + .map(storageType).toProperty("storageType") + .map(createTime).toProperty("createTime") + .map(updateTime).toProperty("updateTime") ); } @Generated("org.mybatis.generator.api.MyBatisGenerator") default int insertMultiple(Collection records) { return MyBatis3Utils.insertMultiple(this::insertMultiple, records, bookIndex, c -> - c.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(bookPrice).toProperty("bookPrice") - .map(createTime).toProperty("createTime") - .map(updateTime).toProperty("updateTime") + c.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(bookPrice).toProperty("bookPrice") + .map(storageType).toProperty("storageType") + .map(createTime).toProperty("createTime") + .map(updateTime).toProperty("updateTime") ); } @Generated("org.mybatis.generator.api.MyBatisGenerator") default int insertSelective(BookIndex record) { return MyBatis3Utils.insert(this::insert, record, bookIndex, c -> - c.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(bookPrice).toPropertyWhenPresent("bookPrice", record::getBookPrice) - .map(createTime).toPropertyWhenPresent("createTime", record::getCreateTime) - .map(updateTime).toPropertyWhenPresent("updateTime", record::getUpdateTime) + c.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(bookPrice).toPropertyWhenPresent("bookPrice", record::getBookPrice) + .map(storageType).toPropertyWhenPresent("storageType", record::getStorageType) + .map(createTime).toPropertyWhenPresent("createTime", record::getCreateTime) + .map(updateTime).toPropertyWhenPresent("updateTime", record::getUpdateTime) ); } @@ -159,7 +163,7 @@ public interface BookIndexMapper { @Generated("org.mybatis.generator.api.MyBatisGenerator") default Optional selectByPrimaryKey(Long id_) { return selectOne(c -> - c.where(id, isEqualTo(id_)) + c.where(id, isEqualTo(id_)) ); } @@ -177,6 +181,7 @@ public interface BookIndexMapper { .set(wordCount).equalTo(record::getWordCount) .set(isVip).equalTo(record::getIsVip) .set(bookPrice).equalTo(record::getBookPrice) + .set(storageType).equalTo(record::getStorageType) .set(createTime).equalTo(record::getCreateTime) .set(updateTime).equalTo(record::getUpdateTime); } @@ -190,6 +195,7 @@ public interface BookIndexMapper { .set(wordCount).equalToWhenPresent(record::getWordCount) .set(isVip).equalToWhenPresent(record::getIsVip) .set(bookPrice).equalToWhenPresent(record::getBookPrice) + .set(storageType).equalToWhenPresent(record::getStorageType) .set(createTime).equalToWhenPresent(record::getCreateTime) .set(updateTime).equalToWhenPresent(record::getUpdateTime); } @@ -197,30 +203,32 @@ public interface BookIndexMapper { @Generated("org.mybatis.generator.api.MyBatisGenerator") default int updateByPrimaryKey(BookIndex record) { return update(c -> - c.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(bookPrice).equalTo(record::getBookPrice) - .set(createTime).equalTo(record::getCreateTime) - .set(updateTime).equalTo(record::getUpdateTime) - .where(id, isEqualTo(record::getId)) + c.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(bookPrice).equalTo(record::getBookPrice) + .set(storageType).equalTo(record::getStorageType) + .set(createTime).equalTo(record::getCreateTime) + .set(updateTime).equalTo(record::getUpdateTime) + .where(id, isEqualTo(record::getId)) ); } @Generated("org.mybatis.generator.api.MyBatisGenerator") default int updateByPrimaryKeySelective(BookIndex record) { return update(c -> - c.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(bookPrice).equalToWhenPresent(record::getBookPrice) - .set(createTime).equalToWhenPresent(record::getCreateTime) - .set(updateTime).equalToWhenPresent(record::getUpdateTime) - .where(id, isEqualTo(record::getId)) + c.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(bookPrice).equalToWhenPresent(record::getBookPrice) + .set(storageType).equalToWhenPresent(record::getStorageType) + .set(createTime).equalToWhenPresent(record::getCreateTime) + .set(updateTime).equalToWhenPresent(record::getUpdateTime) + .where(id, isEqualTo(record::getId)) ); } } \ No newline at end of file diff --git a/novel-crawl/src/main/java/com/java2nb/novel/service/impl/BookServiceImpl.java b/novel-crawl/src/main/java/com/java2nb/novel/service/impl/BookServiceImpl.java index 677d0c8..11c60e5 100644 --- a/novel-crawl/src/main/java/com/java2nb/novel/service/impl/BookServiceImpl.java +++ b/novel-crawl/src/main/java/com/java2nb/novel/service/impl/BookServiceImpl.java @@ -9,6 +9,7 @@ import com.java2nb.novel.service.BookService; import com.java2nb.novel.utils.Constants; import lombok.RequiredArgsConstructor; import org.mybatis.dynamic.sql.render.RenderingStrategies; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -38,7 +39,10 @@ public class BookServiceImpl implements BookService { private final CrawlBookIndexMapper bookIndexMapper; - private final BookContentService bookContentService; + private final Map bookContentServiceMap; + + @Value("${content.save.storage}") + private String storageType; @Override @@ -85,8 +89,11 @@ public class BookServiceImpl implements BookService { bookMapper.insertSelective(book); //批量保存目录和内容 + bookIndexList.forEach(bookIndex -> { + bookIndex.setStorageType(storageType); + }); bookIndexMapper.insertMultiple(bookIndexList); - bookContentService.saveBookContent(bookContentList,book.getId()); + bookContentServiceMap.get(storageType).saveBookContent(bookContentList, book.getId()); } } @@ -106,7 +113,7 @@ public class BookServiceImpl implements BookService { @Override public Map queryExistBookIndexMap(Long bookId) { - List bookIndexs = bookIndexMapper.selectMany(select(BookIndexDynamicSqlSupport.id, BookIndexDynamicSqlSupport.indexNum, BookIndexDynamicSqlSupport.indexName, BookIndexDynamicSqlSupport.wordCount) + List bookIndexs = bookIndexMapper.selectMany(select(BookIndexDynamicSqlSupport.id, BookIndexDynamicSqlSupport.indexNum, BookIndexDynamicSqlSupport.indexName, BookIndexDynamicSqlSupport.wordCount, BookIndexDynamicSqlSupport.storageType) .from(BookIndexDynamicSqlSupport.bookIndex) .where(BookIndexDynamicSqlSupport.bookId, isEqualTo(bookId)) .build() @@ -127,12 +134,13 @@ public class BookServiceImpl implements BookService { if (!existBookIndexMap.containsKey(bookIndex.getIndexNum())) { //插入 + bookIndex.setStorageType(storageType); bookIndexMapper.insertSelective(bookIndex); - bookContentService.saveBookContent(bookContent,book.getId()); + bookContentServiceMap.get(storageType).saveBookContent(bookContent, book.getId()); } else { //更新 bookIndexMapper.updateByPrimaryKeySelective(bookIndex); - bookContentService.updateBookContent(bookContent,book.getId()); + bookContentServiceMap.get(existBookIndexMap.get(bookIndex.getIndexNum()).getStorageType()).updateBookContent(bookContent, book.getId()); } diff --git a/novel-crawl/src/main/java/com/java2nb/novel/service/impl/CrawlServiceImpl.java b/novel-crawl/src/main/java/com/java2nb/novel/service/impl/CrawlServiceImpl.java index c9492cc..8d45778 100644 --- a/novel-crawl/src/main/java/com/java2nb/novel/service/impl/CrawlServiceImpl.java +++ b/novel-crawl/src/main/java/com/java2nb/novel/service/impl/CrawlServiceImpl.java @@ -149,7 +149,7 @@ public class CrawlServiceImpl implements CrawlService { @Override public void addCrawlSingleTask(CrawlSingleTask singleTask) { - if(bookService.queryIsExistByBookNameAndAuthorName(singleTask.getBookName(),singleTask.getAuthorName())){ + if (bookService.queryIsExistByBookNameAndAuthorName(singleTask.getBookName(), singleTask.getAuthorName())) { throw new BusinessException(ResponseStatus.BOOK_EXISTS); } @@ -181,23 +181,23 @@ public class CrawlServiceImpl implements CrawlService { @Override public CrawlSingleTask getCrawlSingleTask() { - List list = crawlSingleTaskMapper.selectMany(select(CrawlSingleTaskDynamicSqlSupport.crawlSingleTask.allColumns()) + List list = crawlSingleTaskMapper.selectMany(select(CrawlSingleTaskDynamicSqlSupport.crawlSingleTask.allColumns()) .from(CrawlSingleTaskDynamicSqlSupport.crawlSingleTask) - .where(CrawlSingleTaskDynamicSqlSupport.taskStatus,isEqualTo((byte)2)) - .orderBy(CrawlSingleTaskDynamicSqlSupport.createTime) - .limit(1) + .where(CrawlSingleTaskDynamicSqlSupport.taskStatus, isEqualTo((byte) 2)) + .orderBy(CrawlSingleTaskDynamicSqlSupport.createTime) + .limit(1) .build() .render(RenderingStrategies.MYBATIS3)); - return list.size() > 0 ? list.get(0) : null; + return list.size() > 0 ? list.get(0) : null; } @Override public void updateCrawlSingleTask(CrawlSingleTask task, Byte status) { byte excCount = task.getExcCount(); - excCount+=1; + excCount += 1; task.setExcCount(excCount); - if(status == 1 || excCount == 5){ + if (status == 1 || excCount == 5) { //当采集成功或者采集次数等于5,则更新采集最终状态,并停止采集 task.setTaskStatus(status); } @@ -219,7 +219,7 @@ public class CrawlServiceImpl implements CrawlService { try { - if(StringUtils.isNotBlank(ruleBean.getCatIdRule().get("catId" + catId))) { + if (StringUtils.isNotBlank(ruleBean.getCatIdRule().get("catId" + catId))) { //拼接分类URL String catBookListUrl = ruleBean.getBookListUrl() .replace("{catId}", ruleBean.getCatIdRule().get("catId" + catId)) @@ -235,7 +235,7 @@ public class CrawlServiceImpl implements CrawlService { //1.阻塞过程(使用了 sleep,同步锁的 wait,socket 中的 receiver,accept 等方法时) //捕获中断异常InterruptedException来退出线程。 //2.非阻塞过程中通过判断中断标志来退出线程。 - if(Thread.currentThread().isInterrupted()){ + if (Thread.currentThread().isInterrupted()) { return; } @@ -262,8 +262,8 @@ public class CrawlServiceImpl implements CrawlService { } } - }catch (Exception e){ - log.error(e.getMessage(),e); + } catch (Exception e) { + log.error(e.getMessage(), e); } page += 1; @@ -278,7 +278,7 @@ public class CrawlServiceImpl implements CrawlService { final AtomicBoolean parseResult = new AtomicBoolean(false); CrawlParser.parseBook(ruleBean, bookId, book -> { - if(book.getBookName() == null || book.getAuthorName() == null){ + if (book.getBookName() == null || book.getAuthorName() == null) { return; } //这里只做新书入库,查询是否存在这本书 @@ -301,7 +301,7 @@ public class CrawlServiceImpl implements CrawlService { book.setCrawlLastTime(new Date()); book.setId(new IdWorker().nextId()); //解析章节目录 - CrawlParser.parseBookIndexAndContent(bookId, book, ruleBean, new HashMap<>(0),chapter -> { + CrawlParser.parseBookIndexAndContent(bookId, book, ruleBean, new HashMap<>(0), chapter -> { bookService.saveBookAndIndexAndContent(book, chapter.getBookIndexList(), chapter.getBookContentList()); }); diff --git a/novel-crawl/src/main/java/com/java2nb/novel/service/impl/DbBookContentServiceImpl.java b/novel-crawl/src/main/java/com/java2nb/novel/service/impl/DbBookContentServiceImpl.java index 4aa7849..039d548 100644 --- a/novel-crawl/src/main/java/com/java2nb/novel/service/impl/DbBookContentServiceImpl.java +++ b/novel-crawl/src/main/java/com/java2nb/novel/service/impl/DbBookContentServiceImpl.java @@ -15,9 +15,8 @@ import static org.mybatis.dynamic.sql.SqlBuilder.isEqualTo; import static org.mybatis.dynamic.sql.SqlBuilder.update; -@Service +@Service(value = "db") @RequiredArgsConstructor -@ConditionalOnProperty(prefix = "content.save", name = "storage", havingValue = "db") public class DbBookContentServiceImpl implements BookContentService { private final BookContentMapper bookContentMapper; diff --git a/novel-crawl/src/main/java/com/java2nb/novel/service/impl/FileBookContentServiceImpl.java b/novel-crawl/src/main/java/com/java2nb/novel/service/impl/FileBookContentServiceImpl.java index 5d6f256..284f5e6 100644 --- a/novel-crawl/src/main/java/com/java2nb/novel/service/impl/FileBookContentServiceImpl.java +++ b/novel-crawl/src/main/java/com/java2nb/novel/service/impl/FileBookContentServiceImpl.java @@ -10,9 +10,8 @@ import org.springframework.stereotype.Service; import java.util.List; -@Service +@Service(value = "txt") @RequiredArgsConstructor -@ConditionalOnProperty(prefix = "content.save", name = "storage", havingValue = "file") public class FileBookContentServiceImpl implements BookContentService { @Value("${content.save.path}") diff --git a/novel-front/src/main/java/com/java2nb/novel/controller/BookController.java b/novel-front/src/main/java/com/java2nb/novel/controller/BookController.java index 6bd0287..960df44 100644 --- a/novel-front/src/main/java/com/java2nb/novel/controller/BookController.java +++ b/novel-front/src/main/java/com/java2nb/novel/controller/BookController.java @@ -37,10 +37,10 @@ public class BookController extends BaseController { private final BookService bookService; - private final BookContentService bookContentService; - private final RabbitTemplate rabbitTemplate; + private final Map bookContentServiceMap; + @Value("${spring.rabbitmq.enable}") private Integer enableMq; @@ -130,7 +130,8 @@ public class BookController extends BaseController { public ResultBean> queryBookIndexAbout(Long bookId, Long lastBookIndexId) { Map data = new HashMap<>(2); data.put("bookIndexCount", bookService.queryIndexCount(bookId)); - String lastBookContent = bookContentService.queryBookContent(bookId,lastBookIndexId).getContent(); + BookIndex bookIndex = bookService.queryBookIndex(lastBookIndexId); + String lastBookContent = bookContentServiceMap.get(bookIndex.getStorageType()).queryBookContent(bookId,lastBookIndexId).getContent(); if (lastBookContent.length() > 42) { lastBookContent = lastBookContent.substring(0, 42); } diff --git a/novel-front/src/main/java/com/java2nb/novel/page/PageController.java b/novel-front/src/main/java/com/java2nb/novel/page/PageController.java index 1859418..3a54449 100644 --- a/novel-front/src/main/java/com/java2nb/novel/page/PageController.java +++ b/novel-front/src/main/java/com/java2nb/novel/page/PageController.java @@ -45,10 +45,9 @@ public class PageController extends BaseController { private final UserService userService; - private final BookContentService bookContentService; - private final ThreadPoolExecutor threadPoolExecutor; + private final Map bookContentServiceMap; @RequestMapping("{url}.html") public String module(@PathVariable("url") String url) { @@ -210,10 +209,10 @@ public class PageController extends BaseController { return nextBookIndexId; }, threadPoolExecutor); - //加载小说内容信息线程 - CompletableFuture bookContentCompletableFuture = CompletableFuture.supplyAsync(() -> { + //加载小说内容信息线程,该线程在加载小说章节信息线程执行完毕后才执行 + CompletableFuture bookContentCompletableFuture = bookIndexCompletableFuture.thenApplyAsync((bookIndex) -> { //查询内容 - BookContent bookContent = bookContentService.queryBookContent(bookId, bookIndexId); + BookContent bookContent = bookContentServiceMap.get(bookIndex.getStorageType()).queryBookContent(bookId, bookIndexId); log.debug("加载小说内容信息线程结束"); return bookContent; }, threadPoolExecutor); diff --git a/novel-front/src/main/java/com/java2nb/novel/service/impl/BookServiceImpl.java b/novel-front/src/main/java/com/java2nb/novel/service/impl/BookServiceImpl.java index dd1db5d..18a0db7 100644 --- a/novel-front/src/main/java/com/java2nb/novel/service/impl/BookServiceImpl.java +++ b/novel-front/src/main/java/com/java2nb/novel/service/impl/BookServiceImpl.java @@ -262,7 +262,7 @@ public class BookServiceImpl implements BookService { @Override public BookIndex queryBookIndex(Long bookIndexId) { - SelectStatementProvider selectStatement = select(BookIndexDynamicSqlSupport.id, BookIndexDynamicSqlSupport.bookId, BookIndexDynamicSqlSupport.indexNum, BookIndexDynamicSqlSupport.indexName, BookIndexDynamicSqlSupport.wordCount,BookIndexDynamicSqlSupport.bookPrice, BookIndexDynamicSqlSupport.updateTime, BookIndexDynamicSqlSupport.isVip) + SelectStatementProvider selectStatement = select(BookIndexDynamicSqlSupport.id, BookIndexDynamicSqlSupport.bookId, BookIndexDynamicSqlSupport.indexNum, BookIndexDynamicSqlSupport.indexName, BookIndexDynamicSqlSupport.wordCount,BookIndexDynamicSqlSupport.bookPrice, BookIndexDynamicSqlSupport.updateTime, BookIndexDynamicSqlSupport.isVip,BookIndexDynamicSqlSupport.storageType) .from(bookIndex) .where(BookIndexDynamicSqlSupport.id, isEqualTo(bookIndexId)) .build() diff --git a/novel-front/src/main/java/com/java2nb/novel/service/impl/DbBookContentServiceImpl.java b/novel-front/src/main/java/com/java2nb/novel/service/impl/DbBookContentServiceImpl.java index 3e4344f..7d5fce0 100644 --- a/novel-front/src/main/java/com/java2nb/novel/service/impl/DbBookContentServiceImpl.java +++ b/novel-front/src/main/java/com/java2nb/novel/service/impl/DbBookContentServiceImpl.java @@ -18,9 +18,8 @@ import static org.mybatis.dynamic.sql.SqlBuilder.update; import static org.mybatis.dynamic.sql.select.SelectDSL.select; -@Service +@Service(value = "db") @RequiredArgsConstructor -@ConditionalOnProperty(prefix = "content.save", name = "storage", havingValue = "db") public class DbBookContentServiceImpl implements BookContentService { private final BookContentMapper bookContentMapper; diff --git a/novel-front/src/main/java/com/java2nb/novel/service/impl/FileBookContentServiceImpl.java b/novel-front/src/main/java/com/java2nb/novel/service/impl/FileBookContentServiceImpl.java index bcb0425..7e915be 100644 --- a/novel-front/src/main/java/com/java2nb/novel/service/impl/FileBookContentServiceImpl.java +++ b/novel-front/src/main/java/com/java2nb/novel/service/impl/FileBookContentServiceImpl.java @@ -1,21 +1,17 @@ package com.java2nb.novel.service.impl; -import com.java2nb.novel.core.utils.FileUtil; import com.java2nb.novel.entity.BookContent; import com.java2nb.novel.service.BookContentService; import lombok.RequiredArgsConstructor; import lombok.SneakyThrows; import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.stereotype.Service; import java.io.BufferedReader; import java.io.FileReader; -import java.util.List; -@Service +@Service(value = "txt") @RequiredArgsConstructor -@ConditionalOnProperty(prefix = "content.save", name = "storage", havingValue = "file") public class FileBookContentServiceImpl implements BookContentService { @Value("${content.save.path}")