feat: 皮肤站管理台 Wiki 补 MediaWiki 迁移中心
Sync source to CNB / Sync Git ref (push) Skipped

- 新增迁移中心 Tab
- 自动迁移:填写 api.php 地址,可选 Bot 凭据,支持明确允许内网来源;可配置过时页面筛选规则(未更新天数、维护者统计窗口、维护者人数上限、过时标记)
- XML 导入:上传 MediaWiki 导出文件建立暂存任务
- 迁移任务列表:状态标签、审核进度条、已审核/导入/排除统计、错误信息
- 任务详情:分页加载候选页面,逐条显示更新时间、维护者数量、可疑原因,可设置目标标题与是否覆盖,执行导入或排除
- 整批发布与回滚,失败或已回滚任务可删除记录
- 补充迁移相关 API 与类型定义
- 中英文各补 55 个文案
This commit is contained in:
AxTps committed 2026-10-18 12:57:26 +08:00
1 parent 667c1a0900
commit febbd84ae7
4 files changed
+986 -4

No files matched your search

@@ -2367,3 +2367,129 @@ export function skinSiteChatVoiceCapacityUpdate(
{ method: 'PUT', body: data },
)
}
// ---------------------------------------------------------------------------
// Wiki migration
// ---------------------------------------------------------------------------
export type SkinSiteWikiMigrationState =
| 'IMPORTING'
| 'REVIEW'
| 'PUBLISHING'
| 'PUBLISHED'
| 'FAILED'
| 'ROLLED_BACK'
export type SkinSiteWikiMigrationDecision = 'PENDING' | 'IMPORT' | 'EXCLUDE'
export interface SkinSiteWikiMigrationJobInfo {
id: number
source: string
state: SkinSiteWikiMigrationState
total: number
reviewed: number
imported: number
excluded: number
error?: string | null
missingAttachmentCount?: number
}
export interface SkinSiteWikiMigrationCandidate {
id: number
title: string
lastUpdatedAt: number
maintainerCount: number
suspiciousReasons: string[]
decision: SkinSiteWikiMigrationDecision
conflict: boolean
}
export interface SkinSiteWikiMigrationPage {
items: SkinSiteWikiMigrationCandidate[]
nextCursor?: number | null
}
export interface SkinSiteWikiMigrationPublishResult {
imported: number
overwritten: number
}
export interface SkinSiteWikiAutomaticMigrationInput {
apiUrl: string
username?: string | null
password?: string | null
allowPrivateAddress: boolean
rules: {
staleDays: number
maintainerWindowDays: number
maximumMaintainers: number
staleMarkers: string[]
}
}
export function skinSiteWikiMigrationJobs(): Promise<
SkinSiteResponse<SkinSiteWikiMigrationJobInfo[]>
> {
return skinSiteRequest<SkinSiteWikiMigrationJobInfo[]>('wiki/admin/migration')
}
export function skinSiteWikiMigrationStartAutomatic(
data: SkinSiteWikiAutomaticMigrationInput,
): Promise<SkinSiteResponse<SkinSiteWikiMigrationJobInfo>> {
return skinSiteRequest<SkinSiteWikiMigrationJobInfo>('wiki/admin/migration/automatic', {
method: 'POST',
body: data,
})
}
export function skinSiteWikiMigrationStartXml(
file: File,
): Promise<SkinSiteResponse<SkinSiteWikiMigrationJobInfo>> {
const form = new FormData()
form.append('xml', file, file.name)
return skinSiteRequest<SkinSiteWikiMigrationJobInfo>('wiki/admin/migration/xml', {
method: 'POST',
form,
})
}
export function skinSiteWikiMigrationCandidates(
jobId: number,
after?: number,
): Promise<SkinSiteResponse<SkinSiteWikiMigrationPage>> {
const suffix = after ? '?after=' + after : ''
return skinSiteRequest<SkinSiteWikiMigrationPage>(
'wiki/admin/migration/' + jobId + '/candidates' + suffix,
)
}
export function skinSiteWikiMigrationDecide(
candidateId: number,
data: { decision: SkinSiteWikiMigrationDecision; targetTitle?: string | null; overwrite?: boolean },
): Promise<SkinSiteResponse<void>> {
return skinSiteRequest<void>('wiki/admin/migration/candidates/' + candidateId, {
method: 'POST',
body: data,
})
}
export function skinSiteWikiMigrationPublish(
jobId: number,
): Promise<SkinSiteResponse<SkinSiteWikiMigrationPublishResult>> {
return skinSiteRequest<SkinSiteWikiMigrationPublishResult>(
'wiki/admin/migration/' + jobId + '/publish',
{ method: 'POST' },
)
}
export function skinSiteWikiMigrationRollback(
jobId: number,
): Promise<SkinSiteResponse<void>> {
return skinSiteRequest<void>('wiki/admin/migration/' + jobId + '/rollback', {
method: 'POST',
})
}
export function skinSiteWikiMigrationDelete(jobId: number): Promise<SkinSiteResponse<void>> {
return skinSiteRequest<void>('wiki/admin/migration/' + jobId, { method: 'DELETE' })
}