# JsonLink **Repository Path**: stoneMiss/json-link ## Basic Information - **Project Name**: JsonLink - **Description**: 主要是json映射框架可用于json与json之间的转换 - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-12-27 - **Last Updated**: 2026-01-28 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # JsonLink
![JsonLink Logo](https://img.shields.io/badge/JsonLink-JSON%20Mapping-blue?style=for-the-badge) **基于Jolt的可视化JSON映射框架** - 让复杂的JSON转换变得简单直观 [功能特性](#-核心特性) • [快速开始](#-快速开始) • [使用指南](#-使用指南) • [API文档](#-api接口) • [配置说明](#-配置格式) [![Java](https://img.shields.io/badge/Java-1.8+-orange)](https://www.oracle.com/java/) [![Spring Boot](https://img.shields.io/badge/Spring%20Boot-2.7-brightgreen)](https://spring.io/projects/spring-boot) [![React](https://img.shields.io/badge/React-18-blue)](https://reactjs.org/) [![TypeScript](https://img.shields.io/badge/TypeScript-5.0-blue)](https://www.typescriptlang.org/) [![License](https://img.shields.io/badge/License-MIT-green)](LICENSE)
--- ## 📋 目录 - [核心特性](#-核心特性) - [功能清单](#-功能清单) - [技术栈](#-技术栈) - [快速开始](#-快速开始) - [使用指南](#-使用指南) - [配置格式](#-配置格式) - [API接口](#-api接口) - [项目结构](#-项目结构) - [性能指标](#-性能指标) - [开发计划](#-开发计划) --- ## ✨ 核心特性 ### 🎨 可视化配置 - **左右分栏界面**:源JSON字段树 + 映射规则表格,一目了然 - **拖拽配置**:支持拖拽源字段到目标字段,快速建立映射关系 - **点击选择**:点击字段树中的字段自动填充到映射规则 - **实时预览**:配置完成后立即预览转换结果 - **智能建议**:基于字段名相似度自动推荐映射关系 ### 🔄 双向兼容 - **可视化 → DSL**:将可视化配置自动转换为标准Jolt DSL - **DSL → 可视化**:支持Jolt DSL反向解析为可视化配置 - **100%兼容**:完全兼容原生Jolt,生成的DSL可直接使用 ### 🧪 测试与调试 - **实时测试**:输入测试数据,立即查看转换结果 - **结果对比**:源JSON和目标JSON并排对比展示 - **执行日志**:详细的执行过程日志,便于调试 - **错误提示**:清晰的错误信息和修复建议 - **字段差异对比**:可视化展示源字段和目标字段的差异 ### 📦 配置管理 - **导入/导出**:支持配置文件的导入和导出 - **历史记录**:自动保存配置历史,支持版本回退 - **模板库**:保存常用配置为模板,快速复用 - **批量操作**:支持批量编辑、删除映射规则 ### 🚀 高级功能 - **HTTP请求集成**:支持在执行映射时发送HTTP请求获取数据 - **函数链**:支持多个函数按顺序执行 - **路径表达式**:支持跨层级访问字段数据 - **条件映射**:支持条件过滤和条件赋值 - **数组处理**:完整的数组映射和嵌套数组支持 - **类型转换**:自动类型转换(string/number/boolean/date) - **数据校验**:强大的数据校验规则系统 --- ## 🎯 功能清单 ### 📝 基础映射功能 | 功能 | 说明 | 状态 | |------|------|------| | 字段映射 | 支持简单字段一对一映射 | ✅ | | 嵌套映射 | 支持多层级嵌套对象映射 | ✅ | | 字段重命名 | 映射时重命名字段 | ✅ | | 类型转换 | string/number/boolean/date 类型转换 | ✅ | | 默认值 | 为缺失字段设置默认值 | ✅ | | 赋值操作 | 直接给目标字段赋值固定值 | ✅ | | HTTP请求赋值 | 从HTTP请求获取数据用于赋值 | ✅ | ### 🔢 数组处理 | 功能 | 说明 | 状态 | |------|------|------| | 数组映射 | 支持 `items[*]` 数组路径映射 | ✅ | | 嵌套数组 | 支持 `orders[*].items[*]` 多层数组 | ✅ | | 数组重命名 | 数组字段重命名 | ✅ | | 数组类型转换 | 数组元素类型转换 | ✅ | | 数组默认值 | 数组元素默认值设置 | ✅ | | 数组函数 | 对数组元素应用函数 | ✅ | ### ⚙️ 函数功能 #### 字符串函数 - ✅ `uppercase` - 转大写 - ✅ `lowercase` - 转小写 - ✅ `trim` - 去除首尾空格 - ✅ `toString` - 转字符串 - ✅ `substring` - 截取字符串 - ✅ `replace` - 字符串替换 - ✅ `concat` - 字符串拼接 #### 数值函数 - ✅ `toNumber` - 转数字 - ✅ `abs` - 绝对值 - ✅ `round` - 四舍五入 - ✅ `ceil` - 向上取整 - ✅ `floor` - 向下取整 #### 布尔函数 - ✅ `toBoolean` - 转布尔值 #### 日期函数 - ✅ `dateFormat` - 日期格式化 #### 函数特性 - ✅ 函数链:多个函数按顺序执行 - ✅ 函数参数:支持配置函数参数 - ✅ 路径表达式:函数参数中支持路径表达式 ### 🔍 路径表达式 | 表达式 | 说明 | 示例 | |--------|------|------| | `$fieldName` | 访问当前层级字段 | `$name` | | `$1.fieldName` | 访问当前层级字段(显式) | `$1.price` | | `$2.parent.field` | 访问上一层字段 | `$2.user.name` | | `$0.root.field` | 访问根层字段 | `$0.config.value` | ### 🛡️ 数据校验 | 校验规则 | 说明 | 状态 | |----------|------|------| | 必填校验 | 字段不能为空 | ✅ | | 长度校验 | 字符串最小/最大长度 | ✅ | | 数值范围 | 数字最小值/最大值 | ✅ | | 正则表达式 | 自定义正则校验 | ✅ | | 数组校验 | 数组元素校验 | ✅ | | 嵌套数组校验 | 嵌套数组元素校验 | ✅ | | 自定义错误提示 | 校验失败时显示自定义消息 | ✅ | ### 🌐 HTTP请求功能 | 功能 | 说明 | 状态 | |------|------|------| | HTTP请求配置 | 在赋值操作中配置HTTP请求 | ✅ | | 请求方法 | 支持 GET/POST/PUT/PATCH/DELETE | ✅ | | 请求Headers | 自定义请求头 | ✅ | | 请求体 | POST/PUT/PATCH 请求体支持 | ✅ | | 响应路径提取 | 支持提取嵌套响应数据 | ✅ | | curl/fetch/axios导入 | 支持从命令导入HTTP配置 | ✅ | | 请求历史 | 保存HTTP请求历史记录 | ✅ | ### 🎨 界面功能 | 功能 | 说明 | 状态 | |------|------|------| | 表格模式 | 表格形式展示映射规则 | ✅ | | 可视化模式 | 可视化拖拽配置 | ✅ | | 搜索过滤 | 按字段路径搜索映射规则 | ✅ | | 排序功能 | 按源字段/目标字段排序 | ✅ | | 批量选择 | 多选映射规则进行批量操作 | ✅ | | 撤销/重做 | 支持操作历史撤销和重做 | ✅ | | 主题切换 | 支持亮色/暗色主题 | ✅ | | 快捷键支持 | 常用操作快捷键 | ✅ | | 响应式布局 | 适配不同屏幕尺寸 | ✅ | ### 📊 统计与分析 | 功能 | 说明 | 状态 | |------|------|------| | 映射统计 | 统计映射规则数量、覆盖率等 | ✅ | | 性能监控 | 显示映射执行性能指标 | ✅ | | 字段差异对比 | 对比源字段和目标字段差异 | ✅ | | 映射关系图 | 可视化展示映射关系 | ✅ | ### 💾 数据管理 | 功能 | 说明 | 状态 | |------|------|------| | 配置保存 | 保存映射配置到本地 | ✅ | | 配置导入 | 从文件导入配置 | ✅ | | 配置导出 | 导出配置为JSON文件 | ✅ | | 配置历史 | 保存配置历史记录 | ✅ | | 版本管理 | 配置版本保存和回退 | ✅ | | 模板管理 | 保存和加载配置模板 | ✅ | | 测试用例 | 保存和管理测试用例 | ✅ | | 自动保存 | 自动保存配置变更 | ✅ | --- ## 🛠️ 技术栈 ### 后端 - **Java 8+** - 核心开发语言 - **Spring Boot 2.7** - Web框架 - **Jolt** - JSON转换引擎 - **Jackson** - JSON处理 - **Maven** - 项目构建 ### 前端 - **React 18** - UI框架 - **TypeScript** - 类型安全 - **Ant Design 5** - UI组件库 - **Vite** - 构建工具 - **Axios** - HTTP客户端 --- ## 🚀 快速开始 ### 环境要求 - **JDK 1.8+** - **Maven 3.6+** - **Node.js 16+** (前端开发) - **npm/yarn** (包管理器) ### 1. 克隆项目 ```bash git clone cd JsonLink ``` ### 2. 后端启动 ```bash # 编译项目 mvn clean package # 运行应用 mvn spring-boot:run # 或使用jar包运行 java -jar target/jsonlink-1.0.0.jar ``` 后端服务默认运行在 `http://localhost:8080` ### 3. 前端启动 ```bash cd frontend # 安装依赖 npm install # 或 yarn install # 启动开发服务器 npm run dev # 或 yarn dev ``` 前端服务默认运行在 `http://localhost:3000` ### 4. 访问应用 打开浏览器访问 `http://localhost:3000` --- ## 📖 使用指南 ### 🎯 映射配置 #### 1. 导入源JSON **方式一:文件上传** - 点击工具栏的"导入源JSON"按钮 - 选择JSON文件上传 **方式二:文本输入** - 在左侧"源JSON"区域直接粘贴JSON文本 - 系统自动解析并显示字段树 #### 2. 配置映射规则 **方式一:拖拽配置** 1. 在左侧字段树中找到源字段 2. 拖拽字段到右侧映射规则表格 3. 自动填充源字段路径和目标字段路径 **方式二:点击配置** 1. 点击左侧字段树中的字段 2. 在右侧表格中输入目标字段路径 3. 点击"添加映射"按钮 **方式三:手动输入** 1. 在映射规则表格中直接输入 - 源字段路径:如 `user.name` - 目标字段路径:如 `profile.userName` #### 3. 高级配置 **字段重命名** ``` 源字段路径: user.id 目标字段路径: profile.userId 重命名: userId ``` **类型转换** - 字符串 → 数字:`typeConversion: "number"` - 字符串 → 布尔值:`typeConversion: "boolean"` - 字符串 → 日期:`typeConversion: "date"` **默认值设置** ``` 源字段路径: user.status 目标字段路径: status 默认值: "active" ``` **赋值操作** ``` 目标字段路径: timestamp 赋值: 1699123456789 ``` **HTTP请求赋值** 1. 在赋值操作列点击"配置HTTP请求" 2. 配置请求URL、方法、Headers 3. 可选:配置响应数据路径(如 `data.user.name`) 4. 保存配置 #### 4. 函数配置 **单函数** ``` 源字段路径: user.name 函数: uppercase 结果: "JOHN" (如果源值是 "john") ``` **函数链** ``` 源字段路径: user.email 函数: [trim, lowercase] 结果: 先去除空格,再转小写 ``` **函数参数** ``` 函数: substring 参数: { start: 0, end: 10 } ``` **路径表达式** ``` 函数: concat 参数: { separator: " ", values: ["$1", "$2.user.lastName"] } ``` #### 5. 数组映射 **单层数组** ``` 源字段路径: items[*].id 目标字段路径: products[*].productId ``` **嵌套数组** ``` 源字段路径: orders[*].items[*].price 目标字段路径: orders[*].products[*].price ``` #### 6. 条件映射 ``` 源字段路径: user.status 目标字段路径: isActive 条件: user.status == "active" ``` #### 7. 数据校验 ``` 源字段路径: user.email 目标字段路径: email 校验规则: { function: "pattern", parameters: { pattern: "^[\\w-\\.]+@([\\w-]+\\.)+[\\w-]{2,4}$" }, message: "邮箱格式不正确" } ``` #### 8. 保存配置 1. 输入配置名称和描述(可选) 2. 点击"保存配置"按钮 3. 配置自动保存到本地存储 ### 🧪 可视化测试 #### 1. 准备测试数据 **源JSON** ```json { "user": { "id": "123", "name": "John Doe", "email": "john@example.com" } } ``` **映射配置** - 从配置管理导入 - 或直接粘贴配置JSON #### 2. 执行测试 1. 点击"执行测试"按钮 2. 查看转换结果 3. 查看生成的Jolt DSL 4. 查看执行日志 #### 3. 结果分析 - **转换结果**:查看转换后的JSON - **DSL代码**:查看自动生成的Jolt DSL - **执行日志**:查看详细的执行过程 - **错误信息**:如有错误,查看错误详情 ### 📦 配置管理 #### 导入配置 1. 点击"导入配置"按钮 2. 选择配置文件(JSON格式) 3. 配置自动加载 #### 导出配置 1. 配置完成后点击"复制配置" 2. 或使用"保存配置"下载文件 #### 历史记录 1. 点击"历史记录"按钮 2. 查看保存的配置历史 3. 点击"加载"恢复历史配置 4. 点击"删除"移除历史记录 #### 模板管理 1. 配置完成后点击"模板库" 2. 点击"保存为模板" 3. 输入模板名称和描述 4. 后续可通过模板快速加载配置 ### 🌐 HTTP请求功能 #### 配置HTTP请求 1. **在赋值操作中配置** - 在映射规则表格的"赋值"列 - 点击"配置HTTP请求"按钮 - 填写请求配置 2. **配置项说明** - **请求方法**:GET/POST/PUT/PATCH/DELETE - **请求URL**:完整的API地址 - **请求Headers**:自定义请求头(如Authorization) - **响应数据路径**:可选,用于提取嵌套数据(如 `data.user.name`) 3. **导入命令** - 点击"导入curl/fetch/axios命令" - 粘贴curl、fetch或axios命令 - 系统自动解析URL、方法和Headers #### 使用示例 ```json { "targetPath": "userInfo", "httpRequest": { "url": "https://api.example.com/user/123", "method": "GET", "headers": { "Authorization": "Bearer token123" }, "responsePath": "data" } } ``` 执行映射时,后端会: 1. 发送HTTP请求到配置的URL 2. 获取响应数据 3. 如果配置了`responsePath`,提取指定路径的数据 4. 将数据赋值到目标字段 ### 🔍 搜索与过滤 #### 搜索功能 - 在搜索框输入关键词 - 自动过滤匹配的映射规则 - 支持按源字段路径和目标字段路径搜索 #### 过滤功能 - **全部**:显示所有映射规则 - **包含函数**:只显示配置了函数的规则 - **包含校验**:只显示配置了校验的规则 - **包含条件**:只显示配置了条件的规则 - **包含类型转换**:只显示配置了类型转换的规则 - **数组映射**:只显示数组映射规则 #### 排序功能 - 按源字段升序/降序 - 按目标字段升序/降序 - 取消排序 ### 📊 统计信息 点击"更多功能" → "统计信息"查看: - 源字段总数 - 目标字段总数 - 已映射数量 - 覆盖率 - 完成度 - 包含函数的规则数 - 包含校验的规则数 - 包含条件的规则数 - 数组映射数量 ### 🎨 主题切换 - 点击工具栏的主题切换按钮 - 支持亮色/暗色主题 - 主题偏好自动保存 ### ⌨️ 快捷键 | 快捷键 | 功能 | |--------|------| | `Ctrl+Z` | 撤销 | | `Ctrl+Y` | 重做 | | `Ctrl+C` | 复制映射规则 | | `Ctrl+V` | 粘贴映射规则 | | `Ctrl+S` | 保存配置 | 点击"快捷键帮助"查看完整快捷键列表。 --- ## 📋 配置格式 ### 完整配置示例 ```json { "name": "用户信息映射配置", "description": "将用户信息从源格式转换为目标格式", "mappings": [ { "sourcePath": "user.id", "targetPath": "userId", "rename": "id", "typeConversion": "string", "defaultValue": "unknown", "functions": [ { "name": "uppercase", "order": 0 } ], "condition": "user.status == 'active'", "validation": { "function": "required", "message": "用户ID不能为空" } }, { "sourcePath": "items[*].id", "targetPath": "products[*].productId", "isArray": true, "typeConversion": "number" }, { "targetPath": "timestamp", "assignValue": 1699123456789 }, { "targetPath": "userInfo", "httpRequest": { "url": "https://api.example.com/user/123", "method": "GET", "headers": { "Authorization": "Bearer token" }, "responsePath": "data" } } ], "globalDefaults": { "status": "active", "createdAt": "2024-01-01" }, "strictMode": false } ``` ### 字段说明 #### FieldMapping(映射规则) | 字段 | 类型 | 必填 | 说明 | |------|------|------|------| | `sourcePath` | string | 是 | 源字段路径,如 `user.name` 或 `items[*].id` | | `targetPath` | string | 是 | 目标字段路径 | | `rename` | string | 否 | 字段重命名 | | `typeConversion` | string | 否 | 类型转换:`string`/`number`/`boolean`/`date` | | `defaultValue` | any | 否 | 默认值(源字段为空时使用) | | `assignValue` | any | 否 | 固定赋值(优先级高于sourcePath) | | `httpRequest` | object | 否 | HTTP请求配置(用于赋值,优先级最高) | | `condition` | string | 否 | 条件表达式,如 `user.status == 'active'` | | `functions` | array | 否 | 函数列表 | | `isArray` | boolean | 否 | 是否为数组映射 | | `arrayRule` | string | 否 | 数组映射规则:`one`/`many` | | `validation` | object | 否 | 校验规则 | #### HttpRequestConfig(HTTP请求配置) | 字段 | 类型 | 必填 | 说明 | |------|------|------|------| | `url` | string | 是 | 请求URL | | `method` | string | 是 | 请求方法:`GET`/`POST`/`PUT`/`PATCH`/`DELETE` | | `headers` | object | 否 | 请求头,键值对格式 | | `body` | any | 否 | 请求体(POST/PUT/PATCH使用) | | `responsePath` | string | 否 | 响应数据路径,如 `data.user.name` | #### FunctionConfig(函数配置) | 字段 | 类型 | 必填 | 说明 | |------|------|------|------| | `name` | string | 是 | 函数名称 | | `parameters` | object | 否 | 函数参数 | | `order` | number | 否 | 执行顺序(用于函数链) | #### ValidationRule(校验规则) | 字段 | 类型 | 必填 | 说明 | |------|------|------|------| | `function` | string | 是 | 校验函数:`required`/`min`/`max`/`pattern`等 | | `parameters` | object | 否 | 校验参数 | | `message` | string | 否 | 校验失败时的提示信息 | --- ## 🔌 API接口 ### 映射测试 #### 执行映射测试 ```http POST /api/mapping/test Content-Type: application/json { "sourceJson": "{...}", "configJson": "{...}" } ``` **响应** ```json { "success": true, "result": {...}, "resultJson": "{...}", "joltDsl": "[{...}]", "logs": ["...", "..."], "errors": [], "executionTime": 123 } ``` #### 使用Jolt DSL执行映射 ```http POST /api/mapping/test/dsl Content-Type: application/json { "sourceJson": "{...}", "dslJson": "[{...}]" } ``` #### 转换为Jolt DSL ```http POST /api/mapping/convert/dsl Content-Type: application/json { "configJson": "{...}" } ``` **响应** ```json { "success": true, "dslJson": "[{...}]" } ``` #### 解析Jolt DSL ```http POST /api/mapping/parse/dsl Content-Type: application/json { "dslJson": "[{...}]" } ``` **响应** ```json { "success": true, "configJson": "{...}" } ``` #### 验证配置 ```http POST /api/mapping/validate Content-Type: application/json { "configJson": "{...}" } ``` ### 配置管理 #### 导入配置 ```http POST /api/config/import Content-Type: multipart/form-data file: ``` #### 导出配置 ```http POST /api/config/export Content-Type: application/json { "configJson": "{...}" } ``` ### 文件上传 #### 上传JSON文件 ```http POST /api/mapping/upload/json Content-Type: multipart/form-data file: ``` --- ## 📁 项目结构 ``` JsonLink/ ├── src/main/java/com/jsonlink/ │ ├── JsonLinkApplication.java # 主应用入口 │ ├── model/ # 数据模型 │ │ ├── FieldMapping.java # 字段映射模型 │ │ ├── MappingConfig.java # 映射配置模型 │ │ ├── MappingResult.java # 映射结果模型 │ │ ├── FunctionConfig.java # 函数配置模型 │ │ └── ErrorInfo.java # 错误信息模型 │ ├── converter/ # DSL转换层 │ │ └── DslConverter.java # 可视化配置↔Jolt DSL转换器 │ ├── core/ # 核心执行层 │ │ ├── JsonMapper.java # JSON映射执行器 │ │ ├── HttpClientUtil.java # HTTP客户端工具 │ │ ├── DslCache.java # DSL缓存 │ │ └── jolt/ # Jolt函数实现 │ │ ├── UppercaseFunction.java # 转大写函数 │ │ ├── LowercaseFunction.java # 转小写函数 │ │ ├── TrimFunction.java # 去除空格函数 │ │ ├── ConcatFunction.java # 字符串拼接函数 │ │ ├── ReplaceFunction.java # 字符串替换函数 │ │ ├── SubstringFunction.java # 截取字符串函数 │ │ ├── ToNumberFunction.java # 转数字函数 │ │ ├── ToBooleanFunction.java # 转布尔值函数 │ │ ├── ToStringFunction.java # 转字符串函数 │ │ ├── AbsFunction.java # 绝对值函数 │ │ ├── RoundFunction.java # 四舍五入函数 │ │ ├── CeilFunction.java # 向上取整函数 │ │ ├── FloorFunction.java # 向下取整函数 │ │ ├── DateFormatFunction.java # 日期格式化函数 │ │ ├── ConditionFunction.java # 条件函数 │ │ ├── ValidationFunction.java # 校验函数 │ │ └── ... │ └── controller/ # REST API接口 │ ├── MappingController.java # 映射测试API │ └── ConfigController.java # 配置管理API ├── frontend/ # 前端项目 │ ├── src/ │ │ ├── components/ # React组件 │ │ │ ├── MappingConfig.tsx # 映射配置组件(主组件) │ │ │ ├── TestMapping.tsx # 可视化测试组件 │ │ │ └── ConfigManagement.tsx # 配置管理组件 │ │ ├── api/ # API客户端 │ │ │ ├── client.ts # Axios客户端配置 │ │ │ ├── mapping.ts # 映射API │ │ │ └── config.ts # 配置API │ │ ├── types/ # TypeScript类型定义 │ │ │ └── index.ts # 类型定义 │ │ └── utils/ # 工具函数 │ │ └── jsonParser.ts # JSON解析工具 │ └── package.json └── pom.xml # Maven配置 ``` --- ## 📈 性能指标 - ✅ **批量处理**:支持批量JSON映射(1000条/次) - ✅ **执行效率**:映射耗时 ≤ 原生Jolt执行耗时的120% - ✅ **文件大小**:支持最大10MB的JSON文件 - ✅ **编码支持**:完整支持UTF-8编码 - ✅ **特殊字符**:支持包含特殊字符和空值的JSON - ✅ **缓存机制**:DSL转换结果自动缓存,提升性能 --- ## 🗺️ 开发计划 ### 已完成 ✅ - [x] 可视化配置界面 - [x] 拖拽配置功能 - [x] 实时预览功能 - [x] 智能建议功能 - [x] DSL双向转换 - [x] 函数链支持 - [x] 路径表达式 - [x] 数据校验系统 - [x] HTTP请求集成 - [x] 配置管理 - [x] 历史记录 - [x] 模板库 - [x] 主题切换 - [x] 快捷键支持 - [x] 统计信息 - [x] 性能监控 ### 计划中 🚧 - [ ] 更多Jolt操作支持(remove、modify等) - [ ] 自定义函数插件系统 - [ ] 映射规则分组和标签 - [ ] 协作功能(多人编辑) - [ ] 性能优化(虚拟滚动、懒加载) - [ ] 国际化支持(i18n) - [ ] 单元测试和集成测试 - [ ] API文档(Swagger) --- ## 📄 许可证 MIT License --- ## 🤝 贡献 欢迎提交Issue和Pull Request! ### 贡献指南 1. Fork 本仓库 2. 创建特性分支 (`git checkout -b feature/AmazingFeature`) 3. 提交更改 (`git commit -m 'Add some AmazingFeature'`) 4. 推送到分支 (`git push origin feature/AmazingFeature`) 5. 开启 Pull Request --- ## 📞 联系方式 如有问题或建议,请通过以下方式联系: - 📧 Email: [your-email@example.com] - 🐛 Issues: [GitHub Issues](https://github.com/your-repo/issues) - 💬 Discussions: [GitHub Discussions](https://github.com/your-repo/discussions) ---
**⭐ 如果这个项目对你有帮助,请给个Star支持一下!** Made with ❤️ by JsonLink Team