Appearance
数据存储与国际化
**本文引用的文件** - [localstorage.js](file://app/devicemate-app/utils/localstorage.js) - [index.js(国际化入口)](file://app/devicemate-app/locale/index.js) - [en.json(英文资源)](file://app/devicemate-app/locale/en.json) - [zh-Hans.json(简体中文资源)](file://app/devicemate-app/locale/zh-Hans.json) - [main.js(应用入口)](file://app/devicemate-app/main.js) - [App.vue(应用生命周期)](file://app/devicemate-app/App.vue) - [login.vue(登录页-语言切换)](file://app/devicemate-app/pages/user/login.vue) - [common.js(通用工具-升级检测)](file://app/devicemate-app/utils/common.js) - [userMixins.js(用户混入-权限与工厂加载)](file://app/devicemate-app/utils/userMixins.js) - [index.js(Vuex入口)](file://app/devicemate-app/store/index.js) - [index.js(Vuex模块聚合)](file://app/devicemate-app/store/modules/index.js) - [common.js(Vuex模块-公共状态)](file://app/devicemate-app/store/modules/common.js) - [index.js(uView UI入口)](file://app/devicemate-app/uview-ui/index.js)目录
简介
本指南聚焦于DeviceMate移动端(基于uni-app)的数据存储与国际化两大主题,系统阐述本地数据持久化方案、缓存策略、序列化与清理机制;同时详解国际化配置、动态语言切换、文本翻译机制与最佳实践。文档结合代码级分析与可视化图示,帮助开发者快速理解并高效落地。
项目结构
围绕数据存储与国际化的关键目录与文件如下:
- 数据存储:utils/localstorage.js 提供统一的本地存储封装;App.vue、login.vue、userMixins.js 等多处使用该封装进行用户信息、系统信息、默认工厂等数据的读写与清理。
- 国际化:locale/index.js 初始化VueI18n,根据系统语言或缓存语言设置当前locale;en.json、zh-Hans.json提供多语言资源;login.vue支持运行时语言切换;common.js在升级检测中使用 $t 进行文案展示。
图表来源
- main.js:1-49
- App.vue:1-78
- localstorage.js:1-22
- index.js(Vuex入口):1-13
- index.js(Vuex模块聚合):1-13
- common.js(Vuex模块-公共状态):1-45
- index.js(国际化入口):1-24
- en.json(英文资源):1-344
- zh-Hans.json(简体中文资源):1-344
- login.vue(登录页-语言切换):1-168
- common.js(通用工具-升级检测):1-61
章节来源
- main.js:1-49
- App.vue:1-78
- localstorage.js:1-22
- index.js(Vuex入口):1-13
- index.js(Vuex模块聚合):1-13
- common.js(Vuex模块-公共状态):1-45
- index.js(国际化入口):1-24
- en.json(英文资源):1-344
- zh-Hans.json(简体中文资源):1-344
- login.vue(登录页-语言切换):1-168
- common.js(通用工具-升级检测):1-61
核心组件
- 本地存储封装:提供统一的 save、get、remove、clear 方法,基于 uni 存储接口,自动进行 JSON 序列化/反序列化。
- 国际化初始化:根据系统语言或缓存语言初始化 i18n,挂载到 Vue 原型,支持运行时切换。
- 应用入口集成:在 main.js 中注册 $db、$http、$showToast、i18n、Vuex,确保全局可用。
- 登录页语言切换:提供语言选择器,保存 systemInfo 并调用 uni.setLocale 触发界面刷新。
- 升级检测与文案:在升级检测中使用 $t 展示“已是最新”等文案,体现 i18n 的运行时生效。
章节来源
- localstorage.js:1-22
- index.js(国际化入口):1-24
- main.js:1-49
- login.vue(登录页-语言切换):1-168
- common.js(通用工具-升级检测):1-61
架构总览
整体架构围绕“应用入口 -> 数据存储/国际化 -> 页面组件”的链路展开。应用启动时初始化 i18n 与 Vuex,随后各页面通过 $db 与 $t 访问本地存储与多语言资源。
图表来源
详细组件分析
组件A:本地数据存储封装(utils/localstorage.js)
- 设计要点
- 统一键值对存取,内部以 JSON 字符串形式持久化,避免直接存对象导致的类型丢失。
- 默认值返回策略:读取失败时返回传入的默认对象,降低空值判断成本。
- 清理能力:支持按 key 删除与全量清空,便于登出与调试场景。
- 使用场景
- 用户信息:登录成功后保存 userInfo。
- 系统信息:保存 language 以便后续初始化 i18n。
- 默认工厂:保存 defaultFactory 供页面使用。
- 登出清理:清空所有缓存。
- 复杂度与性能
- 单次读写为 O(1),序列化/反序列化开销低,适合频繁的小对象缓存。
- 错误处理
- 无显式 try/catch,建议在调用方捕获异常或在外层包装容错函数。
图表来源
章节来源
组件B:国际化初始化与动态切换(locale/index.js、pages/user/login.vue)
- 初始化流程
- 从缓存读取 systemInfo,解析语言字段作为当前 locale。
- 注册 VueI18n 实例并挂载到 Vue 原型,供全局使用。
- 动态切换
- 登录页提供语言选择器,变更后保存 systemInfo 并调用 uni.setLocale。
- 通过 uni.reLaunch 刷新页面,使 $t 生效。
- 文案使用
- 在升级检测中通过 $t 展示“已是最新版本”等文案,体现 i18n 的即时生效。
- 资源组织
- 英文与简体中文资源分别位于 en.json 与 zh-Hans.json,采用层级键命名,便于模块化维护。
图表来源
- index.js(国际化入口):1-24
- login.vue(登录页-语言切换):115-122
- common.js(通用工具-升级检测):35-60
- en.json(英文资源):1-344
- zh-Hans.json(简体中文资源):1-344
章节来源
- index.js(国际化入口):1-24
- login.vue(登录页-语言切换):1-168
- common.js(通用工具-升级检测):1-61
- en.json(英文资源):1-344
- zh-Hans.json(简体中文资源):1-344
组件C:应用入口与全局注入(main.js、App.vue)
- main.js 负责:
- 引入并注册 uView UI、全局组件、自定义指令与HTTP请求。
- 将 $db、$http、$showToast、i18n、Vuex 挂载到 Vue 原型,供全站使用。
- App.vue 生命周期:
- 启动时清理临时标记、检查升级、鉴权跳转。
- onShow 阶段处理外部参数(如直达页面),拉取用户信息与菜单,保存至本地存储,再进行权限跳转。
图表来源
章节来源
组件D:Vuex与本地存储协同(store/index.js、store/modules/index.js、store/modules/common.js)
- Vuex 入口:聚合 modules,提供全局状态容器。
- 模块示例:common 模块定义了若干页面共享的状态与动作(如 pageType、assignUrl、history、repair),通过 commit 更新 state。
- 与本地存储的关系:页面通过 $db 读写用户信息、系统信息等;Vuex 用于跨组件共享业务状态,二者互补。
图表来源
章节来源
依赖关系分析
- 组件耦合
- main.js 作为全局装配中心,耦合 i18n、Vuex、$db、$http 等核心能力。
- App.vue 与多个模块协作:鉴权跳转、工厂加载、升级检测、消息红点等。
- login.vue 与 i18n、$db 紧密关联,负责语言切换与用户信息落盘。
- 外部依赖
- uni 存储与国际化 API:基于 uni.setStorageSync、uni.getStorageSync、uni.setLocale。
- uView UI:提供丰富的组件与样式,提升开发效率。
图表来源
- main.js:1-49
- App.vue:1-78
- login.vue(登录页-语言切换):1-168
- common.js(通用工具-升级检测):1-61
- localstorage.js:1-22
- index.js(国际化入口):1-24
- index.js(Vuex入口):1-13
章节来源
- main.js:1-49
- App.vue:1-78
- login.vue(登录页-语言切换):1-168
- common.js(通用工具-升级检测):1-61
- localstorage.js:1-22
- index.js(国际化入口):1-24
- index.js(Vuex入口):1-13
性能考虑
- 存储策略
- 小对象频繁读写:使用 $db.get/$db.save,避免重复序列化/反序列化,必要时在组件内做缓存。
- 大对象或列表:建议分页或懒加载,减少一次性读取。
- 定期清理:登出时调用 $db.clear,避免残留敏感数据。
- 国际化渲染
- $t 为轻量渲染,建议在模板中直接使用,避免在循环中重复计算。
- 语言切换后通过 uni.reLaunch 刷新页面,确保文案一致性。
- UI框架
- uView 提供大量组件,注意按需引入与样式覆盖,避免不必要的体积增长。
[本节为通用指导,无需特定文件引用]
故障排查指南
- 语言切换无效
- 检查是否正确保存 systemInfo 并调用 uni.setLocale。
- 确认 reLaunch 是否触发页面刷新。
- 参考路径:login.vue(登录页-语言切换):115-122
- 文案未翻译
- 确认键名存在且拼写正确,资源文件已加载。
- 参考路径:index.js(国际化入口):1-24、en.json:1-344、zh-Hans.json:1-344
- 登录后无法跳转或菜单异常
- 检查 userInfo 是否成功保存,权限校验逻辑是否正确。
- 参考路径:App.vue:33-60、userMixins.js:15-45
- 升级提示文案不显示
- 确认 i18n 实例已注入,$t 调用上下文有效。
- 参考路径:common.js(通用工具-升级检测):35-60
章节来源
- login.vue(登录页-语言切换):1-168
- index.js(国际化入口):1-24
- en.json(英文资源):1-344
- zh-Hans.json(简体中文资源):1-344
- App.vue:1-78
- userMixins.js:1-160
- common.js(通用工具-升级检测):1-61
结论
DeviceMate移动端在数据存储方面采用统一的 $db 封装,结合本地缓存与接口数据实现灵活持久化;在国际化方面通过 i18n 初始化与运行时切换,配合多语言资源文件,实现了良好的多语言体验。建议在实际开发中遵循本文档的最佳实践,确保数据安全、性能与可维护性。
[本节为总结性内容,无需特定文件引用]
附录
A. 数据存储最佳实践清单
- 使用 $db.save 保存用户信息、系统信息、默认工厂等关键数据。
- 对象存取前统一 JSON 序列化,读取后反序列化。
- 登出时调用 $db.clear,清理敏感数据。
- 大数据量场景采用分页或懒加载,避免阻塞。
章节来源
B. 国际化开发标准流程
- 资源组织:按模块划分键名,英文与中文资源一一对应。
- 初始化:在 locale/index.js 中注册 i18n,读取缓存语言。
- 运行时切换:登录页提供语言选择器,保存 systemInfo 并调用 uni.setLocale。
- 文案使用:在模板中通过 $t 渲染,升级检测等场景使用 $t 展示文案。
章节来源