|
| 1 | +# 场景模式实现总结 (Scenario Mode Implementation Summary) |
| 2 | + |
| 3 | +## 📊 实现统计 (Implementation Statistics) |
| 4 | + |
| 5 | +- **新增文件**: 8 个 (8 new files) |
| 6 | +- **修改文件**: 6 个 (6 modified files) |
| 7 | +- **代码行数**: ~2,100 行新增代码 (~2,100 lines of new code) |
| 8 | +- **功能数量**: 5 种触发器 + 4 种动作 (5 triggers + 4 actions) |
| 9 | +- **语言支持**: 中文 + 英文 (Chinese + English) |
| 10 | + |
| 11 | +## 🎯 核心功能实现 (Core Features Implemented) |
| 12 | + |
| 13 | +### 1. 数据模型 (Data Models) |
| 14 | +``` |
| 15 | +back/data/scenario.ts - 场景数据模型 (117 lines) |
| 16 | +back/data/scenarioLog.ts - 日志数据模型 (58 lines) |
| 17 | +``` |
| 18 | + |
| 19 | +**特性**: |
| 20 | +- 完整的场景配置存储 |
| 21 | +- 触发器、条件、动作的灵活配置 |
| 22 | +- 执行统计和状态跟踪 |
| 23 | +- 详细的日志记录 |
| 24 | + |
| 25 | +### 2. 后端服务 (Backend Service) |
| 26 | +``` |
| 27 | +back/services/scenario.ts - 场景服务 (501 lines) |
| 28 | +``` |
| 29 | + |
| 30 | +**核心功能**: |
| 31 | +- ✅ 场景生命周期管理(创建、更新、删除) |
| 32 | +- ✅ 5 种触发器实现 |
| 33 | +- ✅ 条件评估引擎 |
| 34 | +- ✅ 动作执行引擎 |
| 35 | +- ✅ 失败熔断机制 |
| 36 | +- ✅ 自适应重试策略 |
| 37 | +- ✅ 完整的日志系统 |
| 38 | + |
| 39 | +### 3. API 接口 (API Endpoints) |
| 40 | +``` |
| 41 | +back/api/scenario.ts - REST API (214 lines) |
| 42 | +``` |
| 43 | + |
| 44 | +**端点列表**: |
| 45 | +- `GET /api/scenarios` - 获取场景列表 |
| 46 | +- `POST /api/scenarios` - 创建场景 |
| 47 | +- `PUT /api/scenarios` - 更新场景 |
| 48 | +- `DELETE /api/scenarios` - 删除场景 |
| 49 | +- `POST /api/scenarios/:id/trigger` - 手动触发 |
| 50 | +- `GET /api/scenarios/:id/webhook` - 获取 Webhook URL |
| 51 | +- `GET /api/scenarios/logs` - 查询日志 |
| 52 | +- `POST /api/scenarios/webhook/:token` - Webhook 触发 |
| 53 | + |
| 54 | +### 4. 前端界面 (Frontend UI) |
| 55 | +``` |
| 56 | +src/pages/scenario/index.tsx - 主页面 (318 lines) |
| 57 | +src/pages/scenario/modal.tsx - 编辑器 (443 lines) |
| 58 | +src/pages/scenario/logModal.tsx - 日志查看 (130 lines) |
| 59 | +``` |
| 60 | + |
| 61 | +**界面功能**: |
| 62 | +- 📋 场景列表管理 |
| 63 | +- ✏️ 可视化场景编辑器 |
| 64 | +- 🔧 动态触发器配置 |
| 65 | +- 🧩 条件构建器 (AND/OR) |
| 66 | +- ⚡ 动作配置器 |
| 67 | +- 📊 执行统计展示 |
| 68 | +- 📝 日志查看器 |
| 69 | +- 🔗 Webhook 管理 |
| 70 | + |
| 71 | +### 5. 国际化支持 (i18n) |
| 72 | +``` |
| 73 | +src/locales/zh-CN.json - 中文翻译 (+72 entries) |
| 74 | +src/locales/en-US.json - 英文翻译 (+72 entries) |
| 75 | +``` |
| 76 | + |
| 77 | +## 🔧 技术架构 (Technical Architecture) |
| 78 | + |
| 79 | +``` |
| 80 | +┌─────────────────────────────────────────────────────────┐ |
| 81 | +│ 前端层 (Frontend) │ |
| 82 | +├─────────────────────────────────────────────────────────┤ |
| 83 | +│ 场景列表 │ 场景编辑器 │ 日志查看器 │ |
| 84 | +│ (List) │ (Editor) │ (Log Viewer) │ |
| 85 | +└─────────────────────────────────────────────────────────┘ |
| 86 | + ↕ HTTP API |
| 87 | +┌─────────────────────────────────────────────────────────┐ |
| 88 | +│ API 层 (API Layer) │ |
| 89 | +├─────────────────────────────────────────────────────────┤ |
| 90 | +│ 场景管理 │ 手动触发 │ Webhook │ 日志 │ |
| 91 | +│ (CRUD) │ (Trigger) │ (External) │ (Logs) │ |
| 92 | +└─────────────────────────────────────────────────────────┘ |
| 93 | + ↕ Service Layer |
| 94 | +┌─────────────────────────────────────────────────────────┐ |
| 95 | +│ 服务层 (Service Layer) │ |
| 96 | +├─────────────────────────────────────────────────────────┤ |
| 97 | +│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ |
| 98 | +│ │ 触发器管理 │ │ 条件评估引擎 │ │ 动作执行引擎 │ │ |
| 99 | +│ │ (Triggers) │ │ (Conditions) │ │ (Actions) │ │ |
| 100 | +│ └──────────────┘ └──────────────┘ └──────────────┘ │ |
| 101 | +│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ |
| 102 | +│ │ 失败熔断 │ │ 重试策略 │ │ 日志记录 │ │ |
| 103 | +│ │ (Breaker) │ │ (Retry) │ │ (Logging) │ │ |
| 104 | +│ └──────────────┘ └──────────────┘ └──────────────┘ │ |
| 105 | +└─────────────────────────────────────────────────────────┘ |
| 106 | + ↕ Data Layer |
| 107 | +┌─────────────────────────────────────────────────────────┐ |
| 108 | +│ 数据层 (Data Layer) │ |
| 109 | +├─────────────────────────────────────────────────────────┤ |
| 110 | +│ Scenario 表 │ ScenarioLog 表 │ |
| 111 | +│ (场景配置) │ (执行日志) │ |
| 112 | +└─────────────────────────────────────────────────────────┘ |
| 113 | +``` |
| 114 | + |
| 115 | +## 🎨 触发器详解 (Trigger Details) |
| 116 | + |
| 117 | +### 1. Variable Monitor (变量监听) |
| 118 | +```javascript |
| 119 | +{ |
| 120 | + triggerType: 'variable', |
| 121 | + triggerConfig: { |
| 122 | + watchPath: '/path/to/watch' |
| 123 | + } |
| 124 | +} |
| 125 | +``` |
| 126 | +**工作原理**: 使用 chokidar 监控文件系统变化 |
| 127 | + |
| 128 | +### 2. Webhook Trigger (Webhook 触发) |
| 129 | +```javascript |
| 130 | +{ |
| 131 | + triggerType: 'webhook', |
| 132 | + triggerConfig: { |
| 133 | + token: 'auto-generated-or-custom' |
| 134 | + } |
| 135 | +} |
| 136 | +``` |
| 137 | +**工作原理**: 生成唯一 Token,通过 HTTP POST 接收触发 |
| 138 | + |
| 139 | +### 3. Task Status Trigger (任务状态) |
| 140 | +```javascript |
| 141 | +{ |
| 142 | + triggerType: 'task_status', |
| 143 | + triggerConfig: { |
| 144 | + cronId: 123, |
| 145 | + status: 'success' // or 'failure' |
| 146 | + } |
| 147 | +} |
| 148 | +``` |
| 149 | +**工作原理**: 监听定时任务执行结果 |
| 150 | + |
| 151 | +### 4. Time Trigger (时间触发) |
| 152 | +```javascript |
| 153 | +{ |
| 154 | + triggerType: 'time', |
| 155 | + triggerConfig: { |
| 156 | + schedule: '0 0 * * *' // Cron expression |
| 157 | + } |
| 158 | +} |
| 159 | +``` |
| 160 | +**工作原理**: 使用 Cron 表达式定时触发 |
| 161 | + |
| 162 | +### 5. System Event Trigger (系统事件) |
| 163 | +```javascript |
| 164 | +{ |
| 165 | + triggerType: 'system_event', |
| 166 | + triggerConfig: { |
| 167 | + eventType: 'disk_space', // or 'memory' |
| 168 | + threshold: 80, // percentage |
| 169 | + checkInterval: 60000 // milliseconds |
| 170 | + } |
| 171 | +} |
| 172 | +``` |
| 173 | +**工作原理**: 定期检查系统资源使用率 |
| 174 | + |
| 175 | +## 🧩 条件逻辑示例 (Condition Logic Examples) |
| 176 | + |
| 177 | +### AND 逻辑(全部满足) |
| 178 | +```json |
| 179 | +{ |
| 180 | + "conditionLogic": "AND", |
| 181 | + "conditions": [ |
| 182 | + { "field": "status", "operator": "equals", "value": "success" }, |
| 183 | + { "field": "branch", "operator": "equals", "value": "main" } |
| 184 | + ] |
| 185 | +} |
| 186 | +``` |
| 187 | + |
| 188 | +### OR 逻辑(任一满足) |
| 189 | +```json |
| 190 | +{ |
| 191 | + "conditionLogic": "OR", |
| 192 | + "conditions": [ |
| 193 | + { "field": "branch", "operator": "equals", "value": "main" }, |
| 194 | + { "field": "branch", "operator": "equals", "value": "develop" } |
| 195 | + ] |
| 196 | +} |
| 197 | +``` |
| 198 | + |
| 199 | +### 支持的操作符 |
| 200 | +- `equals` - 等于 |
| 201 | +- `not_equals` - 不等于 |
| 202 | +- `greater_than` - 大于 |
| 203 | +- `less_than` - 小于 |
| 204 | +- `contains` - 包含 |
| 205 | +- `not_contains` - 不包含 |
| 206 | + |
| 207 | +## ⚡ 动作类型详解 (Action Types) |
| 208 | + |
| 209 | +### 1. Run Task (运行任务) |
| 210 | +```json |
| 211 | +{ |
| 212 | + "type": "run_task", |
| 213 | + "cronId": 123 |
| 214 | +} |
| 215 | +``` |
| 216 | + |
| 217 | +### 2. Set Variable (设置变量) |
| 218 | +```json |
| 219 | +{ |
| 220 | + "type": "set_variable", |
| 221 | + "name": "DEPLOY_STATUS", |
| 222 | + "value": "completed" |
| 223 | +} |
| 224 | +``` |
| 225 | + |
| 226 | +### 3. Execute Command (执行命令) |
| 227 | +```json |
| 228 | +{ |
| 229 | + "type": "execute_command", |
| 230 | + "command": "rm -rf /tmp/cache/*" |
| 231 | +} |
| 232 | +``` |
| 233 | + |
| 234 | +### 4. Send Notification (发送通知) |
| 235 | +```json |
| 236 | +{ |
| 237 | + "type": "send_notification", |
| 238 | + "message": "Deployment completed successfully" |
| 239 | +} |
| 240 | +``` |
| 241 | + |
| 242 | +## 🛡️ 可靠性机制 (Reliability Mechanisms) |
| 243 | + |
| 244 | +### 失败熔断 (Circuit Breaker) |
| 245 | +```javascript |
| 246 | +{ |
| 247 | + failureThreshold: 3, // 连续失败 3 次后自动禁用 |
| 248 | + consecutiveFailures: 0 // 当前连续失败次数 |
| 249 | +} |
| 250 | +``` |
| 251 | + |
| 252 | +### 自适应重试 (Adaptive Retry) |
| 253 | +```javascript |
| 254 | +{ |
| 255 | + retryStrategy: { |
| 256 | + maxRetries: 3, // 最多重试 3 次 |
| 257 | + retryDelay: 5, // 基础延迟 5 秒 |
| 258 | + backoffMultiplier: 2 // 每次延迟翻倍 |
| 259 | + } |
| 260 | +} |
| 261 | +// 重试延迟: 5s, 10s, 20s |
| 262 | +``` |
| 263 | + |
| 264 | +### 延迟执行 (Delayed Execution) |
| 265 | +```javascript |
| 266 | +{ |
| 267 | + delayExecution: 30 // 触发后延迟 30 秒执行 |
| 268 | +} |
| 269 | +``` |
| 270 | + |
| 271 | +## 📈 统计信息 (Statistics) |
| 272 | + |
| 273 | +每个场景实时跟踪: |
| 274 | +- `executionCount` - 总执行次数 |
| 275 | +- `successCount` - 成功次数 |
| 276 | +- `failureCount` - 失败次数 |
| 277 | +- `consecutiveFailures` - 连续失败次数 |
| 278 | +- `lastTriggeredAt` - 最后触发时间 |
| 279 | +- `lastExecutedAt` - 最后执行时间 |
| 280 | + |
| 281 | +## 🔍 日志系统 (Logging System) |
| 282 | + |
| 283 | +每次执行记录: |
| 284 | +- 触发数据 (`triggerData`) |
| 285 | +- 条件匹配结果 (`conditionsMatched`) |
| 286 | +- 执行状态 (`executionStatus`: success/failure/partial) |
| 287 | +- 执行详情 (`executionDetails`) |
| 288 | +- 错误信息 (`errorMessage`) |
| 289 | +- 执行耗时 (`executionTime`) |
| 290 | +- 重试次数 (`retriesAttempted`) |
| 291 | +- 创建时间 (`createdAt`) |
| 292 | + |
| 293 | +## 🎯 使用场景示例 (Use Case Examples) |
| 294 | + |
| 295 | +### 场景 1: 配置文件自动重载 |
| 296 | +``` |
| 297 | +触发器: Variable Monitor |
| 298 | + - 监听: /config/app.json |
| 299 | +条件: 无 |
| 300 | +动作: |
| 301 | + 1. Execute Command - "pm2 reload app" |
| 302 | + 2. Send Notification - "配置已更新并重载" |
| 303 | +``` |
| 304 | + |
| 305 | +### 场景 2: CI/CD 集成 |
| 306 | +``` |
| 307 | +触发器: Webhook |
| 308 | +条件: |
| 309 | + - event = "deployment" AND |
| 310 | + - status = "success" AND |
| 311 | + - branch = "main" |
| 312 | +动作: |
| 313 | + 1. Run Task - 执行部署后清理任务 |
| 314 | + 2. Set Variable - LAST_DEPLOY_TIME = ${timestamp} |
| 315 | +``` |
| 316 | + |
| 317 | +### 场景 3: 磁盘空间告警 |
| 318 | +``` |
| 319 | +触发器: System Event |
| 320 | + - 事件类型: disk_space |
| 321 | + - 阈值: 85% |
| 322 | +条件: 无 |
| 323 | +动作: |
| 324 | + 1. Execute Command - "清理临时文件" |
| 325 | + 2. Send Notification - "磁盘空间不足,已自动清理" |
| 326 | +``` |
| 327 | + |
| 328 | +### 场景 4: 任务失败自动重试 |
| 329 | +``` |
| 330 | +触发器: Task Status |
| 331 | + - 任务 ID: 123 |
| 332 | + - 状态: failure |
| 333 | +条件: 无 |
| 334 | +动作: |
| 335 | + 1. Run Task - 重新执行任务 123 |
| 336 | +高级设置: |
| 337 | + - 延迟执行: 300 秒 |
| 338 | + - 失败熔断: 3 次 |
| 339 | +``` |
| 340 | + |
| 341 | +## 📝 总结 (Summary) |
| 342 | + |
| 343 | +场景模式功能为青龙面板提供了强大的自动化能力: |
| 344 | + |
| 345 | +✅ **完整实现** - 从数据模型到前端界面全栈实现 |
| 346 | +✅ **灵活配置** - 5 种触发器和 4 种动作满足各种需求 |
| 347 | +✅ **可靠稳定** - 失败熔断、重试机制确保系统稳定 |
| 348 | +✅ **易于使用** - 可视化配置,无需编写代码 |
| 349 | +✅ **完善文档** - 详细的使用指南和 API 文档 |
| 350 | +✅ **国际化** - 完整的中英文支持 |
| 351 | + |
| 352 | +这个功能将青龙面板从简单的定时任务管理工具升级为智能的自动化运维中枢! |
0 commit comments