Appearance
工具函数库
**本文引用的文件** - [ajax.js](file://dm/lemes-web/src/utils/ajax.js) - [date.js](file://dm/lemes-web/src/utils/date.js) - [validate.js](file://dm/lemes-web/src/utils/validate.js) - [tree.js](file://dm/lemes-web/src/utils/tree.js) - [common.js(前端)](file://dm/lemes-web/src/utils/common.js) - [objParser.js](file://dm/lemes-web/src/utils/objParser.js) - [index.js](file://dm/lemes-web/src/utils/index.js) - [soul.js](file://dm/lemes-web/src/utils/soul.js) - [expose.js](file://dm/lemes-web/src/utils/expose.js) - [key-bind.js](file://dm/lemes-web/src/utils/key-bind.js) - [common.js(小程序/UniApp)](file://app/devicemate-app/utils/common.js) - [localstorage.js](file://app/devicemate-app/utils/localstorage.js) - [dictMixins.js](file://app/devicemate-app/utils/dictMixins.js) - [userMixins.js](file://app/devicemate-app/utils/userMixins.js)目录
简介
本文件系统性梳理 DeviceMate 项目的工具函数库,覆盖通用工具函数、AJAX 请求封装、日期处理、数据验证、树形结构操作与前端通用能力,并给出设计模式、性能优化策略、错误处理机制与扩展建议。文档同时兼顾非技术读者的理解需求,提供图示与路径指引帮助快速定位实现位置。
项目结构
工具函数主要分布在两个前端工程中:
- 前端 Web 工程(Vue):位于 dm/lemes-web/src/utils,提供 AJAX 封装、日期格式化、数据校验、树操作、通用混入与全局能力暴露。
- 小程序/UniApp 工程:位于 app/devicemate-app/utils,提供加密、消息红点、升级检查、本地存储与业务 Mixin。
图表来源
- index.js:15-41
- soul.js:1-460
- ajax.js:1-76
- common.js(小程序/UniApp):1-61
- localstorage.js:1-22
- userMixins.js:1-160
章节来源
- index.js:1-134
- soul.js:1-460
- ajax.js:1-76
- common.js(小程序/UniApp):1-61
- localstorage.js:1-22
- userMixins.js:1-160
核心组件
- AJAX 请求封装:统一拦截器、多协议适配、下载/上传、Token 刷新队列、结果过滤与错误提示。
- 日期处理:日期格式化、自然语言差值格式化、月份天数计算。
- 数据验证:URL/邮箱/字母/数组/空值等常用校验。
- 树形结构操作:节点禁用状态批量设置。
- 通用工具:防抖/节流、随机数、i18n 扫描合并。
- 前端通用能力:全局方法注入、对象去空格、路由重命名、对象深比较。
- 安全与本地:RSA 加密、本地存储封装、字典/用户 Mixin。
章节来源
- ajax.js:1-76
- date.js:1-111
- validate.js:1-114
- tree.js:1-18
- common.js(前端):1-48
- objParser.js:1-24
- index.js:1-134
- soul.js:1-460
- common.js(小程序/UniApp):1-61
- localstorage.js:1-22
- dictMixins.js:1-33
- userMixins.js:1-160
架构总览
Web 工程通过 utils/index.js 将 AJAX、下载、校验、树操作等能力挂载到 Vue 原型,便于全局使用;soul.js 提供大量便捷方法(如路由跳转、金额格式化、防抖/节流、UUID、日期范围等),并与 AJAX、日期、校验、树、对象解析等模块协同工作。expose.js 将关键方法暴露到 window,便于外部脚本调用。key-bind.js 提供全局快捷键监听,辅助扫码/调试场景。
图表来源
章节来源
详细组件分析
AJAX 请求封装(ajax.js)
- 设计要点
- 统一基地址、超时、跨域携带 Cookie。
- 请求拦截:自动设置 Content-Type、Authorization、用户、语言、时区、任务开始时间等。
- 响应拦截:计算请求耗时,透传响应。
- 通用请求 handleAjax:支持 GET/POST、FormData 自动识别、JSON/表单字符串化、下载进度回调。
- 结果处理 handleResult:根据 code 分支处理业务成功/失败、国际化消息、401/403 等状态码。
- Token 刷新:基于白名单判断、剩余有效期阈值触发刷新,刷新期间请求排队,刷新成功后批量重试。
- 下载/打开:downloadFile/downloadBlob/ossDownload 支持 Blob/ArrayBuffer、Content-Disposition 解析、打开/下载行为切换。
- Promise 化:ajax/promiseQuery/promiseJsonQuery 提供 Promise 与校验集成。
- 性能与健壮性
- 请求/响应拦截减少重复代码,统一错误提示。
- 刷新队列避免并发刷新导致的请求风暴。
- 下载进度回调与 Blob 处理提升大文件体验。
- 错误处理
- 401/403/500/503 等状态码统一提示与登出逻辑。
- filter=false 可透传原始响应,满足特殊场景。
- 使用建议
- 优先使用 this.ajax/promiseQuery 等原型方法。
- 表单含文件时启用 formData,避免手动拼装。
- 大文件下载使用 downloadBlob/ossDownload 并监听进度。
图表来源
章节来源
- ajax.js:1-76
- ajax.js:105-147
- ajax.js:149-164
- ajax.js:169-194
- ajax.js:196-248
- ajax.js:254-307
- ajax.js:309-333
- ajax.js:347-423
- ajax.js:425-479
- ajax.js:481-552
- ajax.js:564-636
日期处理(date.js)
- 功能特性
- formatDate:支持 y/M/d/h/H/m/s/q/S 与星期格式化,默认“年-月-日 时:分:秒”。
- MY_MONTH_DAY:按索引返回当月天数(考虑平闰月)。
- formatDiffDate:将毫秒差值格式化为“年/月/周/天/时/分/秒/毫秒”的组合字符串。
- 复杂度与性能
- 常数时间格式化,无循环开销。
- formatDiffDate 为线性拆解,适合 UI 展示。
- 应用场景
- 列表/报表时间显示、倒计时/持续时间展示、日历/计划对比。
图表来源
章节来源
数据验证(validate.js)
- 功能特性
- isExternal:外链校验(http/https/mailto/tel)。
- validUsername:非空白用户名。
- validURL/validLowerCase/validUpperCase/validAlphabets:URL/大小写/字母校验。
- validEmail:邮箱正则。
- isString/isArray:类型判断。
- isEmpty/notEmpty:空值判断。
- 复杂度
- 正则与测试均为 O(n)(n 为字符串长度),常数时间。
- 应用场景
- 表单校验、参数合法性检查、安全过滤。
章节来源
- validate.js:9-11
- validate.js:17-21
- validate.js:27-30
- validate.js:36-39
- validate.js:45-48
- validate.js:54-57
- validate.js:63-66
- validate.js:72-77
- validate.js:83-88
- validate.js:95-104
- validate.js:111-113
树形结构操作(tree.js)
- 功能特性
- G:设置单节点 disabled,并递归处理 childrens。
- R:遍历集合,批量应用 G。
- 复杂度
- O(n) 遍历节点集合。
- 应用场景
- 树选择/勾选禁用、菜单/字典树批量控制。
图表来源
章节来源
通用工具(common.js 前端)
- 功能特性
- debounce:通用防抖,支持自定义延迟。
- randomNum:生成区间随机整数。
- parseI18nByPath:扫描目录并合并 i18n 模块,支持驼峰别名。
- 复杂度
- 防抖/随机数 O(1),parseI18nByPath O(n)(n 为文件数量)。
- 应用场景
- 搜索/滚动/窗口调整等高频事件降噪、随机数生成、i18n 模块化管理。
章节来源
对象解析与通用混入(objParser.js、index.js)
- objParser.trimObjEmpty:递归去除对象/数组内字符串两端空白,返回新对象。
- index.js:将 $soul 能力、trimObjEmpty、AJAX/下载/查询等方法挂载到 Vue 原型,提供路由重命名、对象深比较等工具。
图表来源
- objParser.js:1-24
- index.js:12-13
- index.js:87-103
- index.js:105-133
- soul.js:17-21
- soul.js:23-42
- soul.js:48-97
- soul.js:171-183
- soul.js:377-403
章节来源
- objParser.js:1-24
- index.js:12-13
- index.js:87-103
- index.js:105-133
- soul.js:17-21
- soul.js:23-42
- soul.js:48-97
- soul.js:171-183
- soul.js:377-403
前端通用能力(soul.js、expose.js、key-bind.js)
- soul.js:提供深拷贝、Loading、路由跳转、金额格式化、防抖/节流、UUID、日期范围、下拉选项、S3/MinIO 下载等。
- expose.js:将登出方法暴露至 window,便于外部脚本调用。
- key-bind.js:全局快捷键监听(如 Alt+Ctrl+Shift+Q 切换示例页、Ctrl+Shift+F 全屏切换),并记录连续按键序列。
章节来源
- soul.js:17-21
- soul.js:23-42
- soul.js:48-97
- soul.js:98-117
- soul.js:171-183
- soul.js:377-403
- soul.js:424-460
- expose.js:1-8
- key-bind.js:1-57
小程序/UniApp 工具函数(common.js、localstorage.js、dictMixins.js、userMixins.js)
- common.js(小程序侧)
- setEncrypt:RSA 公钥加密。
- isMessage:拉取消息列表,依据未读状态显示 TabBar 红点。
- checkUpgrade:拉取最新版本信息,与当前版本比较,触发升级弹窗或提示已是最新。
- localstorage.js:封装本地存储的 save/get/remove/clear。
- dictMixins.js:字典获取与值转名称。
- userMixins.js:权限判断、菜单过滤/分页、菜单点击跳转、角色信息加载、默认工厂设置等。
图表来源
章节来源
- common.js(小程序/UniApp):7-11
- common.js(小程序/UniApp):13-33
- common.js(小程序/UniApp):35-60
- localstorage.js:1-22
- dictMixins.js:10-20
- dictMixins.js:24-31
- userMixins.js:14-45
- userMixins.js:51-60
- userMixins.js:77-95
- userMixins.js:96-116
- userMixins.js:120-136
- userMixins.js:137-148
依赖关系分析
- utils/index.js 将 ajax、download、promiseQuery 等方法挂载到 Vue 原型,形成统一入口。
- soul.js 作为“全局方法库”,内部依赖 ajax、i18n、store、router 等,提供高频复用能力。
- expose.js 与 window 绑定,便于外部脚本调用登出等方法。
- key-bind.js 与 store/router 联动,实现快捷键与页面跳转。
图表来源
章节来源
性能考量
- 防抖/节流:高频事件(搜索、滚动、窗口调整)建议使用 $debounce/$throttle,降低渲染压力。
- 请求批处理:AJAX 统一拦截与结果处理,减少重复逻辑与网络往返。
- 下载优化:大文件使用 downloadBlob/ossDownload 并监听进度,避免阻塞 UI。
- 对象处理:trimObjEmpty 递归去空格,建议仅在必要时调用,避免对大型对象频繁拷贝。
- 缓存与白名单:Token 刷新采用白名单与阈值策略,避免无效刷新。
故障排查指南
- 登录态失效
- 现象:401 提示并自动登出。
- 排查:确认 Authorization 是否正确注入、Token 是否接近过期、刷新队列是否正常推进。
- 参数非法
- 现象:406 提示。
- 排查:核对请求体/查询参数结构与后端约束。
- 服务不可用
- 现象:503 提示。
- 排查:网关/服务状态、跨域与代理配置。
- 下载失败
- 现象:无法下载或文件名异常。
- 排查:Content-Disposition 解析、Blob 类型、openFile 参数。
- 验证失败
- 现象:邮箱/URL/用户名校验不通过。
- 排查:输入内容是否符合正则、是否包含隐藏字符。
章节来源
- ajax.js:380-406
- ajax.js:407-415
- ajax.js:521-527
- ajax.js:528-533
- ajax.js:206-216
- ajax.js:266-275
- validate.js:63-66
- validate.js:27-30
结论
该工具函数库围绕“统一请求、通用能力、数据校验、树操作、本地存储与业务 Mixin”构建,既满足 Web 工程的复杂交互需求,也兼顾小程序/UniApp 的轻量化场景。通过拦截器、结果过滤、Token 刷新队列与防抖/节流等机制,显著提升了稳定性与用户体验。建议在新功能开发中优先复用现有工具,保持一致的错误处理与性能策略。
附录
- 扩展建议
- 新增工具函数时,遵循单一职责与纯函数原则,提供明确的参数与返回值注释。
- 对高频函数增加缓存策略(如对象深比较结果缓存)。
- 对下载/上传增加断点续传或分片策略(视业务需要)。
- 最佳实践
- 表单提交前使用 validate.js 校验,结合 promiseQuery/promiseJsonQuery 统一处理。
- 使用 $debounce/$throttle 控制高频事件,避免过度渲染。
- 使用 trimObjEmpty 在提交前清理多余空白,减少后端校验成本。
- 使用 routeRenameToFull 避免路由命名冲突,确保导航稳定。