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 @@ + + + \ 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} 编辑"} }