首页 文章 精选 留言 我的

精选列表

搜索[Jdk25],共10篇文章
优秀的个人博客,低调大师

xtools一款基于JDK25的通用Java工具库

xtools 项目设计文档 开源地址: https://gitee.com/jun-xtools/xtools.git 一、功能和用途 1.1 项目概述 xtools(低调大师工具箱)是一个基于 JDK 25 的 Java 工具库项目,为 Java 应用开发提供通用的工具方法和基础组件支持。 项目信息 说明 项目名称 xtools 项目版本 5.0.0 父POM xtools-parent:5.0.0 JDK版本 25 项目定位 通用Java工具库,提供加密、时间、系统、网络、文档等工具方法 维护团队 org.xujun 1.2 技术特点 采用最新的 JDK 25 版本,充分利用新特性(Record类型、文本块、模式匹配等) 基于 JUnit Jupiter 6.0.3 构建单元测试体系 使用 Lombok 1.18.44 简化代码编写 集成 FastJSON2 2.0.60 实现高性能JSON处理 使用 BouncyCastle 1.84 提供国密算法(SM2/SM3/SM4)支持 集成 Google ZXing 3.5.4 实现二维码和条形码生成与解析 使用 Apache PDFBox 3.0.7 实现PDF文档处理 使用 Apache Fesod Sheet 2.0.1-incubating 处理Excel文件 集成 mmseg4j-core 1.10.0 实现中文分词 支持 AWS S3 SDK 2.42.34 实现对象存储 集成 ip2region 3.3.7 实现离线IP地址定位 使用 java-jwt 4.5.1 实现JWT令牌生成与验证 集成 OSHI 6.11.1 实现系统信息采集 使用 Apache Velocity 2.4.1 实现模板引擎功能 集成 Jsoup 1.22.1 实现HTML解析和爬虫功能 使用 MapStruct 1.6.3 实现对象映射 基于 Jakarta Servlet API 6.1.0 提供Web层支持 1.3 核心功能 #mo4fcgdu1aru6yhdyfj{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#ccc;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mo4fcgdu1aru6yhdyfj .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mo4fcgdu1aru6yhdyfj .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mo4fcgdu1aru6yhdyfj .error-icon{fill:#a44141;}#mo4fcgdu1aru6yhdyfj .error-text{fill:#ddd;stroke:#ddd;}#mo4fcgdu1aru6yhdyfj .edge-thickness-normal{stroke-width:1px;}#mo4fcgdu1aru6yhdyfj .edge-thickness-thick{stroke-width:3.5px;}#mo4fcgdu1aru6yhdyfj .edge-pattern-solid{stroke-dasharray:0;}#mo4fcgdu1aru6yhdyfj .edge-thickness-invisible{stroke-width:0;fill:none;}#mo4fcgdu1aru6yhdyfj .edge-pattern-dashed{stroke-dasharray:3;}#mo4fcgdu1aru6yhdyfj .edge-pattern-dotted{stroke-dasharray:2;}#mo4fcgdu1aru6yhdyfj .marker{fill:lightgrey;stroke:lightgrey;}#mo4fcgdu1aru6yhdyfj .marker.cross{stroke:lightgrey;}#mo4fcgdu1aru6yhdyfj svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mo4fcgdu1aru6yhdyfj p{margin:0;}#mo4fcgdu1aru6yhdyfj .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#ccc;}#mo4fcgdu1aru6yhdyfj .cluster-label text{fill:#F9FFFE;}#mo4fcgdu1aru6yhdyfj .cluster-label span{color:#F9FFFE;}#mo4fcgdu1aru6yhdyfj .cluster-label span p{background-color:transparent;}#mo4fcgdu1aru6yhdyfj .label text,#mo4fcgdu1aru6yhdyfj span{fill:#ccc;color:#ccc;}#mo4fcgdu1aru6yhdyfj .node rect,#mo4fcgdu1aru6yhdyfj .node circle,#mo4fcgdu1aru6yhdyfj .node ellipse,#mo4fcgdu1aru6yhdyfj .node polygon,#mo4fcgdu1aru6yhdyfj .node path{fill:#1f2020;stroke:#ccc;stroke-width:1px;}#mo4fcgdu1aru6yhdyfj .rough-node .label text,#mo4fcgdu1aru6yhdyfj .node .label text,#mo4fcgdu1aru6yhdyfj .image-shape .label,#mo4fcgdu1aru6yhdyfj .icon-shape .label{text-anchor:middle;}#mo4fcgdu1aru6yhdyfj .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mo4fcgdu1aru6yhdyfj .rough-node .label,#mo4fcgdu1aru6yhdyfj .node .label,#mo4fcgdu1aru6yhdyfj .image-shape .label,#mo4fcgdu1aru6yhdyfj .icon-shape .label{text-align:center;}#mo4fcgdu1aru6yhdyfj .node.clickable{cursor:pointer;}#mo4fcgdu1aru6yhdyfj .root .anchor path{fill:lightgrey!important;stroke-width:0;stroke:lightgrey;}#mo4fcgdu1aru6yhdyfj .arrowheadPath{fill:lightgrey;}#mo4fcgdu1aru6yhdyfj .edgePath .path{stroke:lightgrey;stroke-width:2.0px;}#mo4fcgdu1aru6yhdyfj .flowchart-link{stroke:lightgrey;fill:none;}#mo4fcgdu1aru6yhdyfj .edgeLabel{background-color:hsl(0, 0%, 34.4117647059%);text-align:center;}#mo4fcgdu1aru6yhdyfj .edgeLabel p{background-color:hsl(0, 0%, 34.4117647059%);}#mo4fcgdu1aru6yhdyfj .edgeLabel rect{opacity:0.5;background-color:hsl(0, 0%, 34.4117647059%);fill:hsl(0, 0%, 34.4117647059%);}#mo4fcgdu1aru6yhdyfj .labelBkg{background-color:rgba(87.75, 87.75, 87.75, 0.5);}#mo4fcgdu1aru6yhdyfj .cluster rect{fill:hsl(180, 1.5873015873%, 28.3529411765%);stroke:rgba(255, 255, 255, 0.25);stroke-width:1px;}#mo4fcgdu1aru6yhdyfj .cluster text{fill:#F9FFFE;}#mo4fcgdu1aru6yhdyfj .cluster span{color:#F9FFFE;}#mo4fcgdu1aru6yhdyfj div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(20, 1.5873015873%, 12.3529411765%);border:1px solid rgba(255, 255, 255, 0.25);border-radius:2px;pointer-events:none;z-index:100;}#mo4fcgdu1aru6yhdyfj .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#ccc;}#mo4fcgdu1aru6yhdyfj rect.text{fill:none;stroke-width:0;}#mo4fcgdu1aru6yhdyfj .icon-shape,#mo4fcgdu1aru6yhdyfj .image-shape{background-color:hsl(0, 0%, 34.4117647059%);text-align:center;}#mo4fcgdu1aru6yhdyfj .icon-shape p,#mo4fcgdu1aru6yhdyfj .image-shape p{background-color:hsl(0, 0%, 34.4117647059%);padding:2px;}#mo4fcgdu1aru6yhdyfj .icon-shape rect,#mo4fcgdu1aru6yhdyfj .image-shape rect{opacity:0.5;background-color:hsl(0, 0%, 34.4117647059%);fill:hsl(0, 0%, 34.4117647059%);}#mo4fcgdu1aru6yhdyfj .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mo4fcgdu1aru6yhdyfj .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mo4fcgdu1aru6yhdyfj :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}测试模块 xtools-testBaseTest测试基类API模块 xtools-api阿里云邮件邮件发送百度地图定位/天气IP地址查询离线定位请求日志API调用日志Web模块 xtools-webXSS过滤Filter/WrapperSession工具会话管理HTTP头枚举HeaderEnum扩展工具模块 xtools-extend国密算法SM2/SM3/SM4/PKCSJSON工具序列化/反序列化模板替换JWT工具令牌生成与验证二维码工具QR/条形码生成与解析文档工具PDF/Excel转换中文分词mmseg4j分词UserAgent浏览器标识解析拼音工具汉字转拼音图片压缩Thumbnailator核心工具模块 xtools-core加密工具Base64/MD5/SHA1时间工具Date/LocalDateTimeInstant/Timestamp/Calendar系统工具OS/浏览器/命令行系统信息扩展工具模板/分页/URL距离计算/随机数图像工具BufferedImage转换线程工具线程工厂/超时控制日志工具自定义日志输出敏感词过滤DFA/前缀树类扫描器包扫描/类过滤集合工具空值判断UUID工具UUID生成字节数组/十六进制转换工具基础模块 xtools-base异常处理体系BaseError/BaseErrorModuleCommonException常量定义BaseParams错误模块枚举ErrorModule1.4 功能层次结构 #mo4fcgdx9hoomsg9dsn{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#ccc;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mo4fcgdx9hoomsg9dsn .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mo4fcgdx9hoomsg9dsn .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mo4fcgdx9hoomsg9dsn .error-icon{fill:#a44141;}#mo4fcgdx9hoomsg9dsn .error-text{fill:#ddd;stroke:#ddd;}#mo4fcgdx9hoomsg9dsn .edge-thickness-normal{stroke-width:1px;}#mo4fcgdx9hoomsg9dsn .edge-thickness-thick{stroke-width:3.5px;}#mo4fcgdx9hoomsg9dsn .edge-pattern-solid{stroke-dasharray:0;}#mo4fcgdx9hoomsg9dsn .edge-thickness-invisible{stroke-width:0;fill:none;}#mo4fcgdx9hoomsg9dsn .edge-pattern-dashed{stroke-dasharray:3;}#mo4fcgdx9hoomsg9dsn .edge-pattern-dotted{stroke-dasharray:2;}#mo4fcgdx9hoomsg9dsn .marker{fill:lightgrey;stroke:lightgrey;}#mo4fcgdx9hoomsg9dsn .marker.cross{stroke:lightgrey;}#mo4fcgdx9hoomsg9dsn svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mo4fcgdx9hoomsg9dsn p{margin:0;}#mo4fcgdx9hoomsg9dsn .edge{stroke-width:3;}#mo4fcgdx9hoomsg9dsn .section--1 rect,#mo4fcgdx9hoomsg9dsn .section--1 path,#mo4fcgdx9hoomsg9dsn .section--1 circle,#mo4fcgdx9hoomsg9dsn .section--1 polygon,#mo4fcgdx9hoomsg9dsn .section--1 path{fill:#1f2020;}#mo4fcgdx9hoomsg9dsn .section--1 text{fill:lightgrey;}#mo4fcgdx9hoomsg9dsn .node-icon--1{font-size:40px;color:lightgrey;}#mo4fcgdx9hoomsg9dsn .section-edge--1{stroke:#1f2020;}#mo4fcgdx9hoomsg9dsn .edge-depth--1{stroke-width:17;}#mo4fcgdx9hoomsg9dsn .section--1 line{stroke:#e0dfdf;stroke-width:3;}#mo4fcgdx9hoomsg9dsn .disabled,#mo4fcgdx9hoomsg9dsn .disabled circle,#mo4fcgdx9hoomsg9dsn .disabled text{fill:lightgray;}#mo4fcgdx9hoomsg9dsn .disabled text{fill:#efefef;}#mo4fcgdx9hoomsg9dsn .section-0 rect,#mo4fcgdx9hoomsg9dsn .section-0 path,#mo4fcgdx9hoomsg9dsn .section-0 circle,#mo4fcgdx9hoomsg9dsn .section-0 polygon,#mo4fcgdx9hoomsg9dsn .section-0 path{fill:#0b0000;}#mo4fcgdx9hoomsg9dsn .section-0 text{fill:lightgrey;}#mo4fcgdx9hoomsg9dsn .node-icon-0{font-size:40px;color:lightgrey;}#mo4fcgdx9hoomsg9dsn .section-edge-0{stroke:#0b0000;}#mo4fcgdx9hoomsg9dsn .edge-depth-0{stroke-width:14;}#mo4fcgdx9hoomsg9dsn .section-0 line{stroke:#f4ffff;stroke-width:3;}#mo4fcgdx9hoomsg9dsn .disabled,#mo4fcgdx9hoomsg9dsn .disabled circle,#mo4fcgdx9hoomsg9dsn .disabled text{fill:lightgray;}#mo4fcgdx9hoomsg9dsn .disabled text{fill:#efefef;}#mo4fcgdx9hoomsg9dsn .section-1 rect,#mo4fcgdx9hoomsg9dsn .section-1 path,#mo4fcgdx9hoomsg9dsn .section-1 circle,#mo4fcgdx9hoomsg9dsn .section-1 polygon,#mo4fcgdx9hoomsg9dsn .section-1 path{fill:#4d1037;}#mo4fcgdx9hoomsg9dsn .section-1 text{fill:lightgrey;}#mo4fcgdx9hoomsg9dsn .node-icon-1{font-size:40px;color:lightgrey;}#mo4fcgdx9hoomsg9dsn .section-edge-1{stroke:#4d1037;}#mo4fcgdx9hoomsg9dsn .edge-depth-1{stroke-width:11;}#mo4fcgdx9hoomsg9dsn .section-1 line{stroke:#b2efc8;stroke-width:3;}#mo4fcgdx9hoomsg9dsn .disabled,#mo4fcgdx9hoomsg9dsn .disabled circle,#mo4fcgdx9hoomsg9dsn .disabled text{fill:lightgray;}#mo4fcgdx9hoomsg9dsn .disabled text{fill:#efefef;}#mo4fcgdx9hoomsg9dsn .section-2 rect,#mo4fcgdx9hoomsg9dsn .section-2 path,#mo4fcgdx9hoomsg9dsn .section-2 circle,#mo4fcgdx9hoomsg9dsn .section-2 polygon,#mo4fcgdx9hoomsg9dsn .section-2 path{fill:#3f5258;}#mo4fcgdx9hoomsg9dsn .section-2 text{fill:lightgrey;}#mo4fcgdx9hoomsg9dsn .node-icon-2{font-size:40px;color:lightgrey;}#mo4fcgdx9hoomsg9dsn .section-edge-2{stroke:#3f5258;}#mo4fcgdx9hoomsg9dsn .edge-depth-2{stroke-width:8;}#mo4fcgdx9hoomsg9dsn .section-2 line{stroke:#c0ada7;stroke-width:3;}#mo4fcgdx9hoomsg9dsn .disabled,#mo4fcgdx9hoomsg9dsn .disabled circle,#mo4fcgdx9hoomsg9dsn .disabled text{fill:lightgray;}#mo4fcgdx9hoomsg9dsn .disabled text{fill:#efefef;}#mo4fcgdx9hoomsg9dsn .section-3 rect,#mo4fcgdx9hoomsg9dsn .section-3 path,#mo4fcgdx9hoomsg9dsn .section-3 circle,#mo4fcgdx9hoomsg9dsn .section-3 polygon,#mo4fcgdx9hoomsg9dsn .section-3 path{fill:#4f2f1b;}#mo4fcgdx9hoomsg9dsn .section-3 text{fill:lightgrey;}#mo4fcgdx9hoomsg9dsn .node-icon-3{font-size:40px;color:lightgrey;}#mo4fcgdx9hoomsg9dsn .section-edge-3{stroke:#4f2f1b;}#mo4fcgdx9hoomsg9dsn .edge-depth-3{stroke-width:5;}#mo4fcgdx9hoomsg9dsn .section-3 line{stroke:#b0d0e4;stroke-width:3;}#mo4fcgdx9hoomsg9dsn .disabled,#mo4fcgdx9hoomsg9dsn .disabled circle,#mo4fcgdx9hoomsg9dsn .disabled text{fill:lightgray;}#mo4fcgdx9hoomsg9dsn .disabled text{fill:#efefef;}#mo4fcgdx9hoomsg9dsn .section-4 rect,#mo4fcgdx9hoomsg9dsn .section-4 path,#mo4fcgdx9hoomsg9dsn .section-4 circle,#mo4fcgdx9hoomsg9dsn .section-4 polygon,#mo4fcgdx9hoomsg9dsn .section-4 path{fill:#6e0a0a;}#mo4fcgdx9hoomsg9dsn .section-4 text{fill:lightgrey;}#mo4fcgdx9hoomsg9dsn .node-icon-4{font-size:40px;color:lightgrey;}#mo4fcgdx9hoomsg9dsn .section-edge-4{stroke:#6e0a0a;}#mo4fcgdx9hoomsg9dsn .edge-depth-4{stroke-width:2;}#mo4fcgdx9hoomsg9dsn .section-4 line{stroke:#91f5f5;stroke-width:3;}#mo4fcgdx9hoomsg9dsn .disabled,#mo4fcgdx9hoomsg9dsn .disabled circle,#mo4fcgdx9hoomsg9dsn .disabled text{fill:lightgray;}#mo4fcgdx9hoomsg9dsn .disabled text{fill:#efefef;}#mo4fcgdx9hoomsg9dsn .section-5 rect,#mo4fcgdx9hoomsg9dsn .section-5 path,#mo4fcgdx9hoomsg9dsn .section-5 circle,#mo4fcgdx9hoomsg9dsn .section-5 polygon,#mo4fcgdx9hoomsg9dsn .section-5 path{fill:#3b0048;}#mo4fcgdx9hoomsg9dsn .section-5 text{fill:lightgrey;}#mo4fcgdx9hoomsg9dsn .node-icon-5{font-size:40px;color:lightgrey;}#mo4fcgdx9hoomsg9dsn .section-edge-5{stroke:#3b0048;}#mo4fcgdx9hoomsg9dsn .edge-depth-5{stroke-width:-1;}#mo4fcgdx9hoomsg9dsn .section-5 line{stroke:#c4ffb7;stroke-width:3;}#mo4fcgdx9hoomsg9dsn .disabled,#mo4fcgdx9hoomsg9dsn .disabled circle,#mo4fcgdx9hoomsg9dsn .disabled text{fill:lightgray;}#mo4fcgdx9hoomsg9dsn .disabled text{fill:#efefef;}#mo4fcgdx9hoomsg9dsn .section-6 rect,#mo4fcgdx9hoomsg9dsn .section-6 path,#mo4fcgdx9hoomsg9dsn .section-6 circle,#mo4fcgdx9hoomsg9dsn .section-6 polygon,#mo4fcgdx9hoomsg9dsn .section-6 path{fill:#995a01;}#mo4fcgdx9hoomsg9dsn .section-6 text{fill:lightgrey;}#mo4fcgdx9hoomsg9dsn .node-icon-6{font-size:40px;color:lightgrey;}#mo4fcgdx9hoomsg9dsn .section-edge-6{stroke:#995a01;}#mo4fcgdx9hoomsg9dsn .edge-depth-6{stroke-width:-4;}#mo4fcgdx9hoomsg9dsn .section-6 line{stroke:#66a5fe;stroke-width:3;}#mo4fcgdx9hoomsg9dsn .disabled,#mo4fcgdx9hoomsg9dsn .disabled circle,#mo4fcgdx9hoomsg9dsn .disabled text{fill:lightgray;}#mo4fcgdx9hoomsg9dsn .disabled text{fill:#efefef;}#mo4fcgdx9hoomsg9dsn .section-7 rect,#mo4fcgdx9hoomsg9dsn .section-7 path,#mo4fcgdx9hoomsg9dsn .section-7 circle,#mo4fcgdx9hoomsg9dsn .section-7 polygon,#mo4fcgdx9hoomsg9dsn .section-7 path{fill:#154706;}#mo4fcgdx9hoomsg9dsn .section-7 text{fill:lightgrey;}#mo4fcgdx9hoomsg9dsn .node-icon-7{font-size:40px;color:lightgrey;}#mo4fcgdx9hoomsg9dsn .section-edge-7{stroke:#154706;}#mo4fcgdx9hoomsg9dsn .edge-depth-7{stroke-width:-7;}#mo4fcgdx9hoomsg9dsn .section-7 line{stroke:#eab8f9;stroke-width:3;}#mo4fcgdx9hoomsg9dsn .disabled,#mo4fcgdx9hoomsg9dsn .disabled circle,#mo4fcgdx9hoomsg9dsn .disabled text{fill:lightgray;}#mo4fcgdx9hoomsg9dsn .disabled text{fill:#efefef;}#mo4fcgdx9hoomsg9dsn .section-8 rect,#mo4fcgdx9hoomsg9dsn .section-8 path,#mo4fcgdx9hoomsg9dsn .section-8 circle,#mo4fcgdx9hoomsg9dsn .section-8 polygon,#mo4fcgdx9hoomsg9dsn .section-8 path{fill:#161722;}#mo4fcgdx9hoomsg9dsn .section-8 text{fill:lightgrey;}#mo4fcgdx9hoomsg9dsn .node-icon-8{font-size:40px;color:lightgrey;}#mo4fcgdx9hoomsg9dsn .section-edge-8{stroke:#161722;}#mo4fcgdx9hoomsg9dsn .edge-depth-8{stroke-width:-10;}#mo4fcgdx9hoomsg9dsn .section-8 line{stroke:#e9e8dd;stroke-width:3;}#mo4fcgdx9hoomsg9dsn .disabled,#mo4fcgdx9hoomsg9dsn .disabled circle,#mo4fcgdx9hoomsg9dsn .disabled text{fill:lightgray;}#mo4fcgdx9hoomsg9dsn .disabled text{fill:#efefef;}#mo4fcgdx9hoomsg9dsn .section-9 rect,#mo4fcgdx9hoomsg9dsn .section-9 path,#mo4fcgdx9hoomsg9dsn .section-9 circle,#mo4fcgdx9hoomsg9dsn .section-9 polygon,#mo4fcgdx9hoomsg9dsn .section-9 path{fill:#00296f;}#mo4fcgdx9hoomsg9dsn .section-9 text{fill:lightgrey;}#mo4fcgdx9hoomsg9dsn .node-icon-9{font-size:40px;color:lightgrey;}#mo4fcgdx9hoomsg9dsn .section-edge-9{stroke:#00296f;}#mo4fcgdx9hoomsg9dsn .edge-depth-9{stroke-width:-13;}#mo4fcgdx9hoomsg9dsn .section-9 line{stroke:#ffd690;stroke-width:3;}#mo4fcgdx9hoomsg9dsn .disabled,#mo4fcgdx9hoomsg9dsn .disabled circle,#mo4fcgdx9hoomsg9dsn .disabled text{fill:lightgray;}#mo4fcgdx9hoomsg9dsn .disabled text{fill:#efefef;}#mo4fcgdx9hoomsg9dsn .section-10 rect,#mo4fcgdx9hoomsg9dsn .section-10 path,#mo4fcgdx9hoomsg9dsn .section-10 circle,#mo4fcgdx9hoomsg9dsn .section-10 polygon,#mo4fcgdx9hoomsg9dsn .section-10 path{fill:#01629c;}#mo4fcgdx9hoomsg9dsn .section-10 text{fill:lightgrey;}#mo4fcgdx9hoomsg9dsn .node-icon-10{font-size:40px;color:lightgrey;}#mo4fcgdx9hoomsg9dsn .section-edge-10{stroke:#01629c;}#mo4fcgdx9hoomsg9dsn .edge-depth-10{stroke-width:-16;}#mo4fcgdx9hoomsg9dsn .section-10 line{stroke:#fe9d63;stroke-width:3;}#mo4fcgdx9hoomsg9dsn .disabled,#mo4fcgdx9hoomsg9dsn .disabled circle,#mo4fcgdx9hoomsg9dsn .disabled text{fill:lightgray;}#mo4fcgdx9hoomsg9dsn .disabled text{fill:#efefef;}#mo4fcgdx9hoomsg9dsn .section-root rect,#mo4fcgdx9hoomsg9dsn .section-root path,#mo4fcgdx9hoomsg9dsn .section-root circle,#mo4fcgdx9hoomsg9dsn .section-root polygon{fill:hsl(180, 1.5873015873%, 48.3529411765%);}#mo4fcgdx9hoomsg9dsn .section-root text{fill:#2c2c2c;}#mo4fcgdx9hoomsg9dsn .section-root span{color:#2c2c2c;}#mo4fcgdx9hoomsg9dsn .section-2 span{color:#2c2c2c;}#mo4fcgdx9hoomsg9dsn .icon-container{height:100%;display:flex;justify-content:center;align-items:center;}#mo4fcgdx9hoomsg9dsn .edge{fill:none;}#mo4fcgdx9hoomsg9dsn .mindmap-node-label{dy:1em;alignment-baseline:middle;text-anchor:middle;dominant-baseline:middle;text-align:center;}#mo4fcgdx9hoomsg9dsn :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}xtools 5.0.0低调大师工具箱基础模块 xtools-base异常体系BaseError接口CommonExceptionErrorModule枚举常量定义BaseParams接口核心工具 xtools-core加密工具Base64编解码MD5摘要SHA1摘要加密基础类时间工具Date工具LocalDateTime工具Instant工具Timestamp工具Calendar工具系统工具操作系统识别浏览器调用命令行执行系统信息采集扩展工具模板引擎分页计算URL处理距离计算随机数生成HTML工具执行时间统计类扫描器其他工具图像转换线程工厂日志输出敏感词过滤集合工具UUID生成数组工具字节/十六进制扩展工具 xtools-extend国密算法SM2非对称加密SM3哈希SM4对称加密PKCS填充JSON处理序列化反序列化JSON模板替换JWT令牌令牌生成令牌验证条码工具二维码生成条形码生成码识别文档处理PDF转图片Excel处理文本分析中文分词其他UserAgent解析拼音转换图片压缩IP地址查询S3存储Web模块 xtools-webXSS防护XSS过滤器XSS包装器XSS工具类会话管理Session工具枚举定义WebErrorHeaderEnumAPI模块 xtools-api阿里云邮件发送百度地理定位天气查询其他请求日志测试模块 xtools-testBaseTest测试基类模板方法模式1.5 功能关系图 #mo4fcgdxnyb39ti8ol{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#ccc;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mo4fcgdxnyb39ti8ol .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mo4fcgdxnyb39ti8ol .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mo4fcgdxnyb39ti8ol .error-icon{fill:#a44141;}#mo4fcgdxnyb39ti8ol .error-text{fill:#ddd;stroke:#ddd;}#mo4fcgdxnyb39ti8ol .edge-thickness-normal{stroke-width:1px;}#mo4fcgdxnyb39ti8ol .edge-thickness-thick{stroke-width:3.5px;}#mo4fcgdxnyb39ti8ol .edge-pattern-solid{stroke-dasharray:0;}#mo4fcgdxnyb39ti8ol .edge-thickness-invisible{stroke-width:0;fill:none;}#mo4fcgdxnyb39ti8ol .edge-pattern-dashed{stroke-dasharray:3;}#mo4fcgdxnyb39ti8ol .edge-pattern-dotted{stroke-dasharray:2;}#mo4fcgdxnyb39ti8ol .marker{fill:lightgrey;stroke:lightgrey;}#mo4fcgdxnyb39ti8ol .marker.cross{stroke:lightgrey;}#mo4fcgdxnyb39ti8ol svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mo4fcgdxnyb39ti8ol p{margin:0;}#mo4fcgdxnyb39ti8ol .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#ccc;}#mo4fcgdxnyb39ti8ol .cluster-label text{fill:#F9FFFE;}#mo4fcgdxnyb39ti8ol .cluster-label span{color:#F9FFFE;}#mo4fcgdxnyb39ti8ol .cluster-label span p{background-color:transparent;}#mo4fcgdxnyb39ti8ol .label text,#mo4fcgdxnyb39ti8ol span{fill:#ccc;color:#ccc;}#mo4fcgdxnyb39ti8ol .node rect,#mo4fcgdxnyb39ti8ol .node circle,#mo4fcgdxnyb39ti8ol .node ellipse,#mo4fcgdxnyb39ti8ol .node polygon,#mo4fcgdxnyb39ti8ol .node path{fill:#1f2020;stroke:#ccc;stroke-width:1px;}#mo4fcgdxnyb39ti8ol .rough-node .label text,#mo4fcgdxnyb39ti8ol .node .label text,#mo4fcgdxnyb39ti8ol .image-shape .label,#mo4fcgdxnyb39ti8ol .icon-shape .label{text-anchor:middle;}#mo4fcgdxnyb39ti8ol .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mo4fcgdxnyb39ti8ol .rough-node .label,#mo4fcgdxnyb39ti8ol .node .label,#mo4fcgdxnyb39ti8ol .image-shape .label,#mo4fcgdxnyb39ti8ol .icon-shape .label{text-align:center;}#mo4fcgdxnyb39ti8ol .node.clickable{cursor:pointer;}#mo4fcgdxnyb39ti8ol .root .anchor path{fill:lightgrey!important;stroke-width:0;stroke:lightgrey;}#mo4fcgdxnyb39ti8ol .arrowheadPath{fill:lightgrey;}#mo4fcgdxnyb39ti8ol .edgePath .path{stroke:lightgrey;stroke-width:2.0px;}#mo4fcgdxnyb39ti8ol .flowchart-link{stroke:lightgrey;fill:none;}#mo4fcgdxnyb39ti8ol .edgeLabel{background-color:hsl(0, 0%, 34.4117647059%);text-align:center;}#mo4fcgdxnyb39ti8ol .edgeLabel p{background-color:hsl(0, 0%, 34.4117647059%);}#mo4fcgdxnyb39ti8ol .edgeLabel rect{opacity:0.5;background-color:hsl(0, 0%, 34.4117647059%);fill:hsl(0, 0%, 34.4117647059%);}#mo4fcgdxnyb39ti8ol .labelBkg{background-color:rgba(87.75, 87.75, 87.75, 0.5);}#mo4fcgdxnyb39ti8ol .cluster rect{fill:hsl(180, 1.5873015873%, 28.3529411765%);stroke:rgba(255, 255, 255, 0.25);stroke-width:1px;}#mo4fcgdxnyb39ti8ol .cluster text{fill:#F9FFFE;}#mo4fcgdxnyb39ti8ol .cluster span{color:#F9FFFE;}#mo4fcgdxnyb39ti8ol div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(20, 1.5873015873%, 12.3529411765%);border:1px solid rgba(255, 255, 255, 0.25);border-radius:2px;pointer-events:none;z-index:100;}#mo4fcgdxnyb39ti8ol .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#ccc;}#mo4fcgdxnyb39ti8ol rect.text{fill:none;stroke-width:0;}#mo4fcgdxnyb39ti8ol .icon-shape,#mo4fcgdxnyb39ti8ol .image-shape{background-color:hsl(0, 0%, 34.4117647059%);text-align:center;}#mo4fcgdxnyb39ti8ol .icon-shape p,#mo4fcgdxnyb39ti8ol .image-shape p{background-color:hsl(0, 0%, 34.4117647059%);padding:2px;}#mo4fcgdxnyb39ti8ol .icon-shape rect,#mo4fcgdxnyb39ti8ol .image-shape rect{opacity:0.5;background-color:hsl(0, 0%, 34.4117647059%);fill:hsl(0, 0%, 34.4117647059%);}#mo4fcgdxnyb39ti8ol .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mo4fcgdxnyb39ti8ol .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mo4fcgdxnyb39ti8ol :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}应用层xtools-core核心工具xtools-extend扩展工具xtools-webWeb工具xtools-apiAPI集成xtools-base基础模块xtools-test测试模块异常处理常量定义加密工具时间工具系统工具国密算法JSON工具JWT工具条码工具文档工具XSS过滤阿里云邮件百度地图二、项目结构设计 2.1 整体架构 #mo4fcgdx5f2ozvay3yu{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#ccc;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mo4fcgdx5f2ozvay3yu .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mo4fcgdx5f2ozvay3yu .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mo4fcgdx5f2ozvay3yu .error-icon{fill:#a44141;}#mo4fcgdx5f2ozvay3yu .error-text{fill:#ddd;stroke:#ddd;}#mo4fcgdx5f2ozvay3yu .edge-thickness-normal{stroke-width:1px;}#mo4fcgdx5f2ozvay3yu .edge-thickness-thick{stroke-width:3.5px;}#mo4fcgdx5f2ozvay3yu .edge-pattern-solid{stroke-dasharray:0;}#mo4fcgdx5f2ozvay3yu .edge-thickness-invisible{stroke-width:0;fill:none;}#mo4fcgdx5f2ozvay3yu .edge-pattern-dashed{stroke-dasharray:3;}#mo4fcgdx5f2ozvay3yu .edge-pattern-dotted{stroke-dasharray:2;}#mo4fcgdx5f2ozvay3yu .marker{fill:lightgrey;stroke:lightgrey;}#mo4fcgdx5f2ozvay3yu .marker.cross{stroke:lightgrey;}#mo4fcgdx5f2ozvay3yu svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mo4fcgdx5f2ozvay3yu p{margin:0;}#mo4fcgdx5f2ozvay3yu .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#ccc;}#mo4fcgdx5f2ozvay3yu .cluster-label text{fill:#F9FFFE;}#mo4fcgdx5f2ozvay3yu .cluster-label span{color:#F9FFFE;}#mo4fcgdx5f2ozvay3yu .cluster-label span p{background-color:transparent;}#mo4fcgdx5f2ozvay3yu .label text,#mo4fcgdx5f2ozvay3yu span{fill:#ccc;color:#ccc;}#mo4fcgdx5f2ozvay3yu .node rect,#mo4fcgdx5f2ozvay3yu .node circle,#mo4fcgdx5f2ozvay3yu .node ellipse,#mo4fcgdx5f2ozvay3yu .node polygon,#mo4fcgdx5f2ozvay3yu .node path{fill:#1f2020;stroke:#ccc;stroke-width:1px;}#mo4fcgdx5f2ozvay3yu .rough-node .label text,#mo4fcgdx5f2ozvay3yu .node .label text,#mo4fcgdx5f2ozvay3yu .image-shape .label,#mo4fcgdx5f2ozvay3yu .icon-shape .label{text-anchor:middle;}#mo4fcgdx5f2ozvay3yu .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mo4fcgdx5f2ozvay3yu .rough-node .label,#mo4fcgdx5f2ozvay3yu .node .label,#mo4fcgdx5f2ozvay3yu .image-shape .label,#mo4fcgdx5f2ozvay3yu .icon-shape .label{text-align:center;}#mo4fcgdx5f2ozvay3yu .node.clickable{cursor:pointer;}#mo4fcgdx5f2ozvay3yu .root .anchor path{fill:lightgrey!important;stroke-width:0;stroke:lightgrey;}#mo4fcgdx5f2ozvay3yu .arrowheadPath{fill:lightgrey;}#mo4fcgdx5f2ozvay3yu .edgePath .path{stroke:lightgrey;stroke-width:2.0px;}#mo4fcgdx5f2ozvay3yu .flowchart-link{stroke:lightgrey;fill:none;}#mo4fcgdx5f2ozvay3yu .edgeLabel{background-color:hsl(0, 0%, 34.4117647059%);text-align:center;}#mo4fcgdx5f2ozvay3yu .edgeLabel p{background-color:hsl(0, 0%, 34.4117647059%);}#mo4fcgdx5f2ozvay3yu .edgeLabel rect{opacity:0.5;background-color:hsl(0, 0%, 34.4117647059%);fill:hsl(0, 0%, 34.4117647059%);}#mo4fcgdx5f2ozvay3yu .labelBkg{background-color:rgba(87.75, 87.75, 87.75, 0.5);}#mo4fcgdx5f2ozvay3yu .cluster rect{fill:hsl(180, 1.5873015873%, 28.3529411765%);stroke:rgba(255, 255, 255, 0.25);stroke-width:1px;}#mo4fcgdx5f2ozvay3yu .cluster text{fill:#F9FFFE;}#mo4fcgdx5f2ozvay3yu .cluster span{color:#F9FFFE;}#mo4fcgdx5f2ozvay3yu div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(20, 1.5873015873%, 12.3529411765%);border:1px solid rgba(255, 255, 255, 0.25);border-radius:2px;pointer-events:none;z-index:100;}#mo4fcgdx5f2ozvay3yu .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#ccc;}#mo4fcgdx5f2ozvay3yu rect.text{fill:none;stroke-width:0;}#mo4fcgdx5f2ozvay3yu .icon-shape,#mo4fcgdx5f2ozvay3yu .image-shape{background-color:hsl(0, 0%, 34.4117647059%);text-align:center;}#mo4fcgdx5f2ozvay3yu .icon-shape p,#mo4fcgdx5f2ozvay3yu .image-shape p{background-color:hsl(0, 0%, 34.4117647059%);padding:2px;}#mo4fcgdx5f2ozvay3yu .icon-shape rect,#mo4fcgdx5f2ozvay3yu .image-shape rect{opacity:0.5;background-color:hsl(0, 0%, 34.4117647059%);fill:hsl(0, 0%, 34.4117647059%);}#mo4fcgdx5f2ozvay3yu .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mo4fcgdx5f2ozvay3yu .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mo4fcgdx5f2ozvay3yu :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}JUnit 6.0.3定义定义提供提供提供提供提供提供提供提供xtools父模块 5.0.0xtools-test测试模块xtools-base基础模块xtools-core核心工具模块xtools-extend扩展工具模块xtools-webWeb工具模块xtools-apiAPI集成模块JUnit Jupiter异常体系常量接口加密工具时间工具系统工具通用工具国密算法JSON/条码/文档XSS防护第三方API2.2 模块依赖关系 #mo4fcgdx3jvggdr7a8{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#ccc;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mo4fcgdx3jvggdr7a8 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mo4fcgdx3jvggdr7a8 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mo4fcgdx3jvggdr7a8 .error-icon{fill:#a44141;}#mo4fcgdx3jvggdr7a8 .error-text{fill:#ddd;stroke:#ddd;}#mo4fcgdx3jvggdr7a8 .edge-thickness-normal{stroke-width:1px;}#mo4fcgdx3jvggdr7a8 .edge-thickness-thick{stroke-width:3.5px;}#mo4fcgdx3jvggdr7a8 .edge-pattern-solid{stroke-dasharray:0;}#mo4fcgdx3jvggdr7a8 .edge-thickness-invisible{stroke-width:0;fill:none;}#mo4fcgdx3jvggdr7a8 .edge-pattern-dashed{stroke-dasharray:3;}#mo4fcgdx3jvggdr7a8 .edge-pattern-dotted{stroke-dasharray:2;}#mo4fcgdx3jvggdr7a8 .marker{fill:lightgrey;stroke:lightgrey;}#mo4fcgdx3jvggdr7a8 .marker.cross{stroke:lightgrey;}#mo4fcgdx3jvggdr7a8 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mo4fcgdx3jvggdr7a8 p{margin:0;}#mo4fcgdx3jvggdr7a8 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#ccc;}#mo4fcgdx3jvggdr7a8 .cluster-label text{fill:#F9FFFE;}#mo4fcgdx3jvggdr7a8 .cluster-label span{color:#F9FFFE;}#mo4fcgdx3jvggdr7a8 .cluster-label span p{background-color:transparent;}#mo4fcgdx3jvggdr7a8 .label text,#mo4fcgdx3jvggdr7a8 span{fill:#ccc;color:#ccc;}#mo4fcgdx3jvggdr7a8 .node rect,#mo4fcgdx3jvggdr7a8 .node circle,#mo4fcgdx3jvggdr7a8 .node ellipse,#mo4fcgdx3jvggdr7a8 .node polygon,#mo4fcgdx3jvggdr7a8 .node path{fill:#1f2020;stroke:#ccc;stroke-width:1px;}#mo4fcgdx3jvggdr7a8 .rough-node .label text,#mo4fcgdx3jvggdr7a8 .node .label text,#mo4fcgdx3jvggdr7a8 .image-shape .label,#mo4fcgdx3jvggdr7a8 .icon-shape .label{text-anchor:middle;}#mo4fcgdx3jvggdr7a8 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mo4fcgdx3jvggdr7a8 .rough-node .label,#mo4fcgdx3jvggdr7a8 .node .label,#mo4fcgdx3jvggdr7a8 .image-shape .label,#mo4fcgdx3jvggdr7a8 .icon-shape .label{text-align:center;}#mo4fcgdx3jvggdr7a8 .node.clickable{cursor:pointer;}#mo4fcgdx3jvggdr7a8 .root .anchor path{fill:lightgrey!important;stroke-width:0;stroke:lightgrey;}#mo4fcgdx3jvggdr7a8 .arrowheadPath{fill:lightgrey;}#mo4fcgdx3jvggdr7a8 .edgePath .path{stroke:lightgrey;stroke-width:2.0px;}#mo4fcgdx3jvggdr7a8 .flowchart-link{stroke:lightgrey;fill:none;}#mo4fcgdx3jvggdr7a8 .edgeLabel{background-color:hsl(0, 0%, 34.4117647059%);text-align:center;}#mo4fcgdx3jvggdr7a8 .edgeLabel p{background-color:hsl(0, 0%, 34.4117647059%);}#mo4fcgdx3jvggdr7a8 .edgeLabel rect{opacity:0.5;background-color:hsl(0, 0%, 34.4117647059%);fill:hsl(0, 0%, 34.4117647059%);}#mo4fcgdx3jvggdr7a8 .labelBkg{background-color:rgba(87.75, 87.75, 87.75, 0.5);}#mo4fcgdx3jvggdr7a8 .cluster rect{fill:hsl(180, 1.5873015873%, 28.3529411765%);stroke:rgba(255, 255, 255, 0.25);stroke-width:1px;}#mo4fcgdx3jvggdr7a8 .cluster text{fill:#F9FFFE;}#mo4fcgdx3jvggdr7a8 .cluster span{color:#F9FFFE;}#mo4fcgdx3jvggdr7a8 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(20, 1.5873015873%, 12.3529411765%);border:1px solid rgba(255, 255, 255, 0.25);border-radius:2px;pointer-events:none;z-index:100;}#mo4fcgdx3jvggdr7a8 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#ccc;}#mo4fcgdx3jvggdr7a8 rect.text{fill:none;stroke-width:0;}#mo4fcgdx3jvggdr7a8 .icon-shape,#mo4fcgdx3jvggdr7a8 .image-shape{background-color:hsl(0, 0%, 34.4117647059%);text-align:center;}#mo4fcgdx3jvggdr7a8 .icon-shape p,#mo4fcgdx3jvggdr7a8 .image-shape p{background-color:hsl(0, 0%, 34.4117647059%);padding:2px;}#mo4fcgdx3jvggdr7a8 .icon-shape rect,#mo4fcgdx3jvggdr7a8 .image-shape rect{opacity:0.5;background-color:hsl(0, 0%, 34.4117647059%);fill:hsl(0, 0%, 34.4117647059%);}#mo4fcgdx3jvggdr7a8 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mo4fcgdx3jvggdr7a8 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mo4fcgdx3jvggdr7a8 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}依赖层级xtools-test第1层:零依赖xtools-base第2层:依赖testxtools-core第3层:依赖test+basextools-extend第4层:依赖test+corextools-web第4层:依赖corextools-api第4层:依赖test+core2.3 模块职责 模块 职责 依赖 xtools-test 测试基础设施,提供BaseTest基类 JUnit Jupiter 6.0.3 xtools-base 基础定义,异常体系、常量、错误模块枚举 xtools-test xtools-core 核心工具集,加密、时间、系统、图像、线程等 xtools-test, xtools-base xtools-extend 扩展工具集,国密、JSON、JWT、条码、文档等 xtools-test, xtools-core xtools-web Web层工具,XSS过滤、Session管理 xtools-core xtools-api 第三方API集成,阿里云邮件、百度地图 xtools-test, xtools-core 2.4 包结构设计 复制代码 xtools ├── xtools-base(基础模块) │ └── xtools.base │ ├── exception # 异常体系 │ │ ├── BaseError # 错误接口 │ │ ├── BaseErrorModule # 错误模块接口 │ │ ├── CommonException # 通用异常 │ │ └── ExceptionUtils # 异常工具 │ ├── config # 配置 │ │ └── BaseParams # 常量接口 │ └── enums # 枚举 │ ├── ErrorModule # 错误模块枚举 │ ├── BaseErrorModule # 基础错误模块 │ └── TestError # 测试错误枚举 │ ├── xtools-core(核心工具模块) │ └── xtools.core │ ├── encrypt # 加密工具 │ │ ├── BaseEncryptUtils # 加密基础类 │ │ ├── Base64Utils # Base64编解码 │ │ ├── Md5Utils # MD5摘要 │ │ └── Sha1Utils # SHA1摘要 │ ├── time # 时间工具 │ │ ├── DateUtils # Date工具 │ │ ├── LocalDateTimeUtils # LocalDateTime工具 │ │ ├── InstantUtils # Instant工具 │ │ ├── TimestampUtils # Timestamp工具 │ │ └── CalendarUtils # Calendar工具 │ ├── sys # 系统工具 │ │ ├── OsUtils # 操作系统识别 │ │ ├── BrowserUtils # 浏览器调用 │ │ ├── CmdUtils # 命令行执行 │ │ └── SysBaseInfoUtils # 系统信息采集 │ ├── extend # 扩展工具 │ │ ├── TemplateUtils # 模板引擎 │ │ ├── PagingUtils # 分页计算 │ │ ├── UrlUtils # URL处理 │ │ ├── DistanceUtils # 距离计算 │ │ ├── RandomUtils # 随机数生成 │ │ ├── HtmlUtils # HTML工具 │ │ ├── ExecTimeUtils # 执行时间统计 │ │ ├── ClassScanner # 类扫描器 │ │ ├── CheckUtils # 参数校验 │ │ └── ArithmeticUtils # 数学运算 │ ├── img # 图像工具 │ │ └── BufferedImageUtils # 图像转换 │ ├── thread # 线程工具 │ │ ├── ToolThreadFactory # 线程工厂 │ │ └── TimeoutUtils # 超时控制 │ ├── log # 日志工具 │ │ └── LogUtils # 自定义日志 │ ├── sensitive # 敏感词 │ │ └── SensitiveWordUtils # DFA敏感词过滤 │ ├── dto # 数据传输对象 │ │ ├── FileInfo # 文件信息 │ │ ├── RsaDto # RSA密钥数据 │ │ └── SysBaseInfoDto # 系统信息 │ ├── enums # 枚举 │ │ ├── CoreError # 核心错误码 │ │ ├── RegexEnum # 正则表达式 │ │ ├── TimePattern # 时间格式 │ │ ├── LogLevel # 日志级别 │ │ └── OsEnum # 操作系统枚举 │ ├── ArrUtils # 数组工具 │ ├── BytesUtils # 字节数组工具 │ ├── HexUtils # 十六进制工具 │ ├── CollectionUtils # 集合工具 │ ├── UuidUtils # UUID工具 │ └── DtoConversionUtils # DTO转换工具 │ ├── xtools-extend(扩展工具模块) │ └── xtools.extend │ ├── encrypt # 国密算法 │ │ ├── Sm2Utils # SM2非对称加密 │ │ ├── Sm3Utils # SM3哈希 │ │ ├── Sm4Utils # SM4对称加密 │ │ └── PkcsUtils # PKCS填充 │ ├── office # 文档处理 │ │ ├── PdfUtils # PDF工具 │ │ ├── WordUtils # Word工具 │ │ ├── ExcelUtils # Excel工具 │ │ └── PptUtils # PPT工具 │ ├── dto # 数据传输对象 │ │ └── CryptoDto # 加密数据 │ ├── enums # 枚举 │ │ └── ExtendError # 扩展错误码 │ ├── JsonUtils # JSON工具 │ ├── JwtUtils # JWT工具 │ ├── CodeUtils # 二维码/条形码工具 │ ├── AnalyzerUtils # 中文分词 │ ├── UserAgentUtils # UserAgent解析 │ └── office # Office文档工具 │ ├── xtools-web(Web工具模块) │ └── xtools.web │ ├── xss # XSS防护 │ │ ├── XssFilter # XSS过滤器 │ │ ├── XssWrapper # XSS包装器 │ │ └── XssUtils # XSS工具 │ ├── enums # 枚举 │ │ ├── WebError # Web错误码 │ │ └── HeaderEnum # HTTP头枚举 │ └── SessionUtils # Session工具 │ ├── xtools-api(API集成模块) │ └── xtools.api │ ├── ali # 阿里云集成 │ │ └── AliEmailUtils # 邮件发送 │ ├── baidu # 百度集成 │ │ ├── LocationUtils # 地理定位 │ │ └── WeatherUtils # 天气查询 │ ├── dto # 数据传输对象 │ │ ├── IpAddrDto # IP地址信息 │ │ ├── LocationDto # 定位信息 │ │ └── LatAndLngDto # 经纬度 │ ├── enums # 枚举 │ │ └── ApiError # API错误码 │ ├── utils # 工具 │ │ └── ReqLogUtils # 请求日志 │ └── config # 配置 │ └── TestApiConfig # 测试配置 │ └── xtools-test(测试模块) └── xtools.test └── BaseTest # 测试基类 三、项目功能设计 3.1 异常处理体系设计 3.1.1 异常体系架构 #mo4fcgdxxbborxi5hht{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#ccc;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mo4fcgdxxbborxi5hht .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mo4fcgdxxbborxi5hht .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mo4fcgdxxbborxi5hht .error-icon{fill:#a44141;}#mo4fcgdxxbborxi5hht .error-text{fill:#ddd;stroke:#ddd;}#mo4fcgdxxbborxi5hht .edge-thickness-normal{stroke-width:1px;}#mo4fcgdxxbborxi5hht .edge-thickness-thick{stroke-width:3.5px;}#mo4fcgdxxbborxi5hht .edge-pattern-solid{stroke-dasharray:0;}#mo4fcgdxxbborxi5hht .edge-thickness-invisible{stroke-width:0;fill:none;}#mo4fcgdxxbborxi5hht .edge-pattern-dashed{stroke-dasharray:3;}#mo4fcgdxxbborxi5hht .edge-pattern-dotted{stroke-dasharray:2;}#mo4fcgdxxbborxi5hht .marker{fill:lightgrey;stroke:lightgrey;}#mo4fcgdxxbborxi5hht .marker.cross{stroke:lightgrey;}#mo4fcgdxxbborxi5hht svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mo4fcgdxxbborxi5hht p{margin:0;}#mo4fcgdxxbborxi5hht .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#ccc;}#mo4fcgdxxbborxi5hht .cluster-label text{fill:#F9FFFE;}#mo4fcgdxxbborxi5hht .cluster-label span{color:#F9FFFE;}#mo4fcgdxxbborxi5hht .cluster-label span p{background-color:transparent;}#mo4fcgdxxbborxi5hht .label text,#mo4fcgdxxbborxi5hht span{fill:#ccc;color:#ccc;}#mo4fcgdxxbborxi5hht .node rect,#mo4fcgdxxbborxi5hht .node circle,#mo4fcgdxxbborxi5hht .node ellipse,#mo4fcgdxxbborxi5hht .node polygon,#mo4fcgdxxbborxi5hht .node path{fill:#1f2020;stroke:#ccc;stroke-width:1px;}#mo4fcgdxxbborxi5hht .rough-node .label text,#mo4fcgdxxbborxi5hht .node .label text,#mo4fcgdxxbborxi5hht .image-shape .label,#mo4fcgdxxbborxi5hht .icon-shape .label{text-anchor:middle;}#mo4fcgdxxbborxi5hht .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mo4fcgdxxbborxi5hht .rough-node .label,#mo4fcgdxxbborxi5hht .node .label,#mo4fcgdxxbborxi5hht .image-shape .label,#mo4fcgdxxbborxi5hht .icon-shape .label{text-align:center;}#mo4fcgdxxbborxi5hht .node.clickable{cursor:pointer;}#mo4fcgdxxbborxi5hht .root .anchor path{fill:lightgrey!important;stroke-width:0;stroke:lightgrey;}#mo4fcgdxxbborxi5hht .arrowheadPath{fill:lightgrey;}#mo4fcgdxxbborxi5hht .edgePath .path{stroke:lightgrey;stroke-width:2.0px;}#mo4fcgdxxbborxi5hht .flowchart-link{stroke:lightgrey;fill:none;}#mo4fcgdxxbborxi5hht .edgeLabel{background-color:hsl(0, 0%, 34.4117647059%);text-align:center;}#mo4fcgdxxbborxi5hht .edgeLabel p{background-color:hsl(0, 0%, 34.4117647059%);}#mo4fcgdxxbborxi5hht .edgeLabel rect{opacity:0.5;background-color:hsl(0, 0%, 34.4117647059%);fill:hsl(0, 0%, 34.4117647059%);}#mo4fcgdxxbborxi5hht .labelBkg{background-color:rgba(87.75, 87.75, 87.75, 0.5);}#mo4fcgdxxbborxi5hht .cluster rect{fill:hsl(180, 1.5873015873%, 28.3529411765%);stroke:rgba(255, 255, 255, 0.25);stroke-width:1px;}#mo4fcgdxxbborxi5hht .cluster text{fill:#F9FFFE;}#mo4fcgdxxbborxi5hht .cluster span{color:#F9FFFE;}#mo4fcgdxxbborxi5hht div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(20, 1.5873015873%, 12.3529411765%);border:1px solid rgba(255, 255, 255, 0.25);border-radius:2px;pointer-events:none;z-index:100;}#mo4fcgdxxbborxi5hht .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#ccc;}#mo4fcgdxxbborxi5hht rect.text{fill:none;stroke-width:0;}#mo4fcgdxxbborxi5hht .icon-shape,#mo4fcgdxxbborxi5hht .image-shape{background-color:hsl(0, 0%, 34.4117647059%);text-align:center;}#mo4fcgdxxbborxi5hht .icon-shape p,#mo4fcgdxxbborxi5hht .image-shape p{background-color:hsl(0, 0%, 34.4117647059%);padding:2px;}#mo4fcgdxxbborxi5hht .icon-shape rect,#mo4fcgdxxbborxi5hht .image-shape rect{opacity:0.5;background-color:hsl(0, 0%, 34.4117647059%);fill:hsl(0, 0%, 34.4117647059%);}#mo4fcgdxxbborxi5hht .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mo4fcgdxxbborxi5hht .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mo4fcgdxxbborxi5hht :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}RuntimeExceptionCommonException通用异常BaseError错误接口BaseErrorModule错误模块接口CoreError核心错误码98001-99999ApiErrorAPI错误码95001-95011WebErrorWeb错误码ExtendError扩展错误码ErrorModule错误模块枚举XTOOLS_COREXTOOLS_WEBXTOOLS_EXTENDXTOOLS_API3.1.2 异常处理流程 #mo4fcgdx5v97orlu0u4{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#ccc;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mo4fcgdx5v97orlu0u4 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mo4fcgdx5v97orlu0u4 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mo4fcgdx5v97orlu0u4 .error-icon{fill:#a44141;}#mo4fcgdx5v97orlu0u4 .error-text{fill:#ddd;stroke:#ddd;}#mo4fcgdx5v97orlu0u4 .edge-thickness-normal{stroke-width:1px;}#mo4fcgdx5v97orlu0u4 .edge-thickness-thick{stroke-width:3.5px;}#mo4fcgdx5v97orlu0u4 .edge-pattern-solid{stroke-dasharray:0;}#mo4fcgdx5v97orlu0u4 .edge-thickness-invisible{stroke-width:0;fill:none;}#mo4fcgdx5v97orlu0u4 .edge-pattern-dashed{stroke-dasharray:3;}#mo4fcgdx5v97orlu0u4 .edge-pattern-dotted{stroke-dasharray:2;}#mo4fcgdx5v97orlu0u4 .marker{fill:lightgrey;stroke:lightgrey;}#mo4fcgdx5v97orlu0u4 .marker.cross{stroke:lightgrey;}#mo4fcgdx5v97orlu0u4 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mo4fcgdx5v97orlu0u4 p{margin:0;}#mo4fcgdx5v97orlu0u4 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#ccc;}#mo4fcgdx5v97orlu0u4 .cluster-label text{fill:#F9FFFE;}#mo4fcgdx5v97orlu0u4 .cluster-label span{color:#F9FFFE;}#mo4fcgdx5v97orlu0u4 .cluster-label span p{background-color:transparent;}#mo4fcgdx5v97orlu0u4 .label text,#mo4fcgdx5v97orlu0u4 span{fill:#ccc;color:#ccc;}#mo4fcgdx5v97orlu0u4 .node rect,#mo4fcgdx5v97orlu0u4 .node circle,#mo4fcgdx5v97orlu0u4 .node ellipse,#mo4fcgdx5v97orlu0u4 .node polygon,#mo4fcgdx5v97orlu0u4 .node path{fill:#1f2020;stroke:#ccc;stroke-width:1px;}#mo4fcgdx5v97orlu0u4 .rough-node .label text,#mo4fcgdx5v97orlu0u4 .node .label text,#mo4fcgdx5v97orlu0u4 .image-shape .label,#mo4fcgdx5v97orlu0u4 .icon-shape .label{text-anchor:middle;}#mo4fcgdx5v97orlu0u4 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mo4fcgdx5v97orlu0u4 .rough-node .label,#mo4fcgdx5v97orlu0u4 .node .label,#mo4fcgdx5v97orlu0u4 .image-shape .label,#mo4fcgdx5v97orlu0u4 .icon-shape .label{text-align:center;}#mo4fcgdx5v97orlu0u4 .node.clickable{cursor:pointer;}#mo4fcgdx5v97orlu0u4 .root .anchor path{fill:lightgrey!important;stroke-width:0;stroke:lightgrey;}#mo4fcgdx5v97orlu0u4 .arrowheadPath{fill:lightgrey;}#mo4fcgdx5v97orlu0u4 .edgePath .path{stroke:lightgrey;stroke-width:2.0px;}#mo4fcgdx5v97orlu0u4 .flowchart-link{stroke:lightgrey;fill:none;}#mo4fcgdx5v97orlu0u4 .edgeLabel{background-color:hsl(0, 0%, 34.4117647059%);text-align:center;}#mo4fcgdx5v97orlu0u4 .edgeLabel p{background-color:hsl(0, 0%, 34.4117647059%);}#mo4fcgdx5v97orlu0u4 .edgeLabel rect{opacity:0.5;background-color:hsl(0, 0%, 34.4117647059%);fill:hsl(0, 0%, 34.4117647059%);}#mo4fcgdx5v97orlu0u4 .labelBkg{background-color:rgba(87.75, 87.75, 87.75, 0.5);}#mo4fcgdx5v97orlu0u4 .cluster rect{fill:hsl(180, 1.5873015873%, 28.3529411765%);stroke:rgba(255, 255, 255, 0.25);stroke-width:1px;}#mo4fcgdx5v97orlu0u4 .cluster text{fill:#F9FFFE;}#mo4fcgdx5v97orlu0u4 .cluster span{color:#F9FFFE;}#mo4fcgdx5v97orlu0u4 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(20, 1.5873015873%, 12.3529411765%);border:1px solid rgba(255, 255, 255, 0.25);border-radius:2px;pointer-events:none;z-index:100;}#mo4fcgdx5v97orlu0u4 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#ccc;}#mo4fcgdx5v97orlu0u4 rect.text{fill:none;stroke-width:0;}#mo4fcgdx5v97orlu0u4 .icon-shape,#mo4fcgdx5v97orlu0u4 .image-shape{background-color:hsl(0, 0%, 34.4117647059%);text-align:center;}#mo4fcgdx5v97orlu0u4 .icon-shape p,#mo4fcgdx5v97orlu0u4 .image-shape p{background-color:hsl(0, 0%, 34.4117647059%);padding:2px;}#mo4fcgdx5v97orlu0u4 .icon-shape rect,#mo4fcgdx5v97orlu0u4 .image-shape rect{opacity:0.5;background-color:hsl(0, 0%, 34.4117647059%);fill:hsl(0, 0%, 34.4117647059%);}#mo4fcgdx5v97orlu0u4 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mo4fcgdx5v97orlu0u4 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mo4fcgdx5v97orlu0u4 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}检查异常业务校验失败业务方法执行发生异常捕获Exception主动创建CommonExceptionCommonException.createErrorEnum, cause, params格式化错误消息module:type-code + msg抛出CommonException上层调用者处理3.1.3 错误码规范 模块 错误码范围 枚举类 示例 xtools-core 98001-99999 CoreError ENCRYPT(98201) xtools-api 95001-95011 ApiError ALI(95001), BAIDU(95011) xtools-web Web模块范围 WebError - xtools-extend Extend模块范围 ExtendError - 3.2 加密工具设计 3.2.1 加密体系架构 #mo4fcgdxeoz41njnqmm{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#ccc;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mo4fcgdxeoz41njnqmm .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mo4fcgdxeoz41njnqmm .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mo4fcgdxeoz41njnqmm .error-icon{fill:#a44141;}#mo4fcgdxeoz41njnqmm .error-text{fill:#ddd;stroke:#ddd;}#mo4fcgdxeoz41njnqmm .edge-thickness-normal{stroke-width:1px;}#mo4fcgdxeoz41njnqmm .edge-thickness-thick{stroke-width:3.5px;}#mo4fcgdxeoz41njnqmm .edge-pattern-solid{stroke-dasharray:0;}#mo4fcgdxeoz41njnqmm .edge-thickness-invisible{stroke-width:0;fill:none;}#mo4fcgdxeoz41njnqmm .edge-pattern-dashed{stroke-dasharray:3;}#mo4fcgdxeoz41njnqmm .edge-pattern-dotted{stroke-dasharray:2;}#mo4fcgdxeoz41njnqmm .marker{fill:lightgrey;stroke:lightgrey;}#mo4fcgdxeoz41njnqmm .marker.cross{stroke:lightgrey;}#mo4fcgdxeoz41njnqmm svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mo4fcgdxeoz41njnqmm p{margin:0;}#mo4fcgdxeoz41njnqmm .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#ccc;}#mo4fcgdxeoz41njnqmm .cluster-label text{fill:#F9FFFE;}#mo4fcgdxeoz41njnqmm .cluster-label span{color:#F9FFFE;}#mo4fcgdxeoz41njnqmm .cluster-label span p{background-color:transparent;}#mo4fcgdxeoz41njnqmm .label text,#mo4fcgdxeoz41njnqmm span{fill:#ccc;color:#ccc;}#mo4fcgdxeoz41njnqmm .node rect,#mo4fcgdxeoz41njnqmm .node circle,#mo4fcgdxeoz41njnqmm .node ellipse,#mo4fcgdxeoz41njnqmm .node polygon,#mo4fcgdxeoz41njnqmm .node path{fill:#1f2020;stroke:#ccc;stroke-width:1px;}#mo4fcgdxeoz41njnqmm .rough-node .label text,#mo4fcgdxeoz41njnqmm .node .label text,#mo4fcgdxeoz41njnqmm .image-shape .label,#mo4fcgdxeoz41njnqmm .icon-shape .label{text-anchor:middle;}#mo4fcgdxeoz41njnqmm .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mo4fcgdxeoz41njnqmm .rough-node .label,#mo4fcgdxeoz41njnqmm .node .label,#mo4fcgdxeoz41njnqmm .image-shape .label,#mo4fcgdxeoz41njnqmm .icon-shape .label{text-align:center;}#mo4fcgdxeoz41njnqmm .node.clickable{cursor:pointer;}#mo4fcgdxeoz41njnqmm .root .anchor path{fill:lightgrey!important;stroke-width:0;stroke:lightgrey;}#mo4fcgdxeoz41njnqmm .arrowheadPath{fill:lightgrey;}#mo4fcgdxeoz41njnqmm .edgePath .path{stroke:lightgrey;stroke-width:2.0px;}#mo4fcgdxeoz41njnqmm .flowchart-link{stroke:lightgrey;fill:none;}#mo4fcgdxeoz41njnqmm .edgeLabel{background-color:hsl(0, 0%, 34.4117647059%);text-align:center;}#mo4fcgdxeoz41njnqmm .edgeLabel p{background-color:hsl(0, 0%, 34.4117647059%);}#mo4fcgdxeoz41njnqmm .edgeLabel rect{opacity:0.5;background-color:hsl(0, 0%, 34.4117647059%);fill:hsl(0, 0%, 34.4117647059%);}#mo4fcgdxeoz41njnqmm .labelBkg{background-color:rgba(87.75, 87.75, 87.75, 0.5);}#mo4fcgdxeoz41njnqmm .cluster rect{fill:hsl(180, 1.5873015873%, 28.3529411765%);stroke:rgba(255, 255, 255, 0.25);stroke-width:1px;}#mo4fcgdxeoz41njnqmm .cluster text{fill:#F9FFFE;}#mo4fcgdxeoz41njnqmm .cluster span{color:#F9FFFE;}#mo4fcgdxeoz41njnqmm div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(20, 1.5873015873%, 12.3529411765%);border:1px solid rgba(255, 255, 255, 0.25);border-radius:2px;pointer-events:none;z-index:100;}#mo4fcgdxeoz41njnqmm .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#ccc;}#mo4fcgdxeoz41njnqmm rect.text{fill:none;stroke-width:0;}#mo4fcgdxeoz41njnqmm .icon-shape,#mo4fcgdxeoz41njnqmm .image-shape{background-color:hsl(0, 0%, 34.4117647059%);text-align:center;}#mo4fcgdxeoz41njnqmm .icon-shape p,#mo4fcgdxeoz41njnqmm .image-shape p{background-color:hsl(0, 0%, 34.4117647059%);padding:2px;}#mo4fcgdxeoz41njnqmm .icon-shape rect,#mo4fcgdxeoz41njnqmm .image-shape rect{opacity:0.5;background-color:hsl(0, 0%, 34.4117647059%);fill:hsl(0, 0%, 34.4117647059%);}#mo4fcgdxeoz41njnqmm .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mo4fcgdxeoz41njnqmm .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mo4fcgdxeoz41njnqmm :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}xtools-extend 密钥管理RsaDtoRSA密钥数据CryptoDto加密数据DTOxtools-extend 国密算法Sm2UtilsSM2非对称加密BouncyCastle 1.84Sm3UtilsSM3哈希Sm4UtilsSM4对称加密PkcsUtilsPKCS填充xtools-core 基础加密BaseEncryptUtils加密基础类Base64UtilsBase64编解码Md5UtilsMD5摘要Sha1UtilsSHA1摘要3.2.2 加密工具功能 工具类 所属模块 功能描述 BaseEncryptUtils xtools-core 加密基础类,提供MessageDigest、密钥生成、Cipher创建等底层方法(protected) Base64Utils xtools-core Base64编解码 Md5Utils xtools-core MD5消息摘要 Sha1Utils xtools-core SHA1消息摘要 Sm2Utils xtools-extend SM2非对称加密/解密,基于BouncyCastle Sm3Utils xtools-extend SM3哈希算法,国密摘要 Sm4Utils xtools-extend SM4对称加密/解密,国密分组密码 PkcsUtils xtools-extend PKCS#7填充方案 3.3 时间工具设计 #mo4fcgdxpu194kqgxmp{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#ccc;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mo4fcgdxpu194kqgxmp .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mo4fcgdxpu194kqgxmp .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mo4fcgdxpu194kqgxmp .error-icon{fill:#a44141;}#mo4fcgdxpu194kqgxmp .error-text{fill:#ddd;stroke:#ddd;}#mo4fcgdxpu194kqgxmp .edge-thickness-normal{stroke-width:1px;}#mo4fcgdxpu194kqgxmp .edge-thickness-thick{stroke-width:3.5px;}#mo4fcgdxpu194kqgxmp .edge-pattern-solid{stroke-dasharray:0;}#mo4fcgdxpu194kqgxmp .edge-thickness-invisible{stroke-width:0;fill:none;}#mo4fcgdxpu194kqgxmp .edge-pattern-dashed{stroke-dasharray:3;}#mo4fcgdxpu194kqgxmp .edge-pattern-dotted{stroke-dasharray:2;}#mo4fcgdxpu194kqgxmp .marker{fill:lightgrey;stroke:lightgrey;}#mo4fcgdxpu194kqgxmp .marker.cross{stroke:lightgrey;}#mo4fcgdxpu194kqgxmp svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mo4fcgdxpu194kqgxmp p{margin:0;}#mo4fcgdxpu194kqgxmp .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#ccc;}#mo4fcgdxpu194kqgxmp .cluster-label text{fill:#F9FFFE;}#mo4fcgdxpu194kqgxmp .cluster-label span{color:#F9FFFE;}#mo4fcgdxpu194kqgxmp .cluster-label span p{background-color:transparent;}#mo4fcgdxpu194kqgxmp .label text,#mo4fcgdxpu194kqgxmp span{fill:#ccc;color:#ccc;}#mo4fcgdxpu194kqgxmp .node rect,#mo4fcgdxpu194kqgxmp .node circle,#mo4fcgdxpu194kqgxmp .node ellipse,#mo4fcgdxpu194kqgxmp .node polygon,#mo4fcgdxpu194kqgxmp .node path{fill:#1f2020;stroke:#ccc;stroke-width:1px;}#mo4fcgdxpu194kqgxmp .rough-node .label text,#mo4fcgdxpu194kqgxmp .node .label text,#mo4fcgdxpu194kqgxmp .image-shape .label,#mo4fcgdxpu194kqgxmp .icon-shape .label{text-anchor:middle;}#mo4fcgdxpu194kqgxmp .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mo4fcgdxpu194kqgxmp .rough-node .label,#mo4fcgdxpu194kqgxmp .node .label,#mo4fcgdxpu194kqgxmp .image-shape .label,#mo4fcgdxpu194kqgxmp .icon-shape .label{text-align:center;}#mo4fcgdxpu194kqgxmp .node.clickable{cursor:pointer;}#mo4fcgdxpu194kqgxmp .root .anchor path{fill:lightgrey!important;stroke-width:0;stroke:lightgrey;}#mo4fcgdxpu194kqgxmp .arrowheadPath{fill:lightgrey;}#mo4fcgdxpu194kqgxmp .edgePath .path{stroke:lightgrey;stroke-width:2.0px;}#mo4fcgdxpu194kqgxmp .flowchart-link{stroke:lightgrey;fill:none;}#mo4fcgdxpu194kqgxmp .edgeLabel{background-color:hsl(0, 0%, 34.4117647059%);text-align:center;}#mo4fcgdxpu194kqgxmp .edgeLabel p{background-color:hsl(0, 0%, 34.4117647059%);}#mo4fcgdxpu194kqgxmp .edgeLabel rect{opacity:0.5;background-color:hsl(0, 0%, 34.4117647059%);fill:hsl(0, 0%, 34.4117647059%);}#mo4fcgdxpu194kqgxmp .labelBkg{background-color:rgba(87.75, 87.75, 87.75, 0.5);}#mo4fcgdxpu194kqgxmp .cluster rect{fill:hsl(180, 1.5873015873%, 28.3529411765%);stroke:rgba(255, 255, 255, 0.25);stroke-width:1px;}#mo4fcgdxpu194kqgxmp .cluster text{fill:#F9FFFE;}#mo4fcgdxpu194kqgxmp .cluster span{color:#F9FFFE;}#mo4fcgdxpu194kqgxmp div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(20, 1.5873015873%, 12.3529411765%);border:1px solid rgba(255, 255, 255, 0.25);border-radius:2px;pointer-events:none;z-index:100;}#mo4fcgdxpu194kqgxmp .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#ccc;}#mo4fcgdxpu194kqgxmp rect.text{fill:none;stroke-width:0;}#mo4fcgdxpu194kqgxmp .icon-shape,#mo4fcgdxpu194kqgxmp .image-shape{background-color:hsl(0, 0%, 34.4117647059%);text-align:center;}#mo4fcgdxpu194kqgxmp .icon-shape p,#mo4fcgdxpu194kqgxmp .image-shape p{background-color:hsl(0, 0%, 34.4117647059%);padding:2px;}#mo4fcgdxpu194kqgxmp .icon-shape rect,#mo4fcgdxpu194kqgxmp .image-shape rect{opacity:0.5;background-color:hsl(0, 0%, 34.4117647059%);fill:hsl(0, 0%, 34.4117647059%);}#mo4fcgdxpu194kqgxmp .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mo4fcgdxpu194kqgxmp .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mo4fcgdxpu194kqgxmp :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}xtools-core 时间工具from/convertfrom/convertfrom/convertfrom/convertfrom/convertDateUtilsjava.util.DateLocalDateTimeUtilsjava.time.LocalDateTimeInstantUtilsjava.time.InstantTimestampUtilsjava.sql.TimestampCalendarUtilsjava.util.CalendarTimePattern枚举YMDHMS/YMD/YM等3.4 系统工具设计 #mo4fcgdxpqqif1ty1b{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#ccc;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mo4fcgdxpqqif1ty1b .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mo4fcgdxpqqif1ty1b .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mo4fcgdxpqqif1ty1b .error-icon{fill:#a44141;}#mo4fcgdxpqqif1ty1b .error-text{fill:#ddd;stroke:#ddd;}#mo4fcgdxpqqif1ty1b .edge-thickness-normal{stroke-width:1px;}#mo4fcgdxpqqif1ty1b .edge-thickness-thick{stroke-width:3.5px;}#mo4fcgdxpqqif1ty1b .edge-pattern-solid{stroke-dasharray:0;}#mo4fcgdxpqqif1ty1b .edge-thickness-invisible{stroke-width:0;fill:none;}#mo4fcgdxpqqif1ty1b .edge-pattern-dashed{stroke-dasharray:3;}#mo4fcgdxpqqif1ty1b .edge-pattern-dotted{stroke-dasharray:2;}#mo4fcgdxpqqif1ty1b .marker{fill:lightgrey;stroke:lightgrey;}#mo4fcgdxpqqif1ty1b .marker.cross{stroke:lightgrey;}#mo4fcgdxpqqif1ty1b svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mo4fcgdxpqqif1ty1b p{margin:0;}#mo4fcgdxpqqif1ty1b .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#ccc;}#mo4fcgdxpqqif1ty1b .cluster-label text{fill:#F9FFFE;}#mo4fcgdxpqqif1ty1b .cluster-label span{color:#F9FFFE;}#mo4fcgdxpqqif1ty1b .cluster-label span p{background-color:transparent;}#mo4fcgdxpqqif1ty1b .label text,#mo4fcgdxpqqif1ty1b span{fill:#ccc;color:#ccc;}#mo4fcgdxpqqif1ty1b .node rect,#mo4fcgdxpqqif1ty1b .node circle,#mo4fcgdxpqqif1ty1b .node ellipse,#mo4fcgdxpqqif1ty1b .node polygon,#mo4fcgdxpqqif1ty1b .node path{fill:#1f2020;stroke:#ccc;stroke-width:1px;}#mo4fcgdxpqqif1ty1b .rough-node .label text,#mo4fcgdxpqqif1ty1b .node .label text,#mo4fcgdxpqqif1ty1b .image-shape .label,#mo4fcgdxpqqif1ty1b .icon-shape .label{text-anchor:middle;}#mo4fcgdxpqqif1ty1b .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mo4fcgdxpqqif1ty1b .rough-node .label,#mo4fcgdxpqqif1ty1b .node .label,#mo4fcgdxpqqif1ty1b .image-shape .label,#mo4fcgdxpqqif1ty1b .icon-shape .label{text-align:center;}#mo4fcgdxpqqif1ty1b .node.clickable{cursor:pointer;}#mo4fcgdxpqqif1ty1b .root .anchor path{fill:lightgrey!important;stroke-width:0;stroke:lightgrey;}#mo4fcgdxpqqif1ty1b .arrowheadPath{fill:lightgrey;}#mo4fcgdxpqqif1ty1b .edgePath .path{stroke:lightgrey;stroke-width:2.0px;}#mo4fcgdxpqqif1ty1b .flowchart-link{stroke:lightgrey;fill:none;}#mo4fcgdxpqqif1ty1b .edgeLabel{background-color:hsl(0, 0%, 34.4117647059%);text-align:center;}#mo4fcgdxpqqif1ty1b .edgeLabel p{background-color:hsl(0, 0%, 34.4117647059%);}#mo4fcgdxpqqif1ty1b .edgeLabel rect{opacity:0.5;background-color:hsl(0, 0%, 34.4117647059%);fill:hsl(0, 0%, 34.4117647059%);}#mo4fcgdxpqqif1ty1b .labelBkg{background-color:rgba(87.75, 87.75, 87.75, 0.5);}#mo4fcgdxpqqif1ty1b .cluster rect{fill:hsl(180, 1.5873015873%, 28.3529411765%);stroke:rgba(255, 255, 255, 0.25);stroke-width:1px;}#mo4fcgdxpqqif1ty1b .cluster text{fill:#F9FFFE;}#mo4fcgdxpqqif1ty1b .cluster span{color:#F9FFFE;}#mo4fcgdxpqqif1ty1b div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(20, 1.5873015873%, 12.3529411765%);border:1px solid rgba(255, 255, 255, 0.25);border-radius:2px;pointer-events:none;z-index:100;}#mo4fcgdxpqqif1ty1b .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#ccc;}#mo4fcgdxpqqif1ty1b rect.text{fill:none;stroke-width:0;}#mo4fcgdxpqqif1ty1b .icon-shape,#mo4fcgdxpqqif1ty1b .image-shape{background-color:hsl(0, 0%, 34.4117647059%);text-align:center;}#mo4fcgdxpqqif1ty1b .icon-shape p,#mo4fcgdxpqqif1ty1b .image-shape p{background-color:hsl(0, 0%, 34.4117647059%);padding:2px;}#mo4fcgdxpqqif1ty1b .icon-shape rect,#mo4fcgdxpqqif1ty1b .image-shape rect{opacity:0.5;background-color:hsl(0, 0%, 34.4117647059%);fill:hsl(0, 0%, 34.4117647059%);}#mo4fcgdxpqqif1ty1b .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mo4fcgdxpqqif1ty1b .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mo4fcgdxpqqif1ty1b :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}系统工具Fluent Builder模式setRunDirsetResultCharsetrunOsUtils操作系统识别OsEnumWINDOWS/MAC/LINUXBrowserUtils浏览器调用CmdUtils命令行执行SysBaseInfoUtils系统信息采集init cmd设置工作目录设置字符编码执行命令OS信息Java版本内存信息CPU信息进程ID本地IP3.5 扩展工具设计 #mo4fcgdxapgx7s0nst7{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#ccc;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mo4fcgdxapgx7s0nst7 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mo4fcgdxapgx7s0nst7 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mo4fcgdxapgx7s0nst7 .error-icon{fill:#a44141;}#mo4fcgdxapgx7s0nst7 .error-text{fill:#ddd;stroke:#ddd;}#mo4fcgdxapgx7s0nst7 .edge-thickness-normal{stroke-width:1px;}#mo4fcgdxapgx7s0nst7 .edge-thickness-thick{stroke-width:3.5px;}#mo4fcgdxapgx7s0nst7 .edge-pattern-solid{stroke-dasharray:0;}#mo4fcgdxapgx7s0nst7 .edge-thickness-invisible{stroke-width:0;fill:none;}#mo4fcgdxapgx7s0nst7 .edge-pattern-dashed{stroke-dasharray:3;}#mo4fcgdxapgx7s0nst7 .edge-pattern-dotted{stroke-dasharray:2;}#mo4fcgdxapgx7s0nst7 .marker{fill:lightgrey;stroke:lightgrey;}#mo4fcgdxapgx7s0nst7 .marker.cross{stroke:lightgrey;}#mo4fcgdxapgx7s0nst7 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mo4fcgdxapgx7s0nst7 p{margin:0;}#mo4fcgdxapgx7s0nst7 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#ccc;}#mo4fcgdxapgx7s0nst7 .cluster-label text{fill:#F9FFFE;}#mo4fcgdxapgx7s0nst7 .cluster-label span{color:#F9FFFE;}#mo4fcgdxapgx7s0nst7 .cluster-label span p{background-color:transparent;}#mo4fcgdxapgx7s0nst7 .label text,#mo4fcgdxapgx7s0nst7 span{fill:#ccc;color:#ccc;}#mo4fcgdxapgx7s0nst7 .node rect,#mo4fcgdxapgx7s0nst7 .node circle,#mo4fcgdxapgx7s0nst7 .node ellipse,#mo4fcgdxapgx7s0nst7 .node polygon,#mo4fcgdxapgx7s0nst7 .node path{fill:#1f2020;stroke:#ccc;stroke-width:1px;}#mo4fcgdxapgx7s0nst7 .rough-node .label text,#mo4fcgdxapgx7s0nst7 .node .label text,#mo4fcgdxapgx7s0nst7 .image-shape .label,#mo4fcgdxapgx7s0nst7 .icon-shape .label{text-anchor:middle;}#mo4fcgdxapgx7s0nst7 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mo4fcgdxapgx7s0nst7 .rough-node .label,#mo4fcgdxapgx7s0nst7 .node .label,#mo4fcgdxapgx7s0nst7 .image-shape .label,#mo4fcgdxapgx7s0nst7 .icon-shape .label{text-align:center;}#mo4fcgdxapgx7s0nst7 .node.clickable{cursor:pointer;}#mo4fcgdxapgx7s0nst7 .root .anchor path{fill:lightgrey!important;stroke-width:0;stroke:lightgrey;}#mo4fcgdxapgx7s0nst7 .arrowheadPath{fill:lightgrey;}#mo4fcgdxapgx7s0nst7 .edgePath .path{stroke:lightgrey;stroke-width:2.0px;}#mo4fcgdxapgx7s0nst7 .flowchart-link{stroke:lightgrey;fill:none;}#mo4fcgdxapgx7s0nst7 .edgeLabel{background-color:hsl(0, 0%, 34.4117647059%);text-align:center;}#mo4fcgdxapgx7s0nst7 .edgeLabel p{background-color:hsl(0, 0%, 34.4117647059%);}#mo4fcgdxapgx7s0nst7 .edgeLabel rect{opacity:0.5;background-color:hsl(0, 0%, 34.4117647059%);fill:hsl(0, 0%, 34.4117647059%);}#mo4fcgdxapgx7s0nst7 .labelBkg{background-color:rgba(87.75, 87.75, 87.75, 0.5);}#mo4fcgdxapgx7s0nst7 .cluster rect{fill:hsl(180, 1.5873015873%, 28.3529411765%);stroke:rgba(255, 255, 255, 0.25);stroke-width:1px;}#mo4fcgdxapgx7s0nst7 .cluster text{fill:#F9FFFE;}#mo4fcgdxapgx7s0nst7 .cluster span{color:#F9FFFE;}#mo4fcgdxapgx7s0nst7 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(20, 1.5873015873%, 12.3529411765%);border:1px solid rgba(255, 255, 255, 0.25);border-radius:2px;pointer-events:none;z-index:100;}#mo4fcgdxapgx7s0nst7 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#ccc;}#mo4fcgdxapgx7s0nst7 rect.text{fill:none;stroke-width:0;}#mo4fcgdxapgx7s0nst7 .icon-shape,#mo4fcgdxapgx7s0nst7 .image-shape{background-color:hsl(0, 0%, 34.4117647059%);text-align:center;}#mo4fcgdxapgx7s0nst7 .icon-shape p,#mo4fcgdxapgx7s0nst7 .image-shape p{background-color:hsl(0, 0%, 34.4117647059%);padding:2px;}#mo4fcgdxapgx7s0nst7 .icon-shape rect,#mo4fcgdxapgx7s0nst7 .image-shape rect{opacity:0.5;background-color:hsl(0, 0%, 34.4117647059%);fill:hsl(0, 0%, 34.4117647059%);}#mo4fcgdxapgx7s0nst7 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mo4fcgdxapgx7s0nst7 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mo4fcgdxapgx7s0nst7 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}扩展工具TemplateUtils模板引擎Apache Velocity 2.4.1PagingUtils分页计算UrlUtilsURL处理DistanceUtils距离计算Haversine公式RandomUtils随机数生成HtmlUtilsHTML处理ExecTimeUtils执行时间统计ClassScanner类扫描器CheckUtils参数校验ArithmeticUtils数学运算3.6 敏感词过滤设计 #mo4fcgdx8df49n79l2p{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#ccc;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mo4fcgdx8df49n79l2p .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mo4fcgdx8df49n79l2p .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mo4fcgdx8df49n79l2p .error-icon{fill:#a44141;}#mo4fcgdx8df49n79l2p .error-text{fill:#ddd;stroke:#ddd;}#mo4fcgdx8df49n79l2p .edge-thickness-normal{stroke-width:1px;}#mo4fcgdx8df49n79l2p .edge-thickness-thick{stroke-width:3.5px;}#mo4fcgdx8df49n79l2p .edge-pattern-solid{stroke-dasharray:0;}#mo4fcgdx8df49n79l2p .edge-thickness-invisible{stroke-width:0;fill:none;}#mo4fcgdx8df49n79l2p .edge-pattern-dashed{stroke-dasharray:3;}#mo4fcgdx8df49n79l2p .edge-pattern-dotted{stroke-dasharray:2;}#mo4fcgdx8df49n79l2p .marker{fill:lightgrey;stroke:lightgrey;}#mo4fcgdx8df49n79l2p .marker.cross{stroke:lightgrey;}#mo4fcgdx8df49n79l2p svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mo4fcgdx8df49n79l2p p{margin:0;}#mo4fcgdx8df49n79l2p .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#ccc;}#mo4fcgdx8df49n79l2p .cluster-label text{fill:#F9FFFE;}#mo4fcgdx8df49n79l2p .cluster-label span{color:#F9FFFE;}#mo4fcgdx8df49n79l2p .cluster-label span p{background-color:transparent;}#mo4fcgdx8df49n79l2p .label text,#mo4fcgdx8df49n79l2p span{fill:#ccc;color:#ccc;}#mo4fcgdx8df49n79l2p .node rect,#mo4fcgdx8df49n79l2p .node circle,#mo4fcgdx8df49n79l2p .node ellipse,#mo4fcgdx8df49n79l2p .node polygon,#mo4fcgdx8df49n79l2p .node path{fill:#1f2020;stroke:#ccc;stroke-width:1px;}#mo4fcgdx8df49n79l2p .rough-node .label text,#mo4fcgdx8df49n79l2p .node .label text,#mo4fcgdx8df49n79l2p .image-shape .label,#mo4fcgdx8df49n79l2p .icon-shape .label{text-anchor:middle;}#mo4fcgdx8df49n79l2p .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mo4fcgdx8df49n79l2p .rough-node .label,#mo4fcgdx8df49n79l2p .node .label,#mo4fcgdx8df49n79l2p .image-shape .label,#mo4fcgdx8df49n79l2p .icon-shape .label{text-align:center;}#mo4fcgdx8df49n79l2p .node.clickable{cursor:pointer;}#mo4fcgdx8df49n79l2p .root .anchor path{fill:lightgrey!important;stroke-width:0;stroke:lightgrey;}#mo4fcgdx8df49n79l2p .arrowheadPath{fill:lightgrey;}#mo4fcgdx8df49n79l2p .edgePath .path{stroke:lightgrey;stroke-width:2.0px;}#mo4fcgdx8df49n79l2p .flowchart-link{stroke:lightgrey;fill:none;}#mo4fcgdx8df49n79l2p .edgeLabel{background-color:hsl(0, 0%, 34.4117647059%);text-align:center;}#mo4fcgdx8df49n79l2p .edgeLabel p{background-color:hsl(0, 0%, 34.4117647059%);}#mo4fcgdx8df49n79l2p .edgeLabel rect{opacity:0.5;background-color:hsl(0, 0%, 34.4117647059%);fill:hsl(0, 0%, 34.4117647059%);}#mo4fcgdx8df49n79l2p .labelBkg{background-color:rgba(87.75, 87.75, 87.75, 0.5);}#mo4fcgdx8df49n79l2p .cluster rect{fill:hsl(180, 1.5873015873%, 28.3529411765%);stroke:rgba(255, 255, 255, 0.25);stroke-width:1px;}#mo4fcgdx8df49n79l2p .cluster text{fill:#F9FFFE;}#mo4fcgdx8df49n79l2p .cluster span{color:#F9FFFE;}#mo4fcgdx8df49n79l2p div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(20, 1.5873015873%, 12.3529411765%);border:1px solid rgba(255, 255, 255, 0.25);border-radius:2px;pointer-events:none;z-index:100;}#mo4fcgdx8df49n79l2p .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#ccc;}#mo4fcgdx8df49n79l2p rect.text{fill:none;stroke-width:0;}#mo4fcgdx8df49n79l2p .icon-shape,#mo4fcgdx8df49n79l2p .image-shape{background-color:hsl(0, 0%, 34.4117647059%);text-align:center;}#mo4fcgdx8df49n79l2p .icon-shape p,#mo4fcgdx8df49n79l2p .image-shape p{background-color:hsl(0, 0%, 34.4117647059%);padding:2px;}#mo4fcgdx8df49n79l2p .icon-shape rect,#mo4fcgdx8df49n79l2p .image-shape rect{opacity:0.5;background-color:hsl(0, 0%, 34.4117647059%);fill:hsl(0, 0%, 34.4117647059%);}#mo4fcgdx8df49n79l2p .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mo4fcgdx8df49n79l2p .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mo4fcgdx8df49n79l2p :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}命中未命中文本结束添加敏感词构建前缀树Trie/DFA输入文本逐字符匹配记录匹配词继续下一字符返回结果Result has=true, words返回结果Result has=false, words敏感词管理add 添加remove 删除clear 清空3.7 XSS防护设计 #mo4fcgdxjowopi90ij{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#ccc;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mo4fcgdxjowopi90ij .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mo4fcgdxjowopi90ij .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mo4fcgdxjowopi90ij .error-icon{fill:#a44141;}#mo4fcgdxjowopi90ij .error-text{fill:#ddd;stroke:#ddd;}#mo4fcgdxjowopi90ij .edge-thickness-normal{stroke-width:1px;}#mo4fcgdxjowopi90ij .edge-thickness-thick{stroke-width:3.5px;}#mo4fcgdxjowopi90ij .edge-pattern-solid{stroke-dasharray:0;}#mo4fcgdxjowopi90ij .edge-thickness-invisible{stroke-width:0;fill:none;}#mo4fcgdxjowopi90ij .edge-pattern-dashed{stroke-dasharray:3;}#mo4fcgdxjowopi90ij .edge-pattern-dotted{stroke-dasharray:2;}#mo4fcgdxjowopi90ij .marker{fill:lightgrey;stroke:lightgrey;}#mo4fcgdxjowopi90ij .marker.cross{stroke:lightgrey;}#mo4fcgdxjowopi90ij svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mo4fcgdxjowopi90ij p{margin:0;}#mo4fcgdxjowopi90ij .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#ccc;}#mo4fcgdxjowopi90ij .cluster-label text{fill:#F9FFFE;}#mo4fcgdxjowopi90ij .cluster-label span{color:#F9FFFE;}#mo4fcgdxjowopi90ij .cluster-label span p{background-color:transparent;}#mo4fcgdxjowopi90ij .label text,#mo4fcgdxjowopi90ij span{fill:#ccc;color:#ccc;}#mo4fcgdxjowopi90ij .node rect,#mo4fcgdxjowopi90ij .node circle,#mo4fcgdxjowopi90ij .node ellipse,#mo4fcgdxjowopi90ij .node polygon,#mo4fcgdxjowopi90ij .node path{fill:#1f2020;stroke:#ccc;stroke-width:1px;}#mo4fcgdxjowopi90ij .rough-node .label text,#mo4fcgdxjowopi90ij .node .label text,#mo4fcgdxjowopi90ij .image-shape .label,#mo4fcgdxjowopi90ij .icon-shape .label{text-anchor:middle;}#mo4fcgdxjowopi90ij .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mo4fcgdxjowopi90ij .rough-node .label,#mo4fcgdxjowopi90ij .node .label,#mo4fcgdxjowopi90ij .image-shape .label,#mo4fcgdxjowopi90ij .icon-shape .label{text-align:center;}#mo4fcgdxjowopi90ij .node.clickable{cursor:pointer;}#mo4fcgdxjowopi90ij .root .anchor path{fill:lightgrey!important;stroke-width:0;stroke:lightgrey;}#mo4fcgdxjowopi90ij .arrowheadPath{fill:lightgrey;}#mo4fcgdxjowopi90ij .edgePath .path{stroke:lightgrey;stroke-width:2.0px;}#mo4fcgdxjowopi90ij .flowchart-link{stroke:lightgrey;fill:none;}#mo4fcgdxjowopi90ij .edgeLabel{background-color:hsl(0, 0%, 34.4117647059%);text-align:center;}#mo4fcgdxjowopi90ij .edgeLabel p{background-color:hsl(0, 0%, 34.4117647059%);}#mo4fcgdxjowopi90ij .edgeLabel rect{opacity:0.5;background-color:hsl(0, 0%, 34.4117647059%);fill:hsl(0, 0%, 34.4117647059%);}#mo4fcgdxjowopi90ij .labelBkg{background-color:rgba(87.75, 87.75, 87.75, 0.5);}#mo4fcgdxjowopi90ij .cluster rect{fill:hsl(180, 1.5873015873%, 28.3529411765%);stroke:rgba(255, 255, 255, 0.25);stroke-width:1px;}#mo4fcgdxjowopi90ij .cluster text{fill:#F9FFFE;}#mo4fcgdxjowopi90ij .cluster span{color:#F9FFFE;}#mo4fcgdxjowopi90ij div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(20, 1.5873015873%, 12.3529411765%);border:1px solid rgba(255, 255, 255, 0.25);border-radius:2px;pointer-events:none;z-index:100;}#mo4fcgdxjowopi90ij .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#ccc;}#mo4fcgdxjowopi90ij rect.text{fill:none;stroke-width:0;}#mo4fcgdxjowopi90ij .icon-shape,#mo4fcgdxjowopi90ij .image-shape{background-color:hsl(0, 0%, 34.4117647059%);text-align:center;}#mo4fcgdxjowopi90ij .icon-shape p,#mo4fcgdxjowopi90ij .image-shape p{background-color:hsl(0, 0%, 34.4117647059%);padding:2px;}#mo4fcgdxjowopi90ij .icon-shape rect,#mo4fcgdxjowopi90ij .image-shape rect{opacity:0.5;background-color:hsl(0, 0%, 34.4117647059%);fill:hsl(0, 0%, 34.4117647059%);}#mo4fcgdxjowopi90ij .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mo4fcgdxjowopi90ij .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mo4fcgdxjowopi90ij :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}排除URL需要过滤HTTP请求XssFilter直接放行XssWrapper包装Request获取参数时自动转义HTML安全的请求参数Controller处理3.8 文档处理设计 #mo4fcgdxt93z27xgxlc{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#ccc;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mo4fcgdxt93z27xgxlc .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mo4fcgdxt93z27xgxlc .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mo4fcgdxt93z27xgxlc .error-icon{fill:#a44141;}#mo4fcgdxt93z27xgxlc .error-text{fill:#ddd;stroke:#ddd;}#mo4fcgdxt93z27xgxlc .edge-thickness-normal{stroke-width:1px;}#mo4fcgdxt93z27xgxlc .edge-thickness-thick{stroke-width:3.5px;}#mo4fcgdxt93z27xgxlc .edge-pattern-solid{stroke-dasharray:0;}#mo4fcgdxt93z27xgxlc .edge-thickness-invisible{stroke-width:0;fill:none;}#mo4fcgdxt93z27xgxlc .edge-pattern-dashed{stroke-dasharray:3;}#mo4fcgdxt93z27xgxlc .edge-pattern-dotted{stroke-dasharray:2;}#mo4fcgdxt93z27xgxlc .marker{fill:lightgrey;stroke:lightgrey;}#mo4fcgdxt93z27xgxlc .marker.cross{stroke:lightgrey;}#mo4fcgdxt93z27xgxlc svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mo4fcgdxt93z27xgxlc p{margin:0;}#mo4fcgdxt93z27xgxlc .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#ccc;}#mo4fcgdxt93z27xgxlc .cluster-label text{fill:#F9FFFE;}#mo4fcgdxt93z27xgxlc .cluster-label span{color:#F9FFFE;}#mo4fcgdxt93z27xgxlc .cluster-label span p{background-color:transparent;}#mo4fcgdxt93z27xgxlc .label text,#mo4fcgdxt93z27xgxlc span{fill:#ccc;color:#ccc;}#mo4fcgdxt93z27xgxlc .node rect,#mo4fcgdxt93z27xgxlc .node circle,#mo4fcgdxt93z27xgxlc .node ellipse,#mo4fcgdxt93z27xgxlc .node polygon,#mo4fcgdxt93z27xgxlc .node path{fill:#1f2020;stroke:#ccc;stroke-width:1px;}#mo4fcgdxt93z27xgxlc .rough-node .label text,#mo4fcgdxt93z27xgxlc .node .label text,#mo4fcgdxt93z27xgxlc .image-shape .label,#mo4fcgdxt93z27xgxlc .icon-shape .label{text-anchor:middle;}#mo4fcgdxt93z27xgxlc .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mo4fcgdxt93z27xgxlc .rough-node .label,#mo4fcgdxt93z27xgxlc .node .label,#mo4fcgdxt93z27xgxlc .image-shape .label,#mo4fcgdxt93z27xgxlc .icon-shape .label{text-align:center;}#mo4fcgdxt93z27xgxlc .node.clickable{cursor:pointer;}#mo4fcgdxt93z27xgxlc .root .anchor path{fill:lightgrey!important;stroke-width:0;stroke:lightgrey;}#mo4fcgdxt93z27xgxlc .arrowheadPath{fill:lightgrey;}#mo4fcgdxt93z27xgxlc .edgePath .path{stroke:lightgrey;stroke-width:2.0px;}#mo4fcgdxt93z27xgxlc .flowchart-link{stroke:lightgrey;fill:none;}#mo4fcgdxt93z27xgxlc .edgeLabel{background-color:hsl(0, 0%, 34.4117647059%);text-align:center;}#mo4fcgdxt93z27xgxlc .edgeLabel p{background-color:hsl(0, 0%, 34.4117647059%);}#mo4fcgdxt93z27xgxlc .edgeLabel rect{opacity:0.5;background-color:hsl(0, 0%, 34.4117647059%);fill:hsl(0, 0%, 34.4117647059%);}#mo4fcgdxt93z27xgxlc .labelBkg{background-color:rgba(87.75, 87.75, 87.75, 0.5);}#mo4fcgdxt93z27xgxlc .cluster rect{fill:hsl(180, 1.5873015873%, 28.3529411765%);stroke:rgba(255, 255, 255, 0.25);stroke-width:1px;}#mo4fcgdxt93z27xgxlc .cluster text{fill:#F9FFFE;}#mo4fcgdxt93z27xgxlc .cluster span{color:#F9FFFE;}#mo4fcgdxt93z27xgxlc div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(20, 1.5873015873%, 12.3529411765%);border:1px solid rgba(255, 255, 255, 0.25);border-radius:2px;pointer-events:none;z-index:100;}#mo4fcgdxt93z27xgxlc .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#ccc;}#mo4fcgdxt93z27xgxlc rect.text{fill:none;stroke-width:0;}#mo4fcgdxt93z27xgxlc .icon-shape,#mo4fcgdxt93z27xgxlc .image-shape{background-color:hsl(0, 0%, 34.4117647059%);text-align:center;}#mo4fcgdxt93z27xgxlc .icon-shape p,#mo4fcgdxt93z27xgxlc .image-shape p{background-color:hsl(0, 0%, 34.4117647059%);padding:2px;}#mo4fcgdxt93z27xgxlc .icon-shape rect,#mo4fcgdxt93z27xgxlc .image-shape rect{opacity:0.5;background-color:hsl(0, 0%, 34.4117647059%);fill:hsl(0, 0%, 34.4117647059%);}#mo4fcgdxt93z27xgxlc .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mo4fcgdxt93z27xgxlc .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mo4fcgdxt93z27xgxlc :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}文档处理PDFBox 3.0.7Fesod Sheet 2.0.1PdfUtilsPDF转图片144 DPIExcelUtilsExcel读写WordUtilsWord文档处理PptUtilsPPT文档处理3.9 API集成设计 #mo4fcgdxamoukzw5mk{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#ccc;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mo4fcgdxamoukzw5mk .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mo4fcgdxamoukzw5mk .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mo4fcgdxamoukzw5mk .error-icon{fill:#a44141;}#mo4fcgdxamoukzw5mk .error-text{fill:#ddd;stroke:#ddd;}#mo4fcgdxamoukzw5mk .edge-thickness-normal{stroke-width:1px;}#mo4fcgdxamoukzw5mk .edge-thickness-thick{stroke-width:3.5px;}#mo4fcgdxamoukzw5mk .edge-pattern-solid{stroke-dasharray:0;}#mo4fcgdxamoukzw5mk .edge-thickness-invisible{stroke-width:0;fill:none;}#mo4fcgdxamoukzw5mk .edge-pattern-dashed{stroke-dasharray:3;}#mo4fcgdxamoukzw5mk .edge-pattern-dotted{stroke-dasharray:2;}#mo4fcgdxamoukzw5mk .marker{fill:lightgrey;stroke:lightgrey;}#mo4fcgdxamoukzw5mk .marker.cross{stroke:lightgrey;}#mo4fcgdxamoukzw5mk svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mo4fcgdxamoukzw5mk p{margin:0;}#mo4fcgdxamoukzw5mk .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#ccc;}#mo4fcgdxamoukzw5mk .cluster-label text{fill:#F9FFFE;}#mo4fcgdxamoukzw5mk .cluster-label span{color:#F9FFFE;}#mo4fcgdxamoukzw5mk .cluster-label span p{background-color:transparent;}#mo4fcgdxamoukzw5mk .label text,#mo4fcgdxamoukzw5mk span{fill:#ccc;color:#ccc;}#mo4fcgdxamoukzw5mk .node rect,#mo4fcgdxamoukzw5mk .node circle,#mo4fcgdxamoukzw5mk .node ellipse,#mo4fcgdxamoukzw5mk .node polygon,#mo4fcgdxamoukzw5mk .node path{fill:#1f2020;stroke:#ccc;stroke-width:1px;}#mo4fcgdxamoukzw5mk .rough-node .label text,#mo4fcgdxamoukzw5mk .node .label text,#mo4fcgdxamoukzw5mk .image-shape .label,#mo4fcgdxamoukzw5mk .icon-shape .label{text-anchor:middle;}#mo4fcgdxamoukzw5mk .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mo4fcgdxamoukzw5mk .rough-node .label,#mo4fcgdxamoukzw5mk .node .label,#mo4fcgdxamoukzw5mk .image-shape .label,#mo4fcgdxamoukzw5mk .icon-shape .label{text-align:center;}#mo4fcgdxamoukzw5mk .node.clickable{cursor:pointer;}#mo4fcgdxamoukzw5mk .root .anchor path{fill:lightgrey!important;stroke-width:0;stroke:lightgrey;}#mo4fcgdxamoukzw5mk .arrowheadPath{fill:lightgrey;}#mo4fcgdxamoukzw5mk .edgePath .path{stroke:lightgrey;stroke-width:2.0px;}#mo4fcgdxamoukzw5mk .flowchart-link{stroke:lightgrey;fill:none;}#mo4fcgdxamoukzw5mk .edgeLabel{background-color:hsl(0, 0%, 34.4117647059%);text-align:center;}#mo4fcgdxamoukzw5mk .edgeLabel p{background-color:hsl(0, 0%, 34.4117647059%);}#mo4fcgdxamoukzw5mk .edgeLabel rect{opacity:0.5;background-color:hsl(0, 0%, 34.4117647059%);fill:hsl(0, 0%, 34.4117647059%);}#mo4fcgdxamoukzw5mk .labelBkg{background-color:rgba(87.75, 87.75, 87.75, 0.5);}#mo4fcgdxamoukzw5mk .cluster rect{fill:hsl(180, 1.5873015873%, 28.3529411765%);stroke:rgba(255, 255, 255, 0.25);stroke-width:1px;}#mo4fcgdxamoukzw5mk .cluster text{fill:#F9FFFE;}#mo4fcgdxamoukzw5mk .cluster span{color:#F9FFFE;}#mo4fcgdxamoukzw5mk div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(20, 1.5873015873%, 12.3529411765%);border:1px solid rgba(255, 255, 255, 0.25);border-radius:2px;pointer-events:none;z-index:100;}#mo4fcgdxamoukzw5mk .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#ccc;}#mo4fcgdxamoukzw5mk rect.text{fill:none;stroke-width:0;}#mo4fcgdxamoukzw5mk .icon-shape,#mo4fcgdxamoukzw5mk .image-shape{background-color:hsl(0, 0%, 34.4117647059%);text-align:center;}#mo4fcgdxamoukzw5mk .icon-shape p,#mo4fcgdxamoukzw5mk .image-shape p{background-color:hsl(0, 0%, 34.4117647059%);padding:2px;}#mo4fcgdxamoukzw5mk .icon-shape rect,#mo4fcgdxamoukzw5mk .image-shape rect{opacity:0.5;background-color:hsl(0, 0%, 34.4117647059%);fill:hsl(0, 0%, 34.4117647059%);}#mo4fcgdxamoukzw5mk .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mo4fcgdxamoukzw5mk .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mo4fcgdxamoukzw5mk :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}应用调用xtools-apiAliEmailUtils阿里云邮件LocationUtils百度定位WeatherUtils百度天气签名认证HTTP请求邮件发送结果JSONObject百度地图APILocationDto定位信息LatAndLngDto经纬度百度天气API天气数据JSONObject3.10 测试体系设计 #mo4fcgdx6yiwjm720bs{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#ccc;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mo4fcgdx6yiwjm720bs .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mo4fcgdx6yiwjm720bs .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mo4fcgdx6yiwjm720bs .error-icon{fill:#a44141;}#mo4fcgdx6yiwjm720bs .error-text{fill:#ddd;stroke:#ddd;}#mo4fcgdx6yiwjm720bs .edge-thickness-normal{stroke-width:1px;}#mo4fcgdx6yiwjm720bs .edge-thickness-thick{stroke-width:3.5px;}#mo4fcgdx6yiwjm720bs .edge-pattern-solid{stroke-dasharray:0;}#mo4fcgdx6yiwjm720bs .edge-thickness-invisible{stroke-width:0;fill:none;}#mo4fcgdx6yiwjm720bs .edge-pattern-dashed{stroke-dasharray:3;}#mo4fcgdx6yiwjm720bs .edge-pattern-dotted{stroke-dasharray:2;}#mo4fcgdx6yiwjm720bs .marker{fill:lightgrey;stroke:lightgrey;}#mo4fcgdx6yiwjm720bs .marker.cross{stroke:lightgrey;}#mo4fcgdx6yiwjm720bs svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mo4fcgdx6yiwjm720bs p{margin:0;}#mo4fcgdx6yiwjm720bs .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#ccc;}#mo4fcgdx6yiwjm720bs .cluster-label text{fill:#F9FFFE;}#mo4fcgdx6yiwjm720bs .cluster-label span{color:#F9FFFE;}#mo4fcgdx6yiwjm720bs .cluster-label span p{background-color:transparent;}#mo4fcgdx6yiwjm720bs .label text,#mo4fcgdx6yiwjm720bs span{fill:#ccc;color:#ccc;}#mo4fcgdx6yiwjm720bs .node rect,#mo4fcgdx6yiwjm720bs .node circle,#mo4fcgdx6yiwjm720bs .node ellipse,#mo4fcgdx6yiwjm720bs .node polygon,#mo4fcgdx6yiwjm720bs .node path{fill:#1f2020;stroke:#ccc;stroke-width:1px;}#mo4fcgdx6yiwjm720bs .rough-node .label text,#mo4fcgdx6yiwjm720bs .node .label text,#mo4fcgdx6yiwjm720bs .image-shape .label,#mo4fcgdx6yiwjm720bs .icon-shape .label{text-anchor:middle;}#mo4fcgdx6yiwjm720bs .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mo4fcgdx6yiwjm720bs .rough-node .label,#mo4fcgdx6yiwjm720bs .node .label,#mo4fcgdx6yiwjm720bs .image-shape .label,#mo4fcgdx6yiwjm720bs .icon-shape .label{text-align:center;}#mo4fcgdx6yiwjm720bs .node.clickable{cursor:pointer;}#mo4fcgdx6yiwjm720bs .root .anchor path{fill:lightgrey!important;stroke-width:0;stroke:lightgrey;}#mo4fcgdx6yiwjm720bs .arrowheadPath{fill:lightgrey;}#mo4fcgdx6yiwjm720bs .edgePath .path{stroke:lightgrey;stroke-width:2.0px;}#mo4fcgdx6yiwjm720bs .flowchart-link{stroke:lightgrey;fill:none;}#mo4fcgdx6yiwjm720bs .edgeLabel{background-color:hsl(0, 0%, 34.4117647059%);text-align:center;}#mo4fcgdx6yiwjm720bs .edgeLabel p{background-color:hsl(0, 0%, 34.4117647059%);}#mo4fcgdx6yiwjm720bs .edgeLabel rect{opacity:0.5;background-color:hsl(0, 0%, 34.4117647059%);fill:hsl(0, 0%, 34.4117647059%);}#mo4fcgdx6yiwjm720bs .labelBkg{background-color:rgba(87.75, 87.75, 87.75, 0.5);}#mo4fcgdx6yiwjm720bs .cluster rect{fill:hsl(180, 1.5873015873%, 28.3529411765%);stroke:rgba(255, 255, 255, 0.25);stroke-width:1px;}#mo4fcgdx6yiwjm720bs .cluster text{fill:#F9FFFE;}#mo4fcgdx6yiwjm720bs .cluster span{color:#F9FFFE;}#mo4fcgdx6yiwjm720bs div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(20, 1.5873015873%, 12.3529411765%);border:1px solid rgba(255, 255, 255, 0.25);border-radius:2px;pointer-events:none;z-index:100;}#mo4fcgdx6yiwjm720bs .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#ccc;}#mo4fcgdx6yiwjm720bs rect.text{fill:none;stroke-width:0;}#mo4fcgdx6yiwjm720bs .icon-shape,#mo4fcgdx6yiwjm720bs .image-shape{background-color:hsl(0, 0%, 34.4117647059%);text-align:center;}#mo4fcgdx6yiwjm720bs .icon-shape p,#mo4fcgdx6yiwjm720bs .image-shape p{background-color:hsl(0, 0%, 34.4117647059%);padding:2px;}#mo4fcgdx6yiwjm720bs .icon-shape rect,#mo4fcgdx6yiwjm720bs .image-shape rect{opacity:0.5;background-color:hsl(0, 0%, 34.4117647059%);fill:hsl(0, 0%, 34.4117647059%);}#mo4fcgdx6yiwjm720bs .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mo4fcgdx6yiwjm720bs .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mo4fcgdx6yiwjm720bs :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}继承BaseTest抽象测试基类Test runTest打印测试标题title方法记录开始时间调用 doTest模板方法记录结束时间输出耗时测试完成具体测试类实现 doTest编写测试逻辑四、编码规范设计 4.1 命名规范 4.1.1 类命名 类型 命名规则 示例 工具类 XxxUtils DateUtils、Sm2Utils、JsonUtils 数据传输对象 XxxDto FileInfo、RsaDto、LocationDto 错误枚举 XxxError CoreError、ApiError、WebError 通用枚举 XxxEnum RegexEnum、TimePattern、OsEnum 异常类 XxxException CommonException 接口 BaseXxx / Xxx BaseError、BaseParams、BaseErrorModule 过滤器 XxxFilter XssFilter 包装器 XxxWrapper XssWrapper 配置类 XxxConfig TestApiConfig 测试基类 BaseTest BaseTest 4.1.2 方法命名 操作 命名规则 示例 获取值 getXxx / xxx getLocalIp()、pattern() 判断 isXxx / hasXxx isEmpty()、isJson() 转换 toXxx / fromXxx toStr()、from(long) 生成 newXxx / getXxx newQrCode()、getKey() 加密 encrypt / decrypt encrypt(publicKey, data) 替换 replace / format replace(template, values) 执行 run / execute run()、send(...) 校验 check / isValid check(text)、isValid(input) 4.1.3 常量命名 类型 命名规则 示例 基础常量 CP_ 前缀 CP_EMPTY、CP_LINE、CP_NUM0 算法常量 UPPER_SNAKE ALGORITHM_NAME URL常量 UPPER_SNAKE ALIYUN_URL 枚举字段 final 字段 pattern、regex、code 4.2 注释规范 4.2.1 类注释格式 java 复制代码 /** * <p>Title : 类名称</p> * <p>Description : 类描述</p> * <p>DevelopTools : Idea_x64_v2026.1</p> * <p>DevelopSystem : macOS Sequoia 15.7.5</p> * <p>Company : org.xujun</p> * * @author : XuJun * @version : 5.0.0 * @date : 2026/04/16 10:00 */ 4.2.2 方法注释格式 java 复制代码 /** * 方法描述(中文) * * @param param 参数说明 * @return 返回值说明 */ 4.3 代码风格 4.3.1 设计模式 设计模式 应用场景 示例 静态工具类 所有Utils类 DateUtils、Sm2Utils、JsonUtils 静态工厂方法 异常创建 CommonException.create(CoreError.ENCRYPT, cause) 模板方法 测试基类 BaseTest.runTest() 调用 doTest() Fluent Builder 命令行执行 CmdUtils.init(cmd).setRunDir(dir).run() 工厂方法 线程创建 ToolThreadFactory 实现 ThreadFactory 接口契约 错误体系 BaseError、BaseErrorModule 接口 4.3.2 异常处理规范 所有checked exception通过CommonException.create()包装为unchecked exception 异常消息格式:[module:type-code]formatted message 使用{}作为消息模板占位符 4.3.3 序列化规范 大多数工具类实现Serializable接口 使用@Serial注解标注serialVersionUID 4.3.4 代码结构 4空格缩进 左大括号同行 方法间空行分隔 使用implements声明接口实现 4.4 设计规范 4.4.1 分层原则 xtools-test:零外部依赖,仅依赖JUnit xtools-base:基础定义层,不依赖任何业务逻辑 xtools-core:核心工具层,依赖base xtools-extend:扩展工具层,依赖core xtools-web:Web专用工具,依赖core xtools-api:API集成层,依赖core 4.4.2 单一职责 每个Utils类只负责一个功能领域 加密工具按算法类型分离(Base64、MD5、SHA1、SM2、SM3、SM4) 时间工具按Java时间API类型分离 4.4.3 开闭原则 BaseEncryptUtils提供protected基础方法,子类可扩展 BaseError接口定义错误契约,各模块独立实现错误枚举 ClassScanner支持Predicate<Class<?>>灵活过滤 五、项目依赖设计 5.1 基础依赖 依赖 版本 用途 使用模块 JUnit Jupiter 6.0.3 单元测试框架 xtools-test Lombok 1.18.44 代码简化(注解处理) 全模块 FastJSON2 2.0.60 JSON序列化/反序列化 xtools-extend, xtools-web, xtools-api 5.2 Apache Commons依赖 依赖 版本 用途 使用模块 Commons IO 2.21.0 IO操作工具 xtools-core Commons Lang3 3.20.0 通用工具方法 xtools-web Commons Text 1.15.0 文本处理 xtools-web 5.3 加密与安全依赖 依赖 版本 用途 使用模块 BouncyCastle (bcprov-jdk18on) 1.84 加密库,支持国密算法 xtools-extend java-jwt 4.5.1 JWT令牌生成与验证 xtools-extend 5.4 系统与网络依赖 依赖 版本 用途 使用模块 OSHI (oshi-core) 6.11.1 系统信息采集 xtools-extend ip2region 3.3.7 离线IP地址定位 xtools-extend UserAgentUtils 1.21 浏览器User-Agent解析 xtools-extend AWS S3 SDK 2.42.34 对象存储客户端 xtools-extend 5.5 文档处理依赖 依赖 版本 用途 使用模块 Apache PDFBox 3.0.7 PDF文档处理 xtools-extend Apache Fesod Sheet 2.0.1-incubating Excel文件处理 xtools-extend 5.6 媒体与编码依赖 依赖 版本 用途 使用模块 Google ZXing (javase) 3.5.4 二维码/条形码生成与解析 xtools-extend Thumbnailator 0.4.21 图片压缩 xtools-extend mmseg4j-core 1.10.0 中文分词 xtools-extend Pinyin4j 2.5.1 汉字转拼音 xtools-extend 5.7 工具库依赖 依赖 版本 用途 使用模块 MapStruct 1.6.3 对象映射 全模块 Apache Velocity 2.4.1 模板引擎 全模块 Jsoup 1.22.1 HTML解析和爬虫 xtools-api Easy Captcha 1.6.2 验证码生成 xtools-api Caffeine 3.2.3 本地高性能缓存 全模块 5.8 Web依赖 依赖 版本 用途 使用模块 Jakarta Servlet API 6.1.0 Servlet规范API xtools-web 5.9 Maven构建插件 插件 版本 用途 Maven Compiler Plugin 3.15.0 Java源码编译 Maven Source Plugin 3.4.0 源码JAR打包 JaCoCo Maven Plugin 0.8.14 单元测试覆盖率报告 5.10 xtools内部模块依赖 模块 版本 描述 xtools 5.0.0 父模块,聚合子模块 xtools-parent 5.0.0 父POM,统一依赖管理 xtools-test 5.0.0 测试基础设施模块 xtools-base 5.0.0 基础定义模块 xtools-core 5.0.0 核心工具模块 xtools-extend 5.0.0 扩展工具模块 xtools-web 5.0.0 Web工具模块 xtools-api 5.0.0 API集成模块 六、技术选型说明 6.1 JDK 25 选择原因:使用最新JDK版本,充分利用现代Java特性 主要特性: Record类型(用于SensitiveWordUtils.Result等数据载体) 文本块(Text Blocks)简化多行字符串 模式匹配(Pattern Matching)增强类型判断 密封类(Sealed Classes)增强类型安全 虚拟线程(Virtual Threads)提升并发性能 改进的垃圾回收器(ZGC/Shenandoah) 6.2 JUnit Jupiter 6.0.3 选择原因:业界标准的Java单元测试框架 主要特性: 支持@Test、@DisplayName等注解 支持参数化测试、嵌套测试 强大的断言和假设机制 与BaseTest模板方法模式结合,统一测试输出格式 6.3 BouncyCastle 1.84 选择原因:Java平台最全面的加密库,支持国密算法 主要特性: 支持SM2(非对称加密)、SM3(哈希)、SM4(对称加密)等国密算法 提供PKCS填充方案 纯Java实现,无本地依赖 6.4 FastJSON2 2.0.60 选择原因:高性能JSON处理库 主要特性: 高性能序列化/反序列化 支持JSONPath查询 支持JSON模板替换({{key}}占位符) 支持Base64编码的JSON 6.5 Google ZXing 3.5.4 选择原因:业界标准的条码处理库 主要特性: 支持QR二维码生成与解析 支持多种条形码格式 支持logo嵌入二维码 6.6 Apache PDFBox 3.0.7 选择原因:纯Java的PDF处理库 主要特性: PDF转图片(144 DPI) 支持PDF文本提取 无外部依赖 6.7 其他重要依赖版本 依赖 版本 用途 选择原因 Lombok 1.18.44 代码简化 减少样板代码,提高开发效率 MapStruct 1.6.3 对象映射 编译期代码生成,高性能 Apache Velocity 2.4.1 模板引擎 灵活的文本模板替换 Jsoup 1.22.1 HTML解析 jQuery风格的DOM操作API OSHI 6.11.1 系统监控 跨平台系统信息采集 ip2region 3.3.7 IP定位 离线IP地址查询,无需网络请求 Caffeine 3.2.3 本地缓存 高性能本地缓存库 Thumbnailator 0.4.21 图片压缩 简洁的图片处理API mmseg4j-core 1.10.0 中文分词 MMSeg中文分词算法 Pinyin4j 2.5.1 拼音转换 汉字转拼音工具 Easy Captcha 1.6.2 验证码 多种验证码样式 AWS S3 SDK 2.42.34 对象存储 S3协议兼容存储 java-jwt 4.5.1 JWT令牌 JWT生成与验证 UserAgentUtils 1.21 UA解析 浏览器标识解析 Jakarta Servlet API 6.1.0 Servlet规范 Jakarta EE 10+标准 Commons IO 2.21.0 IO工具 文件流处理 Commons Lang3 3.20.0 通用工具 字符串、数组、对象工具 Commons Text 1.15.0 文本处理 字符串转义、相似度计算 Apache Fesod Sheet 2.0.1-incubating Excel处理 Excel文件读写 文档版本:v1.0 编写日期:2026-04-16 项目版本:5.0.0 父POM版本:xtools-parent:5.0.0 JDK版本:25 维护团队:xujun.org

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册