邮轮穿舱件管理系统 - 状态模块文档
概述
本文档详细描述了邮轮穿舱件管理系统前端应用中的状态管理架构,重点分析用户状态、应用配置、业务数据等各个状态模块的定义和使用方法。该系统采用Vue.js + Vuex架构,实现了集中式的状态管理模式。
目录
状态管理架构概述
邮轮穿舱件管理系统采用Vuex作为状态管理库,实现了单一数据源的状态管理模式。整个应用的状态被集中存储在Vuex Store中,通过严格的单向数据流确保状态变更的可预测性。
核心架构图
flowchart TD
A[Vue Components] --> B[Actions]
B --> C[Mutations]
C --> D[State]
D --> E[Getters]
E --> A
F[Utils Module] --> G[Authentication]
F --> H[Token Management]
I[HTTP Module] --> J[Request Interceptor]
I --> K[Response Interceptor]
G --> B
H --> J
Vuex Store核心模块
Store结构定义
系统的主要状态管理集中在src/store/index.js文件中,定义了完整的Vuex Store配置:
export default new Vuex.Store({
state: {
navigator_drawer: false, // 导航抽屉状态
authenticated: false, // 认证状态
user_info: null, // 用户信息
user_token: null // 用户令牌
},
mutations: {
// 状态变更方法
},
actions: {
// 异步操作
},
getters: {
// 计算属性
}
})
状态模块详细分析
1. State状态定义
| 状态字段 | 类型 | 默认值 | 描述 |
|---|---|---|---|
navigator_drawer | Boolean | false | 导航抽屉展开/收起状态 |
authenticated | Boolean | false | 用户认证状态 |
user_info | Object | null | 当前用户信息对象 |
user_token | String | null | JWT认证令牌 |
2. Mutations状态变更
系统定义了5个核心的mutation方法:
mutations: {
set_user_info(state, value) {
state.user_info = value
},
set_user_token(state, value) {
state.user_token = value
},
set_navigator_drawer(state, value) {
state.navigator_drawer = value
},
set_authenticated(state, value) {
state.authenticated = value
},
toggle_navigator_drawer(state) {
state.navigator_drawer = !state.navigator_drawer
}
}
3. Actions异步操作
每个mutation都有对应的action包装器,支持异步操作:
actions: {
set_user_info({ commit }, value) {
commit('set_user_info', value)
},
// 其他action方法...
}
4. Getters计算属性
提供状态的计算属性访问:
getters: {
get_navigator_drawer: state => state.navigator_drawer,
get_authenticated: state => state.authenticated,
get_user_info: state => state.user_info,
get_user_token: state => state.user_token
}
用户认证状态管理
认证流程
系统采用JWT(JSON Web Token)进行用户认证,认证状态管理涉及多个模块的协作:
sequenceDiagram
participant U as User
participant L as LoginView
participant UTL as Utils
participant ST as Store
participant H as HTTP
participant C as Cookie
U->>L: 输入用户名密码
L->>UTL: 调用认证检查
UTL->>C: 读取token
C-->>UTL: 返回token
UTL->>UTL: 验证token有效性
UTL-->>L: 返回认证结果
L->>H: 发送登录请求
H->>H: 添加Authorization头
H-->>L: 返回认证响应
L->>ST: 更新认证状态
L->>C: 存储token
认证工具函数
认证相关的工具函数定义在src/utils/index.js中:
核心认证函数
- checkAuthorizaion() - 检查用户认证状态
- loadSessionToken() - 加载会话令牌
- getUserInfoFromToken() - 从令牌解析用户信息
- getCurrentUserInfo() - 获取完整用户信息
function checkAuthorizaion() {
const token = Cookies.get("token");
if (token) {
try {
const decodedToken = jwtDecode(token);
const currentTime = Date.now() / 1000;
if (decodedToken.exp > currentTime) {
sessionStorage.setItem("token", token);
return true;
}
} catch (error) {
return false;
}
}
return false;
}
登录状态管理
登录组件LoginView.vue实现了完整的认证流程:
methods: {
submit() {
if (this.$refs.form.validate() && this.turnstileToken){
http.post('/token', {
username: this.formData.username,
password: this.formData.password,
'cf-turnstile-response': this.turnstileToken
}).then(response => {
let token = response.data.access_token;
Cookies.set("token", token)
this.$store.dispatch("set_authenticated", true)
this.$store.dispatch("set_user_token", token)
this.$router.push(this.$route.query.redirect || '/')
})
}
}
}
应用配置状态管理
导航状态管理
导航抽屉状态通过Vuex进行集中管理,在App.vue和NavigatorPage.vue组件中实现交互:
// App.vue中的导航控制
methods: {
change_drawer_state() {
this.$store.dispatch('toggle_navigator_drawer');
}
}
// NavigatorPage.vue中的计算属性
computed: {
drawerSwitch: {
get() {
return this.$store.state.navigator_drawer;
},
set(val) {
this.$store.dispatch('set_navigator_drawer', val);
}
}
}
路由导航状态
系统通过Vue Router管理页面导航,导航菜单定义在NavigatorPage.vue中:
items: [
{ title: '首页', link: '/home', icon: 'mdi-home', color: 'primary' },
{ title: '用户管理', link: '/user', icon: 'mdi-account-group', color: 'primary' },
{ title: '工件管理', link: '/workpiece', icon: 'mdi-box', color: 'success' },
// 其他菜单项...
]
工具函数模块
工具函数分类
| 函数类别 | 函数名 | 功能描述 |
|---|---|---|
| 认证相关 | checkAuthorizaion | 检查用户认证状态 |
| 令牌管理 | loadSessionToken | 加载会话令牌 |
| 令牌管理 | getUserInfoFromToken | 从令牌解析用户信息 |
| 用户管理 | getCurrentUserInfo | 获取完整用户信息 |
| 会话管理 | logout | 用户登出清理 |
用户信息获取流程
flowchart TD
A[获取用户信息] --> B{Token是否存在}
B -->|是| C[解码Token]
B -->|否| D[返回null]
C --> E{Token是否有效}
E -->|是| F[提取用户基本信息]
E -->|否| D
F --> G[调用用户API]
G --> H[返回完整用户信息]
HTTP请求配置
HTTP模块配置
HTTP请求配置在src/http/index.js中定义,包含请求/响应拦截器:
const service = axios.create({
baseURL: baseURL,
withCredentials: false,
});
// 请求拦截器 - 自动添加认证令牌
service.interceptors.request.use(config => {
const token = getTokenFromCookie('token');
if (token) {
config.headers['Authorization'] = `Bearer ${token}`;
}
return config;
});
环境配置
系统支持环境变量配置API基础URL:
let api_prefix = process.env.VUE_APP_API || undefined;
let baseURL = api_prefix ? api_prefix + "" : "";
组件状态交互
组件状态交互模式
系统采用标准的Vuex组件交互模式:
flowchart LR
A[Component] --> B[dispatch Action]
B --> C[commit Mutation]
C --> D[Update State]
D --> E[Notify Components]
E --> A
典型交互示例
1. 导航抽屉交互
// 触发状态变更
this.$store.dispatch('toggle_navigator_drawer');
// 响应状态变更
computed: {
drawerSwitch: {
get() {
return this.$store.state.navigator_drawer;
}
}
}
2. 认证状态交互
// 应用启动时检查认证状态
created() {
if(checkAuthorizaion()){
this.$store.commit('set_authenticated', true)
this.$store.commit('set_user_token', loadSessionToken());
}
}
状态流程图
完整状态流转图
stateDiagram-v2
[*] --> Unauthenticated
Unauthenticated --> Authenticating: 用户登录
Authenticating --> Authenticated: 认证成功
Authenticated --> Unauthenticated: 用户登出/令牌过期
state Authenticated {
[*] --> NavigationClosed
NavigationClosed --> NavigationOpen: 打开导航
NavigationOpen --> NavigationClosed: 关闭导航
NavigationClosed --> UserProfile: 访问用户页面
UserProfile --> NavigationClosed: 返回
}
Authenticated --> Error: 认证错误
Error --> Unauthenticated: 重新登录
数据流示意图
flowchart TB
subgraph "存储层 Storage"
C[Cookie]
S[SessionStorage]
end
subgraph "状态层 Vuex Store"
ST[State]
MT[Mutations]
AC[Actions]
end
subgraph "工具层 Utils"
U[认证工具]
T[令牌管理]
end
subgraph "组件层 Components"
L[LoginView]
A[App.vue]
N[Navigator]
end
C --> U
S --> U
U --> AC
AC --> MT
MT --> ST
ST --> A
ST --> N
L --> AC
依赖关系分析
模块依赖关系图
flowchart TD
A[App.vue] --> B[store/index.js]
A --> C[utils/index.js]
A --> D[components/NavigatorPage.vue]
B --> E[Vuex]
C --> F[js-cookie]
C --> G[jwt-decode]
D --> B
D --> H[Vue Router]
I[LoginView.vue] --> B
I --> C
I --> J[http/index.js]
J --> K[axios]
J --> F
关键依赖分析
-
Vuex Store依赖
- 所有组件都依赖Vuex Store进行状态管理
- Store依赖于Vue和Vuex库
-
工具模块依赖
- 认证工具依赖js-cookie进行令牌存储
- 令牌解析依赖jwt-decode库
-
HTTP模块依赖
- 基于axios进行HTTP请求
- 集成cookie管理进行认证
循环依赖检查
经分析,系统模块间不存在循环依赖问题,依赖关系清晰:
- 工具模块 → HTTP模块(单向)
- 组件模块 → Store模块(单向)
- Store模块 → 无外部依赖
索引
邮轮穿舱件管理系统的状态管理架构设计合理,采用Vuex实现了集中式的状态管理。系统通过清晰的模块划分和严格的单向数据流,确保了状态变更的可预测性和可维护性。
核心优势
- 单一数据源:所有应用状态集中存储在Vuex Store中
- 严格的状态变更流程:通过mutations进行状态变更,确保可追踪性
- 完善的认证机制:集成JWT认证和令牌管理
- 模块化设计:工具函数、HTTP配置等模块职责清晰
改进建议
- 考虑添加状态持久化机制,防止页面刷新导致状态丢失
- 可以引入TypeScript增强状态类型安全性
- 考虑添加状态变更日志,便于调试和监控
该状态管理架构为系统的稳定运行和后续功能扩展提供了良好的基础。