diff --git a/.gitignore b/.gitignore index 82d6349..a45af58 100644 --- a/.gitignore +++ b/.gitignore @@ -38,3 +38,4 @@ gradlew gradlew.bat unused.txt /web-service/src/main/generated/ +/db diff --git a/README.md b/README.md index 7d88c05..9a6b50e 100644 --- a/README.md +++ b/README.md @@ -158,9 +158,9 @@ mvn package > 注意: netdisk-fast-download.service中的ExecStart的路径改为实际路径 ```shell cd ~ -wget -O netdisk-fast-download-0.1.6-bin.zip https://github.com/qaiu/netdisk-fast-download/releases/download/0.1.6-releases/netdisk-fast-download-0.1.6-bin.zip -unzip netdisk-fast-download-*-bin.zip -cd netdisk-fast-download-*-bin +wget -O netdisk-fast-download.zip https://github.com/qaiu/netdisk-fast-download/releases/download/0.1.7/netdisk-fast-download.zip +unzip netdisk-fast-download.zip +cd netdisk-fast-download bash service-install.sh ``` 服务相关命令: @@ -184,8 +184,8 @@ systemctl enable netdisk-fast-download.servic systemctl disable netdisk-fast-download.servic ## Windows服务部署 -1. 下载并解压releases版本netdisk-fast-download-0.1.6-bin.zip -2. 进入netdisk-fast-download-0.1.6-bin目录 +1. 下载并解压releases版本netdisk-fast-download.zip +2. 进入netdisk-fast-download下的bin目录 3. 使用管理员权限运行nfd-service-install.bat 如果不想使用服务运行可以直接运行run.bat > 注意: 如果jdk环境变量的java版本不是17请修改nfd-service-template.xml中的java命令的路径改为实际路径 diff --git a/bin/netdisk-fast-download.service b/bin/netdisk-fast-download.service index 55716dc..50ae18f 100644 --- a/bin/netdisk-fast-download.service +++ b/bin/netdisk-fast-download.service @@ -8,7 +8,7 @@ Wants=network-online.target Type=simple # User=USER # 需要JDK17及以上版本 注意修改为自己的路径 -ExecStart=/root/java/jdk-17.0.2/bin/java -server -Xmx128m -jar /root/java/netdisk-fast-download-0.1.6/netdisk-fast-download-0.1.6.jar +ExecStart=/root/java/jdk-17.0.2/bin/java -server -Xmx128m -jar /root/java/netdisk-fast-download/netdisk-fast-download.jar ExecStop=/bin/kill -s QUIT $MAINPID Restart=always StandOutput=syslog diff --git a/bin/nfd-service-install.bat b/bin/nfd-service-install.bat index 8940941..7244ba9 100644 --- a/bin/nfd-service-install.bat +++ b/bin/nfd-service-install.bat @@ -7,7 +7,7 @@ pushd %~dp0 set MY_DIR=%~dp0 set MY_DIR=%MY_DIR:~0,-1% -for /f "delims=X" %%i in ('dir /b %MY_DIR%\netdisk-fast-download-*.jar') do ( +for /f "delims=X" %%i in ('dir /b %MY_DIR%\netdisk-fast-download.jar') do ( set LAUNCH_JAR=%MY_DIR%\%%i ) diff --git a/bin/run.bat b/bin/run.bat index 052fc0e..cb2f28c 100644 --- a/bin/run.bat +++ b/bin/run.bat @@ -1,7 +1,7 @@ @echo off && @chcp 65001 > nul pushd %~dp0 set LIB_DIR=%~dp0 -for /f "delims=X" %%i in ('dir /b %LIB_DIR%\netdisk-fast-download-*.jar') do ( +for /f "delims=X" %%i in ('dir /b %LIB_DIR%\netdisk-fast-download.jar') do ( set LAUNCH_JAR=%LIB_DIR%%%i ) diff --git a/bin/run.sh b/bin/run.sh index 903c130..06e7c53 100644 --- a/bin/run.sh +++ b/bin/run.sh @@ -1,6 +1,6 @@ #!/bin/bash # set -x -LAUNCH_JAR="netdisk-fast-download-0.1.6.jar" +LAUNCH_JAR="netdisk-fast-download.jar" nohup java -Xmx512M -jar "$LAUNCH_JAR" "$@" >startup.log 2>&1 & tail -f startup.log diff --git a/core-database/pom.xml b/core-database/pom.xml index 17389bf..8ae9b06 100644 --- a/core-database/pom.xml +++ b/core-database/pom.xml @@ -5,7 +5,7 @@ netdisk-fast-download cn.qaiu - 0.1.6 + 0.1.7 4.0.0 diff --git a/core-database/src/main/java/cn/qaiu/StartH2DatabaseServer.java b/core-database/src/main/java/cn/qaiu/StartH2DatabaseServer.java index 5c52135..8d5ee95 100644 --- a/core-database/src/main/java/cn/qaiu/StartH2DatabaseServer.java +++ b/core-database/src/main/java/cn/qaiu/StartH2DatabaseServer.java @@ -1,7 +1,7 @@ package cn.qaiu; public class StartH2DatabaseServer { - public static void main(String[] args) { - System.out.println("Hello world!"); - } + + + } diff --git a/core-database/src/main/java/cn/qaiu/db/ddl/CreateTable.java b/core-database/src/main/java/cn/qaiu/db/ddl/CreateTable.java index a039ae7..093cbc4 100644 --- a/core-database/src/main/java/cn/qaiu/db/ddl/CreateTable.java +++ b/core-database/src/main/java/cn/qaiu/db/ddl/CreateTable.java @@ -38,6 +38,7 @@ public class CreateTable { javaProperty2SqlColumnMap.put(Boolean.class, "BOOLEAN"); javaProperty2SqlColumnMap.put(String.class, "VARCHAR"); javaProperty2SqlColumnMap.put(java.util.Date.class, "TIMESTAMP"); + javaProperty2SqlColumnMap.put(java.time.LocalDateTime.class, "TIMESTAMP"); javaProperty2SqlColumnMap.put(java.sql.Timestamp.class, "TIMESTAMP"); javaProperty2SqlColumnMap.put(java.sql.Date.class, "DATE"); javaProperty2SqlColumnMap.put(java.sql.Time.class, "TIME"); diff --git a/core/pom.xml b/core/pom.xml index 9ff9aa4..0c6fb90 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -5,22 +5,14 @@ netdisk-fast-download cn.qaiu - 0.1.6 + 0.1.7 4.0.0 1.0.8 core - 17 UTF-8 - 4.4.1 - 0.10.2 - 1.18.12 - 2.0.5 - 3.12.0 - 2.14.2 - 1.4.6 @@ -91,6 +83,12 @@ jackson-databind ${jackson.version} + + com.fasterxml.jackson.datatype + jackson-datatype-jsr310 + ${jackson.version} + + diff --git a/core/src/main/java/cn/qaiu/vx/core/Deploy.java b/core/src/main/java/cn/qaiu/vx/core/Deploy.java index 53a15d6..c25e5c3 100644 --- a/core/src/main/java/cn/qaiu/vx/core/Deploy.java +++ b/core/src/main/java/cn/qaiu/vx/core/Deploy.java @@ -44,6 +44,11 @@ public final class Deploy { return INSTANCE; } + /** + * + * @param args 启动参数 + * @param handle 启动完成后回调处理函数 + */ public void start(String[] args, Handler handle) { this.mainThread = Thread.currentThread(); this.handle = handle; diff --git a/core/src/main/java/cn/qaiu/vx/core/base/BaseHttpApi.java b/core/src/main/java/cn/qaiu/vx/core/base/BaseHttpApi.java index f9a5ca2..2e324e7 100644 --- a/core/src/main/java/cn/qaiu/vx/core/base/BaseHttpApi.java +++ b/core/src/main/java/cn/qaiu/vx/core/base/BaseHttpApi.java @@ -1,12 +1,16 @@ package cn.qaiu.vx.core.base; import cn.qaiu.vx.core.interceptor.AfterInterceptor; +import cn.qaiu.vx.core.model.JsonResult; +import cn.qaiu.vx.core.util.CommonUtil; +import cn.qaiu.vx.core.util.ReflectionUtil; import io.vertx.core.json.JsonObject; import io.vertx.ext.web.RoutingContext; +import org.reflections.Reflections; import java.util.Set; -import static io.vertx.core.http.HttpHeaders.CONTENT_TYPE; +import static cn.qaiu.vx.core.util.ResponseUtil.*; /** * 统一响应处理 @@ -16,43 +20,43 @@ import static io.vertx.core.http.HttpHeaders.CONTENT_TYPE; */ public interface BaseHttpApi { - default Set getAfterInterceptor() { - return null; - } + // 需要扫描注册的Router路径 + Reflections reflections = ReflectionUtil.getReflections(); - default void fireJsonResponse(RoutingContext ctx, JsonObject jsonResult) { - ctx.response().putHeader(CONTENT_TYPE, "application/json; charset=utf-8") - .setStatusCode(200) - .end(jsonResult.encode()); - } - - default void fireJsonResponse(RoutingContext ctx, T jsonResult) { - JsonObject jsonObject = JsonObject.mapFrom(jsonResult); + default void doFireJsonObjectResponse(RoutingContext ctx, JsonObject jsonObject) { if (!ctx.response().ended()) { - fireJsonResponse(ctx, jsonObject); + fireJsonObjectResponse(ctx, jsonObject); } handleAfterInterceptor(ctx, jsonObject); } - default void handleAfterInterceptor(RoutingContext ctx, JsonObject jsonObject){ + + default void doFireJsonResultResponse(RoutingContext ctx, JsonResult jsonResult) { + if (!ctx.response().ended()) { + fireJsonResultResponse(ctx, jsonResult); + } + handleAfterInterceptor(ctx, jsonResult.toJsonObject()); + } + + + default Set getAfterInterceptor() { + + Set> afterInterceptorClassSet = + reflections.getSubTypesOf(AfterInterceptor.class); + if (afterInterceptorClassSet == null) { + return null; + } + return CommonUtil.sortClassSet(afterInterceptorClassSet); + } + + default void handleAfterInterceptor(RoutingContext ctx, JsonObject jsonObject) { Set afterInterceptor = getAfterInterceptor(); if (afterInterceptor != null) { - afterInterceptor.forEach(ai -> ai.handle(ctx.request(), jsonObject)); + afterInterceptor.forEach(ai -> ai.handle(ctx, jsonObject)); } if (!ctx.response().ended()) { - fireJsonResponse(ctx, "handleAfterInterceptor end."); + fireTextResponse(ctx, "handleAfterInterceptor: response not end"); } } - default void fireTextResponse(RoutingContext ctx, String text) { - ctx.response().putHeader(CONTENT_TYPE, "text/html; charset=utf-8").end(text); - Set afterInterceptor = getAfterInterceptor(); - if (afterInterceptor != null) { - afterInterceptor.forEach(ai -> ai.handle(ctx.request(), new JsonObject().put("text", text))); - } - } - - default void sendError(int statusCode, RoutingContext ctx) { - ctx.response().setStatusCode(statusCode).end(); - } } diff --git a/core/src/main/java/cn/qaiu/vx/core/handlerfactory/RouterHandlerFactory.java b/core/src/main/java/cn/qaiu/vx/core/handlerfactory/RouterHandlerFactory.java index dab1951..1ae027c 100644 --- a/core/src/main/java/cn/qaiu/vx/core/handlerfactory/RouterHandlerFactory.java +++ b/core/src/main/java/cn/qaiu/vx/core/handlerfactory/RouterHandlerFactory.java @@ -1,11 +1,14 @@ package cn.qaiu.vx.core.handlerfactory; -import cn.qaiu.vx.core.annotaions.*; +import cn.qaiu.vx.core.annotaions.DateFormat; +import cn.qaiu.vx.core.annotaions.RouteHandler; +import cn.qaiu.vx.core.annotaions.RouteMapping; +import cn.qaiu.vx.core.annotaions.SockRouteMapper; import cn.qaiu.vx.core.base.BaseHttpApi; -import cn.qaiu.vx.core.interceptor.AfterInterceptor; import cn.qaiu.vx.core.interceptor.BeforeInterceptor; import cn.qaiu.vx.core.model.JsonResult; import cn.qaiu.vx.core.util.*; +import io.netty.handler.codec.http.HttpHeaderValues; import io.vertx.core.Future; import io.vertx.core.Handler; import io.vertx.core.MultiMap; @@ -17,16 +20,12 @@ import io.vertx.core.json.JsonObject; import io.vertx.ext.web.Route; import io.vertx.ext.web.Router; import io.vertx.ext.web.RoutingContext; -import io.vertx.ext.web.handler.BodyHandler; -import io.vertx.ext.web.handler.CorsHandler; -import io.vertx.ext.web.handler.StaticHandler; -import io.vertx.ext.web.handler.TimeoutHandler; +import io.vertx.ext.web.handler.*; import io.vertx.ext.web.handler.sockjs.SockJSHandler; import io.vertx.ext.web.handler.sockjs.SockJSHandlerOptions; import javassist.CtClass; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.Pair; -import org.reflections.Reflections; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -57,14 +56,11 @@ public class RouterHandlerFactory implements BaseHttpApi { add(HttpMethod.DELETE); add(HttpMethod.HEAD); }}; - // 需要扫描注册的Router路径 - private static volatile Reflections reflections; private final String gatewayPrefix; public RouterHandlerFactory(String gatewayPrefix) { Objects.requireNonNull(gatewayPrefix, "The gateway prefix is empty."); - reflections = ReflectionUtil.getReflections(); this.gatewayPrefix = gatewayPrefix; } @@ -130,7 +126,7 @@ public class RouterHandlerFactory implements BaseHttpApi { LOGGER.error("Manually Register Handler Fail, Error details:" + e.getMessage()); } // 错误请求处理 - mainRouter.errorHandler(405, ctx -> fireJsonResponse(ctx, JsonResult + mainRouter.errorHandler(405, ctx -> doFireJsonResultResponse(ctx, JsonResult .error("Method Not Allowed", 405))); mainRouter.errorHandler(404, ctx -> ctx.response().setStatusCode(404).setChunked(true) .end("Internal server error: 404 not found")); @@ -165,7 +161,7 @@ public class RouterHandlerFactory implements BaseHttpApi { // 普通路由 RouteMapping mapping = method.getAnnotation(RouteMapping.class); HttpMethod routeMethod = HttpMethod.valueOf(mapping.method().name()); - String routeUrl = getRouteUrl(method.getName(), mapping.value()); + String routeUrl = getRouteUrl(mapping.value()); String url = root.concat(routeUrl); // 匹配方法 Route route = router.route(routeMethod, url); @@ -177,15 +173,16 @@ public class RouterHandlerFactory implements BaseHttpApi { // 设置默认超时 route.handler(TimeoutHandler.create(SharedDataUtil.getCustomConfig().getInteger(ROUTE_TIME_OUT))); + route.handler(ResponseTimeHandler.create()); route.handler(ctx -> handlerMethod(instance, method, ctx)).failureHandler(ctx -> { if (ctx.response().ended()) return; ctx.failure().printStackTrace(); - fireJsonResponse(ctx, JsonResult.error(ctx.failure().getMessage(), 500)); + doFireJsonResultResponse(ctx, JsonResult.error(ctx.failure().getMessage(), 500)); }); } else if (method.isAnnotationPresent(SockRouteMapper.class)) { // websocket 基于sockJs SockRouteMapper mapping = method.getAnnotation(SockRouteMapper.class); - String routeUrl = getRouteUrl(method.getName(), mapping.value()); + String routeUrl = getRouteUrl(mapping.value()); String url = root.concat(routeUrl); LOGGER.info("Register New Websocket Handler -> {}", url); SockJSHandlerOptions options = new SockJSHandlerOptions() @@ -212,10 +209,9 @@ public class RouterHandlerFactory implements BaseHttpApi { /** * 获取并处理路由URL分隔符 * - * @param methodName 路由method * @return String */ - private String getRouteUrl(String methodName, String mapperValue) { + private String getRouteUrl(String mapperValue) { String routeUrl; if ("/".equals(mapperValue)) { routeUrl = mapperValue; @@ -231,7 +227,6 @@ public class RouterHandlerFactory implements BaseHttpApi { * 配置拦截 * * @return Handler - * @throws Throwable Throwable */ private Set> getInterceptorSet() { // 配置拦截 @@ -257,7 +252,7 @@ public class RouterHandlerFactory implements BaseHttpApi { if (handler.isAnnotationPresent(RouteHandler.class)) { RouteHandler routeHandler = handler.getAnnotation(RouteHandler.class); String value = routeHandler.value(); - root += ("/".equals(value) ? "" : value); + root += (value.startsWith("/") ? value.substring(1) : value); } if (!root.endsWith("/")) { root = root + "/"; @@ -300,37 +295,12 @@ public class RouterHandlerFactory implements BaseHttpApi { }); } - final MultiMap queryParams = ctx.queryParams(); - if ("POST".equals(ctx.request().method().name())) { - queryParams.addAll(ctx.request().params()); - } - JsonArray entityPackagesReg = SharedDataUtil.getJsonArrayForCustomConfig("entityPackagesReg"); - // 绑定get或post请求头的请求参数 - methodParametersTemp.forEach((k, v) -> { - if (ReflectionUtil.isBasicType(v.getRight())) { - String fmt = getFmt(v.getLeft(), v.getRight()); - String value = queryParams.get(k); - parameterValueList.put(k, ReflectionUtil.conversion(v.getRight(), value, fmt)); - } else if (RoutingContext.class.getName().equals(v.getRight().getName())) { - parameterValueList.put(k, ctx); - } else if (HttpServerRequest.class.getName().equals(v.getRight().getName())) { - parameterValueList.put(k, ctx.request()); - } else if (HttpServerResponse.class.getName().equals(v.getRight().getName())) { - parameterValueList.put(k, ctx.response()); - } else if (CommonUtil.matchRegList(entityPackagesReg.getList(), v.getRight().getName())) { - // 绑定实体类 - try { - Class aClass = Class.forName(v.getRight().getName()); - Object entity = ParamUtil.multiMapToEntity(queryParams, aClass); - parameterValueList.put(k, entity); - } catch (Exception e) { - e.printStackTrace(); - } - } - }); + + final MultiMap queryParams = ctx.queryParams(); // 解析body-json参数 - if ("application/json".equals(ctx.parsedHeaders().contentType().value()) && ctx.body().asJsonObject() != null) { + if (HttpHeaderValues.APPLICATION_JSON.toString().equals(ctx.parsedHeaders().contentType().value()) + && ctx.body().asJsonObject() != null) { JsonObject body = ctx.body().asJsonObject(); if (body != null) { methodParametersTemp.forEach((k, v) -> { @@ -350,28 +320,66 @@ public class RouterHandlerFactory implements BaseHttpApi { } }); } + } else if (ctx.body() != null) { + queryParams.addAll(ParamUtil.paramsToMap(ctx.body().asString())); } + + // 解析其他参数 + if ("POST".equals(ctx.request().method().name())) { + queryParams.addAll(ctx.request().params()); + } + // 绑定get或post请求头的请求参数 + methodParametersTemp.forEach((k, v) -> { + if (ReflectionUtil.isBasicType(v.getRight())) { + String fmt = getFmt(v.getLeft(), v.getRight()); + String value = queryParams.get(k); + parameterValueList.put(k, ReflectionUtil.conversion(v.getRight(), value, fmt)); + } else if (RoutingContext.class.getName().equals(v.getRight().getName())) { + parameterValueList.put(k, ctx); + } else if (HttpServerRequest.class.getName().equals(v.getRight().getName())) { + parameterValueList.put(k, ctx.request()); + } else if (HttpServerResponse.class.getName().equals(v.getRight().getName())) { + parameterValueList.put(k, ctx.response()); + } else if (parameterValueList.get(k) == null + && CommonUtil.matchRegList(entityPackagesReg.getList(), v.getRight().getName())) { + // 绑定实体类 + try { + Class aClass = Class.forName(v.getRight().getName()); + Object entity = ParamUtil.multiMapToEntity(queryParams, aClass); + parameterValueList.put(k, entity); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); // 调用handle 获取响应对象 Object[] parameterValueArray = parameterValueList.values().toArray(new Object[0]); try { // 反射调用 Object data = ReflectionUtil.invokeWithArguments(method, instance, parameterValueArray); if (data != null) { + if (data instanceof JsonResult) { - fireJsonResponse(ctx, data); + doFireJsonResultResponse(ctx, (JsonResult) data); + } + if (data instanceof JsonObject) { + doFireJsonObjectResponse(ctx, ((JsonObject) data)); } else if (data instanceof Future) { // 处理异步响应 ((Future) data).onSuccess(res -> { + if (res instanceof JsonResult) { + doFireJsonResultResponse(ctx, (JsonResult) res); + } if (res instanceof JsonObject) { - fireJsonResponse(ctx, res); + doFireJsonObjectResponse(ctx, ((JsonObject) res)); } else if (res != null) { - fireJsonResponse(ctx, JsonResult.data(res)); + doFireJsonResultResponse(ctx, JsonResult.data(res)); } else { handleAfterInterceptor(ctx, null); } - }).onFailure(e -> fireJsonResponse(ctx, JsonResult.error(e.getMessage()))); + }).onFailure(e -> doFireJsonResultResponse(ctx, JsonResult.error(e.getMessage()))); } else { - fireTextResponse(ctx, data.toString()); + doFireJsonResultResponse(ctx, JsonResult.data(data)); } } } catch (Throwable e) { @@ -384,7 +392,7 @@ public class RouterHandlerFactory implements BaseHttpApi { err = e.getCause().getMessage(); } } - fireJsonResponse(ctx, JsonResult.error(err)); + doFireJsonResultResponse(ctx, JsonResult.error(err)); } } @@ -403,16 +411,6 @@ public class RouterHandlerFactory implements BaseHttpApi { return fmt; } - @Override - public Set getAfterInterceptor() { - Set> afterInterceptorClassSet = - reflections.getSubTypesOf(AfterInterceptor.class); - if (afterInterceptorClassSet == null) { - return null; - } - return CommonUtil.sortClassSet(afterInterceptorClassSet); - } - private Set getBeforeInterceptor() { Set> interceptorClassSet = reflections.getSubTypesOf(BeforeInterceptor.class); diff --git a/core/src/main/java/cn/qaiu/vx/core/interceptor/AfterInterceptor.java b/core/src/main/java/cn/qaiu/vx/core/interceptor/AfterInterceptor.java index b479663..cb39442 100644 --- a/core/src/main/java/cn/qaiu/vx/core/interceptor/AfterInterceptor.java +++ b/core/src/main/java/cn/qaiu/vx/core/interceptor/AfterInterceptor.java @@ -1,7 +1,7 @@ package cn.qaiu.vx.core.interceptor; -import io.vertx.core.http.HttpServerRequest; import io.vertx.core.json.JsonObject; +import io.vertx.ext.web.RoutingContext; /** * 后置拦截器接口 @@ -10,6 +10,6 @@ import io.vertx.core.json.JsonObject; */ public interface AfterInterceptor { - void handle(HttpServerRequest request, JsonObject responseData); + void handle(RoutingContext ctx, JsonObject responseData); } diff --git a/core/src/main/java/cn/qaiu/vx/core/interceptor/BeforeInterceptor.java b/core/src/main/java/cn/qaiu/vx/core/interceptor/BeforeInterceptor.java index c5470e7..0904a03 100644 --- a/core/src/main/java/cn/qaiu/vx/core/interceptor/BeforeInterceptor.java +++ b/core/src/main/java/cn/qaiu/vx/core/interceptor/BeforeInterceptor.java @@ -3,15 +3,30 @@ package cn.qaiu.vx.core.interceptor; import io.vertx.core.Handler; import io.vertx.ext.web.RoutingContext; +import static cn.qaiu.vx.core.util.ResponseUtil.sendError; + /** * 前置拦截器接口 * * @author QAIU */ -public interface BeforeInterceptor { +public interface BeforeInterceptor extends Handler { + String IS_NEXT = "RoutingContextIsNext"; default Handler doHandle() { - return this::handle; + + return ctx -> { + ctx.put(IS_NEXT, false); + BeforeInterceptor.this.handle(ctx); + if (!(Boolean) ctx.get(IS_NEXT) && !ctx.response().ended()) { + sendError(ctx, 403); + } + }; + } + + default void doNext(RoutingContext context) { + context.put(IS_NEXT, true); + context.next(); } void handle(RoutingContext context); diff --git a/core/src/main/java/cn/qaiu/vx/core/model/JsonResult.java b/core/src/main/java/cn/qaiu/vx/core/model/JsonResult.java index 11bfae4..183c47d 100644 --- a/core/src/main/java/cn/qaiu/vx/core/model/JsonResult.java +++ b/core/src/main/java/cn/qaiu/vx/core/model/JsonResult.java @@ -1,6 +1,9 @@ package cn.qaiu.vx.core.model; +import cn.qaiu.vx.core.util.CastUtil; +import com.fasterxml.jackson.databind.ObjectMapper; +import io.vertx.core.json.JsonObject; import org.apache.commons.lang3.StringUtils; import java.io.Serial; @@ -159,4 +162,16 @@ public class JsonResult implements Serializable { public static JsonResult success() { return new JsonResult<>(SUCCESS_CODE, SUCCESS_MESSAGE, true, null); } + + // 转为json对象 + public JsonObject toJsonObject() { + return JsonObject.mapFrom(this); + } + + private static final ObjectMapper mapper = new ObjectMapper(); + + // 转为json对象 + public static JsonResult toJsonResult(JsonObject json) { + return CastUtil.cast(json.mapTo(JsonResult.class)); + } } diff --git a/core/src/main/java/cn/qaiu/vx/core/util/ParamUtil.java b/core/src/main/java/cn/qaiu/vx/core/util/ParamUtil.java index 58bf7a3..13ee131 100644 --- a/core/src/main/java/cn/qaiu/vx/core/util/ParamUtil.java +++ b/core/src/main/java/cn/qaiu/vx/core/util/ParamUtil.java @@ -27,12 +27,12 @@ public final class ParamUtil { return map; } - public static T multiMapToEntity(MultiMap multiMap,Class tClass) throws NoSuchMethodException { - Map map = multiMapToMap(multiMap); + public static T multiMapToEntity(MultiMap multiMap, Class tClass) throws NoSuchMethodException { + Map map = multiMapToMap(multiMap); T obj = null; try { obj = tClass.getDeclaredConstructor().newInstance(); - BeanUtils.populate(obj,map); + BeanUtils.populate(obj, map); } catch (InstantiationException | IllegalAccessException e) { e.printStackTrace(); LOGGER.error("实例化异常"); @@ -42,4 +42,21 @@ public final class ParamUtil { } return obj; } + + public static MultiMap paramsToMap(String paramString) { + MultiMap entries = MultiMap.caseInsensitiveMultiMap(); + if (paramString == null) return entries; + String[] params = paramString.split("&"); + if (params.length == 0) return entries; + for (String param : params) { + String[] kv = param.split("="); + if (kv.length == 2) { + entries.set(kv[0], kv[1]); + } else { + entries.set(kv[0], ""); + } + } + return entries; + } + } diff --git a/core/src/main/java/cn/qaiu/vx/core/util/ResponseUtil.java b/core/src/main/java/cn/qaiu/vx/core/util/ResponseUtil.java index 538f34f..1fa68e4 100644 --- a/core/src/main/java/cn/qaiu/vx/core/util/ResponseUtil.java +++ b/core/src/main/java/cn/qaiu/vx/core/util/ResponseUtil.java @@ -1,8 +1,13 @@ package cn.qaiu.vx.core.util; +import cn.qaiu.vx.core.model.JsonResult; import io.vertx.core.Promise; import io.vertx.core.http.HttpHeaders; import io.vertx.core.http.HttpServerResponse; +import io.vertx.core.json.JsonObject; +import io.vertx.ext.web.RoutingContext; + +import static io.vertx.core.http.HttpHeaders.CONTENT_TYPE; public class ResponseUtil { @@ -14,4 +19,22 @@ public class ResponseUtil { redirect(response, url); promise.complete(); } + + public static void fireJsonObjectResponse(RoutingContext ctx, JsonObject jsonObject) { + ctx.response().putHeader(CONTENT_TYPE, "application/json; charset=utf-8") + .setStatusCode(200) + .end(jsonObject.encode()); + } + + public static void fireJsonResultResponse(RoutingContext ctx, JsonResult jsonResult) { + fireJsonObjectResponse(ctx, jsonResult.toJsonObject()); + } + + public static void fireTextResponse(RoutingContext ctx, String text) { + ctx.response().putHeader(CONTENT_TYPE, "text/html; charset=utf-8").end(text); + } + + public static void sendError(RoutingContext ctx, int statusCode) { + ctx.response().setStatusCode(statusCode).end(); + } } diff --git a/parser/pom.xml b/parser/pom.xml new file mode 100644 index 0000000..abebf36 --- /dev/null +++ b/parser/pom.xml @@ -0,0 +1,68 @@ + + + + netdisk-fast-download + cn.qaiu + 0.1.7 + + 4.0.0 + + parser + + + UTF-8 + + + + + + ch.qos.logback + logback-classic + ${logback.version} + + + org.slf4j + slf4j-api + ${slf4j.version} + + + io.vertx + vertx-web-client + ${vertx.version} + + + org.apache.commons + commons-lang3 + ${commons-lang3.version} + + + + org.openjdk.nashorn + nashorn-core + 15.4 + + + + junit + junit + 4.13.2 + test + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.1 + + ${java.version} + ${java.version} + + + + + diff --git a/parser/src/main/java/cn/qaiu/WebClientVertxInit.java b/parser/src/main/java/cn/qaiu/WebClientVertxInit.java new file mode 100644 index 0000000..6ba2e30 --- /dev/null +++ b/parser/src/main/java/cn/qaiu/WebClientVertxInit.java @@ -0,0 +1,19 @@ +package cn.qaiu; + +import io.vertx.core.Vertx; + +public class WebClientVertxInit { + private Vertx vertx = null; + private static final WebClientVertxInit INSTANCE = new WebClientVertxInit(); + + public static void init(Vertx vx) { + INSTANCE.vertx = vx; + } + + public static Vertx get() { + if (INSTANCE.vertx == null) { + throw new IllegalArgumentException("VertxInit getVertx: vertx is null"); + } + return INSTANCE.vertx; + } +} diff --git a/web-service/src/main/java/cn/qaiu/lz/common/parser/IPanTool.java b/parser/src/main/java/cn/qaiu/parser/IPanTool.java similarity index 93% rename from web-service/src/main/java/cn/qaiu/lz/common/parser/IPanTool.java rename to parser/src/main/java/cn/qaiu/parser/IPanTool.java index e0c081f..5d1186a 100644 --- a/web-service/src/main/java/cn/qaiu/lz/common/parser/IPanTool.java +++ b/parser/src/main/java/cn/qaiu/parser/IPanTool.java @@ -1,6 +1,6 @@ -package cn.qaiu.lz.common.parser;//package cn.qaiu.lz.common.parser; +package cn.qaiu.parser;//package cn.qaiu.lz.common.parser; -import cn.qaiu.lz.common.parser.impl.*; +import cn.qaiu.parser.impl.*; import io.vertx.core.Future; public interface IPanTool { diff --git a/web-service/src/main/java/cn/qaiu/lz/common/parser/PanBase.java b/parser/src/main/java/cn/qaiu/parser/PanBase.java similarity index 88% rename from web-service/src/main/java/cn/qaiu/lz/common/parser/PanBase.java rename to parser/src/main/java/cn/qaiu/parser/PanBase.java index 2948120..27287a9 100644 --- a/web-service/src/main/java/cn/qaiu/lz/common/parser/PanBase.java +++ b/parser/src/main/java/cn/qaiu/parser/PanBase.java @@ -1,6 +1,6 @@ -package cn.qaiu.lz.common.parser; +package cn.qaiu.parser; -import cn.qaiu.vx.core.util.VertxHolder; +import cn.qaiu.WebClientVertxInit; import io.vertx.core.Handler; import io.vertx.core.Promise; import io.vertx.ext.web.client.WebClient; @@ -13,8 +13,8 @@ public abstract class PanBase { protected Promise promise = Promise.promise(); - protected WebClient client = WebClient.create(VertxHolder.getVertxInstance()); - protected WebClient clientNoRedirects = WebClient.create(VertxHolder.getVertxInstance(), OPTIONS); + protected WebClient client = WebClient.create(WebClientVertxInit.get()); + protected WebClient clientNoRedirects = WebClient.create(WebClientVertxInit.get(), OPTIONS); private static final WebClientOptions OPTIONS = new WebClientOptions().setFollowRedirects(false); diff --git a/web-service/src/main/java/cn/qaiu/lz/common/parser/PanType.java b/parser/src/main/java/cn/qaiu/parser/PanType.java similarity index 67% rename from web-service/src/main/java/cn/qaiu/lz/common/parser/PanType.java rename to parser/src/main/java/cn/qaiu/parser/PanType.java index 7c298ac..87fead6 100644 --- a/web-service/src/main/java/cn/qaiu/lz/common/parser/PanType.java +++ b/parser/src/main/java/cn/qaiu/parser/PanType.java @@ -1,6 +1,4 @@ -package cn.qaiu.lz.common.parser; - -import cn.qaiu.lz.common.parser.impl.LzTool; +package cn.qaiu.parser; /** * @author QAIU diff --git a/web-service/src/main/java/cn/qaiu/lz/common/parser/impl/CowTool.java b/parser/src/main/java/cn/qaiu/parser/impl/CowTool.java similarity index 94% rename from web-service/src/main/java/cn/qaiu/lz/common/parser/impl/CowTool.java rename to parser/src/main/java/cn/qaiu/parser/impl/CowTool.java index 0e25640..04cd58c 100644 --- a/web-service/src/main/java/cn/qaiu/lz/common/parser/impl/CowTool.java +++ b/parser/src/main/java/cn/qaiu/parser/impl/CowTool.java @@ -1,8 +1,8 @@ -package cn.qaiu.lz.common.parser.impl; +package cn.qaiu.parser.impl; -import cn.qaiu.lz.common.parser.IPanTool; -import cn.qaiu.lz.common.parser.PanBase; -import cn.qaiu.lz.common.util.CommonUtils; +import cn.qaiu.parser.IPanTool; +import cn.qaiu.parser.PanBase; +import cn.qaiu.util.CommonUtils; import io.vertx.core.Future; import io.vertx.core.json.JsonObject; import org.apache.commons.lang3.StringUtils; diff --git a/web-service/src/main/java/cn/qaiu/lz/common/parser/impl/EcTool.java b/parser/src/main/java/cn/qaiu/parser/impl/EcTool.java similarity index 94% rename from web-service/src/main/java/cn/qaiu/lz/common/parser/impl/EcTool.java rename to parser/src/main/java/cn/qaiu/parser/impl/EcTool.java index 2f156ba..f84afc1 100644 --- a/web-service/src/main/java/cn/qaiu/lz/common/parser/impl/EcTool.java +++ b/parser/src/main/java/cn/qaiu/parser/impl/EcTool.java @@ -1,8 +1,8 @@ -package cn.qaiu.lz.common.parser.impl; +package cn.qaiu.parser.impl; -import cn.qaiu.lz.common.parser.IPanTool; -import cn.qaiu.lz.common.parser.PanBase; -import cn.qaiu.lz.common.util.CommonUtils; +import cn.qaiu.parser.IPanTool; +import cn.qaiu.parser.PanBase; +import cn.qaiu.util.CommonUtils; import io.vertx.core.Future; import io.vertx.core.json.JsonArray; import io.vertx.core.json.JsonObject; diff --git a/web-service/src/main/java/cn/qaiu/lz/common/parser/impl/FcTool.java b/parser/src/main/java/cn/qaiu/parser/impl/FcTool.java similarity index 96% rename from web-service/src/main/java/cn/qaiu/lz/common/parser/impl/FcTool.java rename to parser/src/main/java/cn/qaiu/parser/impl/FcTool.java index e0e9aa7..138eb68 100644 --- a/web-service/src/main/java/cn/qaiu/lz/common/parser/impl/FcTool.java +++ b/parser/src/main/java/cn/qaiu/parser/impl/FcTool.java @@ -1,8 +1,8 @@ -package cn.qaiu.lz.common.parser.impl; +package cn.qaiu.parser.impl; -import cn.qaiu.lz.common.parser.IPanTool; -import cn.qaiu.lz.common.parser.PanBase; -import cn.qaiu.lz.common.util.CommonUtils; +import cn.qaiu.parser.IPanTool; +import cn.qaiu.parser.PanBase; +import cn.qaiu.util.CommonUtils; import io.vertx.core.Future; import io.vertx.core.MultiMap; import io.vertx.core.Promise; diff --git a/web-service/src/main/java/cn/qaiu/lz/common/parser/impl/FjTool.java b/parser/src/main/java/cn/qaiu/parser/impl/FjTool.java similarity index 87% rename from web-service/src/main/java/cn/qaiu/lz/common/parser/impl/FjTool.java rename to parser/src/main/java/cn/qaiu/parser/impl/FjTool.java index 9d0d4b4..1e3c3f0 100644 --- a/web-service/src/main/java/cn/qaiu/lz/common/parser/impl/FjTool.java +++ b/parser/src/main/java/cn/qaiu/parser/impl/FjTool.java @@ -1,15 +1,13 @@ -package cn.qaiu.lz.common.parser.impl; +package cn.qaiu.parser.impl; -import cn.qaiu.lz.common.parser.IPanTool; -import cn.qaiu.lz.common.parser.PanBase; -import cn.qaiu.lz.common.util.AESUtils; -import cn.qaiu.lz.common.util.CommonUtils; -import cn.qaiu.vx.core.util.VertxHolder; +import cn.qaiu.parser.IPanTool; +import cn.qaiu.parser.PanBase; +import cn.qaiu.util.AESUtils; +import cn.qaiu.util.CommonUtils; import io.vertx.core.Future; import io.vertx.core.MultiMap; import io.vertx.core.json.JsonObject; import io.vertx.ext.web.client.WebClient; -import io.vertx.ext.web.client.WebClientOptions; import io.vertx.uritemplate.UriTemplate; import java.util.UUID; @@ -37,8 +35,7 @@ public class FjTool extends PanBase implements IPanTool { public Future parse() { String dataKey = CommonUtils.adaptShortPaths(SHARE_URL_PREFIX, key); - WebClient client = WebClient.create(VertxHolder.getVertxInstance(), - new WebClientOptions().setFollowRedirects(false)); + WebClient client = clientNoRedirects; String shareId = String.valueOf(AESUtils.idEncrypt(dataKey)); // 第一次请求 获取文件信息 diff --git a/web-service/src/main/java/cn/qaiu/lz/common/parser/impl/LzTool.java b/parser/src/main/java/cn/qaiu/parser/impl/LzTool.java similarity index 92% rename from web-service/src/main/java/cn/qaiu/lz/common/parser/impl/LzTool.java rename to parser/src/main/java/cn/qaiu/parser/impl/LzTool.java index 0e69ebc..5a2a5e1 100644 --- a/web-service/src/main/java/cn/qaiu/lz/common/parser/impl/LzTool.java +++ b/parser/src/main/java/cn/qaiu/parser/impl/LzTool.java @@ -1,15 +1,13 @@ -package cn.qaiu.lz.common.parser.impl; +package cn.qaiu.parser.impl; -import cn.qaiu.lz.common.parser.IPanTool; -import cn.qaiu.lz.common.parser.PanBase; -import cn.qaiu.lz.common.util.JsExecUtils; -import cn.qaiu.vx.core.util.VertxHolder; +import cn.qaiu.parser.IPanTool; +import cn.qaiu.parser.PanBase; +import cn.qaiu.util.JsExecUtils; import io.vertx.core.Future; import io.vertx.core.MultiMap; import io.vertx.core.Promise; import io.vertx.core.json.JsonObject; import io.vertx.ext.web.client.WebClient; -import io.vertx.ext.web.client.WebClientOptions; import org.openjdk.nashorn.api.scripting.ScriptObjectMirror; import javax.script.ScriptException; @@ -37,8 +35,7 @@ public class LzTool extends PanBase implements IPanTool { public Future parse() { String sUrl = key.startsWith("https://") ? key : SHARE_URL_PREFIX + "/" + key; - WebClient client = WebClient.create(VertxHolder.getVertxInstance(), - new WebClientOptions().setFollowRedirects(false)); + WebClient client = clientNoRedirects; client.getAbs(sUrl).send().onSuccess(res -> { String html = res.bodyAsString(); // 匹配iframe diff --git a/web-service/src/main/java/cn/qaiu/lz/common/parser/impl/QkTool.java b/parser/src/main/java/cn/qaiu/parser/impl/QkTool.java similarity index 75% rename from web-service/src/main/java/cn/qaiu/lz/common/parser/impl/QkTool.java rename to parser/src/main/java/cn/qaiu/parser/impl/QkTool.java index 7df7550..1635e68 100644 --- a/web-service/src/main/java/cn/qaiu/lz/common/parser/impl/QkTool.java +++ b/parser/src/main/java/cn/qaiu/parser/impl/QkTool.java @@ -1,7 +1,7 @@ -package cn.qaiu.lz.common.parser.impl; +package cn.qaiu.parser.impl; -import cn.qaiu.lz.common.parser.IPanTool; -import cn.qaiu.lz.common.parser.PanBase; +import cn.qaiu.parser.IPanTool; +import cn.qaiu.parser.PanBase; import io.vertx.core.Future; import io.vertx.core.Promise; diff --git a/web-service/src/main/java/cn/qaiu/lz/common/parser/impl/UcTool.java b/parser/src/main/java/cn/qaiu/parser/impl/UcTool.java similarity index 96% rename from web-service/src/main/java/cn/qaiu/lz/common/parser/impl/UcTool.java rename to parser/src/main/java/cn/qaiu/parser/impl/UcTool.java index dd90d62..bf80bf5 100644 --- a/web-service/src/main/java/cn/qaiu/lz/common/parser/impl/UcTool.java +++ b/parser/src/main/java/cn/qaiu/parser/impl/UcTool.java @@ -1,8 +1,8 @@ -package cn.qaiu.lz.common.parser.impl; +package cn.qaiu.parser.impl; -import cn.qaiu.lz.common.parser.IPanTool; -import cn.qaiu.lz.common.parser.PanBase; -import cn.qaiu.lz.common.util.CommonUtils; +import cn.qaiu.parser.IPanTool; +import cn.qaiu.parser.PanBase; +import cn.qaiu.util.CommonUtils; import io.vertx.core.Future; import io.vertx.core.json.JsonArray; import io.vertx.core.json.JsonObject; diff --git a/web-service/src/main/java/cn/qaiu/lz/common/parser/impl/YeTool.java b/parser/src/main/java/cn/qaiu/parser/impl/YeTool.java similarity index 97% rename from web-service/src/main/java/cn/qaiu/lz/common/parser/impl/YeTool.java rename to parser/src/main/java/cn/qaiu/parser/impl/YeTool.java index 51f12b7..35703fe 100644 --- a/web-service/src/main/java/cn/qaiu/lz/common/parser/impl/YeTool.java +++ b/parser/src/main/java/cn/qaiu/parser/impl/YeTool.java @@ -1,9 +1,9 @@ -package cn.qaiu.lz.common.parser.impl; +package cn.qaiu.parser.impl; -import cn.qaiu.lz.common.parser.IPanTool; -import cn.qaiu.lz.common.parser.PanBase; -import cn.qaiu.lz.common.util.CommonUtils; -import cn.qaiu.lz.common.util.JsExecUtils; +import cn.qaiu.parser.IPanTool; +import cn.qaiu.parser.PanBase; +import cn.qaiu.util.CommonUtils; +import cn.qaiu.util.JsExecUtils; import io.vertx.core.Future; import io.vertx.core.json.JsonObject; import io.vertx.ext.web.client.WebClient; diff --git a/web-service/src/main/java/cn/qaiu/lz/common/util/AESUtils.java b/parser/src/main/java/cn/qaiu/util/AESUtils.java similarity index 99% rename from web-service/src/main/java/cn/qaiu/lz/common/util/AESUtils.java rename to parser/src/main/java/cn/qaiu/util/AESUtils.java index dcabba2..37d559d 100644 --- a/web-service/src/main/java/cn/qaiu/lz/common/util/AESUtils.java +++ b/parser/src/main/java/cn/qaiu/util/AESUtils.java @@ -1,4 +1,4 @@ -package cn.qaiu.lz.common.util; +package cn.qaiu.util; import org.apache.commons.lang3.StringUtils; diff --git a/web-service/src/main/java/cn/qaiu/lz/common/util/ArrayUtil.java b/parser/src/main/java/cn/qaiu/util/ArrayUtil.java similarity index 93% rename from web-service/src/main/java/cn/qaiu/lz/common/util/ArrayUtil.java rename to parser/src/main/java/cn/qaiu/util/ArrayUtil.java index 7973d2f..8d9fe90 100644 --- a/web-service/src/main/java/cn/qaiu/lz/common/util/ArrayUtil.java +++ b/parser/src/main/java/cn/qaiu/util/ArrayUtil.java @@ -1,4 +1,4 @@ -package cn.qaiu.lz.common.util; +package cn.qaiu.util; public class ArrayUtil { diff --git a/web-service/src/main/java/cn/qaiu/lz/common/util/CommonUtils.java b/parser/src/main/java/cn/qaiu/util/CommonUtils.java similarity index 97% rename from web-service/src/main/java/cn/qaiu/lz/common/util/CommonUtils.java rename to parser/src/main/java/cn/qaiu/util/CommonUtils.java index b0f5038..4879b18 100644 --- a/web-service/src/main/java/cn/qaiu/lz/common/util/CommonUtils.java +++ b/parser/src/main/java/cn/qaiu/util/CommonUtils.java @@ -1,4 +1,4 @@ -package cn.qaiu.lz.common.util; +package cn.qaiu.util; import java.net.MalformedURLException; import java.net.URL; diff --git a/web-service/src/main/java/cn/qaiu/lz/common/util/JsExecUtils.java b/parser/src/main/java/cn/qaiu/util/JsExecUtils.java similarity index 98% rename from web-service/src/main/java/cn/qaiu/lz/common/util/JsExecUtils.java rename to parser/src/main/java/cn/qaiu/util/JsExecUtils.java index 51158e3..9683357 100644 --- a/web-service/src/main/java/cn/qaiu/lz/common/util/JsExecUtils.java +++ b/parser/src/main/java/cn/qaiu/util/JsExecUtils.java @@ -1,4 +1,4 @@ -package cn.qaiu.lz.common.util; +package cn.qaiu.util; import org.apache.commons.lang3.StringUtils; import org.openjdk.nashorn.api.scripting.ScriptObjectMirror; diff --git a/web-service/src/main/java/cn/qaiu/lz/common/util/PanExceptionUtils.java b/parser/src/main/java/cn/qaiu/util/PanExceptionUtils.java similarity index 91% rename from web-service/src/main/java/cn/qaiu/lz/common/util/PanExceptionUtils.java rename to parser/src/main/java/cn/qaiu/util/PanExceptionUtils.java index 7d7e67a..a0bc6af 100644 --- a/web-service/src/main/java/cn/qaiu/lz/common/util/PanExceptionUtils.java +++ b/parser/src/main/java/cn/qaiu/util/PanExceptionUtils.java @@ -1,4 +1,4 @@ -package cn.qaiu.lz.common.util; +package cn.qaiu.util; /** * @author QAIU diff --git a/parser/src/main/resources/js/lz.js b/parser/src/main/resources/js/lz.js new file mode 100644 index 0000000..7df1e7b --- /dev/null +++ b/parser/src/main/resources/js/lz.js @@ -0,0 +1,46 @@ +/** + * 蓝奏云解析器js签名获取工具 + */ + +var signObj; + + +var $, jQuery; + +$ = jQuery = function () { + return new jQuery.fn.init(); +} + +jQuery.fn = jQuery.prototype = { + init: function () { + return { + focus: function (a) { + + }, + keyup: function(a) { + + }, + ajax: function (obj) { + signObj = obj + } + + } + }, + +} + +jQuery.fn.init.prototype = jQuery.fn; + + +// 伪装jquery.ajax函数获取关键数据 +$.ajax = function (obj) { + signObj = obj +} + +var document = { + getElementById: function (v) { + return { + value: 'v' + } + }, +} diff --git a/parser/src/main/resources/js/ye123.js b/parser/src/main/resources/js/ye123.js new file mode 100644 index 0000000..65ec609 --- /dev/null +++ b/parser/src/main/resources/js/ye123.js @@ -0,0 +1,95 @@ +/* +https://statics.123pan.com/share-static/dist/umi.fb72555e.js +eaefamemdead +eaefameidldy +_0x4f141a(1690439821|5790548|/b/api/share/download/info|web|3|1946841013) = 秘钥 + +_0x1e2592 1690439821 时间戳 +_0x48562f 5790548 随机码 +_0x1e37d5 /b/api/share/download/info +_0x4e2d74 web +_0x56f040 3 +_0x43bdc6 1946841013 加密时间HASH戳 + +>>>> +_0x43bdc6=''['concat'](_0x1e2592, '-')['concat'](_0x48562f, '-')['concat'](_0x406c4e) +加密时间HASH戳 = 时间戳-随机码-秘钥 +*/ + +function _0x1b5d95(_0x278d1a) { + var _0x839b57, + _0x4ed4dc = arguments['length'] > 0x2 && void 0x0 !== arguments[0x2] ? arguments[0x2] : 0x8; + if (0x0 === arguments['length']) + return null; + 'object' === typeof _0x278d1a ? _0x839b57 = _0x278d1a : (0xa === ('' + _0x278d1a)['length'] && (_0x278d1a = 0x3e8 * parseInt(_0x278d1a)), + _0x839b57 = new Date(_0x278d1a)); + var _0xc5c54a = _0x278d1a + 0xea60 * new Date(_0x278d1a)['getTimezoneOffset']() + , _0x3732dc = _0xc5c54a + 0x36ee80 * _0x4ed4dc; + return _0x839b57 = new Date(_0x3732dc), + { + 'y': _0x839b57['getFullYear'](), + 'm': _0x839b57['getMonth']() + 0x1 < 0xa ? '0' + (_0x839b57['getMonth']() + 0x1) : _0x839b57['getMonth']() + 0x1, + 'd': _0x839b57['getDate']() < 0xa ? '0' + _0x839b57['getDate']() : _0x839b57['getDate'](), + 'h': _0x839b57['getHours']() < 0xa ? '0' + _0x839b57['getHours']() : _0x839b57['getHours'](), + 'f': _0x839b57['getMinutes']() < 0xa ? '0' + _0x839b57['getMinutes']() : _0x839b57['getMinutes']() + }; +} + + +function _0x4f141a(_0x4075b1) { + + for (var _0x4eddcb = arguments['length'] > 0x1 && void 0x0 !== arguments[0x1] ? arguments[0x1] : 0xa, + _0x2fc680 = function() { + for (var _0x515c63, _0x361314 = [], _0x4cbdba = 0x0; _0x4cbdba < 0x100; _0x4cbdba++) { + _0x515c63 = _0x4cbdba; + for (var _0x460960 = 0x0; _0x460960 < 0x8; _0x460960++) + _0x515c63 = 0x1 & _0x515c63 ? 0xedb88320 ^ _0x515c63 >>> 0x1 : _0x515c63 >>> 0x1; + _0x361314[_0x4cbdba] = _0x515c63; + } + return _0x361314; + }, + _0x4aed86 = _0x2fc680(), + _0x5880f0 = _0x4075b1, + _0x492393 = -0x1, _0x25d82c = 0x0; + _0x25d82c < _0x5880f0['length']; + _0x25d82c++) + + _0x492393 = _0x492393 >>> 0x8 ^ _0x4aed86[0xff & (_0x492393 ^ _0x5880f0.charCodeAt(_0x25d82c))]; + return _0x492393 = (-0x1 ^ _0x492393) >>> 0x0, + _0x492393.toString(_0x4eddcb); +} + + +function getSign(_0x1e37d5) { + var _0x4e2d74 = 'web'; + var _0x56f040 = 3; + var _0x1e2592 = Math.round((new Date().getTime() + 0x3c * new Date().getTimezoneOffset() * 0x3e8 + 28800000) / 0x3e8).toString(); + var key = 'a,d,e,f,g,h,l,m,y,i,j,n,o,p,k,q,r,s,t,u,b,c,v,w,s,z'; + var _0x48562f = Math['round'](0x989680 * Math['random']()); + + var _0x2f7dfc; + var _0x35a889; + var _0x36f983; + var _0x3b043d; + var _0x5bc73b; + var _0x4b30b2; + var _0x32399e; + var _0x25d94e; + var _0x373490; + for (var _0x1c540f in (_0x2f7dfc = key.split(','), + _0x35a889 = _0x1b5d95(_0x1e2592), + _0x36f983 = _0x35a889['y'], + _0x3b043d = _0x35a889['m'], + _0x5bc73b = _0x35a889['d'], + _0x4b30b2 = _0x35a889['h'], + _0x32399e = _0x35a889['f'], + _0x25d94e = [_0x36f983, _0x3b043d, _0x5bc73b, _0x4b30b2, _0x32399e].join(''), + _0x373490 = [], + _0x25d94e)) + _0x373490['push'](_0x2f7dfc[Number(_0x25d94e[_0x1c540f])]); + var _0x43bdc6; + var _0x406c4e; + return _0x43bdc6 = _0x4f141a(_0x373490['join']('')), + _0x406c4e = _0x4f141a(''['concat'](_0x1e2592, '|')['concat'](_0x48562f, '|')['concat'](_0x1e37d5, '|')['concat'](_0x4e2d74, '|')['concat'](_0x56f040, '|')['concat'](_0x43bdc6)), + [_0x43bdc6, ''['concat'](_0x1e2592, '-')['concat'](_0x48562f, '-')['concat'](_0x406c4e)]; +} diff --git a/web-service/src/test/java/cn/qaiu/web/test/TestAESUtil.java b/parser/src/test/java/qaiu/web/test/TestAESUtil.java similarity index 97% rename from web-service/src/test/java/cn/qaiu/web/test/TestAESUtil.java rename to parser/src/test/java/qaiu/web/test/TestAESUtil.java index a01c618..c452c77 100644 --- a/web-service/src/test/java/cn/qaiu/web/test/TestAESUtil.java +++ b/parser/src/test/java/qaiu/web/test/TestAESUtil.java @@ -1,6 +1,6 @@ -package cn.qaiu.web.test; +package qaiu.web.test; -import cn.qaiu.lz.common.util.AESUtils; +import cn.qaiu.util.AESUtils; import org.junit.Assert; import org.junit.Test; diff --git a/parser/src/test/java/qaiu/web/test/TestRegex.java b/parser/src/test/java/qaiu/web/test/TestRegex.java new file mode 100644 index 0000000..f6f66bf --- /dev/null +++ b/parser/src/test/java/qaiu/web/test/TestRegex.java @@ -0,0 +1,24 @@ +package qaiu.web.test; + +import org.junit.Test; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class TestRegex { + + @Test + public void regexYFC() { + String html = """ + + + """; + + Pattern compile = Pattern.compile("id=\"typed_id\"\\s+value=\"file_(\\d+)\""); + Matcher matcher = compile.matcher(html); + if (matcher.find()) { + System.out.println(matcher.group(0)); + System.out.println(matcher.group(1)); + } + } +} diff --git a/web-service/src/test/java/cn/qaiu/web/test/TestWebClient2.java b/parser/src/test/java/qaiu/web/test/TestWebClient2.java similarity index 98% rename from web-service/src/test/java/cn/qaiu/web/test/TestWebClient2.java rename to parser/src/test/java/qaiu/web/test/TestWebClient2.java index bfb48ed..f8fcb05 100644 --- a/web-service/src/test/java/cn/qaiu/web/test/TestWebClient2.java +++ b/parser/src/test/java/qaiu/web/test/TestWebClient2.java @@ -1,10 +1,9 @@ -package cn.qaiu.web.test; +package qaiu.web.test; import io.vertx.core.MultiMap; import io.vertx.core.Vertx; import io.vertx.core.json.JsonObject; import io.vertx.ext.web.client.WebClient; -import org.apache.commons.lang3.RegExUtils; import org.junit.Test; import java.util.regex.Matcher; diff --git a/web-service/src/test/java/cn/qaiu/web/test/WebClientExample.java b/parser/src/test/java/qaiu/web/test/WebClientExample.java similarity index 98% rename from web-service/src/test/java/cn/qaiu/web/test/WebClientExample.java rename to parser/src/test/java/qaiu/web/test/WebClientExample.java index 0b2384b..5abc716 100644 --- a/web-service/src/test/java/cn/qaiu/web/test/WebClientExample.java +++ b/parser/src/test/java/qaiu/web/test/WebClientExample.java @@ -1,4 +1,4 @@ -package cn.qaiu.web.test; +package qaiu.web.test; import io.vertx.core.MultiMap; import io.vertx.core.Vertx; diff --git a/pom.xml b/pom.xml index 57a2c93..df1e6e2 100644 --- a/pom.xml +++ b/pom.xml @@ -7,20 +7,31 @@ cn.qaiu netdisk-fast-download pom - 0.1.6 + 0.1.7 core web-service core-database + parser + 17 17 17 UTF-8 ${project.basedir}/web-service/target/package + + 2.0.5 + 4.4.1 + 0.10.2 + 1.18.12 + 2.0.5 + 3.12.0 + 2.14.2 + 1.4.7 @@ -105,14 +116,7 @@ false - - - - ${project.basedir}/logs - - false - - + diff --git a/web-service/pom.xml b/web-service/pom.xml index 7f8e6fb..34ae66c 100644 --- a/web-service/pom.xml +++ b/web-service/pom.xml @@ -5,19 +5,17 @@ netdisk-fast-download cn.qaiu - 0.1.6 + 0.1.7 4.0.0 - 0.1.6 + 0.1.7 web-service ${project.basedir}/target/package 17 UTF-8 - 2.0.5 - 6.1.0 - netdisk-fast-download-${project.version} + netdisk-fast-download @@ -36,13 +34,23 @@ ch.qos.logback logback-classic - 1.4.6 + ${logback.version} org.slf4j slf4j-api ${slf4j.version} + + cn.qaiu + core-database + 0.1.7 + + + cn.qaiu + parser + 0.1.7 + junit junit @@ -52,14 +60,9 @@ io.vertx vertx-web-client - 4.4.1 + ${vertx.version} - - cn.qaiu - core-database - 0.1.6 - org.openjdk.nashorn @@ -105,6 +108,8 @@ *.** */*.xml conf/** + js/** + http-tools/** diff --git a/web-service/src/main/java/cn/qaiu/lz/AppMain.java b/web-service/src/main/java/cn/qaiu/lz/AppMain.java index 65a7adf..29f4952 100644 --- a/web-service/src/main/java/cn/qaiu/lz/AppMain.java +++ b/web-service/src/main/java/cn/qaiu/lz/AppMain.java @@ -1,9 +1,13 @@ package cn.qaiu.lz; +import cn.qaiu.WebClientVertxInit; import cn.qaiu.db.pool.JDBCPoolInit; import cn.qaiu.vx.core.Deploy; import cn.qaiu.vx.core.util.ConfigConstant; +import cn.qaiu.vx.core.util.VertxHolder; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import io.vertx.core.json.JsonObject; +import io.vertx.core.json.jackson.DatabindCodec; /** @@ -24,6 +28,8 @@ public class AppMain { * @param jsonObject 配置 */ private static void exec(JsonObject jsonObject) { + WebClientVertxInit.init(VertxHolder.getVertxInstance()); + DatabindCodec.mapper().registerModule(new JavaTimeModule()); if (jsonObject.getJsonObject(ConfigConstant.SERVER).getBoolean("enableDatabase")) { JDBCPoolInit.builder().config(jsonObject.getJsonObject("dataSource")).build().initPool(); } diff --git a/web-service/src/main/java/cn/qaiu/lz/common/interceptorImpl/DefaultInterceptor.java b/web-service/src/main/java/cn/qaiu/lz/common/interceptorImpl/DefaultInterceptor.java index 41627c4..dec3686 100644 --- a/web-service/src/main/java/cn/qaiu/lz/common/interceptorImpl/DefaultInterceptor.java +++ b/web-service/src/main/java/cn/qaiu/lz/common/interceptorImpl/DefaultInterceptor.java @@ -16,14 +16,12 @@ import static cn.qaiu.vx.core.util.ConfigConstant.IGNORES_REG; @HandleSortFilter(1) public class DefaultInterceptor implements BeforeInterceptor { - protected final JsonArray ignores = SharedDataUtil.getJsonArrayForCustomConfig(IGNORES_REG); @Override public void handle(RoutingContext ctx) { - System.out.println("进入前置拦截器->" + ctx.request().path()); - - ctx.next(); + System.out.println("进入前置拦截器1->" + ctx.request().path()); + doNext(ctx); } } diff --git a/web-service/src/main/java/cn/qaiu/lz/common/interceptorImpl/LogStatistics.java b/web-service/src/main/java/cn/qaiu/lz/common/interceptorImpl/LogStatistics.java index 8ec076c..a88a93d 100644 --- a/web-service/src/main/java/cn/qaiu/lz/common/interceptorImpl/LogStatistics.java +++ b/web-service/src/main/java/cn/qaiu/lz/common/interceptorImpl/LogStatistics.java @@ -1,26 +1,68 @@ package cn.qaiu.lz.common.interceptorImpl; +import cn.qaiu.db.pool.JDBCPoolInit; +import cn.qaiu.lz.common.model.ParserLogInfo; import cn.qaiu.vx.core.annotaions.HandleSortFilter; import cn.qaiu.vx.core.interceptor.AfterInterceptor; +import cn.qaiu.vx.core.model.JsonResult; +import cn.qaiu.vx.core.util.CommonUtil; import cn.qaiu.vx.core.util.SharedDataUtil; -import io.vertx.core.http.HttpServerRequest; import io.vertx.core.json.JsonArray; import io.vertx.core.json.JsonObject; +import io.vertx.ext.web.RoutingContext; +import io.vertx.jdbcclient.JDBCPool; +import io.vertx.sqlclient.templates.SqlTemplate; import lombok.extern.slf4j.Slf4j; import static cn.qaiu.vx.core.util.ConfigConstant.IGNORES_REG; + /** - * + * 记录解析日志 */ @Slf4j @HandleSortFilter(99) public class LogStatistics implements AfterInterceptor { - protected final JsonArray ignores = SharedDataUtil.getJsonArrayForCustomConfig(IGNORES_REG); - + JDBCPool client = JDBCPoolInit.instance().getPool(); + private final JsonArray ignores = SharedDataUtil.getJsonArrayForCustomConfig(IGNORES_REG); @Override - public void handle(HttpServerRequest request, JsonObject responseData) { - System.out.println("后置拦截-->" + responseData + " path:" + request.path()); + public void handle(RoutingContext ctx, JsonObject responseData) { + + // 判断是否忽略 + if (CommonUtil.matchRegList(ignores.getList(), ctx.request().path())) { + return; + } + + ParserLogInfo parserLogInfo = new ParserLogInfo(); + parserLogInfo.setPath(ctx.request().uri()); + if (responseData == null) { + String location = ctx.response().headers().get("location"); + if (location != null) { + parserLogInfo.setCode(200); + parserLogInfo.setData(location); + } else { + log.error("location不存在且responseData为空, path={}", ctx.request().path()); + } + insert(parserLogInfo); + + } else if (responseData.containsKey("code")) { + JsonResult result = JsonResult.toJsonResult(responseData); + parserLogInfo.setCode(result.getCode()); + parserLogInfo.setData(result.getCode() == 500 ? result.getMsg() : result.getData().toString()); + insert(parserLogInfo); + } else { + log.error("未知json日志: {}, path: {}", responseData.encode(), ctx.request().path()); + } + } + + void insert(ParserLogInfo info) { + SqlTemplate + .forUpdate(client, "INSERT INTO t_parser_log_info VALUES (#{id},#{logTime},#{path},#{code},#{data})") + .mapFrom(ParserLogInfo.class) + .execute(info) + .onSuccess(res -> { + log.info("inserted log: id={}, path={}, code={}", info.getId(), info.getPath(), info.getCode()); + }).onFailure(Throwable::printStackTrace); } } diff --git a/web-service/src/main/java/cn/qaiu/lz/common/model/ParserInfo.java b/web-service/src/main/java/cn/qaiu/lz/common/model/ParserInfo.java deleted file mode 100644 index 3aab398..0000000 --- a/web-service/src/main/java/cn/qaiu/lz/common/model/ParserInfo.java +++ /dev/null @@ -1,5 +0,0 @@ -package cn.qaiu.lz.common.model; - -public class ParserInfo { - -} diff --git a/web-service/src/main/java/cn/qaiu/lz/common/model/ParserLogInfo.java b/web-service/src/main/java/cn/qaiu/lz/common/model/ParserLogInfo.java new file mode 100644 index 0000000..2155d26 --- /dev/null +++ b/web-service/src/main/java/cn/qaiu/lz/common/model/ParserLogInfo.java @@ -0,0 +1,22 @@ +package cn.qaiu.lz.common.model; + +import cn.qaiu.db.ddl.Length; +import cn.qaiu.db.ddl.Table; +import cn.qaiu.lz.common.util.SnowflakeIdWorker; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.util.Date; + +@Data +@Table("t_parser_log_info") +public class ParserLogInfo { + String id = SnowflakeIdWorker.getStringId(); + @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS", timezone = "GMT+8") + Date logTime = new Date(); + String path; + Integer code; + + @Length(varcharSize = 4096) + String data; +} diff --git a/web-service/src/main/java/cn/qaiu/lz/common/util/SnowflakeIdWorker.java b/web-service/src/main/java/cn/qaiu/lz/common/util/SnowflakeIdWorker.java index 6f4b84a..fafcc4c 100644 --- a/web-service/src/main/java/cn/qaiu/lz/common/util/SnowflakeIdWorker.java +++ b/web-service/src/main/java/cn/qaiu/lz/common/util/SnowflakeIdWorker.java @@ -96,7 +96,7 @@ public class SnowflakeIdWorker { * * @return SnowflakeId */ - public synchronized long nextId() { + public synchronized Long nextId() { long timestamp = timeGen(); //如果当前时间小于上一次ID生成的时间戳,说明系统时钟回退过这个时候应当抛出异常 @@ -214,6 +214,14 @@ public class SnowflakeIdWorker { return snowflakeIdWorker; } + synchronized public static Long getLongId() { + return snowflakeIdWorker.nextId(); + } + + synchronized public static String getStringId() { + return snowflakeIdWorker.nextId().toString(); + } + synchronized public static SnowflakeIdWorker idWorkerCluster(long workerId, long datacenterId) { if (snowflakeIdWorkerCluster == null) { snowflakeIdWorkerCluster = new SnowflakeIdWorker(workerId, datacenterId); diff --git a/web-service/src/main/java/cn/qaiu/lz/web/http/ParserApi.java b/web-service/src/main/java/cn/qaiu/lz/web/http/ParserApi.java new file mode 100644 index 0000000..f0cb9ff --- /dev/null +++ b/web-service/src/main/java/cn/qaiu/lz/web/http/ParserApi.java @@ -0,0 +1,32 @@ +package cn.qaiu.lz.web.http; + + +import cn.qaiu.lz.web.model.SysUser; +import cn.qaiu.lz.web.service.DbService; +import cn.qaiu.lz.web.service.UserService; +import cn.qaiu.lz.web.model.StatisticsInfo; +import cn.qaiu.vx.core.annotaions.RouteHandler; +import cn.qaiu.vx.core.annotaions.RouteMapping; +import cn.qaiu.vx.core.enums.RouteMethod; +import cn.qaiu.vx.core.util.AsyncServiceUtil; +import io.vertx.core.Future; +import lombok.extern.slf4j.Slf4j; + +@RouteHandler(value = "/v2", order = 10) +@Slf4j +public class ParserApi { + + private final UserService userService = AsyncServiceUtil.getAsyncServiceInstance(UserService.class); + private final DbService dbService = AsyncServiceUtil.getAsyncServiceInstance(DbService.class); + + @RouteMapping(value = "/login", method = RouteMethod.POST) + public Future login(SysUser user) { + log.info("<------- login: {}", user.getUsername()); + return userService.login(user); + } + + @RouteMapping(value = "/statisticsInfo", method = RouteMethod.GET, order = 99) + public Future statisticsInfo() { + return dbService.getStatisticsInfo(); + } +} diff --git a/web-service/src/main/java/cn/qaiu/lz/web/http/ServerApi.java b/web-service/src/main/java/cn/qaiu/lz/web/http/ServerApi.java index a72c52d..9de193d 100644 --- a/web-service/src/main/java/cn/qaiu/lz/web/http/ServerApi.java +++ b/web-service/src/main/java/cn/qaiu/lz/web/http/ServerApi.java @@ -1,13 +1,10 @@ package cn.qaiu.lz.web.http; -import cn.qaiu.lz.common.parser.IPanTool; -import cn.qaiu.lz.common.parser.impl.EcTool; -import cn.qaiu.lz.web.model.SysUser; -import cn.qaiu.lz.web.service.UserService; +import cn.qaiu.parser.IPanTool; +import cn.qaiu.parser.impl.EcTool; import cn.qaiu.vx.core.annotaions.RouteHandler; import cn.qaiu.vx.core.annotaions.RouteMapping; import cn.qaiu.vx.core.enums.RouteMethod; -import cn.qaiu.vx.core.util.AsyncServiceUtil; import cn.qaiu.vx.core.util.ResponseUtil; import io.vertx.core.Future; import io.vertx.core.Promise; @@ -15,8 +12,6 @@ import io.vertx.core.http.HttpServerRequest; import io.vertx.core.http.HttpServerResponse; import lombok.extern.slf4j.Slf4j; -import static io.vertx.core.http.HttpHeaders.CONTENT_TYPE; - /** * 服务API *
Create date 2021/4/28 9:15 @@ -27,14 +22,6 @@ import static io.vertx.core.http.HttpHeaders.CONTENT_TYPE; @RouteHandler("/") public class ServerApi { - private final UserService userService = AsyncServiceUtil.getAsyncServiceInstance(UserService.class); - - @RouteMapping(value = "/login", method = RouteMethod.POST) - public Future login(SysUser user) { - log.info("<------- login: {}", user.getUsername()); - return userService.login(user); - } - @RouteMapping(value = "/parser", method = RouteMethod.GET, order = 4) public Future parse(HttpServerResponse response, HttpServerRequest request, String url, String pwd) { @@ -43,13 +30,9 @@ public class ServerApi { // 默认读取Url参数会被截断手动获取一下其他参数 url = EcTool.SHARE_URL_PREFIX + request.getParam("data"); } - try { - IPanTool.shareURLPrefixMatching(url, pwd).parse().onSuccess(resUrl -> { - ResponseUtil.redirect(response, resUrl, promise); - }).onFailure(t -> promise.fail(t.fillInStackTrace())); - } catch (Exception e) { - promise.fail(e); - } + IPanTool.shareURLPrefixMatching(url, pwd).parse().onSuccess(resUrl -> { + ResponseUtil.redirect(response, resUrl, promise); + }).onFailure(t -> promise.fail(t.fillInStackTrace())); return promise.future(); } @@ -64,7 +47,8 @@ public class ServerApi { @RouteMapping(value = "/:type/:key", method = RouteMethod.GET, order = 1) - public void parseKey(HttpServerResponse response, String type, String key) { + public Future parseKey(HttpServerResponse response, String type, String key) { + Promise promise = Promise.promise(); String code = ""; if (key.contains("@")) { String[] keys = key.split("@"); @@ -72,10 +56,10 @@ public class ServerApi { code = keys[1]; } - IPanTool.typeMatching(type, key, code).parse().onSuccess(resUrl -> ResponseUtil.redirect(response, resUrl)).onFailure(t -> { - response.putHeader(CONTENT_TYPE, "text/html;charset=utf-8"); - response.end(t.getMessage()); - }); + IPanTool.typeMatching(type, key, code).parse() + .onSuccess(resUrl -> ResponseUtil.redirect(response, resUrl, promise)) + .onFailure(t -> promise.fail(t.fillInStackTrace())); + return promise.future(); } @RouteMapping(value = "/json/:type/:key", method = RouteMethod.GET, order = 2) diff --git a/web-service/src/main/java/cn/qaiu/lz/web/model/CowUser.java b/web-service/src/main/java/cn/qaiu/lz/web/model/CowUser.java deleted file mode 100644 index a594aff..0000000 --- a/web-service/src/main/java/cn/qaiu/lz/web/model/CowUser.java +++ /dev/null @@ -1,4 +0,0 @@ -package cn.qaiu.lz.web.model; - -public class CowUser { -} diff --git a/web-service/src/main/java/cn/qaiu/lz/web/model/LzUser.java b/web-service/src/main/java/cn/qaiu/lz/web/model/LzUser.java deleted file mode 100644 index b8205b0..0000000 --- a/web-service/src/main/java/cn/qaiu/lz/web/model/LzUser.java +++ /dev/null @@ -1,4 +0,0 @@ -package cn.qaiu.lz.web.model; - -public class LzUser { -} diff --git a/web-service/src/main/java/cn/qaiu/lz/web/model/StatisticsInfo.java b/web-service/src/main/java/cn/qaiu/lz/web/model/StatisticsInfo.java new file mode 100644 index 0000000..eb198a4 --- /dev/null +++ b/web-service/src/main/java/cn/qaiu/lz/web/model/StatisticsInfo.java @@ -0,0 +1,23 @@ +package cn.qaiu.lz.web.model; + +import cn.qaiu.lz.common.ToJson; +import io.vertx.codegen.annotations.DataObject; +import io.vertx.core.json.JsonObject; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@DataObject +public class StatisticsInfo implements ToJson { + Integer fail; + Integer success; + Integer total; + + + public StatisticsInfo(JsonObject jsonObject) { + this.fail = jsonObject.getInteger("fail"); + this.success = jsonObject.getInteger("success"); + this.total = jsonObject.getInteger("total"); + } +} diff --git a/web-service/src/main/java/cn/qaiu/lz/web/model/SysUser.java b/web-service/src/main/java/cn/qaiu/lz/web/model/SysUser.java index 113d515..7ccfefc 100644 --- a/web-service/src/main/java/cn/qaiu/lz/web/model/SysUser.java +++ b/web-service/src/main/java/cn/qaiu/lz/web/model/SysUser.java @@ -4,22 +4,20 @@ import cn.qaiu.db.ddl.Table; import cn.qaiu.lz.common.ToJson; import io.vertx.codegen.annotations.DataObject; import io.vertx.core.json.JsonObject; -import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @Data -@NoArgsConstructor -@AllArgsConstructor @DataObject +@NoArgsConstructor @Table("t_user") public class SysUser implements ToJson { private String id; - private String username; private String password; public SysUser(JsonObject json) { + this.id = json.getString("id"); this.username = json.getString("username"); this.password = json.getString("password"); } diff --git a/web-service/src/main/java/cn/qaiu/lz/web/service/DbService.java b/web-service/src/main/java/cn/qaiu/lz/web/service/DbService.java index b514f72..cde3827 100644 --- a/web-service/src/main/java/cn/qaiu/lz/web/service/DbService.java +++ b/web-service/src/main/java/cn/qaiu/lz/web/service/DbService.java @@ -1,6 +1,7 @@ package cn.qaiu.lz.web.service; import cn.qaiu.lz.common.model.UserInfo; +import cn.qaiu.lz.web.model.StatisticsInfo; import cn.qaiu.vx.core.base.BaseAsyncService; import io.vertx.codegen.annotations.ProxyGen; import io.vertx.core.Future; @@ -16,4 +17,6 @@ import io.vertx.core.json.JsonObject; public interface DbService extends BaseAsyncService { Future sayOk(String data); Future sayOk2(String data, UserInfo holder); + + Future getStatisticsInfo(); } diff --git a/web-service/src/main/java/cn/qaiu/lz/web/service/UserService.java b/web-service/src/main/java/cn/qaiu/lz/web/service/UserService.java index ae25cf9..b355a25 100644 --- a/web-service/src/main/java/cn/qaiu/lz/web/service/UserService.java +++ b/web-service/src/main/java/cn/qaiu/lz/web/service/UserService.java @@ -13,5 +13,5 @@ import io.vertx.core.Future; */ @ProxyGen public interface UserService extends BaseAsyncService { - Future login(SysUser user); + Future login(SysUser user); } diff --git a/web-service/src/main/java/cn/qaiu/lz/web/service/impl/DbServiceImpl.java b/web-service/src/main/java/cn/qaiu/lz/web/service/impl/DbServiceImpl.java index dfd102a..c2f4f2e 100644 --- a/web-service/src/main/java/cn/qaiu/lz/web/service/impl/DbServiceImpl.java +++ b/web-service/src/main/java/cn/qaiu/lz/web/service/impl/DbServiceImpl.java @@ -1,13 +1,20 @@ package cn.qaiu.lz.web.service.impl; +import cn.qaiu.db.pool.JDBCPoolInit; import cn.qaiu.lz.common.model.UserInfo; import cn.qaiu.lz.web.service.DbService; +import cn.qaiu.lz.web.model.StatisticsInfo; import cn.qaiu.vx.core.annotaions.Service; import cn.qaiu.vx.core.model.JsonResult; import io.vertx.core.Future; +import io.vertx.core.Promise; import io.vertx.core.json.JsonObject; +import io.vertx.jdbcclient.JDBCPool; +import io.vertx.sqlclient.templates.SqlTemplate; import lombok.extern.slf4j.Slf4j; +import java.util.HashMap; + /** * lz-web *
Create date 2021/7/12 17:26 @@ -35,4 +42,25 @@ public class DbServiceImpl implements DbService { // log.info("--> {}", holder.toString()); return Future.succeededFuture(JsonObject.mapFrom(JsonResult.data("Hi: " + data))); } + + @Override + public Future getStatisticsInfo() { + JDBCPool client = JDBCPoolInit.instance().getPool(); + Promise promise = Promise.promise(); + String sql = """ + select COUNT(CASE "code" WHEN 500 THEN "code" END ) "fail", + COUNT(CASE "code" WHEN 200 THEN "code" END ) "success", + count(1) "total" + from "t_parser_log_info" + """; + SqlTemplate.forQuery(client, sql).mapTo(StatisticsInfo.class).execute(new HashMap<>()).onSuccess(row -> { + StatisticsInfo info; + if ((info = row.iterator().next()) != null) { + promise.complete(info); + } else { + promise.fail("t_parser_log_info查询为空"); + } + }).onFailure(promise::fail); + return promise.future(); + } } diff --git a/web-service/src/main/java/cn/qaiu/lz/web/service/impl/UserServiceImpl.java b/web-service/src/main/java/cn/qaiu/lz/web/service/impl/UserServiceImpl.java index 1841eed..45de354 100644 --- a/web-service/src/main/java/cn/qaiu/lz/web/service/impl/UserServiceImpl.java +++ b/web-service/src/main/java/cn/qaiu/lz/web/service/impl/UserServiceImpl.java @@ -17,13 +17,13 @@ import java.util.concurrent.TimeUnit; public class UserServiceImpl implements UserService { @Override - public Future login(SysUser user) { + public Future login(SysUser user) { try { - TimeUnit.SECONDS.sleep(6); + TimeUnit.SECONDS.sleep(2); } catch (InterruptedException e) { throw new RuntimeException(e); } - return Future.succeededFuture("111"); + return Future.succeededFuture(user); } } diff --git a/web-service/src/main/resources/app-dev.yml b/web-service/src/main/resources/app-dev.yml index a232568..4cdf968 100644 --- a/web-service/src/main/resources/app-dev.yml +++ b/web-service/src/main/resources/app-dev.yml @@ -5,7 +5,7 @@ server: # 使用静态页面 enableStaticHtmlService: false # 使用数据库 - enableDatabase: false + enableDatabase: true staticResourcePath: webroot/ # 反向代理服务器配置路径(不用加后缀) proxyConf: server-proxy @@ -22,11 +22,9 @@ custom: baseLocations: cn.qaiu.lz # 路由处理默认超时时间(毫秒) routeTimeOut: 15000 - # 拦截器包路径 - interceptorClassPath: cn.qaiu.lz.common.interceptorImpl.DefaultInterceptor # 拦截器匹配规则 ignoresReg: - - .*/login$ + - /v2/statisticsInfo - .*/test.*$ # 参数注入的实体类包路径匹配正则 (防止同名类引发歧义) @@ -37,11 +35,7 @@ custom: # 数据源配置 dataSource: provider_class: io.vertx.ext.jdbc.spi.impl.HikariCPDataSourceProvider - jdbcUrl: jdbc:h2:tcp://127.0.0.1:9095/./db/myData;MODE=MySQL;DATABASE_TO_LOWER=FALSE + jdbcUrl: jdbc:h2:tcp://127.0.0.1:9095/./db/myData;MODE=MySQL;DATABASE_TO_UPPER=FALSE driverClassName: org.h2.Driver username: root password: '123456' - tableClassPath: cn.qaiu.lz.web.model - -cowConfig: - config: '111' diff --git a/web-service/src/main/resources/app.yml b/web-service/src/main/resources/app.yml index b003617..f128143 100644 --- a/web-service/src/main/resources/app.yml +++ b/web-service/src/main/resources/app.yml @@ -1,6 +1,6 @@ # 要激活的配置: dev--连接本地数据库; prod连接线上数据库 active: dev # 版本号 -version_app: 0.1.6 +version_app: 0.1.7 # 公司名称 -> LOGO版权文字 copyright: QAIU diff --git a/web-service/src/main/resources/http-tools/test.http b/web-service/src/main/resources/http-tools/test.http index c2ddd74..9167792 100644 --- a/web-service/src/main/resources/http-tools/test.http +++ b/web-service/src/main/resources/http-tools/test.http @@ -98,6 +98,8 @@ GET http://127.0.0.1:6400/ye/iaKtVv-qOECd GET http://127.0.0.1:6400/parser?url=https://www.123pan.com/s/iaKtVv-6OECd.html&pwd=DcGe ### -POST http://127.0.0.1:6400/login +GET http://127.0.0.1:6400/v2/statisticsInfo +### +POST http://127.0.0.1:6400/v2/login?username=asd diff --git a/web-service/src/test/java/cn/qaiu/vx/core/util/ParamUtilTest.java b/web-service/src/test/java/cn/qaiu/vx/core/util/ParamUtilTest.java new file mode 100644 index 0000000..eedae1a --- /dev/null +++ b/web-service/src/test/java/cn/qaiu/vx/core/util/ParamUtilTest.java @@ -0,0 +1,15 @@ +package cn.qaiu.vx.core.util; + +import org.junit.Test; + +import static org.junit.Assert.*; + +public class ParamUtilTest { + + @Test + public void paramsToMap() { + System.out.println(ParamUtil.paramsToMap("")); + System.out.println(ParamUtil.paramsToMap("a=asd&d=23")); + System.out.println(ParamUtil.paramsToMap("asdasd&dd")); + } +} diff --git a/web-service/src/test/java/cn/qaiu/web/test/Test02.java b/web-service/src/test/java/cn/qaiu/web/test/Test02.java index c5f8ec9..39b1edd 100644 --- a/web-service/src/test/java/cn/qaiu/web/test/Test02.java +++ b/web-service/src/test/java/cn/qaiu/web/test/Test02.java @@ -10,6 +10,7 @@ import javassist.bytecode.LocalVariableAttribute; import javassist.bytecode.MethodInfo; import org.junit.Test; +import java.time.LocalDateTime; import java.util.LinkedHashMap; import java.util.Map; @@ -82,4 +83,14 @@ public class Test02 { System.out.println(map); } + + + @Test + public void test4() { + LocalDateTime parse = LocalDateTime.parse((String) "2022-01-01T11:22:00"); + System.out.println(parse); + + } + + }