release: v1.3.0 — 整站备份恢复、跨后端同步与任务中心
ci / ci (22, ubuntu-latest) (push) Canceled after 0s
GitHub Release / release (push) Canceled after 0s
Publish Docker image / build (linux/amd64, ubuntu-latest, amd64) (push) Canceled after 0s
Publish Docker image / build (linux/arm64, ubuntu-24.04-arm, arm64) (push) Canceled after 0s
Publish Docker image / merge (push) Canceled after 0s

This commit is contained in:
O96u committed 2026-09-07 17:05:12 +08:00
1 parent b05d572221
commit f17d79b236
72 files changed
+4312 -559

No files matched your search

+57
View File
@@ -21,6 +21,53 @@ const deleteTarget = ref<StorageBackendItem | null>(null)
const deleteConfirmName = ref('')
const deleting = ref(false)
const backupPanelRef = ref<{ applySyncDraft: (draft: { fromBackendId: string, toBackendId: string }) => void } | null>(null)
function onMigrateIn(backend: StorageBackendItem) {
const defaultBackend = storageData.value?.backends.find(item => item.isDefault)
if (!defaultBackend || defaultBackend.id === backend.id) return
backupPanelRef.value?.applySyncDraft({
fromBackendId: defaultBackend.id,
toBackendId: backend.id
})
}
function onMigrateOut(backend: StorageBackendItem) {
const backends = storageData.value?.backends ?? []
if (backend.isDefault) {
const target = backends.find(item => !item.isDefault && item.enabled)
if (!target) return
backupPanelRef.value?.applySyncDraft({
fromBackendId: backend.id,
toBackendId: target.id
})
return
}
const defaultBackend = backends.find(item => item.isDefault)
if (!defaultBackend) return
backupPanelRef.value?.applySyncDraft({
fromBackendId: backend.id,
toBackendId: defaultBackend.id
})
}
function showMigrateIn(backend: StorageBackendItem): boolean {
const backends = storageData.value?.backends ?? []
return !backend.isDefault
&& backend.enabled
&& backends.some(item => item.isDefault)
}
function showMigrateOut(backend: StorageBackendItem): boolean {
const backends = storageData.value?.backends ?? []
if (backend.usage.count === 0) return false
if (backend.isDefault) {
return backends.some(item => !item.isDefault && item.enabled)
}
return backends.some(item => item.isDefault)
}
const defaultBackendName = computed(() => {
const backend = storageData.value?.backends.find(item => item.isDefault)
return backend?.name ?? t('storage.backendLocal')
@@ -297,14 +344,24 @@ watch(isAuthenticated, async (authed) => {
:backend="backend"
:env-override="storageData.envOverride"
:busy="busyId === backend.id"
:show-migrate-in="showMigrateIn(backend)"
:show-migrate-out="showMigrateOut(backend)"
@set-default="setDefault(backend)"
@edit="openEdit(backend)"
@test="testBackend(backend)"
@toggle-enabled="toggleEnabled(backend)"
@delete="confirmDelete(backend)"
@migrate-in="onMigrateIn(backend)"
@migrate-out="onMigrateOut(backend)"
/>
</div>
<StorageBackupPanel
v-if="!storageData.envOverride"
ref="backupPanelRef"
:backends="storageData.backends"
/>
<StorageSupportedBackends />
</template>
</section>