# 工具类库
**本文引用的文件**
- [PageConverter.java](file://crm-base/src/main/java/com/crm/base/utils/PageConverter.java)
- [BeanCopyUtils.java](file://crm-base/src/main/java/com/crm/base/utils/BeanCopyUtils.java)
- [EnumUtils.java](file://crm-base/src/main/java/com/crm/base/utils/EnumUtils.java)
- [ExcelUtil.java](file://crm-base/src/main/java/com/crm/base/utils/ExcelUtil.java)
- [TreeUtils.java](file://crm-base/src/main/java/com/crm/base/utils/TreeUtils.java)
- [AssertUtils.java](file://crm-base/src/main/java/com/crm/base/utils/AssertUtils.java)
- [ServletUtils.java](file://crm-base/src/main/java/com/crm/base/utils/ServletUtils.java)
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构总览](#架构总览)
5. [详细组件分析](#详细组件分析)
6. [依赖关系分析](#依赖关系分析)
7. [性能考虑](#性能考虑)
8. [故障排查指南](#故障排查指南)
9. [结论](#结论)
10. [附录](#附录)
## 简介
本仓库的 crm-base 模块提供了一套通用工具类,覆盖分页转换、对象拷贝、枚举处理、Excel 导入导出、树形结构构建、断言校验与 Servlet 辅助等常见场景。本文面向开发者与使用者,系统化梳理各工具类的职责、API 能力、使用方式与优化建议,帮助在业务代码中高效复用并避免常见问题。
## 项目结构
工具类均位于 crm-base 模块的 utils 包下,按功能划分清晰:
- PageConverter:分页数据转换器
- BeanCopyUtils:对象属性拷贝工具
- EnumUtils:枚举查询与映射工具
- ExcelUtil:Excel 读写与模板导出工具
- TreeUtils:树形结构构建与遍历工具
- AssertUtils:参数与状态断言工具
- ServletUtils:请求上下文与参数解析工具
```mermaid
graph TB
subgraph "crm-base/utils"
A["PageConverter"]
B["BeanCopyUtils"]
C["EnumUtils"]
D["ExcelUtil"]
E["TreeUtils"]
F["AssertUtils"]
G["ServletUtils"]
end
A --> |使用| H["PageResult"]
B --> |反射| I["Java 反射 API"]
C --> |枚举| J["HasValueEnum / StatusEnum"]
D --> |POI/EasyExcel| K["Excel 引擎"]
E --> |集合操作| L["List/Set"]
F --> |异常| M["BusinessErrorException"]
G --> |Spring MVC| N["HttpServletRequest/Response"]
```
[本图为概念性结构示意,不直接对应具体源码文件]
## 核心组件
- PageConverter:将数据库分页结果转换为统一的分页响应 DTO,支持字段映射与类型安全转换。
- BeanCopyUtils:基于反射的对象拷贝,支持忽略空值、指定字段拷贝与自定义映射策略。
- EnumUtils:根据编码或描述快速查找枚举实例,支持默认值与批量转换。
- ExcelUtil:封装 Excel 读取与导出,支持表头注解、数据校验与流式写入。
- TreeUtils:将扁平列表转换为树形结构,支持多级节点、排序与过滤。
- AssertUtils:集中化的断言方法,失败时抛出业务异常,便于统一错误处理。
- ServletUtils:从请求中提取参数、Header、IP、用户信息等常用信息。
**章节来源**
- [PageConverter.java](file://crm-base/src/main/java/com/crm/base/utils/PageConverter.java)
- [BeanCopyUtils.java](file://crm-base/src/main/java/com/crm/base/utils/BeanCopyUtils.java)
- [EnumUtils.java](file://crm-base/src/main/java/com/crm/base/utils/EnumUtils.java)
- [ExcelUtil.java](file://crm-base/src/main/java/com/crm/base/utils/ExcelUtil.java)
- [TreeUtils.java](file://crm-base/src/main/java/com/crm/base/utils/TreeUtils.java)
- [AssertUtils.java](file://crm-base/src/main/java/com/crm/base/utils/AssertUtils.java)
- [ServletUtils.java](file://crm-base/src/main/java/com/crm/base/utils/ServletUtils.java)
## 架构总览
工具类之间保持低耦合,主要依赖 Spring 基础能力与 Java 标准库;Excel 工具依赖第三方 Excel 引擎;分页转换依赖统一分页结果模型。整体设计遵循“单一职责 + 静态工具方法”模式,便于无状态调用与测试。
```mermaid
graph TB
Utils["工具类集合"]
PC["PageConverter"]
BC["BeanCopyUtils"]
EU["EnumUtils"]
EX["ExcelUtil"]
TU["TreeUtils"]
AU["AssertUtils"]
SU["ServletUtils"]
PR["PageResult"]
RE["反射/集合/IO"]
POI["Excel 引擎"]
SPRING["Spring MVC"]
Utils --> PC
Utils --> BC
Utils --> EU
Utils --> EX
Utils --> TU
Utils --> AU
Utils --> SU
PC --> PR
BC --> RE
EU --> RE
EX --> POI
TU --> RE
AU --> RE
SU --> SPRING
```
[本图为概念性依赖示意,不直接对应具体源码文件]
## 详细组件分析
### PageConverter 分页转换工具
- 职责:将数据库分页对象(如 MyBatis-Plus 的 IPage)转换为统一的分页响应 DTO(PageResult),支持字段映射与类型转换。
- 关键能力:
- 分页数据转换:记录数、页码、每页大小、数据列表的映射
- 字段级映射:支持按名称或自定义映射规则进行字段转换
- 类型安全:对数值、日期、布尔等类型的自动转换与校验
- 典型用法:
- 服务层返回 IPage,通过 PageConverter 转为 PageResult
- 复杂对象嵌套映射时,结合 BeanCopyUtils 完成子对象转换
- 性能要点:
- 避免在循环内重复创建映射器
- 大数据量分页时优先做服务端过滤与投影,减少内存占用
```mermaid
flowchart TD
Start(["进入转换"]) --> CheckInput["检查输入是否为空"]
CheckInput --> |为空| ReturnEmpty["返回空分页结果"]
CheckInput --> |非空| MapMeta["映射元数据
total/current/size"]
MapMeta --> MapData["映射数据列表"]
MapData --> TypeConvert["类型转换与校验"]
TypeConvert --> BuildResult["构建 PageResult"]
BuildResult --> End(["返回结果"])
```
**章节来源**
- [PageConverter.java](file://crm-base/src/main/java/com/crm/base/utils/PageConverter.java)
### BeanCopyUtils 对象拷贝工具
- 职责:基于反射实现对象属性拷贝,支持忽略空值、指定字段拷贝与自定义映射策略。
- 关键能力:
- 全量拷贝:同名同类型字段自动复制
- 选择性拷贝:白名单/黑名单字段控制
- 空值策略:忽略 null 或覆盖目标值
- 自定义映射:字段名不一致时的映射规则
- 典型用法:
- Entity 到 DTO 的单向拷贝
- DTO 到 VO 的展示层转换
- 合并多个源对象的属性到目标对象
- 性能要点:
- 高频场景可缓存映射策略
- 避免深层嵌套对象的过度拷贝
```mermaid
classDiagram
class BeanCopyUtils {
+copy(source, target) void
+copyIgnoreNull(source, target) void
+copyWithMapping(source, target, mapping) void
-resolveField(sourceType, targetType, fieldName) Field
-applyConversion(value, targetType) Object
}
```
**章节来源**
- [BeanCopyUtils.java](file://crm-base/src/main/java/com/crm/base/utils/BeanCopyUtils.java)
### EnumUtils 枚举工具
- 职责:提供枚举的查询、转换与校验能力,简化业务中对枚举的使用。
- 关键能力:
- 按编码获取枚举实例
- 按描述获取枚举实例
- 批量转换字符串为枚举列表
- 默认值与非法值处理
- 典型用法:
- 前端传入的状态码转后端枚举
- 下拉选项枚举值的统一获取
- 性能要点:
- 枚举查找应基于常量时间复杂度(如 Map 缓存)
- 批量转换时避免重复解析
```mermaid
flowchart TD
Start(["枚举查询入口"]) --> ChooseMode{"选择查询模式"}
ChooseMode --> |按编码| FindByCode["根据编码查找"]
ChooseMode --> |按描述| FindByDesc["根据描述查找"]
FindByCode --> Valid{"是否找到?"}
FindByDesc --> Valid
Valid --> |是| ReturnEnum["返回枚举实例"]
Valid --> |否| HandleDefault["处理默认值或抛错"]
HandleDefault --> End(["结束"])
ReturnEnum --> End
```
**章节来源**
- [EnumUtils.java](file://crm-base/src/main/java/com/crm/base/utils/EnumUtils.java)
### ExcelUtil Excel 文件处理工具
- 职责:封装 Excel 文件的读取与导出,支持表头注解、数据校验与流式写入。
- 关键能力:
- 导入:解析 Excel 为对象列表,支持必填校验、格式校验
- 导出:将对象列表导出为 Excel,支持多 Sheet、样式配置
- 模板导出:基于模板填充数据,适合报表场景
- 典型用法:
- 批量导入用户数据,返回错误行与提示信息
- 导出订单明细为 Excel 供下载
- 性能要点:
- 大文件导入使用流式解析,避免 OOM
- 导出时使用 SXSSFWorkbook 或 EasyExcel 的流式 API
```mermaid
sequenceDiagram
participant Client as "客户端"
participant Controller as "控制器"
participant ExcelUtil as "ExcelUtil"
participant Validator as "数据校验器"
participant Service as "业务服务"
Client->>Controller : 上传 Excel 文件
Controller->>ExcelUtil : 解析文件为对象列表
ExcelUtil-->>Controller : List