From 1a4fd54b68e2187f17b4f517a694193e5a47308c Mon Sep 17 00:00:00 2001
From: Ap_Tx <3045929398@qq.com>
Date: Sun, 18 Oct 2026 15:32:06 +0800
Subject: [PATCH] =?UTF-8?q?feat:=20=E7=BB=B4=E5=9F=BA=E9=A1=B5=E6=94=AF?=
=?UTF-8?q?=E6=8C=81=E6=90=9C=E7=B4=A2=E3=80=81=E6=9C=80=E8=BF=91=E6=9B=B4?=
=?UTF-8?q?=E6=96=B0=E4=B8=8E=E5=88=86=E7=B1=BB=E6=B5=8F=E8=A7=88?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../src/components/ui/skin-site/WikiView.vue | 3 +
.../ui/skin-site/wiki/WikiBrowser.vue | 238 ++++++++++++++++++
.../app-frontend/src/helpers/skin-site-api.ts | 77 ++++++
.../app-frontend/src/locales/en-US/index.json | 13 +-
.../app-frontend/src/locales/zh-CN/index.json | 13 +-
5 files changed, 342 insertions(+), 2 deletions(-)
create mode 100644 apps/app-frontend/src/components/ui/skin-site/wiki/WikiBrowser.vue
diff --git a/apps/app-frontend/src/components/ui/skin-site/WikiView.vue b/apps/app-frontend/src/components/ui/skin-site/WikiView.vue
index e05644a..68aec7b 100644
--- a/apps/app-frontend/src/components/ui/skin-site/WikiView.vue
+++ b/apps/app-frontend/src/components/ui/skin-site/WikiView.vue
@@ -16,6 +16,7 @@ import {
} from '@/helpers/skin-site-api'
import WikiNodeRenderer from './wiki/WikiNodeRenderer.vue'
+import WikiBrowser from './wiki/WikiBrowser.vue'
const { formatMessage } = useVIntl()
const { handleError, addNotification } = injectNotificationManager()
@@ -259,6 +260,8 @@ onMounted(() => {
+
+
{{ formatMessage(messages.loading) }}
diff --git a/apps/app-frontend/src/components/ui/skin-site/wiki/WikiBrowser.vue b/apps/app-frontend/src/components/ui/skin-site/wiki/WikiBrowser.vue
new file mode 100644
index 0000000..e168c33
--- /dev/null
+++ b/apps/app-frontend/src/components/ui/skin-site/wiki/WikiBrowser.vue
@@ -0,0 +1,238 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ formatMessage(messages.hintSearch) }}
+
+
+ {{ formatMessage(messages.hintCategory) }}
+
+
+ {{ formatMessage(tab === 'search' ? messages.emptySearch : messages.emptyList) }}
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/apps/app-frontend/src/helpers/skin-site-api.ts b/apps/app-frontend/src/helpers/skin-site-api.ts
index 7c03acb..21cdf2a 100644
--- a/apps/app-frontend/src/helpers/skin-site-api.ts
+++ b/apps/app-frontend/src/helpers/skin-site-api.ts
@@ -2605,3 +2605,80 @@ export function skinSiteWikiRevert(data: {
body: data,
})
}
+// ─── Wiki: 搜索 / 列表 / 最近 / 分类 ───────────────────────────────────────
+
+export interface SkinSiteWikiPageSummary {
+ title: string
+ updatedAt: number
+ authorName: string
+ readPolicy: SkinSiteWikiReadPolicy
+ editPolicy: SkinSiteWikiEditPolicy
+ redirectTarget?: string | null
+}
+
+export interface SkinSiteWikiPageListItem {
+ id: number
+ title: string
+ namespace: string
+ revisionId: number
+ updatedAt: number
+ authorName: string
+ readPolicy: SkinSiteWikiReadPolicy
+ editPolicy: SkinSiteWikiEditPolicy
+ redirectTarget?: string | null
+}
+
+export interface SkinSiteWikiPageList {
+ items: SkinSiteWikiPageListItem[]
+ nextCursor?: string | null
+}
+
+export interface SkinSiteWikiSearchPage {
+ items: SkinSiteWikiPageSummary[]
+ nextCursor?: number | null
+}
+
+export function skinSiteWikiSearch(
+ query: string,
+): Promise
> {
+ const q = query.trim()
+ if (!q) {
+ return Promise.resolve({
+ success: true,
+ payload: [],
+ timestamp: Date.now(),
+ } as SkinSiteResponse)
+ }
+ return skinSiteRequest('wiki/search?q=' + encodeURIComponent(q))
+}
+
+export function skinSiteWikiPages(
+ params: {
+ prefix?: string
+ namespace?: string
+ limit?: number
+ cursor?: string
+ } = {},
+): Promise> {
+ const query = new URLSearchParams()
+ if (params.prefix) query.set('prefix', params.prefix)
+ if (params.namespace != null) query.set('namespace', params.namespace)
+ if (params.limit != null) query.set('limit', String(params.limit))
+ if (params.cursor) query.set('cursor', params.cursor)
+ return skinSiteRequest('wiki/pages?' + query.toString())
+}
+
+export function skinSiteWikiRecent(before?: number): Promise> {
+ const query = new URLSearchParams()
+ if (before != null) query.set('before', String(before))
+ return skinSiteRequest('wiki/recent?' + query.toString())
+}
+
+export function skinSiteWikiCategory(
+ name: string,
+ before?: number,
+): Promise> {
+ const query = new URLSearchParams({ name })
+ if (before != null) query.set('before', String(before))
+ return skinSiteRequest('wiki/category?' + query.toString())
+}
\ No newline at end of file
diff --git a/apps/app-frontend/src/locales/en-US/index.json b/apps/app-frontend/src/locales/en-US/index.json
index 71eb579..d79e407 100644
--- a/apps/app-frontend/src/locales/en-US/index.json
+++ b/apps/app-frontend/src/locales/en-US/index.json
@@ -12447,5 +12447,16 @@
"app.skin-site.wiki.revision-preview": {"message": "Preview of revision #{id}"},
"app.skin-site.wiki.close-preview": {"message": "Close preview"},
"app.skin-site.wiki.diff-title": {"message": "Line diff against the current revision"},
- "app.skin-site.wiki.cancel": {"message": "Cancel"}
+ "app.skin-site.wiki.cancel": {"message": "Cancel"},
+ "app.skin-site.wiki.browser.search-placeholder": {"message": "Search wiki pages…"},
+ "app.skin-site.wiki.browser.tab-search": {"message": "Search"},
+ "app.skin-site.wiki.browser.tab-recent": {"message": "Recent"},
+ "app.skin-site.wiki.browser.tab-category": {"message": "Category"},
+ "app.skin-site.wiki.browser.category-placeholder": {"message": "Category name"},
+ "app.skin-site.wiki.browser.load-more": {"message": "Load more"},
+ "app.skin-site.wiki.browser.empty-search": {"message": "No pages match your search."},
+ "app.skin-site.wiki.browser.empty-list": {"message": "Nothing here yet."},
+ "app.skin-site.wiki.browser.hint-search": {"message": "Type a keyword to search."},
+ "app.skin-site.wiki.browser.hint-category": {"message": "Enter a category name to browse."},
+ "app.skin-site.wiki.browser.by-author": {"message": "by {author}"}
}
diff --git a/apps/app-frontend/src/locales/zh-CN/index.json b/apps/app-frontend/src/locales/zh-CN/index.json
index 2ad0192..ec048b2 100644
--- a/apps/app-frontend/src/locales/zh-CN/index.json
+++ b/apps/app-frontend/src/locales/zh-CN/index.json
@@ -12278,5 +12278,16 @@
"app.skin-site.wiki.revision-preview": {"message": "修订 #{id} 预览"},
"app.skin-site.wiki.close-preview": {"message": "关闭预览"},
"app.skin-site.wiki.diff-title": {"message": "与当前版本的逐行差异"},
- "app.skin-site.wiki.cancel": {"message": "取消"}
+ "app.skin-site.wiki.cancel": {"message": "取消"},
+ "app.skin-site.wiki.browser.search-placeholder": {"message": "搜索 Wiki 页面…"},
+ "app.skin-site.wiki.browser.tab-search": {"message": "搜索"},
+ "app.skin-site.wiki.browser.tab-recent": {"message": "最近"},
+ "app.skin-site.wiki.browser.tab-category": {"message": "分类"},
+ "app.skin-site.wiki.browser.category-placeholder": {"message": "分类名称"},
+ "app.skin-site.wiki.browser.load-more": {"message": "加载更多"},
+ "app.skin-site.wiki.browser.empty-search": {"message": "没有匹配的页面。"},
+ "app.skin-site.wiki.browser.empty-list": {"message": "这里还没有内容。"},
+ "app.skin-site.wiki.browser.hint-search": {"message": "输入关键词开始搜索。"},
+ "app.skin-site.wiki.browser.hint-category": {"message": "输入分类名称开始浏览。"},
+ "app.skin-site.wiki.browser.by-author": {"message": "由 {author} 编辑"}
}