diff --git a/parser/src/main/java/cn/qaiu/parser/customjs/JsPlaygroundLogger.java b/parser/src/main/java/cn/qaiu/parser/customjs/JsPlaygroundLogger.java
index a6b2acd..f442e64 100644
--- a/parser/src/main/java/cn/qaiu/parser/customjs/JsPlaygroundLogger.java
+++ b/parser/src/main/java/cn/qaiu/parser/customjs/JsPlaygroundLogger.java
@@ -4,6 +4,9 @@ import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
/**
* 演练场日志收集器
* 收集JavaScript执行过程中的日志信息
@@ -12,8 +15,11 @@ import java.util.List;
* @author QAIU
*/
public class JsPlaygroundLogger {
-
+
+ private static final Logger log = LoggerFactory.getLogger(JsPlaygroundLogger.class);
+
// 使用线程安全的列表
+ private static final int MAX_LOG_SIZE = 1000;
private final List logs = Collections.synchronizedList(new ArrayList<>());
/**
@@ -59,6 +65,18 @@ public class JsPlaygroundLogger {
return obj.toString();
}
+ /**
+ * 添加日志条目,超过最大容量时移除最早的条目
+ */
+ private void addLog(LogEntry entry) {
+ synchronized (logs) {
+ if (logs.size() >= MAX_LOG_SIZE) {
+ logs.remove(0);
+ }
+ logs.add(entry);
+ }
+ }
+
/**
* 记录日志(内部方法)
* @param level 日志级别
@@ -67,8 +85,8 @@ public class JsPlaygroundLogger {
*/
private void log(String level, Object message, String source) {
String msg = toString(message);
- logs.add(new LogEntry(level, msg, source));
- System.out.println("[" + source + "PlaygroundLogger] " + level + ": " + msg);
+ addLog(new LogEntry(level, msg, source));
+ log.debug("[{}PlaygroundLogger] {}: {}", source, level, msg);
}
/**
@@ -111,8 +129,8 @@ public class JsPlaygroundLogger {
if (throwable != null) {
msg = msg + ": " + throwable.getMessage();
}
- logs.add(new LogEntry("ERROR", msg, "JS"));
- System.out.println("[JSPlaygroundLogger] ERROR: " + msg);
+ addLog(new LogEntry("ERROR", msg, "JS"));
+ log.debug("[JSPlaygroundLogger] ERROR: {}", msg);
}
// ===== 以下是供Java层调用的内部方法 =====
@@ -153,8 +171,8 @@ public class JsPlaygroundLogger {
if (throwable != null) {
msg = msg + ": " + throwable.getMessage();
}
- logs.add(new LogEntry("ERROR", msg, "JAVA"));
- System.out.println("[JAVAPlaygroundLogger] ERROR: " + msg);
+ addLog(new LogEntry("ERROR", msg, "JAVA"));
+ log.debug("[JAVAPlaygroundLogger] ERROR: {}", msg);
}
/**
diff --git a/parser/src/main/java/cn/qaiu/parser/customjs/JsScriptLoader.java b/parser/src/main/java/cn/qaiu/parser/customjs/JsScriptLoader.java
index d66b106..a3d665f 100644
--- a/parser/src/main/java/cn/qaiu/parser/customjs/JsScriptLoader.java
+++ b/parser/src/main/java/cn/qaiu/parser/customjs/JsScriptLoader.java
@@ -139,21 +139,20 @@ public class JsScriptLoader {
try {
String jarPath = jarUrl.getPath().substring(5, jarUrl.getPath().indexOf("!"));
- JarFile jarFile = new JarFile(jarPath);
-
- Enumeration entries = jarFile.entries();
- while (entries.hasMoreElements()) {
- JarEntry entry = entries.nextElement();
- String entryName = entry.getName();
-
- if (entryName.startsWith(RESOURCE_PATH + "/") &&
- entryName.endsWith(".js") &&
- !isExcludedFile(entryName.substring(entryName.lastIndexOf('/') + 1))) {
- resourceFiles.add(entryName);
+
+ try (JarFile jarFile = new JarFile(jarPath)) {
+ Enumeration entries = jarFile.entries();
+ while (entries.hasMoreElements()) {
+ JarEntry entry = entries.nextElement();
+ String entryName = entry.getName();
+
+ if (entryName.startsWith(RESOURCE_PATH + "/") &&
+ entryName.endsWith(".js") &&
+ !isExcludedFile(entryName.substring(entryName.lastIndexOf('/') + 1))) {
+ resourceFiles.add(entryName);
+ }
}
}
-
- jarFile.close();
} catch (Exception e) {
log.debug("解析JAR包资源文件失败", e);
}
diff --git a/parser/src/main/java/cn/qaiu/parser/impl/MkgsTool.java b/parser/src/main/java/cn/qaiu/parser/impl/MkgsTool.java
index 1182c9f..cb01165 100644
--- a/parser/src/main/java/cn/qaiu/parser/impl/MkgsTool.java
+++ b/parser/src/main/java/cn/qaiu/parser/impl/MkgsTool.java
@@ -86,10 +86,10 @@ public class MkgsTool extends PanBase {
// 查找并输出 hash 字段的值
if (matcher.find()) {
String hashValue = matcher.group(1); // 获取第一个捕获组
- System.out.println(hashValue);
+ log.debug("hash: {}", hashValue);
client.getAbs(UriTemplate.of(API_URL)).setTemplateParam("hash", hashValue).send().onSuccess(res3 -> {
JsonObject jsonObject = asJson(res3);
- System.out.println(jsonObject.encodePrettily());
+ log.debug("API response: {}", jsonObject.encodePrettily());
if (jsonObject.containsKey("url")) {
promise.complete(jsonObject.getString("url"));
} else {
diff --git a/parser/src/main/java/cn/qaiu/parser/impl/PodTool.java b/parser/src/main/java/cn/qaiu/parser/impl/PodTool.java
index 042e1ec..c8d8c0f 100644
--- a/parser/src/main/java/cn/qaiu/parser/impl/PodTool.java
+++ b/parser/src/main/java/cn/qaiu/parser/impl/PodTool.java
@@ -129,7 +129,7 @@ public class PodTool extends PanBase {
if (urlMatcher.find()) {
String url = urlMatcher.group("url");
- System.out.println("URL: " + url);
+ log.debug("URL: {}", url);
return url;
}
throw new RuntimeException("URL匹配失败");
@@ -172,7 +172,7 @@ public class PodTool extends PanBase {
if (tokenMatcher.find()) {
String token = tokenMatcher.group(1);
- System.out.println("Token: " + token);
+ log.debug("Token: {}***", token.length() > 4 ? token.substring(0, 4) : "***");
return token;
}
throw new RuntimeException("token匹配失败");
@@ -198,8 +198,8 @@ public class PodTool extends PanBase {
// 发送请求并处理响应
client.sendAsync(request, HttpResponse.BodyHandlers.ofString())
.thenApply(response -> {
- System.out.println("Response Status Code: " + response.statusCode());
- System.out.println("Response Body: " + response.body());
+ log.debug("Response Status Code: {}", response.statusCode());
+ log.debug("Response Body: {}", response.body());
promise.complete(response.body());
return null;
});
diff --git a/parser/src/main/java/cn/qaiu/parser/impl/WsTool.java b/parser/src/main/java/cn/qaiu/parser/impl/WsTool.java
index e10c9dd..d7b0f51 100644
--- a/parser/src/main/java/cn/qaiu/parser/impl/WsTool.java
+++ b/parser/src/main/java/cn/qaiu/parser/impl/WsTool.java
@@ -67,11 +67,7 @@ public class WsTool extends PanBase {
String filepid = asJson(res2).getJsonObject("data").getString("ufileid"); // 文件夹pid
String filebid = asJson(res2).getJsonObject("data").getString("boxid"); // 文件夹bid
- // 调试输出文件夹信息
- System.out.println("文件夹期限: " + filetime);
- System.out.println("文件夹大小: " + filesize);
- System.out.println("文件夹pid: " + filepid);
- System.out.println("文件夹bid: " + filebid);
+ log.debug("文件夹期限: {}, 大小: {}, pid: {}, bid: {}", filetime, filesize, filepid, filebid);
// 获取文件信息
httpClient.postAbs(SHARE_URL_API + "ufile/list").putHeaders(headers)
@@ -97,9 +93,7 @@ public class WsTool extends PanBase {
String filefid = asJson(res3).getJsonObject("data")
.getJsonArray("fileList").getJsonObject(0).getString("fid"); // 文件fid
- // 调试输出文件信息
- System.out.println("文件名称: " + filename);
- System.out.println("文件fid: " + filefid);
+ log.debug("文件名称: {}, fid: {}", filename, filefid);
// 检查文件是否失效
httpClient.postAbs(SHARE_URL_API + "dl/sign").putHeaders(headers)
@@ -114,8 +108,7 @@ public class WsTool extends PanBase {
// 获取直链
String fileurl = asJson(res4).getJsonObject("data").getString("url");
- // 调试输出文件直链
- System.out.println("文件直链: " + fileurl);
+ log.debug("文件直链: {}", fileurl);
if (!fileurl.equals("")) {
promise.complete(URLDecoder.decode(fileurl, StandardCharsets.UTF_8));
diff --git a/parser/src/main/java/cn/qaiu/util/IpExtractor.java b/parser/src/main/java/cn/qaiu/util/IpExtractor.java
index f8bc7ea..186a8cd 100644
--- a/parser/src/main/java/cn/qaiu/util/IpExtractor.java
+++ b/parser/src/main/java/cn/qaiu/util/IpExtractor.java
@@ -5,6 +5,8 @@ import io.vertx.core.Vertx;
import io.vertx.core.http.impl.headers.HeadersMultiMap;
import io.vertx.ext.web.client.WebClient;
import io.vertx.ext.web.client.WebClientSession;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import java.util.HashMap;
import java.util.Map;
@@ -15,6 +17,8 @@ import java.util.ArrayList;
import java.util.List;
public class IpExtractor {
+ private static final Logger log = LoggerFactory.getLogger(IpExtractor.class);
+
public static void main(String[] args) throws InterruptedException {
@@ -42,9 +46,9 @@ public class IpExtractor {
WebClient client = WebClient.create(Vertx.vertx());
WebClientSession webClientSession = WebClientSession.create(client);
webClientSession.getAbs("https://ip.ihuan.me").putHeaders(headers).send().onSuccess(res->{
- System.out.println(res.toString());
+ log.debug("response: {}", res.toString());
webClientSession.getAbs("https://ip.ihuan.me").putHeaders(headers).send().onSuccess(res2->{
- System.out.println(res2.toString());
+ log.debug("response2: {}", res2.toString());
});
});
diff --git a/parser/src/main/java/cn/qaiu/util/ReqIpUtil.java b/parser/src/main/java/cn/qaiu/util/ReqIpUtil.java
index 84384ce..bfaab33 100644
--- a/parser/src/main/java/cn/qaiu/util/ReqIpUtil.java
+++ b/parser/src/main/java/cn/qaiu/util/ReqIpUtil.java
@@ -8,15 +8,19 @@ import io.vertx.core.http.impl.headers.HeadersMultiMap;
import io.vertx.ext.web.client.HttpResponse;
import io.vertx.ext.web.client.WebClient;
import io.vertx.ext.web.client.WebClientSession;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
public class ReqIpUtil {
- public static String BASE_URL = "https://ip.ihuan.me";
- public static String BASE_URL_TEMPLATE = BASE_URL + "/{path}";
+ private static final Logger log = LoggerFactory.getLogger(ReqIpUtil.class);
+
+ public static final String BASE_URL = "https://ip.ihuan.me";
+ public static final String BASE_URL_TEMPLATE = BASE_URL + "/{path}";
// GET https://ip.ihuan.me/mouse.do -> $("input[name='key']").val("30b4975b5547fed806bd2b9caa18485a");
- public static String PATH1 = "mouse.do";
+ public static final String PATH1 = "mouse.do";
- public static String PATH2 = "tqdl.html";
+ public static final String PATH2 = "tqdl.html";
// 创建请求头Map
static MultiMap headers = new HeadersMultiMap();
@@ -58,15 +62,15 @@ public class ReqIpUtil {
void next(AsyncResult> response) {
if (response.failed()) {
- response.cause().printStackTrace();
+ log.error("请求失败", response.cause());
} else {
HttpResponse res = response.result();
- System.out.println("Received response with status code " + res.statusCode());
- System.out.println("Body: " + res.body());
+ log.debug("Received response with status code {}", res.statusCode());
+ log.debug("Body: {}", res.body());
webClientSession.getAbs(BASE_URL_TEMPLATE).setTemplateParam("path", PATH1)
.putHeaders(headers) // 将请求头Map添加到请求中
.send(response2 -> {
- System.out.println(response2.result().bodyAsString());
+ log.debug("response2: {}", response2.result().bodyAsString());
});
}
diff --git a/web-front/src/utils/api.js b/web-front/src/utils/api.js
deleted file mode 100644
index a44b387..0000000
--- a/web-front/src/utils/api.js
+++ /dev/null
@@ -1,125 +0,0 @@
-import axios from 'axios'
-
-// 创建 axios 实例
-const api = axios.create({
- baseURL: process.env.VUE_APP_API_BASE_URL || 'http://localhost:6400',
- timeout: 30000,
- headers: {
- 'Content-Type': 'application/json'
- }
-})
-
-// 请求拦截器
-api.interceptors.request.use(
- config => {
- // 可以在这里添加认证token等
- return config
- },
- error => {
- return Promise.reject(error)
- }
-)
-
-// 响应拦截器
-api.interceptors.response.use(
- response => {
- return response.data
- },
- error => {
- console.error('API请求错误:', error)
-
- if (error.response) {
- // 服务器返回错误状态码
- const message = error.response.data?.message || error.response.data?.error || '服务器错误'
- return Promise.reject(new Error(message))
- } else if (error.request) {
- // 网络错误
- return Promise.reject(new Error('网络连接失败,请检查网络设置'))
- } else {
- // 其他错误
- return Promise.reject(new Error(error.message || '请求失败'))
- }
- }
-)
-
-// 客户端链接 API
-export const clientLinksApi = {
- /**
- * 获取所有客户端下载链接
- * @param {string} shareUrl - 分享链接
- * @param {string} password - 提取码(可选)
- * @returns {Promise} 客户端链接响应
- */
- async getClientLinks(shareUrl, password = '') {
- const params = new URLSearchParams()
- params.append('url', shareUrl)
- if (password) {
- params.append('pwd', password)
- }
-
- return await api.get(`/v2/clientLinks?${params.toString()}`)
- },
-
- /**
- * 获取指定类型的客户端下载链接
- * @param {string} shareUrl - 分享链接
- * @param {string} password - 提取码(可选)
- * @param {string} clientType - 客户端类型
- * @returns {Promise} 指定类型的客户端链接
- */
- async getClientLink(shareUrl, password = '', clientType) {
- const params = new URLSearchParams()
- params.append('url', shareUrl)
- if (password) {
- params.append('pwd', password)
- }
- params.append('clientType', clientType)
-
- return await api.get(`/v2/clientLink?${params.toString()}`)
- }
-}
-
-// 其他 API(如果需要的话)
-export const parserApi = {
- /**
- * 解析分享链接
- * @param {string} shareUrl - 分享链接
- * @param {string} password - 提取码(可选)
- * @returns {Promise} 解析结果
- */
- async parseLink(shareUrl, password = '') {
- const params = new URLSearchParams()
- params.append('url', shareUrl)
- if (password) {
- params.append('pwd', password)
- }
-
- return await api.get(`/v2/linkInfo?${params.toString()}`)
- },
-
- /**
- * 获取文件列表
- * @param {string} shareUrl - 分享链接
- * @param {string} password - 提取码(可选)
- * @param {string} dirId - 目录ID(可选)
- * @param {string} uuid - UUID(可选)
- * @returns {Promise} 文件列表
- */
- async getFileList(shareUrl, password = '', dirId = '', uuid = '') {
- const params = new URLSearchParams()
- params.append('url', shareUrl)
- if (password) {
- params.append('pwd', password)
- }
- if (dirId) {
- params.append('dirId', dirId)
- }
- if (uuid) {
- params.append('uuid', uuid)
- }
-
- return await api.get(`/v2/getFileList?${params.toString()}`)
- }
-}
-
-export default api
diff --git a/web-front/src/utils/constants.js b/web-front/src/utils/constants.js
new file mode 100644
index 0000000..e53920e
--- /dev/null
+++ b/web-front/src/utils/constants.js
@@ -0,0 +1,6 @@
+/**
+ * 前端全局常量
+ */
+
+/** 预览服务基础 URL */
+export const PREVIEW_BASE_URL = 'https://nfd-parser.github.io/nfd-preview/preview.html?src='
diff --git a/web-front/src/utils/downloaderService.js b/web-front/src/utils/downloaderService.js
index 9576544..911f2a3 100644
--- a/web-front/src/utils/downloaderService.js
+++ b/web-front/src/utils/downloaderService.js
@@ -410,7 +410,6 @@ function addThunderDownload(tasks, config) {
if (userAgent) taskParam.userAgent = userAgent
taskParam.threadCount = '1'
- console.log('[Thunder SDK] newTask params:', JSON.stringify(taskParam))
window.thunderLink.newTask(taskParam)
return Promise.resolve('thunder-ok')
}
diff --git a/web-front/src/utils/monacoTypes.js b/web-front/src/utils/monacoTypes.js
index 5c863f2..833d043 100644
--- a/web-front/src/utils/monacoTypes.js
+++ b/web-front/src/utils/monacoTypes.js
@@ -313,7 +313,6 @@ export async function loadTypesFromApi(monaco) {
cachedContent,
'file:///types.js'
);
- console.log('从缓存加载types.js成功');
// 异步更新缓存
updateTypesJsCache();
return;
@@ -334,7 +333,6 @@ export async function loadTypesFromApi(monaco) {
typesJsContent,
'file:///types.js'
);
- console.log('加载types.js成功并已缓存');
}
} catch (error) {
console.warn('加载types.js失败,使用内置类型定义:', error);
@@ -350,7 +348,6 @@ async function updateTypesJsCache() {
if (response.ok) {
const typesJsContent = await response.text();
localStorage.setItem('playground_types_js', typesJsContent);
- console.log('types.js缓存已更新');
}
} catch (error) {
console.warn('更新types.js缓存失败:', error);
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 18dc3be..628bc5e 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
@@ -48,6 +48,6 @@ public class LogStatistics implements AfterInterceptor {
.execute(info)
.onSuccess(res -> {
log.info("inserted log: id={}, path={}, code={}", info.getId(), info.getPath(), info.getCode());
- }).onFailure(Throwable::printStackTrace);
+ }).onFailure(e -> log.error("插入解析日志失败: id={}", info.getId(), e));
}
}
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 0d1ee25..4d8584a 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
@@ -42,12 +42,11 @@ public class DbServiceImpl implements DbService {
@Override
public Future sayOk(String data) {
log.info("say ok1 -> wait...");
- try {
- Thread.sleep(4000);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- return Future.succeededFuture(JsonObject.mapFrom(JsonResult.data("Hi: " + data)));
+ Promise promise = Promise.promise();
+ cn.qaiu.vx.core.util.VertxHolder.getVertxInstance().setTimer(4000, id -> {
+ promise.complete(JsonObject.mapFrom(JsonResult.data("Hi: " + data)));
+ });
+ return promise.future();
}
@Override
diff --git a/web-service/src/test/java/cn/qaiu/lz/web/controller/ParserApiClientLinkTest.java b/web-service/src/test/java/cn/qaiu/lz/web/controller/ParserApiClientLinkTest.java
deleted file mode 100644
index 0519ecb..0000000
--- a/web-service/src/test/java/cn/qaiu/lz/web/controller/ParserApiClientLinkTest.java
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file