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
@@ -2,17 +2,21 @@
import { defineStore } from 'pinia'
import { ref } from 'vue'
import { getUserInfo } from '../api/user'
import { readString, removeKey, writeString } from '../utils/storage'
/** 登录令牌存储键(认证凭据,不属于界面偏好,不纳入 finance. 前缀) */
const TOKEN_KEY = 'token'
export const useUserStore = defineStore('user', () => {
// 从 localStorage 恢复 token,若不存在则为空字符串
const token = ref(localStorage.getItem('token') || '')
const token = ref(readString(TOKEN_KEY))
const nickname = ref('') // 用户昵称
const userId = ref<number | null>(null) // 用户 ID
/** 设置 token 并持久化到 localStorage */
function setToken(t: string) {
token.value = t
localStorage.setItem('token', t)
writeString(TOKEN_KEY, t)
}
/** 设置用户基本信息(昵称和 ID) */
@@ -36,7 +40,7 @@ export const useUserStore = defineStore('user', () => {
token.value = ''
nickname.value = ''
userId.value = null
localStorage.removeItem('token')
removeKey(TOKEN_KEY)
}
return { token, nickname, userId, setToken, setUserInfo, fetchUserInfo, logout }