diff --git a/novel-front/pom.xml b/novel-front/pom.xml index 762f007..a2a7407 100644 --- a/novel-front/pom.xml +++ b/novel-front/pom.xml @@ -27,24 +27,6 @@ ${jjwt.version} - - org.springframework.boot - spring-boot-starter-amqp - - - - - io.searchbox - jest - ${jest.version} - - - - org.elasticsearch.client - elasticsearch-rest-high-level-client - ${elasticsearch.version} - - com.aliyun.oss @@ -70,14 +52,6 @@ - - - - com.alipay.sdk alipay-sdk-java 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 d95cc2c..5581bb1 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 @@ -7,18 +7,16 @@ import com.java2nb.novel.entity.BookCategory; import com.java2nb.novel.entity.BookComment; import com.java2nb.novel.entity.BookIndex; import com.java2nb.novel.service.BookContentService; +import com.java2nb.novel.service.BookService; import com.java2nb.novel.vo.BookCommentVO; import com.java2nb.novel.vo.BookSettingVO; import com.java2nb.novel.vo.BookSpVO; -import com.java2nb.novel.service.BookService; import com.java2nb.novel.vo.BookVO; import io.github.xxyopen.model.page.PageBean; import io.github.xxyopen.model.page.builder.pagehelper.PageBuilder; import io.github.xxyopen.model.resp.RestResult; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.amqp.rabbit.core.RabbitTemplate; -import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletRequest; @@ -37,14 +35,8 @@ public class BookController extends BaseController { private final BookService bookService; - private final RabbitTemplate rabbitTemplate; - private final Map bookContentServiceMap; - @Value("${spring.rabbitmq.enable}") - private Integer enableMq; - - /** * 查询首页小说设置列表数据 */ @@ -89,7 +81,8 @@ public class BookController extends BaseController { * 分页搜索 */ @GetMapping("searchByPage") - public RestResult searchByPage(BookSpVO bookSP, @RequestParam(value = "curr", defaultValue = "1") int page, @RequestParam(value = "limit", defaultValue = "20") int pageSize) { + public RestResult searchByPage(BookSpVO bookSP, @RequestParam(value = "curr", defaultValue = "1") int page, + @RequestParam(value = "limit", defaultValue = "20") int pageSize) { return RestResult.ok(bookService.searchByPage(bookSP, page, pageSize)); } @@ -106,7 +99,8 @@ public class BookController extends BaseController { * 查询小说排行信息 */ @GetMapping("listRank") - public RestResult> listRank(@RequestParam(value = "type", defaultValue = "0") Byte type, @RequestParam(value = "limit", defaultValue = "30") Integer limit) { + public RestResult> listRank(@RequestParam(value = "type", defaultValue = "0") Byte type, + @RequestParam(value = "limit", defaultValue = "30") Integer limit) { return RestResult.ok(bookService.listRank(type, limit)); } @@ -115,11 +109,7 @@ public class BookController extends BaseController { */ @PostMapping("addVisitCount") public RestResult addVisitCount(Long bookId) { - if (enableMq == 1) { - rabbitTemplate.convertAndSend("ADD-BOOK-VISIT-EXCHANGE", null, bookId); - } else { - bookService.addVisitCount(bookId, 1); - } + bookService.addVisitCount(bookId, 1); return RestResult.ok(); } @@ -131,7 +121,8 @@ public class BookController extends BaseController { Map data = new HashMap<>(2); data.put("bookIndexCount", bookService.queryIndexCount(bookId)); BookIndex bookIndex = bookService.queryBookIndex(lastBookIndexId); - String lastBookContent = bookContentServiceMap.get(bookIndex.getStorageType()).queryBookContent(bookId,lastBookIndexId).getContent(); + String lastBookContent = bookContentServiceMap.get(bookIndex.getStorageType()) + .queryBookContent(bookId, lastBookIndexId).getContent(); if (lastBookContent.length() > 42) { lastBookContent = lastBookContent.substring(0, 42); } @@ -152,7 +143,9 @@ public class BookController extends BaseController { * 分页查询书籍评论列表 */ @GetMapping("listCommentByPage") - public RestResult> listCommentByPage(@RequestParam("bookId") Long bookId, @RequestParam(value = "curr", defaultValue = "1") int page, @RequestParam(value = "limit", defaultValue = "5") int pageSize) { + public RestResult> listCommentByPage(@RequestParam("bookId") Long bookId, + @RequestParam(value = "curr", defaultValue = "1") int page, + @RequestParam(value = "limit", defaultValue = "5") int pageSize) { return RestResult.ok(bookService.listCommentByPage(null, bookId, page, pageSize)); } @@ -181,7 +174,10 @@ public class BookController extends BaseController { * 目录页 */ @GetMapping("/queryIndexList") - public RestResult> indexList(Long bookId, @RequestParam(value = "curr", defaultValue = "1") int page, @RequestParam(value = "limit", defaultValue = "5") int pageSize, @RequestParam(value = "orderBy", defaultValue = "index_num desc") String orderBy) { + public RestResult> indexList(Long bookId, + @RequestParam(value = "curr", defaultValue = "1") int page, + @RequestParam(value = "limit", defaultValue = "5") int pageSize, + @RequestParam(value = "orderBy", defaultValue = "index_num desc") String orderBy) { return RestResult.ok(PageBuilder.build(bookService.queryIndexList(bookId, orderBy, page, pageSize))); } diff --git a/novel-front/src/main/java/com/java2nb/novel/page/PageController.java b/novel-front/src/main/java/com/java2nb/novel/controller/PageController.java similarity index 83% rename from novel-front/src/main/java/com/java2nb/novel/page/PageController.java rename to novel-front/src/main/java/com/java2nb/novel/controller/PageController.java index 873624a..f32f6d6 100644 --- a/novel-front/src/main/java/com/java2nb/novel/page/PageController.java +++ b/novel-front/src/main/java/com/java2nb/novel/controller/PageController.java @@ -1,6 +1,5 @@ -package com.java2nb.novel.page; +package com.java2nb.novel.controller; -import com.java2nb.novel.controller.BaseController; import com.java2nb.novel.core.bean.UserDetails; import com.java2nb.novel.core.utils.ThreadLocalUtil; import com.java2nb.novel.entity.*; @@ -12,15 +11,12 @@ import lombok.RequiredArgsConstructor; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.Serializable; import java.util.List; import java.util.Map; import java.util.concurrent.CompletableFuture; @@ -34,9 +30,6 @@ import java.util.concurrent.ThreadPoolExecutor; @Controller public class PageController extends BaseController { - @Value("${content.save.path}") - private String fileSavePath; - private final BookService bookService; private final NewsService newsService; @@ -55,7 +48,8 @@ public class PageController extends BaseController { } @RequestMapping("{module}/{url}.html") - public String module2(@PathVariable("module") String module, @PathVariable("url") String url, HttpServletRequest request) { + public String module2(@PathVariable("module") String module, @PathVariable("url") String url, + HttpServletRequest request) { if (request.getRequestURI().startsWith("/author")) { //访问作者专区 @@ -75,7 +69,8 @@ public class PageController extends BaseController { } @RequestMapping("{module}/{classify}/{url}.html") - public String module3(@PathVariable("module") String module, @PathVariable("classify") String classify, @PathVariable("url") String url) { + public String module3(@PathVariable("module") String module, @PathVariable("classify") String classify, + @PathVariable("url") String url) { return module + "/" + classify + "/" + url; } @@ -86,9 +81,11 @@ public class PageController extends BaseController { @RequestMapping(path = {"/", "/index", "/index.html"}) public String index(Model model) { //加载小说首页小说基本信息线程 - CompletableFuture>> bookCompletableFuture = CompletableFuture.supplyAsync(bookService::listBookSettingVO, threadPoolExecutor); + CompletableFuture>> bookCompletableFuture = CompletableFuture.supplyAsync( + bookService::listBookSettingVO, threadPoolExecutor); //加载首页新闻线程 - CompletableFuture> newsCompletableFuture = CompletableFuture.supplyAsync(newsService::listIndexNews, threadPoolExecutor); + CompletableFuture> newsCompletableFuture = CompletableFuture.supplyAsync(newsService::listIndexNews, + threadPoolExecutor); model.addAttribute("bookMap", bookCompletableFuture.get()); model.addAttribute("newsList", newsCompletableFuture.get()); return ThreadLocalUtil.getTemplateDir() + "index"; @@ -126,11 +123,12 @@ public class PageController extends BaseController { return book; }, threadPoolExecutor); //加载小说评论列表线程 - CompletableFuture> bookCommentPageBeanCompletableFuture = CompletableFuture.supplyAsync(() -> { - PageBean bookCommentVOPageBean = bookService.listCommentByPage(null, bookId, 1, 5); - log.debug("加载小说评论列表线程结束"); - return bookCommentVOPageBean; - }, threadPoolExecutor); + CompletableFuture> bookCommentPageBeanCompletableFuture = CompletableFuture.supplyAsync( + () -> { + PageBean bookCommentVOPageBean = bookService.listCommentByPage(null, bookId, 1, 5); + log.debug("加载小说评论列表线程结束"); + return bookCommentVOPageBean; + }, threadPoolExecutor); //加载小说首章信息线程,该线程在加载小说基本信息线程执行完毕后才执行 CompletableFuture firstBookIndexIdCompletableFuture = bookCompletableFuture.thenApplyAsync((book) -> { if (book.getLastIndexId() != null) { @@ -148,7 +146,6 @@ public class PageController extends BaseController { return books; }, threadPoolExecutor); - model.addAttribute("book", bookCompletableFuture.get()); model.addAttribute("firstBookIndexId", firstBookIndexIdCompletableFuture.get()); model.addAttribute("recBooks", recBookCompletableFuture.get()); @@ -176,7 +173,8 @@ public class PageController extends BaseController { */ @SneakyThrows @RequestMapping("/book/{bookId}/{bookIndexId}.html") - public String bookContent(@PathVariable("bookId") Long bookId, @PathVariable("bookIndexId") Long bookIndexId, HttpServletRequest request, Model model) { + public String bookContent(@PathVariable("bookId") Long bookId, @PathVariable("bookIndexId") Long bookIndexId, + HttpServletRequest request, Model model) { //加载小说基本信息线程 CompletableFuture bookCompletableFuture = CompletableFuture.supplyAsync(() -> { //查询书籍 @@ -194,29 +192,32 @@ public class PageController extends BaseController { }, threadPoolExecutor); //加载小说上一章节信息线程,该线程在加载小说章节信息线程执行完毕后才执行 - CompletableFuture preBookIndexIdCompletableFuture = bookIndexCompletableFuture.thenApplyAsync((bookIndex) -> { - //查询上一章节目录ID - Long preBookIndexId = bookService.queryPreBookIndexId(bookId, bookIndex.getIndexNum()); - log.debug("加载小说上一章节信息线程结束"); - return preBookIndexId; - }, threadPoolExecutor); + CompletableFuture preBookIndexIdCompletableFuture = bookIndexCompletableFuture.thenApplyAsync( + (bookIndex) -> { + //查询上一章节目录ID + Long preBookIndexId = bookService.queryPreBookIndexId(bookId, bookIndex.getIndexNum()); + log.debug("加载小说上一章节信息线程结束"); + return preBookIndexId; + }, threadPoolExecutor); //加载小说下一章节信息线程,该线程在加载小说章节信息线程执行完毕后才执行 - CompletableFuture nextBookIndexIdCompletableFuture = bookIndexCompletableFuture.thenApplyAsync((bookIndex) -> { - //查询下一章目录ID - Long nextBookIndexId = bookService.queryNextBookIndexId(bookId, bookIndex.getIndexNum()); - log.debug("加载小说下一章节信息线程结束"); - return nextBookIndexId; - }, threadPoolExecutor); + CompletableFuture nextBookIndexIdCompletableFuture = bookIndexCompletableFuture.thenApplyAsync( + (bookIndex) -> { + //查询下一章目录ID + Long nextBookIndexId = bookService.queryNextBookIndexId(bookId, bookIndex.getIndexNum()); + log.debug("加载小说下一章节信息线程结束"); + return nextBookIndexId; + }, threadPoolExecutor); //加载小说内容信息线程,该线程在加载小说章节信息线程执行完毕后才执行 - CompletableFuture bookContentCompletableFuture = bookIndexCompletableFuture.thenApplyAsync((bookIndex) -> { - //查询内容 - BookContent bookContent = bookContentServiceMap.get(bookIndex.getStorageType()).queryBookContent(bookId, bookIndexId); - log.debug("加载小说内容信息线程结束"); - return bookContent; - }, threadPoolExecutor); - + CompletableFuture bookContentCompletableFuture = bookIndexCompletableFuture.thenApplyAsync( + (bookIndex) -> { + //查询内容 + BookContent bookContent = bookContentServiceMap.get(bookIndex.getStorageType()) + .queryBookContent(bookId, bookIndexId); + log.debug("加载小说内容信息线程结束"); + return bookContent; + }, threadPoolExecutor); //判断用户是否需要购买线程,该线程在加载小说章节信息线程执行完毕后才执行 CompletableFuture needBuyCompletableFuture = bookIndexCompletableFuture.thenApplyAsync((bookIndex) -> { @@ -241,7 +242,6 @@ public class PageController extends BaseController { }, threadPoolExecutor); - model.addAttribute("book", bookCompletableFuture.get()); model.addAttribute("bookIndex", bookIndexCompletableFuture.get()); model.addAttribute("preBookIndexId", preBookIndexIdCompletableFuture.get()); diff --git a/novel-front/src/main/java/com/java2nb/novel/core/config/EsConfig.java b/novel-front/src/main/java/com/java2nb/novel/core/config/EsConfig.java deleted file mode 100644 index f70da08..0000000 --- a/novel-front/src/main/java/com/java2nb/novel/core/config/EsConfig.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.java2nb.novel.core.config; - - -import org.apache.http.HttpHost; -import org.elasticsearch.client.RestClient; -import org.elasticsearch.client.RestHighLevelClient; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -/** - * elasticsearch搜索引擎配置 - * @author xiongxiaoyang - */ -@Configuration -@ConditionalOnProperty(prefix = "spring.elasticsearch", name = "enable", havingValue = "1") -public class EsConfig { - - @Value("${spring.elasticsearch.jest.uris}") - private String esUris; - - @Bean - public RestHighLevelClient esClient(){ - - - String[] uris = esUris.split(","); - HttpHost[] hosts = new HttpHost[uris.length]; - for(int i = 0 ; i < uris.length ; i++){ - String uri = uris[i]; - String scheme = uri.substring(0,uri.indexOf(":")).trim(); - String hostname = uri.substring(uri.indexOf("://")+3,uri.lastIndexOf(":")).trim(); - int port = Integer.parseInt(uri.substring(uri.lastIndexOf(":")+1).trim()); - hosts[i] = new HttpHost(hostname,port,scheme); - } - - return new RestHighLevelClient( - RestClient.builder(hosts)); - - } -} diff --git a/novel-front/src/main/java/com/java2nb/novel/core/config/RabbitConfig.java b/novel-front/src/main/java/com/java2nb/novel/core/config/RabbitConfig.java deleted file mode 100644 index 2e86481..0000000 --- a/novel-front/src/main/java/com/java2nb/novel/core/config/RabbitConfig.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.java2nb.novel.core.config; - -import org.springframework.amqp.core.*; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -/** - * @author 11797 - */ -@Configuration -@ConditionalOnProperty(prefix = "spring.rabbitmq", name = "enable", havingValue = "1") -public class RabbitConfig { - - - /** - * 更新数据库队列 - */ - @Bean - public Queue updateDbQueue() { - return new Queue("UPDATE-DB-QUEUE", true); - } - - /** - * 更新数据库队列 - */ - @Bean - public Queue updateEsQueue() { - return new Queue("UPDATE-ES-QUEUE", true); - } - - - /** - * 增加点击量交换机 - */ - @Bean - public FanoutExchange addVisitExchange() { - return new FanoutExchange("ADD-BOOK-VISIT-EXCHANGE"); - } - - /** - * 更新搜索引擎队列绑定到增加点击量交换机中 - */ - @Bean - public Binding updateEsBinding() { - - return BindingBuilder.bind(updateEsQueue()).to(addVisitExchange()); - } - - /** - * 更新数据库绑定到增加点击量交换机中 - */ - @Bean - public Binding updateDbBinding() { - return BindingBuilder.bind(updateDbQueue()).to(addVisitExchange()); - } - - -} diff --git a/novel-front/src/main/java/com/java2nb/novel/core/listener/BookVisitAddListener.java b/novel-front/src/main/java/com/java2nb/novel/core/listener/BookVisitAddListener.java deleted file mode 100644 index 0281757..0000000 --- a/novel-front/src/main/java/com/java2nb/novel/core/listener/BookVisitAddListener.java +++ /dev/null @@ -1,107 +0,0 @@ -package com.java2nb.novel.core.listener; - -import com.java2nb.novel.core.cache.CacheKey; -import com.java2nb.novel.core.cache.CacheService; -import com.java2nb.novel.core.utils.Constants; -import com.java2nb.novel.entity.Book; -import com.java2nb.novel.service.BookService; -import com.java2nb.novel.service.SearchService; -import com.java2nb.novel.vo.EsBookVO; -import com.rabbitmq.client.Channel; -import io.searchbox.client.JestClient; -import io.searchbox.core.Index; -import lombok.RequiredArgsConstructor; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; -import org.springframework.amqp.core.Message; -import org.springframework.beans.BeanUtils; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.stereotype.Component; -import org.springframework.amqp.rabbit.annotation.RabbitListener; - - -import java.text.SimpleDateFormat; - - -/** - * @author 11797 - */ -@Component -@Slf4j -@RequiredArgsConstructor -@ConditionalOnProperty(prefix = "spring.rabbitmq", name = "enable", havingValue = "1") -public class BookVisitAddListener { - - private final BookService bookService; - - private final CacheService cacheService; - - private final SearchService searchService; - - // private final RedissonClient redissonClient; - - - - - /** - * 更新数据库 - * 流量削峰,每本小说累积10个点击更新一次 - */ - @SneakyThrows - @RabbitListener(queues = {"UPDATE-DB-QUEUE"}) - public void updateDb(Long bookId, Channel channel, Message message) { - - log.debug("收到更新数据库消息:" + bookId); - Thread.sleep(1000 * 2); - //TODO 操作共享资源visitCount,集群环境下有线程安全问题,引入Redisson框架实现分布式锁 - //RLock lock = redissonClient.getLock("visitCount"); - //lock.lock(); - - - //目前visitCount不重要,数据可丢失,暂不实现分布式锁 - 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); - } - - //TODO 操作共享资源visitCount,集群环境下有线程安全问题,引入Redisson框架实现分布式锁 - //lock.unlock(); - - - - } - - /** - * 更新搜索引擎 - * 流量削峰,每本小说1个小时更新一次 - */ - @RabbitListener(queues = {"UPDATE-ES-QUEUE"}) - public void updateEs(Long bookId, Channel channel, Message message) { - - log.debug("收到更新搜索引擎消息:" + bookId); - if (cacheService.get(CacheKey.ES_IS_UPDATE_VISIT + bookId) == null) { - cacheService.set(CacheKey.ES_IS_UPDATE_VISIT + bookId, "1", 60 * 60); - try { - Thread.sleep(1000 * 5); - Book book = bookService.queryBookDetail(bookId); - searchService.importToEs(book); - }catch (Exception e){ - cacheService.del(CacheKey.ES_IS_UPDATE_VISIT + bookId); - log.error("更新搜索引擎失败"+bookId); - } - - - - - } - - - } - - -} diff --git a/novel-front/src/main/java/com/java2nb/novel/core/schedule/BookToEsSchedule.java b/novel-front/src/main/java/com/java2nb/novel/core/schedule/BookToEsSchedule.java deleted file mode 100644 index 8300e2b..0000000 --- a/novel-front/src/main/java/com/java2nb/novel/core/schedule/BookToEsSchedule.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.java2nb.novel.core.schedule; - -import com.java2nb.novel.core.cache.CacheKey; -import com.java2nb.novel.core.cache.CacheService; -import com.java2nb.novel.entity.Book; -import com.java2nb.novel.service.BookService; -import com.java2nb.novel.service.SearchService; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.scheduling.annotation.Scheduled; -import org.springframework.stereotype.Service; - -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.List; - -/** - * 小说导入搜索引擎 - * - * @author Administrator - */ -@ConditionalOnProperty(prefix = "spring.elasticsearch", name = "enable", havingValue = "1") -@Service -@RequiredArgsConstructor -@Slf4j -public class BookToEsSchedule { - - private final BookService bookService; - - private final CacheService cacheService; - - - - private final SearchService searchService; - - - /** - * 1分钟导入一次 - */ - @Scheduled(fixedRate = 1000 * 60) - public void saveToEs() { - //TODO 引入Redisson框架实现分布式锁 - //可以重复更新,只是效率可能略有降低,所以暂不实现分布式锁 - if (cacheService.get(CacheKey.ES_TRANS_LOCK) == null) { - cacheService.set(CacheKey.ES_TRANS_LOCK, "1", 60 * 20); - try { - //查询需要更新的小说 - Date lastDate = (Date) cacheService.getObject(CacheKey.ES_LAST_UPDATE_TIME); - if (lastDate == null) { - lastDate = new SimpleDateFormat("yyyy-MM-dd").parse("2020-01-01"); - } - - - List books = bookService.queryBookByUpdateTimeByPage(lastDate, 100); - for (Book book : books) { - searchService.importToEs(book); - lastDate = book.getUpdateTime(); - Thread.sleep(5000); - - } - - cacheService.setObject(CacheKey.ES_LAST_UPDATE_TIME, lastDate); - - } catch (Exception e) { - log.error(e.getMessage(), e); - } - cacheService.del(CacheKey.ES_TRANS_LOCK); - - - } - - - } - - -} diff --git a/novel-front/src/main/java/com/java2nb/novel/service/SearchService.java b/novel-front/src/main/java/com/java2nb/novel/service/SearchService.java deleted file mode 100644 index 1454ab6..0000000 --- a/novel-front/src/main/java/com/java2nb/novel/service/SearchService.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.java2nb.novel.service; - - -import com.java2nb.novel.entity.Book; -import com.java2nb.novel.vo.BookSpVO; -import com.java2nb.novel.vo.EsBookVO; - -/** - * @author 11797 - */ -public interface SearchService { - - /** - * 导入到es - * @param book 小说数据 - */ - void importToEs(Book book); - - /** - * 搜索 - * @param params 搜索参数 - * @param page 当前页码 - * @param pageSize 每页大小 - * @return 分页信息 - */ - io.github.xxyopen.model.page.PageBean searchBook(BookSpVO params, int page, int pageSize); -} 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 cf8a750..b699ccf 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 @@ -6,7 +6,6 @@ import com.java2nb.novel.core.cache.CacheKey; import com.java2nb.novel.core.cache.CacheService; import com.java2nb.novel.core.config.BookPriceProperties; import com.java2nb.novel.core.enums.ResponseStatus; -import io.github.xxyopen.web.util.BeanUtil; import com.java2nb.novel.core.utils.Constants; import com.java2nb.novel.core.utils.StringUtil; import com.java2nb.novel.entity.Book; @@ -15,7 +14,6 @@ import com.java2nb.novel.mapper.*; import com.java2nb.novel.service.AuthorService; import com.java2nb.novel.service.BookService; import com.java2nb.novel.service.FileService; -import com.java2nb.novel.service.SearchService; import com.java2nb.novel.vo.BookCommentVO; import com.java2nb.novel.vo.BookSettingVO; import com.java2nb.novel.vo.BookSpVO; @@ -24,6 +22,7 @@ import io.github.xxyopen.model.page.PageBean; import io.github.xxyopen.model.page.builder.pagehelper.PageBuilder; import io.github.xxyopen.util.IdWorker; import io.github.xxyopen.web.exception.BusinessException; +import io.github.xxyopen.web.util.BeanUtil; import lombok.RequiredArgsConstructor; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; @@ -68,9 +67,6 @@ public class BookServiceImpl implements BookService { @Value("${pic.save.path}") private String picSavePath; - @Value("${spring.elasticsearch.enable}") - private Integer esEnable; - private final FrontBookSettingMapper bookSettingMapper; private final FrontBookMapper bookMapper; @@ -89,8 +85,6 @@ public class BookServiceImpl implements BookService { private final AuthorService authorService; - private final SearchService searchService; - private final FileService fileService; private final BookPriceProperties bookPriceConfig; @@ -108,7 +102,8 @@ public class BookServiceImpl implements BookService { //如果首页小说没有被设置,则初始化首页小说设置 list = initIndexBookSetting(); } - result = new ObjectMapper().writeValueAsString(list.stream().collect(Collectors.groupingBy(BookSettingVO::getType))); + result = new ObjectMapper().writeValueAsString( + list.stream().collect(Collectors.groupingBy(BookSettingVO::getType))); cacheService.set(CacheKey.INDEX_BOOK_SETTINGS_KEY, result); } return new ObjectMapper().readValue(result, Map.class); @@ -194,7 +189,6 @@ public class BookServiceImpl implements BookService { @Override public PageBean searchByPage(BookSpVO params, int page, int pageSize) { - if (params.getUpdatePeriod() != null) { long cur = System.currentTimeMillis(); long period = params.getUpdatePeriod() * 24 * 3600 * 1000; @@ -202,18 +196,6 @@ public class BookServiceImpl implements BookService { params.setUpdateTimeMin(new Date(time)); } - if (esEnable == 1) { - - - try { - return searchService.searchBook(params,page,pageSize); - - }catch (Exception e){ - log.error(e.getMessage(),e); - } - - - } PageHelper.startPage(page, pageSize); if (StringUtils.isNotBlank(params.getSort())) { @@ -225,21 +207,22 @@ public class BookServiceImpl implements BookService { @Override public List listBookCategory() { - SelectStatementProvider selectStatementProvider = select(BookCategoryDynamicSqlSupport.id, BookCategoryDynamicSqlSupport.name, BookCategoryDynamicSqlSupport.workDirection) - .from(bookCategory) - .orderBy(BookCategoryDynamicSqlSupport.sort) - .build() - .render(RenderingStrategies.MYBATIS3); + SelectStatementProvider selectStatementProvider = select(BookCategoryDynamicSqlSupport.id, + BookCategoryDynamicSqlSupport.name, BookCategoryDynamicSqlSupport.workDirection) + .from(bookCategory) + .orderBy(BookCategoryDynamicSqlSupport.sort) + .build() + .render(RenderingStrategies.MYBATIS3); return bookCategoryMapper.selectMany(selectStatementProvider); } @Override public Book queryBookDetail(Long bookId) { SelectStatementProvider selectStatement = select(book.allColumns()) - .from(book) - .where(id, isEqualTo(bookId)) - .build() - .render(RenderingStrategies.MYBATIS3); + .from(book) + .where(id, isEqualTo(bookId)) + .build() + .render(RenderingStrategies.MYBATIS3); return bookMapper.selectMany(selectStatement).get(0); } @@ -252,11 +235,14 @@ public class BookServiceImpl implements BookService { PageHelper.startPage(page, pageSize); } - SelectStatementProvider selectStatement = select(BookIndexDynamicSqlSupport.id, BookIndexDynamicSqlSupport.bookId, BookIndexDynamicSqlSupport.indexNum, BookIndexDynamicSqlSupport.indexName, BookIndexDynamicSqlSupport.updateTime, BookIndexDynamicSqlSupport.isVip) - .from(bookIndex) - .where(BookIndexDynamicSqlSupport.bookId, isEqualTo(bookId)) - .build() - .render(RenderingStrategies.MYBATIS3); + SelectStatementProvider selectStatement = select(BookIndexDynamicSqlSupport.id, + BookIndexDynamicSqlSupport.bookId, BookIndexDynamicSqlSupport.indexNum, + BookIndexDynamicSqlSupport.indexName, BookIndexDynamicSqlSupport.updateTime, + BookIndexDynamicSqlSupport.isVip) + .from(bookIndex) + .where(BookIndexDynamicSqlSupport.bookId, isEqualTo(bookId)) + .build() + .render(RenderingStrategies.MYBATIS3); return bookIndexMapper.selectMany(selectStatement); } @@ -264,24 +250,28 @@ 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,BookIndexDynamicSqlSupport.storageType) - .from(bookIndex) - .where(BookIndexDynamicSqlSupport.id, isEqualTo(bookIndexId)) - .build() - .render(RenderingStrategies.MYBATIS3); + 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() + .render(RenderingStrategies.MYBATIS3); return bookIndexMapper.selectMany(selectStatement).get(0); } @Override public Long queryPreBookIndexId(Long bookId, Integer indexNum) { SelectStatementProvider selectStatement = select(BookIndexDynamicSqlSupport.id) - .from(bookIndex) - .where(BookIndexDynamicSqlSupport.bookId, isEqualTo(bookId)) - .and(BookIndexDynamicSqlSupport.indexNum, isLessThan(indexNum)) - .orderBy(BookIndexDynamicSqlSupport.indexNum.descending()) - .limit(1) - .build() - .render(RenderingStrategies.MYBATIS3); + .from(bookIndex) + .where(BookIndexDynamicSqlSupport.bookId, isEqualTo(bookId)) + .and(BookIndexDynamicSqlSupport.indexNum, isLessThan(indexNum)) + .orderBy(BookIndexDynamicSqlSupport.indexNum.descending()) + .limit(1) + .build() + .render(RenderingStrategies.MYBATIS3); List list = bookIndexMapper.selectMany(selectStatement); if (list.size() == 0) { return 0L; @@ -293,13 +283,13 @@ public class BookServiceImpl implements BookService { @Override public Long queryNextBookIndexId(Long bookId, Integer indexNum) { SelectStatementProvider selectStatement = select(BookIndexDynamicSqlSupport.id) - .from(bookIndex) - .where(BookIndexDynamicSqlSupport.bookId, isEqualTo(bookId)) - .and(BookIndexDynamicSqlSupport.indexNum, isGreaterThan(indexNum)) - .orderBy(BookIndexDynamicSqlSupport.indexNum) - .limit(1) - .build() - .render(RenderingStrategies.MYBATIS3); + .from(bookIndex) + .where(BookIndexDynamicSqlSupport.bookId, isEqualTo(bookId)) + .and(BookIndexDynamicSqlSupport.indexNum, isGreaterThan(indexNum)) + .orderBy(BookIndexDynamicSqlSupport.indexNum) + .limit(1) + .build() + .render(RenderingStrategies.MYBATIS3); List list = bookIndexMapper.selectMany(selectStatement); if (list.size() == 0) { return 0L; @@ -310,12 +300,13 @@ public class BookServiceImpl implements BookService { @Override public BookContent queryBookContent(Long bookIndexId) { - SelectStatementProvider selectStatement = select(BookContentDynamicSqlSupport.id, BookContentDynamicSqlSupport.content) - .from(bookContent) - .where(BookContentDynamicSqlSupport.indexId, isEqualTo(bookIndexId)) - .limit(1) - .build() - .render(RenderingStrategies.MYBATIS3); + SelectStatementProvider selectStatement = select(BookContentDynamicSqlSupport.id, + BookContentDynamicSqlSupport.content) + .from(bookContent) + .where(BookContentDynamicSqlSupport.indexId, isEqualTo(bookIndexId)) + .limit(1) + .build() + .render(RenderingStrategies.MYBATIS3); return bookContentMapper.selectMany(selectStatement).get(0); } @@ -342,29 +333,30 @@ public class BookServiceImpl implements BookService { break; } } - SelectStatementProvider selectStatement = select(id, catId, catName, bookName, lastIndexId, lastIndexName, authorId, authorName, picUrl, bookDesc, wordCount, lastIndexUpdateTime) - .from(book) - .where(wordCount, isGreaterThan(0)) - .orderBy(sortSpecification) - .limit(limit) - .build() - .render(RenderingStrategies.MYBATIS3); + SelectStatementProvider selectStatement = select(id, catId, catName, bookName, lastIndexId, lastIndexName, + authorId, authorName, picUrl, bookDesc, wordCount, lastIndexUpdateTime) + .from(book) + .where(wordCount, isGreaterThan(0)) + .orderBy(sortSpecification) + .limit(limit) + .build() + .render(RenderingStrategies.MYBATIS3); return bookMapper.selectMany(selectStatement); } @Override public void addVisitCount(Long bookId, Integer visitCount) { - bookMapper.addVisitCount(bookId,visitCount); + bookMapper.addVisitCount(bookId, visitCount); } @Override public long queryIndexCount(Long bookId) { SelectStatementProvider selectStatement = select(count(BookIndexDynamicSqlSupport.id)) - .from(bookIndex) - .where(BookIndexDynamicSqlSupport.bookId, isEqualTo(bookId)) - .build() - .render(RenderingStrategies.MYBATIS3); + .from(bookIndex) + .where(BookIndexDynamicSqlSupport.bookId, isEqualTo(bookId)) + .build() + .render(RenderingStrategies.MYBATIS3); return bookIndexMapper.count(selectStatement); } @@ -377,12 +369,12 @@ public class BookServiceImpl implements BookService { @Override public Long queryFirstBookIndexId(Long bookId) { SelectStatementProvider selectStatement = select(BookIndexDynamicSqlSupport.id) - .from(bookIndex) - .where(BookIndexDynamicSqlSupport.bookId, isEqualTo(bookId)) - .orderBy(BookIndexDynamicSqlSupport.indexNum) - .limit(1) - .build() - .render(RenderingStrategies.MYBATIS3); + .from(bookIndex) + .where(BookIndexDynamicSqlSupport.bookId, isEqualTo(bookId)) + .orderBy(BookIndexDynamicSqlSupport.indexNum) + .limit(1) + .build() + .render(RenderingStrategies.MYBATIS3); return bookIndexMapper.selectMany(selectStatement).get(0).getId(); } @@ -398,11 +390,11 @@ public class BookServiceImpl implements BookService { public void addBookComment(Long userId, BookComment comment) { //判断该用户是否已评论过该书籍 SelectStatementProvider selectStatement = select(count(BookCommentDynamicSqlSupport.id)) - .from(bookComment) - .where(BookCommentDynamicSqlSupport.createUserId, isEqualTo(userId)) - .and(BookCommentDynamicSqlSupport.bookId, isEqualTo(comment.getBookId())) - .build() - .render(RenderingStrategies.MYBATIS3); + .from(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); } @@ -419,10 +411,10 @@ public class BookServiceImpl implements BookService { public Long getOrCreateAuthorIdByName(String authorName, Byte workDirection) { Long authorId; SelectStatementProvider selectStatement = select(BookAuthorDynamicSqlSupport.id) - .from(BookAuthorDynamicSqlSupport.bookAuthor) - .where(BookAuthorDynamicSqlSupport.penName, isEqualTo(authorName)) - .build() - .render(RenderingStrategies.MYBATIS3); + .from(BookAuthorDynamicSqlSupport.bookAuthor) + .where(BookAuthorDynamicSqlSupport.penName, isEqualTo(authorName)) + .build() + .render(RenderingStrategies.MYBATIS3); List bookAuthors = bookAuthorMapper.selectMany(selectStatement); if (bookAuthors.size() > 0) { //作者存在 @@ -451,11 +443,11 @@ public class BookServiceImpl implements BookService { public Long queryIdByNameAndAuthor(String bookName, String author) { //查询小说ID SelectStatementProvider selectStatement = select(id) - .from(book) - .where(BookDynamicSqlSupport.bookName, isEqualTo(bookName)) - .and(BookDynamicSqlSupport.authorName, isEqualTo(authorName)) - .build() - .render(RenderingStrategies.MYBATIS3); + .from(book) + .where(BookDynamicSqlSupport.bookName, isEqualTo(bookName)) + .and(BookDynamicSqlSupport.authorName, isEqualTo(authorName)) + .build() + .render(RenderingStrategies.MYBATIS3); List books = bookMapper.selectMany(selectStatement); if (books.size() > 0) { return books.get(0).getId(); @@ -466,17 +458,18 @@ public class BookServiceImpl implements BookService { @Override public List queryIndexNumByBookId(Long bookId) { SelectStatementProvider selectStatement = select(BookIndexDynamicSqlSupport.indexNum) - .from(BookIndexDynamicSqlSupport.bookIndex) - .where(BookIndexDynamicSqlSupport.bookId, isEqualTo(bookId)) - .build() - .render(RenderingStrategies.MYBATIS3); + .from(BookIndexDynamicSqlSupport.bookIndex) + .where(BookIndexDynamicSqlSupport.bookId, isEqualTo(bookId)) + .build() + .render(RenderingStrategies.MYBATIS3); - return bookIndexMapper.selectMany(selectStatement).stream().map(BookIndex::getIndexNum).collect(Collectors.toList()); + return bookIndexMapper.selectMany(selectStatement).stream().map(BookIndex::getIndexNum) + .collect(Collectors.toList()); } @Override public List queryNetworkPicBooks(String localPicPrefix, Integer limit) { - return bookMapper.queryNetworkPicBooks(localPicPrefix,limit); + return bookMapper.queryNetworkPicBooks(localPicPrefix, limit); } @Override @@ -485,13 +478,13 @@ public class BookServiceImpl implements BookService { picUrl = fileService.transFile(picUrl, picSavePath); bookMapper.update(update(book) - .set(BookDynamicSqlSupport.picUrl) - .equalTo(picUrl) - .set(updateTime) - .equalTo(new Date()) - .where(id, isEqualTo(bookId)) - .build() - .render(RenderingStrategies.MYBATIS3)); + .set(BookDynamicSqlSupport.picUrl) + .equalTo(picUrl) + .set(updateTime) + .equalTo(new Date()) + .where(id, isEqualTo(bookId)) + .build() + .render(RenderingStrategies.MYBATIS3)); } @@ -501,12 +494,13 @@ public class BookServiceImpl implements BookService { Author author = authorService.queryAuthor(userId); PageHelper.startPage(page, pageSize); - SelectStatementProvider selectStatement = select(id, bookName, picUrl, catName, visitCount, yesterdayBuy, lastIndexUpdateTime, updateTime, wordCount, lastIndexName, status) - .from(book) - .where(authorId, isEqualTo(author.getId())) - .orderBy(BookDynamicSqlSupport.createTime.descending()) - .build() - .render(RenderingStrategies.MYBATIS3); + SelectStatementProvider selectStatement = select(id, bookName, picUrl, catName, visitCount, yesterdayBuy, + lastIndexUpdateTime, updateTime, wordCount, lastIndexName, status) + .from(book) + .where(authorId, isEqualTo(author.getId())) + .orderBy(BookDynamicSqlSupport.createTime.descending()) + .build() + .render(RenderingStrategies.MYBATIS3); return PageBuilder.build(bookMapper.selectMany(selectStatement)); } @@ -533,12 +527,12 @@ public class BookServiceImpl implements BookService { @Override public void updateBookStatus(Long bookId, Byte status, Long authorId) { bookMapper.update(update(book) - .set(BookDynamicSqlSupport.status) - .equalTo(status) - .where(id, isEqualTo(bookId)) - .and(BookDynamicSqlSupport.authorId, isEqualTo(authorId)) - .build() - .render(RenderingStrategies.MYBATIS3)); + .set(BookDynamicSqlSupport.status) + .equalTo(status) + .where(id, isEqualTo(bookId)) + .and(BookDynamicSqlSupport.authorId, isEqualTo(authorId)) + .build() + .render(RenderingStrategies.MYBATIS3)); } @Transactional(rollbackFor = Exception.class) @@ -556,21 +550,22 @@ public class BookServiceImpl implements BookService { //更新小说主表信息 bookMapper.update(update(BookDynamicSqlSupport.book) - .set(BookDynamicSqlSupport.lastIndexId) - .equalTo(lastIndexId) - .set(BookDynamicSqlSupport.lastIndexName) - .equalTo(indexName) - .set(BookDynamicSqlSupport.lastIndexUpdateTime) - .equalTo(currentDate) - .set(BookDynamicSqlSupport.wordCount) - .equalTo(book.getWordCount() + wordCount) - .where(id, isEqualTo(bookId)) - .and(BookDynamicSqlSupport.authorId, isEqualTo(authorId)) - .build() - .render(RenderingStrategies.MYBATIS3)); + .set(BookDynamicSqlSupport.lastIndexId) + .equalTo(lastIndexId) + .set(BookDynamicSqlSupport.lastIndexName) + .equalTo(indexName) + .set(BookDynamicSqlSupport.lastIndexUpdateTime) + .equalTo(currentDate) + .set(BookDynamicSqlSupport.wordCount) + .equalTo(book.getWordCount() + wordCount) + .where(id, isEqualTo(bookId)) + .and(BookDynamicSqlSupport.authorId, isEqualTo(authorId)) + .build() + .render(RenderingStrategies.MYBATIS3)); //计算价格 - int bookPrice = new BigDecimal(wordCount).multiply(bookPriceConfig.getValue()).divide(bookPriceConfig.getWordCount(),0, RoundingMode.DOWN).intValue(); + int bookPrice = new BigDecimal(wordCount).multiply(bookPriceConfig.getValue()) + .divide(bookPriceConfig.getWordCount(), 0, RoundingMode.DOWN).intValue(); //更新小说目录表 int indexNum = 0; @@ -599,27 +594,26 @@ public class BookServiceImpl implements BookService { } @Override - public List queryBookByUpdateTimeByPage(Date startDate, int limit) { - + public List queryBookByUpdateTimeByPage(Date startDate, int limit) { return bookMapper.selectMany(select(book.allColumns()) - .from(book) - .where(updateTime, isGreaterThan(startDate)) - .and(lastIndexId,isNotNull()) - .orderBy(updateTime) - .limit(limit) - .build() - .render(RenderingStrategies.MYBATIS3)); + .from(book) + .where(updateTime, isGreaterThan(startDate)) + .and(lastIndexId, isNotNull()) + .orderBy(updateTime) + .limit(limit) + .build() + .render(RenderingStrategies.MYBATIS3)); } @Override public List queryBookList(Long authorId) { return bookMapper.selectMany(select(id, bookName) - .from(book) - .where(BookDynamicSqlSupport.authorId,isEqualTo(authorId)) - .build() - .render(RenderingStrategies.MYBATIS3)); + .from(book) + .where(BookDynamicSqlSupport.authorId, isEqualTo(authorId)) + .build() + .render(RenderingStrategies.MYBATIS3)); } @Transactional(rollbackFor = Exception.class) @@ -628,20 +622,20 @@ public class BookServiceImpl implements BookService { //查询小说章节表信息 List bookIndices = bookIndexMapper.selectMany( - select(BookIndexDynamicSqlSupport.bookId, BookIndexDynamicSqlSupport.wordCount) - .from(bookIndex) - .where(BookIndexDynamicSqlSupport.id, isEqualTo(indexId)).build().render(RenderingStrategies.MYBATIS3)); + select(BookIndexDynamicSqlSupport.bookId, BookIndexDynamicSqlSupport.wordCount) + .from(bookIndex) + .where(BookIndexDynamicSqlSupport.id, isEqualTo(indexId)).build().render(RenderingStrategies.MYBATIS3)); if (bookIndices.size() > 0) { BookIndex bookIndex = bookIndices.get(0); //获取小说ID Long bookId = bookIndex.getBookId(); //查询小说表信息 List books = bookMapper.selectMany( - select(wordCount, BookDynamicSqlSupport.authorId) - .from(book) - .where(id, isEqualTo(bookId)) - .build() - .render(RenderingStrategies.MYBATIS3)); + select(wordCount, BookDynamicSqlSupport.authorId) + .from(book) + .where(id, isEqualTo(bookId)) + .build() + .render(RenderingStrategies.MYBATIS3)); if (books.size() > 0) { Book book = books.get(0); int wordCount = book.getWordCount(); @@ -649,7 +643,8 @@ public class BookServiceImpl implements BookService { if (book.getAuthorId().equals(authorId)) { //删除目录表和内容表记录 bookIndexMapper.deleteByPrimaryKey(indexId); - bookContentMapper.delete(deleteFrom(bookContent).where(BookContentDynamicSqlSupport.indexId, isEqualTo(indexId)).build() + bookContentMapper.delete( + deleteFrom(bookContent).where(BookContentDynamicSqlSupport.indexId, isEqualTo(indexId)).build() .render(RenderingStrategies.MYBATIS3)); //更新总字数 wordCount = wordCount - bookIndex.getWordCount(); @@ -658,13 +653,14 @@ public class BookServiceImpl implements BookService { String lastIndexName = null; Date lastIndexUpdateTime = null; List lastBookIndices = bookIndexMapper.selectMany( - select(BookIndexDynamicSqlSupport.id, BookIndexDynamicSqlSupport.indexName, BookIndexDynamicSqlSupport.createTime) - .from(BookIndexDynamicSqlSupport.bookIndex) - .where(BookIndexDynamicSqlSupport.bookId, isEqualTo(bookId)) - .orderBy(BookIndexDynamicSqlSupport.indexNum.descending()) - .limit(1) - .build() - .render(RenderingStrategies.MYBATIS3)); + select(BookIndexDynamicSqlSupport.id, BookIndexDynamicSqlSupport.indexName, + BookIndexDynamicSqlSupport.createTime) + .from(BookIndexDynamicSqlSupport.bookIndex) + .where(BookIndexDynamicSqlSupport.bookId, isEqualTo(bookId)) + .orderBy(BookIndexDynamicSqlSupport.indexNum.descending()) + .limit(1) + .build() + .render(RenderingStrategies.MYBATIS3)); if (lastBookIndices.size() > 0) { BookIndex lastBookIndex = lastBookIndices.get(0); lastIndexId = lastBookIndex.getId(); @@ -674,19 +670,19 @@ public class BookServiceImpl implements BookService { } //更新小说主表信息 bookMapper.update(update(BookDynamicSqlSupport.book) - .set(BookDynamicSqlSupport.wordCount) - .equalTo(wordCount) - .set(updateTime) - .equalTo(new Date()) - .set(BookDynamicSqlSupport.lastIndexId) - .equalTo(lastIndexId) - .set(BookDynamicSqlSupport.lastIndexName) - .equalTo(lastIndexName) - .set(BookDynamicSqlSupport.lastIndexUpdateTime) - .equalTo(lastIndexUpdateTime) - .where(id, isEqualTo(bookId)) - .build() - .render(RenderingStrategies.MYBATIS3)); + .set(BookDynamicSqlSupport.wordCount) + .equalTo(wordCount) + .set(updateTime) + .equalTo(new Date()) + .set(BookDynamicSqlSupport.lastIndexId) + .equalTo(lastIndexId) + .set(BookDynamicSqlSupport.lastIndexName) + .equalTo(lastIndexName) + .set(BookDynamicSqlSupport.lastIndexUpdateTime) + .equalTo(lastIndexUpdateTime) + .where(id, isEqualTo(bookId)) + .build() + .render(RenderingStrategies.MYBATIS3)); } @@ -702,34 +698,34 @@ public class BookServiceImpl implements BookService { public void updateIndexName(Long indexId, String indexName, Long authorId) { //查询小说章节表信息 List bookIndices = bookIndexMapper.selectMany( - select(BookIndexDynamicSqlSupport.bookId, BookIndexDynamicSqlSupport.wordCount) - .from(bookIndex) - .where(BookIndexDynamicSqlSupport.id, isEqualTo(indexId)).build().render(RenderingStrategies.MYBATIS3)); + select(BookIndexDynamicSqlSupport.bookId, BookIndexDynamicSqlSupport.wordCount) + .from(bookIndex) + .where(BookIndexDynamicSqlSupport.id, isEqualTo(indexId)).build().render(RenderingStrategies.MYBATIS3)); if (bookIndices.size() > 0) { BookIndex bookIndex = bookIndices.get(0); //获取小说ID Long bookId = bookIndex.getBookId(); //查询小说表信息 List books = bookMapper.selectMany( - select(wordCount, BookDynamicSqlSupport.authorId) - .from(book) - .where(id, isEqualTo(bookId)) - .build() - .render(RenderingStrategies.MYBATIS3)); + select(wordCount, BookDynamicSqlSupport.authorId) + .from(book) + .where(id, isEqualTo(bookId)) + .build() + .render(RenderingStrategies.MYBATIS3)); if (books.size() > 0) { Book book = books.get(0); //作者ID相同,表明该小说是登录用户发布,可以修改 if (book.getAuthorId().equals(authorId)) { bookIndexMapper.update( - update(BookIndexDynamicSqlSupport.bookIndex) - .set(BookIndexDynamicSqlSupport.indexName) - .equalTo(indexName) - .set(BookIndexDynamicSqlSupport.updateTime) - .equalTo(new Date()) - .where(BookIndexDynamicSqlSupport.id, isEqualTo(indexId)) - .build() - .render(RenderingStrategies.MYBATIS3)); + update(BookIndexDynamicSqlSupport.bookIndex) + .set(BookIndexDynamicSqlSupport.indexName) + .equalTo(indexName) + .set(BookIndexDynamicSqlSupport.updateTime) + .equalTo(new Date()) + .where(BookIndexDynamicSqlSupport.id, isEqualTo(indexId)) + .build() + .render(RenderingStrategies.MYBATIS3)); } @@ -743,31 +739,31 @@ public class BookServiceImpl implements BookService { public String queryIndexContent(Long indexId, Long authorId) { //查询小说章节表信息 List bookIndices = bookIndexMapper.selectMany( - select(BookIndexDynamicSqlSupport.bookId, BookIndexDynamicSqlSupport.wordCount) - .from(bookIndex) - .where(BookIndexDynamicSqlSupport.id, isEqualTo(indexId)).build().render(RenderingStrategies.MYBATIS3)); + select(BookIndexDynamicSqlSupport.bookId, BookIndexDynamicSqlSupport.wordCount) + .from(bookIndex) + .where(BookIndexDynamicSqlSupport.id, isEqualTo(indexId)).build().render(RenderingStrategies.MYBATIS3)); if (bookIndices.size() > 0) { BookIndex bookIndex = bookIndices.get(0); //获取小说ID Long bookId = bookIndex.getBookId(); //查询小说表信息 List books = bookMapper.selectMany( - select(wordCount, BookDynamicSqlSupport.authorId) - .from(book) - .where(id, isEqualTo(bookId)) - .build() - .render(RenderingStrategies.MYBATIS3)); + select(wordCount, BookDynamicSqlSupport.authorId) + .from(book) + .where(id, isEqualTo(bookId)) + .build() + .render(RenderingStrategies.MYBATIS3)); if (books.size() > 0) { Book book = books.get(0); //作者ID相同,表明该小说是登录用户发布 if (book.getAuthorId().equals(authorId)) { return bookContentMapper.selectMany( select(content) - .from(bookContent) - .where(BookContentDynamicSqlSupport.indexId, isEqualTo(indexId)) - .limit(1) - .build().render(RenderingStrategies.MYBATIS3)) - .get(0).getContent(); + .from(bookContent) + .where(BookContentDynamicSqlSupport.indexId, isEqualTo(indexId)) + .limit(1) + .build().render(RenderingStrategies.MYBATIS3)) + .get(0).getContent(); } } @@ -781,20 +777,20 @@ public class BookServiceImpl implements BookService { //查询小说章节表信息 List bookIndices = bookIndexMapper.selectMany( - select(BookIndexDynamicSqlSupport.bookId, BookIndexDynamicSqlSupport.wordCount) - .from(bookIndex) - .where(BookIndexDynamicSqlSupport.id, isEqualTo(indexId)).build().render(RenderingStrategies.MYBATIS3)); + select(BookIndexDynamicSqlSupport.bookId, BookIndexDynamicSqlSupport.wordCount) + .from(bookIndex) + .where(BookIndexDynamicSqlSupport.id, isEqualTo(indexId)).build().render(RenderingStrategies.MYBATIS3)); if (bookIndices.size() > 0) { BookIndex bookIndex = bookIndices.get(0); //获取小说ID Long bookId = bookIndex.getBookId(); //查询小说表信息 List books = bookMapper.selectMany( - select(wordCount, BookDynamicSqlSupport.authorId) - .from(book) - .where(id, isEqualTo(bookId)) - .build() - .render(RenderingStrategies.MYBATIS3)); + select(wordCount, BookDynamicSqlSupport.authorId) + .from(book) + .where(id, isEqualTo(bookId)) + .build() + .render(RenderingStrategies.MYBATIS3)); if (books.size() > 0) { Book book = books.get(0); //作者ID相同,表明该小说是登录用户发布,可以修改 @@ -803,30 +799,30 @@ public class BookServiceImpl implements BookService { int wordCount = StringUtil.getStrValidWordCount(content); //计算价格 - int bookPrice = new BigDecimal(wordCount).multiply(bookPriceConfig.getValue()).divide(bookPriceConfig.getWordCount(),0,RoundingMode.DOWN).intValue(); - + int bookPrice = new BigDecimal(wordCount).multiply(bookPriceConfig.getValue()) + .divide(bookPriceConfig.getWordCount(), 0, RoundingMode.DOWN).intValue(); //更新小说目录表 bookIndexMapper.update( - update(BookIndexDynamicSqlSupport.bookIndex) - .set(BookIndexDynamicSqlSupport.indexName) - .equalTo(indexName) - .set(BookIndexDynamicSqlSupport.wordCount) - .equalTo(wordCount) - .set(BookIndexDynamicSqlSupport.bookPrice) - .equalTo(bookPrice) - .set(BookIndexDynamicSqlSupport.updateTime) - .equalTo(currentDate) - .where(BookIndexDynamicSqlSupport.id, isEqualTo(indexId)) - .build().render(RenderingStrategies.MYBATIS3)); + update(BookIndexDynamicSqlSupport.bookIndex) + .set(BookIndexDynamicSqlSupport.indexName) + .equalTo(indexName) + .set(BookIndexDynamicSqlSupport.wordCount) + .equalTo(wordCount) + .set(BookIndexDynamicSqlSupport.bookPrice) + .equalTo(bookPrice) + .set(BookIndexDynamicSqlSupport.updateTime) + .equalTo(currentDate) + .where(BookIndexDynamicSqlSupport.id, isEqualTo(indexId)) + .build().render(RenderingStrategies.MYBATIS3)); //更新小说内容表 bookContentMapper.update( - update(BookContentDynamicSqlSupport.bookContent) - .set(BookContentDynamicSqlSupport.content) - .equalTo(content) - .where(BookContentDynamicSqlSupport.indexId, isEqualTo(indexId)) - .build().render(RenderingStrategies.MYBATIS3)); + update(BookContentDynamicSqlSupport.bookContent) + .set(BookContentDynamicSqlSupport.content) + .equalTo(content) + .where(BookContentDynamicSqlSupport.indexId, isEqualTo(indexId)) + .build().render(RenderingStrategies.MYBATIS3)); } } @@ -837,14 +833,14 @@ public class BookServiceImpl implements BookService { @Override public void updateBookPic(Long bookId, String bookPic, Long authorId) { bookMapper.update(update(book) - .set(picUrl) - .equalTo(bookPic) - .set(updateTime) - .equalTo(new Date()) - .where(id, isEqualTo(bookId)) - .and(BookDynamicSqlSupport.authorId, isEqualTo(authorId)) - .build() - .render(RenderingStrategies.MYBATIS3)); + .set(picUrl) + .equalTo(bookPic) + .set(updateTime) + .equalTo(new Date()) + .where(id, isEqualTo(bookId)) + .and(BookDynamicSqlSupport.authorId, isEqualTo(authorId)) + .build() + .render(RenderingStrategies.MYBATIS3)); } diff --git a/novel-front/src/main/java/com/java2nb/novel/service/impl/SearchServiceImpl.java b/novel-front/src/main/java/com/java2nb/novel/service/impl/SearchServiceImpl.java deleted file mode 100644 index 33611cf..0000000 --- a/novel-front/src/main/java/com/java2nb/novel/service/impl/SearchServiceImpl.java +++ /dev/null @@ -1,208 +0,0 @@ -package com.java2nb.novel.service.impl; - -import com.fasterxml.jackson.databind.JavaType; -import com.fasterxml.jackson.databind.ObjectMapper; -import io.github.xxyopen.model.page.PageBean; -import com.java2nb.novel.core.enums.ResponseStatus; -import io.github.xxyopen.util.StringUtil; -import io.github.xxyopen.web.exception.BusinessException; -import com.java2nb.novel.entity.Book; -import com.java2nb.novel.vo.BookSpVO; -import com.java2nb.novel.service.SearchService; -import com.java2nb.novel.vo.EsBookVO; -import io.searchbox.client.JestClient; -import io.searchbox.core.Count; -import io.searchbox.core.CountResult; -import io.searchbox.core.Search; -import io.searchbox.core.SearchResult; -import lombok.RequiredArgsConstructor; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.elasticsearch.action.index.IndexRequest; -import org.elasticsearch.action.index.IndexResponse; -import org.elasticsearch.client.RequestOptions; -import org.elasticsearch.client.RestHighLevelClient; -import org.elasticsearch.common.xcontent.XContentType; -import org.elasticsearch.index.query.BoolQueryBuilder; -import org.elasticsearch.index.query.QueryBuilders; -import org.elasticsearch.search.builder.SearchSourceBuilder; -import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder; -import org.elasticsearch.search.sort.SortOrder; -import org.springframework.beans.BeanUtils; -import org.springframework.stereotype.Service; - -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -/** - * @author 11797 - */ -@Service -@RequiredArgsConstructor -@Slf4j -public class SearchServiceImpl implements SearchService { - - private final JestClient jestClient; - - private final RestHighLevelClient restHighLevelClient; - - private final String INDEX = "novel"; - - - @Override - @SneakyThrows - public void importToEs(Book book) { - //导入到ES - EsBookVO esBookVO = new EsBookVO(); - BeanUtils.copyProperties(book, esBookVO, "lastIndexUpdateTime"); - esBookVO.setLastIndexUpdateTime(new SimpleDateFormat("yyyy/MM/dd HH:mm").format(book.getLastIndexUpdateTime())); - - IndexRequest request = new IndexRequest(INDEX); - request.id(book.getId()+""); - request.source(new ObjectMapper().writeValueAsString(esBookVO), XContentType.JSON); - IndexResponse index = restHighLevelClient.index(request, RequestOptions.DEFAULT); - - log.debug(index.getResult().toString()); - - } - - @SneakyThrows - @Override - public PageBean searchBook(BookSpVO params, int page, int pageSize) { - List bookList = new ArrayList<>(0); - - //使用搜索引擎搜索 - BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); - // 构造查询哪个字段 - if (StringUtils.isNoneBlank(params.getKeyword())) { - boolQueryBuilder = boolQueryBuilder.must(QueryBuilders.queryStringQuery(params.getKeyword())); - } - - // 作品方向 - if (params.getWorkDirection() != null) { - boolQueryBuilder.filter(QueryBuilders.termQuery("workDirection", params.getWorkDirection())); - } - - // 分类 - if (params.getCatId() != null) { - boolQueryBuilder.filter(QueryBuilders.termQuery("catId", params.getCatId())); - } - if (params.getBookStatus() != null) { - boolQueryBuilder.filter(QueryBuilders.termQuery("bookStatus", params.getBookStatus())); - } - - if (params.getWordCountMin() == null) { - params.setWordCountMin(0); - } - if (params.getWordCountMax() == null) { - params.setWordCountMax(Integer.MAX_VALUE); - } - - boolQueryBuilder.filter(QueryBuilders.rangeQuery("wordCount").gte(params.getWordCountMin()).lte(params.getWordCountMax())); - - if (params.getUpdateTimeMin() != null) { - boolQueryBuilder.filter(QueryBuilders.rangeQuery("lastIndexUpdateTime").gte(new SimpleDateFormat("yyyy/MM/dd HH:mm").format(params.getUpdateTimeMin()))); - } - - - - SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); - searchSourceBuilder.query(boolQueryBuilder); - - - Count count = new Count.Builder().addIndex(INDEX) - .query(searchSourceBuilder.toString()).build(); - CountResult results = jestClient.execute(count); - Double total = results.getCount(); - - - // 高亮字段 - HighlightBuilder highlightBuilder = new HighlightBuilder(); - highlightBuilder.field("authorName"); - highlightBuilder.field("bookName"); - highlightBuilder.field("bookDesc"); - highlightBuilder.field("lastIndexName"); - highlightBuilder.field("catName"); - highlightBuilder.preTags("").postTags(""); - highlightBuilder.fragmentSize(20000); - searchSourceBuilder.highlighter(highlightBuilder); - - - //设置排序 - if (params.getSort() != null) { - searchSourceBuilder.sort(StringUtil.camelName(params.getSort()), SortOrder.DESC); - } - - // 设置分页 - searchSourceBuilder.from((page - 1) * pageSize); - searchSourceBuilder.size(pageSize); - - // 构建Search对象 - Search search = new Search.Builder(searchSourceBuilder.toString()).addIndex(INDEX).build(); - log.debug(search.toString()); - SearchResult result; - result = jestClient.execute(search); - log.debug(result.getJsonString()); - if (result.isSucceeded()) { - - Map resultMap = new ObjectMapper().readValue(result.getJsonString(), Map.class); - if (resultMap.get("hits") != null) { - Map hitsMap = (Map) resultMap.get("hits"); - if (hitsMap.size() > 0 && hitsMap.get("hits") != null) { - List hitsList = (List) hitsMap.get("hits"); - if (hitsList.size() > 0 && result.getSourceAsString() != null) { - - JavaType jt = new ObjectMapper().getTypeFactory().constructParametricType(ArrayList.class, EsBookVO.class); - bookList = new ObjectMapper().readValue("[" + result.getSourceAsString() + "]", jt); - - if (bookList != null) { - for (int i = 0; i < bookList.size(); i++) { - hitsMap = (Map) hitsList.get(i); - Map highlightMap = (Map) hitsMap.get("highlight"); - if (highlightMap != null && highlightMap.size() > 0) { - - List authorNameList = (List) highlightMap.get("authorName"); - if (authorNameList != null && authorNameList.size() > 0) { - bookList.get(i).setAuthorName(authorNameList.get(0)); - } - - List bookNameList = (List) highlightMap.get("bookName"); - if (bookNameList != null && bookNameList.size() > 0) { - bookList.get(i).setBookName(bookNameList.get(0)); - } - - List bookDescList = (List) highlightMap.get("bookDesc"); - if (bookDescList != null && bookDescList.size() > 0) { - bookList.get(i).setBookDesc(bookDescList.get(0)); - } - - List lastIndexNameList = (List) highlightMap.get("lastIndexName"); - if (lastIndexNameList != null && lastIndexNameList.size() > 0) { - bookList.get(i).setLastIndexName(lastIndexNameList.get(0)); - } - - List catNameList = (List) highlightMap.get("catName"); - if (catNameList != null && catNameList.size() > 0) { - bookList.get(i).setCatName(catNameList.get(0)); - } - - - } - } - - - } - } - } - } - return new PageBean<>(page, pageSize, total.longValue(), bookList); - } - throw new BusinessException(ResponseStatus.ES_SEARCH_FAIL); - } - - - -} diff --git a/novel-front/src/main/resources/application.yml b/novel-front/src/main/resources/application.yml index 8ef3bd8..bcf4d1e 100644 --- a/novel-front/src/main/resources/application.yml +++ b/novel-front/src/main/resources/application.yml @@ -6,31 +6,6 @@ spring: active: dev include: website,alipay,oss,fastdfs - - rabbitmq: - enable: 0 - host: 127.0.0.1 - username: guest - password: guest - virtual-host: /novel-plus - template: - # 缺省的交换机名称,此处配置后,发送消息如果不指定交换机就会使用这个 - exchange: novel.exchange - publisher-confirms: false - - - elasticsearch: - #是否开启搜索引擎,1:开启,0:不开启 - enable: 0 - jest: - uris: http://192.168.0.105:9200 - - - -redisson: - singleServerConfig: - address: 127.0.0.1:6379 - jwt: secret: novel!#20191230 expiration: 604800