# 工具类库 **本文引用的文件** - [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) ## 目录 1. [简介](#简介) 2. [项目结构](#项目结构) 3. [核心组件](#核心组件) 4. [架构总览](#架构总览) 5. [详细组件分析](#详细组件分析) 6. [依赖关系分析](#依赖关系分析) 7. [性能考虑](#性能考虑) 8. [故障排查指南](#故障排查指南) 9. [结论](#结论) 10. [附录](#附录) ## 简介 本文件面向 crm-backend-matt 项目的通用工具类库,聚焦以下常用工具: - PageConverter 分页转换器 - BeanCopyUtils 对象拷贝工具 - EnumUtils 枚举工具 - ExcelUtil Excel 处理工具 - TreeUtils 树结构处理工具 - AssertUtils 断言工具 文档从系统架构、组件职责、数据流与调用流程、API 说明、使用示例、性能考量与常见问题等方面展开,帮助读者快速理解并正确使用这些工具。 ## 项目结构 工具类均位于基础模块的 utils 包中,彼此独立、低耦合,便于在业务模块中按需引入。 ```mermaid graph TB subgraph "基础模块" A["utils.PageConverter"] B["utils.BeanCopyUtils"] C["utils.EnumUtils"] D["utils.ExcelUtil"] E["utils.TreeUtils"] F["utils.AssertUtils"] end G["业务模块
controller/service/mapper"] G --> A G --> B G --> C G --> D G --> E G --> F ``` 图表来源 - [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) 章节来源 - [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) ## 核心组件 - PageConverter:将数据库分页结果转换为统一的分页响应结构,支持字段映射与类型转换。 - BeanCopyUtils:提供高性能的对象属性拷贝能力,支持忽略空值、指定字段拷贝等场景。 - EnumUtils:封装枚举的常见操作,如按名称/值获取枚举、校验存在性、批量转换等。 - ExcelUtil:封装 Excel 读写能力(导入导出),支持表头映射、列过滤、异常聚合等。 - TreeUtils:对扁平列表进行树形结构组装,支持层级深度控制与排序策略。 - AssertUtils:统一的参数与业务前置断言工具,集中错误信息输出。 章节来源 - [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) ## 架构总览 工具类作为横切能力被各层复用,典型调用链如下: ```mermaid sequenceDiagram participant C as "控制器/服务" participant PC as "PageConverter" participant BC as "BeanCopyUtils" participant EU as "EnumUtils" participant EX as "ExcelUtil" participant TU as "TreeUtils" participant AU as "AssertUtils" C->>AU : "参数校验/业务断言" C->>EU : "枚举解析/转换" C->>BC : "对象属性拷贝" C->>PC : "分页结果转换" C->>EX : "Excel 导入/导出" C->>TU : "树结构组装" ``` 图表来源 - [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) ## 详细组件分析 ### PageConverter 分页转换器 - 职责 - 将数据库分页对象转换为统一的分页响应结构。 - 支持字段映射、类型转换、空值处理。 - 关键 API - 分页转换入口方法:接收源分页对象与目标类型,返回分页结果。 - 可选配置:是否包含总数、是否过滤空集合、自定义字段映射规则。 - 使用示例 - 在 Service 层查询后调用转换方法,直接返回给 Controller。 - 结合 BeanCopyUtils 完成复杂 DTO 映射。 - 性能考虑 - 避免在循环内重复创建映射器;优先复用静态实例或缓存映射规则。 - 大数据量分页时,注意只取必要字段,减少内存占用。 - 错误处理 - 当源分页为空或目标类型不匹配时,应返回空分页或抛出明确异常。 ```mermaid flowchart TD Start(["进入转换"]) --> CheckInput["检查输入是否为空"] CheckInput --> |为空| ReturnEmpty["返回空分页"] CheckInput --> |非空| MapFields["执行字段映射/类型转换"] MapFields --> BuildResult["构建分页结果对象"] BuildResult --> ReturnResult["返回分页结果"] ``` 图表来源 - [PageConverter.java](file://crm-base/src/main/java/com/crm/base/utils/PageConverter.java) 章节来源 - [PageConverter.java](file://crm-base/src/main/java/com/crm/base/utils/PageConverter.java) ### BeanCopyUtils 对象拷贝工具 - 职责 - 高效拷贝对象属性,支持忽略空值、指定字段拷贝、嵌套对象拷贝等。 - 关键 API - 单对象拷贝:源对象到目标对象。 - 批量拷贝:集合到集合。 - 选择性拷贝:白名单/黑名单字段控制。 - 使用示例 - Entity 转 DTO、DTO 转 VO、请求参数到领域模型。 - 性能考虑 - 反射开销较大,建议对热点路径做缓存或预编译映射。 - 大对象频繁拷贝时,优先考虑构造器或 Builder 模式。 - 错误处理 - 类型不匹配或缺失字段时,记录日志并跳过或抛出明确异常。 ```mermaid classDiagram class BeanCopyUtils { +copy(source, target) +copyList(list, targetType) +copySelective(source, target, includeFields) -buildFieldMap() -applyValue(src, dest, field) } ``` 图表来源 - [BeanCopyUtils.java](file://crm-base/src/main/java/com/crm/base/utils/BeanCopyUtils.java) 章节来源 - [BeanCopyUtils.java](file://crm-base/src/main/java/com/crm/base/utils/BeanCopyUtils.java) ### EnumUtils 枚举工具 - 职责 - 提供枚举的查找、校验、转换等通用能力。 - 关键 API - 按名称获取枚举。 - 按值获取枚举。 - 校验枚举是否存在。 - 批量字符串转枚举列表。 - 使用示例 - 接口入参为字符串时,先通过工具转为枚举再进行业务处理。 - 性能考虑 - 枚举查找应为 O(1),内部通常基于 Map 缓存。 - 避免在热路径重复创建 Map。 - 错误处理 - 找不到对应枚举时,抛出明确的异常或返回 Optional。 ```mermaid flowchart TD S(["传入名称/值"]) --> Lookup{"查找成功?"} Lookup --> |是| ReturnEnum["返回枚举"] Lookup --> |否| RaiseError["抛出未找到异常"] ``` 图表来源 - [EnumUtils.java](file://crm-base/src/main/java/com/crm/base/utils/EnumUtils.java) 章节来源 - [EnumUtils.java](file://crm-base/src/main/java/com/crm/base/utils/EnumUtils.java) ### ExcelUtil Excel 处理 - 职责 - 封装 Excel 导入导出,支持表头映射、列过滤、批量写入、异常聚合。 - 关键 API - 导出:将集合数据导出为 Excel 文件流。 - 导入:读取 Excel 并映射为对象集合。 - 配置:列名映射、必填校验、默认值填充。 - 使用示例 - 管理后台导出报表、批量导入用户数据。 - 性能考虑 - 大数据导出建议使用流式写入,避免一次性加载到内存。 - 导入时限制行数与列数,防止恶意文件导致 OOM。 - 错误处理 - 行级错误聚合,返回失败明细以便前端提示。 ```mermaid sequenceDiagram participant U as "调用方" participant EX as "ExcelUtil" participant FS as "文件系统/流" U->>EX : "导出/导入请求" EX->>FS : "生成/读取流" FS-->>EX : "字节流" EX-->>U : "文件流/对象集合" ``` 图表来源 - [ExcelUtil.java](file://crm-base/src/main/java/com/crm/base/utils/ExcelUtil.java) 章节来源 - [ExcelUtil.java](file://crm-base/src/main/java/com/crm/base/utils/ExcelUtil.java) ### TreeUtils 树结构处理 - 职责 - 将扁平列表组装为树形结构,支持层级深度、排序策略、根节点识别。 - 关键 API - 列表转树:根据父 ID 关联构建。 - 树遍历:前序/后序遍历、过滤子树。 - 排序:按权重或时间排序。 - 使用示例 - 菜单树、部门树、分类树等。 - 性能考虑 - 使用 Map 缓存子节点,避免 N^2 复杂度。 - 大数据集建议分批组装或限制层级深度。 - 错误处理 - 检测到环引用或非法父 ID 时,抛出明确异常。 ```mermaid flowchart TD L(["扁平列表"]) --> BuildMap["构建ID->节点映射"] BuildMap --> LinkChildren["按父ID链接子节点"] LinkChildren --> SortNodes["按策略排序"] SortNodes --> RootFilter["筛选根节点"] RootFilter --> ReturnTree["返回树结构"] ``` 图表来源 - [TreeUtils.java](file://crm-base/src/main/java/com/crm/base/utils/TreeUtils.java) 章节来源 - [TreeUtils.java](file://crm-base/src/main/java/com/crm/base/utils/TreeUtils.java) ### AssertUtils 断言工具 - 职责 - 统一的参数与业务前置断言,集中错误信息输出。 - 关键 API - 非空断言、条件断言、范围断言、枚举存在断言。 - 使用示例 - 在 Service 入口处校验入参合法性。 - 性能考虑 - 断言仅在调试或开启校验时生效,生产环境可关闭以减少开销。 - 错误处理 - 抛出统一异常类型,便于全局异常处理器捕获。 ```mermaid flowchart TD A(["断言条件"]) --> Check{"条件满足?"} Check --> |是| Pass["通过"] Check --> |否| Throw["抛出断言异常"] ``` 图表来源 - [AssertUtils.java](file://crm-base/src/main/java/com/crm/base/utils/AssertUtils.java) 章节来源 - [AssertUtils.java](file://crm-base/src/main/java/com/crm/base/utils/AssertUtils.java) ## 依赖关系分析 工具类之间保持松耦合,主要依赖第三方库(如 Excel 处理)与基础类型。典型依赖如下: ```mermaid graph LR PC["PageConverter"] --> BC["BeanCopyUtils"] EX["ExcelUtil"] --> IO["IO/流"] TU["TreeUtils"] --> COL["集合/Map"] AU["AssertUtils"] --> ERR["异常类型"] EU["EnumUtils"] --> MAP["Map缓存"] ``` 图表来源 - [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) 章节来源 - [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) ## 性能考虑 - 反射与映射 - BeanCopyUtils 的反射开销较高,建议在热点路径缓存字段映射或使用代码生成方案。 - 内存与流式处理 - ExcelUtil 导出大文件时使用流式写入,避免一次性加载全部数据。 - 数据结构优化 - TreeUtils 使用 Map 缓存子节点,确保线性时间复杂度。 - 枚举查找 - EnumUtils 内部使用 Map 缓存,保证 O(1) 查找。 - 分页转换 - PageConverter 应避免不必要的深拷贝,仅复制必要字段。 [本节为通用指导,不直接分析具体文件] ## 故障排查指南 - 分页转换结果为空 - 检查源分页对象是否为空,确认字段映射是否正确。 - 对象拷贝缺失字段 - 确认目标对象存在 setter 或字段可见性,必要时启用选择性拷贝。 - 枚举转换失败 - 检查枚举名称/值大小写与空格,确认枚举定义完整。 - Excel 导入失败 - 查看行级错误聚合信息,定位具体行列问题;限制文件大小与行数。 - 树结构出现环引用 - 检查父 ID 指向是否合法,增加环检测逻辑。 - 断言异常频繁触发 - 检查上游参数校验逻辑,确认断言条件是否符合预期。 章节来源 - [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) ## 结论 上述工具类覆盖了分页转换、对象拷贝、枚举处理、Excel 读写、树结构组装与参数断言等高频场景。通过统一的 API 与良好的错误处理,能够显著提升开发效率与代码质量。在生产环境中,建议关注性能优化与资源限制,确保稳定性与可扩展性。 [本节为总结性内容,不直接分析具体文件] ## 附录 - 最佳实践 - 在 Service 层统一使用 AssertUtils 进行参数校验。 - 对热点对象拷贝路径进行性能分析与缓存优化。 - Excel 导入导出需设置超时与大小限制,防止资源耗尽。 - 树结构构建前进行数据合法性校验,避免环引用。 - 分页转换时仅选择必要字段,降低内存压力。 [本节为补充性内容,不直接分析具体文件]