新增连接后上传本地数据到远程的手动入口

This commit is contained in:
JSR
2026-03-19 17:36:53 +08:00
parent 27f61ddd0c
commit 7d64f33328
3 changed files with 84 additions and 2 deletions
+66
View File
@@ -79,6 +79,7 @@ export const Settings: React.FC<{ permission: permissionLevel }> = ({ permission
}>({ connected: true, type: "sqlite" })
const [pgTestLoading, setPgTestLoading] = useState(false)
const [pgSwitchLoading, setPgSwitchLoading] = useState(false)
const [pgUploadLoading, setPgUploadLoading] = useState(false)
const permissionTag = useMemo(() => {
return (
@@ -360,6 +361,61 @@ export const Settings: React.FC<{ permission: permissionLevel }> = ({ permission
}
}
const uploadLocalToRemote = async () => {
if (!(window as any).api) return
try {
const statusRes = await (window as any).api.dbGetStatus()
if (!statusRes.success || !statusRes.data?.connected || statusRes.data?.type !== "postgresql") {
messageApi.warning(t("settings.database.uploadNeedRemote"))
return
}
const previewRes = await (window as any).api.dbSyncPreview()
if (!previewRes.success || !previewRes.data?.can_sync) {
messageApi.error(previewRes.message || previewRes.data?.message || t("settings.database.uploadFailed"))
return
}
if (!previewRes.data.need_sync) {
messageApi.info(t("settings.database.noNeedUpload"))
return
}
Modal.confirm({
title: t("settings.database.uploadConfirmTitle"),
content: t("settings.database.uploadConfirmContent", {
localOnly: previewRes.data.local_only || 0,
remoteOnly: previewRes.data.remote_only || 0,
conflicts: previewRes.data.conflicts?.length || 0,
}),
okText: t("settings.database.uploadButton"),
cancelText: t("common.cancel"),
onOk: async () => {
setPgUploadLoading(true)
try {
const applyRes = await (window as any).api.dbSyncApply("keep_local")
if (applyRes.success && applyRes.data?.success) {
messageApi.success(
applyRes.data?.message || t("settings.database.uploadSuccess")
)
emitDataUpdated("all")
await loadAll()
} else {
messageApi.error(
applyRes.data?.message || applyRes.message || t("settings.database.uploadFailed")
)
}
} catch (e: any) {
messageApi.error(e?.message || t("settings.database.uploadFailed"))
} finally {
setPgUploadLoading(false)
}
},
})
} catch (e: any) {
messageApi.error(e?.message || t("settings.database.uploadFailed"))
}
}
const currentYear = new Date().getFullYear()
const tabItems = [
@@ -678,7 +734,17 @@ export const Settings: React.FC<{ permission: permissionLevel }> = ({ permission
>
{t("settings.database.switchToSQLite")}
</Button>
<Button
onClick={uploadLocalToRemote}
loading={pgUploadLoading}
disabled={!canAdmin || pgConnectionStatus.type !== "postgresql"}
>
{t("settings.database.uploadButton")}
</Button>
</Space>
<div style={{ marginTop: "8px", fontSize: "12px", color: "var(--ss-text-secondary)" }}>
{t("settings.database.uploadHint")}
</div>
</Card>
<Card style={{ backgroundColor: "var(--ss-card-bg)", color: "var(--ss-text-main)" }}>
+9 -1
View File
@@ -205,7 +205,15 @@
"syncPoint3": "Application restart required after switching database.",
"syncPoint4": "Recommended cloud database services: Neon, Supabase, AWS RDS, etc.",
"enterConnectionString": "Please enter PostgreSQL connection string",
"connectionExample": "Example: postgresql://xxxxxx_xxxxx:xxxxxxxx@xx-xxx.xxx.neon.xxxx/xxxxdxx?sslmode=require"
"connectionExample": "Example: postgresql://xxxxxx_xxxxx:xxxxxxxx@xx-xxx.xxx.neon.xxxx/xxxxdxx?sslmode=require",
"uploadButton": "Upload Local Data to Remote",
"uploadHint": "After connecting remote database, upload and merge local SQLite history into remote.",
"uploadNeedRemote": "Please connect to PostgreSQL remote database first",
"noNeedUpload": "Local and remote data are already consistent",
"uploadConfirmTitle": "Upload local data to remote?",
"uploadConfirmContent": "Sync will prefer local data. Detected local-only {{localOnly}}, remote-only {{remoteOnly}}, conflicts {{conflicts}}.",
"uploadSuccess": "Local data uploaded to remote",
"uploadFailed": "Upload failed"
},
"data": {
"title": "Data Management",
+9 -1
View File
@@ -205,7 +205,15 @@
"syncPoint3": "切换数据库后需要重启应用以生效。",
"syncPoint4": "建议使用云数据库服务(如 Neon、Supabase、AWS RDS 等)。",
"enterConnectionString": "请输入 PostgreSQL 连接字符串",
"connectionExample": "示例:postgresql://xxxxxx_xxxxx:xxxxxxxx@xx-xxx.xxx.neon.xxxx/xxxxdxx?sslmode=require"
"connectionExample": "示例:postgresql://xxxxxx_xxxxx:xxxxxxxx@xx-xxx.xxx.neon.xxxx/xxxxdxx?sslmode=require",
"uploadButton": "上传本地数据到远程",
"uploadHint": "连接远程数据库后,可将本地 SQLite 历史数据上传并合并到远程。",
"uploadNeedRemote": "请先切换并连接到 PostgreSQL 远程数据库",
"noNeedUpload": "本地与远程数据已一致,无需上传",
"uploadConfirmTitle": "确认上传本地数据到远程?",
"uploadConfirmContent": "将以本地数据为优先进行同步。检测到本地新增 {{localOnly}} 条、远程新增 {{remoteOnly}} 条、冲突 {{conflicts}} 条。",
"uploadSuccess": "本地数据已上传到远程",
"uploadFailed": "上传失败"
},
"data": {
"title": "数据管理",