feat(themes): 添加可编辑的站点外观和皮肤主题(#408)

This commit is contained in:
Ray
2026-09-03 21:13:41 +08:00
committed by GitHub
parent c768fccbc2
commit 5e66cb7c45
70 changed files with 3654 additions and 327 deletions

View File

@@ -1,4 +1,5 @@
import { apiClient, request } from "@/services/api/request";
import type { SkinDefinition } from "@/lib/skin-themes";
export type PublicAppearance = {
schemaVersion: number;
@@ -12,6 +13,13 @@ export type PublicAppearance = {
authVideoUrl: string;
authVideoPosterUrl: string;
skinId: string;
activeSkin: SkinDefinition;
seoTitle: string;
seoDescription: string;
seoKeywords: string;
footerCopyright: string;
icpFilingEnabled: boolean;
icpFilingNumber: string;
logoConfigured: boolean;
darkLogoConfigured: boolean;
authVideoConfigured: boolean;
@@ -33,6 +41,13 @@ export type AdminAppearance = {
authVideoResourceId: string;
authVideoPosterResourceId: string;
skinId: string;
skinThemes: SkinDefinition[];
seoTitle: string;
seoDescription: string;
seoKeywords: string;
footerCopyright: string;
icpFilingEnabled: boolean;
icpFilingNumber: string;
public: PublicAppearance;
configured: boolean;
updatedBy?: string;
@@ -61,7 +76,26 @@ export async function getAdminAppearance(signal?: AbortSignal) {
}
export async function updateAdminAppearance(
input: Pick<AdminAppearance, "brandName" | "brandSlug" | "authHeroTitle" | "authHeroDescription" | "logoResourceId" | "darkLogoResourceId" | "logoFrameEnabled" | "authVideoResourceId" | "authVideoPosterResourceId" | "skinId">,
input: Pick<
AdminAppearance,
| "brandName"
| "brandSlug"
| "authHeroTitle"
| "authHeroDescription"
| "logoResourceId"
| "darkLogoResourceId"
| "logoFrameEnabled"
| "authVideoResourceId"
| "authVideoPosterResourceId"
| "skinId"
| "skinThemes"
| "seoTitle"
| "seoDescription"
| "seoKeywords"
| "footerCopyright"
| "icpFilingEnabled"
| "icpFilingNumber"
>,
) {
const result = await request<{ setting: AdminAppearance }>(apiClient.patch("/admin/settings/appearance", input));
return result.setting;

View File

@@ -145,6 +145,7 @@ export type EmailSetting = {
encryption: "starttls" | "tls" | "none";
fromEmail: string;
fromName: string;
fromNameInherited: boolean;
hasPassword: boolean;
updatedBy?: string;
createdAt?: string;