diff --git a/public/data/friends.json b/public/data/friends.json
new file mode 100644
index 0000000..6f3a064
--- /dev/null
+++ b/public/data/friends.json
@@ -0,0 +1,34 @@
+{
+ "friends": [
+ {
+ "name": "Jurangren",
+ "desc": "本站后端大手子!",
+ "url": "https://github.com/Jurangren",
+ "logo": "https://avatars.githubusercontent.com/u/111159360"
+ },
+ {
+ "name": "Asuna",
+ "desc": "LINK START!",
+ "url": "https://saop.cc/",
+ "logo": "https://saop.cc/avatar.webp"
+ },
+ {
+ "name": "VNDB",
+ "desc": "Visual Novel Database",
+ "url": "https://vndb.org/",
+ "logo": "https://vndb.org/favicon.ico"
+ },
+ {
+ "name": "梓澪",
+ "desc": "梓澪の妙妙屋",
+ "url": "https://zi0.cc/",
+ "logo": "https://img.mjj.today/2023/01/23/2b6331a29bf32d2af96a2537e10a5ee8.webp"
+ },
+ {
+ "name": "VNS",
+ "desc": "Visual Novel",
+ "url": "https://gal.saop.cc",
+ "logo": "https://gal.saop.cc/images/logo.svg"
+ }
+ ]
+}
diff --git a/public/sitemap.xml b/public/sitemap.xml
index 04c1d35..ad7e290 100644
--- a/public/sitemap.xml
+++ b/public/sitemap.xml
@@ -1,43 +1,43 @@
-
-
-
-
-
- https://searchgal.homes/
- 2025-12-21
- daily
- 1.0
-
- https://searchgal.homes/logo.svg
- SearchGal - Galgame 聚合搜索
- Galgame 资源聚合搜索引擎,支持多站点搜索
-
-
- https://searchgal.homes/og-image.png
- SearchGal 社交分享图
-
-
-
-
-
- https://searchgal.homes/llms.txt
- 2025-12-21
- weekly
- 0.6
-
-
-
-
- https://searchgal.homes/manifest.json
- 2025-12-21
- monthly
- 0.3
-
-
-
+
+
+
+
+
+ https://searchgal.homes/
+ 2025-12-21
+ daily
+ 1.0
+
+ https://searchgal.homes/logo.svg
+ SearchGal - Galgame 聚合搜索
+ Galgame 资源聚合搜索引擎,支持多站点搜索
+
+
+ https://searchgal.homes/og-image.png
+ SearchGal 社交分享图
+
+
+
+
+
+ https://searchgal.homes/llms.txt
+ 2025-12-21
+ weekly
+ 0.6
+
+
+
+
+ https://searchgal.homes/manifest.json
+ 2025-12-21
+ monthly
+ 0.3
+
+
+
diff --git a/src/components/SearchHeader.vue b/src/components/SearchHeader.vue
index cfcd678..5d7c1b7 100644
--- a/src/components/SearchHeader.vue
+++ b/src/components/SearchHeader.vue
@@ -390,6 +390,72 @@
+
+
+
@@ -418,6 +484,8 @@ import {
Loader2,
CornerDownLeft,
XCircle,
+ Link2,
+ GitPullRequestArrow,
} from 'lucide-vue-next'
import { getSearchParamsFromURL, updateURLParams, onURLParamsChange } from '@/utils/urlParams'
import { saveSearchHistory } from '@/utils/persistence'
@@ -428,6 +496,32 @@ const customApi = ref('')
const searchMode = ref<'game' | 'patch'>('game')
let cleanupURLListener: (() => void) | null = null
+// 友情链接
+interface FriendLink {
+ name: string
+ desc: string
+ url: string
+ logo: string
+}
+const friendLinks = ref([])
+
+// 获取友情链接数据
+async function loadFriendLinks() {
+ try {
+ const res = await fetch('/data/friends.json')
+ const data = await res.json()
+ friendLinks.value = data.friends || []
+ } catch {
+ // 静默失败
+ }
+}
+
+// 友链 logo 加载失败时的处理
+function handleFriendLogoError(e: Event) {
+ const img = e.target as HTMLImageElement
+ img.src = 'data:image/svg+xml,'
+}
+
// 搜索防抖 - 防止 800ms 内重复触发
const { isLocked: isSearchLocked, click: debouncedSearchTrigger } = useDebouncedClick(800)
@@ -472,6 +566,9 @@ onMounted(() => {
isUpdatingFromURL = false
}, 200)
})
+
+ // 加载友情链接
+ loadFriendLinks()
})
onUnmounted(() => {
diff --git a/src/components/UpdateToast.vue b/src/components/UpdateToast.vue
index 56d2833..d5f60cd 100644
--- a/src/components/UpdateToast.vue
+++ b/src/components/UpdateToast.vue
@@ -23,39 +23,23 @@
{{ countdown > 0 ? `${countdown} 秒后自动更新...` : '正在更新...' }}
-
-
-