mirror of
https://github.com/201206030/novel-plus.git
synced 2025-07-01 23:26:38 +00:00
Compare commits
3 Commits
v3.6.2
...
develop_aq
Author | SHA1 | Date | |
---|---|---|---|
bb2d95ad75 | |||
e6b60bb0a8 | |||
3a44d14149 |
186
README.md
186
README.md
@ -1,34 +1,49 @@
|
|||||||
[]( https://www.kuaidaili.com/?ref=mdpz65syhqup )
|
[]( 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>
|
[](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>
|
[](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>
|
[](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>
|
[](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 是一个多端(PC、WAP)阅读,功能完善的原创文学 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。
|
||||||
|
|
||||||
|
[]( https://www.jetbrains.com/?from=小说精品屋)
|
||||||
|
|
||||||
|
|
||||||
|
#### 接口文档
|
||||||
|
|
||||||
|
[点击查看接口文档示例](doc/api/api.md)
|
||||||
|
|
||||||
#### 橙色主题模版截图
|
#### 橙色主题模版截图
|
||||||
|
|
||||||
##### PC站截图
|
##### PC站截图
|
||||||
|
|
||||||
1. 首页
|
1. 首页
|
||||||
@ -158,7 +183,6 @@ novel-plus -- 父工程
|
|||||||

|

|
||||||
|
|
||||||
#### 深色主题模版截图
|
#### 深色主题模版截图
|
||||||
|
|
||||||
##### PC站截图
|
##### PC站截图
|
||||||
|
|
||||||
1. 首页
|
1. 首页
|
||||||
@ -166,7 +190,6 @@ novel-plus -- 父工程
|
|||||||

|

|
||||||
|
|
||||||
##### 手机站截图
|
##### 手机站截图
|
||||||
|
|
||||||
1. 首页
|
1. 首页
|
||||||
|
|
||||||

|

|
||||||
@ -187,69 +210,79 @@ novel-plus -- 父工程
|
|||||||
|
|
||||||

|

|
||||||
|
|
||||||
#### 源码安装教程
|
#### 安装步骤(源码,小白请看其他安装教程)
|
||||||
|
|
||||||
- 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.yml(dev环境,默认环境)或application-common-prod.yml(prod环境,需要在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环境跳过3、4步骤):
|
||||||
|
|
||||||
[安装 Apache Maven](https://maven.apache.org/install.html)
|
1. 修改novel-common模块下application-common-dev.yml(dev环境,默认环境)或application-common-prod.yml(prod环境,需要在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}是一个多端(PC、WAP)阅读、功能完善的原创文学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)按关键字`精品小说屋`搜索。
|
||||||
|
|
||||||
|
[](https://www.aliyun.com/minisite/goods?userCode=uf4nasee )
|
||||||
|
@ -1,3 +0,0 @@
|
|||||||
alter table book_index add column storage_type varchar(10) NOT NULL DEFAULT 'db' COMMENT '存储方式' after book_price ;
|
|
||||||
|
|
||||||
|
|
@ -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 ;
|
|
||||||
|
@ -1,3 +0,0 @@
|
|||||||
1. novel_plus.sql 为全量 sql 文件,yyyyMMdd.sql 为增量 sql 文件
|
|
||||||
2. 第一次安装只需要执行 novel_plus.sql 文件即可
|
|
||||||
3. 后续版本升级需要根据上次代码版本的时间,执行该日期之后的增量 sql 文件(简单来说就是 sql 文件夹中相较于上次多出来的 sql 文件)
|
|
3
doc/sql/sql文件说明.txt
Normal file
3
doc/sql/sql文件说明.txt
Normal 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>
|
@ -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" />
|
||||||
|
|
||||||
|
@ -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
|
|
||||||
|
|
||||||
|
|
@ -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
|
|
8
novel-admin/src/main/build/scripts/readme.txt
Normal file
8
novel-admin/src/main/build/scripts/readme.txt
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
1:linux启动环境
|
||||||
|
sh start.sh
|
||||||
|
|
||||||
|
3:windows启动环境
|
||||||
|
windows-start.bat
|
||||||
|
|
||||||
|
3:linux停止应用
|
||||||
|
sh stop.sh
|
47
novel-admin/src/main/build/scripts/start.sh
Normal file
47
novel-admin/src/main/build/scripts/start.sh
Normal 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"
|
33
novel-admin/src/main/build/scripts/stop.sh
Normal file
33
novel-admin/src/main/build/scripts/stop.sh
Normal 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=""
|
||||||
|
|
10
novel-admin/src/main/build/scripts/windows-start.bat
Normal file
10
novel-admin/src/main/build/scripts/windows-start.bat
Normal 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
|
||||||
|
|
@ -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"));
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -36,7 +36,3 @@ mybatis:
|
|||||||
typeAliasesPackage: com.java2nb.**.domain
|
typeAliasesPackage: com.java2nb.**.domain
|
||||||
#[弃用]配置缓存和session存储方式,默认ehcache,可选redis,[弃用]调整至 spring cache type【shiro.用户,权限,session,spring.cache通用】
|
#[弃用]配置缓存和session存储方式,默认ehcache,可选redis,[弃用]调整至 spring cache type【shiro.用户,权限,session,spring.cache通用】
|
||||||
#[弃用]cacheType: ehcache
|
#[弃用]cacheType: ehcache
|
||||||
|
|
||||||
|
|
||||||
logging:
|
|
||||||
config: classpath:logback-boot.xml
|
|
||||||
|
@ -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>
|
@ -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>
|
||||||
|
@ -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();
|
||||||
|
}
|
||||||
|
}
|
@ -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 使用其他的分页工具或框架进行分页查询的场景
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -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;
|
|
||||||
|
|
||||||
}
|
|
@ -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,"拒绝访问!"),
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -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;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
@ -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);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -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"};
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -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) {
|
||||||
|
@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
@ -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("-", "");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,11 @@
|
|||||||
|
package com.java2nb.novel.core.valid;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 新增数据的校验分组
|
||||||
|
* @author xiongxiaoyang
|
||||||
|
*/
|
||||||
|
public interface AddGroup {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,11 @@
|
|||||||
|
package com.java2nb.novel.core.valid;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 更新数据的校验分组
|
||||||
|
* @author xiongxiaoyang
|
||||||
|
*/
|
||||||
|
public interface UpdateGroup {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -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;
|
||||||
|
@ -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 {
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
@ -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))
|
||||||
|
@ -67,17 +67,7 @@ sharding:
|
|||||||
algorithm-expression: book_content${index_id % 10}
|
algorithm-expression: book_content${index_id % 10}
|
||||||
|
|
||||||
|
|
||||||
content:
|
|
||||||
save:
|
|
||||||
storage: db #存储介质,db:数据库,file:txt文本
|
|
||||||
path: /Users/xiongxiaoyang/books #txt小说文本保存路径
|
|
||||||
|
|
||||||
# HTTP 代理配置
|
|
||||||
http:
|
|
||||||
proxy:
|
|
||||||
# 是否开启 HTTP 代理,true-开启,false-不开启
|
|
||||||
enabled: false
|
|
||||||
# 代理 IP
|
|
||||||
ip: u493.kdltps.com
|
|
||||||
# 代理端口号
|
|
||||||
port: 15818
|
|
||||||
|
@ -74,20 +74,9 @@ logging:
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
content:
|
|
||||||
save:
|
|
||||||
storage: db #存储介质,db:数据库,file:txt文本
|
|
||||||
path: /Users/xiongxiaoyang/books #txt小说文本保存路径
|
|
||||||
|
|
||||||
# HTTP 代理配置
|
|
||||||
http:
|
|
||||||
proxy:
|
|
||||||
# 是否开启 HTTP 代理,true-开启,false-不开启
|
|
||||||
enabled: false
|
|
||||||
# 代理 IP
|
|
||||||
ip: 40.83.102.86
|
|
||||||
# 代理端口号
|
|
||||||
port: 80
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -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"/>-->
|
||||||
|
@ -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" />
|
||||||
|
|
||||||
|
@ -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:数据库,file:txt文本
|
|
||||||
path: /Users/xiongxiaoyang/books #txt小说文本保存路径
|
|
||||||
|
|
||||||
# HTTP 代理配置
|
|
||||||
http:
|
|
||||||
proxy:
|
|
||||||
# 是否开启 HTTP 代理,true-开启,false-不开启
|
|
||||||
enabled: false
|
|
||||||
# 代理 IP
|
|
||||||
ip: u493.kdltps.com
|
|
||||||
# 代理端口号
|
|
||||||
port: 15818
|
|
@ -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
|
|
8
novel-crawl/src/main/build/scripts/readme.txt
Normal file
8
novel-crawl/src/main/build/scripts/readme.txt
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
1:linux启动环境
|
||||||
|
sh start.sh
|
||||||
|
|
||||||
|
3:windows启动环境
|
||||||
|
windows-start.bat
|
||||||
|
|
||||||
|
3:linux停止应用
|
||||||
|
sh stop.sh
|
47
novel-crawl/src/main/build/scripts/start.sh
Normal file
47
novel-crawl/src/main/build/scripts/start.sh
Normal 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"
|
33
novel-crawl/src/main/build/scripts/stop.sh
Normal file
33
novel-crawl/src/main/build/scripts/stop.sh
Normal 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=""
|
||||||
|
|
10
novel-crawl/src/main/build/scripts/windows-start.bat
Normal file
10
novel-crawl/src/main/build/scripts/windows-start.bat
Normal 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
|
||||||
|
|
@ -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"));
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -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;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -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;
|
||||||
|
@ -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);
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
@ -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;
|
||||||
|
@ -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));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -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();
|
||||||
|
@ -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));
|
|
||||||
}
|
|
||||||
}
|
|
@ -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());
|
|
||||||
}
|
|
||||||
}
|
|
@ -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",
|
||||||
|
@ -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>-->
|
|
||||||
<!-- <!– 将相同groupId的依赖模块打包进来 –>-->
|
|
||||||
<!-- <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>-->
|
|
||||||
<!-- <!–打包时去除第三方依赖–>-->
|
|
||||||
<!-- <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>-->
|
|
||||||
<!-- <!–拷贝第三方依赖文件到指定目录–>-->
|
|
||||||
<!-- <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>-->
|
|
||||||
<!-- <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>-->
|
|
||||||
<!-- <!– 文件夹 –>-->
|
|
||||||
<!-- <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>
|
||||||
|
@ -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:数据库,file:txt文本
|
|
||||||
path: /Users/xiongxiaoyang/books #txt小说文本保存路径
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# HTTP 代理配置
|
|
||||||
http:
|
|
||||||
proxy:
|
|
||||||
# 是否开启 HTTP 代理,true-开启,false-不开启
|
|
||||||
enabled: false
|
|
||||||
# 代理 IP
|
|
||||||
ip: u493.kdltps.com
|
|
||||||
# 代理端口号
|
|
||||||
port: 15818
|
|
||||||
|
|
@ -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
|
|
8
novel-front/src/main/build/scripts/readme.txt
Normal file
8
novel-front/src/main/build/scripts/readme.txt
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
1:linux启动环境
|
||||||
|
sh start.sh
|
||||||
|
|
||||||
|
3:windows启动环境
|
||||||
|
windows-start.bat
|
||||||
|
|
||||||
|
3:linux停止应用
|
||||||
|
sh stop.sh
|
47
novel-front/src/main/build/scripts/start.sh
Normal file
47
novel-front/src/main/build/scripts/start.sh
Normal 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"
|
33
novel-front/src/main/build/scripts/stop.sh
Normal file
33
novel-front/src/main/build/scripts/stop.sh
Normal 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=""
|
||||||
|
|
10
novel-front/src/main/build/scripts/windows-start.bat
Normal file
10
novel-front/src/main/build/scripts/windows-start.bat
Normal 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
|
||||||
|
|
@ -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();
|
||||||
|
@ -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(" ", " ");
|
.replaceAll(" ", " ");
|
||||||
|
|
||||||
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) {
|
||||||
|
@ -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)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 模板操作工具类
|
* 模板操作工具类
|
||||||
|
@ -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);
|
||||||
|
@ -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;
|
||||||
|
@ -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);
|
|
||||||
|
|
||||||
}
|
|
@ -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);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
@ -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
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
@ -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);
|
|
||||||
}
|
|
||||||
}
|
|
@ -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());
|
|
||||||
}};
|
|
||||||
}
|
|
||||||
}
|
|
@ -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;
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
@ -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
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
server:
|
server:
|
||||||
port: 8083
|
port: 8080
|
||||||
|
|
||||||
spring:
|
spring:
|
||||||
profiles:
|
profiles:
|
||||||
|
@ -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}">
|
||||||
|
@ -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
41
pom.xml
@ -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>
|
||||||
|
@ -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}">
|
||||||
|
@ -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>
|
||||||
-->
|
-->
|
||||||
|
Reference in New Issue
Block a user