diff --git a/.gitignore b/.gitignore
index 1f3acaa..1a93568 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,4 +3,5 @@
**/cachedata
**/target
**/*.iml
+**/.DS_Store
diff --git a/README.md b/README.md
index 4391a0f..b54fed7 100644
--- a/README.md
+++ b/README.md
@@ -2,9 +2,14 @@
# 小说精品屋-plus
+[](https://github.com/201206030/novel-plus)
+[](https://github.com/201206030/novel-plus)
+[](https://gitee.com/novel_dev_team/novel-plus)
+[](https://gitee.com/novel_dev_team/novel-plus)
+
#### 官网
-https://xiongxyang.gitee.io/home/
+https://201206030.github.io
#### 新项目:小说精品屋-微服务版
@@ -19,10 +24,6 @@ Gitee仓库地址: https://gitee.com/novel_dev_team/novel-cloud
[点击前往](http://47.106.243.172:8888/)
-#### 前言
-
-小说精品屋-plus致力于打造一个完整的商用小说门户平台,使用前建议先阅读此文档。
-
#### 项目介绍
小说精品屋-plus是在[小说精品屋](https://github.com/201206030/fiction_house)的基础上,去除了漫画和弹幕模块,专注于小说,是一个多端(PC、WAP)阅读、功能完善的原创文学CMS系统,由前台门户系统、作家后台管理系统、平台后台管理系统、爬虫管理系统等多个子系统构成,支持会员充值、订阅模式、新闻发布和实时统计报表等功能。
@@ -33,6 +34,8 @@ Gitee仓库地址: https://gitee.com/novel_dev_team/novel-cloud
- [x] 服务端代码重构,MyBatis3升级为MyBatis3DynamicSql。
- [x] 移动站与PC站站点分离,浏览器自动识别跳转。
- [x] PC站UI更新。
+- [x] 支持前端模版自定义,内置多套模版。
+- [x] 可拓展的多种方式存储小说内容,内置数据库(分表)存储和TXT文本存储。
- [x] 新闻模块。
- [x] 排行榜。
- [x] 小说评论模块。
@@ -50,7 +53,8 @@ novel-plus -- 父工程
├── novel-common -- 通用模块
├── novel-front -- 前台门户&作家后台管理子系统(可拆分)
├── novel-crawl -- 爬虫管理子系统
-└── novel-admin -- 平台后台管理子系统
+├── novel-admin -- 平台后台管理子系统
+└── templates -- 前端模版
```
#### 技术选型
@@ -80,15 +84,22 @@ novel-plus -- 父工程
| Layui | 前端UI
+#### 开发工具
+感谢Jetbrains公司提供的免费License。
+
+[]( https://www.jetbrains.com/?from=小说精品屋)
+
+
#### 接口文档
-[点击查看接口文档示例](./doc/api.md)
+[点击查看接口文档示例](doc/api/api.md)
-#### PC站截图
+#### 橙色主题模版截图
+##### PC站截图
1. 首页
-
+
2. 分类索引页
@@ -96,7 +107,7 @@ novel-plus -- 父工程
3. 搜索页
-
+

@@ -138,31 +149,31 @@ novel-plus -- 父工程

-#### 手机站截图
+##### 手机站截图
1. 首页
-
+
2. 小说列表页
-
+
3. 小说详情页
-
+
4. 小说阅读页
-
+
-#### 爬虫管理系统截图
+##### 爬虫管理系统截图


-#### 后台管理系统截图
+##### 后台管理系统截图

@@ -172,30 +183,97 @@ novel-plus -- 父工程

-#### 安装步骤
+#### 深色主题模版截图
+##### PC站截图
+
+1. 首页
+
+ 
+
+##### 手机站截图
+1. 首页
+
+ 
+
+4. 小说详情页
+
+ 
+
+5. 目录页
+
+ 
+
+5. 小说阅读页
+
+ 
+
+#### 蓝色主题模版截图(更新中)
+
+ 
+
+#### 安装步骤(源码,小白请看其他安装教程)
##### 数据库安装:
1. 安装MySQL软件。
2. 修改MySQL`max_allowed_packet `配置(建议100M)。
3. 新建数据库,设置编码为utf8mb4。
-4. 执行sql/novel_plus.sql脚本文件。
+4. 执行doc/sql/novel_plus.sql脚本文件。
##### 爬虫管理系统安装:
-1. 修改novel-common模块下application-dev.yml文件中的数据库的配置。
+1. 修改novel-common模块下application-common-dev.yml(dev环境,默认环境)或application-common-prod.yml(prod环境,需要在application.yml配置文件中切换)配置文件中的数据库配置。
2. 修改novel-crawl模块下application.yml文件中的管理员账号密码。
3. 启动程序,打开浏览器,默认8081端口访问。
4. 选择已有或新增爬虫源(支持自定义爬虫规则),点击`开启`按钮,开始爬取小说数据。
-##### 前台小说门户安装:
+##### 前台小说门户安装(dev环境跳过3、4步骤):
-1. 修改novel-common模块下application-dev.yml文件中的数据库的配置。
-2. 启动程序,打开浏览器,默认8080端口访问。
+1. 修改novel-common模块下application-common-dev.yml(dev环境,默认环境)或application-common-prod.yml(prod环境,需要在application.yml配置文件中切换)配置文件中的数据库配置。
+
+2. 修改novel-front模块下application-website配置文件中的网站信息。
+
+ ```
+ #网站配置
+ 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环境下才支持多模版)。
+
+ ```
+ #模版配置
+ templates:
+ #模版名
+ name: orange
+ ```
+
+4. prod环境下的jar包形式部署时,需要复制templates文件夹到jar文件的相同目录下。
+
+5. 启动程序,打开浏览器,默认8080端口访问。
**喜欢此项目的可以给我的GitHub和Gitee加个Star支持一下 。**
-#### 其他安装教程
+#### 其他安装教程(如果链接打不开,可关注公众号获取)
+
+##### 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)
@@ -211,9 +289,17 @@ docker安装教程:[点击前往](https://my.oschina.net/java2nb/blog/4271989)
#### QQ交流群
-[点击前往官网查看](https://xiongxyang.gitee.io/home/service.htm)
+[点击前往官网查看](https://xiongxyang.gitee.io/service.htm)
-#### 微信公众号(发布最新更新资讯)
+问问题的三要素
+
+1. 说明背景,使用了哪个模块,要做什么?
+
+2. 怎么输入或操作的得到了什么结果? 截图,日志
+
+3. 哪里不明白或有什么疑问 ?
+
+#### 微信公众号(发布最新更新资讯、最新前端模版、最新爬虫规则、技术文档等)

@@ -227,12 +313,12 @@ docker安装教程:[点击前往](https://my.oschina.net/java2nb/blog/4271989)

-### 免责声明
+#### 免责声明
本项目提供的爬虫工具仅用于采集项目初期的测试数据,请勿用于商业盈利。
用户使用本系统从事任何违法违规的事情,一切后果由用户自行承担,作者不承担任何责任。
-### 备注
+#### 备注
精品小说屋所有相关项目均已在开源中国公开,感兴趣的可进入[开源中国](https://www.oschina.net/p/fiction_house)按关键字`精品小说屋`搜索。
diff --git a/doc/api.md b/doc/api/api.md
similarity index 100%
rename from doc/api.md
rename to doc/api/api.md
diff --git a/es/index_create.txt b/doc/es/index_create.txt
similarity index 100%
rename from es/index_create.txt
rename to doc/es/index_create.txt
diff --git a/sql/20200511.sql b/doc/sql/20200511.sql
similarity index 100%
rename from sql/20200511.sql
rename to doc/sql/20200511.sql
diff --git a/sql/20200513.sql b/doc/sql/20200513.sql
similarity index 100%
rename from sql/20200513.sql
rename to doc/sql/20200513.sql
diff --git a/sql/20200518.sql b/doc/sql/20200518.sql
similarity index 100%
rename from sql/20200518.sql
rename to doc/sql/20200518.sql
diff --git a/sql/20200608.sql b/doc/sql/20200608.sql
similarity index 100%
rename from sql/20200608.sql
rename to doc/sql/20200608.sql
diff --git a/sql/20200615.sql b/doc/sql/20200615.sql
similarity index 100%
rename from sql/20200615.sql
rename to doc/sql/20200615.sql
diff --git a/sql/20201103.sql b/doc/sql/20201103.sql
similarity index 100%
rename from sql/20201103.sql
rename to doc/sql/20201103.sql
diff --git a/sql/20201109.sql b/doc/sql/20201109.sql
similarity index 100%
rename from sql/20201109.sql
rename to doc/sql/20201109.sql
diff --git a/sql/20201122.sql b/doc/sql/20201122.sql
similarity index 100%
rename from sql/20201122.sql
rename to doc/sql/20201122.sql
diff --git a/sql/20201201.sql b/doc/sql/20201201.sql
similarity index 100%
rename from sql/20201201.sql
rename to doc/sql/20201201.sql
diff --git a/doc/sql/20210726.sql b/doc/sql/20210726.sql
new file mode 100644
index 0000000..7e56bf6
--- /dev/null
+++ b/doc/sql/20210726.sql
@@ -0,0 +1 @@
+alter table news add column `read_count` BIGINT NOT NULL DEFAULT '0' COMMENT '阅读量' after content;
\ No newline at end of file
diff --git a/sql/novel_plus.sql b/doc/sql/novel_plus.sql
similarity index 90%
rename from sql/novel_plus.sql
rename to doc/sql/novel_plus.sql
index 2c4c9ad..f812822 100644
--- a/sql/novel_plus.sql
+++ b/doc/sql/novel_plus.sql
@@ -491,13 +491,6 @@ CREATE TABLE `sys_dept` (
-- ----------------------------
-- Records of sys_dept
-- ----------------------------
-INSERT INTO `sys_dept` VALUES ('6', '0', '研发部', '1', '1');
-INSERT INTO `sys_dept` VALUES ('7', '6', '研發一部', '1', '1');
-INSERT INTO `sys_dept` VALUES ('8', '6', '研发二部', '2', '1');
-INSERT INTO `sys_dept` VALUES ('9', '0', '销售部', '2', '1');
-INSERT INTO `sys_dept` VALUES ('10', '9', '销售一部', '1', '1');
-INSERT INTO `sys_dept` VALUES ('11', '0', '产品部', '3', '1');
-INSERT INTO `sys_dept` VALUES ('12', '11', '产品一部', '1', '1');
INSERT INTO `sys_dept` VALUES ('13', '0', '测试部', '5', '1');
INSERT INTO `sys_dept` VALUES ('14', '13', '测试一部', '1', '1');
INSERT INTO `sys_dept` VALUES ('15', '13', '测试二部', '2', '1');
@@ -894,52 +887,6 @@ CREATE TABLE `sys_log` (
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1412 DEFAULT CHARSET=utf8 COMMENT='系统日志';
--- ----------------------------
--- Records of sys_log
--- ----------------------------
-INSERT INTO `sys_log` VALUES ('1369', '-1', '获取用户信息为空', '登录', '462', 'com.java2nb.system.controller.LoginController.ajaxLogin()', null, '127.0.0.1', '2020-05-13 11:09:21');
-INSERT INTO `sys_log` VALUES ('1370', '-1', '获取用户信息为空', '登录', '19', 'com.java2nb.system.controller.LoginController.ajaxLogin()', null, '127.0.0.1', '2020-05-13 11:09:26');
-INSERT INTO `sys_log` VALUES ('1371', '1', 'admin', '登录', '98', 'com.java2nb.system.controller.LoginController.ajaxLogin()', null, '127.0.0.1', '2020-05-13 11:09:33');
-INSERT INTO `sys_log` VALUES ('1372', '1', 'admin', '请求访问主页', '372', 'com.java2nb.system.controller.LoginController.index()', null, '127.0.0.1', '2020-05-13 11:09:33');
-INSERT INTO `sys_log` VALUES ('1373', '1', 'admin', '请求访问主页', '28', 'com.java2nb.system.controller.LoginController.index()', null, '127.0.0.1', '2020-05-13 11:12:41');
-INSERT INTO `sys_log` VALUES ('1374', '1', 'admin', '编辑角色', '11', 'com.java2nb.system.controller.RoleController.edit()', null, '127.0.0.1', '2020-05-13 11:18:42');
-INSERT INTO `sys_log` VALUES ('1375', '1', 'admin', '添加菜单', '2', 'com.java2nb.system.controller.MenuController.add()', null, '127.0.0.1', '2020-05-13 11:19:55');
-INSERT INTO `sys_log` VALUES ('1376', '1', 'admin', '保存菜单', '225', 'com.java2nb.system.controller.MenuController.save()', null, '127.0.0.1', '2020-05-13 11:24:42');
-INSERT INTO `sys_log` VALUES ('1377', '1', 'admin', '编辑菜单', '15', 'com.java2nb.system.controller.MenuController.edit()', null, '127.0.0.1', '2020-05-13 11:24:54');
-INSERT INTO `sys_log` VALUES ('1378', '1', 'admin', '编辑菜单', '11', 'com.java2nb.system.controller.MenuController.edit()', null, '127.0.0.1', '2020-05-13 11:24:58');
-INSERT INTO `sys_log` VALUES ('1379', '1', 'admin', '更新菜单', '241', 'com.java2nb.system.controller.MenuController.update()', null, '127.0.0.1', '2020-05-13 11:25:12');
-INSERT INTO `sys_log` VALUES ('1380', '1', 'admin', '编辑菜单', '8', 'com.java2nb.system.controller.MenuController.edit()', null, '127.0.0.1', '2020-05-13 11:25:16');
-INSERT INTO `sys_log` VALUES ('1381', '1', 'admin', '更新菜单', '199', 'com.java2nb.system.controller.MenuController.update()', null, '127.0.0.1', '2020-05-13 11:25:26');
-INSERT INTO `sys_log` VALUES ('1382', '1', 'admin', '编辑角色', '13', 'com.java2nb.system.controller.RoleController.edit()', null, '127.0.0.1', '2020-05-13 11:26:11');
-INSERT INTO `sys_log` VALUES ('1383', '1', 'admin', '更新角色', '931', 'com.java2nb.system.controller.RoleController.update()', null, '127.0.0.1', '2020-05-13 11:26:36');
-INSERT INTO `sys_log` VALUES ('1384', '-1', '获取用户信息为空', '登录', '11', 'com.java2nb.system.controller.LoginController.ajaxLogin()', null, '127.0.0.1', '2020-05-13 11:27:02');
-INSERT INTO `sys_log` VALUES ('1385', '1', 'admin', '登录', '19', 'com.java2nb.system.controller.LoginController.ajaxLogin()', null, '127.0.0.1', '2020-05-13 11:27:08');
-INSERT INTO `sys_log` VALUES ('1386', '1', 'admin', '请求访问主页', '27', 'com.java2nb.system.controller.LoginController.index()', null, '127.0.0.1', '2020-05-13 11:27:08');
-INSERT INTO `sys_log` VALUES ('1387', '1', 'admin', '登录', '272', 'com.java2nb.system.controller.LoginController.ajaxLogin()', null, '127.0.0.1', '2020-05-13 11:27:56');
-INSERT INTO `sys_log` VALUES ('1388', '1', 'admin', '请求访问主页', '109', 'com.java2nb.system.controller.LoginController.index()', null, '127.0.0.1', '2020-05-13 11:27:56');
-INSERT INTO `sys_log` VALUES ('1389', '1', 'admin', '编辑角色', '8', 'com.java2nb.system.controller.RoleController.edit()', null, '127.0.0.1', '2020-05-13 11:30:36');
-INSERT INTO `sys_log` VALUES ('1390', '1', 'admin', '更新角色', '567', 'com.java2nb.system.controller.RoleController.update()', null, '127.0.0.1', '2020-05-13 11:30:42');
-INSERT INTO `sys_log` VALUES ('1391', '-1', '获取用户信息为空', '登录', '246', 'com.java2nb.system.controller.LoginController.ajaxLogin()', null, '127.0.0.1', '2020-05-13 11:31:38');
-INSERT INTO `sys_log` VALUES ('1392', '1', 'admin', '登录', '38', 'com.java2nb.system.controller.LoginController.ajaxLogin()', null, '127.0.0.1', '2020-05-13 11:31:42');
-INSERT INTO `sys_log` VALUES ('1393', '1', 'admin', '请求访问主页', '110', 'com.java2nb.system.controller.LoginController.index()', null, '127.0.0.1', '2020-05-13 11:31:43');
-INSERT INTO `sys_log` VALUES ('1394', '1', 'admin', 'error', null, 'http://127.0.0.1/test/order/list', 'org.springframework.jdbc.BadSqlGrammarException: \r\n### Error querying database. Cause: java.sql.SQLSyntaxErrorException: Table \'novel_plus.fb_order\' doesn\'t exist\r\n### The error may exist in file [E:\\baseprojectparent\\novel-plus\\novel-admin\\target\\classes\\mybatis\\test\\OrderMapper.xml]\r\n### The error may involve defaultParameterMap\r\n### The error occurred while setting parameters\r\n### SQL: select `id`,`fb_merchant_code`,`merchant_order_sn`,`order_sn`,`platform_order_no`,`trade_no`,`order_state`,`fn_coupon`,`red_packet`,`total_fee`,`order_price`,`fee`,`body`,`attach`,`store_id`,`cashier_id`,`device_no`,`user_id`,`user_logon_id`,`pay_time`,`pay_channel`,`no_cash_coupon_fee`,`cash_coupon_fee`,`cash_fee`,`sign`,`options`,`create_time`,`push_time`,`push_ip`,`mcht_id`,`sn` from fb_order order by id desc limit ?, ?\r\n### Cause: java.sql.SQLSyntaxErrorException: Table \'novel_plus.fb_order\' doesn\'t exist\n; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: Table \'novel_plus.fb_order\' doesn\'t exist', null, '2020-05-13 11:33:27');
-INSERT INTO `sys_log` VALUES ('1395', '1', 'admin', '登录', '276', 'com.java2nb.system.controller.LoginController.ajaxLogin()', null, '127.0.0.1', '2020-05-13 11:39:20');
-INSERT INTO `sys_log` VALUES ('1396', '1', 'admin', '请求访问主页', '95', 'com.java2nb.system.controller.LoginController.index()', null, '127.0.0.1', '2020-05-13 11:39:20');
-INSERT INTO `sys_log` VALUES ('1397', '1', 'admin', '登录', '285', 'com.java2nb.system.controller.LoginController.ajaxLogin()', null, '127.0.0.1', '2020-05-13 11:47:00');
-INSERT INTO `sys_log` VALUES ('1398', '1', 'admin', '请求访问主页', '90', 'com.java2nb.system.controller.LoginController.index()', null, '127.0.0.1', '2020-05-13 11:47:00');
-INSERT INTO `sys_log` VALUES ('1399', '1', 'admin', '登录', '251', 'com.java2nb.system.controller.LoginController.ajaxLogin()', null, '127.0.0.1', '2020-05-13 11:48:28');
-INSERT INTO `sys_log` VALUES ('1400', '1', 'admin', '请求访问主页', '95', 'com.java2nb.system.controller.LoginController.index()', null, '127.0.0.1', '2020-05-13 11:48:28');
-INSERT INTO `sys_log` VALUES ('1401', '1', 'admin', '登录', '302', 'com.java2nb.system.controller.LoginController.ajaxLogin()', null, '127.0.0.1', '2020-05-13 14:09:33');
-INSERT INTO `sys_log` VALUES ('1402', '1', 'admin', '请求访问主页', '88', 'com.java2nb.system.controller.LoginController.index()', null, '127.0.0.1', '2020-05-13 14:09:34');
-INSERT INTO `sys_log` VALUES ('1403', '1', 'admin', '请求更改用户密码', '3', 'com.java2nb.system.controller.UserController.resetPwd()', null, '127.0.0.1', '2020-05-13 14:11:49');
-INSERT INTO `sys_log` VALUES ('1404', '1', 'admin', 'admin提交更改用户密码', '140', 'com.java2nb.system.controller.UserController.adminResetPwd()', null, '127.0.0.1', '2020-05-13 14:11:50');
-INSERT INTO `sys_log` VALUES ('1405', '1', 'admin', '请求更改用户密码', '4', 'com.java2nb.system.controller.UserController.resetPwd()', null, '127.0.0.1', '2020-05-13 14:12:11');
-INSERT INTO `sys_log` VALUES ('1406', '1', 'admin', '登录', '275', 'com.java2nb.system.controller.LoginController.ajaxLogin()', null, '127.0.0.1', '2020-05-13 14:14:26');
-INSERT INTO `sys_log` VALUES ('1407', '1', 'admin', '请求访问主页', '73', 'com.java2nb.system.controller.LoginController.index()', null, '127.0.0.1', '2020-05-13 14:14:27');
-INSERT INTO `sys_log` VALUES ('1408', '1', 'admin', 'error', null, 'http://127.0.0.1/novel/author/update', 'org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors\nField error in object \'authorDO\' on field \'id\': rejected value [1,1]; codes [typeMismatch.authorDO.id,typeMismatch.id,typeMismatch.java.lang.Long,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [authorDO.id,id]; arguments []; default message [id]]; default message [Failed to convert property value of type \'java.lang.String\' to required type \'java.lang.Long\' for property \'id\'; nested exception is java.lang.NumberFormatException: For input string: \"1,1\"]', null, '2020-05-13 14:14:38');
-INSERT INTO `sys_log` VALUES ('1409', '1', 'admin', 'error', null, 'http://127.0.0.1/novel/author/update', 'org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors\nField error in object \'authorDO\' on field \'id\': rejected value [1,1]; codes [typeMismatch.authorDO.id,typeMismatch.id,typeMismatch.java.lang.Long,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [authorDO.id,id]; arguments []; default message [id]]; default message [Failed to convert property value of type \'java.lang.String\' to required type \'java.lang.Long\' for property \'id\'; nested exception is java.lang.NumberFormatException: For input string: \"1,1\"]', null, '2020-05-13 14:14:47');
-INSERT INTO `sys_log` VALUES ('1410', '1', 'admin', '登录', '261', 'com.java2nb.system.controller.LoginController.ajaxLogin()', null, '127.0.0.1', '2020-05-13 14:18:07');
-INSERT INTO `sys_log` VALUES ('1411', '1', 'admin', '请求访问主页', '83', 'com.java2nb.system.controller.LoginController.index()', null, '127.0.0.1', '2020-05-13 14:18:07');
-- ----------------------------
-- Table structure for sys_menu
@@ -1047,9 +994,6 @@ CREATE TABLE `sys_role` (
-- Records of sys_role
-- ----------------------------
INSERT INTO `sys_role` VALUES ('1', '超级用户角色', 'admin', '拥有最高权限', '2', '2017-08-12 00:43:52', '2017-08-12 19:14:59');
-INSERT INTO `sys_role` VALUES ('59', '普通用户', null, '基本用户权限', null, null, null);
-INSERT INTO `sys_role` VALUES ('60', '测试', null, '<div>', null, null, null);
-INSERT INTO `sys_role` VALUES ('61', 'test', null, '测试', null, null, null);
-- ----------------------------
-- Table structure for sys_role_data_perm
@@ -1497,19 +1441,7 @@ CREATE TABLE `sys_user` (
-- ----------------------------
-- Records of sys_user
-- ----------------------------
-INSERT INTO `sys_user` VALUES ('1', 'admin', '超级管理员', 'd633268afedf209e1e4ea0f5f43228a8', '6', 'admin@example.com', '17699999999', '1', '1', '2017-08-15 21:40:39', '2017-08-15 21:41:00', '96', '2017-12-14 00:00:00', '148', 'ccc', '122;121;', '北京市', '北京市市辖区', '东城区');
-INSERT INTO `sys_user` VALUES ('2', 'test', '临时用户', 'd0af8fa1272ef5a152d9e27763eea293', '6', 'test@bootdo.com', null, '1', '1', '2017-08-14 13:43:05', '2017-08-14 21:15:36', null, null, null, null, null, null, null, null);
-INSERT INTO `sys_user` VALUES ('36', 'ldh', '刘德华', 'bfd9394475754fbe45866eba97738c36', '7', 'ldh@bootdo.com', null, '1', null, null, null, null, null, null, null, null, null, null, null);
-INSERT INTO `sys_user` VALUES ('123', 'zxy', '张学友', '35174ba93f5fe7267f1fb3c1bf903781', '6', 'zxy@bootdo', null, '0', null, null, null, null, null, null, null, null, null, null, null);
-INSERT INTO `sys_user` VALUES ('124', 'wyf', '吴亦凡', 'e179e6f687bbd57b9d7efc4746c8090a', '6', 'wyf@bootdo.com', null, '1', null, null, null, null, null, null, null, null, null, null, null);
-INSERT INTO `sys_user` VALUES ('130', 'lh', '鹿晗', '7924710cd673f68967cde70e188bb097', '9', 'lh@bootdo.com', null, '1', null, null, null, null, null, null, null, null, null, null, null);
-INSERT INTO `sys_user` VALUES ('131', 'lhc', '令狐冲', 'd515538e17ecb570ba40344b5618f5d4', '6', 'lhc@bootdo.com', null, '0', null, null, null, null, null, null, null, null, null, null, null);
-INSERT INTO `sys_user` VALUES ('132', 'lyf', '刘亦菲', '7fdb1d9008f45950c1620ba0864e5fbd', '13', 'lyf@bootdo.com', null, '1', null, null, null, null, null, null, null, null, null, null, null);
-INSERT INTO `sys_user` VALUES ('134', 'lyh', '李彦宏', 'dc26092b3244d9d432863f2738180e19', '8', 'lyh@bootdo.com', null, '1', null, null, null, null, null, null, null, null, null, null, null);
-INSERT INTO `sys_user` VALUES ('135', 'wjl', '王健林', '3967697dfced162cf6a34080259b83aa', '6', 'wjl@bootod.com', null, '1', null, null, null, null, null, null, null, null, null, null, null);
-INSERT INTO `sys_user` VALUES ('136', 'gdg', '郭德纲', '3bb1bda86bc02bf6478cd91e42135d2f', '9', 'gdg@bootdo.com', null, '1', null, null, null, null, null, null, null, null, null, null, null);
-INSERT INTO `sys_user` VALUES ('137', 'test2', 'test2', '649169898e69272c0e5bc899baf1e904', null, '1179705413@qq.com', null, '1', null, null, null, null, null, null, null, null, null, null, null);
-INSERT INTO `sys_user` VALUES ('138', 'test3', 'test3', '79ba2d0b58d8a2e94f6b18744c8cd280', '16', '1179705413@qq.com', null, '1', null, null, null, null, null, null, null, null, null, null, null);
+INSERT INTO `sys_user` VALUES ('1', 'admin', '超级管理员', 'd633268afedf209e1e4ea0f5f43228a8', '14', 'admin@example.com', '17699999999', '1', '1', '2017-08-15 21:40:39', '2017-08-15 21:41:00', '96', '2017-12-14 00:00:00', '148', 'ccc', '122;121;', '北京市', '北京市市辖区', '东城区');
-- ----------------------------
-- Table structure for sys_user_role
@@ -1904,4 +1836,8 @@ INSERT INTO `sys_role_menu`(`id`, `role_id`, `menu_id`) VALUES (4900, 1, 235);
INSERT INTO `sys_role_menu`(`id`, `role_id`, `menu_id`) VALUES (4888, 1, 234);
-delete from sys_menu where menu_id = 202;
\ No newline at end of file
+delete from sys_menu where menu_id = 202;
+
+INSERT INTO crawl_source(`id`, `source_name`, `crawl_rule`, `source_status`, `create_time`, `update_time`) VALUES (16, 'i笔趣阁', '{\"bookListUrl\":\"http://m.ibiquge.net/xclass/{catId}/{page}.html\",\"catIdRule\":{\"catId1\":\"1\",\"catId2\":\"2\",\"catId3\":\"3\",\"catId4\":\"4\",\"catId5\":\"6\",\"catId6\":\"5\",\"catId7\":\"7\"},\"bookIdPatten\":\"href=\\\"/(\\\\d+_\\\\d+)/\\\"\",\"pagePatten\":\"value=\\\"(\\\\d+)/\\\\d+\\\"\",\"totalPagePatten\":\"value=\\\"\\\\d+/(\\\\d+)\\\"\",\"bookDetailUrl\":\"http://m.ibiquge.net/{bookId}/\",\"bookNamePatten\":\"([^/]+)\",\"authorNamePatten\":\"([^/]+)\",\"picUrlPatten\":\"
]+)\\\"\\\\s+onerror=\\\"this.src=\",\"picUrlPrefix\":\"http://m.ibiquge.net\",\"statusPatten\":\">状态:([^/]+)\",\"bookStatusRule\":{\"连载\":0,\"完结\":1},\"visitCountPatten\":\">点击:(\\\\d+)\",\"descStart\":\"
\",\"descEnd\":\"
\",\"bookIndexUrl\":\"http://www.ibiquge.net/{bookId}/\",\"bookIndexStart\":\"正文\",\"indexIdPatten\":\"[^/]+\",\"indexNamePatten\":\"([^/]+)\",\"bookContentUrl\":\"http://www.ibiquge.net/{bookId}/{indexId}.html\",\"contentStart\":\"\",\"contentEnd\":\"\"}', 0, '2021-02-04 21:31:23', '2021-02-04 21:31:23');
+
+alter table news add column `read_count` BIGINT NOT NULL DEFAULT '0' COMMENT '阅读量' after content;
\ No newline at end of file
diff --git a/sql/sql文件说明.txt b/doc/sql/sql文件说明.txt
similarity index 100%
rename from sql/sql文件说明.txt
rename to doc/sql/sql文件说明.txt
diff --git a/novel-admin/pom.xml b/novel-admin/pom.xml
index c9f6e06..46d059c 100644
--- a/novel-admin/pom.xml
+++ b/novel-admin/pom.xml
@@ -5,7 +5,7 @@
com.java2nb
novel-admin
-
3.1.0
+
3.6.0
jar
novel-admin
diff --git a/novel-admin/src/main/java/com/java2nb/AdminApplication.java b/novel-admin/src/main/java/com/java2nb/AdminApplication.java
index 5eb633f..503fd06 100644
--- a/novel-admin/src/main/java/com/java2nb/AdminApplication.java
+++ b/novel-admin/src/main/java/com/java2nb/AdminApplication.java
@@ -2,20 +2,18 @@ package com.java2nb;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
-import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.transaction.annotation.EnableTransactionManagement;
-//关闭SpringSecurity的功能
-@EnableAutoConfiguration(exclude = {
- org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class
-})
+
@EnableTransactionManagement
@ServletComponentScan
@MapperScan("com.java2nb.*.dao")
-@SpringBootApplication
+@SpringBootApplication(exclude = {
+ org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class
+})
@EnableCaching
public class AdminApplication {
public static void main(String[] args) {
diff --git a/novel-admin/src/main/java/com/java2nb/common/config/ShiroConfig.java b/novel-admin/src/main/java/com/java2nb/common/config/ShiroConfig.java
index bc2a8f7..20d344d 100644
--- a/novel-admin/src/main/java/com/java2nb/common/config/ShiroConfig.java
+++ b/novel-admin/src/main/java/com/java2nb/common/config/ShiroConfig.java
@@ -75,7 +75,6 @@ public class ShiroConfig {
filterChainDefinitionMap.put("/img/**", "anon");
filterChainDefinitionMap.put("/docs/**", "anon");
filterChainDefinitionMap.put("/layuimini/**", "anon");
- filterChainDefinitionMap.put("/druid/**", "anon");
filterChainDefinitionMap.put("/upload/**", "anon");
filterChainDefinitionMap.put("/files/**", "anon");
filterChainDefinitionMap.put("/logout", "logout");
diff --git a/novel-admin/src/main/java/com/java2nb/novel/controller/StatController.java b/novel-admin/src/main/java/com/java2nb/novel/controller/StatController.java
index 3816599..689a213 100644
--- a/novel-admin/src/main/java/com/java2nb/novel/controller/StatController.java
+++ b/novel-admin/src/main/java/com/java2nb/novel/controller/StatController.java
@@ -1,19 +1,17 @@
package com.java2nb.novel.controller;
import com.java2nb.common.utils.DateUtils;
-import com.java2nb.common.utils.PageBean;
-import com.java2nb.common.utils.Query;
import com.java2nb.common.utils.R;
-import com.java2nb.novel.domain.AuthorCodeDO;
-import com.java2nb.novel.service.*;
-import com.java2nb.test.service.OrderService;
-import io.swagger.annotations.ApiOperation;
+import com.java2nb.novel.service.AuthorService;
+import com.java2nb.novel.service.BookService;
+import com.java2nb.novel.service.PayService;
+import com.java2nb.novel.service.UserService;
import lombok.SneakyThrows;
-import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.web.bind.annotation.*;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
import java.text.SimpleDateFormat;
import java.util.Date;
diff --git a/novel-admin/src/main/java/com/java2nb/test/controller/OrderController.java b/novel-admin/src/main/java/com/java2nb/test/controller/OrderController.java
deleted file mode 100644
index bd8f376..0000000
--- a/novel-admin/src/main/java/com/java2nb/test/controller/OrderController.java
+++ /dev/null
@@ -1,135 +0,0 @@
-package com.java2nb.test.controller;
-
-import java.util.List;
-import java.util.Map;
-
-import org.apache.shiro.authz.annotation.RequiresPermissions;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.ResponseBody;
-import io.swagger.annotations.ApiOperation;
-
-
-import com.java2nb.test.domain.OrderDO;
-import com.java2nb.test.service.OrderService;
-import com.java2nb.common.utils.PageBean;
-import com.java2nb.common.utils.Query;
-import com.java2nb.common.utils.R;
-
-/**
- * 付呗-订单信息表
- *
- * @author xiongxy
- * @email 1179705413@qq.com
- * @date 2019-11-25 11:57:16
- */
-
-@Controller
-@RequestMapping("/test/order")
-public class OrderController {
- @Autowired
- private OrderService orderService;
-
- @GetMapping()
- @RequiresPermissions("test:order:order")
- String Order() {
- return "test/order/order";
- }
-
- @ApiOperation(value = "获取付呗-订单信息表列表", notes = "获取付呗-订单信息表列表")
- @ResponseBody
- @GetMapping("/list")
- @RequiresPermissions("test:order:order")
- public R list(@RequestParam Map
params) {
- //查询列表数据
- Query query = new Query(params);
- List orderList = orderService.list(query);
- int total = orderService.count(query);
- PageBean pageBean = new PageBean(orderList, total);
- return R.ok().put("data", pageBean);
- }
-
- @ApiOperation(value = "新增付呗-订单信息表页面", notes = "新增付呗-订单信息表页面")
- @GetMapping("/add")
- @RequiresPermissions("test:order:add")
- String add() {
- return "test/order/add";
- }
-
- @ApiOperation(value = "修改付呗-订单信息表页面", notes = "修改付呗-订单信息表页面")
- @GetMapping("/edit/{id}")
- @RequiresPermissions("test:order:edit")
- String edit(@PathVariable("id") Long id, Model model) {
- OrderDO order = orderService.get(id);
- model.addAttribute("order", order);
- return "test/order/edit";
- }
-
- @ApiOperation(value = "查看付呗-订单信息表页面", notes = "查看付呗-订单信息表页面")
- @GetMapping("/detail/{id}")
- @RequiresPermissions("test:order:detail")
- String detail(@PathVariable("id") Long id, Model model) {
- OrderDO order = orderService.get(id);
- model.addAttribute("order", order);
- return "test/order/detail";
- }
-
- /**
- * 保存
- */
- @ApiOperation(value = "新增付呗-订单信息表", notes = "新增付呗-订单信息表")
- @ResponseBody
- @PostMapping("/save")
- @RequiresPermissions("test:order:add")
- public R save( OrderDO order) {
- if (orderService.save(order) > 0) {
- return R.ok();
- }
- return R.error();
- }
-
- /**
- * 修改
- */
- @ApiOperation(value = "修改付呗-订单信息表", notes = "修改付呗-订单信息表")
- @ResponseBody
- @RequestMapping("/update")
- @RequiresPermissions("test:order:edit")
- public R update( OrderDO order) {
- orderService.update(order);
- return R.ok();
- }
-
- /**
- * 删除
- */
- @ApiOperation(value = "删除付呗-订单信息表", notes = "删除付呗-订单信息表")
- @PostMapping("/remove")
- @ResponseBody
- @RequiresPermissions("test:order:remove")
- public R remove( Long id) {
- if (orderService.remove(id) > 0) {
- return R.ok();
- }
- return R.error();
- }
-
- /**
- * 删除
- */
- @ApiOperation(value = "批量删除付呗-订单信息表", notes = "批量删除付呗-订单信息表")
- @PostMapping("/batchRemove")
- @ResponseBody
- @RequiresPermissions("test:order:batchRemove")
- public R remove(@RequestParam("ids[]") Long[] ids) {
- orderService.batchRemove(ids);
- return R.ok();
- }
-
-}
diff --git a/novel-admin/src/main/java/com/java2nb/test/dao/OrderDao.java b/novel-admin/src/main/java/com/java2nb/test/dao/OrderDao.java
deleted file mode 100644
index 8fe5d98..0000000
--- a/novel-admin/src/main/java/com/java2nb/test/dao/OrderDao.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package com.java2nb.test.dao;
-
-import com.java2nb.test.domain.OrderDO;
-
-import java.util.List;
-import java.util.Map;
-
-import org.apache.ibatis.annotations.Mapper;
-
-/**
- * 付呗-订单信息表
- * @author xiongxy
- * @email 1179705413@qq.com
- * @date 2019-11-25 11:57:16
- */
-@Mapper
-public interface OrderDao {
-
- OrderDO get(Long id);
-
- List list(Map map);
-
- int count(Map map);
-
- int save(OrderDO order);
-
- int update(OrderDO order);
-
- int remove(Long id);
-
- int batchRemove(Long[] ids);
-}
diff --git a/novel-admin/src/main/java/com/java2nb/test/domain/OrderDO.java b/novel-admin/src/main/java/com/java2nb/test/domain/OrderDO.java
deleted file mode 100644
index 5b44c96..0000000
--- a/novel-admin/src/main/java/com/java2nb/test/domain/OrderDO.java
+++ /dev/null
@@ -1,475 +0,0 @@
-package com.java2nb.test.domain;
-
-import java.io.Serializable;
-
-
-import java.math.BigDecimal;
-
-import com.fasterxml.jackson.databind.annotation.JsonSerialize;
-import com.java2nb.common.jsonserializer.LongToStringSerializer;
-
-
-import org.springframework.format.annotation.DateTimeFormat;
-import java.util.Date;
-
-
-
-/**
- * 付呗-订单信息表
- *
- * @author xiongxy
- * @email 1179705413@qq.com
- * @date 2019-11-25 11:57:16
- */
-public class OrderDO implements Serializable {
- private static final long serialVersionUID = 1L;
-
-
- //主键
- //java中的long能表示的范围比js中number大,也就意味着部分数值在js中存不下(变成不准确的值)
- //所以通过序列化成字符串来解决
- @JsonSerialize(using = LongToStringSerializer.class)
- private Long id;
- //付呗商户号
- private String fbMerchantCode;
- //第三方商户的订单号
- private String merchantOrderSn;
- //付呗订单号
- private String orderSn;
- //平台方订单号
- private String platformOrderNo;
- //商户单号
- private String tradeNo;
- //订单状态,1:未支付,2:支付成功,3:支付失败,4:支付取消
- private Integer orderState;
- //蜂鸟优惠卷抵扣
- private Double fnCoupon;
- //红包抵扣
- private BigDecimal redPacket;
- //实收金额(元)
- private BigDecimal totalFee;
- //订单金额
- private BigDecimal orderPrice;
- //手续费(元)
- private BigDecimal fee;
- //对商品或交易的描述
- private String body;
- //附加数据
- private String attach;
- //付呗系统的门店id
- //java中的long能表示的范围比js中number大,也就意味着部分数值在js中存不下(变成不准确的值)
- //所以通过序列化成字符串来解决
- @JsonSerialize(using = LongToStringSerializer.class)
- private Long storeId;
- //付呗系统的收银员id
- //java中的long能表示的范围比js中number大,也就意味着部分数值在js中存不下(变成不准确的值)
- //所以通过序列化成字符串来解决
- @JsonSerialize(using = LongToStringSerializer.class)
- private Long cashierId;
- //设备终端号
- private String deviceNo;
- //微信顾客支付授权的“open_id”或者支付宝顾客的“buyer_user_id”
- private String userId;
- //支付宝顾客的账号
- private String userLogonId;
- //交易成功的时间
- @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
- private Date payTime;
- //支付通道:1微信、2支付宝、3银联
- private Integer payChannel;
- //免充值代金券金额(元)
- private BigDecimal noCashCouponFee;
- //预充值代金券金额(元)
- private BigDecimal cashCouponFee;
- //顾客实际支付金额(元)
- private BigDecimal cashFee;
- //签名
- private String sign;
- //其它选项
- private String options;
- //创建时间
- @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
- private Date createTime;
- //推送时间
- @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
- private Date pushTime;
- //推送IP
- private String pushIp;
- //商户id
- private BigDecimal mchtId;
- //QR编号
- private String sn;
-
- /**
- * 设置:主键
- */
- public void setId(Long id) {
- this.id = id;
- }
- /**
- * 获取:主键
- */
- public Long getId() {
- return id;
- }
- /**
- * 设置:付呗商户号
- */
- public void setFbMerchantCode(String fbMerchantCode) {
- this.fbMerchantCode = fbMerchantCode;
- }
- /**
- * 获取:付呗商户号
- */
- public String getFbMerchantCode() {
- return fbMerchantCode;
- }
- /**
- * 设置:第三方商户的订单号
- */
- public void setMerchantOrderSn(String merchantOrderSn) {
- this.merchantOrderSn = merchantOrderSn;
- }
- /**
- * 获取:第三方商户的订单号
- */
- public String getMerchantOrderSn() {
- return merchantOrderSn;
- }
- /**
- * 设置:付呗订单号
- */
- public void setOrderSn(String orderSn) {
- this.orderSn = orderSn;
- }
- /**
- * 获取:付呗订单号
- */
- public String getOrderSn() {
- return orderSn;
- }
- /**
- * 设置:平台方订单号
- */
- public void setPlatformOrderNo(String platformOrderNo) {
- this.platformOrderNo = platformOrderNo;
- }
- /**
- * 获取:平台方订单号
- */
- public String getPlatformOrderNo() {
- return platformOrderNo;
- }
- /**
- * 设置:商户单号
- */
- public void setTradeNo(String tradeNo) {
- this.tradeNo = tradeNo;
- }
- /**
- * 获取:商户单号
- */
- public String getTradeNo() {
- return tradeNo;
- }
- /**
- * 设置:订单状态,1:未支付,2:支付成功,3:支付失败,4:支付取消
- */
- public void setOrderState(Integer orderState) {
- this.orderState = orderState;
- }
- /**
- * 获取:订单状态,1:未支付,2:支付成功,3:支付失败,4:支付取消
- */
- public Integer getOrderState() {
- return orderState;
- }
- /**
- * 设置:蜂鸟优惠卷抵扣
- */
- public void setFnCoupon(Double fnCoupon) {
- this.fnCoupon = fnCoupon;
- }
- /**
- * 获取:蜂鸟优惠卷抵扣
- */
- public Double getFnCoupon() {
- return fnCoupon;
- }
- /**
- * 设置:红包抵扣
- */
- public void setRedPacket(BigDecimal redPacket) {
- this.redPacket = redPacket;
- }
- /**
- * 获取:红包抵扣
- */
- public BigDecimal getRedPacket() {
- return redPacket;
- }
- /**
- * 设置:实收金额(元)
- */
- public void setTotalFee(BigDecimal totalFee) {
- this.totalFee = totalFee;
- }
- /**
- * 获取:实收金额(元)
- */
- public BigDecimal getTotalFee() {
- return totalFee;
- }
- /**
- * 设置:订单金额
- */
- public void setOrderPrice(BigDecimal orderPrice) {
- this.orderPrice = orderPrice;
- }
- /**
- * 获取:订单金额
- */
- public BigDecimal getOrderPrice() {
- return orderPrice;
- }
- /**
- * 设置:手续费(元)
- */
- public void setFee(BigDecimal fee) {
- this.fee = fee;
- }
- /**
- * 获取:手续费(元)
- */
- public BigDecimal getFee() {
- return fee;
- }
- /**
- * 设置:对商品或交易的描述
- */
- public void setBody(String body) {
- this.body = body;
- }
- /**
- * 获取:对商品或交易的描述
- */
- public String getBody() {
- return body;
- }
- /**
- * 设置:附加数据
- */
- public void setAttach(String attach) {
- this.attach = attach;
- }
- /**
- * 获取:附加数据
- */
- public String getAttach() {
- return attach;
- }
- /**
- * 设置:付呗系统的门店id
- */
- public void setStoreId(Long storeId) {
- this.storeId = storeId;
- }
- /**
- * 获取:付呗系统的门店id
- */
- public Long getStoreId() {
- return storeId;
- }
- /**
- * 设置:付呗系统的收银员id
- */
- public void setCashierId(Long cashierId) {
- this.cashierId = cashierId;
- }
- /**
- * 获取:付呗系统的收银员id
- */
- public Long getCashierId() {
- return cashierId;
- }
- /**
- * 设置:设备终端号
- */
- public void setDeviceNo(String deviceNo) {
- this.deviceNo = deviceNo;
- }
- /**
- * 获取:设备终端号
- */
- public String getDeviceNo() {
- return deviceNo;
- }
- /**
- * 设置:微信顾客支付授权的“open_id”或者支付宝顾客的“buyer_user_id”
- */
- public void setUserId(String userId) {
- this.userId = userId;
- }
- /**
- * 获取:微信顾客支付授权的“open_id”或者支付宝顾客的“buyer_user_id”
- */
- public String getUserId() {
- return userId;
- }
- /**
- * 设置:支付宝顾客的账号
- */
- public void setUserLogonId(String userLogonId) {
- this.userLogonId = userLogonId;
- }
- /**
- * 获取:支付宝顾客的账号
- */
- public String getUserLogonId() {
- return userLogonId;
- }
- /**
- * 设置:交易成功的时间
- */
- public void setPayTime(Date payTime) {
- this.payTime = payTime;
- }
- /**
- * 获取:交易成功的时间
- */
- public Date getPayTime() {
- return payTime;
- }
- /**
- * 设置:支付通道:1微信、2支付宝、3银联
- */
- public void setPayChannel(Integer payChannel) {
- this.payChannel = payChannel;
- }
- /**
- * 获取:支付通道:1微信、2支付宝、3银联
- */
- public Integer getPayChannel() {
- return payChannel;
- }
- /**
- * 设置:免充值代金券金额(元)
- */
- public void setNoCashCouponFee(BigDecimal noCashCouponFee) {
- this.noCashCouponFee = noCashCouponFee;
- }
- /**
- * 获取:免充值代金券金额(元)
- */
- public BigDecimal getNoCashCouponFee() {
- return noCashCouponFee;
- }
- /**
- * 设置:预充值代金券金额(元)
- */
- public void setCashCouponFee(BigDecimal cashCouponFee) {
- this.cashCouponFee = cashCouponFee;
- }
- /**
- * 获取:预充值代金券金额(元)
- */
- public BigDecimal getCashCouponFee() {
- return cashCouponFee;
- }
- /**
- * 设置:顾客实际支付金额(元)
- */
- public void setCashFee(BigDecimal cashFee) {
- this.cashFee = cashFee;
- }
- /**
- * 获取:顾客实际支付金额(元)
- */
- public BigDecimal getCashFee() {
- return cashFee;
- }
- /**
- * 设置:签名
- */
- public void setSign(String sign) {
- this.sign = sign;
- }
- /**
- * 获取:签名
- */
- public String getSign() {
- return sign;
- }
- /**
- * 设置:其它选项
- */
- public void setOptions(String options) {
- this.options = options;
- }
- /**
- * 获取:其它选项
- */
- public String getOptions() {
- return options;
- }
- /**
- * 设置:创建时间
- */
- public void setCreateTime(Date createTime) {
- this.createTime = createTime;
- }
- /**
- * 获取:创建时间
- */
- public Date getCreateTime() {
- return createTime;
- }
- /**
- * 设置:推送时间
- */
- public void setPushTime(Date pushTime) {
- this.pushTime = pushTime;
- }
- /**
- * 获取:推送时间
- */
- public Date getPushTime() {
- return pushTime;
- }
- /**
- * 设置:推送IP
- */
- public void setPushIp(String pushIp) {
- this.pushIp = pushIp;
- }
- /**
- * 获取:推送IP
- */
- public String getPushIp() {
- return pushIp;
- }
- /**
- * 设置:商户id
- */
- public void setMchtId(BigDecimal mchtId) {
- this.mchtId = mchtId;
- }
- /**
- * 获取:商户id
- */
- public BigDecimal getMchtId() {
- return mchtId;
- }
- /**
- * 设置:QR编号
- */
- public void setSn(String sn) {
- this.sn = sn;
- }
- /**
- * 获取:QR编号
- */
- public String getSn() {
- return sn;
- }
-}
diff --git a/novel-admin/src/main/java/com/java2nb/test/service/OrderService.java b/novel-admin/src/main/java/com/java2nb/test/service/OrderService.java
deleted file mode 100644
index 4f5914e..0000000
--- a/novel-admin/src/main/java/com/java2nb/test/service/OrderService.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package com.java2nb.test.service;
-
-import com.java2nb.test.domain.OrderDO;
-
-import java.util.List;
-import java.util.Map;
-
-/**
- * 付呗-订单信息表
- *
- * @author xiongxy
- * @email 1179705413@qq.com
- * @date 2019-11-25 11:57:16
- */
-public interface OrderService {
-
- OrderDO get(Long id);
-
- List list(Map map);
-
- int count(Map map);
-
- int save(OrderDO order);
-
- int update(OrderDO order);
-
- int remove(Long id);
-
- int batchRemove(Long[] ids);
-}
diff --git a/novel-admin/src/main/java/com/java2nb/test/service/impl/OrderServiceImpl.java b/novel-admin/src/main/java/com/java2nb/test/service/impl/OrderServiceImpl.java
deleted file mode 100644
index cefed83..0000000
--- a/novel-admin/src/main/java/com/java2nb/test/service/impl/OrderServiceImpl.java
+++ /dev/null
@@ -1,55 +0,0 @@
-package com.java2nb.test.service.impl;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-import java.util.List;
-import java.util.Map;
-
-import com.java2nb.test.dao.OrderDao;
-import com.java2nb.test.domain.OrderDO;
-import com.java2nb.test.service.OrderService;
-
-
-
-@Service
-public class OrderServiceImpl implements OrderService {
- @Autowired
- private OrderDao orderDao;
-
- @Override
- public OrderDO get(Long id){
- return orderDao.get(id);
- }
-
- @Override
- public List list(Map map){
- return orderDao.list(map);
- }
-
- @Override
- public int count(Map map){
- return orderDao.count(map);
- }
-
- @Override
- public int save(OrderDO order){
- return orderDao.save(order);
- }
-
- @Override
- public int update(OrderDO order){
- return orderDao.update(order);
- }
-
- @Override
- public int remove(Long id){
- return orderDao.remove(id);
- }
-
- @Override
- public int batchRemove(Long[] ids){
- return orderDao.batchRemove(ids);
- }
-
-}
diff --git a/novel-admin/src/main/resources/application-dev.yml b/novel-admin/src/main/resources/application-dev.yml
index e02a464..efe02c5 100644
--- a/novel-admin/src/main/resources/application-dev.yml
+++ b/novel-admin/src/main/resources/application-dev.yml
@@ -1,5 +1,5 @@
java2nb:
- uploadPath: c:/var/java2nb/uploaded_files/
+ uploadPath: /var/pic/
username: admin
password: 111111
logging:
@@ -13,6 +13,7 @@ spring:
url: jdbc:mysql://127.0.0.1:3306/novel_plus?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
username: novel_plus
password: Aa123456
+
#password:
initialSize: 1
minIdle: 3
diff --git a/novel-admin/src/main/resources/application-prod.yml b/novel-admin/src/main/resources/application-prod.yml
index 64c02e7..5d8c090 100644
--- a/novel-admin/src/main/resources/application-prod.yml
+++ b/novel-admin/src/main/resources/application-prod.yml
@@ -1,16 +1,19 @@
java2nb:
- uploadPath: /var/java2nb/uploaded_files/
+ uploadPath: /var/pic/
+ username: admin
+ password: 111111
logging:
level:
root: error
- com.java2nb: info
+ com.java2nb: error
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driverClassName: com.mysql.cj.jdbc.Driver
- url: jdbc:mysql://127.0.0.1:3306/java2nb?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai
- username: java2nb
- password: java2nb1019
+ url: jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
+ username: root
+ password: test123456
+ #password:
initialSize: 1
minIdle: 3
maxActive: 20
@@ -34,18 +37,18 @@ spring:
# 合并多个DruidDataSource的监控数据
#useGlobalDataSourceStat: true
redis:
- host: 127.0.0.1
- port: 6379
- password:
- # 连接超时时间(毫秒)
- timeout: 10000
- jedis:
- pool:
- # 连接池中的最大空闲连接
- max-idle: 8
- # 连接池中的最小空闲连接
- min-idle: 10
- # 连接池最大连接数(使用负值表示没有限制)
- max-active: 100
- # 连接池最大阻塞等待时间(使用负值表示没有限制)
- max-wait: -1
\ No newline at end of file
+ host: 127.0.0.1
+ port: 6379
+ password: test
+ # 连接超时时间(毫秒)
+ timeout: 10000
+ jedis:
+ pool:
+ # 连接池中的最大空闲连接
+ max-idle: 8
+ # 连接池中的最小空闲连接
+ min-idle: 10
+ # 连接池最大连接数(使用负值表示没有限制)
+ max-active: 100
+ # 连接池最大阻塞等待时间(使用负值表示没有限制)
+ max-wait: -1
\ No newline at end of file
diff --git a/novel-admin/src/main/resources/banner.txt b/novel-admin/src/main/resources/banner.txt
index 8e9bd6d..9b09382 100644
--- a/novel-admin/src/main/resources/banner.txt
+++ b/novel-admin/src/main/resources/banner.txt
@@ -1,6 +1,15 @@
- __ ________ ___.
- |__|____ ___ _______ \_____ \ ____\_ |__
- | \__ \\ \/ /\__ \ / ____/ / \| __ \
- | |/ __ \\ / / __ \_/ \| | \ \_\ \
-/\__| (____ /\_/ (____ /\_______ \___| /___ /
-\______| \/ \/ \/ \/ \/
\ No newline at end of file
+${AnsiColor.CYAN}
+
+--------------------------------------------------------------------------------
+${AnsiColor.RED}
+|| / | / /
+|| / | / / ___ // ___ ___ _ __
+|| / /||/ / //___) ) // // ) ) // ) ) // ) ) ) )
+||/ / | / // // // // / / // / / / /
+| / | / ((____ // ((____ ((___/ / // / / / / 小说精品屋欢迎您!!!
+
+ -------Powered By XXY
+${AnsiColor.CYAN}
+--------------------------------------------------------------------------------
+${AnsiColor.BRIGHT_YELLOW}
+::: Spring-Boot ${spring-boot.formatted-version} :::
\ No newline at end of file
diff --git a/novel-admin/src/main/resources/mybatis/test/OrderMapper.xml b/novel-admin/src/main/resources/mybatis/test/OrderMapper.xml
deleted file mode 100644
index 664c1bb..0000000
--- a/novel-admin/src/main/resources/mybatis/test/OrderMapper.xml
+++ /dev/null
@@ -1,283 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
- insert into fb_order
- (
- `fb_merchant_code`,
- `merchant_order_sn`,
- `order_sn`,
- `platform_order_no`,
- `trade_no`,
- `order_state`,
- `fn_coupon`,
- `red_packet`,
- `total_fee`,
- `order_price`,
- `fee`,
- `body`,
- `attach`,
- `store_id`,
- `cashier_id`,
- `device_no`,
- `user_id`,
- `user_logon_id`,
- `pay_time`,
- `pay_channel`,
- `no_cash_coupon_fee`,
- `cash_coupon_fee`,
- `cash_fee`,
- `sign`,
- `options`,
- `create_time`,
- `push_time`,
- `push_ip`,
- `mcht_id`,
- `sn`
- )
- values
- (
- #{fbMerchantCode},
- #{merchantOrderSn},
- #{orderSn},
- #{platformOrderNo},
- #{tradeNo},
- #{orderState},
- #{fnCoupon},
- #{redPacket},
- #{totalFee},
- #{orderPrice},
- #{fee},
- #{body},
- #{attach},
- #{storeId},
- #{cashierId},
- #{deviceNo},
- #{userId},
- #{userLogonId},
- #{payTime},
- #{payChannel},
- #{noCashCouponFee},
- #{cashCouponFee},
- #{cashFee},
- #{sign},
- #{options},
- #{createTime},
- #{pushTime},
- #{pushIp},
- #{mchtId},
- #{sn}
- )
-
-
-
- insert into fb_order
- (
- `id`,
- `fb_merchant_code`,
- `merchant_order_sn`,
- `order_sn`,
- `platform_order_no`,
- `trade_no`,
- `order_state`,
- `fn_coupon`,
- `red_packet`,
- `total_fee`,
- `order_price`,
- `fee`,
- `body`,
- `attach`,
- `store_id`,
- `cashier_id`,
- `device_no`,
- `user_id`,
- `user_logon_id`,
- `pay_time`,
- `pay_channel`,
- `no_cash_coupon_fee`,
- `cash_coupon_fee`,
- `cash_fee`,
- `sign`,
- `options`,
- `create_time`,
- `push_time`,
- `push_ip`,
- `mcht_id`,
- `sn`
- )
- values
- (
- #{id},
- #{fbMerchantCode},
- #{merchantOrderSn},
- #{orderSn},
- #{platformOrderNo},
- #{tradeNo},
- #{orderState},
- #{fnCoupon},
- #{redPacket},
- #{totalFee},
- #{orderPrice},
- #{fee},
- #{body},
- #{attach},
- #{storeId},
- #{cashierId},
- #{deviceNo},
- #{userId},
- #{userLogonId},
- #{payTime},
- #{payChannel},
- #{noCashCouponFee},
- #{cashCouponFee},
- #{cashFee},
- #{sign},
- #{options},
- #{createTime},
- #{pushTime},
- #{pushIp},
- #{mchtId},
- #{sn}
- )
-
-
-
- update fb_order
-
- `fb_merchant_code` = #{fbMerchantCode},
- `merchant_order_sn` = #{merchantOrderSn},
- `order_sn` = #{orderSn},
- `platform_order_no` = #{platformOrderNo},
- `trade_no` = #{tradeNo},
- `order_state` = #{orderState},
- `fn_coupon` = #{fnCoupon},
- `red_packet` = #{redPacket},
- `total_fee` = #{totalFee},
- `order_price` = #{orderPrice},
- `fee` = #{fee},
- `body` = #{body},
- `attach` = #{attach},
- `store_id` = #{storeId},
- `cashier_id` = #{cashierId},
- `device_no` = #{deviceNo},
- `user_id` = #{userId},
- `user_logon_id` = #{userLogonId},
- `pay_time` = #{payTime},
- `pay_channel` = #{payChannel},
- `no_cash_coupon_fee` = #{noCashCouponFee},
- `cash_coupon_fee` = #{cashCouponFee},
- `cash_fee` = #{cashFee},
- `sign` = #{sign},
- `options` = #{options},
- `create_time` = #{createTime},
- `push_time` = #{pushTime},
- `push_ip` = #{pushIp},
- `mcht_id` = #{mchtId},
- `sn` = #{sn}
-
- where id = #{id}
-
-
-
- delete from fb_order where id = #{value}
-
-
-
- delete from fb_order where id in
-
- #{id}
-
-
-
-
\ No newline at end of file
diff --git a/novel-admin/src/main/resources/static/sql/test/order/menu.js b/novel-admin/src/main/resources/static/sql/test/order/menu.js
deleted file mode 100644
index 0b6d170..0000000
--- a/novel-admin/src/main/resources/static/sql/test/order/menu.js
+++ /dev/null
@@ -1,18 +0,0 @@
--- 菜单SQL
-INSERT INTO `sys_menu` (`parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`)
- VALUES ('1', '付呗-订单信息表', 'test/order', 'test:order:order', '1', 'fa', '6');
-
--- 按钮父菜单ID
-set @parentId = @@identity;
-
--- 菜单对应按钮SQL
-INSERT INTO `sys_menu` (`parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`)
- SELECT @parentId, '查看', null, 'test:order:detail', '2', null, '6';
-INSERT INTO `sys_menu` (`parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`)
- SELECT @parentId, '新增', null, 'test:order:add', '2', null, '6';
-INSERT INTO `sys_menu` (`parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`)
- SELECT @parentId, '修改', null, 'test:order:edit', '2', null, '6';
-INSERT INTO `sys_menu` (`parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`)
- SELECT @parentId, '删除', null, 'test:order:remove', '2', null, '6';
-INSERT INTO `sys_menu` (`parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`)
- SELECT @parentId, '批量删除', null, 'test:order:batchRemove', '2', null, '6';
diff --git a/novel-admin/src/main/resources/templates/test/order/add.html b/novel-admin/src/main/resources/templates/test/order/add.html
deleted file mode 100644
index df6f684..0000000
--- a/novel-admin/src/main/resources/templates/test/order/add.html
+++ /dev/null
@@ -1,327 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
diff --git a/novel-admin/src/main/resources/templates/test/order/detail.html b/novel-admin/src/main/resources/templates/test/order/detail.html
deleted file mode 100644
index 3377337..0000000
--- a/novel-admin/src/main/resources/templates/test/order/detail.html
+++ /dev/null
@@ -1,315 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/novel-admin/src/main/resources/templates/test/order/edit.html b/novel-admin/src/main/resources/templates/test/order/edit.html
deleted file mode 100644
index 4cf036a..0000000
--- a/novel-admin/src/main/resources/templates/test/order/edit.html
+++ /dev/null
@@ -1,323 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/novel-admin/src/main/resources/templates/test/order/order.html b/novel-admin/src/main/resources/templates/test/order/order.html
deleted file mode 100644
index b215a71..0000000
--- a/novel-admin/src/main/resources/templates/test/order/order.html
+++ /dev/null
@@ -1,66 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/novel-admin/src/test/java/com/java2nb/testDemo/TestDemo.java b/novel-admin/src/test/java/com/java2nb/testDemo/TestDemo.java
deleted file mode 100644
index d6029b6..0000000
--- a/novel-admin/src/test/java/com/java2nb/testDemo/TestDemo.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package com.java2nb.testDemo;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.data.redis.core.RedisTemplate;
-import org.springframework.test.context.junit4.SpringRunner;
-import org.springframework.web.bind.annotation.RestController;
-
-@RestController()
-@RunWith(SpringRunner.class)
-@SpringBootTest
-public class TestDemo {
- @Autowired
- RedisTemplate redisTemplate;
-
- @Test
- public void test() {
- redisTemplate.opsForValue().set("a", "b");
- System.out.println(redisTemplate.opsForValue().get("a"));
- }
-
- ;
-}
diff --git a/novel-common/pom.xml b/novel-common/pom.xml
index 124e041..f2233f5 100644
--- a/novel-common/pom.xml
+++ b/novel-common/pom.xml
@@ -5,7 +5,7 @@
novel
com.java2nb
- 3.1.0
+ 3.6.0
4.0.0
@@ -123,6 +123,12 @@
true
+
+ org.springframework.boot
+ spring-boot-configuration-processor
+ true
+
+
diff --git a/novel-common/src/main/java/com/java2nb/novel/core/advice/CommonExceptionHandler.java b/novel-common/src/main/java/com/java2nb/novel/core/advice/CommonExceptionHandler.java
index 882f830..1296d0d 100644
--- a/novel-common/src/main/java/com/java2nb/novel/core/advice/CommonExceptionHandler.java
+++ b/novel-common/src/main/java/com/java2nb/novel/core/advice/CommonExceptionHandler.java
@@ -13,7 +13,7 @@ import org.springframework.web.bind.annotation.RestControllerAdvice;
*
* @author 11797*/
@Slf4j
-@RestControllerAdvice
+@RestControllerAdvice(basePackages = "com.java2nb.novel.controller")
public class CommonExceptionHandler {
/**
diff --git a/novel-common/src/main/java/com/java2nb/novel/core/advice/PageExceptionHandler.java b/novel-common/src/main/java/com/java2nb/novel/core/advice/PageExceptionHandler.java
new file mode 100644
index 0000000..609ed6d
--- /dev/null
+++ b/novel-common/src/main/java/com/java2nb/novel/core/advice/PageExceptionHandler.java
@@ -0,0 +1,26 @@
+package com.java2nb.novel.core.advice;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.ControllerAdvice;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+
+/**
+ * 页面异常处理器
+ *
+ * @author 11797
+ */
+@Slf4j
+@ControllerAdvice(basePackages = "com.java2nb.novel.page")
+public class PageExceptionHandler {
+
+
+ /**
+ * 处理所有异常
+ */
+ @ExceptionHandler(Exception.class)
+ public String handlerException(Exception e) {
+ log.error(e.getMessage(), e);
+ //跳转页面过程中出现异常时统一跳转到404页面
+ return "404";
+ }
+}
diff --git a/novel-common/src/main/java/com/java2nb/novel/core/bean/PageBean.java b/novel-common/src/main/java/com/java2nb/novel/core/bean/PageBean.java
new file mode 100644
index 0000000..f4f837b
--- /dev/null
+++ b/novel-common/src/main/java/com/java2nb/novel/core/bean/PageBean.java
@@ -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 分页集合类型
+ */
+@Data
+public class PageBean {
+
+ private Integer pageNum;
+ private Integer pageSize;
+ private Long total;
+ private List extends T> list;
+
+
+ /**
+ * 该构造函数用于PageHelper工具进行分页查询的场景
+ * 接收PageHelper分页后的list
+ */
+ public PageBean(List list){
+ PageInfo 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 list) {
+ this.pageNum = pageNum;
+ this.pageSize = pageSize;
+ this.total = total;
+ this.list = list;
+ }
+
+
+ //TODO 使用其他的分页工具或框架进行分页查询的场景
+
+
+
+}
diff --git a/novel-common/src/main/java/com/java2nb/novel/core/bean/ResultBean.java b/novel-common/src/main/java/com/java2nb/novel/core/bean/ResultBean.java
index d8152f2..d48a54d 100644
--- a/novel-common/src/main/java/com/java2nb/novel/core/bean/ResultBean.java
+++ b/novel-common/src/main/java/com/java2nb/novel/core/bean/ResultBean.java
@@ -8,8 +8,9 @@ import java.io.Serializable;
/**
* 自定义响应结构
- * @author 11797
+ *
* @param
+ * @author 11797
*/
@Data
public class ResultBean implements Serializable {
@@ -19,20 +20,20 @@ public class ResultBean implements Serializable {
/**
* 响应消息
- * */
+ */
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(ResponseStatus responseStatus) {
+ this.code = responseStatus.getCode();
+ this.msg = responseStatus.getMsg();
}
private ResultBean(T data) {
@@ -40,34 +41,33 @@ public class ResultBean implements Serializable {
}
-
/**
* 业务处理成功,无数据返回
- * */
- public static ResultBean ok() {
- return new ResultBean();
+ */
+ public static ResultBean ok() {
+ return new ResultBean<>();
}
/**
* 业务处理成功,有数据返回
- * */
- public static ResultBean ok(T data) {
- return new ResultBean(data);
+ */
+ public static ResultBean ok(T data) {
+ return new ResultBean<>(data);
}
/**
* 业务处理失败
- * */
- public static ResultBean fail(ResponseStatus ResponseStatus) {
- return new ResultBean(ResponseStatus);
+ */
+ public static ResultBean fail(ResponseStatus responseStatus) {
+ return new ResultBean<>(responseStatus);
}
/**
* 系统错误
- * */
- public static ResultBean error() {
- return new ResultBean(ResponseStatus.ERROR);
+ */
+ public static ResultBean error() {
+ return new ResultBean<>(ResponseStatus.ERROR);
}
}
diff --git a/novel-common/src/main/java/com/java2nb/novel/core/cache/impl/EhCacheServiceImpl.java b/novel-common/src/main/java/com/java2nb/novel/core/cache/impl/EhCacheServiceImpl.java
index fa3937a..e935bdd 100644
--- a/novel-common/src/main/java/com/java2nb/novel/core/cache/impl/EhCacheServiceImpl.java
+++ b/novel-common/src/main/java/com/java2nb/novel/core/cache/impl/EhCacheServiceImpl.java
@@ -16,108 +16,107 @@ import org.springframework.stereotype.Service;
@RequiredArgsConstructor
@Service
public class EhCacheServiceImpl implements CacheService {
-
- private final CacheManager cacheManager ;
-
- /**
- * 获得一个Cache,没有则创建一个。
- * @return
- */
- private Cache getCache(){
-
- Cache cache = cacheManager.getCache("util_cache");
- return cache;
- }
-
-
- @Override
- public String get(String key) {
- Element element = getCache().get(key);
- return element==null?null:(String)element.getObjectValue();
- }
-
- @Override
- public void set(String key, String value) {
- Element element = new Element(key, value);
- Cache cache = getCache();
- //不过期
- cache.getCacheConfiguration().setEternal(true);
- cache.put(element);
-
- }
-
- @Override
- public void set(String key, String value, long timeout) {
- Element element = new Element(key, value);
- element.setTimeToLive((int) timeout);
- Cache cache = getCache();
- cache.put(element);
-
- }
-
- @Override
- public void del(String key) {
- getCache().remove(key);
+ private final CacheManager cacheManager;
- }
+ /**
+ * 获得一个Cache,没有则创建一个。
+ *
+ * @return
+ */
+ private Cache getCache() {
- @Override
- public boolean contains(String key) {
- return getCache().isKeyInCache(key);
- }
-
- @Override
- public void expire(String key, long timeout) {
- Element element = getCache().get(key);
- if (element != null) {
- Object value = element.getValue();
- element = new Element(key, value);
- element.setTimeToLive((int)timeout);
- Cache cache = getCache();
- cache.put(element);
- }
- }
+ Cache cache = cacheManager.getCache("util_cache");
+ return cache;
+ }
- /**
- * 根据key获取缓存的Object类型数据
- */
- @Override
- public Object getObject(String key) {
- Element element = getCache().get(key);
- return element==null?null:element.getObjectValue();
- }
+ @Override
+ public String get(String key) {
+ Element element = getCache().get(key);
+ return element == null ? null : (String) element.getObjectValue();
+ }
+
+ @Override
+ public void set(String key, String value) {
+ Element element = new Element(key, value);
+ Cache cache = getCache();
+ //不过期
+ cache.getCacheConfiguration().setEternal(true);
+ cache.put(element);
+
+ }
+
+ @Override
+ public void set(String key, String value, long timeout) {
+ Element element = new Element(key, value);
+ element.setTimeToLive((int) timeout);
+ Cache cache = getCache();
+ cache.put(element);
+
+ }
+
+ @Override
+ public void del(String key) {
+ getCache().remove(key);
- /**
- * 设置Object类型的缓存
- */
- @Override
- public void setObject(String key, Object value) {
- Element element = new Element(key, value);
- Cache cache = getCache();
- //不过期
- cache.getCacheConfiguration().setEternal(true);
- cache.put(element);
-
- }
+ }
+
+ @Override
+ public boolean contains(String key) {
+ return getCache().isKeyInCache(key);
+ }
+
+ @Override
+ public void expire(String key, long timeout) {
+ Element element = getCache().get(key);
+ if (element != null) {
+ Object value = element.getValue();
+ element = new Element(key, value);
+ element.setTimeToLive((int) timeout);
+ Cache cache = getCache();
+ cache.put(element);
+ }
+ }
- /**
- * 设置一个有过期时间的Object类型的缓存,单位秒
- */
- @Override
- public void setObject(String key, Object value, long timeout) {
- Element element = new Element(key, value);
- element.setTimeToLive((int) timeout);
- Cache cache = getCache();
- cache.put(element);
-
- }
+ /**
+ * 根据key获取缓存的Object类型数据
+ */
+ @Override
+ public Object getObject(String key) {
+ Element element = getCache().get(key);
+ return element == null ? null : element.getObjectValue();
+ }
+ /**
+ * 设置Object类型的缓存
+ */
+ @Override
+ public void setObject(String key, Object value) {
+ Element element = new Element(key, value);
+ Cache cache = getCache();
+ //不过期
+ cache.getCacheConfiguration().setEternal(true);
+ cache.put(element);
+
+ }
+
+
+ /**
+ * 设置一个有过期时间的Object类型的缓存,单位秒
+ */
+ @Override
+ public void setObject(String key, Object value, long timeout) {
+ Element element = new Element(key, value);
+ element.setTimeToLive((int) timeout);
+ Cache cache = getCache();
+ cache.put(element);
+
+ }
}
diff --git a/novel-common/src/main/java/com/java2nb/novel/core/enums/ResponseStatus.java b/novel-common/src/main/java/com/java2nb/novel/core/enums/ResponseStatus.java
index 5eb3d5b..b73bc5a 100644
--- a/novel-common/src/main/java/com/java2nb/novel/core/enums/ResponseStatus.java
+++ b/novel-common/src/main/java/com/java2nb/novel/core/enums/ResponseStatus.java
@@ -68,6 +68,12 @@ public enum ResponseStatus {
* */
ES_SEARCH_FAIL(9001,"搜索引擎查询错误!"),
+ /**
+ * 文件相关错误
+ * */
+ FILE_DIR_MAKE_FAIL(10001,"目录创建失败"),
+ FILE_NOT_IMAGE(10002,"请上传图片类型的文件"),
+ FILE_SIZE_LIMIT(10003,"文件大小超出限制"),
/**
* 其他通用错误
diff --git a/novel-common/src/main/java/com/java2nb/novel/core/utils/BeanUtil.java b/novel-common/src/main/java/com/java2nb/novel/core/utils/BeanUtil.java
index e3d0280..2b1de8e 100644
--- a/novel-common/src/main/java/com/java2nb/novel/core/utils/BeanUtil.java
+++ b/novel-common/src/main/java/com/java2nb/novel/core/utils/BeanUtil.java
@@ -19,7 +19,7 @@ public class BeanUtil {
* @return 新集合
* */
@SneakyThrows
- public static List copyList(List source,Class targetClass){
+ public static List copyList(List super T> source,Class targetClass){
List target = new ArrayList<>(source.size());
for( int i = 0 ; i < source.size() ; i++){
Object sourceItem = source.get(i);
diff --git a/novel-common/src/main/java/com/java2nb/novel/core/utils/FileUtil.java b/novel-common/src/main/java/com/java2nb/novel/core/utils/FileUtil.java
index 5661c49..50ea3dc 100644
--- a/novel-common/src/main/java/com/java2nb/novel/core/utils/FileUtil.java
+++ b/novel-common/src/main/java/com/java2nb/novel/core/utils/FileUtil.java
@@ -1,6 +1,7 @@
package com.java2nb.novel.core.utils;
import lombok.SneakyThrows;
+import lombok.experimental.UtilityClass;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.Charsets;
import org.apache.http.client.utils.DateUtils;
@@ -11,21 +12,24 @@ import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import javax.imageio.ImageIO;
+import java.awt.image.BufferedImage;
import java.io.*;
import java.util.Date;
import java.util.Objects;
/**
* 文件操作工具类
+ *
* @author 11797
*/
+@UtilityClass
@Slf4j
public class FileUtil {
/**
* 网络图片转本地
- * */
- public static String network2Local(String picSrc,String picSavePath,String visitPrefix) {
+ */
+ public String network2Local(String picSrc, String picSavePath, String visitPrefix) {
InputStream input = null;
OutputStream out = null;
try {
@@ -50,37 +54,70 @@ public class FileUtil {
}
out.flush();
- if( ImageIO.read(picFile) == null){
+ if (ImageIO.read(picFile) == null) {
picSrc = "/images/default.gif";
}
- }catch (Exception e){
- log.error(e.getMessage(),e);
+ } catch (Exception e) {
+ log.error(e.getMessage(), e);
picSrc = "/images/default.gif";
- }finally {
- 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);
- }
- }
- }
- }
+ } finally {
+ closeStream(input, out);
}
-
return picSrc;
}
+ @SneakyThrows
+ private void closeStream(InputStream input, OutputStream out) {
+ if (input != null) {
+ input.close();
+ }
+ if (out != null) {
+ out.close();
+ }
+ }
+
+
+ /**
+ * 判断文件是否为图片
+ *
+ * @param file 需要判断的文件
+ * @return true:是图片,false:不是图片
+ */
+ @SneakyThrows
+ public boolean isImage(File file) {
+
+ BufferedImage bi = ImageIO.read(file);
+
+ return bi != null;
+
+
+ }
+
+ 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);
+ }
+
+ }
}
diff --git a/novel-common/src/main/java/com/java2nb/novel/entity/News.java b/novel-common/src/main/java/com/java2nb/novel/entity/News.java
index c497248..c555349 100644
--- a/novel-common/src/main/java/com/java2nb/novel/entity/News.java
+++ b/novel-common/src/main/java/com/java2nb/novel/entity/News.java
@@ -1,11 +1,9 @@
package com.java2nb.novel.entity;
-
-import javax.annotation.Generated;
-import java.io.Serializable;
import java.util.Date;
+import javax.annotation.Generated;
-public class News implements Serializable {
+public class News {
@Generated("org.mybatis.generator.api.MyBatisGenerator")
private Long id;
@@ -21,6 +19,9 @@ public class News implements Serializable {
@Generated("org.mybatis.generator.api.MyBatisGenerator")
private String title;
+ @Generated("org.mybatis.generator.api.MyBatisGenerator")
+ private Long readCount;
+
@Generated("org.mybatis.generator.api.MyBatisGenerator")
private Date createTime;
@@ -86,6 +87,16 @@ public class News implements Serializable {
this.title = title == null ? null : title.trim();
}
+ @Generated("org.mybatis.generator.api.MyBatisGenerator")
+ public Long getReadCount() {
+ return readCount;
+ }
+
+ @Generated("org.mybatis.generator.api.MyBatisGenerator")
+ public void setReadCount(Long readCount) {
+ this.readCount = readCount;
+ }
+
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public Date getCreateTime() {
return createTime;
diff --git a/novel-common/src/main/java/com/java2nb/novel/mapper/NewsDynamicSqlSupport.java b/novel-common/src/main/java/com/java2nb/novel/mapper/NewsDynamicSqlSupport.java
index 43da731..7bb23e3 100644
--- a/novel-common/src/main/java/com/java2nb/novel/mapper/NewsDynamicSqlSupport.java
+++ b/novel-common/src/main/java/com/java2nb/novel/mapper/NewsDynamicSqlSupport.java
@@ -25,6 +25,9 @@ public final class NewsDynamicSqlSupport {
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final SqlColumn title = news.title;
+ @Generated("org.mybatis.generator.api.MyBatisGenerator")
+ public static final SqlColumn readCount = news.readCount;
+
@Generated("org.mybatis.generator.api.MyBatisGenerator")
public static final SqlColumn createTime = news.createTime;
@@ -52,6 +55,8 @@ public final class NewsDynamicSqlSupport {
public final SqlColumn title = column("title", JDBCType.VARCHAR);
+ public final SqlColumn readCount = column("read_count", JDBCType.BIGINT);
+
public final SqlColumn createTime = column("create_time", JDBCType.TIMESTAMP);
public final SqlColumn createUserId = column("create_user_id", JDBCType.BIGINT);
diff --git a/novel-common/src/main/java/com/java2nb/novel/mapper/NewsMapper.java b/novel-common/src/main/java/com/java2nb/novel/mapper/NewsMapper.java
index 91d3ad5..f5a6916 100644
--- a/novel-common/src/main/java/com/java2nb/novel/mapper/NewsMapper.java
+++ b/novel-common/src/main/java/com/java2nb/novel/mapper/NewsMapper.java
@@ -35,7 +35,7 @@ import org.mybatis.dynamic.sql.util.mybatis3.MyBatis3Utils;
@Mapper
public interface NewsMapper {
@Generated("org.mybatis.generator.api.MyBatisGenerator")
- BasicColumn[] selectList = BasicColumn.columnList(id, catId, catName, sourceName, title, createTime, createUserId, updateTime, updateUserId, content);
+ BasicColumn[] selectList = BasicColumn.columnList(id, catId, catName, sourceName, title, readCount, createTime, createUserId, updateTime, updateUserId, content);
@Generated("org.mybatis.generator.api.MyBatisGenerator")
@SelectProvider(type=SqlProviderAdapter.class, method="select")
@@ -66,6 +66,7 @@ public interface NewsMapper {
@Result(column="cat_name", property="catName", jdbcType=JdbcType.VARCHAR),
@Result(column="source_name", property="sourceName", jdbcType=JdbcType.VARCHAR),
@Result(column="title", property="title", jdbcType=JdbcType.VARCHAR),
+ @Result(column="read_count", property="readCount", jdbcType=JdbcType.BIGINT),
@Result(column="create_time", property="createTime", jdbcType=JdbcType.TIMESTAMP),
@Result(column="create_user_id", property="createUserId", jdbcType=JdbcType.BIGINT),
@Result(column="update_time", property="updateTime", jdbcType=JdbcType.TIMESTAMP),
@@ -103,6 +104,7 @@ public interface NewsMapper {
.map(catName).toProperty("catName")
.map(sourceName).toProperty("sourceName")
.map(title).toProperty("title")
+ .map(readCount).toProperty("readCount")
.map(createTime).toProperty("createTime")
.map(createUserId).toProperty("createUserId")
.map(updateTime).toProperty("updateTime")
@@ -119,6 +121,7 @@ public interface NewsMapper {
.map(catName).toProperty("catName")
.map(sourceName).toProperty("sourceName")
.map(title).toProperty("title")
+ .map(readCount).toProperty("readCount")
.map(createTime).toProperty("createTime")
.map(createUserId).toProperty("createUserId")
.map(updateTime).toProperty("updateTime")
@@ -135,6 +138,7 @@ public interface NewsMapper {
.map(catName).toPropertyWhenPresent("catName", record::getCatName)
.map(sourceName).toPropertyWhenPresent("sourceName", record::getSourceName)
.map(title).toPropertyWhenPresent("title", record::getTitle)
+ .map(readCount).toPropertyWhenPresent("readCount", record::getReadCount)
.map(createTime).toPropertyWhenPresent("createTime", record::getCreateTime)
.map(createUserId).toPropertyWhenPresent("createUserId", record::getCreateUserId)
.map(updateTime).toPropertyWhenPresent("updateTime", record::getUpdateTime)
@@ -177,6 +181,7 @@ public interface NewsMapper {
.set(catName).equalTo(record::getCatName)
.set(sourceName).equalTo(record::getSourceName)
.set(title).equalTo(record::getTitle)
+ .set(readCount).equalTo(record::getReadCount)
.set(createTime).equalTo(record::getCreateTime)
.set(createUserId).equalTo(record::getCreateUserId)
.set(updateTime).equalTo(record::getUpdateTime)
@@ -191,6 +196,7 @@ public interface NewsMapper {
.set(catName).equalToWhenPresent(record::getCatName)
.set(sourceName).equalToWhenPresent(record::getSourceName)
.set(title).equalToWhenPresent(record::getTitle)
+ .set(readCount).equalToWhenPresent(record::getReadCount)
.set(createTime).equalToWhenPresent(record::getCreateTime)
.set(createUserId).equalToWhenPresent(record::getCreateUserId)
.set(updateTime).equalToWhenPresent(record::getUpdateTime)
@@ -205,6 +211,7 @@ public interface NewsMapper {
.set(catName).equalTo(record::getCatName)
.set(sourceName).equalTo(record::getSourceName)
.set(title).equalTo(record::getTitle)
+ .set(readCount).equalTo(record::getReadCount)
.set(createTime).equalTo(record::getCreateTime)
.set(createUserId).equalTo(record::getCreateUserId)
.set(updateTime).equalTo(record::getUpdateTime)
@@ -221,6 +228,7 @@ public interface NewsMapper {
.set(catName).equalToWhenPresent(record::getCatName)
.set(sourceName).equalToWhenPresent(record::getSourceName)
.set(title).equalToWhenPresent(record::getTitle)
+ .set(readCount).equalToWhenPresent(record::getReadCount)
.set(createTime).equalToWhenPresent(record::getCreateTime)
.set(createUserId).equalToWhenPresent(record::getCreateUserId)
.set(updateTime).equalToWhenPresent(record::getUpdateTime)
diff --git a/novel-common/src/main/resources/application-common-dev.yml b/novel-common/src/main/resources/application-common-dev.yml
index 7a08563..c87836f 100644
--- a/novel-common/src/main/resources/application-common-dev.yml
+++ b/novel-common/src/main/resources/application-common-dev.yml
@@ -71,8 +71,7 @@ sharding:
-pic:
+txt:
save:
- type: 2 #图片保存方式, 1不保存,使用爬取的网络图片 ,2保存在自己的存储介质
- storage: local #存储介质,local:本地,OSS:阿里云对象存储,fastDfs:分布式文件系统
- path: /var/pic #图片保存路径
\ No newline at end of file
+ storage: db #存储介质,db:数据库,file:txt文本
+ path: /Users/xiongxiaoyang/books #txt小说文本保存路径
\ No newline at end of file
diff --git a/novel-common/src/main/resources/application-common-prod.yml b/novel-common/src/main/resources/application-common-prod.yml
new file mode 100644
index 0000000..8853b0b
--- /dev/null
+++ b/novel-common/src/main/resources/application-common-prod.yml
@@ -0,0 +1,85 @@
+spring:
+ profiles:
+ include: [common]
+ main:
+ allow-bean-definition-overriding: true
+ #Redis服务器IP
+ redis:
+ host: 127.0.0.1
+ #Redis服务器连接端口
+ port: 6379
+ #Redis服务器连接密码
+ password: test
+ jedis:
+ pool:
+ #连接池最大连接数(使用负值表示没有限制)
+ max-active: 8
+ #连接池最大阻塞等待时间(使用负值表示没有限制)
+ max-wait: 1
+ #连接池最大阻塞等待时间(使用负值表示没有限制)
+ max-idle: 8
+ #连接池中的最小空闲连接
+ min-idle: 0
+ #连接超时时间(毫秒)
+ timeout: 30000
+ datasource:
+ url: jdbc:mysql://127.0.0.1:3306/novel_biz?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
+ username: root
+ password: test123456
+ driver-class-name: com.mysql.cj.jdbc.Driver
+
+
+####使用shardingJdbc时,
+####所有的jdbcType都不能是LONGVARCHAR,否则会导致java.io.NotSerializableException: java.io.StringReader错误
+##### 应该替换所有的 LONGVARCHAR 类型为VARCHAR
+
+sharding:
+ jdbc:
+ datasource:
+ names: ds0 #,ds1
+ ds0:
+ type: com.zaxxer.hikari.HikariDataSource
+ driver-class-name: com.mysql.cj.jdbc.Driver
+ jdbc-url: jdbc:mysql://localhost:3306/novel_plus?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
+ username: root
+ password: test123456
+ # ds1:
+ # type: com.alibaba.druid.pool.DruidDataSource
+ # driver-class-name: com.mysql.jdbc.Driver
+ # url: jdbc:mysql://localhost:3306/novel_plus2
+ # username: root
+ # password: test123456
+ config:
+ sharding:
+ props:
+ sql.show: true
+ tables:
+ book_content: #book_content表
+ key-generator-column-name: id #主键
+ actual-data-nodes: ds${0}.book_content${0..9} #数据节点
+ # database-strategy: #分库策略
+ # inline:
+ # sharding-column: book_id
+ # algorithm-expression: ds${book_id % 10}
+ table-strategy: #分表策略
+ inline:
+ shardingColumn: index_id
+ algorithm-expression: book_content${index_id % 10}
+
+
+logging:
+ level:
+ root: error
+ com.java2nb: error
+
+
+
+txt:
+ save:
+ storage: db #存储介质,db:数据库,file:txt文本
+ path: /Users/xiongxiaoyang/books #txt小说文本保存路径
+
+
+
+
+
diff --git a/novel-common/src/main/resources/application-common-test.yml b/novel-common/src/main/resources/application-common-test.yml
deleted file mode 100644
index 38d1e00..0000000
--- a/novel-common/src/main/resources/application-common-test.yml
+++ /dev/null
@@ -1,17 +0,0 @@
-spring:
- profiles:
- include: [common]
- datasource:
- url: jdbc:mysql://127.0.0.1:3306/novel_biz?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
- username: root
- password: root
- driver-class-name: com.mysql.cj.jdbc.Driver
-
-
-pic:
- save:
- type: 2 #图片保存方式, 1不保存,使用网络图片 ,2本地保存
- path: /var/pic #图片保存路径
-
-
-
diff --git a/novel-common/src/main/resources/application-common.yml b/novel-common/src/main/resources/application-common.yml
index b3cf4a0..e98b078 100644
--- a/novel-common/src/main/resources/application-common.yml
+++ b/novel-common/src/main/resources/application-common.yml
@@ -11,6 +11,11 @@ spring:
generator:
write-numbers-as-strings: true
+ #上传文件的最大值(1M)
+ servlet:
+ multipart:
+ max-file-size: 1048576
+
#缓存类型,ehcache(默认)、redis
cache:
type: ehcache
@@ -26,3 +31,5 @@ logging:
config: classpath:logback-boot.xml
+
+
diff --git a/novel-common/src/main/resources/banner.txt b/novel-common/src/main/resources/banner.txt
new file mode 100644
index 0000000..9b09382
--- /dev/null
+++ b/novel-common/src/main/resources/banner.txt
@@ -0,0 +1,15 @@
+${AnsiColor.CYAN}
+
+--------------------------------------------------------------------------------
+${AnsiColor.RED}
+|| / | / /
+|| / | / / ___ // ___ ___ _ __
+|| / /||/ / //___) ) // // ) ) // ) ) // ) ) ) )
+||/ / | / // // // // / / // / / / /
+| / | / ((____ // ((____ ((___/ / // / / / / 小说精品屋欢迎您!!!
+
+ -------Powered By XXY
+${AnsiColor.CYAN}
+--------------------------------------------------------------------------------
+${AnsiColor.BRIGHT_YELLOW}
+::: Spring-Boot ${spring-boot.formatted-version} :::
\ No newline at end of file
diff --git a/novel-common/src/main/resources/mybatis/generatorConfig.xml b/novel-common/src/main/resources/mybatis/generatorConfig.xml
index 5dbb62f..984a5aa 100644
--- a/novel-common/src/main/resources/mybatis/generatorConfig.xml
+++ b/novel-common/src/main/resources/mybatis/generatorConfig.xml
@@ -44,7 +44,7 @@
-
+
diff --git a/novel-crawl/pom.xml b/novel-crawl/pom.xml
index 22c5dae..48efbe1 100644
--- a/novel-crawl/pom.xml
+++ b/novel-crawl/pom.xml
@@ -5,7 +5,7 @@
novel
com.java2nb
- 3.1.0
+ 3.6.0
4.0.0
diff --git a/novel-crawl/src/main/java/com/java2nb/novel/controller/CrawlController.java b/novel-crawl/src/main/java/com/java2nb/novel/controller/CrawlController.java
index fe0f8d8..80c9c16 100644
--- a/novel-crawl/src/main/java/com/java2nb/novel/controller/CrawlController.java
+++ b/novel-crawl/src/main/java/com/java2nb/novel/controller/CrawlController.java
@@ -1,13 +1,10 @@
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.utils.BeanUtil;
import com.java2nb.novel.entity.CrawlSingleTask;
import com.java2nb.novel.entity.CrawlSource;
import com.java2nb.novel.service.CrawlService;
-import com.java2nb.novel.vo.CrawlSingleTaskVO;
-import com.java2nb.novel.vo.CrawlSourceVO;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
@@ -26,7 +23,7 @@ public class CrawlController {
* 新增爬虫源
* */
@PostMapping("addCrawlSource")
- public ResultBean addCrawlSource(CrawlSource source){
+ public ResultBean addCrawlSource(CrawlSource source){
crawlService.addCrawlSource(source);
return ResultBean.ok();
@@ -37,17 +34,16 @@ public class CrawlController {
* 爬虫源分页列表查询
* */
@GetMapping("listCrawlByPage")
- public ResultBean listCrawlByPage(@RequestParam(value = "curr", defaultValue = "1") int page, @RequestParam(value = "limit", defaultValue = "10") int pageSize){
+ public ResultBean> listCrawlByPage(@RequestParam(value = "curr", defaultValue = "1") int page, @RequestParam(value = "limit", defaultValue = "10") int pageSize){
- return ResultBean.ok(new PageInfo<>(BeanUtil.copyList(crawlService.listCrawlByPage(page,pageSize), CrawlSourceVO.class)
- ));
+ return ResultBean.ok(crawlService.listCrawlByPage(page,pageSize));
}
/**
* 开启或停止爬虫
* */
@PostMapping("openOrCloseCrawl")
- public ResultBean openOrCloseCrawl(Integer sourceId,Byte sourceStatus){
+ public ResultBean openOrCloseCrawl(Integer sourceId,Byte sourceStatus){
crawlService.openOrCloseCrawl(sourceId,sourceStatus);
@@ -58,7 +54,7 @@ public class CrawlController {
* 新增单本采集任务
* */
@PostMapping("addCrawlSingleTask")
- public ResultBean addCrawlSingleTask(CrawlSingleTask singleTask){
+ public ResultBean addCrawlSingleTask(CrawlSingleTask singleTask){
crawlService.addCrawlSingleTask(singleTask);
return ResultBean.ok();
@@ -69,17 +65,16 @@ public class CrawlController {
* 单本采集任务分页列表查询
* */
@GetMapping("listCrawlSingleTaskByPage")
- public ResultBean listCrawlSingleTaskByPage(@RequestParam(value = "curr", defaultValue = "1") int page, @RequestParam(value = "limit", defaultValue = "10") int pageSize){
+ public ResultBean> listCrawlSingleTaskByPage(@RequestParam(value = "curr", defaultValue = "1") int page, @RequestParam(value = "limit", defaultValue = "10") int pageSize){
- return ResultBean.ok(new PageInfo<>(BeanUtil.copyList(crawlService.listCrawlSingleTaskByPage(page,pageSize), CrawlSingleTaskVO.class)
- ));
+ return ResultBean.ok(crawlService.listCrawlSingleTaskByPage(page,pageSize));
}
/**
* 删除采集任务
* */
@DeleteMapping("delCrawlSingleTask/{id}")
- public ResultBean delCrawlSingleTask(@PathVariable("id") Long id){
+ public ResultBean delCrawlSingleTask(@PathVariable("id") Long id){
crawlService.delCrawlSingleTask(id);
diff --git a/novel-crawl/src/main/java/com/java2nb/novel/controller/PageController.java b/novel-crawl/src/main/java/com/java2nb/novel/controller/PageController.java
index 1ac0143..f7c6477 100644
--- a/novel-crawl/src/main/java/com/java2nb/novel/controller/PageController.java
+++ b/novel-crawl/src/main/java/com/java2nb/novel/controller/PageController.java
@@ -1,18 +1,11 @@
package com.java2nb.novel.controller;
-import com.java2nb.novel.entity.Book;
-import com.java2nb.novel.entity.BookContent;
-import com.java2nb.novel.entity.BookIndex;
-import com.java2nb.novel.entity.News;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
-import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
-import java.util.List;
-
/**
* @author 11797
*/
diff --git a/novel-crawl/src/main/java/com/java2nb/novel/core/crawl/ChapterBean.java b/novel-crawl/src/main/java/com/java2nb/novel/core/crawl/ChapterBean.java
new file mode 100644
index 0000000..6eaaa9b
--- /dev/null
+++ b/novel-crawl/src/main/java/com/java2nb/novel/core/crawl/ChapterBean.java
@@ -0,0 +1,25 @@
+package com.java2nb.novel.core.crawl;
+
+import com.java2nb.novel.entity.BookContent;
+import com.java2nb.novel.entity.BookIndex;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 章节数据封装bean
+ * @author Administrator
+ */
+@Data
+public class ChapterBean {
+
+ /**
+ * 章节索引集合
+ * */
+ List bookIndexList;
+
+ /**
+ * 章节内容集合
+ * */
+ List bookContentList;
+}
diff --git a/novel-crawl/src/main/java/com/java2nb/novel/core/crawl/CrawlBookChapterHandler.java b/novel-crawl/src/main/java/com/java2nb/novel/core/crawl/CrawlBookChapterHandler.java
new file mode 100644
index 0000000..e0a4eb6
--- /dev/null
+++ b/novel-crawl/src/main/java/com/java2nb/novel/core/crawl/CrawlBookChapterHandler.java
@@ -0,0 +1,12 @@
+package com.java2nb.novel.core.crawl;
+
+import com.java2nb.novel.entity.Book;
+
+/**
+ * 爬虫小说章节内容处理器
+ * */
+public interface CrawlBookChapterHandler {
+
+ void handle(ChapterBean chapterBean);
+
+}
diff --git a/novel-crawl/src/main/java/com/java2nb/novel/core/crawl/CrawlBookHandler.java b/novel-crawl/src/main/java/com/java2nb/novel/core/crawl/CrawlBookHandler.java
new file mode 100644
index 0000000..7d6a8c0
--- /dev/null
+++ b/novel-crawl/src/main/java/com/java2nb/novel/core/crawl/CrawlBookHandler.java
@@ -0,0 +1,12 @@
+package com.java2nb.novel.core.crawl;
+
+import com.java2nb.novel.entity.Book;
+
+/**
+ * 爬虫小说处理器
+ * */
+public interface CrawlBookHandler {
+
+ void handle(Book book);
+
+}
diff --git a/novel-crawl/src/main/java/com/java2nb/novel/core/crawl/CrawlParser.java b/novel-crawl/src/main/java/com/java2nb/novel/core/crawl/CrawlParser.java
index 505fd6b..3fd3d91 100644
--- a/novel-crawl/src/main/java/com/java2nb/novel/core/crawl/CrawlParser.java
+++ b/novel-crawl/src/main/java/com/java2nb/novel/core/crawl/CrawlParser.java
@@ -26,18 +26,14 @@ import static java.util.regex.Pattern.compile;
@Slf4j
public class CrawlParser {
- private static IdWorker idWorker = new IdWorker();
+ private static final IdWorker idWorker = new IdWorker();
- public static final Integer BOOK_INDEX_LIST_KEY = 1;
+ private static final RestTemplate restTemplate = RestTemplateUtil.getInstance("utf-8");
- public static final Integer BOOK_CONTENT_LIST_KEY = 2;
-
- private static RestTemplate restTemplate = RestTemplateUtil.getInstance("utf-8");
-
- private static ThreadLocal retryCount = new ThreadLocal<>();
+ private static final ThreadLocal retryCount = new ThreadLocal<>();
@SneakyThrows
- public static Book parseBook(RuleBean ruleBean, String bookId) {
+ public static void parseBook(RuleBean ruleBean, String bookId, CrawlBookHandler handler) {
Book book = new Book();
String bookDetailUrl = ruleBean.getBookDetailUrl().replace("{bookId}", bookId);
String bookDetailHtml = getByHttpClientWithChrome(bookDetailUrl);
@@ -139,13 +135,10 @@ public class CrawlParser {
}
}
}
- return book;
+ handler.handle(book);
}
- public static Map parseBookIndexAndContent(String sourceBookId, Book book, RuleBean ruleBean, Map hasIndexs) {
- Map result = new HashMap<>(2);
- result.put(BOOK_INDEX_LIST_KEY, new ArrayList(0));
- result.put(BOOK_CONTENT_LIST_KEY, new ArrayList(0));
+ public static void parseBookIndexAndContent(String sourceBookId, Book book, RuleBean ruleBean, Map existBookIndexMap, CrawlBookChapterHandler handler) {
Date currentDate = new Date();
@@ -171,11 +164,11 @@ public class CrawlParser {
int indexNum = 0;
//总字数
- Integer totalWordCount = book.getWordCount() == null ? 0 : book.getWordCount();
+ int totalWordCount = book.getWordCount() == null ? 0 : book.getWordCount();
while (isFindIndex) {
- BookIndex hasIndex = hasIndexs.get(indexNum);
+ BookIndex hasIndex = existBookIndexMap.get(indexNum);
String indexName = indexNameMatch.group(1);
if (hasIndex == null || !StringUtils.deleteWhitespace(hasIndex.getIndexName()).equals(StringUtils.deleteWhitespace(indexName))) {
@@ -221,7 +214,7 @@ public class CrawlParser {
BookIndex bookIndex = new BookIndex();
bookIndex.setIndexName(indexName);
bookIndex.setIndexNum(indexNum);
- Integer wordCount = StringUtil.getStrValidWordCount(content);
+ int wordCount = StringUtil.getStrValidWordCount(content);
bookIndex.setWordCount(wordCount);
indexList.add(bookIndex);
@@ -235,7 +228,7 @@ public class CrawlParser {
bookContent.setIndexId(hasIndex.getId());
//计算总字数
- totalWordCount = (totalWordCount+wordCount-hasIndex.getWordCount());
+ totalWordCount = (totalWordCount + wordCount - hasIndex.getWordCount());
} else {
//章节插入
//设置目录和章节内容
@@ -253,7 +246,6 @@ public class CrawlParser {
bookIndex.setUpdateTime(currentDate);
-
}
@@ -266,7 +258,7 @@ public class CrawlParser {
if (indexList.size() > 0) {
//如果有爬到最新章节,则设置小说主表的最新章节信息
//获取爬取到的最新章节
- BookIndex lastIndex = indexList.get(indexList.size()-1);
+ BookIndex lastIndex = indexList.get(indexList.size() - 1);
book.setLastIndexId(lastIndex.getId());
book.setLastIndexName(lastIndex.getIndexName());
book.setLastIndexUpdateTime(currentDate);
@@ -277,15 +269,22 @@ public class CrawlParser {
if (indexList.size() == contentList.size() && indexList.size() > 0) {
- result.put(BOOK_INDEX_LIST_KEY, indexList);
- result.put(BOOK_CONTENT_LIST_KEY, contentList);
+ handler.handle(new ChapterBean() {{
+ setBookIndexList(indexList);
+ setBookContentList(contentList);
+ }});
+
+ return;
}
}
+ handler.handle(new ChapterBean() {{
+ setBookIndexList(new ArrayList<>(0));
+ setBookContentList(new ArrayList<>(0));
+ }});
- return result;
}
@@ -294,6 +293,7 @@ public class CrawlParser {
ResponseEntity forEntity = restTemplate.getForEntity(url, String.class);
if (forEntity.getStatusCode() == HttpStatus.OK) {
String body = forEntity.getBody();
+ assert body != null;
if (body.length() < Constants.INVALID_HTML_LENGTH) {
return processErrorHttpResult(url);
}
diff --git a/novel-crawl/src/main/java/com/java2nb/novel/core/crawl/RuleBean.java b/novel-crawl/src/main/java/com/java2nb/novel/core/crawl/RuleBean.java
index 5a8d319..6b42685 100644
--- a/novel-crawl/src/main/java/com/java2nb/novel/core/crawl/RuleBean.java
+++ b/novel-crawl/src/main/java/com/java2nb/novel/core/crawl/RuleBean.java
@@ -35,7 +35,7 @@ public class RuleBean {
private String statusPatten;
private String scorePatten;
private String visitCountPatten;
- private String descStart;;
+ private String descStart;
private String descEnd;
private String upadateTimePatten;
private String upadateTimeFormatPatten;
diff --git a/novel-crawl/src/main/java/com/java2nb/novel/core/listener/StarterListener.java b/novel-crawl/src/main/java/com/java2nb/novel/core/listener/StarterListener.java
index d673dfd..ad57357 100644
--- a/novel-crawl/src/main/java/com/java2nb/novel/core/listener/StarterListener.java
+++ b/novel-crawl/src/main/java/com/java2nb/novel/core/listener/StarterListener.java
@@ -1,6 +1,7 @@
package com.java2nb.novel.core.listener;
import com.fasterxml.jackson.databind.ObjectMapper;
+import com.java2nb.novel.core.crawl.ChapterBean;
import com.java2nb.novel.core.crawl.CrawlParser;
import com.java2nb.novel.core.crawl.RuleBean;
import com.java2nb.novel.entity.*;
@@ -16,9 +17,9 @@ import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
import java.util.Date;
-import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.concurrent.TimeUnit;
/**
* @author Administrator
@@ -55,26 +56,28 @@ public class StarterListener implements ServletContextListener {
CrawlSource source = crawlService.queryCrawlSource(needUpdateBook.getCrawlSourceId());
RuleBean ruleBean = new ObjectMapper().readValue(source.getCrawlRule(), RuleBean.class);
//解析小说基本信息
- Book book = CrawlParser.parseBook(ruleBean, needUpdateBook.getCrawlBookId());
- //这里只做老书更新
- book.setId(needUpdateBook.getId());
- book.setWordCount(needUpdateBook.getWordCount());
- if (needUpdateBook.getPicUrl() != null && needUpdateBook.getPicUrl().contains(Constants.LOCAL_PIC_PREFIX)) {
- //本地图片则不更新
- book.setPicUrl(null);
- }
- //查询已存在的章节
- Map existBookIndexMap = bookService.queryExistBookIndexMap(needUpdateBook.getId());
- //解析章节目录
- Map indexAndContentList = CrawlParser.parseBookIndexAndContent(needUpdateBook.getCrawlBookId(), book, ruleBean, existBookIndexMap);
- bookService.updateBookAndIndexAndContent(book, (List) indexAndContentList.get(CrawlParser.BOOK_INDEX_LIST_KEY), (List) indexAndContentList.get(CrawlParser.BOOK_CONTENT_LIST_KEY), existBookIndexMap);
+ CrawlParser.parseBook(ruleBean, needUpdateBook.getCrawlBookId(),book -> {
+ //这里只做老书更新
+ book.setId(needUpdateBook.getId());
+ book.setWordCount(needUpdateBook.getWordCount());
+ if (needUpdateBook.getPicUrl() != null && needUpdateBook.getPicUrl().contains(Constants.LOCAL_PIC_PREFIX)) {
+ //本地图片则不更新
+ book.setPicUrl(null);
+ }
+ //查询已存在的章节
+ Map existBookIndexMap = bookService.queryExistBookIndexMap(needUpdateBook.getId());
+ //解析章节目录
+ CrawlParser.parseBookIndexAndContent(needUpdateBook.getCrawlBookId(), book, ruleBean, existBookIndexMap,chapter -> {
+ bookService.updateBookAndIndexAndContent(book, chapter.getBookIndexList(), chapter.getBookContentList(), existBookIndexMap);
+ });
+ });
} catch (Exception e) {
log.error(e.getMessage(), e);
}
}
-
- Thread.sleep(1000 * 60 * 10);
+ // 休眠10分钟
+ TimeUnit.MINUTES.sleep(10);
} catch (Exception e) {
log.error(e.getMessage(), e);
}
@@ -107,7 +110,8 @@ public class StarterListener implements ServletContextListener {
}
- Thread.sleep(1000 * 60);
+ //休眠1分钟
+ TimeUnit.MINUTES.sleep(1);
} catch (Exception e) {
log.error(e.getMessage(), e);
diff --git a/novel-crawl/src/main/java/com/java2nb/novel/core/schedule/CrawlThreadMonitor.java b/novel-crawl/src/main/java/com/java2nb/novel/core/schedule/CrawlThreadMonitor.java
index 8003f39..1009cdf 100644
--- a/novel-crawl/src/main/java/com/java2nb/novel/core/schedule/CrawlThreadMonitor.java
+++ b/novel-crawl/src/main/java/com/java2nb/novel/core/schedule/CrawlThreadMonitor.java
@@ -8,12 +8,10 @@ import com.java2nb.novel.entity.CrawlSource;
import com.java2nb.novel.service.CrawlService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
-import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
import java.util.List;
-import java.util.Map;
import java.util.Set;
/**
diff --git a/novel-crawl/src/main/java/com/java2nb/novel/service/BookContentService.java b/novel-crawl/src/main/java/com/java2nb/novel/service/BookContentService.java
new file mode 100644
index 0000000..7090f3a
--- /dev/null
+++ b/novel-crawl/src/main/java/com/java2nb/novel/service/BookContentService.java
@@ -0,0 +1,16 @@
+package com.java2nb.novel.service;
+
+import com.java2nb.novel.entity.BookContent;
+
+import java.util.List;
+
+public interface BookContentService {
+
+ void saveBookContent(List bookContentList,Long bookId);
+
+ void saveBookContent(BookContent bookContent,Long bookId);
+
+ void updateBookContent(BookContent bookContent,Long bookId);
+
+
+}
diff --git a/novel-crawl/src/main/java/com/java2nb/novel/service/BookService.java b/novel-crawl/src/main/java/com/java2nb/novel/service/BookService.java
index 1b343e9..2d521f0 100644
--- a/novel-crawl/src/main/java/com/java2nb/novel/service/BookService.java
+++ b/novel-crawl/src/main/java/com/java2nb/novel/service/BookService.java
@@ -72,6 +72,7 @@ public interface BookService {
* 更新一下最后一次的抓取时间
* @param bookId 小说ID
* */
+ @Deprecated
void updateCrawlLastTime(Long bookId);
/**
diff --git a/novel-crawl/src/main/java/com/java2nb/novel/service/CrawlService.java b/novel-crawl/src/main/java/com/java2nb/novel/service/CrawlService.java
index 7c465a7..d8e9821 100644
--- a/novel-crawl/src/main/java/com/java2nb/novel/service/CrawlService.java
+++ b/novel-crawl/src/main/java/com/java2nb/novel/service/CrawlService.java
@@ -1,5 +1,6 @@
package com.java2nb.novel.service;
+import com.java2nb.novel.core.bean.PageBean;
import com.java2nb.novel.core.crawl.RuleBean;
import com.java2nb.novel.entity.CrawlSingleTask;
import com.java2nb.novel.entity.CrawlSource;
@@ -22,9 +23,9 @@ public interface CrawlService {
* 爬虫源分页列表
* @param page 当前页码
* @param pageSize 分页大小
- *@return 爬虫源集合
+ *@return 爬虫源分页数据
* */
- List listCrawlByPage(int page, int pageSize);
+ PageBean listCrawlByPage(int page, int pageSize);
/**
* 开启或停止爬虫
@@ -61,7 +62,7 @@ public interface CrawlService {
* 根据分类ID和规则解析分类列表
* @param catId 分类ID
* @param ruleBean 规则对象
- * @param sourceId
+ * @param sourceId 爬虫源ID
*/
void parseBookList(int catId, RuleBean ruleBean, Integer sourceId);
@@ -83,9 +84,9 @@ public interface CrawlService {
* 单本采集任务分页列表查询
* @param page 当前页码
* @param pageSize 分页大小
- * @return 单本采集任务集合
+ * @return 单本采集任务分页数据
* */
- List listCrawlSingleTaskByPage(int page, int pageSize);
+ PageBean listCrawlSingleTaskByPage(int page, int pageSize);
/**
* 删除采集任务
diff --git a/novel-crawl/src/main/java/com/java2nb/novel/service/impl/BookServiceImpl.java b/novel-crawl/src/main/java/com/java2nb/novel/service/impl/BookServiceImpl.java
index 5f315b1..677d0c8 100644
--- a/novel-crawl/src/main/java/com/java2nb/novel/service/impl/BookServiceImpl.java
+++ b/novel-crawl/src/main/java/com/java2nb/novel/service/impl/BookServiceImpl.java
@@ -4,6 +4,7 @@ import com.java2nb.novel.entity.Book;
import com.java2nb.novel.entity.BookContent;
import com.java2nb.novel.entity.BookIndex;
import com.java2nb.novel.mapper.*;
+import com.java2nb.novel.service.BookContentService;
import com.java2nb.novel.service.BookService;
import com.java2nb.novel.utils.Constants;
import lombok.RequiredArgsConstructor;
@@ -37,7 +38,7 @@ public class BookServiceImpl implements BookService {
private final CrawlBookIndexMapper bookIndexMapper;
- private final BookContentMapper bookContentMapper;
+ private final BookContentService bookContentService;
@Override
@@ -46,7 +47,7 @@ public class BookServiceImpl implements BookService {
return bookMapper.count(countFrom(BookDynamicSqlSupport.book).where(BookDynamicSqlSupport.bookName, isEqualTo(bookName))
.and(BookDynamicSqlSupport.authorName, isEqualTo(authorName))
.build()
- .render(RenderingStrategies.MYBATIS3))>0;
+ .render(RenderingStrategies.MYBATIS3)) > 0;
}
@@ -57,7 +58,7 @@ public class BookServiceImpl implements BookService {
.equalTo(sourceId)
.set(crawlBookId)
.equalTo(bookId)
- .where(BookDynamicSqlSupport.id,isEqualTo(id))
+ .where(BookDynamicSqlSupport.id, isEqualTo(id))
.build()
.render(RenderingStrategies.MYBATIS3));
}
@@ -74,9 +75,9 @@ public class BookServiceImpl implements BookService {
@Transactional(rollbackFor = Exception.class)
@Override
public void saveBookAndIndexAndContent(Book book, List bookIndexList, List bookContentList) {
- if(!queryIsExistByBookNameAndAuthorName(book.getBookName(),book.getAuthorName())) {
+ if (!queryIsExistByBookNameAndAuthorName(book.getBookName(), book.getAuthorName())) {
- if(bookIndexList.size()>0) {
+ if (bookIndexList.size() > 0) {
//保存小说主表
@@ -85,7 +86,7 @@ public class BookServiceImpl implements BookService {
//批量保存目录和内容
bookIndexMapper.insertMultiple(bookIndexList);
- bookContentMapper.insertMultiple(bookContentList);
+ bookContentService.saveBookContent(bookContentList,book.getId());
}
}
@@ -96,7 +97,7 @@ public class BookServiceImpl implements BookService {
@Override
public List queryNeedUpdateBook(Date startDate, int limit) {
List books = bookMapper.queryNeedUpdateBook(startDate, limit);
- if(books.size()>0) {
+ if (books.size() > 0) {
//更新最后抓取时间为当前时间
bookMapper.updateCrawlLastTime(books, new Date());
}
@@ -105,38 +106,33 @@ public class BookServiceImpl implements BookService {
@Override
public Map queryExistBookIndexMap(Long bookId) {
- List bookIndexs = bookIndexMapper.selectMany(select(BookIndexDynamicSqlSupport.id,BookIndexDynamicSqlSupport.indexNum,BookIndexDynamicSqlSupport.indexName,BookIndexDynamicSqlSupport.wordCount)
+ List bookIndexs = bookIndexMapper.selectMany(select(BookIndexDynamicSqlSupport.id, BookIndexDynamicSqlSupport.indexNum, BookIndexDynamicSqlSupport.indexName, BookIndexDynamicSqlSupport.wordCount)
.from(BookIndexDynamicSqlSupport.bookIndex)
- .where(BookIndexDynamicSqlSupport.bookId,isEqualTo(bookId))
+ .where(BookIndexDynamicSqlSupport.bookId, isEqualTo(bookId))
.build()
.render(RenderingStrategies.MYBATIS3));
if (bookIndexs.size() > 0) {
- return bookIndexs.stream().collect(Collectors.toMap(BookIndex::getIndexNum, Function.identity()));
+ return bookIndexs.stream().collect(Collectors.toMap(BookIndex::getIndexNum, Function.identity()));
}
return new HashMap<>(0);
}
@Transactional(rollbackFor = Exception.class)
@Override
- public void updateBookAndIndexAndContent(Book book, List bookIndexList, List bookContentList, Map existBookIndexMap) {
+ public void updateBookAndIndexAndContent(Book book, List bookIndexList, List bookContentList, Map existBookIndexMap) {
for (int i = 0; i < bookIndexList.size(); i++) {
BookIndex bookIndex = bookIndexList.get(i);
BookContent bookContent = bookContentList.get(i);
- if(!existBookIndexMap.containsKey(bookIndex.getIndexNum())) {
+ if (!existBookIndexMap.containsKey(bookIndex.getIndexNum())) {
//插入
bookIndexMapper.insertSelective(bookIndex);
- bookContentMapper.insertSelective(bookContent);
- }else{
+ bookContentService.saveBookContent(bookContent,book.getId());
+ } else {
//更新
bookIndexMapper.updateByPrimaryKeySelective(bookIndex);
- bookContentMapper.update(update(BookContentDynamicSqlSupport.bookContent)
- .set(BookContentDynamicSqlSupport.content)
- .equalTo(bookContent.getContent())
- .where(BookContentDynamicSqlSupport.indexId,isEqualTo(bookContent.getIndexId()))
- .build()
- .render(RenderingStrategies.MYBATIS3));
+ bookContentService.updateBookContent(bookContent,book.getId());
}
@@ -145,7 +141,7 @@ public class BookServiceImpl implements BookService {
//更新小说主表
book.setBookName(null);
book.setAuthorName(null);
- if(Constants.VISIT_COUNT_DEFAULT.equals(book.getVisitCount())) {
+ if (Constants.VISIT_COUNT_DEFAULT.equals(book.getVisitCount())) {
book.setVisitCount(null);
}
bookMapper.updateByPrimaryKeySelective(book);
@@ -168,7 +164,7 @@ public class BookServiceImpl implements BookService {
.build()
.render(RenderingStrategies.MYBATIS3));
- if(books.size()>0){
+ if (books.size() > 0) {
return books.get(0);
}
@@ -176,19 +172,4 @@ public class BookServiceImpl implements BookService {
}
- /**
- * 查询最后的章节
- * */
- private BookIndex queryLastIndex(Long bookId) {
- return bookIndexMapper.queryLastIndex(bookId);
- }
-
- /**
- * 查询小说总字数
- * */
- private Integer queryTotalWordCount(Long bookId) {
-
- return bookMapper.queryTotalWordCount(bookId);
-
- }
}
diff --git a/novel-crawl/src/main/java/com/java2nb/novel/service/impl/CrawlServiceImpl.java b/novel-crawl/src/main/java/com/java2nb/novel/service/impl/CrawlServiceImpl.java
index efcfee0..c9492cc 100644
--- a/novel-crawl/src/main/java/com/java2nb/novel/service/impl/CrawlServiceImpl.java
+++ b/novel-crawl/src/main/java/com/java2nb/novel/service/impl/CrawlServiceImpl.java
@@ -2,20 +2,28 @@ package com.java2nb.novel.service.impl;
import com.fasterxml.jackson.databind.ObjectMapper;
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.CacheService;
import com.java2nb.novel.core.crawl.CrawlParser;
import com.java2nb.novel.core.crawl.RuleBean;
import com.java2nb.novel.core.enums.ResponseStatus;
import com.java2nb.novel.core.exception.BusinessException;
+import com.java2nb.novel.core.utils.BeanUtil;
import com.java2nb.novel.core.utils.IdWorker;
import com.java2nb.novel.core.utils.SpringUtil;
import com.java2nb.novel.core.utils.ThreadUtil;
-import com.java2nb.novel.entity.*;
+import com.java2nb.novel.entity.Book;
+import com.java2nb.novel.entity.CrawlSingleTask;
import com.java2nb.novel.entity.CrawlSource;
-import com.java2nb.novel.mapper.*;
+import com.java2nb.novel.mapper.CrawlSingleTaskDynamicSqlSupport;
+import com.java2nb.novel.mapper.CrawlSingleTaskMapper;
+import com.java2nb.novel.mapper.CrawlSourceDynamicSqlSupport;
+import com.java2nb.novel.mapper.CrawlSourceMapper;
import com.java2nb.novel.service.BookService;
import com.java2nb.novel.service.CrawlService;
+import com.java2nb.novel.vo.CrawlSingleTaskVO;
+import com.java2nb.novel.vo.CrawlSourceVO;
import lombok.RequiredArgsConstructor;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
@@ -23,18 +31,15 @@ import org.apache.commons.lang3.StringUtils;
import org.mybatis.dynamic.sql.render.RenderingStrategies;
import org.mybatis.dynamic.sql.select.render.SelectStatementProvider;
import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
import java.util.*;
+import java.util.concurrent.atomic.AtomicBoolean;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
-import static com.java2nb.novel.core.utils.HttpUtil.getByHttpClient;
import static com.java2nb.novel.core.utils.HttpUtil.getByHttpClientWithChrome;
-import static com.java2nb.novel.mapper.BookDynamicSqlSupport.crawlBookId;
-import static com.java2nb.novel.mapper.BookDynamicSqlSupport.crawlSourceId;
import static com.java2nb.novel.mapper.CrawlSourceDynamicSqlSupport.*;
-import static org.mybatis.dynamic.sql.SqlBuilder.*;
+import static org.mybatis.dynamic.sql.SqlBuilder.isEqualTo;
import static org.mybatis.dynamic.sql.select.SelectDSL.select;
/**
@@ -66,14 +71,17 @@ public class CrawlServiceImpl implements CrawlService {
}
@Override
- public List listCrawlByPage(int page, int pageSize) {
+ public PageBean listCrawlByPage(int page, int pageSize) {
PageHelper.startPage(page, pageSize);
SelectStatementProvider render = select(id, sourceName, sourceStatus, createTime, updateTime)
.from(crawlSource)
.orderBy(updateTime)
.build()
.render(RenderingStrategies.MYBATIS3);
- return crawlSourceMapper.selectMany(render);
+ List crawlSources = crawlSourceMapper.selectMany(render);
+ PageBean pageBean = new PageBean<>(crawlSources);
+ pageBean.setList(BeanUtil.copyList(crawlSources, CrawlSourceVO.class));
+ return pageBean;
}
@SneakyThrows
@@ -112,11 +120,7 @@ public class CrawlServiceImpl implements CrawlService {
//按分类开始爬虫解析任务
for (int i = 1; i < 8; i++) {
final int catId = i;
- Thread thread = new Thread(() -> {
-
- parseBookList(catId, ruleBean, sourceId);
-
- });
+ Thread thread = new Thread(() -> CrawlServiceImpl.this.parseBookList(catId, ruleBean, sourceId));
thread.start();
//thread加入到监控缓存中
threadIds.add(thread.getId());
@@ -156,14 +160,17 @@ public class CrawlServiceImpl implements CrawlService {
}
@Override
- public List listCrawlSingleTaskByPage(int page, int pageSize) {
+ public PageBean listCrawlSingleTaskByPage(int page, int pageSize) {
PageHelper.startPage(page, pageSize);
SelectStatementProvider render = select(CrawlSingleTaskDynamicSqlSupport.crawlSingleTask.allColumns())
.from(CrawlSingleTaskDynamicSqlSupport.crawlSingleTask)
.orderBy(CrawlSingleTaskDynamicSqlSupport.createTime.descending())
.build()
.render(RenderingStrategies.MYBATIS3);
- return crawlSingleTaskMapper.selectMany(render);
+ List crawlSingleTasks = crawlSingleTaskMapper.selectMany(render);
+ PageBean pageBean = new PageBean<>(crawlSingleTasks);
+ pageBean.setList(BeanUtil.copyList(crawlSingleTasks, CrawlSingleTaskVO.class));
+ return pageBean;
}
@Override
@@ -267,39 +274,46 @@ public class CrawlServiceImpl implements CrawlService {
@Override
public boolean parseBookAndSave(int catId, RuleBean ruleBean, Integer sourceId, String bookId) {
- Book book = CrawlParser.parseBook(ruleBean, bookId);
- if(book.getBookName() == null || book.getAuthorName() == null){
- return false;
- }
- //这里只做新书入库,查询是否存在这本书
- Book existBook = bookService.queryBookByBookNameAndAuthorName(book.getBookName(), book.getAuthorName());
- //如果该小说不存在,则可以解析入库,但是标记该小说正在入库,30分钟之后才允许再次入库
- if (existBook == null) {
- //没有该书,可以入库
- book.setCatId(catId);
- //根据分类ID查询分类
- book.setCatName(bookService.queryCatNameByCatId(catId));
- if (catId == 7) {
- //女频
- book.setWorkDirection((byte) 1);
- } else {
- //男频
- book.setWorkDirection((byte) 0);
+
+ final AtomicBoolean parseResult = new AtomicBoolean(false);
+
+ CrawlParser.parseBook(ruleBean, bookId, book -> {
+ if(book.getBookName() == null || book.getAuthorName() == null){
+ return;
}
- book.setCrawlBookId(bookId);
- book.setCrawlSourceId(sourceId);
- book.setCrawlLastTime(new Date());
- book.setId(new IdWorker().nextId());
- //解析章节目录
- Map indexAndContentList = CrawlParser.parseBookIndexAndContent(bookId, book, ruleBean, new HashMap<>(0));
+ //这里只做新书入库,查询是否存在这本书
+ Book existBook = bookService.queryBookByBookNameAndAuthorName(book.getBookName(), book.getAuthorName());
+ //如果该小说不存在,则可以解析入库,但是标记该小说正在入库,30分钟之后才允许再次入库
+ if (existBook == null) {
+ //没有该书,可以入库
+ book.setCatId(catId);
+ //根据分类ID查询分类
+ book.setCatName(bookService.queryCatNameByCatId(catId));
+ if (catId == 7) {
+ //女频
+ book.setWorkDirection((byte) 1);
+ } else {
+ //男频
+ book.setWorkDirection((byte) 0);
+ }
+ book.setCrawlBookId(bookId);
+ book.setCrawlSourceId(sourceId);
+ book.setCrawlLastTime(new Date());
+ book.setId(new IdWorker().nextId());
+ //解析章节目录
+ CrawlParser.parseBookIndexAndContent(bookId, book, ruleBean, new HashMap<>(0),chapter -> {
+ bookService.saveBookAndIndexAndContent(book, chapter.getBookIndexList(), chapter.getBookContentList());
+ });
- bookService.saveBookAndIndexAndContent(book, (List) indexAndContentList.get(CrawlParser.BOOK_INDEX_LIST_KEY), (List) indexAndContentList.get(CrawlParser.BOOK_CONTENT_LIST_KEY));
+ } else {
+ //只更新书籍的爬虫相关字段
+ bookService.updateCrawlProperties(existBook.getId(), sourceId, bookId);
+ }
+ parseResult.set(true);
+ });
+
+ return parseResult.get();
- } else {
- //只更新书籍的爬虫相关字段
- bookService.updateCrawlProperties(existBook.getId(), sourceId, bookId);
- }
- return true;
}
@Override
diff --git a/novel-crawl/src/main/java/com/java2nb/novel/service/impl/DbBookContentServiceImpl.java b/novel-crawl/src/main/java/com/java2nb/novel/service/impl/DbBookContentServiceImpl.java
new file mode 100644
index 0000000..9cb75bc
--- /dev/null
+++ b/novel-crawl/src/main/java/com/java2nb/novel/service/impl/DbBookContentServiceImpl.java
@@ -0,0 +1,44 @@
+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
+@RequiredArgsConstructor
+@ConditionalOnProperty(prefix = "txt.save", name = "storage", havingValue = "db")
+public class DbBookContentServiceImpl implements BookContentService {
+
+ private final BookContentMapper bookContentMapper;
+
+ @Override
+ public void saveBookContent(List 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));
+ }
+}
diff --git a/novel-crawl/src/main/java/com/java2nb/novel/service/impl/FileBookContentServiceImpl.java b/novel-crawl/src/main/java/com/java2nb/novel/service/impl/FileBookContentServiceImpl.java
new file mode 100644
index 0000000..28afc57
--- /dev/null
+++ b/novel-crawl/src/main/java/com/java2nb/novel/service/impl/FileBookContentServiceImpl.java
@@ -0,0 +1,36 @@
+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
+@RequiredArgsConstructor
+@ConditionalOnProperty(prefix = "txt.save", name = "storage", havingValue = "file")
+public class FileBookContentServiceImpl implements BookContentService {
+
+ @Value("${txt.save.path}")
+ private String fileSavePath;
+
+ @Override
+ public void saveBookContent(List 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());
+ }
+}
diff --git a/novel-crawl/src/main/java/com/java2nb/novel/vo/CrawlSingleTaskVO.java b/novel-crawl/src/main/java/com/java2nb/novel/vo/CrawlSingleTaskVO.java
index 4583856..9157501 100644
--- a/novel-crawl/src/main/java/com/java2nb/novel/vo/CrawlSingleTaskVO.java
+++ b/novel-crawl/src/main/java/com/java2nb/novel/vo/CrawlSingleTaskVO.java
@@ -2,14 +2,15 @@ package com.java2nb.novel.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.java2nb.novel.entity.CrawlSingleTask;
-import com.java2nb.novel.entity.CrawlSource;
import lombok.Data;
+import lombok.EqualsAndHashCode;
import java.util.Date;
/**
* @author Administrator
*/
+@EqualsAndHashCode(callSuper = true)
@Data
public class CrawlSingleTaskVO extends CrawlSingleTask {
diff --git a/novel-crawl/src/main/java/com/java2nb/novel/vo/CrawlSourceVO.java b/novel-crawl/src/main/java/com/java2nb/novel/vo/CrawlSourceVO.java
index d307ae7..45860fb 100644
--- a/novel-crawl/src/main/java/com/java2nb/novel/vo/CrawlSourceVO.java
+++ b/novel-crawl/src/main/java/com/java2nb/novel/vo/CrawlSourceVO.java
@@ -3,13 +3,14 @@ package com.java2nb.novel.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.java2nb.novel.entity.CrawlSource;
import lombok.Data;
+import lombok.EqualsAndHashCode;
-import javax.annotation.Generated;
import java.util.Date;
/**
* @author Administrator
*/
+@EqualsAndHashCode(callSuper = true)
@Data
public class CrawlSourceVO extends CrawlSource{
diff --git a/novel-crawl/src/main/resources/application-prod.yml b/novel-crawl/src/main/resources/application-prod.yml
new file mode 100644
index 0000000..54ce802
--- /dev/null
+++ b/novel-crawl/src/main/resources/application-prod.yml
@@ -0,0 +1,3 @@
+spring:
+ profiles:
+ include: [common-prod]
\ No newline at end of file
diff --git a/novel-crawl/src/main/resources/application.yml b/novel-crawl/src/main/resources/application.yml
index 394d285..132a14e 100644
--- a/novel-crawl/src/main/resources/application.yml
+++ b/novel-crawl/src/main/resources/application.yml
@@ -1,6 +1,9 @@
#端口号
server:
port: 8081
+ servlet:
+ session:
+ timeout: 1D
spring:
profiles:
@@ -19,3 +22,6 @@ crawl:
thread: 1
+
+
+
diff --git a/novel-front/pom.xml b/novel-front/pom.xml
index 8876a94..da5eeac 100644
--- a/novel-front/pom.xml
+++ b/novel-front/pom.xml
@@ -5,7 +5,7 @@
novel
com.java2nb
- 3.1.0
+ 3.6.0
4.0.0
@@ -39,6 +39,12 @@
${jest.version}
+
+ org.elasticsearch.client
+ elasticsearch-rest-high-level-client
+ ${elasticsearch.version}
+
+
com.aliyun.oss
diff --git a/novel-front/src/main/java/com/java2nb/novel/FrontNovelApplication.java b/novel-front/src/main/java/com/java2nb/novel/FrontNovelApplication.java
index f83b2d9..3ace218 100644
--- a/novel-front/src/main/java/com/java2nb/novel/FrontNovelApplication.java
+++ b/novel-front/src/main/java/com/java2nb/novel/FrontNovelApplication.java
@@ -5,6 +5,7 @@ import io.shardingsphere.shardingjdbc.spring.boot.SpringBootConfiguration;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Import;
@@ -20,6 +21,7 @@ import org.springframework.transaction.annotation.EnableTransactionManagement;
@EnableTransactionManagement
@EnableScheduling
@EnableCaching
+@ServletComponentScan
@MapperScan(basePackages = {"com.java2nb.novel.mapper"})
@Import(FdfsClientConfig.class)
public class FrontNovelApplication {
diff --git a/novel-front/src/main/java/com/java2nb/novel/controller/AuthorController.java b/novel-front/src/main/java/com/java2nb/novel/controller/AuthorController.java
index ae2afad..9b23947 100644
--- a/novel-front/src/main/java/com/java2nb/novel/controller/AuthorController.java
+++ b/novel-front/src/main/java/com/java2nb/novel/controller/AuthorController.java
@@ -1,22 +1,21 @@
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.enums.ResponseStatus;
import com.java2nb.novel.core.exception.BusinessException;
-import com.java2nb.novel.core.utils.BeanUtil;
import com.java2nb.novel.entity.Author;
+import com.java2nb.novel.entity.AuthorIncome;
+import com.java2nb.novel.entity.AuthorIncomeDetail;
import com.java2nb.novel.entity.Book;
import com.java2nb.novel.service.AuthorService;
import com.java2nb.novel.service.BookService;
-import com.java2nb.novel.service.FriendLinkService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
import java.util.Date;
/**
@@ -36,7 +35,7 @@ public class AuthorController extends BaseController{
* 校验笔名是否存在
* */
@GetMapping("checkPenName")
- public ResultBean checkPenName(String penName){
+ public ResultBean checkPenName(String penName){
return ResultBean.ok(authorService.checkPenName(penName));
}
@@ -45,17 +44,16 @@ public class AuthorController extends BaseController{
* 作家发布小说分页列表查询
* */
@GetMapping("listBookByPage")
- public ResultBean listBookByPage(@RequestParam(value = "curr", defaultValue = "1") int page, @RequestParam(value = "limit", defaultValue = "10") int pageSize ,HttpServletRequest request){
+ public ResultBean> listBookByPage(@RequestParam(value = "curr", defaultValue = "1") int page, @RequestParam(value = "limit", defaultValue = "10") int pageSize , HttpServletRequest request){
- return ResultBean.ok(new PageInfo<>(bookService.listBookPageByUserId(getUserDetails(request).getId(),page,pageSize)
- ));
+ return ResultBean.ok(bookService.listBookPageByUserId(getUserDetails(request).getId(),page,pageSize));
}
/**
* 发布小说
* */
@PostMapping("addBook")
- public ResultBean addBook(@RequestParam("bookDesc") String bookDesc,Book book,HttpServletRequest request){
+ public ResultBean addBook(@RequestParam("bookDesc") String bookDesc,Book book,HttpServletRequest request){
Author author = checkAuthor(request);
@@ -73,7 +71,7 @@ public class AuthorController extends BaseController{
* 更新小说状态,上架或下架
* */
@PostMapping("updateBookStatus")
- public ResultBean updateBookStatus(Long bookId,Byte status,HttpServletRequest request){
+ public ResultBean updateBookStatus(Long bookId,Byte status,HttpServletRequest request){
Author author = checkAuthor(request);
//更新小说状态,上架或下架
@@ -88,7 +86,7 @@ public class AuthorController extends BaseController{
* 删除章节
*/
@DeleteMapping("deleteIndex/{indexId}")
- public ResultBean deleteIndex(@PathVariable("indexId") Long indexId, HttpServletRequest request) {
+ public ResultBean deleteIndex(@PathVariable("indexId") Long indexId, HttpServletRequest request) {
Author author = checkAuthor(request);
@@ -102,7 +100,7 @@ public class AuthorController extends BaseController{
* 更新章节名
*/
@PostMapping("updateIndexName")
- public ResultBean updateIndexName(Long indexId, String indexName, HttpServletRequest request) {
+ public ResultBean updateIndexName(Long indexId, String indexName, HttpServletRequest request) {
Author author = checkAuthor(request);
@@ -119,7 +117,7 @@ public class AuthorController extends BaseController{
* 发布章节内容
*/
@PostMapping("addBookContent")
- public ResultBean addBookContent(Long bookId, String indexName, String content,Byte isVip, HttpServletRequest request) {
+ public ResultBean addBookContent(Long bookId, String indexName, String content,Byte isVip, HttpServletRequest request) {
Author author = checkAuthor(request);
content = content.replaceAll("\\n", "
")
@@ -134,7 +132,7 @@ public class AuthorController extends BaseController{
* 查询章节内容
*/
@GetMapping("queryIndexContent/{indexId}")
- public ResultBean queryIndexContent(@PathVariable("indexId") Long indexId, HttpServletRequest request) {
+ public ResultBean queryIndexContent(@PathVariable("indexId") Long indexId, HttpServletRequest request) {
Author author = checkAuthor(request);
@@ -150,7 +148,7 @@ public class AuthorController extends BaseController{
* 更新章节内容
*/
@PostMapping("updateBookContent")
- public ResultBean updateBookContent(Long indexId, String indexName, String content, HttpServletRequest request) {
+ public ResultBean updateBookContent(Long indexId, String indexName, String content, HttpServletRequest request) {
Author author = checkAuthor(request);
content = content.replaceAll("\\n", "
")
@@ -161,19 +159,29 @@ public class AuthorController extends BaseController{
return ResultBean.ok();
}
+ /**
+ * 修改小说封面
+ */
+ @PostMapping("updateBookPic")
+ public ResultBean updateBookPic(@RequestParam("bookId") Long bookId,@RequestParam("bookPic") String bookPic,HttpServletRequest request) {
+ Author author = checkAuthor(request);
+ bookService.updateBookPic(bookId,bookPic, author.getId());
+ return ResultBean.ok();
+ }
+
+
/**
* 作家日收入统计数据分页列表查询
* */
@GetMapping("listIncomeDailyByPage")
- public ResultBean listIncomeDailyByPage(@RequestParam(value = "curr", defaultValue = "1") int page,
- @RequestParam(value = "limit", defaultValue = "10") int pageSize ,
- @RequestParam(value = "bookId", defaultValue = "0") Long bookId,
- @RequestParam(value = "startTime",defaultValue = "2020-05-01") Date startTime,
- @RequestParam(value = "endTime",defaultValue = "2030-01-01") Date endTime,
- HttpServletRequest request){
+ public ResultBean> listIncomeDailyByPage(@RequestParam(value = "curr", defaultValue = "1") int page,
+ @RequestParam(value = "limit", defaultValue = "10") int pageSize ,
+ @RequestParam(value = "bookId", defaultValue = "0") Long bookId,
+ @RequestParam(value = "startTime",defaultValue = "2020-05-01") Date startTime,
+ @RequestParam(value = "endTime",defaultValue = "2030-01-01") Date endTime,
+ HttpServletRequest request){
- return ResultBean.ok(new PageInfo<>(authorService.listIncomeDailyByPage(page,pageSize,getUserDetails(request).getId(),bookId,startTime,endTime)
- ));
+ return ResultBean.ok(authorService.listIncomeDailyByPage(page,pageSize,getUserDetails(request).getId(),bookId,startTime,endTime));
}
@@ -181,13 +189,12 @@ public class AuthorController extends BaseController{
* 作家月收入统计数据分页列表查询
* */
@GetMapping("listIncomeMonthByPage")
- public ResultBean listIncomeMonthByPage(@RequestParam(value = "curr", defaultValue = "1") int page,
- @RequestParam(value = "limit", defaultValue = "10") int pageSize ,
- @RequestParam(value = "bookId", defaultValue = "0") Long bookId,
- HttpServletRequest request){
+ public ResultBean> listIncomeMonthByPage(@RequestParam(value = "curr", defaultValue = "1") int page,
+ @RequestParam(value = "limit", defaultValue = "10") int pageSize ,
+ @RequestParam(value = "bookId", defaultValue = "0") Long bookId,
+ HttpServletRequest request){
- return ResultBean.ok(new PageInfo<>(authorService.listIncomeMonthByPage(page,pageSize,getUserDetails(request).getId(),bookId)
- ));
+ return ResultBean.ok(authorService.listIncomeMonthByPage(page,pageSize,getUserDetails(request).getId(),bookId));
}
private Author checkAuthor(HttpServletRequest request) {
diff --git a/novel-front/src/main/java/com/java2nb/novel/controller/BookController.java b/novel-front/src/main/java/com/java2nb/novel/controller/BookController.java
index 3b157af..6bd0287 100644
--- a/novel-front/src/main/java/com/java2nb/novel/controller/BookController.java
+++ b/novel-front/src/main/java/com/java2nb/novel/controller/BookController.java
@@ -1,11 +1,18 @@
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.enums.ResponseStatus;
+import com.java2nb.novel.entity.Book;
+import com.java2nb.novel.entity.BookCategory;
import com.java2nb.novel.entity.BookComment;
-import com.java2nb.novel.search.BookSP;
+import com.java2nb.novel.entity.BookIndex;
+import com.java2nb.novel.service.BookContentService;
+import com.java2nb.novel.vo.BookCommentVO;
+import com.java2nb.novel.vo.BookSettingVO;
+import com.java2nb.novel.vo.BookSpVO;
import com.java2nb.novel.service.BookService;
import com.java2nb.novel.vo.BookVO;
import lombok.RequiredArgsConstructor;
@@ -16,6 +23,7 @@ import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
/**
@@ -25,10 +33,12 @@ import java.util.Map;
@RestController
@Slf4j
@RequiredArgsConstructor
-public class BookController extends BaseController{
+public class BookController extends BaseController {
private final BookService bookService;
+ private final BookContentService bookContentService;
+
private final RabbitTemplate rabbitTemplate;
@Value("${spring.rabbitmq.enable}")
@@ -37,78 +47,77 @@ public class BookController extends BaseController{
/**
* 查询首页小说设置列表数据
- * */
+ */
@GetMapping("listBookSetting")
- public ResultBean listBookSetting(){
+ public ResultBean