diff --git a/src/services/droidAccountService.js b/src/services/droidAccountService.js index 8338caf0..8a98db74 100644 --- a/src/services/droidAccountService.js +++ b/src/services/droidAccountService.js @@ -782,6 +782,8 @@ class DroidAccountService { } const storedAccount = await redis.getDroidAccount(accountId) + const hasStoredAccount = + storedAccount && typeof storedAccount === 'object' && Object.keys(storedAccount).length > 0 const sanitizedUpdates = { ...updates } if (typeof sanitizedUpdates.accessToken === 'string') { @@ -905,7 +907,7 @@ class DroidAccountService { // 使用 Redis 中的原始数据获取加密的 API Key 条目 const existingApiKeyEntries = this._parseApiKeyEntries( - storedAccount && Object.prototype.hasOwnProperty.call(storedAccount, 'apiKeys') + hasStoredAccount && Object.prototype.hasOwnProperty.call(storedAccount, 'apiKeys') ? storedAccount.apiKeys : '' ) @@ -957,13 +959,29 @@ class DroidAccountService { encryptedUpdates.accessToken = this._encryptSensitiveData(sanitizedUpdates.accessToken) } + const baseAccountData = hasStoredAccount ? { ...storedAccount } : { id: accountId } + const updatedData = { - ...account, - ...encryptedUpdates, - refreshToken: - encryptedUpdates.refreshToken || this._encryptSensitiveData(account.refreshToken), - accessToken: encryptedUpdates.accessToken || this._encryptSensitiveData(account.accessToken), - proxy: encryptedUpdates.proxy + ...baseAccountData, + ...encryptedUpdates + } + + if (!Object.prototype.hasOwnProperty.call(updatedData, 'refreshToken')) { + updatedData.refreshToken = + hasStoredAccount && Object.prototype.hasOwnProperty.call(storedAccount, 'refreshToken') + ? storedAccount.refreshToken + : this._encryptSensitiveData(account.refreshToken) + } + + if (!Object.prototype.hasOwnProperty.call(updatedData, 'accessToken')) { + updatedData.accessToken = + hasStoredAccount && Object.prototype.hasOwnProperty.call(storedAccount, 'accessToken') + ? storedAccount.accessToken + : this._encryptSensitiveData(account.accessToken) + } + + if (!Object.prototype.hasOwnProperty.call(updatedData, 'proxy')) { + updatedData.proxy = hasStoredAccount ? storedAccount.proxy || '' : account.proxy || '' } await redis.setDroidAccount(accountId, updatedData) diff --git a/web/admin-spa/src/components/accounts/AccountForm.vue b/web/admin-spa/src/components/accounts/AccountForm.vue index 604817ff..58ae7f32 100644 --- a/web/admin-spa/src/components/accounts/AccountForm.vue +++ b/web/admin-spa/src/components/accounts/AccountForm.vue @@ -3160,6 +3160,15 @@ const parseProxyResponse = (rawProxy) => { } } + if ( + proxyObject && + typeof proxyObject === 'object' && + proxyObject.proxy && + typeof proxyObject.proxy === 'object' + ) { + proxyObject = proxyObject.proxy + } + if (!proxyObject || typeof proxyObject !== 'object') { return null } diff --git a/web/admin-spa/src/views/AccountsView.vue b/web/admin-spa/src/views/AccountsView.vue index 3abc1ec3..038afa34 100644 --- a/web/admin-spa/src/views/AccountsView.vue +++ b/web/admin-spa/src/views/AccountsView.vue @@ -2488,7 +2488,7 @@ const filterByGroup = () => { } // 规范化代理配置,支持字符串与对象 -const normalizeProxyData = (proxy) => { +function normalizeProxyData(proxy) { if (!proxy) { return null }