add switch for preferred aliyun oss uploads
Some checks failed
Lint / build (20) (push) Has been cancelled
Playwright Tests / test (push) Has been cancelled

This commit is contained in:
Your Name 2026-03-17 23:01:17 +08:00
parent 67da32512a
commit 57b784f542
4 changed files with 44 additions and 2 deletions

View File

@ -293,6 +293,7 @@ type StorageFailoverConfig = {
type OssImageMigrationConfig = {
enabled: boolean;
preferAliyunForUploads: boolean;
sourceStorageConfigId: string;
targetStorageConfigId: string;
migrateAfterHours: number;
@ -321,6 +322,7 @@ const defaultStorageFailoverConfig: StorageFailoverConfig = {
const defaultOssImageMigrationConfig: OssImageMigrationConfig = {
enabled: true,
preferAliyunForUploads: true,
sourceStorageConfigId: "",
targetStorageConfigId: "",
migrateAfterHours: 48,
@ -789,6 +791,8 @@ export function AdminSettingsClient() {
},
ossImageMigrationConfig: {
enabled: (siteSettingsData as any).ossImageMigrationConfig?.enabled !== false,
preferAliyunForUploads:
(siteSettingsData as any).ossImageMigrationConfig?.preferAliyunForUploads !== false,
sourceStorageConfigId: String(
(siteSettingsData as any).ossImageMigrationConfig?.sourceStorageConfigId || ""
).trim(),
@ -7794,6 +7798,30 @@ export function AdminSettingsClient() {
/>
</div>
<div className="flex items-center justify-between rounded-lg border p-4">
<div className="space-y-1">
<Label className="text-sm font-medium">默认使用阿里云 OSS 入口桶</Label>
<p className="text-xs text-muted-foreground">
关闭后新上传图片直接走当前默认存储,不再优先进入阿里云 OSS。
</p>
<p className="text-xs text-muted-foreground">
该开关只影响新图上传入口,不影响下方的转存时间、清理时间、单次批量任务设置。
</p>
</div>
<Switch
checked={siteSettings.ossImageMigrationConfig.preferAliyunForUploads}
onCheckedChange={(checked) =>
setSiteSettings((prev) => ({
...prev,
ossImageMigrationConfig: {
...prev.ossImageMigrationConfig,
preferAliyunForUploads: checked,
},
}))
}
/>
</div>
<div className="grid gap-4 md:grid-cols-2">
<div className="space-y-2">
<Label>OSS 源桶(可选指定)</Label>
@ -7809,7 +7837,9 @@ export function AdminSettingsClient() {
}))
}
>
<SelectTrigger>
<SelectTrigger
disabled={!siteSettings.ossImageMigrationConfig.preferAliyunForUploads}
>
<SelectValue placeholder="自动选择阿里云 OSS(默认优先)" />
</SelectTrigger>
<SelectContent>
@ -7829,6 +7859,11 @@ export function AdminSettingsClient() {
))}
</SelectContent>
</Select>
{!siteSettings.ossImageMigrationConfig.preferAliyunForUploads ? (
<p className="text-xs text-muted-foreground">
已关闭默认走阿里云 OSS,当前源桶选择不会用于新上传图片。
</p>
) : null}
</div>
<div className="space-y-2">

View File

@ -659,6 +659,7 @@ const updateSchema = z.object({
ossImageMigrationConfig: z
.object({
enabled: z.boolean().optional(),
preferAliyunForUploads: z.boolean().optional(),
sourceStorageConfigId: z.string().max(128).optional(),
targetStorageConfigId: z.string().max(128).optional(),
migrateAfterHours: z.number().min(1).max(720).optional(),

View File

@ -2,6 +2,7 @@ export const OSS_MIGRATION_CONFIG_KEY = "oss_image_migration_config";
export type OssImageMigrationConfig = {
enabled: boolean;
preferAliyunForUploads: boolean;
sourceStorageConfigId: string;
targetStorageConfigId: string;
migrateAfterHours: number;
@ -11,6 +12,7 @@ export type OssImageMigrationConfig = {
export const defaultOssImageMigrationConfig: OssImageMigrationConfig = {
enabled: true,
preferAliyunForUploads: true,
sourceStorageConfigId: "",
targetStorageConfigId: "",
migrateAfterHours: 48,
@ -51,6 +53,7 @@ export function normalizeOssImageMigrationConfig(
return {
enabled: raw.enabled !== false,
preferAliyunForUploads: raw.preferAliyunForUploads !== false,
sourceStorageConfigId: String(raw.sourceStorageConfigId || "").trim(),
targetStorageConfigId: String(raw.targetStorageConfigId || "").trim(),
migrateAfterHours: normalizedMigrateAfterHours,
@ -58,4 +61,3 @@ export function normalizeOssImageMigrationConfig(
batchSize: normalizedBatchSize,
};
}

View File

@ -254,6 +254,10 @@ function normalizeStorageFailoverConfig(value: unknown): {
async function resolvePreferredUploadStorageConfig(
migrationConfig: OssImageMigrationConfig
): Promise<StorageConfig | undefined> {
if (!migrationConfig.enabled || !migrationConfig.preferAliyunForUploads) {
return await getDefaultStorageConfig();
}
const preferredAliyunConfig = await getPreferredAliyunStorageConfig({
preferredId: migrationConfig.sourceStorageConfigId || undefined,
});