Appearance
模块化管理
**本文引用的文件** - [store/index.js](file://app/devicemate-app/store/index.js) - [store/modules/index.js](file://app/devicemate-app/store/modules/index.js) - [store/modules/login.js](file://app/devicemate-app/store/modules/login.js) - [store/modules/common.js](file://app/devicemate-app/store/modules/common.js) - [store/modules/equipment.js](file://app/devicemate-app/store/modules/equipment.js) - [store/modules/maintain.js](file://app/devicemate-app/store/modules/maintain.js) - [store/modules/repair.js](file://app/devicemate-app/store/modules/repair.js) - [main.js](file://app/devicemate-app/main.js) - [pages/user/login.vue](file://app/devicemate-app/pages/user/login.vue) - [modules/common/assign.vue](file://app/devicemate-app/modules/common/assign.vue) - [modules/maintain/apply.vue](file://app/devicemate-app/modules/maintain/apply.vue) - [modules/repair/apply.vue](file://app/devicemate-app/modules/repair/apply.vue)目录
- 引言
- 项目结构
- 核心组件
- 架构总览
- 详细组件分析
- 依赖分析
- 性能考虑
- 故障排查指南
- 结论
- 附录
引言
本文件系统性梳理 DeviceMate 前端应用的模块化状态管理方案,聚焦于 store 的模块划分与职责边界、命名空间隔离、模块间依赖与数据交互模式,并给出模块开发规范、代码组织与命名约定,以及实际模块示例与集成案例,帮助开发者快速理解并高效扩展状态管理。
项目结构
DeviceMate 前端采用基于 Vuex 的模块化状态管理,核心入口位于应用入口文件中注入 store;store 的模块通过统一索引文件集中导出,形成清晰的模块边界与可维护性。
图表来源
章节来源
核心组件
本节对各 store 模块进行职责与边界说明,并指出其命名空间与数据交互方式。
登录模块(login)
- 职责:维护登录相关状态,如登录跳转地址等。
- 关键点:提供提交动作以写入登录 URL;当前仅包含少量状态与单个动作。
- 命名空间:未声明命名空间,使用全局路径访问。
- 数据交互:页面通过 dispatch 触发动作,组件通过 mapState 计算属性读取。
通用模块(common)
- 职责:承载跨业务通用状态,如页面类型、分配链接、历史记录、维修对象等。
- 关键点:提供多个动作用于设置不同通用字段;当前仅包含少量状态与多动作。
- 命名空间:未声明命名空间,使用全局路径访问。
- 数据交互:多处业务页面通过 dispatch 设置通用上下文,组件通过 mapState 读取。
设备模块(equipment)
- 职责:设备维度的轻量状态,如设备编码、设备编号、图片地址等。
- 关键点:提供多条 mutation 用于设置与清空字段;当前仅包含少量状态与多 mutation。
- 命名空间:未声明命名空间,使用全局路径访问。
- 数据交互:设备相关页面与功能模块通过 mutation 更新状态。
维修模块(repair)
- 职责:维修工作流相关的表单与物料列表等状态。
- 关键点:声明命名空间;提供设置物料列表的动作;状态包含复杂表单数据结构。
- 命名空间:已启用命名空间,需使用模块前缀访问。
- 数据交互:维修页面通过 dispatch 使用命名空间路径设置物料列表,组件通过 mapState 读取。
保养模块(maintain)
- 职责:保养工作流相关的表单与物料列表等状态。
- 关键点:声明命名空间;提供设置物料列表的动作;状态包含复杂表单数据结构。
- 命名空间:已启用命名空间,需使用模块前缀访问。
- 数据交互:保养页面通过 dispatch 使用命名空间路径设置物料列表,组件通过 mapState 读取。
章节来源
- store/modules/login.js:1-24
- store/modules/common.js:1-45
- store/modules/equipment.js:1-35
- store/modules/maintain.js:1-25
- store/modules/repair.js:1-50
架构总览
下图展示从页面到 store 的典型调用链路,体现模块间的数据流向与命名空间差异。
图表来源
- pages/user/login.vue:1-168
- modules/common/assign.vue:1-174
- modules/maintain/apply.vue:1-200
- modules/repair/apply.vue:1-200
- store/modules/login.js:1-24
- store/modules/common.js:1-45
- store/modules/equipment.js:1-35
- store/modules/maintain.js:1-25
- store/modules/repair.js:1-50
详细组件分析
登录模块(login)
- 功能要点
- 状态:登录 URL 字段。
- 动作:setLoginUrl,通过提交 LOGIN_COMMIT 将数据写入对应字段。
- 命名空间:未声明,使用全局路径访问。
- 页面集成
- 登录页在触发 ADFS 登录时设置 loginUrl,供页面渲染 web-view 展示外部登录页。
图表来源
章节来源
通用模块(common)
- 功能要点
- 状态:pageType、assignUrl、history、repair 等通用上下文。
- 动作:setPageType、setAssignUrl、setHistory、setRepair。
- 命名空间:未声明,使用全局路径访问。
- 页面集成
- 多个业务页面通过 dispatch 设置 assignUrl、history、repair 等,供后续流程使用。
- 通用页面(如指派)通过 mapState 读取 assignUrl 并发起业务请求。
图表来源
章节来源
设备模块(equipment)
- 功能要点
- 状态:deviceCode、deviceNo、imgUrl。
- 动作:无;通过多条 mutation 设置/清空字段。
- 命名空间:未声明,使用全局路径访问。
- 页面集成
- 设备相关页面通过 mutation 更新设备编码、编号与图片地址,供其他模块或页面复用。
图表来源
章节来源
维修模块(repair)
- 功能要点
- 状态:formData(复杂表单数据)、partList。
- 动作:setPartList(命名空间路径)。
- 命名空间:已启用,需使用 repair/setPartList 访问。
- 页面集成
- 维修申请页在组件销毁时清理 partList,避免跨页面污染。
- 列表页通过 mapState 读取 partList,结合后端标准数据生成待领料清单。
图表来源
章节来源
保养模块(maintain)
- 功能要点
- 状态:pageType、partList。
- 动作:setPartList(命名空间路径)。
- 命名空间:已启用,需使用 maintain/setPartList 访问。
- 页面集成
- 保养申请页在组件销毁时清理 partList,避免跨页面污染。
- 列表页通过 mapState 读取 partList,结合后端标准数据生成待领料清单。
图表来源
章节来源
依赖分析
- 模块聚合
- store/modules/index.js 聚合所有模块,形成统一入口,便于主程序注入。
- 命名空间策略
- login/common/equipment 未启用命名空间,适合轻量模块与全局共享。
- maintain/repair 启用命名空间,避免同名 action/mutation 冲突,提升模块内聚性。
- 页面依赖
- 页面通过 $store.dispatch 与 $store.commit 调用模块动作与变更状态。
- 页面通过 mapState 读取模块状态,减少样板代码。
图表来源
- pages/user/login.vue:1-168
- modules/common/assign.vue:1-174
- modules/maintain/apply.vue:1-200
- modules/repair/apply.vue:1-200
- store/index.js:1-13
- store/modules/index.js:1-13
章节来源
性能考虑
- 命名空间与模块粒度
- 对于高频冲突或复杂状态的模块(如维修/保养),启用命名空间可降低耦合与误用风险。
- 状态最小化
- login/common/equipment 当前状态较少,适合全局共享;建议保持简洁,避免过度分散。
- 生命周期清理
- 在组件销毁阶段清理命名空间模块的临时状态(如维修/保养的 partList),防止内存泄漏与跨页面污染。
- 计算属性与映射
- 使用 mapState 等辅助函数读取状态,避免直接深层访问导致不必要的重渲染。
故障排查指南
- 命名空间路径错误
- 症状:dispatch 报错找不到 action。
- 排查:确认模块是否启用命名空间,调用时使用完整路径(如 repair/setPartList)。
- 状态未更新或值异常
- 症状:页面未反映最新状态。
- 排查:检查是否使用了正确的 mutation 或 action;确认是否在正确模块内提交。
- 跨页面状态污染
- 症状:离开页面后仍保留上一页面数据。
- 排查:在组件销毁钩子中清理命名空间模块的临时状态。
- 全局模块冲突
- 症状:多个模块存在同名 action/mutation 导致不可预期行为。
- 排查:将相关模块迁移至命名空间,或重构为更细粒度的模块。
章节来源
结论
DeviceMate 的模块化状态管理以 Vuex 为基础,通过模块聚合与命名空间策略实现了清晰的职责边界与可维护性。全局轻量模块(login/common/equipment)与命名空间模块(maintain/repair)相辅相成,既满足通用场景的快速接入,又保障复杂业务的稳定演进。建议在新增模块时遵循命名约定与开发规范,优先启用命名空间以降低冲突风险,并在生命周期中及时清理临时状态。
附录
开发规范与命名约定
- 模块命名
- 使用名词短语,语义明确,如 login、common、equipment、maintain、repair。
- 文件命名
- 模块文件采用小驼峰或全小写,如 login.js、common.js、equipment.js。
- 状态字段
- 使用语义化字段名,避免缩写;复杂对象建议拆分为子字段或子模块。
- 动作与变更
- 动作名使用动词短语,如 setPageType、setAssignUrl、setPartList。
- 变更名使用全大写常量风格,如 LOGIN_COMMIT、COMMON_COMMIT、REPAIR_COMMIT。
- 命名空间
- 复杂或易冲突模块启用命名空间;简单模块可不启用以简化调用。
- 页面调用
- 统一通过 $store.dispatch 与 $store.commit 调用;使用 mapState/mapGetters 等辅助函数读取状态。
- 生命周期
- 在 beforeDestroy 或页面隐藏时清理命名空间模块的临时状态,避免跨页面污染。
实际模块示例与集成案例
- 登录模块集成
- 登录页设置登录 URL,页面渲染 web-view 完成外部登录。
- 示例路径:pages/user/login.vue:112-114,store/modules/login.js:12-17
- 通用模块集成
- 业务页面通过 dispatch 设置 assignUrl、history、repair 等,通用页面读取并发起业务请求。
- 示例路径:modules/common/assign.vue:67-71,store/modules/common.js:14-38
- 设备模块集成
- 设备页面通过 mutation 设置设备编码、编号与图片地址,供其他模块复用。
- 示例路径:store/modules/equipment.js:8-27
- 维修模块集成
- 维修申请页在销毁时清理 partList,列表页读取并生成待领料清单。
- 示例路径:modules/repair/apply.vue:81-83,store/modules/repair.js:37-43
- 保养模块集成
- 保养申请页在销毁时清理 partList,列表页读取并生成待领料清单。
- 示例路径:modules/maintain/apply.vue:85-87,store/modules/maintain.js:12-18