通用方法

本小节,分享前端项目的常用方法和工具类。

1. 缓存配置

1.1 说明

项目使用 StorageManager (opens new window) 类进行本地存储管理,支持 localStoragesessionStorage 两种存储方式,并提供了超时时间设置功能。

1.2 使用示例

import { StorageManager } from '@vben/utils';

// 创建存储管理器实例
const storage = new StorageManager({
  prefix: 'vben',           // 存储键前缀
  storageType: 'localStorage' // 存储类型:'localStorage' | 'sessionStorage'
});

// 设置存储项(可选设置过期时间,单位:毫秒)
storage.setItem('user', { name: '芋道源码' }, 3600000); // 1小时后过期

// 获取存储项
const user = storage.getItem('user');
// 获取存储项(带默认值)
const config = storage.getItem('config', { theme: 'light' });

// 移除存储项
storage.removeItem('user');
// 清除所有带前缀的存储项
storage.clear();
// 清除所有过期的存储项
storage.clearExpiredItems();

2. 工具类

项目的工具类分为两层:全局工具类和项目专属工具类。

2.1 全局工具类

全局工具类位于 packages/@core/base/shared/src/utils (opens new window) 目录,通过 @vben/utils 包导出,供所有项目共享使用。

文件 作用
date.ts 日期格式化、时区设置
time.ts 相对时间、时间问候语、日期范围计算
tree.ts 树形结构构建、遍历、过滤、映射
download.ts 文件下载(URL、Base64、Blob)
upload.ts 文件上传辅助(类型检查、大小格式化)
formatNumber.ts 金额转换(分/元)、ERP 数字格式化
inference.ts 类型判断(isEmpty、isNumber 等)
encrypt.ts AES/RSA 加解密
uuid.ts UUID 生成
util.ts 通用工具(嵌套取值、URL 参数、分组等)
dom.ts DOM 操作辅助
merge.ts 对象深度合并
window.ts 窗口操作(打开新窗口等)

2.2 项目专属工具类

各项目有自己的工具类目录,用于存放项目特有的工具方法:

文件 作用
routerHelper.ts 路由辅助方法
rangePickerProps.ts 日期范围选择器的快捷选项配置
useUpload.ts 文件上传 Hook

3. 枚举类

项目在 @vben/constants (opens new window) 包中定义了枚举类,分为字典枚举和业务枚举两类。

3.1 字典枚举

字典枚举定义在 dict-enum.ts (opens new window) 中,对应后端字典管理的字典类型 KEY,用于获取字典数据。

字典枚举配合字典工具类使用,详见 字典数据 章节。

3.2 业务枚举

业务枚举定义在 biz-*.ts 文件中,用于前端业务逻辑判断,避免“魔法值”。

文件 模块
biz-system-enum.ts 系统模块(状态、菜单类型、角色类型等)
biz-infra-enum.ts 基础设施模块(代码生成、任务状态等)
biz-pay-enum.ts 支付模块(支付渠道、订单状态等)
biz-bpm-enum.ts 工作流模块(节点类型、任务状态等)
biz-mall-enum.ts 商城模块(商品状态、订单状态等)
biz-ai-enum.ts AI 模块(平台、模型类型等)
biz-iot-enum.ts IoT 模块(设备状态、产品类型等)
biz-erp-enum.ts ERP 模块(审批状态等)
biz-mp-enum.ts 公众号模块

使用示例:

import { CommonStatusEnum, SystemMenuTypeEnum } from '@vben/constants';

// 通用状态
if (status === CommonStatusEnum.ENABLE) { /* 开启 */ }
if (status === CommonStatusEnum.DISABLE) { /* 禁用 */ }

// 菜单类型判断
if (menuType === SystemMenuTypeEnum.DIR) { /* 目录 */ }
if (menuType === SystemMenuTypeEnum.MENU) { /* 菜单 */ }
if (menuType === SystemMenuTypeEnum.BUTTON) { /* 按钮 */ }