mirror of
https://github.com/qaiu/netdisk-fast-download.git
synced 2026-01-11 17:04:13 +00:00
- Fix BUG1: JavaScript timeout with proper thread interruption using ScheduledExecutorService - Fix BUG2: Add URL regex validation before execution in playground test API - Fix BUG3: Register published parsers to CustomParserRegistry on save/update/delete - Remove TypeScript compiler functionality (tsCompiler.js, dependencies, UI) - Add password authentication for playground access - Add mobile responsive layout support - Load playground parsers on application startup
144 lines
5.6 KiB
Java
144 lines
5.6 KiB
Java
package cn.qaiu.lz;
|
|
|
|
import cn.qaiu.WebClientVertxInit;
|
|
import cn.qaiu.db.pool.JDBCPoolInit;
|
|
import cn.qaiu.lz.common.cache.CacheConfigLoader;
|
|
import cn.qaiu.lz.common.interceptorImpl.RateLimiter;
|
|
import cn.qaiu.lz.web.config.PlaygroundConfig;
|
|
import cn.qaiu.lz.web.service.DbService;
|
|
import cn.qaiu.parser.custom.CustomParserConfig;
|
|
import cn.qaiu.parser.custom.CustomParserRegistry;
|
|
import cn.qaiu.parser.customjs.JsScriptMetadataParser;
|
|
import cn.qaiu.vx.core.Deploy;
|
|
import cn.qaiu.vx.core.util.AsyncServiceUtil;
|
|
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.JsonArray;
|
|
import io.vertx.core.json.JsonObject;
|
|
import io.vertx.core.json.jackson.DatabindCodec;
|
|
import io.vertx.core.shareddata.LocalMap;
|
|
import lombok.extern.slf4j.Slf4j;
|
|
import org.apache.commons.lang3.time.DateFormatUtils;
|
|
|
|
import java.util.Date;
|
|
|
|
import static cn.qaiu.vx.core.util.ConfigConstant.LOCAL;
|
|
|
|
|
|
/**
|
|
* vertx程序入口
|
|
*
|
|
* <br>Create date 2021-05-08 13:00:01
|
|
* @author qaiu yyzy
|
|
*/
|
|
@Slf4j
|
|
public class AppMain {
|
|
|
|
public static void main(String[] args) {
|
|
// start
|
|
Deploy.instance().start(args, AppMain::exec);
|
|
}
|
|
|
|
/**
|
|
* 框架回调方法
|
|
* 初始化数据库/缓存等
|
|
*
|
|
* @param jsonObject 配置
|
|
*/
|
|
private static void exec(JsonObject jsonObject) {
|
|
WebClientVertxInit.init(VertxHolder.getVertxInstance());
|
|
DatabindCodec.mapper().registerModule(new JavaTimeModule());
|
|
// 限流
|
|
if (jsonObject.containsKey("rateLimit")) {
|
|
JsonObject rateLimit = jsonObject.getJsonObject("rateLimit");
|
|
RateLimiter.init(rateLimit);
|
|
}
|
|
// 数据库
|
|
if (jsonObject.getJsonObject(ConfigConstant.SERVER).getBoolean("enableDatabase")) {
|
|
JDBCPoolInit.builder().config(jsonObject.getJsonObject("dataSource"))
|
|
.build()
|
|
.initPool().onSuccess(PreparedStatement -> {
|
|
VertxHolder.getVertxInstance().setTimer(1000, id -> {
|
|
System.out.println(DateFormatUtils.format(new Date(), "yyyy-MM-dd HH:mm:ss.SSS"));
|
|
System.out.println("数据库连接成功");
|
|
|
|
// 加载演练场解析器
|
|
loadPlaygroundParsers();
|
|
|
|
String addr = jsonObject.getJsonObject(ConfigConstant.SERVER).getString("domainName");
|
|
System.out.println("启动成功: \n本地服务地址: " + addr);
|
|
});
|
|
});
|
|
}
|
|
// 缓存
|
|
if (jsonObject.containsKey(ConfigConstant.CACHE)) {
|
|
CacheConfigLoader.init(jsonObject.getJsonObject(ConfigConstant.CACHE));
|
|
}
|
|
|
|
LocalMap<Object, Object> localMap = VertxHolder.getVertxInstance().sharedData().getLocalMap(LOCAL);
|
|
// 代理
|
|
if (jsonObject.containsKey(ConfigConstant.PROXY)) {
|
|
JsonArray proxyJsonArray = jsonObject.getJsonArray(ConfigConstant.PROXY);
|
|
if (proxyJsonArray != null) {
|
|
JsonObject jsonObject1 = new JsonObject();
|
|
proxyJsonArray.forEach(proxyJson -> {
|
|
String panTypes = ((JsonObject)proxyJson).getString("panTypes");
|
|
|
|
if (!panTypes.isEmpty()) {
|
|
for (String s : panTypes.split(",")) {
|
|
jsonObject1.put(s, proxyJson);
|
|
}
|
|
}
|
|
});
|
|
localMap.put("proxy", jsonObject1);
|
|
}
|
|
}
|
|
|
|
// 认证
|
|
if (jsonObject.containsKey(ConfigConstant.AUTHS)) {
|
|
JsonObject auths = jsonObject.getJsonObject(ConfigConstant.AUTHS);
|
|
localMap.put(ConfigConstant.AUTHS, auths);
|
|
}
|
|
|
|
// 演练场配置
|
|
PlaygroundConfig.loadFromJson(jsonObject);
|
|
}
|
|
|
|
/**
|
|
* 在启动时加载所有已发布的演练场解析器
|
|
*/
|
|
private static void loadPlaygroundParsers() {
|
|
DbService dbService = AsyncServiceUtil.getAsyncServiceInstance(DbService.class);
|
|
|
|
dbService.getPlaygroundParserList().onSuccess(result -> {
|
|
JsonArray parsers = result.getJsonArray("data");
|
|
if (parsers != null) {
|
|
int loadedCount = 0;
|
|
for (int i = 0; i < parsers.size(); i++) {
|
|
JsonObject parser = parsers.getJsonObject(i);
|
|
|
|
// 只注册已启用的解析器
|
|
if (parser.getBoolean("enabled", false)) {
|
|
try {
|
|
String jsCode = parser.getString("jsCode");
|
|
CustomParserConfig config = JsScriptMetadataParser.parseScript(jsCode);
|
|
CustomParserRegistry.register(config);
|
|
loadedCount++;
|
|
log.info("已加载演练场解析器: {} ({})",
|
|
config.getDisplayName(), config.getType());
|
|
} catch (Exception e) {
|
|
log.error("加载演练场解析器失败: {}", parser.getString("name"), e);
|
|
}
|
|
}
|
|
}
|
|
log.info("演练场解析器加载完成,共加载 {} 个解析器", loadedCount);
|
|
} else {
|
|
log.info("未找到已发布的演练场解析器");
|
|
}
|
|
}).onFailure(e -> {
|
|
log.error("加载演练场解析器列表失败", e);
|
|
});
|
|
}
|
|
}
|