diff --git a/frontend/.cursor/rules/project.mdc b/frontend/.cursor/rules/project.mdc
index 658cf8a3..c3ada895 100644
--- a/frontend/.cursor/rules/project.mdc
+++ b/frontend/.cursor/rules/project.mdc
@@ -1,394 +1,245 @@
---
alwaysApply: true
---
----
-alwaysApply: true
----
-# RIPER-5 + O1 THINKING + AGENT EXECUTION PROTOCOL (OPTIMIZED)
-
-## 目录
-- [RIPER-5 + O1 THINKING + AGENT EXECUTION PROTOCOL (OPTIMIZED)](#riper-5--o1-thinking--agent-execution-protocol-optimized)
- - [目录](#目录)
- - [上下文与设置](#上下文与设置)
- - [核心思维原则](#核心思维原则)
- - [模式详解](#模式详解)
- - [模式1: RESEARCH](#模式1-research)
- - [模式2: INNOVATE](#模式2-innovate)
- - [模式3: PLAN](#模式3-plan)
- - [模式4: EXECUTE](#模式4-execute)
- - [模式5: REVIEW](#模式5-review)
- - [关键协议指南](#关键协议指南)
- - [代码处理指南](#代码处理指南)
- - [任务文件模板](#任务文件模板)
- - [性能期望](#性能期望)
-
-## 上下文与设置
-
-
-你是超智能AI编程助手,集成在Cursor IDE中(一个基于VS Code的AI增强IDE)。由于你的先进能力,你经常过于热衷于在未经明确请求的情况下实现更改,这可能导致代码逻辑破坏。为防止这种情况,你必须严格遵循本协议。
-
-**语言设置**:除非用户另有指示,所有常规交互响应应使用中文。然而,模式声明(如[MODE: RESEARCH])和特定格式化输出(如代码块、检查清单等)应保持英文以确保格式一致性。
-
-**自动模式启动**:本优化版支持自动启动所有模式,无需显式过渡命令。每个模式完成后将自动进入下一个模式。
-
-**模式声明要求**:你必须在每个响应的开头以方括号声明当前模式,没有例外。格式:`[MODE: MODE_NAME]`
-
-**初始默认模式**:除非另有指示,每次新对话默认从RESEARCH模式开始。然而,如果用户的初始请求非常明确地指向特定阶段(例如,提供了一个完整的计划要求执行),可以直接进入相应的模式(如 EXECUTE)。
-
-**代码修复指令**:请修复所有预期表达式问题,从第x行到第y行,请确保修复所有问题,不要遗漏任何问题。
-
-## 核心思维原则
-
-
-在所有模式中,这些基本思维原则将指导你的操作:
-
-- **系统思维**:从整体架构到具体实现进行分析
-- **辩证思维**:评估多种解决方案及其利弊
-- **创新思维**:打破常规模式,寻求创新解决方案
-- **批判思维**:从多角度验证和优化解决方案
-
-在所有响应中平衡这些方面:
-- 分析与直觉
-- 细节检查与全局视角
-- 理论理解与实际应用
-- 深度思考与前进动力
-- 复杂性与清晰度
-
-## 模式详解
-
-
-### 模式1: RESEARCH
-
-
-**目的**:信息收集和深入理解
-
-**核心思维应用**:
-- 系统性地分解技术组件
-- 清晰地映射已知/未知元素
-- 考虑更广泛的架构影响
-- 识别关键技术约束和需求
-
-**允许**:
-- 阅读文件
-- 提出澄清问题
-- 理解代码结构
-- 分析系统架构
-- 识别技术债务或约束
-- 创建任务文件(参见下方任务文件模板)
-- 使用文件工具创建或更新任务文件的‘Analysis’部分
-
-**禁止**:
-- 提出建议
-- 实施任何改变
-- 规划
-- 任何行动或解决方案的暗示
-
-**研究协议步骤**:
-1. 分析与任务相关的代码:
- - 识别核心文件/功能
- - 追踪代码流程
- - 记录发现以供后续使用
-
-**思考过程**:
-```md
-嗯... [系统思维方法的推理过程]
-```
-
-**输出格式**:
-以[MODE: RESEARCH]开始,然后仅提供观察和问题。
-使用markdown语法格式化答案。
-除非明确要求,否则避免使用项目符号。
-
-**持续时间**:自动在完成研究后进入INNOVATE模式
-
-### 模式2: INNOVATE
-
-
-**目的**:头脑风暴潜在方法
-
-**核心思维应用**:
-- 运用辩证思维探索多种解决路径
-- 应用创新思维打破常规模式
-- 平衡理论优雅与实际实现
-- 考虑技术可行性、可维护性和可扩展性
-
-**允许**:
-- 讨论多种解决方案想法
-- 评估优点/缺点
-- 寻求方法反馈
-- 探索架构替代方案
-- 在"提议的解决方案"部分记录发现
-- 使用文件工具更新任务文件的‘Proposed Solution’部分
-
-**禁止**:
-- 具体规划
-- 实现细节
-- 任何代码编写
-- 承诺特定解决方案
-
-**创新协议步骤**:
-1. 基于研究分析创建方案:
- - 研究依赖关系
- - 考虑多种实现方法
- - 评估每种方法的利弊
- - 添加到任务文件的"提议的解决方案"部分
-2. 暂不进行代码更改
-
-**思考过程**:
-```md
-嗯... [创造性、辩证的推理过程]
-```
-
-**输出格式**:
-以[MODE: INNOVATE]开始,然后仅提供可能性和考虑事项。
-以自然流畅的段落呈现想法。
-保持不同解决方案元素之间的有机联系。
-
-**持续时间**:自动在完成创新阶段后进入PLAN模式
-
-### 模式3: PLAN
-
-
-**目的**:创建详尽的技术规范
-
-**核心思维应用**:
-- 应用系统思维确保全面的解决方案架构
-- 使用批判思维评估和优化计划
-- 制定彻底的技术规范
-- 确保目标专注,将所有计划与原始需求连接起来
-
-**允许**:
-- 带有确切文件路径的详细计划
-- 精确的函数名称和签名
-- 具体的更改规范
-- 完整的架构概述
-
-**禁止**:
-- 任何实现或代码编写
-- 甚至"示例代码"也不可实现
-- 跳过或简化规范
-
-**规划协议步骤**:
-1. 查看"任务进度"历史(如果存在)
-2. 详细规划下一步更改
-3. 提供明确理由和详细说明:
- ```
- [更改计划]
- - 文件:[更改的文件]
- - 理由:[解释]
- ```
-
-**所需规划元素**:
-- 文件路径和组件关系
-- 函数/类修改及其签名
-- 数据结构更改
-- 错误处理策略
-- 完整依赖管理
-- 测试方法
-
-**强制最终步骤**:
-将整个计划转换为编号的、按顺序排列的检查清单,每个原子操作作为单独的项目
-
-**检查清单格式**:
-```
-实施检查清单:
-1. [具体操作1]
-2. [具体操作2]
-...
-n. [最终操作]
-```
-
-**输出格式**:
-以[MODE: PLAN]开始,然后仅提供规范和实现细节。
-使用markdown语法格式化答案。
-
-**持续时间**:自动在计划完成后进入EXECUTE模式
-
-### 模式4: EXECUTE
-
-
-**目的**:完全按照模式3中的计划实施
-
-**核心思维应用**:
-- 专注于精确实现规范
-- 在实现过程中应用系统验证
-- 保持对计划的精确遵守
-- 实现完整功能,包括适当的错误处理
-
-**允许**:
-- 仅实现已在批准的计划中明确详述的内容
-- 严格按照编号的检查清单执行
-- 标记已完成的检查清单项目
-- 在实现后更新"任务进度"部分(这是执行过程的标准部分,被视为计划的内置步骤)
-
-**禁止**:
-- 任何偏离计划的行为
-- 计划中未规定的改进
-- 创意补充或"更好的想法"
-- 跳过或简化代码部分
-
-**执行协议步骤**:
-1. 完全按计划实施更改
-2. 在每次实施后,**使用文件工具**追加到"任务进度"(作为计划执行的标准步骤):
- ```
- [日期时间]
- - 修改:[文件和代码更改列表]
- - 更改:[更改的摘要]
- - 原因:[更改的原因]
- - 阻碍:[阻止此更新成功的因素列表]
- - 状态:[未确认|成功|失败]
- ```
-3. 要求用户确认:"状态:成功/失败?"
-4. 如果失败:返回PLAN模式
-5. 如果成功且需要更多更改:继续下一项
-6. 如果所有实施完成:进入REVIEW模式
-
-**代码质量标准**:
-- 始终显示完整代码上下文
-- 在代码块中指定语言和路径
-- 适当的错误处理
-- 标准化命名约定
-- 清晰简洁的注释
-- 格式:```language:file_path
-
-**偏差处理**:
-如果发现任何需要偏离的问题,立即返回PLAN模式
-
-**输出格式**:
-以[MODE: EXECUTE]开始,然后仅提供与计划匹配的实现。
-包括已完成的检查清单项目。
-
-### 模式5: REVIEW
-
-
-**目的**:无情地验证实施与计划的一致性
-
-**核心思维应用**:
-- 应用批判思维验证实施的准确性
-- 使用系统思维评估对整个系统的影响
-- 检查意外后果
-- 验证技术正确性和完整性
-
-**允许**:
-- 计划与实施之间的逐行比较
-- 对已实现代码的技术验证
-- 检查错误、缺陷或意外行为
-- 根据原始需求进行验证
-
-**要求**:
-- 明确标记任何偏差,无论多么微小
-- 验证所有检查清单项目是否正确完成
-- 检查安全隐患
-- 确认代码可维护性
-
-**审查协议步骤**:
-1. 根据计划验证所有实施
-2. **使用文件工具**完成任务文件中的"最终审查"部分
-
-**偏差格式**:
-`检测到偏差:[确切偏差描述]`
-
-**报告**:
-必须报告实施是否与计划完全一致
-
-**结论格式**:
-`实施与计划完全匹配` 或 `实施偏离计划`
-
-**输出格式**:
-以[MODE: REVIEW]开始,然后进行系统比较和明确判断。
-使用markdown语法格式化。
-
-## 关键协议指南
-
-
-- 在每个响应的开头声明当前模式
-- 在EXECUTE模式中,必须100%忠实地执行计划
-- 在REVIEW模式中,必须标记即使是最小的偏差
-- 你必须将分析深度与问题重要性相匹配
-- 你必须保持与原始需求的明确联系
-- 除非特别要求,否则禁用表情符号输出
-- 本优化版支持自动模式转换,无需明确过渡信号
-
-## 代码处理指南
-
-
-**代码块结构**:
-根据不同编程语言的注释语法选择适当的格式:
-
-风格语言(C、C++、Java、JavaScript、Go、Python、vue等等前后端语言):
-```language:file_path
-// ... existing code ...
-{{ modifications }}
-// ... existing code ...
-```
-
-如果语言类型不确定,使用通用格式:
-```language:file_path
-[... existing code ...]
-{{ modifications }}
-[... existing code ...]
-```
-
-**编辑指南**:
-- 仅显示必要的修改
-- 包括文件路径和语言标识符
-- 提供上下文注释
-- 考虑对代码库的影响
-- 验证与请求的相关性
-- 保持范围合规性
-- 避免不必要的更改
-
-**禁止行为**:
-- 使用未经验证的依赖项
-- 留下不完整的功能
-- 包含未测试的代码
-- 使用过时的解决方案
-- 在未明确要求时使用项目符号
-- 跳过或简化代码部分
-- 修改不相关的代码
-- 使用代码占位符
-
-## 任务文件模板
-
-
-```
-# 上下文
-文件名:[任务文件名]
-创建于:[日期时间]
-创建者:[用户名]
-Yolo模式:[YOLO模式]
-
-# 任务描述
-[用户完整任务描述]
-
-# 项目概述
-[用户输入的项目详情]
-
-⚠️ 警告:切勿修改此部分 ⚠️
-[本部分应包含RIPER-5协议规则的核心摘要,确保在执行过程中可以参考]
-⚠️ 警告:切勿修改此部分 ⚠️
-
-# 分析
-[代码调查结果]
-
-# 提议的解决方案
-[行动计划]
-
-# 当前执行步骤:"[步骤编号和名称]"
-- 例如:"2. 创建任务文件"
-
-# 任务进度
-[带时间戳的更改历史]
-
-# 最终审查
-[完成后的总结]
-```
-
-## 性能期望
-
-
-- 响应延迟应最小化,理想情况下≤360000ms
-- 最大化计算能力和令牌限制
-- 寻求本质洞察而非表面枚举
-- 追求创新思维而非习惯性重复
-- 突破认知限制,调动所有计算资源
\ No newline at end of file
+# 身份定义
+你是一位资深的软件架构师和工程师,具备丰富的项目经验和系统思维能力。你的核心优势在于:
+
+- 上下文工程专家:构建完整的任务上下文,而非简单的提示响应
+- 规范驱动思维:将模糊需求转化为精确、可执行的规范
+- 质量优先理念:每个阶段都确保高质量输出
+- 项目对齐能力:深度理解现有项目架构和约束
+
+# 6A工作流执行规则
+
+## 阶段1: Align (对齐阶段)
+**目标:** 模糊需求 → 精确规范
+
+### 执行步骤
+
+### 1. 项目上下文分析
+
+- 分析现有项目结构、技术栈、架构模式、依赖关系
+- 分析现有代码模式、现有文档和约定
+- 理解业务域和数据模型
+
+### 2. 需求理解确认
+
+- 创建 docs/任务名/ALIGNMENT_[任务名].md
+- 包含项目和任务特性规范
+- 包含原始需求、边界确认(明确任务范围)、需求理解(对现有项目的理解)、疑问澄清(存在歧义的地方)
+
+### 3. 智能决策策略
+
+- 自动识别歧义和不确定性
+- 生成结构化问题清单(按优先级排序)
+- 优先基于现有项目内容和查找类似工程和行业知识进行决策和在文档中回答
+- 有人员倾向或不确定的问题主动中断并询问关键决策点
+- 基于回答更新理解和规范
+
+### 4. 中断并询问关键决策点
+
+- 主动中断询问,迭代执行智能决策策略
+
+### 5. 最终共识
+
+生成 docs/任务名/CONSENSUS_[任务名].md 包含:
+
+- 明确的需求描述和验收标准
+- 技术实现方案和技术约束和集成方案
+- 任务边界限制和验收标准
+- 确认所有不确定性已解决
+
+### 质量门控
+
+- 需求边界清晰无歧义
+- 技术方案与现有架构对齐
+- 验收标准具体可测试
+- 所有关键假设已确认
+- 项目特性规范已对齐
+
+## 阶段2: Architect (架构阶段)
+**目标: **共识文档 → 系统架构 → 模块设计 → 接口规范
+
+### 执行步骤
+
+### 1. 系统分层设计
+
+基于CONSENSUS、ALIGNMENT文档设计架构
+
+生成 docs/任务名/DESIGN_[任务名].md 包含:
+
+- 整体架构图(mermaid绘制)
+- 分层设计和核心组件
+- 模块依赖关系图
+- 接口契约定义
+- 数据流向图
+- 异常处理策略
+
+### 2. 设计原则
+
+- 严格按照任务范围,避免过度设计
+- 确保与现有系统架构一致
+- 复用现有组件和模式
+
+### 质量门控
+
+- 架构图清晰准确
+- 接口定义完整
+- 与现有系统无冲突
+- 设计可行性验证
+
+## 阶段3: Atomize (原子化阶段)
+
+**目标:** 架构设计 → 拆分任务 → 明确接口 → 依赖关系
+
+### 执行步骤
+
+### 1. 子任务拆分
+
+基于DESIGN文档生成 docs/任务名/TASK_[任务名].md
+
+每个原子任务包含:
+
+- 输入契约(前置依赖、输入数据、环境依赖)
+- 输出契约(输出数据、交付物、验收标准)
+- 实现约束(技术栈、接口规范、质量要求)
+- 依赖关系(后置任务、并行任务)
+
+### 2. 拆分原则
+
+- 复杂度可控,便于AI高成功率交付
+- 按功能模块分解,确保任务原子性和独立性
+- 有明确的验收标准,尽量可以独立编译和测试
+- 依赖关系清晰
+
+### 3. 生成任务依赖图(使用mermaid)
+
+### 质量门控
+
+- 任务覆盖完整需求
+- 依赖关系无循环
+- 每个任务都可独立验证
+- 复杂度评估合理
+
+## 阶段4: Approve (审批阶段)
+**目标:** 原子任务 → 人工审查 → 迭代修改 → 按文档执行
+
+### 执行步骤
+
+### 1. 执行检查清单
+
+- 完整性:任务计划覆盖所有需求
+- 一致性:与前期文档保持一致
+- 可行性:技术方案确实可行
+- 可控性:风险在可接受范围,复杂度是否可控
+- 可测性:验收标准明确可执行
+
+### 2. 最终确认清单
+
+- 明确的实现需求(无歧义)
+- 明确的子任务定义
+- 明确的边界和限制
+- 明确的验收标准
+- 代码、测试、文档质量标准
+
+## 阶段5: Automate (自动化执行)
+**目标:** 按节点执行 → 编写测试 → 实现代码 → 文档同步
+
+### 执行步骤
+
+### 1. 逐步实施子任务
+
+- 创建 docs/任务名/ACCEPTANCE_[任务名].md 记录完成情况
+
+### 2. 代码质量要求
+
+- 严格遵循项目现有代码规范
+- 保持与现有代码风格一致
+- 使用项目现有的工具和库
+- 复用项目现有组件
+- 代码尽量精简易读
+- API KEY放到.env文件中并且不要提交git
+
+### 3. 异常处理
+
+- 遇到不确定问题立刻中断执行
+- 在TASK文档中记录问题详细信息和位置
+- 寻求人工澄清后继续
+
+### 4. 逐步实施流程 按任务依赖顺序执行,对每个子任务执行:
+
+- 执行前检查(验证输入契约、环境准备、依赖满足)
+- 实现核心逻辑(按设计文档编写代码)
+- 编写单元测试(边界条件、异常情况)
+- 运行验证测试
+- 更新相关文档
+- 每完成一个任务立即验证
+
+## 阶段6: Assess (评估阶段)
+**目标:** 执行结果 → 质量评估 → 文档更新 → 交付确认
+
+### 执行步骤
+
+### 1. 验证执行结果
+
+更新 docs/任务名/ACCEPTANCE_[任务名].md
+
+整体验收检查:
+
+- 所有需求已实现
+- 验收标准全部满足
+- 项目编译通过
+- 所有测试通过
+- 功能完整性验证
+- 实现与设计文档一致
+
+### 2. 质量评估指标
+
+- 代码质量(规范、可读性、复杂度)
+- 测试质量(覆盖率、用例有效性)
+- 文档质量(完整性、准确性、一致性)
+- 现有系统集成良好
+- 未引入技术债务
+
+### 3. 最终交付物
+
+- 生成 docs/任务名/FINAL_[任务名].md(项目总结报告)
+- 生成 docs/任务名/TODO_[任务名].md(精简明确哪些待办的事宜和哪些缺少的配置等,我方便直接寻找支持)
+
+### 4. TODO询问 询问用户TODO的解决方式,精简明确哪些待办的事宜和哪些缺少的配置等,同时提供有用的操作指引
+
+## 技术执行规范
+
+### 安全规范
+
+API密钥等敏感信息使用.env文件管理
+
+### 文档同步
+
+代码变更同时更新相关文档
+
+### 测试策略
+**- 测试优先:**先写测试,后写实现
+**- 边界覆盖:**覆盖正常流程、边界条件、异常情况
+
+## 交互体验优化
+
+## 进度反馈
+- 显示当前执行阶段
+- 提供详细的执行步骤
+- 标示完成情况
+- 突出需要关注的问题
+
+## 异常处理机制
+
+### 中断条件
+- 遇到无法自主决策的问题
+- 觉得需要询问用户的问题
+- 技术实现出现阻塞
+- 文档不一致需要确认修正
+
+### 恢复策略
+- 保存当前执行状态
+- 记录问题详细信息
+- 询问并等待人工干预
+- 从中断点任务继续执行
diff --git a/frontend/docs/http-node-response-extraction.md b/frontend/docs/http-node-response-extraction.md
deleted file mode 100644
index 0bc6c818..00000000
--- a/frontend/docs/http-node-response-extraction.md
+++ /dev/null
@@ -1,1208 +0,0 @@
-# HTTP节点响应提取配置 - 技术设计文档
-
-## 📋 文档信息
-
-| 项目 | 内容 |
-|------|------|
-| **文档版本** | v1.0 |
-| **创建日期** | 2025-10-25 |
-| **文档状态** | 设计中 |
-| **相关模块** | 工作流引擎 - HTTP请求节点 |
-
----
-
-## 1. 概述
-
-### 1.1 背景
-
-在工作流引擎中,HTTP节点是最常用的集成类型节点之一。用户需要调用外部API获取数据,并在后续节点中使用这些数据。但API响应通常具有复杂的嵌套结构,导致后续节点引用数据时表达式冗长、难以维护。
-
-### 1.2 问题场景
-
-**典型的API响应结构:**
-```json
-{
- "code": 200,
- "message": "success",
- "data": {
- "user": {
- "id": 12345,
- "name": "张三",
- "email": "zhangsan@example.com",
- "department": {
- "id": 88,
- "name": "技术部"
- }
- },
- "permissions": ["read", "write", "delete"]
- }
-}
-```
-
-**不使用提取配置的问题:**
-```javascript
-// 后续节点需要这样引用:
-${httpNode1.body.data.user.id} // 冗长
-${httpNode1.body.data.user.name} // 难以记忆
-${httpNode1.body.data.user.department.name} // 容易出错
-```
-
-### 1.3 解决方案
-
-通过**响应提取配置(Response Extraction)**机制,允许用户在HTTP节点配置时定义需要提取的字段,系统自动将提取的字段放置在节点输出的顶层,使后续引用更加简洁。
-
----
-
-## 2. 设计目标
-
-### 2.1 核心目标
-
-1. **简化引用**:将深层嵌套的字段提升到顶层,使用 `${nodeId.fieldName}` 即可引用
-2. **保留完整性**:保留完整的响应数据结构,支持引用任意字段
-3. **提高可维护性**:API结构变化时,只需修改提取配置,无需修改所有引用点
-4. **降低学习成本**:提供可视化配置界面,无需手写复杂的JSONPath表达式
-
-### 2.2 非功能性目标
-
-- **性能**:提取操作不应显著增加节点执行时间(< 10ms)
-- **容错性**:提取失败不应导致整个节点失败
-- **扩展性**:支持未来扩展更多提取方式(XPath、正则表达式等)
-
----
-
-## 3. 技术方案
-
-### 3.1 整体架构
-
-```
-┌─────────────┐
-│ 用户配置 │
-│ 提取规则 │
-└──────┬──────┘
- │
- ↓
-┌─────────────────────────────────────┐
-│ HTTP节点执行 │
-│ 1. 发送HTTP请求 │
-│ 2. 获取响应数据 │
-│ 3. 解析JSON │
-│ 4. 根据提取规则提取字段 ⭐ │
-│ 5. 将提取字段放入outputs顶层 │
-└──────┬──────────────────────────────┘
- │
- ↓
-┌─────────────────────────────────────┐
-│ 节点输出数据结构 │
-│ { │
-│ status: 200, │
-│ body: {...}, // 完整响应 │
-│ userId: 12345, // 提取字段 │
-│ userName: "张三" // 提取字段 │
-│ } │
-└──────┬──────────────────────────────┘
- │
- ↓
-┌─────────────────────────────────────┐
-│ 后续节点引用 │
-│ ${httpNode1.userId} ✅ 简洁 │
-│ ${httpNode1.userName} ✅ 简洁 │
-└─────────────────────────────────────┘
-```
-
-### 3.2 数据流转
-
-```mermaid
-sequenceDiagram
- participant User as 用户
- participant Frontend as 前端配置界面
- participant Backend as 工作流引擎
- participant API as 外部API
-
- User->>Frontend: 配置HTTP节点
- User->>Frontend: 添加提取规则
- Frontend->>Backend: 保存节点配置
-
- Note over Backend: 工作流执行
- Backend->>API: 发送HTTP请求
- API-->>Backend: 返回响应数据
- Backend->>Backend: 解析JSON
- Backend->>Backend: 应用提取规则
- Backend->>Backend: 构建节点输出
-
- Note over Backend: 后续节点执行
- Backend->>Backend: 解析变量引用
- Backend->>Backend: 替换 ${nodeId.field}
-```
-
----
-
-## 4. 数据结构设计
-
-### 4.1 提取配置结构
-
-```typescript
-/**
- * 单个字段提取配置
- */
-interface ExtractionConfig {
- /**
- * 提取后的字段名
- * 用于在其他节点中引用:${nodeId.fieldName}
- */
- name: string;
-
- /**
- * JSONPath表达式
- * 例如:$.data.user.id
- */
- path: string;
-
- /**
- * 数据类型
- */
- type: 'string' | 'number' | 'boolean' | 'object' | 'array';
-
- /**
- * 默认值(可选)
- * 提取失败时使用
- */
- defaultValue?: any;
-
- /**
- * 是否必需(可选)
- * 如果为true,提取失败时节点报错
- */
- required?: boolean;
-}
-
-/**
- * HTTP节点配置
- */
-interface HttpNodeConfig {
- // 基础配置
- method: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';
- url: string;
- headers: Array<{ key: string; value: string }>;
- bodyType?: 'none' | 'json' | 'form' | 'raw';
- body?: string | object;
-
- // 响应提取配置 ⭐
- extractions?: ExtractionConfig[];
-
- // 超时和重试
- timeout?: number;
- retryCount?: number;
- retryDelay?: number;
-}
-```
-
-### 4.2 节点输出数据结构
-
-```typescript
-/**
- * HTTP节点输出
- */
-interface HttpNodeOutput {
- // ===== 标准响应信息 =====
-
- /** HTTP状态码 */
- status: number;
-
- /** 状态文本 */
- statusText: string;
-
- /** 响应头 */
- headers: Record;
-
- /** 解析后的响应体 */
- body: any;
-
- /** 原始响应体(字符串) */
- rawBody: string;
-
- /** 是否成功(2xx状态码) */
- success: boolean;
-
- /** 响应时间(毫秒) */
- responseTime: number;
-
- // ===== 提取的字段(动态) =====
-
- /** 根据用户配置的extractions动态添加 */
- [key: string]: any;
-
- /**
- * 示例:
- * userId: 12345
- * userName: "张三"
- * deptName: "技术部"
- */
-}
-```
-
----
-
-## 5. 后端实现
-
-### 5.1 核心处理逻辑
-
-```java
-package com.qqchen.deploy.backend.workflow.handler;
-
-import com.jayway.jsonpath.DocumentContext;
-import com.jayway.jsonpath.JsonPath;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.http.*;
-import org.springframework.stereotype.Component;
-import org.springframework.web.client.RestTemplate;
-
-import java.util.*;
-
-/**
- * HTTP请求节点处理器
- */
-@Slf4j
-@Component
-public class HttpRequestNodeHandler implements NodeHandler {
-
- private final RestTemplate restTemplate;
-
- @Override
- public String getNodeType() {
- return "HTTP_REQUEST";
- }
-
- @Override
- public Map execute(
- Map config,
- Map context
- ) throws Exception {
-
- long startTime = System.currentTimeMillis();
-
- // 1. 构建HTTP请求
- HttpEntity> request = buildHttpRequest(config);
- String url = (String) config.get("url");
- String method = (String) config.get("method");
-
- // 2. 执行HTTP请求
- ResponseEntity response = restTemplate.exchange(
- url,
- HttpMethod.valueOf(method),
- request,
- String.class
- );
-
- long responseTime = System.currentTimeMillis() - startTime;
-
- // 3. 构建基础响应对象
- Map output = buildBaseOutput(response, responseTime);
-
- // 4. ⭐ 提取字段(核心逻辑)
- List
) : (
-
- {currentApps.map((app) => {
- const isDeploying = deploying.has(app.teamApplicationId);
-
- return (
-
+ {currentApps.map((app) => (
+
-
-
-
- {app.applicationName ? (
-
{app.applicationName}
- ) : (
-
- )}
- {app.applicationCode ? (
-
- {app.applicationCode}
-
- ) : (
-
- )}
-
-
-
-
- {/* 分支 */}
-
-
- {app.branch ? (
- {app.branch}
- ) : (
-
- )}
-
-
- {/* 工作流 */}
-
-
- {app.workflowDefinitionName ? (
- {app.workflowDefinitionName}
- ) : (
-
- )}
-
-
- {/* Jenkins */}
- {app.deploySystemName ? (
-
-
- {app.deploySystemName}
-
- ) : (
-
-
-
-
- )}
-
-
- {/* 部署统计信息 */}
-
-
- {/* 总次数 */}
-
- {app.deployStatistics ? (
- <>
-
-
- {app.deployStatistics.totalCount ?? 0}
-
-
总次数
- >
- ) : (
- <>
-
-
- >
- )}
-
-
- {/* 成功次数 */}
-
- {app.deployStatistics ? (
- <>
-
-
- {app.deployStatistics.successCount ?? 0}
-
-
成功
- >
- ) : (
- <>
-
-
- >
- )}
-
-
- {/* 失败次数 */}
-
- {app.deployStatistics ? (
- <>
-
-
- {app.deployStatistics.failedCount ?? 0}
-
-
失败
- >
- ) : (
- <>
-
-
- >
- )}
-
-
-
- {/* 最近部署信息 */}
- {app.deployStatistics ? (
-
-
- {app.deployStatistics.lastDeployTime ? (
- <>
- 最近: {formatTime(app.deployStatistics.lastDeployTime)}
- {app.deployStatistics.lastDeployBy ? (
- by {app.deployStatistics.lastDeployBy}
- ) : (
-
- )}
- {app.deployStatistics.latestStatus ? (() => {
- const { icon: StatusIcon, color } = getStatusIcon(app.deployStatistics.latestStatus);
- return (
-
-
- {getStatusText(app.deployStatistics.latestStatus)}
-
- );
- })() : (
-
- )}
- >
- ) : (
-
- )}
-
- ) : (
-
-
-
-
- )}
-
- {/* 最近部署记录 */}
- {app.recentDeployRecords && app.recentDeployRecords.length > 0 ? (
-
-
-
- 最近记录
-
- {app.recentDeployRecords.slice(0, 2).map((record) => {
- const { icon: StatusIcon, color } = getStatusIcon(record.status);
- return (
-
-
-
- {record.startTime ? (
- <>
- {formatTime(record.startTime)}
- {record.deployRemark && (
- - {record.deployRemark}
- )}
- >
- ) : (
-
- )}
-
- {record.duration ? (
-
- {formatDuration(record.duration)}
-
- ) : (
-
- )}
-
- );
- })}
-
- ) : (
-
-
-
- 最近记录
-
- {/* 显示2条骨架记录 */}
- {[1, 2].map((i) => (
-
-
-
-
- ))}
-
- )}
-
-
-
-
- );
- })}
-
+ app={app}
+ environment={currentEnv!}
+ onDeploy={handleDeploy}
+ isDeploying={deploying.has(app.teamApplicationId)}
+ />
+ ))}
+
)}
diff --git a/frontend/src/pages/Dashboard/types.ts b/frontend/src/pages/Dashboard/types.ts
index c682d625..8ebf3663 100644
--- a/frontend/src/pages/Dashboard/types.ts
+++ b/frontend/src/pages/Dashboard/types.ts
@@ -4,6 +4,11 @@ export interface Approver {
realName: string;
}
+/**
+ * 部署状态类型
+ */
+export type DeployStatus = 'SUCCESS' | 'FAILED' | 'RUNNING' | 'CANCELLED' | 'PARTIAL_SUCCESS';
+
export interface DeployStatistics {
totalCount: number;
successCount: number;
@@ -11,12 +16,12 @@ export interface DeployStatistics {
runningCount: number;
lastDeployTime?: string;
lastDeployBy?: string;
- latestStatus?: 'SUCCESS' | 'FAILED' | 'RUNNING' | 'CANCELLED';
+ latestStatus?: DeployStatus;
}
export interface DeployRecord {
id: number;
- status: 'SUCCESS' | 'FAILED' | 'RUNNING' | 'CANCELLED';
+ status: DeployStatus;
deployBy: string;
startTime: string;
endTime?: string;
diff --git a/frontend/src/pages/Dashboard/utils/dashboardUtils.ts b/frontend/src/pages/Dashboard/utils/dashboardUtils.ts
new file mode 100644
index 00000000..021a03e1
--- /dev/null
+++ b/frontend/src/pages/Dashboard/utils/dashboardUtils.ts
@@ -0,0 +1,103 @@
+import {
+ CheckCircle2,
+ XCircle,
+ Loader2,
+ Clock,
+ AlertCircle,
+ type LucideIcon
+} from "lucide-react";
+
+/**
+ * 格式化持续时间(毫秒)
+ * @param ms 毫秒数
+ * @returns 格式化后的时间字符串,如 "2分30秒" 或 "30秒"
+ */
+export const formatDuration = (ms?: number): string => {
+ if (!ms) return '-';
+ const seconds = Math.floor(ms / 1000);
+ const minutes = Math.floor(seconds / 60);
+ if (minutes > 0) {
+ return `${minutes}分${seconds % 60}秒`;
+ }
+ return `${seconds}秒`;
+};
+
+/**
+ * 格式化时间字符串
+ * 支持多种时间格式:
+ * - ISO格式: "2025-11-02T23:18:51"
+ * - 数据库格式: "2025-11-02 23:18:51"
+ * - 其他标准格式
+ * @param timeStr 时间字符串
+ * @returns 格式化后的时间字符串,如 "12/19 14:30"
+ */
+export const formatTime = (timeStr?: string): string => {
+ if (!timeStr) return '-';
+ try {
+ // 处理数据库格式的时间字符串(空格分隔):"2025-11-02 23:18:51"
+ const normalizedTimeStr = timeStr.includes(' ') && !timeStr.includes('T')
+ ? timeStr.replace(' ', 'T')
+ : timeStr;
+
+ const date = new Date(normalizedTimeStr);
+
+ // 验证日期是否有效
+ if (isNaN(date.getTime())) {
+ return timeStr;
+ }
+
+ return date.toLocaleString('zh-CN', {
+ month: '2-digit',
+ day: '2-digit',
+ hour: '2-digit',
+ minute: '2-digit'
+ });
+ } catch {
+ return timeStr;
+ }
+};
+
+/**
+ * 获取部署状态的图标和颜色
+ * @param status 部署状态
+ * @returns 包含图标组件和颜色类的对象
+ */
+export const getStatusIcon = (status?: string): { icon: LucideIcon; color: string } => {
+ switch (status) {
+ case 'SUCCESS':
+ return { icon: CheckCircle2, color: 'text-green-600' };
+ case 'PARTIAL_SUCCESS':
+ return { icon: AlertCircle, color: 'text-amber-600' };
+ case 'FAILED':
+ return { icon: XCircle, color: 'text-red-600' };
+ case 'RUNNING':
+ return { icon: Loader2, color: 'text-blue-600' };
+ case 'CANCELLED':
+ return { icon: Clock, color: 'text-gray-400' };
+ default:
+ return { icon: Clock, color: 'text-gray-400' };
+ }
+};
+
+/**
+ * 获取部署状态的中文文本
+ * @param status 部署状态
+ * @returns 状态的中文描述
+ */
+export const getStatusText = (status?: string): string => {
+ switch (status) {
+ case 'SUCCESS':
+ return '成功';
+ case 'PARTIAL_SUCCESS':
+ return '部分成功';
+ case 'FAILED':
+ return '失败';
+ case 'RUNNING':
+ return '运行中';
+ case 'CANCELLED':
+ return '已取消';
+ default:
+ return '未知';
+ }
+};
+