mirror of
https://github.com/qaiu/netdisk-fast-download.git
synced 2026-02-24 22:25:22 +00:00
1. 添加缓存
2. 优化解析架构 3. 优化核心模块
This commit is contained in:
37
web-service/src/main/java/cn/qaiu/lz/common/cache/CacheConfigLoader.java
vendored
Normal file
37
web-service/src/main/java/cn/qaiu/lz/common/cache/CacheConfigLoader.java
vendored
Normal file
@@ -0,0 +1,37 @@
|
||||
package cn.qaiu.lz.common.cache;
|
||||
|
||||
import cn.qaiu.parser.PanDomainTemplate;
|
||||
import io.vertx.core.json.JsonObject;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* @author <a href="https://qaiu.top">QAIU</a>
|
||||
* @date 2024/9/12 7:38
|
||||
*/
|
||||
public class CacheConfigLoader {
|
||||
private static final Map<String, Integer> CONFIGS = new HashMap<>();
|
||||
public static String TYPE;
|
||||
public static Integer DEFAULT_DURATION;
|
||||
|
||||
public static void init(JsonObject config) {
|
||||
TYPE = config.getString("type");
|
||||
Integer defaultDuration = config.getInteger("defaultDuration");
|
||||
DEFAULT_DURATION = defaultDuration == null ? 60 : defaultDuration;
|
||||
config.getJsonObject("duration").getMap().forEach((k,v) -> {
|
||||
if (v == null) {
|
||||
CONFIGS.put(k, DEFAULT_DURATION);
|
||||
} else {
|
||||
CONFIGS.put(k, (Integer) v);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public static Integer getDuration(PanDomainTemplate pdt) {
|
||||
return CONFIGS.get(pdt.getShortName());
|
||||
}
|
||||
public static Integer getDuration(String shortName) {
|
||||
return CONFIGS.get(shortName);
|
||||
}
|
||||
}
|
||||
52
web-service/src/main/java/cn/qaiu/lz/common/cache/CacheManager.java
vendored
Normal file
52
web-service/src/main/java/cn/qaiu/lz/common/cache/CacheManager.java
vendored
Normal file
@@ -0,0 +1,52 @@
|
||||
package cn.qaiu.lz.common.cache;
|
||||
|
||||
import cn.qaiu.db.pool.JDBCPoolInit;
|
||||
import cn.qaiu.lz.web.model.CacheLinkInfo;
|
||||
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 java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
public class CacheManager {
|
||||
private final JDBCPool jdbcPool = JDBCPoolInit.instance().getPool();
|
||||
|
||||
|
||||
public Future<CacheLinkInfo> get(String cacheKey) {
|
||||
String sql = "SELECT direct_link as directLink, expiration FROM cache_link_info WHERE share_key = #{share_key}";
|
||||
Map<String, Object> params = new HashMap<>();
|
||||
params.put("share_key", cacheKey);
|
||||
Promise<CacheLinkInfo> promise = Promise.promise();
|
||||
SqlTemplate.forQuery(jdbcPool, sql)
|
||||
.mapTo(CacheLinkInfo.class)
|
||||
.execute(params)
|
||||
.onSuccess(rows->{
|
||||
CacheLinkInfo cacheHit;
|
||||
if (rows.size() > 0) {
|
||||
cacheHit = rows.iterator().next();
|
||||
cacheHit.setCacheHit(true);
|
||||
} else {
|
||||
cacheHit = new CacheLinkInfo(JsonObject.of("cacheHit", false));
|
||||
}
|
||||
promise.complete(cacheHit);
|
||||
}).onFailure(Throwable::printStackTrace);
|
||||
return promise.future();
|
||||
}
|
||||
|
||||
|
||||
// 插入或更新缓存数据
|
||||
public Future<Void> cacheShareLink(CacheLinkInfo cacheLinkInfo) {
|
||||
String sql = "MERGE INTO cache_link_info (share_key, direct_link, expiration) " +
|
||||
"KEY (share_key) " +
|
||||
"VALUES (#{shareKey}, #{directLink}, #{expiration})";
|
||||
|
||||
// 直接传递 CacheLinkInfo 实体类
|
||||
return SqlTemplate.forUpdate(jdbcPool, sql)
|
||||
.mapFrom(CacheLinkInfo.class) // 将实体类映射为 Tuple 参数
|
||||
.execute(cacheLinkInfo)
|
||||
.mapEmpty();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,76 @@
|
||||
package cn.qaiu.lz.common.util;
|
||||
|
||||
import io.vertx.core.MultiMap;
|
||||
import io.vertx.core.http.HttpServerRequest;
|
||||
|
||||
import java.net.URLDecoder;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
|
||||
/**
|
||||
* 处理URL截断问题,拼接被截断的参数,特殊处理pwd参数。
|
||||
*
|
||||
* @author <a href="https://qaiu.top">QAIU</a>
|
||||
* @date 2024/9/13
|
||||
*/
|
||||
public class URLParamUtil {
|
||||
|
||||
/**
|
||||
* 解析并处理截断的URL参数
|
||||
*
|
||||
* @param request HttpServerRequest对象
|
||||
* @return 完整的URL字符串
|
||||
*/
|
||||
public static String parserParams(HttpServerRequest request) {
|
||||
String url = request.absoluteURI();
|
||||
MultiMap params = request.params();
|
||||
|
||||
// 处理URL截断的情况,例如: url='https://...&key=...&code=...'
|
||||
if (params.contains("url")) {
|
||||
String encodedUrl = params.get("url");
|
||||
url = handleTruncatedUrl(encodedUrl, params);
|
||||
}
|
||||
|
||||
return url;
|
||||
}
|
||||
|
||||
/**
|
||||
* 处理被截断的URL,拼接所有参数,特殊处理pwd参数。
|
||||
*
|
||||
* @param encodedUrl 被截断的url参数
|
||||
* @param params 请求的其他参数
|
||||
* @return 重新拼接后的完整URL
|
||||
*/
|
||||
private static String handleTruncatedUrl(String encodedUrl, MultiMap params) {
|
||||
// 对URL进行解码,以便获取完整的URL
|
||||
String decodedUrl = URLDecoder.decode(encodedUrl, StandardCharsets.UTF_8);
|
||||
|
||||
// 如果URL已经包含查询参数,不需要额外拼接
|
||||
if (params.contains("pwd")) {
|
||||
if (params.size() == 2) {
|
||||
return decodedUrl;
|
||||
}
|
||||
} else {
|
||||
if (params.size() == 1) {
|
||||
return decodedUrl;
|
||||
}
|
||||
}
|
||||
|
||||
// 拼接被截断的URL参数,忽略pwd参数
|
||||
StringBuilder urlBuilder = new StringBuilder(decodedUrl);
|
||||
boolean firstParam = !decodedUrl.contains("?");
|
||||
|
||||
for (String paramName : params.names()) {
|
||||
if (!paramName.equals("url") && !paramName.equals("pwd")) { // 忽略 "url" 和 "pwd" 参数
|
||||
if (firstParam) {
|
||||
urlBuilder.append("?");
|
||||
firstParam = false;
|
||||
} else {
|
||||
urlBuilder.append("&");
|
||||
}
|
||||
urlBuilder.append(paramName).append("=").append(params.get(paramName));
|
||||
}
|
||||
}
|
||||
|
||||
return urlBuilder.toString();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user