Compare commits

...

19 Commits

Author SHA1 Message Date
19d4c6b778 修复部分分页接口的查询bug 2021-02-04 23:59:26 +08:00
d22200b8c7 文档update 2021-01-28 09:00:36 +08:00
43fe1150fd 文档update 2021-01-28 08:58:20 +08:00
65b65f874f 文档update 2021-01-28 08:46:56 +08:00
3b6bc859a5 文档update 2021-01-28 08:35:08 +08:00
cfc55a6c92 update 2021-01-28 08:33:05 +08:00
0a80c5662d update 2021-01-28 08:28:03 +08:00
02fd0d7e25 模版更新 2021-01-25 18:10:47 +08:00
521142a792 v3.5.1发布 2021-01-25 16:56:41 +08:00
c567e37423 v3.5.1发布 2021-01-25 14:56:05 +08:00
b5e0814eb4 小说内容页性能优化 2021-01-25 14:14:54 +08:00
ca6c2aec96 update 2021-01-24 14:07:14 +08:00
34859c839b update 2021-01-22 10:18:25 +08:00
039f9d9cf8 update 2021-01-21 21:03:08 +08:00
224829dd1f v3.5.0发布 2021-01-19 19:39:33 +08:00
1a5122209a 个人中心新增头像设置 2021-01-19 19:34:14 +08:00
48aff7cf37 个人中心新增头像设置 2021-01-19 19:32:32 +08:00
e673f9be9d 新增启动banner 2021-01-19 19:00:54 +08:00
20469bd669 增加生产环境配置 2021-01-19 18:53:47 +08:00
64 changed files with 725 additions and 1297 deletions

View File

