# 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

**基于Jolt的可视化JSON映射框架** - 让复杂的JSON转换变得简单直观
[功能特性](#-核心特性) • [快速开始](#-快速开始) • [使用指南](#-使用指南) • [API文档](#-api接口) • [配置说明](#-配置格式)
[](https://www.oracle.com/java/)
[](https://spring.io/projects/spring-boot)
[](https://reactjs.org/)
[](https://www.typescriptlang.org/)
[](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