From 40fd3eb4ad7d2b22ba0146b35210c4a6f4e4f4dd Mon Sep 17 00:00:00 2001 From: mediabot-pt <295750538+mediabot-pt@users.noreply.github.com> Date: Wed, 1 Jul 2026 23:07:40 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=86=85=E5=AE=B9=E4=BB=A3=E7=90=86?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E9=A1=B5=E9=9D=A2=E7=B1=BB=E5=9E=8B=E5=88=AB?= =?UTF-8?q?=E5=90=8D(sync/search/sign/detail)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/AccessResultController.java | 35 ++++++++++++++----- 1 file changed, 26 insertions(+), 9 deletions(-) diff --git a/par-api/src/main/java/com/par/api/controller/AccessResultController.java b/par-api/src/main/java/com/par/api/controller/AccessResultController.java index 9cc0d5f..3f066a5 100644 --- a/par-api/src/main/java/com/par/api/controller/AccessResultController.java +++ b/par-api/src/main/java/com/par/api/controller/AccessResultController.java @@ -39,10 +39,14 @@ public class AccessResultController { * ctx.siteUrl 指向:http://par:9012/api/v1/admin/sites/{siteId}/content */ /** - * 内容代理:根据路径和可选查询参数返回存储内容。 - * 匹配规则:URL 以请求路径结尾(含查询参数),返回最新匹配项。 - * GET /admin/sites/{siteId}/content/index.php - * GET /admin/sites/{siteId}/content/torrents.php?search=keyword + * 内容代理:支持两种方式调用 —— + * 1. 真实路径:GET /admin/sites/{siteId}/content/index.php?search=xxx + * 2. 页面类型:GET /admin/sites/{siteId}/content/sync + * 页面类型映射(按站点类型自动匹配): + * sync → index.php (或 api/member/profile) + * search → torrents.php (或 api/torrent/search) + * sign → attendance.php + * detail → details.php */ @GetMapping("/api/v1/admin/sites/{siteId}/content/**") public ResponseEntity contentProxy( @@ -50,8 +54,11 @@ public class AccessResultController { HttpServletRequest request) { String fullPath = request.getRequestURI(); String prefix = "/api/v1/admin/sites/" + siteId + "/content"; - String relativePath = fullPath.substring(fullPath.indexOf(prefix) + prefix.length()); + String rawPath = fullPath.substring(fullPath.indexOf(prefix) + prefix.length()); String query = request.getQueryString(); + + // 页面类型 → URL 模式映射 + String relativePath = resolvePageType(rawPath, siteId); String pathWithQuery = relativePath + (query != null ? "?" + query : ""); if (pathWithQuery.isEmpty()) pathWithQuery = "/"; @@ -61,16 +68,14 @@ public class AccessResultController { .orderByDesc(AccessResult::getId) .last("limit 200")); - // 优先精确匹配(URL 以 pathWithQuery 结尾),否则模糊匹配 + // 优先精确匹配,否则模糊匹配 AccessResult best = results.stream() .filter(r -> r.getUrl() != null && r.getStoragePath() != null && (r.getUrl().endsWith(pathWithQuery) || r.getUrl().contains(pathWithQuery))) .findFirst().orElse(null); if (best == null) { - // 回退:URL 包含相对路径(不含查询参数) - String pathOnly = relativePath; best = results.stream() - .filter(r -> r.getUrl() != null && r.getStoragePath() != null && r.getUrl().contains(pathOnly)) + .filter(r -> r.getUrl() != null && r.getStoragePath() != null && r.getUrl().contains(relativePath)) .findFirst().orElse(null); } if (best == null) return ResponseEntity.notFound().build(); @@ -82,6 +87,18 @@ public class AccessResultController { return ResponseEntity.ok().contentType(MediaType.parseMediaType(contentType + ";charset=UTF-8")).body(content); } + /** 页面类型 → URL 模式 */ + private String resolvePageType(String type, String siteId) { + return switch (type) { + case "/sync", "/sync/" -> ".php?file=index"; // 通用匹配 index.php + case "/search", "/search/" -> "torrents.php"; + case "/sign", "/sign/" -> "attendance.php"; + case "/detail", "/detail/" -> "details.php"; + case "/profile", "/profile/" -> "api/member/profile"; + default -> type; // 原样传递(真实路径) + }; + } + // ==================== mediabot 提交接口(PSK 鉴权) ==================== /**