refactor: 前端本地偏好统一为公共存储层

- 新增 frontend/src/utils/storageKeys.ts 集中维护存储键常量并登记旧键迁移
- 新增 frontend/src/utils/storage.ts 统一 localStorage/sessionStorage 读写与异常容错
- 新增 frontend/src/composables/usePreference.ts 提供 useStringPreference 响应式字符串偏好
- 新增 frontend/src/utils/transactionFilterPrefs.ts 抽出收支筛选偏好字段定义与共享读写
- 存储键统一以 finance. 前缀命名,locale、emailBill.tab、logs.tab 迁移到新键并自动迁移旧值
- 各页面与组件改用公共层,移除重复的 try/catch 与跨组件重复的序列化逻辑
- 认证凭据 token 属登录状态,保持原键名不纳入 finance. 前缀
This commit is contained in:
2026-09-23 09:41:55 +08:00
parent 66d6ab86b5
commit eb358d0ba1
16 changed files with 396 additions and 242 deletions
+7 -3
View File
@@ -1,6 +1,8 @@
// 国际化入口:由对照消息构建各语言包,维护当前语言、持久化与 <html lang> 同步
import { createI18n } from 'vue-i18n'
import messages from './messages'
import { migrateKey, readString, writeString } from '../utils/storage'
import { LEGACY_STORAGE_KEYS, STORAGE_KEYS } from '../utils/storageKeys'
/** 支持的语言标识 */
export type LocaleKey = 'zh-CN' | 'en-US' | 'ja-JP'
@@ -13,7 +15,7 @@ interface MessageLeaf {
}
// 语言偏好存储键
const STORAGE_KEY = 'locale'
const STORAGE_KEY = STORAGE_KEYS.locale
// 支持的语言列表
const SUPPORTED: LocaleKey[] = ['zh-CN', 'en-US', 'ja-JP']
@@ -40,7 +42,9 @@ function buildLocaleMessages(node: unknown, lang: 'zh' | 'en' | 'ja'): any {
/** 解析初始语言:localStorage > 浏览器语言 > 简体中文 */
function resolveInitialLocale(): LocaleKey {
const saved = localStorage.getItem(STORAGE_KEY)
// 读取前迁移旧键 locale,保证老用户语言偏好不丢失
migrateKey(LEGACY_STORAGE_KEYS.locale, STORAGE_KEY)
const saved = readString(STORAGE_KEY)
if (saved && SUPPORTED.includes(saved as LocaleKey)) {
return saved as LocaleKey
}
@@ -74,7 +78,7 @@ export function getLocale(): LocaleKey {
/** 切换语言:更新 i18n、持久化到 localStorage,并同步 <html lang> */
export function setLocale(locale: LocaleKey) {
i18n.global.locale.value = locale
localStorage.setItem(STORAGE_KEY, locale)
writeString(STORAGE_KEY, locale)
document.documentElement.lang = locale
}