版本:v1.0
日期:2026-03-24
基于原项目(Java + Spring Boot + Vue3)重构为 .NET 6 + Vue3 + SQLite 技术栈
Juggle 是一个图形化的微服务接口编排低代码工具,中文寓意"积木、魔法"——像积木一样灵活,像魔法一样强大。通过可视化拖拽流程设计,将多个已有的 API 接口编排为一个复合接口,直接供前端或业务系统调用,极大提高开发效率。
| 场景 | 说明 |
|---|---|
| 微服务接口编排 | 基于已有基础接口快速开发新接口,无需重复编码 |
| 第三方系统集成 | 直接配置编排,打通系统壁垒,零代码完成对接 |
| BFF 适配层 | 代替传统 Node.js BFF,为前端提供聚合接口 |
| 私有化定制开发 | 通过编排实现定制逻辑,避免污染标准代码 |
| 层次 | 原版(Java) | 重构版(.NET 6) |
|---|---|---|
| 后端框架 | Spring Boot 2.7 | ASP.NET Core 6 (Web API) |
| 数据库 | MySQL | SQLite |
| ORM | MyBatis | Entity Framework Core 6 |
| 前端框架 | Vue 3 | Vue 3 (Composition API) |
| 前端语言 | TypeScript | TypeScript |
| UI 组件库 | Element Plus | Element Plus |
| 代码编辑器 | Monaco Editor | Monaco Editor |
| HTTP 客户端 | Axios | Axios |
| 流程引擎 | Juggle Core (自研 Java) | 自研 C# 流程引擎 |
┌─────────────────────────────────────────────────────────────────┐
│ 前端 (Vue 3 + TypeScript) │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────────────┐ │
│ │ 流程设计器│ │ 套件管理 │ │ 对象管理 │ │ 系统设置/市场 │ │
│ └────┬─────┘ └────┬─────┘ └────┬─────┘ └────────┬─────────┘ │
│ └─────────────┴─────────────┴─────────────────┘ │
│ Axios HTTP │
└─────────────────────────────────────────────────────────────────┘
│
REST API (HTTP/JSON)
│
┌─────────────────────────────────────────────────────────────────┐
│ 后端 (ASP.NET Core 6 Web API) │
│ │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ 接口层 (Controllers) │ │
│ │ /api/flow /api/suite /api/object /api/system /open │ │
│ └──────────────────────────┬──────────────────────────────────┘ │
│ │ │
│ ┌───────────────────────────┴──────────────────────────────────┐ │
│ │ 应用层 (Application Services) │ │
│ │ FlowDefinitionService ApiService SuiteService ... │ │
│ └──────────────────────────┬──────────────────────────────────┘ │
│ │ │
│ ┌───────────────────────────┴──────────────────────────────────┐ │
│ │ 领域层 (Domain) │ │
│ │ FlowEngine FlowDefinition Suite Api Object DataSource │ │
│ └──────────────────────────┬──────────────────────────────────┘ │
│ │ │
│ ┌───────────────────────────┴──────────────────────────────────┐ │
│ │ 基础设施层 (Infrastructure) │ │
│ │ EF Core Repositories SQLite HTTP Client JSON处理 │ │
│ └──────────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
│
SQLite 数据库
采用 DDD(领域驱动设计) 四层架构:
负责接收 HTTP 请求,参数校验,调用应用层服务,返回统一响应格式。
Controllers/
├── Api/
│ ├── FlowDefinitionController # 流程定义 CRUD、设计、调试、部署
│ ├── FlowInfoController # 流程信息管理
│ ├── FlowVersionController # 流程版本管理、触发流程
│ ├── ApiController # API 接口 CRUD、调试、解析 Swagger
│ ├── SuiteController # 套件 CRUD、市场管理
│ ├── ObjectController # 对象管理
│ ├── TokenController # 访问令牌管理
│ ├── DataSourceController # 数据源管理
│ ├── UserController # 用户登录
│ └── DataTypeInfoController # 数据类型列表
├── Open/
│ └── FlowOpenController # 开放接口(触发流程)
└── Example/
├── UserExampleController # 示例用户接口
├── GoodsExampleController # 示例商品接口
└── OrderExampleController # 示例订单接口
统一响应格式:
{
"code": 200,
"message": "success",
"data": { ... }
}协调领域对象完成业务用例,不包含业务规则。
Services/
├── Flow/
│ ├── IFlowDefinitionService # 流程定义 CRUD + 调试 + 部署
│ ├── IFlowInfoService # 流程信息
│ ├── IFlowVersionService # 版本管理 + 触发
│ └── IFlowRuntimeService # 运行时(同步/异步执行)
├── Suite/
│ ├── IApiService # API CRUD + 调试 + Swagger 解析
│ └── ISuiteService # 套件 CRUD + 市场安装
├── IObjectService # 对象管理
├── ITokenService # Token 管理
├── IDataSourceService # 数据源管理
└── IUserService # 用户认证
包含核心业务规则和领域模型。
Domain/
├── Flow/
│ ├── FlowDefinition # 流程定义聚合根
│ ├── FlowVersion # 流程版本实体
│ └── FlowInfo # 流程信息实体
├── Suite/
│ ├── Api # API 接口实体
│ └── Suite # 套件实体
├── Object/ # 对象实体
├── Parameter/ # 参数实体(输入/输出/Header)
├── Variable/ # 变量信息实体
├── System/
│ ├── Token # 访问令牌实体
│ └── DataSource # 数据源实体
└── Engine/ # 流程引擎核心
├── FlowEngine # 流程执行引擎
├── NodeExecutors/ # 各类节点执行器
│ ├── StartNodeExecutor
│ ├── EndNodeExecutor
│ ├── MethodNodeExecutor # API 调用节点
│ └── ConditionNodeExecutor # 条件判断节点
└── ExpressionEvaluator # 条件表达式求值器
Infrastructure/
├── Persistence/
│ ├── JuggleDbContext # EF Core DbContext
│ ├── Entities/ # 数据库实体映射
│ └── Repositories/ # 仓储实现
├── Http/
│ └── HttpApiCaller # HTTP API 调用工具
└── Common/
├── JsonHelper # JSON 处理
└── MD5Helper # MD5 加密
console-ui/
├── src/
│ ├── views/ # 页面视图(按功能模块划分)
│ ├── components/ # 可复用组件
│ ├── service/ # API 调用服务层
│ ├── router/ # Vue Router 路由配置
│ ├── hooks/ # Composition API Hooks
│ ├── typings/ # TypeScript 类型定义
│ ├── utils/ # 工具函数
│ └── const/ # 常量定义
| 模块 | 路由 | 说明 |
|---|---|---|
| 流程定义 | /flow/define | 流程的创建、设计、调试、部署 |
| 流程列表 | /flow/list | 已部署流程的管理 |
| 流程版本 | /flow/version/:id | 版本启用/禁用/删除 |
| 流程设计器 | /design/:id/:key | 独立的拖拽式流程设计页面 |
| 套件管理 | /suite/list | 套件 CRUD |
| 接口管理 | /suite/api/:code/:id | API 接口 CRUD、调试 |
| 对象管理 | /object/list | 自定义对象定义 |
| 套件市场 | /market/suite | 套件市场浏览和安装 |
| 模板市场 | /market/template | 流程模板市场 |
| Token 管理 | /system/token | 访问令牌管理 |
| 数据源管理 | /system/datasource | MySQL 数据源配置 |
| 组件 | 说明 |
|---|---|
| FlowDesign | 流程设计器(拖拽、节点编辑、变量管理) |
| FlowDebug | 流程调试器(参数输入、执行、响应展示) |
| ApiDebug | API 调试器 |
| CodeEditor | Monaco 代码编辑器封装 |
| DataTypeSelect | 数据类型选择器 |
| VariableSelect | 变量选择器 |
| ParamSetting | 参数配置组件 |
| InputRuleSetting | 输入规则配置(变量 → 接口入参) |
| OutputRuleSetting | 输出规则配置(接口出参 → 变量) |
| FilterGroup/Item | 条件表达式配置组件 |
使用 SQLite 替换原来的 MySQL,所有字段类型做相应转换。
| 表名 | 说明 |
|---|---|
| t_user | 用户表 |
| t_suite | 套件表 |
| t_api | API 接口表 |
| t_parameter | 参数表(API 入参/出参/Header、对象属性、流程入参/出参) |
| t_object | 自定义对象表 |
| t_flow_definition | 流程定义表 |
| t_variable_info | 变量信息表 |
| t_flow_info | 流程信息表(部署后) |
| t_flow_version | 流程版本表 |
| t_token | 访问令牌表 |
| t_data_source | 数据源表 |
t_suite ──< t_api ──< t_parameter (param_type=1入参,2出参,4Header)
│
t_object ──< t_parameter (param_type=3对象属性)
t_flow_definition ──< t_parameter (param_type=1流程入参,2流程出参)
t_flow_definition ──< t_variable_info
t_flow_definition ──(部署)──> t_flow_info ──< t_flow_version
流程引擎是系统的核心,负责解析和执行流程定义。
流程内容存储为 JSON 格式的节点列表:
[
{
"key": "start_xxx",
"elementType": "START",
"outgoings": ["method_yyy"]
},
{
"key": "method_yyy",
"elementType": "METHOD",
"incomings": ["start_xxx"],
"outgoings": ["condition_zzz"],
"method": {
"suiteCode": "example_suite",
"methodCode": "api_code",
"url": "http://...",
"requestType": "POST",
"inputFillRules": [...],
"outputFillRules": [...]
}
},
{
"key": "condition_zzz",
"elementType": "CONDITION",
"conditions": [
{
"conditionName": "分支1",
"conditionType": "CUSTOM",
"expression": "env_var==true",
"outgoing": "method_aaa"
},
{
"conditionName": "默认else分支",
"conditionType": "DEFAULT",
"outgoing": "end_bbb"
}
]
},
{
"key": "end_bbb",
"elementType": "END"
}
]| 节点类型 | 说明 |
|---|---|
| START | 开始节点,流程入口 |
| END | 结束节点,流程出口 |
| METHOD | 方法节点,调用 HTTP API 接口 |
| CONDITION | 条件节点,多分支判断 |
变量是流程中数据流转的载体,分为三种类型:
| 类型 | 前缀约定 | 说明 |
|---|---|---|
| 输入变量 | input_ | 流程调用时传入的参数 |
| 输出变量 | output_ | 流程返回的结果数据 |
| 环境变量 | env_ | 流程内部中间状态数据 |
节点之间的数据流转通过填充规则定义:
InputFillRule(变量 → API 入参):
{
"source": "input_userName", // 来源变量
"sourceType": "VARIABLE",
"target": "userName", // 目标 API 入参
"targetType": "INPUT_PARAM"
}OutputFillRule(API 出参 → 变量):
{
"source": "loginFlag", // API 出参
"sourceType": "OUTPUT_PARAM",
"target": "env_isLogin", // 目标变量
"targetType": "VARIABLE"
}触发流程
↓
加载流程版本(FlowVersion)
↓
初始化运行时上下文(变量初始化)
↓
从 START 节点开始遍历
↓
┌─── METHOD 节点 ───────────────────────────────┐
│ 1. 根据 inputFillRules 从变量中取值填充入参 │
│ 2. 发起 HTTP 请求调用 API │
│ 3. 根据 outputFillRules 将响应写入变量 │
└───────────────────────────────────────────────┘
↓
┌─── CONDITION 节点 ────────────────────────────┐
│ 1. 遍历条件列表,计算表达式 │
│ 2. 匹配成功则走对应分支 │
│ 3. 无匹配则走 DEFAULT 分支 │
└───────────────────────────────────────────────┘
↓
到达 END 节点
↓
从变量中读取输出变量,组装响应结果
↓
返回 FlowResult
| 类型 | 说明 | 触发方式 |
|---|---|---|
| sync(同步) | 直接返回执行结果 | 调用方等待响应 |
| async(异步) | 立即返回实例ID,后台执行 | 调用方轮询结果 |
| 前缀 | 说明 | 是否需要认证 |
|---|---|---|
/api/ |
控制台管理接口 | 是(JWT Token) |
/open/ |
开放接口(供外部触发流程) | 是(API Token) |
/example/ |
示例 Mock 接口 | 否 |
流程定义:
POST /api/flow/definition/add- 创建流程定义DELETE /api/flow/definition/delete/{id}- 删除流程定义PUT /api/flow/definition/update- 修改流程定义PUT /api/flow/definition/save- 保存流程内容GET /api/flow/definition/info/{id}- 查询流程定义详情POST /api/flow/definition/page- 分页查询POST /api/flow/definition/debug/{flowKey}- 调试流程POST /api/flow/definition/deploy- 部署流程
流程版本:
PUT /api/flow/version/status- 启用/禁用版本DELETE /api/flow/version/delete/{id}- 删除版本POST /api/flow/version/page- 分页查询GET /api/flow/version/latest/{flowKey}- 获取最新版本号POST /api/flow/version/trigger/{version}/{key}- 触发流程
开放接口:
GET /open/flow/trigger/{version}/{key}- GET 方式触发POST /open/flow/trigger/{version}/{key}- POST 方式触发GET /open/flow/getAsyncFlowResult/{instanceId}- 获取异步结果
- 控制台接口:JWT Token 认证,登录后返回 token,每次请求携带
Authorization: Bearer <token> - 开放接口:API Token 认证,在
t_token表中维护有效 token,请求时通过 header 或 query 参数传递
当前版本为单用户/单租户设计,不区分权限角色。
┌──────────────────────────────────────┐
│ 服务器/PC │
│ ┌────────────────────────────────┐ │
│ │ ASP.NET Core 6 Web API │ │
│ │ 端口: 9127 │ │
│ └────────────────────────────────┘ │
│ ┌────────────────────────────────┐ │
│ │ SQLite 数据库 │ │
│ │ juggle.db (文件型数据库) │ │
│ └────────────────────────────────┘ │
│ ┌────────────────────────────────┐ │
│ │ Vue3 前端静态文件 │ │
│ │ 由 .NET 静态文件服务提供 │ │
│ └────────────────────────────────┘ │
└──────────────────────────────────────┘
JuggleNet6/
├── JuggleNet6.Backend/ # ASP.NET Core 6 后端
│ ├── Controllers/
│ ├── Services/
│ ├── Domain/
│ ├── Infrastructure/
│ ├── Migrations/ # EF Core 数据库迁移
│ └── appsettings.json
├── JuggleNet6.Frontend/ # Vue 3 前端
│ ├── src/
│ ├── public/
│ └── vite.config.ts
└── README.md
| 优点 | 说明 |
|---|---|
| 零依赖 | 不需要单独安装数据库服务 |
| 简单部署 | 数据库就是一个文件,方便备份迁移 |
| 适合场景 | 单机部署、中小规模数据量完全够用 |
| EF Core 支持 | Microsoft.EntityFrameworkCore.Sqlite 官方支持 |
| 优点 | 说明 |
|---|---|
| 跨平台 | Windows / Linux / macOS 均可运行 |
| 高性能 | ASP.NET Core 性能优异 |
| 现代化 | 最小托管模型、依赖注入、Swagger 内置 |
| 长期支持 | .NET 6 为 LTS 版本 |
原版使用了独立的 Java 流程引擎库(juggle-core),重构版需自研 C# 流程引擎,核心包括:
- 流程定义解析器 - 将 JSON 流程内容反序列化为节点列表
- 流程执行器 - 按节点拓扑顺序执行
- 节点执行器 - 各类型节点的具体执行逻辑
- 变量上下文 - 流程运行时的数据容器
- 表达式求值器 - 条件节点表达式计算(使用
System.Linq.Dynamic.Core或自实现)
| 阶段 | 内容 | 优先级 |
|---|---|---|
| v1.0 | 基础 CRUD(套件、API、对象、流程定义、流程版本)+ 用户登录 | P0 |
| v1.1 | 流程引擎核心(METHOD 节点 + CONDITION 节点) | P0 |
| v1.2 | 流程调试 + 部署 + 触发 + 开放接口 | P0 |
| v1.3 | Token 管理 + 数据源管理 | P1 |
| v1.4 | 套件/模板市场(只读展示) | P2 |
| v2.0 | 多租户支持、权限系统 | P3 |