From 0437eaab8c947c2ac48b13b748e667210e7a76a3 Mon Sep 17 00:00:00 2001 From: AdingApkgg Date: Thu, 20 Nov 2025 02:27:08 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=9B=B4=E6=96=B0=E6=90=9C=E7=B4=A2?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=E4=B8=8E=E6=A0=87=E7=AD=BE=E7=B3=BB=E7=BB=9F?= =?UTF-8?q?=EF=BC=8C=E5=A2=9E=E5=BC=BA=E7=94=A8=E6=88=B7=E4=BD=93=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 更新 `search.ts`,调整 API 文档链接并优化请求格式,支持 Cloudflare Workers API。 * 在 `SearchHeader.vue` 中新增标签说明,帮助用户快速理解资源特性。 * 在 `SearchResults.vue` 中重构标签显示,增加样式和图标映射,提升视觉效果与信息传达。 --- src/api/search.ts | 36 +++++++++++++------ src/components/SearchHeader.vue | 19 ++++++++++ src/components/SearchResults.vue | 60 ++++++++++++++++++++++++++++++-- 3 files changed, 103 insertions(+), 12 deletions(-) diff --git a/src/api/search.ts b/src/api/search.ts index 76d5426..00501a3 100644 --- a/src/api/search.ts +++ b/src/api/search.ts @@ -41,7 +41,20 @@ export interface VndbInfo { /** * 搜索游戏(流式处理) - * 根据 API 文档: https://github.com/Moe-Sakura/SearchGal/blob/main/docs/api.md + * 根据 Cloudflare Workers API 文档: https://github.com/Moe-Sakura/Wrangler-API + * + * API 端点: + * - POST /gal - 搜索游戏资源 + * - POST /patch - 搜索补丁资源 + * + * 请求格式: multipart/form-data + * 表单字段: game (string) + * + * 响应格式: text/event-stream (SSE) + * - {"total": 33} - 总平台数 + * - {"progress": {"completed": 1, "total": 33}} - 进度更新 + * - {"progress": {...}, "result": {...}} - 平台结果 + * - {"done": true} - 完成标记 */ export async function searchGameStream( searchParams: URLSearchParams, @@ -54,8 +67,8 @@ export async function searchGameStream( } ) { try { - // 从 searchParams 中获取 API 地址 - const apiUrl = searchParams.get('api') || 'https://api.searchgal.homes' + // 从 searchParams 中获取 API 地址,默认使用 Cloudflare Workers API + const apiUrl = searchParams.get('api') || 'https://cfapi.searchgal.homes' const gameName = searchParams.get('game') const searchMode = searchParams.get('mode') || 'game' @@ -63,10 +76,9 @@ export async function searchGameStream( throw new Error('游戏名称不能为空') } - // 根据 API 文档,使用 FormData 构建请求体 + // 根据 Cloudflare Workers API 文档,使用 FormData 构建请求体 const formData = new FormData() formData.append('game', gameName) - formData.append('magic', 'true') // 启用魔法搜索以获取更多结果 // 根据搜索模式选择 API 端点 const endpoint = searchMode === 'patch' ? '/patch' : '/gal' @@ -113,28 +125,32 @@ export async function searchGameStream( try { const data = JSON.parse(line) - // 根据 API 文档的响应格式处理数据 + // 根据 Cloudflare Workers API 文档的响应格式处理数据 if (data.total !== undefined) { - // 初始事件:{"total": 10} + // 初始事件:{"total": 33} totalCount = data.total callbacks.onTotal?.(totalCount) } else if (data.progress && data.result) { - // 进度事件:{"progress": {...}, "result": {...}} + // 进度事件:{"progress": {"completed": 1, "total": 33}, "result": {...}} callbacks.onProgress?.(data.progress.completed, data.progress.total) - // 转换为我们的格式,保留完整平台信息 + // 转换为我们的格式,保留 tags 标签信息 const platformResult: PlatformResult = { name: data.result.name, color: data.result.color || 'white', items: data.result.items.map((item: any) => ({ platform: data.result.name, title: item.name, - url: item.url + url: item.url, + tags: data.result.tags || [] // 保留平台标签(NoReq, Login, BTmag 等) })), error: data.result.error || '' } callbacks.onPlatformResult?.(platformResult) + } else if (data.progress && !data.result) { + // 仅进度更新:{"progress": {"completed": 2, "total": 33}} + callbacks.onProgress?.(data.progress.completed, data.progress.total) } else if (data.done === true) { // 完成事件:{"done": true} callbacks.onComplete?.() diff --git a/src/components/SearchHeader.vue b/src/components/SearchHeader.vue index b1d8585..1b37c34 100644 --- a/src/components/SearchHeader.vue +++ b/src/components/SearchHeader.vue @@ -195,6 +195,25 @@ >,搜索结果均来自第三方站点,下载前请各位自行判断 资源安全性,以免翻车。 +
  • + • 搜索结果会显示不同的标签,帮助你快速了解资源特性: + + 直接下载 + + 表示无需登录, + + 需登录 + + 表示需要账号, + + 不限速 + + 表示高速网盘, + + BT/磁力 + + 表示种子下载等。 +
  • • 搜索时请注意关键词长度!关键词太短 可能搜不全(部分站点只显示首批结果),太长 diff --git a/src/components/SearchResults.vue b/src/components/SearchResults.vue index f9bf8d0..05ad17f 100644 --- a/src/components/SearchResults.vue +++ b/src/components/SearchResults.vue @@ -56,9 +56,11 @@ - {{ tag }} + + {{ getTagLabel(tag) }} @@ -221,6 +223,60 @@ function getChipClass(color: string) { } return classes[color] || '' } + +// 标签样式映射(根据 Cloudflare Workers API 文档) +function getTagClass(tag: string) { + const classes: Record = { + 'NoReq': 'bg-green-100 text-green-700', // 无需登录/回复 + 'Login': 'bg-blue-100 text-blue-700', // 需登录 + 'LoginPay': 'bg-yellow-100 text-yellow-700', // 需登录且支付 + 'LoginRep': 'bg-purple-100 text-purple-700', // 需登录并回复 + 'Rep': 'bg-indigo-100 text-indigo-700', // 需回复 + 'SuDrive': 'bg-pink-100 text-pink-700', // 自建网盘 + 'NoSplDrive': 'bg-emerald-100 text-emerald-700', // 不限速网盘 + 'SplDrive': 'bg-orange-100 text-orange-700', // 限速网盘 + 'MixDrive': 'bg-cyan-100 text-cyan-700', // 混合网盘 + 'BTmag': 'bg-violet-100 text-violet-700', // BT/磁力 + 'magic': 'bg-red-100 text-red-700' // 需代理 + } + return classes[tag] || 'bg-gray-100 text-gray-600' +} + +// 标签图标映射 +function getTagIcon(tag: string) { + const icons: Record = { + 'NoReq': 'fas fa-check-circle', + 'Login': 'fas fa-user', + 'LoginPay': 'fas fa-coins', + 'LoginRep': 'fas fa-comment', + 'Rep': 'fas fa-reply', + 'SuDrive': 'fas fa-server', + 'NoSplDrive': 'fas fa-rocket', + 'SplDrive': 'fas fa-turtle', + 'MixDrive': 'fas fa-layer-group', + 'BTmag': 'fas fa-magnet', + 'magic': 'fas fa-magic' + } + return icons[tag] || 'fas fa-tag' +} + +// 标签文本映射 +function getTagLabel(tag: string) { + const labels: Record = { + 'NoReq': '直接下载', + 'Login': '需登录', + 'LoginPay': '需付费', + 'LoginRep': '登录+回复', + 'Rep': '需回复', + 'SuDrive': '自建盘', + 'NoSplDrive': '不限速', + 'SplDrive': '限速盘', + 'MixDrive': '混合盘', + 'BTmag': 'BT/磁力', + 'magic': '需代理' + } + return labels[tag] || tag +}