feat: 添加站点设置中的 favicon URL 支持,更新相关接口和页面
All checks were successful
ui-regression / playwright-regression (push) Successful in 6m20s
docker-images / resolve-build-targets (push) Successful in 6s
docker-images / build-and-push (admin) (push) Successful in 25s
docker-images / build-and-push (backend) (push) Successful in 35s
docker-images / build-and-push (frontend) (push) Successful in 1m46s
docker-images / submit-indexnow (push) Successful in 15s

This commit is contained in:
2026-04-03 02:13:27 +08:00
parent 27d0827f3e
commit 36d505ece6
19 changed files with 143 additions and 5 deletions

View File

@@ -412,6 +412,7 @@ export interface AdminSiteSettingsResponse {
media_r2_public_base_url: string | null
media_r2_access_key_id: string | null
media_r2_secret_access_key: string | null
seo_favicon_url: string | null
seo_default_og_image: string | null
seo_default_twitter_handle: string | null
seo_wechat_share_qr_enabled: boolean
@@ -489,6 +490,7 @@ export interface SiteSettingsPayload {
mediaR2PublicBaseUrl?: string | null
mediaR2AccessKeyId?: string | null
mediaR2SecretAccessKey?: string | null
seoFaviconUrl?: string | null
seoDefaultOgImage?: string | null
seoDefaultTwitterHandle?: string | null
seoWechatShareQrEnabled?: boolean

View File

@@ -216,6 +216,7 @@ function toPayload(form: AdminSiteSettingsResponse): SiteSettingsPayload {
mediaR2PublicBaseUrl: form.media_r2_public_base_url,
mediaR2AccessKeyId: form.media_r2_access_key_id,
mediaR2SecretAccessKey: form.media_r2_secret_access_key,
seoFaviconUrl: form.seo_favicon_url,
seoDefaultOgImage: form.seo_default_og_image,
seoDefaultTwitterHandle: form.seo_default_twitter_handle,
seoWechatShareQrEnabled: form.seo_wechat_share_qr_enabled,
@@ -915,6 +916,22 @@ export function SiteSettingsPage() {
</CardDescription>
</CardHeader>
<CardContent className="grid gap-6 lg:grid-cols-2">
<Field label="Favicon URL" hint="浏览器标签页图标;支持外链,也支持上传 / 抓取 / 选择媒体库。">
<div className="space-y-3">
<Input
value={form.seo_favicon_url ?? ''}
onChange={(event) => updateField('seo_favicon_url', event.target.value)}
/>
<MediaUrlControls
value={form.seo_favicon_url ?? ''}
onChange={(seoFaviconUrl) => updateField('seo_favicon_url', seoFaviconUrl)}
prefix="seo-assets/"
contextLabel="站点 favicon 上传"
remoteTitle={form.site_name || form.site_title || '站点 favicon'}
dataTestIdPrefix="site-favicon"
/>
</div>
</Field>
<Field label="默认 OG 图 URL" hint="文章未单独设置时作为分享图回退,也支持上传 / 抓取 / 选择媒体库。">
<div className="space-y-3">
<Input