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
+8 -2
View File
@@ -3,6 +3,8 @@ import { createRouter, createWebHistory } from 'vue-router'
import { useUserStore } from '../store/user'
import { useDatabaseStore } from '../store/database'
import { useRegistrationStore } from '../store/registration'
import { migrateKey, readString } from '../utils/storage'
import { LEGACY_STORAGE_KEYS, STORAGE_KEYS } from '../utils/storageKeys'
// 创建路由实例,使用 HTML5 History 模式
const router = createRouter({
@@ -68,7 +70,9 @@ const router = createRouter({
// 跳转到上次访问的标签页,无记录时默认邮箱配置
redirect: () => {
const tabs = ['configs', 'senderRules', 'messages']
const saved = typeof localStorage !== 'undefined' ? localStorage.getItem('emailBill.tab') : null
// 读取前迁移旧键,保证老用户标签页偏好不丢失
migrateKey(LEGACY_STORAGE_KEYS.emailBillTab, STORAGE_KEYS.emailBillTab)
const saved = readString(STORAGE_KEYS.emailBillTab) || null
return `/email-bills/${saved && tabs.includes(saved) ? saved : 'configs'}`
},
},
@@ -92,7 +96,9 @@ const router = createRouter({
// 跳转到上次访问的日志标签页,无记录时默认访问日志
redirect: () => {
const tabs = ['http', 'login', 'app']
const saved = typeof localStorage !== 'undefined' ? localStorage.getItem('logs.tab') : null
// 读取前迁移旧键,保证老用户标签页偏好不丢失
migrateKey(LEGACY_STORAGE_KEYS.logsTab, STORAGE_KEYS.logsTab)
const saved = readString(STORAGE_KEYS.logsTab) || null
return `/logs/${saved && tabs.includes(saved) ? saved : 'http'}`
},
},