Compare commits

..

3 Commits

Author SHA1 Message Date
bb2d95ad75 Merge pull request #71 from a100488/task_updateCrawlSource
feat(新增编辑规则测试规则): 新增编辑规则测试规则
2021-12-24 15:46:00 +08:00
e6b60bb0a8 feat(新增编辑规则测试规则): 新增编辑规则测试规则2 2021-12-24 15:41:32 +08:00
3a44d14149 feat(新增编辑规则测试规则): 新增编辑规则测试规则 2021-12-24 13:41:25 +08:00
96 changed files with 1746 additions and 1522 deletions

186
README.md
View File

@ -1,34 +1,49 @@
[![index]( https://youdoc.github.io/img/kuaidl4.png )]( https://www.kuaidaili.com/?ref=mdpz65syhqup ) [![index]( https://s1.ax1x.com/2020/07/03/NOSA5q.jpg )]( https://cloud.tencent.com/act/cps/redirect?redirect=1052&cps_key=736e609d66e0ac4e57813316cec6fd0b&from=console )
<p align="center"> # 小说精品屋-plus
<a href='https://github.com/201206030/novel-plus'><img alt="Github stars" src="https://img.shields.io/github/stars/201206030/novel-plus?logo=github"></a>
<a href='https://github.com/201206030/novel-plus'><img alt="Github forks" src="https://img.shields.io/github/forks/201206030/novel-plus?logo=github"></a> [![Github stars](https://img.shields.io/github/stars/201206030/novel-plus?logo=github)](https://github.com/201206030/novel-plus)
<a href='https://gitee.com/novel_dev_team/novel-plus'><img alt="Gitee stars" src="https://gitee.com/novel_dev_team/novel-plus/badge/star.svg?theme=gitee"></a> [![Github forks](https://img.shields.io/github/forks/201206030/novel-plus?logo=github)](https://github.com/201206030/novel-plus)
<a href='https://gitee.com/novel_dev_team/novel-plus'><img alt="Gitee forks" src="https://gitee.com/novel_dev_team/novel-plus/badge/fork.svg?theme=gitee"></a> [![Gitee star](https://gitee.com/novel_dev_team/novel-plus/badge/star.svg?theme=gitee)](https://gitee.com/novel_dev_team/novel-plus)
<a href="https://github.com/201206030/novel-plus"><img src="https://visitor-badge.glitch.me/badge?page_id=201206030.novel-plus" alt="visitors"></a> [![Gitee fork](https://gitee.com/novel_dev_team/novel-plus/badge/fork.svg?theme=gitee)](https://gitee.com/novel_dev_team/novel-plus)
</p>
#### 官网 #### 官网
https://201206030.github.io https://201206030.github.io
#### 学习 #### 新项目小说精品屋-微服务
[基于 Spring Boot 3 + Vue 3 开发的前后端分离学习型小说项目](https://github.com/201206030/novel) 基于小说精品屋-plus构建的Spring Cloud 微服务小说门户平台
#### 微服务版 GitHub仓库地址 https://github.com/201206030/novel-cloud
[Github](https://github.com/201206030/novel-cloud) | [码云](https://gitee.com/novel_dev_team/novel-cloud) Gitee仓库地址 https://gitee.com/novel_dev_team/novel-cloud
#### 演示地址 #### 演示地址
[点击前往](http://47.106.243.172:8888/) [点击前往](http://47.106.243.172:8888/)
#### 项目介绍 #### 项目介绍
novel-plus 是一个多端PCWAP阅读功能完善的原创文学 CMS 小说精品屋-plus是在[小说精品屋](https://github.com/201206030/fiction_house)的基础上去除了漫画和弹幕模块专注于小说是一个多端PC、WAP阅读、功能完善的原创文学CMS系统由前台门户系统、作家后台管理系统、平台后台管理系统、爬虫管理系统等多个子系统构成支持会员充值、订阅模式、新闻发布和实时统计报表等功能。
系统由前台门户系统作家后台管理系统平台后台管理系统和爬虫管理系统等多个子系统构成包括小说推荐作品检索小说排行小说阅读小说评论会员中心作家专区等功能支持自定义多模版可拓展的多种小说内容存储方式内置数据库分表存储和
TXT 文本存储阅读主题切换多爬虫源自动采集和更新数据会员充值订阅模式新闻发布和实时统计报表 小说精品屋-plus重新进行了数据库设计代码重构和功能增强提升了程序整体的可读性和性能增加了很多商用特性主要升级如下
- [x] 数据库重新设计结构调整
- [x] 服务端代码重构MyBatis3升级为MyBatis3DynamicSql
- [x] 移动站与PC站站点分离浏览器自动识别跳转
- [x] PC站UI更新
- [x] 支持前端模版自定义内置多套模版
- [x] 新闻模块
- [x] 排行榜
- [x] 小说评论模块
- [x] 阅读主题模块
- [x] 作家专区
- [x] 充值
- [x] 订阅
- [x] 后台管理系统
- [x] 爬虫管理系统
#### 项目结构 #### 项目结构
@ -44,7 +59,7 @@ novel-plus -- 父工程
#### 技术选型 #### 技术选型
| 技术 | 说明 | 技术 | 说明
|---------------------| --------------------------- | -------------------- | ---------------------------
| SpringBoot | Spring应用快速开发脚手架 | SpringBoot | Spring应用快速开发脚手架
| MyBatis | 持久层ORM框架 | MyBatis | 持久层ORM框架
| MyBatis Dynamic SQL | Mybatis动态sql | MyBatis Dynamic SQL | Mybatis动态sql
@ -56,19 +71,29 @@ novel-plus -- 父工程
| Shiro | 安全框架 | Shiro | 安全框架
| Ehcache | Java进程内缓存框架(默认缓存) | Ehcache | Java进程内缓存框架(默认缓存)
| Redis | 分布式缓存(缓存替换方案默认关闭一行配置开启) | Redis | 分布式缓存(缓存替换方案默认关闭一行配置开启)
| Elasticsearch | 搜索引擎(搜索增强方案默认关闭一行配置开启) | ElasticSearch | 搜索引擎(搜索增强方案默认关闭一行配置开启)
| RabbitMQ | 消息队列(流量削峰默认关闭一行配置开启) | RabbitMq | 消息队列(流量削峰默认关闭一行配置开启)
| Aliyun OSS | 阿里云对象存储服务(图片存储方式之一一行配置即可切换) | OSS | 阿里云对象存储服务(图片存储方式之一一行配置即可切换)
| FastDFS | 开源轻量级分布式文件系统(图片存储方式之一一行配置即可切换) | FastDfs |开源轻量级分布式文件系统(图片存储方式之一一行配置即可切换)
| Redisson | 实现分布式锁 | Redisson | 实现分布式锁
| Lombok | 简化对象封装工具 | Lombok | 简化对象封装工具
| Docker | 应用容器引擎 | Docker | 应用容器引擎
| MySQL | 数据库服务 | Mysql | 数据库服务
| Thymeleaf | 模板引擎 | Thymeleaf | 模板引擎
| Layui | 前端 UI 框架 | Layui | 前端UI
#### 开发工具
感谢Jetbrains公司提供的免费License
[![index]( https://s3.ax1x.com/2021/01/14/sdHsJg.png )]( https://www.jetbrains.com/?from=小说精品屋)
#### 接口文档
[点击查看接口文档示例](doc/api/api.md)
#### 橙色主题模版截图 #### 橙色主题模版截图
##### PC站截图 ##### PC站截图
1. 首页 1. 首页
@ -158,7 +183,6 @@ novel-plus -- 父工程
![img](https://oscimg.oschina.net/oscnet/up-faf5dda7320674c29a1772bc0c81d74762e.png) ![img](https://oscimg.oschina.net/oscnet/up-faf5dda7320674c29a1772bc0c81d74762e.png)
#### 深色主题模版截图 #### 深色主题模版截图
##### PC站截图 ##### PC站截图
1. 首页 1. 首页
@ -166,7 +190,6 @@ novel-plus -- 父工程
![index](https://static.oschina.net/uploads/img/202006/24151811_wIus.png) ![index](https://static.oschina.net/uploads/img/202006/24151811_wIus.png)
##### 手机站截图 ##### 手机站截图
1. 首页 1. 首页
![index](https://static.oschina.net/uploads/img/202006/24151812_OOob.jpg) ![index](https://static.oschina.net/uploads/img/202006/24151812_OOob.jpg)
@ -187,69 +210,79 @@ novel-plus -- 父工程
![QQ图片20191018161901](https://s3.ax1x.com/2020/12/27/r5Fe0A.png) ![QQ图片20191018161901](https://s3.ax1x.com/2020/12/27/r5Fe0A.png)
#### 源码安装教程 #### 安装步骤源码小白请看其他安装教程
- JDK 安装 ##### 数据库安装
建议[安装 JDK 8](https://docs.oracle.com/javase/8/docs/technotes/guides/install/linux_jdk.html) 1. 安装MySQL软件
2. 修改MySQL`max_allowed_packet `配置建议100M
3. 新建数据库设置编码为utf8mb4
4. 执行doc/sql/novel_plus.sql脚本文件
- MySQL 安装 ##### 爬虫管理系统安装
1. [安装 MySQL 服务](https://dev.mysql.com/doc/refman/8.0/en/linux-installation.html) 1. 修改novel-common模块下application-common-dev.ymldev环境默认环境或application-common-prod.ymlprod环境需要在application.yml配置文件中切换配置文件中的数据库配置
2. 修改 MySQL`max_allowed_packet `配置建议 100 M 2. 修改novel-crawl模块下application.yml文件中的管理员账号密码
3. 新建数据库设置编码为 utf8mb4 3. 启动程序打开浏览器默认8081端口访问
4. 执行 doc/sql/novel_plus.sql 脚本文件 4. 选择已有或新增爬虫源支持自定义爬虫规则点击`开启`按钮开始爬取小说数据
- Maven 安装 ##### 前台小说门户安装dev环境跳过34步骤
[安装 Apache Maven](https://maven.apache.org/install.html) 1. 修改novel-common模块下application-common-dev.ymldev环境默认环境或application-common-prod.ymlprod环境需要在application.yml配置文件中切换配置文件中的数据库配置
- 源码打包 2. 修改novel-front模块下application-website配置文件中的网站信息
novel-plus 根目录下执行打包命令`mvn clean package -Dmaven.test.skip` ```
#网站配置
website:
#网站名
name: 小说精品屋
#域名
domain: xiongxyang.gitee.io
#SEO关键词
keyword: ${website.name},小说,小说CMS,原创文学系统,开源小说系统,免费小说建站程序
#SEO描述
description: ${website.name}是一个多端PCWAP阅读功能完善的原创文学CMS系统由前台门户系统作家后台管理系统平台后台管理系统爬虫管理系统等多个子系统构成支持会员充值订阅模式新闻发布和实时统计报表等功能新书自动入库老书自动更新
#联系QQ
qq: 1179705413
```
- 爬虫安装 3. prod环境下需要修改novel-front模块下application-prod.yml配置文件中的模版名为你需要使用的模版名templates文件夹下的模版文件夹名内置orange和dark两套模版prod环境下才支持多模版
1. 上传 novel-crawl/target/build/novel-crawl.zip 压缩包到 Linux 服务器的 novel-crawl 目录 ```
2. 使用`unzip novel-crawl.zip`命令解压 novel-crawl.zip #模版配置
3. 修改 `config/application-common-prod.yml` 文件中的数据库配置 templates:
4. 修改 `config/application-common-prod.yml` 文件中的管理员账号密码 #模版名
5. 根据需要[设置爬虫的代理IP](https://github.com/201206030/novel-plus/wiki/%E7%88%AC%E8%99%AB%E7%A8%8B%E5%BA%8F-HTTP-%E4%BB%A3%E7%90%86%E8%AE%BE%E7%BD%AE) name: orange
6. novel-crawl 目录下使用`bin/novel-crawl.sh start`命令启动爬虫程序 ```
7. 打开浏览器默认`8083`端口访问
8. 选择已有或新增爬虫源支持自定义爬虫规则点击`开启`按钮开始采集小说数据
9. novel-crawl 目录下使用`bin/novel-crawl.sh stop`命令停止爬虫程序
10. novel-crawl 目录下使用`bin/novel-crawl.sh restart`命令重启爬虫程序
11. novel-crawl 目录下使用`bin/novel-crawl.sh status`命令查看爬虫程序的运行状态
- 前台安装 4. prod环境下的jar包形式部署时需要复制templates文件夹到jar文件的相同目录下
1. 上传 novel-front/target/build/novel-front.zip 压缩包到 Linux 服务器的 novel-front 目录 5. 启动程序打开浏览器默认8080端口访问
2. 使用`unzip novel-front.zip`命令解压 novel-front.zip
3. 修改 `config/application-common-prod.yml` 文件中的数据库配置
4. 修改 `config/application-website.yml` 配置文件中的网站信息
5. novel-front 目录下使用`bin/novel-front.sh start`命令启动前台程序
6. 打开浏览器默认`8085`端口访问
7. novel-front 目录下使用`bin/novel-front.sh stop`命令停止前台程序
8. novel-front 目录下使用`bin/novel-front.sh restart`命令重启前台程序
9. novel-front 目录下使用`bin/novel-front.sh status`命令查看前台程序的运行状态
- 后台安装 **喜欢此项目的可以给我的GitHub和Gitee加个Star支持一下 **
1. 上传 novel-admin/target/build/novel-admin.zip 压缩包到 Linux 服务器的 novel-admin 目录 #### 其他安装教程如果链接打不开可关注公众号获取
2. 使用`unzip novel-admin.zip`命令解压 novel-admin.zip
3. 修改 `config/application-prod.yml` 文件中的数据库配置
4. novel-admin 目录下使用`bin/novel-admin.sh start`命令启动后台程序
5. 打开浏览器默认`8088`端口访问
6. novel-admin 目录下使用`bin/novel-admin.sh stop`命令停止后台程序
7. novel-admin 目录下使用`bin/novel-admin.sh restart`命令重启后台程序
8. novel-admin 目录下使用`bin/novel-admin.sh status`命令查看后台程序的运行状态
**部分环境如新版 Mac OS 系统获取不到主机 IP需要手动修改 hosts 文件增加 IP-主机名通过 hostname 命令查看主机名的映射** ##### version>=3.5.0版本
包安装及低版本升级教程[点击前往](https://my.oschina.net/java2nb/blog/4914688)
##### 3.3.0<=version<3.5.0版本
包安装教程[点击前往](https://my.oschina.net/java2nb/blog/4842472)
##### version<3.3.0版本
包安装教程[点击前往](https://my.oschina.net/java2nb/blog/4272630)
宝塔安装教程非官方[点击前往](https://www.daniao.org/9166.html)
docker安装教程[点击前往](https://my.oschina.net/java2nb/blog/4271989)
#### 代码仓库 #### 代码仓库
Github 仓库地址 https://github.com/201206030/novel-plus GitHub仓库地址 https://github.com/201206030/novel-plus
Gitee仓库地址 https://gitee.com/novel_dev_team/novel-plus Gitee仓库地址 https://gitee.com/novel_dev_team/novel-plus
@ -257,10 +290,6 @@ Gitee 仓库地址: https://gitee.com/novel_dev_team/novel-plus
[点击前往官网查看](https://xiongxyang.gitee.io/service.htm) [点击前往官网查看](https://xiongxyang.gitee.io/service.htm)
#### 微信交流群
微信群二维码会过期所以每周在公众号更新一次请关注公众号**xxyopen**回复关键词**微信群**获取
问问题的三要素 问问题的三要素
1. 说明背景使用了哪个模块要做什么 1. 说明背景使用了哪个模块要做什么
@ -285,4 +314,11 @@ Gitee 仓库地址: https://gitee.com/novel_dev_team/novel-plus
#### 免责声明 #### 免责声明
本项目提供的爬虫工具仅用于采集项目初期的测试数据请勿用于商业盈利 用户使用本系统从事任何违法违规的事情一切后果由用户自行承担作者不承担任何责任 本项目提供的爬虫工具仅用于采集项目初期的测试数据请勿用于商业盈利
用户使用本系统从事任何违法违规的事情一切后果由用户自行承担作者不承担任何责任
#### 备注
精品小说屋所有相关项目均已在开源中国公开感兴趣的可进入[开源中国](https://www.oschina.net/p/fiction_house)按关键字`精品小说屋`搜索。
[![index](https://s1.ax1x.com/2020/07/03/NOSuMF.jpg)](https://www.aliyun.com/minisite/goods?userCode=uf4nasee )

View File

@ -1,3 +0,0 @@
alter table book_index add column storage_type varchar(10) NOT NULL DEFAULT 'db' COMMENT '存储方式' after book_price ;

View File

@ -1841,6 +1841,3 @@ 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\":\"<span class=\\\"title\\\">([^/]+)</span>\",\"authorNamePatten\":\"<a href=\\\"/author/\\\\d+/\\\">([^/]+)</a>\",\"picUrlPatten\":\"<img src=\\\"([^>]+)\\\"\\\\s+onerror=\\\"this.src=\",\"picUrlPrefix\":\"http://m.ibiquge.net\",\"statusPatten\":\">状态:([^/]+)</li>\",\"bookStatusRule\":{\"连载\":0,\"完结\":1},\"visitCountPatten\":\">点击:(\\\\d+)</li>\",\"descStart\":\"<p class=\\\"review\\\">\",\"descEnd\":\"</p>\",\"bookIndexUrl\":\"http://www.ibiquge.net/{bookId}/\",\"bookIndexStart\":\"正文</dt>\",\"indexIdPatten\":\"<a\\\\s+style=\\\"\\\"\\\\s+href=\\\"/\\\\d+_\\\\d+/(\\\\d+)\\\\.html\\\">[^/]+</a>\",\"indexNamePatten\":\"<a\\\\s+style=\\\"\\\"\\\\s+href=\\\"/\\\\d+_\\\\d+/\\\\d+\\\\.html\\\">([^/]+)</a>\",\"bookContentUrl\":\"http://www.ibiquge.net/{bookId}/{indexId}.html\",\"contentStart\":\"</p>\",\"contentEnd\":\"<div align=\\\"center\\\">\"}', 0, '2021-02-04 21:31:23', '2021-02-04 21:31:23'); 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\":\"<span class=\\\"title\\\">([^/]+)</span>\",\"authorNamePatten\":\"<a href=\\\"/author/\\\\d+/\\\">([^/]+)</a>\",\"picUrlPatten\":\"<img src=\\\"([^>]+)\\\"\\\\s+onerror=\\\"this.src=\",\"picUrlPrefix\":\"http://m.ibiquge.net\",\"statusPatten\":\">状态:([^/]+)</li>\",\"bookStatusRule\":{\"连载\":0,\"完结\":1},\"visitCountPatten\":\">点击:(\\\\d+)</li>\",\"descStart\":\"<p class=\\\"review\\\">\",\"descEnd\":\"</p>\",\"bookIndexUrl\":\"http://www.ibiquge.net/{bookId}/\",\"bookIndexStart\":\"正文</dt>\",\"indexIdPatten\":\"<a\\\\s+style=\\\"\\\"\\\\s+href=\\\"/\\\\d+_\\\\d+/(\\\\d+)\\\\.html\\\">[^/]+</a>\",\"indexNamePatten\":\"<a\\\\s+style=\\\"\\\"\\\\s+href=\\\"/\\\\d+_\\\\d+/\\\\d+\\\\.html\\\">([^/]+)</a>\",\"bookContentUrl\":\"http://www.ibiquge.net/{bookId}/{indexId}.html\",\"contentStart\":\"</p>\",\"contentEnd\":\"<div align=\\\"center\\\">\"}', 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; 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 ;

View File

@ -1,3 +0,0 @@
1. novel_plus.sql 为全量 sql 文件yyyyMMdd.sql 为增量 sql 文件
2. 第一次安装只需要执行 novel_plus.sql 文件即可
3. 后续版本升级需要根据上次代码版本的时间执行该日期之后的增量 sql 文件简单来说就是 sql 文件夹中相较于上次多出来的 sql 文件

View File

@ -0,0 +1,3 @@
novel_plus.sqlΪȫ<CEAA><C8AB>sql<71>ļ<EFBFBD><C4BC><EFBFBD>yyyyMMdd.sqlΪ<6C><CEAA><EFBFBD><EFBFBD>sql<71>ļ<EFBFBD><C4BC><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD>û<EFBFBD>ֻ<EFBFBD><EFBFBD>Ҫִ<EFBFBD><EFBFBD>novel_plus.sql<71>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>ɡ<EFBFBD>
<EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><EFBFBD><EFBFBD><EFBFBD>´<EFBFBD><EFBFBD><EFBFBD><EFBFBD>󣬸<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϴδ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĸ<EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>䣬ִ<EFBFBD>и<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֮<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>sql<EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD>

View File

@ -5,7 +5,7 @@
<groupId>com.java2nb</groupId> <groupId>com.java2nb</groupId>
<artifactId>novel-admin</artifactId> <artifactId>novel-admin</artifactId>
<version>3.6.2</version> <version>3.5.4</version>
<packaging>jar</packaging> <packaging>jar</packaging>
<name>novel-admin</name> <name>novel-admin</name>
@ -252,8 +252,39 @@
<build> <build>
<plugins> <plugins>
<plugin> <plugin>
<!--打包时去除第三方依赖-->
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId> <artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<layout>ZIP</layout>
<includes>
<include>
<groupId>non-exists</groupId>
<artifactId>non-exists</artifactId>
</include>
</includes>
</configuration>
</plugin>
<!--拷贝第三方依赖文件到指定目录-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<!--target/lib是依赖jar包的输出目录根据自己喜好配置-->
<outputDirectory>target/lib</outputDirectory>
<excludeTransitive>false</excludeTransitive>
<stripVersion>false</stripVersion>
<includeScope>runtime</includeScope>
</configuration>
</execution>
</executions>
</plugin> </plugin>
<plugin> <plugin>
<artifactId>maven-antrun-plugin</artifactId> <artifactId>maven-antrun-plugin</artifactId>
@ -267,11 +298,15 @@
<configuration> <configuration>
<tasks> <tasks>
<!-- 文件夹 --> <!-- 文件夹 -->
<copy todir="${project.build.directory}/build/config" overwrite="true"> <copy todir="${project.build.directory}/build/conf" overwrite="true">
<fileset dir="${basedir}/src/main/build/config"> <fileset dir="${basedir}/src/main/resources">
<include name="*.*"/> <include name="**/*.*"/>
<exclude name="mybatis/*/*.*"/>
</fileset> </fileset>
</copy> </copy>
<move todir="${project.build.directory}/build/lib">
<fileset dir="target/lib"/>
</move>
<copy file="${project.build.directory}/${project.artifactId}-${project.version}.jar" <copy file="${project.build.directory}/${project.artifactId}-${project.version}.jar"
tofile="${project.build.directory}/build/${project.artifactId}.jar" /> tofile="${project.build.directory}/build/${project.artifactId}.jar" />

View File

@ -1,10 +0,0 @@
#端口号
server:
port: 8088
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/novel_plus?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai
username: root
password: test123456

View File

@ -1,94 +0,0 @@
#!/bin/sh
APP_NAME=novel-admin
JAR_NAME=$APP_NAME\.jar
#PID 代表是PID文件
PID=$APP_NAME\.pid
#使用说明,用来提示输入参数
usage() {
echo "Usage: ./novel-admin.sh [start|stop|restart|status]"
exit 1
}
#检查程序是否在运行
is_exist(){
pid=`ps -ef|grep $JAR_NAME|grep -v grep|awk '{print $2}' `
#如果不存在返回1存在返回0
if [ -z "${pid}" ]; then
return 1
else
return 0
fi
}
#启动方法
start(){
is_exist
if [ $? -eq "0" ]; then
echo ">>> 小说精品屋后台正在运行 PID = ${pid} <<<"
else
echo ">>> 小说精品屋后台开始启动 <<<"
nohup java -jar -Dspring.profiles.active=prod $JAR_NAME >/dev/null 2>&1 &
sleep 20
echo $! > $PID
echo ">>> 小说精品屋后台启动完成 PID = $! <<<"
status
fi
}
#停止方法
stop(){
#is_exist
pidf=$(cat $PID)
#echo "$pidf"
echo ">>> 小说精品屋后台 PID = $pidf 开始停止 <<<"
kill $pidf
rm -rf $PID
sleep 2
is_exist
if [ $? -eq "0" ]; then
echo ">>> 小说精品屋后台 PID = $pid 开始强制停止 <<<"
kill -9 $pid
sleep 2
status
else
status
fi
}
#输出运行状态
status(){
is_exist
if [ $? -eq "0" ]; then
echo ">>> 小说精品屋后台正在运行 PID = ${pid} <<<"
else
echo ">>> 小说精品屋后台没有运行 <<<"
fi
}
#重启
restart(){
stop
start
}
#根据输入参数,选择执行对应方法,不输入则执行使用说明
case "$1" in
"start")
start
;;
"stop")
stop
;;
"status")
status
;;
"restart")
restart
;;
*)
usage
;;
esac
exit 0

View File

@ -0,0 +1,8 @@
1linux启动环境
sh start.sh
3windows启动环境
windows-start.bat
3linux停止应用
sh stop.sh

View File

@ -0,0 +1,47 @@
#!/bin/bash
ENGINE=novel-admin.jar
cd ../
#部署目路
DEPLOY_DIR=`pwd`
#获取到当前目录的名称
SERVER_NAME=`basename $DEPLOY_DIR`
#应用进程
PIDS=`ps -ef | grep java | grep "$ENGINE" |awk '{print $2}'`
#设置日志文件的输出目录
LOGS_DIR=$DEPLOY_DIR/logs
if [ ! -d $LOGS_DIR ]; then
mkdir $LOGS_DIR
fi
#日志
STDOUT_FILE=$LOGS_DIR/stdout.log
#JAVA 环境配置
JAVA_OPTS=" -Djava.net.preferIPv4Stack=true -Dlog.home=$LOGS_DIR"
JAVA_MEM_OPTS=" -server -Xms1024m -Xmx1024m -XX:MetaspaceSize=64m -XX:MaxMetaspaceSize=256m -XX:+UseG1GC -XX:MaxGCPauseMillis=100 -XX:InitiatingHeapOccupancyPercent=50 -XX:+PrintGCApplicationStoppedTime -XX:+PrintGCApplicationConcurrentTime -XX:+PrintGCDateStamps -verbose:gc -XX:+PrintGCDetails -XX:+PrintHeapAtGC -Xloggc:$LOGS_DIR/gc.log -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=100M -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=dump.hprof "
#退出标志
RETVAL="0"
if [ -n "$PIDS" ]; then
echo "ERROR: The $SERVER_NAME already started!"
echo "PID: $PIDS"
exit $RETVAL
fi
nohup java -jar $JAVA_OPTS $JAVA_MEM_OPTS -Dloader.path=conf,lib $ENGINE > $STDOUT_FILE 2>&1 &
COUNT=0
while [ $COUNT -lt 1 ]; do
echo -e ".\c"
sleep 1
COUNT=`ps -f | grep java | grep "$DEPLOY_DIR" | awk '{print $2}' | wc -l`
if [ $COUNT -gt 0 ]; then
break
fi
done
echo "OK!"
PIDS=`ps -f | grep java | grep "$DEPLOY_DIR" | awk '{print $2}'`
echo "PID: $PIDS"
echo "STDOUT: $STDOUT_FILE"

View File

@ -0,0 +1,33 @@
#!/bin/bash
SERVER_NAME=novel-admin.jar
#应用进程
PIDS=`ps -ef | grep java | grep "$SERVER_NAME" |awk '{print $2}'`
if [ -z "$PIDS" ]; then
echo "ERROR: The $SERVER_NAME does not started!"
exit 1
fi
echo -e "Stopping the $SERVER_NAME ...\c"
for PID in $PIDS ; do
kill $PID > /dev/null 2>&1
done
COUNT=0
while [ $COUNT -lt 1 ]; do
echo -e ".\c"
sleep 1
COUNT=1
for PID in $PIDS ; do
PID_EXIST=`ps -f -p $PID | grep java`
if [ -n "$PID_EXIST" ]; then
COUNT=0
break
fi
done
done
echo "OK!"
echo "PID: $PIDS"
PIDS=""

View File

@ -0,0 +1,10 @@
@echo off
setlocal enabledelayedexpansion
set JAVA=java
set OPTS=-XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=128m -Xms1024m -Xmx1024m -Xmn256m -Xss256k -XX:SurvivorRatio=8 -XX:+UseConcMarkSweepGC
set ENGINE=novel-admin.jar
cd ../
java -jar %OPTS% -Dloader.path=conf,lib %ENGINE%
pause

View File

@ -1,18 +1,12 @@
package com.java2nb; package com.java2nb;
import lombok.extern.slf4j.Slf4j;
import org.mybatis.spring.annotation.MapperScan; import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan; import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.cache.annotation.EnableCaching; import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.transaction.annotation.EnableTransactionManagement; import org.springframework.transaction.annotation.EnableTransactionManagement;
import java.net.InetAddress;
@EnableTransactionManagement @EnableTransactionManagement
@ServletComponentScan @ServletComponentScan
@ -21,17 +15,9 @@ import java.net.InetAddress;
org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class
}) })
@EnableCaching @EnableCaching
@Slf4j
public class AdminApplication { public class AdminApplication {
public static void main(String[] args) { public static void main(String[] args) {
SpringApplication.run(AdminApplication.class, args); SpringApplication.run(AdminApplication.class, args);
} }
@Bean
public CommandLineRunner commandLineRunner(ApplicationContext ctx) {
return args -> {
log.info("项目启动啦,访问路径:{}", "http://" + InetAddress.getLocalHost().getHostAddress() + ":" + ctx.getEnvironment().getProperty("server.port"));
};
}
} }

View File

@ -36,7 +36,3 @@ mybatis:
typeAliasesPackage: com.java2nb.**.domain typeAliasesPackage: com.java2nb.**.domain
#[弃用]配置缓存和session存储方式默认ehcache,可选redis,[弃用]调整至 spring cache typeshiro.用户权限sessionspring.cache通用 #[弃用]配置缓存和session存储方式默认ehcache,可选redis,[弃用]调整至 spring cache typeshiro.用户权限sessionspring.cache通用
#[弃用]cacheType: ehcache #[弃用]cacheType: ehcache
logging:
config: classpath:logback-boot.xml

View File

@ -24,7 +24,7 @@
<!-- RollingFileAppender滚动记录文件先将日志记录到指定文件当符合某个条件时将日志记录到其他文件 --> <!-- RollingFileAppender滚动记录文件先将日志记录到指定文件当符合某个条件时将日志记录到其他文件 -->
<!-- 以下的大概意思是1.先按日期存日志日期变了将前一天的日志文件名重命名为XXX%日期%索引新的日志仍然是demo.log --> <!-- 以下的大概意思是1.先按日期存日志日期变了将前一天的日志文件名重命名为XXX%日期%索引新的日志仍然是demo.log -->
<!-- 2.如果日期没有发生变化但是当前日志的文件大小超过1KB时对当前日志进行分割 重命名 --> <!-- 2.如果日期没有发生变化但是当前日志的文件大小超过1KB时对当前日志进行分割 重命名 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <appender name="debug" class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>logs/debug.log</File> <File>logs/debug.log</File>
<!-- rollingPolicy:当发生滚动时决定 RollingFileAppender 的行为涉及文件移动和重命名 --> <!-- rollingPolicy:当发生滚动时决定 RollingFileAppender 的行为涉及文件移动和重命名 -->
@ -52,13 +52,11 @@
<!-- 控制台输出日志级别 --> <!-- 控制台输出日志级别 -->
<root level="INFO"> <root level="INFO">
<appender-ref ref="STDOUT" /> <appender-ref ref="STDOUT" />
<appender-ref ref="FILE" />
</root> </root>
<!-- 指定项目中某个包当有日志操作行为时的日志记录级别 --> <!-- 指定项目中某个包当有日志操作行为时的日志记录级别 -->
<!-- com.maijinjie.springboot 为根包也就是只要是发生在这个根包下面的所有日志操作行为的权限都是DEBUG --> <!-- com.maijinjie.springboot 为根包也就是只要是发生在这个根包下面的所有日志操作行为的权限都是DEBUG -->
<!-- 级别依次为从高到低FATAL > ERROR > WARN > INFO > DEBUG > TRACE --> <!-- 级别依次为从高到低FATAL > ERROR > WARN > INFO > DEBUG > TRACE -->
<logger name="com.java2nb" level="DEBUG" additivity="false"> <logger name="com.java2nb" level="DEBUG" additivity="false">
<appender-ref ref="STDOUT" /> <appender-ref ref="debug" />
<appender-ref ref="FILE" />
</logger> </logger>
</configuration> </configuration>

View File

@ -5,7 +5,7 @@
<parent> <parent>
<artifactId>novel</artifactId> <artifactId>novel</artifactId>
<groupId>com.java2nb</groupId> <groupId>com.java2nb</groupId>
<version>3.6.2</version> <version>3.5.4</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
@ -103,6 +103,12 @@
</exclusions> </exclusions>
</dependency> </dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency> <dependency>
<groupId>org.mybatis.dynamic-sql</groupId> <groupId>org.mybatis.dynamic-sql</groupId>
<artifactId>mybatis-dynamic-sql</artifactId> <artifactId>mybatis-dynamic-sql</artifactId>
@ -123,23 +129,6 @@
<optional>true</optional> <optional>true</optional>
</dependency> </dependency>
<dependency>
<groupId>io.github.xxyopen</groupId>
<artifactId>xxy-model</artifactId>
<version>${xxyopen.version}</version>
</dependency>
<dependency>
<groupId>io.github.xxyopen</groupId>
<artifactId>xxy-web</artifactId>
<version>${xxyopen.version}</version>
</dependency>
<dependency>
<groupId>io.github.xxyopen</groupId>
<artifactId>xxy-util</artifactId>
<version>${xxyopen.version}</version>
</dependency>
</dependencies> </dependencies>

View File

@ -0,0 +1,46 @@
package com.java2nb.novel.core.advice;
import com.java2nb.novel.core.bean.ResultBean;
import com.java2nb.novel.core.enums.ResponseStatus;
import com.java2nb.novel.core.exception.BusinessException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.BindException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
/**
* 通用的异常处理器
*
* @author 11797*/
@Slf4j
@RestControllerAdvice(basePackages = "com.java2nb.novel.controller")
public class CommonExceptionHandler {
/**
* 处理后台数据校验异常
* */
@ExceptionHandler(BindException.class)
public ResultBean handlerBindException(BindException e){
log.error(e.getMessage(),e);
return ResultBean.fail(ResponseStatus.PARAM_ERROR);
}
/**
* 处理业务异常
* */
@ExceptionHandler(BusinessException.class)
public ResultBean handlerBusinessException(BusinessException e){
log.error(e.getMessage(),e);
return ResultBean.fail(e.getResStatus());
}
/**
* 处理系统异常
* */
@ExceptionHandler(Exception.class)
public ResultBean handlerException(Exception e){
log.error(e.getMessage(),e);
return ResultBean.error();
}
}

View File

@ -0,0 +1,53 @@
package com.java2nb.novel.core.bean;
import com.github.pagehelper.PageInfo;
import lombok.Data;
import java.util.List;
/**
* 封装通用分页数据,接收PageHelper、SpringData等框架的分页数据转换成通用的PageBean对象
* @author xiongxiaoyang
* @version 1.0
* @since 2021/2/4
* @param <T> 分页集合类型
*/
@Data
public class PageBean<T> {
private Integer pageNum;
private Integer pageSize;
private Long total;
private List<? extends T> list;
/**
* 该构造函数用于PageHelper工具进行分页查询的场景
* 接收PageHelper分页后的list
*/
public PageBean(List<T> list){
PageInfo<T> pageInfo = new PageInfo<>(list);
this.pageNum = pageInfo.getPageNum();
this.pageSize = pageInfo.getPageSize();
this.total = pageInfo.getTotal();
this.list = pageInfo.getList();
}
/**
* 该构造函数用于通用分页查询的场景
* 接收普通分页数据和普通集合
*/
public PageBean(Integer pageNum, Integer pageSize, Long total, List<T> list) {
this.pageNum = pageNum;
this.pageSize = pageSize;
this.total = total;
this.list = list;
}
//TODO 使用其他的分页工具或框架进行分页查询的场景
}

View File

@ -0,0 +1,73 @@
package com.java2nb.novel.core.bean;
import com.java2nb.novel.core.enums.ResponseStatus;
import lombok.Data;
import java.io.Serializable;
/**
* 自定义响应结构
*
* @param <T>
* @author 11797
*/
@Data
public class ResultBean<T> implements Serializable {
private static final long serialVersionUID = 1L;
private int code = ResponseStatus.OK.getCode();
/**
* 响应消息
*/
private String msg = ResponseStatus.OK.getMsg();
/**
* 响应中的数据
*/
private T data;
private ResultBean() {
}
private ResultBean(ResponseStatus responseStatus) {
this.code = responseStatus.getCode();
this.msg = responseStatus.getMsg();
}
private ResultBean(T data) {
this.data = data;
}
/**
* 业务处理成功,无数据返回
*/
public static ResultBean<Void> ok() {
return new ResultBean<>();
}
/**
* 业务处理成功,有数据返回
*/
public static <T> ResultBean<T> ok(T data) {
return new ResultBean<>(data);
}
/**
* 业务处理失败
*/
public static ResultBean<Void> fail(ResponseStatus responseStatus) {
return new ResultBean<>(responseStatus);
}
/**
* 系统错误
*/
public static ResultBean<Void> error() {
return new ResultBean<>(ResponseStatus.ERROR);
}
}

View File

@ -1,22 +0,0 @@
package com.java2nb.novel.core.config;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
* @author xiongxiaoyang
* @date 2022/7/14
*/
@Data
@Component
@ConfigurationProperties(prefix = "http.proxy")
public class HttpProxyProperties {
private Boolean enabled;
private String ip;
private Integer port;
}

View File

@ -1,6 +1,5 @@
package com.java2nb.novel.core.enums; package com.java2nb.novel.core.enums;
import io.github.xxyopen.model.resp.IResultCode;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Getter; import lombok.Getter;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
@ -12,7 +11,27 @@ import lombok.NoArgsConstructor;
@Getter @Getter
@AllArgsConstructor @AllArgsConstructor
@NoArgsConstructor @NoArgsConstructor
public enum ResponseStatus implements IResultCode { public enum ResponseStatus {
/**
* 请求成功
* */
OK(200,"SUCCESS"),
/**
* 服务器异常
* */
ERROR(500,"未知异常,请联系管理员!"),
/**
* 参数错误
* */
PARAM_ERROR(400,"非法参数!"),
/**
* 拒绝访问
* */
FORBIDDEN(403,"拒绝访问!"),
/** /**

View File

@ -0,0 +1,22 @@
package com.java2nb.novel.core.exception;
import com.java2nb.novel.core.enums.ResponseStatus;
import lombok.Data;
/**
* 自定义业务异常,用于处理用户请求时,业务错误时抛出
*/
@Data
public class BusinessException extends RuntimeException {
private ResponseStatus resStatus;
public BusinessException(ResponseStatus resStatus) {
//不调用父类Throwable的fillInStackTrace()方法生成栈追踪信息,提高应用性能
//构造器之间的调用必须在第一行
super(resStatus.getMsg(), null, false, false);
this.resStatus = resStatus;
}
}

View File

@ -0,0 +1,33 @@
package com.java2nb.novel.core.utils;
import lombok.SneakyThrows;
import org.springframework.beans.BeanUtils;
import java.util.ArrayList;
import java.util.List;
/**
* Bean操作工具类
* @author Administrator
*/
public class BeanUtil {
/**
* 复制集合对象属性值,生成新类型集合
* @param source 源集合
* @param targetClass 目标集合类型
* @return 新集合
* */
@SneakyThrows
public static <T> List<T> copyList(List<? super T> source,Class<T> targetClass){
List<T> target = new ArrayList<>(source.size());
for( int i = 0 ; i < source.size() ; i++){
Object sourceItem = source.get(i);
T targetItem = targetClass.newInstance();
BeanUtils.copyProperties(sourceItem,targetItem);
target.add(targetItem);
}
return target;
}
}

View File

@ -1,6 +1,5 @@
package com.java2nb.novel.core.utils; package com.java2nb.novel.core.utils;
import io.github.xxyopen.util.UUIDUtil;
import lombok.SneakyThrows; import lombok.SneakyThrows;
import lombok.experimental.UtilityClass; import lombok.experimental.UtilityClass;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@ -20,7 +19,6 @@ import java.util.Objects;
/** /**
* 文件操作工具类 * 文件操作工具类
*
* @author 11797 * @author 11797
*/ */
@UtilityClass @UtilityClass
@ -29,7 +27,7 @@ public class FileUtil {
/** /**
* 网络图片转本地 * 网络图片转本地
*/ * */
public String network2Local(String picSrc,String picSavePath,String visitPrefix) { public String network2Local(String picSrc,String picSavePath,String visitPrefix) {
InputStream input = null; InputStream input = null;
OutputStream out = null; OutputStream out = null;
@ -64,30 +62,34 @@ public class FileUtil {
picSrc = "/images/default.gif"; picSrc = "/images/default.gif";
}finally { }finally {
closeStream(input, out); if(input != null){
try {
input.close();
} catch (IOException e) {
log.error(e.getMessage(),e);
}finally {
if(out != null){
try {
out.close();
} catch (IOException e) {
log.error(e.getMessage(),e);
} }
}
}
}
}
return picSrc; return picSrc;
} }
@SneakyThrows
private void closeStream(InputStream input, OutputStream out) {
if (input != null) {
input.close();
}
if (out != null) {
out.close();
}
}
/** /**
* 判断文件是否为图片 * 判断文件是否为图片
*
* @param file 需要判断的文件 * @param file 需要判断的文件
* @return true:是图片false:不是图片 * @return true:是图片false:不是图片
*/ * */
@SneakyThrows @SneakyThrows
public boolean isImage(File file){ public boolean isImage(File file){
@ -98,27 +100,6 @@ public class FileUtil {
} }
public void writeContentToFile(String fileSavePath, String fileSrc, String content) {
OutputStream out = null;
try {
File file = new File(fileSavePath + fileSrc);
File parentFile = file.getParentFile();
if (!parentFile.exists()) {
parentFile.mkdirs();
}
out = new FileOutputStream(file);
out.write(content.getBytes());
byte[] b = new byte[4096];
out.flush();
} catch (Exception e) {
log.error(e.getMessage(), e);
throw new RuntimeException("文件写入失败");
} finally {
closeStream(null, out);
}
}
} }

View File

@ -0,0 +1,163 @@
package com.java2nb.novel.core.utils;
import java.lang.management.ManagementFactory;
import java.net.InetAddress;
import java.net.NetworkInterface;
/**
* <p>名称IdWorker.java</p>
* <p>描述分布式自增长ID</p>
* <pre>
* Twitter的 Snowflake JAVA实现方案
* </pre>
* 核心代码为其IdWorker这个类实现其原理结构如下我分别用一个0表示一位用—分割开部分的作用
* 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000
* 在上面的字符串中第一位为未使用实际上也可作为long的符号位接下来的41位为毫秒级时间
* 然后5位datacenter标识位5位机器ID并不算标识符实际是为线程标识
* 然后12位该毫秒内的当前毫秒内的计数加起来刚好64位为一个Long型。
* 这样的好处是整体上按照时间自增排序并且整个分布式系统内不会产生ID碰撞由datacenter和机器ID作区分
* 并且效率较高经测试snowflake每秒能够产生26万ID左右完全满足需要。
* <p>
* 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加))
*
*/
public class IdWorker {
// 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动)
private final static long twepoch = 1288834974657L;
// 机器标识位数
private final static long workerIdBits = 5L;
// 数据中心标识位数
private final static long datacenterIdBits = 5L;
// 机器ID最大值
private final static long maxWorkerId = -1L ^ (-1L << workerIdBits);
// 数据中心ID最大值
private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits);
// 毫秒内自增位
private final static long sequenceBits = 12L;
// 机器ID偏左移12位
private final static long workerIdShift = sequenceBits;
// 数据中心ID左移17位
private final static long datacenterIdShift = sequenceBits + workerIdBits;
// 时间毫秒左移22位
private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits;
private final static long sequenceMask = -1L ^ (-1L << sequenceBits);
/* 上次生产id时间戳 */
private static long lastTimestamp = -1L;
// 0并发控制
private long sequence = 0L;
private final long workerId;
// 数据标识id部分
private final long datacenterId;
public IdWorker(){
this.datacenterId = getDatacenterId(maxDatacenterId);
this.workerId = getMaxWorkerId(datacenterId, maxWorkerId);
}
/**
* @param workerId
* 工作机器ID
* @param datacenterId
* 序列号
*/
public IdWorker(long workerId, long datacenterId) {
if (workerId > maxWorkerId || workerId < 0) {
throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId));
}
if (datacenterId > maxDatacenterId || datacenterId < 0) {
throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId));
}
this.workerId = workerId;
this.datacenterId = datacenterId;
}
/**
* 获取下一个ID
*
* @return
*/
public synchronized long nextId() {
long timestamp = timeGen();
if (timestamp < lastTimestamp) {
throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp));
}
if (lastTimestamp == timestamp) {
// 当前毫秒内,则+1
sequence = (sequence + 1) & sequenceMask;
if (sequence == 0) {
// 当前毫秒内计数满了,则等待下一秒
timestamp = tilNextMillis(lastTimestamp);
}
} else {
sequence = 0L;
}
lastTimestamp = timestamp;
// ID偏移组合生成最终的ID并返回ID
long nextId = ((timestamp - twepoch) << timestampLeftShift)
| (datacenterId << datacenterIdShift)
| (workerId << workerIdShift) | sequence;
return nextId;
}
private long tilNextMillis(final long lastTimestamp) {
long timestamp = this.timeGen();
while (timestamp <= lastTimestamp) {
timestamp = this.timeGen();
}
return timestamp;
}
private long timeGen() {
return System.currentTimeMillis();
}
/**
* <p>
* 获取 maxWorkerId
* </p>
*/
protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) {
StringBuffer mpid = new StringBuffer();
mpid.append(datacenterId);
String name = ManagementFactory.getRuntimeMXBean().getName();
if (!name.isEmpty()) {
/*
* GET jvmPid
*/
mpid.append(name.split("@")[0]);
}
/*
* MAC + PID 的 hashcode 获取16个低位
*/
return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1);
}
/**
* <p>
* 数据标识id部分
* </p>
*/
protected static long getDatacenterId(long maxDatacenterId) {
long id = 0L;
try {
InetAddress ip = InetAddress.getLocalHost();
NetworkInterface network = NetworkInterface.getByInetAddress(ip);
if (network == null) {
id = 1L;
} else {
byte[] mac = network.getHardwareAddress();
id = ((0x000000FF & (long) mac[mac.length - 1])
| (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6;
id = id % (maxDatacenterId + 1);
}
} catch (Exception e) {
System.out.println(" getDatacenterId: " + e.getMessage());
}
return id;
}
}

View File

@ -0,0 +1,61 @@
package com.java2nb.novel.core.utils;
import lombok.SneakyThrows;
import sun.misc.BASE64Encoder;
import java.security.MessageDigest;
/**
* @author 11797
*/
public class MD5Util {
private static final String DEFAUL_CHARSET = "utf-8" ;
private static String byteArrayToHexString(byte[] b) {
StringBuffer resultSb = new StringBuffer();
for (int i = 0; i < b.length; i++) {
resultSb.append(byteToHexString(b[i]));
}
return resultSb.toString();
}
private static String byteToHexString(byte b) {
int n = b;
if (n < 0) {
n += 256;
}
int d1 = n / 16;
int d2 = n % 16;
return HEX_DIGITS[d1] + HEX_DIGITS[d2];
}
@SneakyThrows
public static String MD5Encode(String origin,String charsetname) {
MessageDigest md = MessageDigest.getInstance("MD5");
if (charsetname == null || "".equals(charsetname)) {
return byteArrayToHexString(md.digest(origin
.getBytes()));
} else {
return byteArrayToHexString(md.digest(origin
.getBytes(charsetname)));
}
}
@SneakyThrows
public static String MD5New(String str) {
//首先利用MD5算法将密码加密变成等长字节
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] b1 = md.digest(str.getBytes());
//将等长字节利用Base64算法转换成字符串
BASE64Encoder encoder = new BASE64Encoder();
return encoder.encode(b1);
}
private static final String[] HEX_DIGITS = {"0", "1", "2", "3", "4", "5",
"6", "7", "8", "9", "a", "b", "c", "d", "e", "f"};
}

View File

@ -1,8 +1,6 @@
package com.java2nb.novel.core.utils; package com.java2nb.novel.core.utils;
import com.java2nb.novel.core.config.HttpProxyProperties;
import lombok.SneakyThrows; import lombok.SneakyThrows;
import org.apache.http.HttpHost;
import org.apache.http.config.Registry; import org.apache.http.config.Registry;
import org.apache.http.config.RegistryBuilder; import org.apache.http.config.RegistryBuilder;
import org.apache.http.conn.socket.ConnectionSocketFactory; import org.apache.http.conn.socket.ConnectionSocketFactory;
@ -10,33 +8,24 @@ import org.apache.http.conn.socket.PlainConnectionSocketFactory;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory; import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.conn.ssl.TrustStrategy; import org.apache.http.conn.ssl.TrustStrategy;
import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.client.HttpClients; import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.http.converter.HttpMessageConverter; import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.StringHttpMessageConverter; import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate; import org.springframework.web.client.RestTemplate;
import javax.net.ssl.SSLContext; import javax.net.ssl.SSLContext;
import java.nio.charset.Charset; import java.nio.charset.Charset;
import java.security.cert.X509Certificate; import java.security.cert.X509Certificate;
import java.util.List; import java.util.List;
import java.util.Objects;
@Component
public class RestTemplateUtil { public class RestTemplateUtil {
private static HttpProxyProperties httpProxyProperties;
RestTemplateUtil(HttpProxyProperties properties) {
httpProxyProperties = properties;
}
@SneakyThrows @SneakyThrows
public static RestTemplate getInstance(String charset) { public static RestTemplate getInstance(String charset) {
TrustStrategy acceptingTrustStrategy = (X509Certificate[] chain, String authType) -> true; TrustStrategy acceptingTrustStrategy = (X509Certificate[] chain, String authType) -> true;
//忽略证书 //忽略证书
@ -57,14 +46,11 @@ public class RestTemplateUtil {
//每个路由的最大连接数,如果只调用一个地址,可以将其设置为最大连接数 //每个路由的最大连接数,如果只调用一个地址,可以将其设置为最大连接数
connectionManager.setDefaultMaxPerRoute(300); connectionManager.setDefaultMaxPerRoute(300);
HttpClientBuilder clientBuilder = HttpClients.custom(); CloseableHttpClient httpClient = HttpClients.custom()
if (Objects.nonNull(httpProxyProperties) && Boolean.TRUE.equals(httpProxyProperties.getEnabled())) { .setConnectionManager(connectionManager)
HttpHost proxy = new HttpHost(httpProxyProperties.getIp(), httpProxyProperties.getPort());
clientBuilder.setProxy(proxy);
}
CloseableHttpClient httpClient = clientBuilder.setConnectionManager(connectionManager)
.build(); .build();
HttpComponentsClientHttpRequestFactory requestFactory = HttpComponentsClientHttpRequestFactory requestFactory =
new HttpComponentsClientHttpRequestFactory(); new HttpComponentsClientHttpRequestFactory();
@ -72,7 +58,6 @@ public class RestTemplateUtil {
requestFactory.setConnectionRequestTimeout(3000); requestFactory.setConnectionRequestTimeout(3000);
requestFactory.setConnectTimeout(3000); requestFactory.setConnectTimeout(3000);
requestFactory.setReadTimeout(30000); requestFactory.setReadTimeout(30000);
RestTemplate restTemplate = new RestTemplate(requestFactory); RestTemplate restTemplate = new RestTemplate(requestFactory);
List<HttpMessageConverter<?>> list = restTemplate.getMessageConverters(); List<HttpMessageConverter<?>> list = restTemplate.getMessageConverters();
for (HttpMessageConverter<?> httpMessageConverter : list) { for (HttpMessageConverter<?> httpMessageConverter : list) {

View File

@ -0,0 +1,52 @@
package com.java2nb.novel.core.utils;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
/**
* @author Administrator
*/
@Component
public class SpringUtil implements ApplicationContextAware {
private static ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) {
if (SpringUtil.applicationContext == null) {
SpringUtil.applicationContext = applicationContext;
}
}
/**
* 获取applicationContext
* */
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
/**
* 通过name获取 Bean.
* */
public static Object getBean(String name) {
return getApplicationContext().getBean(name);
}
/**
* 通过class获取Bean
* */
public static <T> T getBean(Class<T> clazz) {
return getApplicationContext().getBean(clazz);
}
/**
* 通过name,以及Clazz返回指定的Bean
* */
public static <T> T getBean(String name, Class<T> clazz) {
return getApplicationContext().getBean(name, clazz);
}
}

View File

@ -0,0 +1,26 @@
package com.java2nb.novel.core.utils;
/**
* 线程工具类
* @author Administrator
*/
public class ThreadUtil {
/**
* 根据线程ID获取线程
* */
public static Thread findThread(long threadId) {
ThreadGroup group = Thread.currentThread().getThreadGroup();
while(group != null) {
Thread[] threads = new Thread[(int)(group.activeCount() * 1.2)];
int count = group.enumerate(threads, true);
for(int i = 0; i < count; i++) {
if(threadId == threads[i].getId()) {
return threads[i];
}
}
group = group.getParent();
}
return null;
}
}

View File

@ -0,0 +1,96 @@
package com.java2nb.novel.core.utils;
import java.util.UUID;
/**
* @author Administrator
*/
public class UUIDUtil {
public static final String[] CHARS = new String[] { "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l",
"m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "0", "1", "2", "3", "4", "5", "6",
"7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R",
"S", "T", "U", "V", "W", "X", "Y", "Z" };
/**
* 生成指定长度的uuid
*
* @param length
* @return
*/
private static String getUUID(int length, UUID uuid) {
int groupLength = 32 / length;
StringBuilder sb = new StringBuilder();
String id = uuid.toString().replace("-", "");
for (int i = 0; i < length; i++) {
String str = id.substring(i * groupLength, i * groupLength + groupLength);
int x = Integer.parseInt(str, 16);
sb.append(CHARS[x % 0x3E]);
}
return sb.toString();
}
/**
* 8位UUID
*
* @return
*/
public static String getUUID8() {
return getUUID(8, UUID.randomUUID());
}
/**
* 8位UUID
*
* @return
*/
public static String getUUID8(byte[] bytes) {
return getUUID(8, UUID.nameUUIDFromBytes(bytes));
}
/**
* 8位UUID
*
* @return
*/
public static String getUUID8(String fromString) {
return getUUID(8, UUID.fromString(fromString));
}
/**
* 16位UUID
*
* @return
*/
public static String getUUID16() {
return getUUID(16, UUID.randomUUID());
}
/**
* 16位UUID
*
* @return
*/
public static String getUUID16(String fromString) {
return getUUID(16, UUID.fromString(fromString));
}
/**
* 16位UUID
*
* @return
*/
public static String getUUID16(byte[] bytes) {
return getUUID(16, UUID.nameUUIDFromBytes(bytes));
}
/**
* 32位UUID
*
* @return
*/
public static String getUUID32() {
return UUID.randomUUID().toString().replace("-", "");
}
}

View File

@ -0,0 +1,11 @@
package com.java2nb.novel.core.valid;
/**
* 新增数据的校验分组
* @author xiongxiaoyang
*/
public interface AddGroup {
}

View File

@ -0,0 +1,11 @@
package com.java2nb.novel.core.valid;
/**
* 更新数据的校验分组
* @author xiongxiaoyang
*/
public interface UpdateGroup {
}

View File

@ -25,9 +25,6 @@ public class BookIndex {
@Generated("org.mybatis.generator.api.MyBatisGenerator") @Generated("org.mybatis.generator.api.MyBatisGenerator")
private Integer bookPrice; private Integer bookPrice;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
private String storageType;
@Generated("org.mybatis.generator.api.MyBatisGenerator") @Generated("org.mybatis.generator.api.MyBatisGenerator")
private Date createTime; private Date createTime;
@ -104,16 +101,6 @@ public class BookIndex {
this.bookPrice = bookPrice; 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") @Generated("org.mybatis.generator.api.MyBatisGenerator")
public Date getCreateTime() { public Date getCreateTime() {
return createTime; return createTime;

View File

@ -1,11 +1,11 @@
package com.java2nb.novel.entity; package com.java2nb.novel.entity;
import io.github.xxyopen.web.valid.AddGroup; import com.java2nb.novel.core.valid.AddGroup;
import io.github.xxyopen.web.valid.UpdateGroup; import com.java2nb.novel.core.valid.UpdateGroup;
import java.util.Date;
import javax.annotation.Generated; import javax.annotation.Generated;
import javax.validation.constraints.*; import javax.validation.constraints.*;
import java.util.Date;
public class User { public class User {

View File

@ -31,9 +31,6 @@ public final class BookIndexDynamicSqlSupport {
@Generated("org.mybatis.generator.api.MyBatisGenerator") @Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final SqlColumn<Integer> bookPrice = bookIndex.bookPrice; public static final SqlColumn<Integer> bookPrice = bookIndex.bookPrice;
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final SqlColumn<String> storageType = bookIndex.storageType;
@Generated("org.mybatis.generator.api.MyBatisGenerator") @Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final SqlColumn<Date> createTime = bookIndex.createTime; public static final SqlColumn<Date> createTime = bookIndex.createTime;
@ -56,8 +53,6 @@ public final class BookIndexDynamicSqlSupport {
public final SqlColumn<Integer> bookPrice = column("book_price", JDBCType.INTEGER); public final SqlColumn<Integer> bookPrice = column("book_price", JDBCType.INTEGER);
public final SqlColumn<String> storageType = column("storage_type", JDBCType.VARCHAR);
public final SqlColumn<Date> createTime = column("create_time", JDBCType.TIMESTAMP); public final SqlColumn<Date> createTime = column("create_time", JDBCType.TIMESTAMP);
public final SqlColumn<Date> updateTime = column("update_time", JDBCType.TIMESTAMP); public final SqlColumn<Date> updateTime = column("update_time", JDBCType.TIMESTAMP);

View File

@ -37,7 +37,7 @@ import org.mybatis.dynamic.sql.util.mybatis3.MyBatis3Utils;
@Mapper @Mapper
public interface BookIndexMapper { public interface BookIndexMapper {
@Generated("org.mybatis.generator.api.MyBatisGenerator") @Generated("org.mybatis.generator.api.MyBatisGenerator")
BasicColumn[] selectList = BasicColumn.columnList(id, bookId, indexNum, indexName, wordCount, isVip, bookPrice, storageType, createTime, updateTime); BasicColumn[] selectList = BasicColumn.columnList(id, bookId, indexNum, indexName, wordCount, isVip, bookPrice, createTime, updateTime);
@Generated("org.mybatis.generator.api.MyBatisGenerator") @Generated("org.mybatis.generator.api.MyBatisGenerator")
@SelectProvider(type = SqlProviderAdapter.class, method = "select") @SelectProvider(type = SqlProviderAdapter.class, method = "select")
@ -70,7 +70,6 @@ public interface BookIndexMapper {
@Result(column = "word_count", property = "wordCount", jdbcType = JdbcType.INTEGER), @Result(column = "word_count", property = "wordCount", jdbcType = JdbcType.INTEGER),
@Result(column = "is_vip", property = "isVip", jdbcType = JdbcType.TINYINT), @Result(column = "is_vip", property = "isVip", jdbcType = JdbcType.TINYINT),
@Result(column = "book_price", property = "bookPrice", jdbcType = JdbcType.INTEGER), @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 = "create_time", property = "createTime", jdbcType = JdbcType.TIMESTAMP),
@Result(column = "update_time", property = "updateTime", jdbcType = JdbcType.TIMESTAMP) @Result(column = "update_time", property = "updateTime", jdbcType = JdbcType.TIMESTAMP)
}) })
@ -107,7 +106,6 @@ public interface BookIndexMapper {
.map(wordCount).toProperty("wordCount") .map(wordCount).toProperty("wordCount")
.map(isVip).toProperty("isVip") .map(isVip).toProperty("isVip")
.map(bookPrice).toProperty("bookPrice") .map(bookPrice).toProperty("bookPrice")
.map(storageType).toProperty("storageType")
.map(createTime).toProperty("createTime") .map(createTime).toProperty("createTime")
.map(updateTime).toProperty("updateTime") .map(updateTime).toProperty("updateTime")
); );
@ -123,7 +121,6 @@ public interface BookIndexMapper {
.map(wordCount).toProperty("wordCount") .map(wordCount).toProperty("wordCount")
.map(isVip).toProperty("isVip") .map(isVip).toProperty("isVip")
.map(bookPrice).toProperty("bookPrice") .map(bookPrice).toProperty("bookPrice")
.map(storageType).toProperty("storageType")
.map(createTime).toProperty("createTime") .map(createTime).toProperty("createTime")
.map(updateTime).toProperty("updateTime") .map(updateTime).toProperty("updateTime")
); );
@ -139,7 +136,6 @@ public interface BookIndexMapper {
.map(wordCount).toPropertyWhenPresent("wordCount", record::getWordCount) .map(wordCount).toPropertyWhenPresent("wordCount", record::getWordCount)
.map(isVip).toPropertyWhenPresent("isVip", record::getIsVip) .map(isVip).toPropertyWhenPresent("isVip", record::getIsVip)
.map(bookPrice).toPropertyWhenPresent("bookPrice", record::getBookPrice) .map(bookPrice).toPropertyWhenPresent("bookPrice", record::getBookPrice)
.map(storageType).toPropertyWhenPresent("storageType", record::getStorageType)
.map(createTime).toPropertyWhenPresent("createTime", record::getCreateTime) .map(createTime).toPropertyWhenPresent("createTime", record::getCreateTime)
.map(updateTime).toPropertyWhenPresent("updateTime", record::getUpdateTime) .map(updateTime).toPropertyWhenPresent("updateTime", record::getUpdateTime)
); );
@ -181,7 +177,6 @@ public interface BookIndexMapper {
.set(wordCount).equalTo(record::getWordCount) .set(wordCount).equalTo(record::getWordCount)
.set(isVip).equalTo(record::getIsVip) .set(isVip).equalTo(record::getIsVip)
.set(bookPrice).equalTo(record::getBookPrice) .set(bookPrice).equalTo(record::getBookPrice)
.set(storageType).equalTo(record::getStorageType)
.set(createTime).equalTo(record::getCreateTime) .set(createTime).equalTo(record::getCreateTime)
.set(updateTime).equalTo(record::getUpdateTime); .set(updateTime).equalTo(record::getUpdateTime);
} }
@ -195,7 +190,6 @@ public interface BookIndexMapper {
.set(wordCount).equalToWhenPresent(record::getWordCount) .set(wordCount).equalToWhenPresent(record::getWordCount)
.set(isVip).equalToWhenPresent(record::getIsVip) .set(isVip).equalToWhenPresent(record::getIsVip)
.set(bookPrice).equalToWhenPresent(record::getBookPrice) .set(bookPrice).equalToWhenPresent(record::getBookPrice)
.set(storageType).equalToWhenPresent(record::getStorageType)
.set(createTime).equalToWhenPresent(record::getCreateTime) .set(createTime).equalToWhenPresent(record::getCreateTime)
.set(updateTime).equalToWhenPresent(record::getUpdateTime); .set(updateTime).equalToWhenPresent(record::getUpdateTime);
} }
@ -209,7 +203,6 @@ public interface BookIndexMapper {
.set(wordCount).equalTo(record::getWordCount) .set(wordCount).equalTo(record::getWordCount)
.set(isVip).equalTo(record::getIsVip) .set(isVip).equalTo(record::getIsVip)
.set(bookPrice).equalTo(record::getBookPrice) .set(bookPrice).equalTo(record::getBookPrice)
.set(storageType).equalTo(record::getStorageType)
.set(createTime).equalTo(record::getCreateTime) .set(createTime).equalTo(record::getCreateTime)
.set(updateTime).equalTo(record::getUpdateTime) .set(updateTime).equalTo(record::getUpdateTime)
.where(id, isEqualTo(record::getId)) .where(id, isEqualTo(record::getId))
@ -225,7 +218,6 @@ public interface BookIndexMapper {
.set(wordCount).equalToWhenPresent(record::getWordCount) .set(wordCount).equalToWhenPresent(record::getWordCount)
.set(isVip).equalToWhenPresent(record::getIsVip) .set(isVip).equalToWhenPresent(record::getIsVip)
.set(bookPrice).equalToWhenPresent(record::getBookPrice) .set(bookPrice).equalToWhenPresent(record::getBookPrice)
.set(storageType).equalToWhenPresent(record::getStorageType)
.set(createTime).equalToWhenPresent(record::getCreateTime) .set(createTime).equalToWhenPresent(record::getCreateTime)
.set(updateTime).equalToWhenPresent(record::getUpdateTime) .set(updateTime).equalToWhenPresent(record::getUpdateTime)
.where(id, isEqualTo(record::getId)) .where(id, isEqualTo(record::getId))

View File

@ -67,17 +67,7 @@ sharding:
algorithm-expression: book_content${index_id % 10} algorithm-expression: book_content${index_id % 10}
content:
save:
storage: db #存储介质db数据库filetxt文本
path: /Users/xiongxiaoyang/books #txt小说文本保存路径
# HTTP 代理配置
http:
proxy:
# 是否开启 HTTP 代理true-开启false-不开启
enabled: false
# 代理 IP
ip: u493.kdltps.com
# 代理端口号
port: 15818

View File

@ -74,20 +74,9 @@ logging:
content:
save:
storage: db #存储介质db数据库filetxt文本
path: /Users/xiongxiaoyang/books #txt小说文本保存路径
# HTTP 代理配置
http:
proxy:
# 是否开启 HTTP 代理true-开启false-不开启
enabled: false
# 代理 IP
ip: 40.83.102.86
# 代理端口号
port: 80

View File

@ -44,7 +44,7 @@
</javaClientGenerator> </javaClientGenerator>
<!--生成全部表tableName设为%--> <!--生成全部表tableName设为%-->
<table tableName="book_index"/> <table tableName="news"/>
<!-- 指定数据库表 --> <!-- 指定数据库表 -->
<!--<table schema="jly" tableName="job_position" domainObjectName="JobPositionTest"/>--> <!--<table schema="jly" tableName="job_position" domainObjectName="JobPositionTest"/>-->

View File

@ -5,7 +5,7 @@
<parent> <parent>
<artifactId>novel</artifactId> <artifactId>novel</artifactId>
<groupId>com.java2nb</groupId> <groupId>com.java2nb</groupId>
<version>3.6.2</version> <version>3.5.4</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
@ -32,8 +32,39 @@
<build> <build>
<plugins> <plugins>
<plugin> <plugin>
<!--打包时去除第三方依赖-->
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId> <artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<layout>ZIP</layout>
<includes>
<include>
<groupId>non-exists</groupId>
<artifactId>non-exists</artifactId>
</include>
</includes>
</configuration>
</plugin>
<!--拷贝第三方依赖文件到指定目录-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<!--target/lib是依赖jar包的输出目录根据自己喜好配置-->
<outputDirectory>target/lib</outputDirectory>
<excludeTransitive>false</excludeTransitive>
<stripVersion>false</stripVersion>
<includeScope>runtime</includeScope>
</configuration>
</execution>
</executions>
</plugin> </plugin>
<plugin> <plugin>
<artifactId>maven-antrun-plugin</artifactId> <artifactId>maven-antrun-plugin</artifactId>
@ -47,11 +78,15 @@
<configuration> <configuration>
<tasks> <tasks>
<!-- 文件夹 --> <!-- 文件夹 -->
<copy todir="${project.build.directory}/build/config" overwrite="true"> <copy todir="${project.build.directory}/build/conf" overwrite="true">
<fileset dir="${basedir}/src/main/build/config"> <fileset dir="${basedir}/src/main/resources">
<include name="*.*"/> <include name="**/*.*"/>
<exclude name="mybatis/*/*.*"/>
</fileset> </fileset>
</copy> </copy>
<move todir="${project.build.directory}/build/lib">
<fileset dir="target/lib"/>
</move>
<copy file="${project.build.directory}/${project.artifactId}-${project.version}.jar" <copy file="${project.build.directory}/${project.artifactId}-${project.version}.jar"
tofile="${project.build.directory}/build/${project.artifactId}.jar" /> tofile="${project.build.directory}/build/${project.artifactId}.jar" />

View File

@ -1,49 +0,0 @@
#端口号
server:
port: 8083
#不分表的数据库配置
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/novel_plus?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
username: root
password: root
####使用shardingJdbc时
####所有的jdbcType都不能是LONGVARCHAR,否则会导致java.io.NotSerializableException: java.io.StringReader错误
##### 应该替换所有的 LONGVARCHAR 类型为VARCHAR
sharding:
jdbc:
datasource:
ds0:
jdbc-url: jdbc:mysql://localhost:3306/novel_plus?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
username: root
password: test123456
#登录用户名密码
admin:
username: admin
password: admin
#
##爬虫自动更新的线程数
##建议小说数量不多或者正在运行新书入库爬虫的情况下设置为1即可
##随着小说数量的增多可以逐渐增加但建议不要超出CPU的线程数
crawl:
update:
thread: 1
#小说内容保存配置
content:
save:
storage: db #存储介质db数据库filetxt文本
path: /Users/xiongxiaoyang/books #txt小说文本保存路径
# HTTP 代理配置
http:
proxy:
# 是否开启 HTTP 代理true-开启false-不开启
enabled: false
# 代理 IP
ip: u493.kdltps.com
# 代理端口号
port: 15818

View File

@ -1,94 +0,0 @@
#!/bin/sh
APP_NAME=novel-crawl
JAR_NAME=$APP_NAME\.jar
#PID 代表是PID文件
PID=$APP_NAME\.pid
#使用说明,用来提示输入参数
usage() {
echo "Usage: ./novel-crawl.sh [start|stop|restart|status]"
exit 1
}
#检查程序是否在运行
is_exist(){
pid=`ps -ef|grep $JAR_NAME|grep -v grep|awk '{print $2}' `
#如果不存在返回1存在返回0
if [ -z "${pid}" ]; then
return 1
else
return 0
fi
}
#启动方法
start(){
is_exist
if [ $? -eq "0" ]; then
echo ">>> 小说精品屋爬虫正在运行 PID = ${pid} <<<"
else
echo ">>> 小说精品屋爬虫开始启动 <<<"
nohup java -jar -Dspring.profiles.active=prod $JAR_NAME >/dev/null 2>&1 &
sleep 10
echo $! > $PID
echo ">>> 小说精品屋爬虫启动完成 PID = $! <<<"
status
fi
}
#停止方法
stop(){
#is_exist
pidf=$(cat $PID)
#echo "$pidf"
echo ">>> 小说精品屋爬虫 PID = $pidf 开始停止 <<<"
kill $pidf
rm -rf $PID
sleep 2
is_exist
if [ $? -eq "0" ]; then
echo ">>> 小说精品屋爬虫 PID = $pid 开始强制停止 <<<"
kill -9 $pid
sleep 2
status
else
status
fi
}
#输出运行状态
status(){
is_exist
if [ $? -eq "0" ]; then
echo ">>> 小说精品屋爬虫正在运行 PID = ${pid} <<<"
else
echo ">>> 小说精品屋爬虫没有运行 <<<"
fi
}
#重启
restart(){
stop
start
}
#根据输入参数,选择执行对应方法,不输入则执行使用说明
case "$1" in
"start")
start
;;
"stop")
stop
;;
"status")
status
;;
"restart")
restart
;;
*)
usage
;;
esac
exit 0

View File

@ -0,0 +1,8 @@
1linux启动环境
sh start.sh
3windows启动环境
windows-start.bat
3linux停止应用
sh stop.sh

View File

@ -0,0 +1,47 @@
#!/bin/bash
ENGINE=novel-crawl.jar
cd ../
#部署目路
DEPLOY_DIR=`pwd`
#获取到当前目录的名称
SERVER_NAME=`basename $DEPLOY_DIR`
#应用进程
PIDS=`ps -ef | grep java | grep "$ENGINE" |awk '{print $2}'`
#设置日志文件的输出目录
LOGS_DIR=$DEPLOY_DIR/logs
if [ ! -d $LOGS_DIR ]; then
mkdir $LOGS_DIR
fi
#日志
STDOUT_FILE=$LOGS_DIR/stdout.log
#JAVA 环境配置
JAVA_OPTS=" -Djava.net.preferIPv4Stack=true -Dlog.home=$LOGS_DIR"
JAVA_MEM_OPTS=" -server -Xms1024m -Xmx1024m -XX:MetaspaceSize=64m -XX:MaxMetaspaceSize=256m -XX:+UseG1GC -XX:MaxGCPauseMillis=100 -XX:InitiatingHeapOccupancyPercent=50 -XX:+PrintGCApplicationStoppedTime -XX:+PrintGCApplicationConcurrentTime -XX:+PrintGCDateStamps -verbose:gc -XX:+PrintGCDetails -XX:+PrintHeapAtGC -Xloggc:$LOGS_DIR/gc.log -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=100M -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=dump.hprof "
#退出标志
RETVAL="0"
if [ -n "$PIDS" ]; then
echo "ERROR: The $SERVER_NAME already started!"
echo "PID: $PIDS"
exit $RETVAL
fi
nohup java -jar $JAVA_OPTS $JAVA_MEM_OPTS -Dloader.path=conf,lib $ENGINE > $STDOUT_FILE 2>&1 &
COUNT=0
while [ $COUNT -lt 1 ]; do
echo -e ".\c"
sleep 1
COUNT=`ps -f | grep java | grep "$DEPLOY_DIR" | awk '{print $2}' | wc -l`
if [ $COUNT -gt 0 ]; then
break
fi
done
echo "OK!"
PIDS=`ps -f | grep java | grep "$DEPLOY_DIR" | awk '{print $2}'`
echo "PID: $PIDS"
echo "STDOUT: $STDOUT_FILE"

View File

@ -0,0 +1,33 @@
#!/bin/bash
SERVER_NAME=novel-crawl.jar
#应用进程
PIDS=`ps -ef | grep java | grep "$SERVER_NAME" |awk '{print $2}'`
if [ -z "$PIDS" ]; then
echo "ERROR: The $SERVER_NAME does not started!"
exit 1
fi
echo -e "Stopping the $SERVER_NAME ...\c"
for PID in $PIDS ; do
kill $PID > /dev/null 2>&1
done
COUNT=0
while [ $COUNT -lt 1 ]; do
echo -e ".\c"
sleep 1
COUNT=1
for PID in $PIDS ; do
PID_EXIST=`ps -f -p $PID | grep java`
if [ -n "$PID_EXIST" ]; then
COUNT=0
break
fi
done
done
echo "OK!"
echo "PID: $PIDS"
PIDS=""

View File

@ -0,0 +1,10 @@
@echo off
setlocal enabledelayedexpansion
set JAVA=java
set OPTS=-XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=128m -Xms1024m -Xmx1024m -Xmn256m -Xss256k -XX:SurvivorRatio=8 -XX:+UseConcMarkSweepGC
set ENGINE=novel-crawl.jar
cd ../
java -jar %OPTS% -Dloader.path=conf,lib %ENGINE%
pause

View File

@ -1,18 +1,12 @@
package com.java2nb.novel; package com.java2nb.novel;
import lombok.extern.slf4j.Slf4j;
import org.mybatis.spring.annotation.MapperScan; import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan; import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.cache.annotation.EnableCaching; import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.EnableScheduling;
import java.net.InetAddress;
/** /**
* @author Administrator * @author Administrator
*/ */
@ -21,19 +15,11 @@ import java.net.InetAddress;
@EnableScheduling @EnableScheduling
@ServletComponentScan @ServletComponentScan
@MapperScan(basePackages = {"com.java2nb.novel.mapper"}) @MapperScan(basePackages = {"com.java2nb.novel.mapper"})
@Slf4j
public class CrawlNovelApplication { public class CrawlNovelApplication {
public static void main(String[] args) { public static void main(String[] args) {
SpringApplication.run(CrawlNovelApplication.class); SpringApplication.run(CrawlNovelApplication.class);
} }
@Bean
public CommandLineRunner commandLineRunner(ApplicationContext ctx) {
return args -> {
log.info("项目启动啦,访问路径:{}", "http://" + InetAddress.getLocalHost().getHostAddress() + ":" + ctx.getEnvironment().getProperty("server.port"));
};
}
} }

View File

@ -1,14 +1,18 @@
package com.java2nb.novel.controller; package com.java2nb.novel.controller;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.java2nb.novel.core.bean.PageBean;
import com.java2nb.novel.core.bean.ResultBean;
import com.java2nb.novel.core.cache.CacheKey; import com.java2nb.novel.core.cache.CacheKey;
import com.java2nb.novel.core.cache.CacheService; import com.java2nb.novel.core.cache.CacheService;
import com.java2nb.novel.core.crawl.CrawlParser;
import com.java2nb.novel.core.crawl.RuleBean;
import com.java2nb.novel.core.utils.HttpUtil; import com.java2nb.novel.core.utils.HttpUtil;
import io.github.xxyopen.model.page.PageBean; import com.java2nb.novel.entity.BookIndex;
import com.java2nb.novel.entity.CrawlSingleTask; import com.java2nb.novel.entity.CrawlSingleTask;
import com.java2nb.novel.entity.CrawlSource; import com.java2nb.novel.entity.CrawlSource;
import com.java2nb.novel.service.CrawlService; import com.java2nb.novel.service.CrawlService;
import io.github.xxyopen.model.resp.RestResult; import com.java2nb.novel.utils.Constants;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
@ -32,10 +36,10 @@ public class CrawlController {
* 新增爬虫源 * 新增爬虫源
* */ * */
@PostMapping("addCrawlSource") @PostMapping("addCrawlSource")
public RestResult<Void> addCrawlSource(CrawlSource source){ public ResultBean<Void> addCrawlSource(CrawlSource source){
crawlService.addCrawlSource(source); crawlService.addCrawlSource(source);
return RestResult.ok(); return ResultBean.ok();
} }
@ -43,17 +47,17 @@ public class CrawlController {
* 爬虫源分页列表查询 * 爬虫源分页列表查询
* */ * */
@GetMapping("listCrawlByPage") @GetMapping("listCrawlByPage")
public RestResult<PageBean<CrawlSource>> listCrawlByPage(@RequestParam(value = "curr", defaultValue = "1") int page, @RequestParam(value = "limit", defaultValue = "10") int pageSize){ public ResultBean<PageBean<CrawlSource>> listCrawlByPage(@RequestParam(value = "curr", defaultValue = "1") int page, @RequestParam(value = "limit", defaultValue = "10") int pageSize){
return RestResult.ok(crawlService.listCrawlByPage(page,pageSize)); return ResultBean.ok(crawlService.listCrawlByPage(page,pageSize));
} }
/** /**
* 获取爬虫源 * 获取爬虫源
* */ * */
@GetMapping("getCrawlSource/{id}") @GetMapping("getCrawlSource/{id}")
public RestResult<CrawlSource> getCrawlSource(@PathVariable("id") Integer id){ public ResultBean<CrawlSource> getCrawlSource(@PathVariable("id") Integer id){
CrawlSource crawlSource= crawlService.getCrawlSource(id); CrawlSource crawlSource= crawlService.getCrawlSource(id);
return RestResult.ok(crawlSource); return ResultBean.ok(crawlSource);
} }
@ -65,7 +69,7 @@ public class CrawlController {
* @return * @return
*/ */
@PostMapping("testParse") @PostMapping("testParse")
public RestResult<Object> testParse(String rule,String url,String isRefresh){ public ResultBean<Object> testParse(String rule,String url,String isRefresh){
Map<String,Object> resultMap=new HashMap<>(); Map<String,Object> resultMap=new HashMap<>();
String html =null; String html =null;
@ -85,12 +89,12 @@ public class CrawlController {
cacheService.setObject(CacheKey.BOOK_TEST_PARSE + url, html, 60 * 10); cacheService.setObject(CacheKey.BOOK_TEST_PARSE + url, html, 60 * 10);
}else{ }else{
resultMap.put("msg","html is null"); resultMap.put("msg","html is null");
return RestResult.ok(resultMap); return ResultBean.ok(resultMap);
} }
} }
}else{ }else{
resultMap.put("html","url is null"); resultMap.put("html","url is null");
return RestResult.ok(resultMap); return ResultBean.ok(resultMap);
} }
Pattern pattern = Pattern.compile(rule); Pattern pattern = Pattern.compile(rule);
Matcher matcher = pattern.matcher(html); Matcher matcher = pattern.matcher(html);
@ -100,36 +104,36 @@ public class CrawlController {
resultMap.put("匹配结果",matcher.group(1)); resultMap.put("匹配结果",matcher.group(1));
} }
// resultMap.put("url",url); // resultMap.put("url",url);
return RestResult.ok(resultMap); return ResultBean.ok(resultMap);
} }
/** /**
* 修改爬虫源 * 修改爬虫源
* */ * */
@PostMapping("updateCrawlSource") @PostMapping("updateCrawlSource")
public RestResult<Void> updateCrawlSource(CrawlSource source) { public ResultBean<Void> updateCrawlSource(CrawlSource source){
crawlService.updateCrawlSource(source); crawlService.updateCrawlSource(source);
return RestResult.ok(); return ResultBean.ok();
} }
/** /**
* 开启或停止爬虫 * 开启或停止爬虫
* */ * */
@PostMapping("openOrCloseCrawl") @PostMapping("openOrCloseCrawl")
public RestResult<Void> openOrCloseCrawl(Integer sourceId,Byte sourceStatus){ public ResultBean<Void> openOrCloseCrawl(Integer sourceId,Byte sourceStatus){
crawlService.openOrCloseCrawl(sourceId,sourceStatus); crawlService.openOrCloseCrawl(sourceId,sourceStatus);
return RestResult.ok(); return ResultBean.ok();
} }
/** /**
* 新增单本采集任务 * 新增单本采集任务
* */ * */
@PostMapping("addCrawlSingleTask") @PostMapping("addCrawlSingleTask")
public RestResult<Void> addCrawlSingleTask(CrawlSingleTask singleTask){ public ResultBean<Void> addCrawlSingleTask(CrawlSingleTask singleTask){
crawlService.addCrawlSingleTask(singleTask); crawlService.addCrawlSingleTask(singleTask);
return RestResult.ok(); return ResultBean.ok();
} }
@ -137,20 +141,20 @@ public class CrawlController {
* 单本采集任务分页列表查询 * 单本采集任务分页列表查询
* */ * */
@GetMapping("listCrawlSingleTaskByPage") @GetMapping("listCrawlSingleTaskByPage")
public RestResult<PageBean<CrawlSingleTask>> listCrawlSingleTaskByPage(@RequestParam(value = "curr", defaultValue = "1") int page, @RequestParam(value = "limit", defaultValue = "10") int pageSize){ public ResultBean<PageBean<CrawlSingleTask>> listCrawlSingleTaskByPage(@RequestParam(value = "curr", defaultValue = "1") int page, @RequestParam(value = "limit", defaultValue = "10") int pageSize){
return RestResult.ok(crawlService.listCrawlSingleTaskByPage(page,pageSize)); return ResultBean.ok(crawlService.listCrawlSingleTaskByPage(page,pageSize));
} }
/** /**
* 删除采集任务 * 删除采集任务
* */ * */
@DeleteMapping("delCrawlSingleTask/{id}") @DeleteMapping("delCrawlSingleTask/{id}")
public RestResult<Void> delCrawlSingleTask(@PathVariable("id") Long id){ public ResultBean<Void> delCrawlSingleTask(@PathVariable("id") Long id){
crawlService.delCrawlSingleTask(id); crawlService.delCrawlSingleTask(id);
return RestResult.ok(); return ResultBean.ok();
} }

View File

@ -1,19 +1,14 @@
package com.java2nb.novel.core.crawl; package com.java2nb.novel.core.crawl;
import com.java2nb.novel.core.utils.HttpUtil; import com.java2nb.novel.core.utils.*;
import com.java2nb.novel.core.utils.RandomBookInfoUtil;
import com.java2nb.novel.core.utils.RestTemplateUtil;
import com.java2nb.novel.core.utils.StringUtil;
import com.java2nb.novel.entity.Book; import com.java2nb.novel.entity.Book;
import com.java2nb.novel.entity.BookContent; import com.java2nb.novel.entity.BookContent;
import com.java2nb.novel.entity.BookIndex; import com.java2nb.novel.entity.BookIndex;
import com.java2nb.novel.utils.Constants; import com.java2nb.novel.utils.Constants;
import io.github.xxyopen.util.IdWorker;
import lombok.SneakyThrows; import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.http.HttpStatus; import org.springframework.http.*;
import org.springframework.http.ResponseEntity;
import org.springframework.web.client.RestTemplate; import org.springframework.web.client.RestTemplate;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
@ -21,6 +16,8 @@ import java.util.*;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import static java.util.regex.Pattern.compile;
/** /**
* 爬虫解析器 * 爬虫解析器
* *
@ -29,7 +26,7 @@ import java.util.regex.Pattern;
@Slf4j @Slf4j
public class CrawlParser { public class CrawlParser {
private static final IdWorker idWorker = IdWorker.INSTANCE; private static final IdWorker idWorker = new IdWorker();
private static final RestTemplate restTemplate = RestTemplateUtil.getInstance("utf-8"); private static final RestTemplate restTemplate = RestTemplateUtil.getInstance("utf-8");
@ -41,14 +38,14 @@ public class CrawlParser {
String bookDetailUrl = ruleBean.getBookDetailUrl().replace("{bookId}", bookId); String bookDetailUrl = ruleBean.getBookDetailUrl().replace("{bookId}", bookId);
String bookDetailHtml = getByHttpClientWithChrome(bookDetailUrl); String bookDetailHtml = getByHttpClientWithChrome(bookDetailUrl);
if (bookDetailHtml != null) { if (bookDetailHtml != null) {
Pattern bookNamePatten = PatternFactory.getPattern(ruleBean.getBookNamePatten()); Pattern bookNamePatten = compile(ruleBean.getBookNamePatten());
Matcher bookNameMatch = bookNamePatten.matcher(bookDetailHtml); Matcher bookNameMatch = bookNamePatten.matcher(bookDetailHtml);
boolean isFindBookName = bookNameMatch.find(); boolean isFindBookName = bookNameMatch.find();
if (isFindBookName) { if (isFindBookName) {
String bookName = bookNameMatch.group(1); String bookName = bookNameMatch.group(1);
//设置小说名 //设置小说名
book.setBookName(bookName); book.setBookName(bookName);
Pattern authorNamePatten = PatternFactory.getPattern(ruleBean.getAuthorNamePatten()); Pattern authorNamePatten = compile(ruleBean.getAuthorNamePatten());
Matcher authorNameMatch = authorNamePatten.matcher(bookDetailHtml); Matcher authorNameMatch = authorNamePatten.matcher(bookDetailHtml);
boolean isFindAuthorName = authorNameMatch.find(); boolean isFindAuthorName = authorNameMatch.find();
if (isFindAuthorName) { if (isFindAuthorName) {
@ -56,7 +53,7 @@ public class CrawlParser {
//设置作者名 //设置作者名
book.setAuthorName(authorName); book.setAuthorName(authorName);
if (StringUtils.isNotBlank(ruleBean.getPicUrlPatten())) { if (StringUtils.isNotBlank(ruleBean.getPicUrlPatten())) {
Pattern picUrlPatten = PatternFactory.getPattern(ruleBean.getPicUrlPatten()); Pattern picUrlPatten = compile(ruleBean.getPicUrlPatten());
Matcher picUrlMatch = picUrlPatten.matcher(bookDetailHtml); Matcher picUrlMatch = picUrlPatten.matcher(bookDetailHtml);
boolean isFindPicUrl = picUrlMatch.find(); boolean isFindPicUrl = picUrlMatch.find();
if (isFindPicUrl) { if (isFindPicUrl) {
@ -69,7 +66,7 @@ public class CrawlParser {
} }
} }
if (StringUtils.isNotBlank(ruleBean.getScorePatten())) { if (StringUtils.isNotBlank(ruleBean.getScorePatten())) {
Pattern scorePatten = PatternFactory.getPattern(ruleBean.getScorePatten()); Pattern scorePatten = compile(ruleBean.getScorePatten());
Matcher scoreMatch = scorePatten.matcher(bookDetailHtml); Matcher scoreMatch = scorePatten.matcher(bookDetailHtml);
boolean isFindScore = scoreMatch.find(); boolean isFindScore = scoreMatch.find();
if (isFindScore) { if (isFindScore) {
@ -79,7 +76,7 @@ public class CrawlParser {
} }
} }
if (StringUtils.isNotBlank(ruleBean.getVisitCountPatten())) { if (StringUtils.isNotBlank(ruleBean.getVisitCountPatten())) {
Pattern visitCountPatten = PatternFactory.getPattern(ruleBean.getVisitCountPatten()); Pattern visitCountPatten = compile(ruleBean.getVisitCountPatten());
Matcher visitCountMatch = visitCountPatten.matcher(bookDetailHtml); Matcher visitCountMatch = visitCountPatten.matcher(bookDetailHtml);
boolean isFindVisitCount = visitCountMatch.find(); boolean isFindVisitCount = visitCountMatch.find();
if (isFindVisitCount) { if (isFindVisitCount) {
@ -100,7 +97,7 @@ public class CrawlParser {
//设置书籍简介 //设置书籍简介
book.setBookDesc(desc); book.setBookDesc(desc);
if (StringUtils.isNotBlank(ruleBean.getStatusPatten())) { if (StringUtils.isNotBlank(ruleBean.getStatusPatten())) {
Pattern bookStatusPatten = PatternFactory.getPattern(ruleBean.getStatusPatten()); Pattern bookStatusPatten = compile(ruleBean.getStatusPatten());
Matcher bookStatusMatch = bookStatusPatten.matcher(bookDetailHtml); Matcher bookStatusMatch = bookStatusPatten.matcher(bookDetailHtml);
boolean isFindBookStatus = bookStatusMatch.find(); boolean isFindBookStatus = bookStatusMatch.find();
if (isFindBookStatus) { if (isFindBookStatus) {
@ -113,7 +110,7 @@ public class CrawlParser {
} }
if (StringUtils.isNotBlank(ruleBean.getUpadateTimePatten()) && StringUtils.isNotBlank(ruleBean.getUpadateTimeFormatPatten())) { if (StringUtils.isNotBlank(ruleBean.getUpadateTimePatten()) && StringUtils.isNotBlank(ruleBean.getUpadateTimeFormatPatten())) {
Pattern updateTimePatten = PatternFactory.getPattern(ruleBean.getUpadateTimePatten()); Pattern updateTimePatten = compile(ruleBean.getUpadateTimePatten());
Matcher updateTimeMatch = updateTimePatten.matcher(bookDetailHtml); Matcher updateTimeMatch = updateTimePatten.matcher(bookDetailHtml);
boolean isFindUpdateTime = updateTimeMatch.find(); boolean isFindUpdateTime = updateTimeMatch.find();
if (isFindUpdateTime) { if (isFindUpdateTime) {
@ -141,7 +138,7 @@ public class CrawlParser {
handler.handle(book); handler.handle(book);
} }
public static boolean parseBookIndexAndContent(String sourceBookId, Book book, RuleBean ruleBean, Map<Integer, BookIndex> existBookIndexMap, CrawlBookChapterHandler handler) { public static void parseBookIndexAndContent(String sourceBookId, Book book, RuleBean ruleBean, Map<Integer, BookIndex> existBookIndexMap, CrawlBookChapterHandler handler) {
Date currentDate = new Date(); Date currentDate = new Date();
@ -156,10 +153,10 @@ public class CrawlParser {
indexListHtml = indexListHtml.substring(indexListHtml.indexOf(ruleBean.getBookIndexStart()) + ruleBean.getBookIndexStart().length()); indexListHtml = indexListHtml.substring(indexListHtml.indexOf(ruleBean.getBookIndexStart()) + ruleBean.getBookIndexStart().length());
} }
Pattern indexIdPatten = PatternFactory.getPattern(ruleBean.getIndexIdPatten()); Pattern indexIdPatten = compile(ruleBean.getIndexIdPatten());
Matcher indexIdMatch = indexIdPatten.matcher(indexListHtml); Matcher indexIdMatch = indexIdPatten.matcher(indexListHtml);
Pattern indexNamePatten = PatternFactory.getPattern(ruleBean.getIndexNamePatten()); Pattern indexNamePatten = compile(ruleBean.getIndexNamePatten());
Matcher indexNameMatch = indexNamePatten.matcher(indexListHtml); Matcher indexNameMatch = indexNamePatten.matcher(indexListHtml);
boolean isFindIndex = indexIdMatch.find() & indexNameMatch.find(); boolean isFindIndex = indexIdMatch.find() & indexNameMatch.find();
@ -277,7 +274,7 @@ public class CrawlParser {
setBookContentList(contentList); setBookContentList(contentList);
}}); }});
return true; return;
} }
@ -287,7 +284,6 @@ public class CrawlParser {
setBookIndexList(new ArrayList<>(0)); setBookIndexList(new ArrayList<>(0));
setBookContentList(new ArrayList<>(0)); setBookContentList(new ArrayList<>(0));
}}); }});
return false;
} }

View File

@ -1,30 +0,0 @@
package com.java2nb.novel.core.crawl;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import java.util.regex.Pattern;
/**
* @author xiongxiaoyang
*/
public class PatternFactory {
private static final Map<String, Pattern> PATTERN_CACHED_MAP = new HashMap<>();
/**
* 根据正则表达式获取一个预编译的Pattern对象
*/
public static Pattern getPattern(String regex) {
Pattern pattern = PATTERN_CACHED_MAP.get(regex);
if (Objects.isNull(pattern)) {
pattern = Pattern.compile(regex);
PATTERN_CACHED_MAP.put(regex, pattern);
}
return pattern;
}
}

View File

@ -3,9 +3,9 @@ package com.java2nb.novel.core.schedule;
import com.java2nb.novel.core.cache.CacheKey; import com.java2nb.novel.core.cache.CacheKey;
import com.java2nb.novel.core.cache.CacheService; import com.java2nb.novel.core.cache.CacheService;
import com.java2nb.novel.core.utils.ThreadUtil;
import com.java2nb.novel.entity.CrawlSource; import com.java2nb.novel.entity.CrawlSource;
import com.java2nb.novel.service.CrawlService; import com.java2nb.novel.service.CrawlService;
import io.github.xxyopen.util.ThreadUtil;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled; import org.springframework.scheduling.annotation.Scheduled;

View File

@ -1,16 +0,0 @@
package com.java2nb.novel.service;
import com.java2nb.novel.entity.BookContent;
import java.util.List;
public interface BookContentService {
void saveBookContent(List<BookContent> bookContentList,Long bookId);
void saveBookContent(BookContent bookContent,Long bookId);
void updateBookContent(BookContent bookContent,Long bookId);
}

View File

@ -1,6 +1,7 @@
package com.java2nb.novel.service; package com.java2nb.novel.service;
import io.github.xxyopen.model.page.PageBean; import com.java2nb.novel.core.bean.PageBean;
import com.java2nb.novel.core.bean.ResultBean;
import com.java2nb.novel.core.crawl.RuleBean; import com.java2nb.novel.core.crawl.RuleBean;
import com.java2nb.novel.entity.CrawlSingleTask; import com.java2nb.novel.entity.CrawlSingleTask;
import com.java2nb.novel.entity.CrawlSource; import com.java2nb.novel.entity.CrawlSource;

View File

@ -4,12 +4,10 @@ import com.java2nb.novel.entity.Book;
import com.java2nb.novel.entity.BookContent; import com.java2nb.novel.entity.BookContent;
import com.java2nb.novel.entity.BookIndex; import com.java2nb.novel.entity.BookIndex;
import com.java2nb.novel.mapper.*; import com.java2nb.novel.mapper.*;
import com.java2nb.novel.service.BookContentService;
import com.java2nb.novel.service.BookService; import com.java2nb.novel.service.BookService;
import com.java2nb.novel.utils.Constants; import com.java2nb.novel.utils.Constants;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.mybatis.dynamic.sql.render.RenderingStrategies; import org.mybatis.dynamic.sql.render.RenderingStrategies;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
@ -39,10 +37,7 @@ public class BookServiceImpl implements BookService {
private final CrawlBookIndexMapper bookIndexMapper; private final CrawlBookIndexMapper bookIndexMapper;
private final Map<String, BookContentService> bookContentServiceMap; private final BookContentMapper bookContentMapper;
@Value("${content.save.storage}")
private String storageType;
@Override @Override
@ -89,11 +84,8 @@ public class BookServiceImpl implements BookService {
bookMapper.insertSelective(book); bookMapper.insertSelective(book);
//批量保存目录和内容 //批量保存目录和内容
bookIndexList.forEach(bookIndex -> {
bookIndex.setStorageType(storageType);
});
bookIndexMapper.insertMultiple(bookIndexList); bookIndexMapper.insertMultiple(bookIndexList);
bookContentServiceMap.get(storageType).saveBookContent(bookContentList, book.getId()); bookContentMapper.insertMultiple(bookContentList);
} }
} }
@ -113,7 +105,7 @@ public class BookServiceImpl implements BookService {
@Override @Override
public Map<Integer, BookIndex> queryExistBookIndexMap(Long bookId) { public Map<Integer, BookIndex> queryExistBookIndexMap(Long bookId) {
List<BookIndex> bookIndexs = bookIndexMapper.selectMany(select(BookIndexDynamicSqlSupport.id, BookIndexDynamicSqlSupport.indexNum, BookIndexDynamicSqlSupport.indexName, BookIndexDynamicSqlSupport.wordCount, BookIndexDynamicSqlSupport.storageType) List<BookIndex> bookIndexs = bookIndexMapper.selectMany(select(BookIndexDynamicSqlSupport.id,BookIndexDynamicSqlSupport.indexNum,BookIndexDynamicSqlSupport.indexName,BookIndexDynamicSqlSupport.wordCount)
.from(BookIndexDynamicSqlSupport.bookIndex) .from(BookIndexDynamicSqlSupport.bookIndex)
.where(BookIndexDynamicSqlSupport.bookId,isEqualTo(bookId)) .where(BookIndexDynamicSqlSupport.bookId,isEqualTo(bookId))
.build() .build()
@ -134,13 +126,17 @@ public class BookServiceImpl implements BookService {
if(!existBookIndexMap.containsKey(bookIndex.getIndexNum())) { if(!existBookIndexMap.containsKey(bookIndex.getIndexNum())) {
//插入 //插入
bookIndex.setStorageType(storageType);
bookIndexMapper.insertSelective(bookIndex); bookIndexMapper.insertSelective(bookIndex);
bookContentServiceMap.get(storageType).saveBookContent(bookContent, book.getId()); bookContentMapper.insertSelective(bookContent);
}else{ }else{
//更新 //更新
bookIndexMapper.updateByPrimaryKeySelective(bookIndex); bookIndexMapper.updateByPrimaryKeySelective(bookIndex);
bookContentServiceMap.get(existBookIndexMap.get(bookIndex.getIndexNum()).getStorageType()).updateBookContent(bookContent, book.getId()); bookContentMapper.update(update(BookContentDynamicSqlSupport.bookContent)
.set(BookContentDynamicSqlSupport.content)
.equalTo(bookContent.getContent())
.where(BookContentDynamicSqlSupport.indexId,isEqualTo(bookContent.getIndexId()))
.build()
.render(RenderingStrategies.MYBATIS3));
} }

View File

@ -2,17 +2,17 @@ package com.java2nb.novel.service.impl;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageHelper;
import io.github.xxyopen.model.page.PageBean; import com.java2nb.novel.core.bean.PageBean;
import com.java2nb.novel.core.cache.CacheKey; import com.java2nb.novel.core.cache.CacheKey;
import com.java2nb.novel.core.cache.CacheService; import com.java2nb.novel.core.cache.CacheService;
import com.java2nb.novel.core.crawl.CrawlParser; import com.java2nb.novel.core.crawl.CrawlParser;
import com.java2nb.novel.core.crawl.RuleBean; import com.java2nb.novel.core.crawl.RuleBean;
import com.java2nb.novel.core.enums.ResponseStatus; import com.java2nb.novel.core.enums.ResponseStatus;
import io.github.xxyopen.model.page.builder.pagehelper.PageBuilder; import com.java2nb.novel.core.exception.BusinessException;
import io.github.xxyopen.util.IdWorker; import com.java2nb.novel.core.utils.BeanUtil;
import io.github.xxyopen.util.ThreadUtil; import com.java2nb.novel.core.utils.IdWorker;
import io.github.xxyopen.web.exception.BusinessException; import com.java2nb.novel.core.utils.SpringUtil;
import io.github.xxyopen.web.util.BeanUtil; import com.java2nb.novel.core.utils.ThreadUtil;
import com.java2nb.novel.entity.Book; import com.java2nb.novel.entity.Book;
import com.java2nb.novel.entity.CrawlSingleTask; import com.java2nb.novel.entity.CrawlSingleTask;
import com.java2nb.novel.entity.CrawlSource; import com.java2nb.novel.entity.CrawlSource;
@ -24,7 +24,6 @@ import com.java2nb.novel.service.BookService;
import com.java2nb.novel.service.CrawlService; import com.java2nb.novel.service.CrawlService;
import com.java2nb.novel.vo.CrawlSingleTaskVO; import com.java2nb.novel.vo.CrawlSingleTaskVO;
import com.java2nb.novel.vo.CrawlSourceVO; import com.java2nb.novel.vo.CrawlSourceVO;
import io.github.xxyopen.web.util.SpringUtil;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.SneakyThrows; import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@ -40,6 +39,7 @@ import java.util.regex.Pattern;
import static com.java2nb.novel.core.utils.HttpUtil.getByHttpClientWithChrome; import static com.java2nb.novel.core.utils.HttpUtil.getByHttpClientWithChrome;
import static com.java2nb.novel.mapper.CrawlSourceDynamicSqlSupport.*; import static com.java2nb.novel.mapper.CrawlSourceDynamicSqlSupport.*;
import static com.java2nb.novel.mapper.CrawlSourceDynamicSqlSupport.id;
import static org.mybatis.dynamic.sql.SqlBuilder.isEqualTo; import static org.mybatis.dynamic.sql.SqlBuilder.isEqualTo;
import static org.mybatis.dynamic.sql.select.SelectDSL.select; import static org.mybatis.dynamic.sql.select.SelectDSL.select;
@ -58,9 +58,8 @@ public class CrawlServiceImpl implements CrawlService {
private final BookService bookService; private final BookService bookService;
private final CacheService cacheService;
private final IdWorker idWorker = IdWorker.INSTANCE; private final CacheService cacheService;
@Override @Override
@ -98,7 +97,7 @@ public class CrawlServiceImpl implements CrawlService {
.build() .build()
.render(RenderingStrategies.MYBATIS3); .render(RenderingStrategies.MYBATIS3);
List<CrawlSource> crawlSources = crawlSourceMapper.selectMany(render); List<CrawlSource> crawlSources = crawlSourceMapper.selectMany(render);
PageBean<CrawlSource> pageBean = PageBuilder.build(crawlSources); PageBean<CrawlSource> pageBean = new PageBean<>(crawlSources);
pageBean.setList(BeanUtil.copyList(crawlSources, CrawlSourceVO.class)); pageBean.setList(BeanUtil.copyList(crawlSources, CrawlSourceVO.class));
return pageBean; return pageBean;
} }
@ -157,12 +156,17 @@ public class CrawlServiceImpl implements CrawlService {
@Override @Override
public CrawlSource queryCrawlSource(Integer sourceId) { public CrawlSource queryCrawlSource(Integer sourceId) {
SelectStatementProvider render = select(CrawlSourceDynamicSqlSupport.sourceStatus, CrawlSourceDynamicSqlSupport.crawlRule)
SelectStatementProvider render = select(id, sourceName, sourceStatus, createTime, updateTime,crawlRule)
.from(crawlSource) .from(crawlSource)
.where(id, isEqualTo(sourceId)) .where(id, isEqualTo(sourceId))
.build() .build()
.render(RenderingStrategies.MYBATIS3); .render(RenderingStrategies.MYBATIS3);
return crawlSourceMapper.selectMany(render).get(0); List<CrawlSource> list= crawlSourceMapper.selectMany(render);
if(list!=null&&list.size()>0){
return list.get(0);
}
return null;
} }
@Override @Override
@ -187,7 +191,7 @@ public class CrawlServiceImpl implements CrawlService {
.build() .build()
.render(RenderingStrategies.MYBATIS3); .render(RenderingStrategies.MYBATIS3);
List<CrawlSingleTask> crawlSingleTasks = crawlSingleTaskMapper.selectMany(render); List<CrawlSingleTask> crawlSingleTasks = crawlSingleTaskMapper.selectMany(render);
PageBean<CrawlSingleTask> pageBean = PageBuilder.build(crawlSingleTasks); PageBean<CrawlSingleTask> pageBean = new PageBean<>(crawlSingleTasks);
pageBean.setList(BeanUtil.copyList(crawlSingleTasks, CrawlSingleTaskVO.class)); pageBean.setList(BeanUtil.copyList(crawlSingleTasks, CrawlSingleTaskVO.class));
return pageBean; return pageBean;
} }
@ -328,18 +332,17 @@ public class CrawlServiceImpl implements CrawlService {
book.setCrawlBookId(bookId); book.setCrawlBookId(bookId);
book.setCrawlSourceId(sourceId); book.setCrawlSourceId(sourceId);
book.setCrawlLastTime(new Date()); book.setCrawlLastTime(new Date());
book.setId(idWorker.nextId()); book.setId(new IdWorker().nextId());
//解析章节目录 //解析章节目录
boolean parseIndexContentResult = 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()); bookService.saveBookAndIndexAndContent(book, chapter.getBookIndexList(), chapter.getBookContentList());
}); });
parseResult.set(parseIndexContentResult);
} else { } else {
//只更新书籍的爬虫相关字段 //只更新书籍的爬虫相关字段
bookService.updateCrawlProperties(existBook.getId(), sourceId, bookId); bookService.updateCrawlProperties(existBook.getId(), sourceId, bookId);
parseResult.set(true);
} }
parseResult.set(true);
}); });
return parseResult.get(); return parseResult.get();

View File

@ -1,43 +0,0 @@
package com.java2nb.novel.service.impl;
import com.java2nb.novel.entity.BookContent;
import com.java2nb.novel.mapper.BookContentDynamicSqlSupport;
import com.java2nb.novel.mapper.BookContentMapper;
import com.java2nb.novel.service.BookContentService;
import lombok.RequiredArgsConstructor;
import org.mybatis.dynamic.sql.render.RenderingStrategies;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.stereotype.Service;
import java.util.List;
import static org.mybatis.dynamic.sql.SqlBuilder.isEqualTo;
import static org.mybatis.dynamic.sql.SqlBuilder.update;
@Service(value = "db")
@RequiredArgsConstructor
public class DbBookContentServiceImpl implements BookContentService {
private final BookContentMapper bookContentMapper;
@Override
public void saveBookContent(List<BookContent> bookContentList,Long bookId) {
bookContentMapper.insertMultiple(bookContentList);
}
@Override
public void saveBookContent(BookContent bookContent,Long bookId) {
bookContentMapper.insertSelective(bookContent);
}
@Override
public void updateBookContent(BookContent bookContent,Long bookId) {
bookContentMapper.update(update(BookContentDynamicSqlSupport.bookContent)
.set(BookContentDynamicSqlSupport.content)
.equalTo(bookContent.getContent())
.where(BookContentDynamicSqlSupport.indexId,isEqualTo(bookContent.getIndexId()))
.build()
.render(RenderingStrategies.MYBATIS3));
}
}

View File

@ -1,35 +0,0 @@
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 org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.stereotype.Service;
import java.util.List;
@Service(value = "txt")
@RequiredArgsConstructor
public class FileBookContentServiceImpl implements BookContentService {
@Value("${content.save.path}")
private String fileSavePath;
@Override
public void saveBookContent(List<BookContent> bookContentList,Long bookId) {
bookContentList.forEach(bookContent -> saveBookContent(bookContent,bookId));
}
@Override
public void saveBookContent(BookContent bookContent,Long bookId) {
FileUtil.writeContentToFile(fileSavePath,"/"+bookId+"/"+bookContent.getIndexId()+".txt",bookContent.getContent());
}
@Override
public void updateBookContent(BookContent bookContent,Long bookId) {
FileUtil.writeContentToFile(fileSavePath,"/"+bookId+"/"+bookContent.getIndexId()+".txt",bookContent.getContent());
}
}

View File

@ -122,7 +122,6 @@
var pageCrawlSourceList=null; var pageCrawlSourceList=null;
function search(curr, limit) { function search(curr, limit) {
$.ajax({ $.ajax({
type: "get", type: "get",
url: "/crawl/listCrawlByPage", url: "/crawl/listCrawlByPage",

View File

@ -5,7 +5,7 @@
<parent> <parent>
<artifactId>novel</artifactId> <artifactId>novel</artifactId>
<groupId>com.java2nb</groupId> <groupId>com.java2nb</groupId>
<version>3.6.2</version> <version>3.5.4</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
@ -70,6 +70,8 @@
</dependency> </dependency>
<!--引入redisson分布式锁--> <!--引入redisson分布式锁-->
<!-- <dependency> <!-- <dependency>
<groupId>org.redisson</groupId> <groupId>org.redisson</groupId>
@ -85,11 +87,50 @@
</dependency> </dependency>
</dependencies> </dependencies>
<!-- <build>-->
<!-- <plugins>-->
<!-- <plugin>-->
<!-- <groupId>org.springframework.boot</groupId>-->
<!-- <artifactId>spring-boot-maven-plugin</artifactId>-->
<!-- </plugin>-->
<!-- </plugins>-->
<!-- </build>-->
<build> <build>
<plugins> <plugins>
<plugin> <plugin>
<!--打包时去除第三方依赖-->
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId> <artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<layout>ZIP</layout>
<includes>
<include>
<groupId>non-exists</groupId>
<artifactId>non-exists</artifactId>
</include>
</includes>
</configuration>
</plugin>
<!--拷贝第三方依赖文件到指定目录-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<!--target/lib是依赖jar包的输出目录根据自己喜好配置-->
<outputDirectory>target/lib</outputDirectory>
<excludeTransitive>false</excludeTransitive>
<stripVersion>false</stripVersion>
<includeScope>runtime</includeScope>
</configuration>
</execution>
</executions>
</plugin> </plugin>
<plugin> <plugin>
<artifactId>maven-antrun-plugin</artifactId> <artifactId>maven-antrun-plugin</artifactId>
@ -103,20 +144,15 @@
<configuration> <configuration>
<tasks> <tasks>
<!-- 文件夹 --> <!-- 文件夹 -->
<copy todir="${project.build.directory}/build/config" overwrite="true"> <copy todir="${project.build.directory}/build/conf" overwrite="true">
<fileset dir="${basedir}/src/main/build/config">
<include name="*.*"/>
</fileset>
<fileset dir="${basedir}/src/main/resources"> <fileset dir="${basedir}/src/main/resources">
<include name="application-alipay.yml"/>
<include name="application-website.yml"/>
</fileset>
</copy>
<copy todir="${project.build.directory}/build/templates" overwrite="true">
<fileset dir="${basedir}/../templates">
<include name="**/*.*"/> <include name="**/*.*"/>
<exclude name="mybatis/*/*.*"/>
</fileset> </fileset>
</copy> </copy>
<move todir="${project.build.directory}/build/lib">
<fileset dir="target/lib"/>
</move>
<copy file="${project.build.directory}/${project.artifactId}-${project.version}.jar" <copy file="${project.build.directory}/${project.artifactId}-${project.version}.jar"
tofile="${project.build.directory}/build/${project.artifactId}.jar" /> tofile="${project.build.directory}/build/${project.artifactId}.jar" />
@ -138,112 +174,5 @@
</plugin> </plugin>
</plugins> </plugins>
</build> </build>
<!-- <build>-->
<!-- <plugins>-->
<!-- &lt;!&ndash; 将相同groupId的依赖模块打包进来 &ndash;&gt;-->
<!-- <plugin>-->
<!-- <groupId>org.apache.maven.plugins</groupId>-->
<!-- <artifactId>maven-shade-plugin</artifactId>-->
<!-- <configuration>-->
<!-- <createDependencyReducedPom>false</createDependencyReducedPom>-->
<!-- </configuration>-->
<!-- <executions>-->
<!-- <execution>-->
<!-- <phase>package</phase>-->
<!-- <goals>-->
<!-- <goal>shade</goal>-->
<!-- </goals>-->
<!-- <configuration>-->
<!-- <artifactSet>-->
<!-- <includes>-->
<!-- <include>${project.groupId}:*:*</include>-->
<!-- </includes>-->
<!-- </artifactSet>-->
<!-- </configuration>-->
<!-- </execution>-->
<!-- </executions>-->
<!-- </plugin>-->
<!-- <plugin>-->
<!-- &lt;!&ndash;打包时去除第三方依赖&ndash;&gt;-->
<!-- <groupId>org.springframework.boot</groupId>-->
<!-- <artifactId>spring-boot-maven-plugin</artifactId>-->
<!-- <configuration>-->
<!-- <layout>ZIP</layout>-->
<!-- <includes>-->
<!-- <include>-->
<!-- <groupId>non-exists</groupId>-->
<!-- <artifactId>non-exists</artifactId>-->
<!-- </include>-->
<!-- </includes>-->
<!-- </configuration>-->
<!-- </plugin>-->
<!-- &lt;!&ndash;拷贝第三方依赖文件到指定目录&ndash;&gt;-->
<!-- <plugin>-->
<!-- <groupId>org.apache.maven.plugins</groupId>-->
<!-- <artifactId>maven-dependency-plugin</artifactId>-->
<!-- <executions>-->
<!-- <execution>-->
<!-- <id>copy-dependencies</id>-->
<!-- <phase>package</phase>-->
<!-- <goals>-->
<!-- <goal>copy-dependencies</goal>-->
<!-- </goals>-->
<!-- <configuration>-->
<!-- &lt;!&ndash;target/lib是依赖jar包的输出目录根据自己喜好配置&ndash;&gt;-->
<!-- <outputDirectory>target/lib</outputDirectory>-->
<!-- <excludeTransitive>false</excludeTransitive>-->
<!-- <stripVersion>false</stripVersion>-->
<!-- <includeScope>runtime</includeScope>-->
<!-- <excludeGroupIds>${project.groupId}</excludeGroupIds>-->
<!-- </configuration>-->
<!-- </execution>-->
<!-- </executions>-->
<!-- </plugin>-->
<!-- <plugin>-->
<!-- <artifactId>maven-antrun-plugin</artifactId>-->
<!-- <version>1.8</version>-->
<!-- <executions>-->
<!-- <execution>-->
<!-- <phase>package</phase>-->
<!-- <goals>-->
<!-- <goal>run</goal>-->
<!-- </goals>-->
<!-- <configuration>-->
<!-- <tasks>-->
<!-- &lt;!&ndash; 文件夹 &ndash;&gt;-->
<!-- <copy todir="${project.build.directory}/build/conf" overwrite="true">-->
<!-- <fileset dir="${basedir}/src/main/resources">-->
<!-- <include name="**/*.*"/>-->
<!-- <exclude name="mybatis/*/*.*"/>-->
<!-- </fileset>-->
<!-- <fileset dir="${basedir}/../novel-common/src/main/resources">-->
<!-- <include name="**/*.*"/>-->
<!-- <exclude name="mybatis/**"/>-->
<!-- </fileset>-->
<!-- </copy>-->
<!-- <move todir="${project.build.directory}/build/lib">-->
<!-- <fileset dir="target/lib"/>-->
<!-- </move>-->
<!-- <copy file="${project.build.directory}/${project.artifactId}-${project.version}.jar"-->
<!-- tofile="${project.build.directory}/build/${project.artifactId}.jar" />-->
<!-- <fixcrlf srcdir="${basedir}/src/main/build/scripts" eol="unix"/>-->
<!-- <copy todir="${project.build.directory}/build/bin">-->
<!-- <fileset dir="${basedir}/src/main/build/scripts">-->
<!-- <include name="*.sh" />-->
<!-- <include name="*.txt" />-->
<!-- <include name="*.bat" />-->
<!-- </fileset>-->
<!-- </copy>-->
<!-- <zip destfile='${project.build.directory}/build/${project.artifactId}.zip'>-->
<!-- <zipfileset filemode="755" dir= '${project.build.directory}/build/' />-->
<!-- </zip>-->
<!-- </tasks>-->
<!-- </configuration>-->
<!-- </execution>-->
<!-- </executions>-->
<!-- </plugin>-->
<!-- </plugins>-->
<!-- </build>-->
</project> </project>

View File

@ -1,53 +0,0 @@
#端口号
server:
port: 8085
#不分表的数据库配置
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/novel_plus?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
username: root
password: root
####使用shardingJdbc时
####所有的jdbcType都不能是LONGVARCHAR,否则会导致java.io.NotSerializableException: java.io.StringReader错误
##### 应该替换所有的 LONGVARCHAR 类型为VARCHAR
sharding:
jdbc:
datasource:
ds0:
jdbc-url: jdbc:mysql://localhost:3306/novel_plus?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
username: root
password: test123456
pic:
save:
#图片保存方式, 1不保存使用网络图片 2本地保存
type: 2
#图片保存路径
path: /var/pic
#模版配置
templates:
name: orange
#小说内容保存配置
content:
save:
storage: db #存储介质db数据库filetxt文本
path: /Users/xiongxiaoyang/books #txt小说文本保存路径
# HTTP 代理配置
http:
proxy:
# 是否开启 HTTP 代理true-开启false-不开启
enabled: false
# 代理 IP
ip: u493.kdltps.com
# 代理端口号
port: 15818

View File

@ -1,94 +0,0 @@
#!/bin/sh
APP_NAME=novel-front
JAR_NAME=$APP_NAME\.jar
#PID 代表是PID文件
PID=$APP_NAME\.pid
#使用说明,用来提示输入参数
usage() {
echo "Usage: ./novel-front.sh [start|stop|restart|status]"
exit 1
}
#检查程序是否在运行
is_exist(){
pid=`ps -ef|grep $JAR_NAME|grep -v grep|awk '{print $2}' `
#如果不存在返回1存在返回0
if [ -z "${pid}" ]; then
return 1
else
return 0
fi
}
#启动方法
start(){
is_exist
if [ $? -eq "0" ]; then
echo ">>> 小说精品屋前台正在运行 PID = ${pid} <<<"
else
echo ">>> 小说精品屋前台开始启动 <<<"
nohup java -jar -Dspring.profiles.active=prod $JAR_NAME >/dev/null 2>&1 &
sleep 20
echo $! > $PID
echo ">>> 小说精品屋前台启动完成 PID = $! <<<"
status
fi
}
#停止方法
stop(){
#is_exist
pidf=$(cat $PID)
#echo "$pidf"
echo ">>> 小说精品屋前台 PID = $pidf 开始停止 <<<"
kill $pidf
rm -rf $PID
sleep 2
is_exist
if [ $? -eq "0" ]; then
echo ">>> 小说精品屋前台 PID = $pid 开始强制停止 <<<"
kill -9 $pid
sleep 2
status
else
status
fi
}
#输出运行状态
status(){
is_exist
if [ $? -eq "0" ]; then
echo ">>> 小说精品屋前台正在运行 PID = ${pid} <<<"
else
echo ">>> 小说精品屋前台没有运行 <<<"
fi
}
#重启
restart(){
stop
start
}
#根据输入参数,选择执行对应方法,不输入则执行使用说明
case "$1" in
"start")
start
;;
"stop")
stop
;;
"status")
status
;;
"restart")
restart
;;
*)
usage
;;
esac
exit 0

View File

@ -0,0 +1,8 @@
1linux启动环境
sh start.sh
3windows启动环境
windows-start.bat
3linux停止应用
sh stop.sh

View File

@ -0,0 +1,47 @@
#!/bin/bash
ENGINE=novel-front.jar
cd ../
#部署目路
DEPLOY_DIR=`pwd`
#获取到当前目录的名称
SERVER_NAME=`basename $DEPLOY_DIR`
#应用进程
PIDS=`ps -ef | grep java | grep "$ENGINE" |awk '{print $2}'`
#设置日志文件的输出目录
LOGS_DIR=$DEPLOY_DIR/logs
if [ ! -d $LOGS_DIR ]; then
mkdir $LOGS_DIR
fi
#日志
STDOUT_FILE=$LOGS_DIR/stdout.log
#JAVA 环境配置
JAVA_OPTS=" -Djava.net.preferIPv4Stack=true -Dlog.home=$LOGS_DIR"
JAVA_MEM_OPTS=" -server -Xms1024m -Xmx1024m -XX:MetaspaceSize=64m -XX:MaxMetaspaceSize=256m -XX:+UseG1GC -XX:MaxGCPauseMillis=100 -XX:InitiatingHeapOccupancyPercent=50 -XX:+PrintGCApplicationStoppedTime -XX:+PrintGCApplicationConcurrentTime -XX:+PrintGCDateStamps -verbose:gc -XX:+PrintGCDetails -XX:+PrintHeapAtGC -Xloggc:$LOGS_DIR/gc.log -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=100M -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=dump.hprof "
#退出标志
RETVAL="0"
if [ -n "$PIDS" ]; then
echo "ERROR: The $SERVER_NAME already started!"
echo "PID: $PIDS"
exit $RETVAL
fi
nohup java -jar $JAVA_OPTS $JAVA_MEM_OPTS -Dloader.path=conf,lib $ENGINE > $STDOUT_FILE 2>&1 &
COUNT=0
while [ $COUNT -lt 1 ]; do
echo -e ".\c"
sleep 1
COUNT=`ps -f | grep java | grep "$DEPLOY_DIR" | awk '{print $2}' | wc -l`
if [ $COUNT -gt 0 ]; then
break
fi
done
echo "OK!"
PIDS=`ps -f | grep java | grep "$DEPLOY_DIR" | awk '{print $2}'`
echo "PID: $PIDS"
echo "STDOUT: $STDOUT_FILE"

View File

@ -0,0 +1,33 @@
#!/bin/bash
SERVER_NAME=novel-front.jar
#应用进程
PIDS=`ps -ef | grep java | grep "$SERVER_NAME" |awk '{print $2}'`
if [ -z "$PIDS" ]; then
echo "ERROR: The $SERVER_NAME does not started!"
exit 1
fi
echo -e "Stopping the $SERVER_NAME ...\c"
for PID in $PIDS ; do
kill $PID > /dev/null 2>&1
done
COUNT=0
while [ $COUNT -lt 1 ]; do
echo -e ".\c"
sleep 1
COUNT=1
for PID in $PIDS ; do
PID_EXIST=`ps -f -p $PID | grep java`
if [ -n "$PID_EXIST" ]; then
COUNT=0
break
fi
done
done
echo "OK!"
echo "PID: $PIDS"
PIDS=""

View File

@ -0,0 +1,10 @@
@echo off
setlocal enabledelayedexpansion
set JAVA=java
set OPTS=-XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=128m -Xms1024m -Xmx1024m -Xmn256m -Xss256k -XX:SurvivorRatio=8 -XX:+UseConcMarkSweepGC
set ENGINE=novel-front.jar
cd ../
java -jar %OPTS% -Dloader.path=conf,lib %ENGINE%
pause

View File

@ -1,14 +1,12 @@
package com.java2nb.novel; package com.java2nb.novel;
import com.github.tobato.fastdfs.FdfsClientConfig; import com.github.tobato.fastdfs.FdfsClientConfig;
import lombok.extern.slf4j.Slf4j; import io.shardingsphere.shardingjdbc.spring.boot.SpringBootConfiguration;
import org.mybatis.spring.annotation.MapperScan; import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan; import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.cache.annotation.EnableCaching; import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Import; import org.springframework.context.annotation.Import;
import org.springframework.scheduling.TaskScheduler; import org.springframework.scheduling.TaskScheduler;
@ -16,8 +14,6 @@ import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import org.springframework.transaction.annotation.EnableTransactionManagement; import org.springframework.transaction.annotation.EnableTransactionManagement;
import java.net.InetAddress;
/** /**
* @author Administrator * @author Administrator
*/ */
@ -28,23 +24,15 @@ import java.net.InetAddress;
@ServletComponentScan @ServletComponentScan
@MapperScan(basePackages = {"com.java2nb.novel.mapper"}) @MapperScan(basePackages = {"com.java2nb.novel.mapper"})
@Import(FdfsClientConfig.class) @Import(FdfsClientConfig.class)
@Slf4j
public class FrontNovelApplication { public class FrontNovelApplication {
public static void main(String[] args) { public static void main(String[] args) {
SpringApplication.run(FrontNovelApplication.class); SpringApplication.run(FrontNovelApplication.class);
} }
@Bean
public CommandLineRunner commandLineRunner(ApplicationContext ctx) {
return args -> {
log.info("项目启动啦,访问路径:{}", "http://" + InetAddress.getLocalHost().getHostAddress() + ":" + ctx.getEnvironment().getProperty("server.port"));
};
}
/** /**
* 解决同一时间只能一个定时任务执行的问题 * 解决同一时间只能一个定时任务执行的问题
*/ * */
@Bean @Bean
public TaskScheduler taskScheduler() { public TaskScheduler taskScheduler() {
ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler(); ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();

View File

@ -1,11 +1,10 @@
package com.java2nb.novel.controller; package com.java2nb.novel.controller;
import io.github.xxyopen.model.page.PageBean; import com.java2nb.novel.core.bean.PageBean;
import com.java2nb.novel.core.bean.ResultBean;
import com.java2nb.novel.core.bean.UserDetails; import com.java2nb.novel.core.bean.UserDetails;
import com.java2nb.novel.core.enums.ResponseStatus; import com.java2nb.novel.core.enums.ResponseStatus;
import io.github.xxyopen.model.resp.RestResult; import com.java2nb.novel.core.exception.BusinessException;
import io.github.xxyopen.web.exception.BusinessException;
import com.java2nb.novel.entity.Author; import com.java2nb.novel.entity.Author;
import com.java2nb.novel.entity.AuthorIncome; import com.java2nb.novel.entity.AuthorIncome;
import com.java2nb.novel.entity.AuthorIncomeDetail; import com.java2nb.novel.entity.AuthorIncomeDetail;
@ -36,25 +35,25 @@ public class AuthorController extends BaseController{
* 校验笔名是否存在 * 校验笔名是否存在
* */ * */
@GetMapping("checkPenName") @GetMapping("checkPenName")
public RestResult<Boolean> checkPenName(String penName){ public ResultBean<Boolean> checkPenName(String penName){
return RestResult.ok(authorService.checkPenName(penName)); return ResultBean.ok(authorService.checkPenName(penName));
} }
/** /**
* 作家发布小说分页列表查询 * 作家发布小说分页列表查询
* */ * */
@GetMapping("listBookByPage") @GetMapping("listBookByPage")
public RestResult<PageBean<Book>> listBookByPage(@RequestParam(value = "curr", defaultValue = "1") int page, @RequestParam(value = "limit", defaultValue = "10") int pageSize , HttpServletRequest request){ public ResultBean<PageBean<Book>> listBookByPage(@RequestParam(value = "curr", defaultValue = "1") int page, @RequestParam(value = "limit", defaultValue = "10") int pageSize , HttpServletRequest request){
return RestResult.ok(bookService.listBookPageByUserId(getUserDetails(request).getId(),page,pageSize)); return ResultBean.ok(bookService.listBookPageByUserId(getUserDetails(request).getId(),page,pageSize));
} }
/** /**
* 发布小说 * 发布小说
* */ * */
@PostMapping("addBook") @PostMapping("addBook")
public RestResult<Void> addBook(@RequestParam("bookDesc") String bookDesc,Book book,HttpServletRequest request){ public ResultBean<Void> addBook(@RequestParam("bookDesc") String bookDesc,Book book,HttpServletRequest request){
Author author = checkAuthor(request); Author author = checkAuthor(request);
@ -65,20 +64,20 @@ public class AuthorController extends BaseController{
//发布小说 //发布小说
bookService.addBook(book,author.getId(),author.getPenName()); bookService.addBook(book,author.getId(),author.getPenName());
return RestResult.ok(); return ResultBean.ok();
} }
/** /**
* 更新小说状态,上架或下架 * 更新小说状态,上架或下架
* */ * */
@PostMapping("updateBookStatus") @PostMapping("updateBookStatus")
public RestResult<Void> updateBookStatus(Long bookId,Byte status,HttpServletRequest request){ public ResultBean<Void> updateBookStatus(Long bookId,Byte status,HttpServletRequest request){
Author author = checkAuthor(request); Author author = checkAuthor(request);
//更新小说状态,上架或下架 //更新小说状态,上架或下架
bookService.updateBookStatus(bookId,status,author.getId()); bookService.updateBookStatus(bookId,status,author.getId());
return RestResult.ok(); return ResultBean.ok();
} }
@ -87,28 +86,28 @@ public class AuthorController extends BaseController{
* 删除章节 * 删除章节
*/ */
@DeleteMapping("deleteIndex/{indexId}") @DeleteMapping("deleteIndex/{indexId}")
public RestResult<Void> deleteIndex(@PathVariable("indexId") Long indexId, HttpServletRequest request) { public ResultBean<Void> deleteIndex(@PathVariable("indexId") Long indexId, HttpServletRequest request) {
Author author = checkAuthor(request); Author author = checkAuthor(request);
//删除章节 //删除章节
bookService.deleteIndex(indexId, author.getId()); bookService.deleteIndex(indexId, author.getId());
return RestResult.ok(); return ResultBean.ok();
} }
/** /**
* 更新章节名 * 更新章节名
*/ */
@PostMapping("updateIndexName") @PostMapping("updateIndexName")
public RestResult<Void> updateIndexName(Long indexId, String indexName, HttpServletRequest request) { public ResultBean<Void> updateIndexName(Long indexId, String indexName, HttpServletRequest request) {
Author author = checkAuthor(request); Author author = checkAuthor(request);
//更新章节名 //更新章节名
bookService.updateIndexName(indexId, indexName, author.getId()); bookService.updateIndexName(indexId, indexName, author.getId());
return RestResult.ok(); return ResultBean.ok();
} }
@ -118,7 +117,7 @@ public class AuthorController extends BaseController{
* 发布章节内容 * 发布章节内容
*/ */
@PostMapping("addBookContent") @PostMapping("addBookContent")
public RestResult<Void> addBookContent(Long bookId, String indexName, String content,Byte isVip, HttpServletRequest request) { public ResultBean<Void> addBookContent(Long bookId, String indexName, String content,Byte isVip, HttpServletRequest request) {
Author author = checkAuthor(request); Author author = checkAuthor(request);
content = content.replaceAll("\\n", "<br>") content = content.replaceAll("\\n", "<br>")
@ -126,14 +125,14 @@ public class AuthorController extends BaseController{
//发布章节内容 //发布章节内容
bookService.addBookContent(bookId, indexName, content,isVip, author.getId()); bookService.addBookContent(bookId, indexName, content,isVip, author.getId());
return RestResult.ok(); return ResultBean.ok();
} }
/** /**
* 查询章节内容 * 查询章节内容
*/ */
@GetMapping("queryIndexContent/{indexId}") @GetMapping("queryIndexContent/{indexId}")
public RestResult<String> queryIndexContent(@PathVariable("indexId") Long indexId, HttpServletRequest request) { public ResultBean<String> queryIndexContent(@PathVariable("indexId") Long indexId, HttpServletRequest request) {
Author author = checkAuthor(request); Author author = checkAuthor(request);
@ -142,14 +141,14 @@ public class AuthorController extends BaseController{
content = content.replaceAll("<br>", "\n") content = content.replaceAll("<br>", "\n")
.replaceAll("&nbsp;", " "); .replaceAll("&nbsp;", " ");
return RestResult.ok(content); return ResultBean.ok(content);
} }
/** /**
* 更新章节内容 * 更新章节内容
*/ */
@PostMapping("updateBookContent") @PostMapping("updateBookContent")
public RestResult<Void> updateBookContent(Long indexId, String indexName, String content, HttpServletRequest request) { public ResultBean<Void> updateBookContent(Long indexId, String indexName, String content, HttpServletRequest request) {
Author author = checkAuthor(request); Author author = checkAuthor(request);
content = content.replaceAll("\\n", "<br>") content = content.replaceAll("\\n", "<br>")
@ -157,17 +156,17 @@ public class AuthorController extends BaseController{
//更新章节内容 //更新章节内容
bookService.updateBookContent(indexId, indexName, content, author.getId()); bookService.updateBookContent(indexId, indexName, content, author.getId());
return RestResult.ok(); return ResultBean.ok();
} }
/** /**
* 修改小说封面 * 修改小说封面
*/ */
@PostMapping("updateBookPic") @PostMapping("updateBookPic")
public RestResult<Void> updateBookPic(@RequestParam("bookId") Long bookId,@RequestParam("bookPic") String bookPic,HttpServletRequest request) { public ResultBean<Void> updateBookPic(@RequestParam("bookId") Long bookId,@RequestParam("bookPic") String bookPic,HttpServletRequest request) {
Author author = checkAuthor(request); Author author = checkAuthor(request);
bookService.updateBookPic(bookId,bookPic, author.getId()); bookService.updateBookPic(bookId,bookPic, author.getId());
return RestResult.ok(); return ResultBean.ok();
} }
@ -175,14 +174,14 @@ public class AuthorController extends BaseController{
* 作家日收入统计数据分页列表查询 * 作家日收入统计数据分页列表查询
* */ * */
@GetMapping("listIncomeDailyByPage") @GetMapping("listIncomeDailyByPage")
public RestResult<PageBean<AuthorIncomeDetail>> listIncomeDailyByPage(@RequestParam(value = "curr", defaultValue = "1") int page, public ResultBean<PageBean<AuthorIncomeDetail>> listIncomeDailyByPage(@RequestParam(value = "curr", defaultValue = "1") int page,
@RequestParam(value = "limit", defaultValue = "10") int pageSize , @RequestParam(value = "limit", defaultValue = "10") int pageSize ,
@RequestParam(value = "bookId", defaultValue = "0") Long bookId, @RequestParam(value = "bookId", defaultValue = "0") Long bookId,
@RequestParam(value = "startTime",defaultValue = "2020-05-01") Date startTime, @RequestParam(value = "startTime",defaultValue = "2020-05-01") Date startTime,
@RequestParam(value = "endTime",defaultValue = "2030-01-01") Date endTime, @RequestParam(value = "endTime",defaultValue = "2030-01-01") Date endTime,
HttpServletRequest request){ HttpServletRequest request){
return RestResult.ok(authorService.listIncomeDailyByPage(page,pageSize,getUserDetails(request).getId(),bookId,startTime,endTime)); return ResultBean.ok(authorService.listIncomeDailyByPage(page,pageSize,getUserDetails(request).getId(),bookId,startTime,endTime));
} }
@ -190,12 +189,12 @@ public class AuthorController extends BaseController{
* 作家月收入统计数据分页列表查询 * 作家月收入统计数据分页列表查询
* */ * */
@GetMapping("listIncomeMonthByPage") @GetMapping("listIncomeMonthByPage")
public RestResult<PageBean<AuthorIncome>> listIncomeMonthByPage(@RequestParam(value = "curr", defaultValue = "1") int page, public ResultBean<PageBean<AuthorIncome>> listIncomeMonthByPage(@RequestParam(value = "curr", defaultValue = "1") int page,
@RequestParam(value = "limit", defaultValue = "10") int pageSize , @RequestParam(value = "limit", defaultValue = "10") int pageSize ,
@RequestParam(value = "bookId", defaultValue = "0") Long bookId, @RequestParam(value = "bookId", defaultValue = "0") Long bookId,
HttpServletRequest request){ HttpServletRequest request){
return RestResult.ok(authorService.listIncomeMonthByPage(page,pageSize,getUserDetails(request).getId(),bookId)); return ResultBean.ok(authorService.listIncomeMonthByPage(page,pageSize,getUserDetails(request).getId(),bookId));
} }
private Author checkAuthor(HttpServletRequest request) { private Author checkAuthor(HttpServletRequest request) {

View File

@ -1,20 +1,19 @@
package com.java2nb.novel.controller; package com.java2nb.novel.controller;
import com.github.pagehelper.PageInfo;
import com.java2nb.novel.core.bean.PageBean;
import com.java2nb.novel.core.bean.ResultBean;
import com.java2nb.novel.core.bean.UserDetails; import com.java2nb.novel.core.bean.UserDetails;
import com.java2nb.novel.core.enums.ResponseStatus; import com.java2nb.novel.core.enums.ResponseStatus;
import com.java2nb.novel.entity.Book; import com.java2nb.novel.entity.Book;
import com.java2nb.novel.entity.BookCategory; import com.java2nb.novel.entity.BookCategory;
import com.java2nb.novel.entity.BookComment; import com.java2nb.novel.entity.BookComment;
import com.java2nb.novel.entity.BookIndex; import com.java2nb.novel.entity.BookIndex;
import com.java2nb.novel.service.BookContentService;
import com.java2nb.novel.vo.BookCommentVO; import com.java2nb.novel.vo.BookCommentVO;
import com.java2nb.novel.vo.BookSettingVO; import com.java2nb.novel.vo.BookSettingVO;
import com.java2nb.novel.vo.BookSpVO; import com.java2nb.novel.vo.BookSpVO;
import com.java2nb.novel.service.BookService; import com.java2nb.novel.service.BookService;
import com.java2nb.novel.vo.BookVO; 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.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.amqp.rabbit.core.RabbitTemplate;
@ -39,151 +38,152 @@ public class BookController extends BaseController {
private final RabbitTemplate rabbitTemplate; private final RabbitTemplate rabbitTemplate;
private final Map<String, BookContentService> bookContentServiceMap;
@Value("${spring.rabbitmq.enable}") @Value("${spring.rabbitmq.enable}")
private Integer enableMq; private Integer enableMq;
/** /**
* 查询首页小说设置列表数据 * 查询首页小说设置列表数据
*/ * */
@GetMapping("listBookSetting") @GetMapping("listBookSetting")
public RestResult<Map<Byte, List<BookSettingVO>>> listBookSetting() { public ResultBean<Map<Byte, List<BookSettingVO>>> listBookSetting(){
return RestResult.ok(bookService.listBookSettingVO()); return ResultBean.ok(bookService.listBookSettingVO());
} }
/** /**
* 查询首页点击榜单数据 * 查询首页点击榜单数据
*/ * */
@GetMapping("listClickRank") @GetMapping("listClickRank")
public RestResult<List<Book>> listClickRank() { public ResultBean<List<Book>> listClickRank(){
return RestResult.ok(bookService.listClickRank()); return ResultBean.ok(bookService.listClickRank());
} }
/** /**
* 查询首页新书榜单数据 * 查询首页新书榜单数据
*/ * */
@GetMapping("listNewRank") @GetMapping("listNewRank")
public RestResult<List<Book>> listNewRank() { public ResultBean<List<Book>> listNewRank(){
return RestResult.ok(bookService.listNewRank()); return ResultBean.ok(bookService.listNewRank());
} }
/** /**
* 查询首页更新榜单数据 * 查询首页更新榜单数据
*/ * */
@GetMapping("listUpdateRank") @GetMapping("listUpdateRank")
public RestResult<List<BookVO>> listUpdateRank() { public ResultBean<List<BookVO>> listUpdateRank(){
return RestResult.ok(bookService.listUpdateRank()); return ResultBean.ok(bookService.listUpdateRank());
} }
/** /**
* 查询小说分类列表 * 查询小说分类列表
*/ * */
@GetMapping("listBookCategory") @GetMapping("listBookCategory")
public RestResult<List<BookCategory>> listBookCategory() { public ResultBean<List<BookCategory>> listBookCategory(){
return RestResult.ok(bookService.listBookCategory()); return ResultBean.ok(bookService.listBookCategory());
} }
/** /**
* 分页搜索 * 分页搜索
*/ * */
@GetMapping("searchByPage") @GetMapping("searchByPage")
public RestResult<?> searchByPage(BookSpVO bookSP, @RequestParam(value = "curr", defaultValue = "1") int page, @RequestParam(value = "limit", defaultValue = "20") int pageSize) { public ResultBean<?> 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)); return ResultBean.ok(bookService.searchByPage(bookSP,page,pageSize));
} }
/** /**
* 查询小说详情信息 * 查询小说详情信息
*/ * */
@GetMapping("queryBookDetail/{id}") @GetMapping("queryBookDetail/{id}")
public RestResult<Book> queryBookDetail(@PathVariable("id") Long id) { public ResultBean<Book> queryBookDetail(@PathVariable("id") Long id){
return RestResult.ok(bookService.queryBookDetail(id)); return ResultBean.ok(bookService.queryBookDetail(id));
} }
/** /**
* 查询小说排行信息 * 查询小说排行信息
*/ * */
@GetMapping("listRank") @GetMapping("listRank")
public RestResult<List<Book>> listRank(@RequestParam(value = "type", defaultValue = "0") Byte type, @RequestParam(value = "limit", defaultValue = "30") Integer limit) { public ResultBean<List<Book>> listRank(@RequestParam(value = "type",defaultValue = "0") Byte type,@RequestParam(value = "limit",defaultValue = "30") Integer limit){
return RestResult.ok(bookService.listRank(type, limit)); return ResultBean.ok(bookService.listRank(type,limit));
} }
/** /**
* 增加点击次数 * 增加点击次数
*/ * */
@PostMapping("addVisitCount") @PostMapping("addVisitCount")
public RestResult<Void> addVisitCount(Long bookId) { public ResultBean<Void> addVisitCount(Long bookId){
if(enableMq == 1) { if(enableMq == 1) {
rabbitTemplate.convertAndSend("ADD-BOOK-VISIT-EXCHANGE", null, bookId); rabbitTemplate.convertAndSend("ADD-BOOK-VISIT-EXCHANGE", null, bookId);
}else { }else {
bookService.addVisitCount(bookId, 1); bookService.addVisitCount(bookId, 1);
} }
return RestResult.ok(); return ResultBean.ok();
} }
/** /**
* 查询章节相关信息 * 查询章节相关信息
*/ * */
@GetMapping("queryBookIndexAbout") @GetMapping("queryBookIndexAbout")
public RestResult<Map<String, Object>> queryBookIndexAbout(Long bookId, Long lastBookIndexId) { public ResultBean<Map<String,Object>> queryBookIndexAbout(Long bookId,Long lastBookIndexId) {
Map<String,Object> data = new HashMap<>(2); Map<String,Object> data = new HashMap<>(2);
data.put("bookIndexCount",bookService.queryIndexCount(bookId)); data.put("bookIndexCount",bookService.queryIndexCount(bookId));
BookIndex bookIndex = bookService.queryBookIndex(lastBookIndexId); String lastBookContent = bookService.queryBookContent(lastBookIndexId).getContent();
String lastBookContent = bookContentServiceMap.get(bookIndex.getStorageType()).queryBookContent(bookId,lastBookIndexId).getContent();
if(lastBookContent.length()>42){ if(lastBookContent.length()>42){
lastBookContent=lastBookContent.substring(0,42); lastBookContent=lastBookContent.substring(0,42);
} }
data.put("lastBookContent",lastBookContent); data.put("lastBookContent",lastBookContent);
return RestResult.ok(data); return ResultBean.ok(data);
} }
/** /**
* 根据分类id查询同类推荐书籍 * 根据分类id查询同类推荐书籍
*/ * */
@GetMapping("listRecBookByCatId") @GetMapping("listRecBookByCatId")
public RestResult<List<Book>> listRecBookByCatId(Integer catId) { public ResultBean<List<Book>> listRecBookByCatId(Integer catId) {
return RestResult.ok(bookService.listRecBookByCatId(catId)); return ResultBean.ok(bookService.listRecBookByCatId(catId));
} }
/** /**
*分页查询书籍评论列表 *分页查询书籍评论列表
*/ * */
@GetMapping("listCommentByPage") @GetMapping("listCommentByPage")
public RestResult<PageBean<BookCommentVO>> listCommentByPage(@RequestParam("bookId") Long bookId, @RequestParam(value = "curr", defaultValue = "1") int page, @RequestParam(value = "limit", defaultValue = "5") int pageSize) { public ResultBean<PageBean<BookCommentVO>> 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)); return ResultBean.ok(bookService.listCommentByPage(null,bookId,page,pageSize));
} }
/** /**
* 新增评价 * 新增评价
*/ * */
@PostMapping("addBookComment") @PostMapping("addBookComment")
public RestResult<?> addBookComment(BookComment comment, HttpServletRequest request) { public ResultBean<?> addBookComment(BookComment comment, HttpServletRequest request) {
UserDetails userDetails = getUserDetails(request); UserDetails userDetails = getUserDetails(request);
if (userDetails == null) { if (userDetails == null) {
return RestResult.fail(ResponseStatus.NO_LOGIN); return ResultBean.fail(ResponseStatus.NO_LOGIN);
} }
bookService.addBookComment(userDetails.getId(),comment); bookService.addBookComment(userDetails.getId(),comment);
return RestResult.ok(); return ResultBean.ok();
} }
/** /**
* 根据小说ID查询小说前十条最新更新目录集合 * 根据小说ID查询小说前十条最新更新目录集合
*/ * */
@GetMapping("queryNewIndexList") @GetMapping("queryNewIndexList")
public RestResult<List<BookIndex>> queryNewIndexList(Long bookId) { public ResultBean<List<BookIndex>> queryNewIndexList(Long bookId){
return RestResult.ok(bookService.queryIndexList(bookId, "index_num desc", 1, 10)); return ResultBean.ok(bookService.queryIndexList(bookId,"index_num desc",1,10));
} }
/** /**
* 目录页 * 目录页
*/ * */
@GetMapping("/queryIndexList") @GetMapping("/queryIndexList")
public RestResult<PageBean<BookIndex>> 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 ResultBean<PageBean<BookIndex>> 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))); return ResultBean.ok(new PageBean<>(bookService.queryIndexList(bookId,orderBy,page,pageSize)));
} }
} }

View File

@ -1,13 +1,12 @@
package com.java2nb.novel.controller; package com.java2nb.novel.controller;
import com.java2nb.novel.core.bean.ResultBean;
import com.java2nb.novel.core.cache.CacheKey; import com.java2nb.novel.core.cache.CacheKey;
import com.java2nb.novel.core.cache.CacheService; import com.java2nb.novel.core.cache.CacheService;
import com.java2nb.novel.core.enums.ResponseStatus; import com.java2nb.novel.core.enums.ResponseStatus;
import com.java2nb.novel.service.BookService; import com.java2nb.novel.service.BookService;
import com.java2nb.novel.service.FriendLinkService; import com.java2nb.novel.service.FriendLinkService;
import com.java2nb.novel.service.NewsService; import com.java2nb.novel.service.NewsService;
import io.github.xxyopen.model.resp.RestResult;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
@ -41,9 +40,9 @@ public class CacheController {
* @param type 缓存类型1首页书籍推荐2首页新闻3首页友情链接 * @param type 缓存类型1首页书籍推荐2首页新闻3首页友情链接
* */ * */
@GetMapping("refresh/{pass}/{type}") @GetMapping("refresh/{pass}/{type}")
public RestResult<Void> refreshCache(@PathVariable("type") Byte type, @PathVariable("pass") String pass){ public ResultBean<Void> refreshCache(@PathVariable("type") Byte type, @PathVariable("pass") String pass){
if(!cacheManagerPass.equals(pass)){ if(!cacheManagerPass.equals(pass)){
return RestResult.fail(ResponseStatus.PASSWORD_ERROR); return ResultBean.fail(ResponseStatus.PASSWORD_ERROR);
} }
switch (type){ switch (type){
case 1:{ case 1:{
@ -70,7 +69,7 @@ public class CacheController {
} }
return RestResult.ok(); return ResultBean.ok();
} }

View File

@ -1,14 +1,13 @@
package com.java2nb.novel.controller; package com.java2nb.novel.controller;
import com.java2nb.novel.core.bean.ResultBean;
import com.java2nb.novel.core.cache.CacheService; import com.java2nb.novel.core.cache.CacheService;
import com.java2nb.novel.core.enums.ResponseStatus; import com.java2nb.novel.core.enums.ResponseStatus;
import com.java2nb.novel.core.exception.BusinessException;
import com.java2nb.novel.core.utils.Constants; import com.java2nb.novel.core.utils.Constants;
import com.java2nb.novel.core.utils.FileUtil; import com.java2nb.novel.core.utils.FileUtil;
import com.java2nb.novel.core.utils.RandomValidateCodeUtil; import com.java2nb.novel.core.utils.RandomValidateCodeUtil;
import io.github.xxyopen.model.resp.RestResult; import com.java2nb.novel.core.utils.UUIDUtil;
import io.github.xxyopen.util.UUIDUtil;
import io.github.xxyopen.web.exception.BusinessException;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.SneakyThrows; import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@ -20,8 +19,9 @@ import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import java.io.File; import java.io.*;
import java.util.Date; import java.util.Date;
import java.util.Objects;
/** /**
* @author 11797 * @author 11797
@ -64,7 +64,7 @@ public class FileController {
@SneakyThrows @SneakyThrows
@ResponseBody @ResponseBody
@PostMapping("/picUpload") @PostMapping("/picUpload")
RestResult<String> upload(@RequestParam("file") MultipartFile file) { ResultBean<String> upload(@RequestParam("file") MultipartFile file) {
Date currentDate = new Date(); Date currentDate = new Date();
String savePath = String savePath =
Constants.LOCAL_PIC_PREFIX + DateUtils.formatDate(currentDate, "yyyy") + "/" + Constants.LOCAL_PIC_PREFIX + DateUtils.formatDate(currentDate, "yyyy") + "/" +
@ -86,7 +86,7 @@ public class FileController {
saveFile.delete(); saveFile.delete();
throw new BusinessException(ResponseStatus.FILE_NOT_IMAGE); throw new BusinessException(ResponseStatus.FILE_NOT_IMAGE);
}; };
return RestResult.ok(savePath + "/" + saveFileName); return ResultBean.ok(savePath + "/" + saveFileName);
} }

View File

@ -1,12 +1,12 @@
package com.java2nb.novel.controller; package com.java2nb.novel.controller;
import com.java2nb.novel.core.bean.ResultBean;
import com.java2nb.novel.entity.FriendLink; import com.java2nb.novel.entity.FriendLink;
import com.java2nb.novel.service.FriendLinkService; import com.java2nb.novel.service.FriendLinkService;
import io.github.xxyopen.model.resp.RestResult;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
@ -27,8 +27,8 @@ public class FriendLinkController {
* 查询首页友情链接 * 查询首页友情链接
* */ * */
@GetMapping("listIndexLink") @GetMapping("listIndexLink")
public RestResult<List<FriendLink>> listIndexLink(){ public ResultBean<List<FriendLink>> listIndexLink(){
return RestResult.ok(friendLinkService.listIndexLink()); return ResultBean.ok(friendLinkService.listIndexLink());
} }

View File

@ -1,10 +1,10 @@
package com.java2nb.novel.controller; package com.java2nb.novel.controller;
import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInfo;
import io.github.xxyopen.model.page.PageBean; import com.java2nb.novel.core.bean.PageBean;
import com.java2nb.novel.core.bean.ResultBean;
import com.java2nb.novel.entity.News; import com.java2nb.novel.entity.News;
import com.java2nb.novel.service.NewsService; import com.java2nb.novel.service.NewsService;
import io.github.xxyopen.model.resp.RestResult;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
@ -26,25 +26,25 @@ public class NewsController {
* 查询首页新闻 * 查询首页新闻
* */ * */
@GetMapping("listIndexNews") @GetMapping("listIndexNews")
public RestResult<List<News>> listIndexNews(){ public ResultBean<List<News>> listIndexNews(){
return RestResult.ok(newsService.listIndexNews()); return ResultBean.ok(newsService.listIndexNews());
} }
/** /**
* 分页查询新闻列表 * 分页查询新闻列表
* */ * */
@GetMapping("listByPage") @GetMapping("listByPage")
public RestResult<PageBean<News>> listByPage(@RequestParam(value = "curr", defaultValue = "1") int page, @RequestParam(value = "limit", defaultValue = "5") int pageSize){ public ResultBean<PageBean<News>> listByPage(@RequestParam(value = "curr", defaultValue = "1") int page, @RequestParam(value = "limit", defaultValue = "5") int pageSize){
return RestResult.ok(newsService.listByPage(page,pageSize)); return ResultBean.ok(newsService.listByPage(page,pageSize));
} }
/** /**
* 增加新闻阅读量 * 增加新闻阅读量
* */ * */
@PostMapping("addReadCount") @PostMapping("addReadCount")
public RestResult<Void> addReadCount(@RequestParam(value = "newsId") Integer newsId){ public ResultBean<Void> addReadCount(@RequestParam(value = "newsId") Integer newsId){
newsService.addReadCount(newsId); newsService.addReadCount(newsId);
return RestResult.ok(); return ResultBean.ok();
} }

View File

@ -1,17 +1,16 @@
package com.java2nb.novel.controller; package com.java2nb.novel.controller;
import com.java2nb.novel.core.bean.ResultBean;
import com.java2nb.novel.core.bean.UserDetails; import com.java2nb.novel.core.bean.UserDetails;
import com.java2nb.novel.core.cache.CacheService; import com.java2nb.novel.core.cache.CacheService;
import com.java2nb.novel.core.enums.ResponseStatus; import com.java2nb.novel.core.enums.ResponseStatus;
import com.java2nb.novel.core.utils.RandomValidateCodeUtil; import com.java2nb.novel.core.utils.RandomValidateCodeUtil;
import com.java2nb.novel.core.valid.AddGroup;
import com.java2nb.novel.core.valid.UpdateGroup;
import com.java2nb.novel.entity.User; import com.java2nb.novel.entity.User;
import com.java2nb.novel.entity.UserBuyRecord; import com.java2nb.novel.entity.UserBuyRecord;
import com.java2nb.novel.service.BookService; import com.java2nb.novel.service.BookService;
import com.java2nb.novel.service.UserService; import com.java2nb.novel.service.UserService;
import io.github.xxyopen.model.resp.RestResult;
import io.github.xxyopen.web.valid.AddGroup;
import io.github.xxyopen.web.valid.UpdateGroup;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
@ -42,7 +41,7 @@ public class UserController extends BaseController {
* 登陆 * 登陆
*/ */
@PostMapping("login") @PostMapping("login")
public RestResult<Map<String, Object>> login(User user) { public ResultBean<Map<String, Object>> login(User user) {
//登陆 //登陆
UserDetails userDetails = userService.login(user); UserDetails userDetails = userService.login(user);
@ -50,7 +49,7 @@ public class UserController extends BaseController {
Map<String, Object> data = new HashMap<>(1); Map<String, Object> data = new HashMap<>(1);
data.put("token", jwtTokenUtil.generateToken(userDetails)); data.put("token", jwtTokenUtil.generateToken(userDetails));
return RestResult.ok(data); return ResultBean.ok(data);
} }
@ -59,12 +58,12 @@ public class UserController extends BaseController {
* 注册 * 注册
*/ */
@PostMapping("register") @PostMapping("register")
public RestResult<?> register(@Validated({AddGroup.class}) User user, @RequestParam(value = "velCode", defaultValue = "") String velCode) { public ResultBean<?> register(@Validated({AddGroup.class}) User user, @RequestParam(value = "velCode", defaultValue = "") String velCode) {
//判断验证码是否正确 //判断验证码是否正确
if (!velCode.equals(cacheService.get(RandomValidateCodeUtil.RANDOM_CODE_KEY))) { if (!velCode.equals(cacheService.get(RandomValidateCodeUtil.RANDOM_CODE_KEY))) {
return RestResult.fail(ResponseStatus.VEL_CODE_ERROR); return ResultBean.fail(ResponseStatus.VEL_CODE_ERROR);
} }
//注册 //注册
@ -72,7 +71,7 @@ public class UserController extends BaseController {
Map<String, Object> data = new HashMap<>(1); Map<String, Object> data = new HashMap<>(1);
data.put("token", jwtTokenUtil.generateToken(userDetails)); data.put("token", jwtTokenUtil.generateToken(userDetails));
return RestResult.ok(data); return ResultBean.ok(data);
} }
@ -82,7 +81,7 @@ public class UserController extends BaseController {
* 刷新token * 刷新token
*/ */
@PostMapping("refreshToken") @PostMapping("refreshToken")
public RestResult<?> refreshToken(HttpServletRequest request) { public ResultBean<?> refreshToken(HttpServletRequest request) {
String token = getToken(request); String token = getToken(request);
if (jwtTokenUtil.canRefresh(token)) { if (jwtTokenUtil.canRefresh(token)) {
token = jwtTokenUtil.refreshToken(token); token = jwtTokenUtil.refreshToken(token);
@ -91,10 +90,10 @@ public class UserController extends BaseController {
UserDetails userDetail = jwtTokenUtil.getUserDetailsFromToken(token); UserDetails userDetail = jwtTokenUtil.getUserDetailsFromToken(token);
data.put("username", userDetail.getUsername()); data.put("username", userDetail.getUsername());
data.put("nickName", userDetail.getNickName()); data.put("nickName", userDetail.getNickName());
return RestResult.ok(data); return ResultBean.ok(data);
} else { } else {
return RestResult.fail(ResponseStatus.NO_LOGIN); return ResultBean.fail(ResponseStatus.NO_LOGIN);
} }
} }
@ -103,131 +102,131 @@ public class UserController extends BaseController {
* 查询小说是否已加入书架 * 查询小说是否已加入书架
*/ */
@GetMapping("queryIsInShelf") @GetMapping("queryIsInShelf")
public RestResult<?> queryIsInShelf(Long bookId, HttpServletRequest request) { public ResultBean<?> queryIsInShelf(Long bookId, HttpServletRequest request) {
UserDetails userDetails = getUserDetails(request); UserDetails userDetails = getUserDetails(request);
if (userDetails == null) { if (userDetails == null) {
return RestResult.fail(ResponseStatus.NO_LOGIN); return ResultBean.fail(ResponseStatus.NO_LOGIN);
} }
return RestResult.ok(userService.queryIsInShelf(userDetails.getId(), bookId)); return ResultBean.ok(userService.queryIsInShelf(userDetails.getId(), bookId));
} }
/** /**
* 加入书架 * 加入书架
* */ * */
@PostMapping("addToBookShelf") @PostMapping("addToBookShelf")
public RestResult<Void> addToBookShelf(Long bookId,Long preContentId, HttpServletRequest request) { public ResultBean<Void> addToBookShelf(Long bookId,Long preContentId, HttpServletRequest request) {
UserDetails userDetails = getUserDetails(request); UserDetails userDetails = getUserDetails(request);
if (userDetails == null) { if (userDetails == null) {
return RestResult.fail(ResponseStatus.NO_LOGIN); return ResultBean.fail(ResponseStatus.NO_LOGIN);
} }
userService.addToBookShelf(userDetails.getId(),bookId,preContentId); userService.addToBookShelf(userDetails.getId(),bookId,preContentId);
return RestResult.ok(); return ResultBean.ok();
} }
/** /**
* 移出书架 * 移出书架
* */ * */
@DeleteMapping("removeFromBookShelf/{bookId}") @DeleteMapping("removeFromBookShelf/{bookId}")
public RestResult<?> removeFromBookShelf(@PathVariable("bookId") Long bookId, HttpServletRequest request) { public ResultBean<?> removeFromBookShelf(@PathVariable("bookId") Long bookId, HttpServletRequest request) {
UserDetails userDetails = getUserDetails(request); UserDetails userDetails = getUserDetails(request);
if (userDetails == null) { if (userDetails == null) {
return RestResult.fail(ResponseStatus.NO_LOGIN); return ResultBean.fail(ResponseStatus.NO_LOGIN);
} }
userService.removeFromBookShelf(userDetails.getId(),bookId); userService.removeFromBookShelf(userDetails.getId(),bookId);
return RestResult.ok(); return ResultBean.ok();
} }
/** /**
* 分页查询书架 * 分页查询书架
* */ * */
@GetMapping("listBookShelfByPage") @GetMapping("listBookShelfByPage")
public RestResult<?> listBookShelfByPage(@RequestParam(value = "curr", defaultValue = "1") int page, @RequestParam(value = "limit", defaultValue = "10") int pageSize,HttpServletRequest request) { public ResultBean<?> listBookShelfByPage(@RequestParam(value = "curr", defaultValue = "1") int page, @RequestParam(value = "limit", defaultValue = "10") int pageSize,HttpServletRequest request) {
UserDetails userDetails = getUserDetails(request); UserDetails userDetails = getUserDetails(request);
if (userDetails == null) { if (userDetails == null) {
return RestResult.fail(ResponseStatus.NO_LOGIN); return ResultBean.fail(ResponseStatus.NO_LOGIN);
} }
return RestResult.ok(userService.listBookShelfByPage(userDetails.getId(),page,pageSize)); return ResultBean.ok(userService.listBookShelfByPage(userDetails.getId(),page,pageSize));
} }
/** /**
* 分页查询阅读记录 * 分页查询阅读记录
* */ * */
@GetMapping("listReadHistoryByPage") @GetMapping("listReadHistoryByPage")
public RestResult<?> listReadHistoryByPage(@RequestParam(value = "curr", defaultValue = "1") int page, @RequestParam(value = "limit", defaultValue = "10") int pageSize,HttpServletRequest request) { public ResultBean<?> listReadHistoryByPage(@RequestParam(value = "curr", defaultValue = "1") int page, @RequestParam(value = "limit", defaultValue = "10") int pageSize,HttpServletRequest request) {
UserDetails userDetails = getUserDetails(request); UserDetails userDetails = getUserDetails(request);
if (userDetails == null) { if (userDetails == null) {
return RestResult.fail(ResponseStatus.NO_LOGIN); return ResultBean.fail(ResponseStatus.NO_LOGIN);
} }
return RestResult.ok(userService.listReadHistoryByPage(userDetails.getId(),page,pageSize)); return ResultBean.ok(userService.listReadHistoryByPage(userDetails.getId(),page,pageSize));
} }
/** /**
* 添加阅读记录 * 添加阅读记录
* */ * */
@PostMapping("addReadHistory") @PostMapping("addReadHistory")
public RestResult<?> addReadHistory(Long bookId,Long preContentId, HttpServletRequest request) { public ResultBean<?> addReadHistory(Long bookId,Long preContentId, HttpServletRequest request) {
UserDetails userDetails = getUserDetails(request); UserDetails userDetails = getUserDetails(request);
if (userDetails == null) { if (userDetails == null) {
return RestResult.fail(ResponseStatus.NO_LOGIN); return ResultBean.fail(ResponseStatus.NO_LOGIN);
} }
userService.addReadHistory(userDetails.getId(),bookId,preContentId); userService.addReadHistory(userDetails.getId(),bookId,preContentId);
return RestResult.ok(); return ResultBean.ok();
} }
/** /**
* 添加反馈 * 添加反馈
* */ * */
@PostMapping("addFeedBack") @PostMapping("addFeedBack")
public RestResult<?> addFeedBack(String content, HttpServletRequest request) { public ResultBean<?> addFeedBack(String content, HttpServletRequest request) {
UserDetails userDetails = getUserDetails(request); UserDetails userDetails = getUserDetails(request);
if (userDetails == null) { if (userDetails == null) {
return RestResult.fail(ResponseStatus.NO_LOGIN); return ResultBean.fail(ResponseStatus.NO_LOGIN);
} }
userService.addFeedBack(userDetails.getId(),content); userService.addFeedBack(userDetails.getId(),content);
return RestResult.ok(); return ResultBean.ok();
} }
/** /**
* 分页查询我的反馈列表 * 分页查询我的反馈列表
* */ * */
@GetMapping("listUserFeedBackByPage") @GetMapping("listUserFeedBackByPage")
public RestResult<?> listUserFeedBackByPage(@RequestParam(value = "curr", defaultValue = "1") int page, @RequestParam(value = "limit", defaultValue = "5") int pageSize, HttpServletRequest request){ public ResultBean<?> listUserFeedBackByPage(@RequestParam(value = "curr", defaultValue = "1") int page, @RequestParam(value = "limit", defaultValue = "5") int pageSize, HttpServletRequest request){
UserDetails userDetails = getUserDetails(request); UserDetails userDetails = getUserDetails(request);
if (userDetails == null) { if (userDetails == null) {
return RestResult.fail(ResponseStatus.NO_LOGIN); return ResultBean.fail(ResponseStatus.NO_LOGIN);
} }
return RestResult.ok(userService.listUserFeedBackByPage(userDetails.getId(),page,pageSize)); return ResultBean.ok(userService.listUserFeedBackByPage(userDetails.getId(),page,pageSize));
} }
/** /**
* 查询个人信息 * 查询个人信息
* */ * */
@GetMapping("userInfo") @GetMapping("userInfo")
public RestResult<?> userInfo(HttpServletRequest request) { public ResultBean<?> userInfo(HttpServletRequest request) {
UserDetails userDetails = getUserDetails(request); UserDetails userDetails = getUserDetails(request);
if (userDetails == null) { if (userDetails == null) {
return RestResult.fail(ResponseStatus.NO_LOGIN); return ResultBean.fail(ResponseStatus.NO_LOGIN);
} }
return RestResult.ok(userService.userInfo(userDetails.getId())); return ResultBean.ok(userService.userInfo(userDetails.getId()));
} }
/** /**
* 更新个人信息 * 更新个人信息
* */ * */
@PostMapping("updateUserInfo") @PostMapping("updateUserInfo")
public RestResult<?> updateUserInfo(@Validated({UpdateGroup.class}) User user, HttpServletRequest request) { public ResultBean<?> updateUserInfo(@Validated({UpdateGroup.class}) User user, HttpServletRequest request) {
UserDetails userDetails = getUserDetails(request); UserDetails userDetails = getUserDetails(request);
if (userDetails == null) { if (userDetails == null) {
return RestResult.fail(ResponseStatus.NO_LOGIN); return ResultBean.fail(ResponseStatus.NO_LOGIN);
} }
userService.updateUserInfo(userDetails.getId(),user); userService.updateUserInfo(userDetails.getId(),user);
if(user.getNickName() != null){ if(user.getNickName() != null){
userDetails.setNickName(user.getNickName()); userDetails.setNickName(user.getNickName());
Map<String, Object> data = new HashMap<>(1); Map<String, Object> data = new HashMap<>(1);
data.put("token", jwtTokenUtil.generateToken(userDetails)); data.put("token", jwtTokenUtil.generateToken(userDetails));
return RestResult.ok(data); return ResultBean.ok(data);
} }
return RestResult.ok(); return ResultBean.ok();
} }
@ -235,28 +234,28 @@ public class UserController extends BaseController {
* 更新密码 * 更新密码
* */ * */
@PostMapping("updatePassword") @PostMapping("updatePassword")
public RestResult<?> updatePassword(String oldPassword,String newPassword1,String newPassword2,HttpServletRequest request) { public ResultBean<?> updatePassword(String oldPassword,String newPassword1,String newPassword2,HttpServletRequest request) {
UserDetails userDetails = getUserDetails(request); UserDetails userDetails = getUserDetails(request);
if (userDetails == null) { if (userDetails == null) {
return RestResult.fail(ResponseStatus.NO_LOGIN); return ResultBean.fail(ResponseStatus.NO_LOGIN);
} }
if(!(StringUtils.isNotBlank(newPassword1) && newPassword1.equals(newPassword2))){ if(!(StringUtils.isNotBlank(newPassword1) && newPassword1.equals(newPassword2))){
RestResult.fail(ResponseStatus.TWO_PASSWORD_DIFF); ResultBean.fail(ResponseStatus.TWO_PASSWORD_DIFF);
} }
userService.updatePassword(userDetails.getId(),oldPassword,newPassword1); userService.updatePassword(userDetails.getId(),oldPassword,newPassword1);
return RestResult.ok(); return ResultBean.ok();
} }
/** /**
* 分页查询用户书评 * 分页查询用户书评
* */ * */
@GetMapping("listCommentByPage") @GetMapping("listCommentByPage")
public RestResult<?> listCommentByPage(@RequestParam(value = "curr", defaultValue = "1") int page, @RequestParam(value = "limit", defaultValue = "5") int pageSize,HttpServletRequest request) { public ResultBean<?> listCommentByPage(@RequestParam(value = "curr", defaultValue = "1") int page, @RequestParam(value = "limit", defaultValue = "5") int pageSize,HttpServletRequest request) {
UserDetails userDetails = getUserDetails(request); UserDetails userDetails = getUserDetails(request);
if (userDetails == null) { if (userDetails == null) {
return RestResult.fail(ResponseStatus.NO_LOGIN); return ResultBean.fail(ResponseStatus.NO_LOGIN);
} }
return RestResult.ok(bookService.listCommentByPage(userDetails.getId(),null,page,pageSize)); return ResultBean.ok(bookService.listCommentByPage(userDetails.getId(),null,page,pageSize));
} }
@ -264,14 +263,14 @@ public class UserController extends BaseController {
* 购买小说章节 * 购买小说章节
* */ * */
@PostMapping("buyBookIndex") @PostMapping("buyBookIndex")
public RestResult<?> buyBookIndex(UserBuyRecord buyRecord, HttpServletRequest request) { public ResultBean<?> buyBookIndex(UserBuyRecord buyRecord, HttpServletRequest request) {
UserDetails userDetails = getUserDetails(request); UserDetails userDetails = getUserDetails(request);
if (userDetails == null) { if (userDetails == null) {
return RestResult.fail(ResponseStatus.NO_LOGIN); return ResultBean.fail(ResponseStatus.NO_LOGIN);
} }
buyRecord.setBuyAmount(bookService.queryBookIndex(buyRecord.getBookIndexId()).getBookPrice()); buyRecord.setBuyAmount(bookService.queryBookIndex(buyRecord.getBookIndexId()).getBookPrice());
userService.buyBookIndex(userDetails.getId(),buyRecord); userService.buyBookIndex(userDetails.getId(),buyRecord);
return RestResult.ok(); return ResultBean.ok();
} }

View File

@ -3,8 +3,6 @@ package com.java2nb.novel.core.filter;
import com.java2nb.novel.core.cache.CacheKey; import com.java2nb.novel.core.cache.CacheKey;
import com.java2nb.novel.core.cache.CacheService; import com.java2nb.novel.core.cache.CacheService;
import com.java2nb.novel.core.utils.*; import com.java2nb.novel.core.utils.*;
import io.github.xxyopen.util.UUIDUtil;
import io.github.xxyopen.web.util.SpringUtil;
import javax.servlet.*; import javax.servlet.*;
import javax.servlet.http.Cookie; import javax.servlet.http.Cookie;

View File

@ -2,7 +2,6 @@ package com.java2nb.novel.core.utils;
import com.java2nb.novel.core.cache.CacheKey; import com.java2nb.novel.core.cache.CacheKey;
import com.java2nb.novel.core.cache.CacheService; import com.java2nb.novel.core.cache.CacheService;
import io.github.xxyopen.web.util.SpringUtil;
/** /**
* 模板操作工具类 * 模板操作工具类

View File

@ -1,18 +1,20 @@
package com.java2nb.novel.page; package com.java2nb.novel.page;
import com.java2nb.novel.controller.BaseController; import com.java2nb.novel.controller.BaseController;
import com.java2nb.novel.core.bean.PageBean;
import com.java2nb.novel.core.bean.UserDetails; import com.java2nb.novel.core.bean.UserDetails;
import com.java2nb.novel.core.utils.ThreadLocalUtil; import com.java2nb.novel.core.utils.ThreadLocalUtil;
import com.java2nb.novel.entity.*; import com.java2nb.novel.entity.*;
import com.java2nb.novel.service.*; import com.java2nb.novel.service.AuthorService;
import com.java2nb.novel.service.BookService;
import com.java2nb.novel.service.NewsService;
import com.java2nb.novel.service.UserService;
import com.java2nb.novel.vo.BookCommentVO; import com.java2nb.novel.vo.BookCommentVO;
import com.java2nb.novel.vo.BookSettingVO; import com.java2nb.novel.vo.BookSettingVO;
import io.github.xxyopen.model.page.PageBean;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.SneakyThrows; import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller; import org.springframework.stereotype.Controller;
import org.springframework.ui.Model; import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PathVariable;
@ -34,9 +36,6 @@ import java.util.concurrent.ThreadPoolExecutor;
@Controller @Controller
public class PageController extends BaseController { public class PageController extends BaseController {
@Value("${content.save.path}")
private String fileSavePath;
private final BookService bookService; private final BookService bookService;
private final NewsService newsService; private final NewsService newsService;
@ -47,7 +46,6 @@ public class PageController extends BaseController {
private final ThreadPoolExecutor threadPoolExecutor; private final ThreadPoolExecutor threadPoolExecutor;
private final Map<String, BookContentService> bookContentServiceMap;
@RequestMapping("{url}.html") @RequestMapping("{url}.html")
public String module(@PathVariable("url") String url) { public String module(@PathVariable("url") String url) {
@ -176,7 +174,7 @@ public class PageController extends BaseController {
*/ */
@SneakyThrows @SneakyThrows
@RequestMapping("/book/{bookId}/{bookIndexId}.html") @RequestMapping("/book/{bookId}/{bookIndexId}.html")
public String bookContent(@PathVariable("bookId") Long bookId, @PathVariable("bookIndexId") Long bookIndexId, HttpServletRequest request, Model model) { public String indexList(@PathVariable("bookId") Long bookId, @PathVariable("bookIndexId") Long bookIndexId, HttpServletRequest request, Model model) {
//加载小说基本信息线程 //加载小说基本信息线程
CompletableFuture<Book> bookCompletableFuture = CompletableFuture.supplyAsync(() -> { CompletableFuture<Book> bookCompletableFuture = CompletableFuture.supplyAsync(() -> {
//查询书籍 //查询书籍
@ -209,10 +207,10 @@ public class PageController extends BaseController {
return nextBookIndexId; return nextBookIndexId;
}, threadPoolExecutor); }, threadPoolExecutor);
//加载小说内容信息线程,该线程在加载小说章节信息线程执行完毕后才执行 //加载小说内容信息线程
CompletableFuture<BookContent> bookContentCompletableFuture = bookIndexCompletableFuture.thenApplyAsync((bookIndex) -> { CompletableFuture<BookContent> bookContentCompletableFuture = CompletableFuture.supplyAsync(() -> {
//查询内容 //查询内容
BookContent bookContent = bookContentServiceMap.get(bookIndex.getStorageType()).queryBookContent(bookId, bookIndexId); BookContent bookContent = bookService.queryBookContent(bookIndexId);
log.debug("加载小说内容信息线程结束"); log.debug("加载小说内容信息线程结束");
return bookContent; return bookContent;
}, threadPoolExecutor); }, threadPoolExecutor);

View File

@ -1,7 +1,7 @@
package com.java2nb.novel.service; package com.java2nb.novel.service;
import io.github.xxyopen.model.page.PageBean; import com.java2nb.novel.core.bean.PageBean;
import com.java2nb.novel.entity.Author; import com.java2nb.novel.entity.Author;
import com.java2nb.novel.entity.AuthorIncome; import com.java2nb.novel.entity.AuthorIncome;
import com.java2nb.novel.entity.AuthorIncomeDetail; import com.java2nb.novel.entity.AuthorIncomeDetail;

View File

@ -1,11 +0,0 @@
package com.java2nb.novel.service;
import com.java2nb.novel.entity.BookContent;
import java.util.List;
public interface BookContentService {
BookContent queryBookContent(Long bookId, Long bookIndexId);
}

View File

@ -1,7 +1,7 @@
package com.java2nb.novel.service; package com.java2nb.novel.service;
import io.github.xxyopen.model.page.PageBean; import com.java2nb.novel.core.bean.PageBean;
import com.java2nb.novel.entity.*; import com.java2nb.novel.entity.*;
import com.java2nb.novel.vo.BookCommentVO; import com.java2nb.novel.vo.BookCommentVO;
import com.java2nb.novel.vo.BookSettingVO; import com.java2nb.novel.vo.BookSettingVO;
@ -101,7 +101,6 @@ public interface BookService {
* @param bookIndexId 目录ID * @param bookIndexId 目录ID
* @return 书籍内容 * @return 书籍内容
* */ * */
@Deprecated
BookContent queryBookContent(Long bookIndexId); BookContent queryBookContent(Long bookIndexId);
/** /**

View File

@ -1,7 +1,7 @@
package com.java2nb.novel.service; package com.java2nb.novel.service;
import io.github.xxyopen.model.page.PageBean; import com.java2nb.novel.core.bean.PageBean;
import com.java2nb.novel.entity.News; import com.java2nb.novel.entity.News;
import com.java2nb.novel.vo.NewsVO; import com.java2nb.novel.vo.NewsVO;

View File

@ -1,8 +1,11 @@
package com.java2nb.novel.service; package com.java2nb.novel.service;
import com.github.pagehelper.PageInfo;
import com.java2nb.novel.core.bean.PageBean;
import com.java2nb.novel.entity.Book; import com.java2nb.novel.entity.Book;
import com.java2nb.novel.vo.BookSpVO; import com.java2nb.novel.vo.BookSpVO;
import com.java2nb.novel.vo.BookVO;
import com.java2nb.novel.vo.EsBookVO; import com.java2nb.novel.vo.EsBookVO;
/** /**
@ -23,5 +26,5 @@ public interface SearchService {
* @param pageSize 每页大小 * @param pageSize 每页大小
* @return 分页信息 * @return 分页信息
*/ */
io.github.xxyopen.model.page.PageBean<EsBookVO> searchBook(BookSpVO params, int page, int pageSize); PageBean<EsBookVO> searchBook(BookSpVO params, int page, int pageSize);
} }

View File

@ -1,7 +1,7 @@
package com.java2nb.novel.service; package com.java2nb.novel.service;
import io.github.xxyopen.model.page.PageBean; import com.java2nb.novel.core.bean.PageBean;
import com.java2nb.novel.core.bean.UserDetails; import com.java2nb.novel.core.bean.UserDetails;
import com.java2nb.novel.entity.UserBuyRecord; import com.java2nb.novel.entity.UserBuyRecord;
import com.java2nb.novel.entity.UserFeedback; import com.java2nb.novel.entity.UserFeedback;

View File

@ -1,12 +1,11 @@
package com.java2nb.novel.service.impl; package com.java2nb.novel.service.impl;
import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageHelper;
import io.github.xxyopen.model.page.PageBean; import com.java2nb.novel.core.bean.PageBean;
import com.java2nb.novel.core.cache.CacheKey; import com.java2nb.novel.core.cache.CacheKey;
import com.java2nb.novel.core.cache.CacheService; import com.java2nb.novel.core.cache.CacheService;
import com.java2nb.novel.core.enums.ResponseStatus; import com.java2nb.novel.core.enums.ResponseStatus;
import io.github.xxyopen.model.page.builder.pagehelper.PageBuilder; import com.java2nb.novel.core.exception.BusinessException;
import io.github.xxyopen.web.exception.BusinessException;
import com.java2nb.novel.entity.Author; import com.java2nb.novel.entity.Author;
import com.java2nb.novel.entity.AuthorIncome; import com.java2nb.novel.entity.AuthorIncome;
import com.java2nb.novel.entity.AuthorIncomeDetail; import com.java2nb.novel.entity.AuthorIncomeDetail;
@ -174,7 +173,7 @@ public class AuthorServiceImpl implements AuthorService {
@Override @Override
public PageBean<AuthorIncomeDetail> listIncomeDailyByPage(int page, int pageSize, Long userId, Long bookId, Date startTime, Date endTime) { public PageBean<AuthorIncomeDetail> listIncomeDailyByPage(int page, int pageSize, Long userId, Long bookId, Date startTime, Date endTime) {
PageHelper.startPage(page, pageSize); PageHelper.startPage(page, pageSize);
return PageBuilder.build(authorIncomeDetailMapper.selectMany( return new PageBean<>(authorIncomeDetailMapper.selectMany(
select(AuthorIncomeDetailDynamicSqlSupport.incomeDate, AuthorIncomeDetailDynamicSqlSupport.incomeAccount select(AuthorIncomeDetailDynamicSqlSupport.incomeDate, AuthorIncomeDetailDynamicSqlSupport.incomeAccount
, AuthorIncomeDetailDynamicSqlSupport.incomeCount, AuthorIncomeDetailDynamicSqlSupport.incomeNumber) , AuthorIncomeDetailDynamicSqlSupport.incomeCount, AuthorIncomeDetailDynamicSqlSupport.incomeNumber)
.from(AuthorIncomeDetailDynamicSqlSupport.authorIncomeDetail) .from(AuthorIncomeDetailDynamicSqlSupport.authorIncomeDetail)
@ -191,7 +190,7 @@ public class AuthorServiceImpl implements AuthorService {
@Override @Override
public PageBean<AuthorIncome> listIncomeMonthByPage(int page, int pageSize, Long userId, Long bookId) { public PageBean<AuthorIncome> listIncomeMonthByPage(int page, int pageSize, Long userId, Long bookId) {
PageHelper.startPage(page, pageSize); PageHelper.startPage(page, pageSize);
return PageBuilder.build(authorIncomeMapper.selectMany(select(AuthorIncomeDynamicSqlSupport.incomeMonth return new PageBean<>(authorIncomeMapper.selectMany(select(AuthorIncomeDynamicSqlSupport.incomeMonth
, AuthorIncomeDynamicSqlSupport.preTaxIncome , AuthorIncomeDynamicSqlSupport.preTaxIncome
, AuthorIncomeDynamicSqlSupport.afterTaxIncome , AuthorIncomeDynamicSqlSupport.afterTaxIncome
, AuthorIncomeDynamicSqlSupport.payStatus , AuthorIncomeDynamicSqlSupport.payStatus

View File

@ -2,12 +2,15 @@ package com.java2nb.novel.service.impl;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageHelper;
import com.java2nb.novel.core.bean.PageBean;
import com.java2nb.novel.core.cache.CacheKey; import com.java2nb.novel.core.cache.CacheKey;
import com.java2nb.novel.core.cache.CacheService; import com.java2nb.novel.core.cache.CacheService;
import com.java2nb.novel.core.config.BookPriceProperties; import com.java2nb.novel.core.config.BookPriceProperties;
import com.java2nb.novel.core.enums.ResponseStatus; import com.java2nb.novel.core.enums.ResponseStatus;
import io.github.xxyopen.web.util.BeanUtil; import com.java2nb.novel.core.exception.BusinessException;
import com.java2nb.novel.core.utils.BeanUtil;
import com.java2nb.novel.core.utils.Constants; import com.java2nb.novel.core.utils.Constants;
import com.java2nb.novel.core.utils.IdWorker;
import com.java2nb.novel.core.utils.StringUtil; import com.java2nb.novel.core.utils.StringUtil;
import com.java2nb.novel.entity.Book; import com.java2nb.novel.entity.Book;
import com.java2nb.novel.entity.*; import com.java2nb.novel.entity.*;
@ -20,10 +23,6 @@ import com.java2nb.novel.vo.BookCommentVO;
import com.java2nb.novel.vo.BookSettingVO; import com.java2nb.novel.vo.BookSettingVO;
import com.java2nb.novel.vo.BookSpVO; import com.java2nb.novel.vo.BookSpVO;
import com.java2nb.novel.vo.BookVO; 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.util.IdWorker;
import io.github.xxyopen.web.exception.BusinessException;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.SneakyThrows; import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@ -95,8 +94,6 @@ public class BookServiceImpl implements BookService {
private final BookPriceProperties bookPriceConfig; private final BookPriceProperties bookPriceConfig;
private final IdWorker idWorker = IdWorker.INSTANCE;
@SneakyThrows @SneakyThrows
@Override @Override
@ -219,7 +216,8 @@ public class BookServiceImpl implements BookService {
if (StringUtils.isNotBlank(params.getSort())) { if (StringUtils.isNotBlank(params.getSort())) {
OrderByHelper.orderBy(params.getSort() + " desc"); OrderByHelper.orderBy(params.getSort() + " desc");
} }
return PageBuilder.build(bookMapper.searchByPage(params)); return new PageBean<>(bookMapper.searchByPage(params));
} }
@ -264,7 +262,7 @@ public class BookServiceImpl implements BookService {
@Override @Override
public BookIndex queryBookIndex(Long bookIndexId) { 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) SelectStatementProvider selectStatement = select(BookIndexDynamicSqlSupport.id, BookIndexDynamicSqlSupport.bookId, BookIndexDynamicSqlSupport.indexNum, BookIndexDynamicSqlSupport.indexName, BookIndexDynamicSqlSupport.wordCount,BookIndexDynamicSqlSupport.bookPrice, BookIndexDynamicSqlSupport.updateTime, BookIndexDynamicSqlSupport.isVip)
.from(bookIndex) .from(bookIndex)
.where(BookIndexDynamicSqlSupport.id, isEqualTo(bookIndexId)) .where(BookIndexDynamicSqlSupport.id, isEqualTo(bookIndexId))
.build() .build()
@ -390,7 +388,7 @@ public class BookServiceImpl implements BookService {
public PageBean<BookCommentVO> listCommentByPage(Long userId, Long bookId, int page, int pageSize) { public PageBean<BookCommentVO> listCommentByPage(Long userId, Long bookId, int page, int pageSize) {
PageHelper.startPage(page, pageSize); PageHelper.startPage(page, pageSize);
OrderByHelper.orderBy("t1.create_time desc"); OrderByHelper.orderBy("t1.create_time desc");
return PageBuilder.build(bookCommentMapper.listCommentByPage(userId, bookId)); return new PageBean<>(bookCommentMapper.listCommentByPage(userId, bookId));
} }
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
@ -430,7 +428,7 @@ public class BookServiceImpl implements BookService {
} else { } else {
//作者不存在,先创建作者 //作者不存在,先创建作者
Date currentDate = new Date(); Date currentDate = new Date();
authorId = idWorker.nextId(); authorId = new IdWorker().nextId();
BookAuthor bookAuthor = new BookAuthor(); BookAuthor bookAuthor = new BookAuthor();
bookAuthor.setId(authorId); bookAuthor.setId(authorId);
bookAuthor.setPenName(authorName); bookAuthor.setPenName(authorName);
@ -498,16 +496,15 @@ public class BookServiceImpl implements BookService {
@Override @Override
public PageBean<Book> listBookPageByUserId(Long userId, int page, int pageSize) { public PageBean<Book> listBookPageByUserId(Long userId, int page, int pageSize) {
Author author = authorService.queryAuthor(userId);
PageHelper.startPage(page, pageSize); PageHelper.startPage(page, pageSize);
SelectStatementProvider selectStatement = select(id, bookName, picUrl, catName, visitCount, yesterdayBuy, lastIndexUpdateTime, updateTime, wordCount, lastIndexName, status) SelectStatementProvider selectStatement = select(id, bookName, picUrl, catName, visitCount, yesterdayBuy, lastIndexUpdateTime, updateTime, wordCount, lastIndexName, status)
.from(book) .from(book)
.where(authorId, isEqualTo(author.getId())) .where(authorId, isEqualTo(authorService.queryAuthor(userId).getId()))
.orderBy(BookDynamicSqlSupport.createTime.descending()) .orderBy(BookDynamicSqlSupport.createTime.descending())
.build() .build()
.render(RenderingStrategies.MYBATIS3); .render(RenderingStrategies.MYBATIS3);
return PageBuilder.build(bookMapper.selectMany(selectStatement)); return new PageBean<>(bookMapper.selectMany(selectStatement));
} }
@ -550,7 +547,7 @@ public class BookServiceImpl implements BookService {
//并不是更新自己的小说 //并不是更新自己的小说
return; return;
} }
Long lastIndexId = idWorker.nextId(); Long lastIndexId = new IdWorker().nextId();
Date currentDate = new Date(); Date currentDate = new Date();
int wordCount = StringUtil.getStrValidWordCount(content); int wordCount = StringUtil.getStrValidWordCount(content);

View File

@ -1,33 +0,0 @@
package com.java2nb.novel.service.impl;
import com.java2nb.novel.entity.BookContent;
import com.java2nb.novel.mapper.BookContentDynamicSqlSupport;
import com.java2nb.novel.mapper.BookContentMapper;
import com.java2nb.novel.service.BookContentService;
import lombok.RequiredArgsConstructor;
import org.mybatis.dynamic.sql.render.RenderingStrategies;
import org.mybatis.dynamic.sql.select.render.SelectStatementProvider;
import org.springframework.stereotype.Service;
import static com.java2nb.novel.mapper.BookContentDynamicSqlSupport.bookContent;
import static org.mybatis.dynamic.sql.SqlBuilder.isEqualTo;
import static org.mybatis.dynamic.sql.select.SelectDSL.select;
@Service(value = "db")
@RequiredArgsConstructor
public class DbBookContentServiceImpl implements BookContentService {
private final BookContentMapper bookContentMapper;
@Override
public BookContent queryBookContent(Long bookId, Long bookIndexId) {
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);
}
}

View File

@ -1,35 +0,0 @@
package com.java2nb.novel.service.impl;
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.stereotype.Service;
import java.io.BufferedReader;
import java.io.FileReader;
@Service(value = "txt")
@RequiredArgsConstructor
public class FileBookContentServiceImpl implements BookContentService {
@Value("${content.save.path}")
private String fileSavePath;
@SneakyThrows
@Override
public BookContent queryBookContent(Long bookId, Long bookIndexId) {
BufferedReader in = new BufferedReader(new FileReader(fileSavePath + "/" + bookId + "/" + bookIndexId + ".txt"));
StringBuffer sb = new StringBuffer();
String str;
while ((str = in.readLine()) != null) {
sb.append(str);
}
in.close();
return new BookContent() {{
setIndexId(bookIndexId);
setContent(sb.toString());
}};
}
}

View File

@ -1,6 +1,6 @@
package com.java2nb.novel.service.impl; package com.java2nb.novel.service.impl;
import io.github.xxyopen.web.util.BeanUtil; import com.java2nb.novel.core.utils.BeanUtil;
import com.java2nb.novel.service.FriendLinkService; import com.java2nb.novel.service.FriendLinkService;
import com.java2nb.novel.core.cache.CacheKey; import com.java2nb.novel.core.cache.CacheKey;
import com.java2nb.novel.core.cache.CacheService; import com.java2nb.novel.core.cache.CacheService;

View File

@ -1,8 +1,8 @@
package com.java2nb.novel.service.impl; package com.java2nb.novel.service.impl;
import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageHelper;
import io.github.xxyopen.model.page.PageBean; import com.java2nb.novel.core.bean.PageBean;
import io.github.xxyopen.web.util.BeanUtil; import com.java2nb.novel.core.utils.BeanUtil;
import com.java2nb.novel.mapper.FrontNewsMapper; import com.java2nb.novel.mapper.FrontNewsMapper;
import com.java2nb.novel.service.NewsService; import com.java2nb.novel.service.NewsService;
import com.java2nb.novel.core.cache.CacheKey; import com.java2nb.novel.core.cache.CacheKey;
@ -10,7 +10,6 @@ import com.java2nb.novel.core.cache.CacheService;
import com.java2nb.novel.entity.News; import com.java2nb.novel.entity.News;
import com.java2nb.novel.mapper.NewsMapper; import com.java2nb.novel.mapper.NewsMapper;
import com.java2nb.novel.vo.NewsVO; import com.java2nb.novel.vo.NewsVO;
import io.github.xxyopen.model.page.builder.pagehelper.PageBuilder;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.mybatis.dynamic.sql.render.RenderingStrategies; import org.mybatis.dynamic.sql.render.RenderingStrategies;
import org.mybatis.dynamic.sql.select.render.SelectStatementProvider; import org.mybatis.dynamic.sql.select.render.SelectStatementProvider;
@ -70,7 +69,7 @@ public class NewsServiceImpl implements NewsService {
.build() .build()
.render(RenderingStrategies.MYBATIS3); .render(RenderingStrategies.MYBATIS3);
List<News> news = newsMapper.selectMany(selectStatement); List<News> news = newsMapper.selectMany(selectStatement);
PageBean<News> pageBean = PageBuilder.build(news); PageBean<News> pageBean = new PageBean<>(news);
pageBean.setList(BeanUtil.copyList(news,NewsVO.class)); pageBean.setList(BeanUtil.copyList(news,NewsVO.class));
return pageBean; return pageBean;
} }

View File

@ -2,13 +2,15 @@ package com.java2nb.novel.service.impl;
import com.fasterxml.jackson.databind.JavaType; import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import io.github.xxyopen.model.page.PageBean; import com.github.pagehelper.PageInfo;
import com.java2nb.novel.core.bean.PageBean;
import com.java2nb.novel.core.enums.ResponseStatus; import com.java2nb.novel.core.enums.ResponseStatus;
import io.github.xxyopen.util.StringUtil; import com.java2nb.novel.core.exception.BusinessException;
import io.github.xxyopen.web.exception.BusinessException; import com.java2nb.novel.core.utils.StringUtil;
import com.java2nb.novel.entity.Book; import com.java2nb.novel.entity.Book;
import com.java2nb.novel.vo.BookSpVO; import com.java2nb.novel.vo.BookSpVO;
import com.java2nb.novel.service.SearchService; import com.java2nb.novel.service.SearchService;
import com.java2nb.novel.vo.BookVO;
import com.java2nb.novel.vo.EsBookVO; import com.java2nb.novel.vo.EsBookVO;
import io.searchbox.client.JestClient; import io.searchbox.client.JestClient;
import io.searchbox.core.Count; import io.searchbox.core.Count;
@ -198,6 +200,7 @@ public class SearchServiceImpl implements SearchService {
} }
} }
} }
return new PageBean<>(page,pageSize,total.longValue(),bookList); return new PageBean<>(page,pageSize,total.longValue(),bookList);
} }
throw new BusinessException(ResponseStatus.ES_SEARCH_FAIL); throw new BusinessException(ResponseStatus.ES_SEARCH_FAIL);

View File

@ -1,21 +1,20 @@
package com.java2nb.novel.service.impl; package com.java2nb.novel.service.impl;
import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageHelper;
import io.github.xxyopen.model.page.PageBean; import com.java2nb.novel.core.bean.PageBean;
import com.java2nb.novel.core.bean.UserDetails; import com.java2nb.novel.core.bean.UserDetails;
import com.java2nb.novel.core.utils.BeanUtil;
import com.java2nb.novel.entity.*; import com.java2nb.novel.entity.*;
import com.java2nb.novel.entity.User; import com.java2nb.novel.entity.User;
import com.java2nb.novel.service.UserService; import com.java2nb.novel.service.UserService;
import com.java2nb.novel.core.enums.ResponseStatus; import com.java2nb.novel.core.enums.ResponseStatus;
import io.github.xxyopen.model.page.builder.pagehelper.PageBuilder; import com.java2nb.novel.core.exception.BusinessException;
import io.github.xxyopen.util.IdWorker;
import io.github.xxyopen.util.MD5Util;
import io.github.xxyopen.web.exception.BusinessException;
import com.java2nb.novel.mapper.*; import com.java2nb.novel.mapper.*;
import com.java2nb.novel.vo.BookReadHistoryVO; import com.java2nb.novel.vo.BookReadHistoryVO;
import com.java2nb.novel.vo.BookShelfVO; import com.java2nb.novel.vo.BookShelfVO;
import com.java2nb.novel.core.utils.IdWorker;
import com.java2nb.novel.core.utils.MD5Util;
import com.java2nb.novel.vo.UserFeedbackVO; import com.java2nb.novel.vo.UserFeedbackVO;
import io.github.xxyopen.web.util.BeanUtil;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.Charsets; import org.apache.commons.codec.Charsets;
@ -56,7 +55,6 @@ public class UserServiceImpl implements UserService {
private final UserBuyRecordMapper userBuyRecordMapper; private final UserBuyRecordMapper userBuyRecordMapper;
private final IdWorker idWorker = IdWorker.INSTANCE;
@Override @Override
@ -75,7 +73,7 @@ public class UserServiceImpl implements UserService {
User entity = new User(); User entity = new User();
BeanUtils.copyProperties(user,entity); BeanUtils.copyProperties(user,entity);
//数据库生成注册记录 //数据库生成注册记录
Long id = idWorker.nextId(); Long id = new IdWorker().nextId();
entity.setId(id); entity.setId(id);
entity.setNickName(entity.getUsername()); entity.setNickName(entity.getUsername());
Date currentDate = new Date(); Date currentDate = new Date();
@ -152,7 +150,7 @@ public class UserServiceImpl implements UserService {
@Override @Override
public PageBean<BookShelfVO> listBookShelfByPage(Long userId, int page, int pageSize) { public PageBean<BookShelfVO> listBookShelfByPage(Long userId, int page, int pageSize) {
PageHelper.startPage(page, pageSize); PageHelper.startPage(page, pageSize);
return PageBuilder.build(userBookshelfMapper.listBookShelf(userId)); return new PageBean<>(userBookshelfMapper.listBookShelf(userId));
} }
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
@ -213,7 +211,7 @@ public class UserServiceImpl implements UserService {
.build() .build()
.render(RenderingStrategies.MYBATIS3); .render(RenderingStrategies.MYBATIS3);
List<UserFeedback> userFeedbacks = userFeedbackMapper.selectMany(selectStatement); List<UserFeedback> userFeedbacks = userFeedbackMapper.selectMany(selectStatement);
PageBean<UserFeedback> pageBean = PageBuilder.build(userFeedbacks); PageBean<UserFeedback> pageBean = new PageBean<>(userFeedbacks);
pageBean.setList(BeanUtil.copyList(userFeedbacks,UserFeedbackVO.class)); pageBean.setList(BeanUtil.copyList(userFeedbacks,UserFeedbackVO.class));
return pageBean; return pageBean;
} }
@ -231,7 +229,7 @@ public class UserServiceImpl implements UserService {
@Override @Override
public PageBean<BookReadHistoryVO> listReadHistoryByPage(Long userId, int page, int pageSize) { public PageBean<BookReadHistoryVO> listReadHistoryByPage(Long userId, int page, int pageSize) {
PageHelper.startPage(page, pageSize); PageHelper.startPage(page, pageSize);
return PageBuilder.build(userReadHistoryMapper.listReadHistory(userId)); return new PageBean<>(userReadHistoryMapper.listReadHistory(userId));
} }
@Override @Override

View File

@ -1,5 +1,5 @@
server: server:
port: 8083 port: 8080
spring: spring:
profiles: profiles:

View File

@ -35,7 +35,7 @@
<div class="hot_articles"> <div class="hot_articles">
<dl class="hot_recommend" id="topBooks1" th:if="${bookMap['1']} and ${#lists.size(bookMap['1']) > 0}"> <dl class="hot_recommend" id="topBooks1" th:if="${bookMap['1']} and ${#lists.size(bookMap['1']) > 0}">
<dt><a th:href="'/book/'+${bookMap['1'][0].bookId}+'.html'" th:text="${bookMap['1'][0].bookName}"></a></dt> <dt><a th:href="'/book/'+${bookMap['1'][0].bookId}+'.html'" th:text="${bookMap['1'][0].bookName}"></a></dt>
<dd th:if="${#lists.size(bookMap['1']) > 1}"><a th:href="'/book/'+${bookMap['1'][1].bookId}+'.html'" th:text="${bookMap['1'][1].bookName}"></a><a th:if="${#lists.size(bookMap['1']) > 2}" th:href="'/book/'+${bookMap['1'][2].bookId}+'.html'" th:text="${bookMap['1'][2].bookName}"></a></dd> <dd th:if="${#lists.size(bookMap['1']) > 1}"><a th:href="'/book/'+${bookMap['1'][1].bookId}+'.html'" th:text="${bookMap['1'][1].bookName}"></a><a th:if="${#lists.size(bookMap['1']) > 2}" th:href="'/book/'+${bookMap['1'][1].bookId}+'.html'" th:text="${bookMap['1'][1].bookName}"></a></dd>
<dd th:if="${#lists.size(bookMap['1']) > 3}"><a th:href="'/book/'+${bookMap['1'][3].bookId}+'.html'" th:text="${bookMap['1'][3].bookName}"></a><a th:if="${#lists.size(bookMap['1']) > 4}" th:href="'/book/'+${bookMap['1'][4].bookId}+'.html'" th:text="${bookMap['1'][4].bookName}"></a></dd> <dd th:if="${#lists.size(bookMap['1']) > 3}"><a th:href="'/book/'+${bookMap['1'][3].bookId}+'.html'" th:text="${bookMap['1'][3].bookName}"></a><a th:if="${#lists.size(bookMap['1']) > 4}" th:href="'/book/'+${bookMap['1'][4].bookId}+'.html'" th:text="${bookMap['1'][4].bookName}"></a></dd>
</dl> </dl>
<dl class="hot_recommend" id="topBooks2" th:if="${bookMap['1']} and ${#lists.size(bookMap['1']) > 5}"> <dl class="hot_recommend" id="topBooks2" th:if="${bookMap['1']} and ${#lists.size(bookMap['1']) > 5}">

View File

@ -147,10 +147,10 @@
<div style="text-align: center;height: 45px;line-height: 45px"> <div style="text-align: center;height: 45px;line-height: 45px">
<a th:href="'/book/'+${book.id}+'/'+${firstBookIndexId}+'.html'" type="button" style="background-color:#ff8900!important" class="layui-btn layui-btn-sm layui-btn-radius">开始阅读</a> <a th:href="'/book/'+${book.id}+'/'+${firstBookIndexId}+'.html'" type="button" class="layui-btn layui-btn-sm layui-btn-radius">开始阅读</a>
<button type="button" id="cFavs" onclick="addInShell()" style="background-color:#ffA640!important" class="layui-btn layui-btn-sm layui-btn-radius ">加入书架</button> <button type="button" id="cFavs" onclick="addInShell()" class="layui-btn layui-btn-sm layui-btn-radius layui-btn-warm">加入书架</button>
<button type="button" onclick="location.href='/user/favorites.html'" style="background-color:#ffBE73!important" class="layui-btn layui-btn-sm layui-btn-radius ">我的书架</button> <button type="button" onclick="location.href='/user/favorites.html'" class="layui-btn layui-btn-sm layui-btn-radius layui-bg-cyan">我的书架</button>
<!-- <!--
<button type="button" onclick="downloadFile()" class="layui-btn layui-btn-sm layui-btn-radius layui-bg-normal">下载TXT</button> <button type="button" onclick="downloadFile()" class="layui-btn layui-btn-sm layui-btn-radius layui-bg-normal">下载TXT</button>
--> -->

41
pom.xml
View File

@ -5,7 +5,7 @@
<groupId>com.java2nb</groupId> <groupId>com.java2nb</groupId>
<artifactId>novel</artifactId> <artifactId>novel</artifactId>
<version>3.6.2</version> <version>3.5.4</version>
<modules> <modules>
<module>novel-common</module> <module>novel-common</module>
<module>novel-front</module> <module>novel-front</module>
@ -46,7 +46,6 @@
<commons-fileupload.version>1.3.1</commons-fileupload.version> <commons-fileupload.version>1.3.1</commons-fileupload.version>
<fastdfs-client.version>1.26.1-RELEASE</fastdfs-client.version> <fastdfs-client.version>1.26.1-RELEASE</fastdfs-client.version>
<alipay-sdk-java.version>4.9.153.ALL</alipay-sdk-java.version> <alipay-sdk-java.version>4.9.153.ALL</alipay-sdk-java.version>
<xxyopen.version>1.0.0</xxyopen.version>
</properties> </properties>
<dependencyManagement> <dependencyManagement>
@ -76,22 +75,20 @@
</dependency> </dependency>
</dependencies> </dependencies>
<!-- 如果maven无法解析io.github.xxyopen的依赖需要检查镜像mirror的配置 -->
<!-- mirror可以拦截对远程仓库的请求 , 改变对目标仓库的下载地址-->
<!-- 如果maven setting.xml中配置了镜像 , 而且镜像配置的规则中匹配到目标仓库时,
maven认为目标仓库被镜像了, 不会再去被镜像仓库下载依赖jar包, 而是直接去镜像仓库下载-->
<!-- <mirrorOf></mirrorOf>里配置需要拦截的仓库id-->
<!-- 如果填*就会拦截所有仓库-->
<!-- maven阿里的镜像使用的默认mirrorOf规则=*, 所有的仓库都被镜像需要改成 *,!oss -->
<!-- 另外需要注意的是由于镜像仓库完全屏蔽了被镜像仓库当镜像仓库不稳定或者停止服务的时候
Maven仍将无法访问被镜像仓库因而将无法下载依赖-->
<repositories> <repositories>
<repository> <repository>
<id>ali</id> <id>spring-snapshots</id>
<url>https://maven.aliyun.com/repository/public</url> <name>Spring Snapshots</name>
<releases> <url>https://repo.spring.io/snapshot</url>
<snapshots>
<enabled>true</enabled> <enabled>true</enabled>
</releases> </snapshots>
</repository>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots> <snapshots>
<enabled>false</enabled> <enabled>false</enabled>
</snapshots> </snapshots>
@ -99,11 +96,17 @@
</repositories> </repositories>
<pluginRepositories> <pluginRepositories>
<pluginRepository> <pluginRepository>
<id>ali-plugin</id> <id>spring-snapshots</id>
<url>https://maven.aliyun.com/repository/public</url> <name>Spring Snapshots</name>
<releases> <url>https://repo.spring.io/snapshot</url>
<snapshots>
<enabled>true</enabled> <enabled>true</enabled>
</releases> </snapshots>
</pluginRepository>
<pluginRepository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots> <snapshots>
<enabled>false</enabled> <enabled>false</enabled>
</snapshots> </snapshots>

View File

@ -35,7 +35,7 @@
<div class="hot_articles"> <div class="hot_articles">
<dl class="hot_recommend" id="topBooks1" th:if="${bookMap['1']} and ${#lists.size(bookMap['1']) > 0}"> <dl class="hot_recommend" id="topBooks1" th:if="${bookMap['1']} and ${#lists.size(bookMap['1']) > 0}">
<dt><a th:href="'/book/'+${bookMap['1'][0].bookId}+'.html'" th:text="${bookMap['1'][0].bookName}"></a></dt> <dt><a th:href="'/book/'+${bookMap['1'][0].bookId}+'.html'" th:text="${bookMap['1'][0].bookName}"></a></dt>
<dd th:if="${#lists.size(bookMap['1']) > 1}"><a th:href="'/book/'+${bookMap['1'][1].bookId}+'.html'" th:text="${bookMap['1'][1].bookName}"></a><a th:if="${#lists.size(bookMap['1']) > 2}" th:href="'/book/'+${bookMap['1'][2].bookId}+'.html'" th:text="${bookMap['1'][2].bookName}"></a></dd> <dd th:if="${#lists.size(bookMap['1']) > 1}"><a th:href="'/book/'+${bookMap['1'][1].bookId}+'.html'" th:text="${bookMap['1'][1].bookName}"></a><a th:if="${#lists.size(bookMap['1']) > 2}" th:href="'/book/'+${bookMap['1'][1].bookId}+'.html'" th:text="${bookMap['1'][1].bookName}"></a></dd>
<dd th:if="${#lists.size(bookMap['1']) > 3}"><a th:href="'/book/'+${bookMap['1'][3].bookId}+'.html'" th:text="${bookMap['1'][3].bookName}"></a><a th:if="${#lists.size(bookMap['1']) > 4}" th:href="'/book/'+${bookMap['1'][4].bookId}+'.html'" th:text="${bookMap['1'][4].bookName}"></a></dd> <dd th:if="${#lists.size(bookMap['1']) > 3}"><a th:href="'/book/'+${bookMap['1'][3].bookId}+'.html'" th:text="${bookMap['1'][3].bookName}"></a><a th:if="${#lists.size(bookMap['1']) > 4}" th:href="'/book/'+${bookMap['1'][4].bookId}+'.html'" th:text="${bookMap['1'][4].bookName}"></a></dd>
</dl> </dl>
<dl class="hot_recommend" id="topBooks2" th:if="${bookMap['1']} and ${#lists.size(bookMap['1']) > 5}"> <dl class="hot_recommend" id="topBooks2" th:if="${bookMap['1']} and ${#lists.size(bookMap['1']) > 5}">

View File

@ -147,10 +147,10 @@
<div style="text-align: center;height: 45px;line-height: 45px"> <div style="text-align: center;height: 45px;line-height: 45px">
<a th:href="'/book/'+${book.id}+'/'+${firstBookIndexId}+'.html'" type="button" style="background-color:#ff8900!important" class="layui-btn layui-btn-sm layui-btn-radius">开始阅读</a> <a th:href="'/book/'+${book.id}+'/'+${firstBookIndexId}+'.html'" type="button" class="layui-btn layui-btn-sm layui-btn-radius">开始阅读</a>
<button type="button" id="cFavs" onclick="addInShell()" style="background-color:#ffA640!important" class="layui-btn layui-btn-sm layui-btn-radius ">加入书架</button> <button type="button" id="cFavs" onclick="addInShell()" class="layui-btn layui-btn-sm layui-btn-radius layui-btn-warm">加入书架</button>
<button type="button" onclick="location.href='/user/favorites.html'" style="background-color:#ffBE73!important" class="layui-btn layui-btn-sm layui-btn-radius ">我的书架</button> <button type="button" onclick="location.href='/user/favorites.html'" class="layui-btn layui-btn-sm layui-btn-radius layui-bg-cyan">我的书架</button>
<!-- <!--
<button type="button" onclick="downloadFile()" class="layui-btn layui-btn-sm layui-btn-radius layui-bg-normal">下载TXT</button> <button type="button" onclick="downloadFile()" class="layui-btn layui-btn-sm layui-btn-radius layui-bg-normal">下载TXT</button>
--> -->