diff --git a/app/pages/me/admin/config/index.vue b/app/pages/me/admin/config/index.vue index fdc0998..647be0a 100644 --- a/app/pages/me/admin/config/index.vue +++ b/app/pages/me/admin/config/index.vue @@ -8,6 +8,8 @@ type GlobalConfigPayload = { config: { siteName: string allowRegister: boolean + mediaOrphanAutoSweepEnabled: boolean + mediaOrphanAutoSweepIntervalMinutes: number } } @@ -18,6 +20,8 @@ const loading = ref(true) const saving = ref(false) const siteName = ref('') const allowRegister = ref(true) +const mediaOrphanAutoSweepEnabled = ref(false) +const mediaOrphanAutoSweepIntervalMinutes = ref(60) async function ensureAdmin() { await refresh(true) @@ -33,6 +37,8 @@ async function load() { const cfg = unwrapApiBody(res).config siteName.value = cfg.siteName allowRegister.value = cfg.allowRegister + mediaOrphanAutoSweepEnabled.value = cfg.mediaOrphanAutoSweepEnabled + mediaOrphanAutoSweepIntervalMinutes.value = cfg.mediaOrphanAutoSweepIntervalMinutes } finally { loading.value = false } @@ -55,6 +61,8 @@ async function save() { try { await putKey('siteName', siteName.value.trim()) await putKey('allowRegister', allowRegister.value) + await putKey('mediaOrphanAutoSweepEnabled', mediaOrphanAutoSweepEnabled.value) + await putKey('mediaOrphanAutoSweepIntervalMinutes', mediaOrphanAutoSweepIntervalMinutes.value) await load() await refreshGlobalConfig() } finally { @@ -69,7 +77,7 @@ async function save() { 应用配置

- 全局设置:站点名称与开放注册。 + 全局设置:站点名称、开放注册与媒体孤儿自动清扫。

@@ -89,6 +97,24 @@ async function save() { > + + + + + + 保存 diff --git a/server/service/config/registry.ts b/server/service/config/registry.ts index 0f43458..a0314fb 100644 --- a/server/service/config/registry.ts +++ b/server/service/config/registry.ts @@ -31,6 +31,21 @@ const CONFIG_REGISTRY = { defaultValue: true, userOverridable: false, }), + mediaOrphanAutoSweepEnabled: defineConfig({ + key: "mediaOrphanAutoSweepEnabled", + scope: "global", + valueType: "boolean", + defaultValue: false, + userOverridable: false, + }), + mediaOrphanAutoSweepIntervalMinutes: defineConfig({ + key: "mediaOrphanAutoSweepIntervalMinutes", + scope: "global", + valueType: "number", + defaultValue: 60, + userOverridable: false, + validate: (value: number) => Number.isInteger(value) && value >= 15 && value <= 1440, + }), theme: defineConfig({ key: "theme", scope: "both",