mirror of
https://github.com/201206030/novel-plus.git
synced 2025-07-01 15:26:37 +00:00
Compare commits
60 Commits
v3.5.1
...
develop_aq
Author | SHA1 | Date | |
---|---|---|---|
bb2d95ad75 | |||
e6b60bb0a8 | |||
3a44d14149 | |||
fecf03b3f5 | |||
e7f702ece0 | |||
b2c67c4f15 | |||
6a385877ac | |||
7cde6ebf61 | |||
78969f9fd1 | |||
b2eb6686e9 | |||
c537f6fb20 | |||
16e4c98a45 | |||
776083076c | |||
2bf945fe0e | |||
ede7aca66d | |||
396452b46e | |||
fc2ea40c6a | |||
bfe4d938fd | |||
7f4728191a | |||
80b393fdda | |||
e7897c988a | |||
750c8dee02 | |||
cbfd0b049f | |||
7f0331e095 | |||
3520200a87 | |||
4939bcf418 | |||
1cffbae495 | |||
b99b6ae4f2 | |||
2e2a58c84b | |||
4fe36a8f4f | |||
b5df86d5c7 | |||
9b3ba1d8c1 | |||
c4db754d23 | |||
8d3ce53dba | |||
d32d9d8410 | |||
05ae012e05 | |||
b60a0c9b40 | |||
3efaf8ce5f | |||
ebc4210774 | |||
655ec90906 | |||
f28dd867ef | |||
8e6842a495 | |||
928cb2417f | |||
625694ba1e | |||
d6c0337c09 | |||
689efc0807 | |||
4540c3781e | |||
9d2c453bb0 | |||
9de47ce697 | |||
c79974ff77 | |||
fb0098aef8 | |||
e83494cb17 | |||
419d7a971b | |||
83eda2a44d | |||
3182029bdd | |||
19d4a9960d | |||
2603150b33 | |||
f5e440390b | |||
91e525ec8e | |||
83afb9e6e2 |
1
.gitignore
vendored
1
.gitignore
vendored
@ -3,4 +3,5 @@
|
|||||||
**/cachedata
|
**/cachedata
|
||||||
**/target
|
**/target
|
||||||
**/*.iml
|
**/*.iml
|
||||||
|
**/.DS_Store
|
||||||
|
|
||||||
|
@ -9,7 +9,7 @@
|
|||||||
|
|
||||||
#### 官网
|
#### 官网
|
||||||
|
|
||||||
https://xiongxyang.gitee.io
|
https://201206030.github.io
|
||||||
|
|
||||||
#### 新项目:小说精品屋-微服务版
|
#### 新项目:小说精品屋-微服务版
|
||||||
|
|
||||||
@ -262,7 +262,7 @@ novel-plus -- 父工程
|
|||||||
|
|
||||||
**喜欢此项目的可以给我的GitHub和Gitee加个Star支持一下 。**
|
**喜欢此项目的可以给我的GitHub和Gitee加个Star支持一下 。**
|
||||||
|
|
||||||
#### 其他安装教程
|
#### 其他安装教程(如果链接打不开,可关注公众号获取)
|
||||||
|
|
||||||
##### version>=3.5.0版本
|
##### version>=3.5.0版本
|
||||||
|
|
||||||
|
1
doc/sql/20210726.sql
Normal file
1
doc/sql/20210726.sql
Normal file
@ -0,0 +1 @@
|
|||||||
|
alter table news add column `read_count` BIGINT NOT NULL DEFAULT '0' COMMENT '阅读量' after content;
|
@ -1836,4 +1836,8 @@ INSERT INTO `sys_role_menu`(`id`, `role_id`, `menu_id`) VALUES (4900, 1, 235);
|
|||||||
INSERT INTO `sys_role_menu`(`id`, `role_id`, `menu_id`) VALUES (4888, 1, 234);
|
INSERT INTO `sys_role_menu`(`id`, `role_id`, `menu_id`) VALUES (4888, 1, 234);
|
||||||
|
|
||||||
|
|
||||||
delete from sys_menu where menu_id = 202;
|
delete from sys_menu where menu_id = 202;
|
||||||
|
|
||||||
|
INSERT INTO crawl_source(`id`, `source_name`, `crawl_rule`, `source_status`, `create_time`, `update_time`) VALUES (16, 'i笔趣阁', '{\"bookListUrl\":\"http://m.ibiquge.net/xclass/{catId}/{page}.html\",\"catIdRule\":{\"catId1\":\"1\",\"catId2\":\"2\",\"catId3\":\"3\",\"catId4\":\"4\",\"catId5\":\"6\",\"catId6\":\"5\",\"catId7\":\"7\"},\"bookIdPatten\":\"href=\\\"/(\\\\d+_\\\\d+)/\\\"\",\"pagePatten\":\"value=\\\"(\\\\d+)/\\\\d+\\\"\",\"totalPagePatten\":\"value=\\\"\\\\d+/(\\\\d+)\\\"\",\"bookDetailUrl\":\"http://m.ibiquge.net/{bookId}/\",\"bookNamePatten\":\"<span class=\\\"title\\\">([^/]+)</span>\",\"authorNamePatten\":\"<a href=\\\"/author/\\\\d+/\\\">([^/]+)</a>\",\"picUrlPatten\":\"<img src=\\\"([^>]+)\\\"\\\\s+onerror=\\\"this.src=\",\"picUrlPrefix\":\"http://m.ibiquge.net\",\"statusPatten\":\">状态:([^/]+)</li>\",\"bookStatusRule\":{\"连载\":0,\"完结\":1},\"visitCountPatten\":\">点击:(\\\\d+)</li>\",\"descStart\":\"<p class=\\\"review\\\">\",\"descEnd\":\"</p>\",\"bookIndexUrl\":\"http://www.ibiquge.net/{bookId}/\",\"bookIndexStart\":\"正文</dt>\",\"indexIdPatten\":\"<a\\\\s+style=\\\"\\\"\\\\s+href=\\\"/\\\\d+_\\\\d+/(\\\\d+)\\\\.html\\\">[^/]+</a>\",\"indexNamePatten\":\"<a\\\\s+style=\\\"\\\"\\\\s+href=\\\"/\\\\d+_\\\\d+/\\\\d+\\\\.html\\\">([^/]+)</a>\",\"bookContentUrl\":\"http://www.ibiquge.net/{bookId}/{indexId}.html\",\"contentStart\":\"</p>\",\"contentEnd\":\"<div align=\\\"center\\\">\"}', 0, '2021-02-04 21:31:23', '2021-02-04 21:31:23');
|
||||||
|
|
||||||
|
alter table news add column `read_count` BIGINT NOT NULL DEFAULT '0' COMMENT '阅读量' after content;
|
@ -5,7 +5,7 @@
|
|||||||
|
|
||||||
<groupId>com.java2nb</groupId>
|
<groupId>com.java2nb</groupId>
|
||||||
<artifactId>novel-admin</artifactId>
|
<artifactId>novel-admin</artifactId>
|
||||||
<version>3.5.0</version>
|
<version>3.5.4</version>
|
||||||
<packaging>jar</packaging>
|
<packaging>jar</packaging>
|
||||||
|
|
||||||
<name>novel-admin</name>
|
<name>novel-admin</name>
|
||||||
@ -106,7 +106,7 @@
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.apache.shiro</groupId>
|
<groupId>org.apache.shiro</groupId>
|
||||||
<artifactId>shiro-spring</artifactId>
|
<artifactId>shiro-spring</artifactId>
|
||||||
<version>1.3.2</version>
|
<version>1.7.0</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<!-- shiro ehcache -->
|
<!-- shiro ehcache -->
|
||||||
<dependency>
|
<dependency>
|
||||||
@ -224,17 +224,17 @@
|
|||||||
<!--<scope>provided</scope>-->
|
<!--<scope>provided</scope>-->
|
||||||
<!--</dependency>-->
|
<!--</dependency>-->
|
||||||
</dependencies>
|
</dependencies>
|
||||||
<build>
|
<!-- <build>
|
||||||
<plugins>
|
<plugins>
|
||||||
<!--<plugin>
|
<!–<plugin>
|
||||||
<groupId>org.springframework.boot</groupId>
|
<groupId>org.springframework.boot</groupId>
|
||||||
<artifactId>spring-boot-maven-plugin</artifactId>
|
<artifactId>spring-boot-maven-plugin</artifactId>
|
||||||
<configuration>
|
<configuration>
|
||||||
<executable>true</executable>
|
<executable>true</executable>
|
||||||
</configuration>
|
</configuration>
|
||||||
</plugin>-->
|
</plugin>–>
|
||||||
<!--SpringBoot项目默认使用spring-boot-maven-plugin,要打成被其他项目引用的jar包,需要更换此插件-->
|
<!–SpringBoot项目默认使用spring-boot-maven-plugin,要打成被其他项目引用的jar包,需要更换此插件–>
|
||||||
<!-- <plugin>
|
<!– <plugin>
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
<artifactId>maven-compiler-plugin</artifactId>
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
<configuration>
|
<configuration>
|
||||||
@ -242,12 +242,91 @@
|
|||||||
<target>1.8</target>
|
<target>1.8</target>
|
||||||
<encoding>UTF-8</encoding>
|
<encoding>UTF-8</encoding>
|
||||||
</configuration>
|
</configuration>
|
||||||
</plugin>-->
|
</plugin>–>
|
||||||
<plugin>
|
<plugin>
|
||||||
<groupId>org.springframework.boot</groupId>
|
<groupId>org.springframework.boot</groupId>
|
||||||
<artifactId>spring-boot-maven-plugin</artifactId>
|
<artifactId>spring-boot-maven-plugin</artifactId>
|
||||||
</plugin>
|
</plugin>
|
||||||
</plugins>
|
</plugins>
|
||||||
|
</build>-->
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<!--打包时去除第三方依赖-->
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-maven-plugin</artifactId>
|
||||||
|
<configuration>
|
||||||
|
<layout>ZIP</layout>
|
||||||
|
<includes>
|
||||||
|
<include>
|
||||||
|
<groupId>non-exists</groupId>
|
||||||
|
<artifactId>non-exists</artifactId>
|
||||||
|
</include>
|
||||||
|
</includes>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
<!--拷贝第三方依赖文件到指定目录-->
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-dependency-plugin</artifactId>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<id>copy-dependencies</id>
|
||||||
|
<phase>package</phase>
|
||||||
|
<goals>
|
||||||
|
<goal>copy-dependencies</goal>
|
||||||
|
</goals>
|
||||||
|
<configuration>
|
||||||
|
<!--target/lib是依赖jar包的输出目录,根据自己喜好配置-->
|
||||||
|
<outputDirectory>target/lib</outputDirectory>
|
||||||
|
<excludeTransitive>false</excludeTransitive>
|
||||||
|
<stripVersion>false</stripVersion>
|
||||||
|
<includeScope>runtime</includeScope>
|
||||||
|
</configuration>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<artifactId>maven-antrun-plugin</artifactId>
|
||||||
|
<version>1.8</version>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<phase>package</phase>
|
||||||
|
<goals>
|
||||||
|
<goal>run</goal>
|
||||||
|
</goals>
|
||||||
|
<configuration>
|
||||||
|
<tasks>
|
||||||
|
<!-- 文件夹 -->
|
||||||
|
<copy todir="${project.build.directory}/build/conf" overwrite="true">
|
||||||
|
<fileset dir="${basedir}/src/main/resources">
|
||||||
|
<include name="**/*.*"/>
|
||||||
|
<exclude name="mybatis/*/*.*"/>
|
||||||
|
</fileset>
|
||||||
|
</copy>
|
||||||
|
<move todir="${project.build.directory}/build/lib">
|
||||||
|
<fileset dir="target/lib"/>
|
||||||
|
</move>
|
||||||
|
<copy file="${project.build.directory}/${project.artifactId}-${project.version}.jar"
|
||||||
|
tofile="${project.build.directory}/build/${project.artifactId}.jar" />
|
||||||
|
|
||||||
|
<fixcrlf srcdir="${basedir}/src/main/build/scripts" eol="unix"/>
|
||||||
|
<copy todir="${project.build.directory}/build/bin">
|
||||||
|
<fileset dir="${basedir}/src/main/build/scripts">
|
||||||
|
<include name="*.sh" />
|
||||||
|
<include name="*.txt" />
|
||||||
|
<include name="*.bat" />
|
||||||
|
</fileset>
|
||||||
|
</copy>
|
||||||
|
<zip destfile='${project.build.directory}/build/${project.artifactId}.zip'>
|
||||||
|
<zipfileset filemode="755" dir= '${project.build.directory}/build/' />
|
||||||
|
</zip>
|
||||||
|
</tasks>
|
||||||
|
</configuration>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
</build>
|
</build>
|
||||||
<!--<distributionManagement>
|
<!--<distributionManagement>
|
||||||
<repository>
|
<repository>
|
||||||
|
8
novel-admin/src/main/build/scripts/readme.txt
Normal file
8
novel-admin/src/main/build/scripts/readme.txt
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
1:linux启动环境
|
||||||
|
sh start.sh
|
||||||
|
|
||||||
|
3:windows启动环境
|
||||||
|
windows-start.bat
|
||||||
|
|
||||||
|
3:linux停止应用
|
||||||
|
sh stop.sh
|
47
novel-admin/src/main/build/scripts/start.sh
Normal file
47
novel-admin/src/main/build/scripts/start.sh
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
ENGINE=novel-admin.jar
|
||||||
|
cd ../
|
||||||
|
|
||||||
|
#部署目路
|
||||||
|
DEPLOY_DIR=`pwd`
|
||||||
|
#获取到当前目录的名称
|
||||||
|
SERVER_NAME=`basename $DEPLOY_DIR`
|
||||||
|
|
||||||
|
#应用进程
|
||||||
|
PIDS=`ps -ef | grep java | grep "$ENGINE" |awk '{print $2}'`
|
||||||
|
#设置日志文件的输出目录
|
||||||
|
LOGS_DIR=$DEPLOY_DIR/logs
|
||||||
|
if [ ! -d $LOGS_DIR ]; then
|
||||||
|
mkdir $LOGS_DIR
|
||||||
|
fi
|
||||||
|
#日志
|
||||||
|
STDOUT_FILE=$LOGS_DIR/stdout.log
|
||||||
|
#JAVA 环境配置
|
||||||
|
JAVA_OPTS=" -Djava.net.preferIPv4Stack=true -Dlog.home=$LOGS_DIR"
|
||||||
|
|
||||||
|
JAVA_MEM_OPTS=" -server -Xms1024m -Xmx1024m -XX:MetaspaceSize=64m -XX:MaxMetaspaceSize=256m -XX:+UseG1GC -XX:MaxGCPauseMillis=100 -XX:InitiatingHeapOccupancyPercent=50 -XX:+PrintGCApplicationStoppedTime -XX:+PrintGCApplicationConcurrentTime -XX:+PrintGCDateStamps -verbose:gc -XX:+PrintGCDetails -XX:+PrintHeapAtGC -Xloggc:$LOGS_DIR/gc.log -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=100M -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=dump.hprof "
|
||||||
|
#退出标志
|
||||||
|
RETVAL="0"
|
||||||
|
|
||||||
|
if [ -n "$PIDS" ]; then
|
||||||
|
echo "ERROR: The $SERVER_NAME already started!"
|
||||||
|
echo "PID: $PIDS"
|
||||||
|
exit $RETVAL
|
||||||
|
fi
|
||||||
|
|
||||||
|
nohup java -jar $JAVA_OPTS $JAVA_MEM_OPTS -Dloader.path=conf,lib $ENGINE > $STDOUT_FILE 2>&1 &
|
||||||
|
COUNT=0
|
||||||
|
while [ $COUNT -lt 1 ]; do
|
||||||
|
echo -e ".\c"
|
||||||
|
sleep 1
|
||||||
|
COUNT=`ps -f | grep java | grep "$DEPLOY_DIR" | awk '{print $2}' | wc -l`
|
||||||
|
if [ $COUNT -gt 0 ]; then
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "OK!"
|
||||||
|
PIDS=`ps -f | grep java | grep "$DEPLOY_DIR" | awk '{print $2}'`
|
||||||
|
echo "PID: $PIDS"
|
||||||
|
echo "STDOUT: $STDOUT_FILE"
|
33
novel-admin/src/main/build/scripts/stop.sh
Normal file
33
novel-admin/src/main/build/scripts/stop.sh
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
SERVER_NAME=novel-admin.jar
|
||||||
|
|
||||||
|
#应用进程
|
||||||
|
PIDS=`ps -ef | grep java | grep "$SERVER_NAME" |awk '{print $2}'`
|
||||||
|
if [ -z "$PIDS" ]; then
|
||||||
|
echo "ERROR: The $SERVER_NAME does not started!"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo -e "Stopping the $SERVER_NAME ...\c"
|
||||||
|
for PID in $PIDS ; do
|
||||||
|
kill $PID > /dev/null 2>&1
|
||||||
|
done
|
||||||
|
|
||||||
|
COUNT=0
|
||||||
|
while [ $COUNT -lt 1 ]; do
|
||||||
|
echo -e ".\c"
|
||||||
|
sleep 1
|
||||||
|
COUNT=1
|
||||||
|
for PID in $PIDS ; do
|
||||||
|
PID_EXIST=`ps -f -p $PID | grep java`
|
||||||
|
if [ -n "$PID_EXIST" ]; then
|
||||||
|
COUNT=0
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "OK!"
|
||||||
|
echo "PID: $PIDS"
|
||||||
|
PIDS=""
|
||||||
|
|
10
novel-admin/src/main/build/scripts/windows-start.bat
Normal file
10
novel-admin/src/main/build/scripts/windows-start.bat
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
@echo off
|
||||||
|
setlocal enabledelayedexpansion
|
||||||
|
set JAVA=java
|
||||||
|
|
||||||
|
set OPTS=-XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=128m -Xms1024m -Xmx1024m -Xmn256m -Xss256k -XX:SurvivorRatio=8 -XX:+UseConcMarkSweepGC
|
||||||
|
set ENGINE=novel-admin.jar
|
||||||
|
cd ../
|
||||||
|
java -jar %OPTS% -Dloader.path=conf,lib %ENGINE%
|
||||||
|
pause
|
||||||
|
|
@ -75,7 +75,6 @@ public class ShiroConfig {
|
|||||||
filterChainDefinitionMap.put("/img/**", "anon");
|
filterChainDefinitionMap.put("/img/**", "anon");
|
||||||
filterChainDefinitionMap.put("/docs/**", "anon");
|
filterChainDefinitionMap.put("/docs/**", "anon");
|
||||||
filterChainDefinitionMap.put("/layuimini/**", "anon");
|
filterChainDefinitionMap.put("/layuimini/**", "anon");
|
||||||
filterChainDefinitionMap.put("/druid/**", "anon");
|
|
||||||
filterChainDefinitionMap.put("/upload/**", "anon");
|
filterChainDefinitionMap.put("/upload/**", "anon");
|
||||||
filterChainDefinitionMap.put("/files/**", "anon");
|
filterChainDefinitionMap.put("/files/**", "anon");
|
||||||
filterChainDefinitionMap.put("/logout", "logout");
|
filterChainDefinitionMap.put("/logout", "logout");
|
||||||
|
@ -1,19 +1,17 @@
|
|||||||
package com.java2nb.novel.controller;
|
package com.java2nb.novel.controller;
|
||||||
|
|
||||||
import com.java2nb.common.utils.DateUtils;
|
import com.java2nb.common.utils.DateUtils;
|
||||||
import com.java2nb.common.utils.PageBean;
|
|
||||||
import com.java2nb.common.utils.Query;
|
|
||||||
import com.java2nb.common.utils.R;
|
import com.java2nb.common.utils.R;
|
||||||
import com.java2nb.novel.domain.AuthorCodeDO;
|
import com.java2nb.novel.service.AuthorService;
|
||||||
import com.java2nb.novel.service.*;
|
import com.java2nb.novel.service.BookService;
|
||||||
import com.java2nb.test.service.OrderService;
|
import com.java2nb.novel.service.PayService;
|
||||||
import io.swagger.annotations.ApiOperation;
|
import com.java2nb.novel.service.UserService;
|
||||||
import lombok.SneakyThrows;
|
import lombok.SneakyThrows;
|
||||||
import org.apache.shiro.authz.annotation.RequiresPermissions;
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Controller;
|
import org.springframework.stereotype.Controller;
|
||||||
import org.springframework.ui.Model;
|
import org.springframework.web.bind.annotation.GetMapping;
|
||||||
import org.springframework.web.bind.annotation.*;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
|
import org.springframework.web.bind.annotation.ResponseBody;
|
||||||
|
|
||||||
import java.text.SimpleDateFormat;
|
import java.text.SimpleDateFormat;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
@ -1,135 +0,0 @@
|
|||||||
package com.java2nb.test.controller;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import org.apache.shiro.authz.annotation.RequiresPermissions;
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
|
||||||
import org.springframework.stereotype.Controller;
|
|
||||||
import org.springframework.ui.Model;
|
|
||||||
import org.springframework.web.bind.annotation.GetMapping;
|
|
||||||
import org.springframework.web.bind.annotation.PathVariable;
|
|
||||||
import org.springframework.web.bind.annotation.PostMapping;
|
|
||||||
import org.springframework.web.bind.annotation.RequestMapping;
|
|
||||||
import org.springframework.web.bind.annotation.RequestParam;
|
|
||||||
import org.springframework.web.bind.annotation.ResponseBody;
|
|
||||||
import io.swagger.annotations.ApiOperation;
|
|
||||||
|
|
||||||
|
|
||||||
import com.java2nb.test.domain.OrderDO;
|
|
||||||
import com.java2nb.test.service.OrderService;
|
|
||||||
import com.java2nb.common.utils.PageBean;
|
|
||||||
import com.java2nb.common.utils.Query;
|
|
||||||
import com.java2nb.common.utils.R;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 付呗-订单信息表
|
|
||||||
*
|
|
||||||
* @author xiongxy
|
|
||||||
* @email 1179705413@qq.com
|
|
||||||
* @date 2019-11-25 11:57:16
|
|
||||||
*/
|
|
||||||
|
|
||||||
@Controller
|
|
||||||
@RequestMapping("/test/order")
|
|
||||||
public class OrderController {
|
|
||||||
@Autowired
|
|
||||||
private OrderService orderService;
|
|
||||||
|
|
||||||
@GetMapping()
|
|
||||||
@RequiresPermissions("test:order:order")
|
|
||||||
String Order() {
|
|
||||||
return "test/order/order";
|
|
||||||
}
|
|
||||||
|
|
||||||
@ApiOperation(value = "获取付呗-订单信息表列表", notes = "获取付呗-订单信息表列表")
|
|
||||||
@ResponseBody
|
|
||||||
@GetMapping("/list")
|
|
||||||
@RequiresPermissions("test:order:order")
|
|
||||||
public R list(@RequestParam Map<String, Object> params) {
|
|
||||||
//查询列表数据
|
|
||||||
Query query = new Query(params);
|
|
||||||
List<OrderDO> orderList = orderService.list(query);
|
|
||||||
int total = orderService.count(query);
|
|
||||||
PageBean pageBean = new PageBean(orderList, total);
|
|
||||||
return R.ok().put("data", pageBean);
|
|
||||||
}
|
|
||||||
|
|
||||||
@ApiOperation(value = "新增付呗-订单信息表页面", notes = "新增付呗-订单信息表页面")
|
|
||||||
@GetMapping("/add")
|
|
||||||
@RequiresPermissions("test:order:add")
|
|
||||||
String add() {
|
|
||||||
return "test/order/add";
|
|
||||||
}
|
|
||||||
|
|
||||||
@ApiOperation(value = "修改付呗-订单信息表页面", notes = "修改付呗-订单信息表页面")
|
|
||||||
@GetMapping("/edit/{id}")
|
|
||||||
@RequiresPermissions("test:order:edit")
|
|
||||||
String edit(@PathVariable("id") Long id, Model model) {
|
|
||||||
OrderDO order = orderService.get(id);
|
|
||||||
model.addAttribute("order", order);
|
|
||||||
return "test/order/edit";
|
|
||||||
}
|
|
||||||
|
|
||||||
@ApiOperation(value = "查看付呗-订单信息表页面", notes = "查看付呗-订单信息表页面")
|
|
||||||
@GetMapping("/detail/{id}")
|
|
||||||
@RequiresPermissions("test:order:detail")
|
|
||||||
String detail(@PathVariable("id") Long id, Model model) {
|
|
||||||
OrderDO order = orderService.get(id);
|
|
||||||
model.addAttribute("order", order);
|
|
||||||
return "test/order/detail";
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 保存
|
|
||||||
*/
|
|
||||||
@ApiOperation(value = "新增付呗-订单信息表", notes = "新增付呗-订单信息表")
|
|
||||||
@ResponseBody
|
|
||||||
@PostMapping("/save")
|
|
||||||
@RequiresPermissions("test:order:add")
|
|
||||||
public R save( OrderDO order) {
|
|
||||||
if (orderService.save(order) > 0) {
|
|
||||||
return R.ok();
|
|
||||||
}
|
|
||||||
return R.error();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 修改
|
|
||||||
*/
|
|
||||||
@ApiOperation(value = "修改付呗-订单信息表", notes = "修改付呗-订单信息表")
|
|
||||||
@ResponseBody
|
|
||||||
@RequestMapping("/update")
|
|
||||||
@RequiresPermissions("test:order:edit")
|
|
||||||
public R update( OrderDO order) {
|
|
||||||
orderService.update(order);
|
|
||||||
return R.ok();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 删除
|
|
||||||
*/
|
|
||||||
@ApiOperation(value = "删除付呗-订单信息表", notes = "删除付呗-订单信息表")
|
|
||||||
@PostMapping("/remove")
|
|
||||||
@ResponseBody
|
|
||||||
@RequiresPermissions("test:order:remove")
|
|
||||||
public R remove( Long id) {
|
|
||||||
if (orderService.remove(id) > 0) {
|
|
||||||
return R.ok();
|
|
||||||
}
|
|
||||||
return R.error();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 删除
|
|
||||||
*/
|
|
||||||
@ApiOperation(value = "批量删除付呗-订单信息表", notes = "批量删除付呗-订单信息表")
|
|
||||||
@PostMapping("/batchRemove")
|
|
||||||
@ResponseBody
|
|
||||||
@RequiresPermissions("test:order:batchRemove")
|
|
||||||
public R remove(@RequestParam("ids[]") Long[] ids) {
|
|
||||||
orderService.batchRemove(ids);
|
|
||||||
return R.ok();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,32 +0,0 @@
|
|||||||
package com.java2nb.test.dao;
|
|
||||||
|
|
||||||
import com.java2nb.test.domain.OrderDO;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import org.apache.ibatis.annotations.Mapper;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 付呗-订单信息表
|
|
||||||
* @author xiongxy
|
|
||||||
* @email 1179705413@qq.com
|
|
||||||
* @date 2019-11-25 11:57:16
|
|
||||||
*/
|
|
||||||
@Mapper
|
|
||||||
public interface OrderDao {
|
|
||||||
|
|
||||||
OrderDO get(Long id);
|
|
||||||
|
|
||||||
List<OrderDO> list(Map<String,Object> map);
|
|
||||||
|
|
||||||
int count(Map<String,Object> map);
|
|
||||||
|
|
||||||
int save(OrderDO order);
|
|
||||||
|
|
||||||
int update(OrderDO order);
|
|
||||||
|
|
||||||
int remove(Long id);
|
|
||||||
|
|
||||||
int batchRemove(Long[] ids);
|
|
||||||
}
|
|
@ -1,475 +0,0 @@
|
|||||||
package com.java2nb.test.domain;
|
|
||||||
|
|
||||||
import java.io.Serializable;
|
|
||||||
|
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
|
||||||
|
|
||||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
|
||||||
import com.java2nb.common.jsonserializer.LongToStringSerializer;
|
|
||||||
|
|
||||||
|
|
||||||
import org.springframework.format.annotation.DateTimeFormat;
|
|
||||||
import java.util.Date;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 付呗-订单信息表
|
|
||||||
*
|
|
||||||
* @author xiongxy
|
|
||||||
* @email 1179705413@qq.com
|
|
||||||
* @date 2019-11-25 11:57:16
|
|
||||||
*/
|
|
||||||
public class OrderDO implements Serializable {
|
|
||||||
private static final long serialVersionUID = 1L;
|
|
||||||
|
|
||||||
|
|
||||||
//主键
|
|
||||||
//java中的long能表示的范围比js中number大,也就意味着部分数值在js中存不下(变成不准确的值)
|
|
||||||
//所以通过序列化成字符串来解决
|
|
||||||
@JsonSerialize(using = LongToStringSerializer.class)
|
|
||||||
private Long id;
|
|
||||||
//付呗商户号
|
|
||||||
private String fbMerchantCode;
|
|
||||||
//第三方商户的订单号
|
|
||||||
private String merchantOrderSn;
|
|
||||||
//付呗订单号
|
|
||||||
private String orderSn;
|
|
||||||
//平台方订单号
|
|
||||||
private String platformOrderNo;
|
|
||||||
//商户单号
|
|
||||||
private String tradeNo;
|
|
||||||
//订单状态,1:未支付,2:支付成功,3:支付失败,4:支付取消
|
|
||||||
private Integer orderState;
|
|
||||||
//蜂鸟优惠卷抵扣
|
|
||||||
private Double fnCoupon;
|
|
||||||
//红包抵扣
|
|
||||||
private BigDecimal redPacket;
|
|
||||||
//实收金额(元)
|
|
||||||
private BigDecimal totalFee;
|
|
||||||
//订单金额
|
|
||||||
private BigDecimal orderPrice;
|
|
||||||
//手续费(元)
|
|
||||||
private BigDecimal fee;
|
|
||||||
//对商品或交易的描述
|
|
||||||
private String body;
|
|
||||||
//附加数据
|
|
||||||
private String attach;
|
|
||||||
//付呗系统的门店id
|
|
||||||
//java中的long能表示的范围比js中number大,也就意味着部分数值在js中存不下(变成不准确的值)
|
|
||||||
//所以通过序列化成字符串来解决
|
|
||||||
@JsonSerialize(using = LongToStringSerializer.class)
|
|
||||||
private Long storeId;
|
|
||||||
//付呗系统的收银员id
|
|
||||||
//java中的long能表示的范围比js中number大,也就意味着部分数值在js中存不下(变成不准确的值)
|
|
||||||
//所以通过序列化成字符串来解决
|
|
||||||
@JsonSerialize(using = LongToStringSerializer.class)
|
|
||||||
private Long cashierId;
|
|
||||||
//设备终端号
|
|
||||||
private String deviceNo;
|
|
||||||
//微信顾客支付授权的“open_id”或者支付宝顾客的“buyer_user_id”
|
|
||||||
private String userId;
|
|
||||||
//支付宝顾客的账号
|
|
||||||
private String userLogonId;
|
|
||||||
//交易成功的时间
|
|
||||||
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
|
||||||
private Date payTime;
|
|
||||||
//支付通道:1微信、2支付宝、3银联
|
|
||||||
private Integer payChannel;
|
|
||||||
//免充值代金券金额(元)
|
|
||||||
private BigDecimal noCashCouponFee;
|
|
||||||
//预充值代金券金额(元)
|
|
||||||
private BigDecimal cashCouponFee;
|
|
||||||
//顾客实际支付金额(元)
|
|
||||||
private BigDecimal cashFee;
|
|
||||||
//签名
|
|
||||||
private String sign;
|
|
||||||
//其它选项
|
|
||||||
private String options;
|
|
||||||
//创建时间
|
|
||||||
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
|
||||||
private Date createTime;
|
|
||||||
//推送时间
|
|
||||||
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
|
||||||
private Date pushTime;
|
|
||||||
//推送IP
|
|
||||||
private String pushIp;
|
|
||||||
//商户id
|
|
||||||
private BigDecimal mchtId;
|
|
||||||
//QR编号
|
|
||||||
private String sn;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 设置:主键
|
|
||||||
*/
|
|
||||||
public void setId(Long id) {
|
|
||||||
this.id = id;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* 获取:主键
|
|
||||||
*/
|
|
||||||
public Long getId() {
|
|
||||||
return id;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* 设置:付呗商户号
|
|
||||||
*/
|
|
||||||
public void setFbMerchantCode(String fbMerchantCode) {
|
|
||||||
this.fbMerchantCode = fbMerchantCode;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* 获取:付呗商户号
|
|
||||||
*/
|
|
||||||
public String getFbMerchantCode() {
|
|
||||||
return fbMerchantCode;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* 设置:第三方商户的订单号
|
|
||||||
*/
|
|
||||||
public void setMerchantOrderSn(String merchantOrderSn) {
|
|
||||||
this.merchantOrderSn = merchantOrderSn;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* 获取:第三方商户的订单号
|
|
||||||
*/
|
|
||||||
public String getMerchantOrderSn() {
|
|
||||||
return merchantOrderSn;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* 设置:付呗订单号
|
|
||||||
*/
|
|
||||||
public void setOrderSn(String orderSn) {
|
|
||||||
this.orderSn = orderSn;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* 获取:付呗订单号
|
|
||||||
*/
|
|
||||||
public String getOrderSn() {
|
|
||||||
return orderSn;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* 设置:平台方订单号
|
|
||||||
*/
|
|
||||||
public void setPlatformOrderNo(String platformOrderNo) {
|
|
||||||
this.platformOrderNo = platformOrderNo;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* 获取:平台方订单号
|
|
||||||
*/
|
|
||||||
public String getPlatformOrderNo() {
|
|
||||||
return platformOrderNo;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* 设置:商户单号
|
|
||||||
*/
|
|
||||||
public void setTradeNo(String tradeNo) {
|
|
||||||
this.tradeNo = tradeNo;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* 获取:商户单号
|
|
||||||
*/
|
|
||||||
public String getTradeNo() {
|
|
||||||
return tradeNo;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* 设置:订单状态,1:未支付,2:支付成功,3:支付失败,4:支付取消
|
|
||||||
*/
|
|
||||||
public void setOrderState(Integer orderState) {
|
|
||||||
this.orderState = orderState;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* 获取:订单状态,1:未支付,2:支付成功,3:支付失败,4:支付取消
|
|
||||||
*/
|
|
||||||
public Integer getOrderState() {
|
|
||||||
return orderState;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* 设置:蜂鸟优惠卷抵扣
|
|
||||||
*/
|
|
||||||
public void setFnCoupon(Double fnCoupon) {
|
|
||||||
this.fnCoupon = fnCoupon;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* 获取:蜂鸟优惠卷抵扣
|
|
||||||
*/
|
|
||||||
public Double getFnCoupon() {
|
|
||||||
return fnCoupon;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* 设置:红包抵扣
|
|
||||||
*/
|
|
||||||
public void setRedPacket(BigDecimal redPacket) {
|
|
||||||
this.redPacket = redPacket;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* 获取:红包抵扣
|
|
||||||
*/
|
|
||||||
public BigDecimal getRedPacket() {
|
|
||||||
return redPacket;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* 设置:实收金额(元)
|
|
||||||
*/
|
|
||||||
public void setTotalFee(BigDecimal totalFee) {
|
|
||||||
this.totalFee = totalFee;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* 获取:实收金额(元)
|
|
||||||
*/
|
|
||||||
public BigDecimal getTotalFee() {
|
|
||||||
return totalFee;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* 设置:订单金额
|
|
||||||
*/
|
|
||||||
public void setOrderPrice(BigDecimal orderPrice) {
|
|
||||||
this.orderPrice = orderPrice;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* 获取:订单金额
|
|
||||||
*/
|
|
||||||
public BigDecimal getOrderPrice() {
|
|
||||||
return orderPrice;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* 设置:手续费(元)
|
|
||||||
*/
|
|
||||||
public void setFee(BigDecimal fee) {
|
|
||||||
this.fee = fee;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* 获取:手续费(元)
|
|
||||||
*/
|
|
||||||
public BigDecimal getFee() {
|
|
||||||
return fee;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* 设置:对商品或交易的描述
|
|
||||||
*/
|
|
||||||
public void setBody(String body) {
|
|
||||||
this.body = body;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* 获取:对商品或交易的描述
|
|
||||||
*/
|
|
||||||
public String getBody() {
|
|
||||||
return body;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* 设置:附加数据
|
|
||||||
*/
|
|
||||||
public void setAttach(String attach) {
|
|
||||||
this.attach = attach;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* 获取:附加数据
|
|
||||||
*/
|
|
||||||
public String getAttach() {
|
|
||||||
return attach;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* 设置:付呗系统的门店id
|
|
||||||
*/
|
|
||||||
public void setStoreId(Long storeId) {
|
|
||||||
this.storeId = storeId;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* 获取:付呗系统的门店id
|
|
||||||
*/
|
|
||||||
public Long getStoreId() {
|
|
||||||
return storeId;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* 设置:付呗系统的收银员id
|
|
||||||
*/
|
|
||||||
public void setCashierId(Long cashierId) {
|
|
||||||
this.cashierId = cashierId;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* 获取:付呗系统的收银员id
|
|
||||||
*/
|
|
||||||
public Long getCashierId() {
|
|
||||||
return cashierId;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* 设置:设备终端号
|
|
||||||
*/
|
|
||||||
public void setDeviceNo(String deviceNo) {
|
|
||||||
this.deviceNo = deviceNo;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* 获取:设备终端号
|
|
||||||
*/
|
|
||||||
public String getDeviceNo() {
|
|
||||||
return deviceNo;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* 设置:微信顾客支付授权的“open_id”或者支付宝顾客的“buyer_user_id”
|
|
||||||
*/
|
|
||||||
public void setUserId(String userId) {
|
|
||||||
this.userId = userId;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* 获取:微信顾客支付授权的“open_id”或者支付宝顾客的“buyer_user_id”
|
|
||||||
*/
|
|
||||||
public String getUserId() {
|
|
||||||
return userId;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* 设置:支付宝顾客的账号
|
|
||||||
*/
|
|
||||||
public void setUserLogonId(String userLogonId) {
|
|
||||||
this.userLogonId = userLogonId;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* 获取:支付宝顾客的账号
|
|
||||||
*/
|
|
||||||
public String getUserLogonId() {
|
|
||||||
return userLogonId;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* 设置:交易成功的时间
|
|
||||||
*/
|
|
||||||
public void setPayTime(Date payTime) {
|
|
||||||
this.payTime = payTime;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* 获取:交易成功的时间
|
|
||||||
*/
|
|
||||||
public Date getPayTime() {
|
|
||||||
return payTime;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* 设置:支付通道:1微信、2支付宝、3银联
|
|
||||||
*/
|
|
||||||
public void setPayChannel(Integer payChannel) {
|
|
||||||
this.payChannel = payChannel;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* 获取:支付通道:1微信、2支付宝、3银联
|
|
||||||
*/
|
|
||||||
public Integer getPayChannel() {
|
|
||||||
return payChannel;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* 设置:免充值代金券金额(元)
|
|
||||||
*/
|
|
||||||
public void setNoCashCouponFee(BigDecimal noCashCouponFee) {
|
|
||||||
this.noCashCouponFee = noCashCouponFee;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* 获取:免充值代金券金额(元)
|
|
||||||
*/
|
|
||||||
public BigDecimal getNoCashCouponFee() {
|
|
||||||
return noCashCouponFee;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* 设置:预充值代金券金额(元)
|
|
||||||
*/
|
|
||||||
public void setCashCouponFee(BigDecimal cashCouponFee) {
|
|
||||||
this.cashCouponFee = cashCouponFee;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* 获取:预充值代金券金额(元)
|
|
||||||
*/
|
|
||||||
public BigDecimal getCashCouponFee() {
|
|
||||||
return cashCouponFee;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* 设置:顾客实际支付金额(元)
|
|
||||||
*/
|
|
||||||
public void setCashFee(BigDecimal cashFee) {
|
|
||||||
this.cashFee = cashFee;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* 获取:顾客实际支付金额(元)
|
|
||||||
*/
|
|
||||||
public BigDecimal getCashFee() {
|
|
||||||
return cashFee;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* 设置:签名
|
|
||||||
*/
|
|
||||||
public void setSign(String sign) {
|
|
||||||
this.sign = sign;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* 获取:签名
|
|
||||||
*/
|
|
||||||
public String getSign() {
|
|
||||||
return sign;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* 设置:其它选项
|
|
||||||
*/
|
|
||||||
public void setOptions(String options) {
|
|
||||||
this.options = options;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* 获取:其它选项
|
|
||||||
*/
|
|
||||||
public String getOptions() {
|
|
||||||
return options;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* 设置:创建时间
|
|
||||||
*/
|
|
||||||
public void setCreateTime(Date createTime) {
|
|
||||||
this.createTime = createTime;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* 获取:创建时间
|
|
||||||
*/
|
|
||||||
public Date getCreateTime() {
|
|
||||||
return createTime;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* 设置:推送时间
|
|
||||||
*/
|
|
||||||
public void setPushTime(Date pushTime) {
|
|
||||||
this.pushTime = pushTime;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* 获取:推送时间
|
|
||||||
*/
|
|
||||||
public Date getPushTime() {
|
|
||||||
return pushTime;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* 设置:推送IP
|
|
||||||
*/
|
|
||||||
public void setPushIp(String pushIp) {
|
|
||||||
this.pushIp = pushIp;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* 获取:推送IP
|
|
||||||
*/
|
|
||||||
public String getPushIp() {
|
|
||||||
return pushIp;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* 设置:商户id
|
|
||||||
*/
|
|
||||||
public void setMchtId(BigDecimal mchtId) {
|
|
||||||
this.mchtId = mchtId;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* 获取:商户id
|
|
||||||
*/
|
|
||||||
public BigDecimal getMchtId() {
|
|
||||||
return mchtId;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* 设置:QR编号
|
|
||||||
*/
|
|
||||||
public void setSn(String sn) {
|
|
||||||
this.sn = sn;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* 获取:QR编号
|
|
||||||
*/
|
|
||||||
public String getSn() {
|
|
||||||
return sn;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,30 +0,0 @@
|
|||||||
package com.java2nb.test.service;
|
|
||||||
|
|
||||||
import com.java2nb.test.domain.OrderDO;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 付呗-订单信息表
|
|
||||||
*
|
|
||||||
* @author xiongxy
|
|
||||||
* @email 1179705413@qq.com
|
|
||||||
* @date 2019-11-25 11:57:16
|
|
||||||
*/
|
|
||||||
public interface OrderService {
|
|
||||||
|
|
||||||
OrderDO get(Long id);
|
|
||||||
|
|
||||||
List<OrderDO> list(Map<String, Object> map);
|
|
||||||
|
|
||||||
int count(Map<String, Object> map);
|
|
||||||
|
|
||||||
int save(OrderDO order);
|
|
||||||
|
|
||||||
int update(OrderDO order);
|
|
||||||
|
|
||||||
int remove(Long id);
|
|
||||||
|
|
||||||
int batchRemove(Long[] ids);
|
|
||||||
}
|
|
@ -1,55 +0,0 @@
|
|||||||
package com.java2nb.test.service.impl;
|
|
||||||
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
|
||||||
import org.springframework.stereotype.Service;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import com.java2nb.test.dao.OrderDao;
|
|
||||||
import com.java2nb.test.domain.OrderDO;
|
|
||||||
import com.java2nb.test.service.OrderService;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@Service
|
|
||||||
public class OrderServiceImpl implements OrderService {
|
|
||||||
@Autowired
|
|
||||||
private OrderDao orderDao;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public OrderDO get(Long id){
|
|
||||||
return orderDao.get(id);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public List<OrderDO> list(Map<String, Object> map){
|
|
||||||
return orderDao.list(map);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int count(Map<String, Object> map){
|
|
||||||
return orderDao.count(map);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int save(OrderDO order){
|
|
||||||
return orderDao.save(order);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int update(OrderDO order){
|
|
||||||
return orderDao.update(order);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int remove(Long id){
|
|
||||||
return orderDao.remove(id);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int batchRemove(Long[] ids){
|
|
||||||
return orderDao.batchRemove(ids);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -10,7 +10,7 @@ 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/test?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&allowPublicKeyRetrieval=true
|
||||||
username: root
|
username: root
|
||||||
password: test123456
|
password: test123456
|
||||||
#password:
|
#password:
|
||||||
|
@ -10,7 +10,7 @@ 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/test?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&allowPublicKeyRetrieval=true
|
||||||
username: root
|
username: root
|
||||||
password: test123456
|
password: test123456
|
||||||
#password:
|
#password:
|
||||||
|
@ -56,7 +56,7 @@
|
|||||||
<!-- 指定项目中某个包,当有日志操作行为时的日志记录级别 -->
|
<!-- 指定项目中某个包,当有日志操作行为时的日志记录级别 -->
|
||||||
<!-- com.maijinjie.springboot 为根包,也就是只要是发生在这个根包下面的所有日志操作行为的权限都是DEBUG -->
|
<!-- com.maijinjie.springboot 为根包,也就是只要是发生在这个根包下面的所有日志操作行为的权限都是DEBUG -->
|
||||||
<!-- 级别依次为【从高到低】:FATAL > ERROR > WARN > INFO > DEBUG > TRACE -->
|
<!-- 级别依次为【从高到低】:FATAL > ERROR > WARN > INFO > DEBUG > TRACE -->
|
||||||
<logger name="com.java2nb" level="DEBUG">
|
<logger name="com.java2nb" level="DEBUG" additivity="false">
|
||||||
<appender-ref ref="debug" />
|
<appender-ref ref="debug" />
|
||||||
</logger>
|
</logger>
|
||||||
</configuration>
|
</configuration>
|
||||||
|
@ -1,283 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
|
||||||
|
|
||||||
<mapper namespace="com.java2nb.test.dao.OrderDao">
|
|
||||||
|
|
||||||
<select id="get" resultType="com.java2nb.test.domain.OrderDO">
|
|
||||||
select `id`,`fb_merchant_code`,`merchant_order_sn`,`order_sn`,`platform_order_no`,`trade_no`,`order_state`,`fn_coupon`,`red_packet`,`total_fee`,`order_price`,`fee`,`body`,`attach`,`store_id`,`cashier_id`,`device_no`,`user_id`,`user_logon_id`,`pay_time`,`pay_channel`,`no_cash_coupon_fee`,`cash_coupon_fee`,`cash_fee`,`sign`,`options`,`create_time`,`push_time`,`push_ip`,`mcht_id`,`sn` from fb_order where id = #{value}
|
|
||||||
</select>
|
|
||||||
|
|
||||||
<select id="list" resultType="com.java2nb.test.domain.OrderDO">
|
|
||||||
select `id`,`fb_merchant_code`,`merchant_order_sn`,`order_sn`,`platform_order_no`,`trade_no`,`order_state`,`fn_coupon`,`red_packet`,`total_fee`,`order_price`,`fee`,`body`,`attach`,`store_id`,`cashier_id`,`device_no`,`user_id`,`user_logon_id`,`pay_time`,`pay_channel`,`no_cash_coupon_fee`,`cash_coupon_fee`,`cash_fee`,`sign`,`options`,`create_time`,`push_time`,`push_ip`,`mcht_id`,`sn` from fb_order
|
|
||||||
<where>
|
|
||||||
<if test="id != null and id != ''"> and id = #{id} </if>
|
|
||||||
<if test="fbMerchantCode != null and fbMerchantCode != ''"> and fb_merchant_code = #{fbMerchantCode} </if>
|
|
||||||
<if test="merchantOrderSn != null and merchantOrderSn != ''"> and merchant_order_sn = #{merchantOrderSn} </if>
|
|
||||||
<if test="orderSn != null and orderSn != ''"> and order_sn = #{orderSn} </if>
|
|
||||||
<if test="platformOrderNo != null and platformOrderNo != ''"> and platform_order_no = #{platformOrderNo} </if>
|
|
||||||
<if test="tradeNo != null and tradeNo != ''"> and trade_no = #{tradeNo} </if>
|
|
||||||
<if test="orderState != null and orderState != ''"> and order_state = #{orderState} </if>
|
|
||||||
<if test="fnCoupon != null and fnCoupon != ''"> and fn_coupon = #{fnCoupon} </if>
|
|
||||||
<if test="redPacket != null and redPacket != ''"> and red_packet = #{redPacket} </if>
|
|
||||||
<if test="totalFee != null and totalFee != ''"> and total_fee = #{totalFee} </if>
|
|
||||||
<if test="orderPrice != null and orderPrice != ''"> and order_price = #{orderPrice} </if>
|
|
||||||
<if test="fee != null and fee != ''"> and fee = #{fee} </if>
|
|
||||||
<if test="body != null and body != ''"> and body = #{body} </if>
|
|
||||||
<if test="attach != null and attach != ''"> and attach = #{attach} </if>
|
|
||||||
<if test="storeId != null and storeId != ''"> and store_id = #{storeId} </if>
|
|
||||||
<if test="cashierId != null and cashierId != ''"> and cashier_id = #{cashierId} </if>
|
|
||||||
<if test="deviceNo != null and deviceNo != ''"> and device_no = #{deviceNo} </if>
|
|
||||||
<if test="userId != null and userId != ''"> and user_id = #{userId} </if>
|
|
||||||
<if test="userLogonId != null and userLogonId != ''"> and user_logon_id = #{userLogonId} </if>
|
|
||||||
<if test="payTime != null and payTime != ''"> and pay_time = #{payTime} </if>
|
|
||||||
<if test="payChannel != null and payChannel != ''"> and pay_channel = #{payChannel} </if>
|
|
||||||
<if test="noCashCouponFee != null and noCashCouponFee != ''"> and no_cash_coupon_fee = #{noCashCouponFee} </if>
|
|
||||||
<if test="cashCouponFee != null and cashCouponFee != ''"> and cash_coupon_fee = #{cashCouponFee} </if>
|
|
||||||
<if test="cashFee != null and cashFee != ''"> and cash_fee = #{cashFee} </if>
|
|
||||||
<if test="sign != null and sign != ''"> and sign = #{sign} </if>
|
|
||||||
<if test="options != null and options != ''"> and options = #{options} </if>
|
|
||||||
<if test="createTime != null and createTime != ''"> and create_time = #{createTime} </if>
|
|
||||||
<if test="pushTime != null and pushTime != ''"> and push_time = #{pushTime} </if>
|
|
||||||
<if test="pushIp != null and pushIp != ''"> and push_ip = #{pushIp} </if>
|
|
||||||
<if test="mchtId != null and mchtId != ''"> and mcht_id = #{mchtId} </if>
|
|
||||||
<if test="sn != null and sn != ''"> and sn = #{sn} </if>
|
|
||||||
</where>
|
|
||||||
<choose>
|
|
||||||
<when test="sort != null and sort.trim() != ''">
|
|
||||||
order by ${sort} ${order}
|
|
||||||
</when>
|
|
||||||
<otherwise>
|
|
||||||
order by id desc
|
|
||||||
</otherwise>
|
|
||||||
</choose>
|
|
||||||
<if test="offset != null and limit != null">
|
|
||||||
limit #{offset}, #{limit}
|
|
||||||
</if>
|
|
||||||
</select>
|
|
||||||
|
|
||||||
<select id="count" resultType="int">
|
|
||||||
select count(*) from fb_order
|
|
||||||
<where>
|
|
||||||
<if test="id != null and id != ''"> and id = #{id} </if>
|
|
||||||
<if test="fbMerchantCode != null and fbMerchantCode != ''"> and fb_merchant_code = #{fbMerchantCode} </if>
|
|
||||||
<if test="merchantOrderSn != null and merchantOrderSn != ''"> and merchant_order_sn = #{merchantOrderSn} </if>
|
|
||||||
<if test="orderSn != null and orderSn != ''"> and order_sn = #{orderSn} </if>
|
|
||||||
<if test="platformOrderNo != null and platformOrderNo != ''"> and platform_order_no = #{platformOrderNo} </if>
|
|
||||||
<if test="tradeNo != null and tradeNo != ''"> and trade_no = #{tradeNo} </if>
|
|
||||||
<if test="orderState != null and orderState != ''"> and order_state = #{orderState} </if>
|
|
||||||
<if test="fnCoupon != null and fnCoupon != ''"> and fn_coupon = #{fnCoupon} </if>
|
|
||||||
<if test="redPacket != null and redPacket != ''"> and red_packet = #{redPacket} </if>
|
|
||||||
<if test="totalFee != null and totalFee != ''"> and total_fee = #{totalFee} </if>
|
|
||||||
<if test="orderPrice != null and orderPrice != ''"> and order_price = #{orderPrice} </if>
|
|
||||||
<if test="fee != null and fee != ''"> and fee = #{fee} </if>
|
|
||||||
<if test="body != null and body != ''"> and body = #{body} </if>
|
|
||||||
<if test="attach != null and attach != ''"> and attach = #{attach} </if>
|
|
||||||
<if test="storeId != null and storeId != ''"> and store_id = #{storeId} </if>
|
|
||||||
<if test="cashierId != null and cashierId != ''"> and cashier_id = #{cashierId} </if>
|
|
||||||
<if test="deviceNo != null and deviceNo != ''"> and device_no = #{deviceNo} </if>
|
|
||||||
<if test="userId != null and userId != ''"> and user_id = #{userId} </if>
|
|
||||||
<if test="userLogonId != null and userLogonId != ''"> and user_logon_id = #{userLogonId} </if>
|
|
||||||
<if test="payTime != null and payTime != ''"> and pay_time = #{payTime} </if>
|
|
||||||
<if test="payChannel != null and payChannel != ''"> and pay_channel = #{payChannel} </if>
|
|
||||||
<if test="noCashCouponFee != null and noCashCouponFee != ''"> and no_cash_coupon_fee = #{noCashCouponFee} </if>
|
|
||||||
<if test="cashCouponFee != null and cashCouponFee != ''"> and cash_coupon_fee = #{cashCouponFee} </if>
|
|
||||||
<if test="cashFee != null and cashFee != ''"> and cash_fee = #{cashFee} </if>
|
|
||||||
<if test="sign != null and sign != ''"> and sign = #{sign} </if>
|
|
||||||
<if test="options != null and options != ''"> and options = #{options} </if>
|
|
||||||
<if test="createTime != null and createTime != ''"> and create_time = #{createTime} </if>
|
|
||||||
<if test="pushTime != null and pushTime != ''"> and push_time = #{pushTime} </if>
|
|
||||||
<if test="pushIp != null and pushIp != ''"> and push_ip = #{pushIp} </if>
|
|
||||||
<if test="mchtId != null and mchtId != ''"> and mcht_id = #{mchtId} </if>
|
|
||||||
<if test="sn != null and sn != ''"> and sn = #{sn} </if>
|
|
||||||
</where>
|
|
||||||
</select>
|
|
||||||
|
|
||||||
<insert id="save" parameterType="com.java2nb.test.domain.OrderDO" useGeneratedKeys="true" keyProperty="id">
|
|
||||||
insert into fb_order
|
|
||||||
(
|
|
||||||
`fb_merchant_code`,
|
|
||||||
`merchant_order_sn`,
|
|
||||||
`order_sn`,
|
|
||||||
`platform_order_no`,
|
|
||||||
`trade_no`,
|
|
||||||
`order_state`,
|
|
||||||
`fn_coupon`,
|
|
||||||
`red_packet`,
|
|
||||||
`total_fee`,
|
|
||||||
`order_price`,
|
|
||||||
`fee`,
|
|
||||||
`body`,
|
|
||||||
`attach`,
|
|
||||||
`store_id`,
|
|
||||||
`cashier_id`,
|
|
||||||
`device_no`,
|
|
||||||
`user_id`,
|
|
||||||
`user_logon_id`,
|
|
||||||
`pay_time`,
|
|
||||||
`pay_channel`,
|
|
||||||
`no_cash_coupon_fee`,
|
|
||||||
`cash_coupon_fee`,
|
|
||||||
`cash_fee`,
|
|
||||||
`sign`,
|
|
||||||
`options`,
|
|
||||||
`create_time`,
|
|
||||||
`push_time`,
|
|
||||||
`push_ip`,
|
|
||||||
`mcht_id`,
|
|
||||||
`sn`
|
|
||||||
)
|
|
||||||
values
|
|
||||||
(
|
|
||||||
#{fbMerchantCode},
|
|
||||||
#{merchantOrderSn},
|
|
||||||
#{orderSn},
|
|
||||||
#{platformOrderNo},
|
|
||||||
#{tradeNo},
|
|
||||||
#{orderState},
|
|
||||||
#{fnCoupon},
|
|
||||||
#{redPacket},
|
|
||||||
#{totalFee},
|
|
||||||
#{orderPrice},
|
|
||||||
#{fee},
|
|
||||||
#{body},
|
|
||||||
#{attach},
|
|
||||||
#{storeId},
|
|
||||||
#{cashierId},
|
|
||||||
#{deviceNo},
|
|
||||||
#{userId},
|
|
||||||
#{userLogonId},
|
|
||||||
#{payTime},
|
|
||||||
#{payChannel},
|
|
||||||
#{noCashCouponFee},
|
|
||||||
#{cashCouponFee},
|
|
||||||
#{cashFee},
|
|
||||||
#{sign},
|
|
||||||
#{options},
|
|
||||||
#{createTime},
|
|
||||||
#{pushTime},
|
|
||||||
#{pushIp},
|
|
||||||
#{mchtId},
|
|
||||||
#{sn}
|
|
||||||
)
|
|
||||||
</insert>
|
|
||||||
|
|
||||||
<insert id="saveSelective" parameterType="com.java2nb.test.domain.OrderDO" useGeneratedKeys="true" keyProperty="id">
|
|
||||||
insert into fb_order
|
|
||||||
(
|
|
||||||
<if test="id != null"> `id`, </if>
|
|
||||||
<if test="fbMerchantCode != null"> `fb_merchant_code`, </if>
|
|
||||||
<if test="merchantOrderSn != null"> `merchant_order_sn`, </if>
|
|
||||||
<if test="orderSn != null"> `order_sn`, </if>
|
|
||||||
<if test="platformOrderNo != null"> `platform_order_no`, </if>
|
|
||||||
<if test="tradeNo != null"> `trade_no`, </if>
|
|
||||||
<if test="orderState != null"> `order_state`, </if>
|
|
||||||
<if test="fnCoupon != null"> `fn_coupon`, </if>
|
|
||||||
<if test="redPacket != null"> `red_packet`, </if>
|
|
||||||
<if test="totalFee != null"> `total_fee`, </if>
|
|
||||||
<if test="orderPrice != null"> `order_price`, </if>
|
|
||||||
<if test="fee != null"> `fee`, </if>
|
|
||||||
<if test="body != null"> `body`, </if>
|
|
||||||
<if test="attach != null"> `attach`, </if>
|
|
||||||
<if test="storeId != null"> `store_id`, </if>
|
|
||||||
<if test="cashierId != null"> `cashier_id`, </if>
|
|
||||||
<if test="deviceNo != null"> `device_no`, </if>
|
|
||||||
<if test="userId != null"> `user_id`, </if>
|
|
||||||
<if test="userLogonId != null"> `user_logon_id`, </if>
|
|
||||||
<if test="payTime != null"> `pay_time`, </if>
|
|
||||||
<if test="payChannel != null"> `pay_channel`, </if>
|
|
||||||
<if test="noCashCouponFee != null"> `no_cash_coupon_fee`, </if>
|
|
||||||
<if test="cashCouponFee != null"> `cash_coupon_fee`, </if>
|
|
||||||
<if test="cashFee != null"> `cash_fee`, </if>
|
|
||||||
<if test="sign != null"> `sign`, </if>
|
|
||||||
<if test="options != null"> `options`, </if>
|
|
||||||
<if test="createTime != null"> `create_time`, </if>
|
|
||||||
<if test="pushTime != null"> `push_time`, </if>
|
|
||||||
<if test="pushIp != null"> `push_ip`, </if>
|
|
||||||
<if test="mchtId != null"> `mcht_id`, </if>
|
|
||||||
<if test="sn != null"> `sn` </if>
|
|
||||||
)
|
|
||||||
values
|
|
||||||
(
|
|
||||||
<if test="id != null"> #{id}, </if>
|
|
||||||
<if test="fbMerchantCode != null"> #{fbMerchantCode}, </if>
|
|
||||||
<if test="merchantOrderSn != null"> #{merchantOrderSn}, </if>
|
|
||||||
<if test="orderSn != null"> #{orderSn}, </if>
|
|
||||||
<if test="platformOrderNo != null"> #{platformOrderNo}, </if>
|
|
||||||
<if test="tradeNo != null"> #{tradeNo}, </if>
|
|
||||||
<if test="orderState != null"> #{orderState}, </if>
|
|
||||||
<if test="fnCoupon != null"> #{fnCoupon}, </if>
|
|
||||||
<if test="redPacket != null"> #{redPacket}, </if>
|
|
||||||
<if test="totalFee != null"> #{totalFee}, </if>
|
|
||||||
<if test="orderPrice != null"> #{orderPrice}, </if>
|
|
||||||
<if test="fee != null"> #{fee}, </if>
|
|
||||||
<if test="body != null"> #{body}, </if>
|
|
||||||
<if test="attach != null"> #{attach}, </if>
|
|
||||||
<if test="storeId != null"> #{storeId}, </if>
|
|
||||||
<if test="cashierId != null"> #{cashierId}, </if>
|
|
||||||
<if test="deviceNo != null"> #{deviceNo}, </if>
|
|
||||||
<if test="userId != null"> #{userId}, </if>
|
|
||||||
<if test="userLogonId != null"> #{userLogonId}, </if>
|
|
||||||
<if test="payTime != null"> #{payTime}, </if>
|
|
||||||
<if test="payChannel != null"> #{payChannel}, </if>
|
|
||||||
<if test="noCashCouponFee != null"> #{noCashCouponFee}, </if>
|
|
||||||
<if test="cashCouponFee != null"> #{cashCouponFee}, </if>
|
|
||||||
<if test="cashFee != null"> #{cashFee}, </if>
|
|
||||||
<if test="sign != null"> #{sign}, </if>
|
|
||||||
<if test="options != null"> #{options}, </if>
|
|
||||||
<if test="createTime != null"> #{createTime}, </if>
|
|
||||||
<if test="pushTime != null"> #{pushTime}, </if>
|
|
||||||
<if test="pushIp != null"> #{pushIp}, </if>
|
|
||||||
<if test="mchtId != null"> #{mchtId}, </if>
|
|
||||||
<if test="sn != null"> #{sn} </if>
|
|
||||||
)
|
|
||||||
</insert>
|
|
||||||
|
|
||||||
<update id="update" parameterType="com.java2nb.test.domain.OrderDO">
|
|
||||||
update fb_order
|
|
||||||
<set>
|
|
||||||
<if test="fbMerchantCode != null">`fb_merchant_code` = #{fbMerchantCode}, </if>
|
|
||||||
<if test="merchantOrderSn != null">`merchant_order_sn` = #{merchantOrderSn}, </if>
|
|
||||||
<if test="orderSn != null">`order_sn` = #{orderSn}, </if>
|
|
||||||
<if test="platformOrderNo != null">`platform_order_no` = #{platformOrderNo}, </if>
|
|
||||||
<if test="tradeNo != null">`trade_no` = #{tradeNo}, </if>
|
|
||||||
<if test="orderState != null">`order_state` = #{orderState}, </if>
|
|
||||||
<if test="fnCoupon != null">`fn_coupon` = #{fnCoupon}, </if>
|
|
||||||
<if test="redPacket != null">`red_packet` = #{redPacket}, </if>
|
|
||||||
<if test="totalFee != null">`total_fee` = #{totalFee}, </if>
|
|
||||||
<if test="orderPrice != null">`order_price` = #{orderPrice}, </if>
|
|
||||||
<if test="fee != null">`fee` = #{fee}, </if>
|
|
||||||
<if test="body != null">`body` = #{body}, </if>
|
|
||||||
<if test="attach != null">`attach` = #{attach}, </if>
|
|
||||||
<if test="storeId != null">`store_id` = #{storeId}, </if>
|
|
||||||
<if test="cashierId != null">`cashier_id` = #{cashierId}, </if>
|
|
||||||
<if test="deviceNo != null">`device_no` = #{deviceNo}, </if>
|
|
||||||
<if test="userId != null">`user_id` = #{userId}, </if>
|
|
||||||
<if test="userLogonId != null">`user_logon_id` = #{userLogonId}, </if>
|
|
||||||
<if test="payTime != null">`pay_time` = #{payTime}, </if>
|
|
||||||
<if test="payChannel != null">`pay_channel` = #{payChannel}, </if>
|
|
||||||
<if test="noCashCouponFee != null">`no_cash_coupon_fee` = #{noCashCouponFee}, </if>
|
|
||||||
<if test="cashCouponFee != null">`cash_coupon_fee` = #{cashCouponFee}, </if>
|
|
||||||
<if test="cashFee != null">`cash_fee` = #{cashFee}, </if>
|
|
||||||
<if test="sign != null">`sign` = #{sign}, </if>
|
|
||||||
<if test="options != null">`options` = #{options}, </if>
|
|
||||||
<if test="createTime != null">`create_time` = #{createTime}, </if>
|
|
||||||
<if test="pushTime != null">`push_time` = #{pushTime}, </if>
|
|
||||||
<if test="pushIp != null">`push_ip` = #{pushIp}, </if>
|
|
||||||
<if test="mchtId != null">`mcht_id` = #{mchtId}, </if>
|
|
||||||
<if test="sn != null">`sn` = #{sn}</if>
|
|
||||||
</set>
|
|
||||||
where id = #{id}
|
|
||||||
</update>
|
|
||||||
|
|
||||||
<delete id="remove">
|
|
||||||
delete from fb_order where id = #{value}
|
|
||||||
</delete>
|
|
||||||
|
|
||||||
<delete id="batchRemove">
|
|
||||||
delete from fb_order where id in
|
|
||||||
<foreach item="id" collection="array" open="(" separator="," close=")">
|
|
||||||
#{id}
|
|
||||||
</foreach>
|
|
||||||
</delete>
|
|
||||||
|
|
||||||
</mapper>
|
|
@ -1,18 +0,0 @@
|
|||||||
-- 菜单SQL
|
|
||||||
INSERT INTO `sys_menu` (`parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`)
|
|
||||||
VALUES ('1', '付呗-订单信息表', 'test/order', 'test:order:order', '1', 'fa', '6');
|
|
||||||
|
|
||||||
-- 按钮父菜单ID
|
|
||||||
set @parentId = @@identity;
|
|
||||||
|
|
||||||
-- 菜单对应按钮SQL
|
|
||||||
INSERT INTO `sys_menu` (`parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`)
|
|
||||||
SELECT @parentId, '查看', null, 'test:order:detail', '2', null, '6';
|
|
||||||
INSERT INTO `sys_menu` (`parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`)
|
|
||||||
SELECT @parentId, '新增', null, 'test:order:add', '2', null, '6';
|
|
||||||
INSERT INTO `sys_menu` (`parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`)
|
|
||||||
SELECT @parentId, '修改', null, 'test:order:edit', '2', null, '6';
|
|
||||||
INSERT INTO `sys_menu` (`parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`)
|
|
||||||
SELECT @parentId, '删除', null, 'test:order:remove', '2', null, '6';
|
|
||||||
INSERT INTO `sys_menu` (`parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`)
|
|
||||||
SELECT @parentId, '批量删除', null, 'test:order:batchRemove', '2', null, '6';
|
|
@ -1,25 +0,0 @@
|
|||||||
package com.java2nb.testDemo;
|
|
||||||
|
|
||||||
import org.junit.Test;
|
|
||||||
import org.junit.runner.RunWith;
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
|
||||||
import org.springframework.boot.test.context.SpringBootTest;
|
|
||||||
import org.springframework.data.redis.core.RedisTemplate;
|
|
||||||
import org.springframework.test.context.junit4.SpringRunner;
|
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
|
||||||
|
|
||||||
@RestController()
|
|
||||||
@RunWith(SpringRunner.class)
|
|
||||||
@SpringBootTest
|
|
||||||
public class TestDemo {
|
|
||||||
@Autowired
|
|
||||||
RedisTemplate redisTemplate;
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void test() {
|
|
||||||
redisTemplate.opsForValue().set("a", "b");
|
|
||||||
System.out.println(redisTemplate.opsForValue().get("a"));
|
|
||||||
}
|
|
||||||
|
|
||||||
;
|
|
||||||
}
|
|
@ -5,7 +5,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>novel</artifactId>
|
<artifactId>novel</artifactId>
|
||||||
<groupId>com.java2nb</groupId>
|
<groupId>com.java2nb</groupId>
|
||||||
<version>3.5.1</version>
|
<version>3.5.4</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
@ -8,8 +8,9 @@ import java.io.Serializable;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 自定义响应结构
|
* 自定义响应结构
|
||||||
* @author 11797
|
*
|
||||||
* @param <T>
|
* @param <T>
|
||||||
|
* @author 11797
|
||||||
*/
|
*/
|
||||||
@Data
|
@Data
|
||||||
public class ResultBean<T> implements Serializable {
|
public class ResultBean<T> implements Serializable {
|
||||||
@ -19,20 +20,20 @@ public class ResultBean<T> implements Serializable {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 响应消息
|
* 响应消息
|
||||||
* */
|
*/
|
||||||
private String msg = ResponseStatus.OK.getMsg();
|
private String msg = ResponseStatus.OK.getMsg();
|
||||||
/**
|
/**
|
||||||
* 响应中的数据
|
* 响应中的数据
|
||||||
* */
|
*/
|
||||||
private T data;
|
private T data;
|
||||||
|
|
||||||
private ResultBean() {
|
private ResultBean() {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private ResultBean(ResponseStatus ResponseStatus) {
|
private ResultBean(ResponseStatus responseStatus) {
|
||||||
this.code = ResponseStatus.getCode();;
|
this.code = responseStatus.getCode();
|
||||||
this.msg = ResponseStatus.getMsg();
|
this.msg = responseStatus.getMsg();
|
||||||
}
|
}
|
||||||
|
|
||||||
private ResultBean(T data) {
|
private ResultBean(T data) {
|
||||||
@ -40,34 +41,33 @@ public class ResultBean<T> implements Serializable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 业务处理成功,无数据返回
|
* 业务处理成功,无数据返回
|
||||||
* */
|
*/
|
||||||
public static ResultBean ok() {
|
public static ResultBean<Void> ok() {
|
||||||
return new ResultBean();
|
return new ResultBean<>();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 业务处理成功,有数据返回
|
* 业务处理成功,有数据返回
|
||||||
* */
|
*/
|
||||||
public static <T> ResultBean ok(T data) {
|
public static <T> ResultBean<T> ok(T data) {
|
||||||
return new ResultBean(data);
|
return new ResultBean<>(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 业务处理失败
|
* 业务处理失败
|
||||||
* */
|
*/
|
||||||
public static ResultBean fail(ResponseStatus ResponseStatus) {
|
public static ResultBean<Void> fail(ResponseStatus responseStatus) {
|
||||||
return new ResultBean(ResponseStatus);
|
return new ResultBean<>(responseStatus);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 系统错误
|
* 系统错误
|
||||||
* */
|
*/
|
||||||
public static ResultBean error() {
|
public static ResultBean<Void> error() {
|
||||||
return new ResultBean(ResponseStatus.ERROR);
|
return new ResultBean<>(ResponseStatus.ERROR);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -65,4 +65,8 @@ public interface CacheKey {
|
|||||||
* 累积的小说点击量
|
* 累积的小说点击量
|
||||||
* */
|
* */
|
||||||
String BOOK_ADD_VISIT_COUNT = "bookAddVisitCount";
|
String BOOK_ADD_VISIT_COUNT = "bookAddVisitCount";
|
||||||
}
|
/**
|
||||||
|
* 测试爬虫规则缓存
|
||||||
|
*/
|
||||||
|
String BOOK_TEST_PARSE = "testParse";
|
||||||
|
}
|
||||||
|
@ -16,108 +16,107 @@ import org.springframework.stereotype.Service;
|
|||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
@Service
|
@Service
|
||||||
public class EhCacheServiceImpl implements CacheService {
|
public class EhCacheServiceImpl implements CacheService {
|
||||||
|
|
||||||
private final CacheManager cacheManager ;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
private final CacheManager cacheManager;
|
||||||
* 获得一个Cache,没有则创建一个。
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
private Cache getCache(){
|
|
||||||
|
|
||||||
Cache cache = cacheManager.getCache("util_cache");
|
|
||||||
return cache;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String get(String key) {
|
|
||||||
Element element = getCache().get(key);
|
|
||||||
return element==null?null:(String)element.getObjectValue();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void set(String key, String value) {
|
|
||||||
Element element = new Element(key, value);
|
|
||||||
Cache cache = getCache();
|
|
||||||
//不过期
|
|
||||||
cache.getCacheConfiguration().setEternal(true);
|
|
||||||
cache.put(element);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void set(String key, String value, long timeout) {
|
|
||||||
Element element = new Element(key, value);
|
|
||||||
element.setTimeToLive((int) timeout);
|
|
||||||
Cache cache = getCache();
|
|
||||||
cache.put(element);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void del(String key) {
|
|
||||||
getCache().remove(key);
|
|
||||||
|
|
||||||
|
|
||||||
}
|
/**
|
||||||
|
* 获得一个Cache,没有则创建一个。
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
private Cache getCache() {
|
||||||
|
|
||||||
@Override
|
Cache cache = cacheManager.getCache("util_cache");
|
||||||
public boolean contains(String key) {
|
return cache;
|
||||||
return getCache().isKeyInCache(key);
|
}
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void expire(String key, long timeout) {
|
|
||||||
Element element = getCache().get(key);
|
|
||||||
if (element != null) {
|
|
||||||
Object value = element.getValue();
|
|
||||||
element = new Element(key, value);
|
|
||||||
element.setTimeToLive((int)timeout);
|
|
||||||
Cache cache = getCache();
|
|
||||||
cache.put(element);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
@Override
|
||||||
* 根据key获取缓存的Object类型数据
|
public String get(String key) {
|
||||||
*/
|
Element element = getCache().get(key);
|
||||||
@Override
|
return element == null ? null : (String) element.getObjectValue();
|
||||||
public Object getObject(String key) {
|
}
|
||||||
Element element = getCache().get(key);
|
|
||||||
return element==null?null:element.getObjectValue();
|
@Override
|
||||||
}
|
public void set(String key, String value) {
|
||||||
|
Element element = new Element(key, value);
|
||||||
|
Cache cache = getCache();
|
||||||
|
//不过期
|
||||||
|
cache.getCacheConfiguration().setEternal(true);
|
||||||
|
cache.put(element);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void set(String key, String value, long timeout) {
|
||||||
|
Element element = new Element(key, value);
|
||||||
|
element.setTimeToLive((int) timeout);
|
||||||
|
Cache cache = getCache();
|
||||||
|
cache.put(element);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void del(String key) {
|
||||||
|
getCache().remove(key);
|
||||||
|
|
||||||
|
|
||||||
/**
|
}
|
||||||
* 设置Object类型的缓存
|
|
||||||
*/
|
@Override
|
||||||
@Override
|
public boolean contains(String key) {
|
||||||
public void setObject(String key, Object value) {
|
return getCache().isKeyInCache(key);
|
||||||
Element element = new Element(key, value);
|
}
|
||||||
Cache cache = getCache();
|
|
||||||
//不过期
|
@Override
|
||||||
cache.getCacheConfiguration().setEternal(true);
|
public void expire(String key, long timeout) {
|
||||||
cache.put(element);
|
Element element = getCache().get(key);
|
||||||
|
if (element != null) {
|
||||||
}
|
Object value = element.getValue();
|
||||||
|
element = new Element(key, value);
|
||||||
|
element.setTimeToLive((int) timeout);
|
||||||
|
Cache cache = getCache();
|
||||||
|
cache.put(element);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 设置一个有过期时间的Object类型的缓存,单位秒
|
* 根据key获取缓存的Object类型数据
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void setObject(String key, Object value, long timeout) {
|
public Object getObject(String key) {
|
||||||
Element element = new Element(key, value);
|
Element element = getCache().get(key);
|
||||||
element.setTimeToLive((int) timeout);
|
return element == null ? null : element.getObjectValue();
|
||||||
Cache cache = getCache();
|
}
|
||||||
cache.put(element);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置Object类型的缓存
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void setObject(String key, Object value) {
|
||||||
|
Element element = new Element(key, value);
|
||||||
|
Cache cache = getCache();
|
||||||
|
//不过期
|
||||||
|
cache.getCacheConfiguration().setEternal(true);
|
||||||
|
cache.put(element);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置一个有过期时间的Object类型的缓存,单位秒
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void setObject(String key, Object value, long timeout) {
|
||||||
|
Element element = new Element(key, value);
|
||||||
|
element.setTimeToLive((int) timeout);
|
||||||
|
Cache cache = getCache();
|
||||||
|
cache.put(element);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -68,6 +68,12 @@ public enum ResponseStatus {
|
|||||||
* */
|
* */
|
||||||
ES_SEARCH_FAIL(9001,"搜索引擎查询错误!"),
|
ES_SEARCH_FAIL(9001,"搜索引擎查询错误!"),
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 文件相关错误
|
||||||
|
* */
|
||||||
|
FILE_DIR_MAKE_FAIL(10001,"目录创建失败"),
|
||||||
|
FILE_NOT_IMAGE(10002,"请上传图片类型的文件"),
|
||||||
|
FILE_SIZE_LIMIT(10003,"文件大小超出限制"),
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 其他通用错误
|
* 其他通用错误
|
||||||
|
@ -19,7 +19,7 @@ public class BeanUtil {
|
|||||||
* @return 新集合
|
* @return 新集合
|
||||||
* */
|
* */
|
||||||
@SneakyThrows
|
@SneakyThrows
|
||||||
public static <T> List<T> copyList(List source,Class<T> targetClass){
|
public static <T> List<T> copyList(List<? super T> source,Class<T> targetClass){
|
||||||
List<T> target = new ArrayList<>(source.size());
|
List<T> target = new ArrayList<>(source.size());
|
||||||
for( int i = 0 ; i < source.size() ; i++){
|
for( int i = 0 ; i < source.size() ; i++){
|
||||||
Object sourceItem = source.get(i);
|
Object sourceItem = source.get(i);
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package com.java2nb.novel.core.utils;
|
package com.java2nb.novel.core.utils;
|
||||||
|
|
||||||
import lombok.SneakyThrows;
|
import lombok.SneakyThrows;
|
||||||
|
import lombok.experimental.UtilityClass;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.apache.commons.codec.Charsets;
|
import org.apache.commons.codec.Charsets;
|
||||||
import org.apache.http.client.utils.DateUtils;
|
import org.apache.http.client.utils.DateUtils;
|
||||||
@ -11,6 +12,7 @@ import org.springframework.http.HttpMethod;
|
|||||||
import org.springframework.http.ResponseEntity;
|
import org.springframework.http.ResponseEntity;
|
||||||
|
|
||||||
import javax.imageio.ImageIO;
|
import javax.imageio.ImageIO;
|
||||||
|
import java.awt.image.BufferedImage;
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
@ -19,13 +21,14 @@ import java.util.Objects;
|
|||||||
* 文件操作工具类
|
* 文件操作工具类
|
||||||
* @author 11797
|
* @author 11797
|
||||||
*/
|
*/
|
||||||
|
@UtilityClass
|
||||||
@Slf4j
|
@Slf4j
|
||||||
public class FileUtil {
|
public class FileUtil {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 网络图片转本地
|
* 网络图片转本地
|
||||||
* */
|
* */
|
||||||
public static String network2Local(String picSrc,String picSavePath,String visitPrefix) {
|
public String network2Local(String picSrc,String picSavePath,String visitPrefix) {
|
||||||
InputStream input = null;
|
InputStream input = null;
|
||||||
OutputStream out = null;
|
OutputStream out = null;
|
||||||
try {
|
try {
|
||||||
@ -82,5 +85,21 @@ public class FileUtil {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 判断文件是否为图片
|
||||||
|
* @param file 需要判断的文件
|
||||||
|
* @return true:是图片,false:不是图片
|
||||||
|
* */
|
||||||
|
@SneakyThrows
|
||||||
|
public boolean isImage(File file){
|
||||||
|
|
||||||
|
BufferedImage bi = ImageIO.read(file);
|
||||||
|
|
||||||
|
return bi != null;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,11 +1,11 @@
|
|||||||
package com.java2nb.novel.entity;
|
package com.java2nb.novel.entity;
|
||||||
|
|
||||||
|
|
||||||
import javax.annotation.Generated;
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
import javax.annotation.Generated;
|
||||||
|
|
||||||
public class News implements Serializable {
|
public class News implements Serializable {
|
||||||
|
|
||||||
@Generated("org.mybatis.generator.api.MyBatisGenerator")
|
@Generated("org.mybatis.generator.api.MyBatisGenerator")
|
||||||
private Long id;
|
private Long id;
|
||||||
|
|
||||||
@ -21,6 +21,9 @@ public class News implements Serializable {
|
|||||||
@Generated("org.mybatis.generator.api.MyBatisGenerator")
|
@Generated("org.mybatis.generator.api.MyBatisGenerator")
|
||||||
private String title;
|
private String title;
|
||||||
|
|
||||||
|
@Generated("org.mybatis.generator.api.MyBatisGenerator")
|
||||||
|
private Long readCount;
|
||||||
|
|
||||||
@Generated("org.mybatis.generator.api.MyBatisGenerator")
|
@Generated("org.mybatis.generator.api.MyBatisGenerator")
|
||||||
private Date createTime;
|
private Date createTime;
|
||||||
|
|
||||||
@ -86,6 +89,16 @@ public class News implements Serializable {
|
|||||||
this.title = title == null ? null : title.trim();
|
this.title = title == null ? null : title.trim();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Generated("org.mybatis.generator.api.MyBatisGenerator")
|
||||||
|
public Long getReadCount() {
|
||||||
|
return readCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Generated("org.mybatis.generator.api.MyBatisGenerator")
|
||||||
|
public void setReadCount(Long readCount) {
|
||||||
|
this.readCount = readCount;
|
||||||
|
}
|
||||||
|
|
||||||
@Generated("org.mybatis.generator.api.MyBatisGenerator")
|
@Generated("org.mybatis.generator.api.MyBatisGenerator")
|
||||||
public Date getCreateTime() {
|
public Date getCreateTime() {
|
||||||
return createTime;
|
return createTime;
|
||||||
@ -135,4 +148,4 @@ public class News implements Serializable {
|
|||||||
public void setContent(String content) {
|
public void setContent(String content) {
|
||||||
this.content = content == null ? null : content.trim();
|
this.content = content == null ? null : content.trim();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -25,6 +25,9 @@ public final class NewsDynamicSqlSupport {
|
|||||||
@Generated("org.mybatis.generator.api.MyBatisGenerator")
|
@Generated("org.mybatis.generator.api.MyBatisGenerator")
|
||||||
public static final SqlColumn<String> title = news.title;
|
public static final SqlColumn<String> title = news.title;
|
||||||
|
|
||||||
|
@Generated("org.mybatis.generator.api.MyBatisGenerator")
|
||||||
|
public static final SqlColumn<Long> readCount = news.readCount;
|
||||||
|
|
||||||
@Generated("org.mybatis.generator.api.MyBatisGenerator")
|
@Generated("org.mybatis.generator.api.MyBatisGenerator")
|
||||||
public static final SqlColumn<Date> createTime = news.createTime;
|
public static final SqlColumn<Date> createTime = news.createTime;
|
||||||
|
|
||||||
@ -52,6 +55,8 @@ public final class NewsDynamicSqlSupport {
|
|||||||
|
|
||||||
public final SqlColumn<String> title = column("title", JDBCType.VARCHAR);
|
public final SqlColumn<String> title = column("title", JDBCType.VARCHAR);
|
||||||
|
|
||||||
|
public final SqlColumn<Long> readCount = column("read_count", JDBCType.BIGINT);
|
||||||
|
|
||||||
public final SqlColumn<Date> createTime = column("create_time", JDBCType.TIMESTAMP);
|
public final SqlColumn<Date> createTime = column("create_time", JDBCType.TIMESTAMP);
|
||||||
|
|
||||||
public final SqlColumn<Long> createUserId = column("create_user_id", JDBCType.BIGINT);
|
public final SqlColumn<Long> createUserId = column("create_user_id", JDBCType.BIGINT);
|
||||||
|
@ -35,7 +35,7 @@ import org.mybatis.dynamic.sql.util.mybatis3.MyBatis3Utils;
|
|||||||
@Mapper
|
@Mapper
|
||||||
public interface NewsMapper {
|
public interface NewsMapper {
|
||||||
@Generated("org.mybatis.generator.api.MyBatisGenerator")
|
@Generated("org.mybatis.generator.api.MyBatisGenerator")
|
||||||
BasicColumn[] selectList = BasicColumn.columnList(id, catId, catName, sourceName, title, createTime, createUserId, updateTime, updateUserId, content);
|
BasicColumn[] selectList = BasicColumn.columnList(id, catId, catName, sourceName, title, readCount, createTime, createUserId, updateTime, updateUserId, content);
|
||||||
|
|
||||||
@Generated("org.mybatis.generator.api.MyBatisGenerator")
|
@Generated("org.mybatis.generator.api.MyBatisGenerator")
|
||||||
@SelectProvider(type=SqlProviderAdapter.class, method="select")
|
@SelectProvider(type=SqlProviderAdapter.class, method="select")
|
||||||
@ -66,6 +66,7 @@ public interface NewsMapper {
|
|||||||
@Result(column="cat_name", property="catName", jdbcType=JdbcType.VARCHAR),
|
@Result(column="cat_name", property="catName", jdbcType=JdbcType.VARCHAR),
|
||||||
@Result(column="source_name", property="sourceName", jdbcType=JdbcType.VARCHAR),
|
@Result(column="source_name", property="sourceName", jdbcType=JdbcType.VARCHAR),
|
||||||
@Result(column="title", property="title", jdbcType=JdbcType.VARCHAR),
|
@Result(column="title", property="title", jdbcType=JdbcType.VARCHAR),
|
||||||
|
@Result(column="read_count", property="readCount", jdbcType=JdbcType.BIGINT),
|
||||||
@Result(column="create_time", property="createTime", jdbcType=JdbcType.TIMESTAMP),
|
@Result(column="create_time", property="createTime", jdbcType=JdbcType.TIMESTAMP),
|
||||||
@Result(column="create_user_id", property="createUserId", jdbcType=JdbcType.BIGINT),
|
@Result(column="create_user_id", property="createUserId", jdbcType=JdbcType.BIGINT),
|
||||||
@Result(column="update_time", property="updateTime", jdbcType=JdbcType.TIMESTAMP),
|
@Result(column="update_time", property="updateTime", jdbcType=JdbcType.TIMESTAMP),
|
||||||
@ -103,6 +104,7 @@ public interface NewsMapper {
|
|||||||
.map(catName).toProperty("catName")
|
.map(catName).toProperty("catName")
|
||||||
.map(sourceName).toProperty("sourceName")
|
.map(sourceName).toProperty("sourceName")
|
||||||
.map(title).toProperty("title")
|
.map(title).toProperty("title")
|
||||||
|
.map(readCount).toProperty("readCount")
|
||||||
.map(createTime).toProperty("createTime")
|
.map(createTime).toProperty("createTime")
|
||||||
.map(createUserId).toProperty("createUserId")
|
.map(createUserId).toProperty("createUserId")
|
||||||
.map(updateTime).toProperty("updateTime")
|
.map(updateTime).toProperty("updateTime")
|
||||||
@ -119,6 +121,7 @@ public interface NewsMapper {
|
|||||||
.map(catName).toProperty("catName")
|
.map(catName).toProperty("catName")
|
||||||
.map(sourceName).toProperty("sourceName")
|
.map(sourceName).toProperty("sourceName")
|
||||||
.map(title).toProperty("title")
|
.map(title).toProperty("title")
|
||||||
|
.map(readCount).toProperty("readCount")
|
||||||
.map(createTime).toProperty("createTime")
|
.map(createTime).toProperty("createTime")
|
||||||
.map(createUserId).toProperty("createUserId")
|
.map(createUserId).toProperty("createUserId")
|
||||||
.map(updateTime).toProperty("updateTime")
|
.map(updateTime).toProperty("updateTime")
|
||||||
@ -135,6 +138,7 @@ public interface NewsMapper {
|
|||||||
.map(catName).toPropertyWhenPresent("catName", record::getCatName)
|
.map(catName).toPropertyWhenPresent("catName", record::getCatName)
|
||||||
.map(sourceName).toPropertyWhenPresent("sourceName", record::getSourceName)
|
.map(sourceName).toPropertyWhenPresent("sourceName", record::getSourceName)
|
||||||
.map(title).toPropertyWhenPresent("title", record::getTitle)
|
.map(title).toPropertyWhenPresent("title", record::getTitle)
|
||||||
|
.map(readCount).toPropertyWhenPresent("readCount", record::getReadCount)
|
||||||
.map(createTime).toPropertyWhenPresent("createTime", record::getCreateTime)
|
.map(createTime).toPropertyWhenPresent("createTime", record::getCreateTime)
|
||||||
.map(createUserId).toPropertyWhenPresent("createUserId", record::getCreateUserId)
|
.map(createUserId).toPropertyWhenPresent("createUserId", record::getCreateUserId)
|
||||||
.map(updateTime).toPropertyWhenPresent("updateTime", record::getUpdateTime)
|
.map(updateTime).toPropertyWhenPresent("updateTime", record::getUpdateTime)
|
||||||
@ -177,6 +181,7 @@ public interface NewsMapper {
|
|||||||
.set(catName).equalTo(record::getCatName)
|
.set(catName).equalTo(record::getCatName)
|
||||||
.set(sourceName).equalTo(record::getSourceName)
|
.set(sourceName).equalTo(record::getSourceName)
|
||||||
.set(title).equalTo(record::getTitle)
|
.set(title).equalTo(record::getTitle)
|
||||||
|
.set(readCount).equalTo(record::getReadCount)
|
||||||
.set(createTime).equalTo(record::getCreateTime)
|
.set(createTime).equalTo(record::getCreateTime)
|
||||||
.set(createUserId).equalTo(record::getCreateUserId)
|
.set(createUserId).equalTo(record::getCreateUserId)
|
||||||
.set(updateTime).equalTo(record::getUpdateTime)
|
.set(updateTime).equalTo(record::getUpdateTime)
|
||||||
@ -191,6 +196,7 @@ public interface NewsMapper {
|
|||||||
.set(catName).equalToWhenPresent(record::getCatName)
|
.set(catName).equalToWhenPresent(record::getCatName)
|
||||||
.set(sourceName).equalToWhenPresent(record::getSourceName)
|
.set(sourceName).equalToWhenPresent(record::getSourceName)
|
||||||
.set(title).equalToWhenPresent(record::getTitle)
|
.set(title).equalToWhenPresent(record::getTitle)
|
||||||
|
.set(readCount).equalToWhenPresent(record::getReadCount)
|
||||||
.set(createTime).equalToWhenPresent(record::getCreateTime)
|
.set(createTime).equalToWhenPresent(record::getCreateTime)
|
||||||
.set(createUserId).equalToWhenPresent(record::getCreateUserId)
|
.set(createUserId).equalToWhenPresent(record::getCreateUserId)
|
||||||
.set(updateTime).equalToWhenPresent(record::getUpdateTime)
|
.set(updateTime).equalToWhenPresent(record::getUpdateTime)
|
||||||
@ -205,6 +211,7 @@ public interface NewsMapper {
|
|||||||
.set(catName).equalTo(record::getCatName)
|
.set(catName).equalTo(record::getCatName)
|
||||||
.set(sourceName).equalTo(record::getSourceName)
|
.set(sourceName).equalTo(record::getSourceName)
|
||||||
.set(title).equalTo(record::getTitle)
|
.set(title).equalTo(record::getTitle)
|
||||||
|
.set(readCount).equalTo(record::getReadCount)
|
||||||
.set(createTime).equalTo(record::getCreateTime)
|
.set(createTime).equalTo(record::getCreateTime)
|
||||||
.set(createUserId).equalTo(record::getCreateUserId)
|
.set(createUserId).equalTo(record::getCreateUserId)
|
||||||
.set(updateTime).equalTo(record::getUpdateTime)
|
.set(updateTime).equalTo(record::getUpdateTime)
|
||||||
@ -221,6 +228,7 @@ public interface NewsMapper {
|
|||||||
.set(catName).equalToWhenPresent(record::getCatName)
|
.set(catName).equalToWhenPresent(record::getCatName)
|
||||||
.set(sourceName).equalToWhenPresent(record::getSourceName)
|
.set(sourceName).equalToWhenPresent(record::getSourceName)
|
||||||
.set(title).equalToWhenPresent(record::getTitle)
|
.set(title).equalToWhenPresent(record::getTitle)
|
||||||
|
.set(readCount).equalToWhenPresent(record::getReadCount)
|
||||||
.set(createTime).equalToWhenPresent(record::getCreateTime)
|
.set(createTime).equalToWhenPresent(record::getCreateTime)
|
||||||
.set(createUserId).equalToWhenPresent(record::getCreateUserId)
|
.set(createUserId).equalToWhenPresent(record::getCreateUserId)
|
||||||
.set(updateTime).equalToWhenPresent(record::getUpdateTime)
|
.set(updateTime).equalToWhenPresent(record::getUpdateTime)
|
||||||
|
@ -11,6 +11,11 @@ spring:
|
|||||||
generator:
|
generator:
|
||||||
write-numbers-as-strings: true
|
write-numbers-as-strings: true
|
||||||
|
|
||||||
|
#上传文件的最大值(1M)
|
||||||
|
servlet:
|
||||||
|
multipart:
|
||||||
|
max-file-size: 1048576
|
||||||
|
|
||||||
#缓存类型,ehcache(默认)、redis
|
#缓存类型,ehcache(默认)、redis
|
||||||
cache:
|
cache:
|
||||||
type: ehcache
|
type: ehcache
|
||||||
@ -26,3 +31,5 @@ logging:
|
|||||||
config: classpath:logback-boot.xml
|
config: classpath:logback-boot.xml
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -44,7 +44,7 @@
|
|||||||
</javaClientGenerator>
|
</javaClientGenerator>
|
||||||
|
|
||||||
<!--生成全部表tableName设为%-->
|
<!--生成全部表tableName设为%-->
|
||||||
<table tableName="book"/>
|
<table tableName="news"/>
|
||||||
|
|
||||||
<!-- 指定数据库表 -->
|
<!-- 指定数据库表 -->
|
||||||
<!--<table schema="jly" tableName="job_position" domainObjectName="JobPositionTest"/>-->
|
<!--<table schema="jly" tableName="job_position" domainObjectName="JobPositionTest"/>-->
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>novel</artifactId>
|
<artifactId>novel</artifactId>
|
||||||
<groupId>com.java2nb</groupId>
|
<groupId>com.java2nb</groupId>
|
||||||
<version>3.5.1</version>
|
<version>3.5.4</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
@ -32,11 +32,82 @@
|
|||||||
<build>
|
<build>
|
||||||
<plugins>
|
<plugins>
|
||||||
<plugin>
|
<plugin>
|
||||||
|
<!--打包时去除第三方依赖-->
|
||||||
<groupId>org.springframework.boot</groupId>
|
<groupId>org.springframework.boot</groupId>
|
||||||
<artifactId>spring-boot-maven-plugin</artifactId>
|
<artifactId>spring-boot-maven-plugin</artifactId>
|
||||||
|
<configuration>
|
||||||
|
<layout>ZIP</layout>
|
||||||
|
<includes>
|
||||||
|
<include>
|
||||||
|
<groupId>non-exists</groupId>
|
||||||
|
<artifactId>non-exists</artifactId>
|
||||||
|
</include>
|
||||||
|
</includes>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
<!--拷贝第三方依赖文件到指定目录-->
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-dependency-plugin</artifactId>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<id>copy-dependencies</id>
|
||||||
|
<phase>package</phase>
|
||||||
|
<goals>
|
||||||
|
<goal>copy-dependencies</goal>
|
||||||
|
</goals>
|
||||||
|
<configuration>
|
||||||
|
<!--target/lib是依赖jar包的输出目录,根据自己喜好配置-->
|
||||||
|
<outputDirectory>target/lib</outputDirectory>
|
||||||
|
<excludeTransitive>false</excludeTransitive>
|
||||||
|
<stripVersion>false</stripVersion>
|
||||||
|
<includeScope>runtime</includeScope>
|
||||||
|
</configuration>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<artifactId>maven-antrun-plugin</artifactId>
|
||||||
|
<version>1.8</version>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<phase>package</phase>
|
||||||
|
<goals>
|
||||||
|
<goal>run</goal>
|
||||||
|
</goals>
|
||||||
|
<configuration>
|
||||||
|
<tasks>
|
||||||
|
<!-- 文件夹 -->
|
||||||
|
<copy todir="${project.build.directory}/build/conf" overwrite="true">
|
||||||
|
<fileset dir="${basedir}/src/main/resources">
|
||||||
|
<include name="**/*.*"/>
|
||||||
|
<exclude name="mybatis/*/*.*"/>
|
||||||
|
</fileset>
|
||||||
|
</copy>
|
||||||
|
<move todir="${project.build.directory}/build/lib">
|
||||||
|
<fileset dir="target/lib"/>
|
||||||
|
</move>
|
||||||
|
<copy file="${project.build.directory}/${project.artifactId}-${project.version}.jar"
|
||||||
|
tofile="${project.build.directory}/build/${project.artifactId}.jar" />
|
||||||
|
|
||||||
|
<fixcrlf srcdir="${basedir}/src/main/build/scripts" eol="unix"/>
|
||||||
|
<copy todir="${project.build.directory}/build/bin">
|
||||||
|
<fileset dir="${basedir}/src/main/build/scripts">
|
||||||
|
<include name="*.sh" />
|
||||||
|
<include name="*.txt" />
|
||||||
|
<include name="*.bat" />
|
||||||
|
</fileset>
|
||||||
|
</copy>
|
||||||
|
<zip destfile='${project.build.directory}/build/${project.artifactId}.zip'>
|
||||||
|
<zipfileset filemode="755" dir= '${project.build.directory}/build/' />
|
||||||
|
</zip>
|
||||||
|
</tasks>
|
||||||
|
</configuration>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
</plugin>
|
</plugin>
|
||||||
</plugins>
|
</plugins>
|
||||||
</build>
|
</build>
|
||||||
|
|
||||||
|
|
||||||
</project>
|
</project>
|
||||||
|
8
novel-crawl/src/main/build/scripts/readme.txt
Normal file
8
novel-crawl/src/main/build/scripts/readme.txt
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
1:linux启动环境
|
||||||
|
sh start.sh
|
||||||
|
|
||||||
|
3:windows启动环境
|
||||||
|
windows-start.bat
|
||||||
|
|
||||||
|
3:linux停止应用
|
||||||
|
sh stop.sh
|
47
novel-crawl/src/main/build/scripts/start.sh
Normal file
47
novel-crawl/src/main/build/scripts/start.sh
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
ENGINE=novel-crawl.jar
|
||||||
|
cd ../
|
||||||
|
|
||||||
|
#部署目路
|
||||||
|
DEPLOY_DIR=`pwd`
|
||||||
|
#获取到当前目录的名称
|
||||||
|
SERVER_NAME=`basename $DEPLOY_DIR`
|
||||||
|
|
||||||
|
#应用进程
|
||||||
|
PIDS=`ps -ef | grep java | grep "$ENGINE" |awk '{print $2}'`
|
||||||
|
#设置日志文件的输出目录
|
||||||
|
LOGS_DIR=$DEPLOY_DIR/logs
|
||||||
|
if [ ! -d $LOGS_DIR ]; then
|
||||||
|
mkdir $LOGS_DIR
|
||||||
|
fi
|
||||||
|
#日志
|
||||||
|
STDOUT_FILE=$LOGS_DIR/stdout.log
|
||||||
|
#JAVA 环境配置
|
||||||
|
JAVA_OPTS=" -Djava.net.preferIPv4Stack=true -Dlog.home=$LOGS_DIR"
|
||||||
|
|
||||||
|
JAVA_MEM_OPTS=" -server -Xms1024m -Xmx1024m -XX:MetaspaceSize=64m -XX:MaxMetaspaceSize=256m -XX:+UseG1GC -XX:MaxGCPauseMillis=100 -XX:InitiatingHeapOccupancyPercent=50 -XX:+PrintGCApplicationStoppedTime -XX:+PrintGCApplicationConcurrentTime -XX:+PrintGCDateStamps -verbose:gc -XX:+PrintGCDetails -XX:+PrintHeapAtGC -Xloggc:$LOGS_DIR/gc.log -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=100M -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=dump.hprof "
|
||||||
|
#退出标志
|
||||||
|
RETVAL="0"
|
||||||
|
|
||||||
|
if [ -n "$PIDS" ]; then
|
||||||
|
echo "ERROR: The $SERVER_NAME already started!"
|
||||||
|
echo "PID: $PIDS"
|
||||||
|
exit $RETVAL
|
||||||
|
fi
|
||||||
|
|
||||||
|
nohup java -jar $JAVA_OPTS $JAVA_MEM_OPTS -Dloader.path=conf,lib $ENGINE > $STDOUT_FILE 2>&1 &
|
||||||
|
COUNT=0
|
||||||
|
while [ $COUNT -lt 1 ]; do
|
||||||
|
echo -e ".\c"
|
||||||
|
sleep 1
|
||||||
|
COUNT=`ps -f | grep java | grep "$DEPLOY_DIR" | awk '{print $2}' | wc -l`
|
||||||
|
if [ $COUNT -gt 0 ]; then
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "OK!"
|
||||||
|
PIDS=`ps -f | grep java | grep "$DEPLOY_DIR" | awk '{print $2}'`
|
||||||
|
echo "PID: $PIDS"
|
||||||
|
echo "STDOUT: $STDOUT_FILE"
|
33
novel-crawl/src/main/build/scripts/stop.sh
Normal file
33
novel-crawl/src/main/build/scripts/stop.sh
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
SERVER_NAME=novel-crawl.jar
|
||||||
|
|
||||||
|
#应用进程
|
||||||
|
PIDS=`ps -ef | grep java | grep "$SERVER_NAME" |awk '{print $2}'`
|
||||||
|
if [ -z "$PIDS" ]; then
|
||||||
|
echo "ERROR: The $SERVER_NAME does not started!"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo -e "Stopping the $SERVER_NAME ...\c"
|
||||||
|
for PID in $PIDS ; do
|
||||||
|
kill $PID > /dev/null 2>&1
|
||||||
|
done
|
||||||
|
|
||||||
|
COUNT=0
|
||||||
|
while [ $COUNT -lt 1 ]; do
|
||||||
|
echo -e ".\c"
|
||||||
|
sleep 1
|
||||||
|
COUNT=1
|
||||||
|
for PID in $PIDS ; do
|
||||||
|
PID_EXIST=`ps -f -p $PID | grep java`
|
||||||
|
if [ -n "$PID_EXIST" ]; then
|
||||||
|
COUNT=0
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "OK!"
|
||||||
|
echo "PID: $PIDS"
|
||||||
|
PIDS=""
|
||||||
|
|
10
novel-crawl/src/main/build/scripts/windows-start.bat
Normal file
10
novel-crawl/src/main/build/scripts/windows-start.bat
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
@echo off
|
||||||
|
setlocal enabledelayedexpansion
|
||||||
|
set JAVA=java
|
||||||
|
|
||||||
|
set OPTS=-XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=128m -Xms1024m -Xmx1024m -Xmn256m -Xss256k -XX:SurvivorRatio=8 -XX:+UseConcMarkSweepGC
|
||||||
|
set ENGINE=novel-crawl.jar
|
||||||
|
cd ../
|
||||||
|
java -jar %OPTS% -Dloader.path=conf,lib %ENGINE%
|
||||||
|
pause
|
||||||
|
|
@ -1,16 +1,26 @@
|
|||||||
package com.java2nb.novel.controller;
|
package com.java2nb.novel.controller;
|
||||||
|
|
||||||
import com.github.pagehelper.PageInfo;
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
|
import com.java2nb.novel.core.bean.PageBean;
|
||||||
import com.java2nb.novel.core.bean.ResultBean;
|
import com.java2nb.novel.core.bean.ResultBean;
|
||||||
import com.java2nb.novel.core.utils.BeanUtil;
|
import com.java2nb.novel.core.cache.CacheKey;
|
||||||
|
import com.java2nb.novel.core.cache.CacheService;
|
||||||
|
import com.java2nb.novel.core.crawl.CrawlParser;
|
||||||
|
import com.java2nb.novel.core.crawl.RuleBean;
|
||||||
|
import com.java2nb.novel.core.utils.HttpUtil;
|
||||||
|
import com.java2nb.novel.entity.BookIndex;
|
||||||
import com.java2nb.novel.entity.CrawlSingleTask;
|
import com.java2nb.novel.entity.CrawlSingleTask;
|
||||||
import com.java2nb.novel.entity.CrawlSource;
|
import com.java2nb.novel.entity.CrawlSource;
|
||||||
import com.java2nb.novel.service.CrawlService;
|
import com.java2nb.novel.service.CrawlService;
|
||||||
import com.java2nb.novel.vo.CrawlSingleTaskVO;
|
import com.java2nb.novel.utils.Constants;
|
||||||
import com.java2nb.novel.vo.CrawlSourceVO;
|
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import org.springframework.web.bind.annotation.*;
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.regex.Matcher;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Administrator
|
* @author Administrator
|
||||||
*/
|
*/
|
||||||
@ -21,12 +31,12 @@ public class CrawlController {
|
|||||||
|
|
||||||
private final CrawlService crawlService;
|
private final CrawlService crawlService;
|
||||||
|
|
||||||
|
private final CacheService cacheService;
|
||||||
/**
|
/**
|
||||||
* 新增爬虫源
|
* 新增爬虫源
|
||||||
* */
|
* */
|
||||||
@PostMapping("addCrawlSource")
|
@PostMapping("addCrawlSource")
|
||||||
public ResultBean addCrawlSource(CrawlSource source){
|
public ResultBean<Void> addCrawlSource(CrawlSource source){
|
||||||
crawlService.addCrawlSource(source);
|
crawlService.addCrawlSource(source);
|
||||||
|
|
||||||
return ResultBean.ok();
|
return ResultBean.ok();
|
||||||
@ -37,16 +47,79 @@ 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<PageBean<CrawlSource>> listCrawlByPage(@RequestParam(value = "curr", defaultValue = "1") int page, @RequestParam(value = "limit", defaultValue = "10") int pageSize){
|
||||||
|
|
||||||
return ResultBean.ok(crawlService.listCrawlByPage(page,pageSize));
|
return ResultBean.ok(crawlService.listCrawlByPage(page,pageSize));
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
* 获取爬虫源
|
||||||
|
* */
|
||||||
|
@GetMapping("getCrawlSource/{id}")
|
||||||
|
public ResultBean<CrawlSource> getCrawlSource(@PathVariable("id") Integer id){
|
||||||
|
CrawlSource crawlSource= crawlService.getCrawlSource(id);
|
||||||
|
return ResultBean.ok(crawlSource);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 测试规则
|
||||||
|
* @param rule
|
||||||
|
* @param url
|
||||||
|
* @param isRefresh
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
@PostMapping("testParse")
|
||||||
|
public ResultBean<Object> testParse(String rule,String url,String isRefresh){
|
||||||
|
|
||||||
|
Map<String,Object> resultMap=new HashMap<>();
|
||||||
|
String html =null;
|
||||||
|
if(url.startsWith("https://")||url.startsWith("http://")){
|
||||||
|
String refreshCache="1";
|
||||||
|
if(!refreshCache.equals(isRefresh)) {
|
||||||
|
Object cache = cacheService.getObject(CacheKey.BOOK_TEST_PARSE + url);
|
||||||
|
if (cache == null) {
|
||||||
|
isRefresh="1";
|
||||||
|
}else {
|
||||||
|
html = (String) cache;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(refreshCache.equals(isRefresh)){
|
||||||
|
html = HttpUtil.getByHttpClientWithChrome(url);
|
||||||
|
if (html != null) {
|
||||||
|
cacheService.setObject(CacheKey.BOOK_TEST_PARSE + url, html, 60 * 10);
|
||||||
|
}else{
|
||||||
|
resultMap.put("msg","html is null");
|
||||||
|
return ResultBean.ok(resultMap);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
resultMap.put("html","url is null");
|
||||||
|
return ResultBean.ok(resultMap);
|
||||||
|
}
|
||||||
|
Pattern pattern = Pattern.compile(rule);
|
||||||
|
Matcher matcher = pattern.matcher(html);
|
||||||
|
boolean isFind = matcher.find();
|
||||||
|
resultMap.put("是否匹配",isFind);
|
||||||
|
if(isFind){
|
||||||
|
resultMap.put("匹配结果",matcher.group(1));
|
||||||
|
}
|
||||||
|
// resultMap.put("url",url);
|
||||||
|
return ResultBean.ok(resultMap);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 修改爬虫源
|
||||||
|
* */
|
||||||
|
@PostMapping("updateCrawlSource")
|
||||||
|
public ResultBean<Void> updateCrawlSource(CrawlSource source){
|
||||||
|
crawlService.updateCrawlSource(source);
|
||||||
|
return ResultBean.ok();
|
||||||
|
|
||||||
|
}
|
||||||
/**
|
/**
|
||||||
* 开启或停止爬虫
|
* 开启或停止爬虫
|
||||||
* */
|
* */
|
||||||
@PostMapping("openOrCloseCrawl")
|
@PostMapping("openOrCloseCrawl")
|
||||||
public ResultBean openOrCloseCrawl(Integer sourceId,Byte sourceStatus){
|
public ResultBean<Void> openOrCloseCrawl(Integer sourceId,Byte sourceStatus){
|
||||||
|
|
||||||
crawlService.openOrCloseCrawl(sourceId,sourceStatus);
|
crawlService.openOrCloseCrawl(sourceId,sourceStatus);
|
||||||
|
|
||||||
@ -57,7 +130,7 @@ public class CrawlController {
|
|||||||
* 新增单本采集任务
|
* 新增单本采集任务
|
||||||
* */
|
* */
|
||||||
@PostMapping("addCrawlSingleTask")
|
@PostMapping("addCrawlSingleTask")
|
||||||
public ResultBean addCrawlSingleTask(CrawlSingleTask singleTask){
|
public ResultBean<Void> addCrawlSingleTask(CrawlSingleTask singleTask){
|
||||||
crawlService.addCrawlSingleTask(singleTask);
|
crawlService.addCrawlSingleTask(singleTask);
|
||||||
|
|
||||||
return ResultBean.ok();
|
return ResultBean.ok();
|
||||||
@ -68,7 +141,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<PageBean<CrawlSingleTask>> listCrawlSingleTaskByPage(@RequestParam(value = "curr", defaultValue = "1") int page, @RequestParam(value = "limit", defaultValue = "10") int pageSize){
|
||||||
|
|
||||||
return ResultBean.ok(crawlService.listCrawlSingleTaskByPage(page,pageSize));
|
return ResultBean.ok(crawlService.listCrawlSingleTaskByPage(page,pageSize));
|
||||||
}
|
}
|
||||||
@ -77,7 +150,7 @@ public class CrawlController {
|
|||||||
* 删除采集任务
|
* 删除采集任务
|
||||||
* */
|
* */
|
||||||
@DeleteMapping("delCrawlSingleTask/{id}")
|
@DeleteMapping("delCrawlSingleTask/{id}")
|
||||||
public ResultBean delCrawlSingleTask(@PathVariable("id") Long id){
|
public ResultBean<Void> delCrawlSingleTask(@PathVariable("id") Long id){
|
||||||
|
|
||||||
crawlService.delCrawlSingleTask(id);
|
crawlService.delCrawlSingleTask(id);
|
||||||
|
|
||||||
|
@ -1,18 +1,11 @@
|
|||||||
package com.java2nb.novel.controller;
|
package com.java2nb.novel.controller;
|
||||||
|
|
||||||
import com.java2nb.novel.entity.Book;
|
|
||||||
import com.java2nb.novel.entity.BookContent;
|
|
||||||
import com.java2nb.novel.entity.BookIndex;
|
|
||||||
import com.java2nb.novel.entity.News;
|
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.stereotype.Controller;
|
import org.springframework.stereotype.Controller;
|
||||||
import org.springframework.ui.Model;
|
|
||||||
import org.springframework.web.bind.annotation.PathVariable;
|
import org.springframework.web.bind.annotation.PathVariable;
|
||||||
import org.springframework.web.bind.annotation.RequestMapping;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author 11797
|
* @author 11797
|
||||||
*/
|
*/
|
||||||
|
@ -0,0 +1,25 @@
|
|||||||
|
package com.java2nb.novel.core.crawl;
|
||||||
|
|
||||||
|
import com.java2nb.novel.entity.BookContent;
|
||||||
|
import com.java2nb.novel.entity.BookIndex;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 章节数据封装bean
|
||||||
|
* @author Administrator
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
public class ChapterBean {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 章节索引集合
|
||||||
|
* */
|
||||||
|
List<BookIndex> bookIndexList;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 章节内容集合
|
||||||
|
* */
|
||||||
|
List<BookContent> bookContentList;
|
||||||
|
}
|
@ -0,0 +1,12 @@
|
|||||||
|
package com.java2nb.novel.core.crawl;
|
||||||
|
|
||||||
|
import com.java2nb.novel.entity.Book;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 爬虫小说章节内容处理器
|
||||||
|
* */
|
||||||
|
public interface CrawlBookChapterHandler {
|
||||||
|
|
||||||
|
void handle(ChapterBean chapterBean);
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,12 @@
|
|||||||
|
package com.java2nb.novel.core.crawl;
|
||||||
|
|
||||||
|
import com.java2nb.novel.entity.Book;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 爬虫小说处理器
|
||||||
|
* */
|
||||||
|
public interface CrawlBookHandler {
|
||||||
|
|
||||||
|
void handle(Book book);
|
||||||
|
|
||||||
|
}
|
@ -26,18 +26,14 @@ import static java.util.regex.Pattern.compile;
|
|||||||
@Slf4j
|
@Slf4j
|
||||||
public class CrawlParser {
|
public class CrawlParser {
|
||||||
|
|
||||||
private static IdWorker idWorker = new IdWorker();
|
private static final IdWorker idWorker = new IdWorker();
|
||||||
|
|
||||||
public static final Integer BOOK_INDEX_LIST_KEY = 1;
|
private static final RestTemplate restTemplate = RestTemplateUtil.getInstance("utf-8");
|
||||||
|
|
||||||
public static final Integer BOOK_CONTENT_LIST_KEY = 2;
|
private static final ThreadLocal<Integer> retryCount = new ThreadLocal<>();
|
||||||
|
|
||||||
private static RestTemplate restTemplate = RestTemplateUtil.getInstance("utf-8");
|
|
||||||
|
|
||||||
private static ThreadLocal<Integer> retryCount = new ThreadLocal<>();
|
|
||||||
|
|
||||||
@SneakyThrows
|
@SneakyThrows
|
||||||
public static Book parseBook(RuleBean ruleBean, String bookId) {
|
public static void parseBook(RuleBean ruleBean, String bookId, CrawlBookHandler handler) {
|
||||||
Book book = new Book();
|
Book book = new Book();
|
||||||
String bookDetailUrl = ruleBean.getBookDetailUrl().replace("{bookId}", bookId);
|
String bookDetailUrl = ruleBean.getBookDetailUrl().replace("{bookId}", bookId);
|
||||||
String bookDetailHtml = getByHttpClientWithChrome(bookDetailUrl);
|
String bookDetailHtml = getByHttpClientWithChrome(bookDetailUrl);
|
||||||
@ -139,13 +135,10 @@ public class CrawlParser {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return book;
|
handler.handle(book);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Map<Integer, List> parseBookIndexAndContent(String sourceBookId, Book book, RuleBean ruleBean, Map<Integer, BookIndex> hasIndexs) {
|
public static void parseBookIndexAndContent(String sourceBookId, Book book, RuleBean ruleBean, Map<Integer, BookIndex> existBookIndexMap, CrawlBookChapterHandler handler) {
|
||||||
Map<Integer, List> result = new HashMap<>(2);
|
|
||||||
result.put(BOOK_INDEX_LIST_KEY, new ArrayList(0));
|
|
||||||
result.put(BOOK_CONTENT_LIST_KEY, new ArrayList(0));
|
|
||||||
|
|
||||||
Date currentDate = new Date();
|
Date currentDate = new Date();
|
||||||
|
|
||||||
@ -171,11 +164,11 @@ public class CrawlParser {
|
|||||||
int indexNum = 0;
|
int indexNum = 0;
|
||||||
|
|
||||||
//总字数
|
//总字数
|
||||||
Integer totalWordCount = book.getWordCount() == null ? 0 : book.getWordCount();
|
int totalWordCount = book.getWordCount() == null ? 0 : book.getWordCount();
|
||||||
|
|
||||||
while (isFindIndex) {
|
while (isFindIndex) {
|
||||||
|
|
||||||
BookIndex hasIndex = hasIndexs.get(indexNum);
|
BookIndex hasIndex = existBookIndexMap.get(indexNum);
|
||||||
String indexName = indexNameMatch.group(1);
|
String indexName = indexNameMatch.group(1);
|
||||||
|
|
||||||
if (hasIndex == null || !StringUtils.deleteWhitespace(hasIndex.getIndexName()).equals(StringUtils.deleteWhitespace(indexName))) {
|
if (hasIndex == null || !StringUtils.deleteWhitespace(hasIndex.getIndexName()).equals(StringUtils.deleteWhitespace(indexName))) {
|
||||||
@ -221,7 +214,7 @@ public class CrawlParser {
|
|||||||
BookIndex bookIndex = new BookIndex();
|
BookIndex bookIndex = new BookIndex();
|
||||||
bookIndex.setIndexName(indexName);
|
bookIndex.setIndexName(indexName);
|
||||||
bookIndex.setIndexNum(indexNum);
|
bookIndex.setIndexNum(indexNum);
|
||||||
Integer wordCount = StringUtil.getStrValidWordCount(content);
|
int wordCount = StringUtil.getStrValidWordCount(content);
|
||||||
bookIndex.setWordCount(wordCount);
|
bookIndex.setWordCount(wordCount);
|
||||||
indexList.add(bookIndex);
|
indexList.add(bookIndex);
|
||||||
|
|
||||||
@ -235,7 +228,7 @@ public class CrawlParser {
|
|||||||
bookContent.setIndexId(hasIndex.getId());
|
bookContent.setIndexId(hasIndex.getId());
|
||||||
|
|
||||||
//计算总字数
|
//计算总字数
|
||||||
totalWordCount = (totalWordCount+wordCount-hasIndex.getWordCount());
|
totalWordCount = (totalWordCount + wordCount - hasIndex.getWordCount());
|
||||||
} else {
|
} else {
|
||||||
//章节插入
|
//章节插入
|
||||||
//设置目录和章节内容
|
//设置目录和章节内容
|
||||||
@ -253,7 +246,6 @@ public class CrawlParser {
|
|||||||
bookIndex.setUpdateTime(currentDate);
|
bookIndex.setUpdateTime(currentDate);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -266,7 +258,7 @@ public class CrawlParser {
|
|||||||
if (indexList.size() > 0) {
|
if (indexList.size() > 0) {
|
||||||
//如果有爬到最新章节,则设置小说主表的最新章节信息
|
//如果有爬到最新章节,则设置小说主表的最新章节信息
|
||||||
//获取爬取到的最新章节
|
//获取爬取到的最新章节
|
||||||
BookIndex lastIndex = indexList.get(indexList.size()-1);
|
BookIndex lastIndex = indexList.get(indexList.size() - 1);
|
||||||
book.setLastIndexId(lastIndex.getId());
|
book.setLastIndexId(lastIndex.getId());
|
||||||
book.setLastIndexName(lastIndex.getIndexName());
|
book.setLastIndexName(lastIndex.getIndexName());
|
||||||
book.setLastIndexUpdateTime(currentDate);
|
book.setLastIndexUpdateTime(currentDate);
|
||||||
@ -277,15 +269,22 @@ public class CrawlParser {
|
|||||||
|
|
||||||
if (indexList.size() == contentList.size() && indexList.size() > 0) {
|
if (indexList.size() == contentList.size() && indexList.size() > 0) {
|
||||||
|
|
||||||
result.put(BOOK_INDEX_LIST_KEY, indexList);
|
handler.handle(new ChapterBean() {{
|
||||||
result.put(BOOK_CONTENT_LIST_KEY, contentList);
|
setBookIndexList(indexList);
|
||||||
|
setBookContentList(contentList);
|
||||||
|
}});
|
||||||
|
|
||||||
|
return;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
handler.handle(new ChapterBean() {{
|
||||||
|
setBookIndexList(new ArrayList<>(0));
|
||||||
|
setBookContentList(new ArrayList<>(0));
|
||||||
|
}});
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -294,6 +293,7 @@ public class CrawlParser {
|
|||||||
ResponseEntity<String> forEntity = restTemplate.getForEntity(url, String.class);
|
ResponseEntity<String> forEntity = restTemplate.getForEntity(url, String.class);
|
||||||
if (forEntity.getStatusCode() == HttpStatus.OK) {
|
if (forEntity.getStatusCode() == HttpStatus.OK) {
|
||||||
String body = forEntity.getBody();
|
String body = forEntity.getBody();
|
||||||
|
assert body != null;
|
||||||
if (body.length() < Constants.INVALID_HTML_LENGTH) {
|
if (body.length() < Constants.INVALID_HTML_LENGTH) {
|
||||||
return processErrorHttpResult(url);
|
return processErrorHttpResult(url);
|
||||||
}
|
}
|
||||||
|
@ -35,7 +35,7 @@ public class RuleBean {
|
|||||||
private String statusPatten;
|
private String statusPatten;
|
||||||
private String scorePatten;
|
private String scorePatten;
|
||||||
private String visitCountPatten;
|
private String visitCountPatten;
|
||||||
private String descStart;;
|
private String descStart;
|
||||||
private String descEnd;
|
private String descEnd;
|
||||||
private String upadateTimePatten;
|
private String upadateTimePatten;
|
||||||
private String upadateTimeFormatPatten;
|
private String upadateTimeFormatPatten;
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package com.java2nb.novel.core.listener;
|
package com.java2nb.novel.core.listener;
|
||||||
|
|
||||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
|
import com.java2nb.novel.core.crawl.ChapterBean;
|
||||||
import com.java2nb.novel.core.crawl.CrawlParser;
|
import com.java2nb.novel.core.crawl.CrawlParser;
|
||||||
import com.java2nb.novel.core.crawl.RuleBean;
|
import com.java2nb.novel.core.crawl.RuleBean;
|
||||||
import com.java2nb.novel.entity.*;
|
import com.java2nb.novel.entity.*;
|
||||||
@ -16,9 +17,9 @@ import javax.servlet.ServletContextEvent;
|
|||||||
import javax.servlet.ServletContextListener;
|
import javax.servlet.ServletContextListener;
|
||||||
import javax.servlet.annotation.WebListener;
|
import javax.servlet.annotation.WebListener;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Administrator
|
* @author Administrator
|
||||||
@ -55,26 +56,28 @@ public class StarterListener implements ServletContextListener {
|
|||||||
CrawlSource source = crawlService.queryCrawlSource(needUpdateBook.getCrawlSourceId());
|
CrawlSource source = crawlService.queryCrawlSource(needUpdateBook.getCrawlSourceId());
|
||||||
RuleBean ruleBean = new ObjectMapper().readValue(source.getCrawlRule(), RuleBean.class);
|
RuleBean ruleBean = new ObjectMapper().readValue(source.getCrawlRule(), RuleBean.class);
|
||||||
//解析小说基本信息
|
//解析小说基本信息
|
||||||
Book book = CrawlParser.parseBook(ruleBean, needUpdateBook.getCrawlBookId());
|
CrawlParser.parseBook(ruleBean, needUpdateBook.getCrawlBookId(),book -> {
|
||||||
//这里只做老书更新
|
//这里只做老书更新
|
||||||
book.setId(needUpdateBook.getId());
|
book.setId(needUpdateBook.getId());
|
||||||
book.setWordCount(needUpdateBook.getWordCount());
|
book.setWordCount(needUpdateBook.getWordCount());
|
||||||
if (needUpdateBook.getPicUrl() != null && needUpdateBook.getPicUrl().contains(Constants.LOCAL_PIC_PREFIX)) {
|
if (needUpdateBook.getPicUrl() != null && needUpdateBook.getPicUrl().contains(Constants.LOCAL_PIC_PREFIX)) {
|
||||||
//本地图片则不更新
|
//本地图片则不更新
|
||||||
book.setPicUrl(null);
|
book.setPicUrl(null);
|
||||||
}
|
}
|
||||||
//查询已存在的章节
|
//查询已存在的章节
|
||||||
Map<Integer, BookIndex> existBookIndexMap = bookService.queryExistBookIndexMap(needUpdateBook.getId());
|
Map<Integer, BookIndex> existBookIndexMap = bookService.queryExistBookIndexMap(needUpdateBook.getId());
|
||||||
//解析章节目录
|
//解析章节目录
|
||||||
Map<Integer, List> indexAndContentList = CrawlParser.parseBookIndexAndContent(needUpdateBook.getCrawlBookId(), book, ruleBean, existBookIndexMap);
|
CrawlParser.parseBookIndexAndContent(needUpdateBook.getCrawlBookId(), book, ruleBean, existBookIndexMap,chapter -> {
|
||||||
bookService.updateBookAndIndexAndContent(book, (List<BookIndex>) indexAndContentList.get(CrawlParser.BOOK_INDEX_LIST_KEY), (List<BookContent>) indexAndContentList.get(CrawlParser.BOOK_CONTENT_LIST_KEY), existBookIndexMap);
|
bookService.updateBookAndIndexAndContent(book, chapter.getBookIndexList(), chapter.getBookContentList(), existBookIndexMap);
|
||||||
|
});
|
||||||
|
});
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
log.error(e.getMessage(), e);
|
log.error(e.getMessage(), e);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
// 休眠10分钟
|
||||||
Thread.sleep(1000 * 60 * 10);
|
TimeUnit.MINUTES.sleep(10);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
log.error(e.getMessage(), e);
|
log.error(e.getMessage(), e);
|
||||||
}
|
}
|
||||||
@ -107,7 +110,8 @@ public class StarterListener implements ServletContextListener {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Thread.sleep(1000 * 60);
|
//休眠1分钟
|
||||||
|
TimeUnit.MINUTES.sleep(1);
|
||||||
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
log.error(e.getMessage(), e);
|
log.error(e.getMessage(), e);
|
||||||
|
@ -8,12 +8,10 @@ import com.java2nb.novel.entity.CrawlSource;
|
|||||||
import com.java2nb.novel.service.CrawlService;
|
import com.java2nb.novel.service.CrawlService;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.scheduling.annotation.EnableScheduling;
|
|
||||||
import org.springframework.scheduling.annotation.Scheduled;
|
import org.springframework.scheduling.annotation.Scheduled;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -72,6 +72,7 @@ public interface BookService {
|
|||||||
* 更新一下最后一次的抓取时间
|
* 更新一下最后一次的抓取时间
|
||||||
* @param bookId 小说ID
|
* @param bookId 小说ID
|
||||||
* */
|
* */
|
||||||
|
@Deprecated
|
||||||
void updateCrawlLastTime(Long bookId);
|
void updateCrawlLastTime(Long bookId);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1,11 +1,10 @@
|
|||||||
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.bean.PageBean;
|
||||||
|
import com.java2nb.novel.core.bean.ResultBean;
|
||||||
import com.java2nb.novel.core.crawl.RuleBean;
|
import com.java2nb.novel.core.crawl.RuleBean;
|
||||||
import com.java2nb.novel.entity.CrawlSingleTask;
|
import com.java2nb.novel.entity.CrawlSingleTask;
|
||||||
import com.java2nb.novel.entity.CrawlSource;
|
import com.java2nb.novel.entity.CrawlSource;
|
||||||
import com.java2nb.novel.vo.CrawlSourceVO;
|
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@ -20,7 +19,11 @@ public interface CrawlService {
|
|||||||
* */
|
* */
|
||||||
void addCrawlSource(CrawlSource source);
|
void addCrawlSource(CrawlSource source);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 修改爬虫源
|
||||||
|
* @param source
|
||||||
|
*/
|
||||||
|
void updateCrawlSource(CrawlSource source);
|
||||||
/**
|
/**
|
||||||
* 爬虫源分页列表
|
* 爬虫源分页列表
|
||||||
* @param page 当前页码
|
* @param page 当前页码
|
||||||
@ -64,7 +67,7 @@ public interface CrawlService {
|
|||||||
* 根据分类ID和规则解析分类列表
|
* 根据分类ID和规则解析分类列表
|
||||||
* @param catId 分类ID
|
* @param catId 分类ID
|
||||||
* @param ruleBean 规则对象
|
* @param ruleBean 规则对象
|
||||||
* @param sourceId
|
* @param sourceId 爬虫源ID
|
||||||
*/
|
*/
|
||||||
void parseBookList(int catId, RuleBean ruleBean, Integer sourceId);
|
void parseBookList(int catId, RuleBean ruleBean, Integer sourceId);
|
||||||
|
|
||||||
@ -108,4 +111,11 @@ public interface CrawlService {
|
|||||||
* @param status 采集状态
|
* @param status 采集状态
|
||||||
* */
|
* */
|
||||||
void updateCrawlSingleTask(CrawlSingleTask task, Byte status);
|
void updateCrawlSingleTask(CrawlSingleTask task, Byte status);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取采集规则详细
|
||||||
|
* @param id
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
CrawlSource getCrawlSource(Integer id);
|
||||||
}
|
}
|
||||||
|
@ -176,19 +176,4 @@ public class BookServiceImpl implements BookService {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 查询最后的章节
|
|
||||||
* */
|
|
||||||
private BookIndex queryLastIndex(Long bookId) {
|
|
||||||
return bookIndexMapper.queryLastIndex(bookId);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 查询小说总字数
|
|
||||||
* */
|
|
||||||
private Integer queryTotalWordCount(Long bookId) {
|
|
||||||
|
|
||||||
return bookMapper.queryTotalWordCount(bookId);
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -1,9 +1,7 @@
|
|||||||
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.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;
|
||||||
@ -15,9 +13,13 @@ 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;
|
||||||
import com.java2nb.novel.entity.*;
|
import com.java2nb.novel.entity.Book;
|
||||||
|
import com.java2nb.novel.entity.CrawlSingleTask;
|
||||||
import com.java2nb.novel.entity.CrawlSource;
|
import com.java2nb.novel.entity.CrawlSource;
|
||||||
import com.java2nb.novel.mapper.*;
|
import com.java2nb.novel.mapper.CrawlSingleTaskDynamicSqlSupport;
|
||||||
|
import com.java2nb.novel.mapper.CrawlSingleTaskMapper;
|
||||||
|
import com.java2nb.novel.mapper.CrawlSourceDynamicSqlSupport;
|
||||||
|
import com.java2nb.novel.mapper.CrawlSourceMapper;
|
||||||
import com.java2nb.novel.service.BookService;
|
import com.java2nb.novel.service.BookService;
|
||||||
import com.java2nb.novel.service.CrawlService;
|
import com.java2nb.novel.service.CrawlService;
|
||||||
import com.java2nb.novel.vo.CrawlSingleTaskVO;
|
import com.java2nb.novel.vo.CrawlSingleTaskVO;
|
||||||
@ -29,18 +31,16 @@ import org.apache.commons.lang3.StringUtils;
|
|||||||
import org.mybatis.dynamic.sql.render.RenderingStrategies;
|
import org.mybatis.dynamic.sql.render.RenderingStrategies;
|
||||||
import org.mybatis.dynamic.sql.select.render.SelectStatementProvider;
|
import org.mybatis.dynamic.sql.select.render.SelectStatementProvider;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
import java.util.concurrent.atomic.AtomicBoolean;
|
||||||
import java.util.regex.Matcher;
|
import java.util.regex.Matcher;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
import static com.java2nb.novel.core.utils.HttpUtil.getByHttpClient;
|
|
||||||
import static com.java2nb.novel.core.utils.HttpUtil.getByHttpClientWithChrome;
|
import static com.java2nb.novel.core.utils.HttpUtil.getByHttpClientWithChrome;
|
||||||
import static com.java2nb.novel.mapper.BookDynamicSqlSupport.crawlBookId;
|
|
||||||
import static com.java2nb.novel.mapper.BookDynamicSqlSupport.crawlSourceId;
|
|
||||||
import static com.java2nb.novel.mapper.CrawlSourceDynamicSqlSupport.*;
|
import static com.java2nb.novel.mapper.CrawlSourceDynamicSqlSupport.*;
|
||||||
import static org.mybatis.dynamic.sql.SqlBuilder.*;
|
import static com.java2nb.novel.mapper.CrawlSourceDynamicSqlSupport.id;
|
||||||
|
import static org.mybatis.dynamic.sql.SqlBuilder.isEqualTo;
|
||||||
import static org.mybatis.dynamic.sql.select.SelectDSL.select;
|
import static org.mybatis.dynamic.sql.select.SelectDSL.select;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -70,7 +70,24 @@ public class CrawlServiceImpl implements CrawlService {
|
|||||||
crawlSourceMapper.insertSelective(source);
|
crawlSourceMapper.insertSelective(source);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@Override
|
||||||
|
public void updateCrawlSource(CrawlSource source) {
|
||||||
|
if(source.getId()!=null){
|
||||||
|
Optional<CrawlSource> opt=crawlSourceMapper.selectByPrimaryKey(source.getId());
|
||||||
|
if(opt.isPresent()) {
|
||||||
|
CrawlSource crawlSource =opt.get();
|
||||||
|
if (crawlSource.getSourceStatus() == (byte) 1) {
|
||||||
|
//关闭
|
||||||
|
openOrCloseCrawl(crawlSource.getId(),(byte)0);
|
||||||
|
}
|
||||||
|
Date currentDate = new Date();
|
||||||
|
crawlSource.setUpdateTime(currentDate);
|
||||||
|
crawlSource.setCrawlRule(source.getCrawlRule());
|
||||||
|
crawlSource.setSourceName(source.getSourceName());
|
||||||
|
crawlSourceMapper.updateByPrimaryKey(crawlSource);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@Override
|
@Override
|
||||||
public PageBean<CrawlSource> listCrawlByPage(int page, int pageSize) {
|
public PageBean<CrawlSource> listCrawlByPage(int page, int pageSize) {
|
||||||
PageHelper.startPage(page, pageSize);
|
PageHelper.startPage(page, pageSize);
|
||||||
@ -121,11 +138,7 @@ public class CrawlServiceImpl implements CrawlService {
|
|||||||
//按分类开始爬虫解析任务
|
//按分类开始爬虫解析任务
|
||||||
for (int i = 1; i < 8; i++) {
|
for (int i = 1; i < 8; i++) {
|
||||||
final int catId = i;
|
final int catId = i;
|
||||||
Thread thread = new Thread(() -> {
|
Thread thread = new Thread(() -> CrawlServiceImpl.this.parseBookList(catId, ruleBean, sourceId));
|
||||||
|
|
||||||
parseBookList(catId, ruleBean, sourceId);
|
|
||||||
|
|
||||||
});
|
|
||||||
thread.start();
|
thread.start();
|
||||||
//thread加入到监控缓存中
|
//thread加入到监控缓存中
|
||||||
threadIds.add(thread.getId());
|
threadIds.add(thread.getId());
|
||||||
@ -143,12 +156,17 @@ public class CrawlServiceImpl implements CrawlService {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public CrawlSource queryCrawlSource(Integer sourceId) {
|
public CrawlSource queryCrawlSource(Integer sourceId) {
|
||||||
SelectStatementProvider render = select(CrawlSourceDynamicSqlSupport.sourceStatus, CrawlSourceDynamicSqlSupport.crawlRule)
|
|
||||||
|
SelectStatementProvider render = select(id, sourceName, sourceStatus, createTime, updateTime,crawlRule)
|
||||||
.from(crawlSource)
|
.from(crawlSource)
|
||||||
.where(id, isEqualTo(sourceId))
|
.where(id, isEqualTo(sourceId))
|
||||||
.build()
|
.build()
|
||||||
.render(RenderingStrategies.MYBATIS3);
|
.render(RenderingStrategies.MYBATIS3);
|
||||||
return crawlSourceMapper.selectMany(render).get(0);
|
List<CrawlSource> list= crawlSourceMapper.selectMany(render);
|
||||||
|
if(list!=null&&list.size()>0){
|
||||||
|
return list.get(0);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -210,6 +228,16 @@ public class CrawlServiceImpl implements CrawlService {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public CrawlSource getCrawlSource(Integer id) {
|
||||||
|
Optional<CrawlSource> opt=crawlSourceMapper.selectByPrimaryKey(id);
|
||||||
|
if(opt.isPresent()) {
|
||||||
|
CrawlSource crawlSource =opt.get();
|
||||||
|
return crawlSource;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 解析分类列表
|
* 解析分类列表
|
||||||
*/
|
*/
|
||||||
@ -279,39 +307,46 @@ public class CrawlServiceImpl implements CrawlService {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean parseBookAndSave(int catId, RuleBean ruleBean, Integer sourceId, String bookId) {
|
public boolean parseBookAndSave(int catId, RuleBean ruleBean, Integer sourceId, String bookId) {
|
||||||
Book book = CrawlParser.parseBook(ruleBean, bookId);
|
|
||||||
if(book.getBookName() == null || book.getAuthorName() == null){
|
final AtomicBoolean parseResult = new AtomicBoolean(false);
|
||||||
return false;
|
|
||||||
}
|
CrawlParser.parseBook(ruleBean, bookId, book -> {
|
||||||
//这里只做新书入库,查询是否存在这本书
|
if(book.getBookName() == null || book.getAuthorName() == null){
|
||||||
Book existBook = bookService.queryBookByBookNameAndAuthorName(book.getBookName(), book.getAuthorName());
|
return;
|
||||||
//如果该小说不存在,则可以解析入库,但是标记该小说正在入库,30分钟之后才允许再次入库
|
|
||||||
if (existBook == null) {
|
|
||||||
//没有该书,可以入库
|
|
||||||
book.setCatId(catId);
|
|
||||||
//根据分类ID查询分类
|
|
||||||
book.setCatName(bookService.queryCatNameByCatId(catId));
|
|
||||||
if (catId == 7) {
|
|
||||||
//女频
|
|
||||||
book.setWorkDirection((byte) 1);
|
|
||||||
} else {
|
|
||||||
//男频
|
|
||||||
book.setWorkDirection((byte) 0);
|
|
||||||
}
|
}
|
||||||
book.setCrawlBookId(bookId);
|
//这里只做新书入库,查询是否存在这本书
|
||||||
book.setCrawlSourceId(sourceId);
|
Book existBook = bookService.queryBookByBookNameAndAuthorName(book.getBookName(), book.getAuthorName());
|
||||||
book.setCrawlLastTime(new Date());
|
//如果该小说不存在,则可以解析入库,但是标记该小说正在入库,30分钟之后才允许再次入库
|
||||||
book.setId(new IdWorker().nextId());
|
if (existBook == null) {
|
||||||
//解析章节目录
|
//没有该书,可以入库
|
||||||
Map<Integer, List> indexAndContentList = CrawlParser.parseBookIndexAndContent(bookId, book, ruleBean, new HashMap<>(0));
|
book.setCatId(catId);
|
||||||
|
//根据分类ID查询分类
|
||||||
|
book.setCatName(bookService.queryCatNameByCatId(catId));
|
||||||
|
if (catId == 7) {
|
||||||
|
//女频
|
||||||
|
book.setWorkDirection((byte) 1);
|
||||||
|
} else {
|
||||||
|
//男频
|
||||||
|
book.setWorkDirection((byte) 0);
|
||||||
|
}
|
||||||
|
book.setCrawlBookId(bookId);
|
||||||
|
book.setCrawlSourceId(sourceId);
|
||||||
|
book.setCrawlLastTime(new Date());
|
||||||
|
book.setId(new IdWorker().nextId());
|
||||||
|
//解析章节目录
|
||||||
|
CrawlParser.parseBookIndexAndContent(bookId, book, ruleBean, new HashMap<>(0),chapter -> {
|
||||||
|
bookService.saveBookAndIndexAndContent(book, chapter.getBookIndexList(), chapter.getBookContentList());
|
||||||
|
});
|
||||||
|
|
||||||
bookService.saveBookAndIndexAndContent(book, (List<BookIndex>) indexAndContentList.get(CrawlParser.BOOK_INDEX_LIST_KEY), (List<BookContent>) indexAndContentList.get(CrawlParser.BOOK_CONTENT_LIST_KEY));
|
} else {
|
||||||
|
//只更新书籍的爬虫相关字段
|
||||||
|
bookService.updateCrawlProperties(existBook.getId(), sourceId, bookId);
|
||||||
|
}
|
||||||
|
parseResult.set(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
return parseResult.get();
|
||||||
|
|
||||||
} else {
|
|
||||||
//只更新书籍的爬虫相关字段
|
|
||||||
bookService.updateCrawlProperties(existBook.getId(), sourceId, bookId);
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -2,14 +2,15 @@ package com.java2nb.novel.vo;
|
|||||||
|
|
||||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||||
import com.java2nb.novel.entity.CrawlSingleTask;
|
import com.java2nb.novel.entity.CrawlSingleTask;
|
||||||
import com.java2nb.novel.entity.CrawlSource;
|
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Administrator
|
* @author Administrator
|
||||||
*/
|
*/
|
||||||
|
@EqualsAndHashCode(callSuper = true)
|
||||||
@Data
|
@Data
|
||||||
public class CrawlSingleTaskVO extends CrawlSingleTask {
|
public class CrawlSingleTaskVO extends CrawlSingleTask {
|
||||||
|
|
||||||
|
@ -3,13 +3,14 @@ package com.java2nb.novel.vo;
|
|||||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||||
import com.java2nb.novel.entity.CrawlSource;
|
import com.java2nb.novel.entity.CrawlSource;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
|
||||||
import javax.annotation.Generated;
|
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Administrator
|
* @author Administrator
|
||||||
*/
|
*/
|
||||||
|
@EqualsAndHashCode(callSuper = true)
|
||||||
@Data
|
@Data
|
||||||
public class CrawlSourceVO extends CrawlSource{
|
public class CrawlSourceVO extends CrawlSource{
|
||||||
|
|
||||||
|
@ -57,8 +57,8 @@
|
|||||||
<!-- 指定项目中某个包,当有日志操作行为时的日志记录级别 -->
|
<!-- 指定项目中某个包,当有日志操作行为时的日志记录级别 -->
|
||||||
<!-- com.maijinjie.springboot 为根包,也就是只要是发生在这个根包下面的所有日志操作行为的权限都是DEBUG -->
|
<!-- com.maijinjie.springboot 为根包,也就是只要是发生在这个根包下面的所有日志操作行为的权限都是DEBUG -->
|
||||||
<!-- 级别依次为【从高到低】:FATAL > ERROR > WARN > INFO > DEBUG > TRACE -->
|
<!-- 级别依次为【从高到低】:FATAL > ERROR > WARN > INFO > DEBUG > TRACE -->
|
||||||
<logger name="com.java2nb" level="DEBUG">
|
<logger name="com.java2nb" level="DEBUG" additivity="false">
|
||||||
<appender-ref ref="STDOUT" />
|
<appender-ref ref="STDOUT" />
|
||||||
<appender-ref ref="FILE" />
|
<appender-ref ref="FILE" />
|
||||||
</logger>
|
</logger>
|
||||||
</configuration>
|
</configuration>
|
||||||
|
@ -30,6 +30,7 @@
|
|||||||
<ul class="log_list">
|
<ul class="log_list">
|
||||||
<li><a class="link_1" href="/">爬虫源管理</a></li>
|
<li><a class="link_1" href="/">爬虫源管理</a></li>
|
||||||
<li><a class="link_1 on" href="/crawl/crawlSingleTask_list.html">单本采集管理</a></li>
|
<li><a class="link_1 on" href="/crawl/crawlSingleTask_list.html">单本采集管理</a></li>
|
||||||
|
<li><a class="link_1" href="/crawl/crawlSource_test.html" target="_blank" >规则测试</a></li>
|
||||||
<!--<li><a class="link_1 " href="/user/userinfo.html">批量小说爬取</a></li>
|
<!--<li><a class="link_1 " href="/user/userinfo.html">批量小说爬取</a></li>
|
||||||
<li><a class="link_4 " href="/user/favorites.html">单本小说爬取</a></li>-->
|
<li><a class="link_4 " href="/user/favorites.html">单本小说爬取</a></li>-->
|
||||||
</ul>
|
</ul>
|
||||||
|
@ -30,6 +30,7 @@
|
|||||||
<ul class="log_list">
|
<ul class="log_list">
|
||||||
<li><a class="link_1" href="/">爬虫源管理</a></li>
|
<li><a class="link_1" href="/">爬虫源管理</a></li>
|
||||||
<li><a class="link_1 on" href="/crawl/crawlSingleTask_list.html">单本采集管理</a></li>
|
<li><a class="link_1 on" href="/crawl/crawlSingleTask_list.html">单本采集管理</a></li>
|
||||||
|
<li><a class="link_1" href="/crawl/crawlSource_test.html" target="_blank" >规则测试</a></li>
|
||||||
<!-- <li><a class="link_1 " href="/user/userinfo.html">批量小说爬取</a></li>
|
<!-- <li><a class="link_1 " href="/user/userinfo.html">批量小说爬取</a></li>
|
||||||
<li><a class="link_4 " href="/user/favorites.html">单本小说爬取</a></li>-->
|
<li><a class="link_4 " href="/user/favorites.html">单本小说爬取</a></li>-->
|
||||||
</ul>
|
</ul>
|
||||||
|
@ -30,6 +30,7 @@
|
|||||||
<ul class="log_list">
|
<ul class="log_list">
|
||||||
<li><a class="link_1 on" href="/">爬虫源管理</a></li>
|
<li><a class="link_1 on" href="/">爬虫源管理</a></li>
|
||||||
<li><a class="link_1" href="/crawl/crawlSingleTask_list.html">单本采集管理</a></li>
|
<li><a class="link_1" href="/crawl/crawlSingleTask_list.html">单本采集管理</a></li>
|
||||||
|
<li><a class="link_1" href="/crawl/crawlSource_test.html" target="_blank" >规则测试</a></li>
|
||||||
<!--<li><a class="link_1 " href="/user/userinfo.html">批量小说爬取</a></li>
|
<!--<li><a class="link_1 " href="/user/userinfo.html">批量小说爬取</a></li>
|
||||||
<li><a class="link_4 " href="/user/favorites.html">单本小说爬取</a></li>-->
|
<li><a class="link_4 " href="/user/favorites.html">单本小说爬取</a></li>-->
|
||||||
</ul>
|
</ul>
|
||||||
|
@ -29,6 +29,7 @@
|
|||||||
<ul class="log_list">
|
<ul class="log_list">
|
||||||
<li><a class="link_1 on" href="/">爬虫源管理</a></li>
|
<li><a class="link_1 on" href="/">爬虫源管理</a></li>
|
||||||
<li><a class="link_1" href="/crawl/crawlSingleTask_list.html">单本采集管理</a></li>
|
<li><a class="link_1" href="/crawl/crawlSingleTask_list.html">单本采集管理</a></li>
|
||||||
|
<li><a class="link_1" href="/crawl/crawlSource_test.html" target="_blank" >规则测试</a></li>
|
||||||
<!-- <li><a class="link_1 " href="/user/userinfo.html">批量小说爬取</a></li>
|
<!-- <li><a class="link_1 " href="/user/userinfo.html">批量小说爬取</a></li>
|
||||||
<li><a class="link_4 " href="/user/favorites.html">单本小说爬取</a></li>-->
|
<li><a class="link_4 " href="/user/favorites.html">单本小说爬取</a></li>-->
|
||||||
</ul>
|
</ul>
|
||||||
@ -38,7 +39,7 @@
|
|||||||
<div class="my_bookshelf">
|
<div class="my_bookshelf">
|
||||||
<div class="title cf">
|
<div class="title cf">
|
||||||
<h2 class="fl">爬虫源列表</h2>
|
<h2 class="fl">爬虫源列表</h2>
|
||||||
<div class="fr"><a href="/crawl/crawlSource_add.html" class="btn_red">增加爬虫源</a></div>
|
<div class="fr"><a href="/crawl/crawlSource_add.html" class="btn_red">增加爬虫源</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="divData" class="updateTable">
|
<div id="divData" class="updateTable">
|
||||||
@ -119,8 +120,8 @@
|
|||||||
<script language="javascript" type="text/javascript">
|
<script language="javascript" type="text/javascript">
|
||||||
search(1, 10);
|
search(1, 10);
|
||||||
|
|
||||||
|
var pageCrawlSourceList=null;
|
||||||
function search(curr, limit) {
|
function search(curr, limit) {
|
||||||
|
|
||||||
$.ajax({
|
$.ajax({
|
||||||
type: "get",
|
type: "get",
|
||||||
url: "/crawl/listCrawlByPage",
|
url: "/crawl/listCrawlByPage",
|
||||||
@ -129,6 +130,7 @@
|
|||||||
success: function (data) {
|
success: function (data) {
|
||||||
if (data.code == 200) {
|
if (data.code == 200) {
|
||||||
var crawlSourceList = data.data.list;
|
var crawlSourceList = data.data.list;
|
||||||
|
pageCrawlSourceList=data.data.list;
|
||||||
if (crawlSourceList.length > 0) {
|
if (crawlSourceList.length > 0) {
|
||||||
var crawlSourceListHtml = "";
|
var crawlSourceListHtml = "";
|
||||||
for(var i=0;i<crawlSourceList.length;i++){
|
for(var i=0;i<crawlSourceList.length;i++){
|
||||||
@ -147,7 +149,9 @@
|
|||||||
" <td class=\"goread\" id='sourceStatus"+crawlSource.id+"'>"+(crawlSource.sourceStatus==0?'停止运行':'正在运行')+
|
" <td class=\"goread\" id='sourceStatus"+crawlSource.id+"'>"+(crawlSource.sourceStatus==0?'停止运行':'正在运行')+
|
||||||
" </td>\n" +
|
" </td>\n" +
|
||||||
|
|
||||||
" <td class=\"goread\" id='opt"+crawlSource.id+"'><a href='javascript:openOrStopCrawl("+crawlSource.id+","+crawlSource.sourceStatus+")'>"+(crawlSource.sourceStatus==0?'开启':'关闭')+" </a></td> </tr>");
|
" <td class=\"goread\" id='opt"+crawlSource.id+"'><a href='javascript:openOrStopCrawl("+crawlSource.id+","+crawlSource.sourceStatus+")'>"+(crawlSource.sourceStatus==0?'开启':'关闭')+" </a>" +
|
||||||
|
"<a href='javascript:updateCrawlSource("+crawlSource.id+")'>修改 </a>" +
|
||||||
|
"</td> </tr>");
|
||||||
}
|
}
|
||||||
$("#crawlSourceList").html(crawlSourceListHtml);
|
$("#crawlSourceList").html(crawlSourceListHtml);
|
||||||
|
|
||||||
@ -196,7 +200,12 @@
|
|||||||
})
|
})
|
||||||
|
|
||||||
}
|
}
|
||||||
|
function updateCrawlSource(crawlSourceId){
|
||||||
|
|
||||||
|
localStorage.setItem("crawlSourceId",crawlSourceId);
|
||||||
|
window.location.href="/crawl/crawlSource_update.html";
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
function openOrStopCrawl(sourceId,status) {
|
function openOrStopCrawl(sourceId,status) {
|
||||||
|
|
||||||
|
@ -0,0 +1,171 @@
|
|||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||||
|
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||||
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||||
|
<head>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/>
|
||||||
|
<title>爬虫管理系统-小说精品屋</title>
|
||||||
|
<link rel="stylesheet" href="/css/base.css?v=1"/>
|
||||||
|
<link rel="stylesheet" href="/css/user.css"/>
|
||||||
|
</head>
|
||||||
|
</head>
|
||||||
|
<body class="">
|
||||||
|
|
||||||
|
<div class="header">
|
||||||
|
<div class="mainNav" id="mainNav">
|
||||||
|
<div class="box_center cf"
|
||||||
|
style="text-align: center;height: 44px;line-height: 48px;color: #fff;font-size: 16px;">
|
||||||
|
|
||||||
|
小说精品屋爬虫管理
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="main box_center cf">
|
||||||
|
<div class="userBox cf">
|
||||||
|
<div class="my_l">
|
||||||
|
|
||||||
|
<ul class="log_list">
|
||||||
|
<li><a class="link_1 on" href="/">爬虫源管理</a></li>
|
||||||
|
<li><a class="link_1" href="/crawl/crawlSingleTask_list.html">单本采集管理</a></li>
|
||||||
|
<li><a class="link_1" href="/crawl/crawlSource_test.html" target="_blank" >规则测试</a></li>
|
||||||
|
<!--<li><a class="link_1 " href="/user/userinfo.html">批量小说爬取</a></li>
|
||||||
|
<li><a class="link_4 " href="/user/favorites.html">单本小说爬取</a></li>-->
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div class="my_r">
|
||||||
|
<div class="my_bookshelf">
|
||||||
|
|
||||||
|
<div class="userBox cf">
|
||||||
|
<form method="post" action="./register.html" id="form2">
|
||||||
|
<div class="aspNetHidden">
|
||||||
|
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE"
|
||||||
|
value="/wEPDwUKLTIzNjMxNDQxNw9kFgJmD2QWAmYPFgIeBFRleHQFqAE8YSBocmVmPSIvc2VhcmNoLmFzcHg/c2VhcmNoS2V5PeWWu+Wuiembr++8jOeLhOazve+8jOeBteW8gu+8jOWJjeS4luS7iueUn++8jOWGpeeOi+msvOWkqyIgdGFyZ2V0PSJfYmxhbmsiPuWWu+Wuiembr++8jOeLhOazve+8jOeBteW8gu+8jOWJjeS4luS7iueUn++8jOWGpeeOi+msvOWkqzwvYT5kZOquoASBvnvPbc/TYIQiLhSPJ8GKnYQrmk7jGhb5AC5Q">
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="aspNetHidden">
|
||||||
|
|
||||||
|
<input type="hidden" name="__VIEWSTATEGENERATOR" id="__VIEWSTATEGENERATOR" value="23AA6834">
|
||||||
|
<input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION"
|
||||||
|
value="/wEdAAVece19BIZ9HiByRfHz3pfnqKSXUE1UN51mNFrIuw38c3Y2+Mc6SrnAqio3oCKbxYZZ1lS+gZUZKpbsAea8j7ASAv40DHFcQ/NE7tJUnABeyQ3d9sFDIcFCYNqlVtprfLoh4JFy0U+R/CcMuyAiWTz7">
|
||||||
|
</div>
|
||||||
|
<div class="user_l">
|
||||||
|
<div></div>
|
||||||
|
<h3>爬虫源信息填写(示例均为顶点小说网:dingdiann.com)</h3>
|
||||||
|
<ul class="log_list">
|
||||||
|
<li><span id="LabErr"></span></li>
|
||||||
|
示例:<b>http://m.xdingdiann.com/sort/{catId}/{page}.html</b> ({catId}代表分类ID,{page}代表分页页码)
|
||||||
|
<li><input type="text" id="url" class="s_input icon_key"
|
||||||
|
placeholder="url"></li>
|
||||||
|
|
||||||
|
示例:<b>value=\"(\\d+)/\\d+\"</b>
|
||||||
|
<li><input type="text" id="rule" class="s_input icon_name" placeholder="规则"></li>
|
||||||
|
示例:<b>1强制刷新 空或0使用缓存</b>
|
||||||
|
<li><input type="text" id="isRefresh" class="s_input icon_name" placeholder="是否强制刷新"></li>
|
||||||
|
|
||||||
|
<li><textarea rows="20" cols="100" id="resultMap"></textarea></li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li><input type="button" onclick="testCrawlSource()" name="btnRegister" value="测试"
|
||||||
|
id="btnRegister" class="btn_red"></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
<!--<div id="divData" class="updateTable">
|
||||||
|
<table cellpadding="0" cellspacing="0">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
|
||||||
|
<th class="name">
|
||||||
|
爬虫源(已开启的爬虫源)
|
||||||
|
</th>
|
||||||
|
<th class="chapter">
|
||||||
|
成功爬取数量(websocket实现)
|
||||||
|
</th>
|
||||||
|
<th class="time">
|
||||||
|
目标爬取数量
|
||||||
|
</th>
|
||||||
|
<th class="goread">
|
||||||
|
状态(正在运行,已停止)(一次只能运行一个爬虫源)
|
||||||
|
</th>
|
||||||
|
<th class="goread">
|
||||||
|
操作(启动,停止)
|
||||||
|
</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody id="bookShelfList">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
<div class="pageBox cf" id="shellPage">
|
||||||
|
</div>
|
||||||
|
</div>-->
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
</body>
|
||||||
|
<script src="/javascript/jquery-1.8.0.min.js" type="text/javascript"></script>
|
||||||
|
<script src="/layui/layui.all.js" type="text/javascript"></script>
|
||||||
|
<script src="/javascript/header.js" type="text/javascript"></script>
|
||||||
|
<script src="/javascript/user.js" type="text/javascript"></script>
|
||||||
|
<script language="javascript" type="text/javascript">
|
||||||
|
function load() {
|
||||||
|
var testParseUrl= localStorage.getItem("testParseUrl");
|
||||||
|
$("#url").val(testParseUrl);
|
||||||
|
var testParseRule=localStorage.getItem("testParseRule");
|
||||||
|
$("#rule").val(testParseRule);
|
||||||
|
}
|
||||||
|
function testCrawlSource() {
|
||||||
|
|
||||||
|
var data = {};
|
||||||
|
|
||||||
|
|
||||||
|
var isRefresh = $("#isRefresh").val();
|
||||||
|
data.isRefresh = isRefresh;
|
||||||
|
var rule = $("#rule").val();
|
||||||
|
if (rule.length == 0) {
|
||||||
|
layer.alert("正则必填");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
data.rule = rule;
|
||||||
|
var url = $("#url").val();
|
||||||
|
if (url.length == 0) {
|
||||||
|
layer.alert("url必填");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
data.url = url;
|
||||||
|
|
||||||
|
localStorage.setItem("testParseUrl",url);
|
||||||
|
localStorage.setItem("testParseRule",rule);
|
||||||
|
$.ajax({
|
||||||
|
type: "POST",
|
||||||
|
url: "/crawl/testParse",
|
||||||
|
data: data,
|
||||||
|
dataType: "json",
|
||||||
|
success: function (data) {
|
||||||
|
if (data.code == 200) {
|
||||||
|
$("#resultMap").val(JSON.stringify(data.data));
|
||||||
|
} else {
|
||||||
|
layer.alert(data.msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
},
|
||||||
|
error: function () {
|
||||||
|
layer.alert('网络异常');
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
</script>
|
||||||
|
</html>
|
@ -0,0 +1,522 @@
|
|||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||||
|
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||||
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||||
|
<head>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/>
|
||||||
|
<title>爬虫管理系统-小说精品屋</title>
|
||||||
|
<link rel="stylesheet" href="/css/base.css?v=1"/>
|
||||||
|
<link rel="stylesheet" href="/css/user.css"/>
|
||||||
|
</head>
|
||||||
|
</head>
|
||||||
|
<body class="">
|
||||||
|
|
||||||
|
<div class="header">
|
||||||
|
<div class="mainNav" id="mainNav">
|
||||||
|
<div class="box_center cf"
|
||||||
|
style="text-align: center;height: 44px;line-height: 48px;color: #fff;font-size: 16px;">
|
||||||
|
|
||||||
|
小说精品屋爬虫管理
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="main box_center cf">
|
||||||
|
<div class="userBox cf">
|
||||||
|
<div class="my_l">
|
||||||
|
|
||||||
|
<ul class="log_list">
|
||||||
|
<li><a class="link_1 on" href="/">爬虫源管理</a></li>
|
||||||
|
<li><a class="link_1" href="/crawl/crawlSingleTask_list.html">单本采集管理</a></li>
|
||||||
|
<li><a class="link_1" href="/crawl/crawlSource_test.html" target="_blank" >规则测试</a></li>
|
||||||
|
<!--<li><a class="link_1 " href="/user/userinfo.html">批量小说爬取</a></li>
|
||||||
|
<li><a class="link_4 " href="/user/favorites.html">单本小说爬取</a></li>-->
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div class="my_r">
|
||||||
|
<div class="my_bookshelf">
|
||||||
|
|
||||||
|
<div class="userBox cf">
|
||||||
|
<form method="post" action="./register.html" id="form2">
|
||||||
|
<input type="hidden" name="id" id="sourceId"/>
|
||||||
|
<div class="aspNetHidden">
|
||||||
|
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE"
|
||||||
|
value="/wEPDwUKLTIzNjMxNDQxNw9kFgJmD2QWAmYPFgIeBFRleHQFqAE8YSBocmVmPSIvc2VhcmNoLmFzcHg/c2VhcmNoS2V5PeWWu+Wuiembr++8jOeLhOazve+8jOeBteW8gu+8jOWJjeS4luS7iueUn++8jOWGpeeOi+msvOWkqyIgdGFyZ2V0PSJfYmxhbmsiPuWWu+Wuiembr++8jOeLhOazve+8jOeBteW8gu+8jOWJjeS4luS7iueUn++8jOWGpeeOi+msvOWkqzwvYT5kZOquoASBvnvPbc/TYIQiLhSPJ8GKnYQrmk7jGhb5AC5Q">
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="aspNetHidden">
|
||||||
|
|
||||||
|
<input type="hidden" name="__VIEWSTATEGENERATOR" id="__VIEWSTATEGENERATOR" value="23AA6834">
|
||||||
|
<input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION"
|
||||||
|
value="/wEdAAVece19BIZ9HiByRfHz3pfnqKSXUE1UN51mNFrIuw38c3Y2+Mc6SrnAqio3oCKbxYZZ1lS+gZUZKpbsAea8j7ASAv40DHFcQ/NE7tJUnABeyQ3d9sFDIcFCYNqlVtprfLoh4JFy0U+R/CcMuyAiWTz7">
|
||||||
|
</div>
|
||||||
|
<div class="user_l">
|
||||||
|
<div></div>
|
||||||
|
<h3>爬虫源信息填写(示例均为顶点小说网:dingdiann.com)</h3>
|
||||||
|
<ul class="log_list">
|
||||||
|
<li><span id="LabErr"></span></li>
|
||||||
|
示例:<b>新顶点小说网</b>
|
||||||
|
<li><input type="text" id="sourceName" class="s_input icon_name" placeholder="源站名"></li>
|
||||||
|
<!--示例:<b>https://m.xdingdiann.com/sort/0/1.html</b>
|
||||||
|
<li><input type="text" id="updateBookListUrl" class="s_input icon_key"
|
||||||
|
placeholder="小说更新列表url"></li>-->
|
||||||
|
示例:<b>http://m.xdingdiann.com/sort/{catId}/{page}.html</b> ({catId}代表分类ID,{page}代表分页页码)
|
||||||
|
<li><input type="text" id="bookListUrl" class="s_input icon_key"
|
||||||
|
placeholder="分类列表页URL规则"></li>
|
||||||
|
示例:<b>1</b>
|
||||||
|
<li><input type="text" id="catId1" class="s_input icon_key" placeholder="玄幻奇幻分类ID"></li>
|
||||||
|
示例:<b>2</b>
|
||||||
|
<li><input type="text" id="catId2" class="s_input icon_key" placeholder="武侠仙侠分类ID"></li>
|
||||||
|
示例:<b>3</b>
|
||||||
|
<li><input type="text" id="catId3" class="s_input icon_key" placeholder="都市言情分类ID"></li>
|
||||||
|
示例:<b>4</b>
|
||||||
|
<li><input type="text" id="catId4" class="s_input icon_key" placeholder="历史军事分类ID"></li>
|
||||||
|
示例:<b>5</b>
|
||||||
|
<li><input type="text" id="catId5" class="s_input icon_key" placeholder="科幻灵异分类ID"></li>
|
||||||
|
示例:<b>6</b>
|
||||||
|
<li><input type="text" id="catId6" class="s_input icon_key" placeholder="网游竞技分类ID"></li>
|
||||||
|
示例:<b>7</b>
|
||||||
|
<li><input type="text" id="catId7" class="s_input icon_key" placeholder="女生频道分类ID"></li>
|
||||||
|
示例:<b>href="/ddk(\d+)/"</b>
|
||||||
|
<li><input type="text" id="bookIdPatten" class="s_input icon_key"
|
||||||
|
placeholder="列表页小说ID正则表达式:"></li>
|
||||||
|
<b>value="(\d+)/\d+"</b>
|
||||||
|
<li><input type="text" id="pagePatten" class="s_input icon_key"
|
||||||
|
placeholder="列表页当前分页页码正则表达式:"></li>
|
||||||
|
<b>value="\d+/(\d+)"</b>
|
||||||
|
<li><input type="text" id="totalPagePatten" class="s_input icon_key"
|
||||||
|
placeholder="列表页分页总页数正则表达式:"></li>
|
||||||
|
<b>http://m.xdingdiann.com/ddk{bookId}</b> (bookId代表小说ID)
|
||||||
|
<li><input type="text" id="bookDetailUrl" class="s_input icon_key"
|
||||||
|
placeholder="详情页URL规则:"></li>
|
||||||
|
示例:<b><p class="title">([^/]+)</p></b>
|
||||||
|
<li><input type="text" id="bookNamePatten" class="s_input icon_key"
|
||||||
|
placeholder="小说名的正则表达式:"></li>
|
||||||
|
示例:<b>作者:([^/]+)<</b>
|
||||||
|
<li><input type="text" id="authorNamePatten" class="s_input icon_key"
|
||||||
|
placeholder="小说作者的正则表达式:"></li>
|
||||||
|
示例:<b><img src="([^>]+)"\s+onerror="this.src=</b>
|
||||||
|
<li><input type="text" id="picUrlPatten" class="s_input icon_key"
|
||||||
|
placeholder="小说图片路径的正则表达式:"></li>
|
||||||
|
<b>可空,适用于图片路径为相对路径的源站,加上小说图片路径,则为完整的可访问的图片路径</b>
|
||||||
|
<li><input type="text" id="picUrlPrefix" class="s_input icon_key"
|
||||||
|
placeholder="小说图片访问路径前缀:"></li>
|
||||||
|
示例:<b>状态:([^/]+)</li></b>
|
||||||
|
<li><input type="text" id="statusPatten" class="s_input icon_key"
|
||||||
|
placeholder="小说状态的正则表达式:"></li>
|
||||||
|
示例:<b>连载</b>
|
||||||
|
<li><input type="text" id="bookStatus0" class="s_input icon_key"
|
||||||
|
placeholder="连载中的小说在此网站的具体表现值:"></li>
|
||||||
|
示例:<b>完结</b>
|
||||||
|
<li><input type="text" id="bookStatus1" class="s_input icon_key"
|
||||||
|
placeholder="全本小说在此网站的具体表现值:"></li>
|
||||||
|
示例:<b><div\s+class="score">(\d+\.\d+)分</div></b>
|
||||||
|
<li><input type="text" id="scorePatten" class="s_input icon_key"
|
||||||
|
placeholder="小说评分的正则表达式:"></li>
|
||||||
|
示例:<b></b>
|
||||||
|
<li><input type="text" id="visitCountPatten" class="s_input icon_key"
|
||||||
|
placeholder="小说点击量的正则表达式:"></li>
|
||||||
|
示例:<b><p class="review"></b>
|
||||||
|
<li><input type="text" id="descStart" class="s_input icon_key"
|
||||||
|
placeholder="小说简介开始截取字符串:"></li>
|
||||||
|
示例:<b></p></b>
|
||||||
|
<li><input type="text" id="descEnd" class="s_input icon_key" placeholder="小说简介结束截取字符串:">
|
||||||
|
</li>
|
||||||
|
示例:<b>更新:(\d+-\d+-\d+\s\d+:\d+:\d+)</a></b>
|
||||||
|
<li><input type="text" id="upadateTimePatten" class="s_input icon_key"
|
||||||
|
placeholder="小说更新时间的正则表达式:"></li>
|
||||||
|
示例:<b>yyyy-MM-dd HH:mm:ss</b>
|
||||||
|
<li><input type="text" id="upadateTimeFormatPatten" class="s_input icon_key"
|
||||||
|
placeholder="小说更新时间在此网站的显示模式:"></li>
|
||||||
|
示例:<b>http://m.xdingdiann.com/ddk{bookId}/all.html</b> (bookId代表小说ID)
|
||||||
|
<li><input type="text" id="bookIndexUrl" class="s_input icon_key"
|
||||||
|
placeholder="小说目录页的URL规则:"></li>
|
||||||
|
<b>可空,适用于最新章节列表和全部章节列表在同一个页面的源站</b>
|
||||||
|
<li><input type="text" id="bookIndexStart" class="s_input icon_key"
|
||||||
|
placeholder="小说目录页内容开始截取字符串:"></li>
|
||||||
|
示例:<b><a\s+style=""\s+href="/ddk\d+/(\d+)\.html">[^/]+</a></b>
|
||||||
|
<li><input type="text" id="indexIdPatten" class="s_input icon_key"
|
||||||
|
placeholder="目录页目录ID正则表达式:"></li>
|
||||||
|
示例:<b><a\s+style=""\s+href="/ddk\d+/\d+\.html">([^/]+)</a></b>
|
||||||
|
<li><input type="text" id="indexNamePatten" class="s_input icon_key"
|
||||||
|
placeholder="目录页目录名的正则表达式:"></li>
|
||||||
|
示例:<b>http://m.xdingdiann.com/ddk{bookId}/{indexId}.html</b>
|
||||||
|
(bookId代表小说ID,{indexId}代表目录ID)
|
||||||
|
<li><input type="text" id="bookContentUrl" class="s_input icon_key"
|
||||||
|
placeholder="小说内容页的URL规则:"></li>
|
||||||
|
示例:<b>id="content"></b>
|
||||||
|
<li><input type="text" id="contentStart" class="s_input icon_key"
|
||||||
|
placeholder="小说内容开始截取字符串:"></li>
|
||||||
|
示例:<b><script></b>
|
||||||
|
<li><input type="text" id="contentEnd" class="s_input icon_key"
|
||||||
|
placeholder="小说内容结束截取字符串:"></li>
|
||||||
|
|
||||||
|
<li><input type="button" onclick="updateCrawlSource()" name="btnRegister" value="提交"
|
||||||
|
id="btnRegister" class="btn_red"></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
<!--<div id="divData" class="updateTable">
|
||||||
|
<table cellpadding="0" cellspacing="0">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
|
||||||
|
<th class="name">
|
||||||
|
爬虫源(已开启的爬虫源)
|
||||||
|
</th>
|
||||||
|
<th class="chapter">
|
||||||
|
成功爬取数量(websocket实现)
|
||||||
|
</th>
|
||||||
|
<th class="time">
|
||||||
|
目标爬取数量
|
||||||
|
</th>
|
||||||
|
<th class="goread">
|
||||||
|
状态(正在运行,已停止)(一次只能运行一个爬虫源)
|
||||||
|
</th>
|
||||||
|
<th class="goread">
|
||||||
|
操作(启动,停止)
|
||||||
|
</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody id="bookShelfList">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
<div class="pageBox cf" id="shellPage">
|
||||||
|
</div>
|
||||||
|
</div>-->
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
</body>
|
||||||
|
<script src="/javascript/jquery-1.8.0.min.js" type="text/javascript"></script>
|
||||||
|
<script src="/layui/layui.all.js" type="text/javascript"></script>
|
||||||
|
<script src="/javascript/header.js" type="text/javascript"></script>
|
||||||
|
<script src="/javascript/user.js" type="text/javascript"></script>
|
||||||
|
<script language="javascript" type="text/javascript">
|
||||||
|
|
||||||
|
function load(){
|
||||||
|
var crawlSourceId = localStorage.getItem("crawlSourceId")
|
||||||
|
if(crawlSourceId!=null){
|
||||||
|
$.ajax({
|
||||||
|
type: "GET",
|
||||||
|
url: "/crawl/getCrawlSource/"+crawlSourceId,
|
||||||
|
dataType: "json",
|
||||||
|
success: function (data) {
|
||||||
|
if (data.code == 200) {
|
||||||
|
loadPage(data.data);
|
||||||
|
} else if (data.code == 1001) {
|
||||||
|
//未登录
|
||||||
|
location.href = '/user/login.html?originUrl=' + decodeURIComponent(location.href);
|
||||||
|
|
||||||
|
}else {
|
||||||
|
layer.alert(data.msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
},
|
||||||
|
error: function () {
|
||||||
|
layer.alert('网络异常');
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function loadPage(data){
|
||||||
|
$("#sourceId").val(data.id);
|
||||||
|
$("#sourceName").val(data.sourceName);
|
||||||
|
if(data.crawlRule){
|
||||||
|
|
||||||
|
|
||||||
|
var crawlRule= JSON.parse(data.crawlRule);
|
||||||
|
$("#bookListUrl").val(crawlRule.bookListUrl);
|
||||||
|
var catIdRule = crawlRule.catIdRule;
|
||||||
|
try{
|
||||||
|
for (var i = 1; i <= 7; i++) {
|
||||||
|
$("#catId" + i).val(catIdRule["catId" + i]);
|
||||||
|
}
|
||||||
|
}catch(e){
|
||||||
|
}
|
||||||
|
$("#bookIdPatten").val(crawlRule.bookIdPatten);
|
||||||
|
$("#pagePatten").val(crawlRule.pagePatten);
|
||||||
|
$("#totalPagePatten").val(crawlRule.totalPagePatten);
|
||||||
|
$("#bookDetailUrl").val(crawlRule.bookDetailUrl);
|
||||||
|
$("#bookNamePatten").val(crawlRule.bookNamePatten);
|
||||||
|
$("#authorNamePatten").val(crawlRule.authorNamePatten);
|
||||||
|
$("#picUrlPatten").val(crawlRule.picUrlPatten);
|
||||||
|
$("#picUrlPrefix").val(crawlRule.picUrlPrefix);
|
||||||
|
$("#statusPatten").val(crawlRule.statusPatten);
|
||||||
|
try{
|
||||||
|
var bookStatusRule = crawlRule.bookStatusRule;
|
||||||
|
var i=0;
|
||||||
|
for(var key in bookStatusRule){
|
||||||
|
$("#bookStatus" + i).val(key);
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
}catch (e) {
|
||||||
|
|
||||||
|
}
|
||||||
|
$("#scorePatten").val(crawlRule.scorePatten);
|
||||||
|
$("#visitCountPatten").val(crawlRule.visitCountPatten);
|
||||||
|
$("#descStart").val(crawlRule.descStart);
|
||||||
|
$("#descEnd").val(crawlRule.descEnd);
|
||||||
|
$("#upadateTimePatten").val(crawlRule.upadateTimePatten);
|
||||||
|
$("#upadateTimeFormatPatten").val(crawlRule.upadateTimeFormatPatten);
|
||||||
|
$("#bookIndexUrl").val(crawlRule.bookIndexUrl);
|
||||||
|
$("#bookIndexStart").val(crawlRule.bookIndexStart);
|
||||||
|
$("#indexIdPatten").val(crawlRule.indexIdPatten);
|
||||||
|
$("#indexNamePatten").val(crawlRule.indexNamePatten);
|
||||||
|
$("#bookContentUrl").val(crawlRule.bookContentUrl);
|
||||||
|
$("#contentStart").val(crawlRule.contentStart);
|
||||||
|
$("#contentEnd").val(crawlRule.contentEnd);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
load();
|
||||||
|
|
||||||
|
function updateCrawlSource() {
|
||||||
|
|
||||||
|
var crawlRule = {};
|
||||||
|
var sourceId =$("#sourceId").val();
|
||||||
|
|
||||||
|
var sourceName = $("#sourceName").val();
|
||||||
|
if (sourceName.length == 0) {
|
||||||
|
layer.alert("源站名必填");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
var bookListUrl = $("#bookListUrl").val();
|
||||||
|
if (bookListUrl.length == 0) {
|
||||||
|
layer.alert("分类列表页URL规则必填");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
crawlRule.bookListUrl = bookListUrl;
|
||||||
|
|
||||||
|
var catIdRule = {};
|
||||||
|
|
||||||
|
for (var i = 1; i <= 7; i++) {
|
||||||
|
var catId = $("#catId" + i).val();
|
||||||
|
if (catId.length > 0) {
|
||||||
|
catIdRule["catId" + i] = catId;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Object.keys(catIdRule).length == 0) {
|
||||||
|
layer.alert("分类ID至少要填一项");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
crawlRule.catIdRule = catIdRule;
|
||||||
|
|
||||||
|
|
||||||
|
var bookIdPatten = $("#bookIdPatten").val();
|
||||||
|
|
||||||
|
|
||||||
|
if (bookIdPatten.length == 0) {
|
||||||
|
layer.alert("列表页小说ID正则表达式必填");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
crawlRule.bookIdPatten = bookIdPatten;
|
||||||
|
|
||||||
|
var pagePatten = $("#pagePatten").val();
|
||||||
|
|
||||||
|
if (pagePatten.length > 0) {
|
||||||
|
crawlRule.pagePatten = pagePatten;
|
||||||
|
}
|
||||||
|
|
||||||
|
var totalPagePatten = $("#totalPagePatten").val();
|
||||||
|
|
||||||
|
if (totalPagePatten.length > 0) {
|
||||||
|
crawlRule.totalPagePatten = totalPagePatten;
|
||||||
|
}
|
||||||
|
|
||||||
|
var bookDetailUrl = $("#bookDetailUrl").val();
|
||||||
|
|
||||||
|
if (bookDetailUrl.length == 0) {
|
||||||
|
layer.alert("详情页URL规则必填");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
crawlRule.bookDetailUrl = bookDetailUrl;
|
||||||
|
|
||||||
|
var bookNamePatten = $("#bookNamePatten").val();
|
||||||
|
|
||||||
|
if (bookNamePatten.length == 0) {
|
||||||
|
layer.alert("小说名的正则表达式必填");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
crawlRule.bookNamePatten = bookNamePatten;
|
||||||
|
|
||||||
|
var authorNamePatten = $("#authorNamePatten").val();
|
||||||
|
|
||||||
|
if (authorNamePatten.length == 0) {
|
||||||
|
layer.alert("小说作者的正则表达式必填");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
crawlRule.authorNamePatten = authorNamePatten;
|
||||||
|
|
||||||
|
var picUrlPatten = $("#picUrlPatten").val();
|
||||||
|
|
||||||
|
if (picUrlPatten.length > 0) {
|
||||||
|
crawlRule.picUrlPatten = picUrlPatten;
|
||||||
|
}
|
||||||
|
|
||||||
|
var picUrlPrefix = $("#picUrlPrefix").val();
|
||||||
|
|
||||||
|
if (picUrlPrefix.length > 0) {
|
||||||
|
crawlRule.picUrlPrefix = picUrlPrefix;
|
||||||
|
}
|
||||||
|
|
||||||
|
var statusPatten = $("#statusPatten").val();
|
||||||
|
if (statusPatten.length > 0) {
|
||||||
|
crawlRule.statusPatten = statusPatten;
|
||||||
|
}
|
||||||
|
|
||||||
|
var bookStatusRule = {};
|
||||||
|
|
||||||
|
for (var i = 0; i <= 1; i++) {
|
||||||
|
var bookStatus = $("#bookStatus" + i).val();
|
||||||
|
if (bookStatus.length > 0) {
|
||||||
|
bookStatusRule[bookStatus] = i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
crawlRule.bookStatusRule = bookStatusRule;
|
||||||
|
|
||||||
|
var scorePatten = $("#scorePatten").val();
|
||||||
|
|
||||||
|
if (scorePatten.length > 0) {
|
||||||
|
crawlRule.scorePatten = scorePatten;
|
||||||
|
}
|
||||||
|
|
||||||
|
var visitCountPatten = $("#visitCountPatten").val();
|
||||||
|
|
||||||
|
if (visitCountPatten.length > 0) {
|
||||||
|
crawlRule.visitCountPatten = visitCountPatten;
|
||||||
|
}
|
||||||
|
|
||||||
|
var descStart = $("#descStart").val();
|
||||||
|
|
||||||
|
if (descStart.length == 0) {
|
||||||
|
layer.alert("小说简介开始截取字符串必填");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
crawlRule.descStart = descStart;
|
||||||
|
|
||||||
|
var descEnd = $("#descEnd").val();
|
||||||
|
|
||||||
|
if (descEnd.length == 0) {
|
||||||
|
layer.alert("小说简介结束截取字符串必填");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
crawlRule.descEnd = descEnd;
|
||||||
|
|
||||||
|
var upadateTimePatten = $("#upadateTimePatten").val();
|
||||||
|
|
||||||
|
if (upadateTimePatten.length > 0) {
|
||||||
|
crawlRule.upadateTimePatten = upadateTimePatten;
|
||||||
|
}
|
||||||
|
|
||||||
|
var upadateTimeFormatPatten = $("#upadateTimeFormatPatten").val();
|
||||||
|
|
||||||
|
if (upadateTimeFormatPatten.length > 0) {
|
||||||
|
crawlRule.upadateTimeFormatPatten = upadateTimeFormatPatten;
|
||||||
|
}
|
||||||
|
|
||||||
|
var bookIndexUrl = $("#bookIndexUrl").val();
|
||||||
|
|
||||||
|
if (bookIndexUrl.length == 0) {
|
||||||
|
layer.alert("小说目录页的URL规则必填");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
crawlRule.bookIndexUrl = bookIndexUrl;
|
||||||
|
|
||||||
|
|
||||||
|
var bookIndexStart = $("#bookIndexStart").val();
|
||||||
|
|
||||||
|
if (bookIndexStart.length > 0) {
|
||||||
|
crawlRule.bookIndexStart = bookIndexStart;
|
||||||
|
}
|
||||||
|
|
||||||
|
var indexIdPatten = $("#indexIdPatten").val();
|
||||||
|
|
||||||
|
if (indexIdPatten.length == 0) {
|
||||||
|
layer.alert("小说目录页的目录ID正则表达式必填");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
crawlRule.indexIdPatten = indexIdPatten;
|
||||||
|
|
||||||
|
var indexNamePatten = $("#indexNamePatten").val();
|
||||||
|
|
||||||
|
if (indexNamePatten.length == 0) {
|
||||||
|
layer.alert("小说目录页的目录名正则表达式必填");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
crawlRule.indexNamePatten = indexNamePatten;
|
||||||
|
|
||||||
|
var bookContentUrl = $("#bookContentUrl").val();
|
||||||
|
|
||||||
|
if (bookContentUrl.length == 0) {
|
||||||
|
layer.alert("小说内容页的URL规则必填");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
crawlRule.bookContentUrl = bookContentUrl;
|
||||||
|
|
||||||
|
var contentStart = $("#contentStart").val();
|
||||||
|
|
||||||
|
if (contentStart.length == 0) {
|
||||||
|
layer.alert("小说内容开始截取字符串必填");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
crawlRule.contentStart = contentStart;
|
||||||
|
|
||||||
|
var contentEnd = $("#contentEnd").val();
|
||||||
|
|
||||||
|
if (contentEnd.length == 0) {
|
||||||
|
layer.alert("小说内容结束截取字符串必填");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
crawlRule.contentEnd = contentEnd;
|
||||||
|
|
||||||
|
|
||||||
|
$.ajax({
|
||||||
|
type: "POST",
|
||||||
|
url: "/crawl/updateCrawlSource",
|
||||||
|
data: {'id':sourceId,'sourceName': sourceName, 'crawlRule': JSON.stringify(crawlRule)},
|
||||||
|
dataType: "json",
|
||||||
|
success: function (data) {
|
||||||
|
if (data.code == 200) {
|
||||||
|
|
||||||
|
window.location.href = '/crawl/crawlSource_list.html';
|
||||||
|
|
||||||
|
|
||||||
|
} else {
|
||||||
|
layer.alert(data.msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
},
|
||||||
|
error: function () {
|
||||||
|
layer.alert('网络异常');
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
</script>
|
||||||
|
</html>
|
@ -5,7 +5,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>novel</artifactId>
|
<artifactId>novel</artifactId>
|
||||||
<groupId>com.java2nb</groupId>
|
<groupId>com.java2nb</groupId>
|
||||||
<version>3.5.1</version>
|
<version>3.5.4</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
@ -87,14 +87,92 @@
|
|||||||
</dependency>
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
|
<!-- <build>-->
|
||||||
|
<!-- <plugins>-->
|
||||||
|
<!-- <plugin>-->
|
||||||
|
<!-- <groupId>org.springframework.boot</groupId>-->
|
||||||
|
<!-- <artifactId>spring-boot-maven-plugin</artifactId>-->
|
||||||
|
<!-- </plugin>-->
|
||||||
|
<!-- </plugins>-->
|
||||||
|
<!-- </build>-->
|
||||||
<build>
|
<build>
|
||||||
<plugins>
|
<plugins>
|
||||||
<plugin>
|
<plugin>
|
||||||
|
<!--打包时去除第三方依赖-->
|
||||||
<groupId>org.springframework.boot</groupId>
|
<groupId>org.springframework.boot</groupId>
|
||||||
<artifactId>spring-boot-maven-plugin</artifactId>
|
<artifactId>spring-boot-maven-plugin</artifactId>
|
||||||
|
<configuration>
|
||||||
|
<layout>ZIP</layout>
|
||||||
|
<includes>
|
||||||
|
<include>
|
||||||
|
<groupId>non-exists</groupId>
|
||||||
|
<artifactId>non-exists</artifactId>
|
||||||
|
</include>
|
||||||
|
</includes>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
<!--拷贝第三方依赖文件到指定目录-->
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-dependency-plugin</artifactId>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<id>copy-dependencies</id>
|
||||||
|
<phase>package</phase>
|
||||||
|
<goals>
|
||||||
|
<goal>copy-dependencies</goal>
|
||||||
|
</goals>
|
||||||
|
<configuration>
|
||||||
|
<!--target/lib是依赖jar包的输出目录,根据自己喜好配置-->
|
||||||
|
<outputDirectory>target/lib</outputDirectory>
|
||||||
|
<excludeTransitive>false</excludeTransitive>
|
||||||
|
<stripVersion>false</stripVersion>
|
||||||
|
<includeScope>runtime</includeScope>
|
||||||
|
</configuration>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<artifactId>maven-antrun-plugin</artifactId>
|
||||||
|
<version>1.8</version>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<phase>package</phase>
|
||||||
|
<goals>
|
||||||
|
<goal>run</goal>
|
||||||
|
</goals>
|
||||||
|
<configuration>
|
||||||
|
<tasks>
|
||||||
|
<!-- 文件夹 -->
|
||||||
|
<copy todir="${project.build.directory}/build/conf" overwrite="true">
|
||||||
|
<fileset dir="${basedir}/src/main/resources">
|
||||||
|
<include name="**/*.*"/>
|
||||||
|
<exclude name="mybatis/*/*.*"/>
|
||||||
|
</fileset>
|
||||||
|
</copy>
|
||||||
|
<move todir="${project.build.directory}/build/lib">
|
||||||
|
<fileset dir="target/lib"/>
|
||||||
|
</move>
|
||||||
|
<copy file="${project.build.directory}/${project.artifactId}-${project.version}.jar"
|
||||||
|
tofile="${project.build.directory}/build/${project.artifactId}.jar" />
|
||||||
|
|
||||||
|
<fixcrlf srcdir="${basedir}/src/main/build/scripts" eol="unix"/>
|
||||||
|
<copy todir="${project.build.directory}/build/bin">
|
||||||
|
<fileset dir="${basedir}/src/main/build/scripts">
|
||||||
|
<include name="*.sh" />
|
||||||
|
<include name="*.txt" />
|
||||||
|
<include name="*.bat" />
|
||||||
|
</fileset>
|
||||||
|
</copy>
|
||||||
|
<zip destfile='${project.build.directory}/build/${project.artifactId}.zip'>
|
||||||
|
<zipfileset filemode="755" dir= '${project.build.directory}/build/' />
|
||||||
|
</zip>
|
||||||
|
</tasks>
|
||||||
|
</configuration>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
</plugin>
|
</plugin>
|
||||||
</plugins>
|
</plugins>
|
||||||
</build>
|
</build>
|
||||||
|
|
||||||
|
</project>
|
||||||
</project>
|
|
||||||
|
8
novel-front/src/main/build/scripts/readme.txt
Normal file
8
novel-front/src/main/build/scripts/readme.txt
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
1:linux启动环境
|
||||||
|
sh start.sh
|
||||||
|
|
||||||
|
3:windows启动环境
|
||||||
|
windows-start.bat
|
||||||
|
|
||||||
|
3:linux停止应用
|
||||||
|
sh stop.sh
|
47
novel-front/src/main/build/scripts/start.sh
Normal file
47
novel-front/src/main/build/scripts/start.sh
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
ENGINE=novel-front.jar
|
||||||
|
cd ../
|
||||||
|
|
||||||
|
#部署目路
|
||||||
|
DEPLOY_DIR=`pwd`
|
||||||
|
#获取到当前目录的名称
|
||||||
|
SERVER_NAME=`basename $DEPLOY_DIR`
|
||||||
|
|
||||||
|
#应用进程
|
||||||
|
PIDS=`ps -ef | grep java | grep "$ENGINE" |awk '{print $2}'`
|
||||||
|
#设置日志文件的输出目录
|
||||||
|
LOGS_DIR=$DEPLOY_DIR/logs
|
||||||
|
if [ ! -d $LOGS_DIR ]; then
|
||||||
|
mkdir $LOGS_DIR
|
||||||
|
fi
|
||||||
|
#日志
|
||||||
|
STDOUT_FILE=$LOGS_DIR/stdout.log
|
||||||
|
#JAVA 环境配置
|
||||||
|
JAVA_OPTS=" -Djava.net.preferIPv4Stack=true -Dlog.home=$LOGS_DIR"
|
||||||
|
|
||||||
|
JAVA_MEM_OPTS=" -server -Xms1024m -Xmx1024m -XX:MetaspaceSize=64m -XX:MaxMetaspaceSize=256m -XX:+UseG1GC -XX:MaxGCPauseMillis=100 -XX:InitiatingHeapOccupancyPercent=50 -XX:+PrintGCApplicationStoppedTime -XX:+PrintGCApplicationConcurrentTime -XX:+PrintGCDateStamps -verbose:gc -XX:+PrintGCDetails -XX:+PrintHeapAtGC -Xloggc:$LOGS_DIR/gc.log -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=100M -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=dump.hprof "
|
||||||
|
#退出标志
|
||||||
|
RETVAL="0"
|
||||||
|
|
||||||
|
if [ -n "$PIDS" ]; then
|
||||||
|
echo "ERROR: The $SERVER_NAME already started!"
|
||||||
|
echo "PID: $PIDS"
|
||||||
|
exit $RETVAL
|
||||||
|
fi
|
||||||
|
|
||||||
|
nohup java -jar $JAVA_OPTS $JAVA_MEM_OPTS -Dloader.path=conf,lib $ENGINE > $STDOUT_FILE 2>&1 &
|
||||||
|
COUNT=0
|
||||||
|
while [ $COUNT -lt 1 ]; do
|
||||||
|
echo -e ".\c"
|
||||||
|
sleep 1
|
||||||
|
COUNT=`ps -f | grep java | grep "$DEPLOY_DIR" | awk '{print $2}' | wc -l`
|
||||||
|
if [ $COUNT -gt 0 ]; then
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "OK!"
|
||||||
|
PIDS=`ps -f | grep java | grep "$DEPLOY_DIR" | awk '{print $2}'`
|
||||||
|
echo "PID: $PIDS"
|
||||||
|
echo "STDOUT: $STDOUT_FILE"
|
33
novel-front/src/main/build/scripts/stop.sh
Normal file
33
novel-front/src/main/build/scripts/stop.sh
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
SERVER_NAME=novel-front.jar
|
||||||
|
|
||||||
|
#应用进程
|
||||||
|
PIDS=`ps -ef | grep java | grep "$SERVER_NAME" |awk '{print $2}'`
|
||||||
|
if [ -z "$PIDS" ]; then
|
||||||
|
echo "ERROR: The $SERVER_NAME does not started!"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo -e "Stopping the $SERVER_NAME ...\c"
|
||||||
|
for PID in $PIDS ; do
|
||||||
|
kill $PID > /dev/null 2>&1
|
||||||
|
done
|
||||||
|
|
||||||
|
COUNT=0
|
||||||
|
while [ $COUNT -lt 1 ]; do
|
||||||
|
echo -e ".\c"
|
||||||
|
sleep 1
|
||||||
|
COUNT=1
|
||||||
|
for PID in $PIDS ; do
|
||||||
|
PID_EXIST=`ps -f -p $PID | grep java`
|
||||||
|
if [ -n "$PID_EXIST" ]; then
|
||||||
|
COUNT=0
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "OK!"
|
||||||
|
echo "PID: $PIDS"
|
||||||
|
PIDS=""
|
||||||
|
|
10
novel-front/src/main/build/scripts/windows-start.bat
Normal file
10
novel-front/src/main/build/scripts/windows-start.bat
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
@echo off
|
||||||
|
setlocal enabledelayedexpansion
|
||||||
|
set JAVA=java
|
||||||
|
|
||||||
|
set OPTS=-XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=128m -Xms1024m -Xmx1024m -Xmn256m -Xss256k -XX:SurvivorRatio=8 -XX:+UseConcMarkSweepGC
|
||||||
|
set ENGINE=novel-front.jar
|
||||||
|
cd ../
|
||||||
|
java -jar %OPTS% -Dloader.path=conf,lib %ENGINE%
|
||||||
|
pause
|
||||||
|
|
@ -1,22 +1,21 @@
|
|||||||
package com.java2nb.novel.controller;
|
package com.java2nb.novel.controller;
|
||||||
|
|
||||||
import com.github.pagehelper.PageInfo;
|
import com.java2nb.novel.core.bean.PageBean;
|
||||||
import com.java2nb.novel.core.bean.ResultBean;
|
import com.java2nb.novel.core.bean.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.core.exception.BusinessException;
|
import com.java2nb.novel.core.exception.BusinessException;
|
||||||
import com.java2nb.novel.core.utils.BeanUtil;
|
|
||||||
import com.java2nb.novel.entity.Author;
|
import com.java2nb.novel.entity.Author;
|
||||||
|
import com.java2nb.novel.entity.AuthorIncome;
|
||||||
|
import com.java2nb.novel.entity.AuthorIncomeDetail;
|
||||||
import com.java2nb.novel.entity.Book;
|
import com.java2nb.novel.entity.Book;
|
||||||
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.FriendLinkService;
|
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.web.bind.annotation.*;
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletRequest;
|
||||||
import javax.servlet.http.HttpServletResponse;
|
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -36,7 +35,7 @@ public class AuthorController extends BaseController{
|
|||||||
* 校验笔名是否存在
|
* 校验笔名是否存在
|
||||||
* */
|
* */
|
||||||
@GetMapping("checkPenName")
|
@GetMapping("checkPenName")
|
||||||
public ResultBean checkPenName(String penName){
|
public ResultBean<Boolean> checkPenName(String penName){
|
||||||
|
|
||||||
return ResultBean.ok(authorService.checkPenName(penName));
|
return ResultBean.ok(authorService.checkPenName(penName));
|
||||||
}
|
}
|
||||||
@ -45,7 +44,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<PageBean<Book>> listBookByPage(@RequestParam(value = "curr", defaultValue = "1") int page, @RequestParam(value = "limit", defaultValue = "10") int pageSize , HttpServletRequest request){
|
||||||
|
|
||||||
return ResultBean.ok(bookService.listBookPageByUserId(getUserDetails(request).getId(),page,pageSize));
|
return ResultBean.ok(bookService.listBookPageByUserId(getUserDetails(request).getId(),page,pageSize));
|
||||||
}
|
}
|
||||||
@ -54,7 +53,7 @@ public class AuthorController extends BaseController{
|
|||||||
* 发布小说
|
* 发布小说
|
||||||
* */
|
* */
|
||||||
@PostMapping("addBook")
|
@PostMapping("addBook")
|
||||||
public ResultBean addBook(@RequestParam("bookDesc") String bookDesc,Book book,HttpServletRequest request){
|
public ResultBean<Void> addBook(@RequestParam("bookDesc") String bookDesc,Book book,HttpServletRequest request){
|
||||||
|
|
||||||
Author author = checkAuthor(request);
|
Author author = checkAuthor(request);
|
||||||
|
|
||||||
@ -72,7 +71,7 @@ public class AuthorController extends BaseController{
|
|||||||
* 更新小说状态,上架或下架
|
* 更新小说状态,上架或下架
|
||||||
* */
|
* */
|
||||||
@PostMapping("updateBookStatus")
|
@PostMapping("updateBookStatus")
|
||||||
public ResultBean updateBookStatus(Long bookId,Byte status,HttpServletRequest request){
|
public ResultBean<Void> updateBookStatus(Long bookId,Byte status,HttpServletRequest request){
|
||||||
Author author = checkAuthor(request);
|
Author author = checkAuthor(request);
|
||||||
|
|
||||||
//更新小说状态,上架或下架
|
//更新小说状态,上架或下架
|
||||||
@ -87,7 +86,7 @@ public class AuthorController extends BaseController{
|
|||||||
* 删除章节
|
* 删除章节
|
||||||
*/
|
*/
|
||||||
@DeleteMapping("deleteIndex/{indexId}")
|
@DeleteMapping("deleteIndex/{indexId}")
|
||||||
public ResultBean deleteIndex(@PathVariable("indexId") Long indexId, HttpServletRequest request) {
|
public ResultBean<Void> deleteIndex(@PathVariable("indexId") Long indexId, HttpServletRequest request) {
|
||||||
|
|
||||||
Author author = checkAuthor(request);
|
Author author = checkAuthor(request);
|
||||||
|
|
||||||
@ -101,7 +100,7 @@ public class AuthorController extends BaseController{
|
|||||||
* 更新章节名
|
* 更新章节名
|
||||||
*/
|
*/
|
||||||
@PostMapping("updateIndexName")
|
@PostMapping("updateIndexName")
|
||||||
public ResultBean updateIndexName(Long indexId, String indexName, HttpServletRequest request) {
|
public ResultBean<Void> updateIndexName(Long indexId, String indexName, HttpServletRequest request) {
|
||||||
|
|
||||||
Author author = checkAuthor(request);
|
Author author = checkAuthor(request);
|
||||||
|
|
||||||
@ -118,7 +117,7 @@ public class AuthorController extends BaseController{
|
|||||||
* 发布章节内容
|
* 发布章节内容
|
||||||
*/
|
*/
|
||||||
@PostMapping("addBookContent")
|
@PostMapping("addBookContent")
|
||||||
public ResultBean addBookContent(Long bookId, String indexName, String content,Byte isVip, HttpServletRequest request) {
|
public ResultBean<Void> addBookContent(Long bookId, String indexName, String content,Byte isVip, HttpServletRequest request) {
|
||||||
Author author = checkAuthor(request);
|
Author author = checkAuthor(request);
|
||||||
|
|
||||||
content = content.replaceAll("\\n", "<br>")
|
content = content.replaceAll("\\n", "<br>")
|
||||||
@ -133,7 +132,7 @@ public class AuthorController extends BaseController{
|
|||||||
* 查询章节内容
|
* 查询章节内容
|
||||||
*/
|
*/
|
||||||
@GetMapping("queryIndexContent/{indexId}")
|
@GetMapping("queryIndexContent/{indexId}")
|
||||||
public ResultBean queryIndexContent(@PathVariable("indexId") Long indexId, HttpServletRequest request) {
|
public ResultBean<String> queryIndexContent(@PathVariable("indexId") Long indexId, HttpServletRequest request) {
|
||||||
|
|
||||||
Author author = checkAuthor(request);
|
Author author = checkAuthor(request);
|
||||||
|
|
||||||
@ -149,7 +148,7 @@ public class AuthorController extends BaseController{
|
|||||||
* 更新章节内容
|
* 更新章节内容
|
||||||
*/
|
*/
|
||||||
@PostMapping("updateBookContent")
|
@PostMapping("updateBookContent")
|
||||||
public ResultBean updateBookContent(Long indexId, String indexName, String content, HttpServletRequest request) {
|
public ResultBean<Void> updateBookContent(Long indexId, String indexName, String content, HttpServletRequest request) {
|
||||||
Author author = checkAuthor(request);
|
Author author = checkAuthor(request);
|
||||||
|
|
||||||
content = content.replaceAll("\\n", "<br>")
|
content = content.replaceAll("\\n", "<br>")
|
||||||
@ -160,16 +159,27 @@ public class AuthorController extends BaseController{
|
|||||||
return ResultBean.ok();
|
return ResultBean.ok();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 修改小说封面
|
||||||
|
*/
|
||||||
|
@PostMapping("updateBookPic")
|
||||||
|
public ResultBean<Void> updateBookPic(@RequestParam("bookId") Long bookId,@RequestParam("bookPic") String bookPic,HttpServletRequest request) {
|
||||||
|
Author author = checkAuthor(request);
|
||||||
|
bookService.updateBookPic(bookId,bookPic, author.getId());
|
||||||
|
return ResultBean.ok();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 作家日收入统计数据分页列表查询
|
* 作家日收入统计数据分页列表查询
|
||||||
* */
|
* */
|
||||||
@GetMapping("listIncomeDailyByPage")
|
@GetMapping("listIncomeDailyByPage")
|
||||||
public ResultBean listIncomeDailyByPage(@RequestParam(value = "curr", defaultValue = "1") int page,
|
public ResultBean<PageBean<AuthorIncomeDetail>> listIncomeDailyByPage(@RequestParam(value = "curr", defaultValue = "1") int page,
|
||||||
@RequestParam(value = "limit", defaultValue = "10") int pageSize ,
|
@RequestParam(value = "limit", defaultValue = "10") int pageSize ,
|
||||||
@RequestParam(value = "bookId", defaultValue = "0") Long bookId,
|
@RequestParam(value = "bookId", defaultValue = "0") Long bookId,
|
||||||
@RequestParam(value = "startTime",defaultValue = "2020-05-01") Date startTime,
|
@RequestParam(value = "startTime",defaultValue = "2020-05-01") Date startTime,
|
||||||
@RequestParam(value = "endTime",defaultValue = "2030-01-01") Date endTime,
|
@RequestParam(value = "endTime",defaultValue = "2030-01-01") Date endTime,
|
||||||
HttpServletRequest request){
|
HttpServletRequest request){
|
||||||
|
|
||||||
return ResultBean.ok(authorService.listIncomeDailyByPage(page,pageSize,getUserDetails(request).getId(),bookId,startTime,endTime));
|
return ResultBean.ok(authorService.listIncomeDailyByPage(page,pageSize,getUserDetails(request).getId(),bookId,startTime,endTime));
|
||||||
}
|
}
|
||||||
@ -179,10 +189,10 @@ public class AuthorController extends BaseController{
|
|||||||
* 作家月收入统计数据分页列表查询
|
* 作家月收入统计数据分页列表查询
|
||||||
* */
|
* */
|
||||||
@GetMapping("listIncomeMonthByPage")
|
@GetMapping("listIncomeMonthByPage")
|
||||||
public ResultBean listIncomeMonthByPage(@RequestParam(value = "curr", defaultValue = "1") int page,
|
public ResultBean<PageBean<AuthorIncome>> listIncomeMonthByPage(@RequestParam(value = "curr", defaultValue = "1") int page,
|
||||||
@RequestParam(value = "limit", defaultValue = "10") int pageSize ,
|
@RequestParam(value = "limit", defaultValue = "10") int pageSize ,
|
||||||
@RequestParam(value = "bookId", defaultValue = "0") Long bookId,
|
@RequestParam(value = "bookId", defaultValue = "0") Long bookId,
|
||||||
HttpServletRequest request){
|
HttpServletRequest request){
|
||||||
|
|
||||||
return ResultBean.ok(authorService.listIncomeMonthByPage(page,pageSize,getUserDetails(request).getId(),bookId));
|
return ResultBean.ok(authorService.listIncomeMonthByPage(page,pageSize,getUserDetails(request).getId(),bookId));
|
||||||
}
|
}
|
||||||
|
@ -6,7 +6,11 @@ import com.java2nb.novel.core.bean.ResultBean;
|
|||||||
import com.java2nb.novel.core.bean.UserDetails;
|
import com.java2nb.novel.core.bean.UserDetails;
|
||||||
import com.java2nb.novel.core.enums.ResponseStatus;
|
import com.java2nb.novel.core.enums.ResponseStatus;
|
||||||
import com.java2nb.novel.entity.Book;
|
import com.java2nb.novel.entity.Book;
|
||||||
|
import com.java2nb.novel.entity.BookCategory;
|
||||||
import com.java2nb.novel.entity.BookComment;
|
import com.java2nb.novel.entity.BookComment;
|
||||||
|
import com.java2nb.novel.entity.BookIndex;
|
||||||
|
import com.java2nb.novel.vo.BookCommentVO;
|
||||||
|
import com.java2nb.novel.vo.BookSettingVO;
|
||||||
import com.java2nb.novel.vo.BookSpVO;
|
import com.java2nb.novel.vo.BookSpVO;
|
||||||
import com.java2nb.novel.service.BookService;
|
import com.java2nb.novel.service.BookService;
|
||||||
import com.java2nb.novel.vo.BookVO;
|
import com.java2nb.novel.vo.BookVO;
|
||||||
@ -18,6 +22,7 @@ import org.springframework.web.bind.annotation.*;
|
|||||||
|
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletRequest;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -41,7 +46,7 @@ public class BookController extends BaseController{
|
|||||||
* 查询首页小说设置列表数据
|
* 查询首页小说设置列表数据
|
||||||
* */
|
* */
|
||||||
@GetMapping("listBookSetting")
|
@GetMapping("listBookSetting")
|
||||||
public ResultBean listBookSetting(){
|
public ResultBean<Map<Byte, List<BookSettingVO>>> listBookSetting(){
|
||||||
return ResultBean.ok(bookService.listBookSettingVO());
|
return ResultBean.ok(bookService.listBookSettingVO());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -49,7 +54,7 @@ public class BookController extends BaseController{
|
|||||||
* 查询首页点击榜单数据
|
* 查询首页点击榜单数据
|
||||||
* */
|
* */
|
||||||
@GetMapping("listClickRank")
|
@GetMapping("listClickRank")
|
||||||
public ResultBean listClickRank(){
|
public ResultBean<List<Book>> listClickRank(){
|
||||||
return ResultBean.ok(bookService.listClickRank());
|
return ResultBean.ok(bookService.listClickRank());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -57,7 +62,7 @@ public class BookController extends BaseController{
|
|||||||
* 查询首页新书榜单数据
|
* 查询首页新书榜单数据
|
||||||
* */
|
* */
|
||||||
@GetMapping("listNewRank")
|
@GetMapping("listNewRank")
|
||||||
public ResultBean listNewRank(){
|
public ResultBean<List<Book>> listNewRank(){
|
||||||
return ResultBean.ok(bookService.listNewRank());
|
return ResultBean.ok(bookService.listNewRank());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -65,7 +70,7 @@ public class BookController extends BaseController{
|
|||||||
* 查询首页更新榜单数据
|
* 查询首页更新榜单数据
|
||||||
* */
|
* */
|
||||||
@GetMapping("listUpdateRank")
|
@GetMapping("listUpdateRank")
|
||||||
public ResultBean listUpdateRank(){
|
public ResultBean<List<BookVO>> listUpdateRank(){
|
||||||
return ResultBean.ok(bookService.listUpdateRank());
|
return ResultBean.ok(bookService.listUpdateRank());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -73,7 +78,7 @@ public class BookController extends BaseController{
|
|||||||
* 查询小说分类列表
|
* 查询小说分类列表
|
||||||
* */
|
* */
|
||||||
@GetMapping("listBookCategory")
|
@GetMapping("listBookCategory")
|
||||||
public ResultBean listBookCategory(){
|
public ResultBean<List<BookCategory>> listBookCategory(){
|
||||||
return ResultBean.ok(bookService.listBookCategory());
|
return ResultBean.ok(bookService.listBookCategory());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -81,7 +86,7 @@ public class BookController extends BaseController{
|
|||||||
* 分页搜索
|
* 分页搜索
|
||||||
* */
|
* */
|
||||||
@GetMapping("searchByPage")
|
@GetMapping("searchByPage")
|
||||||
public ResultBean searchByPage(BookSpVO bookSP, @RequestParam(value = "curr", defaultValue = "1") int page, @RequestParam(value = "limit", defaultValue = "20") int pageSize){
|
public ResultBean<?> searchByPage(BookSpVO bookSP, @RequestParam(value = "curr", defaultValue = "1") int page, @RequestParam(value = "limit", defaultValue = "20") int pageSize){
|
||||||
return ResultBean.ok(bookService.searchByPage(bookSP,page,pageSize));
|
return ResultBean.ok(bookService.searchByPage(bookSP,page,pageSize));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -89,7 +94,7 @@ public class BookController extends BaseController{
|
|||||||
* 查询小说详情信息
|
* 查询小说详情信息
|
||||||
* */
|
* */
|
||||||
@GetMapping("queryBookDetail/{id}")
|
@GetMapping("queryBookDetail/{id}")
|
||||||
public ResultBean queryBookDetail(@PathVariable("id") Long id){
|
public ResultBean<Book> queryBookDetail(@PathVariable("id") Long id){
|
||||||
return ResultBean.ok(bookService.queryBookDetail(id));
|
return ResultBean.ok(bookService.queryBookDetail(id));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -98,7 +103,7 @@ public class BookController extends BaseController{
|
|||||||
* 查询小说排行信息
|
* 查询小说排行信息
|
||||||
* */
|
* */
|
||||||
@GetMapping("listRank")
|
@GetMapping("listRank")
|
||||||
public ResultBean listRank(@RequestParam(value = "type",defaultValue = "0") Byte type,@RequestParam(value = "limit",defaultValue = "30") Integer limit){
|
public ResultBean<List<Book>> listRank(@RequestParam(value = "type",defaultValue = "0") Byte type,@RequestParam(value = "limit",defaultValue = "30") Integer limit){
|
||||||
return ResultBean.ok(bookService.listRank(type,limit));
|
return ResultBean.ok(bookService.listRank(type,limit));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -106,7 +111,7 @@ public class BookController extends BaseController{
|
|||||||
* 增加点击次数
|
* 增加点击次数
|
||||||
* */
|
* */
|
||||||
@PostMapping("addVisitCount")
|
@PostMapping("addVisitCount")
|
||||||
public ResultBean addVisitCount(Long bookId){
|
public ResultBean<Void> addVisitCount(Long bookId){
|
||||||
if(enableMq == 1) {
|
if(enableMq == 1) {
|
||||||
rabbitTemplate.convertAndSend("ADD-BOOK-VISIT-EXCHANGE", null, bookId);
|
rabbitTemplate.convertAndSend("ADD-BOOK-VISIT-EXCHANGE", null, bookId);
|
||||||
}else {
|
}else {
|
||||||
@ -119,7 +124,7 @@ public class BookController extends BaseController{
|
|||||||
* 查询章节相关信息
|
* 查询章节相关信息
|
||||||
* */
|
* */
|
||||||
@GetMapping("queryBookIndexAbout")
|
@GetMapping("queryBookIndexAbout")
|
||||||
public ResultBean queryBookIndexAbout(Long bookId,Long lastBookIndexId) {
|
public ResultBean<Map<String,Object>> queryBookIndexAbout(Long bookId,Long lastBookIndexId) {
|
||||||
Map<String,Object> data = new HashMap<>(2);
|
Map<String,Object> data = new HashMap<>(2);
|
||||||
data.put("bookIndexCount",bookService.queryIndexCount(bookId));
|
data.put("bookIndexCount",bookService.queryIndexCount(bookId));
|
||||||
String lastBookContent = bookService.queryBookContent(lastBookIndexId).getContent();
|
String lastBookContent = bookService.queryBookContent(lastBookIndexId).getContent();
|
||||||
@ -134,7 +139,7 @@ public class BookController extends BaseController{
|
|||||||
* 根据分类id查询同类推荐书籍
|
* 根据分类id查询同类推荐书籍
|
||||||
* */
|
* */
|
||||||
@GetMapping("listRecBookByCatId")
|
@GetMapping("listRecBookByCatId")
|
||||||
public ResultBean listRecBookByCatId(Integer catId) {
|
public ResultBean<List<Book>> listRecBookByCatId(Integer catId) {
|
||||||
return ResultBean.ok(bookService.listRecBookByCatId(catId));
|
return ResultBean.ok(bookService.listRecBookByCatId(catId));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -143,7 +148,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<PageBean<BookCommentVO>> listCommentByPage(@RequestParam("bookId") Long bookId, @RequestParam(value = "curr", defaultValue = "1") int page, @RequestParam(value = "limit", defaultValue = "5") int pageSize) {
|
||||||
return ResultBean.ok(bookService.listCommentByPage(null,bookId,page,pageSize));
|
return ResultBean.ok(bookService.listCommentByPage(null,bookId,page,pageSize));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -151,7 +156,7 @@ public class BookController extends BaseController{
|
|||||||
* 新增评价
|
* 新增评价
|
||||||
* */
|
* */
|
||||||
@PostMapping("addBookComment")
|
@PostMapping("addBookComment")
|
||||||
public ResultBean addBookComment(BookComment comment, HttpServletRequest request) {
|
public ResultBean<?> addBookComment(BookComment comment, HttpServletRequest request) {
|
||||||
UserDetails userDetails = getUserDetails(request);
|
UserDetails userDetails = getUserDetails(request);
|
||||||
if (userDetails == null) {
|
if (userDetails == null) {
|
||||||
return ResultBean.fail(ResponseStatus.NO_LOGIN);
|
return ResultBean.fail(ResponseStatus.NO_LOGIN);
|
||||||
@ -164,7 +169,7 @@ public class BookController extends BaseController{
|
|||||||
* 根据小说ID查询小说前十条最新更新目录集合
|
* 根据小说ID查询小说前十条最新更新目录集合
|
||||||
* */
|
* */
|
||||||
@GetMapping("queryNewIndexList")
|
@GetMapping("queryNewIndexList")
|
||||||
public ResultBean queryNewIndexList(Long bookId){
|
public ResultBean<List<BookIndex>> queryNewIndexList(Long bookId){
|
||||||
return ResultBean.ok(bookService.queryIndexList(bookId,"index_num desc",1,10));
|
return ResultBean.ok(bookService.queryIndexList(bookId,"index_num desc",1,10));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -172,7 +177,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<PageBean<BookIndex>> indexList(Long bookId,@RequestParam(value = "curr", defaultValue = "1") int page, @RequestParam(value = "limit", defaultValue = "5") int pageSize,@RequestParam(value = "orderBy",defaultValue = "index_num desc") String orderBy) {
|
||||||
return ResultBean.ok(new PageBean<>(bookService.queryIndexList(bookId,orderBy,page,pageSize)));
|
return ResultBean.ok(new PageBean<>(bookService.queryIndexList(bookId,orderBy,page,pageSize)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -40,7 +40,7 @@ public class CacheController {
|
|||||||
* @param type 缓存类型,1:首页书籍推荐,2:首页新闻,3:首页友情链接
|
* @param type 缓存类型,1:首页书籍推荐,2:首页新闻,3:首页友情链接
|
||||||
* */
|
* */
|
||||||
@GetMapping("refresh/{pass}/{type}")
|
@GetMapping("refresh/{pass}/{type}")
|
||||||
public ResultBean refreshCache(@PathVariable("type") Byte type, @PathVariable("pass") String pass){
|
public ResultBean<Void> refreshCache(@PathVariable("type") Byte type, @PathVariable("pass") String pass){
|
||||||
if(!cacheManagerPass.equals(pass)){
|
if(!cacheManagerPass.equals(pass)){
|
||||||
return ResultBean.fail(ResponseStatus.PASSWORD_ERROR);
|
return ResultBean.fail(ResponseStatus.PASSWORD_ERROR);
|
||||||
}
|
}
|
||||||
|
@ -2,28 +2,23 @@ package com.java2nb.novel.controller;
|
|||||||
|
|
||||||
import com.java2nb.novel.core.bean.ResultBean;
|
import com.java2nb.novel.core.bean.ResultBean;
|
||||||
import com.java2nb.novel.core.cache.CacheService;
|
import com.java2nb.novel.core.cache.CacheService;
|
||||||
|
import com.java2nb.novel.core.enums.ResponseStatus;
|
||||||
|
import com.java2nb.novel.core.exception.BusinessException;
|
||||||
import com.java2nb.novel.core.utils.Constants;
|
import com.java2nb.novel.core.utils.Constants;
|
||||||
|
import com.java2nb.novel.core.utils.FileUtil;
|
||||||
import com.java2nb.novel.core.utils.RandomValidateCodeUtil;
|
import com.java2nb.novel.core.utils.RandomValidateCodeUtil;
|
||||||
import com.java2nb.novel.core.utils.RestTemplateUtil;
|
|
||||||
import com.java2nb.novel.core.utils.UUIDUtil;
|
import com.java2nb.novel.core.utils.UUIDUtil;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import lombok.SneakyThrows;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.apache.commons.codec.Charsets;
|
|
||||||
import org.apache.http.client.utils.DateUtils;
|
import org.apache.http.client.utils.DateUtils;
|
||||||
import org.springframework.beans.factory.annotation.Value;
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
import org.springframework.core.io.Resource;
|
|
||||||
import org.springframework.http.HttpEntity;
|
|
||||||
import org.springframework.http.HttpHeaders;
|
|
||||||
import org.springframework.http.HttpMethod;
|
|
||||||
import org.springframework.http.ResponseEntity;
|
|
||||||
import org.springframework.stereotype.Controller;
|
import org.springframework.stereotype.Controller;
|
||||||
import org.springframework.web.bind.annotation.*;
|
import org.springframework.web.bind.annotation.*;
|
||||||
import org.springframework.web.multipart.MultipartFile;
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
|
|
||||||
import javax.imageio.ImageIO;
|
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletRequest;
|
||||||
import javax.servlet.http.HttpServletResponse;
|
import javax.servlet.http.HttpServletResponse;
|
||||||
import javax.servlet.http.HttpSession;
|
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
@ -63,29 +58,35 @@ public class FileController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 文件上传
|
* 图片上传
|
||||||
|
* @return
|
||||||
*/
|
*/
|
||||||
|
@SneakyThrows
|
||||||
@ResponseBody
|
@ResponseBody
|
||||||
@PostMapping("/upload")
|
@PostMapping("/picUpload")
|
||||||
ResultBean upload(@RequestParam("file") MultipartFile file) {
|
ResultBean<String> upload(@RequestParam("file") MultipartFile file) {
|
||||||
Date currentDate = new Date();
|
Date currentDate = new Date();
|
||||||
try {
|
String savePath =
|
||||||
String savePath =
|
Constants.LOCAL_PIC_PREFIX + DateUtils.formatDate(currentDate, "yyyy") + "/" +
|
||||||
Constants.LOCAL_PIC_PREFIX + DateUtils.formatDate(currentDate, "yyyy") + "/" +
|
DateUtils.formatDate(currentDate, "MM") + "/" +
|
||||||
DateUtils.formatDate(currentDate, "MM") + "/" +
|
DateUtils.formatDate(currentDate, "dd");
|
||||||
DateUtils.formatDate(currentDate, "dd") ;
|
String oriName = file.getOriginalFilename();
|
||||||
String oriName = file.getOriginalFilename();
|
assert oriName != null;
|
||||||
String saveFileName = UUIDUtil.getUUID32() + oriName.substring(oriName.lastIndexOf("."));
|
String saveFileName = UUIDUtil.getUUID32() + oriName.substring(oriName.lastIndexOf("."));
|
||||||
File saveFile = new File( picSavePath + savePath, saveFileName);
|
File saveFile = new File(picSavePath + savePath, saveFileName);
|
||||||
if (!saveFile.getParentFile().exists()) {
|
if (!saveFile.getParentFile().exists()) {
|
||||||
saveFile.getParentFile().mkdirs();
|
boolean isSuccess = saveFile.getParentFile().mkdirs();
|
||||||
|
if(!isSuccess){
|
||||||
|
throw new BusinessException(ResponseStatus.FILE_DIR_MAKE_FAIL);
|
||||||
}
|
}
|
||||||
file.transferTo(saveFile);
|
|
||||||
return ResultBean.ok(savePath+"/"+saveFileName);
|
|
||||||
} catch (Exception e) {
|
|
||||||
log.error(e.getMessage(), e);
|
|
||||||
return ResultBean.error();
|
|
||||||
}
|
}
|
||||||
|
file.transferTo(saveFile);
|
||||||
|
if(!FileUtil.isImage(saveFile)){
|
||||||
|
//上传的文件不是图片
|
||||||
|
saveFile.delete();
|
||||||
|
throw new BusinessException(ResponseStatus.FILE_NOT_IMAGE);
|
||||||
|
};
|
||||||
|
return ResultBean.ok(savePath + "/" + saveFileName);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package com.java2nb.novel.controller;
|
package com.java2nb.novel.controller;
|
||||||
|
|
||||||
import com.java2nb.novel.core.bean.ResultBean;
|
import com.java2nb.novel.core.bean.ResultBean;
|
||||||
|
import com.java2nb.novel.entity.FriendLink;
|
||||||
import com.java2nb.novel.service.FriendLinkService;
|
import com.java2nb.novel.service.FriendLinkService;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
@ -9,6 +10,8 @@ import org.springframework.web.bind.annotation.PostMapping;
|
|||||||
import org.springframework.web.bind.annotation.RequestMapping;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author 11797
|
* @author 11797
|
||||||
*/
|
*/
|
||||||
@ -24,7 +27,7 @@ public class FriendLinkController {
|
|||||||
* 查询首页友情链接
|
* 查询首页友情链接
|
||||||
* */
|
* */
|
||||||
@GetMapping("listIndexLink")
|
@GetMapping("listIndexLink")
|
||||||
public ResultBean listIndexLink(){
|
public ResultBean<List<FriendLink>> listIndexLink(){
|
||||||
return ResultBean.ok(friendLinkService.listIndexLink());
|
return ResultBean.ok(friendLinkService.listIndexLink());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,12 +1,16 @@
|
|||||||
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.entity.News;
|
||||||
import com.java2nb.novel.service.NewsService;
|
import com.java2nb.novel.service.NewsService;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.web.bind.annotation.*;
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author 11797
|
* @author 11797
|
||||||
*/
|
*/
|
||||||
@ -22,7 +26,7 @@ public class NewsController {
|
|||||||
* 查询首页新闻
|
* 查询首页新闻
|
||||||
* */
|
* */
|
||||||
@GetMapping("listIndexNews")
|
@GetMapping("listIndexNews")
|
||||||
public ResultBean listIndexNews(){
|
public ResultBean<List<News>> listIndexNews(){
|
||||||
return ResultBean.ok(newsService.listIndexNews());
|
return ResultBean.ok(newsService.listIndexNews());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -30,10 +34,19 @@ 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<PageBean<News>> listByPage(@RequestParam(value = "curr", defaultValue = "1") int page, @RequestParam(value = "limit", defaultValue = "5") int pageSize){
|
||||||
return ResultBean.ok(newsService.listByPage(page,pageSize));
|
return ResultBean.ok(newsService.listByPage(page,pageSize));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 增加新闻阅读量
|
||||||
|
* */
|
||||||
|
@PostMapping("addReadCount")
|
||||||
|
public ResultBean<Void> addReadCount(@RequestParam(value = "newsId") Integer newsId){
|
||||||
|
newsService.addReadCount(newsId);
|
||||||
|
return ResultBean.ok();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -17,8 +17,8 @@ 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.PrintWriter;
|
import java.io.PrintWriter;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -47,7 +47,6 @@ public class PayController extends BaseController {
|
|||||||
if (userDetails == null) {
|
if (userDetails == null) {
|
||||||
//未登录,跳转到登陆页面
|
//未登录,跳转到登陆页面
|
||||||
httpResponse.sendRedirect("/user/login.html?originUrl=/pay/aliPay?payAmount="+payAmount);
|
httpResponse.sendRedirect("/user/login.html?originUrl=/pay/aliPay?payAmount="+payAmount);
|
||||||
return;
|
|
||||||
}else {
|
}else {
|
||||||
//创建充值订单
|
//创建充值订单
|
||||||
Long outTradeNo = orderService.createPayOrder((byte)1,payAmount,userDetails.getId());
|
Long outTradeNo = orderService.createPayOrder((byte)1,payAmount,userDetails.getId());
|
||||||
@ -92,11 +91,10 @@ public class PayController extends BaseController {
|
|||||||
PrintWriter out = httpResponse.getWriter();
|
PrintWriter out = httpResponse.getWriter();
|
||||||
|
|
||||||
//获取支付宝POST过来反馈信息
|
//获取支付宝POST过来反馈信息
|
||||||
Map<String,String> params = new HashMap<String,String>();
|
Map<String,String> params = new HashMap<>();
|
||||||
Map<String,String[]> requestParams = request.getParameterMap();
|
Map<String,String[]> requestParams = request.getParameterMap();
|
||||||
for (Iterator<String> iter = requestParams.keySet().iterator(); iter.hasNext();) {
|
for (String name : requestParams.keySet()) {
|
||||||
String name = (String) iter.next();
|
String[] values = requestParams.get(name);
|
||||||
String[] values = (String[]) requestParams.get(name);
|
|
||||||
String valueStr = "";
|
String valueStr = "";
|
||||||
for (int i = 0; i < values.length; i++) {
|
for (int i = 0; i < values.length; i++) {
|
||||||
valueStr = (i == values.length - 1) ? valueStr + values[i]
|
valueStr = (i == values.length - 1) ? valueStr + values[i]
|
||||||
@ -119,13 +117,13 @@ public class PayController extends BaseController {
|
|||||||
if(signVerified) {
|
if(signVerified) {
|
||||||
//验证成功
|
//验证成功
|
||||||
//商户订单号
|
//商户订单号
|
||||||
String outTradeNo = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"),"UTF-8");
|
String outTradeNo = new String(request.getParameter("out_trade_no").getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);
|
||||||
|
|
||||||
//支付宝交易号
|
//支付宝交易号
|
||||||
String tradeNo = new String(request.getParameter("trade_no").getBytes("ISO-8859-1"),"UTF-8");
|
String tradeNo = new String(request.getParameter("trade_no").getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);
|
||||||
|
|
||||||
//交易状态
|
//交易状态
|
||||||
String tradeStatus = new String(request.getParameter("trade_status").getBytes("ISO-8859-1"),"UTF-8");
|
String tradeStatus = new String(request.getParameter("trade_status").getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);
|
||||||
|
|
||||||
//更新订单状态
|
//更新订单状态
|
||||||
orderService.updatePayOrder(Long.parseLong(outTradeNo), tradeNo, tradeStatus);
|
orderService.updatePayOrder(Long.parseLong(outTradeNo), tradeNo, tradeStatus);
|
||||||
|
@ -41,7 +41,7 @@ public class UserController extends BaseController {
|
|||||||
* 登陆
|
* 登陆
|
||||||
*/
|
*/
|
||||||
@PostMapping("login")
|
@PostMapping("login")
|
||||||
public ResultBean login(User user) {
|
public ResultBean<Map<String, Object>> login(User user) {
|
||||||
|
|
||||||
//登陆
|
//登陆
|
||||||
UserDetails userDetails = userService.login(user);
|
UserDetails userDetails = userService.login(user);
|
||||||
@ -58,7 +58,7 @@ public class UserController extends BaseController {
|
|||||||
* 注册
|
* 注册
|
||||||
*/
|
*/
|
||||||
@PostMapping("register")
|
@PostMapping("register")
|
||||||
public ResultBean register(@Validated({AddGroup.class}) User user, @RequestParam(value = "velCode", defaultValue = "") String velCode) {
|
public ResultBean<?> register(@Validated({AddGroup.class}) User user, @RequestParam(value = "velCode", defaultValue = "") String velCode) {
|
||||||
|
|
||||||
|
|
||||||
//判断验证码是否正确
|
//判断验证码是否正确
|
||||||
@ -81,7 +81,7 @@ public class UserController extends BaseController {
|
|||||||
* 刷新token
|
* 刷新token
|
||||||
*/
|
*/
|
||||||
@PostMapping("refreshToken")
|
@PostMapping("refreshToken")
|
||||||
public ResultBean refreshToken(HttpServletRequest request) {
|
public ResultBean<?> refreshToken(HttpServletRequest request) {
|
||||||
String token = getToken(request);
|
String token = getToken(request);
|
||||||
if (jwtTokenUtil.canRefresh(token)) {
|
if (jwtTokenUtil.canRefresh(token)) {
|
||||||
token = jwtTokenUtil.refreshToken(token);
|
token = jwtTokenUtil.refreshToken(token);
|
||||||
@ -102,7 +102,7 @@ public class UserController extends BaseController {
|
|||||||
* 查询小说是否已加入书架
|
* 查询小说是否已加入书架
|
||||||
*/
|
*/
|
||||||
@GetMapping("queryIsInShelf")
|
@GetMapping("queryIsInShelf")
|
||||||
public ResultBean queryIsInShelf(Long bookId, HttpServletRequest request) {
|
public ResultBean<?> queryIsInShelf(Long bookId, HttpServletRequest request) {
|
||||||
UserDetails userDetails = getUserDetails(request);
|
UserDetails userDetails = getUserDetails(request);
|
||||||
if (userDetails == null) {
|
if (userDetails == null) {
|
||||||
return ResultBean.fail(ResponseStatus.NO_LOGIN);
|
return ResultBean.fail(ResponseStatus.NO_LOGIN);
|
||||||
@ -114,7 +114,7 @@ public class UserController extends BaseController {
|
|||||||
* 加入书架
|
* 加入书架
|
||||||
* */
|
* */
|
||||||
@PostMapping("addToBookShelf")
|
@PostMapping("addToBookShelf")
|
||||||
public ResultBean addToBookShelf(Long bookId,Long preContentId, HttpServletRequest request) {
|
public ResultBean<Void> addToBookShelf(Long bookId,Long preContentId, HttpServletRequest request) {
|
||||||
UserDetails userDetails = getUserDetails(request);
|
UserDetails userDetails = getUserDetails(request);
|
||||||
if (userDetails == null) {
|
if (userDetails == null) {
|
||||||
return ResultBean.fail(ResponseStatus.NO_LOGIN);
|
return ResultBean.fail(ResponseStatus.NO_LOGIN);
|
||||||
@ -127,7 +127,7 @@ public class UserController extends BaseController {
|
|||||||
* 移出书架
|
* 移出书架
|
||||||
* */
|
* */
|
||||||
@DeleteMapping("removeFromBookShelf/{bookId}")
|
@DeleteMapping("removeFromBookShelf/{bookId}")
|
||||||
public ResultBean removeFromBookShelf(@PathVariable("bookId") Long bookId, HttpServletRequest request) {
|
public ResultBean<?> removeFromBookShelf(@PathVariable("bookId") Long bookId, HttpServletRequest request) {
|
||||||
UserDetails userDetails = getUserDetails(request);
|
UserDetails userDetails = getUserDetails(request);
|
||||||
if (userDetails == null) {
|
if (userDetails == null) {
|
||||||
return ResultBean.fail(ResponseStatus.NO_LOGIN);
|
return ResultBean.fail(ResponseStatus.NO_LOGIN);
|
||||||
@ -140,7 +140,7 @@ public class UserController extends BaseController {
|
|||||||
* 分页查询书架
|
* 分页查询书架
|
||||||
* */
|
* */
|
||||||
@GetMapping("listBookShelfByPage")
|
@GetMapping("listBookShelfByPage")
|
||||||
public ResultBean listBookShelfByPage(@RequestParam(value = "curr", defaultValue = "1") int page, @RequestParam(value = "limit", defaultValue = "10") int pageSize,HttpServletRequest request) {
|
public ResultBean<?> listBookShelfByPage(@RequestParam(value = "curr", defaultValue = "1") int page, @RequestParam(value = "limit", defaultValue = "10") int pageSize,HttpServletRequest request) {
|
||||||
UserDetails userDetails = getUserDetails(request);
|
UserDetails userDetails = getUserDetails(request);
|
||||||
if (userDetails == null) {
|
if (userDetails == null) {
|
||||||
return ResultBean.fail(ResponseStatus.NO_LOGIN);
|
return ResultBean.fail(ResponseStatus.NO_LOGIN);
|
||||||
@ -152,7 +152,7 @@ public class UserController extends BaseController {
|
|||||||
* 分页查询阅读记录
|
* 分页查询阅读记录
|
||||||
* */
|
* */
|
||||||
@GetMapping("listReadHistoryByPage")
|
@GetMapping("listReadHistoryByPage")
|
||||||
public ResultBean listReadHistoryByPage(@RequestParam(value = "curr", defaultValue = "1") int page, @RequestParam(value = "limit", defaultValue = "10") int pageSize,HttpServletRequest request) {
|
public ResultBean<?> listReadHistoryByPage(@RequestParam(value = "curr", defaultValue = "1") int page, @RequestParam(value = "limit", defaultValue = "10") int pageSize,HttpServletRequest request) {
|
||||||
UserDetails userDetails = getUserDetails(request);
|
UserDetails userDetails = getUserDetails(request);
|
||||||
if (userDetails == null) {
|
if (userDetails == null) {
|
||||||
return ResultBean.fail(ResponseStatus.NO_LOGIN);
|
return ResultBean.fail(ResponseStatus.NO_LOGIN);
|
||||||
@ -164,7 +164,7 @@ public class UserController extends BaseController {
|
|||||||
* 添加阅读记录
|
* 添加阅读记录
|
||||||
* */
|
* */
|
||||||
@PostMapping("addReadHistory")
|
@PostMapping("addReadHistory")
|
||||||
public ResultBean addReadHistory(Long bookId,Long preContentId, HttpServletRequest request) {
|
public ResultBean<?> addReadHistory(Long bookId,Long preContentId, HttpServletRequest request) {
|
||||||
UserDetails userDetails = getUserDetails(request);
|
UserDetails userDetails = getUserDetails(request);
|
||||||
if (userDetails == null) {
|
if (userDetails == null) {
|
||||||
return ResultBean.fail(ResponseStatus.NO_LOGIN);
|
return ResultBean.fail(ResponseStatus.NO_LOGIN);
|
||||||
@ -177,7 +177,7 @@ public class UserController extends BaseController {
|
|||||||
* 添加反馈
|
* 添加反馈
|
||||||
* */
|
* */
|
||||||
@PostMapping("addFeedBack")
|
@PostMapping("addFeedBack")
|
||||||
public ResultBean addFeedBack(String content, HttpServletRequest request) {
|
public ResultBean<?> addFeedBack(String content, HttpServletRequest request) {
|
||||||
UserDetails userDetails = getUserDetails(request);
|
UserDetails userDetails = getUserDetails(request);
|
||||||
if (userDetails == null) {
|
if (userDetails == null) {
|
||||||
return ResultBean.fail(ResponseStatus.NO_LOGIN);
|
return ResultBean.fail(ResponseStatus.NO_LOGIN);
|
||||||
@ -190,7 +190,7 @@ public class UserController extends BaseController {
|
|||||||
* 分页查询我的反馈列表
|
* 分页查询我的反馈列表
|
||||||
* */
|
* */
|
||||||
@GetMapping("listUserFeedBackByPage")
|
@GetMapping("listUserFeedBackByPage")
|
||||||
public ResultBean listUserFeedBackByPage(@RequestParam(value = "curr", defaultValue = "1") int page, @RequestParam(value = "limit", defaultValue = "5") int pageSize, HttpServletRequest request){
|
public ResultBean<?> listUserFeedBackByPage(@RequestParam(value = "curr", defaultValue = "1") int page, @RequestParam(value = "limit", defaultValue = "5") int pageSize, HttpServletRequest request){
|
||||||
UserDetails userDetails = getUserDetails(request);
|
UserDetails userDetails = getUserDetails(request);
|
||||||
if (userDetails == null) {
|
if (userDetails == null) {
|
||||||
return ResultBean.fail(ResponseStatus.NO_LOGIN);
|
return ResultBean.fail(ResponseStatus.NO_LOGIN);
|
||||||
@ -202,7 +202,7 @@ public class UserController extends BaseController {
|
|||||||
* 查询个人信息
|
* 查询个人信息
|
||||||
* */
|
* */
|
||||||
@GetMapping("userInfo")
|
@GetMapping("userInfo")
|
||||||
public ResultBean userInfo(HttpServletRequest request) {
|
public ResultBean<?> userInfo(HttpServletRequest request) {
|
||||||
UserDetails userDetails = getUserDetails(request);
|
UserDetails userDetails = getUserDetails(request);
|
||||||
if (userDetails == null) {
|
if (userDetails == null) {
|
||||||
return ResultBean.fail(ResponseStatus.NO_LOGIN);
|
return ResultBean.fail(ResponseStatus.NO_LOGIN);
|
||||||
@ -214,7 +214,7 @@ public class UserController extends BaseController {
|
|||||||
* 更新个人信息
|
* 更新个人信息
|
||||||
* */
|
* */
|
||||||
@PostMapping("updateUserInfo")
|
@PostMapping("updateUserInfo")
|
||||||
public ResultBean updateUserInfo(@Validated({UpdateGroup.class}) User user, HttpServletRequest request) {
|
public ResultBean<?> updateUserInfo(@Validated({UpdateGroup.class}) User user, HttpServletRequest request) {
|
||||||
UserDetails userDetails = getUserDetails(request);
|
UserDetails userDetails = getUserDetails(request);
|
||||||
if (userDetails == null) {
|
if (userDetails == null) {
|
||||||
return ResultBean.fail(ResponseStatus.NO_LOGIN);
|
return ResultBean.fail(ResponseStatus.NO_LOGIN);
|
||||||
@ -234,7 +234,7 @@ public class UserController extends BaseController {
|
|||||||
* 更新密码
|
* 更新密码
|
||||||
* */
|
* */
|
||||||
@PostMapping("updatePassword")
|
@PostMapping("updatePassword")
|
||||||
public ResultBean updatePassword(String oldPassword,String newPassword1,String newPassword2,HttpServletRequest request) {
|
public ResultBean<?> updatePassword(String oldPassword,String newPassword1,String newPassword2,HttpServletRequest request) {
|
||||||
UserDetails userDetails = getUserDetails(request);
|
UserDetails userDetails = getUserDetails(request);
|
||||||
if (userDetails == null) {
|
if (userDetails == null) {
|
||||||
return ResultBean.fail(ResponseStatus.NO_LOGIN);
|
return ResultBean.fail(ResponseStatus.NO_LOGIN);
|
||||||
@ -250,7 +250,7 @@ public class UserController extends BaseController {
|
|||||||
* 分页查询用户书评
|
* 分页查询用户书评
|
||||||
* */
|
* */
|
||||||
@GetMapping("listCommentByPage")
|
@GetMapping("listCommentByPage")
|
||||||
public ResultBean listCommentByPage(@RequestParam(value = "curr", defaultValue = "1") int page, @RequestParam(value = "limit", defaultValue = "5") int pageSize,HttpServletRequest request) {
|
public ResultBean<?> listCommentByPage(@RequestParam(value = "curr", defaultValue = "1") int page, @RequestParam(value = "limit", defaultValue = "5") int pageSize,HttpServletRequest request) {
|
||||||
UserDetails userDetails = getUserDetails(request);
|
UserDetails userDetails = getUserDetails(request);
|
||||||
if (userDetails == null) {
|
if (userDetails == null) {
|
||||||
return ResultBean.fail(ResponseStatus.NO_LOGIN);
|
return ResultBean.fail(ResponseStatus.NO_LOGIN);
|
||||||
@ -263,7 +263,7 @@ public class UserController extends BaseController {
|
|||||||
* 购买小说章节
|
* 购买小说章节
|
||||||
* */
|
* */
|
||||||
@PostMapping("buyBookIndex")
|
@PostMapping("buyBookIndex")
|
||||||
public ResultBean buyBookIndex(UserBuyRecord buyRecord, HttpServletRequest request) {
|
public ResultBean<?> buyBookIndex(UserBuyRecord buyRecord, HttpServletRequest request) {
|
||||||
UserDetails userDetails = getUserDetails(request);
|
UserDetails userDetails = getUserDetails(request);
|
||||||
if (userDetails == null) {
|
if (userDetails == null) {
|
||||||
return ResultBean.fail(ResponseStatus.NO_LOGIN);
|
return ResultBean.fail(ResponseStatus.NO_LOGIN);
|
||||||
|
@ -30,7 +30,7 @@ public class EsConfig {
|
|||||||
String uri = uris[i];
|
String uri = uris[i];
|
||||||
String scheme = uri.substring(0,uri.indexOf(":")).trim();
|
String scheme = uri.substring(0,uri.indexOf(":")).trim();
|
||||||
String hostname = uri.substring(uri.indexOf("://")+3,uri.lastIndexOf(":")).trim();
|
String hostname = uri.substring(uri.indexOf("://")+3,uri.lastIndexOf(":")).trim();
|
||||||
Integer port = Integer.parseInt(uri.substring(uri.lastIndexOf(":")+1).trim());
|
int port = Integer.parseInt(uri.substring(uri.lastIndexOf(":")+1).trim());
|
||||||
hosts[i] = new HttpHost(hostname,port,scheme);
|
hosts[i] = new HttpHost(hostname,port,scheme);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -32,7 +32,7 @@ public class FilterConfig{
|
|||||||
private String urlPatterns;
|
private String urlPatterns;
|
||||||
|
|
||||||
@Bean
|
@Bean
|
||||||
public FilterRegistrationBean<NovelFilter> filterRegist() {
|
public FilterRegistrationBean<NovelFilter> filterRegister() {
|
||||||
FilterRegistrationBean<NovelFilter> frBean = new FilterRegistrationBean<>();
|
FilterRegistrationBean<NovelFilter> frBean = new FilterRegistrationBean<>();
|
||||||
frBean.setFilter(new NovelFilter());
|
frBean.setFilter(new NovelFilter());
|
||||||
frBean.addUrlPatterns("/*");
|
frBean.addUrlPatterns("/*");
|
||||||
@ -41,9 +41,9 @@ public class FilterConfig{
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Bean
|
@Bean
|
||||||
public FilterRegistrationBean xssFilterRegistration()
|
public FilterRegistrationBean<XssFilter> xssFilterRegistration()
|
||||||
{
|
{
|
||||||
FilterRegistrationBean registration = new FilterRegistrationBean();
|
FilterRegistrationBean<XssFilter> registration = new FilterRegistrationBean<>();
|
||||||
//
|
//
|
||||||
registration.setDispatcherTypes(DispatcherType.REQUEST);
|
registration.setDispatcherTypes(DispatcherType.REQUEST);
|
||||||
//过滤器类(继承Filter)
|
//过滤器类(继承Filter)
|
||||||
|
@ -38,7 +38,7 @@ public class NovelFilter implements Filter {
|
|||||||
//缓存10天
|
//缓存10天
|
||||||
resp.setDateHeader("expires", System.currentTimeMillis()+60*60*24*10*1000);
|
resp.setDateHeader("expires", System.currentTimeMillis()+60*60*24*10*1000);
|
||||||
OutputStream out = resp.getOutputStream();
|
OutputStream out = resp.getOutputStream();
|
||||||
InputStream input = new FileInputStream(new File(picSavePath + requestUri));
|
InputStream input = new FileInputStream(picSavePath + requestUri);
|
||||||
byte[] b = new byte[4096];
|
byte[] b = new byte[4096];
|
||||||
for (int n; (n = input.read(b)) != -1; ) {
|
for (int n; (n = input.read(b)) != -1; ) {
|
||||||
out.write(b, 0, n);
|
out.write(b, 0, n);
|
||||||
@ -55,7 +55,7 @@ public class NovelFilter implements Filter {
|
|||||||
userMark = UUIDUtil.getUUID32();
|
userMark = UUIDUtil.getUUID32();
|
||||||
CookieUtil.setCookie(resp,Constants.USER_CLIENT_MARK_KEY,userMark);
|
CookieUtil.setCookie(resp,Constants.USER_CLIENT_MARK_KEY,userMark);
|
||||||
}
|
}
|
||||||
ThreadLocalUtil.setCientId(userMark);
|
ThreadLocalUtil.setClientId(userMark);
|
||||||
//根据浏览器类型选择前端模板
|
//根据浏览器类型选择前端模板
|
||||||
String to = req.getParameter("to");
|
String to = req.getParameter("to");
|
||||||
CacheService cacheService = SpringUtil.getBean(CacheService.class);
|
CacheService cacheService = SpringUtil.getBean(CacheService.class);
|
||||||
|
@ -6,8 +6,8 @@ import org.apache.commons.lang3.StringUtils;
|
|||||||
|
|
||||||
import javax.servlet.*;
|
import javax.servlet.*;
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletRequest;
|
||||||
import javax.servlet.http.HttpServletResponse;
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.regex.Matcher;
|
import java.util.regex.Matcher;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
@ -34,12 +34,10 @@ public class XssFilter implements Filter {
|
|||||||
String tempEnabled = filterConfig.getInitParameter("enabled");
|
String tempEnabled = filterConfig.getInitParameter("enabled");
|
||||||
if (StringUtils.isNotBlank(tempExcludes)) {
|
if (StringUtils.isNotBlank(tempExcludes)) {
|
||||||
String[] url = tempExcludes.split(",");
|
String[] url = tempExcludes.split(",");
|
||||||
for (int i = 0; url != null && i < url.length; i++) {
|
excludes.addAll(Arrays.asList(url));
|
||||||
excludes.add(url[i]);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if (StringUtils.isNotEmpty(tempEnabled)) {
|
if (StringUtils.isNotEmpty(tempEnabled)) {
|
||||||
enabled = Boolean.valueOf(tempEnabled);
|
enabled = Boolean.parseBoolean(tempEnabled);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -48,8 +46,7 @@ public class XssFilter implements Filter {
|
|||||||
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
|
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
|
||||||
{
|
{
|
||||||
HttpServletRequest req = (HttpServletRequest) request;
|
HttpServletRequest req = (HttpServletRequest) request;
|
||||||
HttpServletResponse resp = (HttpServletResponse) response;
|
if (handleExcludeURL(req)) {
|
||||||
if (handleExcludeURL(req, resp)) {
|
|
||||||
chain.doFilter(request, response);
|
chain.doFilter(request, response);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -57,7 +54,7 @@ public class XssFilter implements Filter {
|
|||||||
chain.doFilter(xssRequest, response);
|
chain.doFilter(xssRequest, response);
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean handleExcludeURL(HttpServletRequest request, HttpServletResponse response) {
|
private boolean handleExcludeURL(HttpServletRequest request) {
|
||||||
if (!enabled) {
|
if (!enabled) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -58,8 +58,8 @@ public class MonthIncomeStaSchedule {
|
|||||||
//2.查询作家作品
|
//2.查询作家作品
|
||||||
List<Book> books = bookService.queryBookList(authorId);
|
List<Book> books = bookService.queryBookList(authorId);
|
||||||
|
|
||||||
Long totalPreTaxIncome = 0L;
|
long totalPreTaxIncome = 0L;
|
||||||
Long totalAfterTaxIncome = 0L;
|
long totalAfterTaxIncome = 0L;
|
||||||
for (Book book : books) {
|
for (Book book : books) {
|
||||||
|
|
||||||
Long bookId = book.getId();
|
Long bookId = book.getId();
|
||||||
@ -70,14 +70,14 @@ public class MonthIncomeStaSchedule {
|
|||||||
|
|
||||||
BigDecimal monthIncomeShare = new BigDecimal(monthIncome)
|
BigDecimal monthIncomeShare = new BigDecimal(monthIncome)
|
||||||
.multiply(authorIncomeConfig.getShareProportion());
|
.multiply(authorIncomeConfig.getShareProportion());
|
||||||
Long preTaxIncome = monthIncomeShare
|
long preTaxIncome = monthIncomeShare
|
||||||
.multiply(authorIncomeConfig.getExchangeProportion())
|
.multiply(authorIncomeConfig.getExchangeProportion())
|
||||||
.multiply(new BigDecimal(100))
|
.multiply(new BigDecimal(100))
|
||||||
.longValue();
|
.longValue();
|
||||||
|
|
||||||
totalPreTaxIncome += preTaxIncome;
|
totalPreTaxIncome += preTaxIncome;
|
||||||
|
|
||||||
Long afterTaxIncome = monthIncomeShare
|
long afterTaxIncome = monthIncomeShare
|
||||||
.multiply(authorIncomeConfig.getTaxRate())
|
.multiply(authorIncomeConfig.getTaxRate())
|
||||||
.multiply(authorIncomeConfig.getExchangeProportion())
|
.multiply(authorIncomeConfig.getExchangeProportion())
|
||||||
.multiply(new BigDecimal(100))
|
.multiply(new BigDecimal(100))
|
||||||
|
@ -0,0 +1,20 @@
|
|||||||
|
package com.java2nb.novel.core.serialize;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.core.JsonGenerator;
|
||||||
|
import com.fasterxml.jackson.databind.JsonSerializer;
|
||||||
|
import com.fasterxml.jackson.databind.SerializerProvider;
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
public class CommentUserNameSerialize extends JsonSerializer<String> {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void serialize(String s, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
|
||||||
|
|
||||||
|
if(StringUtils.isNotBlank(s)){
|
||||||
|
jsonGenerator.writeString(s.substring(0, 4) + "****" + s.substring(s.length() - 3));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
@ -29,7 +29,7 @@ public class Constants {
|
|||||||
/**
|
/**
|
||||||
* 首页设置的小说数量
|
* 首页设置的小说数量
|
||||||
* */
|
* */
|
||||||
public static final int INDEX_BOOK_SETTING_NUM = 32;
|
public static final int INDEX_BOOK_SETTING_NUM = 31;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 累积的最大点击量
|
* 累积的最大点击量
|
||||||
|
@ -12,12 +12,12 @@ public class ThreadLocalUtil {
|
|||||||
/**
|
/**
|
||||||
* 存储当前线程访问的模板目录
|
* 存储当前线程访问的模板目录
|
||||||
* */
|
* */
|
||||||
private static ThreadLocal<String> templateDir = new ThreadLocal<>();
|
private static final ThreadLocal<String> templateDir = new ThreadLocal<>();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 存储当前会话的sessionID
|
* 存储当前会话的sessionID
|
||||||
* */
|
* */
|
||||||
private static ThreadLocal<String> clientId = new ThreadLocal<>();
|
private static final ThreadLocal<String> clientId = new ThreadLocal<>();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 设置当前应该访问的模板目录
|
* 设置当前应该访问的模板目录
|
||||||
@ -41,7 +41,7 @@ public class ThreadLocalUtil {
|
|||||||
/**
|
/**
|
||||||
* 设置当前访问线程的客户端ID
|
* 设置当前访问线程的客户端ID
|
||||||
* */
|
* */
|
||||||
public static void setCientId(String id){
|
public static void setClientId(String id){
|
||||||
clientId.set(id);
|
clientId.set(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -14,11 +14,6 @@ import java.util.List;
|
|||||||
*/
|
*/
|
||||||
public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {
|
public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {
|
||||||
|
|
||||||
/**
|
|
||||||
* 假如有有html 代码是自己传来的 需要设定对应的name 不过滤
|
|
||||||
*/
|
|
||||||
private static final List<String> noFilterNames = Arrays.asList("content");
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param request
|
* @param request
|
||||||
*/
|
*/
|
||||||
@ -29,14 +24,14 @@ public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {
|
|||||||
@Override
|
@Override
|
||||||
public String[] getParameterValues(String name) {
|
public String[] getParameterValues(String name) {
|
||||||
String[] values = super.getParameterValues(name);
|
String[] values = super.getParameterValues(name);
|
||||||
if (!noFilterNames.contains(name) && values != null) {
|
if (values != null) {
|
||||||
int length = values.length;
|
int length = values.length;
|
||||||
String[] escapseValues = new String[length];
|
String[] escapeValues = new String[length];
|
||||||
for (int i = 0; i < length; i++) {
|
for (int i = 0; i < length; i++) {
|
||||||
escapseValues[i] = values[i].replaceAll("<", "<").replaceAll(">", ">");
|
escapeValues[i] = values[i].replaceAll("<", "<").replaceAll(">", ">");
|
||||||
}
|
}
|
||||||
return escapseValues;
|
return escapeValues;
|
||||||
}
|
}
|
||||||
return values;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,21 @@
|
|||||||
|
package com.java2nb.novel.mapper;
|
||||||
|
|
||||||
|
import com.java2nb.novel.entity.Book;
|
||||||
|
import com.java2nb.novel.vo.BookSpVO;
|
||||||
|
import com.java2nb.novel.vo.BookVO;
|
||||||
|
import org.apache.ibatis.annotations.Param;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Administrator
|
||||||
|
*/
|
||||||
|
public interface FrontNewsMapper extends NewsMapper {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 增加新闻阅读量
|
||||||
|
* @param newsId 新闻ID
|
||||||
|
* */
|
||||||
|
void addReadCount(@Param("newsId") Integer newsId);
|
||||||
|
|
||||||
|
}
|
@ -1,6 +1,7 @@
|
|||||||
package com.java2nb.novel.page;
|
package com.java2nb.novel.page;
|
||||||
|
|
||||||
import com.java2nb.novel.controller.BaseController;
|
import com.java2nb.novel.controller.BaseController;
|
||||||
|
import com.java2nb.novel.core.bean.PageBean;
|
||||||
import com.java2nb.novel.core.bean.UserDetails;
|
import com.java2nb.novel.core.bean.UserDetails;
|
||||||
import com.java2nb.novel.core.utils.ThreadLocalUtil;
|
import com.java2nb.novel.core.utils.ThreadLocalUtil;
|
||||||
import com.java2nb.novel.entity.*;
|
import com.java2nb.novel.entity.*;
|
||||||
@ -8,6 +9,8 @@ import com.java2nb.novel.service.AuthorService;
|
|||||||
import com.java2nb.novel.service.BookService;
|
import com.java2nb.novel.service.BookService;
|
||||||
import com.java2nb.novel.service.NewsService;
|
import com.java2nb.novel.service.NewsService;
|
||||||
import com.java2nb.novel.service.UserService;
|
import com.java2nb.novel.service.UserService;
|
||||||
|
import com.java2nb.novel.vo.BookCommentVO;
|
||||||
|
import com.java2nb.novel.vo.BookSettingVO;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import lombok.SneakyThrows;
|
import lombok.SneakyThrows;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
@ -21,6 +24,7 @@ import javax.servlet.http.HttpServletRequest;
|
|||||||
import javax.servlet.http.HttpServletResponse;
|
import javax.servlet.http.HttpServletResponse;
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
import java.util.concurrent.CompletableFuture;
|
import java.util.concurrent.CompletableFuture;
|
||||||
import java.util.concurrent.ThreadPoolExecutor;
|
import java.util.concurrent.ThreadPoolExecutor;
|
||||||
|
|
||||||
@ -76,8 +80,15 @@ public class PageController extends BaseController {
|
|||||||
/**
|
/**
|
||||||
* 首页
|
* 首页
|
||||||
*/
|
*/
|
||||||
|
@SneakyThrows
|
||||||
@RequestMapping(path = {"/", "/index", "/index.html"})
|
@RequestMapping(path = {"/", "/index", "/index.html"})
|
||||||
public String index() {
|
public String index(Model model) {
|
||||||
|
//加载小说首页小说基本信息线程
|
||||||
|
CompletableFuture<Map<Byte, List<BookSettingVO>>> bookCompletableFuture = CompletableFuture.supplyAsync(bookService::listBookSettingVO, threadPoolExecutor);
|
||||||
|
//加载首页新闻线程
|
||||||
|
CompletableFuture<List<News>> newsCompletableFuture = CompletableFuture.supplyAsync(newsService::listIndexNews, threadPoolExecutor);
|
||||||
|
model.addAttribute("bookMap", bookCompletableFuture.get());
|
||||||
|
model.addAttribute("newsList", newsCompletableFuture.get());
|
||||||
return ThreadLocalUtil.getTemplateDir() + "index";
|
return ThreadLocalUtil.getTemplateDir() + "index";
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -105,13 +116,42 @@ public class PageController extends BaseController {
|
|||||||
@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);
|
//加载小说基本信息线程
|
||||||
model.addAttribute("book", book);
|
CompletableFuture<Book> bookCompletableFuture = CompletableFuture.supplyAsync(() -> {
|
||||||
if (book.getLastIndexId() != null) {
|
//查询书籍
|
||||||
//查询首章目录ID
|
Book book = bookService.queryBookDetail(bookId);
|
||||||
Long firstBookIndexId = bookService.queryFirstBookIndexId(bookId);
|
log.debug("加载小说基本信息线程结束");
|
||||||
model.addAttribute("firstBookIndexId", firstBookIndexId);
|
return book;
|
||||||
}
|
}, threadPoolExecutor);
|
||||||
|
//加载小说评论列表线程
|
||||||
|
CompletableFuture<PageBean<BookCommentVO>> bookCommentPageBeanCompletableFuture = CompletableFuture.supplyAsync(() -> {
|
||||||
|
PageBean<BookCommentVO> bookCommentVOPageBean = bookService.listCommentByPage(null, bookId, 1, 5);
|
||||||
|
log.debug("加载小说评论列表线程结束");
|
||||||
|
return bookCommentVOPageBean;
|
||||||
|
}, threadPoolExecutor);
|
||||||
|
//加载小说首章信息线程,该线程在加载小说基本信息线程执行完毕后才执行
|
||||||
|
CompletableFuture<Long> firstBookIndexIdCompletableFuture = bookCompletableFuture.thenApplyAsync((book) -> {
|
||||||
|
if (book.getLastIndexId() != null) {
|
||||||
|
//查询首章目录ID
|
||||||
|
Long firstBookIndexId = bookService.queryFirstBookIndexId(bookId);
|
||||||
|
log.debug("加载小说基本信息线程结束");
|
||||||
|
return firstBookIndexId;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}, threadPoolExecutor);
|
||||||
|
//加载随机推荐小说线程,该线程在加载小说基本信息线程执行完毕后才执行
|
||||||
|
CompletableFuture<List<Book>> recBookCompletableFuture = bookCompletableFuture.thenApplyAsync((book) -> {
|
||||||
|
List<Book> books = bookService.listRecBookByCatId(book.getCatId());
|
||||||
|
log.debug("加载随机推荐小说线程结束");
|
||||||
|
return books;
|
||||||
|
}, threadPoolExecutor);
|
||||||
|
|
||||||
|
|
||||||
|
model.addAttribute("book", bookCompletableFuture.get());
|
||||||
|
model.addAttribute("firstBookIndexId", firstBookIndexIdCompletableFuture.get());
|
||||||
|
model.addAttribute("recBooks", recBookCompletableFuture.get());
|
||||||
|
model.addAttribute("bookCommentPageBean", bookCommentPageBeanCompletableFuture.get());
|
||||||
|
|
||||||
return ThreadLocalUtil.getTemplateDir() + "book/book_detail";
|
return ThreadLocalUtil.getTemplateDir() + "book/book_detail";
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -135,8 +175,6 @@ public class PageController extends BaseController {
|
|||||||
@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) {
|
||||||
|
|
||||||
|
|
||||||
//加载小说基本信息线程
|
//加载小说基本信息线程
|
||||||
CompletableFuture<Book> bookCompletableFuture = CompletableFuture.supplyAsync(() -> {
|
CompletableFuture<Book> bookCompletableFuture = CompletableFuture.supplyAsync(() -> {
|
||||||
//查询书籍
|
//查询书籍
|
||||||
|
@ -5,7 +5,6 @@ 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;
|
||||||
import com.java2nb.novel.entity.FriendLink;
|
|
||||||
|
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
@ -1,12 +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.bean.PageBean;
|
||||||
import com.java2nb.novel.vo.BookSpVO;
|
import com.java2nb.novel.entity.*;
|
||||||
import com.java2nb.novel.vo.BookCommentVO;
|
import com.java2nb.novel.vo.BookCommentVO;
|
||||||
import com.java2nb.novel.vo.BookSettingVO;
|
import com.java2nb.novel.vo.BookSettingVO;
|
||||||
import com.java2nb.novel.entity.*;
|
import com.java2nb.novel.vo.BookSpVO;
|
||||||
import com.java2nb.novel.vo.BookVO;
|
import com.java2nb.novel.vo.BookVO;
|
||||||
|
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
@ -32,7 +31,7 @@ public interface BookService {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 查询首页新书榜单数据
|
* 查询首页新书榜单数据
|
||||||
* @return
|
* @return 小说列表
|
||||||
* */
|
* */
|
||||||
List<Book> listNewRank();
|
List<Book> listNewRank();
|
||||||
|
|
||||||
@ -49,7 +48,7 @@ public interface BookService {
|
|||||||
* @param pageSize 分页大小
|
* @param pageSize 分页大小
|
||||||
* @return 小说集合分页信息
|
* @return 小说集合分页信息
|
||||||
* */
|
* */
|
||||||
PageBean searchByPage(BookSpVO params, int page, int pageSize);
|
PageBean<?> searchByPage(BookSpVO params, int page, int pageSize);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 查询小说分类列表
|
* 查询小说分类列表
|
||||||
@ -115,7 +114,8 @@ public interface BookService {
|
|||||||
/**
|
/**
|
||||||
* 增加点击次数
|
* 增加点击次数
|
||||||
* @param bookId 书籍ID
|
* @param bookId 书籍ID
|
||||||
* @param visitCount*/
|
* @param visitCount 点击量
|
||||||
|
* */
|
||||||
void addVisitCount(Long bookId, Integer visitCount);
|
void addVisitCount(Long bookId, Integer visitCount);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -162,6 +162,7 @@ public interface BookService {
|
|||||||
* @param workDirection 作品方向
|
* @param workDirection 作品方向
|
||||||
* @return 作者ID
|
* @return 作者ID
|
||||||
* */
|
* */
|
||||||
|
@Deprecated
|
||||||
Long getOrCreateAuthorIdByName(String authorName, Byte workDirection);
|
Long getOrCreateAuthorIdByName(String authorName, Byte workDirection);
|
||||||
|
|
||||||
|
|
||||||
@ -179,6 +180,7 @@ public interface BookService {
|
|||||||
* @param bookId 小说ID
|
* @param bookId 小说ID
|
||||||
* @return 目录号集合
|
* @return 目录号集合
|
||||||
* */
|
* */
|
||||||
|
@Deprecated
|
||||||
List<Integer> queryIndexNumByBookId(Long bookId);
|
List<Integer> queryIndexNumByBookId(Long bookId);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -279,4 +281,12 @@ public interface BookService {
|
|||||||
* @param authorId
|
* @param authorId
|
||||||
*/
|
*/
|
||||||
void updateBookContent( Long indexId, String indexName, String content, Long authorId);
|
void updateBookContent( Long indexId, String indexName, String content, Long authorId);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 修改小说封面
|
||||||
|
* @param bookId
|
||||||
|
* @param bookPic
|
||||||
|
* @param authorId
|
||||||
|
*/
|
||||||
|
void updateBookPic(Long bookId, String bookPic, Long authorId);
|
||||||
}
|
}
|
||||||
|
@ -32,4 +32,10 @@ public interface NewsService {
|
|||||||
* @return 新闻分页数据
|
* @return 新闻分页数据
|
||||||
* */
|
* */
|
||||||
PageBean<News> listByPage(int page, int pageSize);
|
PageBean<News> listByPage(int page, int pageSize);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 增加新闻阅读量
|
||||||
|
* @param newsId 新闻ID
|
||||||
|
* */
|
||||||
|
void addReadCount(Integer newsId);
|
||||||
}
|
}
|
||||||
|
@ -2,24 +2,26 @@ 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.java2nb.novel.core.bean.PageBean;
|
import com.java2nb.novel.core.bean.PageBean;
|
||||||
import com.java2nb.novel.core.cache.CacheKey;
|
import com.java2nb.novel.core.cache.CacheKey;
|
||||||
import com.java2nb.novel.core.cache.CacheService;
|
import com.java2nb.novel.core.cache.CacheService;
|
||||||
import com.java2nb.novel.core.config.BookPriceProperties;
|
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.BeanUtil;
|
||||||
import com.java2nb.novel.entity.*;
|
import com.java2nb.novel.core.utils.Constants;
|
||||||
|
import com.java2nb.novel.core.utils.IdWorker;
|
||||||
|
import com.java2nb.novel.core.utils.StringUtil;
|
||||||
import com.java2nb.novel.entity.Book;
|
import com.java2nb.novel.entity.Book;
|
||||||
|
import com.java2nb.novel.entity.*;
|
||||||
import com.java2nb.novel.mapper.*;
|
import com.java2nb.novel.mapper.*;
|
||||||
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;
|
||||||
import com.java2nb.novel.service.SearchService;
|
import com.java2nb.novel.service.SearchService;
|
||||||
import com.java2nb.novel.vo.BookCommentVO;
|
import com.java2nb.novel.vo.BookCommentVO;
|
||||||
import com.java2nb.novel.vo.BookSettingVO;
|
import com.java2nb.novel.vo.BookSettingVO;
|
||||||
|
import com.java2nb.novel.vo.BookSpVO;
|
||||||
import com.java2nb.novel.vo.BookVO;
|
import com.java2nb.novel.vo.BookVO;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import lombok.SneakyThrows;
|
import lombok.SneakyThrows;
|
||||||
@ -27,7 +29,6 @@ import lombok.extern.slf4j.Slf4j;
|
|||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.mybatis.dynamic.sql.SortSpecification;
|
import org.mybatis.dynamic.sql.SortSpecification;
|
||||||
import org.mybatis.dynamic.sql.render.RenderingStrategies;
|
import org.mybatis.dynamic.sql.render.RenderingStrategies;
|
||||||
import org.mybatis.dynamic.sql.render.RenderingStrategy;
|
|
||||||
import org.mybatis.dynamic.sql.select.render.SelectStatementProvider;
|
import org.mybatis.dynamic.sql.select.render.SelectStatementProvider;
|
||||||
import org.springframework.beans.BeanUtils;
|
import org.springframework.beans.BeanUtils;
|
||||||
import org.springframework.beans.factory.annotation.Value;
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
@ -36,6 +37,7 @@ import org.springframework.transaction.annotation.Transactional;
|
|||||||
import tk.mybatis.orderbyhelper.OrderByHelper;
|
import tk.mybatis.orderbyhelper.OrderByHelper;
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
|
import java.math.RoundingMode;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@ -126,9 +128,9 @@ public class BookServiceImpl implements BookService {
|
|||||||
type = 0;
|
type = 0;
|
||||||
} else if (i < 14) {
|
} else if (i < 14) {
|
||||||
type = 1;
|
type = 1;
|
||||||
} else if (i < 20) {
|
} else if (i < 19) {
|
||||||
type = 2;
|
type = 2;
|
||||||
} else if (i < 26) {
|
} else if (i < 25) {
|
||||||
type = 3;
|
type = 3;
|
||||||
} else {
|
} else {
|
||||||
type = 4;
|
type = 4;
|
||||||
@ -187,7 +189,7 @@ public class BookServiceImpl implements BookService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public PageBean searchByPage(BookSpVO params, int page, int pageSize) {
|
public PageBean<?> searchByPage(BookSpVO params, int page, int pageSize) {
|
||||||
|
|
||||||
|
|
||||||
if (params.getUpdatePeriod() != null) {
|
if (params.getUpdatePeriod() != null) {
|
||||||
@ -214,7 +216,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 PageBean(bookMapper.searchByPage(params));
|
return new PageBean<>(bookMapper.searchByPage(params));
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -513,7 +515,6 @@ public class BookServiceImpl implements BookService {
|
|||||||
//该作者发布过此书名的小说
|
//该作者发布过此书名的小说
|
||||||
throw new BusinessException(ResponseStatus.BOOKNAME_EXISTS);
|
throw new BusinessException(ResponseStatus.BOOKNAME_EXISTS);
|
||||||
}
|
}
|
||||||
;
|
|
||||||
book.setAuthorName(penName);
|
book.setAuthorName(penName);
|
||||||
book.setAuthorId(authorId);
|
book.setAuthorId(authorId);
|
||||||
book.setVisitCount(0L);
|
book.setVisitCount(0L);
|
||||||
@ -566,7 +567,7 @@ public class BookServiceImpl implements BookService {
|
|||||||
.render(RenderingStrategies.MYBATIS3));
|
.render(RenderingStrategies.MYBATIS3));
|
||||||
|
|
||||||
//计算价格
|
//计算价格
|
||||||
int bookPrice = new BigDecimal(wordCount).divide(bookPriceConfig.getWordCount()).multiply(bookPriceConfig.getValue()).intValue();
|
int bookPrice = new BigDecimal(wordCount).multiply(bookPriceConfig.getValue()).divide(bookPriceConfig.getWordCount(),0, RoundingMode.DOWN).intValue();
|
||||||
|
|
||||||
//更新小说目录表
|
//更新小说目录表
|
||||||
int indexNum = 0;
|
int indexNum = 0;
|
||||||
@ -626,7 +627,7 @@ public class BookServiceImpl implements BookService {
|
|||||||
List<BookIndex> bookIndices = bookIndexMapper.selectMany(
|
List<BookIndex> bookIndices = bookIndexMapper.selectMany(
|
||||||
select(BookIndexDynamicSqlSupport.bookId, BookIndexDynamicSqlSupport.wordCount)
|
select(BookIndexDynamicSqlSupport.bookId, BookIndexDynamicSqlSupport.wordCount)
|
||||||
.from(bookIndex)
|
.from(bookIndex)
|
||||||
.where(BookIndexDynamicSqlSupport.id, isEqualTo(indexId)).build().render(RenderingStrategy.MYBATIS3));
|
.where(BookIndexDynamicSqlSupport.id, isEqualTo(indexId)).build().render(RenderingStrategies.MYBATIS3));
|
||||||
if (bookIndices.size() > 0) {
|
if (bookIndices.size() > 0) {
|
||||||
BookIndex bookIndex = bookIndices.get(0);
|
BookIndex bookIndex = bookIndices.get(0);
|
||||||
//获取小说ID
|
//获取小说ID
|
||||||
@ -637,7 +638,7 @@ public class BookServiceImpl implements BookService {
|
|||||||
.from(book)
|
.from(book)
|
||||||
.where(id, isEqualTo(bookId))
|
.where(id, isEqualTo(bookId))
|
||||||
.build()
|
.build()
|
||||||
.render(RenderingStrategy.MYBATIS3));
|
.render(RenderingStrategies.MYBATIS3));
|
||||||
if (books.size() > 0) {
|
if (books.size() > 0) {
|
||||||
Book book = books.get(0);
|
Book book = books.get(0);
|
||||||
int wordCount = book.getWordCount();
|
int wordCount = book.getWordCount();
|
||||||
@ -660,7 +661,7 @@ public class BookServiceImpl implements BookService {
|
|||||||
.orderBy(BookIndexDynamicSqlSupport.indexNum.descending())
|
.orderBy(BookIndexDynamicSqlSupport.indexNum.descending())
|
||||||
.limit(1)
|
.limit(1)
|
||||||
.build()
|
.build()
|
||||||
.render(RenderingStrategy.MYBATIS3));
|
.render(RenderingStrategies.MYBATIS3));
|
||||||
if (lastBookIndices.size() > 0) {
|
if (lastBookIndices.size() > 0) {
|
||||||
BookIndex lastBookIndex = lastBookIndices.get(0);
|
BookIndex lastBookIndex = lastBookIndices.get(0);
|
||||||
lastIndexId = lastBookIndex.getId();
|
lastIndexId = lastBookIndex.getId();
|
||||||
@ -700,7 +701,7 @@ public class BookServiceImpl implements BookService {
|
|||||||
List<BookIndex> bookIndices = bookIndexMapper.selectMany(
|
List<BookIndex> bookIndices = bookIndexMapper.selectMany(
|
||||||
select(BookIndexDynamicSqlSupport.bookId, BookIndexDynamicSqlSupport.wordCount)
|
select(BookIndexDynamicSqlSupport.bookId, BookIndexDynamicSqlSupport.wordCount)
|
||||||
.from(bookIndex)
|
.from(bookIndex)
|
||||||
.where(BookIndexDynamicSqlSupport.id, isEqualTo(indexId)).build().render(RenderingStrategy.MYBATIS3));
|
.where(BookIndexDynamicSqlSupport.id, isEqualTo(indexId)).build().render(RenderingStrategies.MYBATIS3));
|
||||||
if (bookIndices.size() > 0) {
|
if (bookIndices.size() > 0) {
|
||||||
BookIndex bookIndex = bookIndices.get(0);
|
BookIndex bookIndex = bookIndices.get(0);
|
||||||
//获取小说ID
|
//获取小说ID
|
||||||
@ -711,7 +712,7 @@ public class BookServiceImpl implements BookService {
|
|||||||
.from(book)
|
.from(book)
|
||||||
.where(id, isEqualTo(bookId))
|
.where(id, isEqualTo(bookId))
|
||||||
.build()
|
.build()
|
||||||
.render(RenderingStrategy.MYBATIS3));
|
.render(RenderingStrategies.MYBATIS3));
|
||||||
if (books.size() > 0) {
|
if (books.size() > 0) {
|
||||||
Book book = books.get(0);
|
Book book = books.get(0);
|
||||||
//作者ID相同,表明该小说是登录用户发布,可以修改
|
//作者ID相同,表明该小说是登录用户发布,可以修改
|
||||||
@ -725,7 +726,7 @@ public class BookServiceImpl implements BookService {
|
|||||||
.equalTo(new Date())
|
.equalTo(new Date())
|
||||||
.where(BookIndexDynamicSqlSupport.id, isEqualTo(indexId))
|
.where(BookIndexDynamicSqlSupport.id, isEqualTo(indexId))
|
||||||
.build()
|
.build()
|
||||||
.render(RenderingStrategy.MYBATIS3));
|
.render(RenderingStrategies.MYBATIS3));
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -741,7 +742,7 @@ public class BookServiceImpl implements BookService {
|
|||||||
List<BookIndex> bookIndices = bookIndexMapper.selectMany(
|
List<BookIndex> bookIndices = bookIndexMapper.selectMany(
|
||||||
select(BookIndexDynamicSqlSupport.bookId, BookIndexDynamicSqlSupport.wordCount)
|
select(BookIndexDynamicSqlSupport.bookId, BookIndexDynamicSqlSupport.wordCount)
|
||||||
.from(bookIndex)
|
.from(bookIndex)
|
||||||
.where(BookIndexDynamicSqlSupport.id, isEqualTo(indexId)).build().render(RenderingStrategy.MYBATIS3));
|
.where(BookIndexDynamicSqlSupport.id, isEqualTo(indexId)).build().render(RenderingStrategies.MYBATIS3));
|
||||||
if (bookIndices.size() > 0) {
|
if (bookIndices.size() > 0) {
|
||||||
BookIndex bookIndex = bookIndices.get(0);
|
BookIndex bookIndex = bookIndices.get(0);
|
||||||
//获取小说ID
|
//获取小说ID
|
||||||
@ -752,7 +753,7 @@ public class BookServiceImpl implements BookService {
|
|||||||
.from(book)
|
.from(book)
|
||||||
.where(id, isEqualTo(bookId))
|
.where(id, isEqualTo(bookId))
|
||||||
.build()
|
.build()
|
||||||
.render(RenderingStrategy.MYBATIS3));
|
.render(RenderingStrategies.MYBATIS3));
|
||||||
if (books.size() > 0) {
|
if (books.size() > 0) {
|
||||||
Book book = books.get(0);
|
Book book = books.get(0);
|
||||||
//作者ID相同,表明该小说是登录用户发布
|
//作者ID相同,表明该小说是登录用户发布
|
||||||
@ -762,7 +763,7 @@ public class BookServiceImpl implements BookService {
|
|||||||
.from(bookContent)
|
.from(bookContent)
|
||||||
.where(BookContentDynamicSqlSupport.indexId, isEqualTo(indexId))
|
.where(BookContentDynamicSqlSupport.indexId, isEqualTo(indexId))
|
||||||
.limit(1)
|
.limit(1)
|
||||||
.build().render(RenderingStrategy.MYBATIS3))
|
.build().render(RenderingStrategies.MYBATIS3))
|
||||||
.get(0).getContent();
|
.get(0).getContent();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -779,7 +780,7 @@ public class BookServiceImpl implements BookService {
|
|||||||
List<BookIndex> bookIndices = bookIndexMapper.selectMany(
|
List<BookIndex> bookIndices = bookIndexMapper.selectMany(
|
||||||
select(BookIndexDynamicSqlSupport.bookId, BookIndexDynamicSqlSupport.wordCount)
|
select(BookIndexDynamicSqlSupport.bookId, BookIndexDynamicSqlSupport.wordCount)
|
||||||
.from(bookIndex)
|
.from(bookIndex)
|
||||||
.where(BookIndexDynamicSqlSupport.id, isEqualTo(indexId)).build().render(RenderingStrategy.MYBATIS3));
|
.where(BookIndexDynamicSqlSupport.id, isEqualTo(indexId)).build().render(RenderingStrategies.MYBATIS3));
|
||||||
if (bookIndices.size() > 0) {
|
if (bookIndices.size() > 0) {
|
||||||
BookIndex bookIndex = bookIndices.get(0);
|
BookIndex bookIndex = bookIndices.get(0);
|
||||||
//获取小说ID
|
//获取小说ID
|
||||||
@ -790,7 +791,7 @@ public class BookServiceImpl implements BookService {
|
|||||||
.from(book)
|
.from(book)
|
||||||
.where(id, isEqualTo(bookId))
|
.where(id, isEqualTo(bookId))
|
||||||
.build()
|
.build()
|
||||||
.render(RenderingStrategy.MYBATIS3));
|
.render(RenderingStrategies.MYBATIS3));
|
||||||
if (books.size() > 0) {
|
if (books.size() > 0) {
|
||||||
Book book = books.get(0);
|
Book book = books.get(0);
|
||||||
//作者ID相同,表明该小说是登录用户发布,可以修改
|
//作者ID相同,表明该小说是登录用户发布,可以修改
|
||||||
@ -799,11 +800,11 @@ public class BookServiceImpl implements BookService {
|
|||||||
int wordCount = StringUtil.getStrValidWordCount(content);
|
int wordCount = StringUtil.getStrValidWordCount(content);
|
||||||
|
|
||||||
//计算价格
|
//计算价格
|
||||||
int bookPrice = new BigDecimal(wordCount).divide(bookPriceConfig.getWordCount()).multiply(bookPriceConfig.getValue()).intValue();
|
int bookPrice = new BigDecimal(wordCount).multiply(bookPriceConfig.getValue()).divide(bookPriceConfig.getWordCount(),0,RoundingMode.DOWN).intValue();
|
||||||
|
|
||||||
|
|
||||||
//更新小说目录表
|
//更新小说目录表
|
||||||
int update = bookIndexMapper.update(
|
bookIndexMapper.update(
|
||||||
update(BookIndexDynamicSqlSupport.bookIndex)
|
update(BookIndexDynamicSqlSupport.bookIndex)
|
||||||
.set(BookIndexDynamicSqlSupport.indexName)
|
.set(BookIndexDynamicSqlSupport.indexName)
|
||||||
.equalTo(indexName)
|
.equalTo(indexName)
|
||||||
@ -814,7 +815,7 @@ public class BookServiceImpl implements BookService {
|
|||||||
.set(BookIndexDynamicSqlSupport.updateTime)
|
.set(BookIndexDynamicSqlSupport.updateTime)
|
||||||
.equalTo(currentDate)
|
.equalTo(currentDate)
|
||||||
.where(BookIndexDynamicSqlSupport.id, isEqualTo(indexId))
|
.where(BookIndexDynamicSqlSupport.id, isEqualTo(indexId))
|
||||||
.build().render(RenderingStrategy.MYBATIS3));
|
.build().render(RenderingStrategies.MYBATIS3));
|
||||||
|
|
||||||
//更新小说内容表
|
//更新小说内容表
|
||||||
bookContentMapper.update(
|
bookContentMapper.update(
|
||||||
@ -822,7 +823,7 @@ public class BookServiceImpl implements BookService {
|
|||||||
.set(BookContentDynamicSqlSupport.content)
|
.set(BookContentDynamicSqlSupport.content)
|
||||||
.equalTo(content)
|
.equalTo(content)
|
||||||
.where(BookContentDynamicSqlSupport.indexId, isEqualTo(indexId))
|
.where(BookContentDynamicSqlSupport.indexId, isEqualTo(indexId))
|
||||||
.build().render(RenderingStrategy.MYBATIS3));
|
.build().render(RenderingStrategies.MYBATIS3));
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -830,5 +831,18 @@ public class BookServiceImpl implements BookService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void updateBookPic(Long bookId, String bookPic, Long authorId) {
|
||||||
|
bookMapper.update(update(book)
|
||||||
|
.set(picUrl)
|
||||||
|
.equalTo(bookPic)
|
||||||
|
.set(updateTime)
|
||||||
|
.equalTo(new Date())
|
||||||
|
.where(id, isEqualTo(bookId))
|
||||||
|
.and(BookDynamicSqlSupport.authorId, isEqualTo(authorId))
|
||||||
|
.build()
|
||||||
|
.render(RenderingStrategies.MYBATIS3));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,7 @@ 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.PageBean;
|
||||||
import com.java2nb.novel.core.utils.BeanUtil;
|
import com.java2nb.novel.core.utils.BeanUtil;
|
||||||
|
import com.java2nb.novel.mapper.FrontNewsMapper;
|
||||||
import com.java2nb.novel.service.NewsService;
|
import com.java2nb.novel.service.NewsService;
|
||||||
import com.java2nb.novel.core.cache.CacheKey;
|
import com.java2nb.novel.core.cache.CacheKey;
|
||||||
import com.java2nb.novel.core.cache.CacheService;
|
import com.java2nb.novel.core.cache.CacheService;
|
||||||
@ -27,7 +28,7 @@ import static org.mybatis.dynamic.sql.select.SelectDSL.select;
|
|||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
public class NewsServiceImpl implements NewsService {
|
public class NewsServiceImpl implements NewsService {
|
||||||
|
|
||||||
private final NewsMapper newsMapper;
|
private final FrontNewsMapper newsMapper;
|
||||||
|
|
||||||
private final CacheService cacheService;
|
private final CacheService cacheService;
|
||||||
|
|
||||||
@ -72,4 +73,9 @@ public class NewsServiceImpl implements NewsService {
|
|||||||
pageBean.setList(BeanUtil.copyList(news,NewsVO.class));
|
pageBean.setList(BeanUtil.copyList(news,NewsVO.class));
|
||||||
return pageBean;
|
return pageBean;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void addReadCount(Integer newsId) {
|
||||||
|
newsMapper.addReadCount(newsId);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
package com.java2nb.novel.vo;
|
package com.java2nb.novel.vo;
|
||||||
|
|
||||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||||
|
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||||
|
import com.java2nb.novel.core.serialize.CommentUserNameSerialize;
|
||||||
import com.java2nb.novel.entity.BookComment;
|
import com.java2nb.novel.entity.BookComment;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
|
||||||
@ -13,6 +15,7 @@ import java.util.Date;
|
|||||||
@Data
|
@Data
|
||||||
public class BookCommentVO extends BookComment {
|
public class BookCommentVO extends BookComment {
|
||||||
|
|
||||||
|
@JsonSerialize(using = CommentUserNameSerialize.class)
|
||||||
private String createUserName;
|
private String createUserName;
|
||||||
|
|
||||||
private String createUserPhoto;
|
private String createUserPhoto;
|
||||||
|
@ -48,7 +48,7 @@ xss:
|
|||||||
# 排除链接(多个用逗号分隔)
|
# 排除链接(多个用逗号分隔)
|
||||||
excludes: /system/notice/*
|
excludes: /system/notice/*
|
||||||
# 匹配链接 (多个用逗号分隔)
|
# 匹配链接 (多个用逗号分隔)
|
||||||
urlPatterns: /book/addBookComment,/user/addFeedBack,/author/addBook,/author/addBookContent,/author/register.html
|
urlPatterns: /book/addBookComment,/user/addFeedBack,/author/addBook,/author/addBookContent,/author/updateBookContent,/author/register.html
|
||||||
|
|
||||||
|
|
||||||
author:
|
author:
|
||||||
|
@ -57,8 +57,8 @@
|
|||||||
<!-- 指定项目中某个包,当有日志操作行为时的日志记录级别 -->
|
<!-- 指定项目中某个包,当有日志操作行为时的日志记录级别 -->
|
||||||
<!-- com.maijinjie.springboot 为根包,也就是只要是发生在这个根包下面的所有日志操作行为的权限都是DEBUG -->
|
<!-- com.maijinjie.springboot 为根包,也就是只要是发生在这个根包下面的所有日志操作行为的权限都是DEBUG -->
|
||||||
<!-- 级别依次为【从高到低】:FATAL > ERROR > WARN > INFO > DEBUG > TRACE -->
|
<!-- 级别依次为【从高到低】:FATAL > ERROR > WARN > INFO > DEBUG > TRACE -->
|
||||||
<logger name="com.java2nb" level="DEBUG">
|
<logger name="com.java2nb" level="DEBUG" additivity="false">
|
||||||
<appender-ref ref="STDOUT" />
|
<appender-ref ref="STDOUT" />
|
||||||
<appender-ref ref="FILE" />
|
<appender-ref ref="FILE" />
|
||||||
</logger>
|
</logger>
|
||||||
</configuration>
|
</configuration>
|
||||||
|
@ -0,0 +1,9 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||||
|
|
||||||
|
<mapper namespace="com.java2nb.novel.mapper.FrontNewsMapper">
|
||||||
|
<update id="addReadCount">
|
||||||
|
update news set read_count = read_count + 1
|
||||||
|
where id = #{newsId}
|
||||||
|
</update>
|
||||||
|
</mapper>
|
@ -18,6 +18,7 @@
|
|||||||
.news_title h2 { font-size: 20px; }
|
.news_title h2 { font-size: 20px; }
|
||||||
.news_title .from { color: #999; display: block; margin: 20px 0; }
|
.news_title .from { color: #999; display: block; margin: 20px 0; }
|
||||||
.news_title .time { margin-left: 20px }
|
.news_title .time { margin-left: 20px }
|
||||||
|
.news_title .click { margin-left: 40px }
|
||||||
.news_info { padding: 0 60px; line-height: 28px; font-size: 14px; min-height:400px }
|
.news_info { padding: 0 60px; line-height: 28px; font-size: 14px; min-height:400px }
|
||||||
.news_info p { margin-bottom: 30px }
|
.news_info p { margin-bottom: 30px }
|
||||||
.aboutBox h2 { font-size:16px; margin-bottom:15px }
|
.aboutBox h2 { font-size:16px; margin-bottom:15px }
|
||||||
|
Binary file not shown.
Before Width: | Height: | Size: 150 KiB After Width: | Height: | Size: 10 KiB |
@ -124,4 +124,36 @@ String.prototype.isNickName = function () {
|
|||||||
function logout() {
|
function logout() {
|
||||||
$.cookie('Authorization', null,{ path: '/' });
|
$.cookie('Authorization', null,{ path: '/' });
|
||||||
location.reload();
|
location.reload();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function isImg(str) {
|
||||||
|
return !str.search("[.]+(jpg|jpeg|swf|gif|png|JPG|JPEG|SWF|GIF|PNG)$");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//校验图片上传
|
||||||
|
function checkPicUpload(file){
|
||||||
|
|
||||||
|
if(!isImg(file.value.substr(file.value.lastIndexOf(".")))){
|
||||||
|
layer.alert('只能上传图片格式的文件!');
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
var fileSize = 0;
|
||||||
|
var isIE = /msie/i.test(navigator.userAgent) && !window.opera;
|
||||||
|
if (isIE && !file.files) {
|
||||||
|
var filePath = file.value;
|
||||||
|
var fileSystem = new ActiveXObject("Scripting.FileSystemfileect");
|
||||||
|
var file = fileSystem.GetFile (filePath);
|
||||||
|
fileSize = file.Size;
|
||||||
|
}else {
|
||||||
|
fileSize = file.files[0].size;
|
||||||
|
}
|
||||||
|
fileSize=Math.round(fileSize/1024*100)/100; //单位为KB
|
||||||
|
if(fileSize>=1024){
|
||||||
|
layer.alert('上传的图片大小不能超过1M!');
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
180
novel-front/src/main/resources/static/javascript/lazyload.js
Normal file
180
novel-front/src/main/resources/static/javascript/lazyload.js
Normal file
@ -0,0 +1,180 @@
|
|||||||
|
/*!
|
||||||
|
* Lazy Load - JavaScript plugin for lazy loading images
|
||||||
|
*
|
||||||
|
* Copyright (c) 2007-2019 Mika Tuupola
|
||||||
|
*
|
||||||
|
* Licensed under the MIT license:
|
||||||
|
* http://www.opensource.org/licenses/mit-license.php
|
||||||
|
*
|
||||||
|
* Project home:
|
||||||
|
* https://appelsiini.net/projects/lazyload
|
||||||
|
*
|
||||||
|
* Version: 2.0.0-rc.2
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
(function (root, factory) {
|
||||||
|
if (typeof exports === "object") {
|
||||||
|
module.exports = factory(root);
|
||||||
|
} else if (typeof define === "function" && define.amd) {
|
||||||
|
define([], factory);
|
||||||
|
} else {
|
||||||
|
root.LazyLoad = factory(root);
|
||||||
|
}
|
||||||
|
}) (typeof global !== "undefined" ? global : this.window || this.global, function (root) {
|
||||||
|
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
if (typeof define === "function" && define.amd){
|
||||||
|
root = window;
|
||||||
|
}
|
||||||
|
|
||||||
|
const defaults = {
|
||||||
|
src: "data-src",
|
||||||
|
srcset: "data-srcset",
|
||||||
|
selector: ".lazyload",
|
||||||
|
root: null,
|
||||||
|
rootMargin: "0px",
|
||||||
|
threshold: 0
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Merge two or more objects. Returns a new object.
|
||||||
|
* @private
|
||||||
|
* @param {Boolean} deep If true, do a deep (or recursive) merge [optional]
|
||||||
|
* @param {Object} objects The objects to merge together
|
||||||
|
* @returns {Object} Merged values of defaults and options
|
||||||
|
*/
|
||||||
|
const extend = function () {
|
||||||
|
|
||||||
|
let extended = {};
|
||||||
|
let deep = false;
|
||||||
|
let i = 0;
|
||||||
|
let length = arguments.length;
|
||||||
|
|
||||||
|
/* Check if a deep merge */
|
||||||
|
if (Object.prototype.toString.call(arguments[0]) === "[object Boolean]") {
|
||||||
|
deep = arguments[0];
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Merge the object into the extended object */
|
||||||
|
let merge = function (obj) {
|
||||||
|
for (let prop in obj) {
|
||||||
|
if (Object.prototype.hasOwnProperty.call(obj, prop)) {
|
||||||
|
/* If deep merge and property is an object, merge properties */
|
||||||
|
if (deep && Object.prototype.toString.call(obj[prop]) === "[object Object]") {
|
||||||
|
extended[prop] = extend(true, extended[prop], obj[prop]);
|
||||||
|
} else {
|
||||||
|
extended[prop] = obj[prop];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Loop through each object and conduct a merge */
|
||||||
|
for (; i < length; i++) {
|
||||||
|
let obj = arguments[i];
|
||||||
|
merge(obj);
|
||||||
|
}
|
||||||
|
|
||||||
|
return extended;
|
||||||
|
};
|
||||||
|
|
||||||
|
function LazyLoad(images, options) {
|
||||||
|
this.settings = extend(defaults, options || {});
|
||||||
|
this.images = images || document.querySelectorAll(this.settings.selector);
|
||||||
|
this.observer = null;
|
||||||
|
this.init();
|
||||||
|
}
|
||||||
|
|
||||||
|
LazyLoad.prototype = {
|
||||||
|
init: function() {
|
||||||
|
|
||||||
|
/* Without observers load everything and bail out early. */
|
||||||
|
if (!root.IntersectionObserver) {
|
||||||
|
this.loadImages();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
let self = this;
|
||||||
|
let observerConfig = {
|
||||||
|
root: this.settings.root,
|
||||||
|
rootMargin: this.settings.rootMargin,
|
||||||
|
threshold: [this.settings.threshold]
|
||||||
|
};
|
||||||
|
|
||||||
|
this.observer = new IntersectionObserver(function(entries) {
|
||||||
|
Array.prototype.forEach.call(entries, function (entry) {
|
||||||
|
if (entry.isIntersecting) {
|
||||||
|
self.observer.unobserve(entry.target);
|
||||||
|
let src = entry.target.getAttribute(self.settings.src);
|
||||||
|
let srcset = entry.target.getAttribute(self.settings.srcset);
|
||||||
|
if ("img" === entry.target.tagName.toLowerCase()) {
|
||||||
|
if (src) {
|
||||||
|
entry.target.src = src;
|
||||||
|
}
|
||||||
|
if (srcset) {
|
||||||
|
entry.target.srcset = srcset;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
entry.target.style.backgroundImage = "url(" + src + ")";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}, observerConfig);
|
||||||
|
|
||||||
|
Array.prototype.forEach.call(this.images, function (image) {
|
||||||
|
self.observer.observe(image);
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
loadAndDestroy: function () {
|
||||||
|
if (!this.settings) { return; }
|
||||||
|
this.loadImages();
|
||||||
|
this.destroy();
|
||||||
|
},
|
||||||
|
|
||||||
|
loadImages: function () {
|
||||||
|
if (!this.settings) { return; }
|
||||||
|
|
||||||
|
let self = this;
|
||||||
|
Array.prototype.forEach.call(this.images, function (image) {
|
||||||
|
let src = image.getAttribute(self.settings.src);
|
||||||
|
let srcset = image.getAttribute(self.settings.srcset);
|
||||||
|
if ("img" === image.tagName.toLowerCase()) {
|
||||||
|
if (src) {
|
||||||
|
image.src = src;
|
||||||
|
}
|
||||||
|
if (srcset) {
|
||||||
|
image.srcset = srcset;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
image.style.backgroundImage = "url('" + src + "')";
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
destroy: function () {
|
||||||
|
if (!this.settings) { return; }
|
||||||
|
this.observer.disconnect();
|
||||||
|
this.settings = null;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
root.lazyload = function(images, options) {
|
||||||
|
return new LazyLoad(images, options);
|
||||||
|
};
|
||||||
|
|
||||||
|
if (root.jQuery) {
|
||||||
|
const $ = root.jQuery;
|
||||||
|
$.fn.lazyload = function (options) {
|
||||||
|
options = options || {};
|
||||||
|
options.attribute = options.attribute || "data-src";
|
||||||
|
new LazyLoad($.makeArray(this), options);
|
||||||
|
return this;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
return LazyLoad;
|
||||||
|
});
|
@ -3,16 +3,6 @@ var UserPay = {
|
|||||||
czPayPalData: [[20, "10000屋币"], [50, "25000屋币"], [100, "50000屋币"], [80, "全站包年阅读"]],
|
czPayPalData: [[20, "10000屋币"], [50, "25000屋币"], [100, "50000屋币"], [80, "全站包年阅读"]],
|
||||||
sendPay: function () {
|
sendPay: function () {
|
||||||
$("#payform").submit();
|
$("#payform").submit();
|
||||||
},
|
|
||||||
GetPayState: function (payId) {
|
|
||||||
$.post("/api/book.aspx", { act: "getpaystatus", pid: payId }, function (data, textStatus) {
|
|
||||||
if (data == "1") {
|
|
||||||
location.href = '/pay/wx_return.aspx?out_trade_no=sc'+payId;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
setTimeout("UserPay.GetPayState("+payId+")",3000);
|
|
||||||
}
|
|
||||||
}, "html");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -46,20 +36,6 @@ $(function () {
|
|||||||
$("#ulZFWXXJ").show();
|
$("#ulZFWXXJ").show();
|
||||||
}
|
}
|
||||||
|
|
||||||
var postUrl = "";
|
|
||||||
switch (type)
|
|
||||||
{
|
|
||||||
case "1":
|
|
||||||
postUrl = "sendalipay.aspx";
|
|
||||||
break;
|
|
||||||
case "2":
|
|
||||||
postUrl = "sendwxpaynowqr.aspx";
|
|
||||||
break;
|
|
||||||
case "3":
|
|
||||||
postUrl = "sendpaypal.aspx";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
$("#payform").attr("action", postUrl);
|
|
||||||
})
|
})
|
||||||
|
|
||||||
$("#ulZFWX li").click(function () {
|
$("#ulZFWX li").click(function () {
|
||||||
|
File diff suppressed because one or more lines are too long
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user