From ab9e8a5072d2fa012a0a56e1ebd2d58b1b4f169b Mon Sep 17 00:00:00 2001 From: hzm <934585316@qq.com> Date: Mon, 16 Mar 2026 11:37:04 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=90=8C=E6=AD=A5?= =?UTF-8?q?=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/components/PcFundTable.jsx | 33 +++++++------------- app/page.jsx | 57 +++++----------------------------- 2 files changed, 19 insertions(+), 71 deletions(-) diff --git a/app/components/PcFundTable.jsx b/app/components/PcFundTable.jsx index 66abcf0..ae36876 100644 --- a/app/components/PcFundTable.jsx +++ b/app/components/PcFundTable.jsx @@ -1007,40 +1007,31 @@ export default function PcFundTable({ --row-bg: var(--bg); background-color: var(--row-bg) !important; } + + /* 斑马纹行背景(非 hover 状态) */ .table-row-scroll:nth-child(even), .table-row-scroll.row-even { background-color: var(--table-row-alt-bg) !important; } - .table-row-scroll:hover { - --row-bg: var(--table-row-hover-bg); - background-color: var(--row-bg) !important; - } - /* Pinned cells inherit from parent row */ + /* Pinned cells 继承所在行的背景(非 hover 状态) */ .table-row-scroll .pinned-cell { background-color: var(--row-bg) !important; } .table-row-scroll:nth-child(even) .pinned-cell, - .table-row-scroll.row-even .pinned-cell { - background-color: var(--table-row-alt-bg) !important; - } - .table-row-scroll:hover .pinned-cell { - background-color: var(--table-row-hover-bg) !important; - } - .table-row-scroll:nth-child(even) { - background-color: var(--table-row-alt-bg); - } - .table-row-scroll:hover { - --row-bg: var(--table-row-hover-bg); - } - - /* Pinned cells in even rows */ + .table-row-scroll.row-even .pinned-cell, .row-even .pinned-cell { background-color: var(--table-row-alt-bg) !important; } - /* Pinned cells on hover */ - .table-row-scroll:hover .pinned-cell { + /* Hover 状态优先级最高,覆盖斑马纹和 pinned 背景 */ + .table-row-scroll:hover, + .table-row-scroll.row-even:hover { + --row-bg: var(--table-row-hover-bg); + background-color: var(--table-row-hover-bg) !important; + } + .table-row-scroll:hover .pinned-cell, + .table-row-scroll.row-even:hover .pinned-cell { background-color: var(--table-row-hover-bg) !important; } diff --git a/app/page.jsx b/app/page.jsx index 08f14de..d6dd061 100644 --- a/app/page.jsx +++ b/app/page.jsx @@ -3107,25 +3107,6 @@ export default function HomePage() { if (nextFunds.length) { const codes = Array.from(new Set(nextFunds.map((f) => f.code))); if (codes.length) await refreshAll(codes); - // 刷新完成后,强制同步本地localStorage 的 funds 数据到云端 - const currentUserId = userIdRef.current || user?.id; - if (currentUserId) { - try { - const latestFunds = JSON.parse(localStorage.getItem('funds') || '[]'); - const localSig = getFundCodesSignature(latestFunds, ['gztime']); - const cloudSig = getFundCodesSignature(Array.isArray(cloudData.funds) ? cloudData.funds : [], ['gztime']); - if (localSig !== cloudSig) { - await syncUserConfig( - currentUserId, - false, - { funds: Array.isArray(latestFunds) ? latestFunds : [] }, - true - ); - } - } catch (e) { - console.error('刷新后强制同步 funds 到云端失败', e); - } - } } const payload = collectLocalPayload(); @@ -3138,9 +3119,10 @@ export default function HomePage() { const fetchCloudConfig = async (userId, checkConflict = false) => { if (!userId) return; try { + // 一次查询同时拿到 meta 与 data,方便两种模式复用 const { data: meta, error: metaError } = await supabase .from('user_configs') - .select(`id, updated_at${checkConflict ? ', data' : ''}`) + .select('id, data, updated_at') .eq('user_id', userId) .maybeSingle(); @@ -3154,44 +3136,19 @@ export default function HomePage() { setCloudConfigModal({ open: true, userId, type: 'empty' }); return; } + + // 冲突检查模式:使用 meta.data 弹出冲突确认弹窗 if (checkConflict) { setCloudConfigModal({ open: true, userId, type: 'conflict', cloudData: meta.data }); return; } - const localUpdatedAt = window.localStorage.getItem('localUpdatedAt'); - if (localUpdatedAt && meta.updated_at && new Date(meta.updated_at) < new Date(localUpdatedAt)) { + // 非冲突检查模式:直接复用上方查询到的 meta 数据,覆盖本地 + if (meta.data && isPlainObject(meta.data) && Object.keys(meta.data).length > 0) { + await applyCloudConfig(meta.data, meta.updated_at); return; } - const { data, error } = await supabase - .from('user_configs') - .select('id, data, updated_at') - .eq('user_id', userId) - .maybeSingle(); - - if (error) throw error; - - if (data?.data && isPlainObject(data.data) && Object.keys(data.data).length > 0) { - const localPayload = collectLocalPayload(); - const localComparable = getComparablePayload(localPayload); - const cloudComparable = getComparablePayload(data.data); - - if (localComparable !== cloudComparable) { - // 如果数据不一致 - if (checkConflict) { - // 只有明确要求检查冲突时才提示(例如刚登录时) - setCloudConfigModal({ open: true, userId, type: 'conflict', cloudData: data.data }); - return; - } - // 否则直接覆盖本地(例如已登录状态下的刷新) - await applyCloudConfig(data.data, data.updated_at); - return; - } - - await applyCloudConfig(data.data, data.updated_at); - return; - } setCloudConfigModal({ open: true, userId, type: 'empty' }); } catch (e) { console.error('获取云端配置失败', e);