@ -2,9 +2,14 @@
# 小说精品屋-plus # 小说精品屋-plus
[![Github stars](https://img.shields.io/github/stars/201206030/novel-plus?logo=github)](https://github.com/201206030/novel-plus)
[![Github forks](https://img.shields.io/github/forks/201206030/novel-plus?logo=github)](https://github.com/201206030/novel-plus)
[![Gitee star](https://gitee.com/novel_dev_team/novel-plus/badge/star.svg?theme=gitee)](https://gitee.com/novel_dev_team/novel-plus)
[![Gitee fork](https://gitee.com/novel_dev_team/novel-plus/badge/fork.svg?theme=gitee)](https://gitee.com/novel_dev_team/novel-plus)
#### 官网 #### 官网
https://xiongxyang.gitee.io/home/ https://xiongxyang.gitee.io
#### 新项目小说精品屋-微服务版 #### 新项目小说精品屋-微服务版
@ -205,7 +210,7 @@ novel-plus -- 父工程
![QQ图片20191018161901](https://s3.ax1x.com/2020/12/27/r5Fe0A.png) ![QQ图片20191018161901](https://s3.ax1x.com/2020/12/27/r5Fe0A.png)
#### 安装步骤 #### 安装步骤源码小白请看其他安装教程
##### 数据库安装 ##### 数据库安装
@ -216,24 +221,57 @@ novel-plus -- 父工程
##### 爬虫管理系统安装 ##### 爬虫管理系统安装
1. 修改novel-common模块下application-common-dev.yml配置文件中的数据库配置 1. 修改novel-common模块下application-common-dev.ymldev环境默认环境或application-common-prod.ymlprod环境需要在application.yml配置文件中切换配置文件中的数据库配置
2. 修改novel-crawl模块下application.yml文件中的管理员账号密码 2. 修改novel-crawl模块下application.yml文件中的管理员账号密码
3. 启动程序打开浏览器默认8081端口访问 3. 启动程序打开浏览器默认8081端口访问
4. 选择已有或新增爬虫源支持自定义爬虫规则点击`开启`按钮开始爬取小说数据 4. 选择已有或新增爬虫源支持自定义爬虫规则点击`开启`按钮开始爬取小说数据
##### 前台小说门户安装jar包形式部署时需要复制templates文件夹到jar文件的相同目录下 ##### 前台小说门户安装dev环境跳过34步骤
1. 修改novel-common模块下application-common-dev.ymldev环境默认环境或application-common-prod.ymlprod环境需要在application.yml配置文件中切换配置文件中的数据库配置
1. 修改novel-common模块下application-common-dev.yml配置文件中的数据库配置
2. 修改novel-front模块下application-website配置文件中的网站信息 2. 修改novel-front模块下application-website配置文件中的网站信息
![mini-code](https://s3.ax1x.com/2020/12/28/royaex.png)
3. 修改novel-front模块下application.yml配置文件中的模版名为你需要使用的模版名templates文件夹下的模版文件夹名内置orange和dark两套模版 ```
![mini-code](https://s3.ax1x.com/2020/12/26/r4uGM6.png) #网站配置
4. 启动程序打开浏览器默认8080端口访问 website:
#网站名
name: 小说精品屋
#域名
domain: xiongxyang.gitee.io
#SEO关键词
keyword: ${website.name},小说,小说CMS,原创文学系统,开源小说系统,免费小说建站程序
#SEO描述
description: ${website.name}是一个多端PCWAP阅读功能完善的原创文学CMS系统由前台门户系统作家后台管理系统平台后台管理系统爬虫管理系统等多个子系统构成支持会员充值订阅模式新闻发布和实时统计报表等功能新书自动入库老书自动更新
#联系QQ
qq: 1179705413
```
3. prod环境下需要修改novel-front模块下application-prod.yml配置文件中的模版名为你需要使用的模版名templates文件夹下的模版文件夹名内置orange和dark两套模版prod环境下才支持多模版
```
#模版配置
templates:
#模版名
name: orange
```
4. prod环境下的jar包形式部署时需要复制templates文件夹到jar文件的相同目录下
5. 启动程序打开浏览器默认8080端口访问
**喜欢此项目的可以给我的GitHub和Gitee加个Star支持一下 ** **喜欢此项目的可以给我的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版本 ##### version<3.3.0版本
包安装教程[点击前往](https://my.oschina.net/java2nb/blog/4272630) 包安装教程[点击前往](https://my.oschina.net/java2nb/blog/4272630)
@ -242,10 +280,6 @@ novel-plus -- 父工程
docker安装教程[点击前往](https://my.oschina.net/java2nb/blog/4271989) docker安装教程[点击前往](https://my.oschina.net/java2nb/blog/4271989)
##### version>=3.3.0版本
包安装教程[点击前往](https://my.oschina.net/java2nb/blog/4842472)
#### 代码仓库 #### 代码仓库
GitHub仓库地址 https://github.com/201206030/novel-plus GitHub仓库地址 https://github.com/201206030/novel-plus
@ -254,7 +288,7 @@ docker安装教程[点击前往](https://my.oschina.net/java2nb/blog/4271989)
#### QQ交流群 #### QQ交流群
[点击前往官网查看](https://xiongxyang.gitee.io/home/service.htm) [点击前往官网查看](https://xiongxyang.gitee.io/service.htm)
问问题的三要素 问问题的三要素

View File

@ -5,7 +5,7 @@
<groupId>com.java2nb</groupId> <groupId>com.java2nb</groupId>
<artifactId>novel-admin</artifactId> <artifactId>novel-admin</artifactId>
<version>3.3.0</version> <version>3.5.0</version>
<packaging>jar</packaging> <packaging>jar</packaging>
<name>novel-admin</name> <name>novel-admin</name>

View File

@ -2,20 +2,18 @@ package com.java2nb;
import org.mybatis.spring.annotation.MapperScan; import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan; import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.cache.annotation.EnableCaching; import org.springframework.cache.annotation.EnableCaching;
import org.springframework.transaction.annotation.EnableTransactionManagement; import org.springframework.transaction.annotation.EnableTransactionManagement;
//关闭SpringSecurity的功能
@EnableAutoConfiguration(exclude = {
org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class
})
@EnableTransactionManagement @EnableTransactionManagement
@ServletComponentScan @ServletComponentScan
@MapperScan("com.java2nb.*.dao") @MapperScan("com.java2nb.*.dao")
@SpringBootApplication @SpringBootApplication(exclude = {
org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class
})
@EnableCaching @EnableCaching
public class AdminApplication { public class AdminApplication {
public static void main(String[] args) { public static void main(String[] args) {

View File

@ -9,8 +9,8 @@ logging:
spring: spring:
datasource: datasource:
type: com.alibaba.druid.pool.DruidDataSource type: com.alibaba.druid.pool.DruidDataSource
driverClassName: com.mysql.jdbc.Driver driverClassName: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai url: jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai
username: root username: root
password: test123456 password: test123456
#password: #password:

View File

@ -1,16 +1,19 @@
java2nb: java2nb:
uploadPath: /var/java2nb/uploaded_files/ uploadPath: /var/pic/
username: admin
password: 111111
logging: logging:
level: level:
root: error root: error
com.java2nb: info com.java2nb: error
spring: spring:
datasource: datasource:
type: com.alibaba.druid.pool.DruidDataSource type: com.alibaba.druid.pool.DruidDataSource
driverClassName: com.mysql.cj.jdbc.Driver driverClassName: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/java2nb?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai url: jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai
username: java2nb username: root
password: java2nb1019 password: test123456
#password:
initialSize: 1 initialSize: 1
minIdle: 3 minIdle: 3
maxActive: 20 maxActive: 20
@ -34,18 +37,18 @@ spring:
# 合并多个DruidDataSource的监控数据 # 合并多个DruidDataSource的监控数据
#useGlobalDataSourceStat: true #useGlobalDataSourceStat: true
redis: redis:
host: 127.0.0.1 host: 127.0.0.1
port: 6379 port: 6379
password: password: test
# 连接超时时间毫秒 # 连接超时时间毫秒
timeout: 10000 timeout: 10000
jedis: jedis:
pool: pool:
# 连接池中的最大空闲连接 # 连接池中的最大空闲连接
max-idle: 8 max-idle: 8
# 连接池中的最小空闲连接 # 连接池中的最小空闲连接
min-idle: 10 min-idle: 10
# 连接池最大连接数使用负值表示没有限制 # 连接池最大连接数使用负值表示没有限制
max-active: 100 max-active: 100
# 连接池最大阻塞等待时间使用负值表示没有限制 # 连接池最大阻塞等待时间使用负值表示没有限制
max-wait: -1 max-wait: -1

View File

@ -1,6 +1,15 @@
__ ________ ___. ${AnsiColor.CYAN}
|__|____ ___ _______ \_____ \ ____\_ |__
| \__ \\ \/ /\__ \ / ____/ / \| __ \ --------------------------------------------------------------------------------
| |/ __ \\ / / __ \_/ \| | \ \_\ \ ${AnsiColor.RED}
/\__| (____ /\_/ (____ /\_______ \___| /___ / || / | / /
\______| \/ \/ \/ \/ \/ || / | / / ___ // ___ ___ _ __
|| / /||/ / //___) ) // // ) ) // ) ) // ) ) ) )
||/ / | / // // // // / / // / / / /
| / | / ((____ // ((____ ((___/ / // / / / / 小说精品屋欢迎您!!!
-------Powered By XXY
${AnsiColor.CYAN}
--------------------------------------------------------------------------------
${AnsiColor.BRIGHT_YELLOW}
::: Spring-Boot ${spring-boot.formatted-version} :::

View File

@ -1,327 +0,0 @@
<!DOCTYPE html>
<html>
<meta charset="utf-8">
<head th:include="include :: header"></head>
<body class="gray-bg">
<div class="wrapper wrapper-content ">
<div class="row">
<div class="col-sm-12">
<div class="ibox float-e-margins">
<div class="ibox-content">
<form class="form-horizontal m-t" id="signupForm">
<div class="form-group">
<label class="col-sm-3 control-label">付呗商户号:</label>
<div class="col-sm-8">
<input id="fbMerchantCode" name="fbMerchantCode"
class="form-control"
type="text">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">第三方商户的订单号:</label>
<div class="col-sm-8">
<input id="merchantOrderSn" name="merchantOrderSn"
class="form-control"
type="text">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">付呗订单号:</label>
<div class="col-sm-8">
<select data-placeholder="--选择--" id="orderSn"
name="orderSn"
class="form-control chosen-select" tabindex="2"
dict-type="color">
</select>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">平台方订单号:</label>
<div class="col-sm-8">
<select data-placeholder="--选择--" id="platformOrderNo"
name="platformOrderNo"
class="form-control chosen-select" tabindex="2"
dict-type="oa_leave_type">
</select>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">商户单号:</label>
<div class="col-sm-8">
<input type="hidden" id="tradeNo" name="tradeNo"/>
<div id="contentEditortradeNo">
</div>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">订单状态1未支付2支付成功3支付失败4支付取消</label>
<div class="col-sm-8">
<select data-placeholder="--选择--" id="orderState"
name="orderState"
class="form-control chosen-select" tabindex="2"
dict-type="yes_no">
</select>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">蜂鸟优惠卷抵扣:</label>
<div class="col-sm-8">
<input id="fnCoupon" name="fnCoupon"
class="form-control"
type="number">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">红包抵扣:</label>
<div class="col-sm-8">
<input id="redPacket" name="redPacket"
class="form-control"
type="number">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">实收金额(元)</label>
<div class="col-sm-8">
<input id="totalFee" name="totalFee"
class="form-control"
type="number">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">订单金额:</label>
<div class="col-sm-8">
<input id="orderPrice" name="orderPrice"
class="form-control"
type="number">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">手续费(元)</label>
<div class="col-sm-8">
<input id="fee" name="fee"
class="form-control"
type="number">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">对商品或交易的描述:</label>
<div class="col-sm-8">
<img title="点击选择图片" id="picImagebody"
style="cursor:pointer;width: 100px;height: 100px"
src="/img/webuploader.png"/>
<input id="body" name="body"
class="form-control"
type="hidden">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">附加数据:</label>
<div class="col-sm-8">
<input type="hidden" id="attach" name="attach"/>
<div id="contentEditorattach">
</div>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">付呗系统的门店id</label>
<div class="col-sm-8">
<input id="storeId" name="storeId"
class="form-control"
type="number">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">付呗系统的收银员id</label>
<div class="col-sm-8">
<input id="cashierId" name="cashierId"
class="form-control"
type="number">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">设备终端号:</label>
<div class="col-sm-8">
<input id="deviceNo" name="deviceNo"
class="form-control"
type="text">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">微信顾客支付授权的“open_id”或者支付宝顾客的“buyer_user_id”</label>
<div class="col-sm-8">
<input id="userId" name="userId"
class="form-control"
type="text">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">支付宝顾客的账号:</label>
<div class="col-sm-8">
<textarea id="userLogonId" name="userLogonId"
class="form-control"></textarea>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">交易成功的时间:</label>
<div class="col-sm-8">
<input type="text" class="laydate-icon layer-date form-control"
id="payTime"
name="payTime"
onclick="laydate({istime: true, format: 'YYYY-MM-DD hh:mm:ss'})"
style="background-color: #fff;" readonly="readonly"/>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">支付通道:1微信、2支付宝、3银联</label>
<div class="col-sm-8">
<select data-placeholder="--选择--" id="payChannel"
name="payChannel"
class="form-control chosen-select" tabindex="2"
dict-type="del_flag">
</select>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">免充值代金券金额(元)</label>
<div class="col-sm-8">
<input id="noCashCouponFee" name="noCashCouponFee"
class="form-control"
type="number">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">预充值代金券金额(元)</label>
<div class="col-sm-8">
<input id="cashCouponFee" name="cashCouponFee"
class="form-control"
type="number">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">顾客实际支付金额(元)</label>
<div class="col-sm-8">
<input id="cashFee" name="cashFee"
class="form-control"
type="number">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">签名:</label>
<div class="col-sm-8">
<select data-placeholder="--选择--" id="sign"
name="sign"
class="form-control chosen-select" tabindex="2"
dict-type="theme">
</select>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">其它选项:</label>
<div class="col-sm-8">
<img title="点击选择图片" id="picImageoptions"
style="cursor:pointer;width: 100px;height: 100px"
src="/img/webuploader.png"/>
<input id="options" name="options"
class="form-control"
type="hidden">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">创建时间:</label>
<div class="col-sm-8">
<input type="text" class="laydate-icon layer-date form-control"
id="createTime"
name="createTime"
onclick="laydate({istime: true, format: 'YYYY-MM-DD hh:mm:ss'})"
style="background-color: #fff;" readonly="readonly"/>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">推送时间:</label>
<div class="col-sm-8">
<input type="text" class="laydate-icon layer-date form-control"
id="pushTime"
name="pushTime"
onclick="laydate({istime: true, format: 'YYYY-MM-DD hh:mm:ss'})"
style="background-color: #fff;" readonly="readonly"/>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">推送IP</label>
<div class="col-sm-8">
<input type="hidden" id="pushIp" name="pushIp"/>
<div id="contentEditorpushIp">
</div>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">商户id</label>
<div class="col-sm-8">
<input id="mchtId" name="mchtId"
class="form-control"
type="number">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">QR编号</label>
<div class="col-sm-8">
<input id="sn" name="sn"
class="form-control"
type="text">
</div>
</div>
<div class="form-group">
<div class="col-sm-8 col-sm-offset-3">
<button type="submit" class="btn btn-primary">提交</button>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
<div th:include="include::footer"></div>
<script type="text/javascript" src="/wangEditor/release/wangEditor.js"></script>
<script type="text/javascript" src="/js/appjs/test/order/add.js">
</script>
</body>
</html>

View File

@ -1,315 +0,0 @@
<!DOCTYPE html>
<html>
<meta charset="utf-8">
<head th:include="include :: header"></head>
<body class="gray-bg">
<div class="wrapper wrapper-content ">
<div class="row">
<div class="col-sm-12">
<div class="ibox float-e-margins">
<div class="ibox-content">
<form class="form-horizontal m-t" id="signupForm">
<input id="id" name="id" th:value="${order.id}"
type="hidden">
<div class="form-group">
<label class="col-sm-3 control-label">付呗商户号:</label>
<div style="padding-top:8px" class="col-sm-8"
th:text="${order.fbMerchantCode}">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">第三方商户的订单号:</label>
<div style="padding-top:8px" class="col-sm-8"
th:text="${order.merchantOrderSn}">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">付呗订单号:</label>
<div style="padding-top:8px" class="col-sm-8 dict-type" dict-type="color"
th:attr="dict-value=${order.orderSn}">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">平台方订单号:</label>
<div style="padding-top:8px" class="col-sm-8 dict-type" dict-type="oa_leave_type"
th:attr="dict-value=${order.platformOrderNo}">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">商户单号:</label>
<div style="padding-top:8px" class="col-sm-8"
th:utext="${order.tradeNo}"></div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">订单状态1未支付2支付成功3支付失败4支付取消</label>
<div style="padding-top:8px" class="col-sm-8 dict-type" dict-type="yes_no"
th:attr="dict-value=${order.orderState}">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">蜂鸟优惠卷抵扣:</label>
<div style="padding-top:8px" class="col-sm-8"
th:text="${order.fnCoupon}">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">红包抵扣:</label>
<div style="padding-top:8px" class="col-sm-8"
th:text="${order.redPacket}">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">实收金额(元)</label>
<div style="padding-top:8px" class="col-sm-8"
th:text="${order.totalFee}">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">订单金额:</label>
<div style="padding-top:8px" class="col-sm-8"
th:text="${order.orderPrice}">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">手续费(元)</label>
<div style="padding-top:8px" class="col-sm-8"
th:text="${order.fee}">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">对商品或交易的描述:</label>
<div style="padding-top:8px" class="col-sm-8">
<img id="picImagebody"
style="cursor:pointer;width: 100px;height: 100px"
th:src="${order.body}==null?'/img/webuploader.png':${order.body}"/>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">附加数据:</label>
<div style="padding-top:8px" class="col-sm-8"
th:utext="${order.attach}"></div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">付呗系统的门店id</label>
<div style="padding-top:8px" class="col-sm-8"
th:text="${order.storeId}">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">付呗系统的收银员id</label>
<div style="padding-top:8px" class="col-sm-8"
th:text="${order.cashierId}">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">设备终端号:</label>
<div style="padding-top:8px" class="col-sm-8"
th:text="${order.deviceNo}">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">微信顾客支付授权的“open_id”或者支付宝顾客的“buyer_user_id”</label>
<div style="padding-top:8px" class="col-sm-8"
th:text="${order.userId}">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">支付宝顾客的账号:</label>
<div style="padding-top:8px" class="col-sm-8"
th:text="${order.userLogonId}">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">交易成功的时间:</label>
<div style="padding-top:8px" class="col-sm-8"
th:text="${order.payTime}==null?null:${#dates.format(order.payTime,'yyyy-MM-dd HH:mm:ss')}">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">支付通道:1微信、2支付宝、3银联</label>
<div style="padding-top:8px" class="col-sm-8 dict-type" dict-type="del_flag"
th:attr="dict-value=${order.payChannel}">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">免充值代金券金额(元)</label>
<div style="padding-top:8px" class="col-sm-8"
th:text="${order.noCashCouponFee}">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">预充值代金券金额(元)</label>
<div style="padding-top:8px" class="col-sm-8"
th:text="${order.cashCouponFee}">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">顾客实际支付金额(元)</label>
<div style="padding-top:8px" class="col-sm-8"
th:text="${order.cashFee}">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">签名:</label>
<div style="padding-top:8px" class="col-sm-8 dict-type" dict-type="theme"
th:attr="dict-value=${order.sign}">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">其它选项:</label>
<div style="padding-top:8px" class="col-sm-8">
<img id="picImageoptions"
style="cursor:pointer;width: 100px;height: 100px"
th:src="${order.options}==null?'/img/webuploader.png':${order.options}"/>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">创建时间:</label>
<div style="padding-top:8px" class="col-sm-8"
th:text="${order.createTime}==null?null:${#dates.format(order.createTime,'yyyy-MM-dd HH:mm:ss')}">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">推送时间:</label>
<div style="padding-top:8px" class="col-sm-8"
th:text="${order.pushTime}==null?null:${#dates.format(order.pushTime,'yyyy-MM-dd HH:mm:ss')}">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">推送IP</label>
<div style="padding-top:8px" class="col-sm-8"
th:utext="${order.pushIp}"></div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">商户id</label>
<div style="padding-top:8px" class="col-sm-8"
th:text="${order.mchtId}">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">QR编号</label>
<div style="padding-top:8px" class="col-sm-8"
th:text="${order.sn}">
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
<div th:include="include::footer"></div>
</body>
</html>

View File

@ -1,323 +0,0 @@
<!DOCTYPE html>
<html>
<meta charset="utf-8">
<head th:include="include :: header"></head>
<body class="gray-bg">
<div class="wrapper wrapper-content ">
<div class="row">
<div class="col-sm-12">
<div class="ibox float-e-margins">
<div class="ibox-content">
<form class="form-horizontal m-t" id="signupForm">
<input id="id" name="id" th:value="${order.id}"
type="hidden">
<div class="form-group">
<label class="col-sm-3 control-label">付呗商户号:</label>
<div class="col-sm-8">
<input id="fbMerchantCode" name="fbMerchantCode"
th:value="${order.fbMerchantCode}"
class="form-control"
type="text">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">第三方商户的订单号:</label>
<div class="col-sm-8">
<input id="merchantOrderSn" name="merchantOrderSn"
th:value="${order.merchantOrderSn}"
class="form-control"
type="text">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">付呗订单号:</label>
<div class="col-sm-8">
<select data-placeholder="--选择--" id="orderSn"
name="orderSn"
class="form-control chosen-select" tabindex="2"
dict-type="color"
th:attr="dict-value=${order.orderSn}" >
</select>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">平台方订单号:</label>
<div class="col-sm-8">
<select data-placeholder="--选择--" id="platformOrderNo"
name="platformOrderNo"
class="form-control chosen-select" tabindex="2"
dict-type="oa_leave_type"
th:attr="dict-value=${order.platformOrderNo}" >
</select>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">商户单号:</label>
<div class="col-sm-8">
<input type="hidden" id="tradeNo" name="tradeNo" th:value="${order.tradeNo}"/>
<div id="contentEditortradeNo">
</div>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">订单状态1未支付2支付成功3支付失败4支付取消</label>
<div class="col-sm-8">
<select data-placeholder="--选择--" id="orderState"
name="orderState"
class="form-control chosen-select" tabindex="2"
dict-type="yes_no"
th:attr="dict-value=${order.orderState}" >
</select>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">蜂鸟优惠卷抵扣:</label>
<div class="col-sm-8">
<input id="fnCoupon" name="fnCoupon"
th:value="${order.fnCoupon}"
class="form-control"
type="number">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">红包抵扣:</label>
<div class="col-sm-8">
<input id="redPacket" name="redPacket"
th:value="${order.redPacket}"
class="form-control"
type="number">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">实收金额(元)</label>
<div class="col-sm-8">
<input id="totalFee" name="totalFee"
th:value="${order.totalFee}"
class="form-control"
type="number">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">订单金额:</label>
<div class="col-sm-8">
<input id="orderPrice" name="orderPrice"
th:value="${order.orderPrice}"
class="form-control"
type="number">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">手续费(元)</label>
<div class="col-sm-8">
<input id="fee" name="fee"
th:value="${order.fee}"
class="form-control"
type="number">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">对商品或交易的描述:</label>
<div class="col-sm-8">
<img title="点击选择图片" id="picImagebody"
style="cursor:pointer;width: 100px;height: 100px"
th:src="${order.body}==null?'/img/webuploader.png':${order.body}"/>
<input id="body" name="body" th:value="${order.body}"
class="form-control"
type="hidden">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">附加数据:</label>
<div class="col-sm-8">
<input type="hidden" id="attach" name="attach" th:value="${order.attach}"/>
<div id="contentEditorattach">
</div>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">付呗系统的门店id</label>
<div class="col-sm-8">
<input id="storeId" name="storeId"
th:value="${order.storeId}"
class="form-control"
type="number">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">付呗系统的收银员id</label>
<div class="col-sm-8">
<input id="cashierId" name="cashierId"
th:value="${order.cashierId}"
class="form-control"
type="number">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">设备终端号:</label>
<div class="col-sm-8">
<input id="deviceNo" name="deviceNo"
th:value="${order.deviceNo}"
class="form-control"
type="text">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">微信顾客支付授权的“open_id”或者支付宝顾客的“buyer_user_id”</label>
<div class="col-sm-8">
<input id="userId" name="userId"
th:value="${order.userId}"
class="form-control"
type="text">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">支付宝顾客的账号:</label>
<div class="col-sm-8">
<textarea id="userLogonId" name="userLogonId"
class="form-control" th:text="${order.userLogonId}"></textarea>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">交易成功的时间:</label>
<div class="col-sm-8">
<input type="text" class="laydate-icon layer-date form-control"
id="payTime"
name="payTime"
th:value="${order.payTime}==null?null:${#dates.format(order.payTime,'yyyy-MM-dd HH:mm:ss')}"
onclick="laydate({istime: true, format: 'YYYY-MM-DD hh:mm:ss'})"
style="background-color: #fff;" readonly="readonly"/>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">支付通道:1微信、2支付宝、3银联</label>
<div class="col-sm-8">
<select data-placeholder="--选择--" id="payChannel"
name="payChannel"
class="form-control chosen-select" tabindex="2"
dict-type="del_flag"
th:attr="dict-value=${order.payChannel}" >
</select>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">免充值代金券金额(元)</label>
<div class="col-sm-8">
<input id="noCashCouponFee" name="noCashCouponFee"
th:value="${order.noCashCouponFee}"
class="form-control"
type="number">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">预充值代金券金额(元)</label>
<div class="col-sm-8">
<input id="cashCouponFee" name="cashCouponFee"
th:value="${order.cashCouponFee}"
class="form-control"
type="number">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">顾客实际支付金额(元)</label>
<div class="col-sm-8">
<input id="cashFee" name="cashFee"
th:value="${order.cashFee}"
class="form-control"
type="number">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">签名:</label>
<div class="col-sm-8">
<select data-placeholder="--选择--" id="sign"
name="sign"
class="form-control chosen-select" tabindex="2"
dict-type="theme"
th:attr="dict-value=${order.sign}" >
</select>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">其它选项:</label>
<div class="col-sm-8">
<img title="点击选择图片" id="picImageoptions"
style="cursor:pointer;width: 100px;height: 100px"
th:src="${order.options}==null?'/img/webuploader.png':${order.options}"/>
<input id="options" name="options" th:value="${order.options}"
class="form-control"
type="hidden">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">创建时间:</label>
<div class="col-sm-8">
<input type="text" class="laydate-icon layer-date form-control"
id="createTime"
name="createTime"
th:value="${order.createTime}==null?null:${#dates.format(order.createTime,'yyyy-MM-dd HH:mm:ss')}"
onclick="laydate({istime: true, format: 'YYYY-MM-DD hh:mm:ss'})"
style="background-color: #fff;" readonly="readonly"/>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">推送时间:</label>
<div class="col-sm-8">
<input type="text" class="laydate-icon layer-date form-control"
id="pushTime"
name="pushTime"
th:value="${order.pushTime}==null?null:${#dates.format(order.pushTime,'yyyy-MM-dd HH:mm:ss')}"
onclick="laydate({istime: true, format: 'YYYY-MM-DD hh:mm:ss'})"
style="background-color: #fff;" readonly="readonly"/>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">推送IP</label>
<div class="col-sm-8">
<input type="hidden" id="pushIp" name="pushIp" th:value="${order.pushIp}"/>
<div id="contentEditorpushIp">
</div>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">商户id</label>
<div class="col-sm-8">
<input id="mchtId" name="mchtId"
th:value="${order.mchtId}"
class="form-control"
type="number">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">QR编号</label>
<div class="col-sm-8">
<input id="sn" name="sn"
th:value="${order.sn}"
class="form-control"
type="text">
</div>
</div>
<div class="form-group">
<div class="col-sm-8 col-sm-offset-3">
<button type="submit" class="btn btn-primary">提交</button>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
<div th:include="include::footer"></div>
<script type="text/javascript" src="/wangEditor/release/wangEditor.js"></script>
<script type="text/javascript" src="/js/appjs/test/order/edit.js">
</script>
</body>
</html>

View File

@ -1,66 +0,0 @@
<!DOCTYPE html>
<html>
<meta charset="utf-8">
<head th:include="include :: header"></head>
<body class="gray-bg">
<div class="wrapper wrapper-content ">
<div class="col-sm-12">
<div class="ibox">
<div class="ibox-body">
<div class="fixed-table-toolbar">
<div class="columns pull-left">
<button shiro:hasPermission="test:order:add" type="button"
class="btn btn-primary" onclick="add()">
<i class="fa fa-plus" aria-hidden="true"></i>添加
</button>
<button shiro:hasPermission="test:order:batchRemove" type="button"
class="btn btn-danger"
onclick="batchRemove()">
<i class="fa fa-trash" aria-hidden="true"></i>删除
</button>
</div>
<div class="columns pull-right">
<button class="btn btn-success" onclick="reLoad()">查询</button>
</div>
<form id="searchForm">
<div class="columns pull-right col-md-2">
<input id="id" name="id" type="text" class="form-control"
placeholder="主键">
</div>
</form>
</div>
<table id="exampleTable" data-mobile-responsive="true">
</table>
</div>
</div>
</div>
</div>
<!--shiro控制bootstraptable行内按钮看见性 -->
<div>
<script type="text/javascript">
var s_detail_h = 'hidden';
var s_edit_h = 'hidden';
var s_remove_h = 'hidden';
</script>
</div>
<div shiro:hasPermission="test:order:detail">
<script type="text/javascript">
s_detail_h = '';
</script>
</div>
<div shiro:hasPermission="test:order:edit">
<script type="text/javascript">
s_edit_h = '';
</script>
</div>
<div shiro:hasPermission="test:order:remove">
<script type="text/javascript">
var s_remove_h = '';
</script>
</div>
<div th:include="include :: footer"></div>
<script type="text/javascript" src="/js/appjs/test/order/order.js"></script>
</body>
</html>

View File

@ -5,7 +5,7 @@
<parent> <parent>
<artifactId>novel</artifactId> <artifactId>novel</artifactId>
<groupId>com.java2nb</groupId> <groupId>com.java2nb</groupId>
<version>3.4.1</version> <version>3.5.1</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
@ -123,6 +123,12 @@
<optional>true</optional> <optional>true</optional>
</dependency> </dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
</dependencies> </dependencies>

View File

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

View File

@ -71,8 +71,3 @@ sharding:
pic:
save:
type: 2 #图片保存方式, 1不保存使用爬取的网络图片 2保存在自己的存储介质
storage: local #存储介质local本地OSS阿里云对象存储fastDfs分布式文件系统
path: /var/pic #图片保存路径

View File

@ -0,0 +1,82 @@
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

View File

@ -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 #图片保存路径

View File

@ -0,0 +1,15 @@
${AnsiColor.CYAN}
--------------------------------------------------------------------------------
${AnsiColor.RED}
|| / | / /
|| / | / / ___ // ___ ___ _ __
|| / /||/ / //___) ) // // ) ) // ) ) // ) ) ) )
||/ / | / // // // // / / // / / / /
| / | / ((____ // ((____ ((___/ / // / / / / 小说精品屋欢迎您!!!
-------Powered By XXY
${AnsiColor.CYAN}
--------------------------------------------------------------------------------
${AnsiColor.BRIGHT_YELLOW}
::: Spring-Boot ${spring-boot.formatted-version} :::

View File

@ -5,7 +5,7 @@
<parent> <parent>
<artifactId>novel</artifactId> <artifactId>novel</artifactId>
<groupId>com.java2nb</groupId> <groupId>com.java2nb</groupId>
<version>3.4.1</version> <version>3.5.1</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>

View File

@ -39,8 +39,7 @@ public class CrawlController {
@GetMapping("listCrawlByPage") @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));
));
} }
/** /**
@ -71,8 +70,7 @@ public class CrawlController {
@GetMapping("listCrawlSingleTaskByPage") @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));
));
} }
/** /**

View File

@ -1,8 +1,11 @@
package com.java2nb.novel.service; package com.java2nb.novel.service;
import com.github.pagehelper.PageInfo;
import com.java2nb.novel.core.bean.PageBean;
import com.java2nb.novel.core.crawl.RuleBean; import com.java2nb.novel.core.crawl.RuleBean;
import com.java2nb.novel.entity.CrawlSingleTask; import com.java2nb.novel.entity.CrawlSingleTask;
import com.java2nb.novel.entity.CrawlSource; import com.java2nb.novel.entity.CrawlSource;
import com.java2nb.novel.vo.CrawlSourceVO;
import java.util.List; import java.util.List;
@ -22,9 +25,9 @@ public interface CrawlService {
* 爬虫源分页列表 * 爬虫源分页列表
* @param page 当前页码 * @param page 当前页码
* @param pageSize 分页大小 * @param pageSize 分页大小
*@return 爬虫源集合 *@return 爬虫源分页数据
* */ * */
List<CrawlSource> listCrawlByPage(int page, int pageSize); PageBean<CrawlSource> listCrawlByPage(int page, int pageSize);
/** /**
* 开启或停止爬虫 * 开启或停止爬虫
@ -83,9 +86,9 @@ public interface CrawlService {
* 单本采集任务分页列表查询 * 单本采集任务分页列表查询
* @param page 当前页码 * @param page 当前页码
* @param pageSize 分页大小 * @param pageSize 分页大小
* @return 单本采集任务集合 * @return 单本采集任务分页数据
* */ * */
List<CrawlSingleTask> listCrawlSingleTaskByPage(int page, int pageSize); PageBean<CrawlSingleTask> listCrawlSingleTaskByPage(int page, int pageSize);
/** /**
* 删除采集任务 * 删除采集任务

View File

@ -1,13 +1,17 @@
package com.java2nb.novel.service.impl; package com.java2nb.novel.service.impl;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.java2nb.novel.core.bean.PageBean;
import com.java2nb.novel.core.cache.CacheKey; import com.java2nb.novel.core.cache.CacheKey;
import com.java2nb.novel.core.cache.CacheService; import com.java2nb.novel.core.cache.CacheService;
import com.java2nb.novel.core.crawl.CrawlParser; import com.java2nb.novel.core.crawl.CrawlParser;
import com.java2nb.novel.core.crawl.RuleBean; import com.java2nb.novel.core.crawl.RuleBean;
import com.java2nb.novel.core.enums.ResponseStatus; import com.java2nb.novel.core.enums.ResponseStatus;
import com.java2nb.novel.core.exception.BusinessException; 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.IdWorker;
import com.java2nb.novel.core.utils.SpringUtil; import com.java2nb.novel.core.utils.SpringUtil;
import com.java2nb.novel.core.utils.ThreadUtil; import com.java2nb.novel.core.utils.ThreadUtil;
@ -16,6 +20,8 @@ import com.java2nb.novel.entity.CrawlSource;
import com.java2nb.novel.mapper.*; import com.java2nb.novel.mapper.*;
import com.java2nb.novel.service.BookService; import com.java2nb.novel.service.BookService;
import com.java2nb.novel.service.CrawlService; import com.java2nb.novel.service.CrawlService;
import com.java2nb.novel.vo.CrawlSingleTaskVO;
import com.java2nb.novel.vo.CrawlSourceVO;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.SneakyThrows; import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@ -66,14 +72,17 @@ public class CrawlServiceImpl implements CrawlService {
} }
@Override @Override
public List<CrawlSource> listCrawlByPage(int page, int pageSize) { public PageBean<CrawlSource> listCrawlByPage(int page, int pageSize) {
PageHelper.startPage(page, pageSize); PageHelper.startPage(page, pageSize);
SelectStatementProvider render = select(id, sourceName, sourceStatus, createTime, updateTime) SelectStatementProvider render = select(id, sourceName, sourceStatus, createTime, updateTime)
.from(crawlSource) .from(crawlSource)
.orderBy(updateTime) .orderBy(updateTime)
.build() .build()
.render(RenderingStrategies.MYBATIS3); .render(RenderingStrategies.MYBATIS3);
return crawlSourceMapper.selectMany(render); List<CrawlSource> crawlSources = crawlSourceMapper.selectMany(render);
PageBean<CrawlSource> pageBean = new PageBean<>(crawlSources);
pageBean.setList(BeanUtil.copyList(crawlSources, CrawlSourceVO.class));
return pageBean;
} }
@SneakyThrows @SneakyThrows
@ -156,14 +165,17 @@ public class CrawlServiceImpl implements CrawlService {
} }
@Override @Override
public List<CrawlSingleTask> listCrawlSingleTaskByPage(int page, int pageSize) { public PageBean<CrawlSingleTask> listCrawlSingleTaskByPage(int page, int pageSize) {
PageHelper.startPage(page, pageSize); PageHelper.startPage(page, pageSize);
SelectStatementProvider render = select(CrawlSingleTaskDynamicSqlSupport.crawlSingleTask.allColumns()) SelectStatementProvider render = select(CrawlSingleTaskDynamicSqlSupport.crawlSingleTask.allColumns())
.from(CrawlSingleTaskDynamicSqlSupport.crawlSingleTask) .from(CrawlSingleTaskDynamicSqlSupport.crawlSingleTask)
.orderBy(CrawlSingleTaskDynamicSqlSupport.createTime.descending()) .orderBy(CrawlSingleTaskDynamicSqlSupport.createTime.descending())
.build() .build()
.render(RenderingStrategies.MYBATIS3); .render(RenderingStrategies.MYBATIS3);
return crawlSingleTaskMapper.selectMany(render); List<CrawlSingleTask> crawlSingleTasks = crawlSingleTaskMapper.selectMany(render);
PageBean<CrawlSingleTask> pageBean = new PageBean<>(crawlSingleTasks);
pageBean.setList(BeanUtil.copyList(crawlSingleTasks, CrawlSingleTaskVO.class));
return pageBean;
} }
@Override @Override

View File

@ -0,0 +1,3 @@
spring:
profiles:
include: [common-prod]

View File

@ -5,7 +5,7 @@
<parent> <parent>
<artifactId>novel</artifactId> <artifactId>novel</artifactId>
<groupId>com.java2nb</groupId> <groupId>com.java2nb</groupId>
<version>3.4.1</version> <version>3.5.1</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>

View File

@ -47,8 +47,7 @@ public class AuthorController extends BaseController{
@GetMapping("listBookByPage") @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));
));
} }
/** /**
@ -172,8 +171,7 @@ public class AuthorController extends BaseController{
@RequestParam(value = "endTime",defaultValue = "2030-01-01") Date endTime, @RequestParam(value = "endTime",defaultValue = "2030-01-01") Date endTime,
HttpServletRequest request){ 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));
));
} }
@ -186,8 +184,7 @@ public class AuthorController extends BaseController{
@RequestParam(value = "bookId", defaultValue = "0") Long bookId, @RequestParam(value = "bookId", defaultValue = "0") Long bookId,
HttpServletRequest request){ 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) { private Author checkAuthor(HttpServletRequest request) {

View File

@ -1,11 +1,13 @@
package com.java2nb.novel.controller; package com.java2nb.novel.controller;
import com.github.pagehelper.PageInfo; 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.ResultBean;
import com.java2nb.novel.core.bean.UserDetails; import com.java2nb.novel.core.bean.UserDetails;
import com.java2nb.novel.core.enums.ResponseStatus; import com.java2nb.novel.core.enums.ResponseStatus;
import com.java2nb.novel.entity.Book;
import com.java2nb.novel.entity.BookComment; import com.java2nb.novel.entity.BookComment;
import com.java2nb.novel.search.BookSP; import com.java2nb.novel.vo.BookSpVO;
import com.java2nb.novel.service.BookService; import com.java2nb.novel.service.BookService;
import com.java2nb.novel.vo.BookVO; import com.java2nb.novel.vo.BookVO;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
@ -79,9 +81,8 @@ public class BookController extends BaseController{
* 分页搜索 * 分页搜索
* */ * */
@GetMapping("searchByPage") @GetMapping("searchByPage")
public ResultBean searchByPage(BookSP bookSP, @RequestParam(value = "curr", defaultValue = "1") int page, @RequestParam(value = "limit", defaultValue = "20") int pageSize){ public ResultBean searchByPage(BookSpVO bookSP, @RequestParam(value = "curr", defaultValue = "1") int page, @RequestParam(value = "limit", defaultValue = "20") int pageSize){
PageInfo<BookVO> pageInfo = bookService.searchByPage(bookSP,page,pageSize); return ResultBean.ok(bookService.searchByPage(bookSP,page,pageSize));
return ResultBean.ok(pageInfo);
} }
/** /**
@ -143,7 +144,7 @@ public class BookController extends BaseController{
* */ * */
@GetMapping("listCommentByPage") @GetMapping("listCommentByPage")
public ResultBean listCommentByPage(@RequestParam("bookId") Long bookId,@RequestParam(value = "curr", defaultValue = "1") int page, @RequestParam(value = "limit", defaultValue = "5") int pageSize) { public ResultBean listCommentByPage(@RequestParam("bookId") Long bookId,@RequestParam(value = "curr", defaultValue = "1") int page, @RequestParam(value = "limit", defaultValue = "5") int pageSize) {
return ResultBean.ok(new PageInfo<>(bookService.listCommentByPage(null,bookId,page,pageSize))); return ResultBean.ok(bookService.listCommentByPage(null,bookId,page,pageSize));
} }
/** /**
@ -172,7 +173,7 @@ public class BookController extends BaseController{
* */ * */
@GetMapping("/queryIndexList") @GetMapping("/queryIndexList")
public ResultBean indexList(Long bookId,@RequestParam(value = "curr", defaultValue = "1") int page, @RequestParam(value = "limit", defaultValue = "5") int pageSize,@RequestParam(value = "orderBy",defaultValue = "index_num desc") String orderBy) { public ResultBean indexList(Long bookId,@RequestParam(value = "curr", defaultValue = "1") int page, @RequestParam(value = "limit", defaultValue = "5") int pageSize,@RequestParam(value = "orderBy",defaultValue = "index_num desc") String orderBy) {
return ResultBean.ok(new PageInfo<>(bookService.queryIndexList(bookId,orderBy,page,pageSize))); return ResultBean.ok(new PageBean<>(bookService.queryIndexList(bookId,orderBy,page,pageSize)));
} }

View File

@ -31,7 +31,7 @@ public class NewsController {
* */ * */
@GetMapping("listByPage") @GetMapping("listByPage")
public ResultBean listByPage(@RequestParam(value = "curr", defaultValue = "1") int page, @RequestParam(value = "limit", defaultValue = "5") int pageSize){ public ResultBean listByPage(@RequestParam(value = "curr", defaultValue = "1") int page, @RequestParam(value = "limit", defaultValue = "5") int pageSize){
return ResultBean.ok(new PageInfo<>(newsService.listByPage(page,pageSize))); return ResultBean.ok(newsService.listByPage(page,pageSize));
} }

View File

@ -5,7 +5,7 @@ import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.internal.util.AlipaySignature; import com.alipay.api.internal.util.AlipaySignature;
import com.alipay.api.request.AlipayTradePagePayRequest; import com.alipay.api.request.AlipayTradePagePayRequest;
import com.java2nb.novel.core.bean.UserDetails; import com.java2nb.novel.core.bean.UserDetails;
import com.java2nb.novel.core.config.AlipayConfig; import com.java2nb.novel.core.config.AlipayProperties;
import com.java2nb.novel.service.OrderService; import com.java2nb.novel.service.OrderService;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.SneakyThrows; import lombok.SneakyThrows;
@ -31,7 +31,7 @@ import java.util.Map;
public class PayController extends BaseController { public class PayController extends BaseController {
private final AlipayConfig alipayConfig; private final AlipayProperties alipayConfig;
private final OrderService orderService; private final OrderService orderService;

View File

@ -1,6 +1,5 @@
package com.java2nb.novel.controller; package com.java2nb.novel.controller;
import com.github.pagehelper.PageInfo;
import com.java2nb.novel.core.bean.ResultBean; import com.java2nb.novel.core.bean.ResultBean;
import com.java2nb.novel.core.bean.UserDetails; import com.java2nb.novel.core.bean.UserDetails;
import com.java2nb.novel.core.cache.CacheService; import com.java2nb.novel.core.cache.CacheService;
@ -19,7 +18,6 @@ import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.validation.Valid;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
@ -147,7 +145,7 @@ public class UserController extends BaseController {
if (userDetails == null) { if (userDetails == null) {
return ResultBean.fail(ResponseStatus.NO_LOGIN); return ResultBean.fail(ResponseStatus.NO_LOGIN);
} }
return ResultBean.ok(new PageInfo<>(userService.listBookShelfByPage(userDetails.getId(),page,pageSize))); return ResultBean.ok(userService.listBookShelfByPage(userDetails.getId(),page,pageSize));
} }
/** /**
@ -159,7 +157,7 @@ public class UserController extends BaseController {
if (userDetails == null) { if (userDetails == null) {
return ResultBean.fail(ResponseStatus.NO_LOGIN); return ResultBean.fail(ResponseStatus.NO_LOGIN);
} }
return ResultBean.ok(new PageInfo<>(userService.listReadHistoryByPage(userDetails.getId(),page,pageSize))); return ResultBean.ok(userService.listReadHistoryByPage(userDetails.getId(),page,pageSize));
} }
/** /**
@ -197,7 +195,7 @@ public class UserController extends BaseController {
if (userDetails == null) { if (userDetails == null) {
return ResultBean.fail(ResponseStatus.NO_LOGIN); return ResultBean.fail(ResponseStatus.NO_LOGIN);
} }
return ResultBean.ok(new PageInfo<>(userService.listUserFeedBackByPage(userDetails.getId(),page,pageSize))); return ResultBean.ok(userService.listUserFeedBackByPage(userDetails.getId(),page,pageSize));
} }
/** /**
@ -257,7 +255,7 @@ public class UserController extends BaseController {
if (userDetails == null) { if (userDetails == null) {
return ResultBean.fail(ResponseStatus.NO_LOGIN); return ResultBean.fail(ResponseStatus.NO_LOGIN);
} }
return ResultBean.ok(new PageInfo<>(bookService.listCommentByPage(userDetails.getId(),null,page,pageSize))); return ResultBean.ok(bookService.listCommentByPage(userDetails.getId(),null,page,pageSize));
} }

View File

@ -10,7 +10,7 @@ import org.springframework.stereotype.Component;
@Data @Data
@Component @Component
@ConfigurationProperties(prefix="alipay") @ConfigurationProperties(prefix="alipay")
public class AlipayConfig { public class AlipayProperties {
private String appId; private String appId;
private String merchantPrivateKey; private String merchantPrivateKey;

View File

@ -7,13 +7,13 @@ import org.springframework.stereotype.Component;
import java.math.BigDecimal; import java.math.BigDecimal;
/** /**
* 作家收入配置 * 作家收入配置属性
* @author cd * @author cd
*/ */
@Component @Component
@Data @Data
@ConfigurationProperties(prefix = "author.income") @ConfigurationProperties(prefix = "author.income")
public class AuthorIncomeConfig { public class AuthorIncomeProperties {
private BigDecimal taxRate; private BigDecimal taxRate;

View File

@ -7,13 +7,13 @@ import org.springframework.stereotype.Component;
import java.math.BigDecimal; import java.math.BigDecimal;
/** /**
* 章节费用配置 * 章节费用配置属性
* @author cd * @author cd
*/ */
@Component @Component
@Data @Data
@ConfigurationProperties(prefix = "book.price") @ConfigurationProperties(prefix = "book.price")
public class BookPriceConfig { public class BookPriceProperties {
private BigDecimal wordCount; private BigDecimal wordCount;

View File

@ -9,5 +9,5 @@ import org.springframework.jmx.support.RegistrationPolicy;
*/ */
@Configuration @Configuration
@EnableMBeanExport(registration= RegistrationPolicy.IGNORE_EXISTING) @EnableMBeanExport(registration= RegistrationPolicy.IGNORE_EXISTING)
public class FdfsConfiguration { public class FdfsConfig {
} }

View File

@ -0,0 +1,23 @@
package com.java2nb.novel.core.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
/**
* 线程池配置
* @author xiongxiaoyang
*/
@Configuration
public class ThreadPoolConfig {
@Bean
public ThreadPoolExecutor threadPoolExecutor(ThreadPoolProperties properties){
return new ThreadPoolExecutor(properties.getCorePoolSize(),properties.getMaximumPoolSize(),properties.getKeepAliveTime()
, TimeUnit.SECONDS, new LinkedBlockingDeque<>(properties.getQueueSize()),new ThreadPoolExecutor.AbortPolicy());
}
}

View File

@ -0,0 +1,22 @@
package com.java2nb.novel.core.config;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
* 线程池配置属性
* @author xiongxiaoyang
*/
@Data
@Component
@ConfigurationProperties(prefix = "thread.pool")
public class ThreadPoolProperties {
private Integer corePoolSize;
private Integer maximumPoolSize;
private Long keepAliveTime;
private Integer queueSize;
}

View File

@ -10,7 +10,7 @@ import org.springframework.stereotype.Component;
@Data @Data
@Component @Component
@ConfigurationProperties(prefix="website") @ConfigurationProperties(prefix="website")
public class WebsiteConfig { public class WebsiteProperties {
private String name; private String name;
private String domain; private String domain;

View File

@ -1,6 +1,6 @@
package com.java2nb.novel.core.listener; package com.java2nb.novel.core.listener;
import com.java2nb.novel.core.config.WebsiteConfig; import com.java2nb.novel.core.config.WebsiteProperties;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@ -17,7 +17,7 @@ import javax.servlet.annotation.WebListener;
@RequiredArgsConstructor @RequiredArgsConstructor
public class StarterListener implements ServletContextListener { public class StarterListener implements ServletContextListener {
private final WebsiteConfig websiteConfig; private final WebsiteProperties websiteConfig;
@Override @Override

View File

@ -1,7 +1,6 @@
package com.java2nb.novel.core.schedule; package com.java2nb.novel.core.schedule;
import com.java2nb.novel.core.config.AuthorIncomeConfig;
import com.java2nb.novel.core.utils.DateUtil; import com.java2nb.novel.core.utils.DateUtil;
import com.java2nb.novel.entity.Author; import com.java2nb.novel.entity.Author;
import com.java2nb.novel.entity.AuthorIncomeDetail; import com.java2nb.novel.entity.AuthorIncomeDetail;

View File

@ -1,19 +1,17 @@
package com.java2nb.novel.core.schedule; package com.java2nb.novel.core.schedule;
import com.java2nb.novel.core.config.AuthorIncomeConfig; import com.java2nb.novel.core.config.AuthorIncomeProperties;
import com.java2nb.novel.core.utils.DateUtil; import com.java2nb.novel.core.utils.DateUtil;
import com.java2nb.novel.entity.*; import com.java2nb.novel.entity.*;
import com.java2nb.novel.service.AuthorService; import com.java2nb.novel.service.AuthorService;
import com.java2nb.novel.service.BookService; import com.java2nb.novel.service.BookService;
import com.java2nb.novel.service.UserService;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled; import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
@ -31,7 +29,7 @@ public class MonthIncomeStaSchedule {
private final BookService bookService; private final BookService bookService;
private final AuthorIncomeConfig authorIncomeConfig; private final AuthorIncomeProperties authorIncomeConfig;
/** /**
* 每个月1号凌晨2点统计上个月数据 * 每个月1号凌晨2点统计上个月数据

View File

@ -1,11 +1,10 @@
package com.java2nb.novel.mapper; package com.java2nb.novel.mapper;
import com.java2nb.novel.entity.Book; import com.java2nb.novel.entity.Book;
import com.java2nb.novel.search.BookSP; import com.java2nb.novel.vo.BookSpVO;
import com.java2nb.novel.vo.BookVO; import com.java2nb.novel.vo.BookVO;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
import java.util.Date;
import java.util.List; import java.util.List;
/** /**
@ -14,7 +13,7 @@ import java.util.List;
public interface FrontBookMapper extends BookMapper { public interface FrontBookMapper extends BookMapper {
List<BookVO> searchByPage(BookSP params); List<BookVO> searchByPage(BookSpVO params);
void addVisitCount(@Param("bookId") Long bookId, @Param("visitCount") Integer visitCount); void addVisitCount(@Param("bookId") Long bookId, @Param("visitCount") Integer visitCount);

View File

@ -19,7 +19,10 @@ import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import java.io.Serializable;
import java.util.List; import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ThreadPoolExecutor;
/** /**
* @author 11797 * @author 11797
@ -37,6 +40,8 @@ public class PageController extends BaseController {
private final UserService userService; private final UserService userService;
private final ThreadPoolExecutor threadPoolExecutor;
@RequestMapping("{url}.html") @RequestMapping("{url}.html")
public String module(@PathVariable("url") String url) { public String module(@PathVariable("url") String url) {
@ -44,9 +49,9 @@ public class PageController extends BaseController {
} }
@RequestMapping("{module}/{url}.html") @RequestMapping("{module}/{url}.html")
public String module2(@PathVariable("module") String module, @PathVariable("url") String url,HttpServletRequest request) { public String module2(@PathVariable("module") String module, @PathVariable("url") String url, HttpServletRequest request) {
if(request.getRequestURI().startsWith("/author")) { if (request.getRequestURI().startsWith("/author")) {
//访问作者专区 //访问作者专区
UserDetails user = getUserDetails(request); UserDetails user = getUserDetails(request);
if (user == null) { if (user == null) {
@ -56,7 +61,7 @@ public class PageController extends BaseController {
boolean isAuthor = authorService.isAuthor(user.getId()); boolean isAuthor = authorService.isAuthor(user.getId());
if (!isAuthor) { if (!isAuthor) {
return "redirect:/author/register.html" ; return "redirect:/author/register.html";
} }
} }
@ -70,15 +75,15 @@ public class PageController extends BaseController {
/** /**
* 首页 * 首页
* */ */
@RequestMapping(path = {"/", "/index", "/index.html"}) @RequestMapping(path = {"/", "/index", "/index.html"})
public String index() { public String index() {
return ThreadLocalUtil.getTemplateDir()+"index"; return ThreadLocalUtil.getTemplateDir() + "index";
} }
/** /**
* 作品页 * 作品页
* */ */
@RequestMapping("book/bookclass.html") @RequestMapping("book/bookclass.html")
public String bookClass() { public String bookClass() {
return "book/bookclass"; return "book/bookclass";
@ -86,129 +91,170 @@ public class PageController extends BaseController {
/** /**
* 排行页 * 排行页
* */ */
@RequestMapping("book/book_ranking.html") @RequestMapping("book/book_ranking.html")
public String bookRank() { public String bookRank() {
return ThreadLocalUtil.getTemplateDir()+"book/book_ranking"; return ThreadLocalUtil.getTemplateDir() + "book/book_ranking";
} }
/** /**
* 详情页 * 详情页
* */ */
@SneakyThrows @SneakyThrows
@RequestMapping("/book/{bookId}.html") @RequestMapping("/book/{bookId}.html")
public String bookDetail(@PathVariable("bookId") Long bookId, Model model) { public String bookDetail(@PathVariable("bookId") Long bookId, Model model) {
Book book = bookService.queryBookDetail(bookId); Book book = bookService.queryBookDetail(bookId);
model.addAttribute("book",book); model.addAttribute("book", book);
if(book.getLastIndexId() != null) { if (book.getLastIndexId() != null) {
//查询首章目录ID //查询首章目录ID
Long firstBookIndexId = bookService.queryFirstBookIndexId(bookId); Long firstBookIndexId = bookService.queryFirstBookIndexId(bookId);
model.addAttribute("firstBookIndexId", firstBookIndexId); model.addAttribute("firstBookIndexId", firstBookIndexId);
} }
return ThreadLocalUtil.getTemplateDir()+"book/book_detail"; return ThreadLocalUtil.getTemplateDir() + "book/book_detail";
} }
/** /**
* 目录页 * 目录页
* */ */
@SneakyThrows @SneakyThrows
@RequestMapping("/book/indexList-{bookId}.html") @RequestMapping("/book/indexList-{bookId}.html")
public String indexList(@PathVariable("bookId") Long bookId, Model model) { public String indexList(@PathVariable("bookId") Long bookId, Model model) {
Book book = bookService.queryBookDetail(bookId); Book book = bookService.queryBookDetail(bookId);
model.addAttribute("book",book); model.addAttribute("book", book);
List<BookIndex> bookIndexList = bookService.queryIndexList(bookId,null,1,null); List<BookIndex> bookIndexList = bookService.queryIndexList(bookId, null, 1, null);
model.addAttribute("bookIndexList",bookIndexList); model.addAttribute("bookIndexList", bookIndexList);
model.addAttribute("bookIndexCount",bookIndexList.size()); model.addAttribute("bookIndexCount", bookIndexList.size());
return ThreadLocalUtil.getTemplateDir()+"book/book_index"; return ThreadLocalUtil.getTemplateDir() + "book/book_index";
} }
/** /**
* 内容页 * 内容页
* */ */
@SneakyThrows @SneakyThrows
@RequestMapping("/book/{bookId}/{bookIndexId}.html") @RequestMapping("/book/{bookId}/{bookIndexId}.html")
public String indexList(@PathVariable("bookId") Long bookId,@PathVariable("bookIndexId") Long bookIndexId, HttpServletRequest request, Model model) { public String indexList(@PathVariable("bookId") Long bookId, @PathVariable("bookIndexId") Long bookIndexId, HttpServletRequest request, Model model) {
//查询书籍
Book book = bookService.queryBookDetail(bookId);
//查询目录
BookIndex bookIndex = bookService.queryBookIndex(bookIndexId);
model.addAttribute("book",book);
model.addAttribute("bookIndex",bookIndex);
//查询上一章节目录ID
Long preBookIndexId = bookService.queryPreBookIndexId(bookId,bookIndex.getIndexNum());
model.addAttribute("preBookIndexId",preBookIndexId);
//查询下一章目录ID
Long nextBookIndexId = bookService.queryNextBookIndexId(bookId,bookIndex.getIndexNum());
model.addAttribute("nextBookIndexId",nextBookIndexId);
//查询内容
BookContent bookContent = bookService.queryBookContent(bookIndex.getId());
model.addAttribute("bookContent",bookContent);
boolean needBuy = false;
//判断该目录是否收费 //加载小说基本信息线程
if(bookIndex.getIsVip()!=null && bookIndex.getIsVip() == 1 ){ CompletableFuture<Book> bookCompletableFuture = CompletableFuture.supplyAsync(() -> {
UserDetails user = getUserDetails(request); //查询书籍
if(user == null){ Book book = bookService.queryBookDetail(bookId);
//未登录 log.debug("加载小说基本信息线程结束");
return "redirect:/user/login.html?originUrl="+request.getRequestURI(); return book;
}, threadPoolExecutor);
//加载小说章节信息线程
CompletableFuture<BookIndex> bookIndexCompletableFuture = CompletableFuture.supplyAsync(() -> {
//查询目录
BookIndex bookIndex = bookService.queryBookIndex(bookIndexId);
log.debug("加载小说章节信息线程结束");
return bookIndex;
}, threadPoolExecutor);
//加载小说上一章节信息线程,该线程在加载小说章节信息线程执行完毕后才执行
CompletableFuture<Long> preBookIndexIdCompletableFuture = bookIndexCompletableFuture.thenApplyAsync((bookIndex) -> {
//查询上一章节目录ID
Long preBookIndexId = bookService.queryPreBookIndexId(bookId, bookIndex.getIndexNum());
log.debug("加载小说上一章节信息线程结束");
return preBookIndexId;
}, threadPoolExecutor);
//加载小说下一章节信息线程,该线程在加载小说章节信息线程执行完毕后才执行
CompletableFuture<Long> nextBookIndexIdCompletableFuture = bookIndexCompletableFuture.thenApplyAsync((bookIndex) -> {
//查询下一章目录ID
Long nextBookIndexId = bookService.queryNextBookIndexId(bookId, bookIndex.getIndexNum());
log.debug("加载小说下一章节信息线程结束");
return nextBookIndexId;
}, threadPoolExecutor);
//加载小说内容信息线程
CompletableFuture<BookContent> bookContentCompletableFuture = CompletableFuture.supplyAsync(() -> {
//查询内容
BookContent bookContent = bookService.queryBookContent(bookIndexId);
log.debug("加载小说内容信息线程结束");
return bookContent;
}, threadPoolExecutor);
//判断用户是否需要购买线程,该线程在加载小说章节信息线程执行完毕后才执行
CompletableFuture<Boolean> needBuyCompletableFuture = bookIndexCompletableFuture.thenApplyAsync((bookIndex) -> {
//判断该目录是否收费
if (bookIndex.getIsVip() != null && bookIndex.getIsVip() == 1) {
//收费
UserDetails user = getUserDetails(request);
if (user == null) {
//未登录,需要购买
return true;
}
//判断用户是否购买过该目录
boolean isBuy = userService.queryIsBuyBookIndex(user.getId(), bookIndexId);
if (!isBuy) {
//没有购买过,需要购买
return true;
}
} }
//收费,判断用户是否购买过该目录
boolean isBuy = userService.queryIsBuyBookIndex(user.getId(),bookIndexId); log.debug("判断用户是否需要购买线程结束");
if(!isBuy){ return false;
//没有购买过,需要购买
bookContent.setContent(null); }, threadPoolExecutor);
needBuy = true;
}
} model.addAttribute("book", bookCompletableFuture.get());
model.addAttribute("needBuy",needBuy); model.addAttribute("bookIndex", bookIndexCompletableFuture.get());
return ThreadLocalUtil.getTemplateDir()+"book/book_content"; model.addAttribute("preBookIndexId", preBookIndexIdCompletableFuture.get());
model.addAttribute("nextBookIndexId", nextBookIndexIdCompletableFuture.get());
model.addAttribute("bookContent", bookContentCompletableFuture.get());
model.addAttribute("needBuy", needBuyCompletableFuture.get());
return ThreadLocalUtil.getTemplateDir() + "book/book_content";
} }
/** /**
* 评论页面 * 评论页面
* */ */
@RequestMapping("/book/comment-{bookId}.html") @RequestMapping("/book/comment-{bookId}.html")
public String commentList(@PathVariable("bookId") Long bookId, Model model) { public String commentList(@PathVariable("bookId") Long bookId, Model model) {
//查询书籍 //查询书籍
Book book = bookService.queryBookDetail(bookId); Book book = bookService.queryBookDetail(bookId);
model.addAttribute("book",book); model.addAttribute("book", book);
return "book/book_comment"; return "book/book_comment";
} }
/** /**
* 新闻内容页面 * 新闻内容页面
* */ */
@RequestMapping("/about/newsInfo-{newsId}.html") @RequestMapping("/about/newsInfo-{newsId}.html")
public String newsInfo(@PathVariable("newsId") Long newsId, Model model) { public String newsInfo(@PathVariable("newsId") Long newsId, Model model) {
//查询新闻 //查询新闻
News news = newsService.queryNewsInfo(newsId); News news = newsService.queryNewsInfo(newsId);
model.addAttribute("news",news); model.addAttribute("news", news);
return "about/news_info"; return "about/news_info";
} }
/** /**
* 作者注册页面 * 作者注册页面
* */ */
@RequestMapping("author/register.html") @RequestMapping("author/register.html")
public String authorRegister(Author author, HttpServletRequest request, Model model){ public String authorRegister(Author author, HttpServletRequest request, Model model) {
UserDetails user = getUserDetails(request); UserDetails user = getUserDetails(request);
if(user == null){ if (user == null) {
//未登录 //未登录
return "redirect:/user/login.html?originUrl=/author/register.html"; return "redirect:/user/login.html?originUrl=/author/register.html";
} }
if(StringUtils.isNotBlank(author.getInviteCode())) { if (StringUtils.isNotBlank(author.getInviteCode())) {
//提交作者注册信息 //提交作者注册信息
String errorInfo = authorService.register(user.getId(), author); String errorInfo = authorService.register(user.getId(), author);
if(StringUtils.isBlank(errorInfo)){ if (StringUtils.isBlank(errorInfo)) {
//注册成功 //注册成功
return "redirect:/author/index.html"; return "redirect:/author/index.html";
} }
model.addAttribute("LabErr",errorInfo); model.addAttribute("LabErr", errorInfo);
model.addAttribute("author",author); model.addAttribute("author", author);
} }
return "author/register"; return "author/register";
} }

View File

@ -1,6 +1,7 @@
package com.java2nb.novel.service; package com.java2nb.novel.service;
import com.java2nb.novel.core.bean.PageBean;
import com.java2nb.novel.entity.Author; import com.java2nb.novel.entity.Author;
import com.java2nb.novel.entity.AuthorIncome; import com.java2nb.novel.entity.AuthorIncome;
import com.java2nb.novel.entity.AuthorIncomeDetail; import com.java2nb.novel.entity.AuthorIncomeDetail;
@ -111,9 +112,9 @@ public interface AuthorService {
* @param bookId 小说ID * @param bookId 小说ID
* @param startTime 开始时间 * @param startTime 开始时间
* @param endTime 结束时间 * @param endTime 结束时间
* @return 日收入统计数据列表 * @return 日收入统计数据分页数据
*/ */
List<AuthorIncomeDetail> listIncomeDailyByPage(int page, int pageSize, Long userId, Long bookId, Date startTime, Date endTime); PageBean<AuthorIncomeDetail> listIncomeDailyByPage(int page, int pageSize, Long userId, Long bookId, Date startTime, Date endTime);
/** /**
@ -122,7 +123,7 @@ public interface AuthorService {
* @param pageSize 分页大小 * @param pageSize 分页大小
* @param userId 用户ID * @param userId 用户ID
* @param bookId 小说ID * @param bookId 小说ID
* @return * @return 分页数据
* */ * */
List<AuthorIncome> listIncomeMonthByPage(int page, int pageSize, Long userId, Long bookId); PageBean<AuthorIncome> listIncomeMonthByPage(int page, int pageSize, Long userId, Long bookId);
} }

View File

@ -2,7 +2,8 @@ package com.java2nb.novel.service;
import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInfo;
import com.java2nb.novel.search.BookSP; import com.java2nb.novel.core.bean.PageBean;
import com.java2nb.novel.vo.BookSpVO;
import com.java2nb.novel.vo.BookCommentVO; import com.java2nb.novel.vo.BookCommentVO;
import com.java2nb.novel.vo.BookSettingVO; import com.java2nb.novel.vo.BookSettingVO;
import com.java2nb.novel.entity.*; import com.java2nb.novel.entity.*;
@ -48,7 +49,7 @@ public interface BookService {
* @param pageSize 分页大小 * @param pageSize 分页大小
* @return 小说集合分页信息 * @return 小说集合分页信息
* */ * */
PageInfo searchByPage(BookSP params, int page, int pageSize); PageBean searchByPage(BookSpVO params, int page, int pageSize);
/** /**
* 查询小说分类列表 * 查询小说分类列表
@ -144,9 +145,9 @@ public interface BookService {
* @param bookId 书籍ID * @param bookId 书籍ID
* @param page 页码 * @param page 页码
* @param pageSize 分页大小 * @param pageSize 分页大小
* @return 评论集合 * @return 评论分页数据
* */ * */
List<BookCommentVO> listCommentByPage(Long userId, Long bookId, int page, int pageSize); PageBean<BookCommentVO> listCommentByPage(Long userId, Long bookId, int page, int pageSize);
/** /**
* 新增评价 * 新增评价
@ -202,9 +203,9 @@ public interface BookService {
* @param userId 用户ID * @param userId 用户ID
* @param page 页码 * @param page 页码
* @param pageSize 分页大小 * @param pageSize 分页大小
* @return 小说集合 * @return 小说分页数据
* */ * */
List<Book> listBookPageByUserId(Long userId, int page, int pageSize); PageBean<Book> listBookPageByUserId(Long userId, int page, int pageSize);
/** /**
* 发布小说 * 发布小说

View File

@ -1,6 +1,7 @@
package com.java2nb.novel.service; package com.java2nb.novel.service;
import com.java2nb.novel.core.bean.PageBean;
import com.java2nb.novel.entity.News; import com.java2nb.novel.entity.News;
import com.java2nb.novel.vo.NewsVO; import com.java2nb.novel.vo.NewsVO;
@ -28,7 +29,7 @@ public interface NewsService {
* 分页查询新闻列表 * 分页查询新闻列表
* @param page 页码 * @param page 页码
* @param pageSize 分页大小 * @param pageSize 分页大小
* @return 新闻集合 * @return 新闻分页数据
* */ * */
List<NewsVO> listByPage(int page, int pageSize); PageBean<News> listByPage(int page, int pageSize);
} }

View File

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

View File

@ -1,8 +1,10 @@
package com.java2nb.novel.service; package com.java2nb.novel.service;
import com.java2nb.novel.core.bean.PageBean;
import com.java2nb.novel.core.bean.UserDetails; import com.java2nb.novel.core.bean.UserDetails;
import com.java2nb.novel.entity.UserBuyRecord; import com.java2nb.novel.entity.UserBuyRecord;
import com.java2nb.novel.entity.UserFeedback;
import com.java2nb.novel.vo.BookReadHistoryVO; import com.java2nb.novel.vo.BookReadHistoryVO;
import com.java2nb.novel.vo.BookShelfVO; import com.java2nb.novel.vo.BookShelfVO;
import com.java2nb.novel.entity.User; import com.java2nb.novel.entity.User;
@ -58,9 +60,9 @@ public interface UserService {
* @param userId 用户ID * @param userId 用户ID
* @param page * @param page
* @param pageSize * @param pageSize
* @return 书架集合 * @return 书架分页信息
* */ * */
List<BookShelfVO> listBookShelfByPage(Long userId, int page, int pageSize); PageBean<BookShelfVO> listBookShelfByPage(Long userId, int page, int pageSize);
/** /**
* 添加阅读记录 * 添加阅读记录
@ -82,9 +84,9 @@ public interface UserService {
* @param userId 用户ID * @param userId 用户ID
* @param page 页码 * @param page 页码
* @param pageSize 分页大小 * @param pageSize 分页大小
* @return 反馈集合 * @return 反馈分页数据
* */ * */
List<UserFeedbackVO> listUserFeedBackByPage(Long userId, int page, int pageSize); PageBean<UserFeedback> listUserFeedBackByPage(Long userId, int page, int pageSize);
/** /**
* 查询个人信息 * 查询个人信息
@ -98,9 +100,9 @@ public interface UserService {
* @param userId 用户id * @param userId 用户id
* @param page 页码 * @param page 页码
* @param pageSize 分页大小 * @param pageSize 分页大小
* @return * @return 分页数据
* */ * */
List<BookReadHistoryVO> listReadHistoryByPage(Long userId, int page, int pageSize); PageBean<BookReadHistoryVO> listReadHistoryByPage(Long userId, int page, int pageSize);
/** /**
* 更新个人信息 * 更新个人信息

View File

@ -1,6 +1,7 @@
package com.java2nb.novel.service.impl; package com.java2nb.novel.service.impl;
import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageHelper;
import com.java2nb.novel.core.bean.PageBean;
import com.java2nb.novel.core.cache.CacheKey; import com.java2nb.novel.core.cache.CacheKey;
import com.java2nb.novel.core.cache.CacheService; import com.java2nb.novel.core.cache.CacheService;
import com.java2nb.novel.core.enums.ResponseStatus; import com.java2nb.novel.core.enums.ResponseStatus;
@ -170,9 +171,9 @@ public class AuthorServiceImpl implements AuthorService {
@Override @Override
public List<AuthorIncomeDetail> listIncomeDailyByPage(int page, int pageSize, Long userId, Long bookId, Date startTime, Date endTime) { public PageBean<AuthorIncomeDetail> listIncomeDailyByPage(int page, int pageSize, Long userId, Long bookId, Date startTime, Date endTime) {
PageHelper.startPage(page, pageSize); PageHelper.startPage(page, pageSize);
return authorIncomeDetailMapper.selectMany( return new PageBean<>(authorIncomeDetailMapper.selectMany(
select(AuthorIncomeDetailDynamicSqlSupport.incomeDate, AuthorIncomeDetailDynamicSqlSupport.incomeAccount select(AuthorIncomeDetailDynamicSqlSupport.incomeDate, AuthorIncomeDetailDynamicSqlSupport.incomeAccount
, AuthorIncomeDetailDynamicSqlSupport.incomeCount, AuthorIncomeDetailDynamicSqlSupport.incomeNumber) , AuthorIncomeDetailDynamicSqlSupport.incomeCount, AuthorIncomeDetailDynamicSqlSupport.incomeNumber)
.from(AuthorIncomeDetailDynamicSqlSupport.authorIncomeDetail) .from(AuthorIncomeDetailDynamicSqlSupport.authorIncomeDetail)
@ -182,14 +183,14 @@ public class AuthorServiceImpl implements AuthorService {
.and(AuthorIncomeDetailDynamicSqlSupport.incomeDate, isLessThanOrEqualTo(endTime)) .and(AuthorIncomeDetailDynamicSqlSupport.incomeDate, isLessThanOrEqualTo(endTime))
.orderBy(AuthorIncomeDetailDynamicSqlSupport.incomeDate.descending()) .orderBy(AuthorIncomeDetailDynamicSqlSupport.incomeDate.descending())
.build() .build()
.render(RenderingStrategies.MYBATIS3)); .render(RenderingStrategies.MYBATIS3)));
} }
@Override @Override
public List<AuthorIncome> listIncomeMonthByPage(int page, int pageSize, Long userId, Long bookId) { public PageBean<AuthorIncome> listIncomeMonthByPage(int page, int pageSize, Long userId, Long bookId) {
PageHelper.startPage(page, pageSize); PageHelper.startPage(page, pageSize);
return authorIncomeMapper.selectMany(select(AuthorIncomeDynamicSqlSupport.incomeMonth return new PageBean<>(authorIncomeMapper.selectMany(select(AuthorIncomeDynamicSqlSupport.incomeMonth
, AuthorIncomeDynamicSqlSupport.preTaxIncome , AuthorIncomeDynamicSqlSupport.preTaxIncome
, AuthorIncomeDynamicSqlSupport.afterTaxIncome , AuthorIncomeDynamicSqlSupport.afterTaxIncome
, AuthorIncomeDynamicSqlSupport.payStatus , AuthorIncomeDynamicSqlSupport.payStatus
@ -199,6 +200,6 @@ public class AuthorServiceImpl implements AuthorService {
.and(AuthorIncomeDynamicSqlSupport.bookId, isEqualTo(bookId)) .and(AuthorIncomeDynamicSqlSupport.bookId, isEqualTo(bookId))
.orderBy(AuthorIncomeDynamicSqlSupport.incomeMonth.descending()) .orderBy(AuthorIncomeDynamicSqlSupport.incomeMonth.descending())
.build() .build()
.render(RenderingStrategies.MYBATIS3)); .render(RenderingStrategies.MYBATIS3)));
} }
} }

View File

@ -3,16 +3,17 @@ package com.java2nb.novel.service.impl;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInfo;
import com.java2nb.novel.core.bean.PageBean;
import com.java2nb.novel.core.cache.CacheKey; import com.java2nb.novel.core.cache.CacheKey;
import com.java2nb.novel.core.cache.CacheService; import com.java2nb.novel.core.cache.CacheService;
import com.java2nb.novel.core.config.BookPriceConfig; import com.java2nb.novel.core.config.BookPriceProperties;
import com.java2nb.novel.core.enums.ResponseStatus; import com.java2nb.novel.core.enums.ResponseStatus;
import com.java2nb.novel.core.exception.BusinessException; import com.java2nb.novel.core.exception.BusinessException;
import com.java2nb.novel.core.utils.*; import com.java2nb.novel.core.utils.*;
import com.java2nb.novel.entity.*; import com.java2nb.novel.entity.*;
import com.java2nb.novel.entity.Book; import com.java2nb.novel.entity.Book;
import com.java2nb.novel.mapper.*; import com.java2nb.novel.mapper.*;
import com.java2nb.novel.search.BookSP; import com.java2nb.novel.vo.BookSpVO;
import com.java2nb.novel.service.AuthorService; import com.java2nb.novel.service.AuthorService;
import com.java2nb.novel.service.BookService; import com.java2nb.novel.service.BookService;
import com.java2nb.novel.service.FileService; import com.java2nb.novel.service.FileService;
@ -89,7 +90,7 @@ public class BookServiceImpl implements BookService {
private final FileService fileService; private final FileService fileService;
private final BookPriceConfig bookPriceConfig; private final BookPriceProperties bookPriceConfig;
@SneakyThrows @SneakyThrows
@ -186,7 +187,7 @@ public class BookServiceImpl implements BookService {
} }
@Override @Override
public PageInfo searchByPage(BookSP params, int page, int pageSize) { public PageBean searchByPage(BookSpVO params, int page, int pageSize) {
if (params.getUpdatePeriod() != null) { if (params.getUpdatePeriod() != null) {
@ -213,7 +214,7 @@ public class BookServiceImpl implements BookService {
if (StringUtils.isNotBlank(params.getSort())) { if (StringUtils.isNotBlank(params.getSort())) {
OrderByHelper.orderBy(params.getSort() + " desc"); OrderByHelper.orderBy(params.getSort() + " desc");
} }
return new PageInfo<>(bookMapper.searchByPage(params)); return new PageBean(bookMapper.searchByPage(params));
} }
@ -382,10 +383,10 @@ public class BookServiceImpl implements BookService {
} }
@Override @Override
public List<BookCommentVO> listCommentByPage(Long userId, Long bookId, int page, int pageSize) { public PageBean<BookCommentVO> listCommentByPage(Long userId, Long bookId, int page, int pageSize) {
PageHelper.startPage(page, pageSize); PageHelper.startPage(page, pageSize);
OrderByHelper.orderBy("t1.create_time desc"); OrderByHelper.orderBy("t1.create_time desc");
return bookCommentMapper.listCommentByPage(userId, bookId); return new PageBean<>(bookCommentMapper.listCommentByPage(userId, bookId));
} }
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
@ -491,7 +492,7 @@ public class BookServiceImpl implements BookService {
} }
@Override @Override
public List<Book> listBookPageByUserId(Long userId, int page, int pageSize) { public PageBean<Book> listBookPageByUserId(Long userId, int page, int pageSize) {
PageHelper.startPage(page, pageSize); PageHelper.startPage(page, pageSize);
@ -501,7 +502,7 @@ public class BookServiceImpl implements BookService {
.orderBy(BookDynamicSqlSupport.createTime.descending()) .orderBy(BookDynamicSqlSupport.createTime.descending())
.build() .build()
.render(RenderingStrategies.MYBATIS3); .render(RenderingStrategies.MYBATIS3);
return bookMapper.selectMany(selectStatement); return new PageBean<>(bookMapper.selectMany(selectStatement));
} }

View File

@ -1,6 +1,7 @@
package com.java2nb.novel.service.impl; package com.java2nb.novel.service.impl;
import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageHelper;
import com.java2nb.novel.core.bean.PageBean;
import com.java2nb.novel.core.utils.BeanUtil; import com.java2nb.novel.core.utils.BeanUtil;
import com.java2nb.novel.service.NewsService; import com.java2nb.novel.service.NewsService;
import com.java2nb.novel.core.cache.CacheKey; import com.java2nb.novel.core.cache.CacheKey;
@ -59,14 +60,16 @@ public class NewsServiceImpl implements NewsService {
} }
@Override @Override
public List<NewsVO> listByPage(int page, int pageSize) { public PageBean<News> listByPage(int page, int pageSize) {
PageHelper.startPage(page,pageSize); PageHelper.startPage(page,pageSize);
SelectStatementProvider selectStatement = select(id, catName, catId, title,createTime) SelectStatementProvider selectStatement = select(id, catName, catId, title,createTime)
.from(news) .from(news)
.orderBy(createTime.descending()) .orderBy(createTime.descending())
.build() .build()
.render(RenderingStrategies.MYBATIS3); .render(RenderingStrategies.MYBATIS3);
List<News> news = newsMapper.selectMany(selectStatement);
return BeanUtil.copyList(newsMapper.selectMany(selectStatement),NewsVO.class); PageBean<News> pageBean = new PageBean<>(news);
pageBean.setList(BeanUtil.copyList(news,NewsVO.class));
return pageBean;
} }
} }

View File

@ -3,12 +3,14 @@ package com.java2nb.novel.service.impl;
import com.fasterxml.jackson.databind.JavaType; import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInfo;
import com.java2nb.novel.core.bean.PageBean;
import com.java2nb.novel.core.enums.ResponseStatus; import com.java2nb.novel.core.enums.ResponseStatus;
import com.java2nb.novel.core.exception.BusinessException; import com.java2nb.novel.core.exception.BusinessException;
import com.java2nb.novel.core.utils.StringUtil; import com.java2nb.novel.core.utils.StringUtil;
import com.java2nb.novel.entity.Book; import com.java2nb.novel.entity.Book;
import com.java2nb.novel.search.BookSP; import com.java2nb.novel.vo.BookSpVO;
import com.java2nb.novel.service.SearchService; import com.java2nb.novel.service.SearchService;
import com.java2nb.novel.vo.BookVO;
import com.java2nb.novel.vo.EsBookVO; import com.java2nb.novel.vo.EsBookVO;
import io.searchbox.client.JestClient; import io.searchbox.client.JestClient;
import io.searchbox.core.Count; import io.searchbox.core.Count;
@ -71,7 +73,7 @@ public class SearchServiceImpl implements SearchService {
@SneakyThrows @SneakyThrows
@Override @Override
public PageInfo searchBook(BookSP params, int page, int pageSize) { public PageBean<EsBookVO> searchBook(BookSpVO params, int page, int pageSize) {
List<EsBookVO> bookList = new ArrayList<>(0); List<EsBookVO> bookList = new ArrayList<>(0);
//使用搜索引擎搜索 //使用搜索引擎搜索
@ -199,11 +201,7 @@ public class SearchServiceImpl implements SearchService {
} }
} }
PageInfo<EsBookVO> pageInfo = new PageInfo<>(bookList); return new PageBean<>(page,pageSize,total.longValue(),bookList);
pageInfo.setTotal(total.longValue());
pageInfo.setPageNum(page);
pageInfo.setPageSize(pageSize);
return pageInfo;
} }
throw new BusinessException(ResponseStatus.ES_SEARCH_FAIL); throw new BusinessException(ResponseStatus.ES_SEARCH_FAIL);
} }

View File

@ -1,6 +1,7 @@
package com.java2nb.novel.service.impl; package com.java2nb.novel.service.impl;
import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageHelper;
import com.java2nb.novel.core.bean.PageBean;
import com.java2nb.novel.core.bean.UserDetails; import com.java2nb.novel.core.bean.UserDetails;
import com.java2nb.novel.core.utils.BeanUtil; import com.java2nb.novel.core.utils.BeanUtil;
import com.java2nb.novel.entity.*; import com.java2nb.novel.entity.*;
@ -147,9 +148,9 @@ public class UserServiceImpl implements UserService {
} }
@Override @Override
public List<BookShelfVO> listBookShelfByPage(Long userId, int page, int pageSize) { public PageBean<BookShelfVO> listBookShelfByPage(Long userId, int page, int pageSize) {
PageHelper.startPage(page, pageSize); PageHelper.startPage(page, pageSize);
return userBookshelfMapper.listBookShelf(userId); return new PageBean<>(userBookshelfMapper.listBookShelf(userId));
} }
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
@ -201,7 +202,7 @@ public class UserServiceImpl implements UserService {
} }
@Override @Override
public List<UserFeedbackVO> listUserFeedBackByPage(Long userId, int page, int pageSize) { public PageBean<UserFeedback> listUserFeedBackByPage(Long userId, int page, int pageSize) {
PageHelper.startPage(page, pageSize); PageHelper.startPage(page, pageSize);
SelectStatementProvider selectStatement = select(UserFeedbackDynamicSqlSupport.content, UserFeedbackDynamicSqlSupport.createTime) SelectStatementProvider selectStatement = select(UserFeedbackDynamicSqlSupport.content, UserFeedbackDynamicSqlSupport.createTime)
.from(userFeedback) .from(userFeedback)
@ -209,7 +210,10 @@ public class UserServiceImpl implements UserService {
.orderBy(UserFeedbackDynamicSqlSupport.id.descending()) .orderBy(UserFeedbackDynamicSqlSupport.id.descending())
.build() .build()
.render(RenderingStrategies.MYBATIS3); .render(RenderingStrategies.MYBATIS3);
return BeanUtil.copyList(userFeedbackMapper.selectMany(selectStatement),UserFeedbackVO.class); List<UserFeedback> userFeedbacks = userFeedbackMapper.selectMany(selectStatement);
PageBean<UserFeedback> pageBean = new PageBean<>(userFeedbacks);
pageBean.setList(BeanUtil.copyList(userFeedbacks,UserFeedbackVO.class));
return pageBean;
} }
@Override @Override
@ -223,9 +227,9 @@ public class UserServiceImpl implements UserService {
} }
@Override @Override
public List<BookReadHistoryVO> listReadHistoryByPage(Long userId, int page, int pageSize) { public PageBean<BookReadHistoryVO> listReadHistoryByPage(Long userId, int page, int pageSize) {
PageHelper.startPage(page, pageSize); PageHelper.startPage(page, pageSize);
return userReadHistoryMapper.listReadHistory(userId); return new PageBean<>(userReadHistoryMapper.listReadHistory(userId));
} }
@Override @Override

View File

@ -1,4 +1,4 @@
package com.java2nb.novel.search; package com.java2nb.novel.vo;
import lombok.Data; import lombok.Data;
@ -9,7 +9,7 @@ import java.util.Date;
* @author 11797 * @author 11797
*/ */
@Data @Data
public class BookSP { public class BookSpVO {
private String keyword; private String keyword;

View File

@ -1,13 +1,7 @@
package com.java2nb.novel.vo; package com.java2nb.novel.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.java2nb.novel.entity.Book;
import lombok.Data; import lombok.Data;
import javax.annotation.Generated;
import java.io.Serializable;
import java.util.Date;
/** /**
* @author Administrator * @author Administrator
*/ */

View File

@ -1,3 +1,24 @@
spring: spring:
profiles: profiles:
include: [common-dev] include: [common-dev]
pic:
save:
type: 1 #图片保存方式, 1不保存使用爬取的网络图片 2保存在自己的存储介质
storage: local #存储介质local本地OSS阿里云对象存储fastDfs分布式文件系统
path: /Users/xiongxiaoyang/java #图片保存路径
#线程池配置
thread:
pool:
#核心线程池数量
core-pool-size: 10
#最大线程池数量
maximum-pool-size: 20
#线程超时时间
keep-alive-time: 10
#队列大小
queue-size: 100

View File

@ -0,0 +1,37 @@
spring:
profiles:
include: [common-prod]
#静态文件路径配置
resources:
static-locations: file:${user.dir}/templates/${templates.name}/static/
#thymeleaf模版路径配置
thymeleaf:
prefix: file:${user.dir}/templates/${templates.name}/html/
suffix: .html
#模版配置
templates:
name: orange
pic:
save:
type: 2 #图片保存方式, 1不保存使用爬取的网络图片 2保存在自己的存储介质
storage: local #存储介质local本地OSS阿里云对象存储fastDfs分布式文件系统
path: /var/pic #图片保存路径
#线程池配置
thread:
pool:
#核心线程池数量
core-pool-size: 10
#最大线程池数量
maximum-pool-size: 20
#线程超时时间
keep-alive-time: 10
#队列大小
queue-size: 1000

View File

@ -1,3 +0,0 @@
spring:
profiles:
include: [common-test]

View File

@ -3,7 +3,7 @@ website:
#网站名 #网站名
name: 小说精品屋 name: 小说精品屋
#域名 #域名
domain: xiongxyang.gitee.io/home domain: xiongxyang.gitee.io
#SEO关键词 #SEO关键词
keyword: ${website.name},小说,小说CMS,原创文学系统,开源小说系统,免费小说建站程序 keyword: ${website.name},小说,小说CMS,原创文学系统,开源小说系统,免费小说建站程序
#SEO描述 #SEO描述

View File

@ -25,13 +25,7 @@ spring:
jest: jest:
uris: http://192.168.0.105:9200 uris: http://192.168.0.105:9200
#thymeleaf模版路径配置
thymeleaf:
prefix: file:${user.dir}/templates/${templates.name}/html/
suffix: .html
#静态文件路径配置
resources:
static-locations: file:${user.dir}/templates/${templates.name}/static/
redisson: redisson:
singleServerConfig: singleServerConfig:
@ -76,9 +70,7 @@ book:
#模版配置
templates:
name: orange

View File

@ -3,7 +3,7 @@
<mapper namespace="com.java2nb.novel.mapper.FrontBookMapper"> <mapper namespace="com.java2nb.novel.mapper.FrontBookMapper">
<select id="searchByPage" parameterType="com.java2nb.novel.search.BookSP" resultType="com.java2nb.novel.vo.BookVO"> <select id="searchByPage" parameterType="com.java2nb.novel.vo.BookSpVO" resultType="com.java2nb.novel.vo.BookVO">
select select
id,cat_id,cat_name,book_name,author_id,author_name,word_count,last_index_id,last_index_name,score,pic_url,book_status,last_index_update_time,book_desc id,cat_id,cat_name,book_name,author_id,author_name,word_count,last_index_id,last_index_name,score,pic_url,book_status,last_index_update_time,book_desc
from book where word_count > 0 from book where word_count > 0

View File

@ -348,6 +348,7 @@
} else if(data.code == 1001){ } else if(data.code == 1001){
//未登录 //未登录
location.href = '/user/login.html?originUrl='+decodeURIComponent(location.href);
}else { }else {
layer.alert(data.msg); layer.alert(data.msg);

View File

@ -341,6 +341,8 @@
} else if(data.code == 1001){ } else if(data.code == 1001){
//未登录 //未登录
location.href = '/user/login.html?originUrl='+decodeURIComponent(location.href);
}else { }else {
layer.alert(data.msg); layer.alert(data.msg);

View File

@ -25,7 +25,14 @@
<div class="my_info cf"> <div class="my_info cf">
<div class="my_info_txt"> <div class="my_info_txt">
<ul class="mytab_list"> <ul class="mytab_list">
<li><i class="tit">我的头像</i><a href="javascript:void(0);"><img id="imgLogo" class="user_img" alt="我的头像" src="/images/man.png" /></a></li> <li ><i class="tit">我的头像</i>
<a style="position: relative" >
<img id="imgLogo" class="user_img" alt="我的头像" src="/images/man.png" />
<input class="opacity" onchange="picChange()" type="file" id="file0" name="file" title="点击上传图片" style="z-index: 100;cursor: pointer;left: 0px; top: -25px; width: 60px; height: 80px; opacity: 0; position: absolute; "/>
</a>
</li>
<li><i class="tit">我的昵称</i><a href="/user/set_name.html" id="my_name"></a></li> <li><i class="tit">我的昵称</i><a href="/user/set_name.html" id="my_name"></a></li>
<li style="display:none"><i class="tit">电子邮箱</i><a href="javascript:void(0);"></a></li> <li style="display:none"><i class="tit">电子邮箱</i><a href="javascript:void(0);"></a></li>
<li><i class="tit">我的性别</i><a href="/user/set_sex.html" id="my_sex"></a></li> <li><i class="tit">我的性别</i><a href="/user/set_sex.html" id="my_sex"></a></li>
@ -42,6 +49,7 @@
</div> </div>
<div th:replace="common/js :: js"></div> <div th:replace="common/js :: js"></div>
<script src="/javascript/user.js" type="text/javascript"></script> <script src="/javascript/user.js" type="text/javascript"></script>
<script src="/javascript/ajaxfileupload.js" type="text/javascript"></script>
<script type="text/javascript"> <script type="text/javascript">
//查询用户信息 //查询用户信息
$.ajax({ $.ajax({
@ -82,6 +90,58 @@
layer.alert('网络异常'); layer.alert('网络异常');
} }
}) })
function picChange() {
var file = $("#file0").val(); //文件名称
if (file != "") {
$.ajaxFileUpload({
url : "/file/upload", //用于文件上传的服务器端请求地址
secureuri : false, //是否需要安全协议一般设置为false
fileElementId : "file0", //文件上传域的ID
dataType : "json", //返回值类型 一般设置为json
type : "post",
success : function(data) { //服务器成功响应处理函数
if (data.code == 200) {
$.ajax({
type: "POST",
url: "/user/updateUserInfo",
data: {'userPhoto':data.data},
dataType: "json",
success: function (data) {
if (data.code == 200) {
window.location.href = '/user/setup.html';
} else if (data.code == 1001) {
//未登录
location.href = '/user/login.html?originUrl=' + decodeURIComponent(location.href);
} else {
layer.alert(data.msg);
}
},
error: function () {
layer.alert('网络异常');
}
})
}else {
layer.alert('图片上传失败');
}
}
});
} else {
alert("请选择上传文件!");
}
}
</script> </script>
</body> </body>
</html> </html>

View File

@ -5,7 +5,7 @@
<groupId>com.java2nb</groupId> <groupId>com.java2nb</groupId>
<artifactId>novel</artifactId> <artifactId>novel</artifactId>
<version>3.4.1</version> <version>3.5.1</version>
<modules> <modules>
<module>novel-common</module> <module>novel-common</module>
<module>novel-front</module> <module>novel-front</module>

View File

@ -348,6 +348,7 @@
} else if(data.code == 1001){ } else if(data.code == 1001){
//未登录 //未登录
location.href = '/user/login.html?originUrl='+decodeURIComponent(location.href);
}else { }else {
layer.alert(data.msg); layer.alert(data.msg);

View File

@ -341,6 +341,8 @@
} else if(data.code == 1001){ } else if(data.code == 1001){
//未登录 //未登录
location.href = '/user/login.html?originUrl='+decodeURIComponent(location.href);
}else { }else {
layer.alert(data.msg); layer.alert(data.msg);

View File

@ -25,7 +25,14 @@
<div class="my_info cf"> <div class="my_info cf">
<div class="my_info_txt"> <div class="my_info_txt">
<ul class="mytab_list"> <ul class="mytab_list">
<li><i class="tit">我的头像</i><a href="javascript:void(0);"><img id="imgLogo" class="user_img" alt="我的头像" src="/images/man.png" /></a></li> <li ><i class="tit">我的头像</i>
<a style="position: relative" >
<img id="imgLogo" class="user_img" alt="我的头像" src="/images/man.png" />
<input class="opacity" onchange="picChange()" type="file" id="file0" name="file" title="点击上传图片" style="z-index: 100;cursor: pointer;left: 0px; top: -25px; width: 60px; height: 80px; opacity: 0; position: absolute; "/>
</a>
</li>
<li><i class="tit">我的昵称</i><a href="/user/set_name.html" id="my_name"></a></li> <li><i class="tit">我的昵称</i><a href="/user/set_name.html" id="my_name"></a></li>
<li style="display:none"><i class="tit">电子邮箱</i><a href="javascript:void(0);"></a></li> <li style="display:none"><i class="tit">电子邮箱</i><a href="javascript:void(0);"></a></li>
<li><i class="tit">我的性别</i><a href="/user/set_sex.html" id="my_sex"></a></li> <li><i class="tit">我的性别</i><a href="/user/set_sex.html" id="my_sex"></a></li>
@ -42,6 +49,7 @@
</div> </div>
<div th:replace="common/js :: js"></div> <div th:replace="common/js :: js"></div>
<script src="/javascript/user.js" type="text/javascript"></script> <script src="/javascript/user.js" type="text/javascript"></script>
<script src="/javascript/ajaxfileupload.js" type="text/javascript"></script>
<script type="text/javascript"> <script type="text/javascript">
//查询用户信息 //查询用户信息
$.ajax({ $.ajax({
@ -82,6 +90,58 @@
layer.alert('网络异常'); layer.alert('网络异常');
} }
}) })
function picChange() {
var file = $("#file0").val(); //文件名称
if (file != "") {
$.ajaxFileUpload({
url : "/file/upload", //用于文件上传的服务器端请求地址
secureuri : false, //是否需要安全协议一般设置为false
fileElementId : "file0", //文件上传域的ID
dataType : "json", //返回值类型 一般设置为json
type : "post",
success : function(data) { //服务器成功响应处理函数
if (data.code == 200) {
$.ajax({
type: "POST",
url: "/user/updateUserInfo",
data: {'userPhoto':data.data},
dataType: "json",
success: function (data) {
if (data.code == 200) {
window.location.href = '/user/setup.html';
} else if (data.code == 1001) {
//未登录
location.href = '/user/login.html?originUrl=' + decodeURIComponent(location.href);
} else {
layer.alert(data.msg);
}
},
error: function () {
layer.alert('网络异常');
}
})
}else {
layer.alert('图片上传失败');
}
}
});
} else {
alert("请选择上传文件!");
}
}
</script> </script>
</body> </body>
</html> </html>