fix: 修复登录报错key问题

This commit is contained in:
电摇小子
2026-07-14 11:07:35 +08:00
parent aebf56b3f7
commit eaf8e9b07d
11 changed files with 215 additions and 77 deletions
+20
View File
@@ -624,6 +624,25 @@ function App(): React.ReactElement {
setDbKeyStatusKind('normal')
}
const handleReturnToLogin = (): void => {
setIsAuthenticated(false)
setIsDatabaseConnected(false)
setBootState('login')
setActivePage('archive')
setSettingsCategory('database-key')
setSelectedContact(null)
setMessages([])
setContacts([])
setFilteredContacts([])
setSelfInfo(null)
setIsMessagesLoading(false)
setIsNativeMonitorActive(false)
setReportNotice('')
setDbKeyStatus('已断开当前连接,可重新输入或获取数据库密钥')
setDbKeyStatusKind('normal')
setStartupProgress(null)
}
const getDateRangeParams = (
range: string
): { startTime: number | undefined; endTime: number | undefined } => {
@@ -1140,6 +1159,7 @@ function App(): React.ReactElement {
onSelfInfoChange={setSelfInfo}
onContactsChange={setContacts}
onFilteredContactsChange={setFilteredContacts}
onReturnToLogin={handleReturnToLogin}
onAIRuntimeChange={(config: AIRuntimeModelConfig) => setAiModelConfig(config)}
onNotice={setReportNotice}
onOpenSettings={openSettings}
+1 -1
View File
@@ -3825,7 +3825,7 @@ body {
.database-key-auto-error { display:grid; gap:4px; margin-top:16px; padding:12px 14px; border-left:3px solid #c68635; background:#fff8ec; color:#79501f; font-size:12px; }.database-key-auto-error span { overflow-wrap:anywhere; }.database-key-auto-error p { color:#79501f; }.database-key-auto-error button { justify-self:start; border:0; padding:4px 0; background:transparent; color:#247a63; cursor:pointer; font:600 12px inherit; }
.database-key-security-info { display:grid; grid-template-columns:repeat(3,minmax(0,1fr)); gap:1px; overflow:hidden; border:1px solid #e3e8e5; border-radius:9px; background:#e3e8e5; }.database-key-security-info span { display:grid; gap:6px; padding:15px; background:#f5f7f6; color:#66706b; font-size:12px; line-height:1.5; }.database-key-security-info strong { color:#35403b; font-size:13px; }
.database-key-diagnostics { margin-top:22px; border:1px solid #dde3e0; border-radius:9px; background:#fff; }.database-key-diagnostics summary { padding:14px 16px; color:#46514c; cursor:pointer; font-size:13px; font-weight:600; }.database-key-diagnostics dl { display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:14px 28px; margin:0; padding:2px 16px 16px; }.database-key-diagnostics button { margin:0 16px 16px; border:0; padding:0; background:transparent; color:#247a63; cursor:pointer; font:600 12px inherit; }
.database-key-danger { margin-top:30px; padding-bottom:1px; }.database-key-danger>h2 { margin:0 0 14px; color:#c85a5a; font-size:15px; }.database-key-danger>div { display:flex; align-items:center; justify-content:space-between; gap:20px; padding:16px 20px; border:1px solid #efcdcd; background:#fff7f7; }.database-key-danger>div:first-of-type { border-radius:9px 9px 0 0; }.database-key-danger>div:last-of-type { border-top:0; border-radius:0 0 9px 9px; }.database-key-danger span { display:grid; gap:4px; }.database-key-danger strong { color:#4a3c3c; font-size:13px; }.database-key-danger small { color:#786868; font-size:12px; }.database-key-danger button { min-height:34px; flex:0 0 auto; border:1px solid #e8baba; border-radius:8px; padding:0 13px; background:#fff; color:#c85a5a; cursor:pointer; }.database-key-danger button:disabled { cursor:not-allowed; opacity:.45; }
.database-key-connection-actions { margin-top:30px; }.database-key-connection-actions>h2 { margin:0 0 14px; color:#3d4742; font-size:15px; }.database-key-connection-actions>div { display:flex; align-items:center; justify-content:space-between; gap:20px; padding:16px 20px; border:1px solid #dde3e0; border-radius:9px; background:#fff; }.database-key-connection-actions span { display:grid; gap:4px; }.database-key-connection-actions strong { color:#35403b; font-size:13px; }.database-key-connection-actions small { color:#66706b; font-size:12px; }.database-key-connection-actions button { min-height:34px; flex:0 0 auto; border:1px solid #247a63; border-radius:8px; padding:0 13px; background:#fff; color:#247a63; cursor:pointer; }.database-key-connection-actions button:hover:not(:disabled) { background:#f0f7f4; }.database-key-danger { margin-top:30px; padding-bottom:1px; }.database-key-danger>h2 { margin:0 0 14px; color:#c85a5a; font-size:15px; }.database-key-danger>div { display:flex; align-items:center; justify-content:space-between; gap:20px; padding:16px 20px; border:1px solid #efcdcd; background:#fff7f7; }.database-key-danger>div:first-of-type { border-radius:9px 9px 0 0; }.database-key-danger>div:last-of-type { border-top:0; border-radius:0 0 9px 9px; }.database-key-danger span { display:grid; gap:4px; }.database-key-danger strong { color:#4a3c3c; font-size:13px; }.database-key-danger small { color:#786868; font-size:12px; }.database-key-danger button { min-height:34px; flex:0 0 auto; border:1px solid #e8baba; border-radius:8px; padding:0 13px; background:#fff; color:#c85a5a; cursor:pointer; }.database-key-danger button:disabled { cursor:not-allowed; opacity:.45; }
.database-key-confirm-backdrop { position:fixed; z-index:30; inset:0; display:grid; place-items:center; padding:24px; background:rgba(25,32,29,.34); }.database-key-confirm { width:min(100%,430px); padding:22px; border-radius:12px; background:#fff; box-shadow:0 18px 50px rgba(24,35,30,.2); }.database-key-confirm h2 { margin:0; color:#202724; font-size:17px; }.database-key-confirm p { margin:12px 0 22px; color:#66706b; font-size:13px; line-height:1.7; }.database-key-confirm>div { display:flex; justify-content:flex-end; gap:8px; }.database-key-confirm button { min-height:34px; border:1px solid #dde3e0; border-radius:8px; padding:0 14px; background:#fff; color:#46514c; cursor:pointer; }.database-key-confirm button.danger { border-color:#c85a5a; background:#c85a5a; color:#fff; }
/* SETTINGS-03: image decryption */
.image-decryption-content { padding-bottom:48px; }
@@ -20,6 +20,7 @@ export function SettingsWorkspace({
onSelfInfoChange,
onContactsChange,
onFilteredContactsChange,
onReturnToLogin,
onAIRuntimeChange,
onNotice,
onOpenSettings
@@ -34,6 +35,7 @@ export function SettingsWorkspace({
onSelfInfoChange: (info: SettingsSelfInfo | null) => void
onContactsChange: (contacts: Contact[]) => void
onFilteredContactsChange: (contacts: Contact[]) => void
onReturnToLogin: () => void
onAIRuntimeChange: (config: AIRuntimeModelConfig) => void
onNotice: (message: string) => void
onOpenSettings: () => void
@@ -64,6 +66,7 @@ export function SettingsWorkspace({
onSelfInfoChange={onSelfInfoChange}
onContactsChange={onContactsChange}
onFilteredContactsChange={onFilteredContactsChange}
onReturnToLogin={onReturnToLogin}
onNotice={onNotice}
/>
) : selectedCategory === 'image-key' ? (
@@ -3,15 +3,30 @@ import { useState } from 'react'
export function DatabaseKeyDangerZone({
disabled,
onClear,
onReplace
onReplace,
onReturnToLogin
}: {
disabled: boolean
onClear: () => void
onReplace: () => void
onReturnToLogin: () => void
}): React.ReactElement {
const [confirming, setConfirming] = useState(false)
const [confirmingReturn, setConfirmingReturn] = useState(false)
return (
<>
<section className="database-key-connection-actions">
<h2></h2>
<div>
<span>
<strong></strong>
<small></small>
</span>
<button type="button" onClick={() => setConfirmingReturn(true)}>
</button>
</div>
</section>
<section className="database-key-danger">
<h2></h2>
<div>
@@ -69,6 +84,41 @@ export function DatabaseKeyDangerZone({
</div>
</div>
)}
{confirmingReturn && (
<div
className="database-key-confirm-backdrop"
role="presentation"
onMouseDown={() => setConfirmingReturn(false)}
>
<div
className="database-key-confirm"
role="dialog"
aria-modal="true"
aria-labelledby="database-key-return-confirm-title"
onMouseDown={(event) => event.stopPropagation()}
>
<h2 id="database-key-return-confirm-title"></h2>
<p>
WechatExplorer
</p>
<div>
<button type="button" onClick={() => setConfirmingReturn(false)}>
</button>
<button
type="button"
onClick={() => {
setConfirmingReturn(false)
onReturnToLogin()
}}
>
</button>
</div>
</div>
</div>
)}
</>
)
}
@@ -59,6 +59,7 @@ export interface DatabaseKeyController {
saveKey: () => Promise<void>
autoDetectKey: () => Promise<void>
clearSavedKey: () => Promise<void>
returnToLogin: () => Promise<void>
copyDiagnostics: () => Promise<void>
refreshEnvironment: () => Promise<void>
}
@@ -14,6 +14,7 @@ export function useDatabaseKeyController({
onSelfInfoChange,
onContactsChange,
onFilteredContactsChange,
onReturnToLogin,
onNotice
}: {
dbKey: string
@@ -24,6 +25,7 @@ export function useDatabaseKeyController({
onSelfInfoChange: (info: SettingsSelfInfo | null) => void
onContactsChange: (contacts: Contact[]) => void
onFilteredContactsChange: (contacts: Contact[]) => void
onReturnToLogin: () => void
onNotice: (message: string) => void
}): DatabaseKeyController {
const [state, dispatch] = useReducer(databaseKeyReducer, initialDatabaseKeyState)
@@ -188,6 +190,26 @@ export function useDatabaseKeyController({
refreshEnvironment
])
const returnToLogin = useCallback(async (): Promise<void> => {
const result = await window.api.disconnectDb()
if (!result.success) {
onNotice(result.error || '断开数据库连接失败')
return
}
onDatabaseConnectionChange(false)
onSelfInfoChange(null)
onContactsChange([])
onFilteredContactsChange([])
onReturnToLogin()
}, [
onContactsChange,
onDatabaseConnectionChange,
onFilteredContactsChange,
onNotice,
onReturnToLogin,
onSelfInfoChange
])
const copyDiagnostics = useCallback(async (): Promise<void> => {
const result = await window.api.copyText(
buildDatabaseKeyDiagnostics(state, dbKey, selfInfo, dbReady)
@@ -214,6 +236,7 @@ export function useDatabaseKeyController({
saveKey,
autoDetectKey,
clearSavedKey,
returnToLogin,
copyDiagnostics,
refreshEnvironment
}
@@ -24,6 +24,7 @@ export function DatabaseKeyPage({
onSelfInfoChange,
onContactsChange,
onFilteredContactsChange,
onReturnToLogin,
onNotice
}: {
dbKey: string
@@ -34,6 +35,7 @@ export function DatabaseKeyPage({
onSelfInfoChange: (info: SettingsSelfInfo | null) => void
onContactsChange: (contacts: Contact[]) => void
onFilteredContactsChange: (contacts: Contact[]) => void
onReturnToLogin: () => void
onNotice: (message: string) => void
}): React.ReactElement {
const controller = useDatabaseKeyController({
@@ -45,6 +47,7 @@ export function DatabaseKeyPage({
onSelfInfoChange,
onContactsChange,
onFilteredContactsChange,
onReturnToLogin,
onNotice
})
@@ -132,6 +135,7 @@ export function DatabaseKeyPage({
disabled={controller.isBusy || !controller.state.saved}
onClear={() => void controller.clearSavedKey()}
onReplace={scrollToEditor}
onReturnToLogin={() => void controller.returnToLogin()}
/>
</div>
</div>