状态持久化策略与本地存储实现
概述
本文档详细分析了邮轮穿舱件管理系统前端页面的状态持久化策略和本地存储实现。该系统采用Vue.js框架构建,结合Vuex状态管理和多种存储机制来实现用户会话、应用配置等状态的持久化。
系统架构概述
技术栈依赖关系
flowchart TD
A[Vue.js] --> B[Vuex状态管理]
A --> C[Vue Router]
B --> D[本地存储策略]
C --> E[路由守卫]
D --> F[Cookies存储]
D --> G[SessionStorage]
E --> H[认证状态检查]
F --> I[长期持久化]
G --> J[会话级持久化]
核心依赖包
| 包名 | 版本 | 用途 |
|---|---|---|
| vuex | ^3.6.2 | 状态管理 |
| js-cookie | ^3.0.5 | Cookie操作 |
| jwt-decode | ^4.0.0 | JWT令牌解析 |
状态管理架构
Vuex Store结构
classDiagram
class VuexStore {
+state: Object
+mutations: Object
+actions: Object
+getters: Object
}
class StoreState {
+navigator_drawer: Boolean
+authenticated: Boolean
+user_info: Object
+user_token: String
}
class StoreMutations {
+set_user_info(state, value)
+set_user_token(state, value)
+set_navigator_drawer(state, value)
+set_authenticated(state, value)
+toggle_navigator_drawer(state)
}
class StoreActions {
+set_user_info({commit}, value)
+set_user_token({commit}, value)
+set_navigator_drawer({commit}, value)
+set_authenticated({commit}, value)
+toggle_navigator_drawer({commit})
}
class StoreGetters {
+get_navigator_drawer(state)
+get_authenticated(state)
+get_user_info(state)
+get_user_token(state)
}
VuexStore --> StoreState
VuexStore --> StoreMutations
VuexStore --> StoreActions
VuexStore --> StoreGetters
参考源文件:
存储策略实现
多层级存储架构
系统采用三级存储策略,确保数据在不同场景下的持久化需求:
flowchart LR
A[应用状态] --> B[Vuex内存存储]
B --> C{Cookie持久化}
C -->|长期存储| D[用户令牌]
C -->|会话存储| E[SessionStorage]
E --> F[临时会话数据]
D --> G[7天有效期]
1. Cookie存储策略
实现代码分析
// Cookie操作工具函数
function getTokenFromCookie(name) {
return Cookies.get(name);
}
// 登录时设置Cookie
Cookies.set("token", token);
if (this.rememberMe) {
Cookies.set('username', this.formData.username, { expires: 7 });
}
存储内容:
token: JWT认证令牌username: 用户名(可选,7天有效期)
参考源文件:
2. SessionStorage存储策略
会话级存储实现
function loadSessionToken() {
const token = sessionStorage.getItem("token");
if (token) {
return token;
} else {
return null;
}
}
// 认证检查时设置SessionStorage
sessionStorage.setItem("token", token);
存储内容:
token: 当前会话的JWT令牌
参考源文件:
3. Vuex内存存储
状态管理实现
state: {
navigator_drawer: false, // 导航抽屉状态
authenticated: false, // 认证状态
user_info: null, // 用户信息
user_token: null // 用户令牌
}
参考源文件:
认证流程与状态持久化
登录认证流程
sequenceDiagram
participant U as 用户
participant L as LoginView
participant H as HTTP服务
participant C as Cookie存储
participant S as SessionStorage
participant V as Vuex Store
U->>L: 输入凭证提交登录
L->>H: POST /token 认证请求
H-->>L: 返回JWT令牌
L->>C: Cookies.set('token', token)
L->>S: sessionStorage.setItem('token', token)
L->>V: set_authenticated(true)
L->>V: set_user_token(token)
V-->>L: 状态更新完成
L-->>U: 跳转到首页
参考源文件:
登出清理流程
sequenceDiagram
participant U as 用户
participant O as LogoutView
participant C as Cookie存储
participant S as SessionStorage
participant V as Vuex Store
U->>O: 触发登出操作
O->>C: Cookies.remove('username')
O->>C: Cookies.remove('token')
O->>S: sessionStorage.removeItem('token')
O->>V: set_authenticated(false)
O->>V: set_user_token(null)
O->>V: set_user_info(null)
V-->>O: 状态清理完成
O-->>U: 跳转到登录页
参考源文件:
令牌验证与用户信息获取
JWT令牌解析策略
function getUserInfoFromToken() {
const token = Cookies.get("token");
if (token) {
try {
const decodedToken = jwtDecode(token);
const currentTime = Date.now() / 1000;
if (decodedToken.exp > currentTime) {
return {
user_id: decodedToken.uid,
username: decodedToken.username || decodedToken.uid,
exp: decodedToken.exp,
};
}
} catch (error) {
console.error("解析token失败:", error);
return null;
}
}
return null;
}
参考源文件:
认证状态检查流程
flowchart TD
A[检查认证状态] --> B{Token存在?}
B -->|否| C[返回未认证]
B -->|是| D[解析JWT令牌]
D --> E{令牌有效?}
E -->|否| F[清理无效令牌]
E -->|是| G[设置SessionStorage]
F --> C
G --> H[返回已认证]
参考源文件:
数据流与状态同步
组件间状态同步机制
graph TB
A[用户操作] --> B[Vue组件]
B --> C[Vuex Actions]
C --> D[Vuex Mutations]
D --> E[Vuex State]
E --> F[本地存储]
F --> G[持久化数据]
E --> H[组件响应式更新]
G --> I[页面刷新恢复]
I --> E
HTTP请求拦截器集成
service.interceptors.request.use(
config => {
const token = getTokenFromCookie('token');
if (token) {
config.headers['Authorization'] = `Bearer ${token}`;
}
return config;
}
);
参考源文件:
安全性与最佳实践
安全措施
- 令牌验证: 每次使用前验证JWT令牌有效期
- 自动清理: 过期令牌自动从存储中移除
- HTTPS传输: 敏感数据通过安全通道传输
- XSS防护: 使用HttpOnly Cookie选项(可扩展)
性能优化
- 懒加载: 用户信息按需获取
- 缓存策略: 合理使用各级存储减少API调用
- 状态复用: Vuex状态在组件间共享,避免重复存储
索引
邮轮穿舱件管理系统的状态持久化策略采用了多层次、分场景的存储方案,确保了用户会话数据的安全性和可用性。通过Vuex状态管理、Cookie持久化和SessionStorage会话存储的有机结合,实现了完整的认证状态管理生命周期。
核心优势:
- 支持长期登录状态保持(7天)
- 会话级数据安全隔离
- 完整的认证状态管理
- 优雅的错误处理和状态恢复
参考源文件汇总:
- src/store/index.js - Vuex状态管理核心
- src/utils/index.js - 工具函数和存储操作
- src/http/index.js - HTTP请求拦截器
- src/views/LoginView.vue - 登录状态管理
- src/views/LogoutView.vue - 登出状态清理
- package.json - 依赖包配置