From b5430ad1da9df1bef42905644d8b534785805843 Mon Sep 17 00:00:00 2001 From: npmrun <1549469775@qq.com> Date: Sun, 19 Apr 2026 11:27:47 +0800 Subject: [PATCH] feat(config): publicSiteUrl for same-origin media refs; copy uses it Made-with: Cursor --- app/composables/useGlobalConfig.ts | 3 ++ app/pages/me/admin/config/index.vue | 12 ++++++- app/pages/me/media/index.vue | 26 +++++++++++--- server/service/config/registry.ts | 26 ++++++++++++++ server/service/media/index.ts | 23 +++++++++++-- server/utils/post-media-urls.test.ts | 30 +++++++++++++--- server/utils/post-media-urls.ts | 66 ++++++++++++++++++++++++++++++------ 7 files changed, 163 insertions(+), 23 deletions(-) diff --git a/app/composables/useGlobalConfig.ts b/app/composables/useGlobalConfig.ts index 9aa8436..858070b 100644 --- a/app/composables/useGlobalConfig.ts +++ b/app/composables/useGlobalConfig.ts @@ -3,6 +3,8 @@ import { request, unwrapApiBody, type ApiResponse } from '../utils/http/factory' export type GlobalConfig = { siteName: string allowRegister: boolean + /** 与后台「站点对外地址」一致;空表示未配置 */ + publicSiteUrl: string } type GlobalConfigResult = { @@ -12,6 +14,7 @@ type GlobalConfigResult = { const DEFAULT_GLOBAL_CONFIG: GlobalConfig = { siteName: 'Person Panel', allowRegister: true, + publicSiteUrl: '', } export function useGlobalConfig() { diff --git a/app/pages/me/admin/config/index.vue b/app/pages/me/admin/config/index.vue index 4db7b30..e46f2ce 100644 --- a/app/pages/me/admin/config/index.vue +++ b/app/pages/me/admin/config/index.vue @@ -7,6 +7,7 @@ type GlobalConfigPayload = { config: { siteName: string allowRegister: boolean + publicSiteUrl: string mediaOrphanAutoSweepEnabled: boolean mediaOrphanAutoSweepIntervalMinutes: number } @@ -21,6 +22,7 @@ const loading = ref(true) const saving = ref(false) const siteName = ref('') const allowRegister = ref(true) +const publicSiteUrl = ref('') const mediaOrphanAutoSweepEnabled = ref(false) const mediaOrphanAutoSweepIntervalMinutes = ref(60) @@ -37,6 +39,7 @@ async function load() { const { config: cfg } = await fetchData('/api/config/global') siteName.value = cfg.siteName allowRegister.value = cfg.allowRegister + publicSiteUrl.value = typeof cfg.publicSiteUrl === 'string' ? cfg.publicSiteUrl : '' mediaOrphanAutoSweepEnabled.value = cfg.mediaOrphanAutoSweepEnabled mediaOrphanAutoSweepIntervalMinutes.value = cfg.mediaOrphanAutoSweepIntervalMinutes } finally { @@ -61,6 +64,7 @@ async function save() { try { await putKey('siteName', siteName.value.trim()) await putKey('allowRegister', allowRegister.value) + await putKey('publicSiteUrl', publicSiteUrl.value.trim()) await putKey('mediaOrphanAutoSweepEnabled', mediaOrphanAutoSweepEnabled.value) await putKey('mediaOrphanAutoSweepIntervalMinutes', mediaOrphanAutoSweepIntervalMinutes.value) await load() @@ -78,7 +82,7 @@ async function save() { 应用配置

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

@@ -99,6 +103,12 @@ async function save() { + + + diff --git a/app/pages/me/media/index.vue b/app/pages/me/media/index.vue index 1a47a89..a52288a 100644 --- a/app/pages/me/media/index.vue +++ b/app/pages/me/media/index.vue @@ -1,5 +1,6 @@