首页 文章 精选 留言 我的

精选列表

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

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

优秀的个人博客,低调大师

xtools-boot一款基于JDK25,SpringBoot4的通用Spring工具库

xtools-boot 项目设计文档 开源地址: https://gitee.com/jun-xtools/xtools-boot.git 一、功能和用途 1.1 项目概述 项目信息 描述 项目名称 xtools-boot 项目版本 5.0.0 父POM xtools-parent-boot:5.0.0 顶级父POM xtools-parent:5.0.0 Spring Boot 4.0.6 JDK版本 25 项目定位 SpringBoot工具模块框架,为业务应用提供开箱即用的基础能力 维护团队 org.xujun 1.2 技术特点 采用最新的 JDK 25 版本,充分利用虚拟线程(Virtual Threads)、ScopedValue等新特性 基于 Spring Boot 4.0.6 构建,支持自动配置和快速开发 使用 MyBatis-Plus 3.5.16 简化数据访问层开发 使用 MyBatis 4.0.1 提供灵活的SQL映射能力 使用 Druid 1.2.28 数据库连接池,内置SQL监控 集成 Elasticsearch 9.2.8 实现日志存储和检索 支持 Knife4j 4.5.0 自动生成 API 文档 集成 Spring AMQP 4.0.3 实现 RabbitMQ 异步消息处理 集成 Spring Data Redis 实现分布式缓存 集成 XXL-JOB 3.4.0 实现分布式任务调度 集成 Spring Boot Admin 4.0.4 实现应用监控 使用 Jackson 3.1.2 进行 JSON 序列化/反序列化 使用 FastJSON2 2.0.60 处理JSON数据 使用 Lombok 1.18.46 简化Java代码 使用 MapStruct 1.6.3 进行对象映射转换 支持 S3 2.42.41 对象存储 使用 ip2region 3.3.7 实现IP地址定位 1.3 核心功能 #mq6cnds9fgbtdm061ep{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;}}#mq6cnds9fgbtdm061ep .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mq6cnds9fgbtdm061ep .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mq6cnds9fgbtdm061ep .error-icon{fill:#a44141;}#mq6cnds9fgbtdm061ep .error-text{fill:#ddd;stroke:#ddd;}#mq6cnds9fgbtdm061ep .edge-thickness-normal{stroke-width:1px;}#mq6cnds9fgbtdm061ep .edge-thickness-thick{stroke-width:3.5px;}#mq6cnds9fgbtdm061ep .edge-pattern-solid{stroke-dasharray:0;}#mq6cnds9fgbtdm061ep .edge-thickness-invisible{stroke-width:0;fill:none;}#mq6cnds9fgbtdm061ep .edge-pattern-dashed{stroke-dasharray:3;}#mq6cnds9fgbtdm061ep .edge-pattern-dotted{stroke-dasharray:2;}#mq6cnds9fgbtdm061ep .marker{fill:lightgrey;stroke:lightgrey;}#mq6cnds9fgbtdm061ep .marker.cross{stroke:lightgrey;}#mq6cnds9fgbtdm061ep svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mq6cnds9fgbtdm061ep p{margin:0;}#mq6cnds9fgbtdm061ep .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#ccc;}#mq6cnds9fgbtdm061ep .cluster-label text{fill:#F9FFFE;}#mq6cnds9fgbtdm061ep .cluster-label span{color:#F9FFFE;}#mq6cnds9fgbtdm061ep .cluster-label span p{background-color:transparent;}#mq6cnds9fgbtdm061ep .label text,#mq6cnds9fgbtdm061ep span{fill:#ccc;color:#ccc;}#mq6cnds9fgbtdm061ep .node rect,#mq6cnds9fgbtdm061ep .node circle,#mq6cnds9fgbtdm061ep .node ellipse,#mq6cnds9fgbtdm061ep .node polygon,#mq6cnds9fgbtdm061ep .node path{fill:#1f2020;stroke:#ccc;stroke-width:1px;}#mq6cnds9fgbtdm061ep .rough-node .label text,#mq6cnds9fgbtdm061ep .node .label text,#mq6cnds9fgbtdm061ep .image-shape .label,#mq6cnds9fgbtdm061ep .icon-shape .label{text-anchor:middle;}#mq6cnds9fgbtdm061ep .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mq6cnds9fgbtdm061ep .rough-node .label,#mq6cnds9fgbtdm061ep .node .label,#mq6cnds9fgbtdm061ep .image-shape .label,#mq6cnds9fgbtdm061ep .icon-shape .label{text-align:center;}#mq6cnds9fgbtdm061ep .node.clickable{cursor:pointer;}#mq6cnds9fgbtdm061ep .root .anchor path{fill:lightgrey!important;stroke-width:0;stroke:lightgrey;}#mq6cnds9fgbtdm061ep .arrowheadPath{fill:lightgrey;}#mq6cnds9fgbtdm061ep .edgePath .path{stroke:lightgrey;stroke-width:2.0px;}#mq6cnds9fgbtdm061ep .flowchart-link{stroke:lightgrey;fill:none;}#mq6cnds9fgbtdm061ep .edgeLabel{background-color:hsl(0, 0%, 34.4117647059%);text-align:center;}#mq6cnds9fgbtdm061ep .edgeLabel p{background-color:hsl(0, 0%, 34.4117647059%);}#mq6cnds9fgbtdm061ep .edgeLabel rect{opacity:0.5;background-color:hsl(0, 0%, 34.4117647059%);fill:hsl(0, 0%, 34.4117647059%);}#mq6cnds9fgbtdm061ep .labelBkg{background-color:rgba(87.75, 87.75, 87.75, 0.5);}#mq6cnds9fgbtdm061ep .cluster rect{fill:hsl(180, 1.5873015873%, 28.3529411765%);stroke:rgba(255, 255, 255, 0.25);stroke-width:1px;}#mq6cnds9fgbtdm061ep .cluster text{fill:#F9FFFE;}#mq6cnds9fgbtdm061ep .cluster span{color:#F9FFFE;}#mq6cnds9fgbtdm061ep 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;}#mq6cnds9fgbtdm061ep .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#ccc;}#mq6cnds9fgbtdm061ep rect.text{fill:none;stroke-width:0;}#mq6cnds9fgbtdm061ep .icon-shape,#mq6cnds9fgbtdm061ep .image-shape{background-color:hsl(0, 0%, 34.4117647059%);text-align:center;}#mq6cnds9fgbtdm061ep .icon-shape p,#mq6cnds9fgbtdm061ep .image-shape p{background-color:hsl(0, 0%, 34.4117647059%);padding:2px;}#mq6cnds9fgbtdm061ep .icon-shape rect,#mq6cnds9fgbtdm061ep .image-shape rect{opacity:0.5;background-color:hsl(0, 0%, 34.4117647059%);fill:hsl(0, 0%, 34.4117647059%);}#mq6cnds9fgbtdm061ep .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mq6cnds9fgbtdm061ep .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mq6cnds9fgbtdm061ep :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}核心模块Spring上下文工具路径匹配工具枚举工具时间工具树形工具JAR工具Knife4j模块API文档增强白名单配置IP模块IP地址查询IP定位工具脱敏模块数据脱敏注解脱敏类型枚举自定义脱敏线程模块虚拟线程工具异步回调存储模块存储抽象接口文件存储S3存储任务模块任务总线TaskBus任务状态管理XXL-JOB集成日志模块日志总线LogBus日志追踪虚拟线程日志运行信息消息队列模块消息总线MqBusRabbitMQ实现消息编解码错误处理搜索引擎模块ES查询工具ES监控索引操作数据库模块MyBatis配置MyBatis-Plus增强Druid连接池SQL监控拦截MySQL监控缓存模块Redis服务分布式锁缓存监控Hash操作Web模块全局异常处理日志追踪FilterJackson定制配置过滤器链白名单机制API模块统一响应Result异常体系基础枚举日志追踪LogTrack分页模型树形模型XSS过滤注解1.4 功能层次结构 #mq6cndsgg2bh1g5l5s9{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;}}#mq6cndsgg2bh1g5l5s9 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mq6cndsgg2bh1g5l5s9 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mq6cndsgg2bh1g5l5s9 .error-icon{fill:#a44141;}#mq6cndsgg2bh1g5l5s9 .error-text{fill:#ddd;stroke:#ddd;}#mq6cndsgg2bh1g5l5s9 .edge-thickness-normal{stroke-width:1px;}#mq6cndsgg2bh1g5l5s9 .edge-thickness-thick{stroke-width:3.5px;}#mq6cndsgg2bh1g5l5s9 .edge-pattern-solid{stroke-dasharray:0;}#mq6cndsgg2bh1g5l5s9 .edge-thickness-invisible{stroke-width:0;fill:none;}#mq6cndsgg2bh1g5l5s9 .edge-pattern-dashed{stroke-dasharray:3;}#mq6cndsgg2bh1g5l5s9 .edge-pattern-dotted{stroke-dasharray:2;}#mq6cndsgg2bh1g5l5s9 .marker{fill:lightgrey;stroke:lightgrey;}#mq6cndsgg2bh1g5l5s9 .marker.cross{stroke:lightgrey;}#mq6cndsgg2bh1g5l5s9 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mq6cndsgg2bh1g5l5s9 p{margin:0;}#mq6cndsgg2bh1g5l5s9 .edge{stroke-width:3;}#mq6cndsgg2bh1g5l5s9 .section--1 rect,#mq6cndsgg2bh1g5l5s9 .section--1 path,#mq6cndsgg2bh1g5l5s9 .section--1 circle,#mq6cndsgg2bh1g5l5s9 .section--1 polygon,#mq6cndsgg2bh1g5l5s9 .section--1 path{fill:#1f2020;}#mq6cndsgg2bh1g5l5s9 .section--1 text{fill:lightgrey;}#mq6cndsgg2bh1g5l5s9 .node-icon--1{font-size:40px;color:lightgrey;}#mq6cndsgg2bh1g5l5s9 .section-edge--1{stroke:#1f2020;}#mq6cndsgg2bh1g5l5s9 .edge-depth--1{stroke-width:17;}#mq6cndsgg2bh1g5l5s9 .section--1 line{stroke:#e0dfdf;stroke-width:3;}#mq6cndsgg2bh1g5l5s9 .disabled,#mq6cndsgg2bh1g5l5s9 .disabled circle,#mq6cndsgg2bh1g5l5s9 .disabled text{fill:lightgray;}#mq6cndsgg2bh1g5l5s9 .disabled text{fill:#efefef;}#mq6cndsgg2bh1g5l5s9 .section-0 rect,#mq6cndsgg2bh1g5l5s9 .section-0 path,#mq6cndsgg2bh1g5l5s9 .section-0 circle,#mq6cndsgg2bh1g5l5s9 .section-0 polygon,#mq6cndsgg2bh1g5l5s9 .section-0 path{fill:#0b0000;}#mq6cndsgg2bh1g5l5s9 .section-0 text{fill:lightgrey;}#mq6cndsgg2bh1g5l5s9 .node-icon-0{font-size:40px;color:lightgrey;}#mq6cndsgg2bh1g5l5s9 .section-edge-0{stroke:#0b0000;}#mq6cndsgg2bh1g5l5s9 .edge-depth-0{stroke-width:14;}#mq6cndsgg2bh1g5l5s9 .section-0 line{stroke:#f4ffff;stroke-width:3;}#mq6cndsgg2bh1g5l5s9 .disabled,#mq6cndsgg2bh1g5l5s9 .disabled circle,#mq6cndsgg2bh1g5l5s9 .disabled text{fill:lightgray;}#mq6cndsgg2bh1g5l5s9 .disabled text{fill:#efefef;}#mq6cndsgg2bh1g5l5s9 .section-1 rect,#mq6cndsgg2bh1g5l5s9 .section-1 path,#mq6cndsgg2bh1g5l5s9 .section-1 circle,#mq6cndsgg2bh1g5l5s9 .section-1 polygon,#mq6cndsgg2bh1g5l5s9 .section-1 path{fill:#4d1037;}#mq6cndsgg2bh1g5l5s9 .section-1 text{fill:lightgrey;}#mq6cndsgg2bh1g5l5s9 .node-icon-1{font-size:40px;color:lightgrey;}#mq6cndsgg2bh1g5l5s9 .section-edge-1{stroke:#4d1037;}#mq6cndsgg2bh1g5l5s9 .edge-depth-1{stroke-width:11;}#mq6cndsgg2bh1g5l5s9 .section-1 line{stroke:#b2efc8;stroke-width:3;}#mq6cndsgg2bh1g5l5s9 .disabled,#mq6cndsgg2bh1g5l5s9 .disabled circle,#mq6cndsgg2bh1g5l5s9 .disabled text{fill:lightgray;}#mq6cndsgg2bh1g5l5s9 .disabled text{fill:#efefef;}#mq6cndsgg2bh1g5l5s9 .section-2 rect,#mq6cndsgg2bh1g5l5s9 .section-2 path,#mq6cndsgg2bh1g5l5s9 .section-2 circle,#mq6cndsgg2bh1g5l5s9 .section-2 polygon,#mq6cndsgg2bh1g5l5s9 .section-2 path{fill:#3f5258;}#mq6cndsgg2bh1g5l5s9 .section-2 text{fill:lightgrey;}#mq6cndsgg2bh1g5l5s9 .node-icon-2{font-size:40px;color:lightgrey;}#mq6cndsgg2bh1g5l5s9 .section-edge-2{stroke:#3f5258;}#mq6cndsgg2bh1g5l5s9 .edge-depth-2{stroke-width:8;}#mq6cndsgg2bh1g5l5s9 .section-2 line{stroke:#c0ada7;stroke-width:3;}#mq6cndsgg2bh1g5l5s9 .disabled,#mq6cndsgg2bh1g5l5s9 .disabled circle,#mq6cndsgg2bh1g5l5s9 .disabled text{fill:lightgray;}#mq6cndsgg2bh1g5l5s9 .disabled text{fill:#efefef;}#mq6cndsgg2bh1g5l5s9 .section-3 rect,#mq6cndsgg2bh1g5l5s9 .section-3 path,#mq6cndsgg2bh1g5l5s9 .section-3 circle,#mq6cndsgg2bh1g5l5s9 .section-3 polygon,#mq6cndsgg2bh1g5l5s9 .section-3 path{fill:#4f2f1b;}#mq6cndsgg2bh1g5l5s9 .section-3 text{fill:lightgrey;}#mq6cndsgg2bh1g5l5s9 .node-icon-3{font-size:40px;color:lightgrey;}#mq6cndsgg2bh1g5l5s9 .section-edge-3{stroke:#4f2f1b;}#mq6cndsgg2bh1g5l5s9 .edge-depth-3{stroke-width:5;}#mq6cndsgg2bh1g5l5s9 .section-3 line{stroke:#b0d0e4;stroke-width:3;}#mq6cndsgg2bh1g5l5s9 .disabled,#mq6cndsgg2bh1g5l5s9 .disabled circle,#mq6cndsgg2bh1g5l5s9 .disabled text{fill:lightgray;}#mq6cndsgg2bh1g5l5s9 .disabled text{fill:#efefef;}#mq6cndsgg2bh1g5l5s9 .section-4 rect,#mq6cndsgg2bh1g5l5s9 .section-4 path,#mq6cndsgg2bh1g5l5s9 .section-4 circle,#mq6cndsgg2bh1g5l5s9 .section-4 polygon,#mq6cndsgg2bh1g5l5s9 .section-4 path{fill:#6e0a0a;}#mq6cndsgg2bh1g5l5s9 .section-4 text{fill:lightgrey;}#mq6cndsgg2bh1g5l5s9 .node-icon-4{font-size:40px;color:lightgrey;}#mq6cndsgg2bh1g5l5s9 .section-edge-4{stroke:#6e0a0a;}#mq6cndsgg2bh1g5l5s9 .edge-depth-4{stroke-width:2;}#mq6cndsgg2bh1g5l5s9 .section-4 line{stroke:#91f5f5;stroke-width:3;}#mq6cndsgg2bh1g5l5s9 .disabled,#mq6cndsgg2bh1g5l5s9 .disabled circle,#mq6cndsgg2bh1g5l5s9 .disabled text{fill:lightgray;}#mq6cndsgg2bh1g5l5s9 .disabled text{fill:#efefef;}#mq6cndsgg2bh1g5l5s9 .section-5 rect,#mq6cndsgg2bh1g5l5s9 .section-5 path,#mq6cndsgg2bh1g5l5s9 .section-5 circle,#mq6cndsgg2bh1g5l5s9 .section-5 polygon,#mq6cndsgg2bh1g5l5s9 .section-5 path{fill:#3b0048;}#mq6cndsgg2bh1g5l5s9 .section-5 text{fill:lightgrey;}#mq6cndsgg2bh1g5l5s9 .node-icon-5{font-size:40px;color:lightgrey;}#mq6cndsgg2bh1g5l5s9 .section-edge-5{stroke:#3b0048;}#mq6cndsgg2bh1g5l5s9 .edge-depth-5{stroke-width:-1;}#mq6cndsgg2bh1g5l5s9 .section-5 line{stroke:#c4ffb7;stroke-width:3;}#mq6cndsgg2bh1g5l5s9 .disabled,#mq6cndsgg2bh1g5l5s9 .disabled circle,#mq6cndsgg2bh1g5l5s9 .disabled text{fill:lightgray;}#mq6cndsgg2bh1g5l5s9 .disabled text{fill:#efefef;}#mq6cndsgg2bh1g5l5s9 .section-6 rect,#mq6cndsgg2bh1g5l5s9 .section-6 path,#mq6cndsgg2bh1g5l5s9 .section-6 circle,#mq6cndsgg2bh1g5l5s9 .section-6 polygon,#mq6cndsgg2bh1g5l5s9 .section-6 path{fill:#995a01;}#mq6cndsgg2bh1g5l5s9 .section-6 text{fill:lightgrey;}#mq6cndsgg2bh1g5l5s9 .node-icon-6{font-size:40px;color:lightgrey;}#mq6cndsgg2bh1g5l5s9 .section-edge-6{stroke:#995a01;}#mq6cndsgg2bh1g5l5s9 .edge-depth-6{stroke-width:-4;}#mq6cndsgg2bh1g5l5s9 .section-6 line{stroke:#66a5fe;stroke-width:3;}#mq6cndsgg2bh1g5l5s9 .disabled,#mq6cndsgg2bh1g5l5s9 .disabled circle,#mq6cndsgg2bh1g5l5s9 .disabled text{fill:lightgray;}#mq6cndsgg2bh1g5l5s9 .disabled text{fill:#efefef;}#mq6cndsgg2bh1g5l5s9 .section-7 rect,#mq6cndsgg2bh1g5l5s9 .section-7 path,#mq6cndsgg2bh1g5l5s9 .section-7 circle,#mq6cndsgg2bh1g5l5s9 .section-7 polygon,#mq6cndsgg2bh1g5l5s9 .section-7 path{fill:#154706;}#mq6cndsgg2bh1g5l5s9 .section-7 text{fill:lightgrey;}#mq6cndsgg2bh1g5l5s9 .node-icon-7{font-size:40px;color:lightgrey;}#mq6cndsgg2bh1g5l5s9 .section-edge-7{stroke:#154706;}#mq6cndsgg2bh1g5l5s9 .edge-depth-7{stroke-width:-7;}#mq6cndsgg2bh1g5l5s9 .section-7 line{stroke:#eab8f9;stroke-width:3;}#mq6cndsgg2bh1g5l5s9 .disabled,#mq6cndsgg2bh1g5l5s9 .disabled circle,#mq6cndsgg2bh1g5l5s9 .disabled text{fill:lightgray;}#mq6cndsgg2bh1g5l5s9 .disabled text{fill:#efefef;}#mq6cndsgg2bh1g5l5s9 .section-8 rect,#mq6cndsgg2bh1g5l5s9 .section-8 path,#mq6cndsgg2bh1g5l5s9 .section-8 circle,#mq6cndsgg2bh1g5l5s9 .section-8 polygon,#mq6cndsgg2bh1g5l5s9 .section-8 path{fill:#161722;}#mq6cndsgg2bh1g5l5s9 .section-8 text{fill:lightgrey;}#mq6cndsgg2bh1g5l5s9 .node-icon-8{font-size:40px;color:lightgrey;}#mq6cndsgg2bh1g5l5s9 .section-edge-8{stroke:#161722;}#mq6cndsgg2bh1g5l5s9 .edge-depth-8{stroke-width:-10;}#mq6cndsgg2bh1g5l5s9 .section-8 line{stroke:#e9e8dd;stroke-width:3;}#mq6cndsgg2bh1g5l5s9 .disabled,#mq6cndsgg2bh1g5l5s9 .disabled circle,#mq6cndsgg2bh1g5l5s9 .disabled text{fill:lightgray;}#mq6cndsgg2bh1g5l5s9 .disabled text{fill:#efefef;}#mq6cndsgg2bh1g5l5s9 .section-9 rect,#mq6cndsgg2bh1g5l5s9 .section-9 path,#mq6cndsgg2bh1g5l5s9 .section-9 circle,#mq6cndsgg2bh1g5l5s9 .section-9 polygon,#mq6cndsgg2bh1g5l5s9 .section-9 path{fill:#00296f;}#mq6cndsgg2bh1g5l5s9 .section-9 text{fill:lightgrey;}#mq6cndsgg2bh1g5l5s9 .node-icon-9{font-size:40px;color:lightgrey;}#mq6cndsgg2bh1g5l5s9 .section-edge-9{stroke:#00296f;}#mq6cndsgg2bh1g5l5s9 .edge-depth-9{stroke-width:-13;}#mq6cndsgg2bh1g5l5s9 .section-9 line{stroke:#ffd690;stroke-width:3;}#mq6cndsgg2bh1g5l5s9 .disabled,#mq6cndsgg2bh1g5l5s9 .disabled circle,#mq6cndsgg2bh1g5l5s9 .disabled text{fill:lightgray;}#mq6cndsgg2bh1g5l5s9 .disabled text{fill:#efefef;}#mq6cndsgg2bh1g5l5s9 .section-10 rect,#mq6cndsgg2bh1g5l5s9 .section-10 path,#mq6cndsgg2bh1g5l5s9 .section-10 circle,#mq6cndsgg2bh1g5l5s9 .section-10 polygon,#mq6cndsgg2bh1g5l5s9 .section-10 path{fill:#01629c;}#mq6cndsgg2bh1g5l5s9 .section-10 text{fill:lightgrey;}#mq6cndsgg2bh1g5l5s9 .node-icon-10{font-size:40px;color:lightgrey;}#mq6cndsgg2bh1g5l5s9 .section-edge-10{stroke:#01629c;}#mq6cndsgg2bh1g5l5s9 .edge-depth-10{stroke-width:-16;}#mq6cndsgg2bh1g5l5s9 .section-10 line{stroke:#fe9d63;stroke-width:3;}#mq6cndsgg2bh1g5l5s9 .disabled,#mq6cndsgg2bh1g5l5s9 .disabled circle,#mq6cndsgg2bh1g5l5s9 .disabled text{fill:lightgray;}#mq6cndsgg2bh1g5l5s9 .disabled text{fill:#efefef;}#mq6cndsgg2bh1g5l5s9 .section-root rect,#mq6cndsgg2bh1g5l5s9 .section-root path,#mq6cndsgg2bh1g5l5s9 .section-root circle,#mq6cndsgg2bh1g5l5s9 .section-root polygon{fill:hsl(180, 1.5873015873%, 48.3529411765%);}#mq6cndsgg2bh1g5l5s9 .section-root text{fill:#2c2c2c;}#mq6cndsgg2bh1g5l5s9 .section-root span{color:#2c2c2c;}#mq6cndsgg2bh1g5l5s9 .section-2 span{color:#2c2c2c;}#mq6cndsgg2bh1g5l5s9 .icon-container{height:100%;display:flex;justify-content:center;align-items:center;}#mq6cndsgg2bh1g5l5s9 .edge{fill:none;}#mq6cndsgg2bh1g5l5s9 .mindmap-node-label{dy:1em;alignment-baseline:middle;text-anchor:middle;dominant-baseline:middle;text-align:center;}#mq6cndsgg2bh1g5l5s9 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}xtools-bootSpringBoot工具模块框架API基础统一响应Result异常体系基础枚举日志追踪LogTrack分页模型树形模型Web基础全局异常处理日志追踪FilterJackson定制XSS过滤过滤器链缓存Redis服务分布式锁Hash操作缓存监控数据库MyBatis配置MyBatis-Plus增强Druid连接池SQL监控MySQL监控搜索引擎ES查询工具ES监控消息队列消息总线RabbitMQ实现消息编解码日志日志总线LogBus日志追踪虚拟线程日志任务任务总线TaskBusXXL-JOB集成存储存储抽象接口文件存储S3存储安全数据脱敏XSS防护工具虚拟线程IP定位枚举工具树形工具时间工具1.5 功能关系图 #mq6cndsg08vqsd6i2dvj{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;}}#mq6cndsg08vqsd6i2dvj .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mq6cndsg08vqsd6i2dvj .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mq6cndsg08vqsd6i2dvj .error-icon{fill:#a44141;}#mq6cndsg08vqsd6i2dvj .error-text{fill:#ddd;stroke:#ddd;}#mq6cndsg08vqsd6i2dvj .edge-thickness-normal{stroke-width:1px;}#mq6cndsg08vqsd6i2dvj .edge-thickness-thick{stroke-width:3.5px;}#mq6cndsg08vqsd6i2dvj .edge-pattern-solid{stroke-dasharray:0;}#mq6cndsg08vqsd6i2dvj .edge-thickness-invisible{stroke-width:0;fill:none;}#mq6cndsg08vqsd6i2dvj .edge-pattern-dashed{stroke-dasharray:3;}#mq6cndsg08vqsd6i2dvj .edge-pattern-dotted{stroke-dasharray:2;}#mq6cndsg08vqsd6i2dvj .marker{fill:lightgrey;stroke:lightgrey;}#mq6cndsg08vqsd6i2dvj .marker.cross{stroke:lightgrey;}#mq6cndsg08vqsd6i2dvj svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mq6cndsg08vqsd6i2dvj p{margin:0;}#mq6cndsg08vqsd6i2dvj .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#ccc;}#mq6cndsg08vqsd6i2dvj .cluster-label text{fill:#F9FFFE;}#mq6cndsg08vqsd6i2dvj .cluster-label span{color:#F9FFFE;}#mq6cndsg08vqsd6i2dvj .cluster-label span p{background-color:transparent;}#mq6cndsg08vqsd6i2dvj .label text,#mq6cndsg08vqsd6i2dvj span{fill:#ccc;color:#ccc;}#mq6cndsg08vqsd6i2dvj .node rect,#mq6cndsg08vqsd6i2dvj .node circle,#mq6cndsg08vqsd6i2dvj .node ellipse,#mq6cndsg08vqsd6i2dvj .node polygon,#mq6cndsg08vqsd6i2dvj .node path{fill:#1f2020;stroke:#ccc;stroke-width:1px;}#mq6cndsg08vqsd6i2dvj .rough-node .label text,#mq6cndsg08vqsd6i2dvj .node .label text,#mq6cndsg08vqsd6i2dvj .image-shape .label,#mq6cndsg08vqsd6i2dvj .icon-shape .label{text-anchor:middle;}#mq6cndsg08vqsd6i2dvj .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mq6cndsg08vqsd6i2dvj .rough-node .label,#mq6cndsg08vqsd6i2dvj .node .label,#mq6cndsg08vqsd6i2dvj .image-shape .label,#mq6cndsg08vqsd6i2dvj .icon-shape .label{text-align:center;}#mq6cndsg08vqsd6i2dvj .node.clickable{cursor:pointer;}#mq6cndsg08vqsd6i2dvj .root .anchor path{fill:lightgrey!important;stroke-width:0;stroke:lightgrey;}#mq6cndsg08vqsd6i2dvj .arrowheadPath{fill:lightgrey;}#mq6cndsg08vqsd6i2dvj .edgePath .path{stroke:lightgrey;stroke-width:2.0px;}#mq6cndsg08vqsd6i2dvj .flowchart-link{stroke:lightgrey;fill:none;}#mq6cndsg08vqsd6i2dvj .edgeLabel{background-color:hsl(0, 0%, 34.4117647059%);text-align:center;}#mq6cndsg08vqsd6i2dvj .edgeLabel p{background-color:hsl(0, 0%, 34.4117647059%);}#mq6cndsg08vqsd6i2dvj .edgeLabel rect{opacity:0.5;background-color:hsl(0, 0%, 34.4117647059%);fill:hsl(0, 0%, 34.4117647059%);}#mq6cndsg08vqsd6i2dvj .labelBkg{background-color:rgba(87.75, 87.75, 87.75, 0.5);}#mq6cndsg08vqsd6i2dvj .cluster rect{fill:hsl(180, 1.5873015873%, 28.3529411765%);stroke:rgba(255, 255, 255, 0.25);stroke-width:1px;}#mq6cndsg08vqsd6i2dvj .cluster text{fill:#F9FFFE;}#mq6cndsg08vqsd6i2dvj .cluster span{color:#F9FFFE;}#mq6cndsg08vqsd6i2dvj 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;}#mq6cndsg08vqsd6i2dvj .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#ccc;}#mq6cndsg08vqsd6i2dvj rect.text{fill:none;stroke-width:0;}#mq6cndsg08vqsd6i2dvj .icon-shape,#mq6cndsg08vqsd6i2dvj .image-shape{background-color:hsl(0, 0%, 34.4117647059%);text-align:center;}#mq6cndsg08vqsd6i2dvj .icon-shape p,#mq6cndsg08vqsd6i2dvj .image-shape p{background-color:hsl(0, 0%, 34.4117647059%);padding:2px;}#mq6cndsg08vqsd6i2dvj .icon-shape rect,#mq6cndsg08vqsd6i2dvj .image-shape rect{opacity:0.5;background-color:hsl(0, 0%, 34.4117647059%);fill:hsl(0, 0%, 34.4117647059%);}#mq6cndsg08vqsd6i2dvj .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mq6cndsg08vqsd6i2dvj .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mq6cndsg08vqsd6i2dvj :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}异常异步异步存储持久化序列化HTTP请求过滤器链日志追踪Filter公共FilterController层Service层全局异常处理器Redis缓存数据库消息队列日志总线Elasticsearch任务总线XXL-JOB存储服务本地文件S3对象存储脱敏注解Jackson二、项目结构设计 2.1 整体架构 #mq6cndsgzw8sf9bekbj{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;}}#mq6cndsgzw8sf9bekbj .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mq6cndsgzw8sf9bekbj .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mq6cndsgzw8sf9bekbj .error-icon{fill:#a44141;}#mq6cndsgzw8sf9bekbj .error-text{fill:#ddd;stroke:#ddd;}#mq6cndsgzw8sf9bekbj .edge-thickness-normal{stroke-width:1px;}#mq6cndsgzw8sf9bekbj .edge-thickness-thick{stroke-width:3.5px;}#mq6cndsgzw8sf9bekbj .edge-pattern-solid{stroke-dasharray:0;}#mq6cndsgzw8sf9bekbj .edge-thickness-invisible{stroke-width:0;fill:none;}#mq6cndsgzw8sf9bekbj .edge-pattern-dashed{stroke-dasharray:3;}#mq6cndsgzw8sf9bekbj .edge-pattern-dotted{stroke-dasharray:2;}#mq6cndsgzw8sf9bekbj .marker{fill:lightgrey;stroke:lightgrey;}#mq6cndsgzw8sf9bekbj .marker.cross{stroke:lightgrey;}#mq6cndsgzw8sf9bekbj svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mq6cndsgzw8sf9bekbj p{margin:0;}#mq6cndsgzw8sf9bekbj .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#ccc;}#mq6cndsgzw8sf9bekbj .cluster-label text{fill:#F9FFFE;}#mq6cndsgzw8sf9bekbj .cluster-label span{color:#F9FFFE;}#mq6cndsgzw8sf9bekbj .cluster-label span p{background-color:transparent;}#mq6cndsgzw8sf9bekbj .label text,#mq6cndsgzw8sf9bekbj span{fill:#ccc;color:#ccc;}#mq6cndsgzw8sf9bekbj .node rect,#mq6cndsgzw8sf9bekbj .node circle,#mq6cndsgzw8sf9bekbj .node ellipse,#mq6cndsgzw8sf9bekbj .node polygon,#mq6cndsgzw8sf9bekbj .node path{fill:#1f2020;stroke:#ccc;stroke-width:1px;}#mq6cndsgzw8sf9bekbj .rough-node .label text,#mq6cndsgzw8sf9bekbj .node .label text,#mq6cndsgzw8sf9bekbj .image-shape .label,#mq6cndsgzw8sf9bekbj .icon-shape .label{text-anchor:middle;}#mq6cndsgzw8sf9bekbj .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mq6cndsgzw8sf9bekbj .rough-node .label,#mq6cndsgzw8sf9bekbj .node .label,#mq6cndsgzw8sf9bekbj .image-shape .label,#mq6cndsgzw8sf9bekbj .icon-shape .label{text-align:center;}#mq6cndsgzw8sf9bekbj .node.clickable{cursor:pointer;}#mq6cndsgzw8sf9bekbj .root .anchor path{fill:lightgrey!important;stroke-width:0;stroke:lightgrey;}#mq6cndsgzw8sf9bekbj .arrowheadPath{fill:lightgrey;}#mq6cndsgzw8sf9bekbj .edgePath .path{stroke:lightgrey;stroke-width:2.0px;}#mq6cndsgzw8sf9bekbj .flowchart-link{stroke:lightgrey;fill:none;}#mq6cndsgzw8sf9bekbj .edgeLabel{background-color:hsl(0, 0%, 34.4117647059%);text-align:center;}#mq6cndsgzw8sf9bekbj .edgeLabel p{background-color:hsl(0, 0%, 34.4117647059%);}#mq6cndsgzw8sf9bekbj .edgeLabel rect{opacity:0.5;background-color:hsl(0, 0%, 34.4117647059%);fill:hsl(0, 0%, 34.4117647059%);}#mq6cndsgzw8sf9bekbj .labelBkg{background-color:rgba(87.75, 87.75, 87.75, 0.5);}#mq6cndsgzw8sf9bekbj .cluster rect{fill:hsl(180, 1.5873015873%, 28.3529411765%);stroke:rgba(255, 255, 255, 0.25);stroke-width:1px;}#mq6cndsgzw8sf9bekbj .cluster text{fill:#F9FFFE;}#mq6cndsgzw8sf9bekbj .cluster span{color:#F9FFFE;}#mq6cndsgzw8sf9bekbj 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;}#mq6cndsgzw8sf9bekbj .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#ccc;}#mq6cndsgzw8sf9bekbj rect.text{fill:none;stroke-width:0;}#mq6cndsgzw8sf9bekbj .icon-shape,#mq6cndsgzw8sf9bekbj .image-shape{background-color:hsl(0, 0%, 34.4117647059%);text-align:center;}#mq6cndsgzw8sf9bekbj .icon-shape p,#mq6cndsgzw8sf9bekbj .image-shape p{background-color:hsl(0, 0%, 34.4117647059%);padding:2px;}#mq6cndsgzw8sf9bekbj .icon-shape rect,#mq6cndsgzw8sf9bekbj .image-shape rect{opacity:0.5;background-color:hsl(0, 0%, 34.4117647059%);fill:hsl(0, 0%, 34.4117647059%);}#mq6cndsgzw8sf9bekbj .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mq6cndsgzw8sf9bekbj .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mq6cndsgzw8sf9bekbj :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}xtools-boot父模块xtools-boot-apiAPI基础模块xtools-boot-core核心工具模块xtools-boot-cache缓存模块xtools-boot-db数据库模块xtools-boot-elasticsearch搜索引擎模块xtools-boot-ipIP工具模块xtools-boot-job任务调度模块xtools-boot-knife4jAPI文档模块xtools-boot-log日志模块xtools-boot-mask脱敏模块xtools-boot-mq消息队列模块xtools-boot-storage存储模块xtools-boot-task任务总线模块xtools-boot-thread线程模块xtools-boot-webWeb基础模块xtools-boot-cache-redisRedis缓存xtools-boot-db-mybatisMyBatisxtools-boot-db-mybatis-plusMyBatis-Plusxtools-boot-job-xxlXXL-JOBxtools-boot-mq-baseMQ基础xtools-boot-mq-rabbitRabbitMQxtools-boot-storage-base存储基础xtools-boot-storage-file文件存储xtools-boot-storage-s3S3存储xtools-boot-web-baseWeb基础xtools-boot-web-filter过滤器2.2 分层架构 #mq6cndsgcslslungmzh{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;}}#mq6cndsgcslslungmzh .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mq6cndsgcslslungmzh .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mq6cndsgcslslungmzh .error-icon{fill:#a44141;}#mq6cndsgcslslungmzh .error-text{fill:#ddd;stroke:#ddd;}#mq6cndsgcslslungmzh .edge-thickness-normal{stroke-width:1px;}#mq6cndsgcslslungmzh .edge-thickness-thick{stroke-width:3.5px;}#mq6cndsgcslslungmzh .edge-pattern-solid{stroke-dasharray:0;}#mq6cndsgcslslungmzh .edge-thickness-invisible{stroke-width:0;fill:none;}#mq6cndsgcslslungmzh .edge-pattern-dashed{stroke-dasharray:3;}#mq6cndsgcslslungmzh .edge-pattern-dotted{stroke-dasharray:2;}#mq6cndsgcslslungmzh .marker{fill:lightgrey;stroke:lightgrey;}#mq6cndsgcslslungmzh .marker.cross{stroke:lightgrey;}#mq6cndsgcslslungmzh svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mq6cndsgcslslungmzh p{margin:0;}#mq6cndsgcslslungmzh .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#ccc;}#mq6cndsgcslslungmzh .cluster-label text{fill:#F9FFFE;}#mq6cndsgcslslungmzh .cluster-label span{color:#F9FFFE;}#mq6cndsgcslslungmzh .cluster-label span p{background-color:transparent;}#mq6cndsgcslslungmzh .label text,#mq6cndsgcslslungmzh span{fill:#ccc;color:#ccc;}#mq6cndsgcslslungmzh .node rect,#mq6cndsgcslslungmzh .node circle,#mq6cndsgcslslungmzh .node ellipse,#mq6cndsgcslslungmzh .node polygon,#mq6cndsgcslslungmzh .node path{fill:#1f2020;stroke:#ccc;stroke-width:1px;}#mq6cndsgcslslungmzh .rough-node .label text,#mq6cndsgcslslungmzh .node .label text,#mq6cndsgcslslungmzh .image-shape .label,#mq6cndsgcslslungmzh .icon-shape .label{text-anchor:middle;}#mq6cndsgcslslungmzh .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mq6cndsgcslslungmzh .rough-node .label,#mq6cndsgcslslungmzh .node .label,#mq6cndsgcslslungmzh .image-shape .label,#mq6cndsgcslslungmzh .icon-shape .label{text-align:center;}#mq6cndsgcslslungmzh .node.clickable{cursor:pointer;}#mq6cndsgcslslungmzh .root .anchor path{fill:lightgrey!important;stroke-width:0;stroke:lightgrey;}#mq6cndsgcslslungmzh .arrowheadPath{fill:lightgrey;}#mq6cndsgcslslungmzh .edgePath .path{stroke:lightgrey;stroke-width:2.0px;}#mq6cndsgcslslungmzh .flowchart-link{stroke:lightgrey;fill:none;}#mq6cndsgcslslungmzh .edgeLabel{background-color:hsl(0, 0%, 34.4117647059%);text-align:center;}#mq6cndsgcslslungmzh .edgeLabel p{background-color:hsl(0, 0%, 34.4117647059%);}#mq6cndsgcslslungmzh .edgeLabel rect{opacity:0.5;background-color:hsl(0, 0%, 34.4117647059%);fill:hsl(0, 0%, 34.4117647059%);}#mq6cndsgcslslungmzh .labelBkg{background-color:rgba(87.75, 87.75, 87.75, 0.5);}#mq6cndsgcslslungmzh .cluster rect{fill:hsl(180, 1.5873015873%, 28.3529411765%);stroke:rgba(255, 255, 255, 0.25);stroke-width:1px;}#mq6cndsgcslslungmzh .cluster text{fill:#F9FFFE;}#mq6cndsgcslslungmzh .cluster span{color:#F9FFFE;}#mq6cndsgcslslungmzh 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;}#mq6cndsgcslslungmzh .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#ccc;}#mq6cndsgcslslungmzh rect.text{fill:none;stroke-width:0;}#mq6cndsgcslslungmzh .icon-shape,#mq6cndsgcslslungmzh .image-shape{background-color:hsl(0, 0%, 34.4117647059%);text-align:center;}#mq6cndsgcslslungmzh .icon-shape p,#mq6cndsgcslslungmzh .image-shape p{background-color:hsl(0, 0%, 34.4117647059%);padding:2px;}#mq6cndsgcslslungmzh .icon-shape rect,#mq6cndsgcslslungmzh .image-shape rect{opacity:0.5;background-color:hsl(0, 0%, 34.4117647059%);fill:hsl(0, 0%, 34.4117647059%);}#mq6cndsgcslslungmzh .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mq6cndsgcslslungmzh .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mq6cndsgcslslungmzh :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}数据层业务模块层Web层过滤器层SkipFilter白名单过滤器 Order:0LogTrackFilter日志追踪过滤器 Order:100CommonFilter公共过滤器 Order:101GlobalControllerExceptionHandler全局异常处理JacksonConfigJSON序列化配置MvcConverterConfigMVC转换器配置缓存模块 RedisService日志模块 LogBus任务模块 TaskBus消息模块 MqBus存储模块 StorageService脱敏模块 MaskSerializerMyBatis / MyBatis-PlusRedisElasticsearchRabbitMQ文件系统 / S32.3 模块职责 模块 职责 关键类 xtools-boot-api API基础定义:统一响应、异常体系、枚举、日志追踪模型、分页/树形模型 Result, BizError, LogTrack, PageReq, PageResp, TreeResp xtools-boot-core 核心工具集:Spring上下文、路径匹配、枚举工具、时间工具、树形工具、JAR工具 SpringContextUtils, PathPatternUtils, TreeUtils, TimeUtils xtools-boot-cache Redis缓存服务:数据缓存、分布式锁、Hash操作、缓存监控 RedisService, RedisUtils, RedisMonitor xtools-boot-db 数据库访问:MyBatis配置、MyBatis-Plus增强、Druid连接池、SQL监控、MySQL监控 BootDbMybatisConfiguration, BootDbMybatisPlusConfiguration, MySqlMonitor xtools-boot-elasticsearch 搜索引擎:ES查询构建、ES操作、ES监控 EsUtils, EsQueryUtils, ElasticsearchMonitor xtools-boot-ip IP地址工具:IP库初始化、IP地址查询和定位 IpUtils, InitIp xtools-boot-job 任务调度:XXL-JOB配置和初始化 XxlJobConfig, InitXxlJob xtools-boot-knife4j API文档:Knife4j集成和白名单配置 BootKnife4jConfiguration, Knife4jFilterWhitelist xtools-boot-log 日志总线:日志采集、格式化、异步持久化、日志追踪 LogBus, LogTrackHolder, LogBody, RunInfo xtools-boot-mask 数据脱敏:字段级脱敏注解、多种脱敏类型、自定义脱敏 @Mask, MaskSerializer, MaskType, DefaultMaskHandle xtools-boot-mq 消息队列:消息总线、RabbitMQ实现、消息编解码、错误处理 MqBus, RabbitMqHandle, BaseMessageHandle, MqMessageUtils xtools-boot-storage 存储抽象:统一存储接口、本地文件实现、S3实现 StorageService, StorageServiceFileImpl, StorageServiceS3Impl xtools-boot-task 任务总线:任务状态管理、任务信息持久化 TaskBus, TaskInfo, TaskStatus xtools-boot-thread 线程工具:虚拟线程执行、异步回调 VirtualThreadTaskUtils, VirtualThreadTaskCallback xtools-boot-web Web基础:全局异常处理、日志追踪Filter、Jackson定制、XSS过滤、过滤器链 GlobalControllerExceptionHandler, LogTrackFilter, CommonFilter 2.4 包结构设计 复制代码 xtools.boot.{module} ├── {Module}Configuration # 模块配置类(@Import ImportSelector) ├── selector │ └── {Module}ImportSelector # 自动导入选择器 ├── config # 模块配置属性 ├── constant # 常量定义 ├── enums # 枚举定义 ├── interfaces # 接口定义 │ ├── BusInterface # 总线接口(LogBusInterface, TaskBusInterface, MqEnums) │ └── BaseType # 基础类型接口(BaseEnum, BaseTaskType) ├── model │ └── dto # 数据传输对象 ├── utils # 工具类 ├── handle # 处理器 ├── filter # 过滤器 ├── init # 初始化(ApplicationRunner) ├── monitor # 监控组件 ├── holder # 持有器(ScopedValue) ├── service # 服务接口和实现 └── annotation # 自定义注解 2.5 模块自动装配设计 所有模块采用统一的自动装配模式: #mq6cxh344sd269atlkm{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;}}#mq6cxh344sd269atlkm .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mq6cxh344sd269atlkm .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mq6cxh344sd269atlkm .error-icon{fill:#a44141;}#mq6cxh344sd269atlkm .error-text{fill:#ddd;stroke:#ddd;}#mq6cxh344sd269atlkm .edge-thickness-normal{stroke-width:1px;}#mq6cxh344sd269atlkm .edge-thickness-thick{stroke-width:3.5px;}#mq6cxh344sd269atlkm .edge-pattern-solid{stroke-dasharray:0;}#mq6cxh344sd269atlkm .edge-thickness-invisible{stroke-width:0;fill:none;}#mq6cxh344sd269atlkm .edge-pattern-dashed{stroke-dasharray:3;}#mq6cxh344sd269atlkm .edge-pattern-dotted{stroke-dasharray:2;}#mq6cxh344sd269atlkm .marker{fill:lightgrey;stroke:lightgrey;}#mq6cxh344sd269atlkm .marker.cross{stroke:lightgrey;}#mq6cxh344sd269atlkm svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mq6cxh344sd269atlkm p{margin:0;}#mq6cxh344sd269atlkm .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#ccc;}#mq6cxh344sd269atlkm .cluster-label text{fill:#F9FFFE;}#mq6cxh344sd269atlkm .cluster-label span{color:#F9FFFE;}#mq6cxh344sd269atlkm .cluster-label span p{background-color:transparent;}#mq6cxh344sd269atlkm .label text,#mq6cxh344sd269atlkm span{fill:#ccc;color:#ccc;}#mq6cxh344sd269atlkm .node rect,#mq6cxh344sd269atlkm .node circle,#mq6cxh344sd269atlkm .node ellipse,#mq6cxh344sd269atlkm .node polygon,#mq6cxh344sd269atlkm .node path{fill:#1f2020;stroke:#ccc;stroke-width:1px;}#mq6cxh344sd269atlkm .rough-node .label text,#mq6cxh344sd269atlkm .node .label text,#mq6cxh344sd269atlkm .image-shape .label,#mq6cxh344sd269atlkm .icon-shape .label{text-anchor:middle;}#mq6cxh344sd269atlkm .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mq6cxh344sd269atlkm .rough-node .label,#mq6cxh344sd269atlkm .node .label,#mq6cxh344sd269atlkm .image-shape .label,#mq6cxh344sd269atlkm .icon-shape .label{text-align:center;}#mq6cxh344sd269atlkm .node.clickable{cursor:pointer;}#mq6cxh344sd269atlkm .root .anchor path{fill:lightgrey!important;stroke-width:0;stroke:lightgrey;}#mq6cxh344sd269atlkm .arrowheadPath{fill:lightgrey;}#mq6cxh344sd269atlkm .edgePath .path{stroke:lightgrey;stroke-width:2.0px;}#mq6cxh344sd269atlkm .flowchart-link{stroke:lightgrey;fill:none;}#mq6cxh344sd269atlkm .edgeLabel{background-color:hsl(0, 0%, 34.4117647059%);text-align:center;}#mq6cxh344sd269atlkm .edgeLabel p{background-color:hsl(0, 0%, 34.4117647059%);}#mq6cxh344sd269atlkm .edgeLabel rect{opacity:0.5;background-color:hsl(0, 0%, 34.4117647059%);fill:hsl(0, 0%, 34.4117647059%);}#mq6cxh344sd269atlkm .labelBkg{background-color:rgba(87.75, 87.75, 87.75, 0.5);}#mq6cxh344sd269atlkm .cluster rect{fill:hsl(180, 1.5873015873%, 28.3529411765%);stroke:rgba(255, 255, 255, 0.25);stroke-width:1px;}#mq6cxh344sd269atlkm .cluster text{fill:#F9FFFE;}#mq6cxh344sd269atlkm .cluster span{color:#F9FFFE;}#mq6cxh344sd269atlkm 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;}#mq6cxh344sd269atlkm .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#ccc;}#mq6cxh344sd269atlkm rect.text{fill:none;stroke-width:0;}#mq6cxh344sd269atlkm .icon-shape,#mq6cxh344sd269atlkm .image-shape{background-color:hsl(0, 0%, 34.4117647059%);text-align:center;}#mq6cxh344sd269atlkm .icon-shape p,#mq6cxh344sd269atlkm .image-shape p{background-color:hsl(0, 0%, 34.4117647059%);padding:2px;}#mq6cxh344sd269atlkm .icon-shape rect,#mq6cxh344sd269atlkm .image-shape rect{opacity:0.5;background-color:hsl(0, 0%, 34.4117647059%);fill:hsl(0, 0%, 34.4117647059%);}#mq6cxh344sd269atlkm .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mq6cxh344sd269atlkm .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mq6cxh344sd269atlkm :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}业务应用引入模块依赖模块Configuration类 @ConfigurationImportSelector通过 @Import导入扫描模块包路径registerBeanDefinitions注册模块内所有ComponentConfiguration / Utils / Monitor等设计原则: 每个模块通过 @Configuration + @Import(ImportSelector) 实现按需加载 ImportSelector 指定模块的根包路径,自动注册所有 @Component、@Configuration 等注解的类 业务应用只需引入对应模块的 Maven 依赖,无需手动配置 三、项目功能设计 3.1 统一响应与异常设计 统一响应模型 java 复制代码 public final class Result<T> { private boolean success; // 是否成功 private int code; // 响应代码 private Object msg; // 提示信息 private T data; // 响应数据 } 异常体系 #mq6cndsgjok64yhnldg{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;}}#mq6cndsgjok64yhnldg .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mq6cndsgjok64yhnldg .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mq6cndsgjok64yhnldg .error-icon{fill:#a44141;}#mq6cndsgjok64yhnldg .error-text{fill:#ddd;stroke:#ddd;}#mq6cndsgjok64yhnldg .edge-thickness-normal{stroke-width:1px;}#mq6cndsgjok64yhnldg .edge-thickness-thick{stroke-width:3.5px;}#mq6cndsgjok64yhnldg .edge-pattern-solid{stroke-dasharray:0;}#mq6cndsgjok64yhnldg .edge-thickness-invisible{stroke-width:0;fill:none;}#mq6cndsgjok64yhnldg .edge-pattern-dashed{stroke-dasharray:3;}#mq6cndsgjok64yhnldg .edge-pattern-dotted{stroke-dasharray:2;}#mq6cndsgjok64yhnldg .marker{fill:lightgrey;stroke:lightgrey;}#mq6cndsgjok64yhnldg .marker.cross{stroke:lightgrey;}#mq6cndsgjok64yhnldg svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mq6cndsgjok64yhnldg p{margin:0;}#mq6cndsgjok64yhnldg .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#ccc;}#mq6cndsgjok64yhnldg .cluster-label text{fill:#F9FFFE;}#mq6cndsgjok64yhnldg .cluster-label span{color:#F9FFFE;}#mq6cndsgjok64yhnldg .cluster-label span p{background-color:transparent;}#mq6cndsgjok64yhnldg .label text,#mq6cndsgjok64yhnldg span{fill:#ccc;color:#ccc;}#mq6cndsgjok64yhnldg .node rect,#mq6cndsgjok64yhnldg .node circle,#mq6cndsgjok64yhnldg .node ellipse,#mq6cndsgjok64yhnldg .node polygon,#mq6cndsgjok64yhnldg .node path{fill:#1f2020;stroke:#ccc;stroke-width:1px;}#mq6cndsgjok64yhnldg .rough-node .label text,#mq6cndsgjok64yhnldg .node .label text,#mq6cndsgjok64yhnldg .image-shape .label,#mq6cndsgjok64yhnldg .icon-shape .label{text-anchor:middle;}#mq6cndsgjok64yhnldg .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mq6cndsgjok64yhnldg .rough-node .label,#mq6cndsgjok64yhnldg .node .label,#mq6cndsgjok64yhnldg .image-shape .label,#mq6cndsgjok64yhnldg .icon-shape .label{text-align:center;}#mq6cndsgjok64yhnldg .node.clickable{cursor:pointer;}#mq6cndsgjok64yhnldg .root .anchor path{fill:lightgrey!important;stroke-width:0;stroke:lightgrey;}#mq6cndsgjok64yhnldg .arrowheadPath{fill:lightgrey;}#mq6cndsgjok64yhnldg .edgePath .path{stroke:lightgrey;stroke-width:2.0px;}#mq6cndsgjok64yhnldg .flowchart-link{stroke:lightgrey;fill:none;}#mq6cndsgjok64yhnldg .edgeLabel{background-color:hsl(0, 0%, 34.4117647059%);text-align:center;}#mq6cndsgjok64yhnldg .edgeLabel p{background-color:hsl(0, 0%, 34.4117647059%);}#mq6cndsgjok64yhnldg .edgeLabel rect{opacity:0.5;background-color:hsl(0, 0%, 34.4117647059%);fill:hsl(0, 0%, 34.4117647059%);}#mq6cndsgjok64yhnldg .labelBkg{background-color:rgba(87.75, 87.75, 87.75, 0.5);}#mq6cndsgjok64yhnldg .cluster rect{fill:hsl(180, 1.5873015873%, 28.3529411765%);stroke:rgba(255, 255, 255, 0.25);stroke-width:1px;}#mq6cndsgjok64yhnldg .cluster text{fill:#F9FFFE;}#mq6cndsgjok64yhnldg .cluster span{color:#F9FFFE;}#mq6cndsgjok64yhnldg 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;}#mq6cndsgjok64yhnldg .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#ccc;}#mq6cndsgjok64yhnldg rect.text{fill:none;stroke-width:0;}#mq6cndsgjok64yhnldg .icon-shape,#mq6cndsgjok64yhnldg .image-shape{background-color:hsl(0, 0%, 34.4117647059%);text-align:center;}#mq6cndsgjok64yhnldg .icon-shape p,#mq6cndsgjok64yhnldg .image-shape p{background-color:hsl(0, 0%, 34.4117647059%);padding:2px;}#mq6cndsgjok64yhnldg .icon-shape rect,#mq6cndsgjok64yhnldg .image-shape rect{opacity:0.5;background-color:hsl(0, 0%, 34.4117647059%);fill:hsl(0, 0%, 34.4117647059%);}#mq6cndsgjok64yhnldg .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mq6cndsgjok64yhnldg .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mq6cndsgjok64yhnldg :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}code >= 1000code >= 1000code >= 1000code=401CommonExceptionxtools-coreBizError业务异常BizWarning业务警告BizPublicKeyError公钥异常UnauthorizedError认证异常返回Result.success=truecode=业务码返回ResultType.UNAUTHORIZED全局异常处理流程 #mq6cndsgq4ptrynjta{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;}}#mq6cndsgq4ptrynjta .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mq6cndsgq4ptrynjta .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mq6cndsgq4ptrynjta .error-icon{fill:#a44141;}#mq6cndsgq4ptrynjta .error-text{fill:#ddd;stroke:#ddd;}#mq6cndsgq4ptrynjta .edge-thickness-normal{stroke-width:1px;}#mq6cndsgq4ptrynjta .edge-thickness-thick{stroke-width:3.5px;}#mq6cndsgq4ptrynjta .edge-pattern-solid{stroke-dasharray:0;}#mq6cndsgq4ptrynjta .edge-thickness-invisible{stroke-width:0;fill:none;}#mq6cndsgq4ptrynjta .edge-pattern-dashed{stroke-dasharray:3;}#mq6cndsgq4ptrynjta .edge-pattern-dotted{stroke-dasharray:2;}#mq6cndsgq4ptrynjta .marker{fill:lightgrey;stroke:lightgrey;}#mq6cndsgq4ptrynjta .marker.cross{stroke:lightgrey;}#mq6cndsgq4ptrynjta svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mq6cndsgq4ptrynjta p{margin:0;}#mq6cndsgq4ptrynjta .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#ccc;}#mq6cndsgq4ptrynjta .cluster-label text{fill:#F9FFFE;}#mq6cndsgq4ptrynjta .cluster-label span{color:#F9FFFE;}#mq6cndsgq4ptrynjta .cluster-label span p{background-color:transparent;}#mq6cndsgq4ptrynjta .label text,#mq6cndsgq4ptrynjta span{fill:#ccc;color:#ccc;}#mq6cndsgq4ptrynjta .node rect,#mq6cndsgq4ptrynjta .node circle,#mq6cndsgq4ptrynjta .node ellipse,#mq6cndsgq4ptrynjta .node polygon,#mq6cndsgq4ptrynjta .node path{fill:#1f2020;stroke:#ccc;stroke-width:1px;}#mq6cndsgq4ptrynjta .rough-node .label text,#mq6cndsgq4ptrynjta .node .label text,#mq6cndsgq4ptrynjta .image-shape .label,#mq6cndsgq4ptrynjta .icon-shape .label{text-anchor:middle;}#mq6cndsgq4ptrynjta .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mq6cndsgq4ptrynjta .rough-node .label,#mq6cndsgq4ptrynjta .node .label,#mq6cndsgq4ptrynjta .image-shape .label,#mq6cndsgq4ptrynjta .icon-shape .label{text-align:center;}#mq6cndsgq4ptrynjta .node.clickable{cursor:pointer;}#mq6cndsgq4ptrynjta .root .anchor path{fill:lightgrey!important;stroke-width:0;stroke:lightgrey;}#mq6cndsgq4ptrynjta .arrowheadPath{fill:lightgrey;}#mq6cndsgq4ptrynjta .edgePath .path{stroke:lightgrey;stroke-width:2.0px;}#mq6cndsgq4ptrynjta .flowchart-link{stroke:lightgrey;fill:none;}#mq6cndsgq4ptrynjta .edgeLabel{background-color:hsl(0, 0%, 34.4117647059%);text-align:center;}#mq6cndsgq4ptrynjta .edgeLabel p{background-color:hsl(0, 0%, 34.4117647059%);}#mq6cndsgq4ptrynjta .edgeLabel rect{opacity:0.5;background-color:hsl(0, 0%, 34.4117647059%);fill:hsl(0, 0%, 34.4117647059%);}#mq6cndsgq4ptrynjta .labelBkg{background-color:rgba(87.75, 87.75, 87.75, 0.5);}#mq6cndsgq4ptrynjta .cluster rect{fill:hsl(180, 1.5873015873%, 28.3529411765%);stroke:rgba(255, 255, 255, 0.25);stroke-width:1px;}#mq6cndsgq4ptrynjta .cluster text{fill:#F9FFFE;}#mq6cndsgq4ptrynjta .cluster span{color:#F9FFFE;}#mq6cndsgq4ptrynjta 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;}#mq6cndsgq4ptrynjta .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#ccc;}#mq6cndsgq4ptrynjta rect.text{fill:none;stroke-width:0;}#mq6cndsgq4ptrynjta .icon-shape,#mq6cndsgq4ptrynjta .image-shape{background-color:hsl(0, 0%, 34.4117647059%);text-align:center;}#mq6cndsgq4ptrynjta .icon-shape p,#mq6cndsgq4ptrynjta .image-shape p{background-color:hsl(0, 0%, 34.4117647059%);padding:2px;}#mq6cndsgq4ptrynjta .icon-shape rect,#mq6cndsgq4ptrynjta .image-shape rect{opacity:0.5;background-color:hsl(0, 0%, 34.4117647059%);fill:hsl(0, 0%, 34.4117647059%);}#mq6cndsgq4ptrynjta .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mq6cndsgq4ptrynjta .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mq6cndsgq4ptrynjta :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}MethodArgumentTypeMismatchExceptionHandlerMethodValidationExceptionMethodArgumentNotValidExceptionHttpMessageNotReadableExceptionBizErrorBizWarningBizPublicKeyErrorUnauthorizedErrorHttpRequestMethodNotSupportedExceptionNoResourceFoundExceptionClientAbortExceptionExceptionController抛出异常异常类型参数类型不匹配参数校验异常参数校验异常请求参数格式错误业务异常业务警告公钥错误认证异常请求方法不支持资源未找到客户端断开默认异常处理返回 badRequest返回 business code返回 401 UNAUTHORIZED返回 405 METHOD_NOT_ALLOWED返回 404 NOT_FOUND静默处理返回 500 INTERNAL_SERVER_ERRORLogBus记录日志3.2 日志管理设计 日志总线架构 #mq6cndsgbjsbg0pk58v{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;}}#mq6cndsgbjsbg0pk58v .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mq6cndsgbjsbg0pk58v .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mq6cndsgbjsbg0pk58v .error-icon{fill:#a44141;}#mq6cndsgbjsbg0pk58v .error-text{fill:#ddd;stroke:#ddd;}#mq6cndsgbjsbg0pk58v .edge-thickness-normal{stroke-width:1px;}#mq6cndsgbjsbg0pk58v .edge-thickness-thick{stroke-width:3.5px;}#mq6cndsgbjsbg0pk58v .edge-pattern-solid{stroke-dasharray:0;}#mq6cndsgbjsbg0pk58v .edge-thickness-invisible{stroke-width:0;fill:none;}#mq6cndsgbjsbg0pk58v .edge-pattern-dashed{stroke-dasharray:3;}#mq6cndsgbjsbg0pk58v .edge-pattern-dotted{stroke-dasharray:2;}#mq6cndsgbjsbg0pk58v .marker{fill:lightgrey;stroke:lightgrey;}#mq6cndsgbjsbg0pk58v .marker.cross{stroke:lightgrey;}#mq6cndsgbjsbg0pk58v svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mq6cndsgbjsbg0pk58v p{margin:0;}#mq6cndsgbjsbg0pk58v .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#ccc;}#mq6cndsgbjsbg0pk58v .cluster-label text{fill:#F9FFFE;}#mq6cndsgbjsbg0pk58v .cluster-label span{color:#F9FFFE;}#mq6cndsgbjsbg0pk58v .cluster-label span p{background-color:transparent;}#mq6cndsgbjsbg0pk58v .label text,#mq6cndsgbjsbg0pk58v span{fill:#ccc;color:#ccc;}#mq6cndsgbjsbg0pk58v .node rect,#mq6cndsgbjsbg0pk58v .node circle,#mq6cndsgbjsbg0pk58v .node ellipse,#mq6cndsgbjsbg0pk58v .node polygon,#mq6cndsgbjsbg0pk58v .node path{fill:#1f2020;stroke:#ccc;stroke-width:1px;}#mq6cndsgbjsbg0pk58v .rough-node .label text,#mq6cndsgbjsbg0pk58v .node .label text,#mq6cndsgbjsbg0pk58v .image-shape .label,#mq6cndsgbjsbg0pk58v .icon-shape .label{text-anchor:middle;}#mq6cndsgbjsbg0pk58v .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mq6cndsgbjsbg0pk58v .rough-node .label,#mq6cndsgbjsbg0pk58v .node .label,#mq6cndsgbjsbg0pk58v .image-shape .label,#mq6cndsgbjsbg0pk58v .icon-shape .label{text-align:center;}#mq6cndsgbjsbg0pk58v .node.clickable{cursor:pointer;}#mq6cndsgbjsbg0pk58v .root .anchor path{fill:lightgrey!important;stroke-width:0;stroke:lightgrey;}#mq6cndsgbjsbg0pk58v .arrowheadPath{fill:lightgrey;}#mq6cndsgbjsbg0pk58v .edgePath .path{stroke:lightgrey;stroke-width:2.0px;}#mq6cndsgbjsbg0pk58v .flowchart-link{stroke:lightgrey;fill:none;}#mq6cndsgbjsbg0pk58v .edgeLabel{background-color:hsl(0, 0%, 34.4117647059%);text-align:center;}#mq6cndsgbjsbg0pk58v .edgeLabel p{background-color:hsl(0, 0%, 34.4117647059%);}#mq6cndsgbjsbg0pk58v .edgeLabel rect{opacity:0.5;background-color:hsl(0, 0%, 34.4117647059%);fill:hsl(0, 0%, 34.4117647059%);}#mq6cndsgbjsbg0pk58v .labelBkg{background-color:rgba(87.75, 87.75, 87.75, 0.5);}#mq6cndsgbjsbg0pk58v .cluster rect{fill:hsl(180, 1.5873015873%, 28.3529411765%);stroke:rgba(255, 255, 255, 0.25);stroke-width:1px;}#mq6cndsgbjsbg0pk58v .cluster text{fill:#F9FFFE;}#mq6cndsgbjsbg0pk58v .cluster span{color:#F9FFFE;}#mq6cndsgbjsbg0pk58v 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;}#mq6cndsgbjsbg0pk58v .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#ccc;}#mq6cndsgbjsbg0pk58v rect.text{fill:none;stroke-width:0;}#mq6cndsgbjsbg0pk58v .icon-shape,#mq6cndsgbjsbg0pk58v .image-shape{background-color:hsl(0, 0%, 34.4117647059%);text-align:center;}#mq6cndsgbjsbg0pk58v .icon-shape p,#mq6cndsgbjsbg0pk58v .image-shape p{background-color:hsl(0, 0%, 34.4117647059%);padding:2px;}#mq6cndsgbjsbg0pk58v .icon-shape rect,#mq6cndsgbjsbg0pk58v .image-shape rect{opacity:0.5;background-color:hsl(0, 0%, 34.4117647059%);fill:hsl(0, 0%, 34.4117647059%);}#mq6cndsgbjsbg0pk58v .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mq6cndsgbjsbg0pk58v .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mq6cndsgbjsbg0pk58v :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}是否是否否是日志产生方LogBus.init设置日志级别设置日志类型设置标题附加数据data附加异常errorsave创建虚拟线程格式化堆栈信息是否打印?格式化日志输出到控制台跳过打印日志级别>=WARN?必须保存日志logTrack.save?跳过保存处理日志超长截断处理异常信息获取所有LogBusInterface逐个调用save方法日志追踪设计 #mq6cndsgq15p5c1hbg9{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;}}#mq6cndsgq15p5c1hbg9 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mq6cndsgq15p5c1hbg9 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mq6cndsgq15p5c1hbg9 .error-icon{fill:#a44141;}#mq6cndsgq15p5c1hbg9 .error-text{fill:#ddd;stroke:#ddd;}#mq6cndsgq15p5c1hbg9 .edge-thickness-normal{stroke-width:1px;}#mq6cndsgq15p5c1hbg9 .edge-thickness-thick{stroke-width:3.5px;}#mq6cndsgq15p5c1hbg9 .edge-pattern-solid{stroke-dasharray:0;}#mq6cndsgq15p5c1hbg9 .edge-thickness-invisible{stroke-width:0;fill:none;}#mq6cndsgq15p5c1hbg9 .edge-pattern-dashed{stroke-dasharray:3;}#mq6cndsgq15p5c1hbg9 .edge-pattern-dotted{stroke-dasharray:2;}#mq6cndsgq15p5c1hbg9 .marker{fill:lightgrey;stroke:lightgrey;}#mq6cndsgq15p5c1hbg9 .marker.cross{stroke:lightgrey;}#mq6cndsgq15p5c1hbg9 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mq6cndsgq15p5c1hbg9 p{margin:0;}#mq6cndsgq15p5c1hbg9 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#ccc;}#mq6cndsgq15p5c1hbg9 .cluster-label text{fill:#F9FFFE;}#mq6cndsgq15p5c1hbg9 .cluster-label span{color:#F9FFFE;}#mq6cndsgq15p5c1hbg9 .cluster-label span p{background-color:transparent;}#mq6cndsgq15p5c1hbg9 .label text,#mq6cndsgq15p5c1hbg9 span{fill:#ccc;color:#ccc;}#mq6cndsgq15p5c1hbg9 .node rect,#mq6cndsgq15p5c1hbg9 .node circle,#mq6cndsgq15p5c1hbg9 .node ellipse,#mq6cndsgq15p5c1hbg9 .node polygon,#mq6cndsgq15p5c1hbg9 .node path{fill:#1f2020;stroke:#ccc;stroke-width:1px;}#mq6cndsgq15p5c1hbg9 .rough-node .label text,#mq6cndsgq15p5c1hbg9 .node .label text,#mq6cndsgq15p5c1hbg9 .image-shape .label,#mq6cndsgq15p5c1hbg9 .icon-shape .label{text-anchor:middle;}#mq6cndsgq15p5c1hbg9 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mq6cndsgq15p5c1hbg9 .rough-node .label,#mq6cndsgq15p5c1hbg9 .node .label,#mq6cndsgq15p5c1hbg9 .image-shape .label,#mq6cndsgq15p5c1hbg9 .icon-shape .label{text-align:center;}#mq6cndsgq15p5c1hbg9 .node.clickable{cursor:pointer;}#mq6cndsgq15p5c1hbg9 .root .anchor path{fill:lightgrey!important;stroke-width:0;stroke:lightgrey;}#mq6cndsgq15p5c1hbg9 .arrowheadPath{fill:lightgrey;}#mq6cndsgq15p5c1hbg9 .edgePath .path{stroke:lightgrey;stroke-width:2.0px;}#mq6cndsgq15p5c1hbg9 .flowchart-link{stroke:lightgrey;fill:none;}#mq6cndsgq15p5c1hbg9 .edgeLabel{background-color:hsl(0, 0%, 34.4117647059%);text-align:center;}#mq6cndsgq15p5c1hbg9 .edgeLabel p{background-color:hsl(0, 0%, 34.4117647059%);}#mq6cndsgq15p5c1hbg9 .edgeLabel rect{opacity:0.5;background-color:hsl(0, 0%, 34.4117647059%);fill:hsl(0, 0%, 34.4117647059%);}#mq6cndsgq15p5c1hbg9 .labelBkg{background-color:rgba(87.75, 87.75, 87.75, 0.5);}#mq6cndsgq15p5c1hbg9 .cluster rect{fill:hsl(180, 1.5873015873%, 28.3529411765%);stroke:rgba(255, 255, 255, 0.25);stroke-width:1px;}#mq6cndsgq15p5c1hbg9 .cluster text{fill:#F9FFFE;}#mq6cndsgq15p5c1hbg9 .cluster span{color:#F9FFFE;}#mq6cndsgq15p5c1hbg9 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;}#mq6cndsgq15p5c1hbg9 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#ccc;}#mq6cndsgq15p5c1hbg9 rect.text{fill:none;stroke-width:0;}#mq6cndsgq15p5c1hbg9 .icon-shape,#mq6cndsgq15p5c1hbg9 .image-shape{background-color:hsl(0, 0%, 34.4117647059%);text-align:center;}#mq6cndsgq15p5c1hbg9 .icon-shape p,#mq6cndsgq15p5c1hbg9 .image-shape p{background-color:hsl(0, 0%, 34.4117647059%);padding:2px;}#mq6cndsgq15p5c1hbg9 .icon-shape rect,#mq6cndsgq15p5c1hbg9 .image-shape rect{opacity:0.5;background-color:hsl(0, 0%, 34.4117647059%);fill:hsl(0, 0%, 34.4117647059%);}#mq6cndsgq15p5c1hbg9 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mq6cndsgq15p5c1hbg9 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mq6cndsgq15p5c1hbg9 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}HTTP请求到达LogTrackFilterOrder:100创建LogTrack生成唯一ID生成traceId设置type=MAIN设置save=true绑定到ScopedValue子线程/虚拟线程从父线程获取LogTrack创建子LogTrack继承traceId设置type=THREAD绑定到新ScopedValueLogBus使用LogTrackHolder获取日志类型枚举 日志类型 说明 OTHER 其他 VIRTUAL_THREAD 虚拟线程 REDIS Redis操作 MYBATIS MyBatis操作 MQ 消息队列 ELASTICSEARCH Elasticsearch操作 SENTINEL Sentinel操作 STORAGE 存储操作 OPT_LOG 操作日志 HTTP HTTP操作 HTTP_REQUEST HTTP请求 HTTP_RESPONSE HTTP响应 CLOUD_REQUEST 云端请求 CLOUD_RESPONSE 云端响应 CONTROLLER Controller异常 TASK 任务操作 JOB 定时任务 RISK 风险操作 3.3 缓存设计 Redis服务架构 #mq6cndsgbhyih8h0jid{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;}}#mq6cndsgbhyih8h0jid .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mq6cndsgbhyih8h0jid .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mq6cndsgbhyih8h0jid .error-icon{fill:#a44141;}#mq6cndsgbhyih8h0jid .error-text{fill:#ddd;stroke:#ddd;}#mq6cndsgbhyih8h0jid .edge-thickness-normal{stroke-width:1px;}#mq6cndsgbhyih8h0jid .edge-thickness-thick{stroke-width:3.5px;}#mq6cndsgbhyih8h0jid .edge-pattern-solid{stroke-dasharray:0;}#mq6cndsgbhyih8h0jid .edge-thickness-invisible{stroke-width:0;fill:none;}#mq6cndsgbhyih8h0jid .edge-pattern-dashed{stroke-dasharray:3;}#mq6cndsgbhyih8h0jid .edge-pattern-dotted{stroke-dasharray:2;}#mq6cndsgbhyih8h0jid .marker{fill:lightgrey;stroke:lightgrey;}#mq6cndsgbhyih8h0jid .marker.cross{stroke:lightgrey;}#mq6cndsgbhyih8h0jid svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mq6cndsgbhyih8h0jid p{margin:0;}#mq6cndsgbhyih8h0jid .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#ccc;}#mq6cndsgbhyih8h0jid .cluster-label text{fill:#F9FFFE;}#mq6cndsgbhyih8h0jid .cluster-label span{color:#F9FFFE;}#mq6cndsgbhyih8h0jid .cluster-label span p{background-color:transparent;}#mq6cndsgbhyih8h0jid .label text,#mq6cndsgbhyih8h0jid span{fill:#ccc;color:#ccc;}#mq6cndsgbhyih8h0jid .node rect,#mq6cndsgbhyih8h0jid .node circle,#mq6cndsgbhyih8h0jid .node ellipse,#mq6cndsgbhyih8h0jid .node polygon,#mq6cndsgbhyih8h0jid .node path{fill:#1f2020;stroke:#ccc;stroke-width:1px;}#mq6cndsgbhyih8h0jid .rough-node .label text,#mq6cndsgbhyih8h0jid .node .label text,#mq6cndsgbhyih8h0jid .image-shape .label,#mq6cndsgbhyih8h0jid .icon-shape .label{text-anchor:middle;}#mq6cndsgbhyih8h0jid .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mq6cndsgbhyih8h0jid .rough-node .label,#mq6cndsgbhyih8h0jid .node .label,#mq6cndsgbhyih8h0jid .image-shape .label,#mq6cndsgbhyih8h0jid .icon-shape .label{text-align:center;}#mq6cndsgbhyih8h0jid .node.clickable{cursor:pointer;}#mq6cndsgbhyih8h0jid .root .anchor path{fill:lightgrey!important;stroke-width:0;stroke:lightgrey;}#mq6cndsgbhyih8h0jid .arrowheadPath{fill:lightgrey;}#mq6cndsgbhyih8h0jid .edgePath .path{stroke:lightgrey;stroke-width:2.0px;}#mq6cndsgbhyih8h0jid .flowchart-link{stroke:lightgrey;fill:none;}#mq6cndsgbhyih8h0jid .edgeLabel{background-color:hsl(0, 0%, 34.4117647059%);text-align:center;}#mq6cndsgbhyih8h0jid .edgeLabel p{background-color:hsl(0, 0%, 34.4117647059%);}#mq6cndsgbhyih8h0jid .edgeLabel rect{opacity:0.5;background-color:hsl(0, 0%, 34.4117647059%);fill:hsl(0, 0%, 34.4117647059%);}#mq6cndsgbhyih8h0jid .labelBkg{background-color:rgba(87.75, 87.75, 87.75, 0.5);}#mq6cndsgbhyih8h0jid .cluster rect{fill:hsl(180, 1.5873015873%, 28.3529411765%);stroke:rgba(255, 255, 255, 0.25);stroke-width:1px;}#mq6cndsgbhyih8h0jid .cluster text{fill:#F9FFFE;}#mq6cndsgbhyih8h0jid .cluster span{color:#F9FFFE;}#mq6cndsgbhyih8h0jid 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;}#mq6cndsgbhyih8h0jid .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#ccc;}#mq6cndsgbhyih8h0jid rect.text{fill:none;stroke-width:0;}#mq6cndsgbhyih8h0jid .icon-shape,#mq6cndsgbhyih8h0jid .image-shape{background-color:hsl(0, 0%, 34.4117647059%);text-align:center;}#mq6cndsgbhyih8h0jid .icon-shape p,#mq6cndsgbhyih8h0jid .image-shape p{background-color:hsl(0, 0%, 34.4117647059%);padding:2px;}#mq6cndsgbhyih8h0jid .icon-shape rect,#mq6cndsgbhyih8h0jid .image-shape rect{opacity:0.5;background-color:hsl(0, 0%, 34.4117647059%);fill:hsl(0, 0%, 34.4117647059%);}#mq6cndsgbhyih8h0jid .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mq6cndsgbhyih8h0jid .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mq6cndsgbhyih8h0jid :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}底层序列化RedisServiceString操作set / get / del / incrKey操作expire / persist / renamegetByPattern / getKey分布式锁tryLock / releaseLockLua脚本保证原子性Hash操作hashPut / hashGethashEntries / hashDeletehashExists原子操作setNx / hashPut带过期FastJSON2序列化String直接存储Object序列化为JSONStringRedisTemplate字符串操作RedisTemplate分布式锁DefaultRedisScriptLua脚本3.4 消息队列设计 消息总线架构 #mq6cndsgvj4mw6tvfyd{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;}}#mq6cndsgvj4mw6tvfyd .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mq6cndsgvj4mw6tvfyd .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mq6cndsgvj4mw6tvfyd .error-icon{fill:#a44141;}#mq6cndsgvj4mw6tvfyd .error-text{fill:#ddd;stroke:#ddd;}#mq6cndsgvj4mw6tvfyd .edge-thickness-normal{stroke-width:1px;}#mq6cndsgvj4mw6tvfyd .edge-thickness-thick{stroke-width:3.5px;}#mq6cndsgvj4mw6tvfyd .edge-pattern-solid{stroke-dasharray:0;}#mq6cndsgvj4mw6tvfyd .edge-thickness-invisible{stroke-width:0;fill:none;}#mq6cndsgvj4mw6tvfyd .edge-pattern-dashed{stroke-dasharray:3;}#mq6cndsgvj4mw6tvfyd .edge-pattern-dotted{stroke-dasharray:2;}#mq6cndsgvj4mw6tvfyd .marker{fill:lightgrey;stroke:lightgrey;}#mq6cndsgvj4mw6tvfyd .marker.cross{stroke:lightgrey;}#mq6cndsgvj4mw6tvfyd svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mq6cndsgvj4mw6tvfyd p{margin:0;}#mq6cndsgvj4mw6tvfyd .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#ccc;}#mq6cndsgvj4mw6tvfyd .cluster-label text{fill:#F9FFFE;}#mq6cndsgvj4mw6tvfyd .cluster-label span{color:#F9FFFE;}#mq6cndsgvj4mw6tvfyd .cluster-label span p{background-color:transparent;}#mq6cndsgvj4mw6tvfyd .label text,#mq6cndsgvj4mw6tvfyd span{fill:#ccc;color:#ccc;}#mq6cndsgvj4mw6tvfyd .node rect,#mq6cndsgvj4mw6tvfyd .node circle,#mq6cndsgvj4mw6tvfyd .node ellipse,#mq6cndsgvj4mw6tvfyd .node polygon,#mq6cndsgvj4mw6tvfyd .node path{fill:#1f2020;stroke:#ccc;stroke-width:1px;}#mq6cndsgvj4mw6tvfyd .rough-node .label text,#mq6cndsgvj4mw6tvfyd .node .label text,#mq6cndsgvj4mw6tvfyd .image-shape .label,#mq6cndsgvj4mw6tvfyd .icon-shape .label{text-anchor:middle;}#mq6cndsgvj4mw6tvfyd .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mq6cndsgvj4mw6tvfyd .rough-node .label,#mq6cndsgvj4mw6tvfyd .node .label,#mq6cndsgvj4mw6tvfyd .image-shape .label,#mq6cndsgvj4mw6tvfyd .icon-shape .label{text-align:center;}#mq6cndsgvj4mw6tvfyd .node.clickable{cursor:pointer;}#mq6cndsgvj4mw6tvfyd .root .anchor path{fill:lightgrey!important;stroke-width:0;stroke:lightgrey;}#mq6cndsgvj4mw6tvfyd .arrowheadPath{fill:lightgrey;}#mq6cndsgvj4mw6tvfyd .edgePath .path{stroke:lightgrey;stroke-width:2.0px;}#mq6cndsgvj4mw6tvfyd .flowchart-link{stroke:lightgrey;fill:none;}#mq6cndsgvj4mw6tvfyd .edgeLabel{background-color:hsl(0, 0%, 34.4117647059%);text-align:center;}#mq6cndsgvj4mw6tvfyd .edgeLabel p{background-color:hsl(0, 0%, 34.4117647059%);}#mq6cndsgvj4mw6tvfyd .edgeLabel rect{opacity:0.5;background-color:hsl(0, 0%, 34.4117647059%);fill:hsl(0, 0%, 34.4117647059%);}#mq6cndsgvj4mw6tvfyd .labelBkg{background-color:rgba(87.75, 87.75, 87.75, 0.5);}#mq6cndsgvj4mw6tvfyd .cluster rect{fill:hsl(180, 1.5873015873%, 28.3529411765%);stroke:rgba(255, 255, 255, 0.25);stroke-width:1px;}#mq6cndsgvj4mw6tvfyd .cluster text{fill:#F9FFFE;}#mq6cndsgvj4mw6tvfyd .cluster span{color:#F9FFFE;}#mq6cndsgvj4mw6tvfyd 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;}#mq6cndsgvj4mw6tvfyd .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#ccc;}#mq6cndsgvj4mw6tvfyd rect.text{fill:none;stroke-width:0;}#mq6cndsgvj4mw6tvfyd .icon-shape,#mq6cndsgvj4mw6tvfyd .image-shape{background-color:hsl(0, 0%, 34.4117647059%);text-align:center;}#mq6cndsgvj4mw6tvfyd .icon-shape p,#mq6cndsgvj4mw6tvfyd .image-shape p{background-color:hsl(0, 0%, 34.4117647059%);padding:2px;}#mq6cndsgvj4mw6tvfyd .icon-shape rect,#mq6cndsgvj4mw6tvfyd .image-shape rect{opacity:0.5;background-color:hsl(0, 0%, 34.4117647059%);fill:hsl(0, 0%, 34.4117647059%);}#mq6cndsgvj4mw6tvfyd .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mq6cndsgvj4mw6tvfyd .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mq6cndsgvj4mw6tvfyd :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}是否成功失败业务代码调用MqBus.push获取BaseMqHandle实现是否存在实现?调用push方法抛出异常RabbitMqHandle.push消息序列化MqMessageUtils.toRabbitTemplate发送RabbitMQ Broker消费者接收消息反序列化MqMessageUtils.fromBaseMessageHandlebaseHandleMessage业务处理消息确认ACKBaseErrorHandle错误处理消息初始化流程 #mq6cndsgsan56liqjw{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;}}#mq6cndsgsan56liqjw .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mq6cndsgsan56liqjw .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mq6cndsgsan56liqjw .error-icon{fill:#a44141;}#mq6cndsgsan56liqjw .error-text{fill:#ddd;stroke:#ddd;}#mq6cndsgsan56liqjw .edge-thickness-normal{stroke-width:1px;}#mq6cndsgsan56liqjw .edge-thickness-thick{stroke-width:3.5px;}#mq6cndsgsan56liqjw .edge-pattern-solid{stroke-dasharray:0;}#mq6cndsgsan56liqjw .edge-thickness-invisible{stroke-width:0;fill:none;}#mq6cndsgsan56liqjw .edge-pattern-dashed{stroke-dasharray:3;}#mq6cndsgsan56liqjw .edge-pattern-dotted{stroke-dasharray:2;}#mq6cndsgsan56liqjw .marker{fill:lightgrey;stroke:lightgrey;}#mq6cndsgsan56liqjw .marker.cross{stroke:lightgrey;}#mq6cndsgsan56liqjw svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mq6cndsgsan56liqjw p{margin:0;}#mq6cndsgsan56liqjw .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#ccc;}#mq6cndsgsan56liqjw .cluster-label text{fill:#F9FFFE;}#mq6cndsgsan56liqjw .cluster-label span{color:#F9FFFE;}#mq6cndsgsan56liqjw .cluster-label span p{background-color:transparent;}#mq6cndsgsan56liqjw .label text,#mq6cndsgsan56liqjw span{fill:#ccc;color:#ccc;}#mq6cndsgsan56liqjw .node rect,#mq6cndsgsan56liqjw .node circle,#mq6cndsgsan56liqjw .node ellipse,#mq6cndsgsan56liqjw .node polygon,#mq6cndsgsan56liqjw .node path{fill:#1f2020;stroke:#ccc;stroke-width:1px;}#mq6cndsgsan56liqjw .rough-node .label text,#mq6cndsgsan56liqjw .node .label text,#mq6cndsgsan56liqjw .image-shape .label,#mq6cndsgsan56liqjw .icon-shape .label{text-anchor:middle;}#mq6cndsgsan56liqjw .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mq6cndsgsan56liqjw .rough-node .label,#mq6cndsgsan56liqjw .node .label,#mq6cndsgsan56liqjw .image-shape .label,#mq6cndsgsan56liqjw .icon-shape .label{text-align:center;}#mq6cndsgsan56liqjw .node.clickable{cursor:pointer;}#mq6cndsgsan56liqjw .root .anchor path{fill:lightgrey!important;stroke-width:0;stroke:lightgrey;}#mq6cndsgsan56liqjw .arrowheadPath{fill:lightgrey;}#mq6cndsgsan56liqjw .edgePath .path{stroke:lightgrey;stroke-width:2.0px;}#mq6cndsgsan56liqjw .flowchart-link{stroke:lightgrey;fill:none;}#mq6cndsgsan56liqjw .edgeLabel{background-color:hsl(0, 0%, 34.4117647059%);text-align:center;}#mq6cndsgsan56liqjw .edgeLabel p{background-color:hsl(0, 0%, 34.4117647059%);}#mq6cndsgsan56liqjw .edgeLabel rect{opacity:0.5;background-color:hsl(0, 0%, 34.4117647059%);fill:hsl(0, 0%, 34.4117647059%);}#mq6cndsgsan56liqjw .labelBkg{background-color:rgba(87.75, 87.75, 87.75, 0.5);}#mq6cndsgsan56liqjw .cluster rect{fill:hsl(180, 1.5873015873%, 28.3529411765%);stroke:rgba(255, 255, 255, 0.25);stroke-width:1px;}#mq6cndsgsan56liqjw .cluster text{fill:#F9FFFE;}#mq6cndsgsan56liqjw .cluster span{color:#F9FFFE;}#mq6cndsgsan56liqjw 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;}#mq6cndsgsan56liqjw .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#ccc;}#mq6cndsgsan56liqjw rect.text{fill:none;stroke-width:0;}#mq6cndsgsan56liqjw .icon-shape,#mq6cndsgsan56liqjw .image-shape{background-color:hsl(0, 0%, 34.4117647059%);text-align:center;}#mq6cndsgsan56liqjw .icon-shape p,#mq6cndsgsan56liqjw .image-shape p{background-color:hsl(0, 0%, 34.4117647059%);padding:2px;}#mq6cndsgsan56liqjw .icon-shape rect,#mq6cndsgsan56liqjw .image-shape rect{opacity:0.5;background-color:hsl(0, 0%, 34.4117647059%);fill:hsl(0, 0%, 34.4117647059%);}#mq6cndsgsan56liqjw .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mq6cndsgsan56liqjw .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mq6cndsgsan56liqjw :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}应用启动InitMqApplicationRunner Order:50获取所有BaseMqHandle实现逐个调用initQueue初始化队列添加监听器addListen消息队列就绪3.5 存储设计 存储抽象架构 #mq6cndsgpnjtpssl6dl{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;}}#mq6cndsgpnjtpssl6dl .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mq6cndsgpnjtpssl6dl .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mq6cndsgpnjtpssl6dl .error-icon{fill:#a44141;}#mq6cndsgpnjtpssl6dl .error-text{fill:#ddd;stroke:#ddd;}#mq6cndsgpnjtpssl6dl .edge-thickness-normal{stroke-width:1px;}#mq6cndsgpnjtpssl6dl .edge-thickness-thick{stroke-width:3.5px;}#mq6cndsgpnjtpssl6dl .edge-pattern-solid{stroke-dasharray:0;}#mq6cndsgpnjtpssl6dl .edge-thickness-invisible{stroke-width:0;fill:none;}#mq6cndsgpnjtpssl6dl .edge-pattern-dashed{stroke-dasharray:3;}#mq6cndsgpnjtpssl6dl .edge-pattern-dotted{stroke-dasharray:2;}#mq6cndsgpnjtpssl6dl .marker{fill:lightgrey;stroke:lightgrey;}#mq6cndsgpnjtpssl6dl .marker.cross{stroke:lightgrey;}#mq6cndsgpnjtpssl6dl svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mq6cndsgpnjtpssl6dl p{margin:0;}#mq6cndsgpnjtpssl6dl .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#ccc;}#mq6cndsgpnjtpssl6dl .cluster-label text{fill:#F9FFFE;}#mq6cndsgpnjtpssl6dl .cluster-label span{color:#F9FFFE;}#mq6cndsgpnjtpssl6dl .cluster-label span p{background-color:transparent;}#mq6cndsgpnjtpssl6dl .label text,#mq6cndsgpnjtpssl6dl span{fill:#ccc;color:#ccc;}#mq6cndsgpnjtpssl6dl .node rect,#mq6cndsgpnjtpssl6dl .node circle,#mq6cndsgpnjtpssl6dl .node ellipse,#mq6cndsgpnjtpssl6dl .node polygon,#mq6cndsgpnjtpssl6dl .node path{fill:#1f2020;stroke:#ccc;stroke-width:1px;}#mq6cndsgpnjtpssl6dl .rough-node .label text,#mq6cndsgpnjtpssl6dl .node .label text,#mq6cndsgpnjtpssl6dl .image-shape .label,#mq6cndsgpnjtpssl6dl .icon-shape .label{text-anchor:middle;}#mq6cndsgpnjtpssl6dl .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mq6cndsgpnjtpssl6dl .rough-node .label,#mq6cndsgpnjtpssl6dl .node .label,#mq6cndsgpnjtpssl6dl .image-shape .label,#mq6cndsgpnjtpssl6dl .icon-shape .label{text-align:center;}#mq6cndsgpnjtpssl6dl .node.clickable{cursor:pointer;}#mq6cndsgpnjtpssl6dl .root .anchor path{fill:lightgrey!important;stroke-width:0;stroke:lightgrey;}#mq6cndsgpnjtpssl6dl .arrowheadPath{fill:lightgrey;}#mq6cndsgpnjtpssl6dl .edgePath .path{stroke:lightgrey;stroke-width:2.0px;}#mq6cndsgpnjtpssl6dl .flowchart-link{stroke:lightgrey;fill:none;}#mq6cndsgpnjtpssl6dl .edgeLabel{background-color:hsl(0, 0%, 34.4117647059%);text-align:center;}#mq6cndsgpnjtpssl6dl .edgeLabel p{background-color:hsl(0, 0%, 34.4117647059%);}#mq6cndsgpnjtpssl6dl .edgeLabel rect{opacity:0.5;background-color:hsl(0, 0%, 34.4117647059%);fill:hsl(0, 0%, 34.4117647059%);}#mq6cndsgpnjtpssl6dl .labelBkg{background-color:rgba(87.75, 87.75, 87.75, 0.5);}#mq6cndsgpnjtpssl6dl .cluster rect{fill:hsl(180, 1.5873015873%, 28.3529411765%);stroke:rgba(255, 255, 255, 0.25);stroke-width:1px;}#mq6cndsgpnjtpssl6dl .cluster text{fill:#F9FFFE;}#mq6cndsgpnjtpssl6dl .cluster span{color:#F9FFFE;}#mq6cndsgpnjtpssl6dl 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;}#mq6cndsgpnjtpssl6dl .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#ccc;}#mq6cndsgpnjtpssl6dl rect.text{fill:none;stroke-width:0;}#mq6cndsgpnjtpssl6dl .icon-shape,#mq6cndsgpnjtpssl6dl .image-shape{background-color:hsl(0, 0%, 34.4117647059%);text-align:center;}#mq6cndsgpnjtpssl6dl .icon-shape p,#mq6cndsgpnjtpssl6dl .image-shape p{background-color:hsl(0, 0%, 34.4117647059%);padding:2px;}#mq6cndsgpnjtpssl6dl .icon-shape rect,#mq6cndsgpnjtpssl6dl .image-shape rect{opacity:0.5;background-color:hsl(0, 0%, 34.4117647059%);fill:hsl(0, 0%, 34.4117647059%);}#mq6cndsgpnjtpssl6dl .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mq6cndsgpnjtpssl6dl .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mq6cndsgpnjtpssl6dl :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}配置层实现层存储接口实现实现type=filetype=s3StorageService接口StorageServiceFileImpl本地文件存储StorageServiceS3ImplS3对象存储StorageConfig存储类型配置FileStorageConfig文件存储配置S3StorageConfigS3配置+S3ClientStorageService接口方法: 方法 说明 exists(String key) 判断文件是否存在 save(String key, InputStream data) 保存文件 get(String key) 获取文件输入流 del(String key) 删除文件 3.6 数据脱敏设计 脱敏注解 #mq6cw7t8d3fwiruff5m{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;}}#mq6cw7t8d3fwiruff5m .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mq6cw7t8d3fwiruff5m .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mq6cw7t8d3fwiruff5m .error-icon{fill:#a44141;}#mq6cw7t8d3fwiruff5m .error-text{fill:#ddd;stroke:#ddd;}#mq6cw7t8d3fwiruff5m .edge-thickness-normal{stroke-width:1px;}#mq6cw7t8d3fwiruff5m .edge-thickness-thick{stroke-width:3.5px;}#mq6cw7t8d3fwiruff5m .edge-pattern-solid{stroke-dasharray:0;}#mq6cw7t8d3fwiruff5m .edge-thickness-invisible{stroke-width:0;fill:none;}#mq6cw7t8d3fwiruff5m .edge-pattern-dashed{stroke-dasharray:3;}#mq6cw7t8d3fwiruff5m .edge-pattern-dotted{stroke-dasharray:2;}#mq6cw7t8d3fwiruff5m .marker{fill:lightgrey;stroke:lightgrey;}#mq6cw7t8d3fwiruff5m .marker.cross{stroke:lightgrey;}#mq6cw7t8d3fwiruff5m svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mq6cw7t8d3fwiruff5m p{margin:0;}#mq6cw7t8d3fwiruff5m .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#ccc;}#mq6cw7t8d3fwiruff5m .cluster-label text{fill:#F9FFFE;}#mq6cw7t8d3fwiruff5m .cluster-label span{color:#F9FFFE;}#mq6cw7t8d3fwiruff5m .cluster-label span p{background-color:transparent;}#mq6cw7t8d3fwiruff5m .label text,#mq6cw7t8d3fwiruff5m span{fill:#ccc;color:#ccc;}#mq6cw7t8d3fwiruff5m .node rect,#mq6cw7t8d3fwiruff5m .node circle,#mq6cw7t8d3fwiruff5m .node ellipse,#mq6cw7t8d3fwiruff5m .node polygon,#mq6cw7t8d3fwiruff5m .node path{fill:#1f2020;stroke:#ccc;stroke-width:1px;}#mq6cw7t8d3fwiruff5m .rough-node .label text,#mq6cw7t8d3fwiruff5m .node .label text,#mq6cw7t8d3fwiruff5m .image-shape .label,#mq6cw7t8d3fwiruff5m .icon-shape .label{text-anchor:middle;}#mq6cw7t8d3fwiruff5m .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mq6cw7t8d3fwiruff5m .rough-node .label,#mq6cw7t8d3fwiruff5m .node .label,#mq6cw7t8d3fwiruff5m .image-shape .label,#mq6cw7t8d3fwiruff5m .icon-shape .label{text-align:center;}#mq6cw7t8d3fwiruff5m .node.clickable{cursor:pointer;}#mq6cw7t8d3fwiruff5m .root .anchor path{fill:lightgrey!important;stroke-width:0;stroke:lightgrey;}#mq6cw7t8d3fwiruff5m .arrowheadPath{fill:lightgrey;}#mq6cw7t8d3fwiruff5m .edgePath .path{stroke:lightgrey;stroke-width:2.0px;}#mq6cw7t8d3fwiruff5m .flowchart-link{stroke:lightgrey;fill:none;}#mq6cw7t8d3fwiruff5m .edgeLabel{background-color:hsl(0, 0%, 34.4117647059%);text-align:center;}#mq6cw7t8d3fwiruff5m .edgeLabel p{background-color:hsl(0, 0%, 34.4117647059%);}#mq6cw7t8d3fwiruff5m .edgeLabel rect{opacity:0.5;background-color:hsl(0, 0%, 34.4117647059%);fill:hsl(0, 0%, 34.4117647059%);}#mq6cw7t8d3fwiruff5m .labelBkg{background-color:rgba(87.75, 87.75, 87.75, 0.5);}#mq6cw7t8d3fwiruff5m .cluster rect{fill:hsl(180, 1.5873015873%, 28.3529411765%);stroke:rgba(255, 255, 255, 0.25);stroke-width:1px;}#mq6cw7t8d3fwiruff5m .cluster text{fill:#F9FFFE;}#mq6cw7t8d3fwiruff5m .cluster span{color:#F9FFFE;}#mq6cw7t8d3fwiruff5m 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;}#mq6cw7t8d3fwiruff5m .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#ccc;}#mq6cw7t8d3fwiruff5m rect.text{fill:none;stroke-width:0;}#mq6cw7t8d3fwiruff5m .icon-shape,#mq6cw7t8d3fwiruff5m .image-shape{background-color:hsl(0, 0%, 34.4117647059%);text-align:center;}#mq6cw7t8d3fwiruff5m .icon-shape p,#mq6cw7t8d3fwiruff5m .image-shape p{background-color:hsl(0, 0%, 34.4117647059%);padding:2px;}#mq6cw7t8d3fwiruff5m .icon-shape rect,#mq6cw7t8d3fwiruff5m .image-shape rect{opacity:0.5;background-color:hsl(0, 0%, 34.4117647059%);fill:hsl(0, 0%, 34.4117647059%);}#mq6cw7t8d3fwiruff5m .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mq6cw7t8d3fwiruff5m .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mq6cw7t8d3fwiruff5m :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}CHINESE_NAMEID_CARDMOBILE_PHONEEMAILBANK_CARDPASSWORDADDRESSCUSTOM是否是否实体类字段标注 @MaskMaskType类型姓名脱敏张三 -> 张*身份证脱敏110101199001011234 -> 110101****1234手机号脱敏13812345678 -> 138****5678邮箱脱敏test @example.com -> t***@example.com银行卡脱敏密码脱敏全部替换为***地址脱敏自定义脱敏实现MaskCustom接口Jackson序列化MaskSerializerMaskIgnoreUtils是否忽略脱敏?返回原始值执行脱敏处理always=true?必须脱敏可通过Holder忽略3.7 过滤器链设计 #mq6cndsgf39ojtqwujh{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;}}#mq6cndsgf39ojtqwujh .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mq6cndsgf39ojtqwujh .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mq6cndsgf39ojtqwujh .error-icon{fill:#a44141;}#mq6cndsgf39ojtqwujh .error-text{fill:#ddd;stroke:#ddd;}#mq6cndsgf39ojtqwujh .edge-thickness-normal{stroke-width:1px;}#mq6cndsgf39ojtqwujh .edge-thickness-thick{stroke-width:3.5px;}#mq6cndsgf39ojtqwujh .edge-pattern-solid{stroke-dasharray:0;}#mq6cndsgf39ojtqwujh .edge-thickness-invisible{stroke-width:0;fill:none;}#mq6cndsgf39ojtqwujh .edge-pattern-dashed{stroke-dasharray:3;}#mq6cndsgf39ojtqwujh .edge-pattern-dotted{stroke-dasharray:2;}#mq6cndsgf39ojtqwujh .marker{fill:lightgrey;stroke:lightgrey;}#mq6cndsgf39ojtqwujh .marker.cross{stroke:lightgrey;}#mq6cndsgf39ojtqwujh svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mq6cndsgf39ojtqwujh p{margin:0;}#mq6cndsgf39ojtqwujh .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#ccc;}#mq6cndsgf39ojtqwujh .cluster-label text{fill:#F9FFFE;}#mq6cndsgf39ojtqwujh .cluster-label span{color:#F9FFFE;}#mq6cndsgf39ojtqwujh .cluster-label span p{background-color:transparent;}#mq6cndsgf39ojtqwujh .label text,#mq6cndsgf39ojtqwujh span{fill:#ccc;color:#ccc;}#mq6cndsgf39ojtqwujh .node rect,#mq6cndsgf39ojtqwujh .node circle,#mq6cndsgf39ojtqwujh .node ellipse,#mq6cndsgf39ojtqwujh .node polygon,#mq6cndsgf39ojtqwujh .node path{fill:#1f2020;stroke:#ccc;stroke-width:1px;}#mq6cndsgf39ojtqwujh .rough-node .label text,#mq6cndsgf39ojtqwujh .node .label text,#mq6cndsgf39ojtqwujh .image-shape .label,#mq6cndsgf39ojtqwujh .icon-shape .label{text-anchor:middle;}#mq6cndsgf39ojtqwujh .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mq6cndsgf39ojtqwujh .rough-node .label,#mq6cndsgf39ojtqwujh .node .label,#mq6cndsgf39ojtqwujh .image-shape .label,#mq6cndsgf39ojtqwujh .icon-shape .label{text-align:center;}#mq6cndsgf39ojtqwujh .node.clickable{cursor:pointer;}#mq6cndsgf39ojtqwujh .root .anchor path{fill:lightgrey!important;stroke-width:0;stroke:lightgrey;}#mq6cndsgf39ojtqwujh .arrowheadPath{fill:lightgrey;}#mq6cndsgf39ojtqwujh .edgePath .path{stroke:lightgrey;stroke-width:2.0px;}#mq6cndsgf39ojtqwujh .flowchart-link{stroke:lightgrey;fill:none;}#mq6cndsgf39ojtqwujh .edgeLabel{background-color:hsl(0, 0%, 34.4117647059%);text-align:center;}#mq6cndsgf39ojtqwujh .edgeLabel p{background-color:hsl(0, 0%, 34.4117647059%);}#mq6cndsgf39ojtqwujh .edgeLabel rect{opacity:0.5;background-color:hsl(0, 0%, 34.4117647059%);fill:hsl(0, 0%, 34.4117647059%);}#mq6cndsgf39ojtqwujh .labelBkg{background-color:rgba(87.75, 87.75, 87.75, 0.5);}#mq6cndsgf39ojtqwujh .cluster rect{fill:hsl(180, 1.5873015873%, 28.3529411765%);stroke:rgba(255, 255, 255, 0.25);stroke-width:1px;}#mq6cndsgf39ojtqwujh .cluster text{fill:#F9FFFE;}#mq6cndsgf39ojtqwujh .cluster span{color:#F9FFFE;}#mq6cndsgf39ojtqwujh 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;}#mq6cndsgf39ojtqwujh .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#ccc;}#mq6cndsgf39ojtqwujh rect.text{fill:none;stroke-width:0;}#mq6cndsgf39ojtqwujh .icon-shape,#mq6cndsgf39ojtqwujh .image-shape{background-color:hsl(0, 0%, 34.4117647059%);text-align:center;}#mq6cndsgf39ojtqwujh .icon-shape p,#mq6cndsgf39ojtqwujh .image-shape p{background-color:hsl(0, 0%, 34.4117647059%);padding:2px;}#mq6cndsgf39ojtqwujh .icon-shape rect,#mq6cndsgf39ojtqwujh .image-shape rect{opacity:0.5;background-color:hsl(0, 0%, 34.4117647059%);fill:hsl(0, 0%, 34.4117647059%);}#mq6cndsgf39ojtqwujh .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mq6cndsgf39ojtqwujh .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mq6cndsgf39ojtqwujh :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}是否HTTP请求Order:0SkipFilter路径在白名单中?跳过后续Filter标记跳过继续执行Order:100LogTrackFilter创建LogTrack绑定到ScopedValueOrder:101CommonFilter绑定CommonHolder到ScopedValueController处理请求3.8 任务总线设计 #mq6cndsg0t9xlk0k74ve{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;}}#mq6cndsg0t9xlk0k74ve .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mq6cndsg0t9xlk0k74ve .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mq6cndsg0t9xlk0k74ve .error-icon{fill:#a44141;}#mq6cndsg0t9xlk0k74ve .error-text{fill:#ddd;stroke:#ddd;}#mq6cndsg0t9xlk0k74ve .edge-thickness-normal{stroke-width:1px;}#mq6cndsg0t9xlk0k74ve .edge-thickness-thick{stroke-width:3.5px;}#mq6cndsg0t9xlk0k74ve .edge-pattern-solid{stroke-dasharray:0;}#mq6cndsg0t9xlk0k74ve .edge-thickness-invisible{stroke-width:0;fill:none;}#mq6cndsg0t9xlk0k74ve .edge-pattern-dashed{stroke-dasharray:3;}#mq6cndsg0t9xlk0k74ve .edge-pattern-dotted{stroke-dasharray:2;}#mq6cndsg0t9xlk0k74ve .marker{fill:lightgrey;stroke:lightgrey;}#mq6cndsg0t9xlk0k74ve .marker.cross{stroke:lightgrey;}#mq6cndsg0t9xlk0k74ve svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mq6cndsg0t9xlk0k74ve p{margin:0;}#mq6cndsg0t9xlk0k74ve .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#ccc;}#mq6cndsg0t9xlk0k74ve .cluster-label text{fill:#F9FFFE;}#mq6cndsg0t9xlk0k74ve .cluster-label span{color:#F9FFFE;}#mq6cndsg0t9xlk0k74ve .cluster-label span p{background-color:transparent;}#mq6cndsg0t9xlk0k74ve .label text,#mq6cndsg0t9xlk0k74ve span{fill:#ccc;color:#ccc;}#mq6cndsg0t9xlk0k74ve .node rect,#mq6cndsg0t9xlk0k74ve .node circle,#mq6cndsg0t9xlk0k74ve .node ellipse,#mq6cndsg0t9xlk0k74ve .node polygon,#mq6cndsg0t9xlk0k74ve .node path{fill:#1f2020;stroke:#ccc;stroke-width:1px;}#mq6cndsg0t9xlk0k74ve .rough-node .label text,#mq6cndsg0t9xlk0k74ve .node .label text,#mq6cndsg0t9xlk0k74ve .image-shape .label,#mq6cndsg0t9xlk0k74ve .icon-shape .label{text-anchor:middle;}#mq6cndsg0t9xlk0k74ve .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mq6cndsg0t9xlk0k74ve .rough-node .label,#mq6cndsg0t9xlk0k74ve .node .label,#mq6cndsg0t9xlk0k74ve .image-shape .label,#mq6cndsg0t9xlk0k74ve .icon-shape .label{text-align:center;}#mq6cndsg0t9xlk0k74ve .node.clickable{cursor:pointer;}#mq6cndsg0t9xlk0k74ve .root .anchor path{fill:lightgrey!important;stroke-width:0;stroke:lightgrey;}#mq6cndsg0t9xlk0k74ve .arrowheadPath{fill:lightgrey;}#mq6cndsg0t9xlk0k74ve .edgePath .path{stroke:lightgrey;stroke-width:2.0px;}#mq6cndsg0t9xlk0k74ve .flowchart-link{stroke:lightgrey;fill:none;}#mq6cndsg0t9xlk0k74ve .edgeLabel{background-color:hsl(0, 0%, 34.4117647059%);text-align:center;}#mq6cndsg0t9xlk0k74ve .edgeLabel p{background-color:hsl(0, 0%, 34.4117647059%);}#mq6cndsg0t9xlk0k74ve .edgeLabel rect{opacity:0.5;background-color:hsl(0, 0%, 34.4117647059%);fill:hsl(0, 0%, 34.4117647059%);}#mq6cndsg0t9xlk0k74ve .labelBkg{background-color:rgba(87.75, 87.75, 87.75, 0.5);}#mq6cndsg0t9xlk0k74ve .cluster rect{fill:hsl(180, 1.5873015873%, 28.3529411765%);stroke:rgba(255, 255, 255, 0.25);stroke-width:1px;}#mq6cndsg0t9xlk0k74ve .cluster text{fill:#F9FFFE;}#mq6cndsg0t9xlk0k74ve .cluster span{color:#F9FFFE;}#mq6cndsg0t9xlk0k74ve 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;}#mq6cndsg0t9xlk0k74ve .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#ccc;}#mq6cndsg0t9xlk0k74ve rect.text{fill:none;stroke-width:0;}#mq6cndsg0t9xlk0k74ve .icon-shape,#mq6cndsg0t9xlk0k74ve .image-shape{background-color:hsl(0, 0%, 34.4117647059%);text-align:center;}#mq6cndsg0t9xlk0k74ve .icon-shape p,#mq6cndsg0t9xlk0k74ve .image-shape p{background-color:hsl(0, 0%, 34.4117647059%);padding:2px;}#mq6cndsg0t9xlk0k74ve .icon-shape rect,#mq6cndsg0t9xlk0k74ve .image-shape rect{opacity:0.5;background-color:hsl(0, 0%, 34.4117647059%);fill:hsl(0, 0%, 34.4117647059%);}#mq6cndsg0t9xlk0k74ve .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mq6cndsg0t9xlk0k74ve .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mq6cndsg0t9xlk0k74ve :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}任务开始TaskBus.initcode / type / statusTaskBus.info设置描述信息TaskBus.time设置任务时间TaskBus.save获取所有TaskBusInterface逐个调用save方法任务信息持久化任务状态枚举: 状态 值 说明 ING 0 进行中 SUCCESS 1 成功 ERROR 2 失败 3.9 虚拟线程设计 #mq6cndsgyeaw70zb53{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;}}#mq6cndsgyeaw70zb53 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mq6cndsgyeaw70zb53 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mq6cndsgyeaw70zb53 .error-icon{fill:#a44141;}#mq6cndsgyeaw70zb53 .error-text{fill:#ddd;stroke:#ddd;}#mq6cndsgyeaw70zb53 .edge-thickness-normal{stroke-width:1px;}#mq6cndsgyeaw70zb53 .edge-thickness-thick{stroke-width:3.5px;}#mq6cndsgyeaw70zb53 .edge-pattern-solid{stroke-dasharray:0;}#mq6cndsgyeaw70zb53 .edge-thickness-invisible{stroke-width:0;fill:none;}#mq6cndsgyeaw70zb53 .edge-pattern-dashed{stroke-dasharray:3;}#mq6cndsgyeaw70zb53 .edge-pattern-dotted{stroke-dasharray:2;}#mq6cndsgyeaw70zb53 .marker{fill:lightgrey;stroke:lightgrey;}#mq6cndsgyeaw70zb53 .marker.cross{stroke:lightgrey;}#mq6cndsgyeaw70zb53 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mq6cndsgyeaw70zb53 p{margin:0;}#mq6cndsgyeaw70zb53 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#ccc;}#mq6cndsgyeaw70zb53 .cluster-label text{fill:#F9FFFE;}#mq6cndsgyeaw70zb53 .cluster-label span{color:#F9FFFE;}#mq6cndsgyeaw70zb53 .cluster-label span p{background-color:transparent;}#mq6cndsgyeaw70zb53 .label text,#mq6cndsgyeaw70zb53 span{fill:#ccc;color:#ccc;}#mq6cndsgyeaw70zb53 .node rect,#mq6cndsgyeaw70zb53 .node circle,#mq6cndsgyeaw70zb53 .node ellipse,#mq6cndsgyeaw70zb53 .node polygon,#mq6cndsgyeaw70zb53 .node path{fill:#1f2020;stroke:#ccc;stroke-width:1px;}#mq6cndsgyeaw70zb53 .rough-node .label text,#mq6cndsgyeaw70zb53 .node .label text,#mq6cndsgyeaw70zb53 .image-shape .label,#mq6cndsgyeaw70zb53 .icon-shape .label{text-anchor:middle;}#mq6cndsgyeaw70zb53 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mq6cndsgyeaw70zb53 .rough-node .label,#mq6cndsgyeaw70zb53 .node .label,#mq6cndsgyeaw70zb53 .image-shape .label,#mq6cndsgyeaw70zb53 .icon-shape .label{text-align:center;}#mq6cndsgyeaw70zb53 .node.clickable{cursor:pointer;}#mq6cndsgyeaw70zb53 .root .anchor path{fill:lightgrey!important;stroke-width:0;stroke:lightgrey;}#mq6cndsgyeaw70zb53 .arrowheadPath{fill:lightgrey;}#mq6cndsgyeaw70zb53 .edgePath .path{stroke:lightgrey;stroke-width:2.0px;}#mq6cndsgyeaw70zb53 .flowchart-link{stroke:lightgrey;fill:none;}#mq6cndsgyeaw70zb53 .edgeLabel{background-color:hsl(0, 0%, 34.4117647059%);text-align:center;}#mq6cndsgyeaw70zb53 .edgeLabel p{background-color:hsl(0, 0%, 34.4117647059%);}#mq6cndsgyeaw70zb53 .edgeLabel rect{opacity:0.5;background-color:hsl(0, 0%, 34.4117647059%);fill:hsl(0, 0%, 34.4117647059%);}#mq6cndsgyeaw70zb53 .labelBkg{background-color:rgba(87.75, 87.75, 87.75, 0.5);}#mq6cndsgyeaw70zb53 .cluster rect{fill:hsl(180, 1.5873015873%, 28.3529411765%);stroke:rgba(255, 255, 255, 0.25);stroke-width:1px;}#mq6cndsgyeaw70zb53 .cluster text{fill:#F9FFFE;}#mq6cndsgyeaw70zb53 .cluster span{color:#F9FFFE;}#mq6cndsgyeaw70zb53 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;}#mq6cndsgyeaw70zb53 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#ccc;}#mq6cndsgyeaw70zb53 rect.text{fill:none;stroke-width:0;}#mq6cndsgyeaw70zb53 .icon-shape,#mq6cndsgyeaw70zb53 .image-shape{background-color:hsl(0, 0%, 34.4117647059%);text-align:center;}#mq6cndsgyeaw70zb53 .icon-shape p,#mq6cndsgyeaw70zb53 .image-shape p{background-color:hsl(0, 0%, 34.4117647059%);padding:2px;}#mq6cndsgyeaw70zb53 .icon-shape rect,#mq6cndsgyeaw70zb53 .image-shape rect{opacity:0.5;background-color:hsl(0, 0%, 34.4117647059%);fill:hsl(0, 0%, 34.4117647059%);}#mq6cndsgyeaw70zb53 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mq6cndsgyeaw70zb53 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mq6cndsgyeaw70zb53 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}VirtualThreadTaskUtilssimple方法简单虚拟线程执行execute方法带回调的虚拟线程执行创建虚拟线程执行Runnable任务返回CompletableFuture创建虚拟线程执行任务VirtualThreadTaskCallbackonSuccess / onError四、编码规范设计 4.1 命名规范 类命名 类型 命名规范 示例 配置类 Boot{Module}Configuration BootCacheRedisConfiguration 导入选择器 Boot{Module}ImportSelector BootCacheRedisImportSelector 配置属性 {功能}Config LogBusConfig, StorageConfig 工具类 {功能}Utils RedisUtils, TreeUtils, TimeUtils 监控类 {组件}Monitor RedisMonitor, MySqlMonitor 枚举类 {功能}Enums / {功能}Enum MySqlMonitorEnums, MaskType 异常类 Biz{类型}Error BizError, BizWarning, BizPublicKeyError 接口 {功能}Interface / Base{功能} LogBusInterface, BaseTaskType DTO {功能}Dto / {功能} Result, LogBody, TaskInfo, RunInfo 总线 {功能}Bus LogBus, TaskBus, MqBus 初始化 Init{功能} InitIp, InitMq, InitXxlJob 处理器 {功能}Handle / {功能}Handler RabbitMqHandle, DefaultMaskHandle 持有器 {功能}Holder LogTrackHolder, CommonHolder 注解 {功能} @Mask, @IgnoreXss 方法命名 操作 前缀 示例 初始化 init LogBus.init(), TaskBus.init() 保存 save logBus.save(), taskBus.save() 获取 get RedisService.get(), hashGet() 删除 del RedisService.del(), hashDelete() 判断 is/has/exists hashExists() 格式化 fmt fmtLog(), fmtStackTrace() 执行 do doSave() 4.2 注释规范 类注释格式 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/01/01 09:30 */ 方法注释格式 java 复制代码 /** * 方法描述 * * @param param 参数说明 * @return 返回值说明 */ 4.3 代码风格 Lombok简化代码:使用 @Data、@Slf4j、@Resource 等注解减少样板代码 构造器注入:通过 @Resource 进行依赖注入 统一返回格式:所有Controller方法返回 Result<T> 统一异常处理:通过 @RestControllerAdvice 全局捕获异常 ScopedValue:使用JDK 21的ScopedValue替代ThreadLocal,用于线程间上下文传递 虚拟线程:日志保存、消息处理等使用虚拟线程异步执行 链式调用:LogBus、TaskBus、MqBus支持链式API调用 接口驱动:LogBusInterface、TaskBusInterface、BaseMqHandle、StorageService均通过接口定义,业务层实现 4.4 设计规范 单一职责:每个模块专注单一功能领域(缓存、日志、消息队列等) 开闭原则:通过接口(LogBusInterface、TaskBusInterface、BaseMqHandle)支持扩展,无需修改框架代码 依赖倒置:高层模块通过接口依赖低层实现,如StorageService接口抽象文件存储和S3存储 按需加载:通过ImportSelector实现模块按需自动装配,引入依赖即生效 总线模式:LogBus、TaskBus、MqBus统一采用总线模式,通过Spring容器获取所有接口实现 4.5 安全规范 XSS防护:@IgnoreXss 注解标记不需要XSS过滤的字段,Jackson的String反序列化器自动过滤XSS 数据脱敏:@Mask 注解在JSON序列化阶段自动脱敏敏感数据 SQL监控:MyBatis拦截器记录慢查询和SQL日志 参数验证:使用 @Valid 注解进行参数校验,全局异常处理器统一处理校验失败 五、项目依赖设计 5.1 核心框架依赖 依赖 版本 用途 Spring Boot 4.0.6 应用框架 Spring Framework 7.0.7 核心框架 Spring AMQP 4.0.3 RabbitMQ集成 Spring Data BOM 2025.1.5 Spring Data版本管理 Jakarta Servlet 6.1.0 Servlet规范 5.2 数据访问依赖 依赖 版本 用途 MyBatis 4.0.1 ORM框架 MyBatis-Plus 3.5.16 ORM增强工具 Druid 1.2.28 数据库连接池 MySQL Connector 9.7.0 MySQL驱动 Elasticsearch Client 9.2.8 Elasticsearch客户端 5.3 工具库依赖 依赖 版本 用途 Lombok 1.18.46 代码简化 MapStruct 1.6.3 对象映射 FastJSON2 2.0.60 JSON处理 Jackson 3.1.2 JSON序列化/反序列化 Commons Lang3 3.20.0 通用工具 Commons IO 2.22.0 IO工具 Commons Text 1.15.0 文本处理 5.4 扩展工具依赖 依赖 版本 用途 BouncyCastle 1.84 加密库 OSHI 6.12.0 系统监控 ip2region 3.3.7 IP地址定位 java-jwt 4.5.1 JWT令牌 Caffeine 3.2.3 本地缓存 AWS S3 SDK 2.42.41 S3对象存储 5.5 办公工具依赖 依赖 版本 用途 Fesod Sheet 2.0.1-incubating Excel处理 PDFBox 3.0.7 PDF处理 5.6 文档相关依赖 依赖 版本 用途 Knife4j 4.5.0 API文档增强 Swagger Annotations 2.2.48 OpenAPI注解 SpringDoc OpenAPI 3.0.3 OpenAPI文档生成 5.7 任务调度依赖 依赖 版本 用途 XXL-JOB 3.4.0 分布式任务调度 5.8 监控依赖 依赖 版本 用途 Spring Boot Admin 4.0.4 应用监控 5.9 其他工具依赖 依赖 版本 用途 Velocity 2.4.1 模板引擎 Easy Captcha 1.6.2 验证码生成 Jsoup 1.22.2 HTML解析 UserAgentUtils 1.21 浏览器标识解析 Pinyin4j 2.5.1 拼音转换 Thumbnailator 0.4.21 图片压缩 ZXing 3.5.4 二维码/条形码 mmseg4j 1.10.0 中文分词 5.10 POM继承链 #mq6cndsgvkegjsqo1x9{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;}}#mq6cndsgvkegjsqo1x9 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mq6cndsgvkegjsqo1x9 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mq6cndsgvkegjsqo1x9 .error-icon{fill:#a44141;}#mq6cndsgvkegjsqo1x9 .error-text{fill:#ddd;stroke:#ddd;}#mq6cndsgvkegjsqo1x9 .edge-thickness-normal{stroke-width:1px;}#mq6cndsgvkegjsqo1x9 .edge-thickness-thick{stroke-width:3.5px;}#mq6cndsgvkegjsqo1x9 .edge-pattern-solid{stroke-dasharray:0;}#mq6cndsgvkegjsqo1x9 .edge-thickness-invisible{stroke-width:0;fill:none;}#mq6cndsgvkegjsqo1x9 .edge-pattern-dashed{stroke-dasharray:3;}#mq6cndsgvkegjsqo1x9 .edge-pattern-dotted{stroke-dasharray:2;}#mq6cndsgvkegjsqo1x9 .marker{fill:lightgrey;stroke:lightgrey;}#mq6cndsgvkegjsqo1x9 .marker.cross{stroke:lightgrey;}#mq6cndsgvkegjsqo1x9 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mq6cndsgvkegjsqo1x9 p{margin:0;}#mq6cndsgvkegjsqo1x9 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#ccc;}#mq6cndsgvkegjsqo1x9 .cluster-label text{fill:#F9FFFE;}#mq6cndsgvkegjsqo1x9 .cluster-label span{color:#F9FFFE;}#mq6cndsgvkegjsqo1x9 .cluster-label span p{background-color:transparent;}#mq6cndsgvkegjsqo1x9 .label text,#mq6cndsgvkegjsqo1x9 span{fill:#ccc;color:#ccc;}#mq6cndsgvkegjsqo1x9 .node rect,#mq6cndsgvkegjsqo1x9 .node circle,#mq6cndsgvkegjsqo1x9 .node ellipse,#mq6cndsgvkegjsqo1x9 .node polygon,#mq6cndsgvkegjsqo1x9 .node path{fill:#1f2020;stroke:#ccc;stroke-width:1px;}#mq6cndsgvkegjsqo1x9 .rough-node .label text,#mq6cndsgvkegjsqo1x9 .node .label text,#mq6cndsgvkegjsqo1x9 .image-shape .label,#mq6cndsgvkegjsqo1x9 .icon-shape .label{text-anchor:middle;}#mq6cndsgvkegjsqo1x9 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mq6cndsgvkegjsqo1x9 .rough-node .label,#mq6cndsgvkegjsqo1x9 .node .label,#mq6cndsgvkegjsqo1x9 .image-shape .label,#mq6cndsgvkegjsqo1x9 .icon-shape .label{text-align:center;}#mq6cndsgvkegjsqo1x9 .node.clickable{cursor:pointer;}#mq6cndsgvkegjsqo1x9 .root .anchor path{fill:lightgrey!important;stroke-width:0;stroke:lightgrey;}#mq6cndsgvkegjsqo1x9 .arrowheadPath{fill:lightgrey;}#mq6cndsgvkegjsqo1x9 .edgePath .path{stroke:lightgrey;stroke-width:2.0px;}#mq6cndsgvkegjsqo1x9 .flowchart-link{stroke:lightgrey;fill:none;}#mq6cndsgvkegjsqo1x9 .edgeLabel{background-color:hsl(0, 0%, 34.4117647059%);text-align:center;}#mq6cndsgvkegjsqo1x9 .edgeLabel p{background-color:hsl(0, 0%, 34.4117647059%);}#mq6cndsgvkegjsqo1x9 .edgeLabel rect{opacity:0.5;background-color:hsl(0, 0%, 34.4117647059%);fill:hsl(0, 0%, 34.4117647059%);}#mq6cndsgvkegjsqo1x9 .labelBkg{background-color:rgba(87.75, 87.75, 87.75, 0.5);}#mq6cndsgvkegjsqo1x9 .cluster rect{fill:hsl(180, 1.5873015873%, 28.3529411765%);stroke:rgba(255, 255, 255, 0.25);stroke-width:1px;}#mq6cndsgvkegjsqo1x9 .cluster text{fill:#F9FFFE;}#mq6cndsgvkegjsqo1x9 .cluster span{color:#F9FFFE;}#mq6cndsgvkegjsqo1x9 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;}#mq6cndsgvkegjsqo1x9 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#ccc;}#mq6cndsgvkegjsqo1x9 rect.text{fill:none;stroke-width:0;}#mq6cndsgvkegjsqo1x9 .icon-shape,#mq6cndsgvkegjsqo1x9 .image-shape{background-color:hsl(0, 0%, 34.4117647059%);text-align:center;}#mq6cndsgvkegjsqo1x9 .icon-shape p,#mq6cndsgvkegjsqo1x9 .image-shape p{background-color:hsl(0, 0%, 34.4117647059%);padding:2px;}#mq6cndsgvkegjsqo1x9 .icon-shape rect,#mq6cndsgvkegjsqo1x9 .image-shape rect{opacity:0.5;background-color:hsl(0, 0%, 34.4117647059%);fill:hsl(0, 0%, 34.4117647059%);}#mq6cndsgvkegjsqo1x9 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mq6cndsgvkegjsqo1x9 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mq6cndsgvkegjsqo1x9 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}管理管理管理管理管理管理管理管理管理管理管理管理管理管理管理管理管理管理管理管理管理spring-boot-starter-parent4.0.6xtools-parent5.0.0xtools-parent-boot5.0.0xtools-boot5.0.0Spring Framework 7.0.7Jackson 3.1.2Spring AMQP 4.0.3Elasticsearch 9.2.8MySQL 9.7.0Lettuce 6.8.2RabbitMQ 5.27.1Tomcat 11.0.21FastJSON2 2.0.60BouncyCastle 1.84OSHI 6.12.0MapStruct 1.6.3Velocity 2.4.1S3 SDK 2.42.41ip2region 3.3.7MyBatis-Plus 3.5.16MyBatis 4.0.1Druid 1.2.28Knife4j 4.5.0XXL-JOB 3.4.0Spring Boot Admin 4.0.4六、技术选型说明 6.1 JDK 25 LTS版本:JDK 25是长期支持版本,提供长期稳定的安全更新 虚拟线程(Virtual Threads):项目大量使用虚拟线程进行异步操作,如日志保存、消息处理,大幅简化并发编程 ScopedValue:替代传统的ThreadLocal,用于线程间上下文传递(LogTrack、CommonHolder),性能更优且更安全 Record模式匹配:枚举类型使用record定义,支持简洁的模式匹配语法 Switch表达式:全局异常处理器等场景使用增强的switch表达式 文本块和String模板:日志格式化等场景使用文本块提升可读性 6.2 Spring Boot 4.0.6 Spring Framework版本:7.0.7,提供最新的核心功能 Jakarta EE 11:全面支持Jakarta EE 11规范(Jakarta Servlet 6.1.0) 自动配置:所有模块基于Spring Boot自动配置机制,引入依赖即生效 Actuator:内置应用监控端点 嵌入式容器:Tomcat 11.0.21 6.3 MyBatis-Plus 3.5.16 简化CRUD:通过BaseMapper提供通用增删改查 分页插件:内置分页拦截器,配合QueryUtils实现分页查询 代码生成:配合xtools-app-gen模块实现代码生成 SQL解析:通过mybatis-plus-jsqlparser支持SQL解析和优化 支持MyBatis版本:4.0.1 6.4 Elasticsearch 9.2.8 Spring Data Elasticsearch:通过Spring Data BOM 2025.1.5管理 全文搜索:用于日志检索和全文查询 高性能:基于Lucene的分布式搜索引擎 EsUtils:封装ES的GET/POST操作 EsQueryUtils:封装常用查询条件(matchPhrase、wildcard、timeRange) 6.5 Redis Spring Data Redis:通过Spring Boot 4.0.6管理(Lettuce 6.8.2客户端) RedisService:封装String、Hash、分布式锁等操作 FastJSON2序列化:使用FastJSON2进行Redis值的序列化/反序列化 分布式锁:基于RedisTemplate的setIfAbsent + Lua脚本实现 6.6 RabbitMQ Spring AMQP:4.0.3版本,提供RabbitMQ集成 RabbitMQ Client:5.27.1版本 消息总线:通过MqBus统一消息推送接口 消息编解码:MqMessageUtils提供消息的打包/解包 6.7 其他重要技术选型 技术 版本 选型原因 Jackson 3.1.2 Spring Boot默认JSON库(tools.jackson包),用于HTTP响应序列化 FastJSON2 2.0.60 高性能JSON库,用于Redis序列化和内部数据处理 Knife4j 4.5.0 增强Swagger UI,提供更友好的API文档界面 XXL-JOB 3.4.0 轻量级分布式任务调度平台 Druid 1.2.28 阿里巴巴数据库连接池,内置SQL监控和防火墙 ip2region 3.3.7 离线IP地址定位库,无需网络请求 BouncyCastle 1.84 Java加密扩展库,支持SM2/SM3等国密算法 OSHI 6.12.0 跨平台系统信息监控库 S3 SDK 2.42.41 AWS官方S3客户端,支持所有S3兼容存储 Spring Boot Admin 4.0.4 开源应用监控管理平台 文档版本:v1.0 编写日期:2026-06-09 项目版本:5.0.0 父POM版本:xtools-parent-boot:5.0.0 顶级父POM:xtools-parent:5.0.0 JDK版本:25 维护团队:xujun.org

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

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

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应用均可从中受益。

用户登录
用户注册