@@ -2,13 +2,21 @@ import type { BaseState } from '../stores/base'
22import { getDefaultBaseState , useBaseStore } from '../stores/base'
33import type { SettingState } from '../stores/setting'
44import { getDefaultSettingState } from '../stores/setting'
5- import { Dict , ShortcutKey } from '../types'
65import type { DictResource } from '../types'
7- import { CompareResult , DictType , getDefaultDict , getDefaultWord } from '../types'
6+ import { CompareResult , Dict , DictType , getDefaultDict , getDefaultWord , ShortcutKey } from '../types'
87import { useRouter } from 'vue-router'
98import { useRuntimeStore } from '../stores/runtime'
109import dayjs from 'dayjs'
11- import { APP_VERSION , AppEnv , DefaultShortcutKeyMap , DictId , ENV , RESOURCE_PATH , SAVE_DICT_KEY } from '../config/env'
10+ import {
11+ APP_VERSION ,
12+ AppEnv ,
13+ BACKUP_INDEX_KEY ,
14+ DefaultShortcutKeyMap ,
15+ DictId ,
16+ ENV ,
17+ RESOURCE_PATH ,
18+ SAVE_DICT_KEY ,
19+ } from '../config/env'
1220import { nextTick } from 'vue'
1321import { Toast } from '@typewords/base'
1422import duration from 'dayjs/plugin/duration'
@@ -121,13 +129,48 @@ export async function checkAndUpgradeSaveSetting(val: any) {
121129 if ( version <= 18 ) {
122130 defaultState . shortcutKeyMap [ ShortcutKey . Next ] = DefaultShortcutKeyMap [ ShortcutKey . Next ]
123131 }
132+ //3/20晚上10点25推的代码,这个地方出了一个bug,ShortcutKey没导入,导致抛异常后返回了默认值,所有的用户的setting都变成默认值了。
133+ //在这里读取之前的快照,如果存在则从里面读取setting的firstTime,
134+ //判断是否与当前值相等,不相等则取快照的值并将本地的update_at更新,以免被远程覆盖
135+ if ( version === 19 ) {
136+ try {
137+ let firstTimePatchedFromSnapshot = false
138+ const snapshotCutoffTime = new Date ( '2026-03-20T22:25:00+08:00' ) . getTime ( )
139+ const rawIndex = ( await get ( BACKUP_INDEX_KEY ) ) as Array < { key ?: string ; createdAt ?: number } > | null
140+ const index = Array . isArray ( rawIndex ) ? rawIndex : [ ]
141+ const targetSnapshot = index
142+ . filter ( item => typeof item ?. key === 'string' && Number ( item ?. createdAt ) <= snapshotCutoffTime )
143+ . sort ( ( a , b ) => Number ( b . createdAt ) - Number ( a . createdAt ) ) [ 0 ]
144+ if ( targetSnapshot ?. key ) {
145+ const snapshot = await get ( targetSnapshot . key )
146+ const snapshotSettingRaw = snapshot ?. data ?. setting
147+ let snapshotSettingState : any = null
148+ if ( typeof snapshotSettingRaw === 'string' ) {
149+ snapshotSettingState = JSON . parse ( snapshotSettingRaw ) ?. val ?? null
150+ } else if ( snapshotSettingRaw && typeof snapshotSettingRaw === 'object' ) {
151+ snapshotSettingState = snapshotSettingRaw ?. val ?? null
152+ }
153+ const snapshotFirstTime = Number ( snapshotSettingState ?. firstTime )
154+ const currentFirstTime = Number ( state ?. firstTime )
155+ if ( Number . isFinite ( snapshotFirstTime ) && snapshotFirstTime > 0 && snapshotFirstTime !== currentFirstTime ) {
156+ state . firstTime = snapshotFirstTime
157+ firstTimePatchedFromSnapshot = true
158+ }
159+ ; ( defaultState as any ) . __firstTimePatchedFromSnapshot = firstTimePatchedFromSnapshot
160+ }
161+ } catch ( e ) {
162+ console . warn ( 'firstTime 快照回填跳过或失败,忽略并继续' , e )
163+ }
164+ }
165+
124166 //为了保持永远是最新的快捷键选项列表,但保留住用户的自定义设置,去掉无效的快捷键选项
125167 //例: 2版本,可能有快捷键A。3版本没有了
126168 checkRiskKey ( defaultState . shortcutKeyMap , state . shortcutKeyMap )
127169 delete state . shortcutKeyMap
128170 checkRiskKey ( defaultState , state )
129171 return defaultState
130172 } catch ( e ) {
173+ await saveHashSnapshot ( '数据解析异常-自动备份' , '' )
131174 return defaultState
132175 }
133176 }
0 commit comments