diff --git a/tools-v1/README.md b/tools-v1/README.md index 60eeb468..1c37bda0 100644 --- a/tools-v1/README.md +++ b/tools-v1/README.md @@ -8,7 +8,7 @@ ## 目录 - `QUICK-START.md`:AI 恢复模块快速启动与验证 - `env/apps-api.production.example`:apps/api 生产环境示例 `.env` -- `php-tools/`:PHP → NestJS 迁移工具集(生成器与协调器) +- `java-tools/`:Java架构 → NestJS 迁移工具集(生成器与协调器) ## 适用范围 - 仅适配 `wwjcloud-nest-v1/apps/api` @@ -22,7 +22,7 @@ ## 脚本列表(从 tools/ 迁移) -- `scripts/php-file-discovery.js` +- `scripts/java-file-discovery.js` - `scripts/quality-assurance.js` - `scripts/test-dict-fix.js` - `scripts/test-fixes.js` @@ -42,12 +42,12 @@ node tools-v1/scripts/migration-coordinator.js # Dry-run 预览迁移计划(别名脚本) DRY_RUN=true node tools-v1/scripts/migration-coordinator.js -# 直接运行迁移协调器(主文件位于 php-tools) -node tools-v1/php-tools/migration-coordinator.js +# 直接运行迁移协调器(主文件位于 java-tools) +node tools-v1/java-tools/migration-coordinator.js # Dry-run 预览迁移计划(主文件) -DRY_RUN=true node tools-v1/php-tools/migration-coordinator.js +DRY_RUN=true node tools-v1/java-tools/migration-coordinator.js # 快速质量检查 -node tools-v1/php-tools/generators/quality-gate.js quick +node tools-v1/java-tools/generators/quality-gate.js quick ``` \ No newline at end of file diff --git a/tools-v1/php-tools/.incremental-state.json b/tools-v1/java-tools/.incremental-state.json similarity index 100% rename from tools-v1/php-tools/.incremental-state.json rename to tools-v1/java-tools/.incremental-state.json diff --git a/tools-v1/php-tools/INFRASTRUCTURE-USAGE-GUIDE.md b/tools-v1/java-tools/INFRASTRUCTURE-USAGE-GUIDE.md similarity index 100% rename from tools-v1/php-tools/INFRASTRUCTURE-USAGE-GUIDE.md rename to tools-v1/java-tools/INFRASTRUCTURE-USAGE-GUIDE.md diff --git a/tools-v1/php-tools/MIGRATION-RULES.md b/tools-v1/java-tools/MIGRATION-RULES.md similarity index 73% rename from tools-v1/php-tools/MIGRATION-RULES.md rename to tools-v1/java-tools/MIGRATION-RULES.md index e68b0865..8b4968c7 100644 --- a/tools-v1/php-tools/MIGRATION-RULES.md +++ b/tools-v1/java-tools/MIGRATION-RULES.md @@ -1,12 +1,13 @@ ### WWJCloud Migration Tooling Rules -Purpose: Standardize PHP→NestJS migration for AI-friendly, repeatable generation. Tools only; do not hand-edit generated outputs. +Purpose: Standardize Java→NestJS migration for AI-friendly, repeatable generation. Tools only; do not hand-edit generated outputs. — Scope & Principles — +- **Java架构参考**: 主要架构参考是Java框架 (Spring Boot),扫描Java项目的service/core, service/admin, service/api结构 +- **三层架构**: 按照Java的三层结构生成NestJS服务:core(核心业务) + admin(管理服务) + api(接口服务) +- **Core依赖**: admin/api层服务可以依赖core层服务,类似Java的`@Resource ICoreSiteService` - NestJS compliance: Follow official module/controller/service/entity/DTO patterns; DI-first; guards/pipes/interceptors. - Core-only: Generators write strictly under `libs/wwjcloud-core/src/{module}/...`. Do NOT create/modify `src/common`, `src/vendor`, or `src/config`. -- Business-first: Migrate PHP business logic (services/controllers/models/validators). Replace PHP infra calls with `src/common/*` capabilities. -- Java-structure reference: Organize per module with `controllers/`, `services/`, `entity/`, `dto/`; controllers orchestrate, services hold business, entities map DB only. — Contracts & Compatibility — - Database alignment: Table/column/index/types must match PHP 100%. No new/renamed/removed fields. @@ -22,14 +23,14 @@ Purpose: Standardize PHP→NestJS migration for AI-friendly, repeatable generati - Classes: PascalCase. - Aliases (tsconfig): `@wwjCommon/*`, `@wwjCore/*`, `@wwjVendor/*`, `@/*`. -— Infrastructure Mapping — -- Replace PHP infra with Common layer: - - Guards: `@wwjCommon/guards/*` (e.g., `jwt-auth.guard`, `roles.guard`, `optional-auth.guard`) - - Decorators: `@wwjCommon/decorators/*` (e.g., `roles.decorator`, `public.decorator`) - - Exceptions: `@wwjCommon/exceptions/business.exception` - - Pipes: `@wwjCommon/validation/pipes/*` (e.g., `parse-diy-form.pipe`, `json-transform.pipe`) - - Cache/Queue/DB utilities under `@wwjCommon/*` - - Do not reference `@wwjCore/*` for infra. +— Infrastructure Mapping (V1 Framework) — +- Use V1框架基础设施层: + - Cache: `@wwjcloud-boot/infra/cache/cache.service` (CacheService) + - Metrics: `@wwjcloud-boot/infra/metrics/metrics.service` (MetricsService) + - Tenant: `@wwjcloud-boot/infra/tenant/tenant.service` (TenantService) + - Auth: `@wwjcloud-boot/infra/auth/*` (AuthGuard, RbacGuard) + - Vendor Services: `@wwjcloud-boot/vendor/*` (PayService, UploadService, SmsService, NoticeService) + - 参考Java架构: @Service + 依赖注入,类似Spring Boot模式 — Module Generation — - Generate `libs/wwjcloud-core/src/{module}/{module}.module.ts` registering discovered controllers/services. @@ -55,7 +56,7 @@ Purpose: Standardize PHP→NestJS migration for AI-friendly, repeatable generati - Remove duplicate imports; standardize import order; ensure resolved alias paths. — Temporary Artifacts — -- All temporary scripts/docs/reports stay in `tools-v1/php-tools/`. Clean up when done. Never write temp files outside `tools-v1/php-tools/`. +- All temporary scripts/docs/reports stay in `tools-v1/java-tools/`. Clean up when done. Never write temp files outside `tools-v1/java-tools/`. — Enforcement — - “Only fix tools, not generated files.” If outputs are wrong, update tools and re-run. diff --git a/tools-v1/php-tools/QUICK-START.md b/tools-v1/java-tools/QUICK-START.md similarity index 67% rename from tools-v1/php-tools/QUICK-START.md rename to tools-v1/java-tools/QUICK-START.md index 8ee1b2fc..2d2a087c 100644 --- a/tools-v1/php-tools/QUICK-START.md +++ b/tools-v1/java-tools/QUICK-START.md @@ -14,33 +14,33 @@ ```bash # 正常执行 -node tools-v1/php-tools/migration-coordinator.js +node tools-v1/java-tools/migration-coordinator.js # Dry-run 模式(仅预览) -DRY_RUN=true node tools-v1/php-tools/migration-coordinator.js +DRY_RUN=true node tools-v1/java-tools/migration-coordinator.js ``` ### 2. 单独运行生成器 ```bash # 实体生成器 -node tools-v1/php-tools/generators/entity-generator.js +node tools-v1/java-tools/generators/entity-generator.js # 实体生成器 (dry-run) -DRY_RUN=true node tools-v1/php-tools/generators/entity-generator.js +DRY_RUN=true node tools-v1/java-tools/generators/entity-generator.js # 控制器生成器 -node tools-v1/php-tools/generators/controller-generator.js --dry-run +node tools-v1/java-tools/generators/controller-generator.js --dry-run ``` ### 3. 质量检查 ```bash # 完整质量检查 -node tools-v1/php-tools/generators/quality-gate.js +node tools-v1/java-tools/generators/quality-gate.js # 快速检查(仅核心层) -node tools-v1/php-tools/generators/quality-gate.js quick +node tools-v1/java-tools/generators/quality-gate.js quick ``` ### 4. 验证修复 @@ -57,36 +57,36 @@ node tools-v1/scripts/test-fixes.js ### 场景1: 首次迁移 ```bash -# 步骤1: 发现PHP文件 +# 步骤1: 发现Java架构文件(参考Java,提取PHP业务逻辑) node tools-v1/scripts/php-file-discovery.js # 步骤2: 预览迁移结果(dry-run) -DRY_RUN=true node tools-v1/php-tools/migration-coordinator.js +DRY_RUN=true node tools-v1/java-tools/migration-coordinator.js # 步骤3: 确认无误后执行实际迁移 -node tools-v1/php-tools/migration-coordinator.js +node tools-v1/java-tools/migration-coordinator.js # 步骤4: 质量检查 -node tools-v1/php-tools/generators/quality-gate.js +node tools-v1/java-tools/generators/quality-gate.js ``` ### 场景2: 单独生成某个模块 ```bash # 步骤1: 预览实体生成 -DRY_RUN=true node tools-v1/php-tools/generators/entity-generator.js +DRY_RUN=true node tools-v1/java-tools/generators/entity-generator.js # 步骤2: 实际生成实体 -node tools-v1/php-tools/generators/entity-generator.js +node tools-v1/java-tools/generators/entity-generator.js # 步骤3: 生成控制器 -node tools-v1/php-tools/generators/controller-generator.js +node tools-v1/java-tools/generators/controller-generator.js # 步骤4: 生成服务 -node tools-v1/php-tools/generators/service-generator.js +node tools-v1/java-tools/generators/service-generator.js # 步骤5: 生成模块文件 -node tools-v1/php-tools/generators/module-generator.js +node tools-v1/java-tools/generators/module-generator.js ``` ### 场景3: 验证和质量检查 @@ -96,10 +96,10 @@ node tools-v1/php-tools/generators/module-generator.js node tools-v1/scripts/test-fixes.js # 质量检查 -node tools-v1/php-tools/generators/quality-gate.js +node tools-v1/java-tools/generators/quality-gate.js # 如果有错误,查看详细输出 -VERBOSE=true node tools-v1/php-tools/generators/quality-gate.js +VERBOSE=true node tools-v1/java-tools/generators/quality-gate.js ``` --- @@ -108,8 +108,8 @@ VERBOSE=true node tools-v1/php-tools/generators/quality-gate.js | 变量 | 作用 | 示例 | |------|------|------| -| `DRY_RUN` | 启用 dry-run 模式 | `DRY_RUN=true node tools-v1/php-tools/...` | -| `VERBOSE` | 详细输出模式 | `VERBOSE=true node tools-v1/php-tools/...` | +| `DRY_RUN` | 启用 dry-run 模式 | `DRY_RUN=true node tools-v1/java-tools/...` | +| `VERBOSE` | 详细输出模式 | `VERBOSE=true node tools-v1/java-tools/...` | --- @@ -130,28 +130,28 @@ VERBOSE=true node tools-v1/php-tools/generators/quality-gate.js 始终先用 dry-run 模式预览结果: ```bash -DRY_RUN=true node tools-v1/php-tools/migration-coordinator.js +DRY_RUN=true node tools-v1/java-tools/migration-coordinator.js ``` ### 2. 详细输出帮助调试 遇到问题时启用详细输出: ```bash -VERBOSE=true node tools-v1/php-tools/generators/entity-generator.js +VERBOSE=true node tools-v1/java-tools/generators/entity-generator.js ``` ### 3. 组合使用 ```bash # 同时启用 dry-run 和详细输出 -DRY_RUN=true VERBOSE=true node tools-v1/php-tools/migration-coordinator.js +DRY_RUN=true VERBOSE=true node tools-v1/java-tools/migration-coordinator.js ``` ### 4. 快速质量检查 开发过程中频繁运行快速检查: ```bash -node tools-v1/php-tools/generators/quality-gate.js quick +node tools-v1/java-tools/generators/quality-gate.js quick ``` --- @@ -186,13 +186,13 @@ node tools-v1/php-tools/generators/quality-gate.js quick 检查环境变量设置: ```bash # macOS/Linux -DRY_RUN=true node tools-v1/php-tools/... +DRY_RUN=true node tools-v1/java-tools/... # Windows PowerShell -$env:DRY_RUN="true"; node tools-v1/php-tools/... +$env:DRY_RUN="true"; node tools-v1/java-tools/... # Windows CMD -set DRY_RUN=true && node tools-v1/php-tools/... +set DRY_RUN=true && node tools-v1/java-tools/... ``` ### Q: Quality Gate 一直失败? @@ -216,7 +216,7 @@ set DRY_RUN=true && node tools-v1/php-tools/... 1. 检查 PHP 源文件是否存在 2. 使用 VERBOSE 模式查看详细日志 -3. 检查 php-discovery-result.json 数据 +3. 检查 java-discovery-result.json 数据 --- diff --git a/tools-v1/php-tools/README.md b/tools-v1/java-tools/README.md similarity index 79% rename from tools-v1/php-tools/README.md rename to tools-v1/java-tools/README.md index 3f05fa93..2e7537b0 100644 --- a/tools-v1/php-tools/README.md +++ b/tools-v1/java-tools/README.md @@ -1,13 +1,13 @@ -# PHP到NestJS迁移工具 +# Java架构到NestJS迁移工具 ## 📋 工具概览 -本目录包含完整的PHP到NestJS迁移工具链,按步骤执行,确保100%完成迁移。 +本目录包含完整的Java架构到NestJS迁移工具链,参考Java Spring Boot架构,按步骤执行,确保100%完成迁移。 ## 📁 工具目录结构 ``` -tools-v1/php-tools/ +tools-v1/java-tools/ ├── migration-coordinator.js # 🎯 主协调器 ├── generators/ # 📦 生成器目录 │ ├── controller-generator.js # 🎮 控制器生成器 @@ -22,7 +22,7 @@ tools-v1/php-tools/ │ ├── dict-generator.js # 📚 字典生成器 │ ├── business-logic-converter.js # 🔄 业务逻辑转换器 │ └── module-generator.js # 📦 模块生成器 -├── php-discovery-result.json # 📊 发现结果数据 +├── java-discovery-result.json # 📊 发现结果数据(Java架构参考) └── README.md # 📖 说明文档 ``` @@ -31,7 +31,7 @@ tools-v1/php-tools/ ### 🎯 主协调器 1. **`migration-coordinator.js`** - 迁移协调器(主控制器) - 协调所有生成器的执行 - - 按步骤完成PHP到NestJS的迁移 + - 按步骤完成Java架构到NestJS的迁移(参考Java,提取PHP业务逻辑) - 提供整体流程控制和统计报告 - **新增**: 集成 Quality Gate 质量检查 @@ -55,7 +55,7 @@ tools-v1/php-tools/ 3. **`service-generator.js`** - 服务生成器 - 生成和更新NestJS服务 - 处理admin/api/core三层架构 - - 转换PHP业务逻辑为TypeScript + - 转换业务逻辑为TypeScript(参考Java架构,提取PHP逻辑) 4. **`entity-generator.js`** - 实体生成器 - 从PHP模型生成TypeORM实体 @@ -108,10 +108,10 @@ tools-v1/php-tools/ - 支持模块间通信 ### 🔍 辅助工具 -15. **`php-file-discovery.js`** - PHP文件发现工具 - - 扫描PHP项目结构 +15. **`java-file-discovery.js`** - Java架构文件发现工具 + - 扫描Java项目架构结构 - 发现所有相关文件(控制器、服务、模型等) - - 生成 `php-discovery-result.json` + - 生成 `java-discovery-result.json` ### 传统工具(保留) 5. **`real-business-logic-generator.js`** - 完整生成器(3000+行,建议逐步替换) @@ -150,73 +150,73 @@ tools-v1/php-tools/ ### 🎯 推荐方法:新工具链 ```bash # 使用新的模块化工具链(推荐) -node tools-v1/php-tools/migration-coordinator.js +node tools-v1/java-tools/migration-coordinator.js # Dry-run 模式(仅预览,不实际修改文件) -DRY_RUN=true node tools-v1/php-tools/migration-coordinator.js +DRY_RUN=true node tools-v1/java-tools/migration-coordinator.js # 或使用命令行参数 -node tools-v1/php-tools/migration-coordinator.js --dry-run +node tools-v1/java-tools/migration-coordinator.js --dry-run # 详细输出模式 -VERBOSE=true node tools-v1/php-tools/migration-coordinator.js +VERBOSE=true node tools-v1/java-tools/migration-coordinator.js ``` ### 🚦 Quality Gate 独立运行 ```bash # 完整质量检查 -node tools-v1/php-tools/generators/quality-gate.js +node tools-v1/java-tools/generators/quality-gate.js # 快速检查(仅核心层) -node tools-v1/php-tools/generators/quality-gate.js quick +node tools-v1/java-tools/generators/quality-gate.js quick ``` ### 🔧 分步执行新工具 ```bash -# 步骤1: 发现PHP文件 -node tools-v1/scripts/php-file-discovery.js +# 步骤1: 发现Java架构文件(参考Java,提取PHP业务逻辑) +node tools-v1/scripts/java-file-discovery.js # 步骤2: 使用新的协调器(包含所有12个生成器) -node tools-v1/php-tools/migration-coordinator.js +node tools-v1/java-tools/migration-coordinator.js # 步骤3: 单独运行特定生成器(可选,支持 dry-run) -DRY_RUN=true node tools-v1/php-tools/generators/controller-generator.js -node tools-v1/php-tools/generators/service-generator.js --dry-run -node tools-v1/php-tools/generators/entity-generator.js +DRY_RUN=true node tools-v1/java-tools/generators/controller-generator.js +node tools-v1/java-tools/generators/service-generator.js --dry-run +node tools-v1/java-tools/generators/entity-generator.js # ... 其他生成器 # 步骤4: 质量检查 -node tools-v1/php-tools/generators/quality-gate.js +node tools-v1/java-tools/generators/quality-gate.js ``` ### 方法3: 传统工具链(逐步替换) ```bash # 清理并重新迁移(一键完成) -node tools-v1/php-tools/clean-and-migrate.js +node tools-v1/java-tools/clean-and-migrate.js ``` ### 方法4: 分步执行传统工具 ```bash # 执行完整迁移流程 -node tools-v1/php-tools/run-migration.js +node tools-v1/java-tools/run-migration.js ``` ### 方法5: 手动执行传统工具 ```bash -# 步骤1: 发现PHP文件 -node tools-v1/scripts/php-file-discovery.js +# 步骤1: 发现Java架构文件(参考Java,提取PHP业务逻辑) +node tools-v1/scripts/java-file-discovery.js # 步骤2: 生成NestJS结构 -node tools-v1/php-tools/real-business-logic-generator.js +node tools-v1/java-tools/real-business-logic-generator.js # 步骤3: 提取PHP业务逻辑 -node tools-v1/php-tools/php-business-logic-extractor.js +node tools-v1/java-tools/php-business-logic-extractor.js # 步骤4: 生成模块文件 -node tools-v1/php-tools/module-generator.js +node tools-v1/java-tools/module-generator.js # 步骤5: 完善CRUD方法 -node tools-v1/php-tools/crud-method-completer.js +node tools-v1/java-tools/crud-method-completer.js ``` ## 📊 迁移统计 @@ -280,7 +280,7 @@ wwjcloud-nest-v1/libs/wwjcloud-core/src/ ## ⚠️ 注意事项 1. **备份重要文件**: 运行前请备份重要文件 -2. **检查PHP项目**: 确保PHP项目路径正确 +2. **检查Java架构项目(含PHP业务逻辑)**: 确保PHP项目路径正确 3. **依赖安装**: 确保已安装所有NestJS依赖 4. **数据库连接**: 迁移后需要配置数据库连接 @@ -294,7 +294,7 @@ wwjcloud-nest-v1/libs/wwjcloud-core/src/ ### 重新开始 ```bash # 删除common层并重新迁移 -node tools-v1/php-tools/clean-and-migrate.js +node tools-v1/java-tools/clean-and-migrate.js ``` ## 📈 下一步 @@ -309,4 +309,4 @@ node tools-v1/php-tools/clean-and-migrate.js --- -**提示**: 使用 `node tools-v1/php-tools/clean-and-migrate.js` 可以一键完成整个迁移流程! \ No newline at end of file +**提示**: 使用 `node tools-v1/java-tools/clean-and-migrate.js` 可以一键完成整个迁移流程! \ No newline at end of file diff --git a/tools-v1/php-tools/context-aware-converter.js b/tools-v1/java-tools/context-aware-converter.js similarity index 100% rename from tools-v1/php-tools/context-aware-converter.js rename to tools-v1/java-tools/context-aware-converter.js diff --git a/tools-v1/php-tools/conversion-pipeline.js b/tools-v1/java-tools/conversion-pipeline.js similarity index 100% rename from tools-v1/php-tools/conversion-pipeline.js rename to tools-v1/java-tools/conversion-pipeline.js diff --git a/tools-v1/php-tools/conversion-rules-database.js b/tools-v1/java-tools/conversion-rules-database.js similarity index 100% rename from tools-v1/php-tools/conversion-rules-database.js rename to tools-v1/java-tools/conversion-rules-database.js diff --git a/tools-v1/php-tools/enhanced-business-logic-converter.js b/tools-v1/java-tools/enhanced-business-logic-converter.js similarity index 100% rename from tools-v1/php-tools/enhanced-business-logic-converter.js rename to tools-v1/java-tools/enhanced-business-logic-converter.js diff --git a/tools-v1/php-tools/generators/base-generator.js b/tools-v1/java-tools/generators/base-generator.js similarity index 100% rename from tools-v1/php-tools/generators/base-generator.js rename to tools-v1/java-tools/generators/base-generator.js diff --git a/tools-v1/php-tools/generators/business-logic-converter.js b/tools-v1/java-tools/generators/business-logic-converter.js similarity index 100% rename from tools-v1/php-tools/generators/business-logic-converter.js rename to tools-v1/java-tools/generators/business-logic-converter.js diff --git a/tools-v1/php-tools/generators/controller-generator.js b/tools-v1/java-tools/generators/controller-generator.js similarity index 98% rename from tools-v1/php-tools/generators/controller-generator.js rename to tools-v1/java-tools/generators/controller-generator.js index d8a6fbf0..3cad8a1f 100644 --- a/tools-v1/php-tools/generators/controller-generator.js +++ b/tools-v1/java-tools/generators/controller-generator.js @@ -5,14 +5,15 @@ const path = require('path'); /** * 🎮 控制器生成器 - * 专门负责生成NestJS控制器 + * 专门负责生成NestJS控制器 (参考Java架构) */ class ControllerGenerator { constructor() { this.config = { - phpBasePath: '/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud', + javaBasePath: '/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java', + phpBasePath: '/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud', // 仅用于业务逻辑提取 nestjsBasePath: '/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/wwjcloud-nest-v1/libs/wwjcloud-core/src', - discoveryResultPath: '/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/tools-v1/php-tools/php-discovery-result.json', + discoveryResultPath: '/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/tools-v1/java-tools/java-discovery-result.json', // 前端API模块优先级列表(基于PHP和Java前端API一致性) frontendApiModules: [ 'addon', 'aliapp', 'auth', 'cloud', 'dict', 'diy', 'diy_form', 'h5', @@ -37,7 +38,7 @@ class ControllerGenerator { console.log('🎮 启动控制器生成器...'); console.log('目标:生成NestJS控制器文件\n'); - // 加载PHP文件发现结果 + // 加载Java架构发现结果(含PHP业务逻辑) await this.loadDiscoveryData(); // 生成控制器 @@ -53,13 +54,13 @@ class ControllerGenerator { } /** - * 加载PHP文件发现结果 + * 加载Java架构发现结果(含PHP业务逻辑) */ async loadDiscoveryData() { try { const data = fs.readFileSync(this.config.discoveryResultPath, 'utf8'); this.discoveryData = JSON.parse(data); - console.log(' ✅ 成功加载PHP文件发现结果'); + console.log(' ✅ 成功加载Java架构发现结果(含PHP业务逻辑)'); } catch (error) { console.error('❌ 加载发现结果失败:', error); throw error; diff --git a/tools-v1/php-tools/generators/dict-generator.js b/tools-v1/java-tools/generators/dict-generator.js similarity index 92% rename from tools-v1/php-tools/generators/dict-generator.js rename to tools-v1/java-tools/generators/dict-generator.js index 72713153..5027b753 100644 --- a/tools-v1/php-tools/generators/dict-generator.js +++ b/tools-v1/java-tools/generators/dict-generator.js @@ -5,15 +5,16 @@ const path = require('path'); const BaseGenerator = require('./base-generator'); /** - * 📚 字典生成器 + * 📚 字典生成器 (参考Java架构) */ class DictGenerator extends BaseGenerator { constructor() { super('DictGenerator'); this.config = { - phpBasePath: '/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud', + javaBasePath: '/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java', + phpBasePath: '/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud', // 仅用于业务逻辑提取 nestjsBasePath: '/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/wwjcloud-nest-v1/libs/wwjcloud-core/src', - discoveryResultPath: '/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/tools-v1/php-tools/php-discovery-result.json' + discoveryResultPath: '/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/tools-v1/java-tools/java-discovery-result.json' }; this.discoveryData = null; this.dictStats = { dictsCreated: 0, dictsSkipped: 0 }; @@ -27,7 +28,7 @@ class DictGenerator extends BaseGenerator { console.log('📚 启动字典生成器...'); console.log('目标:生成NestJS字典/枚举文件\n'); - // 加载PHP文件发现结果 + // 加载Java架构发现结果(含PHP业务逻辑) await this.loadDiscoveryData(); // 生成字典 @@ -43,13 +44,13 @@ class DictGenerator extends BaseGenerator { } /** - * 加载PHP文件发现结果 + * 加载Java架构发现结果(含PHP业务逻辑) */ async loadDiscoveryData() { try { const data = fs.readFileSync(this.config.discoveryResultPath, 'utf8'); this.discoveryData = JSON.parse(data); - console.log(' ✅ 成功加载PHP文件发现结果'); + console.log(' ✅ 成功加载Java架构发现结果(含PHP业务逻辑)'); } catch (error) { console.error('❌ 加载发现结果失败:', error); throw error; diff --git a/tools-v1/php-tools/generators/entity-generator.js b/tools-v1/java-tools/generators/entity-generator.js similarity index 94% rename from tools-v1/php-tools/generators/entity-generator.js rename to tools-v1/java-tools/generators/entity-generator.js index 78dbaef5..18eb9ee7 100644 --- a/tools-v1/php-tools/generators/entity-generator.js +++ b/tools-v1/java-tools/generators/entity-generator.js @@ -6,16 +6,17 @@ const BaseGenerator = require('./base-generator'); /** * 🏗️ 实体生成器 - * 专门负责生成NestJS实体文件 + * 专门负责生成NestJS实体文件 (参考Java架构) */ class EntityGenerator extends BaseGenerator { constructor() { super('EntityGenerator'); this.config = { - phpBasePath: '/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud', + javaBasePath: '/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java', + phpBasePath: '/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud', // 仅用于业务逻辑提取 nestjsBasePath: '/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/wwjcloud-nest-v1/libs/wwjcloud-core/src', - discoveryResultPath: '/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/tools-v1/php-tools/php-discovery-result.json' + discoveryResultPath: '/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/tools-v1/java-tools/java-discovery-result.json' }; this.discoveryData = null; @@ -33,7 +34,7 @@ class EntityGenerator extends BaseGenerator { console.log('🏗️ 启动实体生成器...'); console.log('目标:生成NestJS实体文件\n'); - // 加载PHP文件发现结果 + // 加载Java架构发现结果(含PHP业务逻辑) await this.loadDiscoveryData(); // 生成实体 @@ -49,13 +50,13 @@ class EntityGenerator extends BaseGenerator { } /** - * 加载PHP文件发现结果 + * 加载Java架构发现结果(含PHP业务逻辑) */ async loadDiscoveryData() { try { const data = fs.readFileSync(this.config.discoveryResultPath, 'utf8'); this.discoveryData = JSON.parse(data); - console.log(' ✅ 成功加载PHP文件发现结果'); + console.log(' ✅ 成功加载Java架构发现结果(含PHP业务逻辑)'); } catch (error) { console.error('❌ 加载发现结果失败:', error); throw error; @@ -75,9 +76,9 @@ class EntityGenerator extends BaseGenerator { } for (const [moduleName, models] of Object.entries(this.discoveryData.models)) { - // 检查PHP项目是否有对应的模型目录 + // 检查Java架构是否有对应的模型目录 if (!this.hasPHPModels(moduleName)) { - console.log(` ⚠️ 模块 ${moduleName} 在PHP项目中无模型,跳过`); + console.log(` ⚠️ 模块 ${moduleName} 在Java架构中无对应,且PHP项目中也无模型,跳过`); continue; } diff --git a/tools-v1/php-tools/generators/job-generator.js b/tools-v1/java-tools/generators/job-generator.js similarity index 90% rename from tools-v1/php-tools/generators/job-generator.js rename to tools-v1/java-tools/generators/job-generator.js index abd65d80..0816ca53 100644 --- a/tools-v1/php-tools/generators/job-generator.js +++ b/tools-v1/java-tools/generators/job-generator.js @@ -6,15 +6,16 @@ const BaseGenerator = require('./base-generator'); /** * ⚡ 任务生成器 - * 专门负责生成NestJS任务/队列文件 + * 专门负责生成NestJS任务/队列文件 (参考Java架构) */ class JobGenerator extends BaseGenerator { constructor() { super('JobGenerator'); this.config = { - phpBasePath: '/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud', + javaBasePath: '/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java', + phpBasePath: '/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud', // 仅用于业务逻辑提取 nestjsBasePath: '/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/wwjcloud-nest-v1/libs/wwjcloud-core/src', - discoveryResultPath: '/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/tools-v1/php-tools/php-discovery-result.json' + discoveryResultPath: '/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/tools-v1/java-tools/java-discovery-result.json' }; this.discoveryData = null; @@ -32,7 +33,7 @@ class JobGenerator extends BaseGenerator { console.log('⚡ 启动任务生成器...'); console.log('目标:生成NestJS任务/队列文件\n'); - // 加载PHP文件发现结果 + // 加载Java架构发现结果(含PHP业务逻辑) await this.loadDiscoveryData(); // 生成任务 @@ -48,13 +49,13 @@ class JobGenerator extends BaseGenerator { } /** - * 加载PHP文件发现结果 + * 加载Java架构发现结果(含PHP业务逻辑) */ async loadDiscoveryData() { try { const data = fs.readFileSync(this.config.discoveryResultPath, 'utf8'); this.discoveryData = JSON.parse(data); - console.log(' ✅ 成功加载PHP文件发现结果'); + console.log(' ✅ 成功加载Java架构发现结果(含PHP业务逻辑)'); } catch (error) { console.error('❌ 加载发现结果失败:', error); throw error; @@ -74,9 +75,9 @@ class JobGenerator extends BaseGenerator { } for (const [moduleName, jobs] of Object.entries(this.discoveryData.jobs)) { - // 检查PHP项目是否有对应的任务目录 + // 检查Java架构是否有对应的任务目录 if (!this.hasPHPJobs(moduleName)) { - console.log(` ⚠️ 模块 ${moduleName} 在PHP项目中无任务,跳过`); + console.log(` ⚠️ 模块 ${moduleName} 在Java架构中无对应,且PHP项目中也无任务,跳过`); continue; } diff --git a/tools-v1/php-tools/generators/listener-generator.js b/tools-v1/java-tools/generators/listener-generator.js similarity index 92% rename from tools-v1/php-tools/generators/listener-generator.js rename to tools-v1/java-tools/generators/listener-generator.js index 2538f3bb..8c311972 100644 --- a/tools-v1/php-tools/generators/listener-generator.js +++ b/tools-v1/java-tools/generators/listener-generator.js @@ -6,15 +6,16 @@ const BaseGenerator = require('./base-generator'); /** * 👂 监听器生成器 - * 专门负责生成NestJS事件监听器文件 + * 专门负责生成NestJS事件监听器文件 (参考Java架构) */ class ListenerGenerator extends BaseGenerator { constructor() { super('ListenerGenerator'); this.config = { - phpBasePath: '/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud', + javaBasePath: '/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java', + phpBasePath: '/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud', // 仅用于业务逻辑提取 nestjsBasePath: '/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/wwjcloud-nest-v1/libs/wwjcloud-core/src', - discoveryResultPath: '/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/tools-v1/php-tools/php-discovery-result.json' + discoveryResultPath: '/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/tools-v1/java-tools/java-discovery-result.json' }; this.discoveryData = null; @@ -32,7 +33,7 @@ class ListenerGenerator extends BaseGenerator { console.log('👂 启动监听器生成器...'); console.log('目标:生成NestJS事件监听器文件\n'); - // 加载PHP文件发现结果 + // 加载Java架构发现结果(含PHP业务逻辑) await this.loadDiscoveryData(); // 生成监听器 @@ -48,13 +49,13 @@ class ListenerGenerator extends BaseGenerator { } /** - * 加载PHP文件发现结果 + * 加载Java架构发现结果(含PHP业务逻辑) */ async loadDiscoveryData() { try { const data = fs.readFileSync(this.config.discoveryResultPath, 'utf8'); this.discoveryData = JSON.parse(data); - console.log(' ✅ 成功加载PHP文件发现结果'); + console.log(' ✅ 成功加载Java架构发现结果(含PHP业务逻辑)'); } catch (error) { console.error('❌ 加载发现结果失败:', error); throw error; @@ -74,9 +75,9 @@ class ListenerGenerator extends BaseGenerator { } for (const [moduleName, listeners] of Object.entries(this.discoveryData.listeners)) { - // 检查PHP项目是否有对应的监听器目录 + // 检查Java架构是否有对应的监听器目录 if (!this.hasPHPListeners(moduleName)) { - console.log(` ⚠️ 模块 ${moduleName} 在PHP项目中无监听器,跳过`); + console.log(` ⚠️ 模块 ${moduleName} 在Java架构中无对应,且PHP项目中也无监听器,跳过`); continue; } diff --git a/tools-v1/php-tools/generators/module-generator.js b/tools-v1/java-tools/generators/module-generator.js similarity index 96% rename from tools-v1/php-tools/generators/module-generator.js rename to tools-v1/java-tools/generators/module-generator.js index 9c76ab93..62278d4b 100644 --- a/tools-v1/php-tools/generators/module-generator.js +++ b/tools-v1/java-tools/generators/module-generator.js @@ -2,14 +2,15 @@ const fs = require('fs'); const path = require('path'); /** - * NestJS模块生成器 + * NestJS模块生成器 (参考Java架构) * 为每个模块创建对应的.module.ts文件并正确引用所有组件 */ class ModuleGenerator { constructor() { this.config = { + javaBasePath: '/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java', nestjsBasePath: '/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/wwjcloud-nest-v1/libs/wwjcloud-core/src', - discoveryResultPath: './php-discovery-result.json', + discoveryResultPath: './java-discovery-result.json', whitelistModules: [], // 空数组=全部业务模块,结合黑名单过滤 blacklistModules: ['job','queue','workerman','lang','menu','system'], includeTypeOrmFeature: true @@ -31,10 +32,10 @@ class ModuleGenerator { console.log('🚀 启动NestJS模块生成器...'); console.log('目标:为每个模块创建.module.ts文件并正确引用所有组件\n'); - // 第1阶段:加载PHP文件发现结果 - console.log('📊 第1阶段:加载PHP文件发现结果...'); + // 第1阶段:加载Java架构发现结果(含PHP业务逻辑) + console.log('📊 第1阶段:加载Java架构发现结果(含PHP业务逻辑)...'); await this.loadDiscoveryData(); - console.log(' ✅ 成功加载PHP文件发现结果'); + console.log(' ✅ 成功加载Java架构发现结果(含PHP业务逻辑)'); // 第2阶段:扫描现有文件结构 console.log('\n📊 第2阶段:扫描现有文件结构...'); @@ -58,7 +59,7 @@ class ModuleGenerator { } /** - * 加载PHP文件发现结果 + * 加载Java架构发现结果(含PHP业务逻辑) */ async loadDiscoveryData() { try { diff --git a/tools-v1/php-tools/generators/quality-gate.js b/tools-v1/java-tools/generators/quality-gate.js similarity index 100% rename from tools-v1/php-tools/generators/quality-gate.js rename to tools-v1/java-tools/generators/quality-gate.js diff --git a/tools-v1/php-tools/generators/route-generator.js b/tools-v1/java-tools/generators/route-generator.js similarity index 87% rename from tools-v1/php-tools/generators/route-generator.js rename to tools-v1/java-tools/generators/route-generator.js index 60b71c3f..9e7375a4 100644 --- a/tools-v1/php-tools/generators/route-generator.js +++ b/tools-v1/java-tools/generators/route-generator.js @@ -5,14 +5,15 @@ const path = require('path'); /** * 🛣️ 路由生成器 - * 专门负责生成NestJS路由文件 + * 专门负责生成NestJS路由文件 (参考Java架构) */ class RouteGenerator { constructor() { this.config = { - phpBasePath: '/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud', + javaBasePath: '/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java', + phpBasePath: '/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud', // 仅用于业务逻辑提取 nestjsBasePath: '/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/wwjcloud-nest-v1/libs/wwjcloud-core/src', - discoveryResultPath: '/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/tools-v1/php-tools/php-discovery-result.json' + discoveryResultPath: '/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/tools-v1/java-tools/java-discovery-result.json' }; this.discoveryData = null; @@ -30,7 +31,7 @@ class RouteGenerator { console.log('🛣️ 启动路由生成器...'); console.log('目标:生成NestJS路由文件\n'); - // 加载PHP文件发现结果 + // 加载Java架构发现结果(含PHP业务逻辑) await this.loadDiscoveryData(); // 生成路由 @@ -46,13 +47,13 @@ class RouteGenerator { } /** - * 加载PHP文件发现结果 + * 加载Java架构发现结果(含PHP业务逻辑) */ async loadDiscoveryData() { try { const data = fs.readFileSync(this.config.discoveryResultPath, 'utf8'); this.discoveryData = JSON.parse(data); - console.log(' ✅ 成功加载PHP文件发现结果'); + console.log(' ✅ 成功加载Java架构发现结果(含PHP业务逻辑)'); } catch (error) { console.error('❌ 加载发现结果失败:', error); throw error; diff --git a/tools-v1/java-tools/generators/service-generator.js b/tools-v1/java-tools/generators/service-generator.js new file mode 100644 index 00000000..ea8307cc --- /dev/null +++ b/tools-v1/java-tools/generators/service-generator.js @@ -0,0 +1,893 @@ +#!/usr/bin/env node + +const fs = require('fs'); +const path = require('path'); +const BusinessLogicConverter = require('./business-logic-converter'); + +/** + * ⚙️ 服务生成器 + * 专门负责生成和更新NestJS服务 + */ +class ServiceGenerator { + constructor() { + this.config = { + javaBasePath: '/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java', + phpBasePath: '/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud', // 用于业务逻辑提取 + nestjsBasePath: '/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/wwjcloud-nest-v1/libs/wwjcloud-core/src', + discoveryResultPath: '/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/tools-v1/java-tools/java-discovery-result.json' + }; + + this.discoveryData = null; + this.converter = new BusinessLogicConverter(); + this.stats = { + servicesCreated: 0, + servicesUpdated: 0, + methodsProcessed: 0, + errors: 0 + }; + } + + /** + * 运行服务生成 + */ + async run() { + console.log('⚙️ 启动服务生成器...'); + + try { + // 加载发现数据 + await this.loadDiscoveryData(); + + // 生成服务 + await this.generateServices(); + + // 更新服务为真实业务逻辑 + await this.updateAllServicesWithRealLogic(); + + // 生成统计报告 + this.generateStatsReport(); + + } catch (error) { + console.error('❌ 服务生成过程中发生错误:', error.message); + this.stats.errors++; + throw error; + } + } + + /** + * 加载Java架构发现结果(含PHP业务逻辑) + */ + async loadDiscoveryData() { + try { + const data = fs.readFileSync(this.config.discoveryResultPath, 'utf-8'); + this.discoveryData = JSON.parse(data); + console.log(' ✅ 成功加载Java架构发现结果(含PHP业务逻辑)'); + } catch (error) { + console.error(' ❌ 加载发现数据失败:', error.message); + throw error; + } + } + + /** + * 按模块动态扫描Java服务层结构,参考Java框架架构 + */ + async scanJavaModulesAndGenerateServices() { + console.log(' 🔨 扫描Java框架架构,生成对应的NestJS服务...'); + + const javaServicePath = path.join(this.config.javaBasePath, 'com/niu/core/service'); + const layers = ['core', 'admin', 'api']; + let processedCount = 0; + + // 收集所有模块 - 从Java项目中扫描 + const modules = new Set(); + for (const layer of layers) { + const layerPath = path.join(javaServicePath, layer); + if (fs.existsSync(layerPath)) { + try { + const moduleDirs = fs.readdirSync(layerPath, { withFileTypes: true }) + .filter(dirent => dirent.isDirectory()) + .map(dirent => dirent.name); + moduleDirs.forEach(module => modules.add(module)); + console.log(` 📁 发现Java ${layer}层模块: ${moduleDirs.join(', ')}`); + } catch (error) { + console.log(` ⚠️ 无法读取Java ${layer}层目录: ${error.message}`); + } + } + } + + console.log(` 📊 发现 ${modules.size} 个模块: ${Array.from(modules).join(', ')}`); + + // 为每个模块生成服务 - 按照Java的@Service + @Resource模式 + for (const moduleName of modules) { + console.log(` 🔍 处理模块: ${moduleName} (参考Java架构)`); + + // 检查模块在各层的存在性 - 扫描Java service/core, service/admin, service/api结构 + const moduleLayers = []; + for (const layer of layers) { + const moduleServicePath = path.join(javaServicePath, layer, moduleName); + if (fs.existsSync(moduleServicePath)) { + try { + const files = fs.readdirSync(moduleServicePath, { withFileTypes: true }); + const javaFiles = files + .filter(dirent => dirent.isFile() && dirent.name.endsWith('.java') && dirent.name.includes('Impl')) + .map(dirent => dirent.name); + if (javaFiles.length > 0) { + moduleLayers.push({ + layer, + serviceFiles: javaFiles, + servicePath: moduleServicePath + }); + } + } catch (error) { + console.log(` ⚠️ 无法读取Java模块${moduleName}/${layer}目录: ${error.message}`); + } + } + } + + if (moduleLayers.length === 0) { + console.log(` ⚠️ 模块 ${moduleName} 没有任何Java服务文件,跳过`); + continue; + } + + console.log(` 📁 模块 ${moduleName} 有 ${moduleLayers.length} 个Java服务层: ${moduleLayers.map(l => l.layer).join(', ')}`); + + // 为每个Java服务层生成对应的NestJS服务 - 按Java架构处理core依赖 + for (const { layer, serviceFiles, servicePath } of moduleLayers) { + for (const serviceFile of serviceFiles) { + const javaServicePath = path.join(servicePath, serviceFile); + + console.log(` ⚙️ 处理Java服务: ${moduleName}/${layer}/${serviceFile} -> NestJS`); + + try { + await this.createNestJSServiceFromJava(moduleName, serviceFile, javaServicePath, layer); + processedCount++; + console.log(` ✅ 成功创建NestJS服务: ${moduleName}/${layer}/${serviceFile}`); + } catch (error) { + console.error(` ❌ 创建NestJS服务失败 ${moduleName}/${layer}/${serviceFile}:`, error.message); + this.stats.errors++; + } + } + } + } + + this.stats.servicesCreated = processedCount; + console.log(` ✅ 创建了 ${this.stats.servicesCreated} 个服务`); + } + + /** + * 生成服务 + */ + async generateServices() { + console.log(' 🔨 生成服务文件...'); + + // 优先扫描Java项目架构,参考Java的@Service和Core依赖模式 + await this.scanJavaModulesAndGenerateServices(); + + // 如果发现数据存在,也尝试基于发现数据生成(作为备选) + if (this.discoveryData.services && Object.keys(this.discoveryData.services).length > 0) { + console.log(' 🔄 基于发现数据补充生成服务...'); + await this.generateServicesFromDiscovery(); + } + } + + /** + * 基于发现数据生成服务(备选方法) + */ + async generateServicesFromDiscovery() { + let processedCount = 0; + + // 服务数据结构是按层级分组的,需要遍历所有层级 + for (const [layerName, services] of Object.entries(this.discoveryData.services)) { + console.log(` 📁 处理服务层级: ${layerName}, 服务数量: ${Object.keys(services).length}`); + + for (const [serviceName, serviceInfo] of Object.entries(services)) { + console.log(` ⚙️ 处理服务: ${serviceName}`); + + try { + const correctModuleName = this.extractModuleNameFromServicePath(serviceInfo.filePath); + const layer = this.extractLayerFromServicePath(serviceInfo.filePath); + + // 检查Java架构是否有对应的服务目录 + if (!this.hasPHPServices(correctModuleName, layer)) { + console.log(` ⚠️ 模块 ${correctModuleName} 在Java架构中无对应,且PHP项目中也无${layer}服务,跳过`); + continue; + } + + await this.createService(correctModuleName, serviceName, serviceInfo, layer); + processedCount++; + console.log(` ✅ 成功创建服务: ${correctModuleName}/${serviceName}`); + } catch (error) { + console.error(` ❌ 创建服务失败 ${serviceName}:`, error.message); + this.stats.errors++; + } + } + } + + console.log(` ✅ 基于发现数据创建了 ${processedCount} 个服务`); + } + + /** + * 更新所有服务为真实业务逻辑 + */ + async updateAllServicesWithRealLogic() { + console.log(' 🔨 更新服务为真实业务逻辑...'); + + let processedCount = 0; + + // 服务数据结构是按层级分组的,需要遍历所有层级 + for (const [layerName, services] of Object.entries(this.discoveryData.services)) { + console.log(` 📁 处理服务层级: ${layerName}, 服务数量: ${Object.keys(services).length}`); + for (const [serviceName, serviceInfo] of Object.entries(services)) { + console.log(` ⚙️ 处理服务: ${serviceName}`); + + try { + const correctModuleName = this.extractModuleNameFromServicePath(serviceInfo.filePath); + const layer = this.extractLayerFromServicePath(serviceInfo.filePath); + await this.updateServiceWithRealLogic(correctModuleName, serviceName, serviceInfo, layer); + processedCount++; + console.log(` ✅ 成功更新服务: ${correctModuleName}/${serviceName}`); + } catch (error) { + console.error(` ❌ 更新服务失败 ${serviceName}:`, error.message); + this.stats.errors++; + } + } + } + + this.stats.servicesUpdated = processedCount; + console.log(` ✅ 更新了 ${this.stats.servicesUpdated} 个服务`); + } + + /** + * 创建服务 + */ + async createService(moduleName, serviceName, serviceInfo, layer) { + // 先去掉层级后缀,再去掉Service后缀 + const cleanServiceName = serviceName.replace(/_(admin|api|core)$/, ''); + const baseName = cleanServiceName.endsWith('Service') ? cleanServiceName.slice(0, -7) : cleanServiceName; + const servicePath = path.join( + this.config.nestjsBasePath, + moduleName, + 'services', + layer, + `${this.toKebabCase(baseName)}.service.ts` + ); + + // 确保目录存在 + const serviceDir = path.dirname(servicePath); + if (!fs.existsSync(serviceDir)) { + fs.mkdirSync(serviceDir, { recursive: true }); + } + + // 检查是否有对应的PHP服务文件 + // 从服务名中提取基础类名(去掉_layer后缀) + const baseServiceName = serviceName.replace(/_(admin|api|core)$/, ''); + const phpServicePath = path.join(this.config.phpBasePath, 'app/service', layer, moduleName, `${baseServiceName}.php`); + if (!fs.existsSync(phpServicePath)) { + console.log(` ❌ 未找到PHP服务文件,跳过生成: ${phpServicePath}`); + return; + } + + // 生成基础服务内容 + const serviceContent = this.generateBasicServiceContent(moduleName, serviceName, layer); + + // 写入文件 + fs.writeFileSync(servicePath, serviceContent); + console.log(` ✅ 创建服务: ${moduleName}/${layer}/${this.toKebabCase(baseName)}.service.ts`); + + this.stats.servicesCreated++; + } + + /** + * 从Java服务文件创建NestJS服务 - 参考Java架构,处理core依赖 + */ + async createNestJSServiceFromJava(moduleName, javaServiceFile, javaFilePath, layer) { + // 确保服务目录存在 + const serviceDir = path.join( + this.config.nestjsBasePath, + moduleName, + 'services', + layer + ); + + // 从Java文件名提取服务名,去掉Impl和Service后缀 + let serviceName = javaServiceFile.replace('.java', ''); + if (serviceName.endsWith('ServiceImpl')) { + serviceName = serviceName.replace('ServiceImpl', ''); + } else if (serviceName.endsWith('Service')) { + serviceName = serviceName.replace('Service', ''); + } + + const servicePath = path.join(serviceDir, `${this.toKebabCase(serviceName)}.service.ts`); + + // 检查文件是否已存在 + if (fs.existsSync(servicePath)) { + console.log(` ⚠️ 服务文件已存在: ${servicePath}`); + return; + } + + try { + // 读取Java服务文件 + const javaContent = fs.readFileSync(javaFilePath, 'utf-8'); + + // 解析Java服务的依赖关系,特别是core服务依赖 + const coreDependencies = this.extractCoreDependencies(javaContent); + const javaMethods = this.extractJavaMethods(javaContent); + + console.log(` 📝 从${path.basename(javaFilePath)}中找到 ${javaMethods.length} 个方法`); + console.log(` 🔗 发现Core依赖: ${coreDependencies.join(', ')}`); + + // 生成NestJS服务内容,处理core依赖 + const nestjsContent = this.generateNestJSServiceFromJava(moduleName, serviceName, layer, javaMethods, coreDependencies); + + // 确保目录存在 + if (!fs.existsSync(serviceDir)) { + fs.mkdirSync(serviceDir, { recursive: true }); + } + + // 写入文件 + fs.writeFileSync(servicePath, nestjsContent, 'utf-8'); + console.log(` ✅ 创建NestJS服务: ${moduleName}/${layer}/${this.toKebabCase(serviceName)}.service.ts`); + + this.stats.methodsProcessed += javaMethods.length; + this.stats.servicesCreated++; + + } catch (error) { + console.log(` ❌ 无法创建NestJS服务 ${serviceName}: ${error.message}`); + this.stats.errors++; + } + } + + /** + * 从PHP文件创建NestJS服务 - 参考Java架构,使用V1框架基础设施 + */ + async createNestJSServiceFromPHP(moduleName, serviceName, phpFilePath, layer) { + // 确保服务目录存在 + const serviceDir = path.join( + this.config.nestjsBasePath, + moduleName, + 'services', + layer + ); + + // 先去掉Service后缀 + const baseName = serviceName.endsWith('Service') ? serviceName.slice(0, -7) : serviceName; + const servicePath = path.join(serviceDir, `${this.toKebabCase(baseName)}.service.ts`); + + // 检查文件是否已存在 + if (fs.existsSync(servicePath)) { + console.log(` ⚠️ 服务文件已存在: ${servicePath}`); + return; + } + + try { + // 读取PHP服务文件 + const phpContent = fs.readFileSync(phpFilePath, 'utf-8'); + + // 提取PHP方法 + const phpMethods = this.converter.extractPHPMethods(phpContent); + + console.log(` 📝 从${path.basename(phpFilePath)}中找到 ${phpMethods.length} 个PHP方法`); + + // 生成NestJS服务内容 + const nestjsContent = phpMethods.length > 0 + ? this.generateRealServiceContent(moduleName, serviceName, layer, phpMethods) + : this.generateBasicServiceContent(moduleName, serviceName, layer); + + // 确保目录存在 + if (!fs.existsSync(serviceDir)) { + fs.mkdirSync(serviceDir, { recursive: true }); + } + + // 写入文件 + fs.writeFileSync(servicePath, nestjsContent, 'utf-8'); + console.log(` ✅ 创建服务: ${moduleName}/${layer}/${this.toKebabCase(baseName)}.service.ts`); + + this.stats.methodsProcessed += phpMethods.length; + this.stats.servicesCreated++; + + } catch (error) { + console.log(` ❌ 无法创建服务 ${serviceName}: ${error.message}`); + this.stats.errors++; + } + } + + /** + * 更新服务为真实逻辑 + */ + async updateServiceWithRealLogic(moduleName, serviceName, serviceInfo, layer) { + // 先去掉层级后缀,再去掉Service后缀 + const cleanServiceName = serviceName.replace(/_(admin|api|core)$/, ''); + const baseName = cleanServiceName.endsWith('Service') ? cleanServiceName.slice(0, -7) : cleanServiceName; + const servicePath = path.join( + this.config.nestjsBasePath, + moduleName, + 'services', + layer, + `${this.toKebabCase(baseName)}.service.ts` + ); + + if (!fs.existsSync(servicePath)) { + console.log(` ⚠️ 服务文件不存在: ${servicePath}`); + return; + } + + try { + // 读取PHP服务文件 + const phpServicePath = serviceInfo.filePath; + const phpContent = fs.readFileSync(phpServicePath, 'utf-8'); + + // 提取PHP方法 + const phpMethods = this.converter.extractPHPMethods(phpContent); + + if (phpMethods.length === 0) { + console.log(` ⚠️ 未找到PHP方法: ${serviceName}`); + return; + } + + console.log(` 📝 找到 ${phpMethods.length} 个PHP方法`); + + // 生成NestJS服务内容 + const nestjsContent = this.generateRealServiceContent(moduleName, serviceName, layer, phpMethods); + + // 写入文件 + fs.writeFileSync(servicePath, nestjsContent); + console.log(` ✅ 更新服务: ${moduleName}/${layer}/${this.toKebabCase(baseName)}.service.ts`); + + this.stats.methodsProcessed += phpMethods.length; + + } catch (error) { + console.log(` ❌ 无法更新服务 ${serviceName}: ${error.message}`); + this.stats.errors++; + } + } + + /** + * 生成基础服务内容 + */ + generateBasicServiceContent(moduleName, serviceName, layer) { + // 先去掉层级后缀,再去掉Service后缀 + const cleanServiceName = serviceName.replace(/_(admin|api|core)$/,''); + const baseName = cleanServiceName.endsWith('Service') ? cleanServiceName.slice(0, -7) : cleanServiceName; + + // 正确的命名规范:服务类名(与PHP/Java保持一致) + let className = `${baseName}Service`; + if (layer === 'core') { + // Core层服务需要Core前缀 + className = baseName.startsWith('Core') ? `${baseName}Service` : `Core${baseName}Service`; + } else { + // admin和api层直接使用业务名称 + className = `${baseName}Service`; + } + + // 获取V1框架基础设施和Vendor服务导入 + const infrastructureImports = this.getV1FrameworkInfrastructureImports(); + const vendorImports = this.getV1FrameworkVendorImports(); + + return `import { Injectable, Logger } from '@nestjs/common'; +import { InjectRepository } from '@nestjs/typeorm'; +import { Repository } from 'typeorm'; +${infrastructureImports} +${vendorImports} + +/** + * ${className} - ${layer}层服务 + * 参考Java Spring Boot架构:@Service注解 + 依赖注入 + * 对应Java: @Service + @Resource注入,类似CoreAliappConfigServiceImpl + * 使用V1框架基础设施:CacheService, MetricsService, TenantService等 + * 业务逻辑来源:PHP ${moduleName}/${layer}层服务 + */ +@Injectable() +export class ${className} { + private readonly logger = new Logger(${className}.name); + + constructor( + @InjectRepository(Object) + private readonly repository: Repository, + private readonly configService: ConfigService, + private readonly cacheService: CacheService, + private readonly metricsService: MetricsService, + private readonly tenantService: TenantService, + private readonly uploadService: UploadService, + private readonly payService: PayService, + private readonly smsService: SmsService, + private readonly noticeService: NoticeService, + ) {} + + // 服务方法基于Java框架风格,直接从PHP业务逻辑迁移 + // 使用V1框架提供的服务:configService, cacheService, metricsService等 +}`; + } + + /** + * 获取V1框架基础设施导入 - 基于实际V1框架导出 + */ + getV1FrameworkInfrastructureImports() { + return `import { ConfigService } from '@nestjs/config'; +import { CacheService } from '@wwjcloud-boot/infra/cache/cache.service'; +import { MetricsService } from '@wwjcloud-boot/infra/metrics/metrics.service'; +import { TenantService } from '@wwjcloud-boot/infra/tenant/tenant.service';`; + } + + /** + * 获取V1框架Vendor服务导入 - 基于实际V1框架vendor导出 + */ + getV1FrameworkVendorImports() { + return `import { UploadService } from '@wwjcloud-boot/vendor/upload'; +import { PayService } from '@wwjcloud-boot/vendor/pay'; +import { SmsService } from '@wwjcloud-boot/vendor/sms'; +import { NoticeService } from '@wwjcloud-boot/vendor/notice';`; + } + + /** + * 生成真实服务内容 + */ + generateRealServiceContent(moduleName, serviceName, layer, phpMethods) { + // 先去掉层级后缀,再去掉Service后缀 + const cleanServiceName = serviceName.replace(/_(admin|api|core)$/, ''); + const baseName = cleanServiceName.endsWith('Service') ? cleanServiceName.slice(0, -7) : cleanServiceName; + + // 正确的命名规范:服务类名(与PHP/Java保持一致) + let className = `${baseName}Service`; + if (layer === 'core') { + // Core层服务需要Core前缀 + className = baseName.startsWith('Core') ? `${baseName}Service` : `Core${baseName}Service`; + } else { + // admin和api层直接使用业务名称 + className = `${baseName}Service`; + } + + const methodImplementations = phpMethods.filter(method => method && method.name).map(method => { + console.log(`🔍 调试参数: ${method.name}`, method.parameters); + const parameters = this.converter.generateServiceParameters(method.parameters); + const realLogic = this.generateRealServiceLogic(method); + const logic = method.logic || { type: 'real', description: '基于真实PHP业务逻辑' }; + + return ` /** + * ${method.name} + * 对应 PHP: ${serviceName}::${method.name}() + * 逻辑类型: ${logic.type} - ${logic.description} + */ + async ${method.name}(${parameters}) { +${realLogic} + }`; + }).join('\n\n'); + + const infrastructureImports = this.getV1FrameworkInfrastructureImports(); + const vendorImports = this.getV1FrameworkVendorImports(); + + return `import { Injectable, Logger } from '@nestjs/common'; +import { InjectRepository } from '@nestjs/typeorm'; +import { Repository } from 'typeorm'; +${infrastructureImports} +${vendorImports} + +/** + * ${className} - ${layer}层服务 + * 参考Java Spring Boot架构:@Service + @Resource模式 + * 对应Java实现:类似CoreAliappConfigServiceImpl的结构 + * 使用V1框架基础设施:CacheService, MetricsService, TenantService + * 业务逻辑迁移自:PHP ${moduleName}/${layer}层服务 + */ +@Injectable() +export class ${className} { + private readonly logger = new Logger(${className}.name); + + constructor( + @InjectRepository(Object) + private readonly repository: Repository, + private readonly configService: ConfigService, + private readonly cacheService: CacheService, + private readonly metricsService: MetricsService, + private readonly tenantService: TenantService, + private readonly uploadService: UploadService, + private readonly payService: PayService, + private readonly smsService: SmsService, + private readonly noticeService: NoticeService, + ) {} + +${methodImplementations} +} +`; + } + + /** + * 生成真实服务逻辑 + */ + generateRealServiceLogic(method) { + if (!method || !method.name) { + return ` // 方法信息缺失 + return { success: false, message: "Method information missing" };`; + } + + // 使用method.logic而不是method.body + const phpLogic = method.logic || method.body || ''; + + if (!phpLogic.trim()) { + return ` // TODO: 实现${method.name}业务逻辑 + throw new Error('${method.name} not implemented');`; + } + + // 转换PHP代码到TypeScript + const tsBody = this.converter.convertBusinessLogic('', method.name, phpLogic); + + return ` // 基于PHP真实逻辑: ${method.name} + // PHP原文: ${phpLogic.substring(0, 150).replace(/\n/g, ' ')}... +${tsBody}`; + } + + /** + * 从服务路径提取模块名 + */ + extractModuleNameFromServicePath(filePath) { + // 从路径中提取模块名 + const pathParts = filePath.split('/'); + const serviceIndex = pathParts.findIndex(part => part === 'service'); + + if (serviceIndex > 0 && serviceIndex < pathParts.length - 2) { + // service目录后面应该是层级(admin/api/core),再后面是模块名 + // 路径格式: .../app/service/admin/home/AuthSiteService.php + // 索引: .../8 9 10 11 12 + return pathParts[serviceIndex + 2]; + } + + // 如果找不到service目录,尝试从文件名推断 + const fileName = path.basename(filePath, '.php'); + if (fileName.includes('Service')) { + return fileName.replace('Service', '').toLowerCase(); + } + + return 'unknown'; + } + + /** + * 从服务路径提取层级 + */ + extractLayerFromServicePath(filePath) { + // 从路径中提取层级信息 + if (filePath.includes('/admin/')) { + return 'admin'; + } else if (filePath.includes('/api/')) { + return 'api'; + } else if (filePath.includes('/core/')) { + return 'core'; + } + + return 'core'; // 默认为core层 + } + + /** + * 转换为驼峰命名 + */ + toCamelCase(str) { + return str.replace(/(?:^\w|[A-Z]|\b\w)/g, (word, index) => { + return index === 0 ? word.toLowerCase() : word.toUpperCase(); + }).replace(/\s+/g, ''); + } + + /** + * 转换为PascalCase + */ + toPascalCase(str) { + return str.replace(/(^|-)([a-z])/g, (match, p1, p2) => p2.toUpperCase()); + } + + /** + * 转换为kebab-case(我们框架的标准命名格式) + */ + toKebabCase(str) { + return str + .replace(/([A-Z])/g, '-$1') + .replace(/^-/, '') + .toLowerCase(); + } + + /** + * 检查模块是否有PHP服务 + */ + hasPHPServices(moduleName, layer) { + const phpProjectPath = path.join(__dirname, '../../niucloud-php/niucloud'); + const servicePath = path.join(phpProjectPath, 'app/service', layer, moduleName); + + if (!fs.existsSync(servicePath)) return false; + + // 检查目录内是否有PHP文件 + try { + const files = fs.readdirSync(servicePath); + return files.some(file => file.endsWith('.php')); + } catch (error) { + return false; + } + } + + /** + * 提取Java服务中的Core依赖关系 + */ + extractCoreDependencies(javaContent) { + const coreDependencies = []; + + // 查找 @Resource ICore*Service 依赖 + const resourcePattern = /@Resource\s+(\w+)\s+(\w+);/g; + const imports = javaContent.match(/import\s+[\w\.]+\.ICore[\w]+Service;?/g) || []; + + imports.forEach(importLine => { + const serviceName = importLine.match(/ICore([\w]+)Service/)?.[1]; + if (serviceName) { + coreDependencies.push(`Core${serviceName}Service`); + } + }); + + return coreDependencies; + } + + /** + * 提取Java服务的方法 + */ + extractJavaMethods(javaContent) { + const methods = []; + + // 简单的Java方法提取 - 查找 public 方法 + const methodPattern = /public\s+(\w+(?:<\w+>)?)\s+(\w+)\s*\(([^)]*)\)\s*\{/g; + let match; + + while ((match = methodPattern.exec(javaContent)) !== null) { + const [fullMatch, returnType, methodName, parameters] = match; + methods.push({ + name: methodName, + returnType: returnType, + parameters: parameters.trim(), + body: this.extractMethodBody(javaContent, fullMatch) + }); + } + + return methods; + } + + /** + * 提取方法体(简化版) + */ + extractMethodBody(javaContent, methodStart) { + // 这是一个简化的实现,实际应用中需要更复杂的解析 + const startIndex = javaContent.indexOf(methodStart); + if (startIndex === -1) return ''; + + let braceCount = 0; + let bodyStart = -1; + + for (let i = startIndex; i < javaContent.length; i++) { + if (javaContent[i] === '{') { + braceCount++; + if (bodyStart === -1) bodyStart = i + 1; + } else if (javaContent[i] === '}') { + braceCount--; + if (braceCount === 0) { + return javaContent.substring(bodyStart, i).trim(); + } + } + } + + return ''; + } + + /** + * 基于Java服务生成NestJS服务内容 + */ + generateNestJSServiceFromJava(moduleName, serviceName, layer, javaMethods, coreDependencies) { + const infrastructureImports = this.getV1FrameworkInfrastructureImports(); + const vendorImports = this.getV1FrameworkVendorImports(); + + // 生成core服务依赖的导入 + const coreImports = coreDependencies.map(dep => { + const depName = dep.replace('Core', '').replace('Service', ''); + return `import { ${dep} } from '../core/${this.toKebabCase(depName)}.service';`; + }).join('\n'); + + // 生成core服务依赖的注入 + const coreInjections = coreDependencies.map(dep => { + const propName = this.toCamelCase(dep.replace('Service', '')); + return ` private readonly ${propName}: ${dep},`; + }).join('\n'); + + const methodImplementations = javaMethods.map(method => { + return ` /** + * ${method.name} + * 对应Java: ${serviceName}ServiceImpl::${method.name}() + */ + async ${method.name}(${this.convertJavaParametersToTS(method.parameters)}) { + // TODO: 实现 ${method.name} 业务逻辑 + // 原始Java逻辑: ${method.body.substring(0, 100)}... + throw new Error('${method.name} not implemented'); + }`; + }).join('\n\n'); + + return `import { Injectable, Logger } from '@nestjs/common'; +import { InjectRepository } from '@nestjs/typeorm'; +import { Repository } from 'typeorm'; +${infrastructureImports} +${vendorImports} +${coreImports} + +/** + * ${serviceName}Service - ${layer}层服务 + * 对应Java: ${serviceName}ServiceImpl + * 使用V1框架基础设施和Core服务依赖 + */ +@Injectable() +export class ${serviceName}Service { + private readonly logger = new Logger(${serviceName}Service.name); + + constructor( + @InjectRepository(Object) + private readonly repository: Repository, + private readonly configService: ConfigService, + private readonly cacheService: CacheService, + private readonly metricsService: MetricsService, + private readonly tenantService: TenantService, + private readonly uploadService: UploadService, + private readonly payService: PayService, + private readonly smsService: SmsService, + private readonly noticeService: NoticeService, +${coreInjections} + ) {} + +${methodImplementations} +} +`; + } + + /** + * 转换Java参数到TypeScript参数(简化版) + */ + convertJavaParametersToTS(javaParameters) { + if (!javaParameters.trim()) return ''; + + // 简单的Java到TS参数转换 + return javaParameters + .split(',') + .map(param => { + const trimmed = param.trim(); + const [type, name] = trimmed.split(/\s+/); + if (!name) return trimmed; + + const tsType = this.convertJavaTypeToTS(type); + return `${name}: ${tsType}`; + }) + .join(', '); + } + + /** + * 转换Java类型到TypeScript类型(简化版) + */ + convertJavaTypeToTS(javaType) { + const typeMap = { + 'String': 'string', + 'Integer': 'number', + 'Long': 'number', + 'Boolean': 'boolean', + 'List': 'any[]', + 'Map': 'Record', + 'void': 'void' + }; + + return typeMap[javaType] || 'any'; + } + + /** + * 生成统计报告 + */ + generateStatsReport() { + console.log('\n📊 服务生成统计报告'); + console.log('='.repeat(50)); + console.log(`✅ 创建服务数量: ${this.stats.servicesCreated}`); + console.log(`🔄 更新服务数量: ${this.stats.servicesUpdated}`); + console.log(`📝 处理方法数量: ${this.stats.methodsProcessed}`); + console.log(`❌ 错误数量: ${this.stats.errors}`); + console.log(`📈 成功率: ${this.stats.servicesCreated > 0 ? ((this.stats.servicesCreated - this.stats.errors) / this.stats.servicesCreated * 100).toFixed(2) : 0}%`); + } +} + +// 如果直接运行此文件 +if (require.main === module) { + const generator = new ServiceGenerator(); + generator.run().catch(console.error); +} + +module.exports = ServiceGenerator; diff --git a/tools-v1/php-tools/generators/validator-generator.js b/tools-v1/java-tools/generators/validator-generator.js similarity index 95% rename from tools-v1/php-tools/generators/validator-generator.js rename to tools-v1/java-tools/generators/validator-generator.js index a6e7db21..6205383f 100644 --- a/tools-v1/php-tools/generators/validator-generator.js +++ b/tools-v1/java-tools/generators/validator-generator.js @@ -5,14 +5,15 @@ const path = require('path'); /** * 📝 验证器生成器 - * 专门负责生成NestJS验证器/DTO文件 + * 专门负责生成NestJS验证器/DTO文件 (参考Java架构) */ class ValidatorGenerator { constructor() { this.config = { - phpBasePath: '/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud', + javaBasePath: '/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java', + phpBasePath: '/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud', // 仅用于业务逻辑提取 nestjsBasePath: '/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/wwjcloud-nest-v1/libs/wwjcloud-core/src', - discoveryResultPath: '/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/tools-v1/php-tools/php-discovery-result.json' + discoveryResultPath: '/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/tools-v1/java-tools/java-discovery-result.json' }; this.discoveryData = null; @@ -30,7 +31,7 @@ class ValidatorGenerator { console.log('📝 启动验证器生成器...'); console.log('目标:生成NestJS验证器/DTO文件\n'); - // 加载PHP文件发现结果 + // 加载Java架构发现结果(含PHP业务逻辑) await this.loadDiscoveryData(); // 生成验证器 @@ -46,13 +47,13 @@ class ValidatorGenerator { } /** - * 加载PHP文件发现结果 + * 加载Java架构发现结果(含PHP业务逻辑) */ async loadDiscoveryData() { try { const data = fs.readFileSync(this.config.discoveryResultPath, 'utf8'); this.discoveryData = JSON.parse(data); - console.log(' ✅ 成功加载PHP文件发现结果'); + console.log(' ✅ 成功加载Java架构发现结果(含PHP业务逻辑)'); } catch (error) { console.error('❌ 加载发现结果失败:', error); throw error; diff --git a/tools-v1/php-tools/incremental-update-cli.js b/tools-v1/java-tools/incremental-update-cli.js similarity index 100% rename from tools-v1/php-tools/incremental-update-cli.js rename to tools-v1/java-tools/incremental-update-cli.js diff --git a/tools-v1/php-tools/incremental-updater.js b/tools-v1/java-tools/incremental-updater.js similarity index 96% rename from tools-v1/php-tools/incremental-updater.js rename to tools-v1/java-tools/incremental-updater.js index b31c4f84..3082f69a 100644 --- a/tools-v1/php-tools/incremental-updater.js +++ b/tools-v1/java-tools/incremental-updater.js @@ -7,15 +7,16 @@ const { execSync } = require('child_process'); /** * 🔄 增量更新器 - * 智能检测PHP项目变更,实现增量迁移到NestJS + * 智能检测Java项目变更,实现增量迁移到NestJS (参考Java架构) */ class IncrementalUpdater { constructor() { this.config = { - phpBasePath: '/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud', + javaBasePath: '/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java', + phpBasePath: '/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud', // 仅用于业务逻辑提取 nestjsBasePath: '/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/wwjcloud-nest-v1/libs/wwjcloud-core/src', - stateFilePath: '/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/tools-v1/php-tools/.incremental-state.json', - backupPath: '/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/tools-v1/php-tools/backups', + stateFilePath: '/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/tools-v1/java-tools/.incremental-state.json', + backupPath: '/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/tools-v1/java-tools/backups', dryRun: process.env.DRY_RUN === 'true' }; @@ -42,7 +43,8 @@ class IncrementalUpdater { */ async run() { console.log('🔄 启动增量更新器...'); - console.log(`📁 PHP项目: ${this.config.phpBasePath}`); + console.log(`📁 Java架构参考: ${this.config.javaBasePath}`); + console.log(`📁 PHP业务逻辑源: ${this.config.phpBasePath}`); console.log(`📁 NestJS项目: ${this.config.nestjsBasePath}`); console.log(`🔍 Dry-run模式: ${this.config.dryRun ? '是' : '否'}\n`); @@ -50,7 +52,7 @@ class IncrementalUpdater { // 1. 加载上次更新状态 await this.loadState(); - // 2. 检测PHP项目变更 + // 2. 检测Java架构变更(参考Java,提取PHP业务逻辑) const changes = await this.detectChanges(); if (changes.length === 0) { @@ -101,10 +103,10 @@ class IncrementalUpdater { } /** - * 🔍 检测PHP项目变更 + * 🔍 检测Java架构变更 (参考Java架构,提取PHP业务逻辑) */ async detectChanges() { - console.log('🔍 检测PHP项目变更...'); + console.log('🔍 检测Java架构变更 (参考Java架构)...'); const changes = []; const phpFiles = this.getAllPHPFiles(); diff --git a/tools-v1/php-tools/php-discovery-result.json b/tools-v1/java-tools/java-discovery-result.json similarity index 100% rename from tools-v1/php-tools/php-discovery-result.json rename to tools-v1/java-tools/java-discovery-result.json diff --git a/tools-v1/php-tools/migration-coordinator.js b/tools-v1/java-tools/migration-coordinator.js similarity index 97% rename from tools-v1/php-tools/migration-coordinator.js rename to tools-v1/java-tools/migration-coordinator.js index f00813c7..7906a2da 100644 --- a/tools-v1/php-tools/migration-coordinator.js +++ b/tools-v1/java-tools/migration-coordinator.js @@ -18,14 +18,15 @@ const IncrementalUpdater = require('./incremental-updater'); /** * 🎯 迁移协调器 - * 协调所有工具的执行,按步骤完成PHP到NestJS的迁移 + * 协调所有工具的执行,按步骤完成Java到NestJS的迁移 (参考Java架构) */ class MigrationCoordinator { constructor() { this.config = { - phpBasePath: '/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud', + javaBasePath: '/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java', + phpBasePath: '/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud', // 仅用于业务逻辑提取 nestjsBasePath: '/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/wwjcloud-nest-v1/libs/wwjcloud-core/src', - discoveryResultPath: '/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/tools-v1/php-tools/php-discovery-result.json', + discoveryResultPath: '/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/tools-v1/java-tools/java-discovery-result.json', enableJobs: true, enableListeners: true, enableCommands: false, @@ -77,16 +78,16 @@ async runIncrementalUpdate() { } /** - * 🏗️ 运行完整迁移 + * 🏗️ 运行完整迁移 (参考Java架构) */ async runFullMigration() { - console.log('目标:完整迁移PHP项目到NestJS,包括所有组件\n'); + console.log('目标:完整迁移Java架构到NestJS,包括所有组件 (参考Java Spring Boot结构)\n'); this.stats.startTime = new Date(); try { - // 第1阶段:加载PHP文件发现结果 - console.log('📊 第1阶段:加载PHP文件发现结果...'); + // 第1阶段:加载文件发现结果 (Java架构 + PHP业务逻辑) + console.log('📊 第1阶段:加载文件发现结果 (Java架构参考)...'); await this.loadDiscoveryData(); // 第2阶段:创建完整模块结构 @@ -184,13 +185,13 @@ async runFullMigration() { } /** - * 加载PHP文件发现结果 + * 加载Java架构发现结果(含PHP业务逻辑) */ async loadDiscoveryData() { try { const data = fs.readFileSync(this.config.discoveryResultPath, 'utf-8'); this.discoveryData = JSON.parse(data); - console.log(' ✅ 成功加载PHP文件发现结果'); + console.log(' ✅ 成功加载Java架构发现结果(含PHP业务逻辑)'); } catch (error) { console.error(' ❌ 加载发现数据失败:', error.message); throw error; diff --git a/tools-v1/php-tools/generators/service-generator.js b/tools-v1/php-tools/generators/service-generator.js deleted file mode 100644 index 19d86ff7..00000000 --- a/tools-v1/php-tools/generators/service-generator.js +++ /dev/null @@ -1,504 +0,0 @@ -#!/usr/bin/env node - -const fs = require('fs'); -const path = require('path'); -const BusinessLogicConverter = require('./business-logic-converter'); - -/** - * ⚙️ 服务生成器 - * 专门负责生成和更新NestJS服务 - */ -class ServiceGenerator { - constructor() { - this.config = { - phpBasePath: '/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud', - nestjsBasePath: '/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/wwjcloud-nest-v1/libs/wwjcloud-core/src', - discoveryResultPath: '/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/tools-v1/php-tools/php-discovery-result.json' - }; - - this.discoveryData = null; - this.converter = new BusinessLogicConverter(); - this.stats = { - servicesCreated: 0, - servicesUpdated: 0, - methodsProcessed: 0, - errors: 0 - }; - } - - /** - * 运行服务生成 - */ - async run() { - console.log('⚙️ 启动服务生成器...'); - - try { - // 加载发现数据 - await this.loadDiscoveryData(); - - // 生成服务 - await this.generateServices(); - - // 更新服务为真实业务逻辑 - await this.updateAllServicesWithRealLogic(); - - // 生成统计报告 - this.generateStatsReport(); - - } catch (error) { - console.error('❌ 服务生成过程中发生错误:', error.message); - this.stats.errors++; - throw error; - } - } - - /** - * 加载PHP文件发现结果 - */ - async loadDiscoveryData() { - try { - const data = fs.readFileSync(this.config.discoveryResultPath, 'utf-8'); - this.discoveryData = JSON.parse(data); - console.log(' ✅ 成功加载PHP文件发现结果'); - } catch (error) { - console.error(' ❌ 加载发现数据失败:', error.message); - throw error; - } - } - - /** - * 生成服务 - */ - async generateServices() { - console.log(' 🔨 生成服务文件...'); - - // 检查是否有服务数据 - if (!this.discoveryData.services || Object.keys(this.discoveryData.services).length === 0) { - console.log(' ⚠️ 未发现PHP服务,跳过生成'); - return; - } - - let processedCount = 0; - - // 服务数据结构是按层级分组的,需要遍历所有层级 - for (const [layerName, services] of Object.entries(this.discoveryData.services)) { - console.log(` 📁 处理服务层级: ${layerName}, 服务数量: ${Object.keys(services).length}`); - - for (const [serviceName, serviceInfo] of Object.entries(services)) { - console.log(` ⚙️ 处理服务: ${serviceName}`); - - try { - const correctModuleName = this.extractModuleNameFromServicePath(serviceInfo.filePath); - const layer = this.extractLayerFromServicePath(serviceInfo.filePath); - - // 检查PHP项目是否有对应的服务目录 - if (!this.hasPHPServices(correctModuleName, layer)) { - console.log(` ⚠️ 模块 ${correctModuleName} 在PHP项目中无${layer}服务,跳过`); - continue; - } - - await this.createService(correctModuleName, serviceName, serviceInfo, layer); - processedCount++; - console.log(` ✅ 成功创建服务: ${correctModuleName}/${serviceName}`); - } catch (error) { - console.error(` ❌ 创建服务失败 ${serviceName}:`, error.message); - this.stats.errors++; - } - } - } - - this.stats.servicesCreated = processedCount; - console.log(` ✅ 创建了 ${this.stats.servicesCreated} 个服务`); - } - - /** - * 更新所有服务为真实业务逻辑 - */ - async updateAllServicesWithRealLogic() { - console.log(' 🔨 更新服务为真实业务逻辑...'); - - let processedCount = 0; - - // 服务数据结构是按层级分组的,需要遍历所有层级 - for (const [layerName, services] of Object.entries(this.discoveryData.services)) { - console.log(` 📁 处理服务层级: ${layerName}, 服务数量: ${Object.keys(services).length}`); - for (const [serviceName, serviceInfo] of Object.entries(services)) { - console.log(` ⚙️ 处理服务: ${serviceName}`); - - try { - const correctModuleName = this.extractModuleNameFromServicePath(serviceInfo.filePath); - const layer = this.extractLayerFromServicePath(serviceInfo.filePath); - await this.updateServiceWithRealLogic(correctModuleName, serviceName, serviceInfo, layer); - processedCount++; - console.log(` ✅ 成功更新服务: ${correctModuleName}/${serviceName}`); - } catch (error) { - console.error(` ❌ 更新服务失败 ${serviceName}:`, error.message); - this.stats.errors++; - } - } - } - - this.stats.servicesUpdated = processedCount; - console.log(` ✅ 更新了 ${this.stats.servicesUpdated} 个服务`); - } - - /** - * 创建服务 - */ - async createService(moduleName, serviceName, serviceInfo, layer) { - // 先去掉层级后缀,再去掉Service后缀 - const cleanServiceName = serviceName.replace(/_(admin|api|core)$/, ''); - const baseName = cleanServiceName.endsWith('Service') ? cleanServiceName.slice(0, -7) : cleanServiceName; - const servicePath = path.join( - this.config.nestjsBasePath, - moduleName, - 'services', - layer, - `${this.toKebabCase(baseName)}.service.ts` - ); - - // 确保目录存在 - const serviceDir = path.dirname(servicePath); - if (!fs.existsSync(serviceDir)) { - fs.mkdirSync(serviceDir, { recursive: true }); - } - - // 检查是否有对应的PHP服务文件 - // 从服务名中提取基础类名(去掉_layer后缀) - const baseServiceName = serviceName.replace(/_(admin|api|core)$/, ''); - const phpServicePath = path.join(this.config.phpBasePath, 'app/service', layer, moduleName, `${baseServiceName}.php`); - if (!fs.existsSync(phpServicePath)) { - console.log(` ❌ 未找到PHP服务文件,跳过生成: ${phpServicePath}`); - return; - } - - // 生成基础服务内容 - const serviceContent = this.generateBasicServiceContent(moduleName, serviceName, layer); - - // 写入文件 - fs.writeFileSync(servicePath, serviceContent); - console.log(` ✅ 创建服务: ${moduleName}/${layer}/${this.toKebabCase(baseName)}.service.ts`); - - this.stats.servicesCreated++; - } - - /** - * 更新服务为真实逻辑 - */ - async updateServiceWithRealLogic(moduleName, serviceName, serviceInfo, layer) { - // 先去掉层级后缀,再去掉Service后缀 - const cleanServiceName = serviceName.replace(/_(admin|api|core)$/, ''); - const baseName = cleanServiceName.endsWith('Service') ? cleanServiceName.slice(0, -7) : cleanServiceName; - const servicePath = path.join( - this.config.nestjsBasePath, - moduleName, - 'services', - layer, - `${this.toKebabCase(baseName)}.service.ts` - ); - - if (!fs.existsSync(servicePath)) { - console.log(` ⚠️ 服务文件不存在: ${servicePath}`); - return; - } - - try { - // 读取PHP服务文件 - const phpServicePath = serviceInfo.filePath; - const phpContent = fs.readFileSync(phpServicePath, 'utf-8'); - - // 提取PHP方法 - const phpMethods = this.converter.extractPHPMethods(phpContent); - - if (phpMethods.length === 0) { - console.log(` ⚠️ 未找到PHP方法: ${serviceName}`); - return; - } - - console.log(` 📝 找到 ${phpMethods.length} 个PHP方法`); - - // 生成NestJS服务内容 - const nestjsContent = this.generateRealServiceContent(moduleName, serviceName, layer, phpMethods); - - // 写入文件 - fs.writeFileSync(servicePath, nestjsContent); - console.log(` ✅ 更新服务: ${moduleName}/${layer}/${this.toKebabCase(baseName)}.service.ts`); - - this.stats.methodsProcessed += phpMethods.length; - - } catch (error) { - console.log(` ❌ 无法更新服务 ${serviceName}: ${error.message}`); - this.stats.errors++; - } - } - - /** - * 生成基础服务内容 - */ - generateBasicServiceContent(moduleName, serviceName, layer) { - // 先去掉层级后缀,再去掉Service后缀 - const cleanServiceName = serviceName.replace(/_(admin|api|core)$/,''); - const baseName = cleanServiceName.endsWith('Service') ? cleanServiceName.slice(0, -7) : cleanServiceName; - - // 正确的命名规范:服务类名(与PHP/Java保持一致) - let className = `${baseName}Service`; - if (layer === 'core') { - // Core层服务需要Core前缀 - className = baseName.startsWith('Core') ? `${baseName}Service` : `Core${baseName}Service`; - } else { - // admin和api层直接使用业务名称 - className = `${baseName}Service`; - } - - // 获取基础设施导入 - const infrastructureImports = this.getInfrastructureImports(); - - return `import { Injectable, Logger } from '@nestjs/common'; -import { InjectRepository } from '@nestjs/typeorm'; -import { Repository } from 'typeorm'; -${infrastructureImports} - -/** - * ${className} - ${layer}层服务 - * 使用TypeORM Repository模式 - * 对应 Java: @Service + @Autowired - * 对应 PHP: 业务服务类 - * - * 使用Boot基础设施: - * - CacheService (缓存) - * - ConfigService (配置读取) - * - Nest Logger (日志记录) - * - * 使用Boot Vendor业务服务: - * - UploadService (文件上传) - * - PayService (支付服务) - * - SmsService (短信服务) - * - NoticeService (通知服务) - */ -@Injectable() -export class ${className} { - private readonly logger = new Logger(${className}.name); - - constructor( - @InjectRepository(Object) - protected readonly repository: Repository, - private readonly cacheService: CacheService, - private readonly configService: ConfigService, - private readonly uploadService: UploadService, - private readonly payService: PayService, - private readonly smsService: SmsService, - private readonly noticeService: NoticeService, - ) {} - - // 服务方法需要基于真实PHP服务类解析 - // 禁止假设方法,所有方法必须来自PHP源码 - // 可使用注入的服务:configService, uploadService, payService, smsService, noticeService -}`; - } - - /** - * 获取基础设施导入 - */ - getInfrastructureImports() { - return `import { ConfigService } from '@nestjs/config'; -import { CacheService } from '@wwjCommon/cache/cache.service'; -import { UploadService } from '@wwjVendor/upload/upload.service'; -import { PayService } from '@wwjVendor/pay/pay.service'; -import { SmsService } from '@wwjVendor/sms/sms.service'; -import { NoticeService } from '@wwjVendor/notice/notice.service';`; - } - - /** - * 生成真实服务内容 - */ - generateRealServiceContent(moduleName, serviceName, layer, phpMethods) { - // 先去掉层级后缀,再去掉Service后缀 - const cleanServiceName = serviceName.replace(/_(admin|api|core)$/, ''); - const baseName = cleanServiceName.endsWith('Service') ? cleanServiceName.slice(0, -7) : cleanServiceName; - - // 正确的命名规范:服务类名(与PHP/Java保持一致) - let className = `${baseName}Service`; - if (layer === 'core') { - // Core层服务需要Core前缀 - className = baseName.startsWith('Core') ? `${baseName}Service` : `Core${baseName}Service`; - } else { - // admin和api层直接使用业务名称 - className = `${baseName}Service`; - } - - const methodImplementations = phpMethods.filter(method => method && method.name).map(method => { - console.log(`🔍 调试参数: ${method.name}`, method.parameters); - const parameters = this.converter.generateServiceParameters(method.parameters); - const realLogic = this.generateRealServiceLogic(method); - const logic = method.logic || { type: 'real', description: '基于真实PHP业务逻辑' }; - - return ` /** - * ${method.name} - * 对应 PHP: ${serviceName}::${method.name}() - * 逻辑类型: ${logic.type} - ${logic.description} - */ - async ${method.name}(${parameters}) { -${realLogic} - }`; - }).join('\n\n'); - - return `import { Injectable, Logger } from '@nestjs/common'; -import { InjectRepository } from '@nestjs/typeorm'; -import { Repository } from 'typeorm'; -import { ConfigService } from '@nestjs/config'; -import { CacheService } from '@wwjCommon/cache/cache.service'; -import { UploadService } from '@wwjVendor/upload/upload.service'; -import { PayService } from '@wwjVendor/pay/pay.service'; -import { SmsService } from '@wwjVendor/sms/sms.service'; -import { NoticeService } from '@wwjVendor/notice/notice.service'; - -@Injectable() -export class ${className} { - private readonly logger = new Logger(${className}.name); - - constructor( - @InjectRepository(Object) - protected readonly repository: Repository, - private readonly cacheService: CacheService, - private readonly configService: ConfigService, - private readonly uploadService: UploadService, - private readonly payService: PayService, - private readonly smsService: SmsService, - private readonly noticeService: NoticeService, - ) {} - -${methodImplementations} -} -`; - } - - /** - * 生成真实服务逻辑 - */ - generateRealServiceLogic(method) { - if (!method || !method.name) { - return ` // 方法信息缺失 - return { success: false, message: "Method information missing" };`; - } - - // 使用method.logic而不是method.body - const phpLogic = method.logic || method.body || ''; - - if (!phpLogic.trim()) { - return ` // TODO: 实现${method.name}业务逻辑 - throw new Error('${method.name} not implemented');`; - } - - // 转换PHP代码到TypeScript - const tsBody = this.converter.convertBusinessLogic('', method.name, phpLogic); - - return ` // 基于PHP真实逻辑: ${method.name} - // PHP原文: ${phpLogic.substring(0, 150).replace(/\n/g, ' ')}... -${tsBody}`; - } - - /** - * 从服务路径提取模块名 - */ - extractModuleNameFromServicePath(filePath) { - // 从路径中提取模块名 - const pathParts = filePath.split('/'); - const serviceIndex = pathParts.findIndex(part => part === 'service'); - - if (serviceIndex > 0 && serviceIndex < pathParts.length - 2) { - // service目录后面应该是层级(admin/api/core),再后面是模块名 - // 路径格式: .../app/service/admin/home/AuthSiteService.php - // 索引: .../8 9 10 11 12 - return pathParts[serviceIndex + 2]; - } - - // 如果找不到service目录,尝试从文件名推断 - const fileName = path.basename(filePath, '.php'); - if (fileName.includes('Service')) { - return fileName.replace('Service', '').toLowerCase(); - } - - return 'unknown'; - } - - /** - * 从服务路径提取层级 - */ - extractLayerFromServicePath(filePath) { - // 从路径中提取层级信息 - if (filePath.includes('/admin/')) { - return 'admin'; - } else if (filePath.includes('/api/')) { - return 'api'; - } else if (filePath.includes('/core/')) { - return 'core'; - } - - return 'core'; // 默认为core层 - } - - /** - * 转换为驼峰命名 - */ - toCamelCase(str) { - return str.replace(/(?:^\w|[A-Z]|\b\w)/g, (word, index) => { - return index === 0 ? word.toLowerCase() : word.toUpperCase(); - }).replace(/\s+/g, ''); - } - - /** - * 转换为PascalCase - */ - toPascalCase(str) { - return str.replace(/(^|-)([a-z])/g, (match, p1, p2) => p2.toUpperCase()); - } - - /** - * 转换为kebab-case(我们框架的标准命名格式) - */ - toKebabCase(str) { - return str - .replace(/([A-Z])/g, '-$1') - .replace(/^-/, '') - .toLowerCase(); - } - - /** - * 检查模块是否有PHP服务 - */ - hasPHPServices(moduleName, layer) { - const phpProjectPath = path.join(__dirname, '../../niucloud-php/niucloud'); - const servicePath = path.join(phpProjectPath, 'app/service', layer, moduleName); - - if (!fs.existsSync(servicePath)) return false; - - // 检查目录内是否有PHP文件 - try { - const files = fs.readdirSync(servicePath); - return files.some(file => file.endsWith('.php')); - } catch (error) { - return false; - } - } - - /** - * 生成统计报告 - */ - generateStatsReport() { - console.log('\n📊 服务生成统计报告'); - console.log('='.repeat(50)); - console.log(`✅ 创建服务数量: ${this.stats.servicesCreated}`); - console.log(`🔄 更新服务数量: ${this.stats.servicesUpdated}`); - console.log(`📝 处理方法数量: ${this.stats.methodsProcessed}`); - console.log(`❌ 错误数量: ${this.stats.errors}`); - console.log(`📈 成功率: ${this.stats.servicesCreated > 0 ? ((this.stats.servicesCreated - this.stats.errors) / this.stats.servicesCreated * 100).toFixed(2) : 0}%`); - } -} - -// 如果直接运行此文件 -if (require.main === module) { - const generator = new ServiceGenerator(); - generator.run().catch(console.error); -} - -module.exports = ServiceGenerator; diff --git a/tools-v1/scripts/php-file-discovery.js b/tools-v1/scripts/java-file-discovery.js similarity index 98% rename from tools-v1/scripts/php-file-discovery.js rename to tools-v1/scripts/java-file-discovery.js index 8aef4bc1..b510f5ea 100644 --- a/tools-v1/scripts/php-file-discovery.js +++ b/tools-v1/scripts/java-file-discovery.js @@ -1,14 +1,14 @@ #!/usr/bin/env node /** - * PHP文件发现工具 - * 自动发现所有PHP控制器和服务文件,建立正确的映射关系 + * Java架构文件发现工具 + * 自动发现Java架构结构,参考PHP业务逻辑,建立正确的映射关系 */ const fs = require('fs'); const path = require('path'); -class PHPFileDiscovery { +class JavaFileDiscovery { constructor() { this.phpBasePath = '/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud'; this.javaBasePath = '/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core'; @@ -38,10 +38,10 @@ class PHPFileDiscovery { } /** - * 发现所有PHP控制器文件 + * 发现所有控制器文件 (Java架构参考,PHP业务逻辑提取) */ discoverControllers() { - console.log('🔍 发现PHP控制器文件...'); + console.log('🔍 发现控制器文件 (Java架构参考)...'); const controllerPaths = [ // adminapi控制器路径 @@ -116,10 +116,10 @@ class PHPFileDiscovery { } /** - * 发现所有PHP服务文件 + * 发现所有服务文件 (Java架构参考,PHP业务逻辑提取) */ discoverServices() { - console.log('🔍 发现PHP服务文件...'); + console.log('🔍 发现服务文件 (Java架构参考)...'); const servicePaths = [ // admin服务路径 @@ -541,7 +541,7 @@ class PHPFileDiscovery { * 保存发现结果到文件 */ saveDiscoveryResult() { - const resultPath = path.join(__dirname, '../php-tools/php-discovery-result.json'); + const resultPath = path.join(__dirname, '../java-tools/java-discovery-result.json'); fs.writeFileSync(resultPath, JSON.stringify(this.discoveredFiles, null, 2)); console.log(`\n💾 发现结果已保存到: ${resultPath}`); } @@ -1323,8 +1323,8 @@ class PHPFileDiscovery { // 如果直接运行此脚本 if (require.main === module) { - const discovery = new PHPFileDiscovery(); + const discovery = new JavaFileDiscovery(); discovery.run().catch(console.error); } -module.exports = PHPFileDiscovery; +module.exports = JavaFileDiscovery; diff --git a/tools/.incremental-state.json b/tools/.incremental-state.json deleted file mode 100644 index c2d57754..00000000 --- a/tools/.incremental-state.json +++ /dev/null @@ -1,5941 +0,0 @@ -{ - "lastUpdate": "2025-10-14T16:26:05.046Z", - "fileHashes": { - "app/AppService.php": "febeae65a57754747b5bf03c1334c565", - "app/ExceptionHandle.php": "357f277dc174f775bd19e4697f07767c", - "app/Request.php": "58d205d43b5bbf96c796615bc7c77b77", - "app/adminapi/config/config.php": "8996e274efc4d4c0ec8169791d7b102f", - "app/adminapi/config/route.php": "c2c282a176879827940f6e3fc888304d", - "app/adminapi/controller/addon/Addon.php": "908c545e36ca35a3182841824b3aa06c", - "app/adminapi/controller/addon/AddonDevelop.php": "43b6e4b243e2356a1c39e26952d5103a", - "app/adminapi/controller/addon/App.php": "93b22e5283d0e462cab0e50777e9dd20", - "app/adminapi/controller/addon/Backup.php": "e898c02dc4b1107d01b034dfb9bf84c8", - "app/adminapi/controller/addon/Upgrade.php": "7d28f0108695e5b32f1ccdd80877f1e1", - "app/adminapi/controller/aliapp/Config.php": "e59bcfb54a2bb84ce4b3cb6ebfa183f0", - "app/adminapi/controller/applet/SiteVersion.php": "9a974ef1e7db5f01a25c9fa8469ad83b", - "app/adminapi/controller/applet/Version.php": "fecb36ed4f627b2ea54a1bd20c7fcee4", - "app/adminapi/controller/applet/VersionDownload.php": "8a2bb9f8904cec6bcf83fec1371c14d1", - "app/adminapi/controller/auth/Auth.php": "22e5a68b2d877a7ff4d0c95c0fe17dee", - "app/adminapi/controller/channel/App.php": "11fb2a4958e27deb566fa4daf21d09a3", - "app/adminapi/controller/channel/H5.php": "9f5e2ec3d9dd5ba6cc929f74ac27e122", - "app/adminapi/controller/channel/Pc.php": "8523c61efbc050b6fc1ca487e5e7b223", - "app/adminapi/controller/dict/Dict.php": "ae7d24e416ff22f8b30ce41f7816de67", - "app/adminapi/controller/diy/Config.php": "c8cd33c48d92d0b55e150b170a63a6af", - "app/adminapi/controller/diy/Diy.php": "6552d765b4f3c249dc6c805d20933337", - "app/adminapi/controller/diy/DiyForm.php": "dc17e2f11c6bf06f18d959619d946bd7", - "app/adminapi/controller/diy/DiyRoute.php": "32fabe63b9f923e627bee0bf58a391a6", - "app/adminapi/controller/generator/Generator.php": "9f2226fb10f3b84a0048cd405f0ecf28", - "app/adminapi/controller/home/Site.php": "5c81a92c09e958ef5037abc56571cc16", - "app/adminapi/controller/index/PromotionAdv.php": "4da011da5b3498a212d6e411ef570d45", - "app/adminapi/controller/login/Captcha.php": "9643e38048b0685eef1a6da7462a05df", - "app/adminapi/controller/login/Config.php": "6d7c4837e541c27b438267371fabc4ad", - "app/adminapi/controller/login/Login.php": "dbb8a04ffd7995a681a645c9f3c811a1", - "app/adminapi/controller/member/Account.php": "b04cb7c5e014c2cf3ed06801aec19c07", - "app/adminapi/controller/member/Address.php": "b7b97d4e586b23abea966842dd006701", - "app/adminapi/controller/member/CashOut.php": "8fbed121a5bd50bc643d0aa9f1d77423", - "app/adminapi/controller/member/Config.php": "29c9a0d4e3bcccfc4e03d4b67a86e5a3", - "app/adminapi/controller/member/Member.php": "cbc777beb2e117ac7fcfb300958158d9", - "app/adminapi/controller/member/MemberLabel.php": "c68cd6ca3357e957df3c702061827e88", - "app/adminapi/controller/member/MemberLevel.php": "0708ccae177fe5e52d20b5b9777aab9c", - "app/adminapi/controller/member/MemberSign.php": "6c3ce9ea0c8c118a544c489dfcafd748", - "app/adminapi/controller/niucloud/Cloud.php": "2879ea364e6718531c2692425f31e172", - "app/adminapi/controller/niucloud/Module.php": "c7cbf389a36d44996a929f9dc5d512f6", - "app/adminapi/controller/notice/NiuSms.php": "eb19a0d45d1de75804a20cc0c8b83a2a", - "app/adminapi/controller/notice/Notice.php": "3173d3faa21dc2f78c4871b459db6482", - "app/adminapi/controller/notice/NoticeLog.php": "e217ed3ab0cb72205fe3546c348fbafa", - "app/adminapi/controller/notice/SmsLog.php": "6f82693c5b4a20f6e044915e570653f6", - "app/adminapi/controller/pay/Pay.php": "19d1369790cb3842b717abc01b7ab569", - "app/adminapi/controller/pay/PayChannel.php": "9d8f6cae43bdcca533264342b9ef442c", - "app/adminapi/controller/pay/PayRefund.php": "31984c9f2c46788144ab5d5cb5d392a1", - "app/adminapi/controller/pay/Transfer.php": "a1ac1b62221a8474a919e8b21ec5e4bd", - "app/adminapi/controller/poster/Poster.php": "720f005f3aa0bada87e1b189af1c9148", - "app/adminapi/controller/site/Site.php": "33b0d1db220a54521ff7d0d162a423f1", - "app/adminapi/controller/site/SiteAccount.php": "a6c2863ec615107f06a38c3387ec16ba", - "app/adminapi/controller/site/SiteGroup.php": "cb600e5f3d8c2dad6de852204b89e978", - "app/adminapi/controller/site/User.php": "4d673020bee2dcbc960f4593af98480d", - "app/adminapi/controller/site/UserLog.php": "494d88385110d2b397f476e6a8117a11", - "app/adminapi/controller/stat/SiteStat.php": "eae53afcbc4921b695f5fce839ebbcf9", - "app/adminapi/controller/stat/Stat.php": "2cc8d7a40582a5947c81f1ea8738de6a", - "app/adminapi/controller/sys/Agreement.php": "494c7a21d937943ed1ae812bdeb0506f", - "app/adminapi/controller/sys/App.php": "0651a22c5701f6064f3d4af4df99aa0f", - "app/adminapi/controller/sys/Area.php": "561418fd3f8893ee4a9420bd57fc6d89", - "app/adminapi/controller/sys/Attachment.php": "be99ece693893f8878e6210a254ae4e1", - "app/adminapi/controller/sys/Channel.php": "1bf41276eca343ecc68c7eb3d1167f05", - "app/adminapi/controller/sys/Common.php": "d4c27ade7c0e13113bc4ff791c1a4cca", - "app/adminapi/controller/sys/Config.php": "22c68dafb03af27e05ebeb188a9ae19a", - "app/adminapi/controller/sys/Export.php": "1132819dc5cd8c0b7a887cd10c073683", - "app/adminapi/controller/sys/Menu.php": "22c496bd22d5c8b350ae1c2866ab31eb", - "app/adminapi/controller/sys/Poster.php": "19881c098dfddd7190338ea17dd7581d", - "app/adminapi/controller/sys/Printer.php": "4d0ebfcc8a9bce13a705ab7c255c4c41", - "app/adminapi/controller/sys/Role.php": "ccadf1e6e5d0eb9ec62ae895bc806495", - "app/adminapi/controller/sys/Schedule.php": "b4d8819335711e658e47954fb35a0448", - "app/adminapi/controller/sys/ScheduleLog.php": "a4afd1070b4aca7fcd66ccab2dab8eac", - "app/adminapi/controller/sys/System.php": "760de50efda4eadd0b485bbbdc914bc6", - "app/adminapi/controller/sys/Ueditor.php": "9735b523d4b09842d6d5d32b6f0717d9", - "app/adminapi/controller/upload/Storage.php": "c59830e9803764064e368f499fecb5fd", - "app/adminapi/controller/upload/Upload.php": "9ad3d7d1341bbe88299debba0a1b10e9", - "app/adminapi/controller/user/User.php": "becbb815d828c2c73f68192d6157a3a8", - "app/adminapi/controller/verify/Verifier.php": "985c0b6a2d278f04357a7f7414c05060", - "app/adminapi/controller/verify/Verify.php": "ec4f67c97947637a3da062df6c941340", - "app/adminapi/controller/weapp/Config.php": "ea84d976a8029c02b851203363c2201d", - "app/adminapi/controller/weapp/Delivery.php": "b00b8cbe5735e62d1f3eaca35b4f9480", - "app/adminapi/controller/weapp/Package.php": "44b7e30a5776e60dff6e25421d47040c", - "app/adminapi/controller/weapp/Template.php": "0e9b9397c38e3d1545f3f07068eee119", - "app/adminapi/controller/weapp/Version.php": "91f60ef1ae67a1ef9f689c39a15a6604", - "app/adminapi/controller/wechat/Config.php": "58f2f85bbdb40c65430948949adfaa83", - "app/adminapi/controller/wechat/Media.php": "af3a9b99ac4d0c55368a58853b1f088b", - "app/adminapi/controller/wechat/Menu.php": "0b8d536f7793c63ef84c922d538712be", - "app/adminapi/controller/wechat/Reply.php": "970c8ff4fbda0b1a7069e604956c5962", - "app/adminapi/controller/wechat/Template.php": "dd8380cda0a15c90b9cafac78592e038", - "app/adminapi/controller/wxoplatform/Config.php": "b44d3ddc316ca0b3c518ce201b780bee", - "app/adminapi/controller/wxoplatform/Oplatform.php": "a1615cca4a22e37ec806e0f9add924ae", - "app/adminapi/controller/wxoplatform/Server.php": "8911e3c2384d450f375c9513614960ee", - "app/adminapi/controller/wxoplatform/WeappVersion.php": "565a55d31f5fb08e9fc58e5345a92bd5", - "app/adminapi/middleware/AdminCheckRole.php": "60d89c25fe6986d21844ca48a5786524", - "app/adminapi/middleware/AdminCheckToken.php": "5b4b479c6532d6a583c708d88468d2dd", - "app/adminapi/middleware/AdminLog.php": "9de0f09cf641743ebeae1df1bca66f16", - "app/adminapi/middleware/AllowCrossDomain.php": "55c8c34595d17c66dfe1455e02115446", - "app/adminapi/middleware.php": "3ef5daa477e0429d59b5d614be634999", - "app/adminapi/route/addon.php": "76111c91991fda9f4963b2d1d23e6f52", - "app/adminapi/route/aliapp.php": "4f687e3174b81b84e0df35f8c259a76a", - "app/adminapi/route/app.php": "ecaaaf78bab34794a32b6617622dd704", - "app/adminapi/route/applet.php": "e1734bec9056a36a7f9ae0a74a729c22", - "app/adminapi/route/auth.php": "3e64075b9f71826f7ce1269fc531ad68", - "app/adminapi/route/channel.php": "7d176cb8e09f3fbf9e85533f5db37b63", - "app/adminapi/route/dict.php": "f985f94c1a6fd6c77a5f5db37006ed95", - "app/adminapi/route/diy.php": "cbe173382a5028002442ee6071df8075", - "app/adminapi/route/generator.php": "94cc73c51b2b71e9ebfd2397a63f8ec2", - "app/adminapi/route/home.php": "61e6ce26ece471abb55bfde9ec9da27f", - "app/adminapi/route/index.php": "a84eb5f5a4b3c43e931b1668e3e63b35", - "app/adminapi/route/member.php": "cfb67695d5cd70bb87bff8e8378f5dbc", - "app/adminapi/route/niucloud.php": "57a8ba497226d29338efc86a8a118d46", - "app/adminapi/route/notice.php": "e93c4daa7abbce9ba84578088eb386cf", - "app/adminapi/route/pay.php": "3e96e091973120be72192943c5e9da2c", - "app/adminapi/route/route.php": "4adb0684bda7293394ad4e5d49b98104", - "app/adminapi/route/site.php": "af6405059832da818109f07b7ccf0f1d", - "app/adminapi/route/stat.php": "10b649503c22f784caaee96480cb8e4b", - "app/adminapi/route/sys.php": "f3e102cfc7de40149e173052f7290b15", - "app/adminapi/route/upgrade.php": "00a786fdfa5f7af742be3ed0f4f0c10c", - "app/adminapi/route/user.php": "8abadd74c3cfbebaab90cc2b78e7aa6f", - "app/adminapi/route/verify.php": "8d9e65cccbe7f71b8512c738e1349787", - "app/adminapi/route/weapp.php": "ce3681bbc3ef8320ca0ef87343f9d651", - "app/adminapi/route/wechat.php": "209d6a18ec4db8489a66d45b431903a3", - "app/adminapi/route/wxoplatform.php": "8c2beff7d9a13ce0f894fa31f3b62bcb", - "app/api/config/config.php": "8a8eb9ed97f3e6756a5b749b75919489", - "app/api/config/route.php": "4cd8f6db519c1d9eec63b3c03b845b0d", - "app/api/controller/addon/Addon.php": "eefc7a72e39bda8b1812610c9c04ac79", - "app/api/controller/agreement/Agreement.php": "db6370ce29748f70f49044619608c2ad", - "app/api/controller/channel/App.php": "d21e4da4ae1ecba255766623a574e956", - "app/api/controller/diy/Diy.php": "1b6a659ea492385b0b48dde559332cbc", - "app/api/controller/diy/DiyForm.php": "688bd25dee6e78e4e5068e0152b86008", - "app/api/controller/login/Config.php": "7105fbf43ad0fc2899c3e1f9e6704ee2", - "app/api/controller/login/Login.php": "04c3f26637df9738ad85af68ec2529fe", - "app/api/controller/login/Register.php": "46777ee4e0dda0371f9a1124822e24f1", - "app/api/controller/member/Account.php": "fbcdb942585053ce51cf643a5bb28592", - "app/api/controller/member/Address.php": "39a5972e41606299dbd3d73ee9ad3e34", - "app/api/controller/member/CashOutAccount.php": "edc7f12e5b8d52aa3220cd7693e4b3cd", - "app/api/controller/member/Level.php": "be8288fd3d41dc107a6f4718683824e9", - "app/api/controller/member/Member.php": "2dcf4b294c686b95b075f23adfacddcb", - "app/api/controller/member/MemberCashOut.php": "42ce77b0bb4357711a9f057fde07e838", - "app/api/controller/member/MemberSign.php": "002e13eb79ba76514a1578263831b383", - "app/api/controller/pay/Pay.php": "14968343d58997b016faf85cca6f97ab", - "app/api/controller/pay/Transfer.php": "0eeb53ba4c5405b224d881025fade85b", - "app/api/controller/poster/Poster.php": "87dc7c1c8dbd09cdef0525f531b94489", - "app/api/controller/sys/Area.php": "63f3edb14f212398194cb7fbd74500c8", - "app/api/controller/sys/Config.php": "dc19619b7cdd5d3c8ab3934130c6444d", - "app/api/controller/sys/Scan.php": "56f76cfed0859fe59cd4274f45d65844", - "app/api/controller/sys/Task.php": "4954b7102c1dc37c37e33ba3e23e6968", - "app/api/controller/sys/Verify.php": "e16cedd47406bc898aca76f54554be2f", - "app/api/controller/upload/Upload.php": "e2e5f56d71d5d9d6e3f385df258a0b13", - "app/api/controller/weapp/Serve.php": "42aed0b29cf3fb53cec710c18ea9b8a1", - "app/api/controller/weapp/Weapp.php": "3eac4b04d887fb2456f655a9468524f8", - "app/api/controller/wechat/Serve.php": "c0a3340d0614726ed82a181caa4271a5", - "app/api/controller/wechat/Wechat.php": "c2fd9ef6c169589e098a0f8c7b64b901", - "app/api/middleware/AllowCrossDomain.php": "c895e9586d8fb49bdb4eeccc08e0dfff", - "app/api/middleware/ApiChannel.php": "22d324d0e3134c1f697489f84d6294b1", - "app/api/middleware/ApiCheckToken.php": "301da30d5033f9a593a276c1006c50f7", - "app/api/middleware/ApiLog.php": "1b005952be80c24bb46b5b7ebde65218", - "app/api/middleware.php": "b7c80bcc8a354eefed1115926ea52cee", - "app/api/route/addon.php": "7a9035a092a103dbbc989a84a31b1b59", - "app/api/route/auth.php": "075a991e8d45b03f3b76c006b69a7a72", - "app/api/route/dispatch/BindDispatch.php": "a97f535bf20f6f103c6f6522989b5bf0", - "app/api/route/diy.php": "6b6f9c16a3e4f970215cd113ed646dd3", - "app/api/route/file.php": "e947f650c5b00438a78279a0cd37aa78", - "app/api/route/member.php": "1df62ee903eb9c6d8ee8918f23e06c47", - "app/api/route/pay.php": "1989bf9eed7f89dc7854934c4a245f07", - "app/api/route/route.php": "6f976f983b3414cff433e7349e857562", - "app/command/Addon/Install.php": "2660663067eb7c821040443c19380f4e", - "app/command/Addon/Uninstall.php": "48c0a19e11c67b136917ff472ee19315", - "app/command/Menu.php": "4ef97f64f532bb6ca19dc1c968b23b56", - "app/command/Resetpassword.php": "49e3631629165ff0bbbd93e62a0ce30b", - "app/command/WorkerCommand.php": "8cc920985deebe44c12c82baab204e70", - "app/command/queue/Queue.php": "412a0adfb6a17ebc9bda0639e1295ec9", - "app/command/schedule/Schedule.php": "7e00fcab78a61f08d6e00e09773c8879", - "app/command/workerman/Workerman.php": "83a3725b1f1dea86d82fef51ffae0751", - "app/common.php": "4ba82f17462042de86d571689c7298de", - "app/dict/addon/AddonDict.php": "08114efc7daaf8a499fec0dd66c0de87", - "app/dict/applet/AppletlDict.php": "a5fd703df2ba966de20f143c7f2922dc", - "app/dict/cash_out/CashOutTypeDict.php": "c0cd20dabb935e7ffd8c15c7093e92de", - "app/dict/channel/AppDict.php": "71bff0e2a37d7af13a71023eb1791dfd", - "app/dict/channel/CertDict.php": "0cbf44f2f85da63cc6220c5bf5eacfdd", - "app/dict/channel/ReplyDict.php": "8adb7b05ad82fa1a19f94e5af397f6df", - "app/dict/channel/WechatDict.php": "661ceb04782e32757a3a609b413cae2b", - "app/dict/common/ChannelDict.php": "b47111bf4af5028857f6d185df96c8f5", - "app/dict/common/CommonActiveDict.php": "c818dbaa9ed0315b52b7098ccf4aa810", - "app/dict/common/CommonDict.php": "ba556426500425c5a5c8ef2712c54f56", - "app/dict/diy/ComponentDict.php": "a6ab88fca3197f34ee627b21749b1fa5", - "app/dict/diy/LinkDict.php": "a6fd1f0e7dcbc34b90bb7cb2ea05ad57", - "app/dict/diy/PagesDict.php": "3ebae20cd7426e031c7b7386bcb1d903", - "app/dict/diy/TemplateDict.php": "d42918b99b1b28f82e3a3bab59b19e80", - "app/dict/diy_form/ComponentDict.php": "d44268b2e669c9dbce26328b42bf145b", - "app/dict/diy_form/ConfigDict.php": "55ebeadfc67d88622f3751519d01f2a8", - "app/dict/diy_form/TemplateDict.php": "885340afc387d12ab67c4edf7c418be3", - "app/dict/diy_form/TypeDict.php": "7fec044e6e1c34c9374a1f17ae9f3d65", - "app/dict/member/MemberAccountChangeTypeDict.php": "ef0008e40a6ac497a26dae677f3973ec", - "app/dict/member/MemberAccountTypeDict.php": "cdacaf1436ec087ec3a277f629660964", - "app/dict/member/MemberCashOutDict.php": "6dfa8bbd398b2292bb6a71f9e32574ad", - "app/dict/member/MemberDict.php": "51fe700ea255764a25fa310e3d2de976", - "app/dict/member/MemberLevelDict.php": "d37be975e03316f9f9a8db8dacf26b1f", - "app/dict/member/MemberLoginTypeDict.php": "adb3542ba1fe666fad130b291e80995e", - "app/dict/member/MemberRegisterChannelDict.php": "1c90dba3ade7202846c203ae7a41cff6", - "app/dict/member/MemberRegisterTypeDict.php": "cd578e946137a1f1ab64dcd204e9212f", - "app/dict/member/MemberSignDict.php": "141ee7d11c971c1c13ab598baa33bf56", - "app/dict/member/MemberSignTypeDict.php": "cd558a2f431968b93bc9e4ccfb714871", - "app/dict/member/account_change_type.php": "ac87ad9c4e008ea704884f76c9dc0132", - "app/dict/member/benefits.php": "37d7d042cd2204b2d243e4a0c30f23f8", - "app/dict/member/gift.php": "8f4e138eb40d38e29de28d51b4e03e2e", - "app/dict/member/growth_rule.php": "a384eac626f9722e81c46baffcaa0039", - "app/dict/member/point_rule.php": "2d2020e640b01839f401034f241e7981", - "app/dict/menu/admin.php": "e863ff707625f4a4655836854a908b52", - "app/dict/menu/site.php": "e63f41efe2ff7ebe2b47d3758418fbf2", - "app/dict/notice/NoticeDict.php": "6c8046b3b7d8eb56870d347851e4a6be", - "app/dict/notice/NoticeTypeDict.php": "257770c22151f6c5c4aacc2e7c1858d7", - "app/dict/notice/notice.php": "d7048ef6d30df620e1e3b4222d2d7938", - "app/dict/notice/sms.php": "d60f3df25c21d60951954cde074e990b", - "app/dict/notice/weapp.php": "198ae21c6fdb149fca05ff42d0b62e0d", - "app/dict/notice/wechat.php": "198ae21c6fdb149fca05ff42d0b62e0d", - "app/dict/pay/OnlinePayDict.php": "36a64e3cf4bac730c3cb08146befa8f2", - "app/dict/pay/OnlineRefundDict.php": "19180c0fa4992842d8038474f4c4be26", - "app/dict/pay/PayChannelDict.php": "35f1a0e49b050a0b75ed93e3edae30a9", - "app/dict/pay/PayDict.php": "e6d536972b577b8cf840c9bae27ba207", - "app/dict/pay/PaySceneDict.php": "abf93bfd54e3ca06736ae13e7291e432", - "app/dict/pay/RefundDict.php": "5adaa923cf0849aab1819b868f936012", - "app/dict/pay/TransferDict.php": "63603c74408052650bac6c0161270325", - "app/dict/poster/ComponentDict.php": "99ca03b7fab48d6827a9e6932bd18565", - "app/dict/poster/template.php": "cd4cc5b7e712c4c618c05814ea564191", - "app/dict/scan/ScanDict.php": "d617465bec331189e0bfa50af93099e9", - "app/dict/schedule/ScheduleDict.php": "b05a3659389a3b2ad580116be28d27e0", - "app/dict/schedule/ScheduleLogDict.php": "ab36088596c6bc6f9d1593a014249f15", - "app/dict/schedule/schedule.php": "014dde14bf46296a0479534207b5c09a", - "app/dict/site/SiteAccountLogDict.php": "dc82dea274dd3c386142a944106d0711", - "app/dict/site/SiteDict.php": "b5ac50eea24347eb9c6d452e4237366a", - "app/dict/sys/AgreementDict.php": "df295304cc23f0f0f2781715d1f174fd", - "app/dict/sys/AppTypeDict.php": "36c1852c807ffafc9d75c09c16ef81b4", - "app/dict/sys/BackupDict.php": "92faebdecc5d8b9c450e50cb7dccfefa", - "app/dict/sys/CloudDict.php": "98071b86d2d3ea25037d820f66aa47d0", - "app/dict/sys/ConfigKeyDict.php": "6f5766737bde76c5b0aff500a6debd7c", - "app/dict/sys/DateDict.php": "756a9fedd4b6834a3743a2c3f0a2f47f", - "app/dict/sys/ExportDict.php": "7a0eb253777ed568a27d0bc6ef39e784", - "app/dict/sys/FileDict.php": "b3a6965a63d79f4bff6fe93b5b8043c3", - "app/dict/sys/MenuDict.php": "8b7f34757b1aecc11425fcba9c9f70ad", - "app/dict/sys/MenuTypeDict.php": "ea6925816d417a0b7392a78d4210aaef", - "app/dict/sys/MethodDict.php": "1afb37428fd8eefa9f92eeb4bbc1ca35", - "app/dict/sys/PosterDict.php": "c5f8c1c7ae37d166c3e4ebcb9527a4a1", - "app/dict/sys/PrinterDict.php": "db53da5f1927c8e3d15e6f46b94af767", - "app/dict/sys/RoleStatusDict.php": "179f1516f7fc22720b4b0f70a04c7af8", - "app/dict/sys/SmsDict.php": "40496e384ea6be2f2572e6b0a2f80fc8", - "app/dict/sys/StorageDict.php": "0c1f10a06451b5f5777d972ed3d27a58", - "app/dict/sys/UpgradeDict.php": "b3f0051026bb4c13f065d2217a322d97", - "app/dict/sys/UserDict.php": "dd72c6498664ae080e0db6c295c6cef3", - "app/dict/sys/WechatMediaDict.php": "cbd6ef2c45f93a36eaab8b11a09bf5ae", - "app/dict/sys/WxOplatform.php": "ccf9c6bdde4e8bd720a772e4117b4328", - "app/dict/verify/VerifyDict.php": "dc3c4deeb5834798ddf848d4a700c1a0", - "app/event.php": "d95297228ea120512b124dedb0639501", - "app/install/controller/BaseInstall.php": "6e8d04121e7719d31177232004e91fbc", - "app/install/controller/Index.php": "76f545b1487faf3921036d24e818203a", - "app/install/source/database.php": "06302dc2f3b33866d417465be337f0af", - "app/job/member/MemberGiftGrantJob.php": "05daedce9d27878712588d45a8c5e94b", - "app/job/member/SetMemberNoJob.php": "697c5a533fe943dc7ec13f8246386327", - "app/job/notice/Notice.php": "f2fc176291b704d6b081280430af439a", - "app/job/pay/PayReturnTo.php": "3e75086f0c0751f4adc01b0b16f23407", - "app/job/schedule/AutoClearPosterAndQrcode.php": "bcaa54547fe0774bd0427e7f1e3b69ed", - "app/job/schedule/AutoClearScheduleLog.php": "6cf04f07adb64b1205ee5e30776670e9", - "app/job/schedule/OrderClose.php": "544b42ab6d05406828646ae1a1ea7018", - "app/job/schedule/SiteExpireClose.php": "0395b52ff93d79798381b1dc39549b58", - "app/job/schedule/SiteStatJob.php": "6bf3a77bd07a2394263c0f48b70cba3b", - "app/job/sys/AddonInstall.php": "2bb12fbde2fd35e20154431a6af419e3", - "app/job/sys/CheckDeleteJob.php": "98734578b3bf927bf90142b2893f3883", - "app/job/sys/CheckJob.php": "0cbdf6e5ab4253d0a093af53468ed796", - "app/job/sys/ClearUserLog.php": "53df14df8d27109e2854fed5df50b141", - "app/job/sys/ExportJob.php": "21c706e7549c3275faea99e9132f7b44", - "app/job/transfer/schedule/CheckFinish.php": "c0b79b4769e8584dea687a9f49d635ea", - "app/job/upgrade/AutoClearUpgradeRecords.php": "9d6e7d6bbe8cd1c15eb0e937bcbcb876", - "app/job/wxoplatform/GetVersionUploadResult.php": "c825776c384d57a51c6e113001bb865f", - "app/job/wxoplatform/SiteWeappCommit.php": "177d99ddaa5c166ccb11467e7c4ddaba", - "app/job/wxoplatform/SubmitAudit.php": "31d425d5a81d691f1b2c71004e196d88", - "app/job/wxoplatform/VersionUploadSuccess.php": "1d302766d929770a58a2af7000b70c7f", - "app/job/wxoplatform/WeappAuthChangeAfter.php": "bf6e6061d9afb1fb68e9bda05ec02724", - "app/job/wxoplatform/WeappCommit.php": "b652eb90f4648a0f78eaa67b35721374", - "app/job/wxoplatform/WechatAuthChangeAfter.php": "ba8325d477934178171b911830a0c8fd", - "app/lang/en/api.php": "e62498eebbb7edea3ecd0166f2386d28", - "app/lang/en/dict.php": "4fac7afba26b0152e9bdca04a9989f4d", - "app/lang/en/validate.php": "40fb866f0e93c03a8c7427c83b35ee7d", - "app/lang/en.php": "2c6e7d20c1181c93b2dd8db4bfb0ae81", - "app/lang/zh-cn/api.php": "7735b8190847e385005d0f72a87748fa", - "app/lang/zh-cn/dict.php": "ba0fc15691baabd40fa2f18ba165de86", - "app/lang/zh-cn/validate.php": "c97eaf20bd86a172ae52d6f54167c17e", - "app/lang/zh-cn.php": "842375b0b850e6273e835d4adc9953a4", - "app/listener/applet/WeappListener.php": "7e1113d003c55e85aee7da8b9dc3b620", - "app/listener/diy/ThemeColorListener.php": "263bb7b762a3e4f27d624d7d4987ca3d", - "app/listener/diy_form_export/DiyFormRecordsExportDataListener.php": "887a4bfa0bfc30045d716b24795ad234", - "app/listener/diy_form_export/DiyFormRecordsExportTypeListener.php": "7cb946f086f97908d0cc32b38707b62e", - "app/listener/diy_form_export/DiyFormRecordsFieldsExportDataListener.php": "a9d1b329ec713389de23acc9a6215a3c", - "app/listener/diy_form_export/DiyFormRecordsFieldsExportTypeListener.php": "7ccf1fb6a3f68a2c39d47eae350c9bff", - "app/listener/diy_form_export/DiyFormRecordsMemberExportDataListener.php": "aa655a8c23a8f8f23cc1953240756b33", - "app/listener/diy_form_export/DiyFormRecordsMemberExportTypeListener.php": "7c56f26c1b6044388c2958b76367d1b0", - "app/listener/job/QueueFailedLoggerListener.php": "50cee2638fe417afa22d07fca933540e", - "app/listener/member/MemberAccountListener.php": "31fd67404ef5a3f94c9c52ac5224e58e", - "app/listener/member/MemberLoginListener.php": "4ab3e94b0d4842e3c89f6af7748af8a9", - "app/listener/member/MemberRegisterListener.php": "fccc26b95f0f81bdc9b8cec78f9a600b", - "app/listener/member_export/MemberExportDataListener.php": "52af2de7536f0073c1091108bf5a6491", - "app/listener/member_export/MemberExportTypeListener.php": "4363f9b87dd9ae2c4d65bbbfbb9eb559", - "app/listener/notice/Sms.php": "db631401ce7ecf944b4a6cde700f4e8e", - "app/listener/notice/Weapp.php": "63a20dacc5ab85b8eeed55742e5786b5", - "app/listener/notice/Wechat.php": "9efe4ca227f2b9300cd473c48a6cb317", - "app/listener/notice_template/BaseNoticeTemplate.php": "d42083bcae553bdc3cfb14ca95a73ae8", - "app/listener/notice_template/MemberVerifySuccess.php": "73a09499e8a56625cb79c38e7b7034d3", - "app/listener/notice_template/VerifyCode.php": "0f577ca90de79f901480bfa9b0a9f887", - "app/listener/pay/PayCreateListener.php": "2d94b8d556cc2a23c890b334b449f585", - "app/listener/pay/PayNotifyListener.php": "55bdacef3b45965eef512b142a863304", - "app/listener/pay/PaySuccessListener.php": "6635ce8606abf11f35d695454799f6db", - "app/listener/pay/RefundSuccessListener.php": "350852460f69c7b0ff0326ed60e2d2a9", - "app/listener/pay/TransferSuccessListener.php": "40e323e24786a4adfc848a2b3b5c04d4", - "app/listener/poster/FriendspayPoster.php": "ffae7190086eee50b21c9decc1a6b871", - "app/listener/qrcode/WeappQrcodeListener.php": "ed269a91a4b04235becd641e1737cc0a", - "app/listener/qrcode/WechatQrcodeListener.php": "146868711441975e3e8da054043303b9", - "app/listener/scan/ScanListener.php": "c0a0710a1b68f152a7835c932f4b10db", - "app/listener/system/AddSiteAfterListener.php": "73eb0a456ec9272756111a9a5bef5a7d", - "app/listener/system/AdminIndexListener.php": "9a608413ecde6f355f0fa7038dd0fb4c", - "app/listener/system/AppInitListener.php": "e84a3573135671c735c3ccb1da0d7112", - "app/listener/system/AppManageListener.php": "199122123b235d927e2b29b2a472aa16", - "app/listener/system/BottomNavigationListener.php": "6d89ffbf2741e43b4433f5e2e460ad6c", - "app/listener/system/Poster.php": "e838241be8686d5777b339a928e95525", - "app/listener/system/PosterType.php": "df94b723eb01c2021ada01a9242c7f99", - "app/listener/system/ShowAppListener.php": "fc300aa50a620d20731f74ea0b2ac560", - "app/listener/system/ShowMarketingListener.php": "bca08a3a16ff9c09e700b8452688b361", - "app/listener/system/SiteIndexListener.php": "09386b929e0ef1f0c10042879f9f47c9", - "app/listener/system/SiteInitListener.php": "598ce00ec00bd963df8f4df85e0765ae", - "app/listener/system/SiteLayout.php": "40a46e7e6b458d55121c23afaf854874", - "app/listener/system/WeappAuthChangeAfter.php": "59b70bb45b9b41a3aa508f9f41790829", - "app/listener/transfer/TransferCashOutListener.php": "58c2919b66b4b2a0f34161daf7d3f9fa", - "app/middleware.php": "21c7c0c97f41893ed65f6f3a8fa6f920", - "app/model/addon/Addon.php": "885cc271b820bb05987d8b92e669144a", - "app/model/addon/AddonLog.php": "68d5f095eb4c398012724de406febfb2", - "app/model/applet/AppletSiteVersion.php": "27337e276d0c22eda17720a498869280", - "app/model/applet/AppletVersion.php": "35fa57845b095473462ec948f9e0bdb6", - "app/model/dict/Dict.php": "fbde99200745fad175fc6527d89c0201", - "app/model/diy/Diy.php": "4e2b8d55cab53af1e35afaf3569a77d6", - "app/model/diy/DiyRoute.php": "a0ebc8872e788beb640a2a8365cd6346", - "app/model/diy/DiyTheme.php": "a7c0cf1ae6951e8b1aef06b9403016df", - "app/model/diy_form/DiyForm.php": "316d7f9c2fdd190160fd4d03adb6a389", - "app/model/diy_form/DiyFormFields.php": "9b08c577f8dc2bc7dbe2a2c5f2b3edac", - "app/model/diy_form/DiyFormRecords.php": "98d13902e130b7591170f6b8a8aeda8d", - "app/model/diy_form/DiyFormRecordsFields.php": "893db03745e468e62fc81a1b2ad84e8a", - "app/model/diy_form/DiyFormSubmitConfig.php": "abf34c3e0a974f795f3814cf74983ed1", - "app/model/diy_form/DiyFormWriteConfig.php": "252e0a2729b201d8db1b90576c4f66fa", - "app/model/generator/GenerateColumn.php": "5b2607ce628f4dae80db421dc503e545", - "app/model/generator/GenerateTable.php": "da9624dff4faa3d6e6f4a4ddf2487cf3", - "app/model/member/Member.php": "ccee0689bff161b7230f90c2b2296522", - "app/model/member/MemberAccountLog.php": "e7cdb4227f4cdc575055258945d7a999", - "app/model/member/MemberAddress.php": "a3786a52b9c2d96c4fe4595db1b772b4", - "app/model/member/MemberCashOut.php": "5e89de4c3a7a8d5dfb381ce1611f17db", - "app/model/member/MemberCashOutAccount.php": "937b049fcb1d2c894b35bdf356927300", - "app/model/member/MemberLabel.php": "04b38921a5230086d0c4c943078656de", - "app/model/member/MemberLevel.php": "28b52bb8edc8073fdc6138664e40bb0e", - "app/model/member/MemberSign.php": "efefcc1cdf8a2a2e89cbb285a6fd1e3a", - "app/model/pay/Pay.php": "8483addb8695905f1ff494658e99ce4a", - "app/model/pay/PayChannel.php": "5e3a0520db70bb39e43d2900ce7d0b15", - "app/model/pay/Refund.php": "0566832630ad506de8d19d9481d9e2ac", - "app/model/pay/Transfer.php": "17ba2fe0f969b87fe58c69a5e7636a34", - "app/model/pay/TransferScene.php": "ab9ccdea700c10c92f264c855b0bd8eb", - "app/model/site/Site.php": "7288209265747ca7ebf1349a31f6627f", - "app/model/site/SiteAccountLog.php": "7227d9a8b038d775ce9ba24f8a39e15a", - "app/model/site/SiteGroup.php": "d5ae997ab2711631e6b2b433b2c0ca45", - "app/model/stat/StatHour.php": "d251eb53b7530401f12e533807d33f28", - "app/model/sys/AppVersion.php": "689f64af301d6d5594512440e818e844", - "app/model/sys/NiuSmsTemplate.php": "d50f7adf1e1b81da8eea369003b6fa2e", - "app/model/sys/Poster.php": "dfac272484af733574827c41683310e6", - "app/model/sys/SysAgreement.php": "4824d0cc7ebcdf23d442a372a509bd14", - "app/model/sys/SysArea.php": "26f7f3c6b220735f08eda0759e3e1e8a", - "app/model/sys/SysAttachment.php": "f068a1d072927ad4cb4c6104e5b31b8c", - "app/model/sys/SysAttachmentCategory.php": "b84e6d7d9c3466ad441cd157cb6644b0", - "app/model/sys/SysBackupRecords.php": "b6c08e2eceb6d21640ba71bd1fb5db6b", - "app/model/sys/SysConfig.php": "f38ac64069da19ae4f795c7a7310b828", - "app/model/sys/SysExport.php": "4b1edcfab57805bce6edfd8f203fb923", - "app/model/sys/SysMenu.php": "4c9c5980e45fe6a77d00a1a129ce7977", - "app/model/sys/SysNotice.php": "b95fd6ceb6ed4bcc92a75bef208f3cc2", - "app/model/sys/SysNoticeLog.php": "79573fa1462c940ad93a1155b9775ec9", - "app/model/sys/SysNoticeSmsLog.php": "7e2eeb450a2b11657263f74d963c3812", - "app/model/sys/SysPrinter.php": "fcc9b08f7eacfe942e1797f2ec32d3df", - "app/model/sys/SysPrinterTemplate.php": "f9047384ea0a98191409ad25bc02ae1d", - "app/model/sys/SysRole.php": "1dd4f81329a294bcd8a5c0c943fb228f", - "app/model/sys/SysSchedule.php": "6d29f76eb1c510422864ba375b275872", - "app/model/sys/SysScheduleLog.php": "1e1b00d56013139dcd5d0596645c4a02", - "app/model/sys/SysUpgradeRecords.php": "94b14eb384482a28fa906f8e08aef325", - "app/model/sys/SysUser.php": "560163a8e0562dabf50725581b478dd7", - "app/model/sys/SysUserLog.php": "22c3291dc04094ecf7ba4dd74ad22595", - "app/model/sys/SysUserRole.php": "0f69289980d6631f19023544e922fce5", - "app/model/sys/UserCreateSiteLimit.php": "0fa3cf4af78935053067e2415714a746", - "app/model/sys/WxOplatfromWeappVersion.php": "b8b372cfdd012002fb2f2a9a23769b08", - "app/model/verify/Verifier.php": "f1d28945e88a8306a9890716357db25d", - "app/model/verify/Verify.php": "9cfc01b7884f3671c4a320c62a75dde9", - "app/model/weapp/WeappVersion.php": "f92106d8be8a7eb26c3edb88d86721cf", - "app/model/wechat/WechatFans.php": "4b9f06b7a577166acbdc25e9ac232e73", - "app/model/wechat/WechatMedia.php": "e43c74059ffffd0036643cd0414019c0", - "app/model/wechat/WechatReply.php": "8731c37000b0f75140d1675794c548e9", - "app/provider.php": "ebb44e88502900317f1783d70fe32fca", - "app/service/admin/addon/AddonDevelopService.php": "75781742191267680456273b8e1edf64", - "app/service/admin/addon/AddonService.php": "9ffa162ff24bcdadc0fefd804c5a9050", - "app/service/admin/aliapp/AliappConfigService.php": "1b69b972490c8cff32d94117686d6362", - "app/service/admin/applet/AppletDownloadService.php": "1226e0efad9d392e9855241bff36ca94", - "app/service/admin/applet/AppletVersionService.php": "09ab2678c53ab785c476459ca4183dd4", - "app/service/admin/applet/AppletVersionSiteService.php": "6742606d298e9f2e749a699fc90fd3d0", - "app/service/admin/auth/AuthService.php": "148fc2a851e65c88e5d9ba801aefd032", - "app/service/admin/auth/AuthSiteService.php": "6cb7cfbe4f549a2738a4b92325ed07d6", - "app/service/admin/auth/ConfigService.php": "aaedae6e3fa2ba226c53eaaa9d0733f8", - "app/service/admin/auth/LoginService.php": "12072b03a770e18ad4aeadd92276bf2f", - "app/service/admin/captcha/CaptchaService.php": "1b35585ff68b1cdb026f35b2af08320a", - "app/service/admin/channel/AppService.php": "bbaf44e4c1a79c03c89ec6aa5447b03d", - "app/service/admin/channel/H5Service.php": "9c1c8eb0271509e120affa00b400991a", - "app/service/admin/channel/PcService.php": "0c94f21fab6353178e742bec2c0b1ea7", - "app/service/admin/dict/DictService.php": "6aae9782f42ad535e138de9edc9fe28b", - "app/service/admin/diy/DiyConfigService.php": "2e019cb1995b1ff7fe3d24ed0dc1a28b", - "app/service/admin/diy/DiyRouteService.php": "33d057493e728559b9aebcb79de5920a", - "app/service/admin/diy/DiyService.php": "97e6fb124e0f132f00f1a4984ede7036", - "app/service/admin/diy_form/DiyFormConfig.php": "f8f366e6572f1c42d48b48626e139056", - "app/service/admin/diy_form/DiyFormRecordsService.php": "597b63dff8b808fdb154ecddd63d7b96", - "app/service/admin/diy_form/DiyFormService.php": "f1806c7183002d9317890198bffa1eac", - "app/service/admin/generator/Generate.php": "5b6b7b67e353e85343f60400b36ca4cf", - "app/service/admin/generator/GenerateService.php": "6a504b738685cd9aa9d45a0e5d0cd391", - "app/service/admin/generator/core/AdminApiRouteGenerator.php": "31aebd4406b9753cf03e755a5be4f0ab", - "app/service/admin/generator/core/BaseGenerator.php": "53ea655a0887c20fd845ba0897c494bc", - "app/service/admin/generator/core/ControllerGenerator.php": "e7c4b31b808057c85f2ee36abc7de268", - "app/service/admin/generator/core/MenuSqlGenerator.php": "cf07e1ae062cd229d1dc6dce61018825", - "app/service/admin/generator/core/ModelGenerator.php": "aae02883663fcaa1448d8253709de9db", - "app/service/admin/generator/core/ServiceGenerator.php": "4adefbdb50828eb9efb4cdb2838ac88a", - "app/service/admin/generator/core/ValidateGenerator.php": "1ec37d6346f1303343378901560478be", - "app/service/admin/generator/core/WebApiGenerator.php": "e45e47d37be4fced49a4273a78d0c475", - "app/service/admin/generator/core/WebEditGenerator.php": "8b82ff64587fd477272ec14a5898d779", - "app/service/admin/generator/core/WebEditLangGenerator.php": "0f6d63cec3e7cefc9c73f19095028790", - "app/service/admin/generator/core/WebEditPageGenerator.php": "f8db01e4e4eb8818586eff78b88f37d8", - "app/service/admin/generator/core/WebIndexGenerator.php": "95fa22de5320f8c9d4e4e64c8f94f63b", - "app/service/admin/generator/core/WebLangGenerator.php": "3ea0f1ff46000e4ab77a115dce555d30", - "app/service/admin/home/AuthSiteService.php": "39fccd90cce3b70ab5e3f77aaa1ae66e", - "app/service/admin/install/InstallSystemService.php": "cedd12516f4e9549a1d83fe6651ef820", - "app/service/admin/member/AddressService.php": "1a1c39c1afddb11fef6d52d6b1c4754f", - "app/service/admin/member/MemberAccountService.php": "9a33417fb95a8b25caf0564221b563fe", - "app/service/admin/member/MemberCashOutService.php": "f3d83e036fa5d264e7536988f60f1496", - "app/service/admin/member/MemberConfigService.php": "f2dbd9bab8375b7ef2a4c0ab6a4c8dfb", - "app/service/admin/member/MemberLabelService.php": "6246d5eef669c5a0157746863ace40ff", - "app/service/admin/member/MemberLevelService.php": "9813e7841affac8566519b5c62f09179", - "app/service/admin/member/MemberService.php": "c311d4d5f0531ac4fd9be4b63f632364", - "app/service/admin/member/MemberSignService.php": "17e344b47f726bd108bc65041282cba2", - "app/service/admin/niucloud/NiucloudService.php": "d78a5d28846e322a6390bb787b2eb09e", - "app/service/admin/notice/NiuSmsService.php": "d119f675060d549170ca1f48bf50c26e", - "app/service/admin/notice/NoticeLogService.php": "2c10f72473337735212e288198644523", - "app/service/admin/notice/NoticeService.php": "802e0438bed2c919e2dc804364ba7d03", - "app/service/admin/notice/NoticeSmsLogService.php": "bb958b667e55213c64772246e574f216", - "app/service/admin/notice/SmsService.php": "66c601faad39555ad4651e21f6317cf2", - "app/service/admin/pay/PayChannelService.php": "8cb1d2ace2c870a16caaf4cc439f59d9", - "app/service/admin/pay/PayService.php": "fca0f63eb7a2d6d06e10e223f5bdbfe0", - "app/service/admin/pay/RefundService.php": "3a9c7bfec2fe0900e076af7af74c61bb", - "app/service/admin/pay/TransferService.php": "03a5a2b466d125b9f72666b823210b0a", - "app/service/admin/schedule/ScheduleLogService.php": "30b24493429e05e84a6825556b236f9d", - "app/service/admin/schedule/ScheduleService.php": "b42fb99fd4b585eea8781734cb4710b0", - "app/service/admin/site/SiteAccountLogService.php": "63f80ee1817e931318297fe36494b368", - "app/service/admin/site/SiteGroupService.php": "3375cd6232581b5764eb74d7292bc68f", - "app/service/admin/site/SiteService.php": "798226c17d142da53506343755e21d68", - "app/service/admin/site/SiteUserService.php": "1f27d30ec1313e88b763e707d7918e84", - "app/service/admin/site/UserLogService.php": "938af541faeae9978750b94d9eca2dfc", - "app/service/admin/stat/SiteStatService.php": "c9d5c7ab5e6207a615b3c61ff3279e96", - "app/service/admin/stat/StatService.php": "5591985f69d78dd1973a10a119febab6", - "app/service/admin/sys/AgreementService.php": "cdea12f958c6a12e524939ae31dfc5c3", - "app/service/admin/sys/AppService.php": "5fc070d389463fbb8fc0f51c6b543729", - "app/service/admin/sys/AreaService.php": "c4838c12b225fe645b21d3928083e035", - "app/service/admin/sys/AttachmentService.php": "20653b0b38da18cb76bf2c6f27204ea2", - "app/service/admin/sys/ConfigService.php": "d13d244bc11f8e53c80caad55385fcf7", - "app/service/admin/sys/ExportService.php": "1825b07f396fd93a8f2e297dbdd2113c", - "app/service/admin/sys/MenuService.php": "acb2346b216f584ad321bdbe53d89deb", - "app/service/admin/sys/PosterService.php": "3a9dfb1d91f645e6da5a0066a918fedc", - "app/service/admin/sys/PrinterService.php": "c24c8458263713f48991f6a74df36f0d", - "app/service/admin/sys/PrinterTemplateService.php": "97e23f6d5f09e00bc44becb6015959b9", - "app/service/admin/sys/RoleService.php": "ccad2ac6df1d6f4e3bbac97975c86ff3", - "app/service/admin/sys/SystemService.php": "ce6e2798f5bb3c1bc9d1d37c8d384b71", - "app/service/admin/upgrade/BackupRecordsService.php": "3fa80ced64f7d1215a0d3b1927cce3b9", - "app/service/admin/upgrade/BackupService.php": "dd4dc895c3eb8c6d789fb7a9c5cec285", - "app/service/admin/upgrade/ExecuteSqlTrait.php": "c130f72d682942d7c722c564e1ddc2bd", - "app/service/admin/upgrade/RestoreService.php": "7794eb2b208af59615cd70122d0917f5", - "app/service/admin/upgrade/UpgradeRecordsService.php": "614cda19f53f7e1be2ab2f165e709e0f", - "app/service/admin/upgrade/UpgradeService.php": "76319e2bf2f7b40700604cecd67c6fe6", - "app/service/admin/upload/StorageConfigService.php": "4eb49a4393e8350e2ab91fa6cfb45da0", - "app/service/admin/upload/UploadConfigService.php": "d4211f8eea290b4771d078704bfb441b", - "app/service/admin/upload/UploadService.php": "5a7009a7f2d542efe45fe6ab45e00b28", - "app/service/admin/user/UserRoleService.php": "9adce42f473a115c7e02396d0ca611c1", - "app/service/admin/user/UserService.php": "4eed65b3cd79ef8f7c904dede8c926fc", - "app/service/admin/verify/VerifierService.php": "565b9bedc35a18023b5e179dbf3432b0", - "app/service/admin/verify/VerifyService.php": "916ab58ec191dcf6625bca340ae3d33f", - "app/service/admin/weapp/WeappConfigService.php": "a1c03af9e689065af7cdb3c8d948c690", - "app/service/admin/weapp/WeappDeliveryService.php": "ca413f722d6d21458b4c1e1f2d1234ee", - "app/service/admin/weapp/WeappPackageService.php": "972e25be317e198504a1b2643a71fb18", - "app/service/admin/weapp/WeappTemplateService.php": "e5b1a05a9c6930c6462f0e7104eb3598", - "app/service/admin/weapp/WeappVersionService.php": "5bbde277c7aafe075e760dfef94cb179", - "app/service/admin/wechat/WechatConfigService.php": "4a5443da5325e48d8dc0c331167e07d1", - "app/service/admin/wechat/WechatEventService.php": "a66563c8a011c1005daffb444aafe203", - "app/service/admin/wechat/WechatFansService.php": "54a23806236cff5b7585d55d851f7eaf", - "app/service/admin/wechat/WechatMediaService.php": "e29c6b5b0b1909088fc4d73b759f64c3", - "app/service/admin/wechat/WechatMenuService.php": "9d0357eb4e72684920da754289d81b0b", - "app/service/admin/wechat/WechatReplyService.php": "a1398c00ecefd2b4c9a749b1cfff54f3", - "app/service/admin/wechat/WechatTemplateService.php": "675bcbfd3297c8efa4d12ff8e4cf1384", - "app/service/admin/wxoplatform/OplatformConfigService.php": "c8be400ddae0c0904c041747a7e2a409", - "app/service/admin/wxoplatform/OplatformServerService.php": "34699e42868455ef3ea7bf2b47479314", - "app/service/admin/wxoplatform/OplatformService.php": "d4a8ec7f60b4fa38e0eea742e7d14abf", - "app/service/admin/wxoplatform/WeappVersionService.php": "687ecbb36d7776601eb73cd14bdc5538", - "app/service/api/addon/AddonService.php": "6298dd50d750d392419425d003affcc4", - "app/service/api/agreement/AgreementService.php": "0ba40676eff1b9b261022e070899e808", - "app/service/api/captcha/CaptchaService.php": "790d70ab3ff4cb0ef8f8bdb557694e8b", - "app/service/api/channel/AppService.php": "38515acbe7cd8989bf8a42cf1f07f20c", - "app/service/api/diy/DiyConfigService.php": "cba8e32652183a09848c1c72b55a739e", - "app/service/api/diy/DiyRouteService.php": "2a3f389d20f2d2a919ac302d3e7b1c0b", - "app/service/api/diy/DiyService.php": "d53e0b3cfacb53f38389f1b72b23be7e", - "app/service/api/diy_form/DiyFormService.php": "f7ce6a3fe9647fdb93d319ab0079539d", - "app/service/api/login/AuthService.php": "1eb212fec34628b41b748d506673d847", - "app/service/api/login/ConfigService.php": "4652b4377769f1fdf3640d0d4a458040", - "app/service/api/login/LoginService.php": "70c3bb4eb7a071bc32a8572d6f529308", - "app/service/api/login/RegisterService.php": "c9ec1b828ba4208c6b08877dcaf85c65", - "app/service/api/member/AddressService.php": "cac871f4b0e44a08b40a1eeab4a04f98", - "app/service/api/member/MemberAccountService.php": "f38f766773b9dc8f9414b7f0e432d43e", - "app/service/api/member/MemberCashOutAccountService.php": "d29e8ab83ed1ced40f3f06560feae4fd", - "app/service/api/member/MemberCashOutService.php": "e14bd99f8813283885241c36d29e0dea", - "app/service/api/member/MemberConfigService.php": "c1816a1001f0609fe09b8ba56574c215", - "app/service/api/member/MemberLevelService.php": "7520d442e47e92bfa632c074dfc279aa", - "app/service/api/member/MemberLogService.php": "3a65fb7ff5684d14c061e0b96c2b4ebf", - "app/service/api/member/MemberService.php": "f75ec63d99d42f09c6aa131928ba1894", - "app/service/api/member/MemberSignService.php": "d59b312fcd0a2d1ebdf6a2fe633f178c", - "app/service/api/notice/NoticeService.php": "74551f89f6bd9904fac80bf17a5f8b00", - "app/service/api/pay/PayService.php": "099a757e1c4a2ddfef43f4b9d4c70c8b", - "app/service/api/pay/TransferService.php": "8b5cf227233cd2a98bc39bd5f3ef812a", - "app/service/api/scan/ScanService.php": "747016936b2c293940dfbad56518ef9a", - "app/service/api/site/SiteService.php": "13b1dae5850bda51a1a575c06b109c08", - "app/service/api/sys/AreaService.php": "bfaaead10ea00311808013cfcd19f161", - "app/service/api/sys/ConfigService.php": "a352f41a1e2d430b9a824ee381580049", - "app/service/api/sys/TaskService.php": "34d546b923d63cc551edd7ad7cabf665", - "app/service/api/upload/Base64Service.php": "74c5e4f6a5e93412d43ea031a83eeb3f", - "app/service/api/upload/FetchService.php": "2fbd2a787b47582c51ac5d0c9cbe251d", - "app/service/api/upload/UploadService.php": "5a5569c328003d41bc95a1b536dbea9c", - "app/service/api/verify/Verifier.php": "ddd1231bbc204607508a8bb1a4b40ce2", - "app/service/api/verify/VerifyService.php": "d99924df32eb17c7eef653efa7349f13", - "app/service/api/weapp/WeappAuthService.php": "d3a1fb5ea7d0b4ec05966507b4df13e0", - "app/service/api/weapp/WeappDeliveryService.php": "39757ab0b984813f8b4eb5fd7804dbcc", - "app/service/api/weapp/WeappServeService.php": "f912a318b5218b8e294925a90bc8955f", - "app/service/api/wechat/WechatAppService.php": "7c4f5370503d63ed4944afd80ce7c374", - "app/service/api/wechat/WechatAuthService.php": "88fc65126fd0fd5f50185e73ab81adab", - "app/service/api/wechat/WechatServeService.php": "b28153720f2907e68ed90a11beaf292a", - "app/service/core/addon/CoreAddonBaseService.php": "52a1238f5f68da9d484291d0cc3010cb", - "app/service/core/addon/CoreAddonCloudService.php": "65ba669a27d9ef1df482098e97f4bc98", - "app/service/core/addon/CoreAddonDevelopBuildService.php": "f414595170c8766ed22b224afe52801b", - "app/service/core/addon/CoreAddonDevelopDownloadService.php": "cfbb360619ad5aefa115d8d054b862b6", - "app/service/core/addon/CoreAddonDevelopService.php": "216835082b5c0de2174bda1f22f0054c", - "app/service/core/addon/CoreAddonDownloadService.php": "54841a1eb1df92c4bb7d90316cc94a75", - "app/service/core/addon/CoreAddonInstallService.php": "73a987493555d5fcc7fce0fb23da8e1b", - "app/service/core/addon/CoreAddonLogService.php": "639346ec3c68128e5dd9e0cd134c9c63", - "app/service/core/addon/CoreAddonService.php": "8e233e81133bb4d64c47724a14e8635f", - "app/service/core/addon/CoreDependService.php": "baa14a0bc980eeb5a5db62e873b89c97", - "app/service/core/addon/WapTrait.php": "4514f9cd9290afa5e688ff4e2290fb3a", - "app/service/core/aliapp/CoreAliappConfigService.php": "6286bed9d3418c391b2889b8ffb134f2", - "app/service/core/applet/CoreAppletDownloadService.php": "a4ef6d2154adf4844cb0c076689eed07", - "app/service/core/applet/CoreAppletSiteVersionService.php": "719c5d2158d63444ee78c05963a1e4c9", - "app/service/core/applet/CoreAppletVersionService.php": "147ed8b14ee2375a23611ff8932ad813", - "app/service/core/captcha/CoreCaptchaImgService.php": "c731c8bebf637a84759f29a8d12b4512", - "app/service/core/captcha/CoreCaptchaService.php": "10648f6a15eb1dc6a07f1a7778de5070", - "app/service/core/channel/CoreAppCloudService.php": "c458e39bc6c6778961acda81edb9f373", - "app/service/core/channel/CoreAppService.php": "efe3e07cdce962bc3dd29fbe1bc02a41", - "app/service/core/channel/CoreH5Service.php": "8db91b9060233bab63eb0455da4e9e94", - "app/service/core/channel/CorePcService.php": "6f8f0d159e8d604ed612f4a7774c865d", - "app/service/core/diy/CoreDiyConfigService.php": "0903e097501ac3e0def2793814b8cd61", - "app/service/core/diy/CoreDiyService.php": "e5a8fe73d10f34bf7504939252cca6ad", - "app/service/core/diy_form/CoreDiyFormConfigService.php": "72df9f57ab34ff387bc692a37b7dd6d0", - "app/service/core/diy_form/CoreDiyFormRecordsService.php": "c365fea756ba661c06cb5828e8b824e1", - "app/service/core/http/HttpHelper.php": "a1e8cadf900d2da45c437308a4b1c321", - "app/service/core/index/CorePromotionAdvService.php": "87f309e4c616e558cb72002743a0a2d5", - "app/service/core/member/CoreMemberAccountService.php": "67d596dc931c91eb49fd2d728fbb6058", - "app/service/core/member/CoreMemberAddressService.php": "35e8433e26c71803ed983b84ea7d1e55", - "app/service/core/member/CoreMemberCashOutAccountService.php": "5c6eca0b00585dcdc66dbc47cd34cc9c", - "app/service/core/member/CoreMemberCashOutService.php": "6e6e98341062d6a6c13ed97c0e5486f5", - "app/service/core/member/CoreMemberConfigService.php": "37a15c074284654ec6253988120c448d", - "app/service/core/member/CoreMemberLabelService.php": "2fc0cd7759d61a6613d2506999422f5f", - "app/service/core/member/CoreMemberLevelService.php": "cd87359c50bd3bc15b0552e48004ea21", - "app/service/core/member/CoreMemberService.php": "a1bd3b2523f807d257e71e6ae91c8fe4", - "app/service/core/menu/CoreMenuService.php": "50f45cb9af9b8d40efaffe24754ecb4e", - "app/service/core/niucloud/CoreAuthService.php": "620b355c2dc44d8967605315a2bd8bd0", - "app/service/core/niucloud/CoreCloudBaseService.php": "7ac79e23687646c69e1699ee4860eb23", - "app/service/core/niucloud/CoreCloudBuildService.php": "fe283696e43ed21c895cb3a94d0447a2", - "app/service/core/niucloud/CoreModuleService.php": "7cd76e3fc3b221cf5849d352f6c81817", - "app/service/core/niucloud/CoreNiucloudConfigService.php": "a4c803519a2e020ab35d600ebd4125cd", - "app/service/core/niucloud/CoreNotifyService.php": "df2ed4c0297b08407bb73deb9469941d", - "app/service/core/notice/CoreNiuSmsService.php": "8d7d584375f7d5298efb33463c1855f6", - "app/service/core/notice/CoreNoticeLogService.php": "9ea5c9c3a53538c37024c4a0707fe2f1", - "app/service/core/notice/CoreNoticeService.php": "9b44fd711d8068d7cb06fe169119e834", - "app/service/core/notice/CoreNoticeSmsLogService.php": "b7e5419fa4d78025bbeaa20b3d809877", - "app/service/core/notice/CoreSmsService.php": "c8690ba4c11e57f2bd99e2d86c69743f", - "app/service/core/notice/NoticeService.php": "bc5dedc699cc6c4053796c81257375ce", - "app/service/core/pay/CorePayChannelService.php": "3e2c65f6c753c389b55de7b3faee2e7d", - "app/service/core/pay/CorePayEventService.php": "f68ed9ed9266b5962c6b2b32c5c2b11a", - "app/service/core/pay/CorePayService.php": "ef85f1f7c506d050276b1798ddecc26c", - "app/service/core/pay/CoreRefundService.php": "67dba962c4791ed2adde5a784d1cc919", - "app/service/core/pay/CoreTransferSceneService.php": "5efb0aca2436dce07f512a006c9211fd", - "app/service/core/pay/CoreTransferService.php": "0a0a17a0d2e88e32c09df182b5c38ba5", - "app/service/core/paytype/CoreBalanceService.php": "b97cb0c69066f85077c9bd353c1387a8", - "app/service/core/paytype/CoreOfflineService.php": "f211de4b324d0a2b8ba4d347d2b2c5d2", - "app/service/core/poster/CorePosterService.php": "7d0c9d85e29fdb31df913bf4d9e3f86c", - "app/service/core/printer/CorePrinterService.php": "92345dd99aeee224da8fecc2e29faed0", - "app/service/core/scan/CoreScanService.php": "40c3c97a17126cc129b93e0cc360329a", - "app/service/core/schedule/CoreScheduleInstallService.php": "183c116dc77d2f40e3b281698c8e9ae9", - "app/service/core/schedule/CoreScheduleLogService.php": "cd5f47603193840819a91447fe4150ed", - "app/service/core/schedule/CoreScheduleService.php": "73efeeef554a90a8aaa3f0252f0eda37", - "app/service/core/site/CoreSiteAccountService.php": "8c618d589340c85f2e9c55a2c97689f6", - "app/service/core/site/CoreSiteService.php": "7e3d9ba43864a7d6455c7057278ed697", - "app/service/core/stat/CoreStatService.php": "d9ee99edd0a0b75640cd5bd86167a326", - "app/service/core/sys/CoreAgreementService.php": "1ced2ffcf7f2b61d839cc8136b67cfa9", - "app/service/core/sys/CoreAreaService.php": "2a10e48b33d1d079f212bcf2340ef5f9", - "app/service/core/sys/CoreAttachmentService.php": "0531422cb3b6374a7234711e16e9966e", - "app/service/core/sys/CoreConfigService.php": "6caa59a9a057645eadd9854d7833a46a", - "app/service/core/sys/CoreExportService.php": "469894b3b946dad4c21ff4afe7737b45", - "app/service/core/sys/CoreSysConfigService.php": "0912ce65869200903f6191120ee74599", - "app/service/core/upload/CoreBase64Service.php": "a4b4bae2e7acb0c9cc0412caeee3bf5f", - "app/service/core/upload/CoreFetchService.php": "d083c54320ff3bf1faf54448b2b21020", - "app/service/core/upload/CoreFileService.php": "f182245d0b42835aae52e3a6cc8bc31d", - "app/service/core/upload/CoreImageService.php": "22dca350e72f03219ff2f2ceaa436bef", - "app/service/core/upload/CoreStorageService.php": "c277da4d4772af1c7dd04a860e4794c8", - "app/service/core/upload/CoreUploadConfigService.php": "ae34c0b389256fdd4f8db2c9acf41195", - "app/service/core/upload/CoreUploadService.php": "36f32903df9ce3fa9100b2a1457399e2", - "app/service/core/verify/CoreVerifyService.php": "0d8dd5a23a46b60b3c2130a73b927a2a", - "app/service/core/weapp/CoreWeappAuthService.php": "58370a31135d2cff7eddfa2e13ac30a0", - "app/service/core/weapp/CoreWeappCloudService.php": "3cc7de33e6dd74743c9db93d7edd04b4", - "app/service/core/weapp/CoreWeappConfigService.php": "9edc7308cf410b124465abce58fa7dc8", - "app/service/core/weapp/CoreWeappDeliveryService.php": "5ffc36aaed8c16d82628442c11976a04", - "app/service/core/weapp/CoreWeappServeService.php": "012506f4b10fe7cee34f6c2b45f92b34", - "app/service/core/weapp/CoreWeappService.php": "df7ef77ac12839ba95e70b1c77af18c6", - "app/service/core/weapp/CoreWeappTemplateService.php": "650cac881e5e216ad4f677ee3ccff55e", - "app/service/core/wechat/CoreWechatApiService.php": "a7bd070a2c78df4ca659b33502206908", - "app/service/core/wechat/CoreWechatAppService.php": "cee4c40602518697cd906806346dda8b", - "app/service/core/wechat/CoreWechatConfigService.php": "5aafb91be4859e907984884169e6a8c1", - "app/service/core/wechat/CoreWechatFansService.php": "a30adbfc36e980fe460f7e73d05dfff5", - "app/service/core/wechat/CoreWechatMediaService.php": "a10f6c8e2a97b65babebad53f994b1cd", - "app/service/core/wechat/CoreWechatMessageService.php": "438a7466d31043b7843f937dbeab799c", - "app/service/core/wechat/CoreWechatReplyService.php": "5dc59718ada19e708778dfd2aa4efa5c", - "app/service/core/wechat/CoreWechatServeService.php": "263afe1393b79085d196b8c242a45a6d", - "app/service/core/wechat/CoreWechatService.php": "a0a4edb13b80dc257abbd8690cbb74a4", - "app/service/core/wechat/CoreWechatTemplateService.php": "0df630ccdbd93e83a45071b3442ead32", - "app/service/core/wxoplatform/CoreOplatformConfigService.php": "63cd9a65882ec6b22fc9e2a0c84194a1", - "app/service/core/wxoplatform/CoreOplatformService.php": "a1fc789c19cce1cd9d762cb73722dc8f", - "app/service.php": "fe4744b6408f76228a06ef5b25b2bbe0", - "app/upgrade/v011/Upgrade.php": "c069c0ec2239ac4dd2b5fa2cfb172d08", - "app/upgrade/v020/Upgrade.php": "d0594834d9b0372d1e573a7a96baaac0", - "app/upgrade/v030/Upgrade.php": "95f0ff259f10d69df7db572c2c881810", - "app/upgrade/v050/Upgrade.php": "579231ef044f7d877214f16473d9fd2f", - "app/upgrade/v053/Upgrade.php": "8e4291fb9f2b8d6fcdf969f602c1d549", - "app/upgrade/v054/Upgrade.php": "50cade500dedc225b3e7bf139e2666f6", - "app/upgrade/v055/Upgrade.php": "8ae2096112f01d425bd4707e340769b1", - "app/upgrade/v056/Upgrade.php": "194ca7de0bb80699e5d5ad3311faaee2", - "app/upgrade/v100/Upgrade.php": "d591e94990eafa6e539de52d8c6618ae", - "app/upgrade/v101/Upgrade.php": "25f9e65fe8d7906a62e8b96d8f3f8755", - "app/upgrade/v111/Upgrade.php": "20d525230361a70bc47062a2ebf1c6d0", - "app/upgrade/v113/Upgrade.php": "10801fcbc1e1606302ca5d8afd6b20a5", - "app/validate/addon/AddonDevelop.php": "875af0fb5e4de4e723366236fc82125d", - "app/validate/channel/Aliapp.php": "e2da16e9b48f4fe21f4637df2b0bfa82", - "app/validate/channel/Weapp.php": "c2f201fc4def6e06769241f5ccb4e539", - "app/validate/channel/Wechat.php": "1b5dac0319f0b506e2d54f8deca3ec9c", - "app/validate/diy/Diy.php": "8dc94ec3e0aabda1cbb8b3abe9970834", - "app/validate/diy/DiyForm.php": "ae7b76707b68cdc8d4ccdec03e09166c", - "app/validate/diy/DiyRoute.php": "afff5a627b9fa7f3ca7d863ba51bdb39", - "app/validate/diy/DiyTheme.php": "87ab91c0b3b3912150bdf340f0a8bd44", - "app/validate/generator/Generator.php": "5e3981cb5b192f6770c53f89a17ef687", - "app/validate/member/Address.php": "94542b7c1c3cf804c6cbcbff07a81e9a", - "app/validate/member/CashOut.php": "bd41eb7e6531c1c63edd800de5d9bc93", - "app/validate/member/CashOutAccount.php": "35e24d03fffcaae175c94cab9d567d1c", - "app/validate/member/CashOutConfig.php": "17ec0f6898ce8b8832e08444b83bc700", - "app/validate/member/LoginConfig.php": "0944882e675daa065d2a0114ac4f4e0e", - "app/validate/member/Member.php": "168f6433f29718373702e1a68187841b", - "app/validate/member/MemberConfig.php": "a7efc31caa5032ab2ffdda648ccd370d", - "app/validate/member/MemberLabel.php": "7de71a31a8d837d35840ae878781587f", - "app/validate/member/MemberLevel.php": "ab6e62fd4b4587f720bbaa5d30b3ceb0", - "app/validate/niucloud/Module.php": "bc911c299b844a9ea342000b95f70cda", - "app/validate/pay/Pay.php": "a32352dcb8f134917c8b9efe1e9219ab", - "app/validate/pay/PayTemplate.php": "a26070a16f279e5adaa7965c701c25ae", - "app/validate/site/Site.php": "412ea1561afc9cad803f09a614e1da2e", - "app/validate/site/SiteGroup.php": "37d2173dfff162d35a38b8504ef04784", - "app/validate/sys/Agreement.php": "3ebfefb2527b2d564613d9d52cdfc6ac", - "app/validate/sys/AttachmentCategory.php": "755c5e9eafdb1d429a6d25e7c8c21cdb", - "app/validate/sys/Menu.php": "a274b1d11a54976c8bf6c53e53d4f042", - "app/validate/sys/Page.php": "7a6eb6657f7a0d96656611037613542f", - "app/validate/sys/Printer.php": "6833e8a709c6134239b935fd2bc5e716", - "app/validate/sys/PrinterTemplate.php": "1bb3ce3f48ce85efc0fe3d6efcc6c70e", - "app/validate/sys/Role.php": "f91feb7dfd895bc785c0ab5647364685", - "app/validate/sys/Schedule.php": "fd234530c2d08415d455fdbe5658d721", - "app/validate/sys/User.php": "1d167340acb47313e85ae5d14f1a3082", - "config/app.php": "fe98c3c89e6cc33fbd73414c766b8e44", - "config/cache.php": "f0ff44b66b94a7c72ef9972fc2d66c50", - "config/captcha.php": "33373ca06ae3405ad1e08d77ac679de0", - "config/console.php": "de68f50223887c5434baca85615d88c3", - "config/cookie.php": "c0742acbb8bbbc3b39bfcc1c17d198ae", - "config/cron.php": "ca78224fef74a858059865971fa839f1", - "config/database.php": "ce25f0f6601eb3dfc58c2a25a99f86bf", - "config/filesystem.php": "43f58ebd13880595349b36398fc224fc", - "config/gateway_worker.php": "c015a8d9a1ba6fb0aaa56f28ec458550", - "config/imgcaptcha.php": "83421621cf2eeb48669cd203ba682054", - "config/lang.php": "e44cdd672ced6ebcc36cd4d564c435ce", - "config/log.php": "30e50f174a774ff1bbdb9e75d52e7f22", - "config/middleware.php": "4f948bbdddbe30647f8e76a102f4f865", - "config/niucloud.php": "44321ad73a878f348b138473b4ac9b38", - "config/oauth.php": "b0ee30cb1da9aeb30c789bc4f161ba49", - "config/pay.php": "bfa769780e1c00b78e06095017140c84", - "config/poster.php": "422bd9729c131a2ed04efa9ea64f5ff1", - "config/route.php": "a1f5eebaf8b664ee2e9da39e770f60b4", - "config/session.php": "fa9e3ae84719b2fb048d3e104baf27c2", - "config/sms.php": "b15faa9173be108488a82a0398741724", - "config/terminal.php": "bb44817659c03122a4ffc2f6ef5988be", - "config/trace.php": "bc640669342b7021d7ae4dc1fff70fbc", - "config/upload.php": "5f88a173993a059812867ac39a7864e9", - "config/version.php": "c13e335f3b392fddde7b6bcb068d3d74", - "config/view.php": "25ad7436aa1882f1c7e12c455f1a4239", - "core/base/BaseAdminController.php": "80918fbbbb10b252b5f2c7aac653a93d", - "core/base/BaseAdminService.php": "a6e76f753275a586c9d4dc461ba8fe28", - "core/base/BaseApiController.php": "5fee2ecb2e937b82fffad30fc4e7869c", - "core/base/BaseApiService.php": "459b58863f979934ef209b90159f1b7b", - "core/base/BaseController.php": "2f298a6ebf8250a7ce3f7f6cb193163c", - "core/base/BaseCoreService.php": "3d642a3d28420972c7d946047d671e92", - "core/base/BaseJob.php": "8ebe024754aa5f2436ac56fecaf938d2", - "core/base/BaseModel.php": "9070740a68128563a63797317f3fe7ce", - "core/base/BaseService.php": "7bb503654527bbedb48b2a613e2a2e55", - "core/base/BaseValidate.php": "f5f2ffcd116cce64003947afe3784757", - "core/dict/BaseDict.php": "02c3aa56ae473280f83110654c5f1b68", - "core/dict/Config.php": "7c8cc9354022f22223a64ef8659ba8b4", - "core/dict/Console.php": "4388b9f48553f33da68cd1ed8ed24b58", - "core/dict/DictLoader.php": "768d9c6b0fc88e9a32695fad86e3a0f5", - "core/dict/DiyFormComponent.php": "48258c452df1f3b6a889bd6809c8fcd2", - "core/dict/DiyFormTemplate.php": "f84f5b8e615db663ec7088f4d5e53d35", - "core/dict/DiyFormType.php": "53bf0ad458444ca00f07eb4c66b8f46e", - "core/dict/Event.php": "704aba6756b2672ea38fca950c4b8689", - "core/dict/GrowthRule.php": "6ca08e697ed30d9abe43cc7e73cc5cfb", - "core/dict/Lang.php": "87534f02f8886003efa6a04c9b624116", - "core/dict/MemberAccountChangeType.php": "b33fa1eeab4411bed0e2ae86fb145198", - "core/dict/MemberBenefits.php": "1ab07d6340164cc4138f9a81ab54e4ba", - "core/dict/MemberGift.php": "c246f1eae3abe1d905f819a31bbfe8c0", - "core/dict/Menu.php": "5d5475315a9a834691f69391e3ce18c4", - "core/dict/Notice.php": "880e68a6b6e34819ce6dab58fb07abfb", - "core/dict/PointRule.php": "1032f68030dd81df308fdbfe7725f26c", - "core/dict/Poster.php": "4283a0fa8484e39047af21f2ffcceed6", - "core/dict/Printer.php": "c667885b957af7c33ee00601f1d760a5", - "core/dict/RechargeGift.php": "75ba72df0f345b9794fd4418fb23a71c", - "core/dict/Route.php": "8071826060ee97f278465032443948c1", - "core/dict/Schedule.php": "7466ce03daeb81e8eca6966230f87674", - "core/dict/SowCommunityGift.php": "f4ae38596a5b4dd5a3755c2899cbf98d", - "core/dict/UniappComponent.php": "7f26db3c9c3f33b27a19963f37a57e68", - "core/dict/UniappLink.php": "c430f35d1927c8776c3510df8c9634a9", - "core/dict/UniappPages.php": "9121c4f0e7a94e8c4d2a10c2cf3a8d0a", - "core/dict/UniappTemplate.php": "f133256790e68ec5c2f27cb15a3e399b", - "core/exception/AddonException.php": "44e69a9406a0f92256b740e640483fa2", - "core/exception/AdminException.php": "7f6f2d5bddbd9997d7ae4b92dba6541a", - "core/exception/ApiException.php": "6134d939245d759694e3cbc3eb6c6969", - "core/exception/AuthException.php": "067d06de602ed31eca50ff53df072e55", - "core/exception/CaptchaException.php": "433d0c3f4c5af3a602866184d19ec3db", - "core/exception/CloudBuildException.php": "63f957dfb7c3993e3cf2f295e967ad2a", - "core/exception/CommonException.php": "b3f01ddaed16512f63df0cb1093deb2a", - "core/exception/HomeException.php": "46f67925ea9dd89b15bf0c9817c530a0", - "core/exception/NiucloudException.php": "11cd06402681efa3740e05ab3a31b7e1", - "core/exception/NoticeException.php": "329f6b2f20ca9a6b5c9eb93d25d3ea65", - "core/exception/PayException.php": "c6dff1b8f0b4cbc39faf1ac9c079f9d8", - "core/exception/ServerException.php": "db28259653d74c46cc99b638c0fa4b8f", - "core/exception/UploadFileException.php": "93bd4c9b920dafcfdc119e37e955a48b", - "core/exception/WechatException.php": "720a0d32bb7cdce8c49d9bc5975c88c2", - "core/job/Dispatch.php": "399a50a98f573a1636082c36db7fade6", - "core/loader/Loader.php": "bcf3e092d87e8e9ab246b2d464a5668b", - "core/loader/Storage.php": "05b65137f5b37131b6b5de2ec8af58a1", - "core/oauth/BaseOauth.php": "0b91307b33f8b003094d553d51cee8b4", - "core/oauth/OauthLoader.php": "c0b0960364dc25067444a2faa56250a0", - "core/oauth/Weapp.php": "9d91dac2138167747936a31686c741ef", - "core/oauth/Wechat.php": "16ce5c4be98951ea4b07bef1a4567fe1", - "core/pay/Alipay.php": "7153393fefd86ff0ce71c4de062a56b7", - "core/pay/BasePay.php": "9743469f065b390256a05441470583d1", - "core/pay/PayLoader.php": "e046e2fc21de19768ab7f6f72fbb196b", - "core/pay/Wechatpay.php": "1b37980936acb99cfcc5124a2a2f6fab", - "core/poster/BasePoster.php": "1ce85e1cd4219355de32cba7e5cb94fa", - "core/poster/Poster.php": "282019e6f60598b074fbdf885246310d", - "core/poster/PosterLoader.php": "c7ab68a9fc95cd0533caf98aa75cd60b", - "core/printer/BasePrinter.php": "3d010271542baffb0d61233c2ccf92eb", - "core/printer/KdniaoPrinter.php": "fe303cb8152a5945b67ffb94c854f322", - "core/printer/PrinterLoader.php": "33e73421c9b4bf290bd30a17034ebdaf", - "core/printer/sdk/yilianyun/Autoloader.php": "2b760af1f508bbe4f11090dbd26d0bd1", - "core/printer/sdk/yilianyun/api/ExpressPrintService.php": "b077a155bcea6d2ed378b1c3dd614940", - "core/printer/sdk/yilianyun/api/OauthService.php": "26f238b23f00864a369aaa07f3b12e27", - "core/printer/sdk/yilianyun/api/PicturePrintService.php": "a2e99c4c4d5509ac9f4467fed0c969ac", - "core/printer/sdk/yilianyun/api/PrintMenuService.php": "444d05e6062c709fe6e69f0965d8362a", - "core/printer/sdk/yilianyun/api/PrintService.php": "6d5b3777db3ca5cb205c4e7cec89c1ce", - "core/printer/sdk/yilianyun/api/PrinterService.php": "b09152c09046fabd0ab5a213504073aa", - "core/printer/sdk/yilianyun/api/RpcService.php": "f399c4f7f5d1e2da074e0939c20304b8", - "core/printer/sdk/yilianyun/config/YlyConfig.php": "6f30d6fdc105138c8c11e2d459870955", - "core/printer/sdk/yilianyun/demo/authorization_code_mode/callback.php": "e5ea3d8c2a955bf16b12e40d698fd34a", - "core/printer/sdk/yilianyun/demo/client_mode/callback.php": "13d1705d68970f2b0f57a11a99ec2d2f", - "core/printer/sdk/yilianyun/demo/index.php": "110f068775707249040cb37003eb444a", - "core/printer/sdk/yilianyun/demo/init.php": "0b81a9a08aee8d74e3a319a77fd9787b", - "core/printer/sdk/yilianyun/oauth/YlyOauthClient.php": "219d3afb0ce22c1899f97159b35031db", - "core/printer/sdk/yilianyun/protocol/YlyRpcClient.php": "b91c13821567333dd68b0131c9e96fca", - "core/sms/Aliyun.php": "cb27c39c78d9fc1961ae5a38c2c66e96", - "core/sms/BaseSms.php": "5f9de99698208680aedbec7e068ffbb0", - "core/sms/Niuyun.php": "b80fdc26eb6547e66fd0fae60031f342", - "core/sms/SmsLoader.php": "1d542d7fbe3c7394c58eb68aa4d2973c", - "core/sms/Tencent.php": "aa667ceff12d4989f07467f8cbf59197", - "core/template/BaseTemplate.php": "98fa850aba75712f8733d7588ed09098", - "core/template/TemplateLoader.php": "b65c59cecf7b858d954bbc87f9e1da02", - "core/template/Weapp.php": "99cd08405d7cdd8ad75902d6a154be96", - "core/template/Wechat.php": "4372d0723924bb7a1b7b4a3ee94924d6", - "core/upload/Aliyun.php": "e604de7a13d87fa0e46b870025dce3aa", - "core/upload/BaseUpload.php": "210cc4fa0ee4547cd22dc284a2e048e7", - "core/upload/Local.php": "14c56c7d48c60cfcdc1e8be1d023d2f7", - "core/upload/Qiniu.php": "6618bb0bd0bfbf7199748f40a32c7011", - "core/upload/Tencent.php": "863cefab68a7d4f7a4dd98e85b4670c7", - "core/upload/UploadLoader.php": "83abcef548b98b55c5567ba459316c21", - "core/util/Barcode.php": "afaf0debaf75535f0ae93bd2782841cb", - "core/util/DbBackup.php": "523883cb3643c1574a60f2feb8f1e06d", - "core/util/QRcode.php": "e83ebe3a6f3653b60d774d0056461a1b", - "core/util/Queue.php": "c218232fa2b0e9eb59ab77e681029185", - "core/util/Snowflake.php": "f8409ff3c406a83920e029bb182d87bb", - "core/util/Terminal.php": "50f4473cfb217512080e29944f35c380", - "core/util/TokenAuth.php": "6edb8d37e6b64ea115b11a11bbc09a45", - "core/util/barcode/class/BCGArgumentException.php": "cc7ff7592219242bb65dc3ef992b08cc", - "core/util/barcode/class/BCGBarcode.php": "25b427664d0ab3b80b9d8efd23ca797e", - "core/util/barcode/class/BCGBarcode1D.php": "9e3242c5af87898ce9f51ebe166134be", - "core/util/barcode/class/BCGColor.php": "761129d9a986f982d0b3ff127084b940", - "core/util/barcode/class/BCGDrawException.php": "c43d68f09a51c4c8513e0e83c3c81fdc", - "core/util/barcode/class/BCGDrawing.php": "7c2f60f79efb953d280f8959846ff999", - "core/util/barcode/class/BCGFont.php": "2adeab18cd687c4515487547f6b572f0", - "core/util/barcode/class/BCGFontFile.php": "0b2381cd79aa873a3a1ef8f77727f0d0", - "core/util/barcode/class/BCGFontPhp.php": "80a39988b249d21c44cf617011f0677f", - "core/util/barcode/class/BCGLabel.php": "1f91f98534a7c96dc910212057dc2ff8", - "core/util/barcode/class/BCGParseException.php": "d181e59ebe7546f56951422cbf57d423", - "core/util/barcode/class/BCGcodabar.barcode.php": "bbc743842afe9819bb5f7480ee04c7e6", - "core/util/barcode/class/BCGcode11.barcode.php": "08f02b6b0650c57f125bf79476ca8eb4", - "core/util/barcode/class/BCGcode128.barcode.php": "6578816ba1c6882ea186930ac80280d2", - "core/util/barcode/class/BCGcode39.barcode.php": "5476c0406481de2b66f0afe52c593832", - "core/util/barcode/class/BCGcode39extended.barcode.php": "7eb3a8ae21fc901ac60f721bd60b267f", - "core/util/barcode/class/BCGcode93.barcode.php": "7e37534aae91f90f9aa63fcda6bcfa39", - "core/util/barcode/class/BCGean13.barcode.php": "3126e0c66b6b7f665a31b466016ae375", - "core/util/barcode/class/BCGean8.barcode.php": "cb883879fc033fe0e920ee85d569da3c", - "core/util/barcode/class/BCGgs1128.barcode.php": "4c6be97c219aa80925b87f32a83c1133", - "core/util/barcode/class/BCGi25.barcode.php": "c7320cb28b41167a1690d10b064ddd0f", - "core/util/barcode/class/BCGintelligentmail.barcode.php": "6489ba288cf1544667b5c60eaef68cc4", - "core/util/barcode/class/BCGisbn.barcode.php": "d9eaacb96f12c0f4b90da999e67ed273", - "core/util/barcode/class/BCGmsi.barcode.php": "2a3259710fb6e74c8c02e00ff8da14d7", - "core/util/barcode/class/BCGothercode.barcode.php": "348d7e686a8a5db01b5b1eb266e4d4ef", - "core/util/barcode/class/BCGpostnet.barcode.php": "39f7efc48a270bb39b2042926787299e", - "core/util/barcode/class/BCGs25.barcode.php": "0e65e092ce185ac243e4945aabf1c912", - "core/util/barcode/class/BCGupca.barcode.php": "106d4d979d8de88e7b8e148e588ac620", - "core/util/barcode/class/BCGupce.barcode.php": "6107ec721948928bc317b96251af7fcb", - "core/util/barcode/class/BCGupcext2.barcode.php": "ac1bbc8a6a0ab5ba6e1082146412b98b", - "core/util/barcode/class/BCGupcext5.barcode.php": "8e836157e68f176fea81e9a17d594d60", - "core/util/barcode/class/JoinDraw.php": "708761c29c5345c71c849ad0040bf9cc", - "core/util/barcode/class/drawer/BCGDraw.php": "313d557b9b6cbb60bab10bddac7320bc", - "core/util/barcode/class/drawer/BCGDrawJPG.php": "8f7e670218f7c9275970592fc9a3c56c", - "core/util/barcode/class/drawer/BCGDrawPNG.php": "7a75e98c776668dc3e7e13fb53bb2cc4", - "core/util/niucloud/BaseNiucloudClient.php": "d9c7bf0608324443a267ee338e375b50", - "core/util/niucloud/CloudService.php": "dbfcd100ff7ac43371413858d2036fee", - "core/util/niucloud/http/AccessToken.php": "5c774da4a0da6c55058b089d8897c05d", - "core/util/niucloud/http/HasHttpRequests.php": "f834c14be4ee5f1294540906c4a92fed", - "core/util/niucloud/http/Response.php": "0ac9da93fed4c5df826a9ce15f92b414", - "core/util/niucloud/http/Token.php": "294af52351e2bad4451f6cc8a38546a4", - "core/util/niucloud/support/XML.php": "6d0c41212ba16b7f1cd65853d79b540c", - "public/index.php": "a4a3e1059b534051eba3b3bed3d78181", - "public/install.php": "ab5d0acf45c3b36a16df117762b98f03", - "public/router.php": "2c2683429f3307ca7350ebca4d06dbca", - "route/app.php": "b695f5468be46844dbead9cb81e97f40", - "vendor/365taofang/huaweicloud-sdk-php-obs/Obs/Internal/Common/CheckoutStream.php": "6a5b0e4d8e8ae9d449b053897a1658d3", - "vendor/365taofang/huaweicloud-sdk-php-obs/Obs/Internal/Common/ITransform.php": "f8aaebffab4b6d262b16e48d0ad047a9", - "vendor/365taofang/huaweicloud-sdk-php-obs/Obs/Internal/Common/Model.php": "4b38497ba36a670ebbcae30b97e1154b", - "vendor/365taofang/huaweicloud-sdk-php-obs/Obs/Internal/Common/ObsTransform.php": "795dbc5368e55161dc5a4ae2e5ad1f3a", - "vendor/365taofang/huaweicloud-sdk-php-obs/Obs/Internal/Common/SchemaFormatter.php": "1025e75c7a8d3e3d399f00e6bfe04bd7", - "vendor/365taofang/huaweicloud-sdk-php-obs/Obs/Internal/Common/SdkCurlFactory.php": "d91c9cbd87b3f058937bb36f998b4898", - "vendor/365taofang/huaweicloud-sdk-php-obs/Obs/Internal/Common/SdkStreamHandler.php": "44012feaad60bcb1d7b09d970911b6ee", - "vendor/365taofang/huaweicloud-sdk-php-obs/Obs/Internal/Common/ToArrayInterface.php": "5a41613685ef2bd205fdb3aeb58463c4", - "vendor/365taofang/huaweicloud-sdk-php-obs/Obs/Internal/Common/V2Transform.php": "35f806e82c7520ebaf67d3af90933ca4", - "vendor/365taofang/huaweicloud-sdk-php-obs/Obs/Internal/GetResponseTrait.php": "b657754e184ebf1f2af79b5fc1b03991", - "vendor/365taofang/huaweicloud-sdk-php-obs/Obs/Internal/Resource/Constants.php": "eba5ea474c74cb0410791b15a6005cc8", - "vendor/365taofang/huaweicloud-sdk-php-obs/Obs/Internal/Resource/OBSConstants.php": "f67394fdee1f5c6748123b1a87a9e898", - "vendor/365taofang/huaweicloud-sdk-php-obs/Obs/Internal/Resource/OBSRequestResource.php": "daffcc9b4471c57a18d1f66c79b6a4cd", - "vendor/365taofang/huaweicloud-sdk-php-obs/Obs/Internal/Resource/V2Constants.php": "e1bb65439510514b12f3979918afda5e", - "vendor/365taofang/huaweicloud-sdk-php-obs/Obs/Internal/Resource/V2RequestResource.php": "8c6919469dd41c760cf35dce7477f6ee", - "vendor/365taofang/huaweicloud-sdk-php-obs/Obs/Internal/SendRequestTrait.php": "30e587fc19e75ea2e43202ed2eb69b64", - "vendor/365taofang/huaweicloud-sdk-php-obs/Obs/Internal/Signature/AbstractSignature.php": "3ad38191723286e1086056544dc357f4", - "vendor/365taofang/huaweicloud-sdk-php-obs/Obs/Internal/Signature/DefaultSignature.php": "ca1fc3e4a348bdb6f9f71e46b1cce364", - "vendor/365taofang/huaweicloud-sdk-php-obs/Obs/Internal/Signature/SignatureInterface.php": "016c05f3eeea1f6c9e7d8084b035ecb8", - "vendor/365taofang/huaweicloud-sdk-php-obs/Obs/Internal/Signature/V4Signature.php": "52f10bdccb69064b294280130de92959", - "vendor/365taofang/huaweicloud-sdk-php-obs/Obs/Log/ObsConfig.php": "cf81cedeef02fdab577339c6be1b3aca", - "vendor/365taofang/huaweicloud-sdk-php-obs/Obs/Log/ObsLog.php": "8066b917cc65be35f2ea6cef1c9c7aa7", - "vendor/365taofang/huaweicloud-sdk-php-obs/Obs/ObsClient.php": "f685e69d40d8b70b63eeac984edb2b8c", - "vendor/365taofang/huaweicloud-sdk-php-obs/Obs/ObsException.php": "c7edc5a6f469d4c8fde8fd544adae37d", - "vendor/365taofang/huaweicloud-sdk-php-obs/Obs/ObsImageClient.php": "22779cb3e2df32666200075a34e878c1", - "vendor/365taofang/huaweicloud-sdk-php-obs/examples/BucketOperationsSample.php": "89349a1eb182147753e3292220f44437", - "vendor/365taofang/huaweicloud-sdk-php-obs/examples/ConcurrentCopyPartSample.php": "109ca29ade14533f22ecbbe4bec8b55e", - "vendor/365taofang/huaweicloud-sdk-php-obs/examples/ConcurrentDownloadObjectSample.php": "2ba6b1b61e98bbbe7dc68c6febc8d6d4", - "vendor/365taofang/huaweicloud-sdk-php-obs/examples/ConcurrentUploadPartSample.php": "7063f2bde7a041186583f6b62faa85bd", - "vendor/365taofang/huaweicloud-sdk-php-obs/examples/CreateFolderSample.php": "21bab6841addcb28c7a141b7420434be", - "vendor/365taofang/huaweicloud-sdk-php-obs/examples/DeleteObjectsSample.php": "a3e4caa709895eac929cbdc1bb4b7b83", - "vendor/365taofang/huaweicloud-sdk-php-obs/examples/DownloadSample.php": "ab0968f7031c114790c50e748473445c", - "vendor/365taofang/huaweicloud-sdk-php-obs/examples/ListObjectsInFolderSample.php": "592df217d0c168036d13e666c6f7e322", - "vendor/365taofang/huaweicloud-sdk-php-obs/examples/ListObjectsSample.php": "8df29efe7fddf9cdc07d30021ec054b5", - "vendor/365taofang/huaweicloud-sdk-php-obs/examples/ListVersionsSample.php": "6b4bdaeed3b474250ad3bc39975a4096", - "vendor/365taofang/huaweicloud-sdk-php-obs/examples/ObjectMetaSample.php": "ef0aa6c92587d1347f1d8d5cd45916a3", - "vendor/365taofang/huaweicloud-sdk-php-obs/examples/ObjectOperationsSample.php": "ef53e0caa6bda3c6870ae2f59b771057", - "vendor/365taofang/huaweicloud-sdk-php-obs/examples/ObsPhpDemo.php": "f98912b1008a5868c82d6028b613f791", - "vendor/365taofang/huaweicloud-sdk-php-obs/examples/PostObjectSample.php": "be6852e0b27e5d38f734d7b34f0b4239", - "vendor/365taofang/huaweicloud-sdk-php-obs/examples/RestoreObjectSample.php": "c81c4adce0fe286146467892ffa58c17", - "vendor/365taofang/huaweicloud-sdk-php-obs/examples/SimpleMultipartUploadSample.php": "b2545522c1b28ace588af388dbe7753c", - "vendor/365taofang/huaweicloud-sdk-php-obs/examples/TemporarySignatureSample.php": "66ea4bfd07514bfcf4a44dc7fa0841de", - "vendor/365taofang/huaweicloud-sdk-php-obs/obs-autoloader.php": "0b3a31f9994700976d4cbb22942cb5b8", - "vendor/adbario/php-dot-notation/src/Dot.php": "8600d15899d64825447fed7462d812aa", - "vendor/adbario/php-dot-notation/src/helpers.php": "ca35da83aab34569e90f996750eff57a", - "vendor/alibabacloud/client/autoload.php": "58e74a8654301a813089be61fa8281c0", - "vendor/alibabacloud/client/src/Accept.php": "2a5d1aa3cd48411ba06b3f7fb993aa7d", - "vendor/alibabacloud/client/src/AlibabaCloud.php": "316474cbcbcb77a0e57c3f220bfe967a", - "vendor/alibabacloud/client/src/Clients/AccessKeyClient.php": "a8ecb7f02686cc659c54e004a97834a2", - "vendor/alibabacloud/client/src/Clients/BearerTokenClient.php": "01aa755b1c000b0b6745016443bf481c", - "vendor/alibabacloud/client/src/Clients/Client.php": "8ad5cb95e10af89f43633e09f46d5c90", - "vendor/alibabacloud/client/src/Clients/EcsRamRoleClient.php": "c6362346a4c4e36e03b6b137a8b06238", - "vendor/alibabacloud/client/src/Clients/ManageTrait.php": "f4508debc26d943ae6d2dfe6e7ffb909", - "vendor/alibabacloud/client/src/Clients/RamRoleArnClient.php": "b1f1d1cfa0c3520c67e08aeca3fbff16", - "vendor/alibabacloud/client/src/Clients/RsaKeyPairClient.php": "1f4a12d64ef45a9c9e69c3664f940a00", - "vendor/alibabacloud/client/src/Clients/StsClient.php": "b9503d597aacf6d669a458addd3d0d64", - "vendor/alibabacloud/client/src/Config/Config.php": "51542de7af722a1bb8557d686e077b0b", - "vendor/alibabacloud/client/src/Config/Data.php": "0e05064519ea9038479696a96469b3bf", - "vendor/alibabacloud/client/src/Credentials/AccessKeyCredential.php": "205b60784f983897818cc8a83fc9e661", - "vendor/alibabacloud/client/src/Credentials/BearerTokenCredential.php": "218235b0361bede66d2e204c5b90e52c", - "vendor/alibabacloud/client/src/Credentials/CredentialsInterface.php": "df715fe8b7eab44686ab413a55133e08", - "vendor/alibabacloud/client/src/Credentials/EcsRamRoleCredential.php": "01fd5963c506cb28a8b693a4e0d6cf54", - "vendor/alibabacloud/client/src/Credentials/Ini/CreateTrait.php": "3e77b432047299aa95002ecfcf2af91c", - "vendor/alibabacloud/client/src/Credentials/Ini/IniCredential.php": "a2efd07b422c0a7c8614964786be38ac", - "vendor/alibabacloud/client/src/Credentials/Ini/OptionsTrait.php": "79afca8b853ea4994b812955b1ef431d", - "vendor/alibabacloud/client/src/Credentials/Providers/CredentialsProvider.php": "4ab48634dd77665f7f3a567c585b3319", - "vendor/alibabacloud/client/src/Credentials/Providers/EcsRamRoleProvider.php": "8d9825c090965106d33b00b2b4ec94cb", - "vendor/alibabacloud/client/src/Credentials/Providers/Provider.php": "b3c03a96c9c08db6380259f20f4e5fad", - "vendor/alibabacloud/client/src/Credentials/Providers/RamRoleArnProvider.php": "26d774e0d4c8b7bf5543ef58290e8be7", - "vendor/alibabacloud/client/src/Credentials/Providers/RsaKeyPairProvider.php": "3865bfae1ca3b78bae98b4c4a896d166", - "vendor/alibabacloud/client/src/Credentials/RamRoleArnCredential.php": "5be9c99bf9a8d11167410323605b9e50", - "vendor/alibabacloud/client/src/Credentials/Requests/AssumeRole.php": "45a247c4d6b7d7e8ba3434455efe155f", - "vendor/alibabacloud/client/src/Credentials/Requests/GenerateSessionAccessKey.php": "de98be285dab50f8cbc4d52e936ae7df", - "vendor/alibabacloud/client/src/Credentials/RsaKeyPairCredential.php": "b8add7a1b8d00dbf9a42c7755ec2e506", - "vendor/alibabacloud/client/src/Credentials/StsCredential.php": "6f5fe579c95f1a12aee8caf94906294d", - "vendor/alibabacloud/client/src/DefaultAcsClient.php": "e600cc06133cc0a99947b6c1ef2336ab", - "vendor/alibabacloud/client/src/Encode.php": "6e3be49b920882265a4b5991e83b155f", - "vendor/alibabacloud/client/src/Exception/AlibabaCloudException.php": "10fb2c5af6fbe64f7f00e0d7423aab8e", - "vendor/alibabacloud/client/src/Exception/ClientException.php": "09051e4a57f0dd4ed2c7b4d044501fa5", - "vendor/alibabacloud/client/src/Exception/ServerException.php": "5960330ffb10d442b4950ffaf1a88a64", - "vendor/alibabacloud/client/src/Filter/ApiFilter.php": "750327fb9b8fbfe40fb97c48826c3944", - "vendor/alibabacloud/client/src/Filter/ClientFilter.php": "a62b8a75de6ad5d5d1329cb5cb7445b7", - "vendor/alibabacloud/client/src/Filter/CredentialFilter.php": "18e6f9a70cb40930c0b99a48e1b8a06f", - "vendor/alibabacloud/client/src/Filter/Filter.php": "e3fd83c9a19a05b7c51f683a8c9eab6e", - "vendor/alibabacloud/client/src/Filter/HttpFilter.php": "d82cb1240343f7249fa11781a9566ed4", - "vendor/alibabacloud/client/src/Functions.php": "17120630cac9f3c5cf146c64d0fc710e", - "vendor/alibabacloud/client/src/Log/LogFormatter.php": "9682a0cc358fcb2866ff49cec5a04157", - "vendor/alibabacloud/client/src/Profile/DefaultProfile.php": "bd064523444e54e4add8dcc3d9afebe3", - "vendor/alibabacloud/client/src/Regions/EndpointProvider.php": "37fb2d843b684f05ad1b412b9ad44d10", - "vendor/alibabacloud/client/src/Regions/LocationService.php": "972759e354a44ef5d7dc4918b07e80e8", - "vendor/alibabacloud/client/src/Regions/LocationServiceRequest.php": "d21e92e415b06f991633bb831435a27e", - "vendor/alibabacloud/client/src/Release.php": "750cda6b1075c3905c988e3df971ceca", - "vendor/alibabacloud/client/src/Request/Request.php": "189aa0da029666e7934d3654519d257c", - "vendor/alibabacloud/client/src/Request/RoaRequest.php": "abc48e6801c6417f09dba5ece5a4fb13", - "vendor/alibabacloud/client/src/Request/RpcRequest.php": "dd020f15b156d9381592a9df606d0a92", - "vendor/alibabacloud/client/src/Request/Traits/AcsTrait.php": "6202d5be2468db02b8a6089095733e8a", - "vendor/alibabacloud/client/src/Request/Traits/ClientTrait.php": "aec13636c7c8ec0ab39fe72e8fc5c4da", - "vendor/alibabacloud/client/src/Request/Traits/DeprecatedRoaTrait.php": "1fc3e89f1d6643c4f3d984409e128f6c", - "vendor/alibabacloud/client/src/Request/Traits/DeprecatedTrait.php": "f739e600bbb126c24721aa1351d50cf8", - "vendor/alibabacloud/client/src/Request/Traits/RetryTrait.php": "8cdacd7d94011ba63b1a00bd41929aec", - "vendor/alibabacloud/client/src/Request/UserAgent.php": "e30d6b834cab1ceb10c386b3ee37c8f0", - "vendor/alibabacloud/client/src/Resolver/ActionResolverTrait.php": "992295b27a14c805fa1372905c21cc4d", - "vendor/alibabacloud/client/src/Resolver/ApiResolver.php": "5598756734b49b9079feb534083a67e4", - "vendor/alibabacloud/client/src/Resolver/CallTrait.php": "44272294efab62e1c614e6a192b631fd", - "vendor/alibabacloud/client/src/Resolver/Roa.php": "d80d472f712f75d88cb2ca50e4120726", - "vendor/alibabacloud/client/src/Resolver/Rpc.php": "03e6903d5d01270e6483d9e4a830ad70", - "vendor/alibabacloud/client/src/Resolver/VersionResolver.php": "b29be0c4768a1893d8eaa22106ef60c5", - "vendor/alibabacloud/client/src/Result/Result.php": "c6d22fb65d3316d27b805a85935d71e4", - "vendor/alibabacloud/client/src/SDK.php": "121e4be33dbaf08b1ee5bc45dad508a6", - "vendor/alibabacloud/client/src/Signature/BearerTokenSignature.php": "21a54c8331273fe145a103d40fbd5daf", - "vendor/alibabacloud/client/src/Signature/ShaHmac1Signature.php": "5f1e010e2b24d4687375e631d11faab6", - "vendor/alibabacloud/client/src/Signature/ShaHmac256Signature.php": "1ed99ae561f76ffc861cf28d0e2ff004", - "vendor/alibabacloud/client/src/Signature/ShaHmac256WithRsaSignature.php": "9dc88d3917665d2572c61fc109873a64", - "vendor/alibabacloud/client/src/Signature/Signature.php": "fd27beeabb82c81a3f1cdd111c787ea5", - "vendor/alibabacloud/client/src/Signature/SignatureInterface.php": "2e02e39ae38fdb4c67cf2dfaefe9eaa4", - "vendor/alibabacloud/client/src/Support/Arrays.php": "3f453ef2623d77ffc46a4b7a2ea3bc15", - "vendor/alibabacloud/client/src/Support/Path.php": "44323788804d46ff14f606813b41bf53", - "vendor/alibabacloud/client/src/Support/Sign.php": "86cde454199aeacbe031068717be24ad", - "vendor/alibabacloud/client/src/Support/Stringy.php": "a4a9f3c7b94466ec06e0feb753f50318", - "vendor/alibabacloud/client/src/Traits/ArrayAccessTrait.php": "a0bce1f27fe018b32ae5738fde8ff9ab", - "vendor/alibabacloud/client/src/Traits/ClientTrait.php": "bfdf0bf47c38fe7bd387363c137e228f", - "vendor/alibabacloud/client/src/Traits/DefaultRegionTrait.php": "0df9c1c7db9f2a5da0a317a64856c91c", - "vendor/alibabacloud/client/src/Traits/EndpointTrait.php": "e2f0b0eec00f8d49ba503d86f1dcbf9b", - "vendor/alibabacloud/client/src/Traits/HasDataTrait.php": "5717b9afb4c1a206dbb98872004b5273", - "vendor/alibabacloud/client/src/Traits/HistoryTrait.php": "5eebb92f5e763d3aa39636b3b866dfc7", - "vendor/alibabacloud/client/src/Traits/HttpTrait.php": "265dbcc9a96c874ea681a633de6040ee", - "vendor/alibabacloud/client/src/Traits/LogTrait.php": "1ea8c5af7d4579518903c3857b3e646f", - "vendor/alibabacloud/client/src/Traits/MockTrait.php": "f66f28838a4d65064d6be097a3cc0daf", - "vendor/alibabacloud/client/src/Traits/ObjectAccessTrait.php": "800ff2896e9f19ba14b02baa362e2ba8", - "vendor/alibabacloud/client/src/Traits/RegionTrait.php": "e99a8dfc5d1eb459f1294bb61b8a3b8e", - "vendor/alibabacloud/client/src/Traits/RequestTrait.php": "6eae4accdb2bb04435e1edb7cb0f4e7e", - "vendor/aliyuncs/oss-sdk-php/autoload.php": "c2314609fe81e1cc09b4755fe033e8f8", - "vendor/aliyuncs/oss-sdk-php/index.php": "1d2fc1266241fbe290a4e6b6807d4f03", - "vendor/aliyuncs/oss-sdk-php/samples/Bucket.php": "9f67a55d41ace68c7b8c54eb3a99a17f", - "vendor/aliyuncs/oss-sdk-php/samples/BucketCname.php": "83c2cb3b638f0df45c6f48cceb4e9196", - "vendor/aliyuncs/oss-sdk-php/samples/BucketCors.php": "4861cda0cc7a00c16861f9179beeaaee", - "vendor/aliyuncs/oss-sdk-php/samples/BucketEncryption.php": "ec89a1cef048fe088c56c4cfd837daa4", - "vendor/aliyuncs/oss-sdk-php/samples/BucketLifecycle.php": "aafc5068a21c3051fb7abf6a0801a6c2", - "vendor/aliyuncs/oss-sdk-php/samples/BucketLogging.php": "f896ac5ae830ff206d4a4f6f0bb9eb41", - "vendor/aliyuncs/oss-sdk-php/samples/BucketPayment.php": "6d049fb3e4f17eb8c8e1d2e5d0cc2c41", - "vendor/aliyuncs/oss-sdk-php/samples/BucketPolicy.php": "8cff5c60b620fbf79901e1909185808e", - "vendor/aliyuncs/oss-sdk-php/samples/BucketReferer.php": "796cd54772217774805da713e51b32cf", - "vendor/aliyuncs/oss-sdk-php/samples/BucketStat.php": "52cb3dc73f03833361966488b21cf5c4", - "vendor/aliyuncs/oss-sdk-php/samples/BucketTags.php": "d9d6fd4aadca21f7a7f7e418385bec14", - "vendor/aliyuncs/oss-sdk-php/samples/BucketTransferAcceleration.php": "b3f847b6ba6eeb7d47e308fc98e1fa51", - "vendor/aliyuncs/oss-sdk-php/samples/BucketVersion.php": "d90e815902822aa786019fe4fd4c331a", - "vendor/aliyuncs/oss-sdk-php/samples/BucketWebsite.php": "662986d97bb069bbade5efdc988f22ea", - "vendor/aliyuncs/oss-sdk-php/samples/BucketWorm.php": "026ae1334db910e262597e74884b7b6f", - "vendor/aliyuncs/oss-sdk-php/samples/Callback.php": "8d13cc042e2a4627f6eefc2c6f7bf32a", - "vendor/aliyuncs/oss-sdk-php/samples/Common.php": "cb1dd7b57f1a144e580a825d0e8ea4cf", - "vendor/aliyuncs/oss-sdk-php/samples/Config.php": "528c550899b323898b0cb3cba65dd20f", - "vendor/aliyuncs/oss-sdk-php/samples/CredentialsPhp.php": "58d8986d509aef2bdbd93e42c73bbdf1", - "vendor/aliyuncs/oss-sdk-php/samples/CredentialsProvider.php": "f5f680ad60a9ee5f8838d07fcf7fcae4", - "vendor/aliyuncs/oss-sdk-php/samples/Image.php": "98b10e15770ee76f75aec8c367bdf8ac", - "vendor/aliyuncs/oss-sdk-php/samples/LiveChannel.php": "70aa078b7d26ed740081f7948852606e", - "vendor/aliyuncs/oss-sdk-php/samples/MultipartUpload.php": "44eeab6c76b974c35aad938d9623bc7e", - "vendor/aliyuncs/oss-sdk-php/samples/Object.php": "bf735225b86d5f6a5ce0fe09428216ec", - "vendor/aliyuncs/oss-sdk-php/samples/ObjectTagging.php": "c4aa577ca251586e7a5a37782a61185d", - "vendor/aliyuncs/oss-sdk-php/samples/RunAll.php": "3843983a666ec15c7b97dfb12e1034ec", - "vendor/aliyuncs/oss-sdk-php/samples/Signature.php": "f521dcf851ad72f832b7b1652b491656", - "vendor/aliyuncs/oss-sdk-php/src/OSS/Core/MimeTypes.php": "60c3030d3f0820880b48fed4e5524f86", - "vendor/aliyuncs/oss-sdk-php/src/OSS/Core/OssException.php": "eea54a10a1e881f6697d93a3f1447e2c", - "vendor/aliyuncs/oss-sdk-php/src/OSS/Core/OssUtil.php": "604a5b7b48eaa106fb8f76ca357978e3", - "vendor/aliyuncs/oss-sdk-php/src/OSS/Credentials/Credentials.php": "f92a0eb42df27f2b78788db31678764a", - "vendor/aliyuncs/oss-sdk-php/src/OSS/Credentials/CredentialsProvider.php": "3708cd2d73a19d24bacceee012dcf7a5", - "vendor/aliyuncs/oss-sdk-php/src/OSS/Credentials/StaticCredentialsProvider.php": "da112d0d7c85582d13258c2d4cd0a61e", - "vendor/aliyuncs/oss-sdk-php/src/OSS/Http/RequestCore.php": "b410a0ae2036cecc01e38f6364fd185d", - "vendor/aliyuncs/oss-sdk-php/src/OSS/Http/RequestCore_Exception.php": "e1c531714cb51444cc5c949a6ae97926", - "vendor/aliyuncs/oss-sdk-php/src/OSS/Http/ResponseCore.php": "12093bac7ba421c648f5cb874583bf2d", - "vendor/aliyuncs/oss-sdk-php/src/OSS/Model/BucketInfo.php": "6e2d5c0f0e3a1933d7672303c2ba4edc", - "vendor/aliyuncs/oss-sdk-php/src/OSS/Model/BucketListInfo.php": "00739d3da89e3f02a9ad2bff37a02059", - "vendor/aliyuncs/oss-sdk-php/src/OSS/Model/BucketStat.php": "0aaf951b5782dfd487b28be056290db9", - "vendor/aliyuncs/oss-sdk-php/src/OSS/Model/CnameConfig.php": "a69ee641a20c08d1bc499e2cccb96935", - "vendor/aliyuncs/oss-sdk-php/src/OSS/Model/CnameTokenInfo.php": "6f5ad7468b9be8fb59b03900242cd07f", - "vendor/aliyuncs/oss-sdk-php/src/OSS/Model/CorsConfig.php": "9528c43e4fc14c5d32989fb59433bb07", - "vendor/aliyuncs/oss-sdk-php/src/OSS/Model/CorsRule.php": "cc25b7e1fd378930daea2a0207af92eb", - "vendor/aliyuncs/oss-sdk-php/src/OSS/Model/DeleteMarkerInfo.php": "55ac434bcfa75f0b2e42e87e901ed88e", - "vendor/aliyuncs/oss-sdk-php/src/OSS/Model/DeleteObjectInfo.php": "6cbcb414b14573633d46b6571e0b4137", - "vendor/aliyuncs/oss-sdk-php/src/OSS/Model/DeletedObjectInfo.php": "0bebfe8a0b24b8c6cb825614b951614a", - "vendor/aliyuncs/oss-sdk-php/src/OSS/Model/ExtendWormConfig.php": "44b43e077023eb773d224b6a79bb7295", - "vendor/aliyuncs/oss-sdk-php/src/OSS/Model/GetLiveChannelHistory.php": "8ef245440fa6b3662abef1ea667f1d00", - "vendor/aliyuncs/oss-sdk-php/src/OSS/Model/GetLiveChannelInfo.php": "853f9effb5fa4cfb03b71a03a02c6db5", - "vendor/aliyuncs/oss-sdk-php/src/OSS/Model/GetLiveChannelStatus.php": "af4a7f71c012c982092ccb5d077a7893", - "vendor/aliyuncs/oss-sdk-php/src/OSS/Model/InitiateWormConfig.php": "fbe8bab66555e0b674a6c6c084d6ddc6", - "vendor/aliyuncs/oss-sdk-php/src/OSS/Model/LifecycleAction.php": "79d49f6c7f5b1f2d8854974b059bcbc6", - "vendor/aliyuncs/oss-sdk-php/src/OSS/Model/LifecycleConfig.php": "a9c71a7021f3984e565d0f7ee31f0759", - "vendor/aliyuncs/oss-sdk-php/src/OSS/Model/LifecycleRule.php": "65237c6b229cc294dee3a8fc88fc02f2", - "vendor/aliyuncs/oss-sdk-php/src/OSS/Model/ListMultipartUploadInfo.php": "f9cfada64cb79d6710d4e5638c076aa1", - "vendor/aliyuncs/oss-sdk-php/src/OSS/Model/ListPartsInfo.php": "05444142b8d619ec88c9e5f4ba390abc", - "vendor/aliyuncs/oss-sdk-php/src/OSS/Model/LiveChannelConfig.php": "d1826ef65269d5c93015cf46be572487", - "vendor/aliyuncs/oss-sdk-php/src/OSS/Model/LiveChannelHistory.php": "b4bc34363acd55971b418b49f24b67c2", - "vendor/aliyuncs/oss-sdk-php/src/OSS/Model/LiveChannelInfo.php": "e44781eff9652711f93b7fefaa4b40e1", - "vendor/aliyuncs/oss-sdk-php/src/OSS/Model/LiveChannelListInfo.php": "0efaa9b84fc231d21938e1e463999469", - "vendor/aliyuncs/oss-sdk-php/src/OSS/Model/LoggingConfig.php": "c9b2d9132817dbb22490e9b05849db95", - "vendor/aliyuncs/oss-sdk-php/src/OSS/Model/ObjectInfo.php": "0e45f1c3ae212dea8890703a868c2a9b", - "vendor/aliyuncs/oss-sdk-php/src/OSS/Model/ObjectListInfo.php": "38c8c33f4131f34d7b0004ccd7124390", - "vendor/aliyuncs/oss-sdk-php/src/OSS/Model/ObjectListInfoV2.php": "c7004db2c04b5a3b86a23039c640dbc1", - "vendor/aliyuncs/oss-sdk-php/src/OSS/Model/ObjectVersionInfo.php": "95a3559c9e00a217cf69fa0b5b5dc01f", - "vendor/aliyuncs/oss-sdk-php/src/OSS/Model/ObjectVersionListInfo.php": "fb2269ab444b22b19db27bd4f346dd2a", - "vendor/aliyuncs/oss-sdk-php/src/OSS/Model/PartInfo.php": "036a0e443674d1b620513941ecc35f14", - "vendor/aliyuncs/oss-sdk-php/src/OSS/Model/PrefixInfo.php": "faf2ebcd7e32d288013a85943f8343a4", - "vendor/aliyuncs/oss-sdk-php/src/OSS/Model/RefererConfig.php": "31118bf2491a7cd2d0fe4011b8a8f2c5", - "vendor/aliyuncs/oss-sdk-php/src/OSS/Model/RequestPaymentConfig.php": "77dd62870a5aa75f5e0b48127abab2f9", - "vendor/aliyuncs/oss-sdk-php/src/OSS/Model/RestoreConfig.php": "d968977783a3fcb7fe74f7fe29a0571a", - "vendor/aliyuncs/oss-sdk-php/src/OSS/Model/ServerSideEncryptionConfig.php": "0a1cecb19539f239cee5519cc0459d96", - "vendor/aliyuncs/oss-sdk-php/src/OSS/Model/StorageCapacityConfig.php": "c4c2143d9627fe41a79e4ef122946b7b", - "vendor/aliyuncs/oss-sdk-php/src/OSS/Model/Tag.php": "df0bf8c1b5f2fc2a466c975402a33d0d", - "vendor/aliyuncs/oss-sdk-php/src/OSS/Model/TaggingConfig.php": "37c7292054d8689609a045e3aa9791f1", - "vendor/aliyuncs/oss-sdk-php/src/OSS/Model/TransferAccelerationConfig.php": "538723fc37cb57fbe14fcac9f6652599", - "vendor/aliyuncs/oss-sdk-php/src/OSS/Model/UploadInfo.php": "6d1b1bb26d6c3e7c7adde2bccf082d78", - "vendor/aliyuncs/oss-sdk-php/src/OSS/Model/VersioningConfig.php": "7400d3d93e25e3975cbc6f55d333083b", - "vendor/aliyuncs/oss-sdk-php/src/OSS/Model/WebsiteConfig.php": "c2ddaa6a5dcaa497798b282393ba124d", - "vendor/aliyuncs/oss-sdk-php/src/OSS/Model/WormConfig.php": "e04351a11c40d99eeb0849389a6982b1", - "vendor/aliyuncs/oss-sdk-php/src/OSS/Model/XmlConfig.php": "d99560f242dae61feee14200c7631595", - "vendor/aliyuncs/oss-sdk-php/src/OSS/OssClient.php": "180cf36074e0e20be201ea174b74f074", - "vendor/aliyuncs/oss-sdk-php/src/OSS/Result/AclResult.php": "e872146dec2fc570c5c1534d5c35e837", - "vendor/aliyuncs/oss-sdk-php/src/OSS/Result/AppendResult.php": "96675fad67c0b93f168c08c17f929606", - "vendor/aliyuncs/oss-sdk-php/src/OSS/Result/BodyResult.php": "efd509b861260a7d5c0122afe4a8514b", - "vendor/aliyuncs/oss-sdk-php/src/OSS/Result/CallbackResult.php": "f0716ae61df95e8393c3d92e1fb84715", - "vendor/aliyuncs/oss-sdk-php/src/OSS/Result/CopyObjectResult.php": "a64d5f04f82104d75e93f57f00c14823", - "vendor/aliyuncs/oss-sdk-php/src/OSS/Result/CreateBucketCnameTokenResult.php": "3f1399e5f030ed3824f9a61e9d23e0b3", - "vendor/aliyuncs/oss-sdk-php/src/OSS/Result/DeleteObjectVersionsResult.php": "90324eab23205d9877598fe13eefdffc", - "vendor/aliyuncs/oss-sdk-php/src/OSS/Result/DeleteObjectsResult.php": "4b42936c71f094e8075e9e871e78340d", - "vendor/aliyuncs/oss-sdk-php/src/OSS/Result/ExistResult.php": "81b03608c4aa85afbd12b131e62669d8", - "vendor/aliyuncs/oss-sdk-php/src/OSS/Result/GetBucketCnameTokenResult.php": "369d494fa014fa322ac013adfb41b8f2", - "vendor/aliyuncs/oss-sdk-php/src/OSS/Result/GetBucketEncryptionResult.php": "354de8a8432cd4aa87b6772370286ecb", - "vendor/aliyuncs/oss-sdk-php/src/OSS/Result/GetBucketInfoResult.php": "1fbf5f1ef280fa0b018077ed672c9871", - "vendor/aliyuncs/oss-sdk-php/src/OSS/Result/GetBucketRequestPaymentResult.php": "22e2862d13abccc8ea31f5d84b176b43", - "vendor/aliyuncs/oss-sdk-php/src/OSS/Result/GetBucketStatResult.php": "68cafc110243cda3a96e601cecf8f8cb", - "vendor/aliyuncs/oss-sdk-php/src/OSS/Result/GetBucketTagsResult.php": "5b1b632111f7fa5bf015c3f01388e37c", - "vendor/aliyuncs/oss-sdk-php/src/OSS/Result/GetBucketTransferAccelerationResult.php": "66aae598ac52f90643ffc1995aa30bb4", - "vendor/aliyuncs/oss-sdk-php/src/OSS/Result/GetBucketVersioningResult.php": "faaf59b9dbb455f7a3572a85c77318ba", - "vendor/aliyuncs/oss-sdk-php/src/OSS/Result/GetBucketWormResult.php": "267bb61716a823389e2c200cc516d5c6", - "vendor/aliyuncs/oss-sdk-php/src/OSS/Result/GetCnameResult.php": "666e4d845fca8874fa341bf6ed9aa30d", - "vendor/aliyuncs/oss-sdk-php/src/OSS/Result/GetCorsResult.php": "eecf2ded91e6267a6ed463abac541b0b", - "vendor/aliyuncs/oss-sdk-php/src/OSS/Result/GetLifecycleResult.php": "1aeae45275a0428c70c2fef36447ce14", - "vendor/aliyuncs/oss-sdk-php/src/OSS/Result/GetLiveChannelHistoryResult.php": "d03478cf4497fd1b34834dad727385e0", - "vendor/aliyuncs/oss-sdk-php/src/OSS/Result/GetLiveChannelInfoResult.php": "1ed3b459fad8e03b8ab1ada53d589f71", - "vendor/aliyuncs/oss-sdk-php/src/OSS/Result/GetLiveChannelStatusResult.php": "b1480b331b4eddf6668391ee46f93e7d", - "vendor/aliyuncs/oss-sdk-php/src/OSS/Result/GetLocationResult.php": "501937b1fed450bfd9624b785658cb0d", - "vendor/aliyuncs/oss-sdk-php/src/OSS/Result/GetLoggingResult.php": "6815a4ac7861f5daf915432e304fcd61", - "vendor/aliyuncs/oss-sdk-php/src/OSS/Result/GetRefererResult.php": "d28d7d9f1400d41fec409c86eb88b112", - "vendor/aliyuncs/oss-sdk-php/src/OSS/Result/GetStorageCapacityResult.php": "003436eeb88649a925a8c22770c2f8b5", - "vendor/aliyuncs/oss-sdk-php/src/OSS/Result/GetWebsiteResult.php": "6d81e708653bf66492d8141df4603f0a", - "vendor/aliyuncs/oss-sdk-php/src/OSS/Result/HeaderResult.php": "1aab2f1ef5fe2dc817d5e5f00931eb94", - "vendor/aliyuncs/oss-sdk-php/src/OSS/Result/InitiateBucketWormResult.php": "10638188e9125b810702abca3e9d4297", - "vendor/aliyuncs/oss-sdk-php/src/OSS/Result/InitiateMultipartUploadResult.php": "880021ff77fe5329d24c628b1037a9d9", - "vendor/aliyuncs/oss-sdk-php/src/OSS/Result/ListBucketsResult.php": "95be9ef909e26ee3ea1a2d9e7109e404", - "vendor/aliyuncs/oss-sdk-php/src/OSS/Result/ListLiveChannelResult.php": "86fd11f97636d85e2a0aa4a1b68a8b89", - "vendor/aliyuncs/oss-sdk-php/src/OSS/Result/ListMultipartUploadResult.php": "f07485f59d2928c8ec626ba369f6b2f4", - "vendor/aliyuncs/oss-sdk-php/src/OSS/Result/ListObjectVersionsResult.php": "1e34573792cc3e47aee01936a3012b04", - "vendor/aliyuncs/oss-sdk-php/src/OSS/Result/ListObjectsResult.php": "16add0d5dfa130eb3b2c1a162a3f4e25", - "vendor/aliyuncs/oss-sdk-php/src/OSS/Result/ListObjectsV2Result.php": "7163f8be55f7fc88f59df975fbfe9ca5", - "vendor/aliyuncs/oss-sdk-php/src/OSS/Result/ListPartsResult.php": "8a3b3cadd989893d70cccd5a4a34ac28", - "vendor/aliyuncs/oss-sdk-php/src/OSS/Result/PutLiveChannelResult.php": "a1cbc7dbe660fa928ab623cbf6344d06", - "vendor/aliyuncs/oss-sdk-php/src/OSS/Result/PutSetDeleteResult.php": "2bc44310d34ded3d4e47d8388d04f827", - "vendor/aliyuncs/oss-sdk-php/src/OSS/Result/Result.php": "8b9b2ae90543fe371b2310839a8f2292", - "vendor/aliyuncs/oss-sdk-php/src/OSS/Result/SymlinkResult.php": "04919f94612b16d58b6aadae37b7cda0", - "vendor/aliyuncs/oss-sdk-php/src/OSS/Result/UploadPartResult.php": "cb89bbf7810602208d4c3f6acd8d1ab4", - "vendor/aliyuncs/oss-sdk-php/tests/OSS/Tests/AclResultTest.php": "473277f74e5f0f2cddd1e2ebafc57cc1", - "vendor/aliyuncs/oss-sdk-php/tests/OSS/Tests/BodyResultTest.php": "3d17b2fc83df2f5675360c82d8a89477", - "vendor/aliyuncs/oss-sdk-php/tests/OSS/Tests/BucketCnameTest.php": "b524e21791d2d8dd9ea287e5ebf4ebe3", - "vendor/aliyuncs/oss-sdk-php/tests/OSS/Tests/BucketInfoTest.php": "c814773439dddf62e82c26234b169ed6", - "vendor/aliyuncs/oss-sdk-php/tests/OSS/Tests/BucketLiveChannelTest.php": "4df149cd1e6e7f51b45d728d7dcce122", - "vendor/aliyuncs/oss-sdk-php/tests/OSS/Tests/CallbackTest.php": "9da9632a6ce11774a31562943ce0d3b0", - "vendor/aliyuncs/oss-sdk-php/tests/OSS/Tests/CnameConfigTest.php": "ec7af3a26ff30fe186ca8d4afc405c32", - "vendor/aliyuncs/oss-sdk-php/tests/OSS/Tests/CnameTokenInfoTest.php": "2cb620807fcc79bdebabc3097c5b0ce2", - "vendor/aliyuncs/oss-sdk-php/tests/OSS/Tests/Common.php": "5d5d45fe57b05ddbb8080e6fd59ba549", - "vendor/aliyuncs/oss-sdk-php/tests/OSS/Tests/ContentTypeTest.php": "938cc5565bf276389ee891dbd591c5e9", - "vendor/aliyuncs/oss-sdk-php/tests/OSS/Tests/CopyObjectResult.php": "bb51b84020976857b8d0d260c7d111c9", - "vendor/aliyuncs/oss-sdk-php/tests/OSS/Tests/CorsConfigTest.php": "732f70d5fe4b35a9a6298a2d7fade596", - "vendor/aliyuncs/oss-sdk-php/tests/OSS/Tests/DeleteObjectVersionsResultTest.php": "30fe7244f2f4ac0a7a0fdd7654610920", - "vendor/aliyuncs/oss-sdk-php/tests/OSS/Tests/ExistResultTest.php": "31f9af5e226128d08a72533e47b17093", - "vendor/aliyuncs/oss-sdk-php/tests/OSS/Tests/GetBucketEncryptionResultTest.php": "75b068ee4806899e2c29f8e02b11c1fd", - "vendor/aliyuncs/oss-sdk-php/tests/OSS/Tests/GetBucketRequestPaymentResultTest.php": "6f28c60f64b92a20145809905cef4e52", - "vendor/aliyuncs/oss-sdk-php/tests/OSS/Tests/GetBucketStatResultTest.php": "78a0ef6c036f7c0f3e95b6699c63d7d9", - "vendor/aliyuncs/oss-sdk-php/tests/OSS/Tests/GetBucketTagsResultTest.php": "dfe905d9d5fa3770cd0a3e552ed4bdd6", - "vendor/aliyuncs/oss-sdk-php/tests/OSS/Tests/GetBucketTransferAccelerationResultTest.php": "b0f1a30c64306becd213ac1b9c0682b6", - "vendor/aliyuncs/oss-sdk-php/tests/OSS/Tests/GetBucketWormResultTest.php": "ea54af7a804c69fb9c6dd637e80d2469", - "vendor/aliyuncs/oss-sdk-php/tests/OSS/Tests/GetCorsResultTest.php": "9a499e3716faacb6ad9da0d88f7fb5d0", - "vendor/aliyuncs/oss-sdk-php/tests/OSS/Tests/GetLifecycleResultTest.php": "92de2e2b6f5506b00dd94ebb39b4a7db", - "vendor/aliyuncs/oss-sdk-php/tests/OSS/Tests/GetLoggingResultTest.php": "b3c470eff5246cc04012aa1d76e0b573", - "vendor/aliyuncs/oss-sdk-php/tests/OSS/Tests/GetRefererResultTest.php": "0086effd28f1bb69a97ce605f2d74029", - "vendor/aliyuncs/oss-sdk-php/tests/OSS/Tests/GetWebsiteResultTest.php": "89fa31e50b513c3a41cc75e17040e41a", - "vendor/aliyuncs/oss-sdk-php/tests/OSS/Tests/HeaderResultTest.php": "9e67efad541202271064498dec139819", - "vendor/aliyuncs/oss-sdk-php/tests/OSS/Tests/HttpTest.php": "c18661ec2fbd9c6ca5e1b73a720350fe", - "vendor/aliyuncs/oss-sdk-php/tests/OSS/Tests/InitiateMultipartUploadResultTest.php": "ebfd77320fb5852dcdef32ce5114e590", - "vendor/aliyuncs/oss-sdk-php/tests/OSS/Tests/LifecycleConfigTest.php": "c2169f935dc408bb45ca0c4e5e6e98c5", - "vendor/aliyuncs/oss-sdk-php/tests/OSS/Tests/ListBucketsResultTest.php": "6cf6544f144c1aa083786d2d3be827ab", - "vendor/aliyuncs/oss-sdk-php/tests/OSS/Tests/ListMultipartUploadResultTest.php": "1b975025b3bf8f34d3fe1670ea6b341b", - "vendor/aliyuncs/oss-sdk-php/tests/OSS/Tests/ListObjectVersionsResultTest.php": "b05d125013088227fded0416bb091dfd", - "vendor/aliyuncs/oss-sdk-php/tests/OSS/Tests/ListObjectsResultTest.php": "9f33f7638ba9be13d2fab55c85501763", - "vendor/aliyuncs/oss-sdk-php/tests/OSS/Tests/ListObjectsV2ResultTest.php": "29144c411ec1f44be313a86e5505a1d5", - "vendor/aliyuncs/oss-sdk-php/tests/OSS/Tests/ListPartsResultTest.php": "8186888b3e7ecd4cea651af78ef28df3", - "vendor/aliyuncs/oss-sdk-php/tests/OSS/Tests/LiveChannelXmlTest.php": "77759a61b247c1d6e2cf413f6ae70503", - "vendor/aliyuncs/oss-sdk-php/tests/OSS/Tests/LoggingConfigTest.php": "c37721d9db5c447759fe30c37ca24584", - "vendor/aliyuncs/oss-sdk-php/tests/OSS/Tests/MimeTypesTest.php": "6c504cb0e52684ca06d3bd42271834c6", - "vendor/aliyuncs/oss-sdk-php/tests/OSS/Tests/ObjectAclTest.php": "aafdd4bbbdbbb3fe678a93a4a20a4909", - "vendor/aliyuncs/oss-sdk-php/tests/OSS/Tests/OssClientBucketCnameTest.php": "aa3555a72db13a2cfbf74b0481958aac", - "vendor/aliyuncs/oss-sdk-php/tests/OSS/Tests/OssClientBucketCorsTest.php": "4573167f2e19ccdf4f7cf0e08f36f033", - "vendor/aliyuncs/oss-sdk-php/tests/OSS/Tests/OssClientBucketEncryptionTest.php": "15cf5503931ebf4f5b9cdc273480eb27", - "vendor/aliyuncs/oss-sdk-php/tests/OSS/Tests/OssClientBucketInfoTest.php": "5614e39fb65ad8cf3f8a13f425db5653", - "vendor/aliyuncs/oss-sdk-php/tests/OSS/Tests/OssClientBucketLifecycleTest.php": "aaafd6f6e7f6c001e15b31d7d3c77bd0", - "vendor/aliyuncs/oss-sdk-php/tests/OSS/Tests/OssClientBucketLoggingTest.php": "71ac5807d86b470adeeb17290dd5515e", - "vendor/aliyuncs/oss-sdk-php/tests/OSS/Tests/OssClientBucketPolicyTest.php": "8a0de95d0139a4e106075179b6b0ecd8", - "vendor/aliyuncs/oss-sdk-php/tests/OSS/Tests/OssClientBucketRefererTest.php": "ff8cae107eb756482f29bcfeeda6e7b9", - "vendor/aliyuncs/oss-sdk-php/tests/OSS/Tests/OssClientBucketRequestPaymentTest.php": "86b1e2927e2c3ec755c08d517e93c835", - "vendor/aliyuncs/oss-sdk-php/tests/OSS/Tests/OssClientBucketStatTestTest.php": "eceb598c2229509da08ea9a80ee23162", - "vendor/aliyuncs/oss-sdk-php/tests/OSS/Tests/OssClientBucketStorageCapacityTest.php": "a74628a4eda64f9b9c4b5968d7ba258f", - "vendor/aliyuncs/oss-sdk-php/tests/OSS/Tests/OssClientBucketTagsTest.php": "924301883d671640164040a59eb25125", - "vendor/aliyuncs/oss-sdk-php/tests/OSS/Tests/OssClientBucketTest.php": "adf839d8909c5ce5600bf962e4df5fa5", - "vendor/aliyuncs/oss-sdk-php/tests/OSS/Tests/OssClientBucketTransferAccelerationTest.php": "935d483869fcfcdce0a4d9ceee1f9622", - "vendor/aliyuncs/oss-sdk-php/tests/OSS/Tests/OssClientBucketVersioningTest.php": "c2d1777750212b8e0b1cf62ec4f70b1d", - "vendor/aliyuncs/oss-sdk-php/tests/OSS/Tests/OssClientBucketWebsiteTest.php": "09a46b43f19fec8a90e7d8e0c7a54ab8", - "vendor/aliyuncs/oss-sdk-php/tests/OSS/Tests/OssClientBucketWormTest.php": "313f2993dd0992f263f1d46f8d1f1939", - "vendor/aliyuncs/oss-sdk-php/tests/OSS/Tests/OssClientImageTest.php": "64343b5ebeb85ce88d18ee38c06a7aa0", - "vendor/aliyuncs/oss-sdk-php/tests/OSS/Tests/OssClientListObjectsTest.php": "69895a816b6893037ce7e95bf70082cd", - "vendor/aliyuncs/oss-sdk-php/tests/OSS/Tests/OssClientListObjectsV2Test.php": "a44f52204107c94a01796cb0c8ac67d2", - "vendor/aliyuncs/oss-sdk-php/tests/OSS/Tests/OssClientMultipartUploadTest.php": "bfe42afe7901e8057c15371d2d90174c", - "vendor/aliyuncs/oss-sdk-php/tests/OSS/Tests/OssClientObjectRequestPaymentTest.php": "81eba7eb584ff1200b4fff53040fd8d8", - "vendor/aliyuncs/oss-sdk-php/tests/OSS/Tests/OssClientObjectTaggingTest.php": "c85d95dd9faf71ca7ec26f484ac0d060", - "vendor/aliyuncs/oss-sdk-php/tests/OSS/Tests/OssClientObjectTest.php": "e0a865353e172f377fbb53bebba574c3", - "vendor/aliyuncs/oss-sdk-php/tests/OSS/Tests/OssClientObjectVersioningTest.php": "fb73038d0d5e4e693384ed806264e2a0", - "vendor/aliyuncs/oss-sdk-php/tests/OSS/Tests/OssClientRestoreObjectTest.php": "227570af4ca22f1851e750c5371ad2a0", - "vendor/aliyuncs/oss-sdk-php/tests/OSS/Tests/OssClientSignatureTest.php": "6200f25360d799f89657151ae1f019e6", - "vendor/aliyuncs/oss-sdk-php/tests/OSS/Tests/OssClientTest.php": "ad46ceeb85fec7e61067e717cd08ae96", - "vendor/aliyuncs/oss-sdk-php/tests/OSS/Tests/OssExceptionTest.php": "8e7f14f7cf30eaaea50ca580fbb17ec0", - "vendor/aliyuncs/oss-sdk-php/tests/OSS/Tests/OssTrafficLimitTest.php": "ff372f148e9a0d1f7094c56b5ec0ca5d", - "vendor/aliyuncs/oss-sdk-php/tests/OSS/Tests/OssUtilTest.php": "6cc1bfe90392cbe75bc6dc0cfa863585", - "vendor/aliyuncs/oss-sdk-php/tests/OSS/Tests/PutSetDeleteResultTest.php": "0e54f579265ea5dc2af29a23861c5b2f", - "vendor/aliyuncs/oss-sdk-php/tests/OSS/Tests/RefererConfigTest.php": "5e55b644a727919a39b18c02e7cb5f31", - "vendor/aliyuncs/oss-sdk-php/tests/OSS/Tests/StorageCapacityConfigTest.php": "c12a3e5079b966505f07af64ea68bd0e", - "vendor/aliyuncs/oss-sdk-php/tests/OSS/Tests/StorageCapacityTest.php": "21f78fcca170d487321a0a87ca45575d", - "vendor/aliyuncs/oss-sdk-php/tests/OSS/Tests/SymlinkTest.php": "7de4048718e6acdf9f69557c5fa147ca", - "vendor/aliyuncs/oss-sdk-php/tests/OSS/Tests/TestOssClientBase.php": "af810f47ef0620e58509cad3ab9d2100", - "vendor/aliyuncs/oss-sdk-php/tests/OSS/Tests/TransferAccelerationConfigTest.php": "c9a43f1b1c39f5033af5a9b420fa6d96", - "vendor/aliyuncs/oss-sdk-php/tests/OSS/Tests/UploadPartResultTest.php": "ac19292d430dbb4b28e228774cf1860c", - "vendor/aliyuncs/oss-sdk-php/tests/OSS/Tests/WebsiteConfigTest.php": "9b4855d5af5df41a373dd159ed42b039", - "vendor/autoload.php": "534ab5eca808d1d795e85c651796f650", - "vendor/clagiordano/weblibs-configmanager/src/ConfigManager.php": "6a9970a799307f93e8892da3a55cd1d8", - "vendor/clagiordano/weblibs-configmanager/src/IConfigurable.php": "789cb417c616f81c4a3775b316adb635", - "vendor/clagiordano/weblibs-configmanager/tests/ConfigManagerTest.php": "78cf62f0f78dc51263e43c433a3ccc4e", - "vendor/clagiordano/weblibs-configmanager/testsdata/sample_config_data.php": "a28b7b6b07c0b4fa8a3955f9d132bb7f", - "vendor/composer/ClassLoader.php": "c02be6d96671f88d28aad3ffa134c8ae", - "vendor/composer/InstalledVersions.php": "ba676e94b5ddd557cb6a71a2a5cc98d9", - "vendor/composer/autoload_classmap.php": "6fea34d7d1b38fa95238c6a31ef7e6f3", - "vendor/composer/autoload_files.php": "742d9767cc3355c0cb2455c5a980a099", - "vendor/composer/autoload_namespaces.php": "6b7d1ac4a03fd3421f520af7a6d7ab1f", - "vendor/composer/autoload_psr4.php": "43e6e728b4427ec8d796ab3696998210", - "vendor/composer/autoload_real.php": "6b9e474b62001e5f872fe28a82a36b13", - "vendor/composer/autoload_static.php": "e77846c10e9c4df4924f1d8c779c3b3f", - "vendor/composer/installed.php": "747fe08ad2a44493e3499915377ea8ce", - "vendor/composer/platform_check.php": "88e803cc53322b04be4cb1f6ed3602a1", - "vendor/dh2y/think-qrcode/src/QRcode.php": "d9af2f0db72ab6f2a895717c3e81a266", - "vendor/dh2y/think-qrcode/src/phpqrcode/bindings/tcpdf/qrcode.php": "c0a11c1419131032614c0c5d2c9eb145", - "vendor/dh2y/think-qrcode/src/phpqrcode/index.php": "efd83ab782c1f88335e6f476a00732fc", - "vendor/dh2y/think-qrcode/src/phpqrcode/phpqrcode.php": "a49b3989932467c8c6dd499d04be2a30", - "vendor/dh2y/think-qrcode/src/phpqrcode/qrbitstream.php": "bd6d63dfa9f2dbe4b3f30915653dcc63", - "vendor/dh2y/think-qrcode/src/phpqrcode/qrconfig.php": "cb0652b660884514fc50040a97cd14a9", - "vendor/dh2y/think-qrcode/src/phpqrcode/qrconst.php": "2fe50ac83ee753b2bb73957969b23822", - "vendor/dh2y/think-qrcode/src/phpqrcode/qrencode.php": "b614c44f4e00cb5c1188c7e6209225f8", - "vendor/dh2y/think-qrcode/src/phpqrcode/qrimage.php": "7f7c6502a1b341fb2638d0f2599391f7", - "vendor/dh2y/think-qrcode/src/phpqrcode/qrinput.php": "52db60b2134954b3c60ab080bbfe3883", - "vendor/dh2y/think-qrcode/src/phpqrcode/qrlib.php": "96a6ce57504482dc0f81076082c4b945", - "vendor/dh2y/think-qrcode/src/phpqrcode/qrmask.php": "a4bdf0e02b78b8b59f266aa9457793b6", - "vendor/dh2y/think-qrcode/src/phpqrcode/qrrscode.php": "a7c018654993f60048288dba5d6caf67", - "vendor/dh2y/think-qrcode/src/phpqrcode/qrspec.php": "a66c71311a16c8c85010317704af7774", - "vendor/dh2y/think-qrcode/src/phpqrcode/qrsplit.php": "1bccbe5318552ce67bba56ba24209388", - "vendor/dh2y/think-qrcode/src/phpqrcode/qrtools.php": "6f034039e4fa9f42378b37c441505419", - "vendor/dh2y/think-qrcode/src/phpqrcode/tools/merge.php": "ed3fdbb0fbb8392a9050ea867ddacd88", - "vendor/dh2y/think-qrcode/src/phpqrcode/tools/merged_config.php": "3b018daa6b03c167a1ecea7ef96b1a95", - "vendor/dh2y/think-qrcode/src/phpqrcode/tools/merged_header.php": "2f2dcd46e505c0e4c249d5f62a815324", - "vendor/dragonmantank/cron-expression/src/Cron/AbstractField.php": "22f8494e2822042e0c53788475f56294", - "vendor/dragonmantank/cron-expression/src/Cron/CronExpression.php": "7e4fefd1513387e9ad572f11a91c5cfd", - "vendor/dragonmantank/cron-expression/src/Cron/DayOfMonthField.php": "10e49fd7f8304e48e1815323876d2fc5", - "vendor/dragonmantank/cron-expression/src/Cron/DayOfWeekField.php": "064192ea924ef4f9994c53c7f589d247", - "vendor/dragonmantank/cron-expression/src/Cron/FieldFactory.php": "b1ae13c9dfbd8ce07ce6031d40cdedcb", - "vendor/dragonmantank/cron-expression/src/Cron/FieldFactoryInterface.php": "8192a129320897a83ed25cd894c2ffa8", - "vendor/dragonmantank/cron-expression/src/Cron/FieldInterface.php": "b5aa6c1fa2bb23bbd04ffa7cf1fa9b37", - "vendor/dragonmantank/cron-expression/src/Cron/HoursField.php": "fcc082fbdced6f5d0a92c46b3c534ef5", - "vendor/dragonmantank/cron-expression/src/Cron/MinutesField.php": "39e3f13cd85d43024fa08124c5757e6f", - "vendor/dragonmantank/cron-expression/src/Cron/MonthField.php": "415117ee489ff880191c2d4e1d0bc60e", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/Arborize.php": "7e1c1940096df942fbcd171302f8927c", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrCollections.php": "a4bf2f1435e3086c16e412968d39a7cc", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/AlphaValue.php": "0735ba1e0d72921d32b2be57d29f6fdd", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Background.php": "99310e8ff458aaf39b0de712ae1d1173", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/BackgroundPosition.php": "ca1cf80faf9ec7a8906cb5bef9331ed2", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Border.php": "bfcec5667278ee0bd42ec80ceb94b924", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Color.php": "ad92a0c4cc0023ab72636ad29e3c69ca", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Composite.php": "d1456a381affaa3287a559770dd825c1", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/DenyElementDecorator.php": "bf5bf3a9c03a0c91243f94956d778591", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Filter.php": "44146b8f2ff0749459a2391cc55a96d4", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Font.php": "cadcd652415401722a2e6690371adf1f", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/FontFamily.php": "e16e88b78b17ef5933a6753db8483459", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Ident.php": "761cc62ff769403e649a0bd5a251fbbb", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/ImportantDecorator.php": "7d50c6c2cbbe3b334c7461b2d01b380d", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Length.php": "bf5eae4ee7059716053ad9263d278ea6", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/ListStyle.php": "184f255d1cfe8ab3bf620757a6700b84", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Multiple.php": "f9a630c6a53df02ba6d1a0ed3f473568", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Number.php": "be44c68a9c95bb88eda0781d9b5f5915", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Percentage.php": "bfb7f57fa6543314c8b8dd0373aaba9d", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/TextDecoration.php": "5c9c72c263a87ea11590b0bb8105632b", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/URI.php": "d706c8324549fc4f11abfb9ab3679da1", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS.php": "e1f56ced29c114077edeb2ba0de15a39", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Clone.php": "ff9e3f723f9b72f07f99c110659681b7", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Enum.php": "7b67f9ef906d94c8bf3310dee3c03a2f", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Bool.php": "b971ee322c6a7ef19a7875a3f02bfae6", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Class.php": "243998e52bc33a51cfa5e9ecab98f9ef", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Color.php": "94924c97ef1cf7c208d7545b8a4508c4", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/ContentEditable.php": "9d3ab250baf69e023a80c1b6cadd3ed6", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/FrameTarget.php": "48bdb5a0f603ff235e2185e0675497ac", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/ID.php": "f941844a693f780d4218888cfac0daec", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Length.php": "8eef9594ae888e38e1c5921f304fd1ed", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/LinkTypes.php": "749a2c0adcdaddcdb0c71d8785c8adbf", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/MultiLength.php": "44af0c9a75c6ca7132ff21d128af19a6", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Nmtokens.php": "4266ca99292f6337fe36a966465ea67c", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Pixels.php": "2b6c6b9a58e008f9ad30bd47feaeadc5", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Integer.php": "c44232150f0fd31ceded65ab8cda5450", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Lang.php": "2e6384ec55c011122ae49c2ab31c5188", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Switch.php": "03ebc8ba70d33a7641bcd07e927fb608", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Text.php": "b7ed41ef61e377d1525c7e958240d44a", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI/Email/SimpleCheck.php": "d14b7b4a69e553b4224b55ba8fb8e6ed", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI/Email.php": "5c820cfbec5d6688e9058ff13b81f199", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI/Host.php": "fd4d4badaef26f98ab1f6b7906bf5791", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI/IPv4.php": "cedd9dae9fc3b958e1fba48cdf5b6546", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI/IPv6.php": "233fb37b03b358a0d95dd3f429316ce3", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI.php": "5f77a12b61132f281dcfacecc7ec05b0", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef.php": "f922e5e5c1ebbafaf04de31b9d9660a4", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Background.php": "ed9489fc9798170ed382f1314d9f77ef", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/BdoDir.php": "19379b90689b57ce6fd45aee692b18dc", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/BgColor.php": "6298b85d7cb368d69c652616f75b226d", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/BoolToCSS.php": "9363916e32a3dc99fe2189a3f7235c48", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Border.php": "68dcda39a6cdcb5a867f875c7bc25b5c", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/EnumToCSS.php": "a6854574291715be20198669b1101fe4", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/ImgRequired.php": "604634247e0089d81b89b9147e5e95db", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/ImgSpace.php": "13840e28ff28f7cb85e9e6340e78fd25", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Input.php": "053448d247e6d3f35fdd6481c80a5c0d", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Lang.php": "0f612b56eabe83577f34df1ad604c569", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Length.php": "cc75bba7a9ee518fc9bf790d6f65a0e7", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Name.php": "bef00d099144cef6472738a6be5e92aa", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/NameSync.php": "1f2604d43ec78fb4a7eff242c1313a5d", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Nofollow.php": "97d6aaf38105ac871076dce2b949e8ff", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/SafeEmbed.php": "e5d6998b98cbb2edeb34d41ed9381d7b", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/SafeObject.php": "232bf5e8e469e54dba5694d7272dd416", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/SafeParam.php": "007d1408c26ad50484913e7a3fe0450b", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/ScriptRequired.php": "febab4dc70bf88169881a137c7f9e867", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/TargetBlank.php": "f9865fdd6316c0cf4f63342fc3593f92", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/TargetNoopener.php": "dd77502d96b11c4672481a043e8d99ce", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/TargetNoreferrer.php": "269695146b28a9c3b854d8b16e23e809", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Textarea.php": "25c61427a2cd5428b0d58009b87218f1", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform.php": "30034501c1e8827394f600dad177c3da", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTypes.php": "d00dc8088a5f90eebfe9b0a3b535d687", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrValidator.php": "8601d714205cdecf3ded4d9341044dc4", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/Bootstrap.php": "3498910b433189d6a125edab68d04857", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/CSSDefinition.php": "d63d4511587ce9dc88c570ccf099d7b8", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Chameleon.php": "e2dad2b9c9f093b2cef920fe51c86321", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Custom.php": "0f61929a4c24e2c196bdd58cfe566a02", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Empty.php": "33457531d46c2cf60b9d74bc4a0f9818", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/List.php": "82a65464f458e7d60720843d6a2198d2", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Optional.php": "a9ea53d99254631009e54ce72b5767d7", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Required.php": "c102312411eb9f14be660287bef45afb", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/StrictBlockquote.php": "cf8565bb023ac73323b8f3c58881a707", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Table.php": "a7e3965fa190dd22f00fa3abde324acd", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef.php": "455dfdb0bc9f208568046f819a4a7828", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/Config.php": "8616c80fe13c72fccac5ec4efda23ef0", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Builder/ConfigSchema.php": "11ee05ac784e9134af3da0d24642543c", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Builder/Xml.php": "47fa3def33b8f0a3399ce77e5d669d53", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Exception.php": "31bf3afba867409fdf11f75eaa3725fd", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Interchange/Directive.php": "53461690dc58307295eeb5e2f30606e3", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Interchange/Id.php": "b0ec14add96cfbb3dc2ea0b5f1cb6a80", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Interchange.php": "214e8cdce1fa501148b20ef3d99a6cf4", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/InterchangeBuilder.php": "8ba43fefc6c8231c7cb6143e2aa0af5d", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Validator.php": "f80e804b0e796c13c834753912f10ebe", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/ValidatorAtom.php": "446e60f704190c269da69b72ece7d70f", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema.php": "e5c429d70c7185e862c0a4d800a31b26", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/ContentSets.php": "7ca4682cf570f9581b3f5262ded72d54", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/Context.php": "62c46293e7e4f2284f0934fd4c1abca5", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/Definition.php": "d9c6de06940a4811dcee6008657f2d4e", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Decorator/Cleanup.php": "1eee5a1f75620519e3ef7c52c8da1998", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Decorator/Memory.php": "1633327cc2bef18ca3a67d9b762f6ba9", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Decorator.php": "8a61d0e045987bb88b7eb306738d1bef", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Null.php": "ba4e60686ca80e591742fa55cdb5e614", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Serializer.php": "b13f7bee3554a608efeac2ef71f2ab79", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache.php": "3da82671d0f260e198b6ef6acf1d8005", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCacheFactory.php": "3b05f0480562c73c6d6cfd5eaffe1047", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/Doctype.php": "308f29c7d17c7998b8c3f949c0004679", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/DoctypeRegistry.php": "e5b36670cea455e510bc29f1fb14ac06", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/ElementDef.php": "0d81935f87c04349c799b7de308eb992", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/Encoder.php": "0a5a98e8d8e9005d53a930b0e1908644", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/EntityLookup.php": "c29c356dac478eca80747cc4ad1f096e", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/EntityParser.php": "2aacbdb64a56cefe68afb50dd010efcf", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/ErrorCollector.php": "9eae2b01aca584994516c509499ae088", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/ErrorStruct.php": "06bc76f4e7f49005106800ea51e73e4d", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/Exception.php": "6549f2e00060fd671149191f1e94eaf3", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/Filter/ExtractStyleBlocks.php": "edb6d659e0de9a80ff7e9246cc946b63", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/Filter/YouTube.php": "55e74bac11f0cfab63e7c8967d194eff", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/Filter.php": "933f1e52fcbdc7cda001fbe4f03b5c82", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/Generator.php": "df1daca93084bc8afabb11b96664a1e2", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLDefinition.php": "32e810a86372bee32652de3a388e5528", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Bdo.php": "6dcb6f47a697f0b377fe2531fe7bf2ac", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/CommonAttributes.php": "f35337051c6f67617c4b8a856282c60f", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Edit.php": "99de2cc1ce10ca83162a51e42c6b287b", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Forms.php": "ab2e4d49239d9069f8090c1330432789", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Hypertext.php": "a94574dbadf4579c9674fdc669376dc7", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Iframe.php": "40c7200ff7fcb89e4b106c3c063f826f", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Image.php": "e746812dffd577ef46bb19d45d7d051b", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Legacy.php": "2144c25da36774215186ffc40e4473ba", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/List.php": "fe1b57bb06f52f26d1848477660465f4", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Name.php": "b56f15e308be71bca4fa6a379df941d7", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Nofollow.php": "eb4ff6ed303ca33d9e799d48e3f24175", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/NonXMLCommonAttributes.php": "16ef6ba9e3ca2295f3bb1e162f1a18d8", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Object.php": "6b12f1aa5cbb06aa637e1edc49f6bb31", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Presentation.php": "f8c066212ac7bef32dec610995a4c39b", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Proprietary.php": "734d792760db90c8fed149e7ce736f0a", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Ruby.php": "e91e4cd294f7eef140353cc583aeba2c", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/SafeEmbed.php": "e099d606a1f80f2e48d5e05973a71cd0", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/SafeObject.php": "397e9fefcffb753d0f91899019e7f73a", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/SafeScripting.php": "ac849713bcf2f3456f98db88284f2119", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Scripting.php": "a84b66f7da2f95b3c4f758bc87df09c2", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/StyleAttribute.php": "00c8cdb3fd77913667e59bccbb77df0b", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tables.php": "43ec7f2f057779f03b482cd4136dccb5", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Target.php": "61fbff33f92205546366b8af93f5a538", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/TargetBlank.php": "782f5a3c041a5c263ce4176dfa9c53c2", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/TargetNoopener.php": "7622d438b9690cc2d9518ebfd86398c3", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/TargetNoreferrer.php": "18257775aaf517a6fb695d488734c0fa", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Text.php": "4868658aa54548ce08ba6a7a7e7ef6fd", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/Name.php": "a9f3dadfe8fd9dc75ce21a4eac223500", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/Proprietary.php": "2aef81d0d05e79f998524d5c82767b65", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/Strict.php": "1050a097e9cfc20642cf940a569e89e0", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/Transitional.php": "46a190f7fa4347838efb683cd7301255", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/XHTML.php": "6d524caec79bafacb717f5318a6cb32d", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/XHTMLAndHTML4.php": "cff6f5dd2698cec69a91455ebbc4fc39", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy.php": "f5422691867dc827a7e0d68dc36358bf", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/XMLCommonAttributes.php": "22a229b0bff44dc453215c6328798365", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule.php": "414a1d97c1b5c14952a255cee7243112", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModuleManager.php": "d22ebff6adeb2d8bb732dc8361fb2610", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/IDAccumulator.php": "566c63e4c73c0108fde21d1a9d286dd0", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector/AutoParagraph.php": "218483120b35cc74672a773ca8b1840a", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector/DisplayLinkURI.php": "eded371279a485d9be65478f63293162", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector/Linkify.php": "f7c7d617a8dfbb4bab090930b5a65c55", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector/PurifierLinkify.php": "b18bc8a722259a390e0a1c4e55780175", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector/RemoveEmpty.php": "e72c547a0cf1b49417d35b62acaee9aa", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector/RemoveSpansWithoutAttributes.php": "c167c0deab060eaaade778962c2f48ce", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector/SafeObject.php": "e2e54cff61c3848d76a901f0ff50d9a4", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector.php": "af500dca7d516bd0e0f7ea468419658a", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/Language/messages/en.php": "5836f2bf2c494d4de7ae70d602063f50", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/Language.php": "6f18adcaf3a47b6542b23953d72b2a6e", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/LanguageFactory.php": "65d08b1974f0f5c21d4669d392a414f0", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/Length.php": "1b496ad4f058d6f74464ac9e68d6597f", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/Lexer/DOMLex.php": "a9830e286aa0f1544b56649ca754de7b", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/Lexer/DirectLex.php": "fa0d37eff65b124b3849a64a62caf104", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/Lexer/PH5P.php": "6400bab93249f12133b6b8ce359f5a35", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/Lexer.php": "4d8a1104b0fb1de05cf4ea8961edc100", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/Node/Comment.php": "08202322ec607e2f334e578b3db6890c", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/Node/Element.php": "9f2e1a2bbd129e3b714a51f3d97e7731", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/Node/Text.php": "bfdda227bb41be3cb7829786aaebc93e", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/Node.php": "e469fd5dc851aa49d6bd03757abe1859", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/PercentEncoder.php": "c243827d4279b24f43fc7fea65d6dc4f", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/Printer/CSSDefinition.php": "9cbdedf404d96d4f86325b73e1251523", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/Printer/ConfigForm.php": "bf1ca46f471374cfa796c1aa2dd7a636", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/Printer/HTMLDefinition.php": "8d583c9342af32a00dd00a0464a55f03", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/Printer.php": "32e2635460cf0df0e14505869b0f463b", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/PropertyList.php": "68e5a7818be2ec6296b58ff64dd89ba4", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/PropertyListIterator.php": "2adf12c2ec39710ab69740b09dd1b371", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/Queue.php": "9ad5c8f6fbe1412195f178df14792b99", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/Composite.php": "6b9aefb0d8434c064b83858eccb28dc5", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/Core.php": "2b0982b7dce8032094bfae36e6bc7e4f", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/FixNesting.php": "090c3a974f5ba784ae2f848a5ab9db00", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/MakeWellFormed.php": "348eb60600953f669d071e850321cbc0", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/RemoveForeignElements.php": "be08811b7d0ac7d2ae55541952e3cdf7", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/Strategy/ValidateAttributes.php": "29cf6bb54660fa1bc1ac203adee9c7d8", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/Strategy.php": "3f7ffa4bbeb751b4bf3ec504987eb46e", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/StringHash.php": "04a52b294003ea863f7d41d424925213", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/StringHashParser.php": "25393b273916ec4ba7bfdc9ebab9e3df", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/TagTransform/Font.php": "8fa6034a8e6e1953eb09a76246bba8cd", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/TagTransform/Simple.php": "5997138854240b61895e61c3fa4e68d7", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/TagTransform.php": "5a8ed264cbeb5f187c3380c60971c9d7", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/Token/Comment.php": "ebfa8a6a68850ec5418a63872fdb7cc2", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/Token/Empty.php": "c13013371746cf36b46fe3dc6fac3d9d", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/Token/End.php": "5029c29d5745b33b87dde8b304fb2119", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/Token/Start.php": "3289ffc2b1f7b04a342bd941a5519c44", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/Token/Tag.php": "4cb801b75b88f656604b400814dedbf4", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/Token/Text.php": "def5a8c3c146742a8473213deb05091a", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/Token.php": "105d64e33243424438de3fcb083016d7", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/TokenFactory.php": "b011bc09cbe8ccbd27be270f272f4d97", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/URI.php": "32927f3e0ca204e0d74720eb2358e8f4", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIDefinition.php": "883eb3dd5ce302eb43f4ccc650dcc760", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/DisableExternal.php": "8936e61cab6355bb4df10379460b989a", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/DisableExternalResources.php": "8440a24e9f0f789dbbb83bb5a9a06c6c", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/DisableResources.php": "8bbba579967f805f662169e4480de774", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/HostBlacklist.php": "123e95fbfad9b045adfc518ab670a3c6", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/MakeAbsolute.php": "3fd8ee4af334352657e75d52573326f4", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/Munge.php": "fa00252008e75d64a09ad2483812c31b", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter/SafeIframe.php": "6c8e3a53165bb2a81077d195843368ac", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIFilter.php": "0b87fe2090bd8f5dbae706a90d454c21", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIParser.php": "ba6ffbeaf6c053c17746ea17da37a9ae", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/data.php": "3afe350fb73999d1cc9f28a14a838d34", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/file.php": "2318fecdc41632ec5ffe981d28dffd32", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/ftp.php": "640130d7af5a37e36188ee60db965836", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/http.php": "7799e8f35b8dcff5a7ece8587b0e5592", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/https.php": "1925abd37b900c97e05383adca2c070f", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/mailto.php": "63ab0c48b2d4d7bad88f3fa59f81f805", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/news.php": "cbe3a1005253bc23584b286e246db7d7", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/nntp.php": "b1c0862120423c41579476540becfa69", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme/tel.php": "796d76615ff000c246e029a0a98a3dba", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/URIScheme.php": "8193609328daa3fdfe60639c499048da", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/URISchemeRegistry.php": "b6fc83102e8e6dbf564cd44b0e44b626", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/UnitConverter.php": "a8c44da0f46602532a4405d48beff00d", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/VarParser/Flexible.php": "1a41cd949a3575b822e19ad46f1b89ef", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/VarParser/Native.php": "19873ef7ac91b6c47083af60b0347811", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/VarParser.php": "5ca0697f15aa136a9177c0d55c8f9ea0", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/VarParserException.php": "8b1819c0ed397d313e5c76b062e6264d", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier/Zipper.php": "c3ac8d7e46f252218597224376434bb0", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier.auto.php": "0f6dba2689f471c382240c8d2d7892ba", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier.autoload-legacy.php": "e87240c03a5e029f61242c45d092395e", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier.autoload.php": "bb9990744be49bb4fd555413bb9244b2", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier.composer.php": "2ad82b7a50a5c15aa9858bdbb9ff6521", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier.func.php": "863d2cfbb3903516f0410710baca6686", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier.includes.php": "2d5596d522f0898869fd70ad4af792b9", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier.kses.php": "8f9b8b66e4b09efbb50b3825110b2a59", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier.path.php": "5a6eedd494dd20c8579e2a9d39809d5b", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier.php": "16b19daee70a8141362f27eeaf2bca53", - "vendor/ezyang/htmlpurifier/library/HTMLPurifier.safe-includes.php": "10bc9c35759059db9b79a5fce375a786", - "vendor/fastknife/ajcaptcha/src/Domain/Factory.php": "0646bd9cf56525d6ae4f9c00343aa4ab", - "vendor/fastknife/ajcaptcha/src/Domain/Logic/BaseData.php": "977312fd9d4ea7a9767d82c16ce0f7fc", - "vendor/fastknife/ajcaptcha/src/Domain/Logic/BaseImage.php": "c331d3f0553804387f0705e62913e8fd", - "vendor/fastknife/ajcaptcha/src/Domain/Logic/BlockData.php": "b6d4c7add22fdb2df1e863aeda5d90e7", - "vendor/fastknife/ajcaptcha/src/Domain/Logic/BlockImage.php": "aa2d18f5f301d76635f0273045f22978", - "vendor/fastknife/ajcaptcha/src/Domain/Logic/Cache.php": "0f31c958eea01cdfad75974f67e37bf3", - "vendor/fastknife/ajcaptcha/src/Domain/Logic/WordData.php": "e74a6a9df290e90692a81a357f0696bd", - "vendor/fastknife/ajcaptcha/src/Domain/Logic/WordImage.php": "42917d196ee7905e6f9283078f17b59b", - "vendor/fastknife/ajcaptcha/src/Domain/Vo/BackgroundVo.php": "ed59b3f3e90ae886547719e18a22b8b5", - "vendor/fastknife/ajcaptcha/src/Domain/Vo/ImageVo.php": "7825385c9fd48735c7565deb6fc33ed2", - "vendor/fastknife/ajcaptcha/src/Domain/Vo/OffsetVo.php": "a9c48e684fff7f176c22a7cc81983a5f", - "vendor/fastknife/ajcaptcha/src/Domain/Vo/PointVo.php": "98a10e8889c25e35eee7018426e0c09f", - "vendor/fastknife/ajcaptcha/src/Domain/Vo/TemplateVo.php": "9ebd6a157b64b9fd48e016eedd7023d8", - "vendor/fastknife/ajcaptcha/src/Exception/BlockException.php": "f1ab7b551952fb3e5c55500d31ebb335", - "vendor/fastknife/ajcaptcha/src/Exception/ParamException.php": "5bb4dcbb5846cdf0b621b75fc8dc6905", - "vendor/fastknife/ajcaptcha/src/Exception/WordException.php": "f560c1d43d5397db2f64c12936726ad8", - "vendor/fastknife/ajcaptcha/src/Service/BlockPuzzleCaptchaService.php": "40d4d84e0b95279076b9c85a7d58de5d", - "vendor/fastknife/ajcaptcha/src/Service/ClickWordCaptchaService.php": "9af1a4f16337ad55ae36c49603893d5b", - "vendor/fastknife/ajcaptcha/src/Service/Service.php": "72f84023f4c39364a51ef81ef036ab9d", - "vendor/fastknife/ajcaptcha/src/Utils/AesUtils.php": "b4f2445d806a02ab333edcc057a0730c", - "vendor/fastknife/ajcaptcha/src/Utils/CacheUtils.php": "03617ccced297c281490928fd14ae0d9", - "vendor/fastknife/ajcaptcha/src/Utils/MathUtils.php": "163ff06c0539a8806f0661959132dd35", - "vendor/fastknife/ajcaptcha/src/Utils/RandomUtils.php": "d9cae04c4d2cec2aa8e6db65888acc02", - "vendor/fastknife/ajcaptcha/src/config.php": "c3327adff0d5e89b26d889db8f4910e2", - "vendor/fastknife/ajcaptcha/test/BlockPuzzleController.php": "9d5325211bde49eba936638a8b70e66a", - "vendor/fastknife/ajcaptcha/test/ClickWordController.php": "edfa1ccf51e9793ce2e32b52db89acbf", - "vendor/fastknife/ajcaptcha/test/autoload.php": "0da636ec775e42ac282d0b5a3ee1ab62", - "vendor/fastknife/ajcaptcha/test/check.php": "646b42f7c6ee504b561b75a2d9b5e88d", - "vendor/fastknife/ajcaptcha/test/get.php": "0bf25900c27eaa3d09315a76182a86dc", - "vendor/fastknife/ajcaptcha/test/laravel/IndexController.php": "3db138e1647008cc72cbee2e58f4b732", - "vendor/fastknife/ajcaptcha/test/laravel/captcha.php": "d877a5b97879d5765e28ac0e38125b43", - "vendor/fastknife/ajcaptcha/test/testAes.php": "ccfbc9ba11076e3caae655ee8898bae4", - "vendor/fastknife/ajcaptcha/test/testCache.php": "be7a41edf603a9e7624a5b6934503b8e", - "vendor/fastknife/ajcaptcha/test/testImage.php": "6c23dcc55a4d7fa4434b7beb61e2c1fd", - "vendor/fastknife/ajcaptcha/test/thinkphp/Index.php": "61c91181f8ad256b71f377ba7a858344", - "vendor/fastknife/ajcaptcha/test/thinkphp/captcha.php": "9e69019b6d58a98e9aebd1b2ca7773cf", - "vendor/fastknife/ajcaptcha/test/verification.php": "409f8c1ed202b15492daf725ebbcc4ec", - "vendor/firebase/php-jwt/src/BeforeValidException.php": "28f7fb0e1517e8c99aa25a5293301060", - "vendor/firebase/php-jwt/src/ExpiredException.php": "616f62fe19bc88e399659284467d6dae", - "vendor/firebase/php-jwt/src/JWK.php": "56fc0e4229635b887695e0c253b6b345", - "vendor/firebase/php-jwt/src/JWT.php": "519e60415c4d4378949f1501aa605a44", - "vendor/firebase/php-jwt/src/Key.php": "8583eea03610646dd98478df80f6ee58", - "vendor/firebase/php-jwt/src/SignatureInvalidException.php": "564cc0fdae693e059c144db882205dee", - "vendor/guzzlehttp/command/src/Command.php": "d018dac402f8122b47490f9f2697f192", - "vendor/guzzlehttp/command/src/CommandInterface.php": "036a6b4b4015c56fe416ce27975440fa", - "vendor/guzzlehttp/command/src/Exception/CommandClientException.php": "24e95664f5fa914d6ebf1a689de34c95", - "vendor/guzzlehttp/command/src/Exception/CommandException.php": "15274cf8a19559787fed0673f9f275f3", - "vendor/guzzlehttp/command/src/Exception/CommandServerException.php": "588645616a623dfdf2c5e65e04c408aa", - "vendor/guzzlehttp/command/src/HasDataTrait.php": "c280db67f29e289a83e52f69d68c4acd", - "vendor/guzzlehttp/command/src/Result.php": "80c17260443544f9eac696374d9a6782", - "vendor/guzzlehttp/command/src/ResultInterface.php": "724150ea5cadaab878655ccfcc7dbf57", - "vendor/guzzlehttp/command/src/ServiceClient.php": "81bdd773243a14592dccc976a0186df0", - "vendor/guzzlehttp/command/src/ServiceClientInterface.php": "2006993533a6e74cd145aa7ed1355b28", - "vendor/guzzlehttp/command/src/ToArrayInterface.php": "17c87578a19bcd26b314bc40d65e5d3d", - "vendor/guzzlehttp/guzzle/src/BodySummarizer.php": "b129b9f437e5cea33b016a119f67f6e8", - "vendor/guzzlehttp/guzzle/src/BodySummarizerInterface.php": "2e7a643fd4dafcbbd68ee78bc95017c7", - "vendor/guzzlehttp/guzzle/src/Client.php": "18fe357ea023518733355341375d892e", - "vendor/guzzlehttp/guzzle/src/ClientInterface.php": "7bf1f2e2b8601759aa24cc8bd7cf445a", - "vendor/guzzlehttp/guzzle/src/ClientTrait.php": "ec374db7c7e2b607f9ae344c386792bf", - "vendor/guzzlehttp/guzzle/src/Cookie/CookieJar.php": "5ec8be054129219e020ae59bd6303275", - "vendor/guzzlehttp/guzzle/src/Cookie/CookieJarInterface.php": "a7b6e1da39e10f65519efa846b675a71", - "vendor/guzzlehttp/guzzle/src/Cookie/FileCookieJar.php": "89389c49e3bd822935491b36938ae8d6", - "vendor/guzzlehttp/guzzle/src/Cookie/SessionCookieJar.php": "5e3eda0ccd88b0e3b9c51835e5c8b32e", - "vendor/guzzlehttp/guzzle/src/Cookie/SetCookie.php": "583fc5f00b76a21475d745b399c2c1d9", - "vendor/guzzlehttp/guzzle/src/Exception/BadResponseException.php": "092ba3020946f21dc104d60b1f2b6124", - "vendor/guzzlehttp/guzzle/src/Exception/ClientException.php": "bd71865f36eae459c4a030d04be5a14e", - "vendor/guzzlehttp/guzzle/src/Exception/ConnectException.php": "18f7073ff82e475c18a12fc8dca544c1", - "vendor/guzzlehttp/guzzle/src/Exception/GuzzleException.php": "0aef70dd9799b19636e5f115c73d3092", - "vendor/guzzlehttp/guzzle/src/Exception/InvalidArgumentException.php": "8e5b4860cf34750f27d8631ddc46731f", - "vendor/guzzlehttp/guzzle/src/Exception/RequestException.php": "c22e86d3ce326bb0d5b4a26431d197f4", - "vendor/guzzlehttp/guzzle/src/Exception/ServerException.php": "4a75fbf0f7667c4898157e4d15aad9d6", - "vendor/guzzlehttp/guzzle/src/Exception/TooManyRedirectsException.php": "76e07f3360e0f3f10daeb197cf6fc57f", - "vendor/guzzlehttp/guzzle/src/Exception/TransferException.php": "8f77b97ec1cd12524e3f33d09ec3ddf7", - "vendor/guzzlehttp/guzzle/src/Handler/CurlFactory.php": "94b6026fbfe5ffd203241d5e7e6f7062", - "vendor/guzzlehttp/guzzle/src/Handler/CurlFactoryInterface.php": "13cf6a330a446702fbd6013b2ceb7459", - "vendor/guzzlehttp/guzzle/src/Handler/CurlHandler.php": "36075376b482790ca87630fd36bf41e9", - "vendor/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php": "40c0aabba0e6dc06a2ac906b7374a34a", - "vendor/guzzlehttp/guzzle/src/Handler/EasyHandle.php": "d2ea29833ea39aeb96e5390ae5b9569c", - "vendor/guzzlehttp/guzzle/src/Handler/HeaderProcessor.php": "1c395f2b2992d373b58b7184d52d12d2", - "vendor/guzzlehttp/guzzle/src/Handler/MockHandler.php": "37dac153ec8d7931cbc1cea88538ad4c", - "vendor/guzzlehttp/guzzle/src/Handler/Proxy.php": "f65269fbb4bd98af6da76d01d3e2569f", - "vendor/guzzlehttp/guzzle/src/Handler/StreamHandler.php": "11fd3ac08b98a2555913b30dc2facc27", - "vendor/guzzlehttp/guzzle/src/HandlerStack.php": "1b004bc76a5d2d9a4fe0d085cddd079a", - "vendor/guzzlehttp/guzzle/src/MessageFormatter.php": "9ea065b7faf8efa3c47520a20d4c1299", - "vendor/guzzlehttp/guzzle/src/MessageFormatterInterface.php": "df02ad57f894909ce3e32e46382a9440", - "vendor/guzzlehttp/guzzle/src/Middleware.php": "a77a21aecd6d00f5af4f7854c224e31a", - "vendor/guzzlehttp/guzzle/src/Pool.php": "c6c0c52d694f67111d48180d1df94c2e", - "vendor/guzzlehttp/guzzle/src/PrepareBodyMiddleware.php": "12b8e3bc48ab0a2565645e00fdfe55c2", - "vendor/guzzlehttp/guzzle/src/RedirectMiddleware.php": "9328650344d789ce452f9578bf05a671", - "vendor/guzzlehttp/guzzle/src/RequestOptions.php": "5708d52e0a32c247434c0fb2a7fe12cc", - "vendor/guzzlehttp/guzzle/src/RetryMiddleware.php": "eeea23a0c5267965ebabc3a4df4c0849", - "vendor/guzzlehttp/guzzle/src/TransferStats.php": "fefd47ea6ee2e8331dbbfc667c204528", - "vendor/guzzlehttp/guzzle/src/Utils.php": "41161839480993dbe97ae57ef462f963", - "vendor/guzzlehttp/guzzle/src/functions.php": "f7afb85234ccb05bb31b861d9e91dcbc", - "vendor/guzzlehttp/guzzle/src/functions_include.php": "ccc9e7252d9c55ff6f372cdbb2da35fc", - "vendor/guzzlehttp/guzzle-services/src/Description.php": "43de09ad96779661a2350aa2eae92545", - "vendor/guzzlehttp/guzzle-services/src/DescriptionInterface.php": "8983ccaccf88616e91035086989b5e06", - "vendor/guzzlehttp/guzzle-services/src/Deserializer.php": "629458688b21d9cde05b74681c82c03b", - "vendor/guzzlehttp/guzzle-services/src/GuzzleClient.php": "fe38c1b63f3b361cf28c51a8dc5dcb3e", - "vendor/guzzlehttp/guzzle-services/src/Handler/ValidatedDescriptionHandler.php": "c85f05472cb5a13fc5e320b476618b11", - "vendor/guzzlehttp/guzzle-services/src/Operation.php": "28b0fb7aa46ca0f7b54b34c00dcb772c", - "vendor/guzzlehttp/guzzle-services/src/Parameter.php": "cfafbc5914703bd45332a8e76e23bcf9", - "vendor/guzzlehttp/guzzle-services/src/QuerySerializer/QuerySerializerInterface.php": "366624b41f4e2233aceb416d02a8ebfc", - "vendor/guzzlehttp/guzzle-services/src/QuerySerializer/Rfc3986Serializer.php": "26c24c44dd06361f87b83c0f3b4b9be0", - "vendor/guzzlehttp/guzzle-services/src/RequestLocation/AbstractLocation.php": "fcb90eb8f6d62d98961289ce77d21421", - "vendor/guzzlehttp/guzzle-services/src/RequestLocation/BodyLocation.php": "23a8b95445af4e8ad313d9ac9d83da7c", - "vendor/guzzlehttp/guzzle-services/src/RequestLocation/FormParamLocation.php": "3c7e91ef38efb0173913e6587343884b", - "vendor/guzzlehttp/guzzle-services/src/RequestLocation/HeaderLocation.php": "5721b4faca2de4aa88aae4e8ea47e852", - "vendor/guzzlehttp/guzzle-services/src/RequestLocation/JsonLocation.php": "d4ff2347c1291b21474e0e3cf7ab68b4", - "vendor/guzzlehttp/guzzle-services/src/RequestLocation/MultiPartLocation.php": "80e3627b322b7d0a8dcca6088560911a", - "vendor/guzzlehttp/guzzle-services/src/RequestLocation/QueryLocation.php": "ce05725581113d9d480c39c0502f4a31", - "vendor/guzzlehttp/guzzle-services/src/RequestLocation/RequestLocationInterface.php": "7bb06cc346b1e900f9b5bd271091d684", - "vendor/guzzlehttp/guzzle-services/src/RequestLocation/XmlLocation.php": "2dbfcc9dd0a6581d762e1e01cf350b0f", - "vendor/guzzlehttp/guzzle-services/src/ResponseLocation/AbstractLocation.php": "736b564bcfde2b6d9af59d405cd2ddd2", - "vendor/guzzlehttp/guzzle-services/src/ResponseLocation/BodyLocation.php": "92d0fafb2ed2806ae67a7e12d4a51e14", - "vendor/guzzlehttp/guzzle-services/src/ResponseLocation/HeaderLocation.php": "4b2defd073be31b963ec0005ac9a01c4", - "vendor/guzzlehttp/guzzle-services/src/ResponseLocation/JsonLocation.php": "1e65bd942e0b0d03ecdaa9b77618a9c6", - "vendor/guzzlehttp/guzzle-services/src/ResponseLocation/ReasonPhraseLocation.php": "48f00194219a4a3c91000e83ea8331b1", - "vendor/guzzlehttp/guzzle-services/src/ResponseLocation/ResponseLocationInterface.php": "8b74303bb2678b6254442f163c26d45b", - "vendor/guzzlehttp/guzzle-services/src/ResponseLocation/StatusCodeLocation.php": "3a08012442bb53bdf7104d32f4c12ba3", - "vendor/guzzlehttp/guzzle-services/src/ResponseLocation/XmlLocation.php": "6fd2ac1b2c6f842566488b70c0a9cb51", - "vendor/guzzlehttp/guzzle-services/src/SchemaFormatter.php": "b830352e90268c68d7aa0c209036482f", - "vendor/guzzlehttp/guzzle-services/src/SchemaValidator.php": "41dec7516fb7b3e506067f6c9b357aab", - "vendor/guzzlehttp/guzzle-services/src/Serializer.php": "90378233ec92dfd9900fad22b88b0dfc", - "vendor/guzzlehttp/promises/src/AggregateException.php": "87762026ba51c2fbfdb5136b8bfb33ed", - "vendor/guzzlehttp/promises/src/CancellationException.php": "7c33eb271eade33e4731c19487178189", - "vendor/guzzlehttp/promises/src/Coroutine.php": "58a48fc20bf6b22ae404b9d7b6a0a44a", - "vendor/guzzlehttp/promises/src/Create.php": "408d2119e8bd735158174e3a65b318e5", - "vendor/guzzlehttp/promises/src/Each.php": "b7d7cca8303abce13fde384c4ae53063", - "vendor/guzzlehttp/promises/src/EachPromise.php": "b884f3f5d972780fbcda9002340184f9", - "vendor/guzzlehttp/promises/src/FulfilledPromise.php": "fb9a5326d138b6db48c059ce0896d3ef", - "vendor/guzzlehttp/promises/src/Is.php": "b6a680742fdfafac933172d79974fdda", - "vendor/guzzlehttp/promises/src/Promise.php": "53446c32e4dfffde234d27965eda9ef1", - "vendor/guzzlehttp/promises/src/PromiseInterface.php": "a1c3c986cbaae1a23bddb9d23f049ef4", - "vendor/guzzlehttp/promises/src/PromisorInterface.php": "1de295cc1d9cf865cd6b388441af4032", - "vendor/guzzlehttp/promises/src/RejectedPromise.php": "68a78eaec669b24928a8f3bf198613d0", - "vendor/guzzlehttp/promises/src/RejectionException.php": "c73a95ae20b33c6f400e4d78fb0edf86", - "vendor/guzzlehttp/promises/src/TaskQueue.php": "5e7cbd48cae602ce1fc31a1c5a9129ab", - "vendor/guzzlehttp/promises/src/TaskQueueInterface.php": "6f68c4a5cbc69e7d1fb04ad2c6155ab1", - "vendor/guzzlehttp/promises/src/Utils.php": "a7859982e77851b59d6637916bee9e85", - "vendor/guzzlehttp/promises/src/functions.php": "3ea73a907bac512b98a23b3771219c2f", - "vendor/guzzlehttp/promises/src/functions_include.php": "f5cb9de3f9980feda6ea3341215bf7ac", - "vendor/guzzlehttp/psr7/src/AppendStream.php": "69d9e7d9b2a5d0971859e58bee65b75b", - "vendor/guzzlehttp/psr7/src/BufferStream.php": "fbd526081ff1f845e45444939c1cf076", - "vendor/guzzlehttp/psr7/src/CachingStream.php": "040dc5673e6775f3e147bfd17ceaa518", - "vendor/guzzlehttp/psr7/src/DroppingStream.php": "e54ea06e8af801260f8f7c1ef02dda53", - "vendor/guzzlehttp/psr7/src/Exception/MalformedUriException.php": "abcddc9de909da6d9c9539800c133bce", - "vendor/guzzlehttp/psr7/src/FnStream.php": "97204b40bfc9b920344896a0ef09dc7c", - "vendor/guzzlehttp/psr7/src/Header.php": "8415bd128d97e57340d2b3b8d4a55c64", - "vendor/guzzlehttp/psr7/src/HttpFactory.php": "efdafa95b1ff71ad44e20e18839bd732", - "vendor/guzzlehttp/psr7/src/InflateStream.php": "8b627028ba4dda5148e8e80894a41737", - "vendor/guzzlehttp/psr7/src/LazyOpenStream.php": "b4bae6d03ed28cc5aaa11e10bd1c20a1", - "vendor/guzzlehttp/psr7/src/LimitStream.php": "9eedc7b41823cf7011a9a782b8bd8347", - "vendor/guzzlehttp/psr7/src/Message.php": "7d4dfee53c919f6881621f49007624be", - "vendor/guzzlehttp/psr7/src/MessageTrait.php": "be441031aa16058a8164f1cf9a9860ba", - "vendor/guzzlehttp/psr7/src/MimeType.php": "b86e4547532d85604c55a84514a31a8e", - "vendor/guzzlehttp/psr7/src/MultipartStream.php": "d1b1bbfcb6587057b3df3d45f1c0bf8e", - "vendor/guzzlehttp/psr7/src/NoSeekStream.php": "be7eccffda2b5c6eb7abcc5d539d5100", - "vendor/guzzlehttp/psr7/src/PumpStream.php": "c353d81911c6813214eb771287c8d528", - "vendor/guzzlehttp/psr7/src/Query.php": "642e7785e3e87444b68d1aaeee057918", - "vendor/guzzlehttp/psr7/src/Request.php": "e8c005ac02154da4e572f25700e85eb8", - "vendor/guzzlehttp/psr7/src/Response.php": "275604696b1e4f8cf398df74e9e8933f", - "vendor/guzzlehttp/psr7/src/Rfc7230.php": "255ccdedb66492c5a39e0f0130269a93", - "vendor/guzzlehttp/psr7/src/ServerRequest.php": "95f6e1f9e5e86234995e36032d3ee249", - "vendor/guzzlehttp/psr7/src/Stream.php": "ff47d07b84dcc2071f712ccb0a349a7e", - "vendor/guzzlehttp/psr7/src/StreamDecoratorTrait.php": "872d67a1c27e679b592df1bffa566795", - "vendor/guzzlehttp/psr7/src/StreamWrapper.php": "2e9c30c92414d219d6bfdee0d903ba59", - "vendor/guzzlehttp/psr7/src/UploadedFile.php": "6ab404b7aba99abaaba308e94754fa76", - "vendor/guzzlehttp/psr7/src/Uri.php": "dc741423fd9bd06a90099d0ef77d9afa", - "vendor/guzzlehttp/psr7/src/UriComparator.php": "e2b48e5aa2d22614a015290b40ee7bf7", - "vendor/guzzlehttp/psr7/src/UriNormalizer.php": "5de7fb4b9a513c57602e85052962be37", - "vendor/guzzlehttp/psr7/src/UriResolver.php": "1893d6b7b1358642d47946dbe1207211", - "vendor/guzzlehttp/psr7/src/Utils.php": "575dc3076f6349338a1f6ad28cfb4a41", - "vendor/guzzlehttp/uri-template/src/UriTemplate.php": "8a727606ed3f3861bf3b2cf0942bdc69", - "vendor/hyperf/context/src/ApplicationContext.php": "b47e2458f14e96ee82e9f04e3f1ce1d2", - "vendor/hyperf/context/src/Context.php": "aedf4990216ec62e1920a283d65004aa", - "vendor/hyperf/context/src/Traits/CoroutineProxy.php": "01c6d7d8620b67d93c027456af6ed92c", - "vendor/hyperf/contract/src/ApplicationInterface.php": "1f5ae7afb20d581660caa24295181c1b", - "vendor/hyperf/contract/src/Arrayable.php": "417667157793a62ee549d8de7129b7fe", - "vendor/hyperf/contract/src/Castable.php": "218d4eecef5564e2b9bd0d7cd144733f", - "vendor/hyperf/contract/src/CastsAttributes.php": "a551d5413fefd8a274ae6b84a387fea4", - "vendor/hyperf/contract/src/CastsInboundAttributes.php": "9ea054d349f81b8c0c4b280935475601", - "vendor/hyperf/contract/src/CompressInterface.php": "8ec532dd9af4daae26cf6b44693c3fcb", - "vendor/hyperf/contract/src/ConfigInterface.php": "2a26c4bb681943e536703753fcb7b0b2", - "vendor/hyperf/contract/src/ConnectionInterface.php": "d401ea9302d20810735ed87fa0e770e1", - "vendor/hyperf/contract/src/ContainerInterface.php": "7caf7970a5a71efdeca79cdf23869b99", - "vendor/hyperf/contract/src/DispatcherInterface.php": "157992f14dcfac8fb9beafa94531eb41", - "vendor/hyperf/contract/src/FrequencyInterface.php": "276b6dba8a5836fe84ef12acf5e8a4e4", - "vendor/hyperf/contract/src/IPReaderInterface.php": "ec790c5137fb75ddf147b30cf6c5d5ae", - "vendor/hyperf/contract/src/IdGeneratorInterface.php": "d0fbf951f68d64a9d720b938a4067156", - "vendor/hyperf/contract/src/JsonDeSerializable.php": "5cc4114ccf6d87750dcfb631a81a0862", - "vendor/hyperf/contract/src/Jsonable.php": "0722c3b7e695448540b57f6e59142080", - "vendor/hyperf/contract/src/LengthAwarePaginatorInterface.php": "a495de6b280662e4aa877ad1a153c748", - "vendor/hyperf/contract/src/MessageBag.php": "79e8a2c6b529f97bb4fe279610cf9c8a", - "vendor/hyperf/contract/src/MessageProvider.php": "9d6b657e82e3bebed921e508cce4ac31", - "vendor/hyperf/contract/src/MiddlewareInitializerInterface.php": "9febbe1593bf3760e1d81c4735a2a025", - "vendor/hyperf/contract/src/NormalizerInterface.php": "ea665444ba79209672108f2fed5f1bdf", - "vendor/hyperf/contract/src/OnCloseInterface.php": "add9ec1781dc87aa692eabb5369a16d3", - "vendor/hyperf/contract/src/OnHandShakeInterface.php": "7c473555d52ceb99df5ab5e428d21fa8", - "vendor/hyperf/contract/src/OnMessageInterface.php": "dec28bed7fa52f8987294c8691c13e08", - "vendor/hyperf/contract/src/OnOpenInterface.php": "43f36a027ca5184bb8212fdb46bab1b3", - "vendor/hyperf/contract/src/OnPacketInterface.php": "3d390858082a3ddbe8476e9c837528a8", - "vendor/hyperf/contract/src/OnReceiveInterface.php": "1d58303858b314323e663f6aefa4f390", - "vendor/hyperf/contract/src/OnRequestInterface.php": "30c83021896d9911b76ed6f58e6aa104", - "vendor/hyperf/contract/src/PackerInterface.php": "10ab34be2c2cda80c472a57cf1fa3c8e", - "vendor/hyperf/contract/src/PaginatorInterface.php": "2f1be854e149d68a61304b54a67ef161", - "vendor/hyperf/contract/src/PoolInterface.php": "20057f6058225d2c9df763b372a1ff84", - "vendor/hyperf/contract/src/PoolOptionInterface.php": "a7227a81afb4ecbb60169e913ea9c2d9", - "vendor/hyperf/contract/src/ProcessInterface.php": "5e2ded4d847e0b04d29bf79d82179d72", - "vendor/hyperf/contract/src/ResponseEmitterInterface.php": "290a636ba00624aeb26ed04271dd40f4", - "vendor/hyperf/contract/src/SessionInterface.php": "3074360cc09e86baa4aff663948e3cfe", - "vendor/hyperf/contract/src/StdoutLoggerInterface.php": "1f7fae2ccf7fb79043653178d78cba90", - "vendor/hyperf/contract/src/Synchronized.php": "d20ee46660f7c67cad236201f256e3e3", - "vendor/hyperf/contract/src/TranslatorInterface.php": "a337a24ee74a752daaf71a57bc9319b6", - "vendor/hyperf/contract/src/TranslatorLoaderInterface.php": "65ecfd7ced2ccbacc5f3b7307696700a", - "vendor/hyperf/contract/src/UnCompressInterface.php": "c33973e300180a4de8c31097778ea912", - "vendor/hyperf/contract/src/ValidatorInterface.php": "a525febcd1b68db31d64dd3a32289049", - "vendor/hyperf/contract/src/Xmlable.php": "7e87bd37023f8d494214eefdad839162", - "vendor/hyperf/engine/.php-cs-fixer.php": "1d7c3b5604aeb397173f474b423798dd", - "vendor/hyperf/engine/.phpstorm.meta.php": "09bed3fa11d6b89a7520e04412e1c182", - "vendor/hyperf/engine/src/Channel.php": "0230bdb9148d4dd2fc2445a933d9ee0d", - "vendor/hyperf/engine/src/ConfigProvider.php": "3fffdcc5ddfc8d965ed12df44941d92c", - "vendor/hyperf/engine/src/Constant/SocketType.php": "dd17a410621dfb4ce426ffc3f9d4aca2", - "vendor/hyperf/engine/src/Constant.php": "ffb6aeaecf12e46cf64e5744964e31c4", - "vendor/hyperf/engine/src/Coroutine.php": "19b7f966d532b906f4ceb4c1ceac74ba", - "vendor/hyperf/engine/src/DefaultOption.php": "6c4ef926fcca79a896c87129bbf5b656", - "vendor/hyperf/engine/src/Exception/CoroutineDestroyedException.php": "9c321ae86465ea82b62ed2aff971d422", - "vendor/hyperf/engine/src/Exception/HttpClientException.php": "adf2d60be0a3e8949f02188167191fbd", - "vendor/hyperf/engine/src/Exception/InvalidArgumentException.php": "e7383a87d4cf67ead3eb4675e19856a0", - "vendor/hyperf/engine/src/Exception/RunningInNonCoroutineException.php": "f126fbbcf71db1d588aa0346aa7153f9", - "vendor/hyperf/engine/src/Exception/RuntimeException.php": "9c4e2b942ffa7d016ca888563df84838", - "vendor/hyperf/engine/src/Exception/SocketClosedException.php": "6bb1cbad05283bbccf39523d7960d57e", - "vendor/hyperf/engine/src/Exception/SocketConnectException.php": "a1c3b1777da8f522556e9f22d37db021", - "vendor/hyperf/engine/src/Exception/SocketTimeoutException.php": "addd15ea275ff8d971a4f8d1d6f7b7e0", - "vendor/hyperf/engine/src/Extension.php": "2b15ca96b28e53fd99fc5c5e0595931a", - "vendor/hyperf/engine/src/Functions.php": "2a85092ce86a06785522986fa072a4e0", - "vendor/hyperf/engine/src/Http/Client.php": "59dde4144ffcdf2d4b5a0fde65539b81", - "vendor/hyperf/engine/src/Http/EventStream.php": "4088761eb5181ce908dcba58081e8d64", - "vendor/hyperf/engine/src/Http/FdGetter.php": "2a9b602c12d9eb970f62ba76eb699a26", - "vendor/hyperf/engine/src/Http/RawResponse.php": "4f7ef13672f032e324cc2d74dea7673b", - "vendor/hyperf/engine/src/Http/Server.php": "651cddf3d86616a774be4e018cfdd55b", - "vendor/hyperf/engine/src/Http/ServerFactory.php": "19dbc4ef4565203039865ba0009f2fe2", - "vendor/hyperf/engine/src/Http/Stream.php": "ed81c0c6d158a3176b81e8c7682efacc", - "vendor/hyperf/engine/src/Http/V2/Client.php": "eb7287333346c6461ccd9916b2b7a34c", - "vendor/hyperf/engine/src/Http/V2/ClientFactory.php": "7854839cf11ce577cb210fb08d7ac107", - "vendor/hyperf/engine/src/Http/V2/Request.php": "dc39fb3c8009b8bd6d7f4ac8ce405130", - "vendor/hyperf/engine/src/Http/V2/Response.php": "71b2f82759b429de3de7b33d5d2ff7ca", - "vendor/hyperf/engine/src/Http/WritableConnection.php": "11534d236e1689cfe8a3a2c8ce062d03", - "vendor/hyperf/engine/src/ResponseEmitter.php": "ff0336e736c9c65db9affd1f7440bb77", - "vendor/hyperf/engine/src/SafeSocket.php": "3b9fee6555c93be0c2fe1bb0430e30d6", - "vendor/hyperf/engine/src/Signal.php": "ea01bf1ca18955f9dc83b5695b50587b", - "vendor/hyperf/engine/src/Socket/SocketFactory.php": "28f641902a55392ea6bd710e4d7e27a5", - "vendor/hyperf/engine/src/Socket/SocketOption.php": "fe0b213f506e394d572bab7d922ffba8", - "vendor/hyperf/engine/src/Socket.php": "67d5e54471f0496a93817fdcafad7bd0", - "vendor/hyperf/engine/src/WebSocket/Frame.php": "b6c4e651bc8c7baf6724c7ae72059e33", - "vendor/hyperf/engine/src/WebSocket/Opcode.php": "2bd380e9a6e07aa5c8efc2f177071e89", - "vendor/hyperf/engine/src/WebSocket/Response.php": "108c661c94c065901304c94f40e253f1", - "vendor/hyperf/engine/src/WebSocket/WebSocket.php": "be974f9153dd392448d5e023762b183e", - "vendor/hyperf/engine-contract/.php-cs-fixer.php": "1d2aaa0fef06c14b79df7caabddc7dbf", - "vendor/hyperf/engine-contract/.phpstorm.meta.php": "09bed3fa11d6b89a7520e04412e1c182", - "vendor/hyperf/engine-contract/src/ChannelInterface.php": "f967b4dbfdb4c887182b52f3725b78f4", - "vendor/hyperf/engine-contract/src/CoroutineInterface.php": "20613c2a456fc8a954063c78f3b690e8", - "vendor/hyperf/engine-contract/src/DefaultOptionInterface.php": "0cf8657f6d25efa057b4dcda1bbcfe60", - "vendor/hyperf/engine-contract/src/Http/ClientInterface.php": "32ebb08dfc41400ed84d743559d09840", - "vendor/hyperf/engine-contract/src/Http/RawResponseInterface.php": "fd586f45c46cf3b588375b2317c8a949", - "vendor/hyperf/engine-contract/src/Http/ServerFactoryInterface.php": "38e13784b8c6761c5f549b621aff53aa", - "vendor/hyperf/engine-contract/src/Http/ServerInterface.php": "27a1784f27d79e0cd6957d89c1fa8b47", - "vendor/hyperf/engine-contract/src/Http/V2/ClientFactoryInterface.php": "414989c2c5a13fd5473581b3653672b6", - "vendor/hyperf/engine-contract/src/Http/V2/ClientInterface.php": "54e5f7e68ef10b4641fbacbaf95c2622", - "vendor/hyperf/engine-contract/src/Http/V2/RequestInterface.php": "73717d7aa8b8b3e10ee64bfcdbf22942", - "vendor/hyperf/engine-contract/src/Http/V2/ResponseInterface.php": "fc7ada97b443825d32a8749bd5d14191", - "vendor/hyperf/engine-contract/src/Http/Writable.php": "750621fbc2f0a275f69c07810a85fd19", - "vendor/hyperf/engine-contract/src/ResponseEmitterInterface.php": "4f7d1f3da3e432625b12a3a34bed198b", - "vendor/hyperf/engine-contract/src/SignalInterface.php": "085b19487485a07f2b33e4ca6b991224", - "vendor/hyperf/engine-contract/src/Socket/SocketFactoryInterface.php": "df7235c07c2a6d8077aec5280e4c9fa6", - "vendor/hyperf/engine-contract/src/Socket/SocketOptionInterface.php": "f8534c89d359d7a5fac8f52c3dc8d980", - "vendor/hyperf/engine-contract/src/SocketInterface.php": "fc2bdfd5711d2bf4f24f18f6be650620", - "vendor/hyperf/engine-contract/src/WebSocket/FrameInterface.php": "839d4d33bcdda5f7db8372f16d2b3a33", - "vendor/hyperf/engine-contract/src/WebSocket/ResponseInterface.php": "2bba20c41d840ee1fb0d996eaea6dc67", - "vendor/hyperf/engine-contract/src/WebSocket/WebSocketInterface.php": "9ea8668d7fac1d63b41c1bcf2e207105", - "vendor/hyperf/pimple/.php-cs-fixer.php": "2a54dbdeb74997793bf4c5fd7a5a59e9", - "vendor/hyperf/pimple/.phpstorm.meta.php": "09bed3fa11d6b89a7520e04412e1c182", - "vendor/hyperf/pimple/src/ConfigProvider.php": "475bd9aeab83fbc880b1725dfe2a0120", - "vendor/hyperf/pimple/src/Container.php": "e01a54da148b7aeba44e559cab39cda9", - "vendor/hyperf/pimple/src/ContainerFactory.php": "bead98b2ec6f67fcef03f298ceaa43d9", - "vendor/hyperf/pimple/src/Exception/InvalidDefinitionException.php": "54bab63d25f076a8a06f5d647beba715", - "vendor/hyperf/pimple/src/Exception/NotFoundException.php": "658bcb96d83b224a0e95b9ab4463eb3d", - "vendor/hyperf/pimple/src/Exception/NotSupportException.php": "fbfe8b8489a2789d7a163070bcbf7be5", - "vendor/hyperf/pimple/src/ProviderInterface.php": "6d1d9a8219a2246c1b2b4146843466cd", - "vendor/intervention/image/src/Intervention/Image/AbstractColor.php": "49b8894659de000ab614557fa951154d", - "vendor/intervention/image/src/Intervention/Image/AbstractDecoder.php": "044b8054a08f22928c8576591a41bf43", - "vendor/intervention/image/src/Intervention/Image/AbstractDriver.php": "c2e4842d47a38d2fc9ba6dc0afb49c0a", - "vendor/intervention/image/src/Intervention/Image/AbstractEncoder.php": "17031695614df8c08db193f88a6d5db6", - "vendor/intervention/image/src/Intervention/Image/AbstractFont.php": "2bc2e04808d5fef850c9eae0d029ee78", - "vendor/intervention/image/src/Intervention/Image/AbstractShape.php": "e18f8db06f95b0d1ebea4ab18639ef6e", - "vendor/intervention/image/src/Intervention/Image/Commands/AbstractCommand.php": "57e19bf3d741aec7509db1cf1d0325d4", - "vendor/intervention/image/src/Intervention/Image/Commands/Argument.php": "f7fd8f2c235b3e42a39071e2684d8563", - "vendor/intervention/image/src/Intervention/Image/Commands/ChecksumCommand.php": "99fc9597853455c7002725cda0619bc3", - "vendor/intervention/image/src/Intervention/Image/Commands/CircleCommand.php": "d966ccba0cfc4b2cddaf5459552a1deb", - "vendor/intervention/image/src/Intervention/Image/Commands/EllipseCommand.php": "9a766ac0071052a2c6269b9f7b7d31bd", - "vendor/intervention/image/src/Intervention/Image/Commands/ExifCommand.php": "07b8ac860d358b62b0c9bb67037edce5", - "vendor/intervention/image/src/Intervention/Image/Commands/IptcCommand.php": "45a1c36c1bf05038ce458b22a1c47b44", - "vendor/intervention/image/src/Intervention/Image/Commands/LineCommand.php": "9fd97d8bfbb5cfb67fef055b60f4a269", - "vendor/intervention/image/src/Intervention/Image/Commands/OrientateCommand.php": "f184c7fb6f875eea62a77b616c82744e", - "vendor/intervention/image/src/Intervention/Image/Commands/PolygonCommand.php": "f1892c76282e4d5a18ef72c376b99e6a", - "vendor/intervention/image/src/Intervention/Image/Commands/PsrResponseCommand.php": "32038846c5848ad0a04207325ee7d548", - "vendor/intervention/image/src/Intervention/Image/Commands/RectangleCommand.php": "2cf9e311c53ced71340e21fcb64bb2c7", - "vendor/intervention/image/src/Intervention/Image/Commands/ResponseCommand.php": "9096a4f498cf5023d1b4dd3d14c651e6", - "vendor/intervention/image/src/Intervention/Image/Commands/StreamCommand.php": "bb4a17cc337e286dd499e45c2b8279eb", - "vendor/intervention/image/src/Intervention/Image/Commands/TextCommand.php": "af9e8ca7be5defd293d93ca54c9c9e00", - "vendor/intervention/image/src/Intervention/Image/Constraint.php": "88e3a75406faf0a53a6c5e5444f6c251", - "vendor/intervention/image/src/Intervention/Image/Exception/ImageException.php": "390580aa7f9b13830122ff65aaab62c8", - "vendor/intervention/image/src/Intervention/Image/Exception/InvalidArgumentException.php": "02df9d429d2782831dbb578f714b9ed8", - "vendor/intervention/image/src/Intervention/Image/Exception/MissingDependencyException.php": "ac54b69859f9ac4a9c8cd4dcaea8cacd", - "vendor/intervention/image/src/Intervention/Image/Exception/NotFoundException.php": "a05a1637a590b6978b5baf8397bd9eaf", - "vendor/intervention/image/src/Intervention/Image/Exception/NotReadableException.php": "4c16e4a6098182e98a18b783220fe10a", - "vendor/intervention/image/src/Intervention/Image/Exception/NotSupportedException.php": "892affbde1d933f63794a810e8b47cdc", - "vendor/intervention/image/src/Intervention/Image/Exception/NotWritableException.php": "b8a00845f9d69f5cc888274c72eb228c", - "vendor/intervention/image/src/Intervention/Image/Exception/RuntimeException.php": "6aa003745428464809bb6c1f5075b18f", - "vendor/intervention/image/src/Intervention/Image/Facades/Image.php": "c5266c7cecaf3aaf2a1d196782d7c21f", - "vendor/intervention/image/src/Intervention/Image/File.php": "2da030b0b39e59aea5a42e3a6d1671d6", - "vendor/intervention/image/src/Intervention/Image/Filters/DemoFilter.php": "63eca3b5577d9eb3dd89562b51136842", - "vendor/intervention/image/src/Intervention/Image/Filters/FilterInterface.php": "5f80af07f38e5cd760357366091d31f9", - "vendor/intervention/image/src/Intervention/Image/Gd/Color.php": "1e96376729af4a5c1370c20029b3f882", - "vendor/intervention/image/src/Intervention/Image/Gd/Commands/BackupCommand.php": "bf710a6c6389678afe7d83c6d98cbb05", - "vendor/intervention/image/src/Intervention/Image/Gd/Commands/BlurCommand.php": "8945befce98bb559a4ed35657682f141", - "vendor/intervention/image/src/Intervention/Image/Gd/Commands/BrightnessCommand.php": "46261735344151a0e3bf6471af6afc5f", - "vendor/intervention/image/src/Intervention/Image/Gd/Commands/ColorizeCommand.php": "ae2d7992186a4cc242aae3ba60468c6b", - "vendor/intervention/image/src/Intervention/Image/Gd/Commands/ContrastCommand.php": "4f6b08d27bd727df5ba166e395acc0de", - "vendor/intervention/image/src/Intervention/Image/Gd/Commands/CropCommand.php": "74929418bbb262292c0e8d764c86e7c1", - "vendor/intervention/image/src/Intervention/Image/Gd/Commands/DestroyCommand.php": "f6d162eb8e7fa70fec6a99d9566a7916", - "vendor/intervention/image/src/Intervention/Image/Gd/Commands/FillCommand.php": "79c05aecc79bfc9bc1e35b74c81c2261", - "vendor/intervention/image/src/Intervention/Image/Gd/Commands/FitCommand.php": "30c6a1fafebec5290d3b784a185d5e5e", - "vendor/intervention/image/src/Intervention/Image/Gd/Commands/FlipCommand.php": "ab403c4b3228acd51d49d060332d084a", - "vendor/intervention/image/src/Intervention/Image/Gd/Commands/GammaCommand.php": "7a524830d31ebf915d498dd2e83c3df6", - "vendor/intervention/image/src/Intervention/Image/Gd/Commands/GetSizeCommand.php": "e6b30e71d4eb164c82635022b4ac09af", - "vendor/intervention/image/src/Intervention/Image/Gd/Commands/GreyscaleCommand.php": "7dac1b04b06de60a9d1bef273a582a93", - "vendor/intervention/image/src/Intervention/Image/Gd/Commands/HeightenCommand.php": "e5b6d6dc3010b01acf4493c30162cd9b", - "vendor/intervention/image/src/Intervention/Image/Gd/Commands/InsertCommand.php": "300b0ff66f173337dd425edc0134c799", - "vendor/intervention/image/src/Intervention/Image/Gd/Commands/InterlaceCommand.php": "f395e52b10ded9ecf12a91c6a0bf94d5", - "vendor/intervention/image/src/Intervention/Image/Gd/Commands/InvertCommand.php": "414057aa4e009c4267e9ad8b888e905c", - "vendor/intervention/image/src/Intervention/Image/Gd/Commands/LimitColorsCommand.php": "d288f1ec6462b72653b0385fd9900c5e", - "vendor/intervention/image/src/Intervention/Image/Gd/Commands/MaskCommand.php": "9bbb82c0c2587d118b58bc750d7ed792", - "vendor/intervention/image/src/Intervention/Image/Gd/Commands/OpacityCommand.php": "24dcfe8a4bcfcfa622a24ee9335d7de5", - "vendor/intervention/image/src/Intervention/Image/Gd/Commands/PickColorCommand.php": "a31abae51eae0116ed0d5f258fc6f9a5", - "vendor/intervention/image/src/Intervention/Image/Gd/Commands/PixelCommand.php": "c0759a8e7643140c7f3d7eb847f1106a", - "vendor/intervention/image/src/Intervention/Image/Gd/Commands/PixelateCommand.php": "7be4be528bb39655d9839117be61df67", - "vendor/intervention/image/src/Intervention/Image/Gd/Commands/ResetCommand.php": "a65e18c000815a0823b25bed548eed70", - "vendor/intervention/image/src/Intervention/Image/Gd/Commands/ResizeCanvasCommand.php": "a101a5232272cab313c17a78813b0d15", - "vendor/intervention/image/src/Intervention/Image/Gd/Commands/ResizeCommand.php": "411cba1f0a702e0a7065ce9a890fa9d4", - "vendor/intervention/image/src/Intervention/Image/Gd/Commands/RotateCommand.php": "2ffbe9860f8574ef362eac4d311f3810", - "vendor/intervention/image/src/Intervention/Image/Gd/Commands/SharpenCommand.php": "60c383daa8130c8485d052ecd237a3f6", - "vendor/intervention/image/src/Intervention/Image/Gd/Commands/TrimCommand.php": "e878579db8f9e0add67d4bafa3490fd1", - "vendor/intervention/image/src/Intervention/Image/Gd/Commands/WidenCommand.php": "82fb6285eb47f2432858b4866603f7c4", - "vendor/intervention/image/src/Intervention/Image/Gd/Decoder.php": "d8d68688815bbe7a0b45dc75ccf2f0b1", - "vendor/intervention/image/src/Intervention/Image/Gd/Driver.php": "cd303334f8fc5249afe241b8b5a92abc", - "vendor/intervention/image/src/Intervention/Image/Gd/Encoder.php": "f66f54d739fd2ae2ed21a1353511cc3b", - "vendor/intervention/image/src/Intervention/Image/Gd/Font.php": "3d95d6997810c5359c8b3e7a73e5ba5c", - "vendor/intervention/image/src/Intervention/Image/Gd/Shapes/CircleShape.php": "45262ffae7a4d8e8e87a77ac865ac6f6", - "vendor/intervention/image/src/Intervention/Image/Gd/Shapes/EllipseShape.php": "21a09cb2f53872cf58809dcadefd09f0", - "vendor/intervention/image/src/Intervention/Image/Gd/Shapes/LineShape.php": "b8593342177ef2ec6ea3bf1837b15614", - "vendor/intervention/image/src/Intervention/Image/Gd/Shapes/PolygonShape.php": "5ef6025d9ac16010218a58f16cac3afa", - "vendor/intervention/image/src/Intervention/Image/Gd/Shapes/RectangleShape.php": "83ee2f3f63b5f2611ac2cc43a4a5b9d3", - "vendor/intervention/image/src/Intervention/Image/Image.php": "4c92821e04256790e741b219257a285d", - "vendor/intervention/image/src/Intervention/Image/ImageManager.php": "d3cc3d50a82e4147dc9ba6417e950116", - "vendor/intervention/image/src/Intervention/Image/ImageManagerStatic.php": "96dbfacaa4541ac69074a03f319d549e", - "vendor/intervention/image/src/Intervention/Image/ImageServiceProvider.php": "b6d269cd5c53f9315fa7c77c923986cb", - "vendor/intervention/image/src/Intervention/Image/ImageServiceProviderLaravel4.php": "496f05c590cd46dfbb4554e35b3006f5", - "vendor/intervention/image/src/Intervention/Image/ImageServiceProviderLaravelRecent.php": "26381391a5f7c8d8d5c33fb1112e253b", - "vendor/intervention/image/src/Intervention/Image/ImageServiceProviderLeague.php": "81d96524fbb9adf38145388b1414a1a3", - "vendor/intervention/image/src/Intervention/Image/ImageServiceProviderLumen.php": "f661de8dfb16be115f3940583843c87c", - "vendor/intervention/image/src/Intervention/Image/Imagick/Color.php": "19a6768fb15f1307ea84028a57c1a5aa", - "vendor/intervention/image/src/Intervention/Image/Imagick/Commands/BackupCommand.php": "3e879b64daaa0b1be8f81f5b0699f39f", - "vendor/intervention/image/src/Intervention/Image/Imagick/Commands/BlurCommand.php": "6a7083204aa762f05e56b5551f3b7cc5", - "vendor/intervention/image/src/Intervention/Image/Imagick/Commands/BrightnessCommand.php": "c32beba702b3086633e46e40813d85b0", - "vendor/intervention/image/src/Intervention/Image/Imagick/Commands/ColorizeCommand.php": "c5ad3090a8e9a5ed539f8e1998184e42", - "vendor/intervention/image/src/Intervention/Image/Imagick/Commands/ContrastCommand.php": "084ba56250052a8f7541c14966b3e80f", - "vendor/intervention/image/src/Intervention/Image/Imagick/Commands/CropCommand.php": "91fff2e30ea57bcfa908de88724eb829", - "vendor/intervention/image/src/Intervention/Image/Imagick/Commands/DestroyCommand.php": "aebcaa587ab4647946a50d919246a5d3", - "vendor/intervention/image/src/Intervention/Image/Imagick/Commands/ExifCommand.php": "ad825a38ef0c2cb7a3bb5586556e697d", - "vendor/intervention/image/src/Intervention/Image/Imagick/Commands/FillCommand.php": "0444166734b0b418aee8d6c4abd4d94e", - "vendor/intervention/image/src/Intervention/Image/Imagick/Commands/FitCommand.php": "fd9ddf4801ec3b1f76823ba69b648900", - "vendor/intervention/image/src/Intervention/Image/Imagick/Commands/FlipCommand.php": "afe87ae4a162afd4b09c50e1deda48b3", - "vendor/intervention/image/src/Intervention/Image/Imagick/Commands/GammaCommand.php": "d388a142c4ab1ec806d75b5e7c4db689", - "vendor/intervention/image/src/Intervention/Image/Imagick/Commands/GetSizeCommand.php": "5ea8040b3400f9f94460371e7987de45", - "vendor/intervention/image/src/Intervention/Image/Imagick/Commands/GreyscaleCommand.php": "d7bd091459b8dc3692fec4342cb5a488", - "vendor/intervention/image/src/Intervention/Image/Imagick/Commands/HeightenCommand.php": "68806255529bd7b94bfbc13fe1ce6b33", - "vendor/intervention/image/src/Intervention/Image/Imagick/Commands/InsertCommand.php": "066dc3555d9ad9f99434f43d9b16b237", - "vendor/intervention/image/src/Intervention/Image/Imagick/Commands/InterlaceCommand.php": "9b5fa02ed1f006362bead086008f03ee", - "vendor/intervention/image/src/Intervention/Image/Imagick/Commands/InvertCommand.php": "0f1740abcb7af7da5b130802958bb773", - "vendor/intervention/image/src/Intervention/Image/Imagick/Commands/LimitColorsCommand.php": "239c8e4291e230d008800644ac057037", - "vendor/intervention/image/src/Intervention/Image/Imagick/Commands/MaskCommand.php": "c8e65e573845edcbbaf8c37c1ee5c37a", - "vendor/intervention/image/src/Intervention/Image/Imagick/Commands/OpacityCommand.php": "6e257d9187d3e54268b882d205ae39dd", - "vendor/intervention/image/src/Intervention/Image/Imagick/Commands/PickColorCommand.php": "7e08303efcaab10884278bc44d52d4bb", - "vendor/intervention/image/src/Intervention/Image/Imagick/Commands/PixelCommand.php": "edeae3e151d47cf6758f702ade704eea", - "vendor/intervention/image/src/Intervention/Image/Imagick/Commands/PixelateCommand.php": "8a406dcf7c7fd88b40b30acf3bbe008a", - "vendor/intervention/image/src/Intervention/Image/Imagick/Commands/ResetCommand.php": "c2e8108ca52143edcaacd633ed97cef9", - "vendor/intervention/image/src/Intervention/Image/Imagick/Commands/ResizeCanvasCommand.php": "6254acd74ac8d63cb1cc552c5dcf1f21", - "vendor/intervention/image/src/Intervention/Image/Imagick/Commands/ResizeCommand.php": "47013b84cf29991df0bcf2bb13f229db", - "vendor/intervention/image/src/Intervention/Image/Imagick/Commands/RotateCommand.php": "09a728cb285e6b3be476e17cfb01bff3", - "vendor/intervention/image/src/Intervention/Image/Imagick/Commands/SharpenCommand.php": "a698c22c1985abecc5421f6c4a7664d5", - "vendor/intervention/image/src/Intervention/Image/Imagick/Commands/TrimCommand.php": "33fb0c1bef1c21c3c0ff79b2189aeaf4", - "vendor/intervention/image/src/Intervention/Image/Imagick/Commands/WidenCommand.php": "7417f8282681535e85d900c6356f94c9", - "vendor/intervention/image/src/Intervention/Image/Imagick/Decoder.php": "66539b254d455249361116b3e1dd8ba4", - "vendor/intervention/image/src/Intervention/Image/Imagick/Driver.php": "d5c907cb3ab1608c1d6686680d1f58ef", - "vendor/intervention/image/src/Intervention/Image/Imagick/Encoder.php": "cd3fdb67880cc4416a05fc54464084e0", - "vendor/intervention/image/src/Intervention/Image/Imagick/Font.php": "2d91b74c9be26b8fda256a51c47219d4", - "vendor/intervention/image/src/Intervention/Image/Imagick/Shapes/CircleShape.php": "b81a9e54bc909645768f676fb22732a5", - "vendor/intervention/image/src/Intervention/Image/Imagick/Shapes/EllipseShape.php": "12569e1e8629c9809242204d4e870bb0", - "vendor/intervention/image/src/Intervention/Image/Imagick/Shapes/LineShape.php": "eac0ea3020d070ae6249447792a05a91", - "vendor/intervention/image/src/Intervention/Image/Imagick/Shapes/PolygonShape.php": "c0ba423ba4a251c53dd5d82df67f3e71", - "vendor/intervention/image/src/Intervention/Image/Imagick/Shapes/RectangleShape.php": "faac545e51d77d9e0c0c06774fb21e3b", - "vendor/intervention/image/src/Intervention/Image/Point.php": "80c4f765cfb8ae34fb41ca1e2fcf84fc", - "vendor/intervention/image/src/Intervention/Image/Response.php": "a0b59f1c82ff8e2802d356747398ad2b", - "vendor/intervention/image/src/Intervention/Image/Size.php": "0874766a431c7856ac95ef46568be553", - "vendor/intervention/image/src/config/config.php": "5d74634e771388187e97ee483741fa08", - "vendor/kkokk/poster/src/Cache/Repository.php": "21efcda52750c5162b4831fec6bc55b3", - "vendor/kkokk/poster/src/Captcha/CaptchaGeneratorFactory.php": "7fbb0809eb6b66f8558df01ec991b90c", - "vendor/kkokk/poster/src/Captcha/CaptchaGeneratorInterface.php": "2d755ccb6674d487201d2960a23ee7a6", - "vendor/kkokk/poster/src/Captcha/CaptchaManager.php": "8e8afd4e80511cbb4cf0ba141467e529", - "vendor/kkokk/poster/src/Captcha/Generators/CaptchaGenerator.php": "34fabca3130ef77f00f344431fb71848", - "vendor/kkokk/poster/src/Captcha/Generators/ClickGenerator.php": "7e2b17a4af632bdc69d5d92fad46cc3a", - "vendor/kkokk/poster/src/Captcha/Generators/InputGenerator.php": "b4c4f1c62bab7cf5bdc4259e62ff48b1", - "vendor/kkokk/poster/src/Captcha/Generators/RotateGenerator.php": "024dc9baa4601e6c2295afdaf3aeada1", - "vendor/kkokk/poster/src/Captcha/Generators/SliderGenerator.php": "bfc6c2de02b9cdc30d09cb7c49e39601", - "vendor/kkokk/poster/src/Captcha/Traits/ClickTrait.php": "de0da781d0f127e4de2b745f8035d67c", - "vendor/kkokk/poster/src/Captcha/Traits/InputTrait.php": "db3dbce91b455499b91eb413e7e4631a", - "vendor/kkokk/poster/src/Captcha/Traits/RotateTrait.php": "e959b03b83a88c7f075db5b13cda9985", - "vendor/kkokk/poster/src/Captcha/Traits/SliderTrait.php": "5fffc8981f49f0bff97eef4956c5bcc4", - "vendor/kkokk/poster/src/Common/Common.php": "6e797693d85c949538e2f078bc6534b6", - "vendor/kkokk/poster/src/Exception/Exception.php": "9db0ec87a8863c009509d538868e4b04", - "vendor/kkokk/poster/src/Exception/PosterException.php": "51a89f3ba1fb87fe89488865a1d9e759", - "vendor/kkokk/poster/src/Exception/SystemException.php": "96cb4d4ea4f8277eec6927b0dbe7d2da", - "vendor/kkokk/poster/src/Facades/Cache.php": "944cc306d6cdb26ce22fc14978059cdf", - "vendor/kkokk/poster/src/Facades/Captcha.php": "d7b0dd8e8a602523969ea9bb4167a5d6", - "vendor/kkokk/poster/src/Facades/Facade.php": "d1488f9bd39daf008582a4ff82796f08", - "vendor/kkokk/poster/src/Facades/Html.php": "1c8bbde57e1de51c2c2bebd8fdb15ada", - "vendor/kkokk/poster/src/Facades/Poster.php": "e1f2ebc46adc4b33f4c1467e399e3d0c", - "vendor/kkokk/poster/src/Html/Builder.php": "7cf426e9533bfafc36b5e469ab51026b", - "vendor/kkokk/poster/src/Html/Drivers/Driver.php": "e3704f0b4cc86b4e776c81c588cd65f4", - "vendor/kkokk/poster/src/Html/Drivers/DriverInterface.php": "953f29675829b8f5f841090171a42c89", - "vendor/kkokk/poster/src/Html/Drivers/WkDriver.php": "d285c1a4e0d3f958037e7e23adca5e22", - "vendor/kkokk/poster/src/Html/Html.php": "f15580a61549bd7270691b2e74e7ad96", - "vendor/kkokk/poster/src/Html/HtmlFactory.php": "8ca232d0b1ed0f5f6739fe6a0df16f34", - "vendor/kkokk/poster/src/Html/HtmlInterface.php": "965803b071a09e32015737ef2bfdd7ec", - "vendor/kkokk/poster/src/Html/HtmlManager.php": "01fa52eaf9fd9383be4250475105ac15", - "vendor/kkokk/poster/src/Html/Queries/Query.php": "4ebe434b63750a1e940a2fd57804d7ff", - "vendor/kkokk/poster/src/Html/Queries/WkQuery.php": "7dae4802425f8ee375caf4b52feb1f28", - "vendor/kkokk/poster/src/Html/WkHtml.php": "a41da25f1f19890c827b040ccb62c348", - "vendor/kkokk/poster/src/Image/Builder.php": "4fccf02d90efdb5d232093c3a57e351d", - "vendor/kkokk/poster/src/Image/Drivers/Driver.php": "9fa52d09b3aae570fc049850c53b859c", - "vendor/kkokk/poster/src/Image/Drivers/DriverInterface.php": "abfc8f8fe172797def3b42936aa560b6", - "vendor/kkokk/poster/src/Image/Drivers/GdDriver.php": "ac775a167b8f6361972aa4fe2bfa9bcb", - "vendor/kkokk/poster/src/Image/Drivers/ImagickDriver.php": "8db210e98d0f9fb41dd1c665b13f4a23", - "vendor/kkokk/poster/src/Image/Extension.php": "815cdb24b779a83b0a18a615fb9c56b6", - "vendor/kkokk/poster/src/Image/ExtensionFactory.php": "6bee7cb1362ffdad0a12750ce9a85a77", - "vendor/kkokk/poster/src/Image/ExtensionInterface.php": "05e43b17150f2cf9742e4d45c3a00724", - "vendor/kkokk/poster/src/Image/GdExtension.php": "491835e6873742ea2e0cc04f851d9355", - "vendor/kkokk/poster/src/Image/ImagickExtension.php": "847ebdab1410dbc60a5b9a75f1d6e95f", - "vendor/kkokk/poster/src/Image/PosterManager.php": "6026fef7a3681771a331374aa75a51dc", - "vendor/kkokk/poster/src/Image/Queries/GdQuery.php": "aa23005a52b859464a6041fd7c812fca", - "vendor/kkokk/poster/src/Image/Queries/ImagickQuery.php": "2136b91f702749aede9303b9297cc156", - "vendor/kkokk/poster/src/Image/Queries/Query.php": "d84f303f4e6a75597e64666744f04152", - "vendor/kkokk/poster/src/Image/Traits/GdTrait.php": "a982868af529fead175e25453cb707b3", - "vendor/kkokk/poster/src/Image/Traits/ImagickTrait.php": "a679098406767b51c80879902fd78016", - "vendor/kkokk/poster/src/Lang/Captcha.php": "f56d392b72a9e5efd0be2dd9da0a5c54", - "vendor/kkokk/poster/src/Lang/Poster.php": "4f0c73d95c93fc839695c6bdc035a357", - "vendor/kkokk/poster/src/PHPQrcode/bindings/tcpdf/qrcode.php": "27719e2e8e26c5fac637fcab89519301", - "vendor/kkokk/poster/src/PHPQrcode/phpqrcode.php": "aa6c2aaae163a41e1fcbfa8516937b90", - "vendor/kkokk/poster/src/PHPQrcode/qrbitstream.php": "bd6d63dfa9f2dbe4b3f30915653dcc63", - "vendor/kkokk/poster/src/PHPQrcode/qrconfig.php": "cb0652b660884514fc50040a97cd14a9", - "vendor/kkokk/poster/src/PHPQrcode/qrconst.php": "2b9df7419bc92d33e67a3c632197547b", - "vendor/kkokk/poster/src/PHPQrcode/qrencode.php": "b973936e3763669adbb8236cb1489be4", - "vendor/kkokk/poster/src/PHPQrcode/qrimage.php": "78db79dfce6fa8057bb797084f87724f", - "vendor/kkokk/poster/src/PHPQrcode/qrinput.php": "c31f7a07449fa0675d69fbc9ba6a8f54", - "vendor/kkokk/poster/src/PHPQrcode/qrlib.php": "96a6ce57504482dc0f81076082c4b945", - "vendor/kkokk/poster/src/PHPQrcode/qrmask.php": "a4bdf0e02b78b8b59f266aa9457793b6", - "vendor/kkokk/poster/src/PHPQrcode/qrrscode.php": "a7c018654993f60048288dba5d6caf67", - "vendor/kkokk/poster/src/PHPQrcode/qrspec.php": "a66c71311a16c8c85010317704af7774", - "vendor/kkokk/poster/src/PHPQrcode/qrsplit.php": "7b81ddc5f427b96bd71023174280b56b", - "vendor/kkokk/poster/src/PHPQrcode/qrtools.php": "6f034039e4fa9f42378b37c441505419", - "vendor/kkokk/poster/src/PHPQrcode/tools/merge.php": "ed3fdbb0fbb8392a9050ea867ddacd88", - "vendor/kkokk/poster/src/PHPQrcode/tools/merged_config.php": "3b018daa6b03c167a1ecea7ef96b1a95", - "vendor/kkokk/poster/src/PHPQrcode/tools/merged_header.php": "2f2dcd46e505c0e4c249d5f62a815324", - "vendor/kkokk/poster/src/PosterManager.php": "de7ef7d0ff12469bbb965229d598669e", - "vendor/kosinix/grafika/src/Grafika/Color.php": "7cda879b93725f7956f98ce917ee443e", - "vendor/kosinix/grafika/src/Grafika/DrawingObject/CubicBezier.php": "43311add6ac4c923c65370ef98904209", - "vendor/kosinix/grafika/src/Grafika/DrawingObject/Ellipse.php": "bd94cf36143038bd621a3f770607b27e", - "vendor/kosinix/grafika/src/Grafika/DrawingObject/Line.php": "ede71e8e2bcbd18205cb11118faf8017", - "vendor/kosinix/grafika/src/Grafika/DrawingObject/Polygon.php": "5fb262f81134a02c5c6ecefe60c41ea8", - "vendor/kosinix/grafika/src/Grafika/DrawingObject/QuadraticBezier.php": "fb7fb8a3adc768538590b98c1d343439", - "vendor/kosinix/grafika/src/Grafika/DrawingObject/Rectangle.php": "930248954432f14bb63ba026903cc33f", - "vendor/kosinix/grafika/src/Grafika/DrawingObjectInterface.php": "497edacea666520a716de15bd36b84d9", - "vendor/kosinix/grafika/src/Grafika/EditorInterface.php": "c0fc7341d8a4bb98b6ca647d014f010f", - "vendor/kosinix/grafika/src/Grafika/FilterInterface.php": "6c9645b986853d0a400d7f9c38c7c429", - "vendor/kosinix/grafika/src/Grafika/Gd/DrawingObject/CubicBezier.php": "350baeea849c001eaa0d60394a3aa9e6", - "vendor/kosinix/grafika/src/Grafika/Gd/DrawingObject/Ellipse.php": "eb8c55aad664533f0f2ce9cad7d2ed85", - "vendor/kosinix/grafika/src/Grafika/Gd/DrawingObject/Line.php": "a187aa18447d674f40ca597f2d9385b2", - "vendor/kosinix/grafika/src/Grafika/Gd/DrawingObject/Polygon.php": "8605b06d995414044464a02673cb1252", - "vendor/kosinix/grafika/src/Grafika/Gd/DrawingObject/QuadraticBezier.php": "ad9b3f0ad0952161c828e2a0cd39cdb2", - "vendor/kosinix/grafika/src/Grafika/Gd/DrawingObject/Rectangle.php": "bca5fd948cf2674cb3d246aa51dbc242", - "vendor/kosinix/grafika/src/Grafika/Gd/Editor.php": "8791b13a5eb2a65808ede5c2df543ba4", - "vendor/kosinix/grafika/src/Grafika/Gd/Filter/Blur.php": "9420151b5868365e337868c291ce517f", - "vendor/kosinix/grafika/src/Grafika/Gd/Filter/Brightness.php": "f0a9dcab99441adc5c6d5aff91792091", - "vendor/kosinix/grafika/src/Grafika/Gd/Filter/Colorize.php": "7097dee6d6a1faa3fc02dfdc4057d391", - "vendor/kosinix/grafika/src/Grafika/Gd/Filter/Contrast.php": "2450c18358e05e252312466a7e866641", - "vendor/kosinix/grafika/src/Grafika/Gd/Filter/Dither.php": "d5447141ef585cec17d8ca63303765ca", - "vendor/kosinix/grafika/src/Grafika/Gd/Filter/Gamma.php": "6f31f916d64ab7f66516f69313706bb0", - "vendor/kosinix/grafika/src/Grafika/Gd/Filter/Grayscale.php": "86c9627f3208d79fd055737c98f6b7bf", - "vendor/kosinix/grafika/src/Grafika/Gd/Filter/Invert.php": "a5bedd49842c272e7b376028c1dff5ee", - "vendor/kosinix/grafika/src/Grafika/Gd/Filter/Pixelate.php": "e67403931a475bf937965cffa975e015", - "vendor/kosinix/grafika/src/Grafika/Gd/Filter/Sharpen.php": "0d4caf703aa4d6febbd08947d9259ae6", - "vendor/kosinix/grafika/src/Grafika/Gd/Filter/Sobel.php": "752ae1aa07a3e2163d64f705c08f0285", - "vendor/kosinix/grafika/src/Grafika/Gd/Helper/GifByteStream.php": "614e168ef45bb131e4081accf43e16f1", - "vendor/kosinix/grafika/src/Grafika/Gd/Helper/GifHelper.php": "20e44da7bc4fe5c1fd970ac305570dae", - "vendor/kosinix/grafika/src/Grafika/Gd/Image.php": "22e48522bac8d31a4a418e3fdede2332", - "vendor/kosinix/grafika/src/Grafika/Gd/ImageHash/AverageHash.php": "a23f938f94ef30b82f006691d874fef0", - "vendor/kosinix/grafika/src/Grafika/Gd/ImageHash/DifferenceHash.php": "fec0153959b82d4b2f9720e6378932ed", - "vendor/kosinix/grafika/src/Grafika/Grafika.php": "06d7f82ea8d5dd7653747f6e08520ceb", - "vendor/kosinix/grafika/src/Grafika/ImageInterface.php": "d1aa8206f238737454db519e1b17f15c", - "vendor/kosinix/grafika/src/Grafika/ImageType.php": "4d9f3a1c1967dcf56a915eac099bf567", - "vendor/kosinix/grafika/src/Grafika/Imagick/DrawingObject/CubicBezier.php": "ec9f86d34563f9e9642b09a641a06177", - "vendor/kosinix/grafika/src/Grafika/Imagick/DrawingObject/Ellipse.php": "1ee9dc7880d02af1bfbb36fb29f3b90e", - "vendor/kosinix/grafika/src/Grafika/Imagick/DrawingObject/Line.php": "3c01c0f60bab2645ca41d6f0467a04c0", - "vendor/kosinix/grafika/src/Grafika/Imagick/DrawingObject/Polygon.php": "6c9efd1025884347604a56fff6c67d91", - "vendor/kosinix/grafika/src/Grafika/Imagick/DrawingObject/QuadraticBezier.php": "6b77d345a71173a43e2acf87faa018a6", - "vendor/kosinix/grafika/src/Grafika/Imagick/DrawingObject/Rectangle.php": "c50c7743d69f22752d014cca7d6ed10b", - "vendor/kosinix/grafika/src/Grafika/Imagick/Editor.php": "b59dc01a575e14cdbd573d9ce6610256", - "vendor/kosinix/grafika/src/Grafika/Imagick/Filter/Blur.php": "7a9a4197d3ade82833594227fa7f5329", - "vendor/kosinix/grafika/src/Grafika/Imagick/Filter/Brightness.php": "95c9e4b5f37183f8c3233a073853e280", - "vendor/kosinix/grafika/src/Grafika/Imagick/Filter/Colorize.php": "d927107c6d818ce1af2a7f281bd7e6d1", - "vendor/kosinix/grafika/src/Grafika/Imagick/Filter/Contrast.php": "f4d21bcc93d97e1fcdaf044eaaa8dc26", - "vendor/kosinix/grafika/src/Grafika/Imagick/Filter/Dither.php": "c9e3c616129ba94d5cfbc985edc573bb", - "vendor/kosinix/grafika/src/Grafika/Imagick/Filter/Gamma.php": "c8d965de94bdc3be7408152cf4292619", - "vendor/kosinix/grafika/src/Grafika/Imagick/Filter/Grayscale.php": "09fda21755e028fee7c87d9acc708096", - "vendor/kosinix/grafika/src/Grafika/Imagick/Filter/Invert.php": "4e0bbb695f774b29549f49daf91ca6ef", - "vendor/kosinix/grafika/src/Grafika/Imagick/Filter/Pixelate.php": "7ef1ff47d2b154397e37dbc637deeed5", - "vendor/kosinix/grafika/src/Grafika/Imagick/Filter/Sharpen.php": "2ba171ab04523fdbf18c2316a895019c", - "vendor/kosinix/grafika/src/Grafika/Imagick/Filter/Sobel.php": "2c9fc1074bb8e8ee729a8c3070a586b0", - "vendor/kosinix/grafika/src/Grafika/Imagick/Image.php": "8835a68b429ef9c78692186be2cda139", - "vendor/kosinix/grafika/src/Grafika/Imagick/ImageHash/AverageHash.php": "05ed23fa6f886817fd793b3097bd7068", - "vendor/kosinix/grafika/src/Grafika/Imagick/ImageHash/DifferenceHash.php": "89ac60e0054eae342a7269ed4a7d7531", - "vendor/kosinix/grafika/src/Grafika/Position.php": "58ad030e19ba0a909d19953dc798cd22", - "vendor/kosinix/grafika/src/autoloader.php": "53977199daca920e3e59882c4387b43c", - "vendor/laravel/serializable-closure/src/Contracts/Serializable.php": "5dde3024f5ddd1e0583dcc9ffeefad1c", - "vendor/laravel/serializable-closure/src/Contracts/Signer.php": "ba8835c1ca8f17c53c9d470eb2111765", - "vendor/laravel/serializable-closure/src/Exceptions/InvalidSignatureException.php": "d293a858cfe39535383fae785437dd43", - "vendor/laravel/serializable-closure/src/Exceptions/MissingSecretKeyException.php": "284c524789efd0e27091695c89a1fbe8", - "vendor/laravel/serializable-closure/src/Exceptions/PhpVersionNotSupportedException.php": "3144d12c9b0834a2a6ca5635fae056f5", - "vendor/laravel/serializable-closure/src/SerializableClosure.php": "79bcfa05def69838af4ea39ab3da3dc8", - "vendor/laravel/serializable-closure/src/Serializers/Native.php": "545eabcb797e2b78b44ef667c7dd8693", - "vendor/laravel/serializable-closure/src/Serializers/Signed.php": "2e3bd2298a6a6c49e6b7fac3f37832d4", - "vendor/laravel/serializable-closure/src/Signers/Hmac.php": "b16b366f93957edb28e5633fe482477b", - "vendor/laravel/serializable-closure/src/Support/ClosureScope.php": "31549af806f83afd169cf0a35dd05a7f", - "vendor/laravel/serializable-closure/src/Support/ClosureStream.php": "1662fccdd43e5068e3e0a19e153b457d", - "vendor/laravel/serializable-closure/src/Support/ReflectionClosure.php": "4c5647dc395cfe4a323af229e2d7ac40", - "vendor/laravel/serializable-closure/src/Support/SelfReference.php": "10c7be5e9320e8c487485d91887197e4", - "vendor/laravel/serializable-closure/src/UnsignedSerializableClosure.php": "778e5c4d74e7b5cf82ad1261d16a2705", - "vendor/league/flysystem/src/Config.php": "0adc8b304968511523aa8273af0b4b1b", - "vendor/league/flysystem/src/CorruptedPathDetected.php": "c0d1f06f2267082f195b9e3c77edf5b9", - "vendor/league/flysystem/src/DirectoryAttributes.php": "ceb5599b5007d2982b6a798b2b59fa89", - "vendor/league/flysystem/src/DirectoryListing.php": "b1dbeb7d3408aa1bd545caad705f654e", - "vendor/league/flysystem/src/FileAttributes.php": "e8ab36be2d4d3ae2df791bb3f57915f0", - "vendor/league/flysystem/src/Filesystem.php": "77091ea085d27cbd8eac85116495d63b", - "vendor/league/flysystem/src/FilesystemAdapter.php": "fbd353eafaea2db285767cf16e16feaa", - "vendor/league/flysystem/src/FilesystemException.php": "be3999f6f1b7d0d2a07f8df9d2ae43c5", - "vendor/league/flysystem/src/FilesystemOperationFailed.php": "053f955f21209afea4eafab2ff11b1c3", - "vendor/league/flysystem/src/FilesystemOperator.php": "3bbb745746338e6eb8a69ac9aacb73b6", - "vendor/league/flysystem/src/FilesystemReader.php": "44948ec847ffa250fcf1f920e44e2f76", - "vendor/league/flysystem/src/FilesystemWriter.php": "0f42e5d6345c543f07947ae44036d1bf", - "vendor/league/flysystem/src/InvalidStreamProvided.php": "ee9f393d3fa413552d1893444382cfc3", - "vendor/league/flysystem/src/InvalidVisibilityProvided.php": "9dc7092e6d54d80868af4b882e83091d", - "vendor/league/flysystem/src/Local/LocalFilesystemAdapter.php": "082ed397a2f23d802a7ef5ff56b77420", - "vendor/league/flysystem/src/MountManager.php": "02d4338f4ce5bcf578424009aecc245a", - "vendor/league/flysystem/src/PathNormalizer.php": "67186851b3b4e330d15e6f5cca9f063c", - "vendor/league/flysystem/src/PathPrefixer.php": "df6e0881fa14f206c6105ad190a56e2d", - "vendor/league/flysystem/src/PathTraversalDetected.php": "a4a4ce04eadb602ea541b40181e16119", - "vendor/league/flysystem/src/PortableVisibilityGuard.php": "fbcd7e6e75f31d007c1dadcde6b1bd0d", - "vendor/league/flysystem/src/ProxyArrayAccessToProperties.php": "b0e172578d980d8c738e75dce6fe287f", - "vendor/league/flysystem/src/StorageAttributes.php": "83c40b64250ba338cff528cec2d7e573", - "vendor/league/flysystem/src/SymbolicLinkEncountered.php": "75926e78b5f71f01bb29691179032538", - "vendor/league/flysystem/src/UnableToCheckFileExistence.php": "c355cbbb9f18f342f6548b92126de8f5", - "vendor/league/flysystem/src/UnableToCopyFile.php": "1e9dff5931bb555c282fe8b95200fa58", - "vendor/league/flysystem/src/UnableToCreateDirectory.php": "db9b66e0ec60ff440a95e8f26d8a89c7", - "vendor/league/flysystem/src/UnableToDeleteDirectory.php": "a0e1cdd4774beaf79db1a77cddc147e2", - "vendor/league/flysystem/src/UnableToDeleteFile.php": "f87b113e9a00938dd56a11bbc3ed756e", - "vendor/league/flysystem/src/UnableToMountFilesystem.php": "94fd395c3529545941c6442bfd0bd60c", - "vendor/league/flysystem/src/UnableToMoveFile.php": "6c4e0b15dc621b7017619a445ffe88fd", - "vendor/league/flysystem/src/UnableToReadFile.php": "f3089a11f41dd911647cc0b4d1b0f266", - "vendor/league/flysystem/src/UnableToResolveFilesystemMount.php": "3cc42f6beeec02a1102e592fea19a19c", - "vendor/league/flysystem/src/UnableToRetrieveMetadata.php": "452304c6706724017bf4fc9cc75a6d55", - "vendor/league/flysystem/src/UnableToSetVisibility.php": "69007d4186e291c7a8bc9c6f3944b1a3", - "vendor/league/flysystem/src/UnableToWriteFile.php": "190e82f4fd2a50499e9e632105a0ec93", - "vendor/league/flysystem/src/UnixVisibility/PortableVisibilityConverter.php": "1bbe5daa3884d9ab73b44c6a522135db", - "vendor/league/flysystem/src/UnixVisibility/VisibilityConverter.php": "e8b75fc498f5d532d5330b52a3e5d1f5", - "vendor/league/flysystem/src/UnreadableFileEncountered.php": "98ba3848be2c00e17e1847b944276eba", - "vendor/league/flysystem/src/Visibility.php": "03647ac076113a82fa2b86eabc48e5e4", - "vendor/league/flysystem/src/WhitespacePathNormalizer.php": "5220ec8fdde19bae7e1f917ff9d44555", - "vendor/league/mime-type-detection/src/EmptyExtensionToMimeTypeMap.php": "4f8487a33e55019a33e5c8581653fca0", - "vendor/league/mime-type-detection/src/ExtensionLookup.php": "6316ecf5de6b9d36778d6a9ef0508320", - "vendor/league/mime-type-detection/src/ExtensionMimeTypeDetector.php": "93322cb279943946e16fa369e52d89d1", - "vendor/league/mime-type-detection/src/ExtensionToMimeTypeMap.php": "37e9c9ec6296483aff744563d1feec42", - "vendor/league/mime-type-detection/src/FinfoMimeTypeDetector.php": "c4e5c2ca44e0a9e4c5c6d7565ca098a0", - "vendor/league/mime-type-detection/src/GeneratedExtensionToMimeTypeMap.php": "1a4f1a881fb5c15699f678dece5431a1", - "vendor/league/mime-type-detection/src/MimeTypeDetector.php": "5ea3730f26015b981460a5d286d372d9", - "vendor/league/mime-type-detection/src/OverridingExtensionToMimeTypeMap.php": "d571e41a0033fefc1c003b396666f966", - "vendor/maennchen/zipstream-php/.php-cs-fixer.dist.php": "4e88a871f1cdabfbc2e992ed4f330107", - "vendor/maennchen/zipstream-php/src/Bigint.php": "d21cf36584ddd81f0fbc5ba6d6cb94b3", - "vendor/maennchen/zipstream-php/src/DeflateStream.php": "1d953c1b3f5fb905f34e24ee41817089", - "vendor/maennchen/zipstream-php/src/Exception/EncodingException.php": "9542d1b179a4cbd1f720992deefe8cae", - "vendor/maennchen/zipstream-php/src/Exception/FileNotFoundException.php": "3c616dacd57ad53adf703491429caa1c", - "vendor/maennchen/zipstream-php/src/Exception/FileNotReadableException.php": "c7457a224de2219ed471faced596de40", - "vendor/maennchen/zipstream-php/src/Exception/IncompatibleOptionsException.php": "17c0f3677f81be979b39c17b69975b23", - "vendor/maennchen/zipstream-php/src/Exception/OverflowException.php": "8298b41b6619431ec37894b88f7ca6fe", - "vendor/maennchen/zipstream-php/src/Exception/StreamNotReadableException.php": "676eedec35844e28261d8d341f03c56a", - "vendor/maennchen/zipstream-php/src/Exception.php": "c31980c5932add29c7def1d49b65dd5e", - "vendor/maennchen/zipstream-php/src/File.php": "8bcffe50127b3216b1c9998d7700fc68", - "vendor/maennchen/zipstream-php/src/Option/Archive.php": "a79e467e8c185de5b9a18ea8150be1cf", - "vendor/maennchen/zipstream-php/src/Option/File.php": "5bce4e50ab30be88a247a3ac3d31030f", - "vendor/maennchen/zipstream-php/src/Option/Method.php": "08638ee54b9480419400ac8efea57e8b", - "vendor/maennchen/zipstream-php/src/Option/Version.php": "4bf4bbb044d63f1f821e4c99a7b1538b", - "vendor/maennchen/zipstream-php/src/Stream.php": "07db2a03af2c895da4566f6136000b68", - "vendor/maennchen/zipstream-php/src/ZipStream.php": "9636bcf427c7e1e80730303de908b56e", - "vendor/maennchen/zipstream-php/test/BigintTest.php": "4d69e3105388a3e830d2425989f27123", - "vendor/maennchen/zipstream-php/test/ZipStreamTest.php": "451ba8b98a9b154f8f727df887af6e84", - "vendor/maennchen/zipstream-php/test/bootstrap.php": "96ec93716d9c4b090d62a9953dee39a4", - "vendor/maennchen/zipstream-php/test/bug/BugHonorFileTimeTest.php": "f496432102a629d0dc75e503f58b3fb4", - "vendor/markbaker/complex/classes/src/Complex.php": "64ff6379f814d52dfd3a9f6072821492", - "vendor/markbaker/complex/classes/src/Exception.php": "8c7e71ab0e0c1e6fa77dba5198a89ed5", - "vendor/markbaker/complex/classes/src/Functions.php": "f15bab91078e172b90e94c988accf432", - "vendor/markbaker/complex/classes/src/Operations.php": "05ceff3ab0f6300602b2149249422c5f", - "vendor/markbaker/complex/examples/complexTest.php": "41ff0b2ad67cf0aebf60d1b0a213576f", - "vendor/markbaker/complex/examples/testFunctions.php": "5efdc0d14db9c88bd88f783a6b21f7a6", - "vendor/markbaker/complex/examples/testOperations.php": "3a71232b452ef3f6ac1a018de08994b5", - "vendor/markbaker/matrix/buildPhar.php": "7317f04ae4d4bdda006bbde6dcc2a316", - "vendor/markbaker/matrix/classes/src/Builder.php": "387dcb264a6b07e71313abac253960b9", - "vendor/markbaker/matrix/classes/src/Decomposition/Decomposition.php": "592ed412ce11234f538e748c17064ca6", - "vendor/markbaker/matrix/classes/src/Decomposition/LU.php": "371ef17cdd565a188e19843e5b196fd0", - "vendor/markbaker/matrix/classes/src/Decomposition/QR.php": "9c773a6fad81b2ec642765bf14b49192", - "vendor/markbaker/matrix/classes/src/Div0Exception.php": "943026b1d1c782e601b2908b49064a65", - "vendor/markbaker/matrix/classes/src/Exception.php": "44c732d31f263fef34d5319e7a8d194c", - "vendor/markbaker/matrix/classes/src/Functions.php": "9a12422c011e465ded3ab12e2537f926", - "vendor/markbaker/matrix/classes/src/Matrix.php": "5f62e19dfd6eef136a49bd139cce25e4", - "vendor/markbaker/matrix/classes/src/Operations.php": "88f2c7e991a660581e99710f5111e46b", - "vendor/markbaker/matrix/classes/src/Operators/Addition.php": "13429c7d8619359b887d02f985a616c8", - "vendor/markbaker/matrix/classes/src/Operators/DirectSum.php": "72fb3094662b2b6fb8603b5371a11c44", - "vendor/markbaker/matrix/classes/src/Operators/Division.php": "2443ef2827e486071e15c2e72638fbee", - "vendor/markbaker/matrix/classes/src/Operators/Multiplication.php": "e0aec7e39fbd8648fe463409311c70b2", - "vendor/markbaker/matrix/classes/src/Operators/Operator.php": "ab3f6578aa4a30dd2633e8e799b16f2e", - "vendor/markbaker/matrix/classes/src/Operators/Subtraction.php": "a25864c1926507a4e557f3f87b072c92", - "vendor/markbaker/matrix/examples/test.php": "0d09190f52c18f71fc67164514a440de", - "vendor/mjaschen/phpgeo/src/Bearing/BearingEllipsoidal.php": "5b507fadf588403dbd49a65a5117ced2", - "vendor/mjaschen/phpgeo/src/Bearing/BearingInterface.php": "94c419a1a0e65e2369334576291fb3ac", - "vendor/mjaschen/phpgeo/src/Bearing/BearingSpherical.php": "14dacc74f533652131ac66f4dc7fe292", - "vendor/mjaschen/phpgeo/src/Bearing/DirectVincentyBearing.php": "fa0b619b540c6a793d72731294e31870", - "vendor/mjaschen/phpgeo/src/Bearing/InverseVincentyBearing.php": "3c95d00011a7663f2e2d701cf0aeb7d6", - "vendor/mjaschen/phpgeo/src/Bounds.php": "75625da7cf96b6d697e5ca49811ce9db", - "vendor/mjaschen/phpgeo/src/CardinalDirection/CardinalDirection.php": "76f826661fe962ddaa90e79ab3cd4efd", - "vendor/mjaschen/phpgeo/src/CardinalDirection/CardinalDirectionDistances.php": "d4cd1495398b35541c311790e9d6a5ef", - "vendor/mjaschen/phpgeo/src/CardinalDirection/CardinalDirectionDistancesCalculator.php": "0c69ff39750836fa19dc28b9e753edd7", - "vendor/mjaschen/phpgeo/src/Coordinate.php": "6e245ad145683930afbb3d2f56bf5fb1", - "vendor/mjaschen/phpgeo/src/Direction/Direction.php": "a898c638b341862c8f0301c1e7515ac2", - "vendor/mjaschen/phpgeo/src/Distance/DistanceInterface.php": "10f0932c3af9d30040a826c34ad5a4d6", - "vendor/mjaschen/phpgeo/src/Distance/Haversine.php": "75ee93f9b53922e9218785eb5d199233", - "vendor/mjaschen/phpgeo/src/Distance/Vincenty.php": "3162b4e48fe2107635bb8b42344e2f79", - "vendor/mjaschen/phpgeo/src/Ellipsoid.php": "0b743f7cdec217e50dbffdba4a886d1b", - "vendor/mjaschen/phpgeo/src/Exception/BearingNotAvailableException.php": "f08a0aabf16255a68afca271a8c83fee", - "vendor/mjaschen/phpgeo/src/Exception/InvalidDistanceException.php": "60b5459ac1c5fda2b1db7eac83e10978", - "vendor/mjaschen/phpgeo/src/Exception/InvalidGeometryException.php": "c25233fb35fe77b018c197d4308fd67b", - "vendor/mjaschen/phpgeo/src/Exception/InvalidPolygonException.php": "a6368f72d6fccfd646cf9ca495f0ae8e", - "vendor/mjaschen/phpgeo/src/Exception/NotConvergingException.php": "eb40e20cd3b63348f315c39ddb1bbd7d", - "vendor/mjaschen/phpgeo/src/Exception/NotMatchingEllipsoidException.php": "9345b37628b95a375d1cf3eb21068b92", - "vendor/mjaschen/phpgeo/src/Factory/BoundsFactory.php": "9cc00f00d3a17a86bc151fc35e0c7fe6", - "vendor/mjaschen/phpgeo/src/Factory/CoordinateFactory.php": "4b6b06768c29398fb2af1230150996be", - "vendor/mjaschen/phpgeo/src/Factory/GeometryFactoryInterface.php": "f1bd5baefa1e2584c03eefa9ba639c4a", - "vendor/mjaschen/phpgeo/src/Formatter/Coordinate/DMS.php": "e1f4a09547a13d242ff3c8e435448f91", - "vendor/mjaschen/phpgeo/src/Formatter/Coordinate/DecimalDegrees.php": "48228674528d345dcaf07e910210e23b", - "vendor/mjaschen/phpgeo/src/Formatter/Coordinate/DecimalMinutes.php": "0904e601878c3be64f2f5ccd1365d1b6", - "vendor/mjaschen/phpgeo/src/Formatter/Coordinate/FormatterInterface.php": "3390a50826bbc2b4fe61d64aec8e8c2e", - "vendor/mjaschen/phpgeo/src/Formatter/Coordinate/GeoJSON.php": "be2bb551e642efa87fc91ffce44f1baf", - "vendor/mjaschen/phpgeo/src/Formatter/Polygon/FormatterInterface.php": "4e6f4feb82fac9e8e739609e0ba26558", - "vendor/mjaschen/phpgeo/src/Formatter/Polygon/GeoJSON.php": "b79b727094870369f50db8268d49f743", - "vendor/mjaschen/phpgeo/src/Formatter/Polyline/FormatterInterface.php": "a918e2e4c0637aabf0942f237d6a9d21", - "vendor/mjaschen/phpgeo/src/Formatter/Polyline/GeoJSON.php": "7d7a5cb7244fa3a6aa4ab87456b90ae4", - "vendor/mjaschen/phpgeo/src/GeometryInterface.php": "8dec2faa075f185fd61acf24990c7876", - "vendor/mjaschen/phpgeo/src/GetBoundsTrait.php": "21620fd81761c57ca707d9d3aeed0a19", - "vendor/mjaschen/phpgeo/src/Intersection/Intersection.php": "6a24efb61bf5daa3ee19b36b5df00539", - "vendor/mjaschen/phpgeo/src/Line.php": "f0f334991954144b833844feed309279", - "vendor/mjaschen/phpgeo/src/Polygon.php": "e501698db1718c949a5c56830033e437", - "vendor/mjaschen/phpgeo/src/Polyline.php": "33941796e54302f462383a7618bac83d", - "vendor/mjaschen/phpgeo/src/Processor/Polyline/SimplifyBearing.php": "9a600942336568659a37c1acd3f52a55", - "vendor/mjaschen/phpgeo/src/Processor/Polyline/SimplifyDouglasPeucker.php": "0625a1ce5cf5d02558fe5d67afef34d4", - "vendor/mjaschen/phpgeo/src/Processor/Polyline/SimplifyInterface.php": "a34340eb77469d3170472a8ea07d1308", - "vendor/mjaschen/phpgeo/src/Utility/Cartesian.php": "18c6cd64961401ff34a2bfd53f72fa5e", - "vendor/mjaschen/phpgeo/src/Utility/PerpendicularDistance.php": "24102e9c6b1a045d54059d219c45072a", - "vendor/mjaschen/phpgeo/src/Utility/PointToLineDistance.php": "c1ce85becb44cef1173f555cbbb0cd32", - "vendor/mjaschen/phpgeo/tests/Location/Bearing/BearingEllipsoidalTest.php": "4d5f1f61087de1f0328d230004a67f98", - "vendor/mjaschen/phpgeo/tests/Location/Bearing/BearingSphericalTest.php": "638b19b98b130cb8a93e6bfa8b11bb25", - "vendor/mjaschen/phpgeo/tests/Location/BoundsTest.php": "bdcaf6dfe3532268982fefd76df3744d", - "vendor/mjaschen/phpgeo/tests/Location/CardinalDirection/CardinalDirectionDistancesCalculatorTest.php": "655ad2d3b643d5cf61b11b5b5559d005", - "vendor/mjaschen/phpgeo/tests/Location/CardinalDirection/CardinalDirectionDistancesTest.php": "abf2be55303a9a6ddb16d90de0f0297b", - "vendor/mjaschen/phpgeo/tests/Location/CardinalDirection/CardinalDirectionTest.php": "9b14c0178b36f8a7f2f0b51a4a3cc083", - "vendor/mjaschen/phpgeo/tests/Location/CoordinateTest.php": "ee0f0f73434272f5e1b0415427c0bcd3", - "vendor/mjaschen/phpgeo/tests/Location/Direction/DirectionTest.php": "b333c44599ee72dc729f20376b30f8fa", - "vendor/mjaschen/phpgeo/tests/Location/Distance/HaversineTest.php": "85d26eee31711185089f5f78dd239511", - "vendor/mjaschen/phpgeo/tests/Location/Distance/VincentyTest.php": "fc9e2051d10235332e869ece245605e4", - "vendor/mjaschen/phpgeo/tests/Location/Factory/BoundsFactoryTest.php": "ffd3341df6bc18c5ccdd4e7757071c7d", - "vendor/mjaschen/phpgeo/tests/Location/Factory/CoordinateFactoryTest.php": "990d240e16ca2b1df1e9f4ba42dce245", - "vendor/mjaschen/phpgeo/tests/Location/Formatter/Coordinate/DMSTest.php": "6aff94ccb9c74ee43d3657bc5121b9c6", - "vendor/mjaschen/phpgeo/tests/Location/Formatter/Coordinate/DecimalDegreesTest.php": "1a8f1a08aa2435fd73262ded99c0299c", - "vendor/mjaschen/phpgeo/tests/Location/Formatter/Coordinate/DecimalMinutesTest.php": "11614c77d6cdede5f04bf1aad90acbbc", - "vendor/mjaschen/phpgeo/tests/Location/Formatter/Coordinate/GeoJSONTest.php": "7fc26b84cb2cbe33424e4035541f8a84", - "vendor/mjaschen/phpgeo/tests/Location/Formatter/Polygon/GeoJSONTest.php": "f03fae39f26311ba405bd89f1390672b", - "vendor/mjaschen/phpgeo/tests/Location/Formatter/Polyline/GeoJSONTest.php": "13cee47ae31302f9d3ed3f6c9d20c897", - "vendor/mjaschen/phpgeo/tests/Location/Intersection/IntersectionTest.php": "86673e76b427068096f17e52e936fbbd", - "vendor/mjaschen/phpgeo/tests/Location/LineTest.php": "e5c967b3a3ba0a0448af591e228e36ad", - "vendor/mjaschen/phpgeo/tests/Location/PolygonTest.php": "1b295c63cc6bea5c5b92caf05e65ec04", - "vendor/mjaschen/phpgeo/tests/Location/PolylineTest.php": "b75833bb40ed4771d3c8ff52812c6848", - "vendor/mjaschen/phpgeo/tests/Location/Processor/Polyline/SimplifyBearingTest.php": "c5564e57b8db19ad5b87e146133af60e", - "vendor/mjaschen/phpgeo/tests/Location/Processor/Polyline/SimplifyDouglasPeuckerTest.php": "ee9b9d435a24be52ce40f54b4d85ad1a", - "vendor/mjaschen/phpgeo/tests/Location/Utility/CartesianTest.php": "08cb5b32440d9afc87672583c2230753", - "vendor/mjaschen/phpgeo/tests/Location/Utility/PointToLineDistanceTestHaversineTest.php": "57b9fd8dcd4f56409189604716c5f4f6", - "vendor/mjaschen/phpgeo/tests/Location/Utility/PointToLineDistanceTestVincentyTest.php": "7bfa0bb6c28d43ecaa20ef3f2968af9b", - "vendor/mjaschen/phpgeo/tests/Regression/Github/15/Issue15Test.php": "b91b332d5f20e5c182ae939a3ea470fa", - "vendor/mjaschen/phpgeo/tests/Regression/Github/18/Issue18Test.php": "8ab276d6cec70504f7b09a84fac33860", - "vendor/mjaschen/phpgeo/tests/Regression/Github/42/Issue42Test.php": "d64d28e4fdd3d4126b7e90d956cf6d93", - "vendor/mjaschen/phpgeo/tests/Regression/Github/68/Issue68Test.php": "07998ec99bc25d08fe8011eebbc31564", - "vendor/mjaschen/phpgeo/tests/Regression/Github/92/Issue92Test.php": "8529d90b7c998d4062554ff04f0e7530", - "vendor/mjaschen/phpgeo/tests/bootstrap.php": "cbb97e4f5b829f924b8dab44508da9a0", - "vendor/monolog/monolog/src/Monolog/Attribute/AsMonologProcessor.php": "e52989ae81797b75fc28caa593ef43c7", - "vendor/monolog/monolog/src/Monolog/DateTimeImmutable.php": "05fac6b4903f301cebf5ee69061f5f7d", - "vendor/monolog/monolog/src/Monolog/ErrorHandler.php": "60d8a358bc8b99d0cc3e2eb2a6cd0224", - "vendor/monolog/monolog/src/Monolog/Formatter/ChromePHPFormatter.php": "2689cfe2e419081e2bd44e0f6f6ba5d1", - "vendor/monolog/monolog/src/Monolog/Formatter/ElasticaFormatter.php": "5eee93f39d18e41f19e14e4b005abc09", - "vendor/monolog/monolog/src/Monolog/Formatter/ElasticsearchFormatter.php": "a432ea92fe3fa18af8bfe415f0869ed5", - "vendor/monolog/monolog/src/Monolog/Formatter/FlowdockFormatter.php": "35ca8f2a52c8013358e1d83861037599", - "vendor/monolog/monolog/src/Monolog/Formatter/FluentdFormatter.php": "7d199542d13179eabe0d9094c750afbb", - "vendor/monolog/monolog/src/Monolog/Formatter/FormatterInterface.php": "5e5284b540d9af1dae3b7a7a459d9be6", - "vendor/monolog/monolog/src/Monolog/Formatter/GelfMessageFormatter.php": "aa3a0e7212e3fa16e20b5fd4a4b7f985", - "vendor/monolog/monolog/src/Monolog/Formatter/GoogleCloudLoggingFormatter.php": "914d6e8ef23f3f6239613bc93277819e", - "vendor/monolog/monolog/src/Monolog/Formatter/HtmlFormatter.php": "b7604c819b55dde423e952f1ece931f3", - "vendor/monolog/monolog/src/Monolog/Formatter/JsonFormatter.php": "c5f4cd53de30086bb27603ecaac13ccd", - "vendor/monolog/monolog/src/Monolog/Formatter/LineFormatter.php": "f8815462311d77190629b0758c31e39e", - "vendor/monolog/monolog/src/Monolog/Formatter/LogglyFormatter.php": "d4635bb5bbf52a1e9b106dba1c48f309", - "vendor/monolog/monolog/src/Monolog/Formatter/LogmaticFormatter.php": "20f0a260dfafde0b1d7d09d9d5c9691c", - "vendor/monolog/monolog/src/Monolog/Formatter/LogstashFormatter.php": "5b188e8d1bbcc3ce64634a69fe40eaf5", - "vendor/monolog/monolog/src/Monolog/Formatter/MongoDBFormatter.php": "9efe90f058dfe15d1caedfef5e5c6ac8", - "vendor/monolog/monolog/src/Monolog/Formatter/NormalizerFormatter.php": "175520a193e8ec8d6138a641a43381eb", - "vendor/monolog/monolog/src/Monolog/Formatter/ScalarFormatter.php": "e88d0b039b6bf027eea65e952e8dc398", - "vendor/monolog/monolog/src/Monolog/Formatter/WildfireFormatter.php": "aef211a836406cfd971f5111ba421210", - "vendor/monolog/monolog/src/Monolog/Handler/AbstractHandler.php": "372e4d4729664c6f81c4ee2e508c4bcc", - "vendor/monolog/monolog/src/Monolog/Handler/AbstractProcessingHandler.php": "58a1399a4c7af3e0d30533aa12eacbd2", - "vendor/monolog/monolog/src/Monolog/Handler/AbstractSyslogHandler.php": "cff86225f9347376dd8fd7ccd6ad61b1", - "vendor/monolog/monolog/src/Monolog/Handler/AmqpHandler.php": "5c9efdf7696a457eb8beb0c5907f1cc0", - "vendor/monolog/monolog/src/Monolog/Handler/BrowserConsoleHandler.php": "25ac4f341e025c2ed329c6f836f43b92", - "vendor/monolog/monolog/src/Monolog/Handler/BufferHandler.php": "d0f9a697e879bc54f2970ecfb2abe615", - "vendor/monolog/monolog/src/Monolog/Handler/ChromePHPHandler.php": "48f7c635b58c957a543c5a2c211fe6e8", - "vendor/monolog/monolog/src/Monolog/Handler/CouchDBHandler.php": "e314d3d5ec3489fea574ff49ba08da1e", - "vendor/monolog/monolog/src/Monolog/Handler/CubeHandler.php": "480aebe4c0931858956b7d94442443b6", - "vendor/monolog/monolog/src/Monolog/Handler/Curl/Util.php": "04db371ec29a14b2f12d431e31fa47e0", - "vendor/monolog/monolog/src/Monolog/Handler/DeduplicationHandler.php": "e5d9a968161dbb7df7c667c3ffd4ea3e", - "vendor/monolog/monolog/src/Monolog/Handler/DoctrineCouchDBHandler.php": "933d7bb6b260b13c6d5f40079cad6550", - "vendor/monolog/monolog/src/Monolog/Handler/DynamoDbHandler.php": "0d49e366336beb1f20d27282c5839ccd", - "vendor/monolog/monolog/src/Monolog/Handler/ElasticaHandler.php": "ea4c4f387d85d803dc029560b7db63c4", - "vendor/monolog/monolog/src/Monolog/Handler/ElasticsearchHandler.php": "2b1d39c1fb26e1930300ded841e14927", - "vendor/monolog/monolog/src/Monolog/Handler/ErrorLogHandler.php": "f4ef1c5795c0a4abdf48e853079bcd6d", - "vendor/monolog/monolog/src/Monolog/Handler/FallbackGroupHandler.php": "d87ab54024b255fdf58eeda51c88388f", - "vendor/monolog/monolog/src/Monolog/Handler/FilterHandler.php": "20fe4eda0ff17c75bb93931ec3de5826", - "vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ActivationStrategyInterface.php": "53906b450068f5af50d008c3f7ae8ca5", - "vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ChannelLevelActivationStrategy.php": "f57d517ffa3f378f8ff08eed4a939b5a", - "vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ErrorLevelActivationStrategy.php": "0f954ee486d4e5708ad2921c20dacedd", - "vendor/monolog/monolog/src/Monolog/Handler/FingersCrossedHandler.php": "9c67ff484c25449804d48484c51d942c", - "vendor/monolog/monolog/src/Monolog/Handler/FirePHPHandler.php": "055e695648c3ada50b501f755700382c", - "vendor/monolog/monolog/src/Monolog/Handler/FleepHookHandler.php": "32747423d8f2e0ccd5811e4175162474", - "vendor/monolog/monolog/src/Monolog/Handler/FlowdockHandler.php": "1890b30632edc7a8b37f6cdcd3265cf4", - "vendor/monolog/monolog/src/Monolog/Handler/FormattableHandlerInterface.php": "2a74dbbf72f23d4bd428085a343b12cf", - "vendor/monolog/monolog/src/Monolog/Handler/FormattableHandlerTrait.php": "c6edbb0602597db125a1618cac0f30f9", - "vendor/monolog/monolog/src/Monolog/Handler/GelfHandler.php": "813813f436bae4f2d2e502ef0e3d8352", - "vendor/monolog/monolog/src/Monolog/Handler/GroupHandler.php": "7bfae6d5fff3a619b287cdaf6b2eee21", - "vendor/monolog/monolog/src/Monolog/Handler/Handler.php": "0e792825b84dc0e81d76e527761be7b8", - "vendor/monolog/monolog/src/Monolog/Handler/HandlerInterface.php": "62d788ffe1ef8336d4c38d2a1502d37d", - "vendor/monolog/monolog/src/Monolog/Handler/HandlerWrapper.php": "e0559e554d78cada34679bfb81604475", - "vendor/monolog/monolog/src/Monolog/Handler/IFTTTHandler.php": "51fd3ac0fb19a5c9cc23067ab9519025", - "vendor/monolog/monolog/src/Monolog/Handler/InsightOpsHandler.php": "bef6ef90c13c8cf8e4b4ffb246e6a307", - "vendor/monolog/monolog/src/Monolog/Handler/LogEntriesHandler.php": "2f920866518bc9148e88950250e11fd9", - "vendor/monolog/monolog/src/Monolog/Handler/LogglyHandler.php": "f00dc870270ee9782f3d9926954169c2", - "vendor/monolog/monolog/src/Monolog/Handler/LogmaticHandler.php": "7bd10c5b44c76f92ac8023c92dd5da9b", - "vendor/monolog/monolog/src/Monolog/Handler/MailHandler.php": "bfac1ac582325754bcf337a6630e8e4d", - "vendor/monolog/monolog/src/Monolog/Handler/MandrillHandler.php": "94256c49b6fb11b3f4c472f6a02136b2", - "vendor/monolog/monolog/src/Monolog/Handler/MissingExtensionException.php": "14dd691a2b94ea45186d35f356e05e32", - "vendor/monolog/monolog/src/Monolog/Handler/MongoDBHandler.php": "0ca6713e6961ab2db523bbb2e603c08e", - "vendor/monolog/monolog/src/Monolog/Handler/NativeMailerHandler.php": "03a8df01d782c3260365712b49c79f5c", - "vendor/monolog/monolog/src/Monolog/Handler/NewRelicHandler.php": "2825956492cb14bf58dccb0942617dbc", - "vendor/monolog/monolog/src/Monolog/Handler/NoopHandler.php": "c496af72b5b4c34b7f9221b62813b4e7", - "vendor/monolog/monolog/src/Monolog/Handler/NullHandler.php": "ffe1d7b741f6da6e390fd162d012d972", - "vendor/monolog/monolog/src/Monolog/Handler/OverflowHandler.php": "494528d569530c30f49f0b77a4ef8544", - "vendor/monolog/monolog/src/Monolog/Handler/PHPConsoleHandler.php": "56eb803cb7168837af1ac47239515491", - "vendor/monolog/monolog/src/Monolog/Handler/ProcessHandler.php": "48e46ff80eeba6f2afd653478c8bea88", - "vendor/monolog/monolog/src/Monolog/Handler/ProcessableHandlerInterface.php": "ec862de1183e2e1985ae7e6e70521309", - "vendor/monolog/monolog/src/Monolog/Handler/ProcessableHandlerTrait.php": "c8b6da910e500a8f5e14e6f985063657", - "vendor/monolog/monolog/src/Monolog/Handler/PsrHandler.php": "6b5d735850bab456c787455bb0ad1ede", - "vendor/monolog/monolog/src/Monolog/Handler/PushoverHandler.php": "9fc78ee33da348188fcd8f29837e4d33", - "vendor/monolog/monolog/src/Monolog/Handler/RedisHandler.php": "2a3018b44f1dc7c28a95e48847bed214", - "vendor/monolog/monolog/src/Monolog/Handler/RedisPubSubHandler.php": "b0bb1b64600fea4ab6465283a02c7821", - "vendor/monolog/monolog/src/Monolog/Handler/RollbarHandler.php": "1884b29527ee38c1a018fd2e13e1a2a5", - "vendor/monolog/monolog/src/Monolog/Handler/RotatingFileHandler.php": "32c8e3488af0f490b84b65a61a9559f5", - "vendor/monolog/monolog/src/Monolog/Handler/SamplingHandler.php": "489ef1fa260a703a932ebf6544a3c98a", - "vendor/monolog/monolog/src/Monolog/Handler/SendGridHandler.php": "dd934be6e79b936fee2867610e744926", - "vendor/monolog/monolog/src/Monolog/Handler/Slack/SlackRecord.php": "476af486dfbb66207844f18feaaff72c", - "vendor/monolog/monolog/src/Monolog/Handler/SlackHandler.php": "92005a60069e50f969f656f8e61343f5", - "vendor/monolog/monolog/src/Monolog/Handler/SlackWebhookHandler.php": "0356ac4e15251cce708fd4b3b96829ce", - "vendor/monolog/monolog/src/Monolog/Handler/SocketHandler.php": "09f38cd959d2356d078efd3facaf65e4", - "vendor/monolog/monolog/src/Monolog/Handler/SqsHandler.php": "fc944e4d0655c7dd454203153516ff8d", - "vendor/monolog/monolog/src/Monolog/Handler/StreamHandler.php": "db7ac9e1334d4d3e362f2e3fe13e8a6c", - "vendor/monolog/monolog/src/Monolog/Handler/SwiftMailerHandler.php": "b0c4852ced34aef846560bb42d4914e1", - "vendor/monolog/monolog/src/Monolog/Handler/SymfonyMailerHandler.php": "382f9fae2d090e66077040f60ddcd8c4", - "vendor/monolog/monolog/src/Monolog/Handler/SyslogHandler.php": "42e8f25289408c72abc29c7e4d3fcab0", - "vendor/monolog/monolog/src/Monolog/Handler/SyslogUdp/UdpSocket.php": "9a4674a27d537205d08fb965f77cbfbf", - "vendor/monolog/monolog/src/Monolog/Handler/SyslogUdpHandler.php": "97ff249f76bed2782ea98eb63649a97a", - "vendor/monolog/monolog/src/Monolog/Handler/TelegramBotHandler.php": "fba19d675c66524225982c1e52d142bf", - "vendor/monolog/monolog/src/Monolog/Handler/TestHandler.php": "0fbdd6bdea4bbfab08058a9265cb80a1", - "vendor/monolog/monolog/src/Monolog/Handler/WebRequestRecognizerTrait.php": "4bbf1a46b0e992c3f50d9f540409e35d", - "vendor/monolog/monolog/src/Monolog/Handler/WhatFailureGroupHandler.php": "7540eeb8cbdd14d3f8829bbd5aafcf58", - "vendor/monolog/monolog/src/Monolog/Handler/ZendMonitorHandler.php": "4ba39fd7cd191360943776cbcd936d4e", - "vendor/monolog/monolog/src/Monolog/LogRecord.php": "82e19a2b08c58205c576879a64f38640", - "vendor/monolog/monolog/src/Monolog/Logger.php": "25536137fd8babbfd16507a47a0f7517", - "vendor/monolog/monolog/src/Monolog/Processor/GitProcessor.php": "890edf1f157418bf13f025cbd6601a5b", - "vendor/monolog/monolog/src/Monolog/Processor/HostnameProcessor.php": "df6e299fb02c94304aae60d9d689129d", - "vendor/monolog/monolog/src/Monolog/Processor/IntrospectionProcessor.php": "dc9c60035a3c45e349dc624f7fe8dfbd", - "vendor/monolog/monolog/src/Monolog/Processor/MemoryPeakUsageProcessor.php": "b3d8579e5b1ff30a4ccd8a9ffab84456", - "vendor/monolog/monolog/src/Monolog/Processor/MemoryProcessor.php": "d07e66e7da3c5271b414a35078cb0a17", - "vendor/monolog/monolog/src/Monolog/Processor/MemoryUsageProcessor.php": "2d0ade1c0ec9ffcb1b17fac0f6812168", - "vendor/monolog/monolog/src/Monolog/Processor/MercurialProcessor.php": "d51bd8adad2eeb86b2bcc056c146c202", - "vendor/monolog/monolog/src/Monolog/Processor/ProcessIdProcessor.php": "95b595b67d610f6ed09321a72c44d2a1", - "vendor/monolog/monolog/src/Monolog/Processor/ProcessorInterface.php": "428dfecc435dd4c3336cff4452b90616", - "vendor/monolog/monolog/src/Monolog/Processor/PsrLogMessageProcessor.php": "e8323c7503b66fe54d7db5be29d91f3e", - "vendor/monolog/monolog/src/Monolog/Processor/TagProcessor.php": "ab7694b1f02ca2bd1f1d7db92597c586", - "vendor/monolog/monolog/src/Monolog/Processor/UidProcessor.php": "9e9237fa4727bb75decc43834800db99", - "vendor/monolog/monolog/src/Monolog/Processor/WebProcessor.php": "3d9378678b9000233a497454e7de5d44", - "vendor/monolog/monolog/src/Monolog/Registry.php": "cf70ca384bb5e262cb9a873930a42de6", - "vendor/monolog/monolog/src/Monolog/ResettableInterface.php": "5eef39a37714e71dd2696f65690221e9", - "vendor/monolog/monolog/src/Monolog/SignalHandler.php": "2c53855933b6da19cd38ab29158f9eb6", - "vendor/monolog/monolog/src/Monolog/Test/TestCase.php": "cc2b3599d597097a725c66235b8143b8", - "vendor/monolog/monolog/src/Monolog/Utils.php": "5fe0aa6542ad9253a9f2f14a1f7360f6", - "vendor/mtdowling/jmespath.php/src/AstRuntime.php": "b9b62025509116b731ab30886832ce4e", - "vendor/mtdowling/jmespath.php/src/CompilerRuntime.php": "420fb6b0852e9bffa2fca1be27b38e86", - "vendor/mtdowling/jmespath.php/src/DebugRuntime.php": "901466b3efa95516c196807277518b8d", - "vendor/mtdowling/jmespath.php/src/Env.php": "5ca86fdaf0c52897868fafe93d41d776", - "vendor/mtdowling/jmespath.php/src/FnDispatcher.php": "a5973cc24083a5e9e1bfeb6853c091f8", - "vendor/mtdowling/jmespath.php/src/JmesPath.php": "4dfff93422b436be92df96e96d9678e1", - "vendor/mtdowling/jmespath.php/src/Lexer.php": "3074d3420a95e4fb0a10a3098f99b8b6", - "vendor/mtdowling/jmespath.php/src/Parser.php": "e45f38b21830e1815d45420f4f3bebe5", - "vendor/mtdowling/jmespath.php/src/SyntaxErrorException.php": "ccc91f9a99315aff02ed0e88c7875bb6", - "vendor/mtdowling/jmespath.php/src/TreeCompiler.php": "75aa347077d4b769dbb628d354a990ed", - "vendor/mtdowling/jmespath.php/src/TreeInterpreter.php": "199668ec649ec3dae416f27a6a543e37", - "vendor/mtdowling/jmespath.php/src/Utils.php": "6e969bee5e9e54c67ea055f0ad303d9f", - "vendor/myclabs/php-enum/src/Enum.php": "f8e2f8f2514ad68a36050c80d91afde4", - "vendor/myclabs/php-enum/src/PHPUnit/Comparator.php": "cfd76fd9affa964cfed8f0809de3bb88", - "vendor/myclabs/php-enum/stubs/Stringable.php": "bb578aecea49f27b5d91777269386141", - "vendor/nesbot/carbon/.phpstorm.meta.php": "442d26c52f86425338eb3df8c354af89", - "vendor/nesbot/carbon/lazy/Carbon/MessageFormatter/MessageFormatterMapperStrongType.php": "1f84e632c31ef5834eb4f32b309974f1", - "vendor/nesbot/carbon/lazy/Carbon/MessageFormatter/MessageFormatterMapperWeakType.php": "37da4ed49fe3e9d220cac5ccaef8f0c0", - "vendor/nesbot/carbon/lazy/Carbon/PHPStan/AbstractMacroBuiltin.php": "64aa9af74407eeeb2ec9b3391c45772c", - "vendor/nesbot/carbon/lazy/Carbon/PHPStan/AbstractMacroStatic.php": "8d71e9884f20944093438517ebdee11c", - "vendor/nesbot/carbon/lazy/Carbon/PHPStan/MacroStrongType.php": "d8c48f64db802f0a9abc275fba8ba3c0", - "vendor/nesbot/carbon/lazy/Carbon/PHPStan/MacroWeakType.php": "009700dda60a666cb9e0132dcb704603", - "vendor/nesbot/carbon/lazy/Carbon/TranslatorStrongType.php": "5494b9f03df73eedfa42eb4b093b9099", - "vendor/nesbot/carbon/lazy/Carbon/TranslatorWeakType.php": "1e8da04e7a9a05837aa8664f2b01a64d", - "vendor/nesbot/carbon/src/Carbon/AbstractTranslator.php": "05bc3bed12b8a0169295f26f351f61c2", - "vendor/nesbot/carbon/src/Carbon/Carbon.php": "bbcdbe33c2f4550c34219999c2e8dc09", - "vendor/nesbot/carbon/src/Carbon/CarbonConverterInterface.php": "01a26a1ad8a9fd40f79d7b05b7b7038f", - "vendor/nesbot/carbon/src/Carbon/CarbonImmutable.php": "0f33ec5644732b52e6e75adf8f3ad554", - "vendor/nesbot/carbon/src/Carbon/CarbonInterface.php": "00a53b9197ff4795b2a6d93aa177832a", - "vendor/nesbot/carbon/src/Carbon/CarbonInterval.php": "1c8a10280b6acb3b35e0f6083fbef53f", - "vendor/nesbot/carbon/src/Carbon/CarbonPeriod.php": "ade9a3109dcdef8f296824046fdf65ac", - "vendor/nesbot/carbon/src/Carbon/CarbonPeriodImmutable.php": "2e59cd1d79bb48ad61f4b5c72cc88746", - "vendor/nesbot/carbon/src/Carbon/CarbonTimeZone.php": "e1cc3a343f59974f0bd7f35df37501ed", - "vendor/nesbot/carbon/src/Carbon/Cli/Invoker.php": "861c12c1e380a9886ec953dbda7b32bf", - "vendor/nesbot/carbon/src/Carbon/Doctrine/CarbonDoctrineType.php": "896273421c8400ec90774e2be8b5a512", - "vendor/nesbot/carbon/src/Carbon/Doctrine/CarbonImmutableType.php": "a69cf8a03a0dbbf2d6c5c56264fb057f", - "vendor/nesbot/carbon/src/Carbon/Doctrine/CarbonType.php": "65ed22315b14cc03d9adb148311f91a5", - "vendor/nesbot/carbon/src/Carbon/Doctrine/CarbonTypeConverter.php": "bcb3fe5a46348a0dfb22be1672d5c568", - "vendor/nesbot/carbon/src/Carbon/Doctrine/DateTimeDefaultPrecision.php": "38e85df0614d13f44f48ebd9842b83ba", - "vendor/nesbot/carbon/src/Carbon/Doctrine/DateTimeImmutableType.php": "0e6a1d4020ddb7c12f91e8ba6b866b59", - "vendor/nesbot/carbon/src/Carbon/Doctrine/DateTimeType.php": "4f0a8fb05490301dbd5d2d7167d6fb7b", - "vendor/nesbot/carbon/src/Carbon/Exceptions/BadComparisonUnitException.php": "13b8548475907cc9096f9c344a82edf3", - "vendor/nesbot/carbon/src/Carbon/Exceptions/BadFluentConstructorException.php": "56fcee370b6f6c0ede5a81bcdd0d9568", - "vendor/nesbot/carbon/src/Carbon/Exceptions/BadFluentSetterException.php": "8a4452b84fa5572f1afb8a8ea7d4c5f3", - "vendor/nesbot/carbon/src/Carbon/Exceptions/BadMethodCallException.php": "369a5012b79d06b787f0006e36d67d62", - "vendor/nesbot/carbon/src/Carbon/Exceptions/EndLessPeriodException.php": "ea0c5599b38cb9acc2f47ab0d47a5a25", - "vendor/nesbot/carbon/src/Carbon/Exceptions/Exception.php": "3cb6b13a5044dadc9b572e3a7b6e6de7", - "vendor/nesbot/carbon/src/Carbon/Exceptions/ImmutableException.php": "17f4759cd8bf8d6c8e0bdcbe10f0bbb5", - "vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidArgumentException.php": "0d6404bedcb349a96675bbede2619e88", - "vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidCastException.php": "7111727edd86e10f6fed2ca923a395e7", - "vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidDateException.php": "64e6b9eab6ed8489987114cc4a5f835f", - "vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidFormatException.php": "1dc6c58130bde9b7111d5f468b6ad6a9", - "vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidIntervalException.php": "8853aa2c96a85eac58b4f575e5d2a673", - "vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidPeriodDateException.php": "33ed0640d2602dae917b9859f6539eae", - "vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidPeriodParameterException.php": "9672ce0f688e4cc8b40bd8561515d861", - "vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidTimeZoneException.php": "fa2ee4678d99e6b590d08298af4b7684", - "vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidTypeException.php": "cb92043ea1f480d25b68034a0f40768e", - "vendor/nesbot/carbon/src/Carbon/Exceptions/NotACarbonClassException.php": "60d3495d4039cbd0e6f486e891df3ddc", - "vendor/nesbot/carbon/src/Carbon/Exceptions/NotAPeriodException.php": "ca17bb3ddda4dbed634a151e9328cc3f", - "vendor/nesbot/carbon/src/Carbon/Exceptions/NotLocaleAwareException.php": "af6805971276b522ce99611595a993d1", - "vendor/nesbot/carbon/src/Carbon/Exceptions/OutOfRangeException.php": "0ec8887843ecd0d4060bdeee5b6f5f34", - "vendor/nesbot/carbon/src/Carbon/Exceptions/ParseErrorException.php": "dc943a80d29db452e6f18b5ed3a326cc", - "vendor/nesbot/carbon/src/Carbon/Exceptions/RuntimeException.php": "b0ecdca89f929331c4a9201838305727", - "vendor/nesbot/carbon/src/Carbon/Exceptions/UnitException.php": "c3eac46e7aedfa4215e8640c30f90424", - "vendor/nesbot/carbon/src/Carbon/Exceptions/UnitNotConfiguredException.php": "bd19a9c6875a4f9af61663443d4da6d7", - "vendor/nesbot/carbon/src/Carbon/Exceptions/UnknownGetterException.php": "5687966c966137d557ad6314f8492c57", - "vendor/nesbot/carbon/src/Carbon/Exceptions/UnknownMethodException.php": "ad8d0732a7f399360bb8a0aff2bdfc95", - "vendor/nesbot/carbon/src/Carbon/Exceptions/UnknownSetterException.php": "47bf16085e6dabac41c3f852259f9a6b", - "vendor/nesbot/carbon/src/Carbon/Exceptions/UnknownUnitException.php": "34a1355e8519e7d84a582d0342c11d09", - "vendor/nesbot/carbon/src/Carbon/Exceptions/UnreachableException.php": "228ae53c27ac3106fbb457088e98e09e", - "vendor/nesbot/carbon/src/Carbon/Factory.php": "c9767da38c18cf25e4a781053bdb2b6c", - "vendor/nesbot/carbon/src/Carbon/FactoryImmutable.php": "b262370eb61ed0ad2797188149759e06", - "vendor/nesbot/carbon/src/Carbon/Lang/aa.php": "d522a42d8ffb78fbd2f77b0f0d8f0ffd", - "vendor/nesbot/carbon/src/Carbon/Lang/aa_DJ.php": "a02f586d7a3867e1ac22f1d0cc3b24a4", - "vendor/nesbot/carbon/src/Carbon/Lang/aa_ER.php": "dc239b043b2f51504d842808978e0508", - "vendor/nesbot/carbon/src/Carbon/Lang/aa_ER@saaho.php": "bb9a2faadac635fe326968f65774f494", - "vendor/nesbot/carbon/src/Carbon/Lang/aa_ET.php": "141383ecb6486ab2c63f4bd640578a85", - "vendor/nesbot/carbon/src/Carbon/Lang/af.php": "4f531a14febaf0f21abc63b737abaec7", - "vendor/nesbot/carbon/src/Carbon/Lang/af_NA.php": "525eed59e9a0000c54bda95ecf7c26a1", - "vendor/nesbot/carbon/src/Carbon/Lang/af_ZA.php": "d4b9a359390683e6dcfe057c00282e9d", - "vendor/nesbot/carbon/src/Carbon/Lang/agq.php": "4ad396039bde184f2dae1bc76e56c415", - "vendor/nesbot/carbon/src/Carbon/Lang/agr.php": "342e1b0b3e58861b86d767d0db91c465", - "vendor/nesbot/carbon/src/Carbon/Lang/agr_PE.php": "14610b74acde00db4c9c4f811e05c6d8", - "vendor/nesbot/carbon/src/Carbon/Lang/ak.php": "b47b2219edc8592b30988c6811ddc09d", - "vendor/nesbot/carbon/src/Carbon/Lang/ak_GH.php": "c034c8b3ef6c9d7bd30e3db2842bce9b", - "vendor/nesbot/carbon/src/Carbon/Lang/am.php": "d7a99e6af761c788ca70047c87ef6d71", - "vendor/nesbot/carbon/src/Carbon/Lang/am_ET.php": "f2e969845c02e1f4301cb7815f6dbc0f", - "vendor/nesbot/carbon/src/Carbon/Lang/an.php": "578ad4119b19333703a545709fa441e3", - "vendor/nesbot/carbon/src/Carbon/Lang/an_ES.php": "f27726e4bbe1da0c08f8ccdb2a8a4ebe", - "vendor/nesbot/carbon/src/Carbon/Lang/anp.php": "6e1516d9ee0477cb606d244f28229c81", - "vendor/nesbot/carbon/src/Carbon/Lang/anp_IN.php": "40d34a09fcae0e56a924f40deeb2235d", - "vendor/nesbot/carbon/src/Carbon/Lang/ar.php": "4b29763600254e95ae6743a476a22561", - "vendor/nesbot/carbon/src/Carbon/Lang/ar_AE.php": "0508ba60b7ade1cf21e292f39a57639c", - "vendor/nesbot/carbon/src/Carbon/Lang/ar_BH.php": "feaed995c37ea48ee124f4a8a66d6ca0", - "vendor/nesbot/carbon/src/Carbon/Lang/ar_DJ.php": "daf614197fbf0fd5b0ece31935c67e76", - "vendor/nesbot/carbon/src/Carbon/Lang/ar_DZ.php": "932e2ee6d19407d889700faf595795c6", - "vendor/nesbot/carbon/src/Carbon/Lang/ar_EG.php": "feaed995c37ea48ee124f4a8a66d6ca0", - "vendor/nesbot/carbon/src/Carbon/Lang/ar_EH.php": "daf614197fbf0fd5b0ece31935c67e76", - "vendor/nesbot/carbon/src/Carbon/Lang/ar_ER.php": "daf614197fbf0fd5b0ece31935c67e76", - "vendor/nesbot/carbon/src/Carbon/Lang/ar_IL.php": "daf614197fbf0fd5b0ece31935c67e76", - "vendor/nesbot/carbon/src/Carbon/Lang/ar_IN.php": "f52fb03bfad8f4a1c9aa8f47371774c1", - "vendor/nesbot/carbon/src/Carbon/Lang/ar_IQ.php": "f10cacecae98bdcd731b148b368c39b1", - "vendor/nesbot/carbon/src/Carbon/Lang/ar_JO.php": "f10cacecae98bdcd731b148b368c39b1", - "vendor/nesbot/carbon/src/Carbon/Lang/ar_KM.php": "daf614197fbf0fd5b0ece31935c67e76", - "vendor/nesbot/carbon/src/Carbon/Lang/ar_KW.php": "5ba8a1f94bd8dcb114fe7d0182fccbe9", - "vendor/nesbot/carbon/src/Carbon/Lang/ar_LB.php": "09c8e9c6d4e5282e5df15a9c26c07491", - "vendor/nesbot/carbon/src/Carbon/Lang/ar_LY.php": "7a8a9b193490342611431dc848c51ca0", - "vendor/nesbot/carbon/src/Carbon/Lang/ar_MA.php": "d7badcdd1beaa083bd765195151e143b", - "vendor/nesbot/carbon/src/Carbon/Lang/ar_MR.php": "daf614197fbf0fd5b0ece31935c67e76", - "vendor/nesbot/carbon/src/Carbon/Lang/ar_OM.php": "feaed995c37ea48ee124f4a8a66d6ca0", - "vendor/nesbot/carbon/src/Carbon/Lang/ar_PS.php": "d876b7243d776405d2f225a06bed47b3", - "vendor/nesbot/carbon/src/Carbon/Lang/ar_QA.php": "feaed995c37ea48ee124f4a8a66d6ca0", - "vendor/nesbot/carbon/src/Carbon/Lang/ar_SA.php": "41aba5605c9df12f619ada5c7e1e24f8", - "vendor/nesbot/carbon/src/Carbon/Lang/ar_SD.php": "feaed995c37ea48ee124f4a8a66d6ca0", - "vendor/nesbot/carbon/src/Carbon/Lang/ar_SO.php": "daf614197fbf0fd5b0ece31935c67e76", - "vendor/nesbot/carbon/src/Carbon/Lang/ar_SS.php": "ad84e9c36f488ae2084dce9aa3788e02", - "vendor/nesbot/carbon/src/Carbon/Lang/ar_SY.php": "f10cacecae98bdcd731b148b368c39b1", - "vendor/nesbot/carbon/src/Carbon/Lang/ar_Shakl.php": "fc2696466e5d57431ea4b28fe721c537", - "vendor/nesbot/carbon/src/Carbon/Lang/ar_TD.php": "daf614197fbf0fd5b0ece31935c67e76", - "vendor/nesbot/carbon/src/Carbon/Lang/ar_TN.php": "dae02f3e09aae30ec9fd02a286d56a47", - "vendor/nesbot/carbon/src/Carbon/Lang/ar_YE.php": "b5819f9e76a682eeb8b71863bc5d8f70", - "vendor/nesbot/carbon/src/Carbon/Lang/as.php": "8f54df47dfabc638a36795b82f8d7cd0", - "vendor/nesbot/carbon/src/Carbon/Lang/as_IN.php": "67e3c26e542201cd7d22aa5985d94d91", - "vendor/nesbot/carbon/src/Carbon/Lang/asa.php": "087d8aa736204c786aa78653227d1011", - "vendor/nesbot/carbon/src/Carbon/Lang/ast.php": "da748101cf9a7ba0cca1eafdfc468469", - "vendor/nesbot/carbon/src/Carbon/Lang/ast_ES.php": "9ad319a7edc4bb021e94371bb9ed9c54", - "vendor/nesbot/carbon/src/Carbon/Lang/ayc.php": "142eab4e1968df04f5c976adeed61b6b", - "vendor/nesbot/carbon/src/Carbon/Lang/ayc_PE.php": "cff8144a72e17a996d89d7d15d55ba1b", - "vendor/nesbot/carbon/src/Carbon/Lang/az.php": "5b1d42f82d52354c204d70e6571364cb", - "vendor/nesbot/carbon/src/Carbon/Lang/az_AZ.php": "83902cfb6c15e73b9f1c8848abc71338", - "vendor/nesbot/carbon/src/Carbon/Lang/az_Cyrl.php": "84e45109ccaa9332837b3ad873962227", - "vendor/nesbot/carbon/src/Carbon/Lang/az_IR.php": "d16181c1282a27c7b7abf893263180e7", - "vendor/nesbot/carbon/src/Carbon/Lang/az_Latn.php": "57e4745feeeb84189c55c7fce6e133bc", - "vendor/nesbot/carbon/src/Carbon/Lang/bas.php": "697cb09299cbba43613dcaeaa3b24b11", - "vendor/nesbot/carbon/src/Carbon/Lang/be.php": "a6ce8b8cb5933a65b5a8a1bde79b106f", - "vendor/nesbot/carbon/src/Carbon/Lang/be_BY.php": "becf71e64bbe9db2605b2af8bd0e4a05", - "vendor/nesbot/carbon/src/Carbon/Lang/be_BY@latin.php": "3a6e1a92bdaefdbecef2d087413ce894", - "vendor/nesbot/carbon/src/Carbon/Lang/bem.php": "40d4626c7c2beae66d8733e597ae8b20", - "vendor/nesbot/carbon/src/Carbon/Lang/bem_ZM.php": "1132c39343e611c9f564da11b2289aa6", - "vendor/nesbot/carbon/src/Carbon/Lang/ber.php": "f286671c0975b70ceb266f3a6c4a76d0", - "vendor/nesbot/carbon/src/Carbon/Lang/ber_DZ.php": "ad05d65d8f983a82261aa8fb5df341bc", - "vendor/nesbot/carbon/src/Carbon/Lang/ber_MA.php": "ad05d65d8f983a82261aa8fb5df341bc", - "vendor/nesbot/carbon/src/Carbon/Lang/bez.php": "a57436d4fc1341ee04abd8b06a1a7e40", - "vendor/nesbot/carbon/src/Carbon/Lang/bg.php": "005162d53857788034eb8ecfa66660ce", - "vendor/nesbot/carbon/src/Carbon/Lang/bg_BG.php": "1090022906220743f4be37e79a1aa5e2", - "vendor/nesbot/carbon/src/Carbon/Lang/bhb.php": "72c06455338b125880e8943b2142a1a3", - "vendor/nesbot/carbon/src/Carbon/Lang/bhb_IN.php": "67d42359cf7dba1aa5861716c1816419", - "vendor/nesbot/carbon/src/Carbon/Lang/bho.php": "6d914ec4c13532dbfb314c6e3f1fd8ef", - "vendor/nesbot/carbon/src/Carbon/Lang/bho_IN.php": "784d2cba35ad1b4e38acf087e3cc603f", - "vendor/nesbot/carbon/src/Carbon/Lang/bi.php": "ede642aaba0e7b6d6a4463a8df4060de", - "vendor/nesbot/carbon/src/Carbon/Lang/bi_VU.php": "63af9fbdfc69dda6c6a99bb0c7ec3078", - "vendor/nesbot/carbon/src/Carbon/Lang/bm.php": "c08f1fa94b999bf35bee4e6cacbc9609", - "vendor/nesbot/carbon/src/Carbon/Lang/bn.php": "de84cbc9b8ddfefad55d4ab91b4a5aaa", - "vendor/nesbot/carbon/src/Carbon/Lang/bn_BD.php": "6fec58e062c1a530ab8c3d770da74133", - "vendor/nesbot/carbon/src/Carbon/Lang/bn_IN.php": "06d93d29679b3ca3df8cd165ad565904", - "vendor/nesbot/carbon/src/Carbon/Lang/bo.php": "401c728f2f2a647b1fa36e97e97b71bf", - "vendor/nesbot/carbon/src/Carbon/Lang/bo_CN.php": "6aa3ca4928669042e53a1b4a1556fedd", - "vendor/nesbot/carbon/src/Carbon/Lang/bo_IN.php": "58c5d241ce3d9de33592706a20bcbe7e", - "vendor/nesbot/carbon/src/Carbon/Lang/br.php": "4ad5e4498a04300ac9e297ec14a9118b", - "vendor/nesbot/carbon/src/Carbon/Lang/br_FR.php": "2e0df46597e70003c538f36a50a27d60", - "vendor/nesbot/carbon/src/Carbon/Lang/brx.php": "e4b0a53880e37c574b9d51c23eb3d49d", - "vendor/nesbot/carbon/src/Carbon/Lang/brx_IN.php": "fd5b7afe34ea534f9ecc041330b9621a", - "vendor/nesbot/carbon/src/Carbon/Lang/bs.php": "ce216ce8ee6eace22608e35ec1bf43df", - "vendor/nesbot/carbon/src/Carbon/Lang/bs_BA.php": "4af4051750cda3c1ab1fc5410a0c9f80", - "vendor/nesbot/carbon/src/Carbon/Lang/bs_Cyrl.php": "aff1da6cb0f7fd5de53457c865d6959a", - "vendor/nesbot/carbon/src/Carbon/Lang/bs_Latn.php": "d820f81110bd1b9b3484ba4db3396fcd", - "vendor/nesbot/carbon/src/Carbon/Lang/byn.php": "cacb8ad357a1298b15b32e7016b9de29", - "vendor/nesbot/carbon/src/Carbon/Lang/byn_ER.php": "fb20d0149808e17a0b82dcc8f4e4711e", - "vendor/nesbot/carbon/src/Carbon/Lang/ca.php": "8ec600e039eeacbee23f63597cf78d11", - "vendor/nesbot/carbon/src/Carbon/Lang/ca_AD.php": "1647fdff6b8dbdea9c110bfb60fa49c3", - "vendor/nesbot/carbon/src/Carbon/Lang/ca_ES.php": "5ae8e1d569c8c035d89bcd458d9e16a5", - "vendor/nesbot/carbon/src/Carbon/Lang/ca_ES_Valencia.php": "2431afbd71124a8bf83362290dcea2f6", - "vendor/nesbot/carbon/src/Carbon/Lang/ca_FR.php": "1647fdff6b8dbdea9c110bfb60fa49c3", - "vendor/nesbot/carbon/src/Carbon/Lang/ca_IT.php": "1647fdff6b8dbdea9c110bfb60fa49c3", - "vendor/nesbot/carbon/src/Carbon/Lang/ccp.php": "f10cbbc922ca6aac44c66a752ebaba5b", - "vendor/nesbot/carbon/src/Carbon/Lang/ccp_IN.php": "885b97a8f2ef3925c1ace9504dfd94ba", - "vendor/nesbot/carbon/src/Carbon/Lang/ce.php": "6632aa3d4da34598f2ff25f1b2f669e1", - "vendor/nesbot/carbon/src/Carbon/Lang/ce_RU.php": "fef58af402dda06ed3ee5691232ea5d0", - "vendor/nesbot/carbon/src/Carbon/Lang/cgg.php": "bb8c88fa8d5a7e8e62c4e8ce39cc1d95", - "vendor/nesbot/carbon/src/Carbon/Lang/chr.php": "1c19f801af1332decd08a2120ab94c92", - "vendor/nesbot/carbon/src/Carbon/Lang/chr_US.php": "0cba581037672cdb6f8ad1044c7f62c1", - "vendor/nesbot/carbon/src/Carbon/Lang/ckb.php": "c2bc92ff41eb700344ea9dd13de0f05f", - "vendor/nesbot/carbon/src/Carbon/Lang/cmn.php": "0a97d33ecfc537aaab1086a2bc2820b3", - "vendor/nesbot/carbon/src/Carbon/Lang/cmn_TW.php": "3802df853864cc7b6016729d32f69412", - "vendor/nesbot/carbon/src/Carbon/Lang/crh.php": "676dce8985765e8139e3ce58b5964d40", - "vendor/nesbot/carbon/src/Carbon/Lang/crh_UA.php": "f9cc7443b0b1329c68e619a6abf993c7", - "vendor/nesbot/carbon/src/Carbon/Lang/cs.php": "5c3309782de1f6d1a0a436d52dbc63cb", - "vendor/nesbot/carbon/src/Carbon/Lang/cs_CZ.php": "fc9885e61c8369a83cef27d72e0b7dc6", - "vendor/nesbot/carbon/src/Carbon/Lang/csb.php": "2a29df5eb5704662822f0b9e4060874c", - "vendor/nesbot/carbon/src/Carbon/Lang/csb_PL.php": "c66eeba77748baa5a66e7fd250e4d43a", - "vendor/nesbot/carbon/src/Carbon/Lang/cu.php": "8ad65543f925a68e2d024e019e944741", - "vendor/nesbot/carbon/src/Carbon/Lang/cv.php": "825108797ee04b898d4b1712d9ddf041", - "vendor/nesbot/carbon/src/Carbon/Lang/cv_RU.php": "c0b7d9f4059c9aa26a9ea9553aff56ba", - "vendor/nesbot/carbon/src/Carbon/Lang/cy.php": "8d86d87d4bd3a26d4555965b9761aa5a", - "vendor/nesbot/carbon/src/Carbon/Lang/cy_GB.php": "cbe99d5594cf63e61492326cbbc6d540", - "vendor/nesbot/carbon/src/Carbon/Lang/da.php": "c1ed6bd514eb2adabdcc55bb2635db15", - "vendor/nesbot/carbon/src/Carbon/Lang/da_DK.php": "f95f5b2090b12ddf1007f8f807359a8d", - "vendor/nesbot/carbon/src/Carbon/Lang/da_GL.php": "1658accd2a641a103324a16ca76e60c2", - "vendor/nesbot/carbon/src/Carbon/Lang/dav.php": "a77ad85369e9e4ce73628f6016b47ec3", - "vendor/nesbot/carbon/src/Carbon/Lang/de.php": "deceeed165751d747dd11e3486d07cb2", - "vendor/nesbot/carbon/src/Carbon/Lang/de_AT.php": "a24e8d40cb0e8b90a3acdeac5d3026b8", - "vendor/nesbot/carbon/src/Carbon/Lang/de_BE.php": "628aec86c8730cf78dbe0b498a7194cd", - "vendor/nesbot/carbon/src/Carbon/Lang/de_CH.php": "2121a98bcc8e14507e9c0ba6315fcb78", - "vendor/nesbot/carbon/src/Carbon/Lang/de_DE.php": "670cd9222f0a3137f9f461f229d8df26", - "vendor/nesbot/carbon/src/Carbon/Lang/de_IT.php": "433808238ea93249939bd99054ee7953", - "vendor/nesbot/carbon/src/Carbon/Lang/de_LI.php": "6debef4223c1e0751c63f1f92a1c5a41", - "vendor/nesbot/carbon/src/Carbon/Lang/de_LU.php": "628aec86c8730cf78dbe0b498a7194cd", - "vendor/nesbot/carbon/src/Carbon/Lang/dje.php": "5e635cf36740d5b372ed06d883e1c7ec", - "vendor/nesbot/carbon/src/Carbon/Lang/doi.php": "3d146d5f1b9f1d57ec960d9d7d6859fd", - "vendor/nesbot/carbon/src/Carbon/Lang/doi_IN.php": "40c385d8ffe5c3f1aa66f1561252f518", - "vendor/nesbot/carbon/src/Carbon/Lang/dsb.php": "61f714298a41b97f4a8973b6ee338e94", - "vendor/nesbot/carbon/src/Carbon/Lang/dsb_DE.php": "a460b81e0d8892f27c73e60d6352bc37", - "vendor/nesbot/carbon/src/Carbon/Lang/dua.php": "570d7d6106aeb17f959eea63b1c19f49", - "vendor/nesbot/carbon/src/Carbon/Lang/dv.php": "9236d632ae1159ba4a8bce6398024751", - "vendor/nesbot/carbon/src/Carbon/Lang/dv_MV.php": "d5482e1c659a183754923c9c48a38776", - "vendor/nesbot/carbon/src/Carbon/Lang/dyo.php": "c5bb1d284cc58dfb7fee70082245845d", - "vendor/nesbot/carbon/src/Carbon/Lang/dz.php": "6d79b01b565d6c0c6d9de52fe1dccd80", - "vendor/nesbot/carbon/src/Carbon/Lang/dz_BT.php": "918db5392a2b06357b080db982d66c71", - "vendor/nesbot/carbon/src/Carbon/Lang/ebu.php": "8331d0c5f002e45d96709616bf28e29b", - "vendor/nesbot/carbon/src/Carbon/Lang/ee.php": "9ff0d0bd029a41835056975869827aea", - "vendor/nesbot/carbon/src/Carbon/Lang/ee_TG.php": "bed0ee0569c1c0c62ed2634296933332", - "vendor/nesbot/carbon/src/Carbon/Lang/el.php": "157d5a159b424cb9e81878cc3d3737a4", - "vendor/nesbot/carbon/src/Carbon/Lang/el_CY.php": "96c65d374bc114c154446a3f28b5a103", - "vendor/nesbot/carbon/src/Carbon/Lang/el_GR.php": "692dbd4c80772a0296c5028e50f2f78f", - "vendor/nesbot/carbon/src/Carbon/Lang/en.php": "73cd3451724af605c01c92c5382f9608", - "vendor/nesbot/carbon/src/Carbon/Lang/en_001.php": "f2ba134a40867b93dd535d5a40521aa2", - "vendor/nesbot/carbon/src/Carbon/Lang/en_150.php": "f2ba134a40867b93dd535d5a40521aa2", - "vendor/nesbot/carbon/src/Carbon/Lang/en_AG.php": "600a593d2b81dbc54a42709f52c436d4", - "vendor/nesbot/carbon/src/Carbon/Lang/en_AI.php": "f2ba134a40867b93dd535d5a40521aa2", - "vendor/nesbot/carbon/src/Carbon/Lang/en_AS.php": "32d8353729e8e10efd4de6d2926bce1d", - "vendor/nesbot/carbon/src/Carbon/Lang/en_AT.php": "f2ba134a40867b93dd535d5a40521aa2", - "vendor/nesbot/carbon/src/Carbon/Lang/en_AU.php": "ff7d9db94f794376f82c42b9e7b03e3f", - "vendor/nesbot/carbon/src/Carbon/Lang/en_BB.php": "f2ba134a40867b93dd535d5a40521aa2", - "vendor/nesbot/carbon/src/Carbon/Lang/en_BE.php": "f2ba134a40867b93dd535d5a40521aa2", - "vendor/nesbot/carbon/src/Carbon/Lang/en_BI.php": "f2ba134a40867b93dd535d5a40521aa2", - "vendor/nesbot/carbon/src/Carbon/Lang/en_BM.php": "f2ba134a40867b93dd535d5a40521aa2", - "vendor/nesbot/carbon/src/Carbon/Lang/en_BS.php": "32d8353729e8e10efd4de6d2926bce1d", - "vendor/nesbot/carbon/src/Carbon/Lang/en_BW.php": "32d8353729e8e10efd4de6d2926bce1d", - "vendor/nesbot/carbon/src/Carbon/Lang/en_BZ.php": "32d8353729e8e10efd4de6d2926bce1d", - "vendor/nesbot/carbon/src/Carbon/Lang/en_CA.php": "614dda51b19b2d1faa4bcac84bbb17d4", - "vendor/nesbot/carbon/src/Carbon/Lang/en_CC.php": "f2ba134a40867b93dd535d5a40521aa2", - "vendor/nesbot/carbon/src/Carbon/Lang/en_CH.php": "f2ba134a40867b93dd535d5a40521aa2", - "vendor/nesbot/carbon/src/Carbon/Lang/en_CK.php": "f2ba134a40867b93dd535d5a40521aa2", - "vendor/nesbot/carbon/src/Carbon/Lang/en_CM.php": "f2ba134a40867b93dd535d5a40521aa2", - "vendor/nesbot/carbon/src/Carbon/Lang/en_CX.php": "f2ba134a40867b93dd535d5a40521aa2", - "vendor/nesbot/carbon/src/Carbon/Lang/en_CY.php": "704857b4e1bacd8657104566997f3041", - "vendor/nesbot/carbon/src/Carbon/Lang/en_DE.php": "f2ba134a40867b93dd535d5a40521aa2", - "vendor/nesbot/carbon/src/Carbon/Lang/en_DG.php": "f2ba134a40867b93dd535d5a40521aa2", - "vendor/nesbot/carbon/src/Carbon/Lang/en_DK.php": "5323001f526a4c7e1e0e5e857a97a2fc", - "vendor/nesbot/carbon/src/Carbon/Lang/en_DM.php": "32d8353729e8e10efd4de6d2926bce1d", - "vendor/nesbot/carbon/src/Carbon/Lang/en_ER.php": "f2ba134a40867b93dd535d5a40521aa2", - "vendor/nesbot/carbon/src/Carbon/Lang/en_FI.php": "f2ba134a40867b93dd535d5a40521aa2", - "vendor/nesbot/carbon/src/Carbon/Lang/en_FJ.php": "f2ba134a40867b93dd535d5a40521aa2", - "vendor/nesbot/carbon/src/Carbon/Lang/en_FK.php": "f2ba134a40867b93dd535d5a40521aa2", - "vendor/nesbot/carbon/src/Carbon/Lang/en_FM.php": "f2ba134a40867b93dd535d5a40521aa2", - "vendor/nesbot/carbon/src/Carbon/Lang/en_GB.php": "c82d243acbf651e6fef1e2f2c37c4c31", - "vendor/nesbot/carbon/src/Carbon/Lang/en_GD.php": "f2ba134a40867b93dd535d5a40521aa2", - "vendor/nesbot/carbon/src/Carbon/Lang/en_GG.php": "f2ba134a40867b93dd535d5a40521aa2", - "vendor/nesbot/carbon/src/Carbon/Lang/en_GH.php": "f2ba134a40867b93dd535d5a40521aa2", - "vendor/nesbot/carbon/src/Carbon/Lang/en_GI.php": "f2ba134a40867b93dd535d5a40521aa2", - "vendor/nesbot/carbon/src/Carbon/Lang/en_GM.php": "f2ba134a40867b93dd535d5a40521aa2", - "vendor/nesbot/carbon/src/Carbon/Lang/en_GU.php": "32d8353729e8e10efd4de6d2926bce1d", - "vendor/nesbot/carbon/src/Carbon/Lang/en_GY.php": "f2ba134a40867b93dd535d5a40521aa2", - "vendor/nesbot/carbon/src/Carbon/Lang/en_HK.php": "9e40dcb36f58ddb0f4be339765e5ca25", - "vendor/nesbot/carbon/src/Carbon/Lang/en_IE.php": "caad63faaed25318604bcfd8b03ec794", - "vendor/nesbot/carbon/src/Carbon/Lang/en_IL.php": "11d7a035aff9d466b8995a04ca07742d", - "vendor/nesbot/carbon/src/Carbon/Lang/en_IM.php": "f2ba134a40867b93dd535d5a40521aa2", - "vendor/nesbot/carbon/src/Carbon/Lang/en_IN.php": "41da236c907371d5d9228fe8a9a8a8d4", - "vendor/nesbot/carbon/src/Carbon/Lang/en_IO.php": "f2ba134a40867b93dd535d5a40521aa2", - "vendor/nesbot/carbon/src/Carbon/Lang/en_ISO.php": "8ab124e38b4ac2dcbbe81846e39b6c82", - "vendor/nesbot/carbon/src/Carbon/Lang/en_JE.php": "f2ba134a40867b93dd535d5a40521aa2", - "vendor/nesbot/carbon/src/Carbon/Lang/en_JM.php": "32d8353729e8e10efd4de6d2926bce1d", - "vendor/nesbot/carbon/src/Carbon/Lang/en_KE.php": "32d8353729e8e10efd4de6d2926bce1d", - "vendor/nesbot/carbon/src/Carbon/Lang/en_KI.php": "f2ba134a40867b93dd535d5a40521aa2", - "vendor/nesbot/carbon/src/Carbon/Lang/en_KN.php": "f2ba134a40867b93dd535d5a40521aa2", - "vendor/nesbot/carbon/src/Carbon/Lang/en_KY.php": "f2ba134a40867b93dd535d5a40521aa2", - "vendor/nesbot/carbon/src/Carbon/Lang/en_LC.php": "f2ba134a40867b93dd535d5a40521aa2", - "vendor/nesbot/carbon/src/Carbon/Lang/en_LR.php": "f2ba134a40867b93dd535d5a40521aa2", - "vendor/nesbot/carbon/src/Carbon/Lang/en_LS.php": "f2ba134a40867b93dd535d5a40521aa2", - "vendor/nesbot/carbon/src/Carbon/Lang/en_MG.php": "f2ba134a40867b93dd535d5a40521aa2", - "vendor/nesbot/carbon/src/Carbon/Lang/en_MH.php": "32d8353729e8e10efd4de6d2926bce1d", - "vendor/nesbot/carbon/src/Carbon/Lang/en_MO.php": "32d8353729e8e10efd4de6d2926bce1d", - "vendor/nesbot/carbon/src/Carbon/Lang/en_MP.php": "f2ba134a40867b93dd535d5a40521aa2", - "vendor/nesbot/carbon/src/Carbon/Lang/en_MS.php": "f2ba134a40867b93dd535d5a40521aa2", - "vendor/nesbot/carbon/src/Carbon/Lang/en_MT.php": "32d8353729e8e10efd4de6d2926bce1d", - "vendor/nesbot/carbon/src/Carbon/Lang/en_MU.php": "f2ba134a40867b93dd535d5a40521aa2", - "vendor/nesbot/carbon/src/Carbon/Lang/en_MW.php": "f2ba134a40867b93dd535d5a40521aa2", - "vendor/nesbot/carbon/src/Carbon/Lang/en_MY.php": "f2ba134a40867b93dd535d5a40521aa2", - "vendor/nesbot/carbon/src/Carbon/Lang/en_NA.php": "f2ba134a40867b93dd535d5a40521aa2", - "vendor/nesbot/carbon/src/Carbon/Lang/en_NF.php": "f2ba134a40867b93dd535d5a40521aa2", - "vendor/nesbot/carbon/src/Carbon/Lang/en_NG.php": "412bd3d8b8297044c654deabfc3cfe51", - "vendor/nesbot/carbon/src/Carbon/Lang/en_NL.php": "f2ba134a40867b93dd535d5a40521aa2", - "vendor/nesbot/carbon/src/Carbon/Lang/en_NR.php": "f2ba134a40867b93dd535d5a40521aa2", - "vendor/nesbot/carbon/src/Carbon/Lang/en_NU.php": "f2ba134a40867b93dd535d5a40521aa2", - "vendor/nesbot/carbon/src/Carbon/Lang/en_NZ.php": "1242abf3455a052dd6868df8f4cc0c34", - "vendor/nesbot/carbon/src/Carbon/Lang/en_PG.php": "f2ba134a40867b93dd535d5a40521aa2", - "vendor/nesbot/carbon/src/Carbon/Lang/en_PH.php": "9e40dcb36f58ddb0f4be339765e5ca25", - "vendor/nesbot/carbon/src/Carbon/Lang/en_PK.php": "32d8353729e8e10efd4de6d2926bce1d", - "vendor/nesbot/carbon/src/Carbon/Lang/en_PN.php": "f2ba134a40867b93dd535d5a40521aa2", - "vendor/nesbot/carbon/src/Carbon/Lang/en_PR.php": "32d8353729e8e10efd4de6d2926bce1d", - "vendor/nesbot/carbon/src/Carbon/Lang/en_PW.php": "f2ba134a40867b93dd535d5a40521aa2", - "vendor/nesbot/carbon/src/Carbon/Lang/en_RW.php": "f2ba134a40867b93dd535d5a40521aa2", - "vendor/nesbot/carbon/src/Carbon/Lang/en_SB.php": "f2ba134a40867b93dd535d5a40521aa2", - "vendor/nesbot/carbon/src/Carbon/Lang/en_SC.php": "f2ba134a40867b93dd535d5a40521aa2", - "vendor/nesbot/carbon/src/Carbon/Lang/en_SD.php": "a86c071ede1eafc8881a3961a1005667", - "vendor/nesbot/carbon/src/Carbon/Lang/en_SE.php": "f2ba134a40867b93dd535d5a40521aa2", - "vendor/nesbot/carbon/src/Carbon/Lang/en_SG.php": "1a878de9612c2d769f6597e844aee9d1", - "vendor/nesbot/carbon/src/Carbon/Lang/en_SH.php": "f2ba134a40867b93dd535d5a40521aa2", - "vendor/nesbot/carbon/src/Carbon/Lang/en_SI.php": "f2ba134a40867b93dd535d5a40521aa2", - "vendor/nesbot/carbon/src/Carbon/Lang/en_SL.php": "f2ba134a40867b93dd535d5a40521aa2", - "vendor/nesbot/carbon/src/Carbon/Lang/en_SS.php": "f2ba134a40867b93dd535d5a40521aa2", - "vendor/nesbot/carbon/src/Carbon/Lang/en_SX.php": "f2ba134a40867b93dd535d5a40521aa2", - "vendor/nesbot/carbon/src/Carbon/Lang/en_SZ.php": "f2ba134a40867b93dd535d5a40521aa2", - "vendor/nesbot/carbon/src/Carbon/Lang/en_TC.php": "f2ba134a40867b93dd535d5a40521aa2", - "vendor/nesbot/carbon/src/Carbon/Lang/en_TK.php": "f2ba134a40867b93dd535d5a40521aa2", - "vendor/nesbot/carbon/src/Carbon/Lang/en_TO.php": "f2ba134a40867b93dd535d5a40521aa2", - "vendor/nesbot/carbon/src/Carbon/Lang/en_TT.php": "32d8353729e8e10efd4de6d2926bce1d", - "vendor/nesbot/carbon/src/Carbon/Lang/en_TV.php": "f2ba134a40867b93dd535d5a40521aa2", - "vendor/nesbot/carbon/src/Carbon/Lang/en_TZ.php": "f2ba134a40867b93dd535d5a40521aa2", - "vendor/nesbot/carbon/src/Carbon/Lang/en_UG.php": "f2ba134a40867b93dd535d5a40521aa2", - "vendor/nesbot/carbon/src/Carbon/Lang/en_UM.php": "32d8353729e8e10efd4de6d2926bce1d", - "vendor/nesbot/carbon/src/Carbon/Lang/en_US.php": "32d8353729e8e10efd4de6d2926bce1d", - "vendor/nesbot/carbon/src/Carbon/Lang/en_US_Posix.php": "32d8353729e8e10efd4de6d2926bce1d", - "vendor/nesbot/carbon/src/Carbon/Lang/en_VC.php": "f2ba134a40867b93dd535d5a40521aa2", - "vendor/nesbot/carbon/src/Carbon/Lang/en_VG.php": "f2ba134a40867b93dd535d5a40521aa2", - "vendor/nesbot/carbon/src/Carbon/Lang/en_VI.php": "32d8353729e8e10efd4de6d2926bce1d", - "vendor/nesbot/carbon/src/Carbon/Lang/en_VU.php": "f2ba134a40867b93dd535d5a40521aa2", - "vendor/nesbot/carbon/src/Carbon/Lang/en_WS.php": "32d8353729e8e10efd4de6d2926bce1d", - "vendor/nesbot/carbon/src/Carbon/Lang/en_ZA.php": "84d20011541c771f4d1296738683b6c2", - "vendor/nesbot/carbon/src/Carbon/Lang/en_ZM.php": "4e5a0456b905db48a249a0013ba50390", - "vendor/nesbot/carbon/src/Carbon/Lang/en_ZW.php": "32d8353729e8e10efd4de6d2926bce1d", - "vendor/nesbot/carbon/src/Carbon/Lang/eo.php": "48a081c358fa47cbfe332e45b7b79024", - "vendor/nesbot/carbon/src/Carbon/Lang/es.php": "0554e97eb443bdfd20b436a47b3bdcfb", - "vendor/nesbot/carbon/src/Carbon/Lang/es_419.php": "3c924e38aa257ca5ee33c3f5ecbfa079", - "vendor/nesbot/carbon/src/Carbon/Lang/es_AR.php": "3c924e38aa257ca5ee33c3f5ecbfa079", - "vendor/nesbot/carbon/src/Carbon/Lang/es_BO.php": "5580312b5d72a4048eed786a1e3b3fbe", - "vendor/nesbot/carbon/src/Carbon/Lang/es_BR.php": "9c4acbef66dd255417930df79d254da9", - "vendor/nesbot/carbon/src/Carbon/Lang/es_BZ.php": "9c4acbef66dd255417930df79d254da9", - "vendor/nesbot/carbon/src/Carbon/Lang/es_CL.php": "3c924e38aa257ca5ee33c3f5ecbfa079", - "vendor/nesbot/carbon/src/Carbon/Lang/es_CO.php": "3c924e38aa257ca5ee33c3f5ecbfa079", - "vendor/nesbot/carbon/src/Carbon/Lang/es_CR.php": "edeac4b2e1a4c6b4c3c883c61ec148b1", - "vendor/nesbot/carbon/src/Carbon/Lang/es_CU.php": "2c6dfc08b372ecc0f3acdb913f647b00", - "vendor/nesbot/carbon/src/Carbon/Lang/es_DO.php": "2c38ec33beb08f54172b38f937f072eb", - "vendor/nesbot/carbon/src/Carbon/Lang/es_EA.php": "2c6dfc08b372ecc0f3acdb913f647b00", - "vendor/nesbot/carbon/src/Carbon/Lang/es_EC.php": "3c924e38aa257ca5ee33c3f5ecbfa079", - "vendor/nesbot/carbon/src/Carbon/Lang/es_ES.php": "b47c90d4ad1be45f7ca37da450cc22f8", - "vendor/nesbot/carbon/src/Carbon/Lang/es_GQ.php": "2c6dfc08b372ecc0f3acdb913f647b00", - "vendor/nesbot/carbon/src/Carbon/Lang/es_GT.php": "3c924e38aa257ca5ee33c3f5ecbfa079", - "vendor/nesbot/carbon/src/Carbon/Lang/es_HN.php": "3c924e38aa257ca5ee33c3f5ecbfa079", - "vendor/nesbot/carbon/src/Carbon/Lang/es_IC.php": "2c6dfc08b372ecc0f3acdb913f647b00", - "vendor/nesbot/carbon/src/Carbon/Lang/es_MX.php": "450775ca140cfe5441df336593ad7362", - "vendor/nesbot/carbon/src/Carbon/Lang/es_NI.php": "e2830ee86a114cba6e117704b27f5c94", - "vendor/nesbot/carbon/src/Carbon/Lang/es_PA.php": "3c924e38aa257ca5ee33c3f5ecbfa079", - "vendor/nesbot/carbon/src/Carbon/Lang/es_PE.php": "3c924e38aa257ca5ee33c3f5ecbfa079", - "vendor/nesbot/carbon/src/Carbon/Lang/es_PH.php": "eba11533ce9bbd76ec16b8beae8c4058", - "vendor/nesbot/carbon/src/Carbon/Lang/es_PR.php": "e2830ee86a114cba6e117704b27f5c94", - "vendor/nesbot/carbon/src/Carbon/Lang/es_PY.php": "3c924e38aa257ca5ee33c3f5ecbfa079", - "vendor/nesbot/carbon/src/Carbon/Lang/es_SV.php": "8438339d8d11f3791ff67d05ee719c0f", - "vendor/nesbot/carbon/src/Carbon/Lang/es_US.php": "441832a4f054b1d7b83fc653d4526d63", - "vendor/nesbot/carbon/src/Carbon/Lang/es_UY.php": "f677bb1d9111949dd3f99f23ae8614d2", - "vendor/nesbot/carbon/src/Carbon/Lang/es_VE.php": "3c924e38aa257ca5ee33c3f5ecbfa079", - "vendor/nesbot/carbon/src/Carbon/Lang/et.php": "2fab30286a50d3bdb7fe4edef9b8642b", - "vendor/nesbot/carbon/src/Carbon/Lang/et_EE.php": "44f68cb44bf26d4d86233b684a563688", - "vendor/nesbot/carbon/src/Carbon/Lang/eu.php": "95103d228d21abb54dc2b40be2cdc6a0", - "vendor/nesbot/carbon/src/Carbon/Lang/eu_ES.php": "13ee99d359c3cd6edb2f43ed114607f7", - "vendor/nesbot/carbon/src/Carbon/Lang/ewo.php": "158237026924a018850765cd68c137e9", - "vendor/nesbot/carbon/src/Carbon/Lang/fa.php": "efd914a3f04150e5846cdbd9a6d6a1b6", - "vendor/nesbot/carbon/src/Carbon/Lang/fa_AF.php": "179a2a1bcfe17e170419457ed966ecaa", - "vendor/nesbot/carbon/src/Carbon/Lang/fa_IR.php": "a94bb75c8e0fae68af462464636fead1", - "vendor/nesbot/carbon/src/Carbon/Lang/ff.php": "3628687e46ba059704f187f618b0c862", - "vendor/nesbot/carbon/src/Carbon/Lang/ff_CM.php": "7b8fe01f2e8111601c7239d9f7d605c6", - "vendor/nesbot/carbon/src/Carbon/Lang/ff_GN.php": "7b8fe01f2e8111601c7239d9f7d605c6", - "vendor/nesbot/carbon/src/Carbon/Lang/ff_MR.php": "b617314156c8456702ffe168b3463792", - "vendor/nesbot/carbon/src/Carbon/Lang/ff_SN.php": "5eb6c17463a16228bad8bb0f3fef03d1", - "vendor/nesbot/carbon/src/Carbon/Lang/fi.php": "fe7bad86c2cdf4f3295cc042dcd2b0cd", - "vendor/nesbot/carbon/src/Carbon/Lang/fi_FI.php": "37fb5f40d6be2dadbdc31ee9f605c7d5", - "vendor/nesbot/carbon/src/Carbon/Lang/fil.php": "648bd06feac4c107d228141f1405d1a8", - "vendor/nesbot/carbon/src/Carbon/Lang/fil_PH.php": "27c823be487ebf4c951b088485a642fc", - "vendor/nesbot/carbon/src/Carbon/Lang/fo.php": "a44d1504401aab70e1451b0fb7e9adba", - "vendor/nesbot/carbon/src/Carbon/Lang/fo_DK.php": "26aa4ea2f0501fa878b0acae0538a90c", - "vendor/nesbot/carbon/src/Carbon/Lang/fo_FO.php": "a70d235bc23529c0a0e78b785a441d21", - "vendor/nesbot/carbon/src/Carbon/Lang/fr.php": "0baa4239699781683483af3b0f769712", - "vendor/nesbot/carbon/src/Carbon/Lang/fr_BE.php": "5f3f0c515ba53b16e18b2678b884347f", - "vendor/nesbot/carbon/src/Carbon/Lang/fr_BF.php": "cd5e6a383a075f0b11bef5c5fe90d4fa", - "vendor/nesbot/carbon/src/Carbon/Lang/fr_BI.php": "cd5e6a383a075f0b11bef5c5fe90d4fa", - "vendor/nesbot/carbon/src/Carbon/Lang/fr_BJ.php": "cd5e6a383a075f0b11bef5c5fe90d4fa", - "vendor/nesbot/carbon/src/Carbon/Lang/fr_BL.php": "cd5e6a383a075f0b11bef5c5fe90d4fa", - "vendor/nesbot/carbon/src/Carbon/Lang/fr_CA.php": "9fded9bea301ea00811fe4faac3fd746", - "vendor/nesbot/carbon/src/Carbon/Lang/fr_CD.php": "cd5e6a383a075f0b11bef5c5fe90d4fa", - "vendor/nesbot/carbon/src/Carbon/Lang/fr_CF.php": "cd5e6a383a075f0b11bef5c5fe90d4fa", - "vendor/nesbot/carbon/src/Carbon/Lang/fr_CG.php": "cd5e6a383a075f0b11bef5c5fe90d4fa", - "vendor/nesbot/carbon/src/Carbon/Lang/fr_CH.php": "d21291f0b3c3fde9461e2b2e7d69ce6d", - "vendor/nesbot/carbon/src/Carbon/Lang/fr_CI.php": "cd5e6a383a075f0b11bef5c5fe90d4fa", - "vendor/nesbot/carbon/src/Carbon/Lang/fr_CM.php": "0cfa2c49aa9e0bd41dd718b7240569ef", - "vendor/nesbot/carbon/src/Carbon/Lang/fr_DJ.php": "417793286f5fecd0304184c49fbadf76", - "vendor/nesbot/carbon/src/Carbon/Lang/fr_DZ.php": "566c6a58b6be6ffb8987db2af2c665bc", - "vendor/nesbot/carbon/src/Carbon/Lang/fr_FR.php": "cd5e6a383a075f0b11bef5c5fe90d4fa", - "vendor/nesbot/carbon/src/Carbon/Lang/fr_GA.php": "cd5e6a383a075f0b11bef5c5fe90d4fa", - "vendor/nesbot/carbon/src/Carbon/Lang/fr_GF.php": "cd5e6a383a075f0b11bef5c5fe90d4fa", - "vendor/nesbot/carbon/src/Carbon/Lang/fr_GN.php": "cd5e6a383a075f0b11bef5c5fe90d4fa", - "vendor/nesbot/carbon/src/Carbon/Lang/fr_GP.php": "cd5e6a383a075f0b11bef5c5fe90d4fa", - "vendor/nesbot/carbon/src/Carbon/Lang/fr_GQ.php": "cd5e6a383a075f0b11bef5c5fe90d4fa", - "vendor/nesbot/carbon/src/Carbon/Lang/fr_HT.php": "cd5e6a383a075f0b11bef5c5fe90d4fa", - "vendor/nesbot/carbon/src/Carbon/Lang/fr_KM.php": "cd5e6a383a075f0b11bef5c5fe90d4fa", - "vendor/nesbot/carbon/src/Carbon/Lang/fr_LU.php": "b41d83937825abba14187617cfdc5881", - "vendor/nesbot/carbon/src/Carbon/Lang/fr_MA.php": "702d2fb6909e5d6fe201197d075fdcd2", - "vendor/nesbot/carbon/src/Carbon/Lang/fr_MC.php": "cd5e6a383a075f0b11bef5c5fe90d4fa", - "vendor/nesbot/carbon/src/Carbon/Lang/fr_MF.php": "cd5e6a383a075f0b11bef5c5fe90d4fa", - "vendor/nesbot/carbon/src/Carbon/Lang/fr_MG.php": "cd5e6a383a075f0b11bef5c5fe90d4fa", - "vendor/nesbot/carbon/src/Carbon/Lang/fr_ML.php": "cd5e6a383a075f0b11bef5c5fe90d4fa", - "vendor/nesbot/carbon/src/Carbon/Lang/fr_MQ.php": "cd5e6a383a075f0b11bef5c5fe90d4fa", - "vendor/nesbot/carbon/src/Carbon/Lang/fr_MR.php": "cc99fdf4f73dbefddc3d9ed05caf6da4", - "vendor/nesbot/carbon/src/Carbon/Lang/fr_MU.php": "cd5e6a383a075f0b11bef5c5fe90d4fa", - "vendor/nesbot/carbon/src/Carbon/Lang/fr_NC.php": "cd5e6a383a075f0b11bef5c5fe90d4fa", - "vendor/nesbot/carbon/src/Carbon/Lang/fr_NE.php": "cd5e6a383a075f0b11bef5c5fe90d4fa", - "vendor/nesbot/carbon/src/Carbon/Lang/fr_PF.php": "cd5e6a383a075f0b11bef5c5fe90d4fa", - "vendor/nesbot/carbon/src/Carbon/Lang/fr_PM.php": "cd5e6a383a075f0b11bef5c5fe90d4fa", - "vendor/nesbot/carbon/src/Carbon/Lang/fr_RE.php": "cd5e6a383a075f0b11bef5c5fe90d4fa", - "vendor/nesbot/carbon/src/Carbon/Lang/fr_RW.php": "cd5e6a383a075f0b11bef5c5fe90d4fa", - "vendor/nesbot/carbon/src/Carbon/Lang/fr_SC.php": "cd5e6a383a075f0b11bef5c5fe90d4fa", - "vendor/nesbot/carbon/src/Carbon/Lang/fr_SN.php": "cd5e6a383a075f0b11bef5c5fe90d4fa", - "vendor/nesbot/carbon/src/Carbon/Lang/fr_SY.php": "566c6a58b6be6ffb8987db2af2c665bc", - "vendor/nesbot/carbon/src/Carbon/Lang/fr_TD.php": "cc99fdf4f73dbefddc3d9ed05caf6da4", - "vendor/nesbot/carbon/src/Carbon/Lang/fr_TG.php": "cd5e6a383a075f0b11bef5c5fe90d4fa", - "vendor/nesbot/carbon/src/Carbon/Lang/fr_TN.php": "ffbf46dbfd890db2a486b0f745e70e3a", - "vendor/nesbot/carbon/src/Carbon/Lang/fr_VU.php": "cc99fdf4f73dbefddc3d9ed05caf6da4", - "vendor/nesbot/carbon/src/Carbon/Lang/fr_WF.php": "cd5e6a383a075f0b11bef5c5fe90d4fa", - "vendor/nesbot/carbon/src/Carbon/Lang/fr_YT.php": "cd5e6a383a075f0b11bef5c5fe90d4fa", - "vendor/nesbot/carbon/src/Carbon/Lang/fur.php": "749bb50cf5225b7e3e4103f94b337d6c", - "vendor/nesbot/carbon/src/Carbon/Lang/fur_IT.php": "d1fa6de422eb21e24bdbf8b2cd00a3e2", - "vendor/nesbot/carbon/src/Carbon/Lang/fy.php": "6576baa5d8a8a28891edd7437598fdc3", - "vendor/nesbot/carbon/src/Carbon/Lang/fy_DE.php": "58f1f3c66898f7d25c0681444b64730d", - "vendor/nesbot/carbon/src/Carbon/Lang/fy_NL.php": "c9a82a5771112160aace7afebf8b81ef", - "vendor/nesbot/carbon/src/Carbon/Lang/ga.php": "4714b4f6bfbe91d04260ee3ad92d23dd", - "vendor/nesbot/carbon/src/Carbon/Lang/ga_IE.php": "d3aae994e74db51681ad0cdf40a3f4e5", - "vendor/nesbot/carbon/src/Carbon/Lang/gd.php": "8fb67a895d37ea7f6b581b3b8dfa5fa8", - "vendor/nesbot/carbon/src/Carbon/Lang/gd_GB.php": "da89f57c1e16924d558bc4078331785c", - "vendor/nesbot/carbon/src/Carbon/Lang/gez.php": "ff09535b87b4dbc240210b750560e5b8", - "vendor/nesbot/carbon/src/Carbon/Lang/gez_ER.php": "542babbbd858b2c4b258b2cec2d05172", - "vendor/nesbot/carbon/src/Carbon/Lang/gez_ET.php": "af4d9a7158c68863128f014b930f5c81", - "vendor/nesbot/carbon/src/Carbon/Lang/gl.php": "f82fff887c87218dd7100d4f60ee0782", - "vendor/nesbot/carbon/src/Carbon/Lang/gl_ES.php": "c31824fd635f5b75b7341566795883b2", - "vendor/nesbot/carbon/src/Carbon/Lang/gom.php": "ac905bca7ae004dde5bc995439d38c36", - "vendor/nesbot/carbon/src/Carbon/Lang/gom_Latn.php": "8f7a198eb5e70336379f06e81b8a0bd0", - "vendor/nesbot/carbon/src/Carbon/Lang/gsw.php": "1bc33e224c67e8ecbaf21c6eefe3cecc", - "vendor/nesbot/carbon/src/Carbon/Lang/gsw_CH.php": "8d0f7f491a61d357bd3abd1eb6fd14a1", - "vendor/nesbot/carbon/src/Carbon/Lang/gsw_FR.php": "e10b6958991840d6102ae3b332fe6d4f", - "vendor/nesbot/carbon/src/Carbon/Lang/gsw_LI.php": "e10b6958991840d6102ae3b332fe6d4f", - "vendor/nesbot/carbon/src/Carbon/Lang/gu.php": "876c712cef866885ee08b0ebcadb6c06", - "vendor/nesbot/carbon/src/Carbon/Lang/gu_IN.php": "c2575a94b28781cd281456d609111276", - "vendor/nesbot/carbon/src/Carbon/Lang/guz.php": "f917e81a5e15f38369e30a2b4c43c25a", - "vendor/nesbot/carbon/src/Carbon/Lang/gv.php": "54fe6e2c5ec8dbb4f4a904e568378db4", - "vendor/nesbot/carbon/src/Carbon/Lang/gv_GB.php": "269768efd6ce736a151a4a59b3a334f6", - "vendor/nesbot/carbon/src/Carbon/Lang/ha.php": "5af4d04df0535345b379969faa4e5d37", - "vendor/nesbot/carbon/src/Carbon/Lang/ha_GH.php": "a2d8f1803627338f9d1477d22ca55327", - "vendor/nesbot/carbon/src/Carbon/Lang/ha_NE.php": "a2d8f1803627338f9d1477d22ca55327", - "vendor/nesbot/carbon/src/Carbon/Lang/ha_NG.php": "a2d8f1803627338f9d1477d22ca55327", - "vendor/nesbot/carbon/src/Carbon/Lang/hak.php": "123025b3025a281d1b826daeeb62b454", - "vendor/nesbot/carbon/src/Carbon/Lang/hak_TW.php": "3d440fdef609a41880c8400c4e471e66", - "vendor/nesbot/carbon/src/Carbon/Lang/haw.php": "af0f461da267b6d41424bcb3c1626526", - "vendor/nesbot/carbon/src/Carbon/Lang/he.php": "b9282a0f202685d9ac0d16f44bef99d2", - "vendor/nesbot/carbon/src/Carbon/Lang/he_IL.php": "f3ec38cd7fb9161d7a8e3398666d414f", - "vendor/nesbot/carbon/src/Carbon/Lang/hi.php": "b9417105e25444faa9f05e7a2d996111", - "vendor/nesbot/carbon/src/Carbon/Lang/hi_IN.php": "316ff7374624122add752440851c178c", - "vendor/nesbot/carbon/src/Carbon/Lang/hif.php": "cf530e878eb03fc8867d1b01921471ec", - "vendor/nesbot/carbon/src/Carbon/Lang/hif_FJ.php": "324c7904a298c1fd1722543682a54c54", - "vendor/nesbot/carbon/src/Carbon/Lang/hne.php": "1927a65953349c5e48a22253413e4299", - "vendor/nesbot/carbon/src/Carbon/Lang/hne_IN.php": "fac3731bb8025df81f74fc18e3a1a9d1", - "vendor/nesbot/carbon/src/Carbon/Lang/hr.php": "d5cdb17eb3785c96ec6d5197d709db9c", - "vendor/nesbot/carbon/src/Carbon/Lang/hr_BA.php": "f2d448fca08df59e65fbf9a61ef83d0a", - "vendor/nesbot/carbon/src/Carbon/Lang/hr_HR.php": "0d1fa021406b85afa69ffbdff71dac5a", - "vendor/nesbot/carbon/src/Carbon/Lang/hsb.php": "c9b1da5237d59f4da9ec483eb533d96c", - "vendor/nesbot/carbon/src/Carbon/Lang/hsb_DE.php": "6ee00a5e807f034e1658e5de04183d66", - "vendor/nesbot/carbon/src/Carbon/Lang/ht.php": "72b7ff0b9a3ec029261d33a3340fcc89", - "vendor/nesbot/carbon/src/Carbon/Lang/ht_HT.php": "88190764470144a495b257d663544b9c", - "vendor/nesbot/carbon/src/Carbon/Lang/hu.php": "fe79caa806c8e581577a043ebb2700b0", - "vendor/nesbot/carbon/src/Carbon/Lang/hu_HU.php": "7a64f88caae1e361f424edbde144bb09", - "vendor/nesbot/carbon/src/Carbon/Lang/hy.php": "4dab8412962620dad40c6aa4738d362e", - "vendor/nesbot/carbon/src/Carbon/Lang/hy_AM.php": "668225395ffe7283be127498966b0cda", - "vendor/nesbot/carbon/src/Carbon/Lang/i18n.php": "031a87bba6dc1ea864b1590431dd1d09", - "vendor/nesbot/carbon/src/Carbon/Lang/ia.php": "0947fcf56ce8dfe4572e10d1ed150ef0", - "vendor/nesbot/carbon/src/Carbon/Lang/ia_FR.php": "3c0bc6a02ddc4aadbc155638d34bc648", - "vendor/nesbot/carbon/src/Carbon/Lang/id.php": "982140e12b6b743fbf0214798533aa35", - "vendor/nesbot/carbon/src/Carbon/Lang/id_ID.php": "e27f2def87577e861246016379ce3b62", - "vendor/nesbot/carbon/src/Carbon/Lang/ig.php": "f95c0356bfc4a008967d242bb7bbaa9e", - "vendor/nesbot/carbon/src/Carbon/Lang/ig_NG.php": "a885d2965c5145b3d9f9733c13d9eb7a", - "vendor/nesbot/carbon/src/Carbon/Lang/ii.php": "32382d49e2dc9027f48f031b079b2119", - "vendor/nesbot/carbon/src/Carbon/Lang/ik.php": "8bad1a8def4d3876473d5786f941876e", - "vendor/nesbot/carbon/src/Carbon/Lang/ik_CA.php": "29b6b4d30c950f00616b9308eb585a89", - "vendor/nesbot/carbon/src/Carbon/Lang/in.php": "e27f2def87577e861246016379ce3b62", - "vendor/nesbot/carbon/src/Carbon/Lang/is.php": "ecb19222f57839f8fd75e3c4f050dbfe", - "vendor/nesbot/carbon/src/Carbon/Lang/is_IS.php": "50508dec68d86b9348f37b037b42b7af", - "vendor/nesbot/carbon/src/Carbon/Lang/it.php": "86b35a1bc281e2c4fde3d0d198c8bcc1", - "vendor/nesbot/carbon/src/Carbon/Lang/it_CH.php": "a23da553a49e1c15dcb06292f3df2fb8", - "vendor/nesbot/carbon/src/Carbon/Lang/it_IT.php": "76e471ea8f44dfd2c9aca75791e7ec4c", - "vendor/nesbot/carbon/src/Carbon/Lang/it_SM.php": "2a2a361253cc2590c9df6cde99ac4295", - "vendor/nesbot/carbon/src/Carbon/Lang/it_VA.php": "2a2a361253cc2590c9df6cde99ac4295", - "vendor/nesbot/carbon/src/Carbon/Lang/iu.php": "5fb641f3f408bd5a604697e462a3045c", - "vendor/nesbot/carbon/src/Carbon/Lang/iu_CA.php": "4b4c5c2168dbf2420c9f8d46e65a8a1d", - "vendor/nesbot/carbon/src/Carbon/Lang/iw.php": "d96cd7112c95910b48dde37dbbca29b4", - "vendor/nesbot/carbon/src/Carbon/Lang/ja.php": "ee805f5b434d27961cf5e70f01c79bb0", - "vendor/nesbot/carbon/src/Carbon/Lang/ja_JP.php": "f17b141d5e7d0c1426c05c9276d57b95", - "vendor/nesbot/carbon/src/Carbon/Lang/jgo.php": "a3b410d64c63fb5c757b7fd8110dda0c", - "vendor/nesbot/carbon/src/Carbon/Lang/jmc.php": "1c5c1f1841568e548086df1c6bb0fa8a", - "vendor/nesbot/carbon/src/Carbon/Lang/jv.php": "ebb8b4abd6bf615710d915b1eabc9f4c", - "vendor/nesbot/carbon/src/Carbon/Lang/ka.php": "bc1f805fa70dca97a8540718e6520fe3", - "vendor/nesbot/carbon/src/Carbon/Lang/ka_GE.php": "e41795b4760ae5754741d2795b9ebbcf", - "vendor/nesbot/carbon/src/Carbon/Lang/kab.php": "3188d21ef0665c35c5a1ef5f4e1ccfd5", - "vendor/nesbot/carbon/src/Carbon/Lang/kab_DZ.php": "61482909b4356f825359087f764761b1", - "vendor/nesbot/carbon/src/Carbon/Lang/kam.php": "16c05fdb250149ba0416d79952986dac", - "vendor/nesbot/carbon/src/Carbon/Lang/kde.php": "c773cd56f1814011075311663b872ea7", - "vendor/nesbot/carbon/src/Carbon/Lang/kea.php": "cadf667b3e39483aacb5b574fa4fb7d6", - "vendor/nesbot/carbon/src/Carbon/Lang/khq.php": "e7bf12f2f23e98bc464c751ffc705a6f", - "vendor/nesbot/carbon/src/Carbon/Lang/ki.php": "59c1da48e2e72b80daa8b48e98db1356", - "vendor/nesbot/carbon/src/Carbon/Lang/kk.php": "1627f58e7236f3d10f505ca13b433e3c", - "vendor/nesbot/carbon/src/Carbon/Lang/kk_KZ.php": "55672d1ca6ab93b1c199cc401aa8b05b", - "vendor/nesbot/carbon/src/Carbon/Lang/kkj.php": "a3b410d64c63fb5c757b7fd8110dda0c", - "vendor/nesbot/carbon/src/Carbon/Lang/kl.php": "f969f3046a762b22b331128c99d6468c", - "vendor/nesbot/carbon/src/Carbon/Lang/kl_GL.php": "25d2732c366ced2a688454c35ac1ff8c", - "vendor/nesbot/carbon/src/Carbon/Lang/kln.php": "262831739583dc7dd0cdd35357027f1f", - "vendor/nesbot/carbon/src/Carbon/Lang/km.php": "886ebe72a2216746bf924b152c3e6e03", - "vendor/nesbot/carbon/src/Carbon/Lang/km_KH.php": "a9446ec4a90a9958d27a9aa6b8f2ee9e", - "vendor/nesbot/carbon/src/Carbon/Lang/kn.php": "82b39c63c4149e0bc2be125419d4c029", - "vendor/nesbot/carbon/src/Carbon/Lang/kn_IN.php": "072fd94171303653268551a38c3a0496", - "vendor/nesbot/carbon/src/Carbon/Lang/ko.php": "9d92e2b2ef9420cd1e52deb4f22f39d5", - "vendor/nesbot/carbon/src/Carbon/Lang/ko_KP.php": "2bc03fdbeb0e147e32b9cc1baae1edff", - "vendor/nesbot/carbon/src/Carbon/Lang/ko_KR.php": "76a737c49b13bb53b04b0e5b36f61b04", - "vendor/nesbot/carbon/src/Carbon/Lang/kok.php": "b9f634e368ad89b53c6f077d2f5749cd", - "vendor/nesbot/carbon/src/Carbon/Lang/kok_IN.php": "348aed706ad6ad76bd53bc7b22e10a59", - "vendor/nesbot/carbon/src/Carbon/Lang/ks.php": "6a1489b86d7033a032fc5f41253aa2f8", - "vendor/nesbot/carbon/src/Carbon/Lang/ks_IN.php": "bff3884c46a3ca216904b1b51d42f2fe", - "vendor/nesbot/carbon/src/Carbon/Lang/ks_IN@devanagari.php": "2a6802d39892a8b11b9ddfdbe52adbc7", - "vendor/nesbot/carbon/src/Carbon/Lang/ksb.php": "0df64c5da08ed2b3d538008acac60d04", - "vendor/nesbot/carbon/src/Carbon/Lang/ksf.php": "d8dc350a0643d2162d36dbceccee6cc8", - "vendor/nesbot/carbon/src/Carbon/Lang/ksh.php": "fb3170d46d3dfc54d3fc8b88910d1bb1", - "vendor/nesbot/carbon/src/Carbon/Lang/ku.php": "293e427f2d96d30a405a2ff49012221b", - "vendor/nesbot/carbon/src/Carbon/Lang/ku_TR.php": "c4409e8d32c960ba3d2b4014c9e728af", - "vendor/nesbot/carbon/src/Carbon/Lang/kw.php": "1ee56c0969861a0a97f2b55b8b240c7d", - "vendor/nesbot/carbon/src/Carbon/Lang/kw_GB.php": "ccad1a39be1e9c22ccc0fee5a47c2ced", - "vendor/nesbot/carbon/src/Carbon/Lang/ky.php": "1f72d64daed66581e0ff9959b0a2f307", - "vendor/nesbot/carbon/src/Carbon/Lang/ky_KG.php": "5f4ae268d39c5deebde8a54a7983a4bf", - "vendor/nesbot/carbon/src/Carbon/Lang/lag.php": "fce87210ca0cc4d210a23b60333ffcba", - "vendor/nesbot/carbon/src/Carbon/Lang/lb.php": "02e0e985d30551ae7b5889e05f3d2b6c", - "vendor/nesbot/carbon/src/Carbon/Lang/lb_LU.php": "f4a4250f383a61fc82fb9b7b4d9d8956", - "vendor/nesbot/carbon/src/Carbon/Lang/lg.php": "ca4b58274743fbe262082b2e551699f3", - "vendor/nesbot/carbon/src/Carbon/Lang/lg_UG.php": "9b9b322a01766098a40757b173006889", - "vendor/nesbot/carbon/src/Carbon/Lang/li.php": "f3c302fd8d62ca36aeeeead8ab7426b4", - "vendor/nesbot/carbon/src/Carbon/Lang/li_NL.php": "f31cc8d283b299cc4ad75adb24f6551b", - "vendor/nesbot/carbon/src/Carbon/Lang/lij.php": "a01ba95f878d3bcc20d682107b0853b1", - "vendor/nesbot/carbon/src/Carbon/Lang/lij_IT.php": "bf9aaf6f4dc24105a58c47331f9f538b", - "vendor/nesbot/carbon/src/Carbon/Lang/lkt.php": "27b9b47a4e87a0bd49d049ecb8ddedb2", - "vendor/nesbot/carbon/src/Carbon/Lang/ln.php": "b2b51d9f769c388ce5c80f3b6ed2e49d", - "vendor/nesbot/carbon/src/Carbon/Lang/ln_AO.php": "c23dfecb874ced505d3815a3a05a4205", - "vendor/nesbot/carbon/src/Carbon/Lang/ln_CD.php": "bb18a24bfaaa8af218f7f88f4d3a8926", - "vendor/nesbot/carbon/src/Carbon/Lang/ln_CF.php": "c23dfecb874ced505d3815a3a05a4205", - "vendor/nesbot/carbon/src/Carbon/Lang/ln_CG.php": "c23dfecb874ced505d3815a3a05a4205", - "vendor/nesbot/carbon/src/Carbon/Lang/lo.php": "2128ef06ca723b0051ccab1310f89693", - "vendor/nesbot/carbon/src/Carbon/Lang/lo_LA.php": "7eaf8088df1f9e8b0786dd0e05f53af3", - "vendor/nesbot/carbon/src/Carbon/Lang/lrc.php": "4e2bdc4022a63f6a9a31c7e26341337d", - "vendor/nesbot/carbon/src/Carbon/Lang/lrc_IQ.php": "9b25098d76d48c6e77d899b8fc6a4487", - "vendor/nesbot/carbon/src/Carbon/Lang/lt.php": "300f06f32a11913ad7520eabb9e5142c", - "vendor/nesbot/carbon/src/Carbon/Lang/lt_LT.php": "20fb49c5714189740abd2e381f64c425", - "vendor/nesbot/carbon/src/Carbon/Lang/lu.php": "8c256b9f5c4595f139a59ef4fa7eb5db", - "vendor/nesbot/carbon/src/Carbon/Lang/luo.php": "000410eb292a334dcc88cea164699132", - "vendor/nesbot/carbon/src/Carbon/Lang/luy.php": "0c208c205a077ce539312f55497843ce", - "vendor/nesbot/carbon/src/Carbon/Lang/lv.php": "e3a4fa1162cfe15494d30b39b4ae9b22", - "vendor/nesbot/carbon/src/Carbon/Lang/lv_LV.php": "acc81d59f1111181784c4cb86f555bf9", - "vendor/nesbot/carbon/src/Carbon/Lang/lzh.php": "9c59c9238f0d2b0e5d848fb016a8842d", - "vendor/nesbot/carbon/src/Carbon/Lang/lzh_TW.php": "69399f76794f4d27ccca05d1af6a852f", - "vendor/nesbot/carbon/src/Carbon/Lang/mag.php": "2f78c1b6539f45752747cdc1816df4b5", - "vendor/nesbot/carbon/src/Carbon/Lang/mag_IN.php": "d3f10f9d753e33454a62244068e04e4f", - "vendor/nesbot/carbon/src/Carbon/Lang/mai.php": "44fa83703d821a734a6c182d0b6bd121", - "vendor/nesbot/carbon/src/Carbon/Lang/mai_IN.php": "8a16c01559fab097736953b5bff5cca9", - "vendor/nesbot/carbon/src/Carbon/Lang/mas.php": "38b70245c721e522e74ce05ca74ce88d", - "vendor/nesbot/carbon/src/Carbon/Lang/mas_TZ.php": "42df8a2472b6894f04de717093373286", - "vendor/nesbot/carbon/src/Carbon/Lang/mer.php": "15e2543f2fa906d9a9466584a632af5e", - "vendor/nesbot/carbon/src/Carbon/Lang/mfe.php": "d1f3357ae4d56b6e0fa3ed7b3abf7734", - "vendor/nesbot/carbon/src/Carbon/Lang/mfe_MU.php": "35d4fbd1409d4276d495748a130e38c8", - "vendor/nesbot/carbon/src/Carbon/Lang/mg.php": "b54de4f4fcaf16d34d91afde1f05cd3f", - "vendor/nesbot/carbon/src/Carbon/Lang/mg_MG.php": "32e46001bf0a16b3e0f00bcdfbb20014", - "vendor/nesbot/carbon/src/Carbon/Lang/mgh.php": "bfcd3cdffc56e4553797c8d85976b5c6", - "vendor/nesbot/carbon/src/Carbon/Lang/mgo.php": "36555d470fb4a33f302669aeb8fc0548", - "vendor/nesbot/carbon/src/Carbon/Lang/mhr.php": "34cacb91767ff0a915657261774ef0a8", - "vendor/nesbot/carbon/src/Carbon/Lang/mhr_RU.php": "8e50e8e6ea6cf7dc39ea08decd798598", - "vendor/nesbot/carbon/src/Carbon/Lang/mi.php": "a1f39dedd8b5078b4b0b3190d790456f", - "vendor/nesbot/carbon/src/Carbon/Lang/mi_NZ.php": "fa91e8930eaf6e4daeffc3739251ed46", - "vendor/nesbot/carbon/src/Carbon/Lang/miq.php": "173883531a3fbd9fca18a300641f2cbc", - "vendor/nesbot/carbon/src/Carbon/Lang/miq_NI.php": "07becdaa024ff7c9cdec267fd648be7b", - "vendor/nesbot/carbon/src/Carbon/Lang/mjw.php": "7980a9c13bb0c357cd537d643a69cfdb", - "vendor/nesbot/carbon/src/Carbon/Lang/mjw_IN.php": "aeaad1a789d71b91dce95ef1167ac172", - "vendor/nesbot/carbon/src/Carbon/Lang/mk.php": "e2d39a149d8741f81ecae4fa5d20b9df", - "vendor/nesbot/carbon/src/Carbon/Lang/mk_MK.php": "617ea38c0ab55d708af0c9900743200b", - "vendor/nesbot/carbon/src/Carbon/Lang/ml.php": "34f5256734cbf60a6981fd8462344fc0", - "vendor/nesbot/carbon/src/Carbon/Lang/ml_IN.php": "49c1f90c3d457a712615380361119758", - "vendor/nesbot/carbon/src/Carbon/Lang/mn.php": "61cf5375c23040fd3e176ad1498fa1fa", - "vendor/nesbot/carbon/src/Carbon/Lang/mn_MN.php": "d368fe5ee4639617aee1751c32135cc6", - "vendor/nesbot/carbon/src/Carbon/Lang/mni.php": "15095b273b64f12596d1aab7e97922bf", - "vendor/nesbot/carbon/src/Carbon/Lang/mni_IN.php": "ffdd11fa12153d383bc4a21fd263ff94", - "vendor/nesbot/carbon/src/Carbon/Lang/mo.php": "2c73f99a3319c0a4c2d411527b3e8dfe", - "vendor/nesbot/carbon/src/Carbon/Lang/mr.php": "ed32fedb0bbd495cb3fbff26d8e2040d", - "vendor/nesbot/carbon/src/Carbon/Lang/mr_IN.php": "860dcba8825ce55eae5377a7c42fcb4e", - "vendor/nesbot/carbon/src/Carbon/Lang/ms.php": "485a7edef5160d0dab9fa3d0b58d9b9d", - "vendor/nesbot/carbon/src/Carbon/Lang/ms_BN.php": "22a73faf40fa79cc75a1fbdbda84dfcd", - "vendor/nesbot/carbon/src/Carbon/Lang/ms_MY.php": "7571ac8a0f46b7117fbeaf107d98de7b", - "vendor/nesbot/carbon/src/Carbon/Lang/ms_SG.php": "c6b6baccb2f6e18fdf45f5b16ec6521a", - "vendor/nesbot/carbon/src/Carbon/Lang/mt.php": "b2b0f5ab3e8a72dea8a154c225ccf37f", - "vendor/nesbot/carbon/src/Carbon/Lang/mt_MT.php": "5d8581348b5064530ab10645bb625254", - "vendor/nesbot/carbon/src/Carbon/Lang/mua.php": "50a0b419d9280cd287bfbb1705b279c1", - "vendor/nesbot/carbon/src/Carbon/Lang/my.php": "112431aa7d933eee5e8082a2f9b4d1c6", - "vendor/nesbot/carbon/src/Carbon/Lang/my_MM.php": "68ab7bff5fc1c58c8d61f4019b580f05", - "vendor/nesbot/carbon/src/Carbon/Lang/mzn.php": "3120d9ec59d948c9e9620b040d388b46", - "vendor/nesbot/carbon/src/Carbon/Lang/nan.php": "2e2aff432ef0adf56e4ab074df5e8bb2", - "vendor/nesbot/carbon/src/Carbon/Lang/nan_TW.php": "65f77dd6eb800ed8c5a5cc765d27333a", - "vendor/nesbot/carbon/src/Carbon/Lang/nan_TW@latin.php": "602c77f112a7656780d1edfa0b9ad923", - "vendor/nesbot/carbon/src/Carbon/Lang/naq.php": "1cdffcdd9aae366e9cc41d9559a5d404", - "vendor/nesbot/carbon/src/Carbon/Lang/nb.php": "b531476f0c7c230dea902a7346ae3b21", - "vendor/nesbot/carbon/src/Carbon/Lang/nb_NO.php": "7b68cd3703c385b7b84ca9a8a796c3e8", - "vendor/nesbot/carbon/src/Carbon/Lang/nb_SJ.php": "c4a6ac7fb53fb30dbcdfc69146d2491f", - "vendor/nesbot/carbon/src/Carbon/Lang/nd.php": "381f6396e159fcea397eb26a99626bf2", - "vendor/nesbot/carbon/src/Carbon/Lang/nds.php": "99767f849bdf5f46daa54e176dbc92a9", - "vendor/nesbot/carbon/src/Carbon/Lang/nds_DE.php": "59bae91a8feb4fe98483c3fe0812f8fb", - "vendor/nesbot/carbon/src/Carbon/Lang/nds_NL.php": "90af0474b91c4dd538c56d2890e717df", - "vendor/nesbot/carbon/src/Carbon/Lang/ne.php": "aa9fa6c264227d6bbd6c47cc54c5759e", - "vendor/nesbot/carbon/src/Carbon/Lang/ne_IN.php": "e680b495685edd864adaace6287353f7", - "vendor/nesbot/carbon/src/Carbon/Lang/ne_NP.php": "17cceee814c857d98ebe53aa78b54717", - "vendor/nesbot/carbon/src/Carbon/Lang/nhn.php": "057acc5d6ac2a6a4c5547171cdd3cba3", - "vendor/nesbot/carbon/src/Carbon/Lang/nhn_MX.php": "a4b3ba7749fc0faac0c64670e44d8ee3", - "vendor/nesbot/carbon/src/Carbon/Lang/niu.php": "0a451b485a6f358264410767d99a4c6d", - "vendor/nesbot/carbon/src/Carbon/Lang/niu_NU.php": "7a107685d9e4b09a6b2dbd365cee937d", - "vendor/nesbot/carbon/src/Carbon/Lang/nl.php": "d07a1b5144f618ffe8df68a5e64f6ea7", - "vendor/nesbot/carbon/src/Carbon/Lang/nl_AW.php": "30c2e862c1eda6ac1927fa4a0731a76e", - "vendor/nesbot/carbon/src/Carbon/Lang/nl_BE.php": "ddee7e54a1fb5e47762c792883581b69", - "vendor/nesbot/carbon/src/Carbon/Lang/nl_BQ.php": "2e16a521aa993f8c8c0d5135cf09a0d0", - "vendor/nesbot/carbon/src/Carbon/Lang/nl_CW.php": "2e16a521aa993f8c8c0d5135cf09a0d0", - "vendor/nesbot/carbon/src/Carbon/Lang/nl_NL.php": "5ac7524442f6044c6c4609cc7c03b332", - "vendor/nesbot/carbon/src/Carbon/Lang/nl_SR.php": "2e16a521aa993f8c8c0d5135cf09a0d0", - "vendor/nesbot/carbon/src/Carbon/Lang/nl_SX.php": "2e16a521aa993f8c8c0d5135cf09a0d0", - "vendor/nesbot/carbon/src/Carbon/Lang/nmg.php": "551caf55512d48d17d3bf8184bdfa646", - "vendor/nesbot/carbon/src/Carbon/Lang/nn.php": "2ec328aca708362fde8951c3e3f3757c", - "vendor/nesbot/carbon/src/Carbon/Lang/nn_NO.php": "e0e0cc9b35c34d7c1decfc5c3aee1a74", - "vendor/nesbot/carbon/src/Carbon/Lang/nnh.php": "5ed576491816a6ef2c8945b6b0be43ff", - "vendor/nesbot/carbon/src/Carbon/Lang/no.php": "f2edbce254ea2b20ea1a5ecc0e290244", - "vendor/nesbot/carbon/src/Carbon/Lang/nr.php": "5c423b15c246e2ea1c0ecab18650c021", - "vendor/nesbot/carbon/src/Carbon/Lang/nr_ZA.php": "7a4de5be23d7254a0aed18ee7553b1d2", - "vendor/nesbot/carbon/src/Carbon/Lang/nso.php": "03348c7eeee1fc0a4fad2527c7509d36", - "vendor/nesbot/carbon/src/Carbon/Lang/nso_ZA.php": "67539dce198b3f4326c56acf893a8187", - "vendor/nesbot/carbon/src/Carbon/Lang/nus.php": "075faa4a22200a94472daea6b74f9856", - "vendor/nesbot/carbon/src/Carbon/Lang/nyn.php": "04cbe1233df726951bc7c10280860745", - "vendor/nesbot/carbon/src/Carbon/Lang/oc.php": "3b6f35036cc3cb9f878d8742167af004", - "vendor/nesbot/carbon/src/Carbon/Lang/oc_FR.php": "23754964b26748ec1bd57e64493b78f1", - "vendor/nesbot/carbon/src/Carbon/Lang/om.php": "b148838cce6e5793a45badedd2ac798c", - "vendor/nesbot/carbon/src/Carbon/Lang/om_ET.php": "b99ad908a494dc9eb3f0582c696b6e35", - "vendor/nesbot/carbon/src/Carbon/Lang/om_KE.php": "ed962fb2061a8be2ff64b60f1e482f4a", - "vendor/nesbot/carbon/src/Carbon/Lang/or.php": "8d1cdf48c74dcfd44ceaa4e50a5bba6b", - "vendor/nesbot/carbon/src/Carbon/Lang/or_IN.php": "ff2a96e0732a5963df5cdb17047cb8ec", - "vendor/nesbot/carbon/src/Carbon/Lang/os.php": "de6ded038d70c336b365c4ea1aa1011e", - "vendor/nesbot/carbon/src/Carbon/Lang/os_RU.php": "4371c378e7415256cca5f08a29eca802", - "vendor/nesbot/carbon/src/Carbon/Lang/pa.php": "7f1bd9da5f1670e3e84c84607e17ac5c", - "vendor/nesbot/carbon/src/Carbon/Lang/pa_Arab.php": "6dc286f8ab7e7f4f41ffead676c84728", - "vendor/nesbot/carbon/src/Carbon/Lang/pa_Guru.php": "8d0342c83905b5483614308336041228", - "vendor/nesbot/carbon/src/Carbon/Lang/pa_IN.php": "d73f58e55e8015057f5395844d0bacf4", - "vendor/nesbot/carbon/src/Carbon/Lang/pa_PK.php": "739f678afa7fe68d8645278a92a83a7b", - "vendor/nesbot/carbon/src/Carbon/Lang/pap.php": "204895f61550380630f43c5f58d2f666", - "vendor/nesbot/carbon/src/Carbon/Lang/pap_AW.php": "c359411802432df27acf5df33c2f3374", - "vendor/nesbot/carbon/src/Carbon/Lang/pap_CW.php": "c359411802432df27acf5df33c2f3374", - "vendor/nesbot/carbon/src/Carbon/Lang/pl.php": "f57950d57992a8981b9d16864d8795e2", - "vendor/nesbot/carbon/src/Carbon/Lang/pl_PL.php": "4fbf387ff3d9d5c2adea672a7697284b", - "vendor/nesbot/carbon/src/Carbon/Lang/prg.php": "f287a7a5f38417e925c8a0351c1eea72", - "vendor/nesbot/carbon/src/Carbon/Lang/ps.php": "1a4789d8a6dbd9c2bc27add79ff419f2", - "vendor/nesbot/carbon/src/Carbon/Lang/ps_AF.php": "08e274652c6a729f621f14f98e29bd74", - "vendor/nesbot/carbon/src/Carbon/Lang/pt.php": "9b2452b2047f6c049054f93cdbbfb6e7", - "vendor/nesbot/carbon/src/Carbon/Lang/pt_AO.php": "b883c04fbd4bd648847173cbf3e8cbc6", - "vendor/nesbot/carbon/src/Carbon/Lang/pt_BR.php": "9c097b91542bc11f20b52a0e6ea4f213", - "vendor/nesbot/carbon/src/Carbon/Lang/pt_CH.php": "b883c04fbd4bd648847173cbf3e8cbc6", - "vendor/nesbot/carbon/src/Carbon/Lang/pt_CV.php": "b883c04fbd4bd648847173cbf3e8cbc6", - "vendor/nesbot/carbon/src/Carbon/Lang/pt_GQ.php": "b883c04fbd4bd648847173cbf3e8cbc6", - "vendor/nesbot/carbon/src/Carbon/Lang/pt_GW.php": "b883c04fbd4bd648847173cbf3e8cbc6", - "vendor/nesbot/carbon/src/Carbon/Lang/pt_LU.php": "b883c04fbd4bd648847173cbf3e8cbc6", - "vendor/nesbot/carbon/src/Carbon/Lang/pt_MO.php": "35e617b4c8cb3703d676481dc3ae6582", - "vendor/nesbot/carbon/src/Carbon/Lang/pt_MZ.php": "4db18a3d7c0795cd9924a62b448ab1f5", - "vendor/nesbot/carbon/src/Carbon/Lang/pt_PT.php": "b1f3d6e23fbf52b941f439278a1be172", - "vendor/nesbot/carbon/src/Carbon/Lang/pt_ST.php": "b883c04fbd4bd648847173cbf3e8cbc6", - "vendor/nesbot/carbon/src/Carbon/Lang/pt_TL.php": "b883c04fbd4bd648847173cbf3e8cbc6", - "vendor/nesbot/carbon/src/Carbon/Lang/qu.php": "c3bd7e61c03dacbc6414ff966dbc8e60", - "vendor/nesbot/carbon/src/Carbon/Lang/qu_BO.php": "265dd1e1cff89c6e6f8a7ff3270c08ff", - "vendor/nesbot/carbon/src/Carbon/Lang/qu_EC.php": "265dd1e1cff89c6e6f8a7ff3270c08ff", - "vendor/nesbot/carbon/src/Carbon/Lang/quz.php": "1ade5551b9fdb878421c4f0c34bef3a2", - "vendor/nesbot/carbon/src/Carbon/Lang/quz_PE.php": "1fdeaf162f82cd0de416044d232b11f9", - "vendor/nesbot/carbon/src/Carbon/Lang/raj.php": "4b343462674bb2d378a97b6e189b0be8", - "vendor/nesbot/carbon/src/Carbon/Lang/raj_IN.php": "e933b495289fdc09fcff228eafbb28e2", - "vendor/nesbot/carbon/src/Carbon/Lang/rm.php": "58df559dad3c869bfd537b38c3ea4a04", - "vendor/nesbot/carbon/src/Carbon/Lang/rn.php": "2131924bd4528c18b68198ce7ab90973", - "vendor/nesbot/carbon/src/Carbon/Lang/ro.php": "3011843f135e97e64690e050d7ff4cba", - "vendor/nesbot/carbon/src/Carbon/Lang/ro_MD.php": "bd6e4a9491e36eb105940509030b3d1e", - "vendor/nesbot/carbon/src/Carbon/Lang/ro_RO.php": "2c73f99a3319c0a4c2d411527b3e8dfe", - "vendor/nesbot/carbon/src/Carbon/Lang/rof.php": "8edba461eff7f865f929f8fc5f025961", - "vendor/nesbot/carbon/src/Carbon/Lang/ru.php": "3432b6686097d34eceb52f2e90e04994", - "vendor/nesbot/carbon/src/Carbon/Lang/ru_BY.php": "204876ea6b65891b8ba8ca09188c62c4", - "vendor/nesbot/carbon/src/Carbon/Lang/ru_KG.php": "204876ea6b65891b8ba8ca09188c62c4", - "vendor/nesbot/carbon/src/Carbon/Lang/ru_KZ.php": "204876ea6b65891b8ba8ca09188c62c4", - "vendor/nesbot/carbon/src/Carbon/Lang/ru_MD.php": "204876ea6b65891b8ba8ca09188c62c4", - "vendor/nesbot/carbon/src/Carbon/Lang/ru_RU.php": "204876ea6b65891b8ba8ca09188c62c4", - "vendor/nesbot/carbon/src/Carbon/Lang/ru_UA.php": "8f44bee8e6dec4e4ad373b46b86fc51a", - "vendor/nesbot/carbon/src/Carbon/Lang/rw.php": "755e1a72699e1569648f07994b4f2434", - "vendor/nesbot/carbon/src/Carbon/Lang/rw_RW.php": "09a279af7cca746fc1a0bb5302cb54b2", - "vendor/nesbot/carbon/src/Carbon/Lang/rwk.php": "1c5c1f1841568e548086df1c6bb0fa8a", - "vendor/nesbot/carbon/src/Carbon/Lang/sa.php": "0e3e62f897c71cdb7e93c4bf36da6ac8", - "vendor/nesbot/carbon/src/Carbon/Lang/sa_IN.php": "157ee0bfc27b066d1f3b37e4945076a5", - "vendor/nesbot/carbon/src/Carbon/Lang/sah.php": "15b0db45dfdc515a436627b731a9aab8", - "vendor/nesbot/carbon/src/Carbon/Lang/sah_RU.php": "364359ab83a425266dd89cf377d80352", - "vendor/nesbot/carbon/src/Carbon/Lang/saq.php": "7cc05adacada9801116651ff30aa18b2", - "vendor/nesbot/carbon/src/Carbon/Lang/sat.php": "12a153eb661862ab0370f045052def4c", - "vendor/nesbot/carbon/src/Carbon/Lang/sat_IN.php": "3c56921f915651fb78e5caeb743c162a", - "vendor/nesbot/carbon/src/Carbon/Lang/sbp.php": "dab55a2724ff956937a2fcdc501d421a", - "vendor/nesbot/carbon/src/Carbon/Lang/sc.php": "1629d9c4407a08b1a523ea58fc886f80", - "vendor/nesbot/carbon/src/Carbon/Lang/sc_IT.php": "d36c7f1862ec7973ff24c47fea6dbb88", - "vendor/nesbot/carbon/src/Carbon/Lang/sd.php": "3a5dbdc4219cc8f2f3ddf2de38df73de", - "vendor/nesbot/carbon/src/Carbon/Lang/sd_IN.php": "7aca56c7b2e61c9ad304897e8d0664b6", - "vendor/nesbot/carbon/src/Carbon/Lang/sd_IN@devanagari.php": "8d83dc9d4076b84e88a7481cd2fbcdbd", - "vendor/nesbot/carbon/src/Carbon/Lang/se.php": "e532271b21f4fca6a6003fffe21bbb14", - "vendor/nesbot/carbon/src/Carbon/Lang/se_FI.php": "13e5d87040d4f0927e6699703b2dfbcc", - "vendor/nesbot/carbon/src/Carbon/Lang/se_NO.php": "209c49d01446eba3237738c3b30f4b25", - "vendor/nesbot/carbon/src/Carbon/Lang/se_SE.php": "209c49d01446eba3237738c3b30f4b25", - "vendor/nesbot/carbon/src/Carbon/Lang/seh.php": "c273b65759640c225ce1507226210f5d", - "vendor/nesbot/carbon/src/Carbon/Lang/ses.php": "087c910bacbc0c9ac018a704ede2e736", - "vendor/nesbot/carbon/src/Carbon/Lang/sg.php": "efedb08414fc730ad7d8a85de25edb7e", - "vendor/nesbot/carbon/src/Carbon/Lang/sgs.php": "ae171bf36eddede5b0d7dd823c0a9ed8", - "vendor/nesbot/carbon/src/Carbon/Lang/sgs_LT.php": "53b7b218c459c7deac6af4434eb4ed9d", - "vendor/nesbot/carbon/src/Carbon/Lang/sh.php": "5a0357cbe1ac9d2d69fc05d7295b7525", - "vendor/nesbot/carbon/src/Carbon/Lang/shi.php": "171def448c89225a36e4375ecf569cc9", - "vendor/nesbot/carbon/src/Carbon/Lang/shi_Latn.php": "d1d2740303a6bdfc8ecff34362d10c40", - "vendor/nesbot/carbon/src/Carbon/Lang/shi_Tfng.php": "8cd442795cd2d93ae848efda794ebd43", - "vendor/nesbot/carbon/src/Carbon/Lang/shn.php": "7951c5ff865c7cb4076281d34e19bb84", - "vendor/nesbot/carbon/src/Carbon/Lang/shn_MM.php": "e5973971dc719999cb4073d8b8eff5e8", - "vendor/nesbot/carbon/src/Carbon/Lang/shs.php": "a5e40f85eed000f78c84cce1f9c25635", - "vendor/nesbot/carbon/src/Carbon/Lang/shs_CA.php": "945d32f01c35db239cca4ac7accd65f7", - "vendor/nesbot/carbon/src/Carbon/Lang/si.php": "55450be596692169d757a1f7e3864440", - "vendor/nesbot/carbon/src/Carbon/Lang/si_LK.php": "2fd9300a62f085fddafcc2027374e0d9", - "vendor/nesbot/carbon/src/Carbon/Lang/sid.php": "21d53ac7fe12c56a66fbfba59cd13ae3", - "vendor/nesbot/carbon/src/Carbon/Lang/sid_ET.php": "d6d460fc8d408f552327d77b69f9a0cb", - "vendor/nesbot/carbon/src/Carbon/Lang/sk.php": "424c8c133cc007f547897aa6742533fc", - "vendor/nesbot/carbon/src/Carbon/Lang/sk_SK.php": "a977e4d53d4f5700f9fb06f6190fc103", - "vendor/nesbot/carbon/src/Carbon/Lang/sl.php": "5e715aa68b81fda863da15f8e9e332d3", - "vendor/nesbot/carbon/src/Carbon/Lang/sl_SI.php": "75cb75a0b099d9ba4be3d05cbe3efc04", - "vendor/nesbot/carbon/src/Carbon/Lang/sm.php": "6d699c2afc14cbd3b6ac6ec2a2af420e", - "vendor/nesbot/carbon/src/Carbon/Lang/sm_WS.php": "6e038dbc695780f61638434ddac690c2", - "vendor/nesbot/carbon/src/Carbon/Lang/smn.php": "0d90f00d340dcef0dcc811a09540c310", - "vendor/nesbot/carbon/src/Carbon/Lang/sn.php": "9a34de688fb1a37a9db1b4da71c020c4", - "vendor/nesbot/carbon/src/Carbon/Lang/so.php": "a5d065f11d335a8eb623a2e8eeadcf55", - "vendor/nesbot/carbon/src/Carbon/Lang/so_DJ.php": "909eb9668c883c97f8ed035334e0e6d8", - "vendor/nesbot/carbon/src/Carbon/Lang/so_ET.php": "d4f40aaa213e8d5af31414ea58f88cd5", - "vendor/nesbot/carbon/src/Carbon/Lang/so_KE.php": "d4f40aaa213e8d5af31414ea58f88cd5", - "vendor/nesbot/carbon/src/Carbon/Lang/so_SO.php": "d4f40aaa213e8d5af31414ea58f88cd5", - "vendor/nesbot/carbon/src/Carbon/Lang/sq.php": "c579c4d7a54d8d1a6954bb8d4542e901", - "vendor/nesbot/carbon/src/Carbon/Lang/sq_AL.php": "3d89a072312887c58cd2f6bfe40f1a40", - "vendor/nesbot/carbon/src/Carbon/Lang/sq_MK.php": "45bd17c380cfaa8b586aa0b91790d1c2", - "vendor/nesbot/carbon/src/Carbon/Lang/sq_XK.php": "45bd17c380cfaa8b586aa0b91790d1c2", - "vendor/nesbot/carbon/src/Carbon/Lang/sr.php": "e5db72072e9b772e2165bf786da28ab3", - "vendor/nesbot/carbon/src/Carbon/Lang/sr_Cyrl.php": "09009a63290ceff2b80fc90a3c62c99a", - "vendor/nesbot/carbon/src/Carbon/Lang/sr_Cyrl_BA.php": "ee53d53a4054edbf0126737388b5af46", - "vendor/nesbot/carbon/src/Carbon/Lang/sr_Cyrl_ME.php": "345ea727f79d213df1a27fd18b24535c", - "vendor/nesbot/carbon/src/Carbon/Lang/sr_Cyrl_XK.php": "97309d0dab6da4386bec448b959569ce", - "vendor/nesbot/carbon/src/Carbon/Lang/sr_Latn.php": "9f07691b2d53a54d66f7be97d0362f61", - "vendor/nesbot/carbon/src/Carbon/Lang/sr_Latn_BA.php": "fb174429d4bbc4380f81f0edbe1c8778", - "vendor/nesbot/carbon/src/Carbon/Lang/sr_Latn_ME.php": "3a34a5947c09856501f129e4b676689e", - "vendor/nesbot/carbon/src/Carbon/Lang/sr_Latn_XK.php": "7b55dc027d36b71f5b4704a083bdf7aa", - "vendor/nesbot/carbon/src/Carbon/Lang/sr_ME.php": "79b2a3e9ee2ae9451f02ed4f9e1bc9c8", - "vendor/nesbot/carbon/src/Carbon/Lang/sr_RS.php": "da173c9f242e8b9fda41769e8b1f3173", - "vendor/nesbot/carbon/src/Carbon/Lang/sr_RS@latin.php": "9f07691b2d53a54d66f7be97d0362f61", - "vendor/nesbot/carbon/src/Carbon/Lang/ss.php": "4a2b4fec545fdfa527d1111cbc4794c0", - "vendor/nesbot/carbon/src/Carbon/Lang/ss_ZA.php": "901dce42d3f36e4c9cdb8c7788e18255", - "vendor/nesbot/carbon/src/Carbon/Lang/st.php": "1b7d1838239e27f76ddec76c73a7e732", - "vendor/nesbot/carbon/src/Carbon/Lang/st_ZA.php": "b48d6e94596bfe99e155c2cee67ff13c", - "vendor/nesbot/carbon/src/Carbon/Lang/sv.php": "4729365ca24a434e86a15819d6357e6c", - "vendor/nesbot/carbon/src/Carbon/Lang/sv_AX.php": "beb991ec20b1b47c8c48031b7e9017d6", - "vendor/nesbot/carbon/src/Carbon/Lang/sv_FI.php": "b886046b473fc0c5b2b812ad3648ac6f", - "vendor/nesbot/carbon/src/Carbon/Lang/sv_SE.php": "b886046b473fc0c5b2b812ad3648ac6f", - "vendor/nesbot/carbon/src/Carbon/Lang/sw.php": "8af5e10f2a3a729a41de3ab9804c3309", - "vendor/nesbot/carbon/src/Carbon/Lang/sw_CD.php": "54996a286aae30e46179c835b33eeca4", - "vendor/nesbot/carbon/src/Carbon/Lang/sw_KE.php": "d08e7fad2cc0573383a0fb39ee375be0", - "vendor/nesbot/carbon/src/Carbon/Lang/sw_TZ.php": "8bcf077d03ff86a77dc6e4fd02f73e14", - "vendor/nesbot/carbon/src/Carbon/Lang/sw_UG.php": "54996a286aae30e46179c835b33eeca4", - "vendor/nesbot/carbon/src/Carbon/Lang/szl.php": "6270d4743d39a4020016a2b4d09e9495", - "vendor/nesbot/carbon/src/Carbon/Lang/szl_PL.php": "8d7df4e4c74f753142a0f92e279ee3b6", - "vendor/nesbot/carbon/src/Carbon/Lang/ta.php": "590fc70d051e1b76795985c59c676ae6", - "vendor/nesbot/carbon/src/Carbon/Lang/ta_IN.php": "d8f059b5c003fdd10c8397edf0c0dd91", - "vendor/nesbot/carbon/src/Carbon/Lang/ta_LK.php": "02dbbcc81aea615054173246ee8f47b3", - "vendor/nesbot/carbon/src/Carbon/Lang/ta_MY.php": "892857bc1ebb6db9b43dc06d1884c118", - "vendor/nesbot/carbon/src/Carbon/Lang/ta_SG.php": "1ff5cf3ad4d0401c27c5618eb3852095", - "vendor/nesbot/carbon/src/Carbon/Lang/tcy.php": "0d1c3ce780aa1ccd18fe00c7eafdc478", - "vendor/nesbot/carbon/src/Carbon/Lang/tcy_IN.php": "25e55014978b7f1a8b4e2872c405f2f5", - "vendor/nesbot/carbon/src/Carbon/Lang/te.php": "c2c376bac0e8b39f7dc19faf203b5537", - "vendor/nesbot/carbon/src/Carbon/Lang/te_IN.php": "66dc457ea30995304f63d464848e3259", - "vendor/nesbot/carbon/src/Carbon/Lang/teo.php": "18c366534b54af976db83b80f99078d4", - "vendor/nesbot/carbon/src/Carbon/Lang/teo_KE.php": "b6d153953ed3b42b230116db2576f6dc", - "vendor/nesbot/carbon/src/Carbon/Lang/tet.php": "e9e70c09aa61e280810f3c3cb464cb37", - "vendor/nesbot/carbon/src/Carbon/Lang/tg.php": "592722d838a532c07c6672c02e8f4cce", - "vendor/nesbot/carbon/src/Carbon/Lang/tg_TJ.php": "42aaac4c3d2f9e004a6e8416bf541cfc", - "vendor/nesbot/carbon/src/Carbon/Lang/th.php": "563dc6737833b6e52f4f737fae2764a6", - "vendor/nesbot/carbon/src/Carbon/Lang/th_TH.php": "319c00010afdfc124dfd3f1bc590f7c1", - "vendor/nesbot/carbon/src/Carbon/Lang/the.php": "d68de3e8954412267f8a2d88cde895d3", - "vendor/nesbot/carbon/src/Carbon/Lang/the_NP.php": "3c503baadb4f085f9c89626df11f67ac", - "vendor/nesbot/carbon/src/Carbon/Lang/ti.php": "7592a32fe6642097bb2875450153aed5", - "vendor/nesbot/carbon/src/Carbon/Lang/ti_ER.php": "09c97a17984dcd590b08e2c1594aa008", - "vendor/nesbot/carbon/src/Carbon/Lang/ti_ET.php": "ad290036527a16c08b7c4e000ec45bce", - "vendor/nesbot/carbon/src/Carbon/Lang/tig.php": "160092423d69eb4a45db6fdca4b724cf", - "vendor/nesbot/carbon/src/Carbon/Lang/tig_ER.php": "c657992d0034a25d94d91a0abb265671", - "vendor/nesbot/carbon/src/Carbon/Lang/tk.php": "0a1ce255195e4f0c493c372efbf13649", - "vendor/nesbot/carbon/src/Carbon/Lang/tk_TM.php": "0bcc46301495da5d406bd572d9ee3507", - "vendor/nesbot/carbon/src/Carbon/Lang/tl.php": "3617ed6e5cc434ec6192716df29317e6", - "vendor/nesbot/carbon/src/Carbon/Lang/tl_PH.php": "4f2f7137fed8be740f622ccd5cef20dd", - "vendor/nesbot/carbon/src/Carbon/Lang/tlh.php": "045ee59c72437ab84b7ec9675b0b0a15", - "vendor/nesbot/carbon/src/Carbon/Lang/tn.php": "86caf58c4b2df232a6e4fe261b09a42b", - "vendor/nesbot/carbon/src/Carbon/Lang/tn_ZA.php": "e3077c5eda23be6e65c2a80d6b786661", - "vendor/nesbot/carbon/src/Carbon/Lang/to.php": "012f71a7dc31f2bf054814eb17695720", - "vendor/nesbot/carbon/src/Carbon/Lang/to_TO.php": "28eba2ec93fa62bfd3878a5e86e50bb4", - "vendor/nesbot/carbon/src/Carbon/Lang/tpi.php": "178630bc81edef3e9980c0e31177d228", - "vendor/nesbot/carbon/src/Carbon/Lang/tpi_PG.php": "6ca9262140492ed46ab8551bf96c45c7", - "vendor/nesbot/carbon/src/Carbon/Lang/tr.php": "3838ab0cc0a3fa69f43bea94cbe727f8", - "vendor/nesbot/carbon/src/Carbon/Lang/tr_CY.php": "cd71caf40ef4d604bdaf2bcc88ef77df", - "vendor/nesbot/carbon/src/Carbon/Lang/tr_TR.php": "01bf1a0646004c056bde030236ced238", - "vendor/nesbot/carbon/src/Carbon/Lang/ts.php": "48bbedfb9023a896bfd3bce2fad5a867", - "vendor/nesbot/carbon/src/Carbon/Lang/ts_ZA.php": "85a12eef5b6a930edfb68cbdaf986ac4", - "vendor/nesbot/carbon/src/Carbon/Lang/tt.php": "1ef54796277c11d977b306153a26e2b6", - "vendor/nesbot/carbon/src/Carbon/Lang/tt_RU.php": "aae0ebc11e50263a58fcde954f468303", - "vendor/nesbot/carbon/src/Carbon/Lang/tt_RU@iqtelif.php": "f51f170e8a8ddffdeac1b2e0416f7469", - "vendor/nesbot/carbon/src/Carbon/Lang/twq.php": "84f44e0c3d1e514dc2ac39a02cd2b1e6", - "vendor/nesbot/carbon/src/Carbon/Lang/tzl.php": "9b1b746c1a87eff3d051583d0f4c5ca0", - "vendor/nesbot/carbon/src/Carbon/Lang/tzm.php": "6117239ef3be81757b1f8f126e928099", - "vendor/nesbot/carbon/src/Carbon/Lang/tzm_Latn.php": "d1bd64b25dd1268ec23517b25b945cc5", - "vendor/nesbot/carbon/src/Carbon/Lang/ug.php": "68ea04d90e55e22f67350795d5a15d78", - "vendor/nesbot/carbon/src/Carbon/Lang/ug_CN.php": "2e954699757fb8a29138fae0b105e29a", - "vendor/nesbot/carbon/src/Carbon/Lang/uk.php": "0ca3326970a3fc4c68fb69e965198e3d", - "vendor/nesbot/carbon/src/Carbon/Lang/uk_UA.php": "d4cb9ae18b5ed5cf250c6c0ca9b2e1a0", - "vendor/nesbot/carbon/src/Carbon/Lang/unm.php": "f10e33f75135d00b4791b14b39d564bc", - "vendor/nesbot/carbon/src/Carbon/Lang/unm_US.php": "e7c8b1e413c7f55e65f1581f5c9a2acc", - "vendor/nesbot/carbon/src/Carbon/Lang/ur.php": "40b1f18eaed04d70f8b5b507a0a803bd", - "vendor/nesbot/carbon/src/Carbon/Lang/ur_IN.php": "113d19838c6d144905d7a192a9dc67da", - "vendor/nesbot/carbon/src/Carbon/Lang/ur_PK.php": "cbc8283bff7b92dfb72530c4a749fc4f", - "vendor/nesbot/carbon/src/Carbon/Lang/uz.php": "5c33aa7abdd9bcfb659709fd096ff468", - "vendor/nesbot/carbon/src/Carbon/Lang/uz_Arab.php": "366d3f68b29102ede7978a71b8ce1b37", - "vendor/nesbot/carbon/src/Carbon/Lang/uz_Cyrl.php": "16a51c626070aa45043b948b8b32a3b0", - "vendor/nesbot/carbon/src/Carbon/Lang/uz_Latn.php": "e12d22ae63228070b528c072c45ce54d", - "vendor/nesbot/carbon/src/Carbon/Lang/uz_UZ.php": "2928e013856d45fb608a317bfd789eff", - "vendor/nesbot/carbon/src/Carbon/Lang/uz_UZ@cyrillic.php": "ad1141458d60c77fe847d7e360d4613c", - "vendor/nesbot/carbon/src/Carbon/Lang/vai.php": "f625b3669fad25aa1a4b672138e6fa33", - "vendor/nesbot/carbon/src/Carbon/Lang/vai_Latn.php": "0c2ab4696a5ebac150a22d076d05f1fc", - "vendor/nesbot/carbon/src/Carbon/Lang/vai_Vaii.php": "0be69144cac86c84d0c314df84203ccc", - "vendor/nesbot/carbon/src/Carbon/Lang/ve.php": "d419a3eb9494ae35d9f3f94429d0374a", - "vendor/nesbot/carbon/src/Carbon/Lang/ve_ZA.php": "82f7a10bbf50fbf63e6aaf4b3791e370", - "vendor/nesbot/carbon/src/Carbon/Lang/vi.php": "b6b3a40749815916b3fdf5ef6c8509da", - "vendor/nesbot/carbon/src/Carbon/Lang/vi_VN.php": "834415b6615592da98401d189ba6c68c", - "vendor/nesbot/carbon/src/Carbon/Lang/vo.php": "7e079e4f8a820bb110e13fd3543c8c4c", - "vendor/nesbot/carbon/src/Carbon/Lang/vun.php": "1c5c1f1841568e548086df1c6bb0fa8a", - "vendor/nesbot/carbon/src/Carbon/Lang/wa.php": "3ba79e6c3b768e76c525259cbc8ff97d", - "vendor/nesbot/carbon/src/Carbon/Lang/wa_BE.php": "aa137b1e45ce9afd2a6f9e5a37fe7fd1", - "vendor/nesbot/carbon/src/Carbon/Lang/wae.php": "15f175920f52f75c7932bfe700cfec4f", - "vendor/nesbot/carbon/src/Carbon/Lang/wae_CH.php": "b73fe486f9812e5279e9bf6322016363", - "vendor/nesbot/carbon/src/Carbon/Lang/wal.php": "f705f390dba04e370c3a9441b5aa81b0", - "vendor/nesbot/carbon/src/Carbon/Lang/wal_ET.php": "ea3adba7634eb71bdace20ba223314c7", - "vendor/nesbot/carbon/src/Carbon/Lang/wo.php": "e474b7ce92a61d7beb8e924223bbcc7e", - "vendor/nesbot/carbon/src/Carbon/Lang/wo_SN.php": "9ab706a565ae96d9ec5d7f498a27bfd6", - "vendor/nesbot/carbon/src/Carbon/Lang/xh.php": "270923d94866e948ee6009a480543173", - "vendor/nesbot/carbon/src/Carbon/Lang/xh_ZA.php": "8f48a590750658233268129e87b31487", - "vendor/nesbot/carbon/src/Carbon/Lang/xog.php": "83e8b2e260ab684201863084a611b7e3", - "vendor/nesbot/carbon/src/Carbon/Lang/yav.php": "e3c40894f77a0f90b8a49f7e3cfe9dbc", - "vendor/nesbot/carbon/src/Carbon/Lang/yi.php": "3f03562edcf7e3745760d909f734a42b", - "vendor/nesbot/carbon/src/Carbon/Lang/yi_US.php": "94b6d666c2aabba52930ffc07c241ada", - "vendor/nesbot/carbon/src/Carbon/Lang/yo.php": "186b6c440b44f33064c4bfc0943d68fc", - "vendor/nesbot/carbon/src/Carbon/Lang/yo_BJ.php": "f91426b974b544ad5e1588e636493440", - "vendor/nesbot/carbon/src/Carbon/Lang/yo_NG.php": "e6e1e5cb6d3f4a2f6e39456952159864", - "vendor/nesbot/carbon/src/Carbon/Lang/yue.php": "ff41f95f8007b0961eb9f07ae31add6c", - "vendor/nesbot/carbon/src/Carbon/Lang/yue_HK.php": "427f568bf7430f3a7fb557470dd1d67e", - "vendor/nesbot/carbon/src/Carbon/Lang/yue_Hans.php": "38f768b92f273d54348210af42fa2b57", - "vendor/nesbot/carbon/src/Carbon/Lang/yue_Hant.php": "1c477039043750d95363a27f60a97225", - "vendor/nesbot/carbon/src/Carbon/Lang/yuw.php": "ebfb3ba1f25e64b96def7135b0b5a712", - "vendor/nesbot/carbon/src/Carbon/Lang/yuw_PG.php": "98882f0d5daa7a19431b569cd2505abd", - "vendor/nesbot/carbon/src/Carbon/Lang/zgh.php": "b5594acfaa5a1c8af1b8d598388f9c08", - "vendor/nesbot/carbon/src/Carbon/Lang/zh.php": "d63330a9794e5a50dfc06cae6590fc15", - "vendor/nesbot/carbon/src/Carbon/Lang/zh_CN.php": "15a75c1a4b5d245ae371e88ed0446683", - "vendor/nesbot/carbon/src/Carbon/Lang/zh_HK.php": "c8df1aeeaf2ec5a135ec76ffd374c1a4", - "vendor/nesbot/carbon/src/Carbon/Lang/zh_Hans.php": "0f9a20de54ccafae86c215baa897fb8f", - "vendor/nesbot/carbon/src/Carbon/Lang/zh_Hans_HK.php": "38f768b92f273d54348210af42fa2b57", - "vendor/nesbot/carbon/src/Carbon/Lang/zh_Hans_MO.php": "38f768b92f273d54348210af42fa2b57", - "vendor/nesbot/carbon/src/Carbon/Lang/zh_Hans_SG.php": "38f768b92f273d54348210af42fa2b57", - "vendor/nesbot/carbon/src/Carbon/Lang/zh_Hant.php": "2284f714efd014d8726126ac3b298c1f", - "vendor/nesbot/carbon/src/Carbon/Lang/zh_Hant_HK.php": "1c477039043750d95363a27f60a97225", - "vendor/nesbot/carbon/src/Carbon/Lang/zh_Hant_MO.php": "1c477039043750d95363a27f60a97225", - "vendor/nesbot/carbon/src/Carbon/Lang/zh_Hant_TW.php": "1c477039043750d95363a27f60a97225", - "vendor/nesbot/carbon/src/Carbon/Lang/zh_MO.php": "bd13cffef4928eb9e157e3d56b8f48a5", - "vendor/nesbot/carbon/src/Carbon/Lang/zh_SG.php": "8a3fe67051774a3d0797f1ae106884ca", - "vendor/nesbot/carbon/src/Carbon/Lang/zh_TW.php": "1a5b4239feacce8829a295e49833097d", - "vendor/nesbot/carbon/src/Carbon/Lang/zh_YUE.php": "a925e6ca8e757f98aa8df84ea9f21eee", - "vendor/nesbot/carbon/src/Carbon/Lang/zu.php": "f69b6456fbcf351777c77cad4c779b16", - "vendor/nesbot/carbon/src/Carbon/Lang/zu_ZA.php": "09f2f0a2044fc60b8325b350cf9de218", - "vendor/nesbot/carbon/src/Carbon/Language.php": "5b716d8b25d6da8df1b18d01587d80a6", - "vendor/nesbot/carbon/src/Carbon/Laravel/ServiceProvider.php": "66afaa55bcbf162c5d78daa2a6b10174", - "vendor/nesbot/carbon/src/Carbon/List/languages.php": "e3f75ede013280b9b2923e53b1fda952", - "vendor/nesbot/carbon/src/Carbon/List/regions.php": "8af212eb9fbe67f0195908ae046d6692", - "vendor/nesbot/carbon/src/Carbon/MessageFormatter/MessageFormatterMapper.php": "f54d9b08c58b7d94d688a86084f9e1ed", - "vendor/nesbot/carbon/src/Carbon/PHPStan/AbstractMacro.php": "516743b04ae5e5b59a977025647b9113", - "vendor/nesbot/carbon/src/Carbon/PHPStan/Macro.php": "9a96eb276a818849d6830e1608e34a3f", - "vendor/nesbot/carbon/src/Carbon/PHPStan/MacroExtension.php": "afc4c6d0caa27d04dc6ea90a345b30c5", - "vendor/nesbot/carbon/src/Carbon/PHPStan/MacroScanner.php": "d4e3937ad7ff1c5743ec460d9ca4526c", - "vendor/nesbot/carbon/src/Carbon/Traits/Boundaries.php": "716289153c5770722426a18821d3ed82", - "vendor/nesbot/carbon/src/Carbon/Traits/Cast.php": "e39f19df2790b7b7eb0644c20c0cfe39", - "vendor/nesbot/carbon/src/Carbon/Traits/Comparison.php": "aef1ad0f5e78db2a0b864b86f70bbc04", - "vendor/nesbot/carbon/src/Carbon/Traits/Converter.php": "9ce85b59bcfbe4fbcf99bb0639332615", - "vendor/nesbot/carbon/src/Carbon/Traits/Creator.php": "5caf8f04fb4b65e6a93a889d5b8772cd", - "vendor/nesbot/carbon/src/Carbon/Traits/Date.php": "186ff16c9b2d6ef444c2bded64dcd0c3", - "vendor/nesbot/carbon/src/Carbon/Traits/DeprecatedProperties.php": "c818ab090e06a276ac74af3c1d107869", - "vendor/nesbot/carbon/src/Carbon/Traits/Difference.php": "58fbb73e5ddca77ec8ed6a8e1245d1e4", - "vendor/nesbot/carbon/src/Carbon/Traits/IntervalRounding.php": "8a79caa140ca0acca9e930bee95fc33a", - "vendor/nesbot/carbon/src/Carbon/Traits/IntervalStep.php": "5cbd87c7f42cfb634b7a0447b5b28c83", - "vendor/nesbot/carbon/src/Carbon/Traits/Localization.php": "1af252faae2423f2460eab7bd37f3b29", - "vendor/nesbot/carbon/src/Carbon/Traits/Macro.php": "e4cdbb3e0b3f14dc49b7b7bb0515ebc9", - "vendor/nesbot/carbon/src/Carbon/Traits/MagicParameter.php": "3c9ec1d236f66589b070fed8b0197416", - "vendor/nesbot/carbon/src/Carbon/Traits/Mixin.php": "ae0d815086b620fccced3cee651ee5b8", - "vendor/nesbot/carbon/src/Carbon/Traits/Modifiers.php": "cd2d6f7fb77b2d2a1f9f53c8cbc62ffc", - "vendor/nesbot/carbon/src/Carbon/Traits/Mutability.php": "d0d8a78c542f69d3967583cdd82b3e6d", - "vendor/nesbot/carbon/src/Carbon/Traits/ObjectInitialisation.php": "b29d7ad6cdf96ee42d4069bccd107032", - "vendor/nesbot/carbon/src/Carbon/Traits/Options.php": "00a78bfeb48d376182492ad59f9f5058", - "vendor/nesbot/carbon/src/Carbon/Traits/Rounding.php": "abe0368f94bbee9e3d9654f18ec0cf62", - "vendor/nesbot/carbon/src/Carbon/Traits/Serialization.php": "38437ca3d18f667ed0e7fea21fa0ded4", - "vendor/nesbot/carbon/src/Carbon/Traits/Test.php": "28917bbe97d873260b4c394205b042fa", - "vendor/nesbot/carbon/src/Carbon/Traits/Timestamp.php": "ebb27ae620213924885d753aa63386e2", - "vendor/nesbot/carbon/src/Carbon/Traits/ToStringFormat.php": "97d7717eac830305dd28e70554ce40d8", - "vendor/nesbot/carbon/src/Carbon/Traits/Units.php": "bae45bda252f73b5dd85643f9982fa33", - "vendor/nesbot/carbon/src/Carbon/Traits/Week.php": "a6220f967e23690a4e5a720671029368", - "vendor/nesbot/carbon/src/Carbon/Translator.php": "4cd06f3cfd71d53ad3ad3edb6c4a9bba", - "vendor/nesbot/carbon/src/Carbon/TranslatorImmutable.php": "379648a0b084cd409f9010443e3eb87e", - "vendor/nesbot/carbon/src/Carbon/TranslatorStrongTypeInterface.php": "899fee3e10c841a3508663f499a7ae46", - "vendor/nyholm/psr7/.php-cs-fixer.dist.php": "29e93fe4ff017f58718d12b43c27163d", - "vendor/nyholm/psr7/src/Factory/HttplugFactory.php": "41d385bfe4ff45a3b317a80c94e10dbe", - "vendor/nyholm/psr7/src/Factory/Psr17Factory.php": "85569c8664c30793daa5677b49e8f64c", - "vendor/nyholm/psr7/src/MessageTrait.php": "077136c34ea5ab969f47ebbe4c316d97", - "vendor/nyholm/psr7/src/Request.php": "5c2344bdeb60add69c6d4235135e4b14", - "vendor/nyholm/psr7/src/RequestTrait.php": "e7015f87bd92e881f1f4f7a45557ea7c", - "vendor/nyholm/psr7/src/Response.php": "640167b3f72ee4efaa687dbd826f93b4", - "vendor/nyholm/psr7/src/ServerRequest.php": "22f6df8fbdf5cceae3c89cd6bcb95507", - "vendor/nyholm/psr7/src/Stream.php": "ec3629f79ad3392985b42f7aebacf6d0", - "vendor/nyholm/psr7/src/StreamTrait.php": "dd7dbc6f21600ddf4c664a13409b5326", - "vendor/nyholm/psr7/src/UploadedFile.php": "1f0bd55e647b4ebda9cd323a9d6ece31", - "vendor/nyholm/psr7/src/Uri.php": "36dc4908562177a846ce554e526c44c4", - "vendor/nyholm/psr7-server/src/ServerRequestCreator.php": "0fab8cc95d646539e9fe0b1dea813621", - "vendor/nyholm/psr7-server/src/ServerRequestCreatorInterface.php": "d301f23dec9a8b1cfa23d5de83f2db39", - "vendor/overtrue/socialite/src/Config.php": "4bbb98cda75b6f7ccb01104df9250e05", - "vendor/overtrue/socialite/src/Contracts/FactoryInterface.php": "1eead00747d390d9e16c63984a98b8b8", - "vendor/overtrue/socialite/src/Contracts/ProviderInterface.php": "89be5d633046f8ecba6d0218ce4d40a6", - "vendor/overtrue/socialite/src/Contracts/UserInterface.php": "1e4eff407d023bea6e085b7f6f18e09c", - "vendor/overtrue/socialite/src/Exceptions/AuthorizeFailedException.php": "ab0e50d923aa3dd0b3c27d48ab81f986", - "vendor/overtrue/socialite/src/Exceptions/BadRequestException.php": "5b9d54b9389aaedf342e3468ca37e2e0", - "vendor/overtrue/socialite/src/Exceptions/Exception.php": "38a22acfbd369cce1946e4238d1817bd", - "vendor/overtrue/socialite/src/Exceptions/FeiShu/InvalidTicketException.php": "9bb2af4e4b182f6289fbf4b88d3c966d", - "vendor/overtrue/socialite/src/Exceptions/InvalidArgumentException.php": "870410d4d24e4021abb158992abfb4c4", - "vendor/overtrue/socialite/src/Exceptions/InvalidTokenException.php": "a0290949606ea9b142878ae824d36586", - "vendor/overtrue/socialite/src/Exceptions/MethodDoesNotSupportException.php": "0c6bdc7b6d072981a5901df347777b96", - "vendor/overtrue/socialite/src/Providers/Alipay.php": "117ac25bb3b6f5e4090d6576be0bd044", - "vendor/overtrue/socialite/src/Providers/Azure.php": "b37daa30acd4286f31f0bb244edfe820", - "vendor/overtrue/socialite/src/Providers/Baidu.php": "e527926d91e674dec4f605a93ad41fa7", - "vendor/overtrue/socialite/src/Providers/Base.php": "a27219b44fd684f8b69835a59aa9292a", - "vendor/overtrue/socialite/src/Providers/Coding.php": "14410c7dbde4c9a89e2fa9cce1ee3bd1", - "vendor/overtrue/socialite/src/Providers/DingTalk.php": "bd11951e8e623350b8a9ab0a5ba80aff", - "vendor/overtrue/socialite/src/Providers/DouYin.php": "08cf97b653680a6b3742594d048ccb64", - "vendor/overtrue/socialite/src/Providers/Douban.php": "1cd9b7cddb3ac38e077ee6417ca9edcd", - "vendor/overtrue/socialite/src/Providers/Facebook.php": "c4841d62eaed0e079d3ed6bb3f9437f5", - "vendor/overtrue/socialite/src/Providers/FeiShu.php": "b151006de808205b8563811b69300639", - "vendor/overtrue/socialite/src/Providers/Figma.php": "d8fc35e302b70674d6c280b054699d54", - "vendor/overtrue/socialite/src/Providers/GitHub.php": "e46c9fb25d48ed8185b9a79e71a4419a", - "vendor/overtrue/socialite/src/Providers/Gitee.php": "a9636280c9f16e86a300c4668e54e64d", - "vendor/overtrue/socialite/src/Providers/Google.php": "af136402e9313da9bdd01177346e5634", - "vendor/overtrue/socialite/src/Providers/Lark.php": "09b1f3274e43a25ce7fe3470a9f86a27", - "vendor/overtrue/socialite/src/Providers/Line.php": "45d5328cda61f65c9b671ab694293894", - "vendor/overtrue/socialite/src/Providers/Linkedin.php": "562252a8b8be8fbb856741af25c086da", - "vendor/overtrue/socialite/src/Providers/OpenWeWork.php": "caf141e86e36a0fb0508958d8feaed6e", - "vendor/overtrue/socialite/src/Providers/Outlook.php": "4ab47cbb3073eca9ce31e2e95606c57d", - "vendor/overtrue/socialite/src/Providers/QCloud.php": "379bb827c39bab64af181aa0e336d4a4", - "vendor/overtrue/socialite/src/Providers/QQ.php": "12c57f96bee57b386006e28d0a565f9c", - "vendor/overtrue/socialite/src/Providers/Taobao.php": "c2d4db3304f4514a69d12513b5929186", - "vendor/overtrue/socialite/src/Providers/Tapd.php": "378817b2d16228bc810c8b09cdfe6242", - "vendor/overtrue/socialite/src/Providers/TouTiao.php": "33d1bab6300e6301f056a430e6310e45", - "vendor/overtrue/socialite/src/Providers/WeChat.php": "8d7f804c48040a4bfd4e9a574b01c1d0", - "vendor/overtrue/socialite/src/Providers/WeWork.php": "ce9207b6c86e390c5440ceff7ac75446", - "vendor/overtrue/socialite/src/Providers/Weibo.php": "c25d696b83eebb9d57113f7cf25e3923", - "vendor/overtrue/socialite/src/Providers/XiGua.php": "4e4f277fb11fbe3f12bbcb636169af44", - "vendor/overtrue/socialite/src/SocialiteManager.php": "8243c8b6500ebda76520f7912349f332", - "vendor/overtrue/socialite/src/Traits/HasAttributes.php": "65e23d987449484d01338c2a547f45e4", - "vendor/overtrue/socialite/src/User.php": "1cc963e36b5250948f92f761740d15f3", - "vendor/overtrue/socialite/tests/OAuthTest.php": "9a87197c555a8bff143effc18c99b411", - "vendor/overtrue/socialite/tests/Providers/FeiShuTest.php": "90c504f747a7acef886c0fc2270cf7e0", - "vendor/overtrue/socialite/tests/Providers/WeWorkTest.php": "817c343034ccd9c3550648d5390ec7ad", - "vendor/overtrue/socialite/tests/Providers/WechatTest.php": "d2322dcd6b198f3d3ac8842c05fa89d7", - "vendor/overtrue/socialite/tests/SocialiteManagerTest.php": "e98efab47c9c2975433f451379f1f9cb", - "vendor/overtrue/socialite/tests/UserTest.php": "094a5713ebed8dea358be505d83926ab", - "vendor/php-di/invoker/src/CallableResolver.php": "3faf9173c6fec946e0453a438700aef7", - "vendor/php-di/invoker/src/Exception/InvocationException.php": "8b25d95629fac0b160a37e330f47c041", - "vendor/php-di/invoker/src/Exception/NotCallableException.php": "804072a9854d9a7735c464e6a7e77956", - "vendor/php-di/invoker/src/Exception/NotEnoughParametersException.php": "0c511c40b8716f8da969903471272086", - "vendor/php-di/invoker/src/Invoker.php": "283f4cb735f18b83cd959c499d76191b", - "vendor/php-di/invoker/src/InvokerInterface.php": "5583f8fc3f12dd6033cb1839b3e051bd", - "vendor/php-di/invoker/src/ParameterResolver/AssociativeArrayResolver.php": "d695b7a5b55331359df474f601ade3c3", - "vendor/php-di/invoker/src/ParameterResolver/Container/ParameterNameContainerResolver.php": "d8d3c9301b51f3262edbfe1fa874bb42", - "vendor/php-di/invoker/src/ParameterResolver/Container/TypeHintContainerResolver.php": "c9478009d9059c5fe81f7c038342cf30", - "vendor/php-di/invoker/src/ParameterResolver/DefaultValueResolver.php": "bd4e6ab7c4eb77a3d5c5aefb11df6e9f", - "vendor/php-di/invoker/src/ParameterResolver/NumericArrayResolver.php": "66143c6b5367b54174477c5605c6ee4c", - "vendor/php-di/invoker/src/ParameterResolver/ParameterResolver.php": "a0ec9f469d3c0257def702afe403f155", - "vendor/php-di/invoker/src/ParameterResolver/ResolverChain.php": "9a3298722fa21c0a59f20ab2783c04fd", - "vendor/php-di/invoker/src/ParameterResolver/TypeHintResolver.php": "024e1b78c3543e341643e186261497e7", - "vendor/php-di/invoker/src/Reflection/CallableReflection.php": "93a3de42c7484df8befcb0dc2c064aca", - "vendor/php-di/php-di/.php-cs-fixer.php": "b33d8020a70a6c78a72ef844d7c6c817", - "vendor/php-di/php-di/src/Attribute/Inject.php": "e33871072fc2d3254390bfa81d82f38d", - "vendor/php-di/php-di/src/Attribute/Injectable.php": "b56e2e8045ea6c6e9b96ef34c152bad4", - "vendor/php-di/php-di/src/CompiledContainer.php": "59f13abcde30d64119718f0d8eee3e1e", - "vendor/php-di/php-di/src/Compiler/Compiler.php": "c291bdcd67958d20fb00f576b587c101", - "vendor/php-di/php-di/src/Compiler/ObjectCreationCompiler.php": "3129913d17cb00912fca6397307c74de", - "vendor/php-di/php-di/src/Compiler/RequestedEntryHolder.php": "a1bec26fb794da9d495b63db64adafae", - "vendor/php-di/php-di/src/Compiler/Template.php": "7af080186ee97efb9724808d1f33edee", - "vendor/php-di/php-di/src/Container.php": "41ce225a31cb8f8280409b8cb56024bd", - "vendor/php-di/php-di/src/ContainerBuilder.php": "a565b3a8bc4a5f0033ebb551c0991f5d", - "vendor/php-di/php-di/src/Definition/ArrayDefinition.php": "746850d9c61f1c8cdfe133e0b4490fcd", - "vendor/php-di/php-di/src/Definition/ArrayDefinitionExtension.php": "59170e7db92080c954fc903942a5cc95", - "vendor/php-di/php-di/src/Definition/AutowireDefinition.php": "ac7f4b77a50c445f90d4672796888df2", - "vendor/php-di/php-di/src/Definition/DecoratorDefinition.php": "bff1709d8679eeb46dd9370bf98a3637", - "vendor/php-di/php-di/src/Definition/Definition.php": "2d53c637b26e6412d9dca02581ad4116", - "vendor/php-di/php-di/src/Definition/Dumper/ObjectDefinitionDumper.php": "aefa219dae04837becb00f9ad215db53", - "vendor/php-di/php-di/src/Definition/EnvironmentVariableDefinition.php": "c4e41dec5a96361bec93168cfd440134", - "vendor/php-di/php-di/src/Definition/Exception/InvalidAttribute.php": "59b697acd8e9cf615405098afc690fa9", - "vendor/php-di/php-di/src/Definition/Exception/InvalidDefinition.php": "dedbe9cc22c2f034ac97df99071d4168", - "vendor/php-di/php-di/src/Definition/ExtendsPreviousDefinition.php": "3949729267a5c2925e941f28482a881f", - "vendor/php-di/php-di/src/Definition/FactoryDefinition.php": "0005fb656a797243b1dac9e468bb3c46", - "vendor/php-di/php-di/src/Definition/Helper/AutowireDefinitionHelper.php": "f48e0e3f489c278a4db8580197155e1c", - "vendor/php-di/php-di/src/Definition/Helper/CreateDefinitionHelper.php": "338d3d3f353d13acd8a431bac355dd41", - "vendor/php-di/php-di/src/Definition/Helper/DefinitionHelper.php": "cb7e7c7b98ae6dc1aa0fc75489fdc1c2", - "vendor/php-di/php-di/src/Definition/Helper/FactoryDefinitionHelper.php": "32671cda6dd0110a114241cafc3dac2f", - "vendor/php-di/php-di/src/Definition/InstanceDefinition.php": "2e484f6a9a7914a1383153c20c7b2bf3", - "vendor/php-di/php-di/src/Definition/ObjectDefinition/MethodInjection.php": "d0f2a820de965beaa58ae318f6bb9782", - "vendor/php-di/php-di/src/Definition/ObjectDefinition/PropertyInjection.php": "a76ba29497925c9dde3761d0f20cd306", - "vendor/php-di/php-di/src/Definition/ObjectDefinition.php": "5a282856e9d937f7200883b3dc578783", - "vendor/php-di/php-di/src/Definition/Reference.php": "bd70cad280ae4b35e740ad82b86aa511", - "vendor/php-di/php-di/src/Definition/Resolver/ArrayResolver.php": "a2b901398ece7855b250c6b9db621d9f", - "vendor/php-di/php-di/src/Definition/Resolver/DecoratorResolver.php": "ad76c5e12936be29112d8ed0f7fd850c", - "vendor/php-di/php-di/src/Definition/Resolver/DefinitionResolver.php": "c374bc17c58982a083d28f805b5f9a99", - "vendor/php-di/php-di/src/Definition/Resolver/EnvironmentVariableResolver.php": "ca1320a3a6b565429e8574bde9f97ac6", - "vendor/php-di/php-di/src/Definition/Resolver/FactoryResolver.php": "27d2b373b3b4dbf4198a1aa7a34ad375", - "vendor/php-di/php-di/src/Definition/Resolver/InstanceInjector.php": "04c87ba94059bf7cb641dcf965590e2b", - "vendor/php-di/php-di/src/Definition/Resolver/ObjectCreator.php": "485075a2f1d769f7b4364ff362ec0e2b", - "vendor/php-di/php-di/src/Definition/Resolver/ParameterResolver.php": "e99173636465a26eb6864e3b1cdffeb9", - "vendor/php-di/php-di/src/Definition/Resolver/ResolverDispatcher.php": "e45c13c429016803e5a38ff89533dc06", - "vendor/php-di/php-di/src/Definition/SelfResolvingDefinition.php": "f906a7c24beb7253309c1ed6ca293779", - "vendor/php-di/php-di/src/Definition/Source/AttributeBasedAutowiring.php": "5b7989439baa896c7c229711027fe8e1", - "vendor/php-di/php-di/src/Definition/Source/Autowiring.php": "a181a25ab4579dc151bb26d63e041d56", - "vendor/php-di/php-di/src/Definition/Source/DefinitionArray.php": "ac471d9f8620126b8973635385a9e237", - "vendor/php-di/php-di/src/Definition/Source/DefinitionFile.php": "111d98ca585f293ec6f859fec081bc15", - "vendor/php-di/php-di/src/Definition/Source/DefinitionNormalizer.php": "bfd3b5c5622277e587706553d863dd3b", - "vendor/php-di/php-di/src/Definition/Source/DefinitionSource.php": "0f4192f1a20b239e1f3ca7aa4a2813fb", - "vendor/php-di/php-di/src/Definition/Source/MutableDefinitionSource.php": "5bc4003e9423b24096fe5d1b2865cdae", - "vendor/php-di/php-di/src/Definition/Source/NoAutowiring.php": "f715daefb7737fce8a7c27e2b89477bd", - "vendor/php-di/php-di/src/Definition/Source/ReflectionBasedAutowiring.php": "68b85a8f2170b0cedfa79afe7a4f1656", - "vendor/php-di/php-di/src/Definition/Source/SourceCache.php": "10d82a48471f737218d51481e7a06480", - "vendor/php-di/php-di/src/Definition/Source/SourceChain.php": "119c64a4de3fe4208ba1ac756c4e8f30", - "vendor/php-di/php-di/src/Definition/StringDefinition.php": "6993ed02787658dc7460255a800990cf", - "vendor/php-di/php-di/src/Definition/ValueDefinition.php": "e4374dbd15ffb1d77f489a5d5dcce94a", - "vendor/php-di/php-di/src/DependencyException.php": "1061104f1bc543c7a1ead7746db52c79", - "vendor/php-di/php-di/src/Factory/RequestedEntry.php": "785572dadd0196058d7d79c70f64fad6", - "vendor/php-di/php-di/src/FactoryInterface.php": "a7a4cd9b7514606d592a41b331959f3a", - "vendor/php-di/php-di/src/Invoker/DefinitionParameterResolver.php": "46f42485afa6d5750e55a979ae3e7761", - "vendor/php-di/php-di/src/Invoker/FactoryParameterResolver.php": "3d11eb57cdab178fee6c9d33bc79fbbc", - "vendor/php-di/php-di/src/NotFoundException.php": "ef178eb5928f4c409efde4ea5a938347", - "vendor/php-di/php-di/src/Proxy/ProxyFactory.php": "59a868d300a5c30f78a69e94917d7ea8", - "vendor/php-di/php-di/src/functions.php": "1ec2262b5d8ee83a3e8d6de45734f383", - "vendor/phpoffice/phpspreadsheet/.php-cs-fixer.dist.php": "9d54e2b95e8f62f8568d625d2f55013b", - "vendor/phpoffice/phpspreadsheet/phpstan-conditional.php": "be508b78c0b88d2d773b95d59de1ceca", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/ArrayEnabled.php": "d8c9ffe4b353c221af10cd45b3df54e4", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/BinaryComparison.php": "51233358d899601b5e24a1eb181dc15a", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Calculation.php": "11d3f18d4fa81b76b4072aa9c4e887e5", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Category.php": "1637f850746e189f7a30a23bf9cc802c", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Database/DAverage.php": "519902bd92d2d40e5670e44feaec64cd", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Database/DCount.php": "a08556c40a76abb67ed9ed7437f5144a", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Database/DCountA.php": "1a4591b33682f3440a3be3291a103118", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Database/DGet.php": "4b97abc90031ed7a5e6f478a05c57b47", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Database/DMax.php": "cbd6f48bb3a395abf7a45e0f20cbaeed", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Database/DMin.php": "405947043ce75f3e5291a78b5db8ceb3", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Database/DProduct.php": "c0bc8c500deb2bd20194496873e90e7e", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Database/DStDev.php": "f6814661442b850641b589a0dcdf694e", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Database/DStDevP.php": "c081455934eac10908ce03b955bab3a6", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Database/DSum.php": "b737fae5d7bb1fa825b416bfb02f905b", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Database/DVar.php": "441a91bc2df66d0b8c9c655698a3401f", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Database/DVarP.php": "79980d0f100f86fa63f93db34dc23805", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Database/DatabaseAbstract.php": "b48ed5be2ea499a29170bcb5a02518ea", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Database.php": "42f5fdc4f4ac14af7202d162b174f9fc", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/DateTime.php": "c12d78a169ceeeaf1c1c5d2c6eaae8a4", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/DateTimeExcel/Constants.php": "925501edde309684cbc9902ac1cff2a6", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/DateTimeExcel/Current.php": "a22cffabde99298a6eebb442cde64b06", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/DateTimeExcel/Date.php": "254141b60dc291e0d8d133722a74ce05", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/DateTimeExcel/DateParts.php": "f32f37c21210f6868a2afb097a168d20", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/DateTimeExcel/DateValue.php": "7122022d883c3a7c2e5c826a734e0b3e", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/DateTimeExcel/Days.php": "ae287566ad2a648aad2e7088481bbc17", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/DateTimeExcel/Days360.php": "af78bc429719a7aca5391444bf80ea7b", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/DateTimeExcel/Difference.php": "00426d82ba63e70465a7f411b2e930f6", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/DateTimeExcel/Helpers.php": "6e12bc9f250830b562f5448b75506526", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/DateTimeExcel/Month.php": "1f953d6731591fa153346995eaaa14cf", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/DateTimeExcel/NetworkDays.php": "d172acbdfe8d4904857cae6d1d679b9d", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/DateTimeExcel/Time.php": "86c0facc4b9375b3e088289bfbc302a5", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/DateTimeExcel/TimeParts.php": "5976ae9bf3761f7d14376d421625cbd0", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/DateTimeExcel/TimeValue.php": "9a3083266c25531d7e1ef4dbb54e81d9", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/DateTimeExcel/Week.php": "f9a79e291960a3edba3c076ef3cf0de5", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/DateTimeExcel/WorkDay.php": "1875dcf67ef58b6721586df13c5e018c", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/DateTimeExcel/YearFrac.php": "99f83e65341eceda74badbd3a0131159", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engine/ArrayArgumentHelper.php": "cf63fddfc51e8c6eb45e68c6cda6ac68", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engine/ArrayArgumentProcessor.php": "af96de1e451c4800395ad4ab5784695e", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engine/BranchPruner.php": "8327cb1a21badb33be3563b033c0f438", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engine/CyclicReferenceStack.php": "7bb04104934d86d0708e931faa96f08e", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engine/FormattedNumber.php": "c3bdb607abf43a42d4a46dbdc3240337", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engine/Logger.php": "655dc5943ed046171b8c2f44a1f21f93", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engine/Operands/Operand.php": "05c2404467ffa989c05e8934a56e12b5", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engine/Operands/StructuredReference.php": "434b0fed9092fd78de7f83e755f3c839", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engineering/BesselI.php": "080125801fad69d56567d0c79bc9ba6f", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engineering/BesselJ.php": "ca058e1ce4da480f9fa4e6c67f79af42", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engineering/BesselK.php": "3416a4e9ec5bdff10e43ab9deff19ef3", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engineering/BesselY.php": "0dc825d90a0dd188c188cd63c096ec54", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engineering/BitWise.php": "c2e82a95f29c9885537d31bf1e3e58b1", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engineering/Compare.php": "f47e859a85bda3081c66e245d99fa8bb", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engineering/Complex.php": "c0f5c76d2efdcc2bb5a741c68ca14a41", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engineering/ComplexFunctions.php": "6af6eb4979443fbdf07ddc4d4897a425", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engineering/ComplexOperations.php": "3ba4970bd9def08e60bc67d552d4e535", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engineering/Constants.php": "a2d9dad0115f1821a66034e58d712b5b", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engineering/ConvertBase.php": "56951419d5592f87b752beba1d420d07", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engineering/ConvertBinary.php": "91193a30d7e182a228545a1a896f5d82", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engineering/ConvertDecimal.php": "80d890bc16bb376b016f27fa8355f190", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engineering/ConvertHex.php": "7d64f9d4168e8bb0189ef3c53fc0b516", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engineering/ConvertOctal.php": "e8ff8bbbaf605077819238293eed4851", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engineering/ConvertUOM.php": "ed1ac074eb530c955ddebef776350286", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engineering/EngineeringValidations.php": "8ffb2cfad5310c7bef8cad180d15f64d", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engineering/Erf.php": "015d3445dc5212ae5972db6afc797055", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engineering/ErfC.php": "bb2b8bfa3c2aaac7a4f7beaf06d8bf88", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Engineering.php": "d72d2ac1e5e8c0c7f3296f03c91b33d7", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Exception.php": "b95d47d2eec2a53d504cf8cc5ccd1b0f", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/ExceptionHandler.php": "71068bfe2882339eccb78f575075ff6a", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Financial/Amortization.php": "625de827a8f6e1eb66a17653f96cde78", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Financial/CashFlow/CashFlowValidations.php": "7857cf5db24fdad838333164e54e45d6", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Financial/CashFlow/Constant/Periodic/Cumulative.php": "87ec2d983017dd7d44f40d94f1c2722c", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Financial/CashFlow/Constant/Periodic/Interest.php": "1637149f06a17e62d67fdc5d7269170e", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Financial/CashFlow/Constant/Periodic/InterestAndPrincipal.php": "72148dd20fd9043e65cac463f9e5c04b", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Financial/CashFlow/Constant/Periodic/Payments.php": "90459bf0d1d04ac1e3a5f84c1165f76e", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Financial/CashFlow/Constant/Periodic.php": "15d795e3ecfb917273c1e0acceb67fd8", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Financial/CashFlow/Single.php": "74986fc1460dae0d3c6cf538fa89598f", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Financial/CashFlow/Variable/NonPeriodic.php": "76c6b151dcac00db96de729b3ddfbbca", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Financial/CashFlow/Variable/Periodic.php": "b976b606c7e408739b1cd8552694c8f0", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Financial/Constants.php": "0d1f9f73bc683c1623d83c1e43473579", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Financial/Coupons.php": "a5ca6d176a7d497d761cd157fc1b139f", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Financial/Depreciation.php": "98ce7dcfcf2fe4c917f3d6d434f40f7a", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Financial/Dollar.php": "39a0972097bf91887828956370726d2b", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Financial/FinancialValidations.php": "b2dfe46fdad4dfb66f6dc015e41c9043", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Financial/Helpers.php": "2fe09bcdb76a1c84f53a7c4a32163cb6", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Financial/InterestRate.php": "b43c2d8d5065532c78a4c9a7b35b60a0", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Financial/Securities/AccruedInterest.php": "44be037463acb35d516c36b0ceb0a0b3", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Financial/Securities/Price.php": "ec596121cd512db65ef5d9b20e81457c", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Financial/Securities/Rates.php": "dd760a55392e632db26362f50fcbae5c", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Financial/Securities/SecurityValidations.php": "ba239630f9888d602f24bc018111d53c", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Financial/Securities/Yields.php": "4262e2bfb9bb6ea36360a6c38a5fc2de", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Financial/TreasuryBill.php": "1139aa82561d2154165aa166019d5ab3", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Financial.php": "7824adcecc3eb98e8af038004fc736d2", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/FormulaParser.php": "999802bbbe377330f5d61929f3f9c489", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/FormulaToken.php": "00dc1a3351b85f616b31be59954b725d", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Functions.php": "aa7a0c51be5c0ef91941a3225da28fc2", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Information/ErrorValue.php": "cad3430d4602e459066f6fc81c317000", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Information/ExcelError.php": "d5e66ef7c68bb9dea5008903614e058a", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Information/Value.php": "26ec6268477b37194b3c08f2f02688c8", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Internal/MakeMatrix.php": "cef7be19a5bc40ba0724d11a86b18481", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Internal/WildcardMatch.php": "f7c220e0fc78cf2950ce921aba264d1c", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Logical/Boolean.php": "d6cfa9cb3a355b8b8be3b298f62ad22e", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Logical/Conditional.php": "f234584b5a01f38d47cd603b1e14a984", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Logical/Operations.php": "cba333f171b2fceaba2dac8dc81da600", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Logical.php": "7413bf0136ef6096f4d0b80144a1e1a7", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/LookupRef/Address.php": "8cc8566fe21a5094fc31b417f6c8cf81", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/LookupRef/ExcelMatch.php": "b3af58ce0711eceee2876f5f1ccee9fd", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/LookupRef/Filter.php": "d0d271fa71768c5af5afb1d096e92d5d", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/LookupRef/Formula.php": "fc4c0353857e9f08da70ff2d19ddb83a", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/LookupRef/HLookup.php": "12ec129f3a20a4b4a02276991b8aff7d", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/LookupRef/Helpers.php": "e3d892ec108bab90155e7a20a731981b", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/LookupRef/Hyperlink.php": "9b3f39c3701bda85ae1e176872b06218", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/LookupRef/Indirect.php": "3f4cc4a921fa90df93101e0cf5072945", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/LookupRef/Lookup.php": "466e5794ece51d45936724c89b0cf510", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/LookupRef/LookupBase.php": "1f750d7addcea5109401e39e66f5ebce", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/LookupRef/LookupRefValidations.php": "c5ceb360ac93953bf0a07c5d86f6c22e", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/LookupRef/Matrix.php": "fa66e35f24bce4a5e9e4d699ca831273", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/LookupRef/Offset.php": "188b88cf031473e7972a592fa122842a", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/LookupRef/RowColumnInformation.php": "4c9d235f404f3aa1dbd8744fc005676a", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/LookupRef/Selection.php": "90b859f705468fa6002cc1f082d7cfdd", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/LookupRef/Sort.php": "d8188d91efa8351b50cfd78f4ae2e489", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/LookupRef/Unique.php": "29adfda6e408e1639c6edc0c5d35589b", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/LookupRef/VLookup.php": "b7068706adedbd909f84404fd2c4edba", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/LookupRef.php": "eba0a56165ae2e8deb9ec1fd10cb0f71", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Absolute.php": "4928af091641f249ac87a65197d6552a", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Angle.php": "23ba9ae758e023954f94f47f13d9605f", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Arabic.php": "06e7e94cd18b3cc313d0a412fb46e2d6", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Base.php": "8d2b4887aff853d5a71bffbfecaefded", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Ceiling.php": "6273250af117d3da38ae9916dbc4782a", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Combinations.php": "6940cc62e80b85c5eeed87ec4529624a", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Exp.php": "43ef0df0a982f448023fa63783370ef4", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Factorial.php": "bdbe82f204f6bb5d5c11cf11e5fcb8b2", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Floor.php": "7d3361588126b110f4b30e19c5df9e55", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Gcd.php": "a18de5bddb40a14a2c6653086e5b335c", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Helpers.php": "24d52d9846a05a299e3a9cb798e100c7", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/IntClass.php": "7b4d7d541410880ecca7648718232371", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Lcm.php": "081c229303048680720e68985f12443b", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Logarithms.php": "236ed78ac5f340ebdc35c8b61adb8a94", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/MatrixFunctions.php": "89f8ac215e899fa0604b5467514ba66e", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Operations.php": "49f94dc96696c4ff0353cfe835c92840", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Random.php": "eeea0b5265b4e6d13c7815480db38268", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Roman.php": "86d1cdfdc67f1bd51df1d03461c686d0", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Round.php": "31748dbfee3a21837f75d409ce569003", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/SeriesSum.php": "7f268defc69aec74457c88310a8441d0", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Sign.php": "f0857aab4a6749a94dc6accbf881631a", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Sqrt.php": "d9ddb65e39d1f8d9639bb2b5531f9364", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Subtotal.php": "cb151248f9f730bafe83d48aadc3e91d", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Sum.php": "699656417552afdf4166c075cd43548e", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/SumSquares.php": "32105e9af4dff6aaec5ffbd085c90ac7", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Trig/Cosecant.php": "fb65a5bdfc965b7814d2658d9ec4e9ee", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Trig/Cosine.php": "13b6c0e8daaf65afad45c0325654a1f3", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Trig/Cotangent.php": "795781400a18e2797ff3b6417cbdd322", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Trig/Secant.php": "10182741655ec92d68505a5648aab037", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Trig/Sine.php": "6c346ad692201d4f84680860f8c2e458", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Trig/Tangent.php": "4bfabfc8c0ca96af1f76a99848d98f66", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig/Trunc.php": "9619dfa080e594b9ea7ba6caee834d47", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/MathTrig.php": "93c6f68f94c7a70db73ebcd7377577d8", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/AggregateBase.php": "3b08a6b37e373234398191da98d2a53d", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Averages/Mean.php": "97e6bb36db03bbe8d2a7b87414a0ae8a", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Averages.php": "8ba44fda68fab17a68ae6d06aa69c968", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Conditional.php": "37e896f4605943df331497cbfad2ed61", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Confidence.php": "6db51a0ef159885059fa57de272f7b23", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Counts.php": "98265c5318fc9cef2b60c5bb8821e45e", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Deviations.php": "0543acfbab8884205a8ea27f7bfad586", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Distributions/Beta.php": "909babab0d13eae5410a946e42691486", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Distributions/Binomial.php": "3e9508c6177440cb6b30c4c2520c229d", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Distributions/ChiSquared.php": "81c9f209ebc5df360d9a3ae4ad7703e0", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Distributions/DistributionValidations.php": "942a52896fe4dbc63aa6209f557573fa", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Distributions/Exponential.php": "a1c1fd21aecb40fda4fffc02cb68f00c", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Distributions/F.php": "5cee0a5460bdeee1f3703a6246e37f97", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Distributions/Fisher.php": "7e168a4c7965fe04ad746425d6b68c87", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Distributions/Gamma.php": "ac35b5f989368110f418d54fa2e65242", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Distributions/GammaBase.php": "2d75c5f9ca9ef657095a32819f7ab202", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Distributions/HyperGeometric.php": "78b224dbb11cc80f2037611f113fe8bb", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Distributions/LogNormal.php": "8b631fb1109e4d04f66a36cd743c219e", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Distributions/NewtonRaphson.php": "cdb1a200d6065118a1e8af776480501f", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Distributions/Normal.php": "62916b0548038478d79cbaacf7b04975", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Distributions/Poisson.php": "5fa327600886f0e8f1feb641526d43ea", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Distributions/StandardNormal.php": "521196d0b220692c54f09e4b04084cdf", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Distributions/StudentT.php": "1c2db2a6fc1b0939fc955ae7cd0c565a", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Distributions/Weibull.php": "0ee6f13a82999f72036c8827b694854a", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/MaxMinBase.php": "b35583115c85805fc528b66683a551bf", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Maximum.php": "fc00dedff28e97978c7b4543fdc4b053", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Minimum.php": "6c7749ce4a6883008d4841217307bb20", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Percentiles.php": "68028a345804a837461e4767eea03880", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Permutations.php": "bc4fd5a92abb67c15dac9e51d852888e", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Size.php": "6e0be630661f10f12a8e1aad40146cf0", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/StandardDeviations.php": "f9f83d82746e5217a831942f82f232d0", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Standardize.php": "a50b1f9dd46ce578f13c5a9f9aedce9f", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/StatisticalValidations.php": "30f9db87b37c7225bfc118f0b5073fcf", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Trends.php": "637243c2dceb50328937e6d3f0d05076", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/VarianceBase.php": "8b10863f6c9d9751b448593cddd50b46", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical/Variances.php": "ba2a635a30972332748e8c57f45e9c07", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Statistical.php": "234960ee12968073bd8643ce64d29c23", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/TextData/CaseConvert.php": "acd8e956e6acce8b83e796a43b194834", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/TextData/CharacterConvert.php": "ce50fe5858cfba27c53a5dc4efb797db", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/TextData/Concatenate.php": "5a7e402dbc8a7f4b50fbb1ddd8b8b805", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/TextData/Extract.php": "9b88b2211c79ed5511a8c87aa4eed291", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/TextData/Format.php": "4c50169fa926df9f6e1ba302f214ad95", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/TextData/Helpers.php": "69f90116393ae8689600da5c0733d8c8", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/TextData/Replace.php": "ad73ca8dd3f2217cfacf8b787336714c", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/TextData/Search.php": "05a7113470e089132a47b3c3c72127a2", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/TextData/Text.php": "44fbf24b318a590634d91e5deee0114a", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/TextData/Trim.php": "e1b490896d081e3489482a037e309e2e", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/TextData.php": "004c3a9ba03817c0de83af1cff82dd1d", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Token/Stack.php": "f87af4cbcc3a0428b9c46895967f456e", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Web/Service.php": "bbe548b6cde46a22bf3766a0d5fb50ba", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Web.php": "ee7b59cddd1cf788910c3f3d5c69dca8", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Cell/AddressHelper.php": "739fc0b9de47d89d3c4ce2445b2a02f2", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Cell/AddressRange.php": "c4d8ad5d5c8ed68a0baa11d89104aa11", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Cell/AdvancedValueBinder.php": "88963bb213a43221ee3999ab97aefacb", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Cell/Cell.php": "e01938fa7e1794c3d3a063f9103d5fa1", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Cell/CellAddress.php": "f7297119206b61b78aa301f0390e8e02", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Cell/CellRange.php": "dd4488344a56fc2abfc95cf371ca55a1", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Cell/ColumnRange.php": "dd431e66315b1c5158edf5d45d9e25f4", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Cell/Coordinate.php": "2f4e41cbc953852f207c5c493b19b87b", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Cell/DataType.php": "e0c96a4769c8ddec1f379af89409864f", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Cell/DataValidation.php": "9ff00ab0dfb56efdf997a366607240f1", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Cell/DataValidator.php": "42854328772388213bb0ce990692c699", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Cell/DefaultValueBinder.php": "bb58efac3293c0dae5d39fc38346b1c4", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Cell/Hyperlink.php": "6d67b5c222d19f0d94d062a395783007", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Cell/IValueBinder.php": "756ac3f47e09bc6f1e6f75d6139d8d2f", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Cell/RowRange.php": "f6efac5fe6204f78a08a71e4518e8b94", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Cell/StringValueBinder.php": "5decfaacafa03810f6bd23cd266fc943", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/CellReferenceHelper.php": "83f909ba08e3eb4c2cb8e50f02efd8a2", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/Axis.php": "16143e0c849b821cb0a562262c24e82f", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/Chart.php": "8ba362008f4442c6155ec071dac7a9b7", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/ChartColor.php": "639ff70f3de4833eecbe9efdaa3d8b21", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/DataSeries.php": "e24e25b8b8ef75c947778ac1f9d509eb", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/DataSeriesValues.php": "b351a06aebf7fa05b44cfaf5c822fbd6", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/Exception.php": "01882bfdece5d457ec586aa0f8ee3df2", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/GridLines.php": "7f99179c4741f929c246d625303eb65a", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/Layout.php": "75dffd8d4c90dbfb1a90c55d6d177821", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/Legend.php": "d66b69d3accd7410cc5e52e62a4ce2fa", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/PlotArea.php": "7612c910ecfa074fb7cdc181de7dd475", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/Properties.php": "01b6a8d1e893aef7814d93c84615becc", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/Renderer/IRenderer.php": "101743783a852329d96d9c21036debd6", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/Renderer/JpGraph.php": "a2fc4a7439dc04cea2ed724c23b4c35a", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/Renderer/JpGraphRendererBase.php": "93202e568d3481d67603b14f5231d5c0", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/Renderer/MtJpGraphRenderer.php": "0e5bcaecf70f23737d0fe008d89d49ec", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/Title.php": "690e022d5253af6d72375ff28bec0de3", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Chart/TrendLine.php": "bfff350cce385febec81f6f899ce0b01", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Collection/Cells.php": "556109ccc532459f51450e9119417de7", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Collection/CellsFactory.php": "4a3d72f56e5ba9fb64c968d4c7a01369", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Collection/Memory/SimpleCache1.php": "757090e881f371d49a6f0d49721ab0cf", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Collection/Memory/SimpleCache3.php": "605c2afc6654df758bc89854a07b00f9", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Comment.php": "4a28b19abd699a895591c465c6bbb4ae", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/DefinedName.php": "79a78c94f223ee35e91bb0150897ea21", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Document/Properties.php": "9ad24c4fde7b450e6a6060316a03446e", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Document/Security.php": "662fd7fff38e4f2e60301cc01a3223c8", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Exception.php": "03f1a33e2f9eeb3d1cd56bb174862633", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/HashTable.php": "4763b3fe27ea1af5542bb5e141697a9c", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Helper/Dimension.php": "83017fefbfe417786b6a059f851d329a", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Helper/Html.php": "7a119f1cab1edf582ef1f1c2dc3903ea", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Helper/Sample.php": "0d0b2d2ba439348ee74f7b4bb127399e", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Helper/Size.php": "cd7e3b2ba0b319d6c645d10bd9b3da11", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Helper/TextGrid.php": "385e6dbae50956c26f0577e82669bc49", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/IComparable.php": "5be0f7e23e559a4791b288e2c4509fe4", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/IOFactory.php": "b25d71572f9356dd8ac1008fce4a4026", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/NamedFormula.php": "fa267cb545be51c5b43d3301ac14fc0f", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/NamedRange.php": "4489583b7719c78148cc9f21254f32f6", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/BaseReader.php": "5557a270449eb7b577bedf4e1389e81f", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Csv/Delimiter.php": "917822270c2c3d34aabdde782de66f54", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Csv.php": "096ba0a62b4b8b80cf273c00d321ac9c", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/DefaultReadFilter.php": "e510c41613d4ec00b30447216f82b6ba", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Exception.php": "e5d6fea15a1ea0e2ddce2878073e7631", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Gnumeric/PageSetup.php": "d35662ef5000c28b3e8d916a923796ed", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Gnumeric/Properties.php": "9a98b99db62b69be38dd57926043244c", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Gnumeric/Styles.php": "05c350bbe5cc979862de8dba121caf85", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Gnumeric.php": "169f5e8d428a4c3617f6854a1ad70e5b", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Html.php": "c89c518848f69225c06b2502bdd82942", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/IReadFilter.php": "6489df33ce4d01ee9e86d5f63dbb5861", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/IReader.php": "78f54c4d966dc0460ba1a41169c15484", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Ods/AutoFilter.php": "c1ba3d427de6faa7f4c455d1a8553950", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Ods/BaseLoader.php": "3f7c9561c20119ac65ec766e0554b4e2", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Ods/DefinedNames.php": "6439ea7801c1a7aefcb7b64ff93a5a38", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Ods/FormulaTranslator.php": "9402f3f8cd5083bffde398e16488132b", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Ods/PageSettings.php": "0aa2004e8c3e5ef66b993e1eb57efa26", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Ods/Properties.php": "4b4a67c484b5ed792f0ff5fcbd2ea39c", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Ods.php": "3b0f0fcaeab5765828ba7148d838ad21", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Security/XmlScanner.php": "2f29a1423bbb6da5bb8b0aef954a63f3", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Slk.php": "1bcb23cfc43ad80ec859a4d3010fe2b9", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xls/Color/BIFF5.php": "1f3de0cc597a3689c5dc0828b7ddd364", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xls/Color/BIFF8.php": "e282717234cced388477f6901246378a", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xls/Color/BuiltIn.php": "deb84aac1e5b136b876f2893afc3fcef", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xls/Color.php": "bf47fbfa12d4bc754bbeeecb5dbd88a5", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xls/ConditionalFormatting.php": "b05e6174d505bea34448da1254764e70", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xls/DataValidationHelper.php": "c1336dc7d1c1cf56a338060243947a54", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xls/ErrorCode.php": "3890dbf9085c8443337b06031ff9ca6f", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xls/Escher.php": "87a251f623d92b4c967e72eb0e5a4781", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xls/MD5.php": "2923be99e0263649d985176dba79312e", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xls/RC4.php": "f102ede4d6e04830413297964d3bb661", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xls/Style/Border.php": "e951aec66b6871f2a6332647406d8c94", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xls/Style/CellAlignment.php": "e383004a6dc9b88d33573521015527de", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xls/Style/CellFont.php": "f0885ac090dec87310e23c3fedb4242f", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xls/Style/FillPattern.php": "f6182aa20f6def72c779a338ec14b008", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xls.php": "00531ec021e9731b1026af37c6704bc3", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/AutoFilter.php": "9277f2ac3da6176dd29447c31cf72973", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/BaseParserClass.php": "92e4a290c0f3113d8fafce644cd1b673", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/Chart.php": "f14cc4af618d6b3d8048d440dd19290c", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/ColumnAndRowAttributes.php": "cc750f8c5be978f0d42d7d0dcc58b786", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/ConditionalStyles.php": "73c34300d392cc8f5f051cf9e8f6380f", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/DataValidations.php": "987e0c0b0e4483a25cc4e86b65c5e4fe", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/Hyperlinks.php": "895b817cd2ad479fb0588834916e5827", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/Namespaces.php": "11a9d8b959063f4f860ecf66645c6387", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/PageSetup.php": "ac23641e7f3ec5bafd6114748a54216c", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/Properties.php": "84bef533f9cbe9e37fcf3146236c7242", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/SheetViewOptions.php": "87ec6557455eea44fb19155959fb8dd9", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/SheetViews.php": "700779b09d13fb6e194a9b9ee0bce3af", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/Styles.php": "4a8e799af2c7699ff4e40ac28f41e356", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/TableReader.php": "6fb650f09988510fb10639f754df9199", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/Theme.php": "36b1863f2c43f63eeb0748dd10881f2e", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx/WorkbookView.php": "5b3b69b113fe4255d1aa40a23ef9ffc3", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xlsx.php": "ef4903a1300660cba75cfa661dea470f", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xml/PageSettings.php": "af8b8c7fbef997079e848f3dd383b177", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xml/Properties.php": "0922481f0eae8da3d4b56a0fd0a08d95", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xml/Style/Alignment.php": "f1a8b4add018a17cf43eef9509bbe455", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xml/Style/Border.php": "b133b67fb1045b83f75dedf729bc8d30", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xml/Style/Fill.php": "d434754a3263bb2f5cab27e6ae4ec1e3", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xml/Style/Font.php": "e6d33adb5a37d83df970dbbbb6302c98", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xml/Style/NumberFormat.php": "59c975935030b10c6afd598dd7854ea0", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xml/Style/StyleBase.php": "ab2bc1f0bb213cca6ce342a05741668b", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xml/Style.php": "39f05045d8fb15186643b2b66336fcde", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xml.php": "994f548f3096832bc334f62b294536da", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/ReferenceHelper.php": "8e7c53e69c6976728211ed3126834744", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/RichText/ITextElement.php": "8d7c4ee48dafe06ac2e731d03fa76225", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/RichText/RichText.php": "fa7de92311bcb202de38be167914c652", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/RichText/Run.php": "6a7a6864c46cdf1f428edcdd0d1766c4", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/RichText/TextElement.php": "d954598071bbff10183d8a4c9ab7cd47", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Settings.php": "c5a62b576b9505a7c583f5a07b97ddf1", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/CodePage.php": "c6fe801011a6e417c1be84c674a1b2f3", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Date.php": "b90881122cbb38596ac019ac12d776e0", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Drawing.php": "437b2c394c0cd20218b1f15e021d5c15", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Escher/DgContainer/SpgrContainer/SpContainer.php": "616d5350aa201e947ebb322857d4807f", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Escher/DgContainer/SpgrContainer.php": "4e3fde8031f0d25c55f17d960ddbe139", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Escher/DgContainer.php": "8a3d5d52db8f7c1086fd1292eb6d9257", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Escher/DggContainer/BstoreContainer/BSE/Blip.php": "8b1e46f819bf9c5e7b30e0aa6eab27e1", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Escher/DggContainer/BstoreContainer/BSE.php": "8a1e088b910ae153c86861ffc628eee2", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Escher/DggContainer/BstoreContainer.php": "0230b6f51df8a749452f9a07b26b991e", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Escher/DggContainer.php": "83dc85a1e1a6b80038d85ea145224f66", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Escher.php": "95ee4f022451a75f946ead971b852fb8", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/File.php": "89dc8d062b0361a349bff25c86e5d09f", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Font.php": "11513fc4a173c79a653437d2afcde33f", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/IntOrFloat.php": "93f4860fb3d4f3e24db882adbb9a0905", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/OLE/ChainedBlockStream.php": "a5ef66c232a38d68120f04d6b1091aec", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/OLE/PPS/File.php": "a9d422e2476adf73726a76a7053f791c", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/OLE/PPS/Root.php": "457cc5719b8b85bfec51c7bd774d500a", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/OLE/PPS.php": "cf6343965e67bd99f875a2fb1308773a", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/OLE.php": "25fd47104a734eb085845d85aeefc82e", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/OLERead.php": "bad9e63a94ae8c8887e4e7420e8b1f74", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/PasswordHasher.php": "c74e28aa043032302c99f7892626bbdf", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/StringHelper.php": "e750b3a4406ebe4a464179f226c6ce28", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/TimeZone.php": "3fdcdf5027a154d9e4ce5b4c3b5e4518", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Trend/BestFit.php": "672d26bbec66cc83f8813e2a541efdad", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Trend/ExponentialBestFit.php": "098d06cbaabb7395f32f656abda8c578", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Trend/LinearBestFit.php": "5475f7352b6fd49ef44d1eb798bf6830", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Trend/LogarithmicBestFit.php": "5a76afa928dc018784bea8b890ab8f28", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Trend/PolynomialBestFit.php": "5f3dacc0fd2f3db7a29cdc0c044fd56b", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Trend/PowerBestFit.php": "5aa5e84f5cbf6853d9f946520566041e", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Trend/Trend.php": "71b81747698c8b8ac8c6593a8830e7bc", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/XMLWriter.php": "e4548ad1eb126b640159da2e3e86a7a8", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Shared/Xls.php": "c724f237d2661d4d2a2cb02748d2bb69", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Spreadsheet.php": "09628ff33576868ebc7d213cdfde9844", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/Alignment.php": "fbe33a26901ff19311f513d44c7e22b2", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/Border.php": "f39088efe15371cf895961b627ec2dc3", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/Borders.php": "23b139669257c584e814d2bbbc18e9f3", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/Color.php": "639af2a3e1625b189a2a4b5fa492d209", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/Conditional.php": "2b9e02edc038dd4103316a5cb4ce1ac4", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/ConditionalFormatting/CellMatcher.php": "907144ca6325be5dd9151348f52d18e0", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/ConditionalFormatting/CellStyleAssessor.php": "250448b0250069d527a3e0655bf49e18", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/ConditionalFormatting/ConditionalDataBar.php": "0e69793402d9efb39116dcefda552603", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/ConditionalFormatting/ConditionalDataBarExtension.php": "bea38faeb4c18aced4a91d4f0b5f72d6", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/ConditionalFormatting/ConditionalFormatValueObject.php": "e7309f52322735de93feef5caa5b879b", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/ConditionalFormatting/ConditionalFormattingRuleExtension.php": "dc9069c90232fa9796c8d928ed92b3c6", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/ConditionalFormatting/StyleMerger.php": "e9cecc24e35ee0d461d70b1191152f35", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/ConditionalFormatting/Wizard/Blanks.php": "7d5881b03833bdbabc145547f3b5521f", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/ConditionalFormatting/Wizard/CellValue.php": "1a37ef1adeef505df06ed062a21af9b5", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/ConditionalFormatting/Wizard/DateValue.php": "a4782632676c4fc431f69ca5ee924627", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/ConditionalFormatting/Wizard/Duplicates.php": "89d1ccd25aad2b5695c9a1330d78e3f9", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/ConditionalFormatting/Wizard/Errors.php": "f1f5c78bafc732de1d1a887c662730a3", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/ConditionalFormatting/Wizard/Expression.php": "b796dec6a36efba447d686e204d82bfe", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/ConditionalFormatting/Wizard/TextValue.php": "74ce439b27b4f60d4869da42f27e19a9", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/ConditionalFormatting/Wizard/WizardAbstract.php": "aaaf7d3050cd46996a7ffe747b20bdd4", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/ConditionalFormatting/Wizard/WizardInterface.php": "3a474bf012ce0326ac774af253d9d29f", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/ConditionalFormatting/Wizard.php": "198e7b61fbd14100937c4416112ad13d", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/Fill.php": "0196ab26a1b860f32b89de91b84e76f9", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/Font.php": "24ee19678d5620834ccb0ca9e14cf78c", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/NumberFormat/BaseFormatter.php": "a9acba9350eeacd7bed051d2a76d53ce", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/NumberFormat/DateFormatter.php": "57eeb75538d545f288ffa09e4beddc59", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/NumberFormat/Formatter.php": "b1bfccc7b0ac84272613ced04c81ae20", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/NumberFormat/FractionFormatter.php": "b94179896baa15ddc5d37713e277f489", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/NumberFormat/NumberFormatter.php": "fd1fa8fe1f5548e3c8826e7e5b107c6d", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/NumberFormat/PercentageFormatter.php": "1ef63a03b82b6e85d15c0daef0a44636", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/NumberFormat/Wizard/Accounting.php": "100cfa4a02215e9841366dda9f205a03", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/NumberFormat/Wizard/Currency.php": "62101a6f543e0952f5c5787287986e8c", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/NumberFormat/Wizard/Locale.php": "c00eac6ab625a1106f184c808b4be8e9", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/NumberFormat/Wizard/Number.php": "ac3d349b33b1e906f105336b58c84299", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/NumberFormat/Wizard/NumberBase.php": "3b3ec5ca20da30dc2a634b1a337fc4bb", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/NumberFormat/Wizard/Percentage.php": "cc7c74f78653e50ae64ab672934afd5b", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/NumberFormat/Wizard/Scientific.php": "e3470577db535032062e394fd9e5cc6c", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/NumberFormat/Wizard/Wizard.php": "bb9dec534b1288096589c1a4c0c69fc8", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/NumberFormat.php": "a1ce4b6c25be308e0907b4fc0111b0f9", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/Protection.php": "f20161730985c4643dbd5fecae045acb", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/Style.php": "6d346ffcc2847449414775cabe6dd75a", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Style/Supervisor.php": "3d608c0669a8c8f317d09d338aa69692", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/AutoFilter/Column/Rule.php": "af9c5349645245e871724b12c33e724a", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/AutoFilter/Column.php": "15efc928f6a1e59f1c2a9315a1288de9", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/AutoFilter.php": "3b83d20fe680188258ca29b3c0a51988", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/AutoFit.php": "233152897103488e3bcae9f3d2a6972b", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/BaseDrawing.php": "61a896a0c55d894ac8611046745462f0", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/CellIterator.php": "f5d85e059e3c22cbf622bb5639592643", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/Column.php": "8b3f486c5160f3f3f62c9d8ab24af2f6", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/ColumnCellIterator.php": "03191acb6b0fac4b75fe5f6916ee3551", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/ColumnDimension.php": "694a0146e3cc50ac47e2980b27ba9ee9", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/ColumnIterator.php": "0f0b86d5cf6d6d9246c44d8c2491931d", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/Dimension.php": "57889580f47fdaa61b03c454668fb20c", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/Drawing/Shadow.php": "6b61c81d6363a92502a01ff62e803cc1", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/Drawing.php": "49d26e168b7906bc18094c0b2faa432b", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/HeaderFooter.php": "97164d35ec5f0269b6989d0734d44248", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/HeaderFooterDrawing.php": "e8ddeba2a3408995a0c433e15a8a8af2", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/Iterator.php": "766ab247e61b341bd031f04dbf8f6ebc", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/MemoryDrawing.php": "bf75ea864b1253eacd9a3de28d0f1c85", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/PageBreak.php": "20d29ed2c67724b84249e15271b736a8", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/PageMargins.php": "1c479645b73c0757f66b7488c9435976", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/PageSetup.php": "3d1ea050b529772b7e5ac754cd371fc0", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/Protection.php": "a37d51cbb47a68c0cf8fb4d9fb72a7e7", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/Row.php": "529225f1f7c065444811204038d50288", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/RowCellIterator.php": "475057b7b613ebfbf4d5e910033fad70", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/RowDimension.php": "7d118ba91440043f807c5c8f771685c8", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/RowIterator.php": "050e26a00c1afca15c169d03c7e27698", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/SheetView.php": "94b1f6bc702616fff0ffeeaad9f5540f", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/Table/Column.php": "e7271a9af0f01ba506b5ba8ff053edb5", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/Table/TableStyle.php": "9dc3541b7cfd3a46f1659af6ff4f2e97", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/Table.php": "467a53fbfc3ae2e4e8631692b6ffb2f8", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/Validations.php": "a84e302c1787832b5024f42a33ab147c", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Worksheet/Worksheet.php": "3630beb0e44bec91f6b82c47a44988af", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/BaseWriter.php": "f0b3c71331dde13d304e175d3f408ea5", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Csv.php": "0055dbb21da8ee04f7f6e4c709cf7410", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Exception.php": "6aa5c4105b94a1fb4bf7f3397f5f8b27", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Html.php": "45ae1c9091cab10f3cbcafae5c458ef1", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/IWriter.php": "b38807a972ac5551f6fbb752a4eb0c42", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Ods/AutoFilters.php": "5f1b71c64e3e898e9de52c1089b27311", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Ods/Cell/Comment.php": "a52f99ea118fea7d71ed840ed683f65c", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Ods/Cell/Style.php": "e20cc060f225dfcfb5472b736b39ad6d", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Ods/Content.php": "3b4ac3e231c31fe1ebb5ed4b0203734c", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Ods/Formula.php": "5ec408fdb0e75a0320f629791e6cee0c", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Ods/Meta.php": "5820e595aecb7bad1c56e52cddc49c45", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Ods/MetaInf.php": "e4f32e9a13836824f213c258a64982b9", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Ods/Mimetype.php": "2bc1bb2ddc1d6314059d1f57dadcdfce", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Ods/NamedExpressions.php": "60a0542fb544e01e88119f5f58571979", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Ods/Settings.php": "cd06034284fdf34c9866d8b06df4ff0b", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Ods/Styles.php": "3b611ff4521ba89e2907bd831d0ca48c", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Ods/Thumbnails.php": "3d00e2d9be4f16623b4644ae3be84b17", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Ods/WriterPart.php": "53991ad18aa2ab8b52c142aa71f44c8e", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Ods.php": "6ae737ba3db0a11f10686ff78155251c", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Pdf/Dompdf.php": "732eb26669fbcae7062621bdbdbce39c", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Pdf/Mpdf.php": "759713c675da0e868929a5b66ec08d77", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Pdf/Tcpdf.php": "525623cd84f27c20949a1ee89faf024f", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Pdf.php": "6803c608bdc16c7b03203b77b7b9c414", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xls/BIFFwriter.php": "9b2d23cf926b8755ff3b75c3996683b6", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xls/CellDataValidation.php": "f26350428f3451af53f507e7b72cb9f8", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xls/ConditionalHelper.php": "174ce4e9f60eeeb3b96d6b86ff3f514c", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xls/ErrorCode.php": "b98be1c2ff5e55c741f561bb020d698b", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xls/Escher.php": "7e254588241140a97e29eb128ecefbce", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xls/Font.php": "f6aaa55669ab9a318665a88ff6833034", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xls/Parser.php": "bddfd14b3b578ea725e4b7914e86b862", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xls/Style/CellAlignment.php": "22696f46254207d62557d7df4e2a086f", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xls/Style/CellBorder.php": "a79d33713d6d7c5087d0ebe96fc6bdc9", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xls/Style/CellFill.php": "73ce28075d7866bbef0574b350d4e933", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xls/Style/ColorMap.php": "c6a929a80c0701e48e2a19a9f04025db", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xls/Workbook.php": "351a306aa7f0ccd649bf489ec8952812", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xls/Worksheet.php": "b4b8667707c743eb9328d18cacb4c78b", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xls/Xf.php": "1e6fa8ae60a671d688be97e748eb15c0", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xls.php": "847010de91a683774a3d6b4416403ffc", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/AutoFilter.php": "486cf60ed0ce1779a4319d076fb6c939", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/Chart.php": "7818e75313fef3dc1e060ebf5be58308", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/Comments.php": "b9ea5a224e86928da9e37becf2293c5f", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/ContentTypes.php": "931461ebd9ab640d8e15d979c3b10312", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/DefinedNames.php": "18ba56c7f9324f9abde4f410f5f428cf", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/DocProps.php": "00e33dac3b7a4382fa71ada707b630de", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/Drawing.php": "87365b2f83f48bd71dcc1c4c35a028bd", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/FunctionPrefix.php": "553b632c349a807ad68208ef225ccbc3", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/Rels.php": "dcde555b8406f5cb97cd65e735f30b3d", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/RelsRibbon.php": "6a61d8a47a3ae8f01f0e3f8a5bb9cd14", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/RelsVBA.php": "f76f74f1cbb82a51f5393e406a73e5d9", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/StringTable.php": "12e3335848e11b8adbf97a6639dd0143", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/Style.php": "c8718417a87237a4dae212d5270b3bce", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/Table.php": "03c2f132a747cfb535fcac35049e46a7", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/Theme.php": "52d1a17b45f09a312d29e6e68b1b29aa", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/Workbook.php": "5d078940b7a31b2eec534382688b84f0", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/Worksheet.php": "f3581f4c09a78682787e08d8f8aa0fa5", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx/WriterPart.php": "cb523f075944afe0596af0d04f1f0db1", - "vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Writer/Xlsx.php": "9dda20010435ee894a41b18962fa7889", - "vendor/pimple/pimple/src/Pimple/Container.php": "c26fd7be110bcb308f94b3849950053e", - "vendor/pimple/pimple/src/Pimple/Exception/ExpectedInvokableException.php": "065c95be5677c6a2f843285963b8ee9d", - "vendor/pimple/pimple/src/Pimple/Exception/FrozenServiceException.php": "7555b2e4ae4c277e56c08da33cf40443", - "vendor/pimple/pimple/src/Pimple/Exception/InvalidServiceIdentifierException.php": "2dc56ac7feb866f7361fdfbaf2cafd57", - "vendor/pimple/pimple/src/Pimple/Exception/UnknownIdentifierException.php": "55390d6d7b50e403d05b6b1a7c144bf9", - "vendor/pimple/pimple/src/Pimple/Psr11/Container.php": "d005f4fa93f641dd20e13dce9edaf7cc", - "vendor/pimple/pimple/src/Pimple/Psr11/ServiceLocator.php": "f094054f720369f985ca63f82a7fe1ab", - "vendor/pimple/pimple/src/Pimple/ServiceIterator.php": "822086e6f1ae3629fce59a0888948ef9", - "vendor/pimple/pimple/src/Pimple/ServiceProviderInterface.php": "5f9104564a5ebdafaf47602d49b91eb8", - "vendor/pimple/pimple/src/Pimple/Tests/Fixtures/Invokable.php": "901d2a4b096aac148b52a416ddf99d7a", - "vendor/pimple/pimple/src/Pimple/Tests/Fixtures/NonInvokable.php": "e16d69d7de4cf1dd7fdcfe777ac865fc", - "vendor/pimple/pimple/src/Pimple/Tests/Fixtures/PimpleServiceProvider.php": "8e21a6e8ac8d051beff1444dbc7d2945", - "vendor/pimple/pimple/src/Pimple/Tests/Fixtures/Service.php": "23e9ac8bc2ea1dc68ad0f793a87f22b7", - "vendor/pimple/pimple/src/Pimple/Tests/PimpleServiceProviderInterfaceTest.php": "ebdadff61e709ced9971cceb218445d6", - "vendor/pimple/pimple/src/Pimple/Tests/PimpleTest.php": "698b3821b662ab495df5f877d7468f8d", - "vendor/pimple/pimple/src/Pimple/Tests/Psr11/ContainerTest.php": "3fe3766fce208c5d21355dd163cb5239", - "vendor/pimple/pimple/src/Pimple/Tests/Psr11/ServiceLocatorTest.php": "8b16d841e4ef987379695ca3a144079b", - "vendor/pimple/pimple/src/Pimple/Tests/ServiceIteratorTest.php": "3511790e513ecb43d92b37e37e1d3f9a", - "vendor/psr/cache/src/CacheException.php": "d887d14bf7cb327b2f823fd8f6e80149", - "vendor/psr/cache/src/CacheItemInterface.php": "5ec09783d799d45a9e9ac71e28c49ed5", - "vendor/psr/cache/src/CacheItemPoolInterface.php": "ef5af58be396258d31bc3429f89b07dd", - "vendor/psr/cache/src/InvalidArgumentException.php": "a91bb63c56eb83de54f58917ac62970e", - "vendor/psr/container/src/ContainerExceptionInterface.php": "3a46c5e6a407e9fe5d88c95965b945b3", - "vendor/psr/container/src/ContainerInterface.php": "3298038d8dc6c424bc406714db2a2290", - "vendor/psr/container/src/NotFoundExceptionInterface.php": "625acbd6fc8bbdc39c34e3a99047894a", - "vendor/psr/event-dispatcher/src/EventDispatcherInterface.php": "1b3c2d8551585d464704ea970ff8dc6a", - "vendor/psr/event-dispatcher/src/ListenerProviderInterface.php": "a6b1ede2690ec9d28d67db543b1b0b1b", - "vendor/psr/event-dispatcher/src/StoppableEventInterface.php": "279f040be3f3a2393247e2d30429a5e9", - "vendor/psr/http-client/src/ClientExceptionInterface.php": "6b2f623edbb1222f9623524b3e4dc1e4", - "vendor/psr/http-client/src/ClientInterface.php": "624536fd161afe3aa159ea5d527779b3", - "vendor/psr/http-client/src/NetworkExceptionInterface.php": "4676e9b6fec11ab5c0a3b32979abef91", - "vendor/psr/http-client/src/RequestExceptionInterface.php": "a5af1075472ac86a825c4a6ccf04ef54", - "vendor/psr/http-factory/src/RequestFactoryInterface.php": "b93278ea28940741416ca2f0249a8269", - "vendor/psr/http-factory/src/ResponseFactoryInterface.php": "2e68f87cd5b9afe0508f202e6c32e3e6", - "vendor/psr/http-factory/src/ServerRequestFactoryInterface.php": "065ac773fea026930f73bfd1f0dfa143", - "vendor/psr/http-factory/src/StreamFactoryInterface.php": "4511e7ad5d1106c5c6a7adde87e1263b", - "vendor/psr/http-factory/src/UploadedFileFactoryInterface.php": "688c1dc4de3d7f78ecbbf6656373116b", - "vendor/psr/http-factory/src/UriFactoryInterface.php": "4e587117e3edfd030a80e3b883cb75f9", - "vendor/psr/http-message/src/MessageInterface.php": "116d6eefac2604ce0a650a7f58dae8f2", - "vendor/psr/http-message/src/RequestInterface.php": "19c470073088141bbd08e20e46503b13", - "vendor/psr/http-message/src/ResponseInterface.php": "9fd8d0a948be3698e59cb2a116964a59", - "vendor/psr/http-message/src/ServerRequestInterface.php": "90dbb3840dc0e0cfcaa929fb27b22e6d", - "vendor/psr/http-message/src/StreamInterface.php": "348ba0fd90cab1c9b72b2f00cf96c5cc", - "vendor/psr/http-message/src/UploadedFileInterface.php": "fef766bfa741546a029d57854cc9538c", - "vendor/psr/http-message/src/UriInterface.php": "05487cc106391e0b5a60c0c912f30912", - "vendor/psr/log/src/AbstractLogger.php": "05a9749f208b064a6af67c32055529f3", - "vendor/psr/log/src/InvalidArgumentException.php": "7d2f0bd1583524d739fff12f0507de65", - "vendor/psr/log/src/LogLevel.php": "cc226142fd5d390d030b39c61cf97843", - "vendor/psr/log/src/LoggerAwareInterface.php": "e24df41c40ade2fca16a4ec633a04497", - "vendor/psr/log/src/LoggerAwareTrait.php": "92456b3a37e21d536d82b990effa2b37", - "vendor/psr/log/src/LoggerInterface.php": "50bef03abe7fd3ab81f779af593b29cc", - "vendor/psr/log/src/LoggerTrait.php": "f418adb849b212255902f80c15868b65", - "vendor/psr/log/src/NullLogger.php": "bdd6aba0adffb237c428ac83ff99b8ae", - "vendor/psr/simple-cache/src/CacheException.php": "ed9af8bdafbc23cbd97681bec29385f0", - "vendor/psr/simple-cache/src/CacheInterface.php": "0f79bb7341b4df04d00ae60c2441e07a", - "vendor/psr/simple-cache/src/InvalidArgumentException.php": "f070de2116d9d1ca836e68a404414d10", - "vendor/qcloud/cos-sdk-v5/sample/ImageSearch.php": "2486dae818e5d7f1549879bfcae6dc06", - "vendor/qcloud/cos-sdk-v5/sample/ImageSearchAdd.php": "9d239afa21e0d234c5270b1fb79390f3", - "vendor/qcloud/cos-sdk-v5/sample/ImageSearchDelete.php": "ca726928047bbf0879a84ae9dba5c3b3", - "vendor/qcloud/cos-sdk-v5/sample/ImageSearchOpen.php": "447913a4618bd98a4ece0499eb44c938", - "vendor/qcloud/cos-sdk-v5/sample/abortMultipartUpload.php": "65ecdae8a637a03ddd6deae3c2284014", - "vendor/qcloud/cos-sdk-v5/sample/addHotLink.php": "383735fd043c711deb847e7582a75fb4", - "vendor/qcloud/cos-sdk-v5/sample/appendObject.php": "c8be22d403d370031d35181d7bbcff56", - "vendor/qcloud/cos-sdk-v5/sample/bindCiService.php": "4a78bb395e0b427c0de12e504653f1ea", - "vendor/qcloud/cos-sdk-v5/sample/blindWatermark.php": "fec82a66c306fd01d2cdf836838aa858", - "vendor/qcloud/cos-sdk-v5/sample/cancelInventoryTriggerJob.php": "9fae53f6b6fb167c465431ffaebc8995", - "vendor/qcloud/cos-sdk-v5/sample/cancelLiveVideoAuditing.php": "fd8e131a6a6c8eabca11f473ecc604c1", - "vendor/qcloud/cos-sdk-v5/sample/catchException.php": "a40ace901ba016fb24009a4a4f2c7e9f", - "vendor/qcloud/cos-sdk-v5/sample/ciTransformation.php": "8b52b386073c56754d2393c689ee3d0c", - "vendor/qcloud/cos-sdk-v5/sample/closeOriginProtect.php": "ebad282cc3a4b7a4c1b42ed2ba118ba7", - "vendor/qcloud/cos-sdk-v5/sample/completeMultipartUpload.php": "30b90b5ffed44cfd812e33785d0076d4", - "vendor/qcloud/cos-sdk-v5/sample/copy.php": "31877fa8d97e65799b5c14f118125540", - "vendor/qcloud/cos-sdk-v5/sample/copyObject.php": "26df904b0195af04c0a9e628d8867ea6", - "vendor/qcloud/cos-sdk-v5/sample/cosClient.php": "c54b4f5b96fc49b34afe1bddf63ba3cf", - "vendor/qcloud/cos-sdk-v5/sample/createBucket.php": "408482270d04bc923c7e891be42455ab", - "vendor/qcloud/cos-sdk-v5/sample/createDocProcessJobs.php": "78b6649af89f9460d1af178e1575f461", - "vendor/qcloud/cos-sdk-v5/sample/createFileCompressJobs.php": "7a6bc39adbd73a349ee4b91c649d8833", - "vendor/qcloud/cos-sdk-v5/sample/createFileHashCodeJobs.php": "95f67e4cdbd43b19f140238cbf81b835", - "vendor/qcloud/cos-sdk-v5/sample/createFileUncompressJobs.php": "744950c6c216e91be4445c5efb91a37b", - "vendor/qcloud/cos-sdk-v5/sample/createFolder.php": "ceb8047b383ef78a661ec235ed62e911", - "vendor/qcloud/cos-sdk-v5/sample/createInventoryTriggerJob.php": "24843a46ffe740d1e5244e882511cd9d", - "vendor/qcloud/cos-sdk-v5/sample/createMediaAnimationJobs.php": "e95d75b4b8391b7f2178c6517ea59d56", - "vendor/qcloud/cos-sdk-v5/sample/createMediaAnimationTemplate.php": "2dc9bd28c8e9b62d347c8630eb6b621f", - "vendor/qcloud/cos-sdk-v5/sample/createMediaConcatJobs.php": "b54b13de41ec3f7807a090ac05de25ed", - "vendor/qcloud/cos-sdk-v5/sample/createMediaConcatTemplate.php": "132ecc7f5f537dea56b4566707e4d2cf", - "vendor/qcloud/cos-sdk-v5/sample/createMediaDigitalWatermarkJobs.php": "7ae5c05ad453948ce6c4f989c3f5c2a9", - "vendor/qcloud/cos-sdk-v5/sample/createMediaExtractDigitalWatermarkJobs.php": "c10a84c57a8391bbe3f83d1f1e54c3d5", - "vendor/qcloud/cos-sdk-v5/sample/createMediaHighSpeedHdTemplate.php": "1aa4fc7064155767b3cffa5ef25d1cce", - "vendor/qcloud/cos-sdk-v5/sample/createMediaJobs.php": "51a18d308fdd9f259e104b61a76cd381", - "vendor/qcloud/cos-sdk-v5/sample/createMediaNoiseReductionJobs.php": "6bffd49d556746df693496b7a1855cc8", - "vendor/qcloud/cos-sdk-v5/sample/createMediaPicProcessJobs.php": "0096bfe53be364b606d9a03f5e9e1984", - "vendor/qcloud/cos-sdk-v5/sample/createMediaPicProcessTemplate.php": "804fe0e5e4cd4fc73e8716ae7d4d4ff9", - "vendor/qcloud/cos-sdk-v5/sample/createMediaQualityEstimateJobs.php": "1715cd17fe9d4f257a4daf51488831af", - "vendor/qcloud/cos-sdk-v5/sample/createMediaSDRtoHDRJobs.php": "05594fdad67fa62ba8211e44f98050f5", - "vendor/qcloud/cos-sdk-v5/sample/createMediaSegmentJobs.php": "a013e8ebaea0d4bff295a03dbf2a34b3", - "vendor/qcloud/cos-sdk-v5/sample/createMediaSmartCoverJobs.php": "b386c880dab963ae42cf1a42852c8fdc", - "vendor/qcloud/cos-sdk-v5/sample/createMediaSnapshotJobs.php": "a47bbbccf5d649de1c5e0789bb2b241c", - "vendor/qcloud/cos-sdk-v5/sample/createMediaSnapshotTemplate.php": "4da1ad6c770217cd7055ae965107f254", - "vendor/qcloud/cos-sdk-v5/sample/createMediaStreamExtractJobs.php": "9a94f7bb82463d378652ad1cb8294246", - "vendor/qcloud/cos-sdk-v5/sample/createMediaSuperResolutionJobs.php": "e2612ac525be5203afb198a3b30b4576", - "vendor/qcloud/cos-sdk-v5/sample/createMediaSuperResolutionTemplate.php": "b764bf886379a77ec31aa0c335daddc8", - "vendor/qcloud/cos-sdk-v5/sample/createMediaTranscodeJobs.php": "36c43662b3432f05d14269e9947918c3", - "vendor/qcloud/cos-sdk-v5/sample/createMediaTranscodeTemplate.php": "a619777f2dd3631b2cdccf1f6facdc0f", - "vendor/qcloud/cos-sdk-v5/sample/createMediaVideoMontageJobs.php": "e8f93bd1f7e3ac372f8d59e286728252", - "vendor/qcloud/cos-sdk-v5/sample/createMediaVideoMontageTemplate.php": "3c072d94ad92d88c5745a5590fc175df", - "vendor/qcloud/cos-sdk-v5/sample/createMediaVideoProcessJobs.php": "a88212c91282a3573089b46ea87fbbfc", - "vendor/qcloud/cos-sdk-v5/sample/createMediaVideoProcessTemplate.php": "e04f929f07d8a721e68007891ad460b5", - "vendor/qcloud/cos-sdk-v5/sample/createMediaVideoTagJobs.php": "c45dadafb96ffc437a72371fc3ffb167", - "vendor/qcloud/cos-sdk-v5/sample/createMediaVoiceSeparateJobs.php": "74618492b058c0ca73d3ff49cf459868", - "vendor/qcloud/cos-sdk-v5/sample/createMediaVoiceSeparateTemplate.php": "1665acac0ade94cb29cc18d069de89c2", - "vendor/qcloud/cos-sdk-v5/sample/createMediaWatermarkTemplate.php": "33d4fac3570c5fa69f3d8a381d85a03a", - "vendor/qcloud/cos-sdk-v5/sample/createMultipartUpload.php": "9c7bae95fa01d0aed1a8853f69bda807", - "vendor/qcloud/cos-sdk-v5/sample/deleteBucket.php": "bfb7e79e5058d0be2f7936d2e7e884d4", - "vendor/qcloud/cos-sdk-v5/sample/deleteBucketCors.php": "f7599f91d3ff4d36c049e1df800ef72f", - "vendor/qcloud/cos-sdk-v5/sample/deleteBucketDomain.php": "d8734296551064cd62a0e8e5c85d5805", - "vendor/qcloud/cos-sdk-v5/sample/deleteBucketGuetzli.php": "bc9470bc4a6fa7f6156a2257edac341a", - "vendor/qcloud/cos-sdk-v5/sample/deleteBucketImageStyle.php": "821dcc177d74f08858a592a52f2d7328", - "vendor/qcloud/cos-sdk-v5/sample/deleteBucketLifecycle.php": "b016f80b8ad2abdebe334ffeffc5129c", - "vendor/qcloud/cos-sdk-v5/sample/deleteBucketTagging.php": "75587a420e7dd761605fd59537d70421", - "vendor/qcloud/cos-sdk-v5/sample/deleteBucketWebsite.php": "a1c9aae324e049f6a3a46ad3b69a3c4a", - "vendor/qcloud/cos-sdk-v5/sample/deleteBuckets.php": "f74ff67f341eca684fcc29e778068add", - "vendor/qcloud/cos-sdk-v5/sample/deleteFolder.php": "33259baef3cb203d943a1e00e7f4fe5e", - "vendor/qcloud/cos-sdk-v5/sample/deleteObject.php": "2c72b45e804453be72edb412eacecf58", - "vendor/qcloud/cos-sdk-v5/sample/deleteObjectTagging.php": "97d7a7332d5081cce82a26079595bc9a", - "vendor/qcloud/cos-sdk-v5/sample/deleteWorkflow.php": "2bcc1a3007450ced1e88a242cfed60e7", - "vendor/qcloud/cos-sdk-v5/sample/describeInventoryTriggerJob.php": "0f500794e1852319ad5832feb277185c", - "vendor/qcloud/cos-sdk-v5/sample/describeInventoryTriggerJobs.php": "72ca64ce53cfc12f2e9a8d13f74d7caa", - "vendor/qcloud/cos-sdk-v5/sample/describeMediaJob.php": "9a834ddd75adbe26519b18f754f694a5", - "vendor/qcloud/cos-sdk-v5/sample/describeMediaJobs.php": "df62839c52440e4d5935fa7ff45931e8", - "vendor/qcloud/cos-sdk-v5/sample/describeMediaTemplates.php": "7599b88688c167631412ddd1d124e80c", - "vendor/qcloud/cos-sdk-v5/sample/describeWorkflow.php": "656e88113faff522405de6d826b6375f", - "vendor/qcloud/cos-sdk-v5/sample/detectAudio.php": "106de9a0897c3f680d422bed6a5fbf5e", - "vendor/qcloud/cos-sdk-v5/sample/detectDocument.php": "7b1c589a43015d77ea7daf13ab7d4ba3", - "vendor/qcloud/cos-sdk-v5/sample/detectImage.php": "d7a546d60eea15d42f514a431c9e2c59", - "vendor/qcloud/cos-sdk-v5/sample/detectImages.php": "ea85e4368837d5be571e78ad3f918d50", - "vendor/qcloud/cos-sdk-v5/sample/detectLable.php": "035595914cc60cb8fc7b68e3e76e8368", - "vendor/qcloud/cos-sdk-v5/sample/detectLiveVideo.php": "a17923d791ba9765183f6675452e6e6f", - "vendor/qcloud/cos-sdk-v5/sample/detectText.php": "c1dbb80836ceb6c192b27c74529f2135", - "vendor/qcloud/cos-sdk-v5/sample/detectVideo.php": "1837393e27217a34f6d1d1b544a74afd", - "vendor/qcloud/cos-sdk-v5/sample/detectVirus.php": "98e12ab0f232aaf5fe5cac84a9fca2e4", - "vendor/qcloud/cos-sdk-v5/sample/detectWebpage.php": "60018974e5e586961adb139ad7439013", - "vendor/qcloud/cos-sdk-v5/sample/document2dstType.php": "910b451065034e0d6e7baa4e92d28f83", - "vendor/qcloud/cos-sdk-v5/sample/doesBucketExist.php": "1d62a5e5fa86a1816b5f8621b18aec3e", - "vendor/qcloud/cos-sdk-v5/sample/doesObjectExist.php": "537a666c8d3db384078215e8616bf934", - "vendor/qcloud/cos-sdk-v5/sample/download.php": "7901888f43ae289fc20b4f47773fd5f8", - "vendor/qcloud/cos-sdk-v5/sample/downloadFolder.php": "15994f234b2a717ccde6c98c0d7d8a6b", - "vendor/qcloud/cos-sdk-v5/sample/fileJobs4Hash.php": "5907f8290442904255be79c9c355f080", - "vendor/qcloud/cos-sdk-v5/sample/getActionSequence.php": "3b0b8878756c6c390708b1b949db5ad0", - "vendor/qcloud/cos-sdk-v5/sample/getBlindWatermark.php": "cd1d8c6231ecf610b825b0e8835fa7bf", - "vendor/qcloud/cos-sdk-v5/sample/getBucketAccelerate.php": "790cf8cc52e6adb4a80f9c4e718b3b40", - "vendor/qcloud/cos-sdk-v5/sample/getBucketAcl.php": "ceafc19584e4953c7938314ebf3feef2", - "vendor/qcloud/cos-sdk-v5/sample/getBucketCors.php": "6b34cd542845082411fe12e7c806c9c5", - "vendor/qcloud/cos-sdk-v5/sample/getBucketDomain.php": "acb68588f43dd819303fe72ecc7b468c", - "vendor/qcloud/cos-sdk-v5/sample/getBucketGuetzli.php": "02ca0d20b6638073a9ad52b34ae34a5f", - "vendor/qcloud/cos-sdk-v5/sample/getBucketImageStyle.php": "10e9bb8e0ad73f60ba104e4b07d58984", - "vendor/qcloud/cos-sdk-v5/sample/getBucketInventory.php": "8ce99dfe578b784de6edd4d07ee74181", - "vendor/qcloud/cos-sdk-v5/sample/getBucketLifecycle.php": "110f9a59967354b63628d5c0cf2bdc10", - "vendor/qcloud/cos-sdk-v5/sample/getBucketLogging.php": "1e53ca52ce7ac9a22b2a022ef4d9ce78", - "vendor/qcloud/cos-sdk-v5/sample/getBucketReferer.php": "8f9acb6bb98fe5362260542584ebf829", - "vendor/qcloud/cos-sdk-v5/sample/getBucketTagging.php": "84e8a7a4fa13b118175c0675924a192e", - "vendor/qcloud/cos-sdk-v5/sample/getBucketWebsite.php": "ace4621c02c8f539ebe875b736081267", - "vendor/qcloud/cos-sdk-v5/sample/getCiService.php": "8bafbb9713a9daaeb0c069a6cbe8a1c1", - "vendor/qcloud/cos-sdk-v5/sample/getDescribeDocProcessBuckets.php": "9a31938a810ca37173be18049d9831cd", - "vendor/qcloud/cos-sdk-v5/sample/getDescribeDocProcessJob.php": "cccbf442b5c08df338732d7824028a12", - "vendor/qcloud/cos-sdk-v5/sample/getDescribeDocProcessJobs.php": "c0798e57802e069bace58e3edf5c47a7", - "vendor/qcloud/cos-sdk-v5/sample/getDescribeDocProcessQueues.php": "7457618c838c83f847a3b31e9370d8ad", - "vendor/qcloud/cos-sdk-v5/sample/getDescribeMediaBuckets.php": "5f2fc9ebfbdeced59d51c60dfdf15c59", - "vendor/qcloud/cos-sdk-v5/sample/getDescribeMediaQueues.php": "2c04a129aaba3551f519e2c49d890293", - "vendor/qcloud/cos-sdk-v5/sample/getDescribeMediaVoiceSeparateJob.php": "da1d3d1143973688a186855d81891eac", - "vendor/qcloud/cos-sdk-v5/sample/getDetectAudioResult.php": "592fdae60d992cb68256cee3ae2d1ec5", - "vendor/qcloud/cos-sdk-v5/sample/getDetectDocumentResult.php": "5f0c52bf00b226c3c5ee98ba7cb0918c", - "vendor/qcloud/cos-sdk-v5/sample/getDetectImageResult.php": "b0019d0f06da50fe036c86f07796a38a", - "vendor/qcloud/cos-sdk-v5/sample/getDetectTextResult.php": "9bfcbe193270ea9d4655479d00af0de3", - "vendor/qcloud/cos-sdk-v5/sample/getDetectVideoResult.php": "a5460bb51f54e375831cb64df7d81de6", - "vendor/qcloud/cos-sdk-v5/sample/getDetectVirusResult.php": "d82d68539290241939e5dec342549d7f", - "vendor/qcloud/cos-sdk-v5/sample/getDetectWebpageResult.php": "d0bd091b898e66124f05a3d17b96dde1", - "vendor/qcloud/cos-sdk-v5/sample/getFileCompressResult.php": "16958953eb484cd15c0c3f921d949fff", - "vendor/qcloud/cos-sdk-v5/sample/getFileHashCodeResult.php": "31928f86ad2f119fbdba036bccee55db", - "vendor/qcloud/cos-sdk-v5/sample/getFileProcessQueueList.php": "66b359c0d7c7bcaf9f037237d547177e", - "vendor/qcloud/cos-sdk-v5/sample/getFileUncompressResult.php": "2468ceef8812436eaf56a7f2bd99c26c", - "vendor/qcloud/cos-sdk-v5/sample/getHotLink.php": "803aeabd070f112598ed718fa7592578", - "vendor/qcloud/cos-sdk-v5/sample/getLiveCode.php": "75c67ce1c35f02361ba36d156a031795", - "vendor/qcloud/cos-sdk-v5/sample/getMediaInfo.php": "3bb925d329057a9b64423946ef50f8ac", - "vendor/qcloud/cos-sdk-v5/sample/getObject.php": "bccc6a999f398eea1e169d140e1a0355", - "vendor/qcloud/cos-sdk-v5/sample/getObjectSensitiveContentRecognition.php": "6a750572780eb58b6fa4792c8ea81343", - "vendor/qcloud/cos-sdk-v5/sample/getObjectTagging.php": "3938de7f473a5e2a1072c2fef8363119", - "vendor/qcloud/cos-sdk-v5/sample/getObjectUrl.php": "6191b305b285d5ee980d855af3216dc6", - "vendor/qcloud/cos-sdk-v5/sample/getObjectWithoutSign.php": "f72a0e5f71e1b80a34b1197288a59260", - "vendor/qcloud/cos-sdk-v5/sample/getOriginProtect.php": "8bcd69ca3efed9478db09a157c366b24", - "vendor/qcloud/cos-sdk-v5/sample/getPresignedUrl.php": "44db85c7ca912a9a2e2e87f1d4729765", - "vendor/qcloud/cos-sdk-v5/sample/getPrivateM3U8.php": "6f3d4fb02dc15eacfd0ff97863d5874b", - "vendor/qcloud/cos-sdk-v5/sample/getSnapshot.php": "b29a073ec7c80a4b38fe8b147ab4a950", - "vendor/qcloud/cos-sdk-v5/sample/getWorkflowInstance.php": "658581c05625036874dcd95d4ed7be61", - "vendor/qcloud/cos-sdk-v5/sample/getWorkflowInstances.php": "e057776f4745d5ef5e8dfbcfa87d9aed", - "vendor/qcloud/cos-sdk-v5/sample/headBucket.php": "ff3f18845d0d58344438a5836695b252", - "vendor/qcloud/cos-sdk-v5/sample/headObject.php": "a1e131f3e7b3854108e91acfc6affa8e", - "vendor/qcloud/cos-sdk-v5/sample/iDCardOCR.php": "5fb0368d9b703302aaf29f8ec87c6374", - "vendor/qcloud/cos-sdk-v5/sample/imageAssessQualityProcess.php": "22877a57420d74402c9ae8a1af14262f", - "vendor/qcloud/cos-sdk-v5/sample/imageAve.php": "cad76601ba65c712e575b66b4ef3fb96", - "vendor/qcloud/cos-sdk-v5/sample/imageDetectCarProcess.php": "7292cae875f7bf6e785fe00ed1889e9e", - "vendor/qcloud/cos-sdk-v5/sample/imageDetectFace.php": "548452170e4b39f2f1abf94b4bef697e", - "vendor/qcloud/cos-sdk-v5/sample/imageExif.php": "3851f2e2158220bff22b2a5496b47f13", - "vendor/qcloud/cos-sdk-v5/sample/imageFaceEffect.php": "c1936d49c58288f7e7268394643ffd1d", - "vendor/qcloud/cos-sdk-v5/sample/imageInfo.php": "1f019b8ed375a637d4b2b8a68c8a8f7e", - "vendor/qcloud/cos-sdk-v5/sample/imageMogr.php": "af89be138f1c3cf6eee39548820fc72d", - "vendor/qcloud/cos-sdk-v5/sample/imageProcess.php": "35a8596531ac36f306430029d9bc820b", - "vendor/qcloud/cos-sdk-v5/sample/imageProcessBright.php": "193f8b628e0bc2eb5174ecb92220f970", - "vendor/qcloud/cos-sdk-v5/sample/imageProcessChannel.php": "e32c0be7bc2d115f8ff9c38cf14a2278", - "vendor/qcloud/cos-sdk-v5/sample/imageProcessContrast.php": "1b88fb187871b7eafdfd6c08d343bcef", - "vendor/qcloud/cos-sdk-v5/sample/imageProcessCrop.php": "fbc78d5dc04de0c4b256f256b8c17792", - "vendor/qcloud/cos-sdk-v5/sample/imageProcessFormat.php": "7f2ef115a6b9f060c6e1c696f727c7a2", - "vendor/qcloud/cos-sdk-v5/sample/imageProcessFormatAvif.php": "a88bd4505e8fe13e43d5fb71fdbeafc9", - "vendor/qcloud/cos-sdk-v5/sample/imageProcessFormatHeif.php": "b4a7801168a04226d30544ae9b574e12", - "vendor/qcloud/cos-sdk-v5/sample/imageProcessFormatSvgc.php": "edfd77e6f01a8b9c6ab3a6343b9ddeb4", - "vendor/qcloud/cos-sdk-v5/sample/imageProcessFormatTpg.php": "845ad9bed636e58d45af3e343133bf82", - "vendor/qcloud/cos-sdk-v5/sample/imageProcessFormatWebp.php": "7907e9449da4c3f2731bf0578876da99", - "vendor/qcloud/cos-sdk-v5/sample/imageProcessGaussianBlur.php": "88ca406b535400d8753e34e29a2376f0", - "vendor/qcloud/cos-sdk-v5/sample/imageProcessGrayscale.php": "ca2843489f88498bb856833722becfb2", - "vendor/qcloud/cos-sdk-v5/sample/imageProcessImageView.php": "3abc71a5f2b428ee675db321542a6e48", - "vendor/qcloud/cos-sdk-v5/sample/imageProcessQuality.php": "6aedb558a8bac6b92ece8c29dca1c1af", - "vendor/qcloud/cos-sdk-v5/sample/imageProcessRotate.php": "fb27da35fc0a78f4afcd91ccc86abf13", - "vendor/qcloud/cos-sdk-v5/sample/imageProcessSharpen.php": "1b28b9a2d711e7a2b3572749aa3b4c09", - "vendor/qcloud/cos-sdk-v5/sample/imageProcessSizeLimit.php": "8421b4c19840b215b990ef0eda495856", - "vendor/qcloud/cos-sdk-v5/sample/imageProcessStrip.php": "92c045ff76564d5ae2b138f88b7bcc41", - "vendor/qcloud/cos-sdk-v5/sample/imageProcessThumbnail.php": "f2a3695622dc7ccdf5bc13d56ce50046", - "vendor/qcloud/cos-sdk-v5/sample/imageProcessWatermarkImage.php": "617eb2384bb6c7900bb9cf2a72537da6", - "vendor/qcloud/cos-sdk-v5/sample/imageProcessWatermarkText.php": "0a7855b85b97bc507977c5e2790aa652", - "vendor/qcloud/cos-sdk-v5/sample/imageRepairProcess.php": "a861945fef11dcc6f7a92d9003a0f998", - "vendor/qcloud/cos-sdk-v5/sample/imageView.php": "4034cdb98cd67df42d756397d2bfd783", - "vendor/qcloud/cos-sdk-v5/sample/imageWatermark.php": "22296ac545444bc0813e03886c6bf0e3", - "vendor/qcloud/cos-sdk-v5/sample/listBuckets.php": "d89df6d7ef49acaee037c41c23ce1b08", - "vendor/qcloud/cos-sdk-v5/sample/listMultipartUploads.php": "9a00854b7d593b36660b16ccab5e4717", - "vendor/qcloud/cos-sdk-v5/sample/listObjects.php": "e9880699c02319282425be4722c7d73e", - "vendor/qcloud/cos-sdk-v5/sample/listParts.php": "34873f12c80247dec0cc4bfaada1e61f", - "vendor/qcloud/cos-sdk-v5/sample/openFileProcessService.php": "cfad67ea6e899ef46dcc92f31dc05971", - "vendor/qcloud/cos-sdk-v5/sample/openOriginProtect.php": "a06b87c366058f4c79ded83fe61085c4", - "vendor/qcloud/cos-sdk-v5/sample/opticalOcrRecognition.php": "401d0df9e3c3d18701ef6882a8ffc8a2", - "vendor/qcloud/cos-sdk-v5/sample/picOperations.php": "eb8f05cb190e5f9cb6554c98a2f516c7", - "vendor/qcloud/cos-sdk-v5/sample/putBlindWatermark.php": "3b0bbd36388cd80dad9a80f2ba132f8b", - "vendor/qcloud/cos-sdk-v5/sample/putBucketAccelerate.php": "22c378f60c3c2e3eb28c3c28bdbd39ea", - "vendor/qcloud/cos-sdk-v5/sample/putBucketAcl.php": "d2b65e53444710e82d22083afce24413", - "vendor/qcloud/cos-sdk-v5/sample/putBucketCors.php": "0d2007ddc2d1b762a2b16bfca56b46e0", - "vendor/qcloud/cos-sdk-v5/sample/putBucketDomain.php": "b54c7e6b9d60cb7307895be6c0314650", - "vendor/qcloud/cos-sdk-v5/sample/putBucketGuetzli.php": "a6802a20947a9f0d9917108c71957ee5", - "vendor/qcloud/cos-sdk-v5/sample/putBucketImageStyle.php": "cf4f3b6285e8c6b71654a6f3fbb59a02", - "vendor/qcloud/cos-sdk-v5/sample/putBucketInventory.php": "5d67dd01fada269727af6f56ea729f6b", - "vendor/qcloud/cos-sdk-v5/sample/putBucketLifecycle.php": "0ab35dfb7456adfdb535dba3b344722b", - "vendor/qcloud/cos-sdk-v5/sample/putBucketLogging.php": "3b53de3c4eb7e15cb7ceae73cff48a1a", - "vendor/qcloud/cos-sdk-v5/sample/putBucketReferer.php": "140cd8e5ad2ca16e8e00d056ad321f1d", - "vendor/qcloud/cos-sdk-v5/sample/putBucketTagging.php": "79a30eec752bfb2dc43a1505d0c4f993", - "vendor/qcloud/cos-sdk-v5/sample/putBucketWebsite.php": "442e183cb88ca1da058c961e481c6290", - "vendor/qcloud/cos-sdk-v5/sample/putImageStyle.php": "dd2349bd64b819e2e43a765e37bb0377", - "vendor/qcloud/cos-sdk-v5/sample/putObject.php": "14894d87b7ea66c95f9adbb04bd51497", - "vendor/qcloud/cos-sdk-v5/sample/putObjectTagging.php": "6947d96d07f586b2ee593c1b4d137caf", - "vendor/qcloud/cos-sdk-v5/sample/putQrcode.php": "198056a2876313e7640f1ba348bc3422", - "vendor/qcloud/cos-sdk-v5/sample/qrcode.php": "d02a08a3ad187c9c6d4fae4480e918dc", - "vendor/qcloud/cos-sdk-v5/sample/qrcodeGenerate.php": "fc7a2b2ee21c8dd99c29c5b49f8e5975", - "vendor/qcloud/cos-sdk-v5/sample/restoreObject.php": "ed3526a781a8b7b94c2add93744d31ad", - "vendor/qcloud/cos-sdk-v5/sample/selectObjectContent.php": "f123789ae32a196424bb233c426ba3f0", - "vendor/qcloud/cos-sdk-v5/sample/textWatermark.php": "578ba883687b188ff5d529346b90cac5", - "vendor/qcloud/cos-sdk-v5/sample/trafficLimit.php": "bc94012e5eb4e6182ba62181db98d1c4", - "vendor/qcloud/cos-sdk-v5/sample/triggerWorkflow.php": "bdde4c7a003236b3e15527f15414126d", - "vendor/qcloud/cos-sdk-v5/sample/unBindCiService.php": "818693a6acede1799934ecb2f3ae763c", - "vendor/qcloud/cos-sdk-v5/sample/updateDocProcessQueue.php": "6bab7e5f6d94bbb1cb01fce7e7b9001b", - "vendor/qcloud/cos-sdk-v5/sample/updateFileProcessQueue.php": "c6cf21c7db29ef426c8eae78a38a84f0", - "vendor/qcloud/cos-sdk-v5/sample/updateMediaAnimationTemplate.php": "463df7fb695c342feca9c0c5742be042", - "vendor/qcloud/cos-sdk-v5/sample/updateMediaConcatTemplate.php": "c6ad795ed8f99125c300f6e0dd4c640a", - "vendor/qcloud/cos-sdk-v5/sample/updateMediaHighSpeedHdTemplate.php": "52dffc2b347aeb163d35dc6159851826", - "vendor/qcloud/cos-sdk-v5/sample/updateMediaPicProcessTemplate.php": "50a326e080694fffaea354fb540a5694", - "vendor/qcloud/cos-sdk-v5/sample/updateMediaQueue.php": "14c61d6494abdd6c8072870770810bcb", - "vendor/qcloud/cos-sdk-v5/sample/updateMediaSnapshotTemplate.php": "a770e3bbc3bf7a91c70d9b7b6fbbeea1", - "vendor/qcloud/cos-sdk-v5/sample/updateMediaSuperResolutionTemplate.php": "a467ae58992887be47e3eedd22f3708e", - "vendor/qcloud/cos-sdk-v5/sample/updateMediaTranscodeTemplate.php": "51b5607072559870fc03d38773c65419", - "vendor/qcloud/cos-sdk-v5/sample/updateMediaVideoMontageTemplate.php": "d8a94fb31e821cbf4a5cd7e4e50ff24d", - "vendor/qcloud/cos-sdk-v5/sample/updateMediaVideoProcessTemplate.php": "ee6bf5593ef8f33c5cc4bbe8a695d8c5", - "vendor/qcloud/cos-sdk-v5/sample/updateMediaVoiceSeparateTemplate.php": "5a0d15738e1d00df6e58485ce503789f", - "vendor/qcloud/cos-sdk-v5/sample/updateMediaWatermarkTemplate.php": "59f11560ec0b7c35a7c6d3c3bd7925a1", - "vendor/qcloud/cos-sdk-v5/sample/upload.php": "05e7cab97b5f20b4679b8cac8851b5db", - "vendor/qcloud/cos-sdk-v5/sample/uploadFolder.php": "244d4b595692c57e7c97ccce11f180e7", - "vendor/qcloud/cos-sdk-v5/sample/uploadPart.php": "830e56ab5e3d73ff7424be1257246c4c", - "vendor/qcloud/cos-sdk-v5/src/Client.php": "404bc7802821e53c360187003f8a45fd", - "vendor/qcloud/cos-sdk-v5/src/CommandToRequestTransformer.php": "1e8dcb2827245ecb9e110fb523970ec2", - "vendor/qcloud/cos-sdk-v5/src/Common.php": "8ec0c9ef7148f0ef7bc494f6bc7f5623", - "vendor/qcloud/cos-sdk-v5/src/Copy.php": "af86ea515ddeb736ad769b604804bd1f", - "vendor/qcloud/cos-sdk-v5/src/Descriptions.php": "7344a244a1edd93ef4d74298f478ff78", - "vendor/qcloud/cos-sdk-v5/src/Exception/CosException.php": "203b6bf2abc8b11218afa1686a633f65", - "vendor/qcloud/cos-sdk-v5/src/Exception/ServiceResponseException.php": "ef86a7fb99f87d7f7e370fa446cdbd7a", - "vendor/qcloud/cos-sdk-v5/src/ExceptionMiddleware.php": "1740dc8917f1daa6619e6c007331c393", - "vendor/qcloud/cos-sdk-v5/src/ExceptionParser.php": "a3f9c0f806326591ff619939829ddec9", - "vendor/qcloud/cos-sdk-v5/src/ImageParamTemplate/BlindWatermarkTemplate.php": "e98c6d4909b765b71412f18f96f7bb7d", - "vendor/qcloud/cos-sdk-v5/src/ImageParamTemplate/CIParamTransformation.php": "d11913a8569af5330a9072b1a4bb2760", - "vendor/qcloud/cos-sdk-v5/src/ImageParamTemplate/CIProcessTransformation.php": "02684fe4795889842ed63dc9d955071a", - "vendor/qcloud/cos-sdk-v5/src/ImageParamTemplate/ImageMogrTemplate.php": "301c833177bb4a8f1c5a260fe8af2ffb", - "vendor/qcloud/cos-sdk-v5/src/ImageParamTemplate/ImageQrcodeTemplate.php": "b7a6c6894484a48e8d8906190b2d6142", - "vendor/qcloud/cos-sdk-v5/src/ImageParamTemplate/ImageStyleTemplate.php": "073694cfa5b31a1965a7e684b20bf7e5", - "vendor/qcloud/cos-sdk-v5/src/ImageParamTemplate/ImageTemplate.php": "07d4f8453f5b4f04b75222a9518a0616", - "vendor/qcloud/cos-sdk-v5/src/ImageParamTemplate/ImageViewTemplate.php": "018d4c58e85412fa340a35805769b7d1", - "vendor/qcloud/cos-sdk-v5/src/ImageParamTemplate/ImageWatermarkTemplate.php": "dac98e9166f6d0e7e381282046f5ec22", - "vendor/qcloud/cos-sdk-v5/src/ImageParamTemplate/PicOperationsTransformation.php": "3541b0acf8a0421dcdd32f483891ca03", - "vendor/qcloud/cos-sdk-v5/src/ImageParamTemplate/TextWatermarkTemplate.php": "052de868c37d394cf7c5f0e58885ce6e", - "vendor/qcloud/cos-sdk-v5/src/MultipartUpload.php": "8fb378b0f6c6466d21eaff28cf1a2b63", - "vendor/qcloud/cos-sdk-v5/src/RangeDownload.php": "d19e67de2085face760c977fd87dee7a", - "vendor/qcloud/cos-sdk-v5/src/Request/BodyLocation.php": "ff6ce9ed27bbe4d809e1f6c6c72d9893", - "vendor/qcloud/cos-sdk-v5/src/Request/XmlLocation.php": "27759666578f12fb4d98e33ce8aa533f", - "vendor/qcloud/cos-sdk-v5/src/ResultTransformer.php": "35cbfeca6a64f4987fa772f80c03d9e2", - "vendor/qcloud/cos-sdk-v5/src/Serializer.php": "96d872e37c52f222160dbc823301aa91", - "vendor/qcloud/cos-sdk-v5/src/Service.php": "29e88787286f1f3dd76fbc5ab576d636", - "vendor/qcloud/cos-sdk-v5/src/Signature.php": "1bc748f755dc8a0b48d7ce3d71c52786", - "vendor/qcloud/cos-sdk-v5/src/SignatureMiddleware.php": "2a1de5284771598e426f8842243a95ae", - "vendor/qiniu/php-sdk/autoload.php": "795baad89dabfed67195d3c16737693d", - "vendor/qiniu/php-sdk/examples/bucket_lifecycleRule.php": "724955bfd5b80f22bced009c15ed93e6", - "vendor/qiniu/php-sdk/examples/cdn_get_bandwidth.php": "2c15588e1d7e5e6a3bd36fd3dd866e0f", - "vendor/qiniu/php-sdk/examples/cdn_get_flux.php": "51a3457872a6e61877c84be3b9b14538", - "vendor/qiniu/php-sdk/examples/cdn_get_log_list.php": "22b3448adb77efa250ee130092368bdb", - "vendor/qiniu/php-sdk/examples/cdn_get_prefetch_list.php": "6cfa3553a9f1078221eb7f7a28854583", - "vendor/qiniu/php-sdk/examples/cdn_get_refresh_list.php": "da81da948d93152f6ac79c6cc742804a", - "vendor/qiniu/php-sdk/examples/cdn_refresh_urls_dirs.php": "3aae14afeb118c659cc5b7d46f6f18e7", - "vendor/qiniu/php-sdk/examples/cdn_timestamp_antileech.php": "3a50cdbcf31308fff71bd33e21aed907", - "vendor/qiniu/php-sdk/examples/censor_image.php": "765eb11ba4f080580f3f41220bbf0332", - "vendor/qiniu/php-sdk/examples/censor_video.php": "28f297db2b3193dbcfb869360514b874", - "vendor/qiniu/php-sdk/examples/delete_bucket.php": "5f65c8c8616b9a7a4764c37b45892ee3", - "vendor/qiniu/php-sdk/examples/delete_bucketEvent.php": "9d8f427063e5bc1c10bf2bb41d52bbac", - "vendor/qiniu/php-sdk/examples/delete_bucketLifecycleRule.php": "40bb59035ecebe598870845864d6f4b2", - "vendor/qiniu/php-sdk/examples/get_bucketEvents.php": "bee578eeb1195b771114d0ad1f8ff134", - "vendor/qiniu/php-sdk/examples/get_bucketLifecycleRules.php": "941b1c09f8e93d1d169c8c5934ecf913", - "vendor/qiniu/php-sdk/examples/get_bucketList.php": "c13d4163222e88272d398e06e6a9bc9c", - "vendor/qiniu/php-sdk/examples/get_bucketQuota.php": "af83c168bb1199df28153a4285738845", - "vendor/qiniu/php-sdk/examples/get_bucketinfo.php": "23f3e11ca97958dfd69a0e588f10da91", - "vendor/qiniu/php-sdk/examples/get_bucketinfos.php": "243ed4c2c84bd6a3afca812d44748bdb", - "vendor/qiniu/php-sdk/examples/get_corsRules.php": "b56cc67e51ae9d43d10adeaec53307b3", - "vendor/qiniu/php-sdk/examples/image_url_builder.php": "c2a97c63a8a8eaa4d0d58041f5915662", - "vendor/qiniu/php-sdk/examples/persistent_fop_init.php": "732ba5e2672ad1a771053ae93e8906ae", - "vendor/qiniu/php-sdk/examples/persistent_fop_status.php": "094e2970fed994fe5c04809b0651536c", - "vendor/qiniu/php-sdk/examples/pfop_mkzip.php": "ce2ed2a943d19639e25f8f568de1dec9", - "vendor/qiniu/php-sdk/examples/pfop_vframe.php": "5bae85689d4bb05bad2f086958420164", - "vendor/qiniu/php-sdk/examples/pfop_video_avthumb.php": "45f6735de63bb112a0ece77d99870c34", - "vendor/qiniu/php-sdk/examples/pfop_watermark.php": "0ab8ded738f36c077cf02094331f01c4", - "vendor/qiniu/php-sdk/examples/prefop.php": "5512156153fc4fa196865b5317e74f6a", - "vendor/qiniu/php-sdk/examples/put_bucketAccessMode.php": "68e9ba4497959035583a497189a1a43d", - "vendor/qiniu/php-sdk/examples/put_bucketAccessStyleMode.php": "2d89f2c9e8c7cdcbb497a5f8568d6037", - "vendor/qiniu/php-sdk/examples/put_bucketEvent.php": "79467a02139434d935089874b7325c10", - "vendor/qiniu/php-sdk/examples/put_bucketMaxAge.php": "c1e3ee7cfeaba7319cce7b68d73b64e1", - "vendor/qiniu/php-sdk/examples/put_bucketQuota.php": "3490dc09fa1639a02d074d35b281d8e2", - "vendor/qiniu/php-sdk/examples/put_referAntiLeech.php": "fd1608e908a056dfd6829a79acd19fbb", - "vendor/qiniu/php-sdk/examples/qetag.php": "4910a8763c865ff8ae21c0d0a919fcb1", - "vendor/qiniu/php-sdk/examples/rs_asynch_fetch.php": "25af9924abc70ccd23a723613f4abb55", - "vendor/qiniu/php-sdk/examples/rs_batch_change_mime.php": "e7a1a3d115ef46201f1871a147cc9818", - "vendor/qiniu/php-sdk/examples/rs_batch_change_type.php": "32b3a59ab9a947c86b814b2e11eb42e8", - "vendor/qiniu/php-sdk/examples/rs_batch_copy.php": "720b567f588d754f579970c3447fc7c6", - "vendor/qiniu/php-sdk/examples/rs_batch_delete.php": "3f555c6fdb4cde78587615b541a9a6eb", - "vendor/qiniu/php-sdk/examples/rs_batch_delete_after_days.php": "ee3fe6e2ed187ca79dfb5c1a57a3af0f", - "vendor/qiniu/php-sdk/examples/rs_batch_move.php": "996bef11821794c9b38d4f153e1f4244", - "vendor/qiniu/php-sdk/examples/rs_batch_stat.php": "9a4f9ff25ab19901f708d1472010f899", - "vendor/qiniu/php-sdk/examples/rs_bucket_domains.php": "c7380fac6583c23261108ad69d269cfa", - "vendor/qiniu/php-sdk/examples/rs_buckets.php": "0a195443bebbbc3f721a22678359de9f", - "vendor/qiniu/php-sdk/examples/rs_change_mime.php": "d6fa4a3a794e6283050f83e66bac8d9c", - "vendor/qiniu/php-sdk/examples/rs_change_status.php": "c735d04998f35948b0ac8d21e50f2322", - "vendor/qiniu/php-sdk/examples/rs_change_type.php": "b9dbd1dbfcffb2501e4820d952262c8b", - "vendor/qiniu/php-sdk/examples/rs_copy.php": "f9253162a120846bacd7d2ac7bfd76a1", - "vendor/qiniu/php-sdk/examples/rs_delete.php": "c75d4b6ee2f0564bcfbe758547261174", - "vendor/qiniu/php-sdk/examples/rs_delete_after_days.php": "5926bd038939959a5868ecd034052312", - "vendor/qiniu/php-sdk/examples/rs_download_urls.php": "f6bb1c1dd89db00d4086ae34e0dfa45a", - "vendor/qiniu/php-sdk/examples/rs_fetch.php": "f9ffeb3ab34ddff40338403142282dd4", - "vendor/qiniu/php-sdk/examples/rs_move.php": "b9d743e7df588c5ba8e3aeade06284e5", - "vendor/qiniu/php-sdk/examples/rs_prefetch.php": "db5135d073de37e45515531cff8e1937", - "vendor/qiniu/php-sdk/examples/rs_stat.php": "fd234b3b21940efd789128555a31e928", - "vendor/qiniu/php-sdk/examples/rsf_list_bucket.php": "6d0850f944e6232e6b3b8e5b81800313", - "vendor/qiniu/php-sdk/examples/rsf_list_files.php": "220930844cd9c61f7b8f0151c02c8d25", - "vendor/qiniu/php-sdk/examples/rsf_v2list_bucket.php": "4e507b1a9f932480d7819fb9aaa469d8", - "vendor/qiniu/php-sdk/examples/rtc/rtc_createApp.php": "9a186e363e3f3ccd4097a4dc4d7853b7", - "vendor/qiniu/php-sdk/examples/rtc/rtc_create_roomToken.php": "5f281501d7ba5cb943cb682ec97ccc9b", - "vendor/qiniu/php-sdk/examples/rtc/rtc_deleteApp.php": "797568721a1454f7492ce0d8588cb51a", - "vendor/qiniu/php-sdk/examples/rtc/rtc_getApp.php": "199483b278fab9ba0f0237b929e0b833", - "vendor/qiniu/php-sdk/examples/rtc/rtc_rooms_kickUser.php": "b48ce9ad92575c32185951b1232ee469", - "vendor/qiniu/php-sdk/examples/rtc/rtc_rooms_listActiveRooms.php": "d6cf9c0da4f07d3f60a3749a6e443638", - "vendor/qiniu/php-sdk/examples/rtc/rtc_rooms_listUser.php": "2a76cbd96c31c0973a7d0024de426a01", - "vendor/qiniu/php-sdk/examples/rtc/rtc_rooms_stopMerge.php": "6cf4e40f91d81877a3c4762d1fdc4c40", - "vendor/qiniu/php-sdk/examples/rtc/rtc_updateApp.php": "f59719e5167c0a72983d3ce82da155a6", - "vendor/qiniu/php-sdk/examples/saveas.php": "c9ce580d06914b3b5c68b859e1758b56", - "vendor/qiniu/php-sdk/examples/sms/sms_create_signature.php": "aa9ea61d00e22e0184e4fb3760ac4ca3", - "vendor/qiniu/php-sdk/examples/sms/sms_create_template.php": "39c8ec716c89b9dfa361c20d87a2e795", - "vendor/qiniu/php-sdk/examples/sms/sms_delete_signature.php": "2db71c7a823c70fbdc89fc749fe03f93", - "vendor/qiniu/php-sdk/examples/sms/sms_delete_template.php": "05e2d1fac9db86c9ee41c5fcfbb7b14d", - "vendor/qiniu/php-sdk/examples/sms/sms_edit_signature.php": "d8e8eab76b1140937f065dcad1eb1826", - "vendor/qiniu/php-sdk/examples/sms/sms_edit_template.php": "36c7753f75928a794d6417178f1882ce", - "vendor/qiniu/php-sdk/examples/sms/sms_query_send_sms.php": "d73ec079b1cc2033f02c1840b5a8c8a8", - "vendor/qiniu/php-sdk/examples/sms/sms_query_signature.php": "2257ed7234dce4391c6456ad614243b3", - "vendor/qiniu/php-sdk/examples/sms/sms_query_single_signature.php": "5de29866726b4230244b3b69ca7fce3b", - "vendor/qiniu/php-sdk/examples/sms/sms_query_single_template.php": "2d88b11e835d170c463de05a12dfc5c4", - "vendor/qiniu/php-sdk/examples/sms/sms_query_template.php": "836cda67fac84f37206103badfd173a4", - "vendor/qiniu/php-sdk/examples/sms/sms_send_message.php": "f4d8b6db9a22d0ffa893abd6a2b272d6", - "vendor/qiniu/php-sdk/examples/update_bucketEvent.php": "2c799e3a25b0c4b79368a82a00faa9cd", - "vendor/qiniu/php-sdk/examples/update_bucketLifecycleRule.php": "bd7d970fb63a85e41262da644ab84368", - "vendor/qiniu/php-sdk/examples/upload_and_callback.php": "a53bb4272a40bfd33815fed7bdc59682", - "vendor/qiniu/php-sdk/examples/upload_and_pfop.php": "b9d2b2c4891f7307b390fd0fdf49cb5e", - "vendor/qiniu/php-sdk/examples/upload_mgr_init.php": "ada968d5a6cfed9cfe3b05615f838597", - "vendor/qiniu/php-sdk/examples/upload_multi_demos.php": "3fea6b053aa0e58b29348b029e66e641", - "vendor/qiniu/php-sdk/examples/upload_simple_file.php": "9439d3b1172cee1710a9d0ae17e7164c", - "vendor/qiniu/php-sdk/examples/upload_tokens.php": "f451f0304fb9ef866527e064c695869a", - "vendor/qiniu/php-sdk/examples/upload_verify_callback.php": "c0e020efe1685b0b71408ca7bf1947ee", - "vendor/qiniu/php-sdk/examples/upload_with_qvmzone.php": "0248e834fe7ad684c4dde7abfea97542", - "vendor/qiniu/php-sdk/examples/upload_with_zone.php": "b2d1f00edf3821b86831db63280175a0", - "vendor/qiniu/php-sdk/src/Qiniu/Auth.php": "b383c0a94493a590b9c7502a1c6d96a3", - "vendor/qiniu/php-sdk/src/Qiniu/Cdn/CdnManager.php": "0299c3271baedd5f3b67cc6f0f368183", - "vendor/qiniu/php-sdk/src/Qiniu/Config.php": "5d8115a9f5caf43c7972451402f37c08", - "vendor/qiniu/php-sdk/src/Qiniu/Etag.php": "5bd6be2c32f0e5f0e3686e80d479c009", - "vendor/qiniu/php-sdk/src/Qiniu/Http/Client.php": "f2efaf419ed4234558d8a197917b6599", - "vendor/qiniu/php-sdk/src/Qiniu/Http/Error.php": "835e487674d74bd4413bb8783c9b1a7d", - "vendor/qiniu/php-sdk/src/Qiniu/Http/Request.php": "a155dd3d810b3e6607109294d10ec1c4", - "vendor/qiniu/php-sdk/src/Qiniu/Http/Response.php": "b0c4b3eceae3febfe9b8bf091d1d1f3b", - "vendor/qiniu/php-sdk/src/Qiniu/Processing/ImageUrlBuilder.php": "6027bc4a2326437db98745e3e995f108", - "vendor/qiniu/php-sdk/src/Qiniu/Processing/Operation.php": "3413142c6d26fd29ce54837dc2a6e381", - "vendor/qiniu/php-sdk/src/Qiniu/Processing/PersistentFop.php": "c3b1d325dbcd01530ae1c23bbf49f6e8", - "vendor/qiniu/php-sdk/src/Qiniu/Region.php": "5db0da7ebe935fd8c6b1e8b936d6b6d6", - "vendor/qiniu/php-sdk/src/Qiniu/Rtc/AppClient.php": "86aab3b2be95d953e6e2403b848aa9de", - "vendor/qiniu/php-sdk/src/Qiniu/Sms/Sms.php": "2bf18d70f7d80e1e8dfc5dea5e0b4253", - "vendor/qiniu/php-sdk/src/Qiniu/Storage/ArgusManager.php": "2c010f30445154692e1bf27df73be44e", - "vendor/qiniu/php-sdk/src/Qiniu/Storage/BucketManager.php": "a1153a79fab7528837cabf3add5bef74", - "vendor/qiniu/php-sdk/src/Qiniu/Storage/FormUploader.php": "e0f443e28c7abe658c28a49356690cbc", - "vendor/qiniu/php-sdk/src/Qiniu/Storage/ResumeUploader.php": "e99bdfc19d693e621358a6be998257a7", - "vendor/qiniu/php-sdk/src/Qiniu/Storage/UploadManager.php": "bc7092cf8f4d197c4bcb2e040af74038", - "vendor/qiniu/php-sdk/src/Qiniu/Zone.php": "777190dff28bba58bf3bae2c4d4c4bad", - "vendor/qiniu/php-sdk/src/Qiniu/functions.php": "5cc7f7010cc4066611baf92edad8f38e", - "vendor/qiniu/php-sdk/tests/Qiniu/Tests/AuthTest.php": "885a3002f275d5f5928b4775df8f4a38", - "vendor/qiniu/php-sdk/tests/Qiniu/Tests/Base64Test.php": "32074b5d4b58a317f086900578108091", - "vendor/qiniu/php-sdk/tests/Qiniu/Tests/BucketTest.php": "c9aee183c0002b19febdd5f995a0261e", - "vendor/qiniu/php-sdk/tests/Qiniu/Tests/CdnManagerTest.php": "61cebb433a4e4eea08f2c8a78ce3baa2", - "vendor/qiniu/php-sdk/tests/Qiniu/Tests/Crc32Test.php": "28bc073c2dacc51db36ff68f4bb90851", - "vendor/qiniu/php-sdk/tests/Qiniu/Tests/DownloadTest.php": "35fdd6beba7d2b8b63919d85d78a0ac3", - "vendor/qiniu/php-sdk/tests/Qiniu/Tests/EtagTest.php": "81240a8eb12c9be7f943c7927c65aa7e", - "vendor/qiniu/php-sdk/tests/Qiniu/Tests/FopTest.php": "bf2270c162039216268983c96f6a82a1", - "vendor/qiniu/php-sdk/tests/Qiniu/Tests/FormUpTest.php": "4e9900db55fdc4f9b3c996162912a93c", - "vendor/qiniu/php-sdk/tests/Qiniu/Tests/HttpTest.php": "e2657927cddc647dbdd373a598b37b1e", - "vendor/qiniu/php-sdk/tests/Qiniu/Tests/ImageUrlBuilderTest.php": "2b3ac0522b20283465e7ff29379087a0", - "vendor/qiniu/php-sdk/tests/Qiniu/Tests/PfopTest.php": "ad4d42a3ab6a1f44c83661691d5e04d1", - "vendor/qiniu/php-sdk/tests/Qiniu/Tests/ResumeUpTest.php": "cddafc78cd11eb410cffdd926ae4c471", - "vendor/qiniu/php-sdk/tests/Qiniu/Tests/ZoneTest.php": "14c1d4acd176c5fe818022c75bb56c7a", - "vendor/qiniu/php-sdk/tests/bootstrap.php": "f45cbb5c73fea029a89c681fdeeab20e", - "vendor/ralouphie/getallheaders/src/getallheaders.php": "fe517816cb82a5e67e62c8d0241fce3a", - "vendor/rmccue/requests/library/Deprecated.php": "618f622f8e53b4b105b7c7c65b5ef9d9", - "vendor/rmccue/requests/library/Requests.php": "908800fc5643d3b48d6d0ce4a64697a7", - "vendor/rmccue/requests/src/Auth/Basic.php": "07f677dd5906177bd39310317d606fca", - "vendor/rmccue/requests/src/Auth.php": "0583621858ac517adcb44fec48ffd4c1", - "vendor/rmccue/requests/src/Autoload.php": "4c74798af9f5e699ff374178ddf40c47", - "vendor/rmccue/requests/src/Capability.php": "64b18c1a43472a9f850f595c5e703aed", - "vendor/rmccue/requests/src/Cookie/Jar.php": "003eba2eeea67375cd8e174760001c3c", - "vendor/rmccue/requests/src/Cookie.php": "3e1731c8d40f84f6f576bc9372e74b6a", - "vendor/rmccue/requests/src/Exception/ArgumentCount.php": "e48fbd1b244af0cc7acfe9dc66d84455", - "vendor/rmccue/requests/src/Exception/Http/Status304.php": "70c45d8d1bfd3aa37d9117fa6c0d77da", - "vendor/rmccue/requests/src/Exception/Http/Status305.php": "65bb18acde517fb0931036cc29858487", - "vendor/rmccue/requests/src/Exception/Http/Status306.php": "2f486b8a7b4f06933b2c3c60530e7b7e", - "vendor/rmccue/requests/src/Exception/Http/Status400.php": "476c43b51a207d902adf1f620ac2395d", - "vendor/rmccue/requests/src/Exception/Http/Status401.php": "8d975283754df0ec8b362ff1ff525cea", - "vendor/rmccue/requests/src/Exception/Http/Status402.php": "a7792033f74e814a43ba4077fd9f43ab", - "vendor/rmccue/requests/src/Exception/Http/Status403.php": "23594f1e647343480b4d47b990d537bd", - "vendor/rmccue/requests/src/Exception/Http/Status404.php": "4921c482e066dcf65a704c2e08726587", - "vendor/rmccue/requests/src/Exception/Http/Status405.php": "bec4f2b33123639cce1c4e9e06a3a20b", - "vendor/rmccue/requests/src/Exception/Http/Status406.php": "f90534feb7a6292d87d580f6a5004799", - "vendor/rmccue/requests/src/Exception/Http/Status407.php": "c15a71836d50ddd205a427cb885bde73", - "vendor/rmccue/requests/src/Exception/Http/Status408.php": "4cfad9c8e2c75d70c3a6d68a114bfdc9", - "vendor/rmccue/requests/src/Exception/Http/Status409.php": "0dd40f011f5afa443697e8f324cf5b24", - "vendor/rmccue/requests/src/Exception/Http/Status410.php": "c169ae9f4c298429b98837cf0166667d", - "vendor/rmccue/requests/src/Exception/Http/Status411.php": "7fd7b1ac968fa83449936349760a1a68", - "vendor/rmccue/requests/src/Exception/Http/Status412.php": "83b7f9b7dc965b383f5e46f2e85954ff", - "vendor/rmccue/requests/src/Exception/Http/Status413.php": "d0b5d7240c3dec5705666150b79fba77", - "vendor/rmccue/requests/src/Exception/Http/Status414.php": "e3b09a4465b5b86cae177eeb894aa970", - "vendor/rmccue/requests/src/Exception/Http/Status415.php": "0ad365d4181addf05e4666806deb9002", - "vendor/rmccue/requests/src/Exception/Http/Status416.php": "134ad740455b58a49c32cdff51f21327", - "vendor/rmccue/requests/src/Exception/Http/Status417.php": "f3ac936e4cbf85c12ccc5578a3d1cd28", - "vendor/rmccue/requests/src/Exception/Http/Status418.php": "fcace95082bef577b48e817535a46034", - "vendor/rmccue/requests/src/Exception/Http/Status428.php": "2f71ebc0807849e59caa95a0a08f8850", - "vendor/rmccue/requests/src/Exception/Http/Status429.php": "6052186d1a704d8f3d7bef3b7cfcb63a", - "vendor/rmccue/requests/src/Exception/Http/Status431.php": "3f4dbc2dda2d049b6b08115cf3d1a488", - "vendor/rmccue/requests/src/Exception/Http/Status500.php": "d016d2428e4ed77854115a873087e57a", - "vendor/rmccue/requests/src/Exception/Http/Status501.php": "bc059181eab80c84d16a18ba4e9afe66", - "vendor/rmccue/requests/src/Exception/Http/Status502.php": "688f47a5db6451aaed749c249dbfa225", - "vendor/rmccue/requests/src/Exception/Http/Status503.php": "37c6e2cfb7c1f2dc0d7c3bbd25bf89d8", - "vendor/rmccue/requests/src/Exception/Http/Status504.php": "bc2167de474e26eb026173af6f491677", - "vendor/rmccue/requests/src/Exception/Http/Status505.php": "2e22dab1ee14ae890ecab9e1a5e7e45f", - "vendor/rmccue/requests/src/Exception/Http/Status511.php": "d1bac7f41a133145a9576b98adfaeae6", - "vendor/rmccue/requests/src/Exception/Http/StatusUnknown.php": "8c4d25bb7da4d2857028f2a6dcec0cc3", - "vendor/rmccue/requests/src/Exception/Http.php": "6c8738aafb5ab75a9d1ca3bfcd8fdc03", - "vendor/rmccue/requests/src/Exception/InvalidArgument.php": "be0bb752251cba0fe639482619469992", - "vendor/rmccue/requests/src/Exception/Transport/Curl.php": "1dd0a2a25231a1f9d218558d92555104", - "vendor/rmccue/requests/src/Exception/Transport.php": "d80b4861e0f28bf21f78c1b39de810a3", - "vendor/rmccue/requests/src/Exception.php": "859c9281f98f0659d90bdbf795eae3be", - "vendor/rmccue/requests/src/HookManager.php": "3ba89520847dd48b1e81a5fef89d0133", - "vendor/rmccue/requests/src/Hooks.php": "a64080973f1b08d58093ca064a824355", - "vendor/rmccue/requests/src/IdnaEncoder.php": "bb063a926fd7dc8d7a8f51028f710857", - "vendor/rmccue/requests/src/Ipv6.php": "12c914b76ea26a9df4b6e51d72ee9d94", - "vendor/rmccue/requests/src/Iri.php": "6e313356eec792c8fcd27913a8ddd033", - "vendor/rmccue/requests/src/Port.php": "0774e4fc32e041d4eb4e723829cad314", - "vendor/rmccue/requests/src/Proxy/Http.php": "5b873404be6af2281bd609f9b52db0b6", - "vendor/rmccue/requests/src/Proxy.php": "e65a174c70cbffa1798d63bcebf69a80", - "vendor/rmccue/requests/src/Requests.php": "49d1e4cbe370a1808982dc36add6658d", - "vendor/rmccue/requests/src/Response/Headers.php": "1c10e4ab29d3d05cdfec23983fbf2a4a", - "vendor/rmccue/requests/src/Response.php": "cd032f9a0083d90c39f3ecffa47215fa", - "vendor/rmccue/requests/src/Session.php": "04fb011a433eab9d73330c5cd0c9f518", - "vendor/rmccue/requests/src/Ssl.php": "541ecee9d8766275cfd8b63abacd7cc9", - "vendor/rmccue/requests/src/Transport/Curl.php": "cf241f7aec95fbb8bd6cbabdcb067acf", - "vendor/rmccue/requests/src/Transport/Fsockopen.php": "81360916fc2e1ebb0b60ee16ad9746ec", - "vendor/rmccue/requests/src/Transport.php": "84d40d1a00f89544bf81f5bd27abd9da", - "vendor/rmccue/requests/src/Utility/CaseInsensitiveDictionary.php": "aa969b632343d03123a8a66f16ed9ed3", - "vendor/rmccue/requests/src/Utility/FilteredIterator.php": "653dde78391c7699ceebe6f3859f9b85", - "vendor/rmccue/requests/src/Utility/InputValidator.php": "55190dcaae03e4599065094c8c106c16", - "vendor/services.php": "3ddced98a5a0633e8940ded5edbac40f", - "vendor/spatie/macroable/src/Macroable.php": "bcb7d910a74ae6fb2ff4c52fc5067172", - "vendor/symfony/cache/Adapter/AbstractAdapter.php": "6833753ce701d33faca59661622fbe4b", - "vendor/symfony/cache/Adapter/AbstractTagAwareAdapter.php": "5c88f0a406a2b0c9228e78a5a5c0c9ea", - "vendor/symfony/cache/Adapter/AdapterInterface.php": "d7f5c6b2f002d2c7ab677c3e550e10f2", - "vendor/symfony/cache/Adapter/ApcuAdapter.php": "650120e57bc1afe3f5a7ac757db23acc", - "vendor/symfony/cache/Adapter/ArrayAdapter.php": "731d37151767bca49501fa8daeebaa06", - "vendor/symfony/cache/Adapter/ChainAdapter.php": "765eee958940d3ae04a835eb7e965718", - "vendor/symfony/cache/Adapter/CouchbaseBucketAdapter.php": "d8df98bae857b4ebc06ce45027abc633", - "vendor/symfony/cache/Adapter/CouchbaseCollectionAdapter.php": "6a5f1dccf5c177d7e01d25db1e6b23e9", - "vendor/symfony/cache/Adapter/DoctrineDbalAdapter.php": "c2c9d3f1198d832f50384283f0092583", - "vendor/symfony/cache/Adapter/FilesystemAdapter.php": "c121913e0e54124baa87d9d1990140b3", - "vendor/symfony/cache/Adapter/FilesystemTagAwareAdapter.php": "385db6b397afb9f676acf75334c7edea", - "vendor/symfony/cache/Adapter/MemcachedAdapter.php": "2c35f5bf8d60fa919a6eece388ae89a8", - "vendor/symfony/cache/Adapter/NullAdapter.php": "a9576e1fbc0c85cf3c1b6e2dd55120a5", - "vendor/symfony/cache/Adapter/ParameterNormalizer.php": "1caa50d34815d2287ee417ee4cf33fa8", - "vendor/symfony/cache/Adapter/PdoAdapter.php": "43eba3374b0a6462063bc065521b939a", - "vendor/symfony/cache/Adapter/PhpArrayAdapter.php": "10c6fe8a3dcb913d144530b3b2b759da", - "vendor/symfony/cache/Adapter/PhpFilesAdapter.php": "499ead2362a322f265b12c1b8e88a138", - "vendor/symfony/cache/Adapter/ProxyAdapter.php": "4f8f3fd140234bd7f7cfde3e9b5a1768", - "vendor/symfony/cache/Adapter/Psr16Adapter.php": "0456f8c67ba562a0114eca0d8b98becb", - "vendor/symfony/cache/Adapter/RedisAdapter.php": "23a678a0f4945714a5c8834e93f79d7e", - "vendor/symfony/cache/Adapter/RedisTagAwareAdapter.php": "4cfa067abe6307713dad39aef5894143", - "vendor/symfony/cache/Adapter/TagAwareAdapter.php": "d42a991f1db1d8103d9860bdd746e934", - "vendor/symfony/cache/Adapter/TagAwareAdapterInterface.php": "39dea0072f79d18e421ea509c0dbf9c0", - "vendor/symfony/cache/Adapter/TraceableAdapter.php": "a29495e8ba96ac8dfcacd4c2c16a629d", - "vendor/symfony/cache/Adapter/TraceableTagAwareAdapter.php": "e488a2267d8ebda42593cb50196e789f", - "vendor/symfony/cache/CacheItem.php": "e56ccc594459ae8757964b08f4d5be97", - "vendor/symfony/cache/DataCollector/CacheDataCollector.php": "021475a7f96b733b77f7c0d13d5230db", - "vendor/symfony/cache/DependencyInjection/CacheCollectorPass.php": "3e20f0469326aee3cf8e8525a2098a31", - "vendor/symfony/cache/DependencyInjection/CachePoolClearerPass.php": "83378494d411e1ac604a1340ed5e9638", - "vendor/symfony/cache/DependencyInjection/CachePoolPass.php": "40572942f9bfc1fe6e684e58d6ce354d", - "vendor/symfony/cache/DependencyInjection/CachePoolPrunerPass.php": "21890c122e1c0399d43321717e79f6eb", - "vendor/symfony/cache/Exception/CacheException.php": "de4ae76df1a7657aadd78da3d023face", - "vendor/symfony/cache/Exception/InvalidArgumentException.php": "6dbccee03675c2c85c926cffde60910e", - "vendor/symfony/cache/Exception/LogicException.php": "727570694e889cbd4031e3d77eae44f6", - "vendor/symfony/cache/LockRegistry.php": "d0a9cc0c535a34d05f1bb10b1d884439", - "vendor/symfony/cache/Marshaller/DefaultMarshaller.php": "6437422c2c4a2a97a5fa633cfeea58de", - "vendor/symfony/cache/Marshaller/DeflateMarshaller.php": "96d7963af1ed7637a05d0a806d00e8a9", - "vendor/symfony/cache/Marshaller/MarshallerInterface.php": "cff924e483549643a34841613007cf25", - "vendor/symfony/cache/Marshaller/SodiumMarshaller.php": "46c29e98dacba8f4f56414f201d1feaa", - "vendor/symfony/cache/Marshaller/TagAwareMarshaller.php": "39a4c0549abbd90897dd3c70b63f9611", - "vendor/symfony/cache/Messenger/EarlyExpirationDispatcher.php": "93d80a47e183a3074a981d93a5299264", - "vendor/symfony/cache/Messenger/EarlyExpirationHandler.php": "1a06fb591dc50bb3a56b1703caa0f1a8", - "vendor/symfony/cache/Messenger/EarlyExpirationMessage.php": "2c6b537ca9cfc64454b1b6058e4756a2", - "vendor/symfony/cache/PruneableInterface.php": "3feb6aca8eb37a08a5b9f7192cac4652", - "vendor/symfony/cache/Psr16Cache.php": "6706202fe330ba33db6fc4de664de911", - "vendor/symfony/cache/ResettableInterface.php": "8d97984ff156b1e0ad1e2a62e651f235", - "vendor/symfony/cache/Traits/AbstractAdapterTrait.php": "23fc4647bb69f6a88d9ade1d0102b3ea", - "vendor/symfony/cache/Traits/ContractsTrait.php": "e4823602902dce898c1b2b614016205b", - "vendor/symfony/cache/Traits/FilesystemCommonTrait.php": "2d7ba9b68272919e430b58f3f0789a1d", - "vendor/symfony/cache/Traits/FilesystemTrait.php": "2d5e1286e83ee38f5b9a5d2881491329", - "vendor/symfony/cache/Traits/ProxyTrait.php": "7f28e0e02639f92f0bfc56ae52ee2c5f", - "vendor/symfony/cache/Traits/RedisClusterNodeProxy.php": "d9188c0514838ee6c3749ceca048c94b", - "vendor/symfony/cache/Traits/RedisClusterProxy.php": "dfca62e9961eab210d33e96a3a8bb140", - "vendor/symfony/cache/Traits/RedisProxy.php": "83b5c0bf0fa012aba3740e4a4685d573", - "vendor/symfony/cache/Traits/RedisTrait.php": "e530952eca2374a358ba99f668fa28a7", - "vendor/symfony/cache-contracts/CacheInterface.php": "651e447fac04148e92839e96cde9a40f", - "vendor/symfony/cache-contracts/CacheTrait.php": "5b7ac01094dc13cc0dc5a86587f99bb4", - "vendor/symfony/cache-contracts/CallbackInterface.php": "09fd21bf7c1bee9058b50e50af58caa5", - "vendor/symfony/cache-contracts/ItemInterface.php": "cd70fe790386cbe6e20920e0688a512e", - "vendor/symfony/cache-contracts/TagAwareCacheInterface.php": "2c3793c60e9ce0571fd6ad275ec46af9", - "vendor/symfony/deprecation-contracts/function.php": "c6a33c867aa7b5b0f657ae43625d1349", - "vendor/symfony/http-client/AmpHttpClient.php": "8b3fcb71bff32fbdec06a52099d00439", - "vendor/symfony/http-client/AsyncDecoratorTrait.php": "b3e24c573a8af4fd9218b58928fe1fa1", - "vendor/symfony/http-client/CachingHttpClient.php": "51a74cdcb4131332b96064dd5aa057e5", - "vendor/symfony/http-client/Chunk/DataChunk.php": "ad80c080ef8dc06ace76ee7e58da87bf", - "vendor/symfony/http-client/Chunk/ErrorChunk.php": "d587dc8ed8af7da6469ad4af7492c103", - "vendor/symfony/http-client/Chunk/FirstChunk.php": "8a669ff2dfa14c63f1c19a4c874468d8", - "vendor/symfony/http-client/Chunk/InformationalChunk.php": "12ff406c6787d4869cb94d0fc17dd130", - "vendor/symfony/http-client/Chunk/LastChunk.php": "0bbbbaaa417c5449bebbc2faffdd732d", - "vendor/symfony/http-client/Chunk/ServerSentEvent.php": "29097849f89d3fb79b3f558e22d27cfd", - "vendor/symfony/http-client/CurlHttpClient.php": "d2a1073d477214fc8b75db96a417bb23", - "vendor/symfony/http-client/DataCollector/HttpClientDataCollector.php": "209980a7215481938987e86c0d3e80fc", - "vendor/symfony/http-client/DecoratorTrait.php": "954204c3b3b2b7a4be5c5c94da4022c6", - "vendor/symfony/http-client/DependencyInjection/HttpClientPass.php": "28f5ff853494d5d5542ffb8077483fc4", - "vendor/symfony/http-client/EventSourceHttpClient.php": "6163d2e2be1d5622448a4ad491bc19e7", - "vendor/symfony/http-client/Exception/ClientException.php": "4233d3e98ac563d1a19288f102aabaa9", - "vendor/symfony/http-client/Exception/EventSourceException.php": "45baa04a55d1fa58465ff552efb02f76", - "vendor/symfony/http-client/Exception/HttpExceptionTrait.php": "1e031398eac9c655189c29216ab70c2c", - "vendor/symfony/http-client/Exception/InvalidArgumentException.php": "1dee8b8744c6c20a1368a2e312afd536", - "vendor/symfony/http-client/Exception/JsonException.php": "6cbe74731d39cb321662ab74e7fae89d", - "vendor/symfony/http-client/Exception/RedirectionException.php": "28b01c77b6e71b55cdbc5fb8f7aa9cdc", - "vendor/symfony/http-client/Exception/ServerException.php": "20c7e60540c7a85f1ba8fd4fdcf2e3cb", - "vendor/symfony/http-client/Exception/TimeoutException.php": "0bb630d3acdb76f4cce44b2f7f549333", - "vendor/symfony/http-client/Exception/TransportException.php": "6ee9fa1abc5231c07ae4a53f59856f6f", - "vendor/symfony/http-client/HttpClient.php": "f099f7d2db678587ac1106a3c1da9346", - "vendor/symfony/http-client/HttpClientTrait.php": "2d06a55905efa49e46bd55a3087fe451", - "vendor/symfony/http-client/HttpOptions.php": "c15d758329fb9337b02b6e8debf22a20", - "vendor/symfony/http-client/HttplugClient.php": "2e9f6094057f50c1378b95114d0b0535", - "vendor/symfony/http-client/Internal/AmpBody.php": "c98ddd8e6ccae123f4f4ebb4f52f34d8", - "vendor/symfony/http-client/Internal/AmpClientState.php": "5fc5b1fb969bd97ec42dc46fc426fa7e", - "vendor/symfony/http-client/Internal/AmpListener.php": "811cf8faee3df6f4561f4edf3fc06491", - "vendor/symfony/http-client/Internal/AmpResolver.php": "9d30f86c2130791f24f666c860030767", - "vendor/symfony/http-client/Internal/Canary.php": "15aa14d358645f5881a6594b2b113e22", - "vendor/symfony/http-client/Internal/ClientState.php": "e0aa087b411619f558a641a148210aa1", - "vendor/symfony/http-client/Internal/CurlClientState.php": "476e1fd0174be2d0124ec664a40983fd", - "vendor/symfony/http-client/Internal/DnsCache.php": "600cab4e5681273a5d1ca58874f5caba", - "vendor/symfony/http-client/Internal/HttplugWaitLoop.php": "a27c2bbd42f7c8945123fac46aeae15f", - "vendor/symfony/http-client/Internal/NativeClientState.php": "f0e25e7ced3ee324517838f5607c837c", - "vendor/symfony/http-client/Internal/PushedResponse.php": "53b57338f54c82a431d96ace36121dd1", - "vendor/symfony/http-client/MockHttpClient.php": "0b969b67fe7392aba9b008bfcc7cdba3", - "vendor/symfony/http-client/NativeHttpClient.php": "1ef328837231e5c49f72a9810405d92d", - "vendor/symfony/http-client/NoPrivateNetworkHttpClient.php": "fb3f8757dfa620eaf8af7e146932df5a", - "vendor/symfony/http-client/Psr18Client.php": "963574a4cb23cf3daf8ce3783ba625bf", - "vendor/symfony/http-client/Response/AmpResponse.php": "365715c1000d948f29210d9a547bbd51", - "vendor/symfony/http-client/Response/AsyncContext.php": "8b502348e653391de9132abc299e3761", - "vendor/symfony/http-client/Response/AsyncResponse.php": "a8a485060237ae822ed170db07a2d934", - "vendor/symfony/http-client/Response/CommonResponseTrait.php": "d537721807719e9ed56b596853b45c9c", - "vendor/symfony/http-client/Response/CurlResponse.php": "cfe5c08c0cea4ebfb4f2c9e742419f94", - "vendor/symfony/http-client/Response/HttplugPromise.php": "ef172fe39d4730a963265671c601ee3d", - "vendor/symfony/http-client/Response/MockResponse.php": "5d5847ae03fdec9886cc5abc3d12b929", - "vendor/symfony/http-client/Response/NativeResponse.php": "5323c4457d3e76289296be317334b3bd", - "vendor/symfony/http-client/Response/ResponseStream.php": "50ec7ebc879ae453b185b6c756464475", - "vendor/symfony/http-client/Response/StreamWrapper.php": "92dee47a966f0294cd1885cd808d69a4", - "vendor/symfony/http-client/Response/StreamableInterface.php": "f7c90129f887fa0bf4761ff66615e0e2", - "vendor/symfony/http-client/Response/TraceableResponse.php": "74904ec0d246f8bf5dd673ba20950769", - "vendor/symfony/http-client/Response/TransportResponseTrait.php": "6460ec840924c083347415dec264f40c", - "vendor/symfony/http-client/Retry/GenericRetryStrategy.php": "ae1db1783b667c75fc9dbdf441f66982", - "vendor/symfony/http-client/Retry/RetryStrategyInterface.php": "395d2ba28d6528d1edfe12f44b316f5d", - "vendor/symfony/http-client/RetryableHttpClient.php": "19c6e9f16e38d12f92a8ce9a0d711d6d", - "vendor/symfony/http-client/ScopingHttpClient.php": "d64208f3678180b7afb3d611e35c80a9", - "vendor/symfony/http-client/TraceableHttpClient.php": "de6d6adb6803f36c87ecd95a00a5b8bf", - "vendor/symfony/http-client-contracts/ChunkInterface.php": "0d653abcc97c06dd03006502cba17717", - "vendor/symfony/http-client-contracts/Exception/ClientExceptionInterface.php": "27381213ae9a9012e45b61a5ee251ec6", - "vendor/symfony/http-client-contracts/Exception/DecodingExceptionInterface.php": "5d67cf0f585dc360f4220a751d2899f1", - "vendor/symfony/http-client-contracts/Exception/ExceptionInterface.php": "f1ffbec956b5cf3e2366d7c7d9d29346", - "vendor/symfony/http-client-contracts/Exception/HttpExceptionInterface.php": "eeccfcfda215f4a8d896fb066db5e096", - "vendor/symfony/http-client-contracts/Exception/RedirectionExceptionInterface.php": "e26e11a71519e303ebbde884aa2d63e7", - "vendor/symfony/http-client-contracts/Exception/ServerExceptionInterface.php": "ef11f5afc45fc187e8ffeb95f0d691b4", - "vendor/symfony/http-client-contracts/Exception/TimeoutExceptionInterface.php": "22ae530d49376df7dd0df77a6059bd32", - "vendor/symfony/http-client-contracts/Exception/TransportExceptionInterface.php": "dab1984626e80365208a9840db389142", - "vendor/symfony/http-client-contracts/HttpClientInterface.php": "5be3498caf888d08043615fe7eb54303", - "vendor/symfony/http-client-contracts/ResponseInterface.php": "415f7fb9b2af1f6239970f2a43fbc609", - "vendor/symfony/http-client-contracts/ResponseStreamInterface.php": "08ca6c894c3869a1c9e1f124488f92a9", - "vendor/symfony/http-client-contracts/Test/Fixtures/web/index.php": "6555b5b87e91876d22baf65254a90d34", - "vendor/symfony/http-client-contracts/Test/HttpClientTestCase.php": "0f441b73843c58d3862b00f56f79de87", - "vendor/symfony/http-client-contracts/Test/TestHttpServer.php": "3a5cb1fa609c5ab6961db8c4a7018d2c", - "vendor/symfony/http-foundation/AcceptHeader.php": "ebaea96eef2ed5514270c176dfb6d1a4", - "vendor/symfony/http-foundation/AcceptHeaderItem.php": "8de93f8978f0ac7c05002d30cc3272ea", - "vendor/symfony/http-foundation/BinaryFileResponse.php": "1dfa983fbd12d6ee6792d246082135f0", - "vendor/symfony/http-foundation/Cookie.php": "e9855aac864285151a053396d852eafe", - "vendor/symfony/http-foundation/Exception/BadRequestException.php": "322ee642df5121b5f6891f476123db32", - "vendor/symfony/http-foundation/Exception/ConflictingHeadersException.php": "6fd129d1efd277bdca290007f6d7d535", - "vendor/symfony/http-foundation/Exception/JsonException.php": "c6747ea381caf7f5fd8148626e52e890", - "vendor/symfony/http-foundation/Exception/RequestExceptionInterface.php": "1cd2c5e2f3c52c95294561b3e83392cb", - "vendor/symfony/http-foundation/Exception/SessionNotFoundException.php": "ec261d67906ba80395e698aa441281dc", - "vendor/symfony/http-foundation/Exception/SuspiciousOperationException.php": "7b93847625a345f60f20aae0ba500ca9", - "vendor/symfony/http-foundation/ExpressionRequestMatcher.php": "2f8154a4fab81985993847ecf9d05a43", - "vendor/symfony/http-foundation/File/Exception/AccessDeniedException.php": "218ba96b1203279ccf7e65938b10deda", - "vendor/symfony/http-foundation/File/Exception/CannotWriteFileException.php": "c15cd38d2a45cd949579bed5c09d59b3", - "vendor/symfony/http-foundation/File/Exception/ExtensionFileException.php": "734ed5d0c04c4acb79bcaf61b852c300", - "vendor/symfony/http-foundation/File/Exception/FileException.php": "33ff8592de1c97382cbf3264f5f3dfc9", - "vendor/symfony/http-foundation/File/Exception/FileNotFoundException.php": "0c353276b57a5d559b5d50faa28b573f", - "vendor/symfony/http-foundation/File/Exception/FormSizeFileException.php": "116dc7409721f53014cd45171d9d7519", - "vendor/symfony/http-foundation/File/Exception/IniSizeFileException.php": "4e6d5b169498ddaffa362a114249a05a", - "vendor/symfony/http-foundation/File/Exception/NoFileException.php": "a9bdc85c7d2b3a23324d2340e9be0566", - "vendor/symfony/http-foundation/File/Exception/NoTmpDirFileException.php": "af18ae2352412a5b1c4967f6ec94637d", - "vendor/symfony/http-foundation/File/Exception/PartialFileException.php": "ef080b13d7fa8109987c4522bb64e854", - "vendor/symfony/http-foundation/File/Exception/UnexpectedTypeException.php": "6447ce2a7b339f86b61662fac51bd288", - "vendor/symfony/http-foundation/File/Exception/UploadException.php": "cac23f7007e150884750f7ebe5142326", - "vendor/symfony/http-foundation/File/File.php": "79e0b4a8c6e7a60d2949cd8d45260df2", - "vendor/symfony/http-foundation/File/Stream.php": "6989f59f971849511703dc7ef2f7a3b0", - "vendor/symfony/http-foundation/File/UploadedFile.php": "aa7716ff3f4d6d5a31ca9c0795fb9f34", - "vendor/symfony/http-foundation/FileBag.php": "59ce87430312478c21e805b6db096625", - "vendor/symfony/http-foundation/HeaderBag.php": "075787768641f4ec74b4c09981cb6c0d", - "vendor/symfony/http-foundation/HeaderUtils.php": "81e66de584dfd0e7f67e6ae4248fb9eb", - "vendor/symfony/http-foundation/InputBag.php": "0141a213dee55617a78e29740431f737", - "vendor/symfony/http-foundation/IpUtils.php": "984c4275ed9219f25928ed8713eb1463", - "vendor/symfony/http-foundation/JsonResponse.php": "3610dc8b8493b5e0970a7f2890c95356", - "vendor/symfony/http-foundation/ParameterBag.php": "c545317c29a70283246b262a9f67a1af", - "vendor/symfony/http-foundation/RateLimiter/AbstractRequestRateLimiter.php": "d1417a1a8e922c74897804809727710e", - "vendor/symfony/http-foundation/RateLimiter/RequestRateLimiterInterface.php": "a7dbc724df1b3053f651f8baa9c2e3e4", - "vendor/symfony/http-foundation/RedirectResponse.php": "da2fde65e0aa8aa58817c3b443928bd8", - "vendor/symfony/http-foundation/Request.php": "dbfac83c9005eb0723af41e06f06a711", - "vendor/symfony/http-foundation/RequestMatcher.php": "e90d2a79d0fbfe7bbffeb32b5b1649bd", - "vendor/symfony/http-foundation/RequestMatcherInterface.php": "b181a2b6a6a8cae1d31e6a55b9aecd63", - "vendor/symfony/http-foundation/RequestStack.php": "b9f1941ab0a504f1821b75be742af13f", - "vendor/symfony/http-foundation/Response.php": "c28999006e634192a5dd83a98bb4f84c", - "vendor/symfony/http-foundation/ResponseHeaderBag.php": "6cfb28724d7bf6739950dc0b922fc848", - "vendor/symfony/http-foundation/ServerBag.php": "3aad75062c35b41079d24ed7fd6f8943", - "vendor/symfony/http-foundation/Session/Attribute/AttributeBag.php": "dcefb1b23aa54f8bba9d70aea86f5679", - "vendor/symfony/http-foundation/Session/Attribute/AttributeBagInterface.php": "4784fb5eaf608680acbc0e9abb3060ab", - "vendor/symfony/http-foundation/Session/Flash/AutoExpireFlashBag.php": "bafd914dbafd02af689905b2dee476f7", - "vendor/symfony/http-foundation/Session/Flash/FlashBag.php": "310c8ea24f9d74660f273027518c807a", - "vendor/symfony/http-foundation/Session/Flash/FlashBagInterface.php": "aa687f163e7fccbd16bf5fd089987699", - "vendor/symfony/http-foundation/Session/Session.php": "4737bdd6538b52c11a824fdeb0f2b560", - "vendor/symfony/http-foundation/Session/SessionBagInterface.php": "c5ecfe72f1203e3dc474f2a0372b5285", - "vendor/symfony/http-foundation/Session/SessionBagProxy.php": "be73913279d5eee2b2955d25ba2fa81f", - "vendor/symfony/http-foundation/Session/SessionFactory.php": "ac4bf03e92e115db730ab3860ac96c50", - "vendor/symfony/http-foundation/Session/SessionFactoryInterface.php": "3f531aa653614519c2bbbde773253f3d", - "vendor/symfony/http-foundation/Session/SessionInterface.php": "317bed0151c4b76f203d5e7d83f1e307", - "vendor/symfony/http-foundation/Session/SessionUtils.php": "80e25cc604b5265f3a1707d5de984dd5", - "vendor/symfony/http-foundation/Session/Storage/Handler/AbstractSessionHandler.php": "f29d9b5d276712c51ee35ca03cfd3aed", - "vendor/symfony/http-foundation/Session/Storage/Handler/IdentityMarshaller.php": "707a7d61ade76249bee828a5bd39e09f", - "vendor/symfony/http-foundation/Session/Storage/Handler/MarshallingSessionHandler.php": "c6983d49aba8be21016eafe2eeaf7293", - "vendor/symfony/http-foundation/Session/Storage/Handler/MemcachedSessionHandler.php": "2fdb2096d4e8bff21fd5e982e703855c", - "vendor/symfony/http-foundation/Session/Storage/Handler/MigratingSessionHandler.php": "3236bcec9f8c35d8d76084aa4beb320b", - "vendor/symfony/http-foundation/Session/Storage/Handler/MongoDbSessionHandler.php": "581403957110daedfa4d32f2a16a3113", - "vendor/symfony/http-foundation/Session/Storage/Handler/NativeFileSessionHandler.php": "c5fc893210b8088a6cf35ab1e0756a01", - "vendor/symfony/http-foundation/Session/Storage/Handler/NullSessionHandler.php": "4ad55e815985d05eb203e5179c08c8cf", - "vendor/symfony/http-foundation/Session/Storage/Handler/PdoSessionHandler.php": "4fc518327357b3f56b1d0261bce20b98", - "vendor/symfony/http-foundation/Session/Storage/Handler/RedisSessionHandler.php": "2d1f246bbdc8556e9a2687082f576a2f", - "vendor/symfony/http-foundation/Session/Storage/Handler/SessionHandlerFactory.php": "63072a50be0a4b4824ba40bd47a76f93", - "vendor/symfony/http-foundation/Session/Storage/Handler/StrictSessionHandler.php": "5075222af61deaff24f0c6a335e68678", - "vendor/symfony/http-foundation/Session/Storage/MetadataBag.php": "0909e9358df2c5b2a26da809a21f9100", - "vendor/symfony/http-foundation/Session/Storage/MockArraySessionStorage.php": "9c236bfbf6b188b6b71b438535bc6e16", - "vendor/symfony/http-foundation/Session/Storage/MockFileSessionStorage.php": "dedfe5c339b469bdcec669d95dd9ef12", - "vendor/symfony/http-foundation/Session/Storage/MockFileSessionStorageFactory.php": "84b71f303d7cc466825186760e75257f", - "vendor/symfony/http-foundation/Session/Storage/NativeSessionStorage.php": "be64e35ec2ee3de4f7eacb06fbb9a1ff", - "vendor/symfony/http-foundation/Session/Storage/NativeSessionStorageFactory.php": "8d55ff0bc3db201cff7c79f9b3b3e5f7", - "vendor/symfony/http-foundation/Session/Storage/PhpBridgeSessionStorage.php": "7e90e891b2f70a04e860e5a818884deb", - "vendor/symfony/http-foundation/Session/Storage/PhpBridgeSessionStorageFactory.php": "1cb0b0385ca6d17c75d79b435415a00a", - "vendor/symfony/http-foundation/Session/Storage/Proxy/AbstractProxy.php": "36fc5e013621676a47b79c1870767ee3", - "vendor/symfony/http-foundation/Session/Storage/Proxy/SessionHandlerProxy.php": "cddbab7f59d124e14939df9b971718f4", - "vendor/symfony/http-foundation/Session/Storage/SessionStorageFactoryInterface.php": "a33ab61b6aa806de7b7a67ec7daee3a0", - "vendor/symfony/http-foundation/Session/Storage/SessionStorageInterface.php": "f7047e4692d9d77f8e0f6617af76daef", - "vendor/symfony/http-foundation/StreamedResponse.php": "61201251293f587190e46e63cdcd18f8", - "vendor/symfony/http-foundation/Test/Constraint/RequestAttributeValueSame.php": "3aad9c0aeaffb48695b6a7c82f67c18c", - "vendor/symfony/http-foundation/Test/Constraint/ResponseCookieValueSame.php": "dcc7836efe12f13994ae0c03be40a94d", - "vendor/symfony/http-foundation/Test/Constraint/ResponseFormatSame.php": "a73b5f68a5b093949c3a356ab62bc6e2", - "vendor/symfony/http-foundation/Test/Constraint/ResponseHasCookie.php": "3ca9254b8907debb3c80c856274b440c", - "vendor/symfony/http-foundation/Test/Constraint/ResponseHasHeader.php": "7dc7b4547b93611ee83a7c18674b7a5f", - "vendor/symfony/http-foundation/Test/Constraint/ResponseHeaderSame.php": "bd7f9f25f6f7fd47c20cd59161a451ab", - "vendor/symfony/http-foundation/Test/Constraint/ResponseIsRedirected.php": "df1662577f8860d61d39719a48a69bbb", - "vendor/symfony/http-foundation/Test/Constraint/ResponseIsSuccessful.php": "a85725d6fe4d143106c7947f3c91a74a", - "vendor/symfony/http-foundation/Test/Constraint/ResponseIsUnprocessable.php": "67b3112f135703506fae05bc5fb30c0d", - "vendor/symfony/http-foundation/Test/Constraint/ResponseStatusCodeSame.php": "3541c53ca227906e4a7651127f78d2c6", - "vendor/symfony/http-foundation/UrlHelper.php": "a17e8139d42bee34bfa054c2dfe67534", - "vendor/symfony/mime/Address.php": "120536d329cce0144a173a83358addaf", - "vendor/symfony/mime/BodyRendererInterface.php": "86c757e1914bc7c880fcadabbe97da9f", - "vendor/symfony/mime/CharacterStream.php": "946bfda9924d373c0056baaae79be087", - "vendor/symfony/mime/Crypto/DkimOptions.php": "48376f7db1df3e64c61c3aaec0034c8d", - "vendor/symfony/mime/Crypto/DkimSigner.php": "34ecaba6cbd622fbee4065062d505c65", - "vendor/symfony/mime/Crypto/SMime.php": "bc95feb0f870ac3574c8faa2611be53c", - "vendor/symfony/mime/Crypto/SMimeEncrypter.php": "f16fbb4e67cc27199f05eae7d89ba3bd", - "vendor/symfony/mime/Crypto/SMimeSigner.php": "b74fa90a04465d9ab0330bfa9e1609e0", - "vendor/symfony/mime/DependencyInjection/AddMimeTypeGuesserPass.php": "267087a01fec48142f1fa130348b8643", - "vendor/symfony/mime/Email.php": "3055be6a59b593ea1d821ea2aabcc5db", - "vendor/symfony/mime/Encoder/AddressEncoderInterface.php": "4e997b16991fe3b809c967476aeb748e", - "vendor/symfony/mime/Encoder/Base64ContentEncoder.php": "eee984fb0c87afda5c88a960d1358a0e", - "vendor/symfony/mime/Encoder/Base64Encoder.php": "460c256ea5a4c925b03e13858fe03086", - "vendor/symfony/mime/Encoder/Base64MimeHeaderEncoder.php": "b26063c96ad77a8c7f9691c3574a6219", - "vendor/symfony/mime/Encoder/ContentEncoderInterface.php": "b8c7c78aacd33a1529e7332e5828628d", - "vendor/symfony/mime/Encoder/EightBitContentEncoder.php": "fff5d90918f982919313469c3d0ea2d9", - "vendor/symfony/mime/Encoder/EncoderInterface.php": "08695d52fbdc48d73772541193c780af", - "vendor/symfony/mime/Encoder/IdnAddressEncoder.php": "6fe12122d12e07c05449a025afe92457", - "vendor/symfony/mime/Encoder/MimeHeaderEncoderInterface.php": "721ef21d9b8a4ada0dd7046036bebadf", - "vendor/symfony/mime/Encoder/QpContentEncoder.php": "46bd7c06d582c0e9448a03a6f634cfe6", - "vendor/symfony/mime/Encoder/QpEncoder.php": "1678d58800fe21e62bbc77e8716fd13a", - "vendor/symfony/mime/Encoder/QpMimeHeaderEncoder.php": "73b32359e1399eae6c823bf70d3d772d", - "vendor/symfony/mime/Encoder/Rfc2231Encoder.php": "c38fa7031178e74a4e7e79dc967e5975", - "vendor/symfony/mime/Exception/AddressEncoderException.php": "757fba8ee417df9fdb0122e94dd4f8be", - "vendor/symfony/mime/Exception/ExceptionInterface.php": "3cfe4c1a8a28549020244d99686a1cd3", - "vendor/symfony/mime/Exception/InvalidArgumentException.php": "4acbc8c09a805db0e4025de6c9ef8195", - "vendor/symfony/mime/Exception/LogicException.php": "04793a5b7620ecefa33199b59aa6414a", - "vendor/symfony/mime/Exception/RfcComplianceException.php": "dc1e1883307786aa2587bd569c8acea1", - "vendor/symfony/mime/Exception/RuntimeException.php": "a90aa8f9fbe4d8edb7a44f1ba3808c59", - "vendor/symfony/mime/FileBinaryMimeTypeGuesser.php": "3309138434d2a32c4a72afc56f8dfb55", - "vendor/symfony/mime/FileinfoMimeTypeGuesser.php": "66292d6bb68214fc7b14741c4066906a", - "vendor/symfony/mime/Header/AbstractHeader.php": "ce7ffe930476d3b344f77a79a3ba26fa", - "vendor/symfony/mime/Header/DateHeader.php": "1fd18666d60f61db0348e21ad705a963", - "vendor/symfony/mime/Header/HeaderInterface.php": "0c90d5d0ae530a9bc013012436e9df87", - "vendor/symfony/mime/Header/Headers.php": "7522ce6ac87b1c063a5fee5d1ae26533", - "vendor/symfony/mime/Header/IdentificationHeader.php": "42bd4bcea0e96a29e249bfcd7c78de22", - "vendor/symfony/mime/Header/MailboxHeader.php": "8930f4ac1bdf3f7d03f3ab6111a9c156", - "vendor/symfony/mime/Header/MailboxListHeader.php": "1ddb8bdd4b5cbc3ee44b807c6a5c70ad", - "vendor/symfony/mime/Header/ParameterizedHeader.php": "617322e6111435b533f71f69fd27c499", - "vendor/symfony/mime/Header/PathHeader.php": "1947b50f1ec83cd62f055dac29799e55", - "vendor/symfony/mime/Header/UnstructuredHeader.php": "390cf1991921377562799a31ccc1036e", - "vendor/symfony/mime/Message.php": "fd62f40971f650c5d7a9a96bb839135f", - "vendor/symfony/mime/MessageConverter.php": "e275c6e8e67b50ae6fda9e53aabdd67b", - "vendor/symfony/mime/MimeTypeGuesserInterface.php": "db3d79145b6af6ce5ae773a99bf81338", - "vendor/symfony/mime/MimeTypes.php": "34b194e17ca1177d917d3d2d5ece258f", - "vendor/symfony/mime/MimeTypesInterface.php": "d29bce31a5d8cff0872427ff18b863a3", - "vendor/symfony/mime/Part/AbstractMultipartPart.php": "0a85f346655ab4a0148cf14256342111", - "vendor/symfony/mime/Part/AbstractPart.php": "3603617a86d59e1490445c745b60f56b", - "vendor/symfony/mime/Part/DataPart.php": "b9bea331c72e5d3cdb3e771c93fd9421", - "vendor/symfony/mime/Part/MessagePart.php": "6d970dd34ad53e0f727db71180a7261d", - "vendor/symfony/mime/Part/Multipart/AlternativePart.php": "374d0d07d7df1912eccaea7308293933", - "vendor/symfony/mime/Part/Multipart/DigestPart.php": "3c98ca1f6c47880a54eb0b71451c1477", - "vendor/symfony/mime/Part/Multipart/FormDataPart.php": "c66fc6120e2458dda72b4e9b5f8c7668", - "vendor/symfony/mime/Part/Multipart/MixedPart.php": "cf51ad73762aad4382bd3769088327a6", - "vendor/symfony/mime/Part/Multipart/RelatedPart.php": "3997156ffe5f5a18208640510426002f", - "vendor/symfony/mime/Part/SMimePart.php": "fc69b025895ba7dc4a390ecccb42c59d", - "vendor/symfony/mime/Part/TextPart.php": "259b1318d581211cc3c1457910b85ea3", - "vendor/symfony/mime/RawMessage.php": "78cbb57932cc07d78280cc279a98392f", - "vendor/symfony/mime/Test/Constraint/EmailAddressContains.php": "304fdc478cc52748a4918eaf58e64c56", - "vendor/symfony/mime/Test/Constraint/EmailAttachmentCount.php": "a657ca9a1a84c533c841f56c491329b4", - "vendor/symfony/mime/Test/Constraint/EmailHasHeader.php": "669fb9bc46bf31031d79cee581eb1823", - "vendor/symfony/mime/Test/Constraint/EmailHeaderSame.php": "1fc9cbf1c3c287da5601c5c4271b40bf", - "vendor/symfony/mime/Test/Constraint/EmailHtmlBodyContains.php": "5950682a0e4c949d287d62216d08ae57", - "vendor/symfony/mime/Test/Constraint/EmailTextBodyContains.php": "99fb47d240d61cba116e94f1adcac5a4", - "vendor/symfony/polyfill-intl-idn/Idn.php": "cb3aa2ff1c2679b58cdb9deb6a93e396", - "vendor/symfony/polyfill-intl-idn/Info.php": "3d4427dcf757a6158a6a2a3caf33f843", - "vendor/symfony/polyfill-intl-idn/Resources/unidata/DisallowedRanges.php": "4e7d6fe12772b713affab1713fede99f", - "vendor/symfony/polyfill-intl-idn/Resources/unidata/Regex.php": "99551347bc2b2a1ebc763bc038e0ba8c", - "vendor/symfony/polyfill-intl-idn/Resources/unidata/deviation.php": "a4e02f7d44f01d7f050dfcb9a16d2860", - "vendor/symfony/polyfill-intl-idn/Resources/unidata/disallowed.php": "184f89105e74e2bd898da70a69549a62", - "vendor/symfony/polyfill-intl-idn/Resources/unidata/disallowed_STD3_mapped.php": "993b7afe17ba863308008f19d7f1a986", - "vendor/symfony/polyfill-intl-idn/Resources/unidata/disallowed_STD3_valid.php": "45cd86f06bdf40f4fd3e10528deabfb7", - "vendor/symfony/polyfill-intl-idn/Resources/unidata/ignored.php": "0ecde91671b99dca93d3a7f6fd0b638d", - "vendor/symfony/polyfill-intl-idn/Resources/unidata/mapped.php": "33b6ecf382da39a7a208e9686e0bb357", - "vendor/symfony/polyfill-intl-idn/Resources/unidata/virama.php": "6aa0539ca2d85e4de6122212c7f1eacb", - "vendor/symfony/polyfill-intl-idn/bootstrap.php": "3afba89087d4111338ccc8c287147595", - "vendor/symfony/polyfill-intl-idn/bootstrap80.php": "eb467e3c760d841e33c948882859011a", - "vendor/symfony/polyfill-intl-normalizer/Normalizer.php": "53fab6b96b87d97eea876791882169cc", - "vendor/symfony/polyfill-intl-normalizer/Resources/stubs/Normalizer.php": "c9116409c08d6783e2b342abb86b42e9", - "vendor/symfony/polyfill-intl-normalizer/Resources/unidata/canonicalComposition.php": "67c4f994a005e6d5b48f33b4d83dad02", - "vendor/symfony/polyfill-intl-normalizer/Resources/unidata/canonicalDecomposition.php": "7ab34951ee88347f8e22dadcc3d931d0", - "vendor/symfony/polyfill-intl-normalizer/Resources/unidata/combiningClass.php": "997a75b1c4dd9aa34b625e08d61d4377", - "vendor/symfony/polyfill-intl-normalizer/Resources/unidata/compatibilityDecomposition.php": "55fe2932daa439c5df97966a14567217", - "vendor/symfony/polyfill-intl-normalizer/bootstrap.php": "636cc3653f8532fa8e8afb3e5968ddf1", - "vendor/symfony/polyfill-intl-normalizer/bootstrap80.php": "0ec1b381f7278c676330e2104a76f5ee", - "vendor/symfony/polyfill-mbstring/Mbstring.php": "d4d2803c2520677145e1140eece7a1f2", - "vendor/symfony/polyfill-mbstring/Resources/unidata/caseFolding.php": "afd2a811c09e718300d41aeda6ee616f", - "vendor/symfony/polyfill-mbstring/Resources/unidata/lowerCase.php": "57fcc71db7032223c94559a4aed87b4d", - "vendor/symfony/polyfill-mbstring/Resources/unidata/titleCaseRegexp.php": "a161350864050f78bf9161f7f3c94172", - "vendor/symfony/polyfill-mbstring/Resources/unidata/upperCase.php": "3c66ab6278311ca4982af4ec018d76db", - "vendor/symfony/polyfill-mbstring/bootstrap.php": "7d89dba90209cbaf7430ec423022024d", - "vendor/symfony/polyfill-mbstring/bootstrap80.php": "5f4dde23e1039b3018ae061ed840fa1a", - "vendor/symfony/polyfill-php72/Php72.php": "4ecdd90e4dbb27ffb579c49e85b0c71a", - "vendor/symfony/polyfill-php72/bootstrap.php": "e7bdf814430d08c43c41e4fe5561c3ed", - "vendor/symfony/polyfill-php80/Php80.php": "feda784ff89086c99a0d678111e74bfe", - "vendor/symfony/polyfill-php80/PhpToken.php": "50ad074d89b0d489a3041e99a131df02", - "vendor/symfony/polyfill-php80/Resources/stubs/Attribute.php": "f3212f7dd76f9691f5ba5f42ab4b7697", - "vendor/symfony/polyfill-php80/Resources/stubs/PhpToken.php": "599d7691608f9f00c7c894816c157630", - "vendor/symfony/polyfill-php80/Resources/stubs/Stringable.php": "9a1665062812e71e2714c06efa157e40", - "vendor/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php": "922b136b054c080af5c17eafe2d6a1b5", - "vendor/symfony/polyfill-php80/Resources/stubs/ValueError.php": "119a383429b18c768a73578f5b03efd0", - "vendor/symfony/polyfill-php80/bootstrap.php": "a182f8d65875bfeba83939b11715d436", - "vendor/symfony/polyfill-php81/Php81.php": "907c5e142a4f3c15922efc5a6f0571c6", - "vendor/symfony/polyfill-php81/Resources/stubs/CURLStringFile.php": "b335745f6e51f385c41427a18b6a205f", - "vendor/symfony/polyfill-php81/Resources/stubs/ReturnTypeWillChange.php": "a0a1592a508e6cfc4e7971598ca92521", - "vendor/symfony/polyfill-php81/bootstrap.php": "620b1e05ab7a0ed4e6effc5c4cb444c3", - "vendor/symfony/psr-http-message-bridge/.php-cs-fixer.dist.php": "b10b17aa532a2fd97dc86c7d29f2e02d", - "vendor/symfony/psr-http-message-bridge/ArgumentValueResolver/PsrServerRequestResolver.php": "daf348097c280f2db2166b7337919211", - "vendor/symfony/psr-http-message-bridge/EventListener/PsrResponseListener.php": "95404550740c7566bae4df147a96ec2a", - "vendor/symfony/psr-http-message-bridge/Factory/HttpFoundationFactory.php": "44876b488633fcb2aded2e6ef04805e0", - "vendor/symfony/psr-http-message-bridge/Factory/PsrHttpFactory.php": "049d50c802fb8701bce3c6eaf71ca899", - "vendor/symfony/psr-http-message-bridge/Factory/UploadedFile.php": "987961fef53723b8e6fe36ff4511c2b9", - "vendor/symfony/psr-http-message-bridge/HttpFoundationFactoryInterface.php": "abbb12d6796bdabecf093af2f80925a7", - "vendor/symfony/psr-http-message-bridge/HttpMessageFactoryInterface.php": "9b8d3472e0405cf049b12a9540007412", - "vendor/symfony/service-contracts/Attribute/Required.php": "97eaac0aa7299985298efb1902281100", - "vendor/symfony/service-contracts/Attribute/SubscribedService.php": "e05dc8d6db3c42610886e1d3098847fb", - "vendor/symfony/service-contracts/ResetInterface.php": "b105805d3817743c1049a1239aa7ebe2", - "vendor/symfony/service-contracts/ServiceLocatorTrait.php": "e3f721444072fb1a3a4011604ba46c2b", - "vendor/symfony/service-contracts/ServiceProviderInterface.php": "29b886ced321fe9b7c7499f6cc77e048", - "vendor/symfony/service-contracts/ServiceSubscriberInterface.php": "32041ece758be39ba304d090af868a3a", - "vendor/symfony/service-contracts/ServiceSubscriberTrait.php": "a0337fef53e7799858e29651481dabeb", - "vendor/symfony/service-contracts/Test/ServiceLocatorTest.php": "2f241625cfe831cda3f495a6590d923c", - "vendor/symfony/translation/Catalogue/AbstractOperation.php": "ae426ba36ca8cb4654f19f89b6778446", - "vendor/symfony/translation/Catalogue/MergeOperation.php": "d5230748efd97a8588fb0be3485410bb", - "vendor/symfony/translation/Catalogue/OperationInterface.php": "ab68f226276e410756c806fb421150c4", - "vendor/symfony/translation/Catalogue/TargetOperation.php": "65a4c44f30d4ad4d7554f2278185e724", - "vendor/symfony/translation/Command/TranslationPullCommand.php": "6227521767c8f68a45aa20b18e886c65", - "vendor/symfony/translation/Command/TranslationPushCommand.php": "b9f2fb7bab417c5cd93f81d318d42bee", - "vendor/symfony/translation/Command/TranslationTrait.php": "acda71c79170e0d895dc842fe5f32c30", - "vendor/symfony/translation/Command/XliffLintCommand.php": "539a10662f46391d3fefcc9707fe4d46", - "vendor/symfony/translation/DataCollector/TranslationDataCollector.php": "e5f7ba50e46d25ad0a3749b9bcfb9205", - "vendor/symfony/translation/DataCollectorTranslator.php": "3c794c4f4c5a0fc510740111a2e7515b", - "vendor/symfony/translation/DependencyInjection/TranslationDumperPass.php": "5c3a52a1934ee2d73d0d6d7518b211a2", - "vendor/symfony/translation/DependencyInjection/TranslationExtractorPass.php": "7a06520255d58b45ee4422a6fc1875dd", - "vendor/symfony/translation/DependencyInjection/TranslatorPass.php": "89bb2917f754811fad6e782742b535ae", - "vendor/symfony/translation/DependencyInjection/TranslatorPathsPass.php": "94f0bedf2761ca0b7ac935ae9d48e91b", - "vendor/symfony/translation/Dumper/CsvFileDumper.php": "eaccf68b75d38d19d31a13714e794a0f", - "vendor/symfony/translation/Dumper/DumperInterface.php": "9afd0a180b01818a9f56f9ef75406f52", - "vendor/symfony/translation/Dumper/FileDumper.php": "a562316c3bf59f7a13121eac4b62d869", - "vendor/symfony/translation/Dumper/IcuResFileDumper.php": "1d5440905876be931ed9ae0898447492", - "vendor/symfony/translation/Dumper/IniFileDumper.php": "ff11a1fc5ae2c8611f5729b644c79a0e", - "vendor/symfony/translation/Dumper/JsonFileDumper.php": "7189945768aa051a080b3a52ee207423", - "vendor/symfony/translation/Dumper/MoFileDumper.php": "5311c4a4d7ba3c402798146de189b0ce", - "vendor/symfony/translation/Dumper/PhpFileDumper.php": "8a981303fda2c56e620d0a97925de76e", - "vendor/symfony/translation/Dumper/PoFileDumper.php": "d7ede98289d25207f8437f33c99552f2", - "vendor/symfony/translation/Dumper/QtFileDumper.php": "1bdc13b7b7efa2d9d2785828adf54ea7", - "vendor/symfony/translation/Dumper/XliffFileDumper.php": "fa7e118f9bb9db5f8ce7791cd30bd1dd", - "vendor/symfony/translation/Dumper/YamlFileDumper.php": "bd42bdc348ee0bd41131761ef58b9de8", - "vendor/symfony/translation/Exception/ExceptionInterface.php": "e9e24a6aaeed80b3a7557f0c1c3b168d", - "vendor/symfony/translation/Exception/IncompleteDsnException.php": "f557e1c99f5052f205e9fb3e4fe96a20", - "vendor/symfony/translation/Exception/InvalidArgumentException.php": "2ce0453cb021d474b8b68031d4639a25", - "vendor/symfony/translation/Exception/InvalidResourceException.php": "178abc46cb8060f081ef43fd5ff00da5", - "vendor/symfony/translation/Exception/LogicException.php": "b7a4dd1b8db962feaebcf304ac6b4eac", - "vendor/symfony/translation/Exception/MissingRequiredOptionException.php": "93da734a87b62ef5c041833e64a4cdfc", - "vendor/symfony/translation/Exception/NotFoundResourceException.php": "8c7bff66a9500b10fb4d13e1d07e76c0", - "vendor/symfony/translation/Exception/ProviderException.php": "c23ff40f9782ed0e05dfc40df18090a5", - "vendor/symfony/translation/Exception/ProviderExceptionInterface.php": "69fd5cdb791de30bc439aa72777dc32c", - "vendor/symfony/translation/Exception/RuntimeException.php": "11a1d1549dbcc85b074810bc7e589967", - "vendor/symfony/translation/Exception/UnsupportedSchemeException.php": "482a409277284145c0e6c19ce6405912", - "vendor/symfony/translation/Extractor/AbstractFileExtractor.php": "8fb37caea614c60e5b8781b818f35ef2", - "vendor/symfony/translation/Extractor/ChainExtractor.php": "def051e58455e1907798d4db4d9ac9ca", - "vendor/symfony/translation/Extractor/ExtractorInterface.php": "244862e3f8cdb829f6831d05d1adedca", - "vendor/symfony/translation/Extractor/PhpExtractor.php": "f1071213a7122233385d0045ca8e0307", - "vendor/symfony/translation/Extractor/PhpStringTokenParser.php": "1bc1ced5ec089cf45fbf9c3572e827e1", - "vendor/symfony/translation/Formatter/IntlFormatter.php": "029af19e0256171de659b1f56eb53fc2", - "vendor/symfony/translation/Formatter/IntlFormatterInterface.php": "55fa292e7f70dba36070e8e042fdff62", - "vendor/symfony/translation/Formatter/MessageFormatter.php": "6a759462759ea415c04ed48795d0fb25", - "vendor/symfony/translation/Formatter/MessageFormatterInterface.php": "1a186aebefc38793b8e29cd4c0821bea", - "vendor/symfony/translation/IdentityTranslator.php": "10f3e1f31aee84d7b06e8363be222735", - "vendor/symfony/translation/Loader/ArrayLoader.php": "f846244d7f5cc7ee4cf553c701c21d52", - "vendor/symfony/translation/Loader/CsvFileLoader.php": "d49ed6878c92ec4c446c8231a23d99cb", - "vendor/symfony/translation/Loader/FileLoader.php": "e5f0e3c8c9d30b7cc9ceb052d604ccd6", - "vendor/symfony/translation/Loader/IcuDatFileLoader.php": "08eec133679b4c1687c58630cd23ad22", - "vendor/symfony/translation/Loader/IcuResFileLoader.php": "d5d9d99cb498076ffff5bda0e8f32535", - "vendor/symfony/translation/Loader/IniFileLoader.php": "1aa6085f65e0683397a00c7cbe80a1ef", - "vendor/symfony/translation/Loader/JsonFileLoader.php": "87b5de611bffdd57c4f7e4532780b304", - "vendor/symfony/translation/Loader/LoaderInterface.php": "34ca84cab7a91add476aa0355029258a", - "vendor/symfony/translation/Loader/MoFileLoader.php": "661e5f89ab8d60bded109abd4d6fb135", - "vendor/symfony/translation/Loader/PhpFileLoader.php": "39aa8179d7e3a7481f8526653d80fdcb", - "vendor/symfony/translation/Loader/PoFileLoader.php": "4caa34b034cd0eeb476b7271f0dd2334", - "vendor/symfony/translation/Loader/QtFileLoader.php": "48d39dff3aafd884d86ca01982e932ca", - "vendor/symfony/translation/Loader/XliffFileLoader.php": "9f7e4beafd44136df9e7a8c36f1aaccb", - "vendor/symfony/translation/Loader/YamlFileLoader.php": "7910dcaff4408806458d9316031fac76", - "vendor/symfony/translation/LoggingTranslator.php": "5ab7b279a998a35b079f0028fa6607d2", - "vendor/symfony/translation/MessageCatalogue.php": "1e238e77fd1b39b4d39539f8a8783a10", - "vendor/symfony/translation/MessageCatalogueInterface.php": "9921b9023fbb8938a60487c7d28fa92a", - "vendor/symfony/translation/MetadataAwareInterface.php": "c3ab42c3e82db90178baf618fd55e902", - "vendor/symfony/translation/Provider/AbstractProviderFactory.php": "2965e06e15b9efa00067f55a58b8cd65", - "vendor/symfony/translation/Provider/Dsn.php": "ad8479d6aeda74564a07916e96c5f470", - "vendor/symfony/translation/Provider/FilteringProvider.php": "e1adefb5144ffd7861158af2c4887d99", - "vendor/symfony/translation/Provider/NullProvider.php": "6386188c94941ed4cabd6d07b60b6ac7", - "vendor/symfony/translation/Provider/NullProviderFactory.php": "b126c5c73a43ef8d03ed0e1b7e83d152", - "vendor/symfony/translation/Provider/ProviderFactoryInterface.php": "f2f1dfa3404629cfdd9f95c180b3c813", - "vendor/symfony/translation/Provider/ProviderInterface.php": "bcf083959b83053e8a8feffc12b75913", - "vendor/symfony/translation/Provider/TranslationProviderCollection.php": "96f9c5e82081db6031a3bd4d9938a4d0", - "vendor/symfony/translation/Provider/TranslationProviderCollectionFactory.php": "d2e1098791aa9c65e8a09d5510f3b9d0", - "vendor/symfony/translation/PseudoLocalizationTranslator.php": "68547b7669a015404652d49dc9ec3f9e", - "vendor/symfony/translation/Reader/TranslationReader.php": "3974b64e53c5fcfa1ebd84cd4162cb45", - "vendor/symfony/translation/Reader/TranslationReaderInterface.php": "84fc971d0a5699e5a7d3b48387253870", - "vendor/symfony/translation/Resources/functions.php": "456a80eeb678b8abb246bfc43b0675f3", - "vendor/symfony/translation/Test/ProviderFactoryTestCase.php": "b74a93c4bfc958eff3961c712b8f0bfc", - "vendor/symfony/translation/Test/ProviderTestCase.php": "28f1bd9a0f588db91554247ebb24c153", - "vendor/symfony/translation/TranslatableMessage.php": "aeb45565f5aa27ece595de27bb58ea57", - "vendor/symfony/translation/Translator.php": "89f07a4c111d9a29c9700120b6e9c209", - "vendor/symfony/translation/TranslatorBag.php": "ac23387d2ad45259bbf9469ed4628eef", - "vendor/symfony/translation/TranslatorBagInterface.php": "dc013d629a911fdb8c18b5663e900e0a", - "vendor/symfony/translation/Util/ArrayConverter.php": "0ce6e4650796213eeac3874fa997c28f", - "vendor/symfony/translation/Util/XliffUtils.php": "e9c297edf1957aee928431ecef06a46c", - "vendor/symfony/translation/Writer/TranslationWriter.php": "4a12fba1c6edc187cc6c1ec386a5655c", - "vendor/symfony/translation/Writer/TranslationWriterInterface.php": "fe5f463c9c7591b98b40c9e496614a0f", - "vendor/symfony/translation-contracts/LocaleAwareInterface.php": "524e9f5464590dec0cdf3e261bb310c1", - "vendor/symfony/translation-contracts/Test/TranslatorTest.php": "b21e742aee14789ee12f8e266da24a57", - "vendor/symfony/translation-contracts/TranslatableInterface.php": "7389cfccfd0ae942c17d83b160651439", - "vendor/symfony/translation-contracts/TranslatorInterface.php": "ead297d439797e1dcf83c2e26f46237f", - "vendor/symfony/translation-contracts/TranslatorTrait.php": "56eba5ba04a2cbb37a2a9f2783bda470", - "vendor/symfony/var-dumper/Caster/AmqpCaster.php": "dac52170cfacff94fc2f23a2bed8337b", - "vendor/symfony/var-dumper/Caster/ArgsStub.php": "fd0d2be2ea44dc847ac415bba939e459", - "vendor/symfony/var-dumper/Caster/Caster.php": "e5eb72bc06cfe97ef7059eb4246c6cd3", - "vendor/symfony/var-dumper/Caster/ClassStub.php": "4f22baa3b61015d0ef405da5f234efa7", - "vendor/symfony/var-dumper/Caster/ConstStub.php": "558e83d453fb45db4d0e6cb78d048909", - "vendor/symfony/var-dumper/Caster/CutArrayStub.php": "e63fe90d2c147bdfe5b49d232e5802c2", - "vendor/symfony/var-dumper/Caster/CutStub.php": "2660b57d81018c6a852433cc6f14e4de", - "vendor/symfony/var-dumper/Caster/DOMCaster.php": "d38f8d9a1c831c5a01fdcfce706ee698", - "vendor/symfony/var-dumper/Caster/DateCaster.php": "ba4d7e8e667ff789dc244afd4be2caae", - "vendor/symfony/var-dumper/Caster/DoctrineCaster.php": "d1e29681ae5d2d3d8438b34acda26400", - "vendor/symfony/var-dumper/Caster/DsCaster.php": "8ecdfd150c9186003948c0e77bde4d65", - "vendor/symfony/var-dumper/Caster/DsPairStub.php": "2ca049162c428310072348862cf1c166", - "vendor/symfony/var-dumper/Caster/EnumStub.php": "8162a8bcbea51bbf0126e7fbc9efa74c", - "vendor/symfony/var-dumper/Caster/ExceptionCaster.php": "528da04fd504ced0ea506df08a05c68d", - "vendor/symfony/var-dumper/Caster/FiberCaster.php": "abc8ee7a578e7830258b4e84c3766c88", - "vendor/symfony/var-dumper/Caster/FrameStub.php": "de43b4141705c1e0bbd7a1f260178a59", - "vendor/symfony/var-dumper/Caster/GmpCaster.php": "3e1e7a1691603fbee609a246b700b821", - "vendor/symfony/var-dumper/Caster/ImagineCaster.php": "988346f0df070ca18820ca48f6eecae7", - "vendor/symfony/var-dumper/Caster/ImgStub.php": "fb0d87aa22e578bf436d0f9bf52df24d", - "vendor/symfony/var-dumper/Caster/IntlCaster.php": "3b90f93e619494739d0e926b8718a2b2", - "vendor/symfony/var-dumper/Caster/LinkStub.php": "b2c090e3580b21095e4d8a50941059e9", - "vendor/symfony/var-dumper/Caster/MemcachedCaster.php": "0aa41c509ca820e0cecd4d0a446a08c6", - "vendor/symfony/var-dumper/Caster/MysqliCaster.php": "8da9c86731153e69f234cc8187e58d61", - "vendor/symfony/var-dumper/Caster/PdoCaster.php": "3978d2a8af233c7f0035ffd2a085044c", - "vendor/symfony/var-dumper/Caster/PgSqlCaster.php": "187170ef7eca284b6de27dbd11088132", - "vendor/symfony/var-dumper/Caster/ProxyManagerCaster.php": "a35495d04105d780ee8133f30640ddbe", - "vendor/symfony/var-dumper/Caster/RdKafkaCaster.php": "c1b494fe6e99b5014a506c0be75c9401", - "vendor/symfony/var-dumper/Caster/RedisCaster.php": "6719087d979ca508bd487e098dc17906", - "vendor/symfony/var-dumper/Caster/ReflectionCaster.php": "4bbce6dfafdd1b1448254fd4a8b20815", - "vendor/symfony/var-dumper/Caster/ResourceCaster.php": "ebde515935122ee6be406c3c97423236", - "vendor/symfony/var-dumper/Caster/SplCaster.php": "cbf2e63b1643d9b5551f505b570d5e83", - "vendor/symfony/var-dumper/Caster/StubCaster.php": "733546559cfb9bee2b2fe15f9394b92e", - "vendor/symfony/var-dumper/Caster/SymfonyCaster.php": "a527980cb29f3d7ad3ded7b3673018b6", - "vendor/symfony/var-dumper/Caster/TraceStub.php": "9004bd8cd5f7a7c5ee4c80ee1b1504fe", - "vendor/symfony/var-dumper/Caster/UuidCaster.php": "ec3d006aa075b21f8ba9907255c53920", - "vendor/symfony/var-dumper/Caster/XmlReaderCaster.php": "5b1b024f070e2063e1122432fd8674f1", - "vendor/symfony/var-dumper/Caster/XmlResourceCaster.php": "767f03bb155423afdc5f10b08a963cf2", - "vendor/symfony/var-dumper/Cloner/AbstractCloner.php": "7c110291b871994a570cc2e99ce7f48a", - "vendor/symfony/var-dumper/Cloner/ClonerInterface.php": "89da6b78b6877baab51ef69cf758ca8a", - "vendor/symfony/var-dumper/Cloner/Cursor.php": "7874ed318f6465a5a5ad5abbeda39cb9", - "vendor/symfony/var-dumper/Cloner/Data.php": "17776fbad05ff0f1d19841bd0863025b", - "vendor/symfony/var-dumper/Cloner/DumperInterface.php": "a1a59d0617cc8b89362e96446f7702bf", - "vendor/symfony/var-dumper/Cloner/Stub.php": "d59be2c0b34851839320b6d03fa8d8a2", - "vendor/symfony/var-dumper/Cloner/VarCloner.php": "60e67e1a27d41b34ccb47d8071a779fb", - "vendor/symfony/var-dumper/Command/Descriptor/CliDescriptor.php": "13a227822bbeb674219ec00ca58848bf", - "vendor/symfony/var-dumper/Command/Descriptor/DumpDescriptorInterface.php": "27b7b52017c03b91ff24313d94af4ea0", - "vendor/symfony/var-dumper/Command/Descriptor/HtmlDescriptor.php": "d10b0c6d435b83c45a6ee1c628154305", - "vendor/symfony/var-dumper/Command/ServerDumpCommand.php": "bdc4eb547e7455d8f178ef6b8b0e70b1", - "vendor/symfony/var-dumper/Dumper/AbstractDumper.php": "2122e708e47b4f015ee1e35854e9bada", - "vendor/symfony/var-dumper/Dumper/CliDumper.php": "52ee69d26a41a37e0968fec3b36983a2", - "vendor/symfony/var-dumper/Dumper/ContextProvider/CliContextProvider.php": "de5f1c3dddc8312b9be0f388177e97fc", - "vendor/symfony/var-dumper/Dumper/ContextProvider/ContextProviderInterface.php": "5c3ac29b06119df282c6b0d2367dd78b", - "vendor/symfony/var-dumper/Dumper/ContextProvider/RequestContextProvider.php": "0601a78ba7816406fb104f49b1429ad1", - "vendor/symfony/var-dumper/Dumper/ContextProvider/SourceContextProvider.php": "ce0fc6821dbf241faabcf8396bb83799", - "vendor/symfony/var-dumper/Dumper/ContextualizedDumper.php": "c19c5928893730e41d011fe850dc8375", - "vendor/symfony/var-dumper/Dumper/DataDumperInterface.php": "f1d68cb72334fda80249dfedf34daf12", - "vendor/symfony/var-dumper/Dumper/HtmlDumper.php": "36a62af8a129f95724edc76d34c1dc4a", - "vendor/symfony/var-dumper/Dumper/ServerDumper.php": "c6f45561ad940000741929d9e4d5281c", - "vendor/symfony/var-dumper/Exception/ThrowingCasterException.php": "d69b1df727343b643f222849160fcc84", - "vendor/symfony/var-dumper/Resources/functions/dump.php": "637f4767f6e9933756c2c924c513e076", - "vendor/symfony/var-dumper/Server/Connection.php": "d254afa0e6cafbd3886a1d0716f4eefc", - "vendor/symfony/var-dumper/Server/DumpServer.php": "fd462d69f949d871a37e9b9a1521e97e", - "vendor/symfony/var-dumper/Test/VarDumperTestTrait.php": "a0666d7989446a87d08d305bec55e149", - "vendor/symfony/var-dumper/VarDumper.php": "a23fbf53665e016bcc9797f9a7ab2980", - "vendor/symfony/var-exporter/Exception/ClassNotFoundException.php": "f062a8281608da7ab34626ac5b786b69", - "vendor/symfony/var-exporter/Exception/ExceptionInterface.php": "1444324de018b4d82076eecfd47f72e7", - "vendor/symfony/var-exporter/Exception/NotInstantiableTypeException.php": "674e46fed565fc5a21d556c2b2ba4982", - "vendor/symfony/var-exporter/Instantiator.php": "8f30da1470f17d29072d94034cdda208", - "vendor/symfony/var-exporter/Internal/Exporter.php": "3555ec40d36cf6fe89e9da3da42b19b8", - "vendor/symfony/var-exporter/Internal/Hydrator.php": "31391a973ff6c2848e93c4051a59852e", - "vendor/symfony/var-exporter/Internal/Reference.php": "eab40e8b86ada4dc6b014bf482c255a4", - "vendor/symfony/var-exporter/Internal/Registry.php": "80a5d58ddae09ac653aa5d6ddd009b41", - "vendor/symfony/var-exporter/Internal/Values.php": "a7e95df75b206a547428b0e4e721eb62", - "vendor/symfony/var-exporter/VarExporter.php": "88e80e7f9e80b0fc67cf936eae9e3e0a", - "vendor/tencentcloud/common/src/TencentCloud/Common/AbstractClient.php": "a0a8ac317e943c980a0eebceeae4f8ac", - "vendor/tencentcloud/common/src/TencentCloud/Common/AbstractModel.php": "7896f82267ff60115c196708357387e3", - "vendor/tencentcloud/common/src/TencentCloud/Common/CircuitBreaker.php": "5feb7b4736b96a43fa8274f6cd6d3b6d", - "vendor/tencentcloud/common/src/TencentCloud/Common/CommonClient.php": "d8d9683dccb3444b597ff7a85564baf4", - "vendor/tencentcloud/common/src/TencentCloud/Common/Credential.php": "a998ab21caad489a3749aef1c01594b0", - "vendor/tencentcloud/common/src/TencentCloud/Common/Exception/TencentCloudSDKException.php": "b4ac1c7dd0fae29ef211e032ef63f236", - "vendor/tencentcloud/common/src/TencentCloud/Common/Http/HttpConnection.php": "6cfdf04a134f42e6ce29b5e42fc61937", - "vendor/tencentcloud/common/src/TencentCloud/Common/Profile/ClientProfile.php": "abf69a34a5df2ab7b504a2cfbd2fdf2c", - "vendor/tencentcloud/common/src/TencentCloud/Common/Profile/HttpProfile.php": "af0d78dfa0509fce45e4cac5ba2d7d0d", - "vendor/tencentcloud/common/src/TencentCloud/Common/Sign.php": "8740162409089b1749e43972b4e026c4", - "vendor/tencentcloud/sms/src/TencentCloud/Sms/V20190711/Models/AddSignStatus.php": "e16294a079ba8ce127dea7d05e972f6d", - "vendor/tencentcloud/sms/src/TencentCloud/Sms/V20190711/Models/AddSmsSignRequest.php": "520c52c26e59d61263065c4a46cabb65", - "vendor/tencentcloud/sms/src/TencentCloud/Sms/V20190711/Models/AddSmsSignResponse.php": "d0f7d7f4b8c9b59c2dcc2fae5d3fd522", - "vendor/tencentcloud/sms/src/TencentCloud/Sms/V20190711/Models/AddSmsTemplateRequest.php": "7f4d779b1db93c02d3b794d473c7bb35", - "vendor/tencentcloud/sms/src/TencentCloud/Sms/V20190711/Models/AddSmsTemplateResponse.php": "dac1ba33f94cb9e931e78a3c94663106", - "vendor/tencentcloud/sms/src/TencentCloud/Sms/V20190711/Models/AddTemplateStatus.php": "6507b7be2e8b7bbb87201e564d785b1a", - "vendor/tencentcloud/sms/src/TencentCloud/Sms/V20190711/Models/CallbackStatusStatistics.php": "ed4314aaf469eef67e03e680f57e6967", - "vendor/tencentcloud/sms/src/TencentCloud/Sms/V20190711/Models/CallbackStatusStatisticsRequest.php": "837e269c68b8d96ed02db9e506e2c926", - "vendor/tencentcloud/sms/src/TencentCloud/Sms/V20190711/Models/CallbackStatusStatisticsResponse.php": "8127fcb4e1c052655b3ae91f3684d8cf", - "vendor/tencentcloud/sms/src/TencentCloud/Sms/V20190711/Models/DeleteSignStatus.php": "792d5e4100b8cd74beb7202bf1f4d650", - "vendor/tencentcloud/sms/src/TencentCloud/Sms/V20190711/Models/DeleteSmsSignRequest.php": "73980cfcb710d30720c3d57e4a8ae87f", - "vendor/tencentcloud/sms/src/TencentCloud/Sms/V20190711/Models/DeleteSmsSignResponse.php": "e1b4df541c193801be9d481b92f8f751", - "vendor/tencentcloud/sms/src/TencentCloud/Sms/V20190711/Models/DeleteSmsTemplateRequest.php": "5aa6e50d834a3c9a450fea70df9a4196", - "vendor/tencentcloud/sms/src/TencentCloud/Sms/V20190711/Models/DeleteSmsTemplateResponse.php": "290a540d0000aef12ab3229f5e088d54", - "vendor/tencentcloud/sms/src/TencentCloud/Sms/V20190711/Models/DeleteTemplateStatus.php": "82e92b73ba24c6284b1126fd912f76e3", - "vendor/tencentcloud/sms/src/TencentCloud/Sms/V20190711/Models/DescribeSignListStatus.php": "35025ccf950b6f4c3d64acae52afa03c", - "vendor/tencentcloud/sms/src/TencentCloud/Sms/V20190711/Models/DescribeSmsSignListRequest.php": "d998192b5b3a31fc0904504eee437385", - "vendor/tencentcloud/sms/src/TencentCloud/Sms/V20190711/Models/DescribeSmsSignListResponse.php": "5712ad684278d6bf91bb4d86d156fd72", - "vendor/tencentcloud/sms/src/TencentCloud/Sms/V20190711/Models/DescribeSmsTemplateListRequest.php": "85a2ca11da52db163d303b3eb70dbb83", - "vendor/tencentcloud/sms/src/TencentCloud/Sms/V20190711/Models/DescribeSmsTemplateListResponse.php": "606b2fc46eb0aa8a3d23ff5893ee76ab", - "vendor/tencentcloud/sms/src/TencentCloud/Sms/V20190711/Models/DescribeTemplateListStatus.php": "9387f7c6570fb4fc54de248725feef7a", - "vendor/tencentcloud/sms/src/TencentCloud/Sms/V20190711/Models/ModifySignStatus.php": "f37f4b896a9fc7adf0459849326e10f7", - "vendor/tencentcloud/sms/src/TencentCloud/Sms/V20190711/Models/ModifySmsSignRequest.php": "b4bc0cf30e245d9d4a1611834a88580d", - "vendor/tencentcloud/sms/src/TencentCloud/Sms/V20190711/Models/ModifySmsSignResponse.php": "22c0ef68dc392bac19b78c6de52a96f4", - "vendor/tencentcloud/sms/src/TencentCloud/Sms/V20190711/Models/ModifySmsTemplateRequest.php": "d987b29234a6ffc7cc58975992760303", - "vendor/tencentcloud/sms/src/TencentCloud/Sms/V20190711/Models/ModifySmsTemplateResponse.php": "1d985e6e6a476aa120f4c6f9dc5e68aa", - "vendor/tencentcloud/sms/src/TencentCloud/Sms/V20190711/Models/ModifyTemplateStatus.php": "e7ba2b0dc1e4f88e979be99a090029d4", - "vendor/tencentcloud/sms/src/TencentCloud/Sms/V20190711/Models/PullSmsReplyStatus.php": "8aa0098e3b836ceec779b53b7ed8724b", - "vendor/tencentcloud/sms/src/TencentCloud/Sms/V20190711/Models/PullSmsReplyStatusByPhoneNumberRequest.php": "f8d7d39dbbd6022229dcf7b093c07774", - "vendor/tencentcloud/sms/src/TencentCloud/Sms/V20190711/Models/PullSmsReplyStatusByPhoneNumberResponse.php": "9c30da0d8ba4fbfadac75fdd5a5a8451", - "vendor/tencentcloud/sms/src/TencentCloud/Sms/V20190711/Models/PullSmsReplyStatusRequest.php": "95a96d6ac3e838c21c682ff921cca7d7", - "vendor/tencentcloud/sms/src/TencentCloud/Sms/V20190711/Models/PullSmsReplyStatusResponse.php": "8f1526f5bbd0ceba09262d4afc359159", - "vendor/tencentcloud/sms/src/TencentCloud/Sms/V20190711/Models/PullSmsSendStatus.php": "f10b4d12c09086d5e55e11160fce9788", - "vendor/tencentcloud/sms/src/TencentCloud/Sms/V20190711/Models/PullSmsSendStatusByPhoneNumberRequest.php": "5e380fa0b28d7e357db07f3040b13345", - "vendor/tencentcloud/sms/src/TencentCloud/Sms/V20190711/Models/PullSmsSendStatusByPhoneNumberResponse.php": "f1d90c906603cff2c0c3b1bf0758ef0c", - "vendor/tencentcloud/sms/src/TencentCloud/Sms/V20190711/Models/PullSmsSendStatusRequest.php": "1925e8e3d5a86713af5cf7a203936ecf", - "vendor/tencentcloud/sms/src/TencentCloud/Sms/V20190711/Models/PullSmsSendStatusResponse.php": "c972ff9e9be991f80fb92ca721c12917", - "vendor/tencentcloud/sms/src/TencentCloud/Sms/V20190711/Models/SendSmsRequest.php": "375f3fe875b7cd7c3131fef57479bc67", - "vendor/tencentcloud/sms/src/TencentCloud/Sms/V20190711/Models/SendSmsResponse.php": "472a5829db048344a0fc762725613eec", - "vendor/tencentcloud/sms/src/TencentCloud/Sms/V20190711/Models/SendStatus.php": "84212bd78192ca117750ec9a86411fd7", - "vendor/tencentcloud/sms/src/TencentCloud/Sms/V20190711/Models/SendStatusStatistics.php": "e90f6b40e8f798f84ffe078c6bdea3c8", - "vendor/tencentcloud/sms/src/TencentCloud/Sms/V20190711/Models/SendStatusStatisticsRequest.php": "db75ac664c9f1265b1ca71dcee2a17c4", - "vendor/tencentcloud/sms/src/TencentCloud/Sms/V20190711/Models/SendStatusStatisticsResponse.php": "1babc2c40788157c4b798e3015141088", - "vendor/tencentcloud/sms/src/TencentCloud/Sms/V20190711/Models/SmsPackagesStatistics.php": "ff15f4a5c96c0b77dc0b247be8fc7b6c", - "vendor/tencentcloud/sms/src/TencentCloud/Sms/V20190711/Models/SmsPackagesStatisticsRequest.php": "85a395d8f6e232df47e62233ab43ea88", - "vendor/tencentcloud/sms/src/TencentCloud/Sms/V20190711/Models/SmsPackagesStatisticsResponse.php": "61445d181249585463290368498499c9", - "vendor/tencentcloud/sms/src/TencentCloud/Sms/V20190711/SmsClient.php": "76031853b154258bc4c5bdefda53e988", - "vendor/tencentcloud/sms/src/TencentCloud/Sms/V20210111/Models/AddSignStatus.php": "894777273e42d8e89134b1ecadfc019f", - "vendor/tencentcloud/sms/src/TencentCloud/Sms/V20210111/Models/AddSmsSignRequest.php": "46e25c9347519690a55659af57a0606b", - "vendor/tencentcloud/sms/src/TencentCloud/Sms/V20210111/Models/AddSmsSignResponse.php": "7b1947ba66b8115790a74bb754ea59c6", - "vendor/tencentcloud/sms/src/TencentCloud/Sms/V20210111/Models/AddSmsTemplateRequest.php": "7725d57fcfe1c91d1e846f3c3054ebfd", - "vendor/tencentcloud/sms/src/TencentCloud/Sms/V20210111/Models/AddSmsTemplateResponse.php": "54cda8d3b2a989d21560db706ccbc3cf", - "vendor/tencentcloud/sms/src/TencentCloud/Sms/V20210111/Models/AddTemplateStatus.php": "fc5a33236fb7064e15f0f3cc2f430523", - "vendor/tencentcloud/sms/src/TencentCloud/Sms/V20210111/Models/CallbackStatusStatistics.php": "74ba98056c2bc238cbb94fe2fbcc5abc", - "vendor/tencentcloud/sms/src/TencentCloud/Sms/V20210111/Models/CallbackStatusStatisticsRequest.php": "fa52db5e81cac79ef6221b46b364bf8b", - "vendor/tencentcloud/sms/src/TencentCloud/Sms/V20210111/Models/CallbackStatusStatisticsResponse.php": "7ecd65c41dd4b5a6edbd9230c601bc09", - "vendor/tencentcloud/sms/src/TencentCloud/Sms/V20210111/Models/DeleteSignStatus.php": "84f8efd480e17c857bc604ea19cbd071", - "vendor/tencentcloud/sms/src/TencentCloud/Sms/V20210111/Models/DeleteSmsSignRequest.php": "c5a1aa9a1ba87fc2b7eaee0b2a4c1197", - "vendor/tencentcloud/sms/src/TencentCloud/Sms/V20210111/Models/DeleteSmsSignResponse.php": "fc6539526b9bc28de404b363ae4df7fc", - "vendor/tencentcloud/sms/src/TencentCloud/Sms/V20210111/Models/DeleteSmsTemplateRequest.php": "bf809efba0f43f7fc658040abfb13dd0", - "vendor/tencentcloud/sms/src/TencentCloud/Sms/V20210111/Models/DeleteSmsTemplateResponse.php": "36679dee70ef1ac535b40547b25fc2df", - "vendor/tencentcloud/sms/src/TencentCloud/Sms/V20210111/Models/DeleteTemplateStatus.php": "cfb079eb442893a73b3a0f17a8215fcf", - "vendor/tencentcloud/sms/src/TencentCloud/Sms/V20210111/Models/DescribePhoneNumberInfoRequest.php": "4ff56370002bd810b516ea5b120eed03", - "vendor/tencentcloud/sms/src/TencentCloud/Sms/V20210111/Models/DescribePhoneNumberInfoResponse.php": "60efd2d7c4c85c2e9a4be40df038f0b0", - "vendor/tencentcloud/sms/src/TencentCloud/Sms/V20210111/Models/DescribeSignListStatus.php": "742769cd11bf49c06fdf9d6c9fdde9a6", - "vendor/tencentcloud/sms/src/TencentCloud/Sms/V20210111/Models/DescribeSmsSignListRequest.php": "69e999bab464ada298c139341113ffb9", - "vendor/tencentcloud/sms/src/TencentCloud/Sms/V20210111/Models/DescribeSmsSignListResponse.php": "4e826c2f7b33ff75a227a35be53e2267", - "vendor/tencentcloud/sms/src/TencentCloud/Sms/V20210111/Models/DescribeSmsTemplateListRequest.php": "521773ed379cedcfe2026c85b58da155", - "vendor/tencentcloud/sms/src/TencentCloud/Sms/V20210111/Models/DescribeSmsTemplateListResponse.php": "b96bb9cbcc6b3632c2eb87614ebbd011", - "vendor/tencentcloud/sms/src/TencentCloud/Sms/V20210111/Models/DescribeTemplateListStatus.php": "15129bb98d4f6cc5c09b2243a38e7eb4", - "vendor/tencentcloud/sms/src/TencentCloud/Sms/V20210111/Models/ModifySignStatus.php": "139dc12fc90098dd1b87474961fcdea6", - "vendor/tencentcloud/sms/src/TencentCloud/Sms/V20210111/Models/ModifySmsSignRequest.php": "832fbec56b3c1d4687af9974ea98a8d3", - "vendor/tencentcloud/sms/src/TencentCloud/Sms/V20210111/Models/ModifySmsSignResponse.php": "0996bb52b7160a1bb27c792ee43d2d49", - "vendor/tencentcloud/sms/src/TencentCloud/Sms/V20210111/Models/ModifySmsTemplateRequest.php": "257fd09561db547c25ae92fa7dc91fd0", - "vendor/tencentcloud/sms/src/TencentCloud/Sms/V20210111/Models/ModifySmsTemplateResponse.php": "7b6bcfaa3383bb6c086b665c53ed5182", - "vendor/tencentcloud/sms/src/TencentCloud/Sms/V20210111/Models/ModifyTemplateStatus.php": "261f99cb9fc5174e96c6bcac53a8707f", - "vendor/tencentcloud/sms/src/TencentCloud/Sms/V20210111/Models/PhoneNumberInfo.php": "75b3d1929d06a8b7e2bdba12010b6d76", - "vendor/tencentcloud/sms/src/TencentCloud/Sms/V20210111/Models/PullSmsReplyStatus.php": "a669f4d1bdf81d645dd54897dc18cf9e", - "vendor/tencentcloud/sms/src/TencentCloud/Sms/V20210111/Models/PullSmsReplyStatusByPhoneNumberRequest.php": "ed470fd2867a6b21694298f2b7d2195b", - "vendor/tencentcloud/sms/src/TencentCloud/Sms/V20210111/Models/PullSmsReplyStatusByPhoneNumberResponse.php": "04b84d3ee7bd3eb1a87449c0ec2f2fda", - "vendor/tencentcloud/sms/src/TencentCloud/Sms/V20210111/Models/PullSmsReplyStatusRequest.php": "ab3a6bcf3bac988c4579d19e3561a595", - "vendor/tencentcloud/sms/src/TencentCloud/Sms/V20210111/Models/PullSmsReplyStatusResponse.php": "3af95e3b0409cd23c5c97c20becc4368", - "vendor/tencentcloud/sms/src/TencentCloud/Sms/V20210111/Models/PullSmsSendStatus.php": "25259f27d79eeaa662e264ae7b8ff105", - "vendor/tencentcloud/sms/src/TencentCloud/Sms/V20210111/Models/PullSmsSendStatusByPhoneNumberRequest.php": "b6dc312da6aef2ff1905b9b9e55d47be", - "vendor/tencentcloud/sms/src/TencentCloud/Sms/V20210111/Models/PullSmsSendStatusByPhoneNumberResponse.php": "26b5dd330c113d52af6fa3ffb508d6b3", - "vendor/tencentcloud/sms/src/TencentCloud/Sms/V20210111/Models/PullSmsSendStatusRequest.php": "d5ff1fa98c2e99795c1ca5c21b414641", - "vendor/tencentcloud/sms/src/TencentCloud/Sms/V20210111/Models/PullSmsSendStatusResponse.php": "7c371b12cf243b64c3c29c7aac81beaf", - "vendor/tencentcloud/sms/src/TencentCloud/Sms/V20210111/Models/ReportConversionRequest.php": "bd98c06893c0083e5d40687f4da931dc", - "vendor/tencentcloud/sms/src/TencentCloud/Sms/V20210111/Models/ReportConversionResponse.php": "1d23c5901a8f11273a1b2345e8143657", - "vendor/tencentcloud/sms/src/TencentCloud/Sms/V20210111/Models/ReportConversionStatus.php": "ebc81c41094be36475ea83f03863759c", - "vendor/tencentcloud/sms/src/TencentCloud/Sms/V20210111/Models/SendSmsRequest.php": "1dafd06e123dc168d2935e4ceb3e61f8", - "vendor/tencentcloud/sms/src/TencentCloud/Sms/V20210111/Models/SendSmsResponse.php": "680c68fc5951349d81d6396956fdc778", - "vendor/tencentcloud/sms/src/TencentCloud/Sms/V20210111/Models/SendStatus.php": "db2862d675cc324da3168d23c41b08af", - "vendor/tencentcloud/sms/src/TencentCloud/Sms/V20210111/Models/SendStatusStatistics.php": "6a653f67d2c26b8df70264bed95fb506", - "vendor/tencentcloud/sms/src/TencentCloud/Sms/V20210111/Models/SendStatusStatisticsRequest.php": "8943c5a09b63c8dbf5206e555e848b86", - "vendor/tencentcloud/sms/src/TencentCloud/Sms/V20210111/Models/SendStatusStatisticsResponse.php": "292ae08dd00c14349fea9926b28becad", - "vendor/tencentcloud/sms/src/TencentCloud/Sms/V20210111/Models/SmsPackagesStatistics.php": "016335372b010d2b6a89afda4ee63cda", - "vendor/tencentcloud/sms/src/TencentCloud/Sms/V20210111/Models/SmsPackagesStatisticsRequest.php": "69220942c7bb09f4dfcdb346f78bf84a", - "vendor/tencentcloud/sms/src/TencentCloud/Sms/V20210111/Models/SmsPackagesStatisticsResponse.php": "6faa48f4ccf3a74ba66535b279fa784e", - "vendor/tencentcloud/sms/src/TencentCloud/Sms/V20210111/SmsClient.php": "e54184c96bc0f817899542ac9505a449", - "vendor/topthink/framework/src/helper.php": "53b89fdd8d53c710ebf0bb2ccea855a5", - "vendor/topthink/framework/src/lang/zh-cn.php": "26a983f14e6e4d5aaf60b70c05084c98", - "vendor/topthink/framework/src/think/App.php": "1dffe74b3dbfc70bd4964ac6e407a04d", - "vendor/topthink/framework/src/think/Cache.php": "211dc6150d630866c1efbf670fd3cd3f", - "vendor/topthink/framework/src/think/Config.php": "e0010a4b27a18e1a72e8447870413aa7", - "vendor/topthink/framework/src/think/Console.php": "216412daa627b787b490c84db88d3d3d", - "vendor/topthink/framework/src/think/Container.php": "e73615e69038ab7a6b2c5e7e559828b1", - "vendor/topthink/framework/src/think/Cookie.php": "f8233eccbc1c2c3c11aeedd886b12d8d", - "vendor/topthink/framework/src/think/Db.php": "1eca5fbedfdd86bc0578df46cdfdaabf", - "vendor/topthink/framework/src/think/Env.php": "d89f4e0b2e89ca58bc6109836ec906dd", - "vendor/topthink/framework/src/think/Event.php": "f8b5467cfb77766d1496e73d9c2dca5e", - "vendor/topthink/framework/src/think/Exception.php": "c008b9bc85fbabe602ef8d0b655636df", - "vendor/topthink/framework/src/think/Facade.php": "d5fabd5fca4680a25b942e72cffffcd2", - "vendor/topthink/framework/src/think/File.php": "ae08e51d134fefbbe5c8c9c95ff53f6e", - "vendor/topthink/framework/src/think/Http.php": "8a88798ccfcfce1b0751063b1d8fbbbe", - "vendor/topthink/framework/src/think/Lang.php": "5dfaf1cd264bfa1239d44636ee43cf62", - "vendor/topthink/framework/src/think/Log.php": "561c437f42d772d125cd905d9db38c55", - "vendor/topthink/framework/src/think/Manager.php": "0245bbfbe0d0b024f9fdf9715f76fc98", - "vendor/topthink/framework/src/think/Middleware.php": "7a228bea201e891e4c861bcb1b1bbb56", - "vendor/topthink/framework/src/think/Pipeline.php": "f3191b6092b44915075ca0349d5d1345", - "vendor/topthink/framework/src/think/Request.php": "b0b256b7dd37563cd0cfce884520acb7", - "vendor/topthink/framework/src/think/Response.php": "4b0f0b24ef1931590dd2c62f69f4fcbe", - "vendor/topthink/framework/src/think/Route.php": "fb07783d90e1a7035813e157d191f5ad", - "vendor/topthink/framework/src/think/Service.php": "d05b7f631521c82c80ae6e1b368a3e05", - "vendor/topthink/framework/src/think/Session.php": "0fe3fef8679e59092c7bbeea88d61ced", - "vendor/topthink/framework/src/think/Validate.php": "7d22b649464e655a8f35bd52b79ccf5a", - "vendor/topthink/framework/src/think/View.php": "b83aca171b9443c15e792706344afcfd", - "vendor/topthink/framework/src/think/cache/Driver.php": "ad97d2cf14c854ae916de0e7a63ad1e4", - "vendor/topthink/framework/src/think/cache/TagSet.php": "c19f92f38e940f67cf6eb4b872d8593a", - "vendor/topthink/framework/src/think/cache/driver/File.php": "97b102b513d5f677a6bd070fcad86eb1", - "vendor/topthink/framework/src/think/cache/driver/Memcache.php": "f18221ada25ca0b581728d5a0b3364f6", - "vendor/topthink/framework/src/think/cache/driver/Memcached.php": "f1a2d027c8b165b6d5f1cc5b5593991f", - "vendor/topthink/framework/src/think/cache/driver/Redis.php": "0c29e3e0a481fffdb2552dd7270def55", - "vendor/topthink/framework/src/think/cache/driver/Wincache.php": "e80306d1137ca19e0700e9b8fa4bab1b", - "vendor/topthink/framework/src/think/console/Command.php": "b96f7951a29bf6f238dcf1f4051a7fcb", - "vendor/topthink/framework/src/think/console/Input.php": "1b3615c278073997285fd7a9468fe674", - "vendor/topthink/framework/src/think/console/Output.php": "d57c39f79f8712da7930f8cd369ddd92", - "vendor/topthink/framework/src/think/console/Table.php": "7b236ebaa14d28e5cfdcee726c19ec82", - "vendor/topthink/framework/src/think/console/command/Clear.php": "c3418bfd6dd81d7a32072e835dae3e78", - "vendor/topthink/framework/src/think/console/command/Help.php": "82b74edc7ca7eaae4bd65b5b50e5f6bf", - "vendor/topthink/framework/src/think/console/command/Lists.php": "1b0b56208807921bfb83bc629b9e6b60", - "vendor/topthink/framework/src/think/console/command/Make.php": "7c04e0b1cc2030da0cd683e8e512c2fe", - "vendor/topthink/framework/src/think/console/command/RouteList.php": "f652a4545a49fbb4535bbf99602221d6", - "vendor/topthink/framework/src/think/console/command/RunServer.php": "f54f1bccc0e765385b58754bc7b4ca90", - "vendor/topthink/framework/src/think/console/command/ServiceDiscover.php": "a7e8d5afbbf24e960ccdeb152218a1a3", - "vendor/topthink/framework/src/think/console/command/VendorPublish.php": "73240901d47b43421d6db09d789adb4f", - "vendor/topthink/framework/src/think/console/command/Version.php": "f745ebb1fd33e6185c5a3e629280e082", - "vendor/topthink/framework/src/think/console/command/make/Command.php": "f9734a57bfbdd21fbfcb94d4a234718a", - "vendor/topthink/framework/src/think/console/command/make/Controller.php": "915f0847fe34e0c5f2472b067878f97f", - "vendor/topthink/framework/src/think/console/command/make/Event.php": "7b627187949f67f06023bfe56c7abc08", - "vendor/topthink/framework/src/think/console/command/make/Listener.php": "f104695e5b3af66edbc6eef03a273db7", - "vendor/topthink/framework/src/think/console/command/make/Middleware.php": "97c35df47c542b2df4bc2ad3bb47acc3", - "vendor/topthink/framework/src/think/console/command/make/Model.php": "593d5903b7fa0cd4dc93f7ac0087a4ba", - "vendor/topthink/framework/src/think/console/command/make/Service.php": "cc9e7d60d7ec5e1e76e2f17468d7a4f9", - "vendor/topthink/framework/src/think/console/command/make/Subscribe.php": "e1905b1df69b88fcc4df2ac41ecf5138", - "vendor/topthink/framework/src/think/console/command/make/Validate.php": "2241d4ebd64ff2566ca5be6e4e430882", - "vendor/topthink/framework/src/think/console/command/optimize/Route.php": "1528387336af41a9a2736e40f7c934e7", - "vendor/topthink/framework/src/think/console/command/optimize/Schema.php": "859c557c0023890938c686f82175f1f5", - "vendor/topthink/framework/src/think/console/input/Argument.php": "2bb9cb4d97e4276120aac3df5f7348d7", - "vendor/topthink/framework/src/think/console/input/Definition.php": "0b027892c711a8ab87d9a880c1ce965a", - "vendor/topthink/framework/src/think/console/input/Option.php": "c4770b0005ee16f9fdb45163a6923c4c", - "vendor/topthink/framework/src/think/console/output/Ask.php": "accf86acad100e55c7953fb1f482b4cd", - "vendor/topthink/framework/src/think/console/output/Descriptor.php": "f5c0d8daa8252f6ded88cab6cbd1ed29", - "vendor/topthink/framework/src/think/console/output/Formatter.php": "b509678f786ef21f27ccdd4679e0ba0d", - "vendor/topthink/framework/src/think/console/output/Question.php": "c53784a63e7316b94f011206d4cf6104", - "vendor/topthink/framework/src/think/console/output/descriptor/Console.php": "32e03fcd27c5f38c9556b1b4156386ee", - "vendor/topthink/framework/src/think/console/output/driver/Buffer.php": "376c65197e1662b9b5b4d176199e11d2", - "vendor/topthink/framework/src/think/console/output/driver/Console.php": "e44d399f4fd0109bc33d454aa9430c17", - "vendor/topthink/framework/src/think/console/output/driver/Nothing.php": "7d57a87bb750ac51369f3ae2c4885c87", - "vendor/topthink/framework/src/think/console/output/formatter/Stack.php": "77e06e4a1cda6c5903838ceb00d1e391", - "vendor/topthink/framework/src/think/console/output/formatter/Style.php": "b9f39a1fe8926d325c29e1452cf07f23", - "vendor/topthink/framework/src/think/console/output/question/Choice.php": "2b4e3e3a6cd0a508d6d1de2abec00d7d", - "vendor/topthink/framework/src/think/console/output/question/Confirmation.php": "0485fccd74c9c07cbc038faa0a9ec31b", - "vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php": "1231fd914623a3a7143c5d78ee679dbd", - "vendor/topthink/framework/src/think/contract/LogHandlerInterface.php": "f0d0c84a5163f779a285cbd209b61096", - "vendor/topthink/framework/src/think/contract/ModelRelationInterface.php": "aec747e70cf5c49df0ea408dc2db872a", - "vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php": "e0a5eafb056017ace2ce9caa5b95f9fc", - "vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php": "2bedfe66dea718bc04a1c14eaa406196", - "vendor/topthink/framework/src/think/event/AppInit.php": "984ff336e7922e78f6c9902f7c62ff33", - "vendor/topthink/framework/src/think/event/HttpEnd.php": "78ec175db9222f50446751b0021d3a87", - "vendor/topthink/framework/src/think/event/HttpRun.php": "bbf740cb9a8d1dc8cfd555fc1b9252e1", - "vendor/topthink/framework/src/think/event/LogRecord.php": "71741dd09a38d61fd5bf8230ee053463", - "vendor/topthink/framework/src/think/event/LogWrite.php": "e5198270973d0f5d936fae751d71e47e", - "vendor/topthink/framework/src/think/event/RouteLoaded.php": "377b4ae62e65ed93212314038065a027", - "vendor/topthink/framework/src/think/exception/ClassNotFoundException.php": "7d71209bba79044940bb77f92274d012", - "vendor/topthink/framework/src/think/exception/ErrorException.php": "72d9e6827d2fc863e2662b1085b854bc", - "vendor/topthink/framework/src/think/exception/FileException.php": "289028443b73a7c21c035b59ace84e93", - "vendor/topthink/framework/src/think/exception/FuncNotFoundException.php": "bec6091084570edd0ec8253071b4cbd7", - "vendor/topthink/framework/src/think/exception/Handle.php": "c4284304e0715419dac355dfbcf0b5dd", - "vendor/topthink/framework/src/think/exception/HttpException.php": "49cfc8ce07b636497a8636325cbae0e1", - "vendor/topthink/framework/src/think/exception/HttpResponseException.php": "db1cc63161ae3055f9edc878f2a2df27", - "vendor/topthink/framework/src/think/exception/InvalidArgumentException.php": "aabaec0f6be2a666706f48e87d8452c2", - "vendor/topthink/framework/src/think/exception/RouteNotFoundException.php": "6ff3cddcc511d9ab18c266c4e708ce8c", - "vendor/topthink/framework/src/think/exception/ValidateException.php": "9dce1db5853b3f952fbfcb9f0201c26c", - "vendor/topthink/framework/src/think/facade/App.php": "c1b382b52a683011b3e7871c0abf9cc7", - "vendor/topthink/framework/src/think/facade/Cache.php": "44c725cc6c0112322afecaa0375faef2", - "vendor/topthink/framework/src/think/facade/Config.php": "cc125e093778de1c3394608b96f2ffa3", - "vendor/topthink/framework/src/think/facade/Console.php": "205e762aa9aee62b66dba1fd5c96cfab", - "vendor/topthink/framework/src/think/facade/Cookie.php": "c0bc7c7f2d566f6be8790328db1a6cd6", - "vendor/topthink/framework/src/think/facade/Env.php": "8c4fd4c24dd9a1e2fc75c62d3615d3a6", - "vendor/topthink/framework/src/think/facade/Event.php": "3fc5df66461cb689e782d191c8265c74", - "vendor/topthink/framework/src/think/facade/Lang.php": "94521eca0e3afcdae86d50b18a198f4e", - "vendor/topthink/framework/src/think/facade/Log.php": "573a214d703ac95a144c92306b99bef0", - "vendor/topthink/framework/src/think/facade/Middleware.php": "46453319a51d45ec16bb25d1f4ec4cde", - "vendor/topthink/framework/src/think/facade/Request.php": "31ff27e3bca0b25251ab4b4aa0434f42", - "vendor/topthink/framework/src/think/facade/Route.php": "903c421ef43ed77b983572687c8c462a", - "vendor/topthink/framework/src/think/facade/Session.php": "5bdcd25fe35a9691575a6e6e883fa2c7", - "vendor/topthink/framework/src/think/facade/Validate.php": "9506936cdde393358af172df1a4494c6", - "vendor/topthink/framework/src/think/facade/View.php": "20d6d9770b561e66c9fbec90f94f3163", - "vendor/topthink/framework/src/think/file/UploadedFile.php": "5e41f3666c7f78689f5fa0fd438eb599", - "vendor/topthink/framework/src/think/initializer/BootService.php": "9a1ae4f05aff4f20c602356406eb8063", - "vendor/topthink/framework/src/think/initializer/Error.php": "15b26b9ae116cedc26daf5153e6a1d15", - "vendor/topthink/framework/src/think/initializer/RegisterService.php": "4568ae65cb6b4d8555146ea74475e823", - "vendor/topthink/framework/src/think/log/Channel.php": "31fc7252cf0827ceaa6173d7f5a9346a", - "vendor/topthink/framework/src/think/log/ChannelSet.php": "81f1588bfe39bd00e30e9f81f38b4c85", - "vendor/topthink/framework/src/think/log/driver/File.php": "6e74b9dd867266143ca20ef2e6ed9154", - "vendor/topthink/framework/src/think/log/driver/Socket.php": "6617287fd1f57e0b889e3877cc80ece0", - "vendor/topthink/framework/src/think/middleware/AllowCrossDomain.php": "900d5e0009f56ad6b113f28e13f53271", - "vendor/topthink/framework/src/think/middleware/CheckRequestCache.php": "5636c8702e9b1f0a90f36870a5a019ae", - "vendor/topthink/framework/src/think/middleware/FormTokenCheck.php": "ed1d72653a1f39187760090e5072c45c", - "vendor/topthink/framework/src/think/middleware/LoadLangPack.php": "2ed3d85ecc69a5332bd73c15c5d27697", - "vendor/topthink/framework/src/think/middleware/SessionInit.php": "bc94b6d58372edecd6f7e6d6c312c73c", - "vendor/topthink/framework/src/think/response/File.php": "5dfc396e8da7fcd15b2711a9c5812683", - "vendor/topthink/framework/src/think/response/Html.php": "be925634e184840d85cb75f07e1106cb", - "vendor/topthink/framework/src/think/response/Json.php": "6ac335f14d09ccf98f9dbbd8a8f8dfec", - "vendor/topthink/framework/src/think/response/Jsonp.php": "b5d4a5862d73feea5f99704304de8286", - "vendor/topthink/framework/src/think/response/Redirect.php": "6e6b791afd18f4f31ee0b08e5217a60c", - "vendor/topthink/framework/src/think/response/View.php": "8d078e918c22763a6e2eb5bf1703e44a", - "vendor/topthink/framework/src/think/response/Xml.php": "11dd96760c15e5285425a892c40334fe", - "vendor/topthink/framework/src/think/route/Dispatch.php": "8560a2ad478c71f4debc9395970b1ea5", - "vendor/topthink/framework/src/think/route/Domain.php": "34bab0e43cf6cde75ade53566905162e", - "vendor/topthink/framework/src/think/route/Resource.php": "e260b88ec77f9757b1d924d57cf96899", - "vendor/topthink/framework/src/think/route/ResourceRegister.php": "42ca7b8351c6c4133e67c1ff8edc80aa", - "vendor/topthink/framework/src/think/route/Rule.php": "5e76772ff72d02a2a5c033378a11de7f", - "vendor/topthink/framework/src/think/route/RuleGroup.php": "8a5a2920d319e1c9b088268739f839bb", - "vendor/topthink/framework/src/think/route/RuleItem.php": "fa5f60b4599ea7d6f97056cd773ed788", - "vendor/topthink/framework/src/think/route/RuleName.php": "bc685717958f739bc2a09f6c04419c3f", - "vendor/topthink/framework/src/think/route/Url.php": "8eb9e54bfca0d4bbfd5fd8a46a756e13", - "vendor/topthink/framework/src/think/route/dispatch/Callback.php": "77515c5555ef77513c407247657d43cc", - "vendor/topthink/framework/src/think/route/dispatch/Controller.php": "5c9a846475d254814585395b19e28eef", - "vendor/topthink/framework/src/think/route/dispatch/Url.php": "96f2faa4ec868e91a666391c5219c9e9", - "vendor/topthink/framework/src/think/service/ModelService.php": "d246947f72194bc4258795cf41f942bc", - "vendor/topthink/framework/src/think/service/PaginatorService.php": "be712b627f3f8951861dff190b7969a1", - "vendor/topthink/framework/src/think/service/ValidateService.php": "3beaaf71b0681724c8753bb13a890880", - "vendor/topthink/framework/src/think/session/Store.php": "d241395fc5c7d470fbf3f8a33d1e8e79", - "vendor/topthink/framework/src/think/session/driver/Cache.php": "15d31d477b182f0713b76b1259a6097b", - "vendor/topthink/framework/src/think/session/driver/File.php": "7acce54b119bb41773d7ac62e8d629f6", - "vendor/topthink/framework/src/think/validate/ValidateRule.php": "c2b5c37fb9187186ebdb94a1ba4094af", - "vendor/topthink/framework/src/think/view/driver/Php.php": "9bc5efeea5eb04aa88e6152d0b360f76", - "vendor/topthink/framework/tests/AppTest.php": "bacd307ce362c25d304b1a8ce4f4cf58", - "vendor/topthink/framework/tests/CacheTest.php": "e012966d1df411d2124e27714753f170", - "vendor/topthink/framework/tests/ConfigTest.php": "5ed5b5a2fcea0e32e442e619baaae37a", - "vendor/topthink/framework/tests/ContainerTest.php": "2f5456fc7e1a9e7f501997892d08f9dd", - "vendor/topthink/framework/tests/DbTest.php": "08c3b4de13a27cd83607197592fd35cf", - "vendor/topthink/framework/tests/DispatchTest.php": "1d937bded343da402792066ba12d66a0", - "vendor/topthink/framework/tests/EnvTest.php": "df41f0ab201b2c73251664d728a443dd", - "vendor/topthink/framework/tests/EventTest.php": "3f8d7bd5748505841de51d01e64a218b", - "vendor/topthink/framework/tests/HttpTest.php": "34d4effe3dfc0c78396bff9d59a5a4d4", - "vendor/topthink/framework/tests/InteractsWithApp.php": "b2dfeae536b3acdf3d4c3204c5d1b666", - "vendor/topthink/framework/tests/LogTest.php": "0dccec2379be413187d1ba1cd6c619a1", - "vendor/topthink/framework/tests/MiddlewareTest.php": "61a9573ae5b84e653d1e19ee1df1dcc2", - "vendor/topthink/framework/tests/RouteTest.php": "7326b51926d67b825982ff80b626d556", - "vendor/topthink/framework/tests/SessionTest.php": "32611a50730809619aedfdcc08c7c704", - "vendor/topthink/framework/tests/UrlRouteTest.php": "6690e73dae68fddd94f0ea4eae0f4b7b", - "vendor/topthink/framework/tests/ViewTest.php": "b06327b4d7b6d93e2f62e12bf1661390", - "vendor/topthink/framework/tests/bootstrap.php": "dede2d38ac5a0a67bb13a035c5faba43", - "vendor/topthink/think-captcha/src/Captcha.php": "1ed5a35e2168467cfa10d6652083d47a", - "vendor/topthink/think-captcha/src/CaptchaController.php": "b41ca5b85bd0ad1fcb839dfd36909d54", - "vendor/topthink/think-captcha/src/CaptchaService.php": "fb7bd8119bd57bd6cddf77a0196eed1b", - "vendor/topthink/think-captcha/src/config.php": "e9cd068a020e5074527a99059e613b3b", - "vendor/topthink/think-captcha/src/facade/Captcha.php": "3848854ffe9761c5d44d682cabc808dc", - "vendor/topthink/think-captcha/src/helper.php": "e89a4035d459e580d61815f7319128cf", - "vendor/topthink/think-filesystem/src/Filesystem.php": "473f84bee756cd8bb314d6213a317987", - "vendor/topthink/think-filesystem/src/facade/Filesystem.php": "f0e7c67dff62bf69c72d168c84bdf9b2", - "vendor/topthink/think-filesystem/src/filesystem/Driver.php": "983ac639b1195e168d571909e7194163", - "vendor/topthink/think-filesystem/src/filesystem/driver/Local.php": "b4be51c2540053adb730efee68ff47fa", - "vendor/topthink/think-filesystem/tests/FilesystemTest.php": "72d58292180ab89316051f53f4941a39", - "vendor/topthink/think-filesystem/tests/bootstrap.php": "3beefb00777a6bd04265b7d33c23efa9", - "vendor/topthink/think-helper/src/Collection.php": "40298645490eabe596b03cf645e86f6e", - "vendor/topthink/think-helper/src/contract/Arrayable.php": "867bb9874f956b71624b4e4385fbbf42", - "vendor/topthink/think-helper/src/contract/Jsonable.php": "63f951f1a280feda4cd5da1e6ca976bd", - "vendor/topthink/think-helper/src/helper/Arr.php": "efda0e6c6c1570f77eaf79bee493d82b", - "vendor/topthink/think-helper/src/helper/Str.php": "c472457f78e771cbca659435c6ee264b", - "vendor/topthink/think-helper/src/helper.php": "c48051a92846c0130e8ea0f4a7d882d6", - "vendor/topthink/think-helper/tests/ArrTest.php": "0acaf1919b70dbceef66a194fe3da072", - "vendor/topthink/think-helper/tests/CollectionTest.php": "dce8ade7387036a61a556055a1d0c3e6", - "vendor/topthink/think-helper/tests/StrTest.php": "c88e8c336d65520e0ce98ab11cd4166a", - "vendor/topthink/think-helper/tests/TestCase.php": "96441b59687ab7671d916e17f4397ecf", - "vendor/topthink/think-image/src/Image.php": "c0a546d4395c04a2f3accad3cd6d18a1", - "vendor/topthink/think-image/src/image/Exception.php": "eff70004c5907cd3294797da0cc81adf", - "vendor/topthink/think-image/src/image/gif/Decoder.php": "6a162a418672b389189ad5c3d079bdab", - "vendor/topthink/think-image/src/image/gif/Encoder.php": "98b472cc3b8bfdfc87fd03f5cdcd2c98", - "vendor/topthink/think-image/src/image/gif/Gif.php": "d9b90a2c23e2b8ba80fbedd0a8ad1d5c", - "vendor/topthink/think-image/tests/CropTest.php": "efc9b42064f815e2d93cadce4ab5c6a1", - "vendor/topthink/think-image/tests/FlipTest.php": "93b5871de6b6921b762032d03c3e5c2e", - "vendor/topthink/think-image/tests/InfoTest.php": "341c57c69e2b94e866dc2e4d538b4cde", - "vendor/topthink/think-image/tests/RotateTest.php": "be97a5f03e66bdf38d08d38ae072aeb3", - "vendor/topthink/think-image/tests/TestCase.php": "5a2c2edcc83506151a92704fa8852dc1", - "vendor/topthink/think-image/tests/TextTest.php": "07a5fb5e276f478737d9aa2c972a6449", - "vendor/topthink/think-image/tests/ThumbTest.php": "a9d673067e35a3f5ddf169b2645f97a5", - "vendor/topthink/think-image/tests/WaterTest.php": "46d99b137bdc58026d64f04aac02f370", - "vendor/topthink/think-image/tests/autoload.php": "151f4b91269570966fd7d28c4bcf83f4", - "vendor/topthink/think-multi-app/src/MultiApp.php": "eab2655016ced00ad94207b128ba6964", - "vendor/topthink/think-multi-app/src/Service.php": "6082291699f80625f9c681a82c73c340", - "vendor/topthink/think-multi-app/src/Url.php": "1f9e5140837169bf4639f7f3804b42f7", - "vendor/topthink/think-multi-app/src/command/Build.php": "70e6cb18ed4c6c9115e3512f25f89687", - "vendor/topthink/think-multi-app/src/command/Clear.php": "53f3ea5f63449eb4970cf1f33b428754", - "vendor/topthink/think-orm/src/DbManager.php": "2b441f6c4e4da9ada932a4185b61b85c", - "vendor/topthink/think-orm/src/Model.php": "89697fca70300f5a9f2b4148f18c5eae", - "vendor/topthink/think-orm/src/Paginator.php": "380bb132a897d42f10cf42b61baa6f08", - "vendor/topthink/think-orm/src/db/BaseBuilder.php": "1db8c1f7b13b9cccf76996e5f60fd24a", - "vendor/topthink/think-orm/src/db/BaseQuery.php": "826eb05534869bb161b7084096b84295", - "vendor/topthink/think-orm/src/db/Builder.php": "e0529383e30a07e38a851fe2d9b94417", - "vendor/topthink/think-orm/src/db/CacheItem.php": "183dcf14d6253fddb9cfadc2e58af29e", - "vendor/topthink/think-orm/src/db/Connection.php": "72afd5af186059f4725593584d06461b", - "vendor/topthink/think-orm/src/db/ConnectionInterface.php": "a5c6ddc11f2b33741bcc1e49309f62e0", - "vendor/topthink/think-orm/src/db/Fetch.php": "f101306e50da8ef26f6f40e6f7cba454", - "vendor/topthink/think-orm/src/db/Mongo.php": "d8a8b2030d9bb2c540f66d41ea85f0dc", - "vendor/topthink/think-orm/src/db/PDOConnection.php": "a39c2e01d988779efe3fde5335964f8d", - "vendor/topthink/think-orm/src/db/Query.php": "2578f6bb9e3e16765efa638a6f723d01", - "vendor/topthink/think-orm/src/db/Raw.php": "4bbe113ab5af1c592605c382c520d8b3", - "vendor/topthink/think-orm/src/db/Where.php": "76f83d851ac5c207c1b3403427aa0392", - "vendor/topthink/think-orm/src/db/builder/Mongo.php": "f596da1065f4e41d0bf7f34b10e63c3e", - "vendor/topthink/think-orm/src/db/builder/Mysql.php": "1ef4e195999806330f091491aaad6013", - "vendor/topthink/think-orm/src/db/builder/Oracle.php": "821972438fa59ae074cca0bf2b31ced3", - "vendor/topthink/think-orm/src/db/builder/Pgsql.php": "251e81a4c2978561168283ec7d2eb13e", - "vendor/topthink/think-orm/src/db/builder/Sqlite.php": "c123f6918417deed2b513932f367a62d", - "vendor/topthink/think-orm/src/db/builder/Sqlsrv.php": "e645b0251a9c4d76e3c21696c5169791", - "vendor/topthink/think-orm/src/db/concern/AggregateQuery.php": "d27216b7cd2b7b4f44ad91de55797911", - "vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php": "cd4c01ace6d98adcd3c5724fd5006c3c", - "vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php": "b59669fe65088e10c1f9ef1be8b521bc", - "vendor/topthink/think-orm/src/db/concern/ParamsBind.php": "65b473ba2efa83f2a0a83bc98b795599", - "vendor/topthink/think-orm/src/db/concern/ResultOperation.php": "5e31521793258033afb6763afdf9b128", - "vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php": "ca0b65d374702455703bb4f0d6900e36", - "vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php": "1d422031120c95429212d36f0ca468e3", - "vendor/topthink/think-orm/src/db/concern/Transaction.php": "ec7f15b31a8afc44d6796ba26efba389", - "vendor/topthink/think-orm/src/db/concern/WhereQuery.php": "6abf6a28423aa9e312b544ded26458f8", - "vendor/topthink/think-orm/src/db/connector/Mongo.php": "0b35db70f780136d0226e1f444469862", - "vendor/topthink/think-orm/src/db/connector/Mysql.php": "1a1c3f40faa6b1a626f1cc6fea675dac", - "vendor/topthink/think-orm/src/db/connector/Oracle.php": "a3938e1c1a1e50f09f337ac881efb56c", - "vendor/topthink/think-orm/src/db/connector/Pgsql.php": "51a53060bc1bc2cd8987adf450cdcf7e", - "vendor/topthink/think-orm/src/db/connector/Sqlite.php": "890709abb196ddc70478db013ce759cb", - "vendor/topthink/think-orm/src/db/connector/Sqlsrv.php": "68b9269b80a0ccfb893e81f5baa5e630", - "vendor/topthink/think-orm/src/db/exception/BindParamException.php": "f9a008b765cfe3917461e6c74b43e205", - "vendor/topthink/think-orm/src/db/exception/DataNotFoundException.php": "91fb8b9e4e8267304668594046531974", - "vendor/topthink/think-orm/src/db/exception/DbEventException.php": "8879dd981998b4e3c8903a08afa7a5f3", - "vendor/topthink/think-orm/src/db/exception/DbException.php": "72ce12926e444ce7e25c3dbd91cb252d", - "vendor/topthink/think-orm/src/db/exception/InvalidArgumentException.php": "c0b0901e32244fed718351620efb35c8", - "vendor/topthink/think-orm/src/db/exception/ModelEventException.php": "084a5a85260fb32cd24d9948876e55d4", - "vendor/topthink/think-orm/src/db/exception/ModelNotFoundException.php": "3532138b8cd2a5359b30d24acacd5095", - "vendor/topthink/think-orm/src/db/exception/PDOException.php": "a76ffda7484c7b9fd1184f84a748b775", - "vendor/topthink/think-orm/src/facade/Db.php": "720de1f858a3c308e5a6ae04951119d0", - "vendor/topthink/think-orm/src/model/Collection.php": "45333e5962c932643ce9bc5547144d5d", - "vendor/topthink/think-orm/src/model/Pivot.php": "85caa4334368ee3e20d577c5739cb667", - "vendor/topthink/think-orm/src/model/Relation.php": "fc14d4da1edfee8d8c51330d16e7179c", - "vendor/topthink/think-orm/src/model/concern/Attribute.php": "8bf53526915c05ec15a63f6691b9b4a0", - "vendor/topthink/think-orm/src/model/concern/Conversion.php": "6674a20028c130f33a4d8470e48a25a6", - "vendor/topthink/think-orm/src/model/concern/ModelEvent.php": "442e706bb86fc4f6e6432d063cda8d05", - "vendor/topthink/think-orm/src/model/concern/OptimLock.php": "e0752d26f237d5154677efbfc2c93636", - "vendor/topthink/think-orm/src/model/concern/RelationShip.php": "2d8c8888172d3d19fed15c86e714010b", - "vendor/topthink/think-orm/src/model/concern/SoftDelete.php": "5579dec35ea35e1010f30c5d04fe3381", - "vendor/topthink/think-orm/src/model/concern/TimeStamp.php": "bc1b104df136bc55c033292f78a6591c", - "vendor/topthink/think-orm/src/model/concern/Virtual.php": "df791cd200fcca6d1320b682938835fb", - "vendor/topthink/think-orm/src/model/relation/BelongsTo.php": "d1eb337829095a652f2e9b78a009adc6", - "vendor/topthink/think-orm/src/model/relation/BelongsToMany.php": "093d7fb420988bb348302fcd71d94df3", - "vendor/topthink/think-orm/src/model/relation/HasMany.php": "cc1658f8394d5d7828d587ed93dc8b3e", - "vendor/topthink/think-orm/src/model/relation/HasManyThrough.php": "53527d04f557588e6647aa99416a9364", - "vendor/topthink/think-orm/src/model/relation/HasOne.php": "1ae4a929e3cfe78ec39e44d398512294", - "vendor/topthink/think-orm/src/model/relation/HasOneThrough.php": "9c186640e53ec6b4aa608b3e217327ec", - "vendor/topthink/think-orm/src/model/relation/MorphMany.php": "727a944f0c6e881472b29eed152db573", - "vendor/topthink/think-orm/src/model/relation/MorphOne.php": "f59f1db01dc6b69e14593190f98ffc89", - "vendor/topthink/think-orm/src/model/relation/MorphTo.php": "fe05ab5092799fc7bbc123e598f8cafd", - "vendor/topthink/think-orm/src/model/relation/MorphToMany.php": "1cc4aa3ef3b90429b0166096666619b9", - "vendor/topthink/think-orm/src/model/relation/OneToOne.php": "e5cb53fefecf78caaa6c3df6616ad434", - "vendor/topthink/think-orm/src/paginator/driver/Bootstrap.php": "35e7ab9dfca4b2107f3464382fb07a41", - "vendor/topthink/think-orm/stubs/Exception.php": "17eaebead638f6963681fc6b1921c7e4", - "vendor/topthink/think-orm/stubs/Facade.php": "9ab2a4598abb185409495b48cff0ce13", - "vendor/topthink/think-orm/stubs/load_stubs.php": "9c9d66685b7f9a52a8c9ff174a52e25a", - "vendor/topthink/think-template/src/Template.php": "4593b147e4bf6d95a5f327293178637e", - "vendor/topthink/think-template/src/facade/Template.php": "46fa179c52c4541a3a18ea4b86d403e8", - "vendor/topthink/think-template/src/template/TagLib.php": "20c7c67f1f25b545480231ad3046d643", - "vendor/topthink/think-template/src/template/contract/DriverInterface.php": "50a4da5b835635f600fea645670808be", - "vendor/topthink/think-template/src/template/driver/File.php": "870a66baa32a00c332780839d1ad1efc", - "vendor/topthink/think-template/src/template/exception/TemplateNotFoundException.php": "fdcd5d94671dd293bd38462c51d3e9bc", - "vendor/topthink/think-template/src/template/taglib/Cx.php": "5cc5ba9aac8425c17b8322f368368ad6", - "vendor/topthink/think-template/tests/bootstrap.php": "1b87d59f3f5fe8b1bedd912f1c2f3304", - "vendor/topthink/think-template/tests/tag/Demo.php": "7e27adcdb7d0c604c9de02e0e9b11eca", - "vendor/topthink/think-template/tests/think/TemplateTest.php": "a3676eac79662bba5e698ffe5b194e41", - "vendor/topthink/think-trace/src/Console.php": "9a072c9f535534d3940f7ade8bbc8b01", - "vendor/topthink/think-trace/src/Html.php": "9c97405e6b33b9e37c6c8da196a61861", - "vendor/topthink/think-trace/src/Service.php": "356aa596e5a2bd1f979dae370b3ae1df", - "vendor/topthink/think-trace/src/TraceDebug.php": "4523f6a9b7049cda837f8d37c27900bb", - "vendor/topthink/think-trace/src/config.php": "811e36d20aec9b699ab0cba0a0e85e28", - "vendor/topthink/think-view/src/Think.php": "efe21f85382d824990ef853eb38388de", - "vendor/w7corp/easywechat/src/Kernel/Config.php": "050b13f8638fe9a8bc1185c807c22c23", - "vendor/w7corp/easywechat/src/Kernel/Contracts/AccessToken.php": "7c5e04a0d9c6c0d8c4d750f806352ec9", - "vendor/w7corp/easywechat/src/Kernel/Contracts/AccessTokenAwareHttpClient.php": "bc0590d36cd0eb28843316a70993a901", - "vendor/w7corp/easywechat/src/Kernel/Contracts/Aes.php": "9a65c8cae28bdc705635c8b24d2d03e0", - "vendor/w7corp/easywechat/src/Kernel/Contracts/Arrayable.php": "93d7295326db9de1d66f1f8af24afcc0", - "vendor/w7corp/easywechat/src/Kernel/Contracts/Config.php": "3e7bdfd500ddddc2f3e6ba2ca6d609a2", - "vendor/w7corp/easywechat/src/Kernel/Contracts/Jsonable.php": "27660d009a2835b0d28e21ae5ba6d284", - "vendor/w7corp/easywechat/src/Kernel/Contracts/RefreshableAccessToken.php": "33c66355f65b8ead3b68a9febeebe838", - "vendor/w7corp/easywechat/src/Kernel/Contracts/Server.php": "4eecbd83093840328690feb728f58e70", - "vendor/w7corp/easywechat/src/Kernel/Encryptor.php": "0c19bda16d5d88d86fac7c6aea64af3b", - "vendor/w7corp/easywechat/src/Kernel/Exceptions/BadMethodCallException.php": "96dce19a758691d9767fedd469c8a781", - "vendor/w7corp/easywechat/src/Kernel/Exceptions/BadRequestException.php": "153736d59ec7c8acc912079a0cf433e1", - "vendor/w7corp/easywechat/src/Kernel/Exceptions/BadResponseException.php": "9edbf1df171d85573560b488bbc02212", - "vendor/w7corp/easywechat/src/Kernel/Exceptions/DecryptException.php": "4c5ad0cfaa4f27f0861ba5cddb732462", - "vendor/w7corp/easywechat/src/Kernel/Exceptions/Exception.php": "f873393942aca4e375300a32500496c6", - "vendor/w7corp/easywechat/src/Kernel/Exceptions/HttpException.php": "6d1b27ed50cad919a93eba234fcf2859", - "vendor/w7corp/easywechat/src/Kernel/Exceptions/InvalidArgumentException.php": "04402bc30bb8c289b474a53080b4731e", - "vendor/w7corp/easywechat/src/Kernel/Exceptions/InvalidConfigException.php": "fa8bce0b755664d128dc161db21131cc", - "vendor/w7corp/easywechat/src/Kernel/Exceptions/RuntimeException.php": "7fb1bdcf3172b897a34b9e73cad9b674", - "vendor/w7corp/easywechat/src/Kernel/Exceptions/ServiceNotFoundException.php": "d97cb34c02543ac7efa9be6e86863601", - "vendor/w7corp/easywechat/src/Kernel/Form/File.php": "a5036ac047df03bf6961d42d07081fd1", - "vendor/w7corp/easywechat/src/Kernel/Form/Form.php": "139ae1b3aaa3c7cf531e48bc82c0d101", - "vendor/w7corp/easywechat/src/Kernel/HttpClient/AccessTokenAwareClient.php": "f963ad71fafc2bfdc8691e7b3ba86a15", - "vendor/w7corp/easywechat/src/Kernel/HttpClient/AccessTokenExpiredRetryStrategy.php": "7ec7191ae7022e412f327de1bc8cc4d2", - "vendor/w7corp/easywechat/src/Kernel/HttpClient/HttpClientMethods.php": "46c17f564e1ae94dc5c19bae4a86a749", - "vendor/w7corp/easywechat/src/Kernel/HttpClient/RequestUtil.php": "17c803b9e999e3e372cd67946256b388", - "vendor/w7corp/easywechat/src/Kernel/HttpClient/RequestWithPresets.php": "7f1fdc2dcbef4c2b78d613cada0bcc2e", - "vendor/w7corp/easywechat/src/Kernel/HttpClient/Response.php": "42c113a066c7d979fa1e259b37f7d126", - "vendor/w7corp/easywechat/src/Kernel/HttpClient/RetryableClient.php": "774879fde9e22d43d8f181f7dd3d272d", - "vendor/w7corp/easywechat/src/Kernel/Message.php": "d51643978f597b51298d7b91bdedc159", - "vendor/w7corp/easywechat/src/Kernel/ServerResponse.php": "ece9e31d1e07867f1189209962feaa36", - "vendor/w7corp/easywechat/src/Kernel/Support/AesCbc.php": "5e8f48c04a74727f59393e9334009f2d", - "vendor/w7corp/easywechat/src/Kernel/Support/AesEcb.php": "ddacd50a84fca027dd9357e28e0b4f57", - "vendor/w7corp/easywechat/src/Kernel/Support/AesGcm.php": "593650b2d6a7dcf343bca09d0e742537", - "vendor/w7corp/easywechat/src/Kernel/Support/Arr.php": "49b52e0f50fdd9166fe804d72f06a58c", - "vendor/w7corp/easywechat/src/Kernel/Support/Pkcs7.php": "670db273b04279c74d2953347ebcc438", - "vendor/w7corp/easywechat/src/Kernel/Support/PrivateKey.php": "d8452cf1d3b029ffc50ad45a56a00c27", - "vendor/w7corp/easywechat/src/Kernel/Support/PublicKey.php": "118eb5bd4b1216d57037c05668253076", - "vendor/w7corp/easywechat/src/Kernel/Support/Str.php": "1649acb5eefd3656bc3b5f124764a5ee", - "vendor/w7corp/easywechat/src/Kernel/Support/UserAgent.php": "d301d62c45e5d851717f76c92b3269c1", - "vendor/w7corp/easywechat/src/Kernel/Support/Xml.php": "614d697760c50b6c500c1b6230608f83", - "vendor/w7corp/easywechat/src/Kernel/Traits/DecryptXmlMessage.php": "95a059c0c67269c5270335c275e3dec3", - "vendor/w7corp/easywechat/src/Kernel/Traits/HasAttributes.php": "7aa7d7c6f0b0f602d86595e0754d3bb0", - "vendor/w7corp/easywechat/src/Kernel/Traits/InteractWithCache.php": "709a4285a8be897e264b7155a6b11007", - "vendor/w7corp/easywechat/src/Kernel/Traits/InteractWithClient.php": "a4f3b9d2ffe5d60a1b982159aebec305", - "vendor/w7corp/easywechat/src/Kernel/Traits/InteractWithConfig.php": "353ab239cffc37373f6bd83d366582dc", - "vendor/w7corp/easywechat/src/Kernel/Traits/InteractWithHandlers.php": "cec72e971b65bdf8620e7813916b2116", - "vendor/w7corp/easywechat/src/Kernel/Traits/InteractWithHttpClient.php": "92a1fe1d67d33ebd4f13af8b9fc29366", - "vendor/w7corp/easywechat/src/Kernel/Traits/InteractWithServerRequest.php": "748ec36106b5fc14ad454fb6c91aef56", - "vendor/w7corp/easywechat/src/Kernel/Traits/MockableHttpClient.php": "7d300ad9e8369e98919bc504d9901be3", - "vendor/w7corp/easywechat/src/Kernel/Traits/RespondXmlMessage.php": "d5f8b01c2726e131f28503792bb7e1b1", - "vendor/w7corp/easywechat/src/MiniApp/AccessToken.php": "df267a548fc27d4c3335ba356da579a1", - "vendor/w7corp/easywechat/src/MiniApp/Account.php": "613aef64fc758a7625d1ccbefaabc7d7", - "vendor/w7corp/easywechat/src/MiniApp/Application.php": "56b574cb529bd5abad846e165d7f6aa5", - "vendor/w7corp/easywechat/src/MiniApp/Contracts/Account.php": "a9e50501a1b8b57312cdfddea796e8ef", - "vendor/w7corp/easywechat/src/MiniApp/Contracts/Application.php": "a6fd9f1aea8b7ec2d361e87ceadbdf2c", - "vendor/w7corp/easywechat/src/MiniApp/Decryptor.php": "e4366dfa6e28233ed379abf360cdecc1", - "vendor/w7corp/easywechat/src/MiniApp/Server.php": "8089769d7f75f4cbb0103ff3339b9906", - "vendor/w7corp/easywechat/src/MiniApp/Utils.php": "2eac59197516d61cd4815ad717462981", - "vendor/w7corp/easywechat/src/OfficialAccount/AccessToken.php": "e29aef579a6277882284997dd54cab3c", - "vendor/w7corp/easywechat/src/OfficialAccount/Account.php": "af757c9688fba1dcf85d0be6c2e99445", - "vendor/w7corp/easywechat/src/OfficialAccount/Application.php": "176bc60caee3f82ef6f41e5ff1cc0963", - "vendor/w7corp/easywechat/src/OfficialAccount/Config.php": "a51db4efc1ab13651dec365c91cf7fa5", - "vendor/w7corp/easywechat/src/OfficialAccount/Contracts/Account.php": "ac1f8aa1fc888b008e5d5380fea0cd75", - "vendor/w7corp/easywechat/src/OfficialAccount/Contracts/Application.php": "7fbe1f92325f85f8a7110041440d72f1", - "vendor/w7corp/easywechat/src/OfficialAccount/JsApiTicket.php": "217412fdcce082058229a0a6b5450b35", - "vendor/w7corp/easywechat/src/OfficialAccount/Message.php": "ffdc1ce1d653ed0d2e49f11cfc89bd29", - "vendor/w7corp/easywechat/src/OfficialAccount/Server.php": "de6d36582d323e394621bf615aae430f", - "vendor/w7corp/easywechat/src/OfficialAccount/Utils.php": "000fd63dce22326bb303e5e960210d90", - "vendor/w7corp/easywechat/src/OpenPlatform/Account.php": "48120d104c5b6025861c27f7c23824ef", - "vendor/w7corp/easywechat/src/OpenPlatform/Application.php": "55ccb215e15582c0de6fde9543142592", - "vendor/w7corp/easywechat/src/OpenPlatform/Authorization.php": "92d1bdbb11ddc18328dbebda59984834", - "vendor/w7corp/easywechat/src/OpenPlatform/AuthorizerAccessToken.php": "0c5bd04eed6d547f7d92c8d2e6903170", - "vendor/w7corp/easywechat/src/OpenPlatform/ComponentAccessToken.php": "8a5525202e2daf4c2ec1ed89d50f9ff0", - "vendor/w7corp/easywechat/src/OpenPlatform/Config.php": "0133a22c4974055e1bb38b5972b6fca6", - "vendor/w7corp/easywechat/src/OpenPlatform/Contracts/Account.php": "c355a81bfb14e34d4ba086659b0496b9", - "vendor/w7corp/easywechat/src/OpenPlatform/Contracts/Application.php": "32aebb3ab778cc136dbe38709669b6ba", - "vendor/w7corp/easywechat/src/OpenPlatform/Contracts/VerifyTicket.php": "3811d37a5648f4d812dd0fde8b2c22bd", - "vendor/w7corp/easywechat/src/OpenPlatform/Message.php": "a5023bad37c4d9c3cf322d4c93a6d0df", - "vendor/w7corp/easywechat/src/OpenPlatform/Server.php": "3ce64912ea4d9263fa26982b972178fe", - "vendor/w7corp/easywechat/src/OpenPlatform/VerifyTicket.php": "07b857eb18ce8d6f97d430463f6ee20b", - "vendor/w7corp/easywechat/src/OpenWork/Account.php": "2fda10c1ba55d9f800206548a9a1953e", - "vendor/w7corp/easywechat/src/OpenWork/Application.php": "42f664e4660f6924a91d77048744abd0", - "vendor/w7corp/easywechat/src/OpenWork/Authorization.php": "8b35bd2e213d1ce351f3df28a42d0aa3", - "vendor/w7corp/easywechat/src/OpenWork/AuthorizerAccessToken.php": "b3a8840b37a22a3ea6533bc9abbc8091", - "vendor/w7corp/easywechat/src/OpenWork/Config.php": "241b8bb9a66b542d2eb15c0e2fd78653", - "vendor/w7corp/easywechat/src/OpenWork/Contracts/Account.php": "72c0bd3ae33d555f67a40be4e91127a0", - "vendor/w7corp/easywechat/src/OpenWork/Contracts/Application.php": "ab55dfddc077f0f3463ebf4f5bab82b7", - "vendor/w7corp/easywechat/src/OpenWork/Contracts/SuiteTicket.php": "d73dc2420b8665a566c209fcd7117af8", - "vendor/w7corp/easywechat/src/OpenWork/Encryptor.php": "e0c370aefb3c77b37f2fc4720e04939b", - "vendor/w7corp/easywechat/src/OpenWork/Message.php": "319aca31a8c80029a0dfc97ede5b999b", - "vendor/w7corp/easywechat/src/OpenWork/ProviderAccessToken.php": "22fcbfef32217019ec227aec43c57d87", - "vendor/w7corp/easywechat/src/OpenWork/Server.php": "df8fe798e3e570b4dcc223dc673bdab5", - "vendor/w7corp/easywechat/src/OpenWork/SuiteAccessToken.php": "f134ac46806ea27edf92f8b9a8704bc6", - "vendor/w7corp/easywechat/src/OpenWork/SuiteEncryptor.php": "dc9cfe53c5e3c50d69e68b7e53c46ecf", - "vendor/w7corp/easywechat/src/OpenWork/SuiteTicket.php": "ea3df7090794f988094145a339d57299", - "vendor/w7corp/easywechat/src/Pay/Application.php": "7700c2d281f0f5d90d2d51d260f1713c", - "vendor/w7corp/easywechat/src/Pay/Client.php": "5586dc2a8d4b9e3a3a6880db2f3c1054", - "vendor/w7corp/easywechat/src/Pay/Config.php": "fdede530cb85f471e1bd310ceb52e337", - "vendor/w7corp/easywechat/src/Pay/Contracts/Application.php": "3009ed00cae3d0346ab1c1a64174f484", - "vendor/w7corp/easywechat/src/Pay/Contracts/Merchant.php": "f5485feb29e11023c97693225eaf5768", - "vendor/w7corp/easywechat/src/Pay/Contracts/ResponseValidator.php": "171d1e745428177b6cab413d2ec2d4ce", - "vendor/w7corp/easywechat/src/Pay/LegacySignature.php": "2e5b12380b9fe558ab3b5294d7a3c1fa", - "vendor/w7corp/easywechat/src/Pay/Merchant.php": "1afdd4cac0bdf27d4434b7da11347ba6", - "vendor/w7corp/easywechat/src/Pay/Message.php": "0dbd5de664e114cf55d7e55199fb15ed", - "vendor/w7corp/easywechat/src/Pay/ResponseValidator.php": "45e02a3a912c7c586dd9f7b55d8497ac", - "vendor/w7corp/easywechat/src/Pay/Server.php": "1ae447dfa267a6a29a46ebb066cf5b1b", - "vendor/w7corp/easywechat/src/Pay/Signature.php": "3542add3487fd977eb81e014975548f1", - "vendor/w7corp/easywechat/src/Pay/URLSchemeBuilder.php": "801244a53c759ca635c93e1f393b8361", - "vendor/w7corp/easywechat/src/Pay/Utils.php": "59be9512bd710546b00a3bd2e7e901a8", - "vendor/w7corp/easywechat/src/Work/AccessToken.php": "3da1defa7d73fd365f69e999f263a472", - "vendor/w7corp/easywechat/src/Work/Account.php": "0bc9bbb7331b7b7615dc460c866c054c", - "vendor/w7corp/easywechat/src/Work/Application.php": "bd30bc1537b3492b58adf40a1bc82dbc", - "vendor/w7corp/easywechat/src/Work/Config.php": "130a7ba5a701b2d22ee74729543012c5", - "vendor/w7corp/easywechat/src/Work/Contracts/Account.php": "f047b1129854aae686b6862883a88ea1", - "vendor/w7corp/easywechat/src/Work/Contracts/Application.php": "8c8a586743dddf257691bbe1ccf9772b", - "vendor/w7corp/easywechat/src/Work/Encryptor.php": "1f134bf19ba41216657762292faa8256", - "vendor/w7corp/easywechat/src/Work/JsApiTicket.php": "a6b095aadd202809fff34d1e1756b756", - "vendor/w7corp/easywechat/src/Work/Message.php": "576f51a9cee8dcfb7450afd119499e43", - "vendor/w7corp/easywechat/src/Work/Server.php": "4882233b32487c2ee971bd71c55f8a44", - "vendor/w7corp/easywechat/src/Work/Utils.php": "875814a90a5d4beeddd841d6f13d16ec", - "vendor/webmozart/assert/src/Assert.php": "30fb7b7e0bb812f9a6c49b877611b50e", - "vendor/webmozart/assert/src/InvalidArgumentException.php": "df028a33ecc18b78c26d81ec64820b55", - "vendor/webmozart/assert/src/Mixin.php": "7c63e6bd32c802e432ddc06679765c9d", - "vendor/workerman/crontab/example/test.php": "8d1cce0f87a0588cc7cb9a9dc5838603", - "vendor/workerman/crontab/src/Crontab.php": "d500ff459b9557366dd0ef0bd58ded11", - "vendor/workerman/crontab/src/Parser.php": "0b9b172f76435a7f0377cf8dd083fca5", - "vendor/workerman/redis/src/Client.php": "a2d3b35679527d429dd16353b0fd2970", - "vendor/workerman/redis/src/Exception.php": "ecf1cfc83c23f3f9e9377fd436d6acdc", - "vendor/workerman/redis/src/Protocols/Redis.php": "1ae5c61cd6ae3c411591fd38ced99f2b", - "vendor/workerman/redis-queue/examples/test.php": "1bf89625546f91a0db4e37b23253fbd7", - "vendor/workerman/redis-queue/src/Client.php": "f0b9e22c90e470a290f65383dd85ca90", - "vendor/workerman/workerman/Autoloader.php": "c070008d26b7d3dd187d10987ca0534e", - "vendor/workerman/workerman/Connection/AsyncTcpConnection.php": "09a2b9c1987b77dbce06c39499f3bcb8", - "vendor/workerman/workerman/Connection/AsyncUdpConnection.php": "a476b1ddbbd741940863f2c08c9a5d2c", - "vendor/workerman/workerman/Connection/ConnectionInterface.php": "8286d4cb3a17b1ec9138d03cf9fa275e", - "vendor/workerman/workerman/Connection/TcpConnection.php": "9ac1a5f847b642febacd3ec8b07951d4", - "vendor/workerman/workerman/Connection/UdpConnection.php": "6c0bab26e1f3da50f07d718b68639afa", - "vendor/workerman/workerman/Events/Ev.php": "f31408de5562355bbf6046443c8cc9fa", - "vendor/workerman/workerman/Events/Event.php": "ace17f9adb8a061c5eea8cbd869cf1db", - "vendor/workerman/workerman/Events/EventInterface.php": "f55e72f70d96f7afabf534f2f90ddb13", - "vendor/workerman/workerman/Events/Libevent.php": "379816a3a6eea5291653ab2f27df99ea", - "vendor/workerman/workerman/Events/React/Base.php": "7c36aef97702d6e718f3e744619122c8", - "vendor/workerman/workerman/Events/React/ExtEventLoop.php": "fa98c3b527b151663c3cde7a3b479e71", - "vendor/workerman/workerman/Events/React/ExtLibEventLoop.php": "5ef92a0b06fef2fd1d2be9489918dd63", - "vendor/workerman/workerman/Events/React/StreamSelectLoop.php": "5d289639a3e8ec79b6f7b727f1f423ed", - "vendor/workerman/workerman/Events/Select.php": "06414c2184feba82bd64adfda741c4d2", - "vendor/workerman/workerman/Events/Swoole.php": "d91970d0c3611c424dcb6964a15287f1", - "vendor/workerman/workerman/Events/Uv.php": "c574359491aa95d85809399a3cb7e2c3", - "vendor/workerman/workerman/Lib/Constants.php": "bdfcb7b598cb8907ddb85c3917922f84", - "vendor/workerman/workerman/Lib/Timer.php": "ac834b6a6148a1845493ad74dd109c30", - "vendor/workerman/workerman/Protocols/Frame.php": "64df528dcb0a2012d30f99c97ce812a9", - "vendor/workerman/workerman/Protocols/Http/Chunk.php": "ada9cc5145be0d339400ecfa01ce803a", - "vendor/workerman/workerman/Protocols/Http/Request.php": "89ed5f14da388750ac1f304baeaae267", - "vendor/workerman/workerman/Protocols/Http/Response.php": "0f2f057248a4e64eac0525f5c209dbd4", - "vendor/workerman/workerman/Protocols/Http/ServerSentEvents.php": "8d4a5f3b816c1d3fcdb8310aa609da88", - "vendor/workerman/workerman/Protocols/Http/Session/FileSessionHandler.php": "d067a8854c2b9188fad1b94120d74d7e", - "vendor/workerman/workerman/Protocols/Http/Session/RedisClusterSessionHandler.php": "c6f77fc37a47a96ec753977d279a3e41", - "vendor/workerman/workerman/Protocols/Http/Session/RedisSessionHandler.php": "09c7f5b078b8d76d5b0e08f5fa29a623", - "vendor/workerman/workerman/Protocols/Http/Session/SessionHandlerInterface.php": "aa288ac3e75028ec6ff8de5f3f1e25e8", - "vendor/workerman/workerman/Protocols/Http/Session.php": "716875365123c1bdcf53c3b638693dad", - "vendor/workerman/workerman/Protocols/Http.php": "1c987ee6acafc240bd620a4ade59cab2", - "vendor/workerman/workerman/Protocols/ProtocolInterface.php": "d0af803c273276314477dedbef55fe11", - "vendor/workerman/workerman/Protocols/Text.php": "f78e5db0f20a47026a9d729a16a174a6", - "vendor/workerman/workerman/Protocols/Websocket.php": "c88f112672be72e2c7b5afeeece035f1", - "vendor/workerman/workerman/Protocols/Ws.php": "527b9ccce4575e27e7aeb8206a4e8922", - "vendor/workerman/workerman/Timer.php": "a8709eed0e6eb3188748a22b6290f53b", - "vendor/workerman/workerman/Worker.php": "648c1f8345c80ad4aa3d079895da7a94", - "vendor/yansongda/artful/src/Artful.php": "d804723197eb1039f9f748bc071001d9", - "vendor/yansongda/artful/src/Contract/ConfigInterface.php": "74155fc677084cd7a633553d45478500", - "vendor/yansongda/artful/src/Contract/ContainerInterface.php": "8016a1b364410209912e808239e22977", - "vendor/yansongda/artful/src/Contract/DirectionInterface.php": "0aeb9f17a7ee8364d125ae15946a2728", - "vendor/yansongda/artful/src/Contract/EventDispatcherInterface.php": "a9ba10d9ea68d63c57d3439dc10bc9ba", - "vendor/yansongda/artful/src/Contract/HttpClientFactoryInterface.php": "c83c516c2ebe8ad99f934c836b0f2154", - "vendor/yansongda/artful/src/Contract/HttpClientInterface.php": "80badddf182df81e8706b535fa0912ea", - "vendor/yansongda/artful/src/Contract/LoggerInterface.php": "d6a58b145e50e3f5dde02ad42afeca3c", - "vendor/yansongda/artful/src/Contract/PackerInterface.php": "b507cac55a81672568a3d45fb9cc8585", - "vendor/yansongda/artful/src/Contract/PluginInterface.php": "b6a6eedc523eda8800ac7f1278dc8adb", - "vendor/yansongda/artful/src/Contract/ServiceProviderInterface.php": "352757d873b3e5c9a4506a28bdde0519", - "vendor/yansongda/artful/src/Contract/ShortcutInterface.php": "283d71970525f39065592c6c08503ee6", - "vendor/yansongda/artful/src/Direction/CollectionDirection.php": "dc5e0f2583ca4639b6c19bb3f6cace42", - "vendor/yansongda/artful/src/Direction/NoHttpRequestDirection.php": "f04ff05f8c331c4f3a5cec293d87d0c5", - "vendor/yansongda/artful/src/Direction/OriginResponseDirection.php": "c0d7ba270365d61871be0bf946f2c410", - "vendor/yansongda/artful/src/Direction/ResponseDirection.php": "2f5d7aca7ac3185498cd1a4a00e6b2e0", - "vendor/yansongda/artful/src/Event/ArtfulEnd.php": "6a136f1729f4183fa6ccb76736e22d57", - "vendor/yansongda/artful/src/Event/ArtfulStart.php": "91c092bc596e8cb43fa4fc28eaf18334", - "vendor/yansongda/artful/src/Event/Event.php": "14109c5ab1c837330b134ee7a6846958", - "vendor/yansongda/artful/src/Event/HttpEnd.php": "0fd199094a3aa23ef5335b202aabe729", - "vendor/yansongda/artful/src/Event/HttpStart.php": "99222b5b03a1b119b9749c9bdf07941d", - "vendor/yansongda/artful/src/Event.php": "71ac953c7c393885fda5a04d5957d9c2", - "vendor/yansongda/artful/src/Exception/ContainerException.php": "3d3339153808ee43c05011d3bd17a7c5", - "vendor/yansongda/artful/src/Exception/ContainerNotFoundException.php": "08e828f138d52caf1d97b7ee0b2662bd", - "vendor/yansongda/artful/src/Exception/Exception.php": "692180cdd68ca4695a6fb5462516de3c", - "vendor/yansongda/artful/src/Exception/InvalidConfigException.php": "ad8ad455d7e4d1797d6c791624960bce", - "vendor/yansongda/artful/src/Exception/InvalidParamsException.php": "adca163a699a094f32723049cdeaede6", - "vendor/yansongda/artful/src/Exception/InvalidResponseException.php": "fc743adac3c1fd08aa1782eee108f05f", - "vendor/yansongda/artful/src/Exception/ServiceNotFoundException.php": "47a1562fcd8f51954459b763d2cbeb7d", - "vendor/yansongda/artful/src/Functions.php": "4911a73fd63a4258439b565361ccf778", - "vendor/yansongda/artful/src/HttpClientFactory.php": "ffbc7c58250d0aedf27a712440d42c83", - "vendor/yansongda/artful/src/Logger.php": "fd7360f573b848c02dacc9c97f664f2f", - "vendor/yansongda/artful/src/Packer/JsonPacker.php": "ca128be89dc158fe28bba076a268bd10", - "vendor/yansongda/artful/src/Packer/QueryPacker.php": "84780366bf672d24ea31acb2ac9ad422", - "vendor/yansongda/artful/src/Packer/XmlPacker.php": "22c16139e0e9ba3e30aeb8c4fdc08b11", - "vendor/yansongda/artful/src/Plugin/AddPayloadBodyPlugin.php": "ae848a81fd1e7cf3e8a8bc22715ed437", - "vendor/yansongda/artful/src/Plugin/AddRadarPlugin.php": "8716d098e5932da559eae352720126ab", - "vendor/yansongda/artful/src/Plugin/ParserPlugin.php": "eebb4110fe5d1fd38d44bac8aaedcc58", - "vendor/yansongda/artful/src/Plugin/StartPlugin.php": "699befd33f9e1d6cdfcbeb1453001bb1", - "vendor/yansongda/artful/src/Rocket.php": "49f1fa73c5e5bf5633a9e83548bc83e4", - "vendor/yansongda/artful/src/Service/ConfigServiceProvider.php": "bfdf03122bcfd1b7f433f44bf5a55704", - "vendor/yansongda/artful/src/Service/ContainerServiceProvider.php": "7e274890735179eedaf604d69ed57b72", - "vendor/yansongda/artful/src/Service/EventServiceProvider.php": "784acc9e3f21cef2729b46ac81d2c11d", - "vendor/yansongda/artful/src/Service/HttpServiceProvider.php": "b526b21600376187f0f8213a8e21e68f", - "vendor/yansongda/artful/src/Service/LoggerServiceProvider.php": "8e786e64b72daa0e3ef30a2a06d9fe7d", - "vendor/yansongda/pay/src/Contract/ProviderInterface.php": "146480f141909f3f2e9bb920354da57f", - "vendor/yansongda/pay/src/Event/CallbackReceived.php": "6dd9307705cacdcac8794c712efdd55a", - "vendor/yansongda/pay/src/Event/MethodCalled.php": "e5067b57afa244001cf9a93f7778b82b", - "vendor/yansongda/pay/src/Event/PayEnd.php": "64876192c54fe25c0ebd5aaf3ca6c396", - "vendor/yansongda/pay/src/Event/PayStart.php": "0b59352c5c091fcf5b4509e47c592c69", - "vendor/yansongda/pay/src/Exception/DecryptException.php": "38f969a589900db9e2295cce2feee14f", - "vendor/yansongda/pay/src/Exception/Exception.php": "34d653c70b736cbd4a5b4c1f1e3067b6", - "vendor/yansongda/pay/src/Exception/InvalidSignException.php": "7c385d42d6df5d6fe2f3c18bd2efcc73", - "vendor/yansongda/pay/src/Functions.php": "ba418e05e87e1c67a556927bc2513851", - "vendor/yansongda/pay/src/Pay.php": "cb1b761a8348c3e82ce4bf083c8e6d61", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/AddPayloadSignaturePlugin.php": "c71a850aa15882edcf413a9b386a9ae3", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/AddRadarPlugin.php": "4026f9d23fdcea969e34213ca47a6b14", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/AppCallbackPlugin.php": "b9fc66a1b9081fc63aa09b9be3ea6c45", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/CallbackPlugin.php": "dd4b3e41321e7243ab8cf70ccf25e607", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/FormatPayloadBizContentPlugin.php": "1af6daac4f688a5a4081646e99990dda", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/Fund/PCreditPayInstallment/AppPayPlugin.php": "ab55ab074d7fc2a9bc2b4b07ad551b1c", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/Fund/PCreditPayInstallment/H5PayPlugin.php": "4f07aa415bdcf9024554cc1e1f306386", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/Fund/PCreditPayInstallment/PosPayPlugin.php": "6551299ecc5f6fe30034a572091dbca5", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/Fund/PCreditPayInstallment/ScanPayPlugin.php": "9ff8a616928e742e48bdb191ed0a10fe", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/Fund/Royalty/Query/OnsettlePlugin.php": "fef6ab3c457eff6ba2be6c62ac601269", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/Fund/Royalty/Query/RatePlugin.php": "43570afd75ac51bf89ba66c811944344", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/Fund/Royalty/Query/SettlePlugin.php": "bcb35a3e32fd21527b2d6774f829fa2e", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/Fund/Royalty/Relation/BindPlugin.php": "80dff5ded0eaefaaff245b7b97f88430", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/Fund/Royalty/Relation/QueryPlugin.php": "ada2a043644ec318ad6d686a869ecdb5", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/Fund/Royalty/Relation/UnbindPlugin.php": "e3ff838003f5bb84fcef1dbb94bdc32f", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/Fund/Royalty/Request/SettleOrderPlugin.php": "f3ed10c2df55af26ae4cfa79b8c6a19b", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/Fund/Transfer/ApplyReceiptPlugin.php": "62175dfcf953784279e1c3d05d40c928", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/Fund/Transfer/Bill/QueryUrlPlugin.php": "ff9eb189ea73e21f63add6d4e48e635c", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/Fund/Transfer/Fund/QueryPlugin.php": "0ff7951b1907b14bea3b6e3461d3794a", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/Fund/Transfer/Fund/TransferPlugin.php": "ad7f2870e82235c415ff3802b77908e7", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/Fund/Transfer/QueryAccountPlugin.php": "d8d2bfebf15022b45c00e06f47241d9b", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/Fund/Transfer/QueryReceiptPlugin.php": "545656c6df327863195a6f1e33e39950", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/Fund/Transfer/RefundPlugin.php": "0753ab3a2b38b7c105cd461e04af76a3", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/Marketing/Redpack/AppPayPlugin.php": "ff28ade9f35afb877b347eecb7776070", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/Marketing/Redpack/WebPayPlugin.php": "f3c3b8a306d55e4242e9d0b180d2cc58", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/Member/Authorization/AuthPlugin.php": "d6de8409d26da5179ee197e3565cedd9", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/Member/Authorization/QueryPlugin.php": "77c90f43e411c135e449f71b8fea17b2", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/Member/Authorization/TokenPlugin.php": "d1ffd6f774d1f1d0eff76968e6f115d5", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/Member/Certification/CertifyPlugin.php": "63d327cfa6da38b8f441a73816f27ea8", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/Member/Certification/InitPlugin.php": "8205c9c51a1188287dad4adcccc6db4f", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/Member/Certification/QueryPlugin.php": "dca6b19eb82e6f16d6abee2944912a3f", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/Member/DetailPlugin.php": "3115bd3fd9bf0f26bd0ac5dc02548eca", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/Member/FaceCheck/AppInitPlugin.php": "b87d6baee62d62cdc647b447c3b55972", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/Member/FaceCheck/AppQueryPlugin.php": "e6c1353028ef686093b2baa7ceec708b", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/Member/FaceVerification/AppInitPlugin.php": "0417dc875df66e1822128b2e1e59096f", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/Member/FaceVerification/AppQueryPlugin.php": "2837fe63f7de473272702d1ecd63bff5", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/Member/FaceVerification/H5InitPlugin.php": "00646803db9d849848d7024a79711b11", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/Member/FaceVerification/H5QueryPlugin.php": "b8ee60e81d59f245ca977f18dbba2377", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/Member/FaceVerification/H5VerifyPlugin.php": "2a3dfe70e491ead738be24b9a7dcc44b", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/Member/FaceVerification/ServerVerifyPlugin.php": "87144434422eee53c908689e087ab0f0", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/Member/Ocr/AppInitPlugin.php": "f94f0493ce5d573b202730d5a13b6b05", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/Member/Ocr/DetectPlugin.php": "cdcacf38b168239064c7c10ffb94ea80", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/Member/Ocr/ServerDetectPlugin.php": "13d5f084b0e0f30ca960ea6ab4d2607b", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/Pay/Agreement/Bill/QueryUrlPlugin.php": "2b4c0d71cf3594fcfe90256c80ee70e7", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/Pay/Agreement/Pay/AppPayPlugin.php": "858ddf7cdd9502c2b154fd7dfcd51ffa", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/Pay/Agreement/Pay/CancelPlugin.php": "a707497c52115937b0d14e23eb5ba663", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/Pay/Agreement/Pay/ClosePlugin.php": "7ad11f2adf8c08fad26a07bac967adef", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/Pay/Agreement/Pay/PayPlugin.php": "d0a98707ffddb087541f8d698c46632f", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/Pay/Agreement/Pay/QueryPlugin.php": "bf6028d4fc8b14dabac3f8e1506b3fbb", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/Pay/Agreement/Pay/RefundPlugin.php": "7d69834afe55c1c12a1a8cf3712cc119", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/Pay/Agreement/Sign/ModifyPlugin.php": "d1e084e3da176270d62dd283bb98c8bb", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/Pay/Agreement/Sign/QueryPlugin.php": "ab6ec2e244008e9bc6631d6aa75ae08c", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/Pay/Agreement/Sign/SignPlugin.php": "33ed5636fa2601e4f59dfdbe301941a9", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/Pay/Agreement/Sign/UnsignPlugin.php": "1df5836d340da643ae838f1c6f7ee9ef", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/Pay/App/ClosePlugin.php": "dd0f340736c3452fd9b6ec73ac009d7b", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/Pay/App/PayPlugin.php": "11178d4ef6e72e239fd44dfacb3ab7ba", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/Pay/App/QueryBillUrlPlugin.php": "c0866f7aa4479076a00e07e1734e405a", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/Pay/App/QueryPlugin.php": "a34c5694a906d186b14c13f46ee6b617", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/Pay/App/QueryRefundPlugin.php": "c89bc25541e1de4b746c9233e477d993", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/Pay/App/RefundPlugin.php": "759e0ff1b4067f221f9b81dfd6a63346", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/Pay/Authorization/Auth/AppFreezePlugin.php": "8c01ce362698b101671e08fe1c5b055b", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/Pay/Authorization/Auth/CancelPlugin.php": "08133a076c845feb522bdc0945e232ac", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/Pay/Authorization/Auth/PosFreezePlugin.php": "44344eb7de1a9af8e638111752b1ffa8", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/Pay/Authorization/Auth/QueryPlugin.php": "74d0b0d6ef6efe1182a8ea539fa96c30", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/Pay/Authorization/Auth/ScanFreezePlugin.php": "a1f1a96855b9bc17266083a7e56d8d8e", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/Pay/Authorization/Auth/UnfreezePlugin.php": "a4e976e7b771847f2d3fc87107c549de", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/Pay/Authorization/Bill/QueryUrlPlugin.php": "b6c8a2bcb5650cdcfc39cdedd13443ed", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/Pay/Authorization/Pay/ClosePlugin.php": "e2b5eaa1885d674d6725adf1521b17aa", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/Pay/Authorization/Pay/PayPlugin.php": "e62392a1cb0e3fe4b9a3240126bac6f3", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/Pay/Authorization/Pay/QueryPlugin.php": "941cb661a0fd674ebfa5b1c03375c65e", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/Pay/Authorization/Pay/QueryRefundPlugin.php": "83524cc854c5ee6afbd41ec2570f2038", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/Pay/Authorization/Pay/RefundPlugin.php": "67014178bcbcafe2e02ddd49acf8216e", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/Pay/Authorization/Pay/SyncPlugin.php": "60899ec12596582579d8438188c0589d", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/Pay/Face/InitPlugin.php": "47927f678d5ad12deea38a6c88cc2bea", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/Pay/Face/QueryPlugin.php": "f37707604cb6b44d044360f59f9a4d4a", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/Pay/H5/ClosePlugin.php": "e08912178c9a5e1a523605c3069211ad", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/Pay/H5/PayPlugin.php": "275597d73cc20671c99fb4d24bac6bf2", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/Pay/H5/QueryBillUrlPlugin.php": "a7edfd9efe8dcef03f906628af2bc5da", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/Pay/H5/QueryPlugin.php": "4d08ca2fad927b16391c4fd39ec12b52", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/Pay/H5/QueryRefundPlugin.php": "cebb50ac7ec05c38521b1861da41851e", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/Pay/H5/RefundPlugin.php": "842dae9e5d44ac0e6bcc25d2a77a3224", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/Pay/Mini/CancelPlugin.php": "8cbdf1034e397ab52f149ab59246d65d", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/Pay/Mini/ClosePlugin.php": "825a540b0283447def1861756ac62bd2", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/Pay/Mini/PayPlugin.php": "9deb94722dbec935b6cc3794a59ebfad", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/Pay/Mini/QueryBillUrlPlugin.php": "4691ac47a6e90ea42f0e6da41cddcb1f", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/Pay/Mini/QueryPlugin.php": "64a2027db16e166609c5349198ea087a", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/Pay/Mini/QueryRefundPlugin.php": "e54be370b17d0d4002ca28202f4ccb9b", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/Pay/Mini/RefundPlugin.php": "44d236cdb3612b8f6d4b13bee9fdce19", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/Pay/Pos/CancelPlugin.php": "61f02462f42da5d412fec024a3e96077", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/Pay/Pos/ClosePlugin.php": "89f26317575f0e9358da8126f55144ef", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/Pay/Pos/PayPlugin.php": "e97f4bb656bb4c216f7ef64310ec9ada", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/Pay/Pos/QueryBillUrlPlugin.php": "88b356d21ac2aaf540157ac369cbc60f", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/Pay/Pos/QueryPlugin.php": "989c969e511ba3f8a34629e87c8ac4ad", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/Pay/Pos/QueryRefundPlugin.php": "bb5b7db45308cc0d8458916c941e1081", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/Pay/Pos/RefundPlugin.php": "705cae8cde2ea980c98527d7f76ce21e", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/Pay/Scan/CancelPlugin.php": "d4a7df3cedd5e634b23fd2c481870dee", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/Pay/Scan/ClosePlugin.php": "f7a8292c1bad15d457f7aff19b9371c1", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/Pay/Scan/CreatePlugin.php": "2a2004e532e249e405a141e5997000ca", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/Pay/Scan/PayPlugin.php": "4397d2dd193d3c5bc2b4735b9e2268ac", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/Pay/Scan/QueryBillUrlPlugin.php": "12a9c2f2351e1ab4441da36aa2d183fb", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/Pay/Scan/QueryPlugin.php": "fca34af7efb8b6500c2d13866c5a9d47", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/Pay/Scan/QueryRefundPlugin.php": "4a329dabaf4d4ea569d9b0e85dc57fa5", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/Pay/Scan/RefundPlugin.php": "fbc79c99ca341df7a800033f5b1feb39", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/Pay/Web/ClosePlugin.php": "703b8d554d6d2aef41a236ece2fb3621", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/Pay/Web/PayPlugin.php": "cbd734df46d8c464e04b87023fa5ec67", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/Pay/Web/QueryBillUrlPlugin.php": "744004a908da6143cc19ae84017cf565", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/Pay/Web/QueryPlugin.php": "b62023999d294efeb95fb7fe63b7a0f0", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/Pay/Web/QueryRefundPlugin.php": "5232a7e45380bae5d2a9643622b54688", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/Pay/Web/RefundPlugin.php": "e32fe5689c1124e3f6525d316b78e10c", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/ResponseHtmlPlugin.php": "dbba8c08aa74478dd1c5e848eadb2d65", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/ResponseInvokeStringPlugin.php": "41131861ffcc35f91ea355c881e51fce", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/ResponsePlugin.php": "e1e6fc6788a62098327ef6d1cacf84ed", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/StartPlugin.php": "79e63606648f3857acff7f802cc4f331", - "vendor/yansongda/pay/src/Plugin/Alipay/V2/VerifySignaturePlugin.php": "f44e8b54a8d55fbe00860cdb20e9f92c", - "vendor/yansongda/pay/src/Plugin/Douyin/V1/Pay/AddPayloadSignaturePlugin.php": "5e5b85cc6717efbb3824c6864b2c0f12", - "vendor/yansongda/pay/src/Plugin/Douyin/V1/Pay/AddRadarPlugin.php": "9e6521d39ffaffa1c19480be5cec30b1", - "vendor/yansongda/pay/src/Plugin/Douyin/V1/Pay/CallbackPlugin.php": "334aa60e326a183b032b8fd9e5a08fdf", - "vendor/yansongda/pay/src/Plugin/Douyin/V1/Pay/Mini/PayPlugin.php": "1f8a80404bedaf580aa3627ed0457160", - "vendor/yansongda/pay/src/Plugin/Douyin/V1/Pay/Mini/QueryPlugin.php": "e0a2338208416376d7257be2f8e0138b", - "vendor/yansongda/pay/src/Plugin/Douyin/V1/Pay/Mini/QueryRefundPlugin.php": "1864bd429529b0badc6455fbd240aba0", - "vendor/yansongda/pay/src/Plugin/Douyin/V1/Pay/Mini/RefundPlugin.php": "7b3ef29adca8f9d113b11fab9ccce31f", - "vendor/yansongda/pay/src/Plugin/Douyin/V1/Pay/ResponsePlugin.php": "0134c84311d82149a0307f4621838401", - "vendor/yansongda/pay/src/Plugin/Jsb/AddPayloadSignPlugin.php": "93294e393ff8fccbaab93d935ee91610", - "vendor/yansongda/pay/src/Plugin/Jsb/AddRadarPlugin.php": "080353ac7abc90653987e1345ff3da3f", - "vendor/yansongda/pay/src/Plugin/Jsb/CallbackPlugin.php": "261e7578ad37fe488dfa5c18d3f35533", - "vendor/yansongda/pay/src/Plugin/Jsb/Pay/Scan/PayPlugin.php": "4bacab0226220e372145ad56f805f5bc", - "vendor/yansongda/pay/src/Plugin/Jsb/Pay/Scan/QueryPlugin.php": "ba4981f34356e9732eb459360c60e58d", - "vendor/yansongda/pay/src/Plugin/Jsb/Pay/Scan/RefundPlugin.php": "81ff00058ac96fdf527e13003f4ad782", - "vendor/yansongda/pay/src/Plugin/Jsb/ResponsePlugin.php": "64ac9c239081edd142bfffc9ed8c1686", - "vendor/yansongda/pay/src/Plugin/Jsb/StartPlugin.php": "84b089f06d8afebb3cf1c378a952d1fc", - "vendor/yansongda/pay/src/Plugin/Jsb/VerifySignaturePlugin.php": "ef46be9531689cd7bb12ae122d5b919c", - "vendor/yansongda/pay/src/Plugin/Unipay/AddRadarPlugin.php": "51a554dfeffa38ec8b71e06eb65ee252", - "vendor/yansongda/pay/src/Plugin/Unipay/Open/AddPayloadSignaturePlugin.php": "bdb993c6f0fb649d47d64bead91688d4", - "vendor/yansongda/pay/src/Plugin/Unipay/Open/CallbackPlugin.php": "a4333245dee120f6b77d6c3169047bb8", - "vendor/yansongda/pay/src/Plugin/Unipay/Open/Pay/H5/PayPlugin.php": "7f93e33cb3ee14909310f2930d77da29", - "vendor/yansongda/pay/src/Plugin/Unipay/Open/Pay/QrCode/CancelPlugin.php": "d3ad09255f79222ee4ab059da3c4ff41", - "vendor/yansongda/pay/src/Plugin/Unipay/Open/Pay/QrCode/PosPlugin.php": "70b79810f0c56509d410c120373d274d", - "vendor/yansongda/pay/src/Plugin/Unipay/Open/Pay/QrCode/PosPreAuthPlugin.php": "eefa0e3dc3eb08538f84d9d6cb004c73", - "vendor/yansongda/pay/src/Plugin/Unipay/Open/Pay/QrCode/QueryPlugin.php": "04d655bcc4be3fad62e551a42330b688", - "vendor/yansongda/pay/src/Plugin/Unipay/Open/Pay/QrCode/RefundPlugin.php": "ca23d865244f92a5fd450c113c82ea64", - "vendor/yansongda/pay/src/Plugin/Unipay/Open/Pay/QrCode/ScanFeePlugin.php": "184488d6b27031c22f2f43d285046783", - "vendor/yansongda/pay/src/Plugin/Unipay/Open/Pay/QrCode/ScanPlugin.php": "282db8ab0f1a65d0644d5f39ecdf23ab", - "vendor/yansongda/pay/src/Plugin/Unipay/Open/Pay/QrCode/ScanPreAuthPlugin.php": "85efc5b8bb1503f652f565a96d7cb4a8", - "vendor/yansongda/pay/src/Plugin/Unipay/Open/Pay/QrCode/ScanPreOrderPlugin.php": "247a5f0405d6f72a7220d4ee39768b80", - "vendor/yansongda/pay/src/Plugin/Unipay/Open/Pay/Web/CancelPlugin.php": "de3144d7ac1f44adc48950c8985fb4b2", - "vendor/yansongda/pay/src/Plugin/Unipay/Open/Pay/Web/PayPlugin.php": "7f2253737ca7a108dd7ea6411822ec0c", - "vendor/yansongda/pay/src/Plugin/Unipay/Open/Pay/Web/QueryPlugin.php": "2d922c613dc26b15bc7a8a9791fb5563", - "vendor/yansongda/pay/src/Plugin/Unipay/Open/Pay/Web/RefundPlugin.php": "84d9b56b4acedc8013d6fdb54fed6bbb", - "vendor/yansongda/pay/src/Plugin/Unipay/Open/ResponseHtmlPlugin.php": "a43d480668c6bc665ba687c5fa44ae78", - "vendor/yansongda/pay/src/Plugin/Unipay/Open/StartPlugin.php": "8c7acd214e978019e4390ba984367e76", - "vendor/yansongda/pay/src/Plugin/Unipay/Open/VerifySignaturePlugin.php": "67a7498fcc60acd9b70feed26a48eb2a", - "vendor/yansongda/pay/src/Plugin/Unipay/Qra/AddPayloadSignaturePlugin.php": "12496b3eea8182b851b948527a8befe4", - "vendor/yansongda/pay/src/Plugin/Unipay/Qra/CallbackPlugin.php": "dbde9f49169b509e8a4eb0c4741e1af2", - "vendor/yansongda/pay/src/Plugin/Unipay/Qra/Pos/CancelPlugin.php": "0dda24cfae83088e9276a027ee7f8a80", - "vendor/yansongda/pay/src/Plugin/Unipay/Qra/Pos/PayPlugin.php": "e574fcf266fb48b8619b8e256e4a752a", - "vendor/yansongda/pay/src/Plugin/Unipay/Qra/Pos/QueryOpenIdPlugin.php": "1d0eabd2fa92b138c39b6976cef1c5ed", - "vendor/yansongda/pay/src/Plugin/Unipay/Qra/Pos/QueryPlugin.php": "0086f81d75fc4cbc556bfa64cff30dbe", - "vendor/yansongda/pay/src/Plugin/Unipay/Qra/Pos/QueryRefundPlugin.php": "64e7ee87361cc6bc2111eddd3146838e", - "vendor/yansongda/pay/src/Plugin/Unipay/Qra/Pos/RefundPlugin.php": "eff5f0e3eed4e87a98f007ae7f1b874b", - "vendor/yansongda/pay/src/Plugin/Unipay/Qra/Scan/ClosePlugin.php": "37c7a56dce9af40eff20332252e55cf0", - "vendor/yansongda/pay/src/Plugin/Unipay/Qra/Scan/PayPlugin.php": "d32d90e4eec1c43101d3ad2db3274a33", - "vendor/yansongda/pay/src/Plugin/Unipay/Qra/Scan/QueryPlugin.php": "ebfbde7dcba025554b32505eb2ade382", - "vendor/yansongda/pay/src/Plugin/Unipay/Qra/Scan/QueryRefundPlugin.php": "ade21c65c0c83c40f1fa4270ec6adfc5", - "vendor/yansongda/pay/src/Plugin/Unipay/Qra/Scan/RefundPlugin.php": "97ee7104d786e6247fcdfe8cbec5458b", - "vendor/yansongda/pay/src/Plugin/Unipay/Qra/StartPlugin.php": "21adb8eea825600197ec7caa27b4fa94", - "vendor/yansongda/pay/src/Plugin/Unipay/Qra/VerifySignaturePlugin.php": "6ee29361eecb748163c0f322c7bf31b6", - "vendor/yansongda/pay/src/Plugin/Wechat/AddRadarPlugin.php": "2cc30753490c0c0b2f59337beb23a1e2", - "vendor/yansongda/pay/src/Plugin/Wechat/ResponsePlugin.php": "beb6851a09ccb8c972236d7286192936", - "vendor/yansongda/pay/src/Plugin/Wechat/StartPlugin.php": "0910394a11c538aaa2123725aa37ad6e", - "vendor/yansongda/pay/src/Plugin/Wechat/V2/AddPayloadSignaturePlugin.php": "b440fdd425c75b580f1d5692cbf629b1", - "vendor/yansongda/pay/src/Plugin/Wechat/V2/Papay/Direct/ApplyPlugin.php": "b625a7117f8892b80b453509bfe0fabc", - "vendor/yansongda/pay/src/Plugin/Wechat/V2/Papay/Direct/ContractOrderPlugin.php": "59b8ed9b961edf69886e333dec3128f7", - "vendor/yansongda/pay/src/Plugin/Wechat/V2/Papay/Direct/MiniOnlyContractPlugin.php": "83aa139f5400b26fceedf037330a5904", - "vendor/yansongda/pay/src/Plugin/Wechat/V2/Pay/App/InvokePlugin.php": "06cd28f905cfc092a86d249894df6d65", - "vendor/yansongda/pay/src/Plugin/Wechat/V2/Pay/Mini/InvokePlugin.php": "65e8dff03fb159ae3349a093a5f353f6", - "vendor/yansongda/pay/src/Plugin/Wechat/V2/Pay/Pos/CancelPlugin.php": "90286db3ed9aaab92ce5f9d1c9a277f6", - "vendor/yansongda/pay/src/Plugin/Wechat/V2/Pay/Pos/PayPlugin.php": "1b06214f6d35312cf26fe89f9f953ae8", - "vendor/yansongda/pay/src/Plugin/Wechat/V2/Pay/Pos/QueryPlugin.php": "e41f76e21aa73062a5a9c21e8cae1d85", - "vendor/yansongda/pay/src/Plugin/Wechat/V2/Pay/Redpack/SendPlugin.php": "1d38b79f3a6ff0afca686248e54ed38d", - "vendor/yansongda/pay/src/Plugin/Wechat/V2/VerifySignaturePlugin.php": "4315e1f78651daada2deb38d35f68b8e", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/AddPayloadSignaturePlugin.php": "58251bceaaba14baeb9ab9afcd3c6f53", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/CallbackPlugin.php": "bb96e7542c53faad0c86c1ffd3252f03", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Extend/Complaints/CompletePlugin.php": "a207eeb809d2b37c73af49462b5eb053", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Extend/Complaints/DeleteCallbackPlugin.php": "5c5dff03564ec902a773a6924249477a", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Extend/Complaints/QueryCallbackPlugin.php": "b229e2cbf00f1d4e1ebd08affc3db5a8", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Extend/Complaints/QueryDetailPlugin.php": "13f4b0c3c4118f53b351682c70e7de3d", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Extend/Complaints/QueryImagePlugin.php": "766e523030f5bddc5dd2867971c50386", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Extend/Complaints/QueryNegotiationPlugin.php": "25ea664ed89256855bbdd5c46f9b4a24", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Extend/Complaints/QueryPlugin.php": "64d5a0589549c0e17370a2f2f10bac6f", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Extend/Complaints/ResponsePlugin.php": "b4c1176d0fb3dff60adeb3dabc6a981b", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Extend/Complaints/SetCallbackPlugin.php": "970d32fcdfa5894d0ceef2778a198ca3", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Extend/Complaints/UpdateCallbackPlugin.php": "f8d47358532e943604fce0bb10857539", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Extend/Complaints/UpdateRefundPlugin.php": "20cc1bd410cc29c68c99a2446c55672b", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Extend/ProfitSharing/AddReceiverPlugin.php": "36a2932bdc064f331a3703be14ee9779", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Extend/ProfitSharing/CreatePlugin.php": "6a00597cad40f987516b61eb128def60", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Extend/ProfitSharing/DeleteReceiverPlugin.php": "6004b26fd69d60ab2ec3f1a074c3b9a8", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Extend/ProfitSharing/DownloadBillPlugin.php": "bc0627f26e1377dae976a0db222bf1c4", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Extend/ProfitSharing/GetBillPlugin.php": "939e7d2a2ac84a1d7fbc92c276716432", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Extend/ProfitSharing/QueryAmountsPlugin.php": "6f4dc62b6be8909bb81e858bbec1c7da", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Extend/ProfitSharing/QueryMerchantConfigsPlugin.php": "bca19573c2d562fe59fe34adc53dff87", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Extend/ProfitSharing/QueryPlugin.php": "4360258cf79f7234bd2f021a461a5aa3", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Extend/ProfitSharing/QueryReturnPlugin.php": "955c99b052ce634158465a114d0667b0", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Extend/ProfitSharing/ReturnPlugin.php": "4a31f65a4fcb39da179e525cfec09b90", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Extend/ProfitSharing/UnfreezePlugin.php": "0c5a8535d5b0c72b69b18b712f08f672", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Marketing/Coupon/Callback/QueryPlugin.php": "ce93636fb88e0bf5f8b5adcc44e627da", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Marketing/Coupon/Callback/SetPlugin.php": "901954dc3551cd13a90f1fe8c8956d7b", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Marketing/Coupon/Coupons/DetailPlugin.php": "8c08cb9c2514a4cf8cff7ca936a433c5", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Marketing/Coupon/Coupons/QueryUserPlugin.php": "fc1db321e382b53a87c541210e1d3d00", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Marketing/Coupon/Coupons/SendPlugin.php": "d22c05761e72f3bf91896fc69fd71bd8", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Marketing/Coupon/Stock/CreatePlugin.php": "9d38b5eecbf91a2b21d128b523385698", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Marketing/Coupon/Stock/PausePlugin.php": "6d84ac55aaad74c9d0326c1a8e98db22", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Marketing/Coupon/Stock/QueryDetailPlugin.php": "60bb65440276d23db6b777201d8a16fb", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Marketing/Coupon/Stock/QueryItemsPlugin.php": "e3a8526c5a4909e11d948191222a7ae1", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Marketing/Coupon/Stock/QueryMerchantsPlugin.php": "a1aab18acf6ec626b73178b2effeec37", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Marketing/Coupon/Stock/QueryPlugin.php": "608a891c0d9d2133f7af5c01c389b37d", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Marketing/Coupon/Stock/QueryRefundFlowPlugin.php": "e104e96c7747e0b9033210c0c5e76c3b", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Marketing/Coupon/Stock/QueryUseFlowPlugin.php": "54f800ca9de75cd2f49cbe6438f6d0f3", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Marketing/Coupon/Stock/RestartPlugin.php": "d8b5cb3edd78fb5c57be4474363ad431", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Marketing/Coupon/Stock/StartPlugin.php": "3d865a740be42d9558c85f23a98840a6", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Marketing/ECommerceBalance/QueryDayEndPlugin.php": "f3bcdbfdb366ff9ba216be2d48ea4617", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Marketing/ECommerceBalance/QueryPlugin.php": "f226ebdd97ef037a6abe124dd490fed8", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Marketing/ECommerceRefund/ApplyPlugin.php": "7d50d196542d3d4d2c15760db9bdb069", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Marketing/ECommerceRefund/QueryByWxPlugin.php": "3c5894398ffcedf1166dc788a3dcae30", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Marketing/ECommerceRefund/QueryPlugin.php": "1d1754b61dc0b30ad71e02806b5d6563", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Marketing/ECommerceRefund/QueryReturnAdvancePlugin.php": "2d75348943523a348b9664dd71c79929", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Marketing/ECommerceRefund/ReturnAdvancePlugin.php": "6a8fb15369c6fe49385ab54a64246087", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Marketing/Fapiao/Blockchain/CreatePlugin.php": "75552195f9fafd2cd2f081b27c01c49c", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Marketing/Fapiao/Blockchain/DownloadPlugin.php": "db293cb615989166985f2ed7ad09071f", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Marketing/Fapiao/Blockchain/GetBaseInformationPlugin.php": "6783dae38803955234760e3d56311cd8", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Marketing/Fapiao/Blockchain/GetDownloadInfoPlugin.php": "46685afb998d7aee6568c40a7e1bfcdd", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Marketing/Fapiao/Blockchain/GetTaxCodePlugin.php": "5b00bbd7115b63d93fb9fc4185ad1d0f", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Marketing/Fapiao/Blockchain/ReversePlugin.php": "c544388a1e5e0129aec46e890e0baf68", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Marketing/Fapiao/CreateCardTemplatePlugin.php": "71c9bf13983812fa366183b6e7f1cdf4", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Marketing/Fapiao/GetTitleUrlPlugin.php": "dd5a4a270dccaf76acb62d8263f66317", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Marketing/Fapiao/QueryConfigPlugin.php": "ad1a7ef49c2a89783dec14620be2dc41", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Marketing/Fapiao/QueryPlugin.php": "1499d128512f61c80194fc01d1f3c7bd", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Marketing/Fapiao/QueryUserTitlePlugin.php": "e37295cf84ca7b3ece49a2d7d0d767b0", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Marketing/Fapiao/UpdateConfigPlugin.php": "b54556c194093bfb100ce868e395b8bd", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Marketing/MchTransfer/CancelPlugin.php": "d94b5a13f79cbf6b281622e028d354fb", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Marketing/MchTransfer/CreatePlugin.php": "86455a4ba04daa50dba1ab084c49fb9f", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Marketing/MchTransfer/InvokeAndroidPlugin.php": "62b545e5ac9f529664a10f77d1248110", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Marketing/MchTransfer/InvokeIosPlugin.php": "1c155c5f58faea19c344bfa07c2aa296", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Marketing/MchTransfer/InvokeJsapiPlugin.php": "fbf22312093fd45507800f2538240d1f", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Marketing/MchTransfer/QueryByWxPlugin.php": "583d92aa6ce511ce5df57b48008610a2", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Marketing/MchTransfer/QueryPlugin.php": "766284e85061af178b11d48d84f496ef", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Marketing/Transfer/Batch/QueryByWxPlugin.php": "32a8f8665270e39e8df6ad17784f636e", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Marketing/Transfer/Batch/QueryPlugin.php": "181ce209c802d564cbf43143fbd7382d", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Marketing/Transfer/CreatePlugin.php": "593b2f03876b0daefbd4ee3db29f7ab6", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Marketing/Transfer/Detail/QueryByWxPlugin.php": "e5bd32d6d26c9008c5877c41a82fbcf7", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Marketing/Transfer/Detail/QueryPlugin.php": "4d3041cde0b61e4b1476a462b4120f9e", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Marketing/Transfer/DownloadReceiptPlugin.php": "704f86eccf63d302b26aa38d6d33d2d8", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Marketing/Transfer/Receipt/CreatePlugin.php": "9f0ae7af5590e18cebe9b3f272249a5d", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Marketing/Transfer/Receipt/QueryPlugin.php": "f0326f607ab1a719732de3422c3a825d", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Marketing/Transfer/ReceiptDetail/CreatePlugin.php": "3abc03c5c9375ef9820837a10da7c5fc", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Marketing/Transfer/ReceiptDetail/QueryPlugin.php": "9940f136a6be7e01ce28c9472e51701b", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Pay/App/ClosePlugin.php": "7572d0ed2416fa17e9db300ba43f6b1e", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Pay/App/DownloadBillPlugin.php": "ba7e1f53c7088847992e0af2136ded90", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Pay/App/GetFundBillPlugin.php": "76f7d42be6f119f565e4b6edf1d2dcda", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Pay/App/GetTradeBillPlugin.php": "5f85635c853f8c4b8aa3ab151b6340f2", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Pay/App/InvokePlugin.php": "fb43ddf3694dd5f8b703fbf250136939", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Pay/App/PayPlugin.php": "2ec06c87f5b0856cffe499493a9fc46e", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Pay/App/QueryByWxPlugin.php": "e169c7293118cab77472111879496dd2", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Pay/App/QueryPlugin.php": "d66df62a0b120bb01581fcc25048a1ab", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Pay/App/QueryRefundPlugin.php": "6efa41862ab965a2c48e7598531dddca", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Pay/App/RefundPlugin.php": "4e0d8a1cc171f675671182cf7c2bea30", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Pay/Bill/DownloadPlugin.php": "bcfb46f126547da96245eb5e8cf98a11", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Pay/Bill/GetFundPlugin.php": "21b65bf328a4b7dc20aa11bc9346a7b0", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Pay/Bill/GetTradePlugin.php": "ac34624937778419cf426cfb7c5e0fa2", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Pay/Combine/AppInvokePlugin.php": "2a35236d5fa6fe84992be93dddf950e2", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Pay/Combine/AppPayPlugin.php": "2a81905845ff243045858898467a6b31", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Pay/Combine/ClosePlugin.php": "f10bd78db392d139635eed575842eaf8", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Pay/Combine/DownloadBillPlugin.php": "2ccdbbe9c6d6fd0d01d620d468ff66fa", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Pay/Combine/GetFundBillPlugin.php": "989ca1f1f139a063d21d039072f847f3", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Pay/Combine/GetTradeBillPlugin.php": "d01ccd0ab5b8c4a79067fe795525da34", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Pay/Combine/H5PayPlugin.php": "212a2615f6bedc61801c157febe23d25", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Pay/Combine/JsapiInvokePlugin.php": "f8b71cd0c127b52c8629ae0c0ebaf433", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Pay/Combine/JsapiPayPlugin.php": "9479667aacfe1687848ae25fbd20dc15", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Pay/Combine/MiniInvokePlugin.php": "44ee96e2aa8b4c913facea9de0172240", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Pay/Combine/MiniPayPlugin.php": "c9e62835ac90cf5d559023960f51b6e6", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Pay/Combine/NativePayPlugin.php": "beea636a9ee166e3621d2525787bc4cf", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Pay/Combine/QueryPlugin.php": "332802eb78464e9d61727428068bc5aa", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Pay/Combine/QueryRefundPlugin.php": "19845599816a2899b40dbe9af61774d0", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Pay/Combine/RefundPlugin.php": "8e5170a03ed3e71deae31f48368f048e", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Pay/H5/ClosePlugin.php": "e43a2f13915918338dbd6f209195ba80", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Pay/H5/DownloadBillPlugin.php": "541d0db95e4ecb0da543498cfac62d04", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Pay/H5/GetFundBillPlugin.php": "54022b07a0c88ee1dabfc72743cb6088", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Pay/H5/GetTradeBillPlugin.php": "91f6e330308b644d95d903267689a9df", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Pay/H5/PayPlugin.php": "c4a1ce7ab4d4ecc8fca2af3afa68dabf", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Pay/H5/QueryByWxPlugin.php": "a958333dce63e782a11a3344a0c1caa3", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Pay/H5/QueryPlugin.php": "ae2b55ec05644b881883796aecece133", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Pay/H5/QueryRefundPlugin.php": "c3f9777596027cf981e42527e7d98a58", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Pay/H5/RefundPlugin.php": "1ed364693213d2778b6bbb06c85dc9be", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Pay/Jsapi/ClosePlugin.php": "aa5de0a58e0bd1a7d41448416961d343", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Pay/Jsapi/DownloadBillPlugin.php": "a0e396cc46bcd167c3598f2280ce9704", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Pay/Jsapi/GetFundBillPlugin.php": "a7e0f73124c720c1a6a2969644b7eac3", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Pay/Jsapi/GetTradeBillPlugin.php": "a2becb3e70257f512de4891c1dc0e48c", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Pay/Jsapi/InvokePlugin.php": "718b88d8da0986d84a530e723288f2cd", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Pay/Jsapi/PayPlugin.php": "93fa36fab88301e5d6cd636af247e18b", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Pay/Jsapi/QueryByWxPlugin.php": "c9dbed1c0bc51007b491b517359c0794", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Pay/Jsapi/QueryPlugin.php": "bb3bad2c24fb1692070ce8b11743f1dc", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Pay/Jsapi/QueryRefundPlugin.php": "d0de79135fe5e38e2fb81774faa15b9a", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Pay/Jsapi/RefundPlugin.php": "c7d6ee1f4b877530f1603ac9f7948757", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Pay/Mini/ClosePlugin.php": "6a48abd677f4814bf9489a7f2af84a77", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Pay/Mini/DownloadBillPlugin.php": "ee717f6692a8411aca650c0cb3d3273d", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Pay/Mini/GetFundBillPlugin.php": "7da41e9d49c133b0dbe6bf9b35af0b76", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Pay/Mini/GetTradeBillPlugin.php": "685ee26eb6ee83491600012bb886fcd2", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Pay/Mini/InvokePlugin.php": "4980c38a86f5052e5b33ee373b312cc9", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Pay/Mini/PayPlugin.php": "db062f1c4e503340cfcef7c48417515f", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Pay/Mini/QueryByWxPlugin.php": "c8eee030c312823990bb5d7640ba1d7d", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Pay/Mini/QueryPlugin.php": "dbdcfacc3ac39b9aa620c6a574a95a3f", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Pay/Mini/QueryRefundPlugin.php": "0e49155bfb7d3bd0184027fba7e62fb3", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Pay/Mini/RefundPlugin.php": "519a572004a04a91ed54a35134dc1eba", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Pay/Native/ClosePlugin.php": "ad5cc660f77496c175e7013ff2b4f791", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Pay/Native/DownloadBillPlugin.php": "0d457f95cdd4fa30033e403e5d7bf70a", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Pay/Native/GetFundBillPlugin.php": "c3af497d8ed2499e0192b3303cdfd1d4", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Pay/Native/GetTradeBillPlugin.php": "c9f09a7a5f66e04daae11fc57ac1fc22", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Pay/Native/PayPlugin.php": "c446087811615f13373feb2b752f81c9", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Pay/Native/QueryByWxPlugin.php": "00cdf1900dfd4fa5262d05d970a3a49a", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Pay/Native/QueryPlugin.php": "347d721458eb5738be0ea9cefed2ebd2", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Pay/Native/QueryRefundPlugin.php": "7d54b9722fc6d1d398eb2cc5033cfd12", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Pay/Native/RefundPlugin.php": "9f29d1c73404157f73f759978aa22706", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Pay/Pos/CancelPlugin.php": "5358382ad3933257a217154ee7a70583", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Pay/Pos/PayPlugin.php": "ef9944fb920fc3c2b9b40ca6e7a45203", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Pay/Refund/QueryPlugin.php": "c6fd1558f2b791fb8959af96279854b0", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Pay/Refund/RefundAbnormalPlugin.php": "35105d56966757accb76439624f50e9f", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/Pay/Refund/RefundPlugin.php": "3c55938e6bc750bc40f5a7d827ad36bf", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/VerifySignaturePlugin.php": "a0eb59cdd63de6b6d0da6f2f0527cef6", - "vendor/yansongda/pay/src/Plugin/Wechat/V3/WechatPublicCertsPlugin.php": "d9dd3c8331edc4917ead0d0857d74aaf", - "vendor/yansongda/pay/src/Provider/Alipay.php": "ada0c9145c919b595b11443edc5811b0", - "vendor/yansongda/pay/src/Provider/Douyin.php": "8cf2958885233c3712d26427e9cadfcc", - "vendor/yansongda/pay/src/Provider/Jsb.php": "2defd5ef105dc865e1f81fb54e54239d", - "vendor/yansongda/pay/src/Provider/Unipay.php": "0fad2980ba44e4882ab25b3c5c9df3da", - "vendor/yansongda/pay/src/Provider/Wechat.php": "dec1b0efb1d6540fae7d2dd77a8eae29", - "vendor/yansongda/pay/src/Service/AlipayServiceProvider.php": "09279155f753e00c611d57783b8d356a", - "vendor/yansongda/pay/src/Service/DouyinServiceProvider.php": "4048c155b752af96f4735ec686493656", - "vendor/yansongda/pay/src/Service/JsbServiceProvider.php": "3ec6ea0b97d1afb3036e1426ea34d23e", - "vendor/yansongda/pay/src/Service/UnipayServiceProvider.php": "a77730c9683ac2f49d7b65b6b8d38fd2", - "vendor/yansongda/pay/src/Service/WechatServiceProvider.php": "d34a634bde0d322cebe4e93553a4ca0a", - "vendor/yansongda/pay/src/Shortcut/Alipay/AppShortcut.php": "63d81a2c72c30bbe17957c1ec5611162", - "vendor/yansongda/pay/src/Shortcut/Alipay/CancelShortcut.php": "a97c93441fb3eea4b354198436eebf00", - "vendor/yansongda/pay/src/Shortcut/Alipay/CloseShortcut.php": "8c6eda406079be38e7e048465d61535c", - "vendor/yansongda/pay/src/Shortcut/Alipay/H5Shortcut.php": "619699ded6676ea6e8cc626558a72ce0", - "vendor/yansongda/pay/src/Shortcut/Alipay/MiniShortcut.php": "16328af8994b20de0ddddfedab1e20b1", - "vendor/yansongda/pay/src/Shortcut/Alipay/PosShortcut.php": "649d992c5881da988762f9b280bcf932", - "vendor/yansongda/pay/src/Shortcut/Alipay/QueryShortcut.php": "6b4ba3359e6a7adf518a5cad2e08568f", - "vendor/yansongda/pay/src/Shortcut/Alipay/RefundShortcut.php": "f1147aad4ed4e79888285bc830d0c44f", - "vendor/yansongda/pay/src/Shortcut/Alipay/ScanShortcut.php": "46bd2f42aeca9204a9c28291fbad33bb", - "vendor/yansongda/pay/src/Shortcut/Alipay/TransferShortcut.php": "27e3c7cefdddcbd460c3f2830771a825", - "vendor/yansongda/pay/src/Shortcut/Alipay/WebShortcut.php": "20350261385d4b1304ba73a1729d262b", - "vendor/yansongda/pay/src/Shortcut/Douyin/MiniShortcut.php": "f6755a4d5b3c841e221519fb81287be8", - "vendor/yansongda/pay/src/Shortcut/Douyin/QueryShortcut.php": "3040b9145f32ec530cc37c1800e49f4b", - "vendor/yansongda/pay/src/Shortcut/Douyin/RefundShortcut.php": "b93c79064741e84e44bff6e271332e02", - "vendor/yansongda/pay/src/Shortcut/Jsb/QueryShortcut.php": "3491a24a709bedbe1a9d9b7f0a34630a", - "vendor/yansongda/pay/src/Shortcut/Jsb/RefundShortcut.php": "afd502ae68cbc560d3079ee635ccb64b", - "vendor/yansongda/pay/src/Shortcut/Jsb/ScanShortcut.php": "744f000cc50965d701a4f2b01d024cc1", - "vendor/yansongda/pay/src/Shortcut/Unipay/CancelShortcut.php": "723b68a3bf9473e8a171eff7921efa82", - "vendor/yansongda/pay/src/Shortcut/Unipay/H5Shortcut.php": "cde1faeb147978769654817a96c42bed", - "vendor/yansongda/pay/src/Shortcut/Unipay/PosShortcut.php": "5c763c5b0b57c16ec77b6798a42fe94a", - "vendor/yansongda/pay/src/Shortcut/Unipay/QueryShortcut.php": "d22acada926f82d081f739107b66359e", - "vendor/yansongda/pay/src/Shortcut/Unipay/RefundShortcut.php": "6c3aba7b60840fda9d11d355b6ec2cb7", - "vendor/yansongda/pay/src/Shortcut/Unipay/ScanShortcut.php": "c63fcd9aa30071e9992cd9e87e5181dd", - "vendor/yansongda/pay/src/Shortcut/Unipay/WebShortcut.php": "d9a2261df41ab39cffbba255ebc97ecb", - "vendor/yansongda/pay/src/Shortcut/Wechat/AppShortcut.php": "fbb96800f6a905e06bdf9c91f7dcf225", - "vendor/yansongda/pay/src/Shortcut/Wechat/CloseShortcut.php": "f3e734fc8209b77c4800b3cab868d210", - "vendor/yansongda/pay/src/Shortcut/Wechat/H5Shortcut.php": "32e45b5860758b40116eae5acc3250ed", - "vendor/yansongda/pay/src/Shortcut/Wechat/MiniShortcut.php": "188fc6ed83d5d7f2544ade3af0dc7d6d", - "vendor/yansongda/pay/src/Shortcut/Wechat/MpShortcut.php": "dbb1b9d0a9baea7e8e6692b5450737e9", - "vendor/yansongda/pay/src/Shortcut/Wechat/PapayShortcut.php": "3cc9eb2344e88d3b13ece2831feede55", - "vendor/yansongda/pay/src/Shortcut/Wechat/PosShortcut.php": "e1ec36f4d2b9b53491f58090caac3308", - "vendor/yansongda/pay/src/Shortcut/Wechat/QueryShortcut.php": "e521a973a4d9bfc589b3edafbbf3f2b9", - "vendor/yansongda/pay/src/Shortcut/Wechat/RedpackShortcut.php": "ce2ebb317ae4c75b1c9433145c2819ac", - "vendor/yansongda/pay/src/Shortcut/Wechat/RefundShortcut.php": "665b3192c80d3758c64fd54f7079d7dd", - "vendor/yansongda/pay/src/Shortcut/Wechat/ScanShortcut.php": "92dc0bb5eb1c3fa4d5b754bda6ef6758", - "vendor/yansongda/pay/src/Shortcut/Wechat/TransferShortcut.php": "df0993c4a91e4a8db15fbc23353849ae", - "vendor/yansongda/pay/src/Traits/SupportServiceProviderTrait.php": "e6e1332cf61c63b3037ae0969b166b2b", - "vendor/yansongda/supports/.php-cs-fixer.php": "50a6bd99f4feda2c8348209320415335", - "vendor/yansongda/supports/src/Arr.php": "10ab14945bb077bc6b251c4c98ba1b2a", - "vendor/yansongda/supports/src/Collection.php": "e2d30e2c0ac8a3297905a0334c52cd01", - "vendor/yansongda/supports/src/Config.php": "451ced5bdea1019262d1c71d5f7e71e8", - "vendor/yansongda/supports/src/Functions.php": "6b1d35993db16ad9d4bef4c615058b63", - "vendor/yansongda/supports/src/Pipeline.php": "69f97412e14f433b520efae96cb7af3a", - "vendor/yansongda/supports/src/Str.php": "270ba2a27fa799a06596fe9c35ac803b", - "vendor/yansongda/supports/src/Traits/Accessable.php": "68673cab4a9c3b369848fbf4ac0d3cc1", - "vendor/yansongda/supports/src/Traits/Arrayable.php": "7ec61594ba59f71788ce7d3e3160304a", - "vendor/yansongda/supports/src/Traits/Serializable.php": "6b5635b244034f488d060f5b4e94d0b7" - }, - "migrationHistory": [ - { - "timestamp": "2025-10-14T16:26:05.046Z", - "stats": { - "filesChanged": 0, - "filesAdded": 5921, - "filesDeleted": 0, - "conflictsDetected": 0, - "autoMerged": 481, - "manualMergeRequired": 0 - } - } - ], - "userModifications": {}, - "conflicts": [] -} \ No newline at end of file diff --git a/tools/INFRASTRUCTURE-USAGE-GUIDE.md b/tools/INFRASTRUCTURE-USAGE-GUIDE.md deleted file mode 100644 index 5921a42e..00000000 --- a/tools/INFRASTRUCTURE-USAGE-GUIDE.md +++ /dev/null @@ -1,612 +0,0 @@ -# 迁移工具正确使用基础设施指南 - -## 概述 - -本文档说明如何在迁移工具中正确使用NestJS的基础设施(Common层)和业务核心(Core层),确保生成的业务代码能够充分利用框架能力。 - -## 新架构层级概览 - -### 🏗️ Common层基础设施 (原Core层基础设施迁移到此) - -### 🧠 Core层业务核心 (原Common业务迁移到此) - -**Core层应该放置具体的业务模块:** -- **位置**: `src/core/{module_name}/` -- **模块示例**: - - `member/` - 会员管理业务模块 - - `install/` - 安装向导业务模块 - - `diy/` - DIY装修业务模块 - - `dict/` - 数据字典业务模块 -- **文件结构**: 各模块包含控制器、服务、实体、DTO等 -- **用途**: 具体业务逻辑实现和业务流程控制 - -## Common层基础设施概览 - -### 1. 基础服务系统 -- **位置**: `src/common/base/` -- **文件**: base.entity.ts, base.service.ts, base.repository.ts, base.module.ts -- **用途**: 通用基础服务、实体基类、仓储基类 - -### 2. 缓存系统 -- **位置**: `src/common/cache/` -- **文件**: cache.service.ts, cache.module.ts, decorators/ -- **用途**: 分布式缓存、缓存装饰器、性能优化 - -### 3. 上下文管理 -- **位置**: `src/common/context/` -- **文件**: context.service.ts, context.module.ts -- **用途**: 请求上下文管理、多租户支持 - -### 4. 数据库服务 -- **位置**: `src/common/database/` -- **文件**: database.module.ts, backup.service.ts -- **用途**: 数据库连接、备份服务 - -### 5. 异常处理系统 -- **位置**: `src/common/exception/` -- **文件**: exception.filter.ts, business.exception.ts, base.exception.ts -- **用途**: 统一异常处理、业务异常、错误响应格式化 - -### 6. 事件系统 -- **位置**: `src/common/event/` -- **文件**: event.module.ts -- **用途**: 事件驱动、应用事件处理 - -### 7. 拦截器系统 -- **位置**: `src/common/interceptors/` -- **文件**: method-call.interceptor.ts, request-parameter.interceptor.ts -- **用途**: 请求拦截、方法调用统计、参数校验 - -### 8. 响应系统 -- **位置**: `src/common/response/` -- **文件**: response.interceptor.ts, result.class.ts, result.interface.ts -- **用途**: 统一响应格式、结果封装、API标准化 - -### 9. 安全系统 -- **位置**: `src/common/security/` -- **文件**: guards/, strategies/, decorators/ -- **用途**: JWT认证、角色授权、权限控制 - -### 10. 日志系统 -- **位置**: `src/common/logging/` -- **文件**: logging.service.ts, logging.module.ts -- **用途**: 统一日志管理、日志级别控制 - -### 11. 监控系统 -- **位置**: `src/common/monitoring/` -- **文件**: monitoring.service.ts, monitoring.module.ts -- **用途**: 应用监控、性能指标、健康检查 - -### 12. 队列系统 -- **位置**: `src/common/queue/` -- **文件**: queue.module.ts -- **用途**: 消息队列、异步任务处理 - -### 13. 调度系统 -- **位置**: `src/common/scheduler/` -- **文件**: scheduler.module.ts -- **用途**: 定时任务、计划任务调度 - -### 14. 工具库系统 -- **位置**: `src/common/libraries/` -- **文件**: redis/, dayjs/, lodash/, winston/, prometheus/, sharp/, uuid/ -- **用途**: 第三方库集成、工具服务提供 - -### 15. 插件系统 -- **位置**: `src/common/plugins/` -- **文件**: captcha/, qrcode/, wechat/ -- **用途**: 功能插件、扩展能力 - -### 16. Swagger文档 -- **位置**: `src/common/swagger/` -- **文件**: swagger.module.ts, swagger.service.ts -- **用途**: API文档生成、接口文档管理 - -### 17. 验证系统 -- **位置**: `src/common/validation/` -- **文件**: base.dto.ts, custom-validators.ts -- **用途**: 数据验证、DTO基类、自定义验证器 - -### 18. 管道系统 -- **位置**: `src/common/pipes/` -- **文件**: parse-diy-form.pipe.ts, pipes.module.ts -- **用途**: 数据转换、格式处理、参数解析 - -### 19. 工具类 -- **位置**: `src/common/utils/` -- **文件**: clone.util.ts, crypto.util.ts, json.util.ts, system.util.ts -- **用途**: 通用工具函数、系统功能、加密解密 - -### 20. 语言系统 -- **位置**: `src/common/language/` -- **文件**: language.utils.ts -- **用途**: 多语言支持、国际化处理 - -### 21. 追踪系统 -- **位置**: `src/common/tracing/` -- **文件**: tracing.module.ts, tracing.service.ts -- **用途**: 链路追踪、性能监控、请求跟踪 - -### 22. 加载器系统 -- **位置**: `src/common/loader/` -- **文件**: loader.module.ts, loader.utils.ts -- **用途**: 资源加载、配置加载、动态加载 - -### 23. 初始化系统 -- **位置**: `src/common/init/` -- **文件**: init.module.ts, init.service.ts -- **用途**: 应用初始化、启动配置 - -### 24. 系统工具 -- **位置**: `src/common/system/` -- **文件**: system.module.ts, system.utils.ts -- **用途**: 系统信息、环境管理 - -## 迁移工具使用基础设施的正确方式 - -### 1. 控制器生成器使用基础设施 - -#### 1.1 使用安全认证 -```typescript -// 正确使用方式 -import { Controller, Get, Post, Put, Delete, Body, Param, Query } from '@nestjs/common'; -import { ApiTags, ApiOperation, ApiResponse } from '@nestjs/swagger'; -import { RolesGuard } from '@wwjCommon/security/guards/roles.guard'; -import { JwtAuthGuard } from '@wwjCommon/security/guards/jwt-auth.guard'; -import { Roles } from '@wwjCommon/security/decorators/roles.decorator'; -import { Public } from '@wwjCommon/security/decorators/public.decorator'; - -@ApiTags('diy') -@Controller('adminapi/diy') -@UseGuards(JwtAuthGuard, RolesGuard) // 使用Common层守卫 -export class ConfigController { - constructor( - private readonly diyConfig: AdminDiyConfigService - ) {} - - @Get('list') - @Roles('admin') // 使用Core层角色装饰器 - @ApiOperation({ summary: '获取配置列表' }) - async getList(@Query() query: any) { - // 业务逻辑实现 - } - - @Post('create') - @Roles('admin') - @ApiOperation({ summary: '创建配置' }) - async create(@Body() body: any) { - // 业务逻辑实现 - } -} -``` - -#### 1.2 使用异常处理 -```typescript -// 正确使用方式 -import { BusinessException } from '@wwjCommon/exception/business.exception'; - -@Get('list') -async getList(@Query() query: any) { - try { - // 业务逻辑 - return await this.diyConfig.getList(query); - } catch (error) { - // 使用Core层异常处理 - throw new BusinessException('获取配置列表失败', error); - } -} -``` - -#### 1.3 使用管道验证 -```typescript -// 正确使用方式 -import { ParseDiyFormPipe } from '@wwjCommon/pipes/parse-diy-form.pipe'; - -@Post('create') -async create( - @Body(ParseDiyFormPipe) body: any // 使用Common层管道 -) { - // 业务逻辑实现 -} -``` - -### 2. 服务生成器使用基础设施 - -#### 2.1 使用数据库服务 -```typescript -// 正确使用方式 -import { Injectable } from '@nestjs/common'; -import { InjectRepository } from '@nestjs/typeorm'; -import { Repository } from 'typeorm'; -import { BaseService } from '@wwjCommon/base/base.service'; -import { DatabaseModule } from '@wwjCommon/database/database.module'; - -@Injectable() -export class DiyConfigService_adminService extends BaseService { - constructor( - @InjectRepository(DiyConfig) - protected readonly repository: Repository, - // 使用Common层基础服务和数据库 - ) { - super(repository); - } - - async getList(params: any) { - // 业务逻辑实现 - return await this.repository.find(params); - } - - async create(data: any) { - // 业务逻辑实现 - return await this.repository.save(data); - } -} -``` - -#### 2.2 使用缓存服务 -```typescript -// 正确使用方式 -import { CacheService } from '@wwjCommon/cache/cache.service'; - -@Injectable() -export class DiyConfigService_adminService extends BaseService { - constructor( - @InjectRepository(DiyConfig) - protected readonly repository: Repository, - private readonly cacheService: CacheService // 使用Common层缓存服务 - ) { - super(repository); - } - - async getList(params: any) { - const cacheKey = `diy:config:list:${JSON.stringify(params)}`; - - // 使用Common层缓存服务 - let result = await this.cacheService.get(cacheKey); - if (!result) { - result = await this.repository.find(params); - await this.cacheService.set(cacheKey, result); // 缓存 - } - - return result; - } - - async update(id: number, data: any) { - // 业务逻辑实现 - const result = await this.repository.update(id, data); - - // 清除相关缓存 - await this.cacheService.del(`diy:config:list:*`); - - return result; - } -} -``` - -#### 2.3 使用队列服务 -```typescript -// 正确使用方式 -import { QueueModule } from '@wwjCommon/queue/queue.module'; - -@Injectable() -export class DiyConfigService_adminService extends BaseService { - constructor( - @InjectRepository(DiyConfig) - protected readonly repository: Repository, - private readonly queueService: UnifiedQueueService // 使用Core层队列服务 - ) { - super(repository); - } - - async create(data: any) { - // 业务逻辑实现 - const result = await this.repository.save(data); - - // 使用Core层队列服务发送异步任务 - await this.queueService.addTask('diy', 'configCreated', { - id: result.id, - data: result - }); - - return result; - } -} -``` - -### 3. 实体生成器使用基础设施 - -#### 3.1 使用基础实体 -```typescript -// 正确使用方式 -import { Entity, PrimaryGeneratedColumn, PrimaryColumn, Column, Index } from 'typeorm'; -import { BaseEntity } from '@wwjCore'; - -@Entity('diy_page') -export class Diy extends BaseEntity { - @PrimaryColumn({ name: 'id', type: 'int' }) - id: number; - - @Column({ name: 'name', length: 100 }) - name: string; - - @Column({ name: 'content', type: 'text' }) - content: string; - - @Column({ name: 'status', type: 'tinyint', default: 1 }) - status: number; - - @Index('idx_site_id') // 使用Core层索引管理 - @Column({ name: 'site_id', type: 'int' }) - siteId: number; -} -``` - -### 4. DTO生成器使用基础设施 - -#### 4.1 使用验证管道 -```typescript -// 正确使用方式 -import { IsString, IsNumber, IsOptional, IsNotEmpty } from 'class-validator'; -import { ApiProperty } from '@nestjs/swagger'; -import { validateEvent } from '@wwjCore/event/contractValidator'; - -export class CreateDiyDto { - @ApiProperty({ description: '页面名称' }) - @IsString() - @IsNotEmpty() - name: string; - - @ApiProperty({ description: '页面内容' }) - @IsString() - @IsNotEmpty() - content: string; - - @ApiProperty({ description: '状态', required: false }) - @IsNumber() - @IsOptional() - status?: number; -} - -export class DiyDtoValidator { - static async validate(data: CreateDiyDto): Promise { - // 使用Core层契约验证 - return await validateEvent('diy.create', data); - } -} -``` - -### 5. 监听器生成器使用基础设施 - -#### 5.1 使用事件系统 -```typescript -// 正确使用方式 -import { Injectable } from '@nestjs/common'; -import { DomainEventHandler, EventHandler } from '@wwjCore'; -import { EventBusPublisher } from '@wwjCore/event/eventBusPublisher'; - -@Injectable() -@DomainEventHandler() -export class ThemeColorListener { - constructor( - private readonly eventBus: EventBusPublisher // 使用Core层事件总线 - ) {} - - @EventHandler('themecolor.handle') - async handle(payload: any) { - try { - // 业务逻辑实现 - const result = await this.processThemeColor(payload); - - // 使用Core层事件总线发布新事件 - await this.eventBus.publish('themecolor.processed', result); - - return result; - } catch (error) { - // 使用Core层异常处理 - throw new BusinessException('主题颜色处理失败', error); - } - } - - private async processThemeColor(payload: any) { - // 业务逻辑实现 - if (payload.key === 'app') { - return { - theme_color: [ - { - title: '商务蓝', - name: 'blue', - value: '#1890ff' - } - ] - }; - } - return null; - } -} -``` - -### 6. 任务生成器使用基础设施 - -### 7. 中间件生成器已废弃 -**重要说明**: 中间件生成器已废弃,请使用Core层Guards+Interceptors+Pipes - -#### 废弃原因 -- ❌ 原生NestMiddleware已过时 -- ❌ 与Java框架不一致(Java使用拦截器而非中间件) -- ❌ Core层已提供完整的安全基础设施 - -#### 替代方案 -使用Core层基础设施替代中间件: - -```typescript -// 认证 - 使用Guards -@UseGuards(AdminCheckTokenGuard, RolesGuard) -@Controller('adminapi/user') -export class UserController { - // 业务逻辑 -} - -// 拦截 - 使用Interceptors -@UseInterceptors(TracingInterceptor, ResponseInterceptor) -export class UserService { - // 业务逻辑 -} - -// 验证 - 使用Pipes -@Post() -createUser(@Body(ValidationPipe) createUserDto: CreateUserDto) { - // 业务逻辑 -} -``` - -#### Core层基础设施对比 -| 功能 | 中间件 | Core层替代 | 说明 | -|------|--------|------------|------| -| 认证 | ❌ 过时 | ✅ AdminCheckTokenGuard | 与Java SaTokenInterceptor一致 | -| 授权 | ❌ 过时 | ✅ RolesGuard | 与Java权限控制一致 | -| 拦截 | ❌ 过时 | ✅ TracingInterceptor | 与Java AOP切面一致 | -| 验证 | ❌ 过时 | ✅ TimestampPipe | 与Java过滤器一致 | - -#### 6.1 使用队列服务 -```typescript -// 正确使用方式 -import { Injectable } from '@nestjs/common'; -import { UnifiedQueueService } from '@wwjCore'; - -@Injectable() -export class DiyJob { - constructor( - private readonly queueService: UnifiedQueueService // 使用Core层队列服务 - ) {} - - async addJob(data: any, options?: any) { - try { - // 使用Core层队列服务添加任务 - await this.queueService.addTask('diy', 'DiyJob', data, options); - console.log('Diy job added to queue:', data); - } catch (error) { - console.error('Failed to add Diy job to queue:', error); - throw error; - } - } - - async processJob(data: any) { - try { - // 业务逻辑实现 - const result = await this.processDiyData(data); - return result; - } catch (error) { - console.error('Failed to process Diy job:', error); - throw error; - } - } - - private async processDiyData(data: any) { - // 业务逻辑实现 - return { processed: true, data }; - } -} -``` - -### 7. 命令生成器使用基础设施 - -#### 7.1 使用命令行工具 -```typescript -// 正确使用方式 -import { Injectable } from '@nestjs/common'; -import { Command, CommandRunner, Option } from 'nest-commander'; -import { Logger } from '@nestjs/common'; - -interface InstallCommandOptions { - name?: string; - verbose?: boolean; - force?: boolean; -} - -@Injectable() -@Command({ - name: 'install', - description: 'Install command description', -}) -export class InstallCommand extends CommandRunner { - private readonly logger = new Logger(InstallCommand.name); - - async run( - passedParams: string[], - options?: InstallCommandOptions, - ): Promise { - this.logger.log('Executing Install command...'); - - try { - // 业务逻辑实现 - await this.executeInstall(options); - this.logger.log('Install command completed successfully'); - } catch (error) { - this.logger.error('Install command failed:', error); - throw error; - } - } - - private async executeInstall(options?: InstallCommandOptions) { - // 业务逻辑实现 - this.logger.log(`Installing with options: ${JSON.stringify(options)}`); - } -} -``` - -## 迁移工具实现要求 - -### 1. 控制器生成器要求 -- 必须使用Common层守卫(JwtAuthGuard、RolesGuard) -- 必须使用Common层装饰器(@Roles、@Public) -- 必须使用Common层异常处理(BusinessException) -- 必须使用Common层管道(ParseDiyFormPipe等) -- 必须生成完整的HTTP方法(@Get、@Post、@Put、@Delete) - -### 2. 服务生成器要求 -- 必须继承Common层BaseService -- 必须使用Common层缓存服务(CacheService) -- 必须使用Common层响应系统(Result响应格式) -- 必须使用Common层日志服务(LoggingService) -- 必须生成完整的业务方法实现 - -### 3. 实体生成器要求 -- 必须继承Common层BaseEntity -- 必须使用正确的TypeORM装饰器 -- 必须生成完整的业务字段 -- 必须包含site_id多租户支持 - -### 4. DTO生成器要求 -- 必须使用class-validator装饰器 -- 必须继承Common层BaseDto -- 必须生成完整的字段定义 -- 必须使用Swagger文档装饰器 - -### 5. 监听器生成器要求 -- 必须使用Common层事件系统(EventModule) -- 必须使用Common层异常处理 -- 必须生成完整的事件处理逻辑 -- 必须使用Common层日志记录 - -### 6. 任务生成器要求 -- 必须使用Common层队列服务(QueueModule) -- 必须生成完整的任务方法 -- 必须使用Common层异常处理 -- 必须生成完整的业务逻辑 - -### 7. 命令生成器要求 -- 必须使用nest-commander框架 -- 必须使用Common层日志服务 -- 必须生成完整的命令逻辑 -- 必须使用Common层异常处理 - -## 总结 - -迁移工具必须正确使用Common层的基础设施,确保生成的业务代码能够充分利用框架能力。只有这样,才能生成真正可用的业务代码,而不是空壳。 - -## 下一步行动 - -1. 修改所有生成器,正确使用Common层基础设施 -2. 实现PHP源码解析器,提取真实的业务逻辑 -3. 完善语法转换,确保PHP语法正确转换为TypeScript语法 -4. 测试生成的业务代码,确保可以正常运行 diff --git a/tools/MIGRATION-RULES.md b/tools/MIGRATION-RULES.md deleted file mode 100644 index 3a8f4300..00000000 --- a/tools/MIGRATION-RULES.md +++ /dev/null @@ -1,76 +0,0 @@ -### WWJCloud Migration Tooling Rules - -Purpose: Standardize PHP→NestJS migration for AI-friendly, repeatable generation. Tools only; do not hand-edit generated outputs. - -— Scope & Principles — -- NestJS compliance: Follow official module/controller/service/entity/DTO patterns; DI-first; guards/pipes/interceptors. -- Core-only: Generators write strictly under `src/core/{module}/...`. Do NOT create/modify `src/common`, `src/vendor`, or `src/config`. -- Business-first: Migrate PHP business logic (services/controllers/models/validators). Replace PHP infra calls with `src/common/*` capabilities. -- Java-structure reference: Organize per module with `controllers/`, `services/`, `entity/`, `dto/`; controllers orchestrate, services hold business, entities map DB only. - -— Contracts & Compatibility — -- Database alignment: Table/column/index/types must match PHP 100%. No new/renamed/removed fields. -- Method alignment: Service method names map 1:1 with PHP. Do not invent names. -- Routing: Keep `/adminapi` and `/api` prefixes and controller segmentation consistent with PHP. -- Validation: Map PHP validators to DTO + class-validator/pipes. Behaviorally equivalent. - -— Naming & Paths — -- Files: kebab-case filenames - - Controllers: `*.controller.ts` - - Services: `*.service.ts` - - Entities: `*.entity.ts` -- Classes: PascalCase. -- Aliases (tsconfig): `@wwjCommon/*`, `@wwjCore/*`, `@wwjVendor/*`, `@/*`. - -— Infrastructure Mapping — -- Replace PHP infra with Common layer: - - Guards: `@wwjCommon/guards/*` (e.g., `jwt-auth.guard`, `roles.guard`, `optional-auth.guard`) - - Decorators: `@wwjCommon/decorators/*` (e.g., `roles.decorator`, `public.decorator`) - - Exceptions: `@wwjCommon/exceptions/business.exception` - - Pipes: `@wwjCommon/validation/pipes/*` (e.g., `parse-diy-form.pipe`, `json-transform.pipe`) - - Cache/Queue/DB utilities under `@wwjCommon/*` - - Do not reference `@wwjCore/*` for infra. - -— Module Generation — -- Generate `src/core/{module}/{module}.module.ts` registering discovered controllers/services. -- Entities: detect `*.entity.ts`; optionally include `TypeOrmModule.forFeature([...])` (feature flag). -- Filter non-business directories by default (whitelist/blacklist). Avoid generating modules for technical directories like `job/`, `queue/`, `workerman/`, `lang/`, etc. - -— Generation Stages (feature flags) — -- Commands: disabled by default (we do not use `nest-commander`). -- Jobs/Listeners: configurable; ensure no duplicate suffixes (avoid `JobJob`/`ListenerListener`). -- Routes: no separate route files (NestJS uses decorators). - -— Idempotency & Safety — -- Re-runnable: Same inputs → same outputs. Overwrite files in place; create missing directories; never delete parent folders. -- Dry-run mode: Output plan without writing files; provide diff-like summary. -- Logging: Summarize counts for modules/controllers/services/entities/validators, skipped items, and errors. - -— Security & Multitenancy — -- Guards: apply standard guards in controllers; enforce role checks and optional auth where applicable. -- Tenant isolation: preserve `site_id` semantics; avoid exposing sensitive fields in responses. - -— Quality Gates — -- After generation (tool-side), optionally run TypeScript compile and ESLint checks. Fail fast and report. -- Remove duplicate imports; standardize import order; ensure resolved alias paths. - -— Temporary Artifacts — -- All temporary scripts/docs/reports stay in `tools/`. Clean up when done. Never write temp files outside `tools/`. - -— Enforcement — -- “Only fix tools, not generated files.” If outputs are wrong, update tools and re-run. - -— Versioning & Extensibility — -- Keep infra replacement map versioned and extensible to support future modules and AI evolution. - -— Quick Checklist — -- [ ] Files are kebab-case; classes are PascalCase -- [ ] Controllers only orchestrate/validate; services hold business logic -- [ ] Entities map DB 1:1 with PHP schema -- [ ] All infra imports use `@wwjCommon/*` -- [ ] `/adminapi` and `/api` controllers generated correctly -- [ ] Modules register found controllers/services; optional TypeORM feature import -- [ ] Commands disabled; jobs/listeners gated; no duplicate suffixes -- [ ] Safe write, idempotent, dry-run available; logs emitted - - diff --git a/tools/QUICK-START.md b/tools/QUICK-START.md deleted file mode 100644 index e1938508..00000000 --- a/tools/QUICK-START.md +++ /dev/null @@ -1,233 +0,0 @@ -# 🚀 工具快速开始指南 - -## 📋 核心功能 - -1. **Dry-run 模式** - 预览生成结果,不实际修改文件 -2. **Quality Gate** - 自动化质量检查(TypeScript + ESLint) -3. **模块化生成器** - 12个专用生成器,职责清晰 - ---- - -## ⚡ 快速命令 - -### 1. 完整迁移(推荐) - -```bash -# 正常执行 -node tools/migration-coordinator.js - -# Dry-run 模式(仅预览) -DRY_RUN=true node tools/migration-coordinator.js -``` - -### 2. 单独运行生成器 - -```bash -# 实体生成器 -node tools/generators/entity-generator.js - -# 实体生成器 (dry-run) -DRY_RUN=true node tools/generators/entity-generator.js - -# 控制器生成器 -node tools/generators/controller-generator.js --dry-run -``` - -### 3. 质量检查 - -```bash -# 完整质量检查 -node tools/generators/quality-gate.js - -# 快速检查(仅核心层) -node tools/generators/quality-gate.js quick -``` - -### 4. 验证修复 - -```bash -# 验证所有修复是否正确 -node tools/test-fixes.js -``` - ---- - -## 🎯 典型工作流 - -### 场景1: 首次迁移 - -```bash -# 步骤1: 发现PHP文件 -node tools/php-file-discovery.js - -# 步骤2: 预览迁移结果(dry-run) -DRY_RUN=true node tools/migration-coordinator.js - -# 步骤3: 确认无误后执行实际迁移 -node tools/migration-coordinator.js - -# 步骤4: 质量检查 -node tools/generators/quality-gate.js -``` - -### 场景2: 单独生成某个模块 - -```bash -# 步骤1: 预览实体生成 -DRY_RUN=true node tools/generators/entity-generator.js - -# 步骤2: 实际生成实体 -node tools/generators/entity-generator.js - -# 步骤3: 生成控制器 -node tools/generators/controller-generator.js - -# 步骤4: 生成服务 -node tools/generators/service-generator.js - -# 步骤5: 生成模块文件 -node tools/generators/module-generator.js -``` - -### 场景3: 验证和质量检查 - -```bash -# 验证修复 -node tools/test-fixes.js - -# 质量检查 -node tools/generators/quality-gate.js - -# 如果有错误,查看详细输出 -VERBOSE=true node tools/generators/quality-gate.js -``` - ---- - -## 🔧 环境变量 - -| 变量 | 作用 | 示例 | -|------|------|------| -| `DRY_RUN` | 启用 dry-run 模式 | `DRY_RUN=true node tools/...` | -| `VERBOSE` | 详细输出模式 | `VERBOSE=true node tools/...` | - ---- - -## 📁 核心文件 - -| 文件 | 作用 | 何时使用 | -|------|------|---------| -| `migration-coordinator.js` | 主协调器 | 完整迁移流程 | -| `base-generator.js` | 基础生成器 | 被其他生成器继承 | -| `quality-gate.js` | 质量门禁 | 质量检查 | -| `test-fixes.js` | 验证脚本 | 验证修复是否正确 | - ---- - -## 💡 小技巧 - -### 1. 使用 dry-run 避免误操作 - -始终先用 dry-run 模式预览结果: -```bash -DRY_RUN=true node tools/migration-coordinator.js -``` - -### 2. 详细输出帮助调试 - -遇到问题时启用详细输出: -```bash -VERBOSE=true node tools/generators/entity-generator.js -``` - -### 3. 组合使用 - -```bash -# 同时启用 dry-run 和详细输出 -DRY_RUN=true VERBOSE=true node tools/migration-coordinator.js -``` - -### 4. 快速质量检查 - -开发过程中频繁运行快速检查: -```bash -node tools/generators/quality-gate.js quick -``` - ---- - -## ⚠️ 注意事项 - -1. **首次运行前备份** - - 建议先用 dry-run 模式预览 - - 确认结果正确后再实际执行 - -2. **Quality Gate 可能失败** - - TypeScript 编译错误 - - ESLint 规范问题 - - 可以先生成代码,后续修复 - -3. **生成器顺序建议** - ``` - 实体 → 验证器 → 服务 → 控制器 → 模块 - ``` - -4. **遇到错误时** - - 查看错误日志 - - 使用 VERBOSE 模式 - - 检查 PHP 源文件是否存在 - ---- - -## 🆘 常见问题 - -### Q: Dry-run 模式不生效? - -检查环境变量设置: -```bash -# macOS/Linux -DRY_RUN=true node tools/... - -# Windows PowerShell -$env:DRY_RUN="true"; node tools/... - -# Windows CMD -set DRY_RUN=true && node tools/... -``` - -### Q: Quality Gate 一直失败? - -可能原因: -1. TypeScript 配置问题 -2. ESLint 配置问题 -3. npm script 未配置 - -检查 `package.json`: -```json -{ - "scripts": { - "type-check": "tsc --noEmit", - "lint": "eslint src --ext .ts" - } -} -``` - -### Q: 生成的文件不符合预期? - -1. 检查 PHP 源文件是否存在 -2. 使用 VERBOSE 模式查看详细日志 -3. 检查 php-discovery-result.json 数据 - ---- - -## 📚 更多信息 - -- **完整文档**: [README.md](./README.md) -- **迁移规则**: [MIGRATION-RULES.md](./MIGRATION-RULES.md) -- **修复总结**: [FIX-SUMMARY.md](./FIX-SUMMARY.md) -- **基础设施指南**: [INFRASTRUCTURE-USAGE-GUIDE.md](./INFRASTRUCTURE-USAGE-GUIDE.md) - ---- - -**祝你使用愉快!** 🎉 - diff --git a/tools/README.md b/tools/README.md deleted file mode 100644 index 518b34fa..00000000 --- a/tools/README.md +++ /dev/null @@ -1,313 +0,0 @@ -# PHP到NestJS迁移工具 - -## 📋 工具概览 - -本目录包含完整的PHP到NestJS迁移工具链,按步骤执行,确保100%完成迁移。 - -## 📁 工具目录结构 - -``` -tools/ -├── migration-coordinator.js # 🎯 主协调器 -├── generators/ # 📦 生成器目录 -│ ├── controller-generator.js # 🎮 控制器生成器 -│ ├── service-generator.js # ⚙️ 服务生成器 -│ ├── entity-generator.js # 🏗️ 实体生成器 -│ ├── validator-generator.js # 📝 验证器生成器 -│ ├── middleware-generator.js # 🗑️ 已废弃,使用Core层Guards+Interceptors+Pipes -│ ├── route-generator.js # 🛣️ 路由生成器 -│ ├── job-generator.js # ⚡ 任务生成器 -│ ├── listener-generator.js # 👂 监听器生成器 -│ ├── command-generator.js # ⌨️ 命令生成器 -│ ├── dict-generator.js # 📚 字典生成器 -│ ├── business-logic-converter.js # 🔄 业务逻辑转换器 -│ └── module-generator.js # 📦 模块生成器 -├── php-file-discovery.js # 🔍 PHP文件发现工具 -├── php-discovery-result.json # 📊 发现结果数据 -└── README.md # 📖 说明文档 -``` - -## 🛠️ 工具列表 - -### 🎯 主协调器 -1. **`migration-coordinator.js`** - 迁移协调器(主控制器) - - 协调所有生成器的执行 - - 按步骤完成PHP到NestJS的迁移 - - 提供整体流程控制和统计报告 - - **新增**: 集成 Quality Gate 质量检查 - -### 🔧 基础设施工具 -1. **`base-generator.js`** - 基础生成器类 - - 提供通用的 dry-run 模式支持 - - 统一的文件操作和日志功能 - - 所有生成器的基类 - -2. **`quality-gate.js`** - 质量门禁工具 - - TypeScript 编译检查 - - ESLint 代码规范检查 - - 自动化质量保障 - -### 📦 生成器集合(generators/目录) -2. **`controller-generator.js`** - 控制器生成器 - - 生成NestJS控制器文件 - - 支持adminapi和api两层架构 - - 自动注入服务和依赖 - -3. **`service-generator.js`** - 服务生成器 - - 生成和更新NestJS服务 - - 处理admin/api/core三层架构 - - 转换PHP业务逻辑为TypeScript - -4. **`entity-generator.js`** - 实体生成器 - - 从PHP模型生成TypeORM实体 - - 自动映射数据库字段 - - 支持主键和关系映射 - -5. **`validator-generator.js`** - 验证器生成器 - - 生成NestJS DTO验证器 - - 包含class-validator装饰器 - - 支持Swagger文档注解 - -6. **`middleware-generator.js`** - 🗑️ 已废弃,使用Core层Guards+Interceptors+Pipes - - ❌ 已废弃:原生NestMiddleware已过时 - - ✅ 替代方案:使用Core层Guards+Interceptors+Pipes - - 🔄 与Java框架保持一致:都使用拦截器而非中间件 - -7. **`route-generator.js`** - 路由生成器 - - 生成NestJS路由配置 - - 支持模块化路由管理 - - 包含RESTful API路由 - -8. **`job-generator.js`** - 任务生成器 - - 生成NestJS定时任务 - - 支持@nestjs/schedule装饰器 - - 包含队列和批处理任务 - -9. **`listener-generator.js`** - 监听器生成器 - - 生成NestJS事件监听器 - - 支持@nestjs/event-emitter - - 处理业务事件和通知 - -10. **`command-generator.js`** - 命令生成器 - - 生成NestJS命令行工具 - - 支持nest-commander - - 包含系统维护命令 - -11. **`dict-generator.js`** - 字典生成器 - - 生成NestJS枚举和字典 - - 包含常量定义和映射 - - 支持多语言和配置 - -13. **`business-logic-converter.js`** - 业务逻辑转换器 - - PHP到TypeScript代码转换 - - 包含所有转换规则和语法修复 - - 被其他生成器调用的核心引擎 - -14. **`module-generator.js`** - 模块生成器 - - 生成NestJS模块文件 - - 处理依赖注入和导入 - - 支持模块间通信 - -### 🔍 辅助工具 -15. **`php-file-discovery.js`** - PHP文件发现工具 - - 扫描PHP项目结构 - - 发现所有相关文件(控制器、服务、模型等) - - 生成 `php-discovery-result.json` - -### 传统工具(保留) -5. **`real-business-logic-generator.js`** - 完整生成器(3000+行,建议逐步替换) - - 基于PHP结构生成NestJS代码框架 - - 创建控制器、服务、实体、DTO等文件 - - 生成完整的目录结构 - -6. **`php-business-logic-extractor.js`** - PHP业务逻辑提取器 - - 提取PHP真实业务逻辑 - - 转换为NestJS/TypeScript代码 - - 处理所有文件类型(控制器、服务、字典、任务、命令、监听器) - -7. **`module-generator.js`** - 模块文件生成器 - - 为每个模块生成 `.module.ts` 文件 - - 正确引用所有组件 - - 处理依赖关系 - -8. **`crud-method-completer.js`** - CRUD方法完善工具 - - 完善剩余的TODO CRUD方法 - - 实现真实的业务逻辑 - - 提供标准的增删改查实现 - -### 执行脚本 -6. **`run-migration.js`** - 完整迁移执行器 - - 按步骤执行所有工具 - - 提供进度报告 - - 错误处理和恢复 - -7. **`clean-and-migrate.js`** - 清理并重新迁移 - - 删除现有common层 - - 执行完整迁移流程 - - 一键重新开始 - -## 🚀 使用方法 - -### 🎯 推荐方法:新工具链 -```bash -# 使用新的模块化工具链(推荐) -node tools/migration-coordinator.js - -# Dry-run 模式(仅预览,不实际修改文件) -DRY_RUN=true node tools/migration-coordinator.js - -# 或使用命令行参数 -node tools/migration-coordinator.js --dry-run - -# 详细输出模式 -VERBOSE=true node tools/migration-coordinator.js -``` - -### 🚦 Quality Gate 独立运行 -```bash -# 完整质量检查 -node tools/generators/quality-gate.js - -# 快速检查(仅核心层) -node tools/generators/quality-gate.js quick -``` - -### 🔧 分步执行新工具 -```bash -# 步骤1: 发现PHP文件 -node tools/php-file-discovery.js - -# 步骤2: 使用新的协调器(包含所有12个生成器) -node tools/migration-coordinator.js - -# 步骤3: 单独运行特定生成器(可选,支持 dry-run) -DRY_RUN=true node tools/generators/controller-generator.js -node tools/generators/service-generator.js --dry-run -node tools/generators/entity-generator.js -# ... 其他生成器 - -# 步骤4: 质量检查 -node tools/generators/quality-gate.js -``` - -### 方法3: 传统工具链(逐步替换) -```bash -# 清理并重新迁移(一键完成) -node tools/clean-and-migrate.js -``` - -### 方法4: 分步执行传统工具 -```bash -# 执行完整迁移流程 -node tools/run-migration.js -``` - -### 方法5: 手动执行传统工具 -```bash -# 步骤1: 发现PHP文件 -node tools/php-file-discovery.js - -# 步骤2: 生成NestJS结构 -node tools/real-business-logic-generator.js - -# 步骤3: 提取PHP业务逻辑 -node tools/php-business-logic-extractor.js - -# 步骤4: 生成模块文件 -node tools/module-generator.js - -# 步骤5: 完善CRUD方法 -node tools/crud-method-completer.js -``` - -## 📊 迁移统计 - -### 🎯 新工具链统计(最新) -- **生成控制器**: 94个 -- **生成服务**: 190个(admin/api/core三层) -- **生成实体**: 64个 -- **生成验证器**: 34个 -- **生成中间件**: 8个 -- **生成路由**: 32个 -- **生成任务**: 22个 -- **生成监听器**: 43个 -- **生成命令**: 5个 -- **生成特征**: 2个 -- **生成字典**: 81个 -- **生成模块**: 28个 -- **总计文件**: **603个NestJS文件** -- **成功率**: **100%** - -### 📈 处理能力 -- **处理PHP方法**: 1248个业务逻辑方法 -- **转换规则**: 100+ 条PHP到TypeScript转换规则 -- **支持层级**: admin/api/core三层架构 -- **完成率**: 100%(基于真实PHP代码) - -## 🎯 迁移结果 - -迁移完成后,您将获得: - -- ✅ 完整的NestJS项目结构 -- ✅ 所有PHP控制器转换为NestJS控制器 -- ✅ 所有PHP服务转换为NestJS服务 -- ✅ 实体、DTO、验证器完整映射 -- ✅ 字典、任务、命令、监听器文件 -- ✅ 正确的模块依赖关系 -- ✅ 真实的业务逻辑(非TODO骨架) - -## 📁 输出目录 - -``` -wwjcloud-nest/src/core/ -├── {module1}/ -│ ├── {module1}.module.ts -│ ├── controllers/ -│ │ ├── adminapi/ -│ │ └── api/ -│ ├── services/ -│ │ ├── admin/ -│ │ ├── api/ -│ │ └── core/ -│ ├── entity/ -│ ├── dto/ -│ ├── dicts/ -│ ├── jobs/ -│ ├── commands/ -│ └── listeners/ -└── ... -``` - -## ⚠️ 注意事项 - -1. **备份重要文件**: 运行前请备份重要文件 -2. **检查PHP项目**: 确保PHP项目路径正确 -3. **依赖安装**: 确保已安装所有NestJS依赖 -4. **数据库连接**: 迁移后需要配置数据库连接 - -## 🔧 故障排除 - -### 常见问题 -1. **路径错误**: 检查 `phpBasePath` 和 `nestjsBasePath` 配置 -2. **权限问题**: 确保有文件读写权限 -3. **依赖缺失**: 运行 `npm install` 安装依赖 - -### 重新开始 -```bash -# 删除common层并重新迁移 -node tools/clean-and-migrate.js -``` - -## 📈 下一步 - -迁移完成后,建议: - -1. 检查生成的代码质量 -2. 完善剩余的CRUD方法 -3. 配置数据库连接 -4. 运行测试确保功能正常 -5. 启动NestJS服务验证 - ---- - -**提示**: 使用 `node tools/clean-and-migrate.js` 可以一键完成整个迁移流程! \ No newline at end of file diff --git a/tools/context-aware-converter.js b/tools/context-aware-converter.js deleted file mode 100644 index f7a6ad9f..00000000 --- a/tools/context-aware-converter.js +++ /dev/null @@ -1,482 +0,0 @@ -/** - * 上下文感知转换器 - * 为AI自动生成打下基石 - */ - -class ContextAwareConverter { - constructor() { - this.contextPatterns = { - // 文件类型模式 - fileTypes: { - service: { - patterns: [/Service\.php$/, /class\s+\w+Service/], - strategies: ['service_injection', 'repository_pattern', 'business_logic'] - }, - controller: { - patterns: [/Controller\.php$/, /class\s+\w+Controller/], - strategies: ['http_decorators', 'dto_validation', 'response_formatting'] - }, - entity: { - patterns: [/\.php$/, /class\s+\w+(?!Service|Controller)/], - strategies: ['typeorm_decorators', 'property_mapping', 'relationship_mapping'] - }, - dto: { - patterns: [/Dto\.php$/, /class\s+\w+Dto/], - strategies: ['validation_decorators', 'property_types', 'serialization'] - } - }, - - // 业务领域模式 - businessDomains: { - user: { - patterns: [/User/, /Auth/, /Login/], - strategies: ['jwt_auth', 'role_based_access', 'user_validation'] - }, - payment: { - patterns: [/Pay/, /Order/, /Transaction/], - strategies: ['payment_processing', 'order_management', 'transaction_logging'] - }, - content: { - patterns: [/Content/, /Article/, /Post/], - strategies: ['content_management', 'seo_optimization', 'media_handling'] - }, - system: { - patterns: [/System/, /Config/, /Setting/], - strategies: ['configuration_management', 'system_monitoring', 'admin_functions'] - } - }, - - // 代码模式 - codePatterns: { - crud: { - patterns: [/create/, /read/, /update/, /delete/], - strategies: ['repository_methods', 'validation_rules', 'error_handling'] - }, - api: { - patterns: [/get/, /post/, /put/, /delete/], - strategies: ['http_methods', 'route_decorators', 'request_validation'] - }, - validation: { - patterns: [/validate/, /check/, /verify/], - strategies: ['validation_pipes', 'custom_validators', 'error_messages'] - }, - cache: { - patterns: [/cache/, /redis/, /memcache/], - strategies: ['cache_decorators', 'cache_keys', 'expiration_handling'] - } - } - }; - - this.conversionStrategies = { - service_injection: this.applyServiceInjection.bind(this), - repository_pattern: this.applyRepositoryPattern.bind(this), - business_logic: this.applyBusinessLogic.bind(this), - http_decorators: this.applyHttpDecorators.bind(this), - dto_validation: this.applyDtoValidation.bind(this), - response_formatting: this.applyResponseFormatting.bind(this), - typeorm_decorators: this.applyTypeOrmDecorators.bind(this), - property_mapping: this.applyPropertyMapping.bind(this), - relationship_mapping: this.applyRelationshipMapping.bind(this), - validation_decorators: this.applyValidationDecorators.bind(this), - property_types: this.applyPropertyTypes.bind(this), - serialization: this.applySerialization.bind(this), - jwt_auth: this.applyJwtAuth.bind(this), - role_based_access: this.applyRoleBasedAccess.bind(this), - user_validation: this.applyUserValidation.bind(this), - payment_processing: this.applyPaymentProcessing.bind(this), - order_management: this.applyOrderManagement.bind(this), - transaction_logging: this.applyTransactionLogging.bind(this), - content_management: this.applyContentManagement.bind(this), - seo_optimization: this.applySeoOptimization.bind(this), - media_handling: this.applyMediaHandling.bind(this), - configuration_management: this.applyConfigurationManagement.bind(this), - system_monitoring: this.applySystemMonitoring.bind(this), - admin_functions: this.applyAdminFunctions.bind(this), - repository_methods: this.applyRepositoryMethods.bind(this), - validation_rules: this.applyValidationRules.bind(this), - error_handling: this.applyErrorHandling.bind(this), - http_methods: this.applyHttpMethods.bind(this), - route_decorators: this.applyRouteDecorators.bind(this), - request_validation: this.applyRequestValidation.bind(this), - validation_pipes: this.applyValidationPipes.bind(this), - custom_validators: this.applyCustomValidators.bind(this), - error_messages: this.applyErrorMessages.bind(this), - cache_decorators: this.applyCacheDecorators.bind(this), - cache_keys: this.applyCacheKeys.bind(this), - expiration_handling: this.applyExpirationHandling.bind(this) - }; - } - - /** - * 分析代码上下文 - */ - analyzeContext(filePath, className, content) { - const context = { - filePath, - className, - fileType: this.detectFileType(filePath, className, content), - businessDomain: this.detectBusinessDomain(content), - codePatterns: this.detectCodePatterns(content), - strategies: [], - imports: [], - decorators: [], - methods: [], - properties: [] - }; - - // 根据检测到的模式选择转换策略 - context.strategies = this.selectStrategies(context); - - // 分析代码结构 - this.analyzeCodeStructure(content, context); - - return context; - } - - /** - * 检测文件类型 - */ - detectFileType(filePath, className, content) { - for (const [type, config] of Object.entries(this.contextPatterns.fileTypes)) { - for (const pattern of config.patterns) { - if (pattern.test(filePath) || pattern.test(className) || pattern.test(content)) { - return type; - } - } - } - return 'unknown'; - } - - /** - * 检测业务领域 - */ - detectBusinessDomain(content) { - for (const [domain, config] of Object.entries(this.contextPatterns.businessDomains)) { - for (const pattern of config.patterns) { - if (pattern.test(content)) { - return domain; - } - } - } - return 'general'; - } - - /** - * 检测代码模式 - */ - detectCodePatterns(content) { - const patterns = []; - - for (const [pattern, config] of Object.entries(this.contextPatterns.codePatterns)) { - for (const regex of config.patterns) { - if (regex.test(content)) { - patterns.push(pattern); - break; - } - } - } - - return patterns; - } - - /** - * 选择转换策略 - */ - selectStrategies(context) { - const strategies = new Set(); - - // 根据文件类型添加策略 - if (context.fileType !== 'unknown') { - const fileTypeConfig = this.contextPatterns.fileTypes[context.fileType]; - fileTypeConfig.strategies.forEach(strategy => strategies.add(strategy)); - } - - // 根据业务领域添加策略 - if (context.businessDomain !== 'general') { - const domainConfig = this.contextPatterns.businessDomains[context.businessDomain]; - domainConfig.strategies.forEach(strategy => strategies.add(strategy)); - } - - // 根据代码模式添加策略 - context.codePatterns.forEach(pattern => { - const patternConfig = this.contextPatterns.codePatterns[pattern]; - patternConfig.strategies.forEach(strategy => strategies.add(strategy)); - }); - - return Array.from(strategies); - } - - /** - * 分析代码结构 - */ - analyzeCodeStructure(content, context) { - // 提取类名 - const classMatch = content.match(/class\s+(\w+)/); - if (classMatch) { - context.className = classMatch[1]; - } - - // 提取方法 - const methodMatches = content.match(/function\s+(\w+)\s*\([^)]*\)/g); - if (methodMatches) { - context.methods = methodMatches.map(match => { - const methodMatch = match.match(/function\s+(\w+)/); - return methodMatch ? methodMatch[1] : null; - }).filter(Boolean); - } - - // 提取属性 - const propertyMatches = content.match(/\$(\w+)/g); - if (propertyMatches) { - context.properties = [...new Set(propertyMatches.map(match => match.substring(1)))]; - } - - // 提取导入 - const importMatches = content.match(/use\s+([^;]+);/g); - if (importMatches) { - context.imports = importMatches.map(match => { - const importMatch = match.match(/use\s+([^;]+);/); - return importMatch ? importMatch[1] : null; - }).filter(Boolean); - } - } - - /** - * 应用上下文感知转换 - */ - applyContextAwareConversion(code, context) { - let convertedCode = code; - - console.log(`🎭 应用上下文感知转换: ${context.fileType} - ${context.businessDomain}`); - console.log(`📋 转换策略: ${context.strategies.join(', ')}`); - - // 应用选定的转换策略 - context.strategies.forEach(strategy => { - if (this.conversionStrategies[strategy]) { - convertedCode = this.conversionStrategies[strategy](convertedCode, context); - } - }); - - return convertedCode; - } - - // 转换策略实现 - applyServiceInjection(code, context) { - // 服务注入转换逻辑 - return code.replace(/new\s+(\w+Service)\(\)/g, 'this.$1'); - } - - applyRepositoryPattern(code, context) { - // 仓储模式转换逻辑 - return code.replace(/this->model/g, 'this.repository'); - } - - applyBusinessLogic(code, context) { - // 业务逻辑转换 - return code; - } - - applyHttpDecorators(code, context) { - // HTTP装饰器转换 - return code; - } - - applyDtoValidation(code, context) { - // DTO验证转换 - return code; - } - - applyResponseFormatting(code, context) { - // 响应格式化转换 - return code.replace(/return\s+success\s*\(([^)]+)\)/g, 'return { success: true, data: $1 };'); - } - - applyTypeOrmDecorators(code, context) { - // TypeORM装饰器转换 - return code; - } - - applyPropertyMapping(code, context) { - // 属性映射转换 - return code; - } - - applyRelationshipMapping(code, context) { - // 关系映射转换 - return code; - } - - applyValidationDecorators(code, context) { - // 验证装饰器转换 - return code; - } - - applyPropertyTypes(code, context) { - // 属性类型转换 - return code; - } - - applySerialization(code, context) { - // 序列化转换 - return code; - } - - applyJwtAuth(code, context) { - // JWT认证转换 - return code; - } - - applyRoleBasedAccess(code, context) { - // 基于角色的访问控制转换 - return code; - } - - applyUserValidation(code, context) { - // 用户验证转换 - return code; - } - - applyPaymentProcessing(code, context) { - // 支付处理转换 - return code; - } - - applyOrderManagement(code, context) { - // 订单管理转换 - return code; - } - - applyTransactionLogging(code, context) { - // 事务日志转换 - return code; - } - - applyContentManagement(code, context) { - // 内容管理转换 - return code; - } - - applySeoOptimization(code, context) { - // SEO优化转换 - return code; - } - - applyMediaHandling(code, context) { - // 媒体处理转换 - return code; - } - - applyConfigurationManagement(code, context) { - // 配置管理转换 - return code; - } - - applySystemMonitoring(code, context) { - // 系统监控转换 - return code; - } - - applyAdminFunctions(code, context) { - // 管理功能转换 - return code; - } - - applyRepositoryMethods(code, context) { - // 仓储方法转换 - return code; - } - - applyValidationRules(code, context) { - // 验证规则转换 - return code; - } - - applyErrorHandling(code, context) { - // 错误处理转换 - return code.replace(/throw\s+new\s+CommonException/g, 'throw new BusinessException'); - } - - applyHttpMethods(code, context) { - // HTTP方法转换 - return code; - } - - applyRouteDecorators(code, context) { - // 路由装饰器转换 - return code; - } - - applyRequestValidation(code, context) { - // 请求验证转换 - return code; - } - - applyValidationPipes(code, context) { - // 验证管道转换 - return code; - } - - applyCustomValidators(code, context) { - // 自定义验证器转换 - return code; - } - - applyErrorMessages(code, context) { - // 错误消息转换 - return code; - } - - applyCacheDecorators(code, context) { - // 缓存装饰器转换 - return code; - } - - applyCacheKeys(code, context) { - // 缓存键转换 - return code; - } - - applyExpirationHandling(code, context) { - // 过期处理转换 - return code; - } - - /** - * 生成上下文报告 - */ - generateContextReport(context) { - return { - fileType: context.fileType, - businessDomain: context.businessDomain, - codePatterns: context.codePatterns, - strategies: context.strategies, - methods: context.methods, - properties: context.properties, - imports: context.imports, - complexity: this.calculateComplexity(context) - }; - } - - /** - * 计算代码复杂度 - */ - calculateComplexity(context) { - let complexity = 0; - - // 基于方法数量 - complexity += context.methods.length * 2; - - // 基于属性数量 - complexity += context.properties.length; - - // 基于策略数量 - complexity += context.strategies.length * 3; - - // 基于代码模式 - complexity += context.codePatterns.length * 5; - - return complexity; - } -} - -module.exports = ContextAwareConverter; diff --git a/tools/conversion-pipeline.js b/tools/conversion-pipeline.js deleted file mode 100644 index 957b82ad..00000000 --- a/tools/conversion-pipeline.js +++ /dev/null @@ -1,455 +0,0 @@ -/** - * 多阶段转换管道 - * 为AI自动生成打下基石 - */ - -const ConversionRulesDatabase = require('./conversion-rules-database'); - -class ConversionPipeline { - constructor() { - this.rulesDB = new ConversionRulesDatabase(); - this.stages = [ - 'preprocessing', // 预处理 - 'syntax', // 语法转换 - 'semantic', // 语义转换 - 'context', // 上下文转换 - 'validation', // 验证 - 'postprocessing' // 后处理 - ]; - - this.stageHandlers = { - preprocessing: this.preprocess.bind(this), - syntax: this.convertSyntax.bind(this), - semantic: this.convertSemantic.bind(this), - context: this.convertContext.bind(this), - validation: this.validate.bind(this), - postprocessing: this.postprocess.bind(this) - }; - } - - /** - * 执行完整转换管道 - */ - async convert(phpCode, context = {}) { - let convertedCode = phpCode; - const results = { - original: phpCode, - stages: {}, - errors: [], - warnings: [], - metrics: {} - }; - - console.log('🚀 开始多阶段转换管道...'); - - for (const stage of this.stages) { - try { - console.log(`📋 执行阶段: ${stage}`); - const startTime = Date.now(); - - convertedCode = await this.stageHandlers[stage](convertedCode, context, results); - - const endTime = Date.now(); - results.stages[stage] = { - input: results.stages[stage - 1]?.output || phpCode, - output: convertedCode, - duration: endTime - startTime, - success: true - }; - - console.log(`✅ 阶段 ${stage} 完成 (${endTime - startTime}ms)`); - } catch (error) { - console.error(`❌ 阶段 ${stage} 失败:`, error.message); - results.errors.push({ - stage, - error: error.message, - stack: error.stack - }); - results.stages[stage] = { - success: false, - error: error.message - }; - } - } - - results.final = convertedCode; - results.metrics = this.calculateMetrics(results); - - console.log('🎉 转换管道完成!'); - return results; - } - - /** - * 预处理阶段 - */ - async preprocess(code, context, results) { - console.log(' 🔧 预处理: 清理和标准化代码...'); - - // 清理代码 - let processed = code - // 移除多余的空白 - .replace(/\s+/g, ' ') - .replace(/\n\s*\n/g, '\n') - // 标准化换行 - .replace(/\r\n/g, '\n') - .replace(/\r/g, '\n') - // 移除注释中的特殊字符 - .replace(/\/\*[\s\S]*?\*\//g, (match) => { - return match.replace(/[^\x20-\x7E\n]/g, ''); - }); - - // 检测代码特征 - const features = this.detectFeatures(processed); - context.features = features; - - console.log(` 📊 检测到特征: ${Object.keys(features).join(', ')}`); - - return processed; - } - - /** - * 语法转换阶段 - */ - async convertSyntax(code, context, results) { - console.log(' 🔄 语法转换: 基础PHP到TypeScript转换...'); - - // 应用基础语法转换规则 - let converted = this.rulesDB.applyRules(code, 'syntax'); - - // 应用类型转换规则 - converted = this.rulesDB.applyRules(converted, 'types'); - - // 应用方法转换规则 - converted = this.rulesDB.applyRules(converted, 'methods'); - - // 应用数组和对象转换规则 - converted = this.rulesDB.applyRules(converted, 'collections'); - - // 应用异常处理转换规则 - converted = this.rulesDB.applyRules(converted, 'exceptions'); - - // 应用字符串处理规则 - converted = this.rulesDB.applyRules(converted, 'strings'); - - console.log(` 📈 语法转换完成,代码长度: ${converted.length}`); - - return converted; - } - - /** - * 语义转换阶段 - */ - async convertSemantic(code, context, results) { - console.log(' 🧠 语义转换: 业务逻辑语义转换...'); - - // 应用服务调用转换规则 - let converted = this.rulesDB.applyRules(code, 'services'); - - // 智能识别和转换业务逻辑模式 - converted = this.convertBusinessPatterns(converted, context); - - // 转换控制流 - converted = this.convertControlFlow(converted, context); - - console.log(` 🎯 语义转换完成,业务模式识别: ${context.features?.businessPatterns?.length || 0}个`); - - return converted; - } - - /** - * 上下文转换阶段 - */ - async convertContext(code, context, results) { - console.log(' 🎭 上下文转换: 根据代码上下文优化转换...'); - - let converted = code; - - // 根据文件类型应用不同的转换策略 - if (context.fileType === 'service') { - converted = this.convertServiceContext(converted, context); - } else if (context.fileType === 'controller') { - converted = this.convertControllerContext(converted, context); - } else if (context.fileType === 'entity') { - converted = this.convertEntityContext(converted, context); - } - - // 根据业务领域应用特定转换 - if (context.businessDomain) { - converted = this.convertBusinessDomain(converted, context); - } - - console.log(` 🏗️ 上下文转换完成,文件类型: ${context.fileType || 'unknown'}`); - - return converted; - } - - /** - * 验证阶段 - */ - async validate(code, context, results) { - console.log(' ✅ 验证: 检查转换质量和语法正确性...'); - - const validation = { - syntax: this.validateSyntax(code), - types: this.validateTypes(code), - imports: this.validateImports(code), - business: this.validateBusinessLogic(code, context) - }; - - // 收集验证结果 - const errors = []; - const warnings = []; - - Object.entries(validation).forEach(([type, result]) => { - if (result.errors) { - errors.push(...result.errors.map(e => ({ type, ...e }))); - } - if (result.warnings) { - warnings.push(...result.warnings.map(w => ({ type, ...w }))); - } - }); - - results.errors.push(...errors); - results.warnings.push(...warnings); - - console.log(` 📊 验证完成: ${errors.length}个错误, ${warnings.length}个警告`); - - return code; - } - - /** - * 后处理阶段 - */ - async postprocess(code, context, results) { - console.log(' 🎨 后处理: 最终优化和格式化...'); - - // 应用语法错误修复规则 - let processed = this.rulesDB.applyRules(code, 'syntaxFixes'); - - // 格式化代码 - processed = this.formatCode(processed); - - // 添加必要的导入语句 - processed = this.addImports(processed, context); - - console.log(` 🎉 后处理完成,最终代码长度: ${processed.length}`); - - return processed; - } - - /** - * 检测代码特征 - */ - detectFeatures(code) { - const features = { - hasClasses: /class\s+\w+/.test(code), - hasFunctions: /function\s+\w+/.test(code), - hasArrays: /array\s*\(/.test(code), - hasObjects: /->\s*\w+/.test(code), - hasExceptions: /throw\s+new/.test(code), - hasServices: /new\s+[A-Z]\w+Service/.test(code), - hasControllers: /class\s+\w+Controller/.test(code), - hasEntities: /@Entity|@Table/.test(code), - businessPatterns: [] - }; - - // 检测业务模式 - const businessPatterns = [ - { pattern: /success\s*\(/, name: 'success_response' }, - { pattern: /error\s*\(/, name: 'error_response' }, - { pattern: /validate\s*\(/, name: 'validation' }, - { pattern: /cache\s*\(/, name: 'caching' }, - { pattern: /log\s*\(/, name: 'logging' } - ]; - - businessPatterns.forEach(({ pattern, name }) => { - if (pattern.test(code)) { - features.businessPatterns.push(name); - } - }); - - return features; - } - - /** - * 转换业务模式 - */ - convertBusinessPatterns(code, context) { - let converted = code; - - // 转换success响应 - converted = converted.replace(/return\s+success\s*\(([^)]+)\)/g, (match, data) => { - return `return { success: true, data: ${data} };`; - }); - - // 转换error响应 - converted = converted.replace(/return\s+error\s*\(([^)]+)\)/g, (match, message) => { - return `throw new BusinessException(${message});`; - }); - - return converted; - } - - /** - * 转换控制流 - */ - convertControlFlow(code, context) { - let converted = code; - - // 转换PHP控制流到TypeScript - converted = converted.replace(/foreach\s*\(\s*([^)]+)\s+as\s+([^)]+)\s*\)/g, 'for (const $2 of $1)'); - converted = converted.replace(/foreach\s*\(\s*([^)]+)\s+as\s+([^)]+)\s*=>\s*([^)]+)\s*\)/g, 'for (const [$3, $2] of Object.entries($1))'); - - return converted; - } - - /** - * 服务上下文转换 - */ - convertServiceContext(code, context) { - // 服务特定的转换逻辑 - return code; - } - - /** - * 控制器上下文转换 - */ - convertControllerContext(code, context) { - // 控制器特定的转换逻辑 - return code; - } - - /** - * 实体上下文转换 - */ - convertEntityContext(code, context) { - // 实体特定的转换逻辑 - return code; - } - - /** - * 业务领域转换 - */ - convertBusinessDomain(code, context) { - // 根据业务领域应用特定转换 - return code; - } - - /** - * 验证语法 - */ - validateSyntax(code) { - const errors = []; - const warnings = []; - - // 检查基本语法错误 - if (code.includes(']]')) { - errors.push({ message: '发现方括号错误', line: this.findLineNumber(code, ']]') }); - } - - if (code.includes('BusinessBusinessException')) { - errors.push({ message: '发现重复的Business前缀', line: this.findLineNumber(code, 'BusinessBusinessException') }); - } - - return { errors, warnings }; - } - - /** - * 验证类型 - */ - validateTypes(code) { - const errors = []; - const warnings = []; - - // 类型验证逻辑 - return { errors, warnings }; - } - - /** - * 验证导入 - */ - validateImports(code) { - const errors = []; - const warnings = []; - - // 导入验证逻辑 - return { errors, warnings }; - } - - /** - * 验证业务逻辑 - */ - validateBusinessLogic(code, context) { - const errors = []; - const warnings = []; - - // 业务逻辑验证 - return { errors, warnings }; - } - - /** - * 格式化代码 - */ - formatCode(code) { - // 简单的代码格式化 - return code - .replace(/\s+/g, ' ') - .replace(/\n\s*\n/g, '\n') - .trim(); - } - - /** - * 添加导入语句 - */ - addImports(code, context) { - // 根据代码内容添加必要的导入 - let imports = []; - - if (code.includes('BusinessException')) { - imports.push("import { BusinessException } from '@wwjCommon/exceptions/business.exception';"); - } - - if (code.includes('@Injectable')) { - imports.push("import { Injectable } from '@nestjs/common';"); - } - - if (imports.length > 0) { - return imports.join('\n') + '\n\n' + code; - } - - return code; - } - - /** - * 计算指标 - */ - calculateMetrics(results) { - const originalLength = results.original.length; - const finalLength = results.final.length; - - return { - originalLength, - finalLength, - compressionRatio: (originalLength - finalLength) / originalLength, - errorCount: results.errors.length, - warningCount: results.warnings.length, - stageCount: Object.keys(results.stages).length, - totalDuration: Object.values(results.stages).reduce((sum, stage) => sum + (stage.duration || 0), 0) - }; - } - - /** - * 查找行号 - */ - findLineNumber(code, searchText) { - const lines = code.split('\n'); - for (let i = 0; i < lines.length; i++) { - if (lines[i].includes(searchText)) { - return i + 1; - } - } - return -1; - } -} - -module.exports = ConversionPipeline; diff --git a/tools/conversion-rules-database.js b/tools/conversion-rules-database.js deleted file mode 100644 index c67e637d..00000000 --- a/tools/conversion-rules-database.js +++ /dev/null @@ -1,207 +0,0 @@ -/** - * PHP到TypeScript转换规则数据库 - * 为AI自动生成打下基石 - */ - -class ConversionRulesDatabase { - constructor() { - this.rules = { - // 基础语法转换 - syntax: { - variables: [ - { pattern: /\$this->([a-zA-Z_][a-zA-Z0-9_]*)/g, replacement: 'this.$1', description: 'PHP对象属性访问' }, - { pattern: /\$([a-zA-Z_][a-zA-Z0-9_]*)/g, replacement: '$1', description: 'PHP变量声明' }, - { pattern: /self::\$([a-zA-Z_][a-zA-Z0-9_]*)/g, replacement: 'self.$1', description: 'PHP静态变量访问' }, - { pattern: /static::\$([a-zA-Z_][a-zA-Z0-9_]*)/g, replacement: 'static.$1', description: 'PHP静态变量访问' } - ], - - operators: [ - { pattern: /\?\?/g, replacement: '||', description: 'PHP空值合并操作符' }, - { pattern: /->/g, replacement: '.', description: 'PHP对象访问操作符' }, - { pattern: /::/g, replacement: '.', description: 'PHP静态访问操作符' }, - { pattern: /===/g, replacement: '===', description: '严格相等比较' }, - { pattern: /====/g, replacement: '===', description: '修复重复等号' } - ], - - functions: [ - { pattern: /empty\s*\(\s*([^)]+)\s*\)/g, replacement: '!$1', description: 'PHP empty函数' }, - { pattern: /isset\s*\(\s*([^)]+)\s*\)/g, replacement: '$1 !== undefined', description: 'PHP isset函数' }, - { pattern: /is_null\s*\(\s*([^)]+)\s*\)/g, replacement: '$1 === null', description: 'PHP is_null函数' }, - { pattern: /is_array\s*\(\s*([^)]+)\s*\)/g, replacement: 'Array.isArray($1)', description: 'PHP is_array函数' }, - { pattern: /is_string\s*\(\s*([^)]+)\s*\)/g, replacement: 'typeof $1 === "string"', description: 'PHP is_string函数' }, - { pattern: /is_numeric\s*\(\s*([^)]+)\s*\)/g, replacement: '!isNaN($1)', description: 'PHP is_numeric函数' }, - { pattern: /env\(([^)]+)\)/g, replacement: 'process.env.$1', description: 'PHP env函数' } - ] - }, - - // 类型转换 - types: { - parameters: [ - { pattern: /string\s+\$([a-zA-Z_][a-zA-Z0-9_]*)/g, replacement: '$1: string', description: 'PHP字符串参数' }, - { pattern: /int\s+\$([a-zA-Z_][a-zA-Z0-9_]*)/g, replacement: '$1: number', description: 'PHP整数参数' }, - { pattern: /array\s+\$([a-zA-Z_][a-zA-Z0-9_]*)/g, replacement: '$1: any[]', description: 'PHP数组参数' }, - { pattern: /bool\s+\$([a-zA-Z_][a-zA-Z0-9_]*)/g, replacement: '$1: boolean', description: 'PHP布尔参数' } - ], - - declarations: [ - { pattern: /array\s+/g, replacement: '', description: 'PHP数组类型声明' }, - { pattern: /:\s*array/g, replacement: ': any[]', description: 'PHP数组返回类型' } - ] - }, - - // 方法转换 - methods: { - declarations: [ - { pattern: /public\s+function\s+/g, replacement: 'async ', description: 'PHP公共方法' }, - { pattern: /private\s+function\s+/g, replacement: 'private async ', description: 'PHP私有方法' }, - { pattern: /protected\s+function\s+/g, replacement: 'protected async ', description: 'PHP受保护方法' } - ], - - constructors: [ - { pattern: /parent::__construct\(\)/g, replacement: 'super()', description: 'PHP父类构造函数调用' }, - { pattern: /new\s+static\s*\(([^)]*)\)/g, replacement: 'new this.constructor($1)', description: 'PHP静态实例化' } - ] - }, - - // 数组和对象转换 - collections: { - arrays: [ - { pattern: /array\(\)/g, replacement: '[]', description: 'PHP空数组' }, - { pattern: /array\(([^)]+)\)/g, replacement: '[$1]', description: 'PHP数组语法' }, - { pattern: /'([a-zA-Z_][a-zA-Z0-9_]*)'\s*=>/g, replacement: '$1:', description: 'PHP关联数组键' }, - { pattern: /"([a-zA-Z_][a-zA-Z0-9_]*)"\s*=>/g, replacement: '$1:', description: 'PHP关联数组键(双引号)' } - ], - - objects: [ - { pattern: /\[\s*\]/g, replacement: '[]', description: '空数组语法' }, - { pattern: /\(\s*\)/g, replacement: '()', description: '空括号语法' } - ] - }, - - // 异常处理转换 - exceptions: [ - { pattern: /CommonException/g, replacement: 'BusinessException', description: 'PHP通用异常' }, - { pattern: /(?\s*(\w+)\(/g, replacement: '($1).$2(', description: 'PHP服务方法调用' }, - { pattern: /(\w+_service)\s*\.\s*(\w+)\(/g, replacement: '$1.$2(', description: 'PHP服务变量调用' } - ] - }, - - // 字符串处理 - strings: [ - { pattern: /\.\s*=/g, replacement: '+=', description: 'PHP字符串连接赋值' }, - { pattern: /\.(\s*['""])/g, replacement: ' + $1', description: 'PHP字符串连接' }, - { pattern: /process\.env\.'([^']+)'/g, replacement: 'process.env.$1', description: '修复process.env引号' } - ], - - // 语法错误修复 - syntaxFixes: { - brackets: [ - { pattern: /\(([^)]+)\]/g, replacement: '($1)', description: '修复函数调用中的方括号' }, - { pattern: /(\w+)\]/g, replacement: '$1)', description: '修复变量后的方括号' }, - { pattern: /\]\s*;/g, replacement: ');', description: '修复方括号后分号' }, - { pattern: /\]\s*\)/g, replacement: '))', description: '修复方括号后括号' }, - { pattern: /\]\s*\{/g, replacement: ') {', description: '修复方括号后大括号' }, - { pattern: /\]\s*,/g, replacement: '),', description: '修复方括号后逗号' } - ], - - specific: [ - { pattern: /(\w+_id)\]/g, replacement: '$1)', description: '修复ID变量方括号' }, - { pattern: /(\w+_key)\]/g, replacement: '$1)', description: '修复KEY变量方括号' }, - { pattern: /(\w+_type)\]/g, replacement: '$1)', description: '修复TYPE变量方括号' }, - { pattern: /(\w+_name)\]/g, replacement: '$1)', description: '修复NAME变量方括号' }, - { pattern: /(\w+_code)\]/g, replacement: '$1)', description: '修复CODE变量方括号' }, - { pattern: /(\w+_value)\]/g, replacement: '$1)', description: '修复VALUE变量方括号' } - ], - - functions: [ - { pattern: /(\w+)\(([^)]+)\]/g, replacement: '$1($2)', description: '修复函数调用方括号' }, - { pattern: /(\w+)\.(\w+)\(([^)]+)\]/g, replacement: '$1.$2($3)', description: '修复方法调用方括号' } - ] - } - }; - } - - /** - * 获取转换规则 - */ - getRules(category = null) { - if (category) { - return this.rules[category] || {}; - } - return this.rules; - } - - /** - * 添加新规则 - */ - addRule(category, rule) { - if (!this.rules[category]) { - this.rules[category] = []; - } - this.rules[category].push(rule); - } - - /** - * 应用转换规则 - */ - applyRules(code, category = null) { - let convertedCode = code; - const rulesToApply = category ? this.getRules(category) : this.rules; - - // 递归应用所有规则 - const applyCategoryRules = (rules) => { - if (Array.isArray(rules)) { - rules.forEach(rule => { - convertedCode = convertedCode.replace(rule.pattern, rule.replacement); - }); - } else if (typeof rules === 'object') { - Object.values(rules).forEach(categoryRules => { - applyCategoryRules(categoryRules); - }); - } - }; - - applyCategoryRules(rulesToApply); - return convertedCode; - } - - /** - * 获取规则统计信息 - */ - getStats() { - const stats = { - total: 0, - byCategory: {} - }; - - const countRules = (rules, category = '') => { - if (Array.isArray(rules)) { - stats.total += rules.length; - if (category) { - stats.byCategory[category] = rules.length; - } - } else if (typeof rules === 'object') { - Object.entries(rules).forEach(([key, value]) => { - countRules(value, key); - }); - } - }; - - countRules(this.rules); - return stats; - } -} - -module.exports = ConversionRulesDatabase; diff --git a/tools/enhanced-business-logic-converter.js b/tools/enhanced-business-logic-converter.js deleted file mode 100644 index 6f74df91..00000000 --- a/tools/enhanced-business-logic-converter.js +++ /dev/null @@ -1,477 +0,0 @@ -/** - * 增强版业务逻辑转换器 - * 集成转换规则数据库、多阶段转换管道、上下文感知转换和质量保证系统 - * 为AI自动生成打下基石 - */ - -const ConversionRulesDatabase = require('./conversion-rules-database'); -const ConversionPipeline = require('./conversion-pipeline'); -const ContextAwareConverter = require('./context-aware-converter'); -const QualityAssurance = require('./quality-assurance'); - -class EnhancedBusinessLogicConverter { - constructor() { - this.rulesDB = new ConversionRulesDatabase(); - this.pipeline = new ConversionPipeline(); - this.contextConverter = new ContextAwareConverter(); - this.qualityAssurance = new QualityAssurance(); - - this.stats = { - totalConversions: 0, - successfulConversions: 0, - failedConversions: 0, - averageQuality: 0, - conversionTime: 0 - }; - } - - /** - * 执行增强版转换 - */ - async convert(phpCode, filePath, className) { - const startTime = Date.now(); - this.stats.totalConversions++; - - try { - console.log('🚀 开始增强版业务逻辑转换...'); - console.log(`📁 文件: ${filePath}`); - console.log(`🏷️ 类名: ${className}`); - - // 1. 分析上下文 - const context = this.contextConverter.analyzeContext(filePath, className, phpCode); - console.log(`🎭 上下文分析完成: ${context.fileType} - ${context.businessDomain}`); - - // 2. 执行多阶段转换管道 - const pipelineResults = await this.pipeline.convert(phpCode, context); - console.log(`🔄 转换管道完成: ${pipelineResults.metrics.totalDuration}ms`); - - // 3. 应用上下文感知转换 - const contextAwareCode = this.contextConverter.applyContextAwareConversion( - pipelineResults.final, - context - ); - console.log(`🧠 上下文感知转换完成`); - - // 4. 执行质量检查 - const qualityResults = await this.qualityAssurance.performQualityCheck( - contextAwareCode, - context - ); - console.log(`🛡️ 质量检查完成: ${qualityResults.overall.toUpperCase()}`); - - // 5. 自动修复问题 - let finalCode = contextAwareCode; - if (qualityResults.overall === 'fail' || qualityResults.warnings.length > 0) { - const fixResults = await this.qualityAssurance.autoFix(contextAwareCode, qualityResults); - finalCode = fixResults.code; - console.log(`🔧 自动修复完成: ${fixResults.summary.totalFixes}个修复`); - } - - // 6. 最终质量验证 - const finalQuality = await this.qualityAssurance.performQualityCheck(finalCode, context); - - // 7. 更新统计信息 - const endTime = Date.now(); - this.updateStats(endTime - startTime, finalQuality); - - // 8. 生成转换报告 - const report = this.generateConversionReport({ - original: phpCode, - final: finalCode, - context, - pipelineResults, - qualityResults: finalQuality, - duration: endTime - startTime - }); - - console.log('🎉 增强版转换完成!'); - return { - success: true, - code: finalCode, - report, - context, - quality: finalQuality - }; - - } catch (error) { - console.error('❌ 增强版转换失败:', error.message); - this.stats.failedConversions++; - - return { - success: false, - error: error.message, - stack: error.stack, - original: phpCode - }; - } - } - - /** - * 批量转换 - */ - async batchConvert(conversions) { - const results = []; - const startTime = Date.now(); - - console.log(`🔄 开始批量转换: ${conversions.length}个文件`); - - for (let i = 0; i < conversions.length; i++) { - const { phpCode, filePath, className } = conversions[i]; - - console.log(`📋 转换进度: ${i + 1}/${conversions.length}`); - - try { - const result = await this.convert(phpCode, filePath, className); - results.push(result); - - if (result.success) { - console.log(`✅ 转换成功: ${className}`); - } else { - console.log(`❌ 转换失败: ${className} - ${result.error}`); - } - } catch (error) { - console.error(`❌ 转换异常: ${className} - ${error.message}`); - results.push({ - success: false, - error: error.message, - filePath, - className - }); - } - } - - const endTime = Date.now(); - const batchReport = this.generateBatchReport(results, endTime - startTime); - - console.log(`🎯 批量转换完成: ${results.filter(r => r.success).length}/${results.length}成功`); - - return { - results, - report: batchReport, - stats: this.stats - }; - } - - /** - * 学习模式 - 从成功案例中学习 - */ - async learnFromSuccess(conversions) { - console.log('🧠 开始学习模式...'); - - const successfulConversions = conversions.filter(c => c.success); - const learningData = []; - - for (const conversion of successfulConversions) { - const { original, final, context, quality } = conversion; - - // 提取转换模式 - const patterns = this.extractConversionPatterns(original, final); - - // 分析质量指标 - const qualityMetrics = this.analyzeQualityMetrics(quality); - - learningData.push({ - context, - patterns, - quality: qualityMetrics, - original, - final - }); - } - - // 更新转换规则数据库 - this.updateRulesFromLearning(learningData); - - console.log(`📚 学习完成: ${learningData.length}个成功案例`); - - return { - learningData, - updatedRules: this.rulesDB.getStats() - }; - } - - /** - * 获取转换统计信息 - */ - getStats() { - return { - ...this.stats, - successRate: this.stats.totalConversions > 0 - ? (this.stats.successfulConversions / this.stats.totalConversions * 100).toFixed(2) + '%' - : '0%', - averageQuality: this.stats.averageQuality.toFixed(2), - averageTime: this.stats.conversionTime.toFixed(2) + 'ms' - }; - } - - /** - * 更新统计信息 - */ - updateStats(duration, quality) { - if (quality.overall === 'pass') { - this.stats.successfulConversions++; - } else { - this.stats.failedConversions++; - } - - // 计算平均质量分数 - const qualityScore = this.calculateQualityScore(quality); - this.stats.averageQuality = (this.stats.averageQuality + qualityScore) / 2; - - // 计算平均转换时间 - this.stats.conversionTime = (this.stats.conversionTime + duration) / 2; - } - - /** - * 计算质量分数 - */ - calculateQualityScore(quality) { - let score = 100; - - // 根据错误数量扣分 - score -= quality.errors.length * 10; - - // 根据警告数量扣分 - score -= quality.warnings.length * 2; - - // 根据复杂度扣分 - if (quality.metrics.complexity?.cyclomatic > 10) { - score -= (quality.metrics.complexity.cyclomatic - 10) * 2; - } - - return Math.max(0, score); - } - - /** - * 生成转换报告 - */ - generateConversionReport(data) { - return { - summary: { - success: true, - duration: data.duration, - quality: data.qualityResults.overall, - complexity: data.qualityResults.metrics.complexity, - maintainability: data.qualityResults.metrics.maintainability - }, - context: { - fileType: data.context.fileType, - businessDomain: data.context.businessDomain, - strategies: data.context.strategies, - patterns: data.context.codePatterns - }, - quality: { - errors: data.qualityResults.errors.length, - warnings: data.qualityResults.warnings.length, - recommendations: data.qualityResults.recommendations.length - }, - pipeline: { - stages: Object.keys(data.pipelineResults.stages).length, - totalDuration: data.pipelineResults.metrics.totalDuration - } - }; - } - - /** - * 生成批量转换报告 - */ - generateBatchReport(results, totalDuration) { - const successful = results.filter(r => r.success); - const failed = results.filter(r => !r.success); - - return { - summary: { - total: results.length, - successful: successful.length, - failed: failed.length, - successRate: (successful.length / results.length * 100).toFixed(2) + '%', - totalDuration - }, - quality: { - averageErrors: successful.reduce((sum, r) => sum + (r.quality?.errors?.length || 0), 0) / successful.length, - averageWarnings: successful.reduce((sum, r) => sum + (r.quality?.warnings?.length || 0), 0) / successful.length - }, - errors: failed.map(f => ({ - file: f.filePath, - class: f.className, - error: f.error - })) - }; - } - - /** - * 提取转换模式 - */ - extractConversionPatterns(original, final) { - const patterns = []; - - // 提取变量转换模式 - const variablePatterns = this.extractVariablePatterns(original, final); - patterns.push(...variablePatterns); - - // 提取方法转换模式 - const methodPatterns = this.extractMethodPatterns(original, final); - patterns.push(...methodPatterns); - - // 提取类型转换模式 - const typePatterns = this.extractTypePatterns(original, final); - patterns.push(...typePatterns); - - return patterns; - } - - /** - * 提取变量转换模式 - */ - extractVariablePatterns(original, final) { - const patterns = []; - - // 提取$this->variable模式 - const thisMatches = original.match(/\$this->(\w+)/g); - if (thisMatches) { - thisMatches.forEach(match => { - const variableMatch = match.match(/\$this->(\w+)/); - if (variableMatch) { - const variable = variableMatch[1]; - if (final.includes(`this.${variable}`)) { - patterns.push({ - type: 'variable', - pattern: `$this->${variable}`, - replacement: `this.${variable}`, - confidence: 1.0 - }); - } - } - }); - } - - return patterns; - } - - /** - * 提取方法转换模式 - */ - extractMethodPatterns(original, final) { - const patterns = []; - - // 提取方法调用模式 - const methodMatches = original.match(/\$this->(\w+)\(/g); - if (methodMatches) { - methodMatches.forEach(match => { - const method = match.match(/\$this->(\w+)\(/)[1]; - if (final.includes(`this.${method}(`)) { - patterns.push({ - type: 'method', - pattern: `$this->${method}(`, - replacement: `this.${method}(`, - confidence: 1.0 - }); - } - }); - } - - return patterns; - } - - /** - * 提取类型转换模式 - */ - extractTypePatterns(original, final) { - const patterns = []; - - // 提取类型声明模式 - const typeMatches = original.match(/(string|int|array|bool)\s+\$(\w+)/g); - if (typeMatches) { - typeMatches.forEach(match => { - const typeMatch = match.match(/(string|int|array|bool)\s+\$(\w+)/); - const type = typeMatch[1]; - const variable = typeMatch[2]; - - let tsType = type; - if (type === 'int') tsType = 'number'; - if (type === 'array') tsType = 'any[]'; - if (type === 'bool') tsType = 'boolean'; - - if (final.includes(`${variable}: ${tsType}`)) { - patterns.push({ - type: 'type', - pattern: `${type} $${variable}`, - replacement: `${variable}: ${tsType}`, - confidence: 1.0 - }); - } - }); - } - - return patterns; - } - - /** - * 分析质量指标 - */ - analyzeQualityMetrics(quality) { - return { - overall: quality.overall, - errorCount: quality.errors.length, - warningCount: quality.warnings.length, - complexity: quality.metrics.complexity, - maintainability: quality.metrics.maintainability, - testability: quality.metrics.testability, - performance: quality.metrics.performance - }; - } - - /** - * 从学习数据更新规则 - */ - updateRulesFromLearning(learningData) { - // 分析学习数据,提取新的转换规则 - const newRules = this.analyzeLearningData(learningData); - - // 更新转换规则数据库 - newRules.forEach(rule => { - this.rulesDB.addRule(rule.category, rule); - }); - - console.log(`📚 更新了${newRules.length}个转换规则`); - } - - /** - * 分析学习数据 - */ - analyzeLearningData(learningData) { - const newRules = []; - - // 分析转换模式 - learningData.forEach(data => { - data.patterns.forEach(pattern => { - // 检查是否是新模式 - if (this.isNewPattern(pattern)) { - newRules.push({ - category: pattern.type, - pattern: new RegExp(pattern.pattern.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), 'g'), - replacement: pattern.replacement, - description: `从学习数据中提取的${pattern.type}转换规则`, - confidence: pattern.confidence - }); - } - }); - }); - - return newRules; - } - - /** - * 检查是否是新模式 - */ - isNewPattern(pattern) { - // 检查规则数据库中是否已存在类似规则 - const existingRules = this.rulesDB.getRules(pattern.type); - return !existingRules.some(rule => - rule.pattern.toString() === pattern.pattern && - rule.replacement === pattern.replacement - ); - } -} - -module.exports = EnhancedBusinessLogicConverter; diff --git a/tools/generators/base-generator.js b/tools/generators/base-generator.js deleted file mode 100644 index dd497484..00000000 --- a/tools/generators/base-generator.js +++ /dev/null @@ -1,184 +0,0 @@ -#!/usr/bin/env node - -const fs = require('fs'); -const path = require('path'); - -/** - * 基础生成器类 - * 提供通用的 dry-run、文件操作、日志等功能 - */ -class BaseGenerator { - constructor(generatorName = 'Generator') { - this.generatorName = generatorName; - - // 从环境变量或参数读取配置 - this.dryRun = process.env.DRY_RUN === 'true' || process.argv.includes('--dry-run'); - this.verbose = process.env.VERBOSE === 'true' || process.argv.includes('--verbose'); - - this.stats = { - filesCreated: 0, - filesUpdated: 0, - filesSkipped: 0, - errors: 0 - }; - } - - /** - * 安全写入文件(支持 dry-run) - */ - writeFile(filePath, content, description = '') { - try { - if (this.dryRun) { - console.log(` [DRY-RUN] Would create/update: ${filePath}`); - if (this.verbose && description) { - console.log(` Description: ${description}`); - } - this.stats.filesCreated++; - return true; - } - - // 确保目录存在 - this.ensureDir(path.dirname(filePath)); - - // 写入文件 - fs.writeFileSync(filePath, content, 'utf8'); - - const action = fs.existsSync(filePath) ? 'Updated' : 'Created'; - console.log(` ✅ ${action}: ${filePath}`); - - if (action === 'Created') { - this.stats.filesCreated++; - } else { - this.stats.filesUpdated++; - } - - return true; - } catch (error) { - console.error(` ❌ Failed to write ${filePath}:`, error.message); - this.stats.errors++; - return false; - } - } - - /** - * 确保目录存在 - */ - ensureDir(dirPath) { - if (this.dryRun) { - return; - } - - if (!fs.existsSync(dirPath)) { - fs.mkdirSync(dirPath, { recursive: true }); - } - } - - /** - * 读取文件(安全) - */ - readFile(filePath) { - try { - if (!fs.existsSync(filePath)) { - return null; - } - return fs.readFileSync(filePath, 'utf8'); - } catch (error) { - console.error(` ❌ Failed to read ${filePath}:`, error.message); - return null; - } - } - - /** - * 检查文件是否存在 - */ - fileExists(filePath) { - return fs.existsSync(filePath); - } - - /** - * 日志输出 - */ - log(message, level = 'info') { - const prefix = { - 'info': ' ℹ️ ', - 'success': ' ✅', - 'warning': ' ⚠️ ', - 'error': ' ❌', - 'debug': ' 🔍' - }; - - if (level === 'debug' && !this.verbose) { - return; - } - - console.log(`${prefix[level] || ' '}${message}`); - } - - /** - * 输出统计信息 - */ - printStats(additionalStats = {}) { - console.log('\n📊 Generation Statistics'); - console.log('=================================================='); - - if (this.dryRun) { - console.log(' 🔍 DRY-RUN MODE - No files were actually modified'); - } - - console.log(` 📁 Files Created: ${this.stats.filesCreated}`); - console.log(` 🔄 Files Updated: ${this.stats.filesUpdated}`); - console.log(` ⏭️ Files Skipped: ${this.stats.filesSkipped}`); - console.log(` ❌ Errors: ${this.stats.errors}`); - - // 输出额外的统计信息 - for (const [key, value] of Object.entries(additionalStats)) { - console.log(` 📈 ${key}: ${value}`); - } - - const total = this.stats.filesCreated + this.stats.filesUpdated; - const successRate = total > 0 - ? ((total / (total + this.stats.errors)) * 100).toFixed(2) - : '0.00'; - - console.log(` 📊 Success Rate: ${successRate}%`); - console.log('=================================================='); - } - - /** - * kebab-case 转换 - */ - toKebabCase(str) { - return String(str) - .replace(/([a-z0-9])([A-Z])/g, '$1-$2') - .replace(/_/g, '-') - .toLowerCase(); - } - - /** - * PascalCase 转换 - */ - toPascalCase(str) { - return String(str) - .split(/[-_]/) - .map(word => word.charAt(0).toUpperCase() + word.slice(1)) - .join(''); - } - - /** - * camelCase 转换 - */ - toCamelCase(str) { - const pascal = this.toPascalCase(str); - return pascal.charAt(0).toLowerCase() + pascal.slice(1); - } - - /** - * snake_case 转换 - */ - toSnakeCase(str) { - return str.replace(/([A-Z])/g, '_$1').toLowerCase().replace(/^_/, ''); - } -} - -module.exports = BaseGenerator; - diff --git a/tools/generators/business-logic-converter.js b/tools/generators/business-logic-converter.js deleted file mode 100644 index 348373a2..00000000 --- a/tools/generators/business-logic-converter.js +++ /dev/null @@ -1,810 +0,0 @@ -const fs = require('fs'); -const path = require('path'); - -/** - * 业务逻辑转换器 - * 基于真实PHP代码的转换规则,禁止TODO、假设、自创 - */ -class BusinessLogicConverter { - constructor() { - // 混合模块智能分类规则 - this.hybridClassificationRules = { - // 需要抽取到Core层的业务逻辑文件 - coreBusinessLogic: [ - // 支付相关 - /pay/i, - /payment/i, - /transfer/i, - /refund/i, - - // 会员相关 - /member/i, - /user.*profile/i, - /account/i, - - // 业务配置 - /config.*pay/i, - /config.*member/i, - /config.*order/i, - - // 订单相关 - /order/i, - /goods/i, - /product/i, - - // 认证业务逻辑 - /login.*business/i, - /auth.*business/i, - /register/i, - - // DIY业务 - /diy/i, - /custom/i, - - // 营销业务 - /promotion/i, - /coupon/i, - /discount/i - ], - - // 应该使用Common基础服务的文件 - useCommonInfrastructure: [ - // 基础服务接口 - /BaseController/, - /BaseService/, - /BaseModel/, - - // 通用工具 - /upload/i, - /export/i, - /attachment/i, - /sys.*config/i, - /system.*info/i, - /cache/i, - /redis/i, - - // 基础认证 - /jwt/i, - /token/i, - /guard/i, - /middleware/i - ] - }; - - this.phpRegexPatterns = [ - // PHP类型转换 - { pattern: /\$([a-zA-Z_][a-zA-Z0-9_]*)/g, replacement: '$1' }, - { pattern: /\->/g, replacement: '.' }, - { pattern: /public function\s+([a-zA-Z_][a-zA-Z0-9_]*)\s*\(([^)]*)\)/g, replacement: 'async $1($2)' }, - { pattern: /private function\s+([a-zA-Z_][a-zA-Z0-9_]*)\s*\(([^)]*)\)/g, replacement: 'private async $1($2)' }, - { pattern: /protected function\s+([a-zA-Z_][a-zA-Z0-9_]*)\s*\(([^)]*)\)/g, replacement: 'protected async $1($2)' }, - - // PHP参数类型转换 - { pattern: /string\s+\$([a-zA-Z_][a-zA-Z0-9_]*)/g, replacement: '$1: string' }, - { pattern: /int\s+\$([a-zA-Z_][a-zA-Z0-9_]*)/g, replacement: '$1: number' }, - { pattern: /array\s+\$([a-zA-Z_][a-zA-Z0-9_]*)/g, replacement: '$1: any[]' }, - { pattern: /bool\s+\$([a-zA-Z_][a-zA-Z0-9_]*)/g, replacement: '$1: boolean' }, - - // PHP语法转换 - { pattern: /this\s*\->\s*model/g, replacement: 'this.model' }, - { pattern: /new\s+([A-Z][a-zA-Z0-9_]*)\(\)/g, replacement: 'this.$1Repository' }, - { pattern: /parent::__construct\(\)/g, replacement: 'super()' }, - - // PHP函数转换 - { pattern: /empty\s*\(\s*([^)]+)\s*\)/g, replacement: '!$1' }, - { pattern: /isset\s*\(\s*([^)]+)\s*\)/g, replacement: '$1 !== undefined' }, - { pattern: /is_null\s*\(\s*([^)]+)\s*\)/g, replacement: '$1 === null' }, - { pattern: /is_array\s*\(\s*([^)]+)\s*\)/g, replacement: 'Array.isArray($1)' }, - { pattern: /is_string\s*\(\s*([^)]+)\s*\)/g, replacement: 'typeof $1 === "string"' }, - { pattern: /is_numeric\s*\(\s*([^)]+)\s*\)/g, replacement: '!isNaN($1)' }, - - // 字符串拼接 - { pattern: /\.\s*=/g, replacement: '+=' }, - { pattern: /\.(\s*['""])/g, replacement: ' + $1' }, - - // 数组语法 - { pattern: /array\(\)/g, replacement: '[]' }, - { pattern: /array\(([^)]+)\)/g, replacement: '[$1]' }, - ]; - } - - /** - * 智能分类:判断文件应该迁移到Core层还是使用Common基础设施 - */ - classifyFile(filePath, className, content) { - const fileName = path.basename(filePath, '.php'); - const fullContext = `${fileName} ${className} ${content}`.toLowerCase(); - - // 检查是否应该使用Common基础设施 - for (const pattern of this.hybridClassificationRules.useCommonInfrastructure) { - if (pattern.test(fileName) || pattern.test(className) || pattern.test(content)) { - return 'INFRASTRUCTURE'; - } - } - - // 检查是否应该迁移到Core层 - for (const pattern of this.hybridClassificationRules.coreBusinessLogic) { - if (pattern.test(fileName) || pattern.test(className) || pattern.test(content)) { - return 'CORE_BUSINESS'; - } - } - - // 默认根据模块名判断 - const moduleName = this.extractModuleName(filePath); - if (['sys', 'upload', 'config', 'export'].includes(moduleName)) { - return 'INFRASTRUCTURE'; // 基础服务 - } - - return 'CORE_BUSINESS'; // 默认为业务逻辑 - } - - /** - * 从文件路径提取模块名 - */ - extractModuleName(filePath) { - const match = filePath.match(/\/([^\/]+)\/.+\.php$/); - return match ? match[1] : 'unknown'; - } - - /** - * 替换PHP基础设施调用为NestJS基础设施调用 - */ - replaceInfrastructureCalls(tsCode) { - let convertedCode = tsCode; - - // 替换PHP基础类为NestJS Common层 - const infrastructureReplacements = [ - { from: /BaseController/g, to: '@wwjCommon/base/base.controller' }, - { from: /BaseService/g, to: '@wwjCommon/service/base.service' }, - { from: /core\\cache\\RedisCacheService/g, to: '@wwjCommon/cache/cache.service' }, - { from: /CoreRequestService/g, to: '@wwjCommon/request/request.service' }, - { from: /BaseApiService/g, to: '@wwjCommon/service/base-api.service' }, - { from: /CoreLogService/g, to: '@wwjCommon/log/log.service' } - ]; - - infrastructureReplacements.forEach(({ from, to }) => { - convertedCode = convertedCode.replace(from, to); - }); - - return convertedCode; - } - - /** - * 转换PHP业务逻辑到TypeScript - */ - convertBusinessLogic(content, methodName, phpCode) { - try { - console.log(`🔄 转换方法: ${methodName}`); - - let convertedCode = phpCode; - - // 1. 先转换PHP语法到TypeScript - convertedCode = convertedCode - // 变量转换 - 移除$符号 (必须在->转换之前) - .replace(/\$this->([a-zA-Z_][a-zA-Z0-9_]*)/g, 'this.$1') - .replace(/\$([a-zA-Z_][a-zA-Z0-9_]*)/g, '$1') - - // PHP数组语法 => 转换为对象属性 : - .replace(/'([a-zA-Z_][a-zA-Z0-9_]*)'\s*=>/g, '$1:') - .replace(/"([a-zA-Z_][a-zA-Z0-9_]*)"\s*=>/g, '$1:') - - // PHP空值合并 ?? 转换为 || - .replace(/\?\?/g, '||') - - // PHP对象访问 -> 转换为 . (必须在$转换之后) - .replace(/->/g, '.') - - // PHP静态访问 :: 转换为 . - .replace(/::/g, '.') - - // PHP new对象转换 - 修复转换逻辑(避免重复Service后缀) - .replace(/\(new\s+([A-Z][a-zA-Z0-9_]*)\(\)\)/g, (match, serviceName) => { - if (serviceName.endsWith('Service')) { - return `this.${serviceName.charAt(0).toLowerCase() + serviceName.slice(1)}`; - } else { - return `this.${serviceName.charAt(0).toLowerCase() + serviceName.slice(1)}Service`; - } - }) - .replace(/new\s+([A-Z][a-zA-Z0-9_]*)\(\)/g, (match, serviceName) => { - if (serviceName.endsWith('Service')) { - return `this.${serviceName.charAt(0).toLowerCase() + serviceName.slice(1)}`; - } else { - return `this.${serviceName.charAt(0).toLowerCase() + serviceName.slice(1)}Service`; - } - }) - - // PHP类型声明转换为TypeScript - .replace(/array\s+/g, '') - .replace(/:\s*array/g, ': any[]') - - // 变量声明添加const/let - .replace(/^(\s*)([a-zA-Z_][a-zA-Z0-9_]*)\s*=/gm, '$1const $2 =') - - // 修复数组访问 - .replace(/\['([^']+)'\]/g, '.$1') - .replace(/\["([^"]+)"\]/g, '.$1') - - // 修复PHP函数调用 - .replace(/array_merge\s*\(/g, 'Object.assign(') - .replace(/strpos\s*\(/g, 'String.prototype.indexOf.call(') - .replace(/throw\s+new\s+([A-Z][a-zA-Z0-9_]*)\s*\(/g, 'throw new $1(') - - // 修复PHP条件语句 - .replace(/if\s*\(\s*([^)]+)\s*\)\s*\{/g, 'if ($1) {') - .replace(/else\s*\{/g, '} else {') - - // 修复PHP静态变量访问 - .replace(/self::\$([a-zA-Z_][a-zA-Z0-9_]*)/g, 'self.$1') - .replace(/static::\$([a-zA-Z_][a-zA-Z0-9_]*)/g, 'static.$1') - - // 修复PHP is_null函数 - .replace(/is_null\s*\(\s*([^)]+)\s*\)/g, '$1 === null') - - // 修复PHP new static调用 - .replace(/new\s+static\s*\(([^)]*)\)/g, 'new this.constructor($1)') - - // 修复PHP数组语法错误 - .replace(/\[\s*\]/g, '[]') - .replace(/\(\s*\)/g, '()') - - // 修复PHP变量赋值错误 - .replace(/=\s*=\s*=/g, '===') - .replace(/=\s*=\s*null/g, '=== null') - - // 修复重复的等号 - .replace(/====/g, '===') - .replace(/=====/g, '===') - - // 修复方括号错误 - 修复函数调用中的方括号(排除数组语法) - .replace(/\(([^)]+)\]/g, '($1)') - // 移除错误的替换规则,避免破坏数组语法 - // .replace(/(\w+)\]/g, (match, word) => { - // // 排除数组元素的情况,避免将 [ 'key', 'value' ] 转换为 [ 'key', 'value' ) - // // 检查是否在数组上下文中 - // const beforeMatch = code.substring(0, code.indexOf(match)); - // const lastBracket = beforeMatch.lastIndexOf('['); - // const lastParen = beforeMatch.lastIndexOf('('); - // - // // 如果最近的符号是 [ 而不是 (,说明在数组上下文中,不应该替换 - // if (lastBracket > lastParen) { - // return match; - // } - // - // return word + ')'; - // }) - - // 修复数组语法中的方括号错误 - 直接修复(处理单引号和双引号) - .replace(/\[\s*\(\s*'([^']+)',\s*''\s*\)\s*\)/g, "['$1', '']") - .replace(/\[\s*\(\s*'([^']+)',\s*0\s*\)\s*\)/g, "['$1', 0]") - .replace(/\[\s*\(\s*\"([^\"]+)\",\s*\"\"\s*\)\s*\)/g, '["$1", ""]') - .replace(/\[\s*\(\s*\"([^\"]+)\",\s*0\s*\)\s*\)/g, '["$1", 0]') - // 移除这些错误的替换规则,避免破坏数组语法 - // .replace(/\]\s*;/g, ');') - // .replace(/\]\s*\)/g, '))') - // .replace(/\]\s*\{/g, ') {') - // .replace(/\]\s*,/g, '),') - - // 修复数组语法中的方括号错误 - 更精确的匹配 - .replace(/\[\s*\(\s*'([^']+)',\s*''\s*\)\s*\)/g, "['$1', '']") - .replace(/\[\s*\(\s*'([^']+)',\s*0\s*\)\s*\)/g, "['$1', 0]") - - // 修复数组语法中的方括号错误 - .replace(/\[\s*\(\s*([^)]+)\s*\)\s*\]/g, '[$1]') - .replace(/\[\s*\(\s*([^)]+)\s*\)\s*\)/g, '[$1]') - - // 修复数组元素中的方括号错误 - .replace(/\[\s*\(\s*'([^']+)',\s*'([^']+)'\s*\)\s*\)/g, "['$1', '$2']") - .replace(/\[\s*\(\s*'([^']+)',\s*(\d+)\s*\)\s*\)/g, "['$1', $2]") - .replace(/\[\s*\(\s*'([^']+)',\s*""\s*\)\s*\)/g, "['$1', '']") - - // 修复特定的方括号错误模式 - 只修复函数调用中的方括号,不修复数组语法 - // 移除这些错误的替换规则,避免破坏数组语法 - // .replace(/(\w+_id)\]/g, '$1)') - // .replace(/(\w+_key)\]/g, '$1)') - // .replace(/(\w+_type)\]/g, '$1)') - // .replace(/(\w+_name)\]/g, '$1)') - // .replace(/(\w+_code)\]/g, '$1)') - // .replace(/(\w+_value)\]/g, '$1)') - - // 修复函数调用中的方括号错误 - 只修复函数调用中的方括号,不修复数组语法 - // 移除这些错误的替换规则,避免破坏数组语法 - // .replace(/(\w+)\(([^)]+)\]/g, '$1($2)') - // .replace(/(\w+)\.(\w+)\(([^)]+)\]/g, '$1.$2($3)') - - // 修复PHP方法声明 - .replace(/public\s+function\s+/g, 'async ') - .replace(/private\s+function\s+/g, 'private async ') - .replace(/protected\s+function\s+/g, 'protected async ') - - // 修复PHP返回语句 - .replace(/return\s+this;/g, 'return this;') - - // 修复PHP异常处理 - .replace(/CommonException/g, 'BusinessException') - .replace(/(? 0 && content[i-1] !== '\\') { - inString = false; - stringChar = ''; - } - } - - // 只在非字符串状态下计算大括号 - if (!inString) { - if (char === '{') { - if (!foundFirstBrace) { - foundFirstBrace = true; - i++; - continue; - } - braceCount++; - } else if (char === '}') { - if (foundFirstBrace && braceCount === 0) { - return content.substring(startPos, i); - } - braceCount--; - } - } - - i++; - } - - return content.substring(startPos); - } - - /** - * 生成服务层参数定义 - */ - generateServiceParameters(parameters) { - if (!parameters || parameters.length === 0) return ''; - - return parameters.map(param => { - const defaultValue = param.defaultValue ? ` = ${param.defaultValue.replace(/'/g, '"').replace(/^"([^"]*)"$/, '"$1"')}` : ''; - return `${param.name}: ${param.type}${defaultValue}`; - }).join(', '); - } - - /** - * 清理和验证生成的TypeScript代码 - */ - cleanAndValidateTypeScriptCode(code) { - let cleanedCode = code; - - // 移除PHP语法残留 - cleanedCode = cleanedCode - // 移除PHP注释语法 - .replace(/\/\*\*\s*\*\s*@param\s+\$[a-zA-Z_][a-zA-Z0-9_]*\s+[^\n]*\n/g, '') - .replace(/\/\*\*\s*\*\s*@return\s+[^\n]*\n/g, '') - .replace(/\/\*\*\s*\*\s*@throws\s+[^\n]*\n/g, '') - - // 修复PHP方法声明残留 - .replace(/public\s+function\s+/g, 'async ') - .replace(/private\s+function\s+/g, 'private async ') - .replace(/protected\s+function\s+/g, 'protected async ') - - // 修复PHP变量声明 - .replace(/\$([a-zA-Z_][a-zA-Z0-9_]*)\s*=/g, 'const $1 =') - - // 修复PHP数组语法 - .replace(/array\s*\(\s*\)/g, '[]') - .replace(/array\s*\(/g, '[') - .replace(/\)\s*;/g, '];') - - // 修复PHP字符串拼接 - .replace(/\.\s*=/g, ' += ') - .replace(/\.\s*['"]/g, ' + \'') - - // 修复PHP条件语句 - .replace(/if\s*\(\s*([^)]+)\s*\)\s*\{/g, 'if ($1) {') - .replace(/else\s*\{/g, '} else {') - - // 修复PHP异常处理 - .replace(/throw\s+new\s+CommonException\s*\(/g, 'throw new BusinessException(') - .replace(/throw\s+new\s+Exception\s*\(/g, 'throw new BusinessException(') - - // 修复PHP函数调用 - .replace(/array_merge\s*\(/g, 'Object.assign(') - .replace(/strpos\s*\(/g, 'String.prototype.indexOf.call(') - .replace(/empty\s*\(/g, '!') - .replace(/isset\s*\(/g, 'typeof ') - .replace(/is_null\s*\(/g, '=== null') - - // 修复方括号错误 - 只修复函数调用中的方括号,不修复数组语法 - .replace(/\(([^)]+)\]/g, '($1)') - // 移除错误的替换规则,避免破坏数组语法 - // .replace(/(\w+)\]/g, '$1)') // 这个规则会破坏数组语法 - // 移除这些错误的替换规则,避免破坏数组语法 - // .replace(/\]\s*;/g, ');') - // .replace(/\]\s*\)/g, '))') - // .replace(/\]\s*\{/g, ') {') - // .replace(/\]\s*,/g, '),') - - // 修复数组语法中的方括号错误 - .replace(/\[\s*\(\s*([^)]+)\s*\)\s*\]/g, '[$1]') - .replace(/\[\s*\(\s*([^)]+)\s*\)\s*\)/g, '[$1]') - - // 修复数组元素中的方括号错误 - .replace(/\[\s*\(\s*'([^']+)',\s*'([^']+)'\s*\)\s*\)/g, "['$1', '$2']") - .replace(/\[\s*\(\s*'([^']+)',\s*(\d+)\s*\)\s*\)/g, "['$1', $2]") - .replace(/\[\s*\(\s*'([^']+)',\s*""\s*\)\s*\)/g, "['$1', '']") - - // 修复数组元素中的圆括号错误 - 更精确的匹配 - .replace(/\[\s*\(\s*'([^']+)',\s*'([^']+)'\s*\)\s*\)/g, "['$1', '$2']") - .replace(/\[\s*\(\s*'([^']+)',\s*(\d+)\s*\)\s*\)/g, "['$1', $2]") - .replace(/\[\s*\(\s*'([^']+)',\s*""\s*\)\s*\)/g, "['$1', '']") - - // 修复数组元素中的圆括号错误 - 处理空字符串(单引号和双引号) - .replace(/\[\s*\(\s*'([^']+)',\s*''\s*\)\s*\)/g, "['$1', '']") - .replace(/\[\s*\(\s*'([^']+)',\s*0\s*\)\s*\)/g, "['$1', 0]") - .replace(/\[\s*\(\s*\"([^\"]+)\",\s*\"\"\s*\)\s*\)/g, '["$1", ""]') - .replace(/\[\s*\(\s*\"([^\"]+)\",\s*0\s*\)\s*\)/g, '["$1", 0]') - - // 修复数组语法中的方括号错误 - 直接修复 - .replace(/\[\s*\(\s*'([^']+)',\s*''\s*\)\s*\)/g, "['$1', '']") - .replace(/\[\s*\(\s*'([^']+)',\s*0\s*\)\s*\)/g, "['$1', 0]") - - // 修复数组语法中的方括号错误 - 处理所有情况 - .replace(/\[\s*\(\s*'([^']+)',\s*''\s*\)\s*\)/g, "['$1', '']") - .replace(/\[\s*\(\s*'([^']+)',\s*0\s*\)\s*\)/g, "['$1', 0]") - - // 修复数组语法中的方括号错误 - 最终修复 - .replace(/\[\s*\(\s*'([^']+)',\s*''\s*\)\s*\)/g, "['$1', '']") - .replace(/\[\s*\(\s*'([^']+)',\s*0\s*\)\s*\)/g, "['$1', 0]") - .replace(/is_array\s*\(/g, 'Array.isArray(') - .replace(/is_string\s*\(/g, 'typeof ') - .replace(/is_numeric\s*\(/g, '!isNaN(') - - // 修复PHP对象访问 - .replace(/->/g, '.') - .replace(/::/g, '.') - - // 修复PHP空值合并 - .replace(/\?\?/g, '||') - - // 修复PHP数组访问 - .replace(/\['([^']+)'\]/g, '.$1') - .replace(/\["([^"]+)"\]/g, '.$1') - - // 修复PHP类型声明 - .replace(/:\s*array/g, ': any[]') - .replace(/:\s*string/g, ': string') - .replace(/:\s*int/g, ': number') - .replace(/:\s*float/g, ': number') - .replace(/:\s*bool/g, ': boolean') - - // 移除PHP语法残留 - .replace(/\$([a-zA-Z_][a-zA-Z0-9_]*)/g, '$1') - - // 修复方法体格式 - .replace(/\{\s*\}/g, '{\n // 待实现\n }') - .replace(/\{\s*return\s+this;\s*\}/g, '{\n return this;\n }'); - - // 修复严重的语法错误 - cleanedCode = this.fixCriticalSyntaxErrors(cleanedCode); - - // 验证TypeScript语法 - const validationErrors = this.validateTypeScriptSyntax(cleanedCode); - if (validationErrors.length > 0) { - console.warn('⚠️ TypeScript语法警告:', validationErrors); - } - - return cleanedCode; - } - - /** - * 修复严重的语法错误 - */ - fixCriticalSyntaxErrors(code) { - return code - // 修复不完整的类结构 - .replace(/export class \w+ \{[^}]*\}\s*\}\s*$/gm, (match) => { - return match.replace(/\}\s*\}\s*$/, '}'); - }) - - // 修复不完整的构造函数 - .replace(/constructor\([^)]*\)\s*\{\s*\/\/ 待实现\s*\}\s*\}\s*super\([^)]*\)\s*;\s*\}\s*$/gm, (match) => { - return match.replace(/\}\s*\}\s*super\([^)]*\)\s*;\s*\}\s*$/, ' super(repository);\n }'); - }) - - // 修复不完整的方法体 - .replace(/async \w+\([^)]*\)\s*\{\s*\/\/ 待实现\s*\}\s*\}\s*try\s*\{/gm, (match) => { - return match.replace(/\}\s*\}\s*try\s*\{/, ' {\n try {'); - }) - - // 修复不完整的try-catch块 - .replace(/try\s*\{\s*\/\/ 待实现\s*\}\s*\}\s*catch\s*\([^)]*\)\s*\{/gm, (match) => { - return match.replace(/\}\s*\}\s*catch\s*\([^)]*\)\s*\{/, ' // 待实现\n } catch (error) {'); - }) - - // 修复不完整的异常处理 - .replace(/throw new BusinessException\('[^']*',\s*error\]\s*;\s*\}\s*\}\s*$/gm, (match) => { - return match.replace(/error\]\s*;\s*\}\s*\}\s*$/, 'error);\n }\n }'); - }) - - // 修复不完整的import语句 - .replace(/import\s*\{\s*\/\/ 待实现\s*\}\s*\}\s*from/gm, (match) => { - return match.replace(/\{\s*\/\/ 待实现\s*\}\s*\}\s*from/, '{\n } from'); - }) - - // 修复不完整的装饰器 - .replace(/@\w+\([^)]*\)\s*\{\s*\/\/ 待实现\s*\}\s*\}\s*$/gm, (match) => { - return match.replace(/\}\s*\}\s*$/, '}'); - }) - - // 修复不完整的数组语法 - .replace(/\[\s*\]\s*;\s*\}\s*\}\s*$/gm, (match) => { - return match.replace(/\}\s*\}\s*$/, '}'); - }) - - // 修复不完整的对象语法 - .replace(/\{\s*\}\s*;\s*\}\s*\}\s*$/gm, (match) => { - return match.replace(/\}\s*\}\s*$/, '}'); - }) - - // 修复不完整的字符串 - .replace(/'[^']*\]\s*;\s*\}\s*\}\s*$/gm, (match) => { - return match.replace(/\]\s*;\s*\}\s*\}\s*$/, ';\n }'); - }) - - // 修复不完整的括号 - .replace(/\(\s*\)\s*;\s*\}\s*\}\s*$/gm, (match) => { - return match.replace(/\}\s*\}\s*$/, '}'); - }) - - // 修复不完整的方括号 - .replace(/\[\s*\]\s*;\s*\}\s*\}\s*$/gm, (match) => { - return match.replace(/\}\s*\}\s*$/, '}'); - }) - - // 修复不完整的尖括号 - .replace(/<\s*>\s*;\s*\}\s*\}\s*$/gm, (match) => { - return match.replace(/\}\s*\}\s*$/, '}'); - }) - - // 修复不完整的注释 - .replace(/\/\/[^\n]*\]\s*;\s*\}\s*\}\s*$/gm, (match) => { - return match.replace(/\]\s*;\s*\}\s*\}\s*$/, ';\n }'); - }) - - // 修复不完整的多行注释 - .replace(/\/\*[\s\S]*?\*\/\s*\]\s*;\s*\}\s*\}\s*$/gm, (match) => { - return match.replace(/\]\s*;\s*\}\s*\}\s*$/, ';\n }'); - }); - } - - /** - * 验证TypeScript语法 - */ - validateTypeScriptSyntax(code) { - const errors = []; - - // 检查常见语法错误 - if (code.includes('=>')) { - errors.push('发现PHP数组语法 => 未转换'); - } - if (code.includes('??')) { - errors.push('发现PHP空值合并 ?? 未转换'); - } - if (code.includes('::')) { - errors.push('发现PHP静态访问 :: 未转换'); - } - if (code.includes('->')) { - errors.push('发现PHP对象访问 -> 未转换'); - } - if (code.includes('$')) { - errors.push('发现PHP变量 $ 未转换'); - } - if (code.includes('array(')) { - errors.push('发现PHP数组语法 array() 未转换'); - } - if (code.includes('public function') || code.includes('private function') || code.includes('protected function')) { - errors.push('发现PHP方法声明未转换'); - } - - // 检查严重的语法错误 - if (code.includes(']') && !code.includes('[')) { - errors.push('发现不完整的方括号 ]'); - } - if (code.includes('}') && !code.includes('{')) { - errors.push('发现不完整的大括号 }'); - } - - // 检查括号匹配 - const openBraces = (code.match(/\{/g) || []).length; - const closeBraces = (code.match(/\}/g) || []).length; - if (openBraces !== closeBraces) { - errors.push(`大括号不匹配: 开括号${openBraces}个, 闭括号${closeBraces}个`); - } - - const openBrackets = (code.match(/\[/g) || []).length; - const closeBrackets = (code.match(/\]/g) || []).length; - if (openBrackets !== closeBrackets) { - errors.push(`方括号不匹配: 开括号${openBrackets}个, 闭括号${closeBrackets}个`); - } - if (code.includes('// 待实现')) { - errors.push('发现未实现的方法体'); - } - - return errors; - } -} - -module.exports = BusinessLogicConverter; diff --git a/tools/generators/controller-generator.js b/tools/generators/controller-generator.js deleted file mode 100644 index 264bb25a..00000000 --- a/tools/generators/controller-generator.js +++ /dev/null @@ -1,1472 +0,0 @@ -#!/usr/bin/env node - -const fs = require('fs'); -const path = require('path'); - -/** - * 🎮 控制器生成器 - * 专门负责生成NestJS控制器 - */ -class ControllerGenerator { - constructor() { - this.config = { - phpBasePath: '/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud', - nestjsBasePath: '/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/wwjcloud-nest/src/core', - discoveryResultPath: '/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/tools/php-discovery-result.json', - // 前端API模块优先级列表(基于PHP和Java前端API一致性) - frontendApiModules: [ - 'addon', 'aliapp', 'auth', 'cloud', 'dict', 'diy', 'diy_form', 'h5', - 'home', 'member', 'module', 'notice', 'pay', 'pc', 'personal', - 'poster', 'printer', 'site', 'stat', 'sys', 'tools', 'upgrade', - 'user', 'verify', 'weapp', 'wechat', 'wxoplatform' - ] - }; - - this.discoveryData = null; - this.stats = { - controllersCreated: 0, - errors: 0 - }; - } - - /** - * 运行控制器生成 - */ - async run() { - try { - console.log('🎮 启动控制器生成器...'); - console.log('目标:生成NestJS控制器文件\n'); - - // 加载PHP文件发现结果 - await this.loadDiscoveryData(); - - // 生成控制器 - await this.generateControllers(); - - // 输出统计报告 - this.printStats(); - - } catch (error) { - console.error('❌ 控制器生成失败:', error); - this.stats.errors++; - } - } - - /** - * 加载PHP文件发现结果 - */ - async loadDiscoveryData() { - try { - const data = fs.readFileSync(this.config.discoveryResultPath, 'utf8'); - this.discoveryData = JSON.parse(data); - console.log(' ✅ 成功加载PHP文件发现结果'); - } catch (error) { - console.error('❌ 加载发现结果失败:', error); - throw error; - } - } - - /** - * 生成控制器 - */ - async generateControllers() { - console.log(' 🔨 生成控制器...'); - - // 检查是否有控制器数据 - if (!this.discoveryData.controllers || Object.keys(this.discoveryData.controllers).length === 0) { - console.log(' ⚠️ 未发现PHP控制器,跳过生成'); - return; - } - - // 优先处理前端API模块 - console.log(' 🎯 优先处理前端API模块(27个相同模块)...'); - - // 先处理前端API优先级模块 - for (const moduleName of this.config.frontendApiModules) { - if (this.discoveryData.controllers[moduleName]) { - console.log(` 📋 处理前端API优先级模块: ${moduleName}`); - for (const [controllerName, controllerInfo] of Object.entries(this.discoveryData.controllers[moduleName])) { - const layer = controllerInfo.layer || 'adminapi'; - await this.createController(moduleName, controllerName, controllerInfo, layer); - } - } else { - console.log(` ⚠️ 前端API模块 ${moduleName} 在后端控制器中不存在`); - } - } - - // 再处理其他模块 - for (const [moduleName, controllers] of Object.entries(this.discoveryData.controllers)) { - if (!this.isFrontendApiPriorityModule(moduleName)) { - console.log(` 📋 处理其他模块: ${moduleName}`); - for (const [controllerName, controllerInfo] of Object.entries(controllers)) { - const layer = controllerInfo.layer || 'adminapi'; - await this.createController(moduleName, controllerName, controllerInfo, layer); - } - } - } - - console.log(` ✅ 生成了 ${this.stats.controllersCreated} 个控制器`); - } - - /** - * 创建控制器 - */ - async createController(moduleName, controllerName, controllerInfo, layer) { - const controllerPath = path.join( - this.config.nestjsBasePath, - moduleName, - 'controllers', - layer, - `${this.toKebabCase(controllerName)}.controller.ts` - ); - - // 确保目录存在 - this.ensureDir(path.dirname(controllerPath)); - - // 检查是否有对应的PHP控制器文件 - const phpControllerPath = path.join(this.config.phpBasePath, 'app', layer, 'controller', moduleName, `${this.toPascalCase(controllerName)}.php`); - if (!fs.existsSync(phpControllerPath)) { - console.log(` ❌ 未找到PHP控制器文件,跳过生成: ${phpControllerPath}`); - return; - } - - const content = this.generateControllerContent(moduleName, controllerName, layer); - fs.writeFileSync(controllerPath, content); - console.log(` ✅ 创建控制器: ${moduleName}/${layer}/${this.toKebabCase(controllerName)}.controller.ts`); - } - - /** - * 生成控制器内容 - */ - generateControllerContent(moduleName, controllerName, layer) { - const className = `${this.toPascalCase(controllerName)}Controller`; - - // 根据PHP控制器的实际服务依赖生成导入 - const serviceImports = this.getServiceImports(moduleName, controllerName, layer); - - // 过滤掉空的导入语句 - const filteredServiceImports = serviceImports.split('\n').filter(line => { - const trimmed = line.trim(); - return trimmed !== '' && !trimmed.includes("} from '';"); - }).join('\n'); - - // 根据层类型选择合适的基础设施 - const infrastructureImports = this.getInfrastructureImports(layer); - const infrastructureDecorators = this.getInfrastructureDecorators(layer); - - // 解析PHP控制器方法 - const phpMethods = this.parsePHPControllerMethods(moduleName, controllerName, layer); - - // 获取构造函数服务,过滤掉空的 - const constructorServices = this.getConstructorServices(moduleName, controllerName, layer); - const filteredConstructorServices = constructorServices.split('\n').filter(line => { - const trimmed = line.trim(); - return trimmed !== '' && !trimmed.includes(": undefined"); - }).join('\n'); - - return `import { Controller, Get, Post, Put, Delete, Body, Param, Query, UseGuards, UseInterceptors, UploadedFile, UploadedFiles, Session, Req } from '@nestjs/common'; -import { FileInterceptor, FilesInterceptor } from '@nestjs/platform-express'; -import { ApiTags, ApiOperation, ApiResponse, ApiConsumes } from '@nestjs/swagger'; -import { Request } from 'express'; -${infrastructureImports} -${filteredServiceImports} - -/** - * ${className} - * 对应 PHP: ${controllerName} Controller - * 对应 Java: @RestController - * - * 支持装饰器: - * - @UploadedFile() - 单文件上传 (对应PHP Request::file()) - * - @UploadedFiles() - 多文件上传 - * - @Session() - 会话管理 (对应PHP Session::get()) - * - @Req() - 请求对象 (对应PHP Request) - */ -@ApiTags('${moduleName}') -@Controller('${this.getRoutePath(layer)}/${this.toCamelCase(moduleName)}') -${infrastructureDecorators} -export class ${className} { - constructor( -${filteredConstructorServices} - ) {} - -${phpMethods} -}`; - } - - /** - * 检查模块是否为前端API优先级模块 - */ - isFrontendApiPriorityModule(moduleName) { - return this.config.frontendApiModules.includes(moduleName); - } - - /** - * 获取正确的服务层路径 - */ - getCorrectServiceLayer(layer) { - if (layer === 'adminapi') return 'admin'; - if (layer === 'api') return 'api'; - if (layer === 'core') return 'core'; - return layer; - } - - /** - * 获取路由路径 - */ - getRoutePath(layer) { - if (layer === 'adminapi') return 'adminapi'; - if (layer === 'api') return 'api'; - return layer; - } - - /** - * 获取基础设施导入 - */ - getInfrastructureImports(layer) { - const imports = []; - - // 根据层类型选择合适的基础设施 - if (layer === 'adminapi') { - imports.push("import { JwtAuthGuard } from '@wwjCommon/guards/jwt-auth.guard';"); - imports.push("import { RolesGuard } from '@wwjCommon/guards/roles.guard';"); - imports.push("import { Roles } from '@wwjCommon/decorators/roles.decorator';"); - } else if (layer === 'api') { - imports.push("import { JwtAuthGuard } from '@wwjCommon/guards/jwt-auth.guard';"); - imports.push("import { OptionalAuthGuard } from '@wwjCommon/guards/optional-auth.guard';"); - } - - // 通用基础设施 - imports.push("import { Public } from '@wwjCommon/decorators/public.decorator';"); - imports.push("import { BusinessException } from '@wwjCommon/exceptions/business.exception';"); - - // 常用装饰器说明(已在主import中引入) - imports.push("// @UploadedFile() - 单文件上传,配合 @UseInterceptors(FileInterceptor('file'))"); - imports.push("// @UploadedFiles() - 多文件上传,配合 @UseInterceptors(FilesInterceptor('files'))"); - imports.push("// @Session() - 获取会话对象,对应PHP Session::get()"); - imports.push("// @Req() - 获取Request对象,对应PHP Request"); - - return imports.join('\n'); - } - - /** - * 获取基础设施装饰器 - */ - getInfrastructureDecorators(layer) { - if (layer === 'adminapi') { - } else if (layer === 'api') { - return '@UseGuards(ApiCheckTokenGuard)'; - } - return ''; - } - - /** - * 生成守卫装饰器 - */ - generateGuardDecorators(layer) { - if (layer === 'adminapi') { - return '@UseGuards(JwtAuthGuard, RolesGuard)'; - } else if (layer === 'api') { - return '@UseGuards(JwtAuthGuard)'; - } - return ''; - } - - /** - * 生成返回类型 - */ - generateReturnType(serviceMethodName) { - if (serviceMethodName) { - return ': Promise'; - } - return ': Promise'; - } - - /** - * 从PHP路由文件提取API信息(HTTP方法 + 路径) - */ - extractRoutesFromPHP(moduleName, controllerName, layer) { - const routeFilePath = path.join(this.config.phpBasePath, 'app', layer, 'route', `${moduleName}.php`); - - if (!fs.existsSync(routeFilePath)) { - console.log(` ⚠️ 未找到路由文件: ${routeFilePath}`); - return []; - } - - try { - const routeContent = fs.readFileSync(routeFilePath, 'utf-8'); - const routes = []; - - // 提取Route::group内的内容 - const groupMatch = routeContent.match(/Route::group\(['"]([^'"]+)['"],\s*function\s*\(\)\s*\{([\s\S]*?)\}\)/); - if (groupMatch) { - const groupPrefix = groupMatch[1]; - const groupContent = groupMatch[2]; - - // 匹配所有路由定义: Route::方法('路径', '控制器.方法') - const routePattern = /Route::(\w+)\(['"]([^'"]+)['"],\s*['"]([^'"]+)['"]\)/g; - let match; - - while ((match = routePattern.exec(groupContent)) !== null) { - const httpMethod = match[1]; // get, post, put, delete - const routePath = match[2]; // 如 'site/:id' - const controllerMethod = match[3]; // 如 'site.Site/lists' - - // 解析控制器方法: 'site.Site/lists' -> moduleName='site', controller='Site', method='lists' - const methodParts = controllerMethod.split('/'); - if (methodParts.length === 2) { - const controllerPart = methodParts[0]; // 'site.Site' - const methodName = methodParts[1]; // 'lists' - const controllerParts = controllerPart.split('.'); - - if (controllerParts.length === 2) { - const routeModule = controllerParts[0]; // 'site' - const routeController = controllerParts[1]; // 'Site' - - // 只提取当前控制器的路由 - if (routeModule === moduleName && routeController === controllerName) { - routes.push({ - httpMethod: httpMethod.toLowerCase(), - routePath: routePath, - methodName: methodName - }); - } - } - } - } - } - - return routes; - - } catch (error) { - console.log(` ❌ 解析路由文件失败: ${error.message}`); - return []; - } - } - - /** - * 解析PHP控制器方法 - * 结合路由信息和控制器方法体 - */ - parsePHPControllerMethods(moduleName, controllerName, layer) { - // 1. 先从路由文件提取API信息(HTTP方法 + 路径) - const routes = this.extractRoutesFromPHP(moduleName, controllerName, layer); - - if (routes.length > 0) { - console.log(` ✅ 从路由文件提取到 ${routes.length} 个API`); - } - - // 2. 读取PHP控制器文件 - const phpControllerPath = path.join(this.config.phpBasePath, 'app', layer, 'controller', moduleName, `${controllerName}.php`); - - if (!fs.existsSync(phpControllerPath)) { - return ' // 未找到PHP控制器文件,无法解析方法'; - } - - try { - const phpContent = fs.readFileSync(phpControllerPath, 'utf-8'); - - // 3. 提取所有public方法 - const methodMatches = phpContent.match(/public function (\w+)\([^)]*\)\s*\{[\s\S]*?\n\s*\}/g); - - if (!methodMatches || methodMatches.length === 0) { - return ' // 未找到PHP控制器方法'; - } - - // 4. 为每个方法匹配路由信息 - const methods = methodMatches.map(match => { - // 提取方法名 - const nameMatch = match.match(/public function (\w+)\(/); - if (!nameMatch) return null; - - const methodName = nameMatch[1]; - - // 从路由信息中查找该方法的路由配置 - const routeInfo = routes.find(r => r.methodName === methodName); - - // 如果没有路由信息,跳过此方法(说明没有对外暴露) - if (!routeInfo) { - console.log(` ⚠️ 方法 ${methodName} 没有对应的路由,跳过生成`); - return null; - } - - // 提取方法注释 - const commentMatch = phpContent.match(new RegExp(`/\\*\\*[\\s\\S]*?\\*/\\s*public function ${methodName}`)); - const description = commentMatch ? this.extractDescription(commentMatch[0]) : methodName; - - // 使用路由信息中的HTTP方法 - const httpMethod = routeInfo.httpMethod.charAt(0).toUpperCase() + routeInfo.httpMethod.slice(1); - - // 生成NestJS方法(传入路由信息) - return this.generateNestJSControllerMethod(methodName, description, httpMethod, match, moduleName, controllerName, layer, routeInfo); - }).filter(method => method !== null); - - return methods.join('\n\n'); - - } catch (error) { - console.log(` ❌ 解析PHP控制器失败: ${error.message}`); - return ' // 解析PHP控制器失败'; - } - } - - /** - * 提取方法描述 - */ - extractDescription(comment) { - const descMatch = comment.match(/@description\s+(.+)/); - return descMatch ? descMatch[1].trim() : ''; - } - - /** - * 确定HTTP方法 - */ - determineHttpMethod(methodName) { - if (methodName.startsWith('get') || methodName.startsWith('list') || methodName.startsWith('info')) { - return 'Get'; - } else if (methodName.startsWith('add') || methodName.startsWith('create') || methodName.startsWith('set')) { - return 'Post'; - } else if (methodName.startsWith('edit') || methodName.startsWith('update') || methodName.startsWith('modify')) { - return 'Put'; - } else if (methodName.startsWith('del') || methodName.startsWith('delete') || methodName.startsWith('remove')) { - return 'Delete'; - } else { - return 'Post'; // 默认使用Post - } - } - - /** - * 生成NestJS控制器方法 - */ - generateNestJSControllerMethod(methodName, description, httpMethod, phpMethod, moduleName, controllerName, layer, routeInfo = null) { - // 使用路由信息中的路径,如果没有则使用kebab-case方法名 - const routePath = routeInfo ? routeInfo.routePath : this.toKebabCase(methodName); - - // 解析路径参数 (如 :id, :uid) - const pathParams = routePath.match(/:(\w+)/g) || []; - const hasPathParams = pathParams.length > 0; - const serviceInstanceName = this.getServiceInstanceName(phpMethod, controllerName); - - // 解析PHP方法中实际调用的服务方法和参数 - const { serviceMethodName, params, isDirectReturn } = this.parsePHPMethodCall(phpMethod); - console.log(` 🔍 parsePHPMethodCall结果: serviceMethodName="${serviceMethodName}", params=${JSON.stringify(params)}, isDirectReturn=${isDirectReturn}`); - - // 生成参数列表(包含路径参数和请求体) - const paramsList = []; - - // 1. 添加路径参数 - if (hasPathParams) { - pathParams.forEach(param => { - const paramName = param.substring(1); // 移除 : 前缀 - paramsList.push(`@Param('${paramName}') ${paramName}: string`); - }); - } - - // 2. 添加查询参数(如果有) - if (params.length > 0) { - params.forEach(p => { - // 避免重复(如果参数名已经在路径参数中) - const paramName = p.name; - if (!pathParams.some(pp => pp.substring(1) === paramName)) { - if (p.defaultValue) { - paramsList.push(`@Query('${paramName}') ${paramName}: ${p.type || 'any'} = ${p.defaultValue}`); - } else { - paramsList.push(`@Query('${paramName}') ${paramName}: ${p.type || 'any'}`); - } - } - }); - } - - // 3. 添加请求体参数(对于POST/PUT请求) - if (httpMethod === 'Post' || httpMethod === 'Put') { - const dtoName = `${this.toPascalCase(methodName)}Dto`; - paramsList.push(`@Body() data: ${dtoName}`); - } - - const methodParams = paramsList.join(', '); - - // 生成路由信息注释(提前生成,所有return都要用) - const routeComment = routeInfo - ? ` * 路由: ${routeInfo.httpMethod.toUpperCase()} ${routePath}\n * PHP路由: Route::${routeInfo.httpMethod}('${routePath}', '${moduleName}.${controllerName}/${methodName}')` - : ` * 基于PHP控制器方法: ${methodName}`; - - // 生成守卫装饰器 - const guardDecorators = this.generateGuardDecorators(layer); - - // 生成返回类型 - const returnType = this.generateReturnType(serviceMethodName); - - // 生成调用参数 - 需要根据PHP方法体中的实际调用生成 - let callParams = ''; - if (serviceMethodName) { - // 解析PHP方法体中的服务调用参数 - const serviceCallMatch = phpMethod.match(/\)\s*->\s*(\w+)\(([^)]*)\)/); - if (serviceCallMatch) { - const phpCallParams = serviceCallMatch[2]; - if (phpCallParams.trim()) { - // 解析PHP调用参数 - const paramList = phpCallParams.split(',').map(p => p.trim()); - const tsParams = paramList.map(param => { - if (param === '$key') return 'key'; - if (param === '$data') return 'data'; - if (param.startsWith('$')) return param.substring(1); - // 处理数组访问,如 $data['search'] -> data.search - if (param.includes("['") && param.includes("']")) { - const match = param.match(/\$(\w+)\['(\w+)'\]/); - if (match) { - return `${match[1]}.${match[2]}`; // 返回 data.search - } - } - // 处理PHP数组语法,如 ['id' => $id] -> { id: id } - if (param.includes("['") && param.includes("' =>")) { - const arrayMatch = param.match(/\[([\s\S]*)\]/); - if (arrayMatch) { - const arrayContent = arrayMatch[1]; - const keyValuePairs = arrayContent.split(',').map(pair => { - const kvMatch = pair.match(/['"]([^'"]+)['"]\s*=>\s*\$(\w+)/); - if (kvMatch) { - return `${kvMatch[1]}: ${kvMatch[2]}`; - } - return pair.trim(); - }); - return `{ ${keyValuePairs.join(', ')} }`; - } - } - return param; - }); - callParams = tsParams.join(', '); - } - } - } - - // 如果没有解析到调用参数,使用默认参数 - if (!callParams) { - if (params.length > 0) { - callParams = params.map(p => p.name).join(', '); - } else { - // 如果服务方法需要参数但控制器没有参数,添加默认参数 - if (serviceMethodName) { - // 根据方法名推断需要的参数 - if (serviceMethodName.includes('List') || serviceMethodName.includes('Search')) { - // 检查PHP服务方法是否真的需要参数 - const phpServicePath = this.getPHPServicePath(moduleName, serviceMethodName); - if (phpServicePath && this.checkPHPServiceMethodNeedsParams(phpServicePath, serviceMethodName)) { - callParams = 'params'; - } - } else if (serviceMethodName.includes('Info') || serviceMethodName.includes('Detail')) { - callParams = 'id'; - } - } - } - } - - // 如果是直接返回常量(如 keyBlackList 返回字典) - console.log(` 🔍 检查isDirectReturn: ${isDirectReturn}, serviceMethodName: "${serviceMethodName}"`); - if (isDirectReturn) { - console.log(` 🔍 进入直接返回处理逻辑`); - // 检查是否是空方法体 - if (!serviceMethodName) { - console.log(` 🔍 serviceMethodName为空,开始处理直接返回`); - // 尝试从PHP方法体中提取字典调用 - const dictMatch = phpMethod.match(/(\w+)::(\w+)\([^)]*\)/); - if (dictMatch) { - const dictName = dictMatch[1]; - const dictMethod = dictMatch[2]; - return ` /** - * ${description || methodName} -${routeComment} - */ - @${httpMethod}('${routePath}') - @ApiOperation({ summary: '${description || methodName}' }) - async ${methodName}(${methodParams}) { - try { - // 基于PHP真实逻辑实现 - // PHP原始方法: ${methodName} - // 直接返回字典数据 - return ${dictName}.${dictMethod}(); - } catch (error) { - throw new BusinessException('${methodName}操作失败', error); - } - }`; - } - - // 尝试从PHP方法体中提取 return success(...) 调用 - const bodyMatch = phpMethod.match(/\{([\s\S]*)\}/); - const methodBody = bodyMatch ? bodyMatch[1] : ''; - const successMatch = methodBody.match(/return\s+success\((.+)\);?\s*$/); - console.log(` 🔍 检查return success匹配: ${methodBody.substring(0, 200)}...`); - console.log(` 🔍 successMatch结果: ${successMatch ? '匹配成功' : '匹配失败'}`); - if (successMatch) { - console.log(` 🔍 匹配到的success数据: ${successMatch[1]}`); - const successData = successMatch[1]; - console.log(` 🔍 原始success数据: ${successData}`); - // 转换PHP语法到TypeScript - let convertedData = successData; - console.log(` 🔍 步骤1 - 原始数据: ${convertedData}`); - - convertedData = convertedData.replace(/\[([^\]]+)\]/g, '{$1}'); // PHP数组 -> TypeScript对象 - console.log(` 🔍 步骤2 - 数组转换: ${convertedData}`); - - convertedData = convertedData.replace(/'([^']+)'\s*=>/g, '$1:'); // PHP关联数组 -> TypeScript对象属性 - console.log(` 🔍 步骤3 - 关联数组转换: ${convertedData}`); - - console.log(` 🔍 步骤4前 - 检查env匹配: ${convertedData}`); - const envMatches = convertedData.match(/env\(([^)]+)\)/g); - console.log(` 🔍 步骤4前 - env匹配结果: ${envMatches ? envMatches.join(', ') : '无匹配'}`); - - convertedData = convertedData.replace(/env\(([^)]+)\)/g, (match, p1) => { - console.log(` 🔍 步骤4中 - 匹配到env: ${match}, 参数: ${p1}`); - // 处理 env('key', default) 格式 - const parts = p1.split(','); - if (parts.length === 2) { - const key = parts[0].trim().replace(/['"]/g, ''); - const defaultValue = parts[1].trim(); - const result = `process.env.${key} || ${defaultValue}`; - console.log(` 🔍 步骤4中 - 转换结果: ${result}`); - return result; - } else { - const key = p1.trim().replace(/['"]/g, ''); - const result = `process.env.${key}`; - console.log(` 🔍 步骤4中 - 转换结果: ${result}`); - return result; - } - }); // PHP env() -> TypeScript process.env - console.log(` 🔍 步骤4 - env转换: ${convertedData}`); - - convertedData = convertedData.replace(/,\s*}/g, '}'); // 移除尾随逗号 - console.log(` 🔍 步骤5 - 移除尾随逗号: ${convertedData}`); - - convertedData = convertedData.replace(/,\s*]/g, ']'); // 移除尾随逗号 - console.log(` 🔍 步骤6 - 移除尾随逗号: ${convertedData}`); - - convertedData = convertedData.replace(/process\.env\.'([^']+)'/g, 'process.env.$1'); // 移除process.env的引号 - console.log(` 🔍 步骤7 - 移除引号: ${convertedData}`); - - // convertedData = convertedData.replace(/process\.env\.([^,}\s]+)/g, 'process.env.$1 || false'); // 注释掉,避免重复添加默认值 - // console.log(` 🔍 步骤8 - 添加默认值: ${convertedData}`); - console.log(` 🔍 转换后的数据: ${convertedData}`); - - return ` /** - * ${description || methodName} -${routeComment} - */ - @${httpMethod}('${routePath}') - @ApiOperation({ summary: '${description || methodName}' }) - async ${methodName}(${methodParams}) { - try { - // 基于PHP真实逻辑实现 - // PHP原始方法: ${methodName} - // 直接返回数据 - return { success: true, data: ${convertedData} }; - } catch (error) { - throw new BusinessException('${methodName}操作失败', error); - } - }`; - } - - return ` /** - * ${description || methodName} -${routeComment} - */ - @${httpMethod}('${routePath}') - @ApiOperation({ summary: '${description || methodName}' }) - async ${methodName}(${methodParams}) { - try { - // 基于PHP真实逻辑实现 - // PHP原始方法: ${methodName} - // 空方法体或直接返回,需要根据实际业务逻辑实现 - return { message: '${methodName} - 待实现' }; - } catch (error) { - throw new BusinessException('${methodName}操作失败', error); - } - }`; - } - - return ` /** - * ${description || methodName} -${routeComment} - */ - @${httpMethod}('${routePath}') - @ApiOperation({ summary: '${description || methodName}' }) - async ${methodName}(${methodParams}) { - try { - // 基于PHP真实逻辑实现 - // PHP原始方法: ${methodName} - // TODO: 实现直接返回逻辑 - return { message: '${methodName} - 需要实现直接返回逻辑' }; - } catch (error) { - throw new BusinessException('${methodName}操作失败', error); - } - }`; - } - - // 检查是否有服务方法名 - console.log(` 🔍 服务方法名: "${serviceMethodName}"`); - if (!serviceMethodName) { - return ` /** - * ${description || methodName} -${routeComment} - */ - @${httpMethod}('${routePath}') - @ApiOperation({ summary: '${description || methodName}' }) - async ${methodName}(${methodParams}) { - try { - // 基于PHP真实逻辑实现 - // PHP原始方法: ${methodName} - // 服务方法名解析失败,需要手动实现 - return { message: '${methodName} - 服务方法名解析失败,需要手动实现' }; - } catch (error) { - throw new BusinessException('${methodName}操作失败', error); - } - }`; - } - - return ` /** - * ${description || methodName} -${routeComment} - */ - @${httpMethod}('${routePath}') - ${guardDecorators} - @ApiOperation({ summary: '${description || methodName}' }) - async ${methodName}(${methodParams})${returnType} { - try { - // 基于PHP真实逻辑实现 - // PHP原始方法: ${methodName} - ${this.generateDataExtraction(phpMethod)} - return await this.${serviceInstanceName}.${serviceMethodName}(${callParams}); - } catch (error) { - throw new BusinessException('${methodName}操作失败', error); - } - }`; - } - - /** - * 解析PHP方法调用 - * 提取服务方法名和参数 - */ - parsePHPMethodCall(phpMethod) { - // 默认值 - let serviceMethodName = ''; - let params = []; - let isDirectReturn = false; - - try { - // 提取方法体 - const bodyMatch = phpMethod.match(/\{([\s\S]*)\}/); - if (!bodyMatch) { - return { serviceMethodName: '', params: [], isDirectReturn: false }; - } - - const methodBody = bodyMatch[1]; - - console.log(` 🔍 解析PHP方法体: ${methodBody.substring(0, 100)}...`); - console.log(` 🔍 方法名: ${phpMethod.match(/function\s+(\w+)/)?.[1] || 'unknown'}`); - - // 转换PHP语法到TypeScript - const convertedMethodBody = methodBody - .replace(/::/g, '.') // PHP静态调用 -> TypeScript属性访问 - .replace(/\$this->/g, 'this.') // PHP实例调用 -> TypeScript实例调用 - .replace(/\)\s*->/g, ').') // PHP方法调用 -> TypeScript方法调用 - .replace(/\$(\w+)/g, '$1') // PHP变量 -> TypeScript变量 - .replace(/new\s+(\w+Service)\s*\([^)]*\)/g, (match, serviceName) => { - // 将ServiceName转换为serviceName (camelCase) - const camelCaseName = serviceName.charAt(0).toLowerCase() + serviceName.slice(1).replace('Service', ''); - return `this.${camelCaseName}Service`; - }) - .replace(/new\s+(\w+Service)\s*\)/g, (match, serviceName) => { - // 将ServiceName转换为serviceName (camelCase) - const camelCaseName = serviceName.charAt(0).toLowerCase() + serviceName.slice(1).replace('Service', ''); - return `this.${camelCaseName}Service`; - }) - // .replace(/success\(/g, 'return ') // 注释掉,避免干扰后续的success匹配 - .replace(/error\(/g, 'throw new BusinessException(') // PHP错误 -> TypeScript异常 - .replace(/env\(([^)]+)\)/g, 'process.env.$1') // PHP env() -> TypeScript process.env - .replace(/process\.env\.'([^']+)'/g, 'process.env.$1') // 移除process.env的引号 - .replace(/\[([^\]]+)\]/g, '{$1}') // PHP数组 -> TypeScript对象 - .replace(/'([^']+)'\s*=>/g, '$1:') // PHP关联数组 -> TypeScript对象属性 - .replace(/,\s*}/g, '}') // 移除尾随逗号 - .replace(/,\s*]/g, ']') // 移除尾随逗号 - .replace(/->/g, '.'); // 将剩余的 -> 转换为 . - - console.log(` 🔍 完整convertedMethodBody: ${convertedMethodBody}`); // Added debug log - - // 检查是否是直接返回常量/字典(如 SiteDict::getStatus()) - // 在转换前检查原始方法体中的静态调用 - if (methodBody.includes('::') && !methodBody.includes('->') && !methodBody.includes('new ')) { - isDirectReturn = true; - return { serviceMethodName: '', params: [], isDirectReturn: true }; - } - - // 提取方法名(匹配 .方法名( 或 ).方法名(,优先匹配 new Service().method) - // 优先匹配服务调用: new Service() ).method( - let serviceCallMatch = convertedMethodBody.match(/\)\s*\.\s*(\w+)\(/); - if (serviceCallMatch) { - serviceMethodName = serviceCallMatch[1]; - console.log(` ✅ 找到服务调用: ${serviceMethodName}`); - } else { - console.log(` ❌ 未找到服务调用,convertedMethodBody: ${convertedMethodBody.substring(0, 200)}...`); - // 如果没有找到,再匹配普通的 .method( - serviceCallMatch = convertedMethodBody.match(/\.(\w+)\(/); - if (serviceCallMatch) { - console.log(` 🔍 找到 ->method 调用: ${serviceCallMatch[1]}`); - // 过滤掉 request、params 等非服务方法 - const excludedMethods = ['request', 'params', 'param', 'input', 'validate']; - if (!excludedMethods.includes(serviceCallMatch[1])) { - serviceMethodName = serviceCallMatch[1]; - console.log(` ✅ 设置服务方法名: ${serviceMethodName}`); - } else { - console.log(` ❌ 排除非服务方法: ${serviceCallMatch[1]}`); - } - } else { - console.log(` ❌ 未找到 ->method 调用`); - // 处理属性访问: .property (转换为方法调用) - // 只匹配真正的属性访问,不匹配方法调用 - const propertyMatch = convertedMethodBody.match(/\)\s*\.\s*(\w+)(?!\()/); - if (propertyMatch) { - const propertyName = propertyMatch[1]; - // 检查是否是真正的属性访问(不是服务方法调用) - // 服务方法通常以动词开头:get, set, add, edit, del, etc. - const serviceMethodPrefixes = ['get', 'set', 'add', 'edit', 'del', 'update', 'create', 'delete', 'find', 'list', 'check', 'verify', 'upload', 'download', 'build', 'clear', 'release']; - const isServiceMethod = serviceMethodPrefixes.some(prefix => propertyName.toLowerCase().startsWith(prefix)); - - if (!isServiceMethod) { - // 将属性访问转换为方法调用,如 is_connected -> getIsConnected - serviceMethodName = `get${propertyName.charAt(0).toUpperCase()}${propertyName.slice(1)}`; - console.log(` ✅ 找到属性访问: ${propertyName} -> ${serviceMethodName}`); - } else { - console.log(` ❌ 跳过服务方法: ${propertyName}`); - } - } else { - console.log(` ❌ 未找到属性访问,convertedMethodBody: ${convertedMethodBody.substring(0, 200)}...`); - } - } - } - - console.log(` 🔍 当前serviceMethodName: "${serviceMethodName}"`); - - // 如果仍然没有找到方法名,检查原始PHP代码中的服务调用 - if (!serviceMethodName) { - console.log(` 🔍 开始检查原始PHP代码中的服务调用`); - // 匹配 (new Service())->method( 模式 - const originalServiceMatch = methodBody.match(/\(new\s+(\w+Service)\([^)]*\)\)\s*->\s*(\w+)\(/); - if (originalServiceMatch) { - serviceMethodName = originalServiceMatch[2]; - console.log(` ✅ 找到服务调用: ${originalServiceMatch[1]}.${serviceMethodName}`); - } else { - console.log(` ❌ originalServiceMatch 不匹配`); - // 匹配 new Service()->method( 模式 - const directServiceMatch = methodBody.match(/new\s+(\w+Service)\([^)]*\)\s*->\s*(\w+)\(/); - if (directServiceMatch) { - serviceMethodName = directServiceMatch[2]; - console.log(` ✅ 找到服务调用: ${directServiceMatch[1]}.${serviceMethodName}`); - } else { - console.log(` ❌ directServiceMatch 不匹配`); - // 匹配变量服务调用: service.method( 模式 (在convertedMethodBody中$已被移除) - const variableServiceMatch = convertedMethodBody.match(/(\w+_service)\s*\.\s*(\w+)\(/); - if (variableServiceMatch) { - serviceMethodName = variableServiceMatch[2]; - console.log(` ✅ 找到变量服务调用: ${variableServiceMatch[1]}.${serviceMethodName}`); - } else { - console.log(` ❌ 变量服务调用正则不匹配: /(\\w+_service)\\s*\\.\\s*(\\w+)\\(/`); - console.log(` 🔍 尝试匹配的内容: ${convertedMethodBody}`); - } - } - } - } else { - console.log(` ✅ 已找到服务方法名: ${serviceMethodName}`); - } - - // 处理空方法体的情况 - if (!serviceMethodName && methodBody.trim() === '') { - // 对于空方法体,返回空字符串,让调用方处理 - return { serviceMethodName: '', params: [], isDirectReturn: true }; - } - - // 处理直接返回的情况(如 return success(['app_debug' => env('app_debug', false)]);) - // 只有当方法体非常简单(只有一行return语句)时才认为是直接返回 - if (!serviceMethodName && methodBody.includes('return success(')) { - const trimmedBody = methodBody.trim(); - // 检查是否只有一行return语句(允许有注释) - const lines = trimmedBody.split('\n').filter(line => line.trim() && !line.trim().startsWith('//') && !line.trim().startsWith('/*')); - if (lines.length === 1 && lines[0].trim().startsWith('return success(')) { - console.log(` ⚠️ 方法 ${phpMethod.match(/function\s+(\w+)/)?.[1]} 被识别为直接返回,但serviceMethodName为空`); - isDirectReturn = true; - return { serviceMethodName: '', params: [], isDirectReturn: true }; - } - } - - // 提取方法参数(从 $data 提取) - const dataParamMatch = convertedMethodBody.match(/data\s*=\s*this.request.params\(\[([\s\S]*?)\]\);/); - if (dataParamMatch) { - const paramsStr = dataParamMatch[1]; - const paramMatches = paramsStr.matchAll(/\[\s*'(\w+)'[^\]]*\]/g); - for (const paramMatch of paramMatches) { - const paramName = paramMatch[1]; - // 避免重复参数 - if (!params.some(p => p.name === paramName)) { - params.push({ name: paramName, type: 'any' }); - } - } - } - - // 提取路径参数(函数签名中的参数) - const funcParamMatch = phpMethod.match(/function\s+\w+\(([\s\S]*?)\)/); - if (funcParamMatch && funcParamMatch[1].trim()) { - const funcParams = funcParamMatch[1].split(','); - for (const funcParam of funcParams) { - // 提取参数名,移除类型提示(如 string $key -> key) - let paramName = funcParam.trim(); - // 移除类型提示(如 "string $key" -> "$key") - paramName = paramName.replace(/^\w+\s+/, ''); - // 移除 $ 符号 - paramName = paramName.replace('$', ''); - - // 处理默认值(如 "addon = ''" -> "addon: any = ''") - if (paramName.includes('=')) { - const [name, defaultValue] = paramName.split('=').map(s => s.trim()); - if (name && !params.some(p => p.name === name)) { - params.push({ name: name, type: 'any', defaultValue: defaultValue }); - } - } else if (paramName && !params.some(p => p.name === paramName)) { - params.push({ name: paramName, type: 'any' }); - } - } - } - - } catch (error) { - console.log(` ⚠️ 解析PHP方法调用失败: ${error.message}`); - } - - return { serviceMethodName, params, isDirectReturn }; - } - - /** - * 转换为kebab-case - */ - toKebabCase(str) { - return str.replace(/([A-Z])/g, '-$1').toLowerCase().replace(/^-/, ''); - } - - /** - * 获取PHP控制器的实际服务依赖 - */ - getServiceImports(moduleName, controllerName, layer) { - const phpProjectPath = path.join(__dirname, '../../niucloud-php/niucloud'); - const controllerPath = path.join(phpProjectPath, 'app', layer, 'controller', moduleName, `${this.toPascalCase(controllerName)}.php`); - - if (!fs.existsSync(controllerPath)) { - return this.getDefaultServiceImport(moduleName, controllerName, layer); - } - - try { - const content = fs.readFileSync(controllerPath, 'utf8'); - const serviceImports = []; - - // 解析 use 语句中的服务 - const useMatches = content.match(/use\s+app\\service\\([^;]+);/g); - if (useMatches) { - for (const useMatch of useMatches) { - const servicePath = useMatch.match(/use\s+app\\service\\([^;]+);/)[1]; - const parts = servicePath.split('\\'); - const serviceName = parts[parts.length - 1]; - const serviceLayer = parts[0]; // 第一层是层级 (admin/api/core) - const serviceModule = parts[1]; // 第二层是模块名 - - // 生成服务类名 - 保留层级区分 - let serviceClassName = serviceName; - if (serviceLayer === 'admin') { - serviceClassName = serviceName; - } else if (serviceLayer === 'api') { - serviceClassName = serviceName; - } else if (serviceLayer === 'core') { - // 如果serviceName已经以Core开头,不再重复添加 - serviceClassName = serviceName.startsWith('Core') ? serviceName : `Core${serviceName}`; - } - - // 生成导入路径 - const importPath = this.getServiceImportPath(serviceModule, serviceLayer, serviceName, moduleName); - if (importPath) { - serviceImports.push(`import { ${serviceClassName} } from '${importPath}';`); - } - } - } - - - return serviceImports.join('\n'); - } catch (error) { - console.warn(`⚠️ 解析PHP控制器失败: ${controllerPath}`); - return this.getDefaultServiceImport(moduleName, controllerName, layer); - } - } - - /** - * 获取默认服务导入 - 智能选择服务层 - */ - getDefaultServiceImport(moduleName, controllerName, layer) { - // 基于真实PHP控制器解析服务依赖,智能选择服务层 - const baseName = controllerName.replace(/Controller$/, ''); - - // 智能选择最佳服务层 - const bestServiceLayer = this.selectBestServiceLayer(moduleName, layer); - if (!bestServiceLayer) { - console.log(` ⚠️ 模块 ${moduleName} 没有可用的服务层`); - return ''; - } - - let serviceClassName = `${baseName}Service`; - if (bestServiceLayer === 'core') { - // Core层服务需要Core前缀 - serviceClassName = baseName.startsWith('Core') ? `${baseName}Service` : `Core${baseName}Service`; - } - - // 检查服务文件是否存在 - const servicePath = path.join(this.config.nestjsBasePath, moduleName, 'services', bestServiceLayer, `${this.toKebabCase(baseName)}.service.ts`); - if (!fs.existsSync(servicePath)) { - console.log(` ⚠️ 服务文件不存在: ${servicePath}`); - return ''; - } - - console.log(` ✅ 选择服务层: ${moduleName} -> ${bestServiceLayer} (${serviceClassName})`); - return `import { ${serviceClassName} } from '../../services/${bestServiceLayer}/${this.toKebabCase(baseName)}.service';`; - } - - /** - * 获取服务导入路径 - */ - getServiceImportPath(serviceModule, serviceLayer, serviceName, currentModule) { - const baseName = serviceName.replace('Service', ''); - - // 如果是跨模块服务,需要调整路径 - if (serviceModule !== currentModule) { - // 跨模块服务直接使用解析出的服务层 - const servicePath = path.join(this.config.nestjsBasePath, serviceModule, 'services', serviceLayer, `${this.toKebabCase(baseName)}.service.ts`); - if (!fs.existsSync(servicePath)) { - return ''; - } - return `../../../${serviceModule}/services/${serviceLayer}/${this.toKebabCase(baseName)}.service`; - } - - // 同模块服务 - 直接使用解析出的服务层 - const servicePath = path.join(this.config.nestjsBasePath, currentModule, 'services', serviceLayer, `${this.toKebabCase(baseName)}.service.ts`); - if (!fs.existsSync(servicePath)) { - return ''; - } - - return `../../services/${serviceLayer}/${this.toKebabCase(baseName)}.service`; - } - - /** - * 获取构造函数中的服务注入 - */ - getConstructorServices(moduleName, controllerName, layer) { - const phpProjectPath = path.join(__dirname, '../../niucloud-php/niucloud'); - const controllerPath = path.join(phpProjectPath, 'app', layer, 'controller', moduleName, `${this.toPascalCase(controllerName)}.php`); - - if (!fs.existsSync(controllerPath)) { - return this.getDefaultConstructorService(moduleName, controllerName, layer); - } - - try { - const content = fs.readFileSync(controllerPath, 'utf8'); - const services = []; - - // 获取控制器中的所有方法名,避免服务实例名与方法名重复 - const methodMatches = content.match(/public\s+function\s+(\w+)\s*\(/g); - const methodNames = methodMatches ? methodMatches.map(match => { - const methodMatch = match.match(/public\s+function\s+(\w+)\s*\(/); - return methodMatch ? methodMatch[1] : null; - }).filter(name => name) : []; - - // 解析 use 语句中的服务 - const useMatches = content.match(/use\s+app\\service\\([^;]+);/g); - if (useMatches) { - for (const useMatch of useMatches) { - const servicePath = useMatch.match(/use\s+app\\service\\([^;]+);/)[1]; - const parts = servicePath.split('\\'); - const serviceName = parts[parts.length - 1]; - const serviceLayer = parts[0]; // 第一层是层级 (admin/api/core) - const serviceModule = parts[1]; // 第二层是模块名 - - // 生成服务类名 - 保留层级区分 - let serviceClassName = serviceName; - if (serviceLayer === 'admin') { - serviceClassName = serviceName; - } else if (serviceLayer === 'api') { - serviceClassName = serviceName; - } else if (serviceLayer === 'core') { - // 如果serviceName已经以Core开头,不再重复添加 - serviceClassName = serviceName.startsWith('Core') ? serviceName : `Core${serviceName}`; - } - - // 检查服务文件是否存在 - const serviceImportPath = this.getServiceImportPath(serviceModule, serviceLayer, serviceName, moduleName); - if (serviceImportPath) { - // 生成服务实例名,与getServiceInstanceName保持一致 - const baseInstanceName = this.toCamelCase(serviceName.replace('Service', '')); - const serviceInstanceName = `${baseInstanceName}Service`; - services.push(`private readonly ${serviceInstanceName}: ${serviceClassName}`); - } - } - } - - - return services.join(',\n '); - } catch (error) { - console.warn(`⚠️ 解析PHP控制器失败: ${controllerPath}`); - return this.getDefaultConstructorService(moduleName, controllerName, layer); - } - } - - /** - * 获取默认构造函数服务 - 保留层级区分 - */ - getDefaultConstructorService(moduleName, controllerName, layer) { - // 基于真实PHP控制器解析服务依赖,保留层级区分 - const baseName = controllerName.replace(/Controller$/, ''); - let serviceClassName = `${baseName}Service`; - if (layer === 'admin') { - serviceClassName = `${baseName}Service`; - } else if (layer === 'api') { - serviceClassName = `${baseName}Service`; - } else if (layer === 'core') { - // 如果baseName已经以Core开头,不再重复添加 - serviceClassName = baseName.startsWith('Core') ? `${baseName}Service` : `Core${baseName}Service`; - } - - // 智能选择最佳服务层 - const bestServiceLayer = this.selectBestServiceLayer(moduleName, layer); - if (!bestServiceLayer) { - console.log(` ⚠️ 模块 ${moduleName} 没有可用的服务层`); - return ''; - } - - // 检查服务文件是否存在 - const servicePath = path.join(this.config.nestjsBasePath, moduleName, 'services', bestServiceLayer, `${this.toKebabCase(baseName)}.service.ts`); - if (!fs.existsSync(servicePath)) { - console.log(` ⚠️ 服务文件不存在: ${servicePath}`); - return ''; - } - - // 根据选择的服务层调整类名 - if (bestServiceLayer === 'core') { - serviceClassName = baseName.startsWith('Core') ? `${baseName}Service` : `Core${baseName}Service`; - } - - console.log(` ✅ 构造函数选择服务层: ${moduleName} -> ${bestServiceLayer} (${serviceClassName})`); - - const serviceInstanceName = this.toCamelCase(baseName); - // 避免服务实例名与方法名重复 - const methodNames = ['upgrade', 'login', 'captcha', 'logout', 'execute', 'operate']; - const finalInstanceName = methodNames.includes(serviceInstanceName) ? `${serviceInstanceName}Service` : serviceInstanceName; - return ` private readonly ${finalInstanceName}: ${serviceClassName}`; - } - - /** - * 获取服务实例名 - * 根据PHP方法中的实际服务调用选择正确的服务实例 - */ - getServiceInstanceName(phpMethod, controllerName) { - try { - // 提取方法体 - const bodyMatch = phpMethod.match(/\{([\s\S]*)\}/); - if (!bodyMatch) { - return this.getDefaultServiceInstanceName(controllerName); - } - - const methodBody = bodyMatch[1]; - - // 查找 new Service() 调用(支持有参数的情况) - const serviceMatch = methodBody.match(/new\s+(\w+Service)\s*\([^)]*\)/); - if (serviceMatch) { - const serviceName = serviceMatch[1]; - // 转换为实例名:LoginService -> loginService,与构造函数注入保持一致 - const instanceName = this.toCamelCase(serviceName.replace('Service', '')); - return `${instanceName}Service`; - } - - // 如果没有找到,使用默认逻辑 - return this.getDefaultServiceInstanceName(controllerName); - } catch (error) { - return this.getDefaultServiceInstanceName(controllerName); - } - } - - /** - * 获取默认服务实例名 - */ - getDefaultServiceInstanceName(controllerName) { - const baseName = controllerName.replace(/Controller$/, ''); - const serviceInstanceName = this.toCamelCase(baseName); - // 这里不需要硬编码方法名,因为会在getConstructorServices中动态获取 - return serviceInstanceName; - } - - /** - * 获取第一个服务实例名 - */ - getFirstServiceInstanceName(moduleName, controllerName, layer) { - // 解析PHP控制器中实际注入的服务,获取第一个服务的实例名 - const phpProjectPath = path.join(__dirname, '../../niucloud-php/niucloud'); - const controllerPath = path.join(phpProjectPath, 'app', layer, 'controller', moduleName, `${this.toPascalCase(controllerName)}.php`); - - if (!fs.existsSync(controllerPath)) { - // 默认使用控制器名,避免与方法名重复 - return this.getDefaultServiceInstanceName(controllerName); - } - - try { - const content = fs.readFileSync(controllerPath, 'utf8'); - - // 解析 use 语句中的第一个服务 - const useMatches = content.match(/use\s+app\\service\\([^;]+);/g); - if (useMatches && useMatches.length > 0) { - const firstUseMatch = useMatches[0]; - const servicePath = firstUseMatch.match(/use\s+app\\service\\([^;]+);/)[1]; - const parts = servicePath.split('\\'); - const serviceName = parts[parts.length - 1]; - - // 生成服务实例名:CoreAddonService -> coreAddon - return this.toCamelCase(serviceName.replace('Service', '')); - } - - // 如果没有找到服务,使用控制器名,避免与方法名重复 - return this.getDefaultServiceInstanceName(controllerName); - } catch (error) { - // 默认使用控制器名,避免与方法名重复 - return this.getDefaultServiceInstanceName(controllerName); - } - } - - /** - * 获取PHP服务文件路径 - */ - getPHPServicePath(moduleName, serviceMethodName) { - // 这里需要根据实际的服务文件结构来解析 - // 暂时返回null,避免复杂的路径解析 - return null; - } - - /** - * 检查PHP服务方法是否需要参数 - */ - checkPHPServiceMethodNeedsParams(phpServicePath, serviceMethodName) { - // 这里需要解析PHP服务文件来检查方法签名 - // 暂时返回false,避免复杂的PHP解析 - return false; - } - - /** - * 生成数据提取代码 - * 解析PHP中的 $this->request->params() 调用 - */ - generateDataExtraction(phpMethod) { - // 转换PHP语法到TypeScript - let convertedMethod = phpMethod - .replace(/::/g, '.') // PHP静态调用 -> TypeScript属性访问 - .replace(/\$this->/g, 'this.') // PHP实例调用 -> TypeScript实例调用 - .replace(/\$(\w+)/g, '$1') // PHP变量 -> TypeScript变量 - .replace(/new\s+(\w+Service)\([^)]*\)/g, (match, serviceName) => { - // 将ServiceName转换为serviceName (camelCase) - const camelCaseName = serviceName.charAt(0).toLowerCase() + serviceName.slice(1).replace('Service', ''); - return `this.${camelCaseName}`; - }) - .replace(/success\(/g, 'return ') // PHP成功返回 -> TypeScript返回 - .replace(/error\(/g, 'throw new BusinessException(') // PHP错误 -> TypeScript异常 - .replace(/\[([^\]]+)\]/g, '{$1}') // PHP数组 -> TypeScript对象 - .replace(/'([^']+)'\s*=>/g, '$1:') // PHP关联数组 -> TypeScript对象属性 - .replace(/,\s*}/g, '}') // 移除尾随逗号 - .replace(/,\s*]/g, ']'); // 移除尾随逗号 - - // 查找 $this->request->params() 调用 - const paramsMatch = convertedMethod.match(/params\(\[([\s\S]*?)\]/); - if (paramsMatch) { - const paramsContent = paramsMatch[1]; - // 解析参数列表 - const paramLines = paramsContent.split('\n').map(line => line.trim()).filter(line => line); - const dataFields = []; - - paramLines.forEach(line => { - // 匹配 [ 'field', default ] 格式,支持字符串和数字 - const fieldMatch = line.match(/\[\s*['"]([^'"]+)['"]\s*,\s*([^'"]*)\s*\]/); - if (fieldMatch) { - const fieldName = fieldMatch[1]; - const defaultValue = fieldMatch[2].trim(); - // 避免重复字段 - if (!dataFields.some(field => field.name === fieldName)) { - dataFields.push({ name: fieldName, default: defaultValue }); - } - } - }); - - if (dataFields.length > 0) { - // 生成数据对象 - const dataObject = dataFields.map(field => { - if (field.default === '0' || field.default === 'false') { - return `${field.name}: ${field.default}`; - } else if (field.default === 'true') { - return `${field.name}: ${field.default}`; - } else if (field.default === '') { - return `${field.name}: ''`; - } else if (field.default && !isNaN(field.default)) { - return `${field.name}: ${field.default}`; - } else { - return `${field.name}: ${field.default ? `'${field.default}'` : 'undefined'}`; - } - }).join(', '); - - return `const data = { ${dataObject} };`; - } - } - - // 如果没有找到params调用,但方法中使用了data变量,生成默认的data对象 - if (convertedMethod.includes('$data[') || convertedMethod.includes('data[')) { - // 尝试从方法体中提取使用的字段 - const fieldMatches = [...convertedMethod.matchAll(/data\[([^\]]+)\]/g)]; - if (fieldMatches.length > 0) { - const fields = fieldMatches.map(match => { - const field = match[1].trim().replace(/['"]/g, ''); - return field; - }); - - if (fields.length > 0) { - const dataObject = fields.map(field => `${field}: ''`).join(', '); - return `const data = { ${dataObject} };`; - } - } - return `const data = { search: '' };`; - } - - return ''; - } - - /** - * 转换为PascalCase - */ - toPascalCase(str) { - return str.charAt(0).toUpperCase() + str.slice(1); - } - - /** - * 转换为camelCase - */ - toCamelCase(str) { - return str.charAt(0).toLowerCase() + str.slice(1); - } - - /** - * 转换为kebab-case(我们框架的标准命名格式) - */ - toKebabCase(str) { - return str - .replace(/([A-Z])/g, '-$1') - .replace(/^-/, '') - .toLowerCase(); - } - - /** - * 检查模块是否有PHP控制器 - */ - hasPHPControllers(moduleName, layer) { - const phpProjectPath = path.join(__dirname, '../../niucloud-php/niucloud'); - const controllerPath = path.join(phpProjectPath, 'app', layer, 'controller', moduleName); - - if (!fs.existsSync(controllerPath)) return false; - - // 检查目录内是否有PHP文件 - try { - const files = fs.readdirSync(controllerPath); - return files.some(file => file.endsWith('.php')); - } catch (error) { - return false; - } - } - - /** - * 确保目录存在 - */ - ensureDir(dirPath) { - if (!fs.existsSync(dirPath)) { - fs.mkdirSync(dirPath, { recursive: true }); - } - } - - /** - * 输出统计报告 - */ - printStats() { - console.log('\n📊 控制器生成统计报告'); - console.log('=================================================='); - console.log(`✅ 创建控制器数量: ${this.stats.controllersCreated}`); - console.log(`❌ 错误数量: ${this.stats.errors}`); - console.log(`📈 成功率: ${this.stats.controllersCreated > 0 ? '100.00%' : '0.00%'}`); - } - - /** - * 获取模块可用的服务层 - 基于发现结果 - */ - getAvailableServiceLayers(moduleName) { - if (!this.discoveryData || !this.discoveryData.services) { - return []; - } - - const layers = []; - const moduleServices = this.discoveryData.services[moduleName]; - - if (moduleServices) { - // 从发现结果中提取所有层级 - const layerSet = new Set(); - Object.values(moduleServices).forEach(service => { - if (service.layer) { - layerSet.add(service.layer); - } - }); - layers.push(...layerSet); - } - - return layers; - } - - /** - * 智能选择最佳服务层 - */ - selectBestServiceLayer(moduleName, controllerLayer) { - const availableLayers = this.getAvailableServiceLayers(moduleName); - - // adminapi控制器:优先admin,其次core - if (controllerLayer === 'adminapi') { - if (availableLayers.includes('admin')) return 'admin'; - if (availableLayers.includes('core')) return 'core'; - } - - // api控制器:优先api,其次core - if (controllerLayer === 'api') { - if (availableLayers.includes('api')) return 'api'; - if (availableLayers.includes('core')) return 'core'; - } - - return null; // 没有可用的服务层 - } - - /** - * 查找服务文件 - 支持多层级查找 - */ - findServiceFile(moduleName, serviceName, preferredLayers) { - const layers = preferredLayers || ['admin', 'api', 'core']; - - for (const layer of layers) { - const servicePath = path.join(this.config.nestjsBasePath, moduleName, 'services', layer, `${this.toKebabCase(serviceName)}.service.ts`); - if (fs.existsSync(servicePath)) { - return { layer, path: servicePath }; - } - } - - return null; - } -} - -// 如果直接运行此文件 -if (require.main === module) { - const generator = new ControllerGenerator(); - generator.run().catch(console.error); -} - -module.exports = ControllerGenerator; diff --git a/tools/generators/dict-generator.js b/tools/generators/dict-generator.js deleted file mode 100644 index 172303cb..00000000 --- a/tools/generators/dict-generator.js +++ /dev/null @@ -1,270 +0,0 @@ -#!/usr/bin/env node - -const fs = require('fs'); -const path = require('path'); -const BaseGenerator = require('./base-generator'); - -/** - * 📚 字典生成器 - * 专门负责生成NestJS字典/枚举文件 - */ -class DictGenerator extends BaseGenerator { - constructor() { - super('DictGenerator'); - - this.config = { - phpBasePath: '/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud', - nestjsBasePath: '/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/wwjcloud-nest/src/core', - discoveryResultPath: '/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/tools/php-discovery-result.json' - }; - - this.discoveryData = null; - this.dictStats = { - dictsCreated: 0, - dictsSkipped: 0 - }; - } - - /** - * 运行字典生成 - */ - async run() { - try { - console.log('📚 启动字典生成器...'); - console.log('目标:生成NestJS字典/枚举文件\n'); - - // 加载PHP文件发现结果 - await this.loadDiscoveryData(); - - // 生成字典 - await this.generateDicts(); - - // 输出统计报告 - this.printStats(); - - } catch (error) { - console.error('❌ 字典生成失败:', error); - this.stats.errors++; - } - } - - /** - * 加载PHP文件发现结果 - */ - async loadDiscoveryData() { - try { - const data = fs.readFileSync(this.config.discoveryResultPath, 'utf8'); - this.discoveryData = JSON.parse(data); - console.log(' ✅ 成功加载PHP文件发现结果'); - } catch (error) { - console.error('❌ 加载发现结果失败:', error); - throw error; - } - } - - /** - * 生成字典 - */ - async generateDicts() { - console.log(' 🔨 生成字典...'); - - for (const [moduleName, dicts] of Object.entries(this.discoveryData.dicts)) { - for (const [dictName, dictInfo] of Object.entries(dicts)) { - await this.createDict(moduleName, dictName, dictInfo); - this.stats.dictsCreated++; - } - } - - console.log(` ✅ 生成了 ${this.stats.dictsCreated} 个字典`); - } - - /** - * 创建字典 - */ - async createDict(moduleName, dictName, dictInfo) { - // 使用 kebab-case 文件名,避免重叠名问题 - // 例如: dict → dict.enum.ts (而不是 DictDict.ts) - const kebabName = this.toKebabCase(dictName); - const dictPath = path.join( - this.config.nestjsBasePath, - moduleName, - 'enums', - `${kebabName}.enum.ts` // ✅ kebab-case + .enum.ts 后缀 - ); - - const content = this.generateDictContent(moduleName, dictName); - const success = this.writeFile(dictPath, content, `Enum for ${moduleName}/${dictName}`); - - if (success) { - this.dictStats.dictsCreated++; - } else { - this.dictStats.dictsSkipped++; - } - } - - /** - * 生成字典内容 - */ - generateDictContent(moduleName, dictName) { - // 避免重叠名: Dict → DictEnum (而不是 DictDict) - const pascalName = this.toPascalCase(dictName); - const className = `${pascalName}Enum`; // ✅ 例如: DictEnum, MemberEnum - const dictVarName = `${this.toCamelCase(dictName)}Dict`; // ✅ 例如: dictDict, memberDict - - const content = `/** - * ${dictName} 枚举 - * 定义相关的常量值 - */ - -export enum ${className} { - // 状态枚举 - STATUS_ACTIVE = 'active', - STATUS_INACTIVE = 'inactive', - STATUS_PENDING = 'pending', - STATUS_DELETED = 'deleted', - - // 类型枚举 - TYPE_NORMAL = 'normal', - TYPE_PREMIUM = 'premium', - TYPE_VIP = 'vip', - - // 级别枚举 - LEVEL_LOW = 1, - LEVEL_MEDIUM = 2, - LEVEL_HIGH = 3, - LEVEL_CRITICAL = 4, -} - -/** - * ${dictName} 字典映射 - */ -export const ${dictVarName} = { - // 状态映射 - status: { - [${className}.STATUS_ACTIVE]: '激活', - [${className}.STATUS_INACTIVE]: '未激活', - [${className}.STATUS_PENDING]: '待处理', - [${className}.STATUS_DELETED]: '已删除', - }, - - // 类型映射 - type: { - [${className}.TYPE_NORMAL]: '普通', - [${className}.TYPE_PREMIUM]: '高级', - [${className}.TYPE_VIP]: 'VIP', - }, - - // 级别映射 - level: { - [${className}.LEVEL_LOW]: '低', - [${className}.LEVEL_MEDIUM]: '中', - [${className}.LEVEL_HIGH]: '高', - [${className}.LEVEL_CRITICAL]: '紧急', - }, -} as const; - -/** - * ${dictName} 工具类 - */ -export class ${className}Util { - /** - * 获取状态文本 - */ - static getStatusText(status: ${className}): string { - return (${dictVarName}.status as any)[status] || '未知'; - } - - /** - * 获取类型文本 - */ - static getTypeText(type: ${className}): string { - return (${dictVarName}.type as any)[type] || '未知'; - } - - /** - * 获取级别文本 - */ - static getLevelText(level: ${className}): string { - return (${dictVarName}.level as any)[level] || '未知'; - } - - /** - * 获取所有状态选项 - */ - static getStatusOptions(): Array<{ value: string; label: string }> { - return Object.entries(${dictVarName}.status).map(([value, label]) => ({ - value, - label: label as string, - })); - } - - /** - * 获取所有类型选项 - */ - static getTypeOptions(): Array<{ value: string; label: string }> { - return Object.entries(${dictVarName}.type).map(([value, label]) => ({ - value, - label: label as string, - })); - } - - /** - * 获取所有级别选项 - */ - static getLevelOptions(): Array<{ value: number; label: string }> { - return Object.entries(${dictVarName}.level).map(([value, label]) => ({ - value: Number(value), - label: label as string, - })); - } - - /** - * 验证状态值 - */ - static isValidStatus(status: string): boolean { - return Object.values(${className}).includes(status as ${className}); - } - - /** - * 验证类型值 - */ - static isValidType(type: string): boolean { - return Object.values(${className}).includes(type as ${className}); - } - - /** - * 验证级别值 - */ - static isValidLevel(level: number): boolean { - return Object.values(${className}).includes(level as ${className}); - } -} - -/** - * ${dictName} 类型定义 - */ -export type ${className}Status = keyof typeof ${dictVarName}.status; -export type ${className}Type = keyof typeof ${dictVarName}.type; -export type ${className}Level = keyof typeof ${dictVarName}.level;`; - - return content; - } - - /** - * 输出统计报告 - */ - printStats() { - super.printStats({ - 'Dicts Created': this.dictStats.dictsCreated, - 'Dicts Skipped': this.dictStats.dictsSkipped - }); - } -} - -// 如果直接运行此文件 -if (require.main === module) { - const generator = new DictGenerator(); - generator.run().catch(console.error); -} - -module.exports = DictGenerator; diff --git a/tools/generators/entity-generator.js b/tools/generators/entity-generator.js deleted file mode 100644 index eb2bbb1b..00000000 --- a/tools/generators/entity-generator.js +++ /dev/null @@ -1,411 +0,0 @@ -#!/usr/bin/env node - -const fs = require('fs'); -const path = require('path'); -const BaseGenerator = require('./base-generator'); - -/** - * 🏗️ 实体生成器 - * 专门负责生成NestJS实体文件 - */ -class EntityGenerator extends BaseGenerator { - constructor() { - super('EntityGenerator'); - - this.config = { - phpBasePath: '/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud', - nestjsBasePath: '/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/wwjcloud-nest/src/core', - discoveryResultPath: '/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/tools/php-discovery-result.json' - }; - - this.discoveryData = null; - this.entityStats = { - entitiesCreated: 0, - entitiesSkipped: 0 - }; - } - - /** - * 运行实体生成 - */ - async run() { - try { - console.log('🏗️ 启动实体生成器...'); - console.log('目标:生成NestJS实体文件\n'); - - // 加载PHP文件发现结果 - await this.loadDiscoveryData(); - - // 生成实体 - await this.generateEntities(); - - // 输出统计报告 - this.printStats(); - - } catch (error) { - console.error('❌ 实体生成失败:', error); - this.stats.errors++; - } - } - - /** - * 加载PHP文件发现结果 - */ - async loadDiscoveryData() { - try { - const data = fs.readFileSync(this.config.discoveryResultPath, 'utf8'); - this.discoveryData = JSON.parse(data); - console.log(' ✅ 成功加载PHP文件发现结果'); - } catch (error) { - console.error('❌ 加载发现结果失败:', error); - throw error; - } - } - - /** - * 生成实体 - */ - async generateEntities() { - console.log(' 🔨 生成实体...'); - - // 检查是否有模型数据 - if (!this.discoveryData.models || Object.keys(this.discoveryData.models).length === 0) { - console.log(' ⚠️ 未发现PHP模型,跳过生成'); - return; - } - - for (const [moduleName, models] of Object.entries(this.discoveryData.models)) { - // 检查PHP项目是否有对应的模型目录 - if (!this.hasPHPModels(moduleName)) { - console.log(` ⚠️ 模块 ${moduleName} 在PHP项目中无模型,跳过`); - continue; - } - - for (const [modelName, modelInfo] of Object.entries(models)) { - await this.createEntity(moduleName, modelName, modelInfo); - this.stats.entitiesCreated++; - } - } - - console.log(` ✅ 生成了 ${this.stats.entitiesCreated} 个实体`); - } - - /** - * 创建实体 - */ - async createEntity(moduleName, modelName, modelInfo) { - const entityPath = path.join( - this.config.nestjsBasePath, - moduleName, - 'entity', - `${this.toKebabCase(modelName)}.entity.ts` - ); - - // 基于真实PHP model文件生成实体 - const content = await this.generateEntityFromPHP(moduleName, modelName, modelInfo); - if (content) { - this.writeFile(entityPath, content, `Entity for ${moduleName}/${modelName}`); - this.entityStats.entitiesCreated++; - } else { - this.log(`跳过实体生成: ${moduleName}/${this.toKebabCase(modelName)}.entity.ts (无PHP源码)`, 'warning'); - this.entityStats.entitiesSkipped++; - this.stats.filesSkipped++; - } - } - - toKebabCase(str) { - return String(str) - .replace(/([a-z0-9])([A-Z])/g, '$1-$2') - .replace(/_/g, '-') - .toLowerCase(); - } - - /** - * 基于PHP model文件生成实体 - */ - async generateEntityFromPHP(moduleName, modelName, modelInfo) { - const className = this.toPascalCase(modelName) + 'Entity'; - // 表名必须从PHP模型解析,禁止假设 - let tableName = ''; - - // 尝试读取真实的PHP model文件 - let fields = ''; - let primaryKey = 'id'; - let hasCustomPrimaryKey = false; - - try { - const phpModelPath = path.join(this.config.phpBasePath, 'app/model', moduleName, `${modelName}.php`); - if (fs.existsSync(phpModelPath)) { - const phpContent = fs.readFileSync(phpModelPath, 'utf-8'); - - // 提取主键信息 - const pkMatch = phpContent.match(/protected\s+\$pk\s*=\s*['"]([^'"]+)['"]/); - if (pkMatch) { - primaryKey = pkMatch[1]; - hasCustomPrimaryKey = true; - } - - fields = this.extractEntityFieldsFromPHP(phpContent, modelName); - // 从PHP模型解析表名 - const nameMatch = phpContent.match(/protected\s+\$name\s*=\s*['"]([^'"]*)['"]/); - tableName = nameMatch ? nameMatch[1] : ''; - console.log(` 📖 基于真实PHP model: ${phpModelPath}, 表名: ${tableName}`); - } else { - // 禁止假设,如果找不到PHP文件,不生成实体 - console.log(` ❌ 未找到PHP model文件,跳过生成: ${phpModelPath}`); - return null; - } - } catch (error) { - // 禁止假设,如果读取失败,不生成实体 - console.log(` ❌ 读取PHP model文件失败,跳过生成: ${error.message}`); - return null; - } - - // 生成主键字段 - let primaryKeyField = ''; - if (hasCustomPrimaryKey) { - // 基于真实PHP主键定义生成,禁止假设类型 - primaryKeyField = ` @PrimaryColumn({ name: '${primaryKey}', type: 'int' }) - ${this.toCamelCase(primaryKey)}: number;`; - } else { - // 禁止假设主键,如果没有找到PHP主键定义,不生成主键字段 - primaryKeyField = ''; - console.log(` ⚠️ 未找到PHP主键定义,不生成主键字段: ${modelName}`); - } - - return `import { Entity, PrimaryGeneratedColumn, PrimaryColumn, Column, Index } from 'typeorm'; -import { BaseEntity } from '@wwjCommon/base/base.entity'; - -/** - * ${className} - 数据库实体 - * 继承Core层BaseEntity,包含site_id、create_time等通用字段 (对应PHP Model继承BaseModel) - * 使用Core层基础设施:索引管理、性能监控 - */ -@Entity('${tableName}') -export class ${className} extends BaseEntity { -${primaryKeyField} -${fields} -}`; - } - - /** - * 从PHP内容中提取实体字段 - 基于真实PHP模型 - */ - extractEntityFieldsFromPHP(phpContent, modelName) { - // 提取表名 - const nameMatch = phpContent.match(/protected\s+\$name\s*=\s*['"]([^'"]*)['"]/); - const tableName = nameMatch ? nameMatch[1] : this.getTableName(modelName); - - // 提取字段类型定义 - const typeMatch = phpContent.match(/protected\s+\$type\s*=\s*\[([\s\S]*?)\];/); - const typeMap = {}; - if (typeMatch) { - const typeContent = typeMatch[1]; - const typeMatches = typeContent.match(/(['"][^'"]*['"])\s*=>\s*(['"][^'"]*['"])/g); - if (typeMatches) { - typeMatches.forEach(match => { - const fieldTypeMatch = match.match(/(['"][^'"]*['"])\s*=>\s*(['"][^'"]*['"])/); - if (fieldTypeMatch) { - const fieldName = fieldTypeMatch[1].replace(/['"]/g, ''); - const fieldType = fieldTypeMatch[2].replace(/['"]/g, ''); - typeMap[fieldName] = fieldType; - } - }); - } - } - - // 提取软删除字段 - const deleteTimeMatch = phpContent.match(/protected\s+\$deleteTime\s*=\s*['"]([^'"]*)['"]/); - const deleteTimeField = deleteTimeMatch ? deleteTimeMatch[1] : 'delete_time'; - - // 基于真实PHP模型结构生成字段 - console.log(` 📖 解析PHP模型字段: ${modelName}, 表名: ${tableName}`); - - // 解析PHP模型字段定义 - const fields = this.parsePHPModelFields(phpContent, typeMap); - - return fields; - } - - /** - * 解析PHP模型字段定义 - */ - parsePHPModelFields(phpContent, typeMap) { - const fields = []; - - // 提取所有getter方法,这些通常对应数据库字段 - const getterMatches = phpContent.match(/public function get(\w+)Attr\([^)]*\)[\s\S]*?\{[\s\S]*?\n\s*\}/g); - - if (getterMatches) { - getterMatches.forEach(match => { - const nameMatch = match.match(/public function get(\w+)Attr/); - if (nameMatch) { - const fieldName = this.toCamelCase(nameMatch[1]); - const fieldType = this.determineFieldType(fieldName, typeMap); - - fields.push(` @Column({ name: '${this.toSnakeCase(fieldName)}', type: '${fieldType}' }) - ${fieldName}: ${this.getTypeScriptType(fieldType)};`); - } - }); - } - - // 如果没有找到getter方法,尝试从注释或其他地方提取字段信息 - if (fields.length === 0) { - // 基于常见的数据库字段生成基础字段 - const commonFields = [ - { name: 'title', type: 'varchar' }, - { name: 'name', type: 'varchar' }, - { name: 'type', type: 'varchar' }, - { name: 'value', type: 'text' }, - { name: 'is_default', type: 'tinyint' }, - { name: 'sort', type: 'int' }, - { name: 'status', type: 'tinyint' } - ]; - - commonFields.forEach(field => { - if (phpContent.includes(field.name) || phpContent.includes(`'${field.name}'`)) { - fields.push(` @Column({ name: '${field.name}', type: '${field.type}' }) - ${this.toCamelCase(field.name)}: ${this.getTypeScriptType(field.type)};`); - } - }); - } - - return fields.join('\n\n'); - } - - /** - * 确定字段类型 - */ - determineFieldType(fieldName, typeMap) { - if (typeMap[fieldName]) { - return typeMap[fieldName]; - } - - // 基于字段名推断类型 - if (fieldName.includes('time') || fieldName.includes('date')) { - return 'timestamp'; - } else if (fieldName.includes('id')) { - return 'int'; - } else if (fieldName.includes('status') || fieldName.includes('is_')) { - return 'tinyint'; - } else if (fieldName.includes('sort') || fieldName.includes('order')) { - return 'int'; - } else { - return 'varchar'; - } - } - - /** - * 获取TypeScript类型 - */ - getTypeScriptType(phpType) { - const typeMap = { - 'varchar': 'string', - 'text': 'string', - 'int': 'number', - 'tinyint': 'number', - 'timestamp': 'Date', - 'datetime': 'Date', - 'json': 'object' - }; - - return typeMap[phpType] || 'string'; - } - - /** - * 转换为camelCase - */ - toCamelCase(str) { - return str.replace(/_([a-z])/g, (match, letter) => letter.toUpperCase()); - } - - /** - * 转换为snake_case - */ - toSnakeCase(str) { - return str.replace(/([A-Z])/g, '_$1').toLowerCase().replace(/^_/, ''); - } - - /** - * 生成默认实体字段 - 禁止假设,仅返回空 - */ - generateEntityFields(modelName) { - // 禁止假设字段,返回空字符串 - // 所有字段必须基于真实PHP模型解析 - console.log(` ⚠️ 禁止假设字段,请基于真实PHP模型: ${modelName}`); - return ''; - } - - /** - * 获取表名 - */ - getTableName(modelName) { - // 禁止假设表名,表名必须从PHP模型的$name属性获取 - // 这里返回空字符串,强制从PHP源码解析 - console.log(` ⚠️ 禁止假设表名,必须从PHP模型解析: ${modelName}`); - return ''; - } - - /** - * 转换为PascalCase - 处理连字符 - */ - toPascalCase(str) { - return str.replace(/(^|-)([a-z])/g, (match, p1, p2) => p2.toUpperCase()); - } - - /** - * 转换为camelCase - */ - toCamelCase(str) { - return str.charAt(0).toLowerCase() + str.slice(1); - } - - toPascalCase(str) { - return str.charAt(0).toUpperCase() + str.slice(1); - } - - /** - * 检查模块是否有PHP模型 - */ - hasPHPModels(moduleName) { - const phpProjectPath = path.join(__dirname, '../../niucloud-php/niucloud'); - const modelPath = path.join(phpProjectPath, 'app/model', moduleName); - - if (!fs.existsSync(modelPath)) return false; - - // 检查目录内是否有PHP文件 - try { - const files = fs.readdirSync(modelPath); - return files.some(file => file.endsWith('.php')); - } catch (error) { - return false; - } - } - - /** - * 确保目录存在 - */ - ensureDir(dirPath) { - if (!fs.existsSync(dirPath)) { - fs.mkdirSync(dirPath, { recursive: true }); - } - } - - /** - * 输出统计报告 - */ - printStats() { - super.printStats({ - 'Entities Created': this.entityStats.entitiesCreated, - 'Entities Skipped': this.entityStats.entitiesSkipped - }); - } -} - -// 如果直接运行此文件 -if (require.main === module) { - const generator = new EntityGenerator(); - generator.run().catch(console.error); -} - -module.exports = EntityGenerator; diff --git a/tools/generators/job-generator.js b/tools/generators/job-generator.js deleted file mode 100644 index cdcfec1b..00000000 --- a/tools/generators/job-generator.js +++ /dev/null @@ -1,267 +0,0 @@ -#!/usr/bin/env node - -const fs = require('fs'); -const path = require('path'); -const BaseGenerator = require('./base-generator'); - -/** - * ⚡ 任务生成器 - * 专门负责生成NestJS任务/队列文件 - */ -class JobGenerator extends BaseGenerator { - constructor() { - super('JobGenerator'); - this.config = { - phpBasePath: '/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud', - nestjsBasePath: '/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/wwjcloud-nest/src/core', - discoveryResultPath: '/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/tools/php-discovery-result.json' - }; - - this.discoveryData = null; - this.jobStats = { - jobsCreated: 0, - jobsSkipped: 0 - }; - } - - /** - * 运行任务生成 - */ - async run() { - try { - console.log('⚡ 启动任务生成器...'); - console.log('目标:生成NestJS任务/队列文件\n'); - - // 加载PHP文件发现结果 - await this.loadDiscoveryData(); - - // 生成任务 - await this.generateJobs(); - - // 输出统计报告 - this.printStats(); - - } catch (error) { - console.error('❌ 任务生成失败:', error); - this.stats.errors++; - } - } - - /** - * 加载PHP文件发现结果 - */ - async loadDiscoveryData() { - try { - const data = fs.readFileSync(this.config.discoveryResultPath, 'utf8'); - this.discoveryData = JSON.parse(data); - console.log(' ✅ 成功加载PHP文件发现结果'); - } catch (error) { - console.error('❌ 加载发现结果失败:', error); - throw error; - } - } - - /** - * 生成任务 - */ - async generateJobs() { - console.log(' 🔨 生成任务...'); - - // 检查是否有任务数据 - if (!this.discoveryData.jobs || Object.keys(this.discoveryData.jobs).length === 0) { - console.log(' ⚠️ 未发现PHP任务,跳过生成'); - return; - } - - for (const [moduleName, jobs] of Object.entries(this.discoveryData.jobs)) { - // 检查PHP项目是否有对应的任务目录 - if (!this.hasPHPJobs(moduleName)) { - console.log(` ⚠️ 模块 ${moduleName} 在PHP项目中无任务,跳过`); - continue; - } - - for (const [jobName, jobInfo] of Object.entries(jobs)) { - await this.createJob(moduleName, jobName, jobInfo); - this.stats.jobsCreated++; - } - } - - console.log(` ✅ 生成了 ${this.stats.jobsCreated} 个任务`); - } - - /** - * 创建任务 - */ - async createJob(moduleName, jobName, jobInfo) { - const jobDir = path.join(this.config.nestjsBasePath, moduleName, 'jobs'); - this.ensureDir(jobDir); - - const normalizedBase = jobName.replace(/Job$/i, ''); - const jobPath = path.join( - jobDir, - `${this.toPascalCase(normalizedBase)}Job.ts` - ); - - // 检查是否有对应的PHP任务文件 - const phpJobPath = path.join(this.config.phpBasePath, 'app/job', moduleName, `${jobName}.php`); - if (!fs.existsSync(phpJobPath)) { - console.log(` ❌ 未找到PHP任务文件,跳过生成: ${phpJobPath}`); - return; - } - - const content = this.generateJobContent(moduleName, jobName); - this.writeFile(jobPath, content, `Job for ${moduleName}/${jobName}`); - this.jobStats.jobsCreated++; - } - - /** - * 生成任务内容 - */ - generateJobContent(moduleName, jobName) { - const baseName = jobName.replace(/Job$/i, ''); - const className = `${this.toPascalCase(baseName)}Job`; - - return `import { Injectable, Logger } from '@nestjs/common'; -import { InjectQueue } from '@nestjs/bullmq'; -import { Queue } from 'bullmq'; -import { BusinessException } from '@wwjCommon/exceptions/business.exception'; - -/** - * ${className} - 基于NestJS BullMQ - * 参考: https://docs.nestjs.com/techniques/queues - * 对应 Java: @Async + RabbitMQ - * 对应 PHP: think\queue - */ -@Injectable() -export class ${className} { - private readonly logger = new Logger(${className}.name); - - constructor( - @InjectQueue('${moduleName}') private readonly queue: Queue - ) {} - - /** - * 添加任务到队列 - 使用BullMQ标准API - * 参考: https://docs.nestjs.com/techniques/queues#producers - */ - async addJob(data: any, options?: any) { - try { - const job = await this.queue.add('${baseName}', data, options); - this.logger.log(\`${baseName} job added to queue: \${job.id}\`, data); - return job; - } catch (error) { - this.logger.error('Failed to add ${baseName} job to queue:', error); - throw new BusinessException('${baseName}任务添加失败'); - } - } - - /** - * 处理队列任务 - * 使用Core层基础设施:统一队列服务、异常处理、日志服务 - */ - async processJob(data: any) { - this.logger.log('${baseName} job processing:', data); - - try { - // 任务逻辑 - await this.executeJob(data); - this.logger.log('${baseName} job completed successfully'); - } catch (error) { - this.logger.error('${baseName} job failed:', error); - // 使用Core层异常处理 - throw new BusinessException('${baseName}任务处理失败', error); - } - } - - /** - * 执行任务 - * 使用Core层基础设施:日志服务、异常处理 - */ - private async executeJob(data: any) { - // 实现具体的任务逻辑 - // 例如: - // - 数据清理 - // - 报表生成 - // - 邮件发送 - // - 数据同步 - // - 备份操作 - - this.logger.log('Executing ${baseName} job logic with data:', data); - - // 模拟异步操作 - await new Promise(resolve => setTimeout(resolve, 1000)); - - this.logger.log('${baseName} job logic completed'); - } - - /** - * 手动触发任务 - * 使用Core层基础设施:日志服务、异常处理 - */ - async triggerJob(data?: any) { - this.logger.log('Manually triggering ${baseName} job...'); - try { - await this.executeJob(data || {}); - } catch (error) { - this.logger.error('Failed to trigger ${baseName} job:', error); - // 使用Core层异常处理 - throw new BusinessException('${baseName}任务触发失败', error); - } - } -}`; - } - - /** - * 转换为PascalCase - */ - toPascalCase(str) { - return str.charAt(0).toUpperCase() + str.slice(1); - } - - /** - * 转换为camelCase - */ - toCamelCase(str) { - return str.charAt(0).toLowerCase() + str.slice(1); - } - - toPascalCase(str) { - return str.charAt(0).toUpperCase() + str.slice(1); - } - - /** - * 检查模块是否有PHP任务 - */ - hasPHPJobs(moduleName) { - const phpProjectPath = path.join(__dirname, '../../niucloud-php/niucloud'); - const jobPath = path.join(phpProjectPath, 'app/job', moduleName); - return fs.existsSync(jobPath); - } - - /** - * 确保目录存在 - */ - ensureDir(dirPath) { - if (!fs.existsSync(dirPath)) { - fs.mkdirSync(dirPath, { recursive: true }); - } - } - - /** - * 输出统计报告 - */ - printStats() { - super.printStats({ - 'Jobs Created': this.jobStats.jobsCreated, - 'Jobs Skipped': this.jobStats.jobsSkipped - }); - } -} - -// 如果直接运行此文件 -if (require.main === module) { - const generator = new JobGenerator(); - generator.run().catch(console.error); -} - -module.exports = JobGenerator; diff --git a/tools/generators/listener-generator.js b/tools/generators/listener-generator.js deleted file mode 100644 index 8f1366dd..00000000 --- a/tools/generators/listener-generator.js +++ /dev/null @@ -1,291 +0,0 @@ -#!/usr/bin/env node - -const fs = require('fs'); -const path = require('path'); -const BaseGenerator = require('./base-generator'); - -/** - * 👂 监听器生成器 - * 专门负责生成NestJS事件监听器文件 - */ -class ListenerGenerator extends BaseGenerator { - constructor() { - super('ListenerGenerator'); - this.config = { - phpBasePath: '/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud', - nestjsBasePath: '/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/wwjcloud-nest/src/core', - discoveryResultPath: '/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/tools/php-discovery-result.json' - }; - - this.discoveryData = null; - this.listenerStats = { - listenersCreated: 0, - listenersSkipped: 0 - }; - } - - /** - * 运行监听器生成 - */ - async run() { - try { - console.log('👂 启动监听器生成器...'); - console.log('目标:生成NestJS事件监听器文件\n'); - - // 加载PHP文件发现结果 - await this.loadDiscoveryData(); - - // 生成监听器 - await this.generateListeners(); - - // 输出统计报告 - this.printStats(); - - } catch (error) { - console.error('❌ 监听器生成失败:', error); - this.stats.errors++; - } - } - - /** - * 加载PHP文件发现结果 - */ - async loadDiscoveryData() { - try { - const data = fs.readFileSync(this.config.discoveryResultPath, 'utf8'); - this.discoveryData = JSON.parse(data); - console.log(' ✅ 成功加载PHP文件发现结果'); - } catch (error) { - console.error('❌ 加载发现结果失败:', error); - throw error; - } - } - - /** - * 生成监听器 - */ - async generateListeners() { - console.log(' 🔨 生成监听器...'); - - // 检查是否有监听器数据 - if (!this.discoveryData.listeners || Object.keys(this.discoveryData.listeners).length === 0) { - console.log(' ⚠️ 未发现PHP监听器,跳过生成'); - return; - } - - for (const [moduleName, listeners] of Object.entries(this.discoveryData.listeners)) { - // 检查PHP项目是否有对应的监听器目录 - if (!this.hasPHPListeners(moduleName)) { - console.log(` ⚠️ 模块 ${moduleName} 在PHP项目中无监听器,跳过`); - continue; - } - - for (const [listenerName, listenerInfo] of Object.entries(listeners)) { - await this.createListener(moduleName, listenerName, listenerInfo); - this.stats.listenersCreated++; - } - } - - console.log(` ✅ 生成了 ${this.stats.listenersCreated} 个监听器`); - } - - /** - * 创建监听器 - */ - async createListener(moduleName, listenerName, listenerInfo) { - const listenerDir = path.join(this.config.nestjsBasePath, moduleName, 'listeners'); - this.ensureDir(listenerDir); - - const listenerPath = path.join( - listenerDir, - `${this.toPascalCase(listenerName)}Listener.ts` - ); - - // 检查是否有对应的PHP监听器文件 - const phpListenerPath = path.join(this.config.phpBasePath, 'app/listener', moduleName, `${listenerName}.php`); - if (!fs.existsSync(phpListenerPath)) { - console.log(` ❌ 未找到PHP监听器文件,跳过生成: ${phpListenerPath}`); - return; - } - - const content = this.generateListenerContent(moduleName, listenerName); - this.writeFile(listenerPath, content, `Listener for ${moduleName}/${listenerName}`); - this.listenerStats.listenersCreated++; - } - - /** - * 生成监听器内容 - */ - generateListenerContent(moduleName, listenerName) { - // 移除可能存在的Listener后缀,避免重复 - const baseName = listenerName.replace(/Listener$/i, ''); - const className = `${this.toPascalCase(baseName)}Listener`; - - // 解析PHP监听器的真实内容 - const phpListenerPath = path.join(__dirname, '../../niucloud-php/niucloud/app/listener', moduleName, `${listenerName}.php`); - const phpContent = this.parsePHPListener(phpListenerPath); - - return `import { Injectable, Logger } from '@nestjs/common'; -import { OnEvent } from '@nestjs/event-emitter'; -import { BusinessException } from '@wwjCommon/exceptions/business.exception'; - -/** - * ${className} - 基于NestJS EventEmitter - * 参考: https://docs.nestjs.com/techniques/events - * 对应 Java: @EventListener + ApplicationEventPublisher - * 对应 PHP: think\\facade\\Event - */ -@Injectable() -export class ${className} { - private readonly logger = new Logger(${className}.name); - - /** - * 处理事件 - 基于PHP真实实现 - * 使用 @OnEvent 装饰器监听事件 - */ - @OnEvent('${baseName.toLowerCase()}.handle') - async handle(payload: any) { - this.logger.log('${baseName} listener: Event received', payload); - - try { - // TODO: 实现${baseName}事件处理逻辑 - // 原始PHP逻辑已解析,需要手动转换为TypeScript - this.logger.log('Processing ${baseName} event with payload:', payload); - - // 示例:处理事件数据 - // const { type, data } = payload; - // if (type === 'weapp') { - // const siteId = data.site_id; - // // 处理逻辑... - // } - - this.logger.log('${baseName} event processed successfully'); - - } catch (error) { - this.logger.error('Error processing ${baseName} event:', error); - throw new BusinessException('${baseName}事件处理失败'); - } - } -}`; - } - - /** - * 解析PHP监听器文件 - */ - parsePHPListener(phpFilePath) { - try { - if (!fs.existsSync(phpFilePath)) { - return { - methodBody: '// PHP文件不存在,请手动实现业务逻辑' - }; - } - - const phpContent = fs.readFileSync(phpFilePath, 'utf8'); - - // 提取handle方法的内容 - const handleMethodMatch = phpContent.match(/public function handle\([^)]*\)\s*\{([\s\S]*?)\n\s*\}/); - - if (!handleMethodMatch) { - return { - methodBody: '// 无法解析PHP handle方法,请手动实现业务逻辑' - }; - } - - const methodBody = handleMethodMatch[1] - .trim() - .split('\n') - .map(line => { - // 移除PHP注释 - line = line.replace(/\/\/.*$/, ''); - // 移除PHP变量符号 - line = line.replace(/\$([a-zA-Z_][a-zA-Z0-9_]*)/g, '$1'); - // 移除PHP数组语法 - line = line.replace(/\[([^\]]*)\]/g, '[$1]'); - // 移除PHP字符串连接 - line = line.replace(/\./g, '+'); - // 移除PHP分号 - line = line.replace(/;$/g, ''); - return line.trim(); - }) - .filter(line => line.length > 0) - .map(line => ` ${line}`) - .join('\n'); - - return { - methodBody: methodBody || '// 请根据PHP实现添加业务逻辑' - }; - - } catch (error) { - console.error(`解析PHP监听器失败: ${phpFilePath}`, error); - return { - methodBody: '// 解析PHP文件失败,请手动实现业务逻辑' - }; - } - } - - /** - * 转换为PascalCase - */ - toPascalCase(str) { - return str.charAt(0).toUpperCase() + str.slice(1); - } - - /** - * 转换为camelCase - */ - toCamelCase(str) { - return str.charAt(0).toLowerCase() + str.slice(1); - } - - toPascalCase(str) { - return str.charAt(0).toUpperCase() + str.slice(1); - } - - /** - * 检查模块是否有PHP监听器 - */ - hasPHPListeners(moduleName) { - const phpProjectPath = path.join(__dirname, '../../niucloud-php/niucloud'); - const listenerPath = path.join(phpProjectPath, 'app/listener', moduleName); - - // 检查目录是否存在 - if (!fs.existsSync(listenerPath)) { - return false; - } - - // 检查目录中是否有PHP文件 - try { - const files = fs.readdirSync(listenerPath); - return files.some(file => file.endsWith('.php')); - } catch (error) { - return false; - } - } - - /** - * 确保目录存在 - */ - ensureDir(dirPath) { - if (!fs.existsSync(dirPath)) { - fs.mkdirSync(dirPath, { recursive: true }); - } - } - - /** - * 输出统计报告 - */ - printStats() { - super.printStats({ - 'Listeners Created': this.listenerStats.listenersCreated, - 'Listeners Skipped': this.listenerStats.listenersSkipped - }); - } -} - -// 如果直接运行此文件 -if (require.main === module) { - const generator = new ListenerGenerator(); - generator.run().catch(console.error); -} - -module.exports = ListenerGenerator; diff --git a/tools/generators/module-generator.js b/tools/generators/module-generator.js deleted file mode 100644 index 9c64062f..00000000 --- a/tools/generators/module-generator.js +++ /dev/null @@ -1,553 +0,0 @@ -const fs = require('fs'); -const path = require('path'); - -/** - * NestJS模块生成器 - * 为每个模块创建对应的.module.ts文件并正确引用所有组件 - */ -class ModuleGenerator { - constructor() { - this.config = { - nestjsBasePath: '/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/wwjcloud-nest/src/core', - discoveryResultPath: './php-discovery-result.json', - whitelistModules: [], // 空数组=全部业务模块,结合黑名单过滤 - blacklistModules: ['job','queue','workerman','lang','menu','system'], - includeTypeOrmFeature: true - }; - - this.discoveryData = null; - this.stats = { - createdModules: 0, - updatedModules: 0, - errors: 0 - }; - } - - /** - * 运行模块生成 - */ - async run() { - try { - console.log('🚀 启动NestJS模块生成器...'); - console.log('目标:为每个模块创建.module.ts文件并正确引用所有组件\n'); - - // 第1阶段:加载PHP文件发现结果 - console.log('📊 第1阶段:加载PHP文件发现结果...'); - await this.loadDiscoveryData(); - console.log(' ✅ 成功加载PHP文件发现结果'); - - // 第2阶段:扫描现有文件结构 - console.log('\n📊 第2阶段:扫描现有文件结构...'); - const moduleStructure = await this.scanModuleStructure(); - console.log(` ✅ 扫描了 ${Object.keys(moduleStructure).length} 个模块`); - - // 第3阶段:生成模块文件 - console.log('\n📊 第3阶段:生成模块文件...'); - await this.generateModules(moduleStructure); - console.log(` ✅ 生成了 ${this.stats.createdModules} 个模块文件`); - - // 第4阶段:生成统计报告 - console.log('\n📊 第4阶段:生成统计报告...'); - this.generateStatsReport(); - - } catch (error) { - console.error('❌ 生成过程中发生错误:', error.message); - this.stats.errors++; - throw error; - } - } - - /** - * 加载PHP文件发现结果 - */ - async loadDiscoveryData() { - try { - const data = fs.readFileSync(this.config.discoveryResultPath, 'utf8'); - this.discoveryData = JSON.parse(data); - } catch (error) { - console.log(` ⚠️ 未找到发现结果文件,跳过加载: ${error.message}`); - this.discoveryData = {}; - } - } - - /** - * 扫描模块结构 - */ - async scanModuleStructure() { - const moduleStructure = {}; - const commonPath = this.config.nestjsBasePath; - - if (!fs.existsSync(commonPath)) { - console.log(' ⚠️ common目录不存在'); - return moduleStructure; - } - - const modules = fs.readdirSync(commonPath, { withFileTypes: true }) - .filter(dirent => dirent.isDirectory()) - .map(dirent => dirent.name); - - for (const moduleName of modules) { - if (this.shouldSkipModule(moduleName)) { - console.log(` ⏭️ 跳过非业务模块: ${moduleName}`); - continue; - } - const modulePath = path.join(commonPath, moduleName); - moduleStructure[moduleName] = { - controllers: this.scanControllers(modulePath), - services: this.scanServices(modulePath), - entities: this.scanEntities(modulePath), - validators: this.scanValidators(modulePath), - middlewares: this.scanMiddlewares(modulePath), - jobs: this.scanJobs(modulePath), - listeners: this.scanListeners(modulePath), - commands: this.scanCommands(modulePath), - dicts: this.scanDicts(modulePath) - }; - } - - return moduleStructure; - } - - /** - * 读取实际文件中的类名 - */ - getActualClassName(filePath) { - try { - if (!fs.existsSync(filePath)) { - return null; - } - - const content = fs.readFileSync(filePath, 'utf8'); - const match = content.match(/export\s+(?:class|interface|enum)\s+(\w+)/); - return match ? match[1] : null; - } catch (error) { - console.error(`读取文件 ${filePath} 时出错:`, error.message); - return null; - } - } - - /** - * 扫描控制器 - */ - scanControllers(modulePath) { - const controllers = []; - const controllersPath = path.join(modulePath, 'controllers'); - - if (fs.existsSync(controllersPath)) { - const layers = ['adminapi', 'api']; - for (const layer of layers) { - const layerPath = path.join(controllersPath, layer); - if (fs.existsSync(layerPath)) { - const allFiles = fs.readdirSync(layerPath); - const controllerFiles = allFiles.filter(file => file.endsWith('.controller.ts')); - - if (controllerFiles.length > 0) { - console.log(` 发现 ${layer} 层控制器: ${controllerFiles.join(', ')}`); - } - - const files = controllerFiles.map(file => { - const filePath = path.join(layerPath, file); - const actualClassName = this.getActualClassName(filePath); - return { - name: actualClassName || this.guessControllerClassName(file), - path: `./controllers/${layer}/${file}`, - layer: layer - }; - }); - controllers.push(...files); - } - } - } - - return controllers; - } - - /** - * 扫描服务 - */ - scanServices(modulePath) { - const services = []; - const servicesPath = path.join(modulePath, 'services'); - - if (fs.existsSync(servicesPath)) { - const layers = ['admin', 'api', 'core']; - for (const layer of layers) { - const layerPath = path.join(servicesPath, layer); - if (fs.existsSync(layerPath)) { - const files = fs.readdirSync(layerPath) - .filter(file => file.endsWith('.service.ts')) - .map(file => { - const filePath = path.join(layerPath, file); - const actualClassName = this.getActualClassName(filePath); - return { - name: actualClassName || this.guessServiceClassName(file, layer), - path: `./services/${layer}/${file}`, - layer: layer - }; - }); - services.push(...files); - } - } - } - - return services; - } - - /** - * 扫描实体 - */ - scanEntities(modulePath) { - const entities = []; - const entitiesPath = path.join(modulePath, 'entity'); - - if (fs.existsSync(entitiesPath)) { - const files = fs.readdirSync(entitiesPath) - .filter(file => file.endsWith('.entity.ts')) - .map(file => ({ - name: this.getActualClassName(path.join(entitiesPath, file)) || this.guessEntityClassName(file), - path: `./entity/${file}` - })); - entities.push(...files); - } - - return entities; - } - - /** - * 扫描验证器 - */ - scanValidators(modulePath) { - const validators = []; - const validatorsPath = path.join(modulePath, 'dto'); - - if (fs.existsSync(validatorsPath)) { - const files = fs.readdirSync(validatorsPath, { recursive: true }) - .filter(file => file.endsWith('.ts') && !file.endsWith('.d.ts')) - .map(file => ({ - name: file.replace('.ts', ''), - path: `./dto/${file}` - })); - validators.push(...files); - } - - return validators; - } - - /** - * 扫描中间件 - */ - scanMiddlewares(modulePath) { - const middlewares = []; - const middlewaresPath = path.join(modulePath, 'guards'); - - if (fs.existsSync(middlewaresPath)) { - const files = fs.readdirSync(middlewaresPath) - .filter(file => file.endsWith('.ts') && !file.endsWith('.d.ts')) - .map(file => ({ - name: file.replace('.ts', ''), - path: `./guards/${file}` - })); - middlewares.push(...files); - } - - return middlewares; - } - - /** - * 扫描任务 - */ - scanJobs(modulePath) { - const jobs = []; - const jobsPath = path.join(modulePath, 'jobs'); - - if (fs.existsSync(jobsPath)) { - const files = fs.readdirSync(jobsPath) - .filter(file => file.endsWith('.ts') && !file.endsWith('.d.ts')) - .map(file => ({ - name: file.replace('.ts', ''), - path: `./jobs/${file}` - })); - jobs.push(...files); - } - - return jobs; - } - - /** - * 扫描监听器 - */ - scanListeners(modulePath) { - const listeners = []; - const listenersPath = path.join(modulePath, 'listeners'); - - if (fs.existsSync(listenersPath)) { - const files = fs.readdirSync(listenersPath) - .filter(file => file.endsWith('.ts') && !file.endsWith('.d.ts')) - .map(file => ({ - name: file.replace('.ts', ''), - path: `./listeners/${file}` - })); - listeners.push(...files); - } - - return listeners; - } - - /** - * 扫描命令 - */ - scanCommands(modulePath) { - const commands = []; - const commandsPath = path.join(modulePath, 'commands'); - - if (fs.existsSync(commandsPath)) { - const files = fs.readdirSync(commandsPath) - .filter(file => file.endsWith('.ts') && !file.endsWith('.d.ts')) - .map(file => ({ - name: file.replace('.ts', ''), - path: `./commands/${file}` - })); - commands.push(...files); - } - - return commands; - } - - /** - * 扫描字典 - */ - scanDicts(modulePath) { - const dicts = []; - const dictsPath = path.join(modulePath, 'dicts'); - - if (fs.existsSync(dictsPath)) { - const files = fs.readdirSync(dictsPath) - .filter(file => file.endsWith('.ts') && !file.endsWith('.d.ts')) - .map(file => ({ - name: file.replace('.ts', ''), - path: `./dicts/${file}` - })); - dicts.push(...files); - } - - return dicts; - } - - /** - * 生成模块文件 - */ - async generateModules(moduleStructure) { - console.log(' 🔨 生成模块文件...'); - - for (const [moduleName, components] of Object.entries(moduleStructure)) { - try { - await this.generateModuleFile(moduleName, components); - this.stats.createdModules++; - } catch (error) { - console.error(` ❌ 生成模块 ${moduleName} 失败:`, error.message); - this.stats.errors++; - } - } - } - - /** - * 生成单个模块文件 - */ - async generateModuleFile(moduleName, components) { - const modulePath = path.join(this.config.nestjsBasePath, moduleName, `${moduleName}.module.ts`); - - // 生成模块内容 - const moduleContent = this.generateModuleContent(moduleName, components); - - // 确保目录存在 - this.ensureDir(path.dirname(modulePath)); - - // 写入文件 - fs.writeFileSync(modulePath, moduleContent); - console.log(` ✅ 创建模块: ${moduleName}/${moduleName}.module.ts`); - } - - /** - * 生成模块内容 - */ - generateModuleContent(moduleName, components) { - const className = this.toPascalCase(moduleName) + 'Module'; - - let imports = []; - let controllers = []; - let providers = []; - let exports = []; - let importSet = new Set(); // 用于去重 - - // TypeORM feature (可选) - const entityClassNames = components.entities.map(e => e.name).filter(Boolean); - if (this.config.includeTypeOrmFeature && entityClassNames.length > 0) { - importSet.add(`import { TypeOrmModule } from '@nestjs/typeorm';`); - imports.push(`TypeOrmModule.forFeature([${entityClassNames.join(', ')}])`); - } - - // 导入控制器并注册 - for (const controller of components.controllers) { - importSet.add(`import { ${controller.name} } from '${controller.path}';`); - controllers.push(controller.name); - } - - // 导入服务并注册 - for (const service of components.services) { - if (!importSet.has(`import { ${service.name} } from '${service.path}';`)) { - importSet.add(`import { ${service.name} } from '${service.path}';`); - providers.push(`${service.name}`); - } - } - - // 导入实体(如果需要) - for (const entity of components.entities) { - if (!importSet.has(`import { ${entity.name} } from '${entity.path}';`)) { - importSet.add(`import { ${entity.name} } from '${entity.path}';`); - } - } - - // 组合最终内容 - const moduleContent = `${Array.from(importSet).join('\n')} - -import { Module } from '@nestjs/common'; - -@Module({ - imports: [${imports.join(', ')}], - controllers: [${controllers.join(', ')}], - providers: [${providers.join(', ')}], - exports: [${exports.join(', ')}], -}) -export class ${className} {} -`; - - return moduleContent; - } - - /** - * 从文件内容获取导出的类名 - */ - getActualClassName(filePath) { - try { - if (!fs.existsSync(filePath)) return null; - const content = fs.readFileSync(filePath, 'utf8'); - const match = content.match(/export\s+class\s+(\w+)/); - return match ? match[1] : null; - } catch (error) { - return null; - } - } - - /** - * 由 kebab-case 实体文件名推测类名 - * 例如: member.entity.ts -> MemberEntity - */ - guessEntityClassName(fileName) { - const base = fileName.replace(/\.entity\.ts$/i, ''); - return this.kebabToPascal(base) + 'Entity'; - } - - /** - * 由 kebab-case 控制器文件名推测类名 - * 例如: member-level.controller.ts -> MemberLevelController - */ - guessControllerClassName(fileName) { - const base = fileName.replace(/\.controller\.ts$/i, ''); - return this.kebabToPascal(base) + 'Controller'; - } - - /** - * 由 kebab-case 服务文件名推测类名 - * 例如: member-level.service.ts -> MemberLevelService - */ - guessServiceClassName(fileName, layer) { - const base = fileName.replace(/\.service\.ts$/i, ''); - return this.kebabToPascal(base) + 'Service'; - } - - /** - * 确保目录存在 - */ - ensureDir(dirPath) { - if (!fs.existsSync(dirPath)) { - fs.mkdirSync(dirPath, { recursive: true }); - } - } - - /** - * 转换为PascalCase - */ - toPascalCase(str) { - return str.replace(/(^|_)([a-z])/g, (match, p1, p2) => p2.toUpperCase()); - } - - /** - * kebab-case 转 PascalCase - */ - kebabToPascal(str) { - return str - .split('-') - .filter(Boolean) - .map(s => s.charAt(0).toUpperCase() + s.slice(1)) - .join(''); - } - - shouldSkipModule(moduleName) { - if (this.config.whitelistModules && this.config.whitelistModules.length > 0) { - if (!this.config.whitelistModules.includes(moduleName)) return true; - } - if (this.config.blacklistModules && this.config.blacklistModules.includes(moduleName)) { - return true; - } - return false; - } - - /** - * 获取层前缀 - */ - getLayerPrefix(layer, serviceName) { - // 如果服务名已经包含Core前缀,则不需要再添加 - if (layer === 'core' && serviceName.toLowerCase().startsWith('core')) { - return ''; - } - - const layerMap = { - 'admin': 'Admin', - 'api': 'Api', - 'core': 'Core' - }; - return layerMap[layer] || ''; - } - - /** - * 检查是否需要别名 - */ - needsAlias(layer, serviceName) { - // 如果服务名已经包含层前缀,则不需要别名 - if (layer === 'core' && serviceName.toLowerCase().startsWith('core')) { - return false; - } - return true; - } - - /** - * 生成统计报告 - */ - generateStatsReport() { - console.log('\n📊 NestJS模块生成统计报告:'); - console.log('============================================================'); - console.log(` 📁 创建模块: ${this.stats.createdModules} 个`); - console.log(` 🔄 更新模块: ${this.stats.updatedModules} 个`); - console.log(` ❌ 错误数量: ${this.stats.errors} 个`); - console.log('============================================================'); - console.log('\n✅ 🎉 NestJS模块生成完成!'); - } -} - -// 运行模块生成器 -if (require.main === module) { - const generator = new ModuleGenerator(); - generator.run().catch(console.error); -} - -module.exports = ModuleGenerator; diff --git a/tools/generators/quality-gate.js b/tools/generators/quality-gate.js deleted file mode 100644 index f94b1b6e..00000000 --- a/tools/generators/quality-gate.js +++ /dev/null @@ -1,267 +0,0 @@ -#!/usr/bin/env node - -const { execSync } = require('child_process'); -const path = require('path'); -const fs = require('fs'); - -/** - * Quality Gate - 质量门禁工具 - * 执行 TypeScript 编译检查和 ESLint 检查 - */ -class QualityGate { - constructor(nestjsBasePath) { - this.nestjsBasePath = nestjsBasePath || '/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/wwjcloud-nest'; - this.stats = { - tsErrors: 0, - eslintErrors: 0, - eslintWarnings: 0, - filesChecked: 0 - }; - } - - /** - * 运行所有质量检查 - */ - async run() { - console.log('🚦 启动 Quality Gate 检查...\n'); - - let passed = true; - - // TypeScript 编译检查 - console.log('📝 第1阶段:TypeScript 编译检查...'); - const tsResult = await this.checkTypeScript(); - if (!tsResult) { - passed = false; - console.log(' ❌ TypeScript 编译检查失败\n'); - } else { - console.log(' ✅ TypeScript 编译检查通过\n'); - } - - // ESLint 检查 - console.log('📝 第2阶段:ESLint 代码规范检查...'); - const eslintResult = await this.checkESLint(); - if (!eslintResult) { - passed = false; - console.log(' ❌ ESLint 检查失败\n'); - } else { - console.log(' ✅ ESLint 检查通过\n'); - } - - // 输出统计报告 - this.printStats(); - - return passed; - } - - /** - * TypeScript 编译检查 - */ - async checkTypeScript() { - try { - console.log(' 🔍 检查 TypeScript 类型...'); - - // 运行 tsc --noEmit 进行类型检查 - const result = execSync('npm run type-check', { - cwd: this.nestjsBasePath, - encoding: 'utf8', - stdio: 'pipe' - }); - - console.log(' ✅ TypeScript 类型检查通过'); - return true; - - } catch (error) { - this.stats.tsErrors++; - - if (error.stdout) { - console.error(' ❌ TypeScript 错误:'); - console.error(error.stdout); - } - - if (error.stderr) { - console.error(error.stderr); - } - - return false; - } - } - - /** - * ESLint 检查 - */ - async checkESLint() { - try { - console.log(' 🔍 检查代码规范...'); - - // 运行 ESLint - const result = execSync('npm run lint', { - cwd: this.nestjsBasePath, - encoding: 'utf8', - stdio: 'pipe' - }); - - console.log(' ✅ ESLint 检查通过'); - return true; - - } catch (error) { - // ESLint 返回非零退出码表示有错误或警告 - if (error.stdout) { - const output = error.stdout; - - // 解析错误和警告数量 - const errorMatch = output.match(/(\d+)\s+errors?/); - const warningMatch = output.match(/(\d+)\s+warnings?/); - - if (errorMatch) { - this.stats.eslintErrors = parseInt(errorMatch[1]); - } - - if (warningMatch) { - this.stats.eslintWarnings = parseInt(warningMatch[1]); - } - - console.error(' ❌ ESLint 发现问题:'); - console.error(output); - - // 如果只有警告,不算失败 - return this.stats.eslintErrors === 0; - } - - return false; - } - } - - /** - * 检查单个文件 - */ - async checkFile(filePath) { - console.log(` 🔍 检查文件: ${filePath}`); - - try { - // 使用 tsc 检查单个文件 - execSync(`npx tsc --noEmit ${filePath}`, { - cwd: this.nestjsBasePath, - encoding: 'utf8', - stdio: 'pipe' - }); - - // 使用 ESLint 检查单个文件 - execSync(`npx eslint ${filePath}`, { - cwd: this.nestjsBasePath, - encoding: 'utf8', - stdio: 'pipe' - }); - - this.stats.filesChecked++; - return true; - - } catch (error) { - console.error(` ❌ 文件检查失败: ${filePath}`); - if (error.stdout) { - console.error(error.stdout); - } - return false; - } - } - - /** - * 快速检查(只检查核心层) - */ - async quickCheck() { - console.log('🚀 快速质量检查(仅核心层)...\n'); - - const coreFiles = this.getGeneratedFiles(); - - console.log(` 📁 发现 ${coreFiles.length} 个生成的文件\n`); - - let passed = 0; - let failed = 0; - - for (const file of coreFiles) { - const result = await this.checkFile(file); - if (result) { - passed++; - } else { - failed++; - } - } - - console.log(`\n📊 快速检查结果:`); - console.log(` ✅ 通过: ${passed}`); - console.log(` ❌ 失败: ${failed}`); - - return failed === 0; - } - - /** - * 获取所有生成的文件 - */ - getGeneratedFiles() { - const coreDir = path.join(this.nestjsBasePath, 'src', 'core'); - const files = []; - - const scanDir = (dir) => { - if (!fs.existsSync(dir)) return; - - const entries = fs.readdirSync(dir, { withFileTypes: true }); - - for (const entry of entries) { - const fullPath = path.join(dir, entry.name); - - if (entry.isDirectory()) { - scanDir(fullPath); - } else if (entry.name.endsWith('.ts') && !entry.name.endsWith('.d.ts')) { - files.push(fullPath); - } - } - }; - - scanDir(coreDir); - return files; - } - - /** - * 输出统计报告 - */ - printStats() { - console.log('📊 Quality Gate 统计报告'); - console.log('=================================================='); - console.log(` 📝 TypeScript 错误: ${this.stats.tsErrors}`); - console.log(` 📝 ESLint 错误: ${this.stats.eslintErrors}`); - console.log(` ⚠️ ESLint 警告: ${this.stats.eslintWarnings}`); - console.log(` 📁 检查文件数: ${this.stats.filesChecked}`); - console.log('=================================================='); - - const passed = this.stats.tsErrors === 0 && this.stats.eslintErrors === 0; - - if (passed) { - console.log('\n✅ 🎉 所有质量检查通过!'); - } else { - console.log('\n❌ 质量检查失败,请修复上述问题'); - console.log('提示: 运行 "npm run lint:fix" 自动修复部分问题'); - } - - return passed; - } -} - -// 如果直接运行此文件 -if (require.main === module) { - const args = process.argv.slice(2); - const mode = args[0] || 'full'; - - const gate = new QualityGate(); - - if (mode === 'quick') { - gate.quickCheck().then(passed => { - process.exit(passed ? 0 : 1); - }); - } else { - gate.run().then(passed => { - process.exit(passed ? 0 : 1); - }); - } -} - -module.exports = QualityGate; - diff --git a/tools/generators/route-generator.js b/tools/generators/route-generator.js deleted file mode 100644 index ab0229bd..00000000 --- a/tools/generators/route-generator.js +++ /dev/null @@ -1,139 +0,0 @@ -#!/usr/bin/env node - -const fs = require('fs'); -const path = require('path'); - -/** - * 🛣️ 路由生成器 - * 专门负责生成NestJS路由文件 - */ -class RouteGenerator { - constructor() { - this.config = { - phpBasePath: '/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud', - nestjsBasePath: '/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/wwjcloud-nest/src/core', - discoveryResultPath: '/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/tools/php-discovery-result.json' - }; - - this.discoveryData = null; - this.stats = { - routesCreated: 0, - errors: 0 - }; - } - - /** - * 运行路由生成 - */ - async run() { - try { - console.log('🛣️ 启动路由生成器...'); - console.log('目标:生成NestJS路由文件\n'); - - // 加载PHP文件发现结果 - await this.loadDiscoveryData(); - - // 生成路由 - await this.generateRoutes(); - - // 输出统计报告 - this.printStats(); - - } catch (error) { - console.error('❌ 路由生成失败:', error); - this.stats.errors++; - } - } - - /** - * 加载PHP文件发现结果 - */ - async loadDiscoveryData() { - try { - const data = fs.readFileSync(this.config.discoveryResultPath, 'utf8'); - this.discoveryData = JSON.parse(data); - console.log(' ✅ 成功加载PHP文件发现结果'); - } catch (error) { - console.error('❌ 加载发现结果失败:', error); - throw error; - } - } - - /** - * 生成路由 - */ - async generateRoutes() { - console.log(' 🔨 生成路由...'); - - for (const [layerName, routes] of Object.entries(this.discoveryData.routes)) { - for (const [routeName, routeInfo] of Object.entries(routes)) { - await this.createRoute(layerName, routeName, routeInfo); - this.stats.routesCreated++; - } - } - - console.log(` ✅ 生成了 ${this.stats.routesCreated} 个路由`); - } - - /** - * 创建路由 - NestJS不需要独立路由文件 - */ - async createRoute(layerName, routeName, routeInfo) { - // NestJS不需要独立的路由文件 - // 路由在控制器中定义,模块路由在app.module.ts中配置 - console.log(` ⏭️ 跳过路由: ${layerName}/${this.toCamelCase(routeName)}.route.ts (NestJS不需要独立路由文件)`); - return; - } - - /** - * 生成路由内容 - NestJS不需要独立的路由文件 - * 路由在控制器中定义,这里生成模块路由配置 - */ - generateRouteContent(layerName, routeName) { - // NestJS不需要独立的路由文件 - // 路由应该在控制器中定义,模块路由在app.module.ts中配置 - return null; - } - - /** - * 转换为PascalCase - */ - toPascalCase(str) { - return str.charAt(0).toUpperCase() + str.slice(1); - } - - /** - * 转换为camelCase - */ - toCamelCase(str) { - return str.charAt(0).toLowerCase() + str.slice(1); - } - - /** - * 确保目录存在 - */ - ensureDir(dirPath) { - if (!fs.existsSync(dirPath)) { - fs.mkdirSync(dirPath, { recursive: true }); - } - } - - /** - * 输出统计报告 - */ - printStats() { - console.log('\n📊 路由生成统计报告'); - console.log('=================================================='); - console.log(`✅ 创建路由数量: ${this.stats.routesCreated}`); - console.log(`❌ 错误数量: ${this.stats.errors}`); - console.log(`📈 成功率: ${this.stats.routesCreated > 0 ? '100.00%' : '0.00%'}`); - } -} - -// 如果直接运行此文件 -if (require.main === module) { - const generator = new RouteGenerator(); - generator.run().catch(console.error); -} - -module.exports = RouteGenerator; diff --git a/tools/generators/service-generator.js b/tools/generators/service-generator.js deleted file mode 100644 index 4c15fc5e..00000000 --- a/tools/generators/service-generator.js +++ /dev/null @@ -1,547 +0,0 @@ -#!/usr/bin/env node - -const fs = require('fs'); -const path = require('path'); -const BusinessLogicConverter = require('./business-logic-converter'); - -/** - * ⚙️ 服务生成器 - * 专门负责生成和更新NestJS服务 - */ -class ServiceGenerator { - constructor() { - this.config = { - phpBasePath: '/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud', - nestjsBasePath: '/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/wwjcloud-nest/src/core', - discoveryResultPath: '/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/tools/php-discovery-result.json' - }; - - this.discoveryData = null; - this.converter = new BusinessLogicConverter(); - this.stats = { - servicesCreated: 0, - servicesUpdated: 0, - methodsProcessed: 0, - errors: 0 - }; - } - - /** - * 运行服务生成 - */ - async run() { - console.log('⚙️ 启动服务生成器...'); - - try { - // 加载发现数据 - await this.loadDiscoveryData(); - - // 生成服务 - await this.generateServices(); - - // 更新服务为真实业务逻辑 - await this.updateAllServicesWithRealLogic(); - - // 生成统计报告 - this.generateStatsReport(); - - } catch (error) { - console.error('❌ 服务生成过程中发生错误:', error.message); - this.stats.errors++; - throw error; - } - } - - /** - * 加载PHP文件发现结果 - */ - async loadDiscoveryData() { - try { - const data = fs.readFileSync(this.config.discoveryResultPath, 'utf-8'); - this.discoveryData = JSON.parse(data); - console.log(' ✅ 成功加载PHP文件发现结果'); - } catch (error) { - console.error(' ❌ 加载发现数据失败:', error.message); - throw error; - } - } - - /** - * 生成服务 - */ - async generateServices() { - console.log(' 🔨 生成服务文件...'); - - // 检查是否有服务数据 - if (!this.discoveryData.services || Object.keys(this.discoveryData.services).length === 0) { - console.log(' ⚠️ 未发现PHP服务,跳过生成'); - return; - } - - let processedCount = 0; - - // 服务数据结构是按层级分组的,需要遍历所有层级 - for (const [layerName, services] of Object.entries(this.discoveryData.services)) { - console.log(` 📁 处理服务层级: ${layerName}, 服务数量: ${Object.keys(services).length}`); - - for (const [serviceName, serviceInfo] of Object.entries(services)) { - console.log(` ⚙️ 处理服务: ${serviceName}`); - - try { - const correctModuleName = this.extractModuleNameFromServicePath(serviceInfo.filePath); - const layer = this.extractLayerFromServicePath(serviceInfo.filePath); - - // 检查PHP项目是否有对应的服务目录 - if (!this.hasPHPServices(correctModuleName, layer)) { - console.log(` ⚠️ 模块 ${correctModuleName} 在PHP项目中无${layer}服务,跳过`); - continue; - } - - await this.createService(correctModuleName, serviceName, serviceInfo, layer); - processedCount++; - console.log(` ✅ 成功创建服务: ${correctModuleName}/${serviceName}`); - } catch (error) { - console.error(` ❌ 创建服务失败 ${serviceName}:`, error.message); - this.stats.errors++; - } - } - } - - this.stats.servicesCreated = processedCount; - console.log(` ✅ 创建了 ${this.stats.servicesCreated} 个服务`); - } - - /** - * 更新所有服务为真实业务逻辑 - */ - async updateAllServicesWithRealLogic() { - console.log(' 🔨 更新服务为真实业务逻辑...'); - - let processedCount = 0; - - // 服务数据结构是按层级分组的,需要遍历所有层级 - for (const [layerName, services] of Object.entries(this.discoveryData.services)) { - console.log(` 📁 处理服务层级: ${layerName}, 服务数量: ${Object.keys(services).length}`); - for (const [serviceName, serviceInfo] of Object.entries(services)) { - console.log(` ⚙️ 处理服务: ${serviceName}`); - - try { - const correctModuleName = this.extractModuleNameFromServicePath(serviceInfo.filePath); - const layer = this.extractLayerFromServicePath(serviceInfo.filePath); - await this.updateServiceWithRealLogic(correctModuleName, serviceName, serviceInfo, layer); - processedCount++; - console.log(` ✅ 成功更新服务: ${correctModuleName}/${serviceName}`); - } catch (error) { - console.error(` ❌ 更新服务失败 ${serviceName}:`, error.message); - this.stats.errors++; - } - } - } - - this.stats.servicesUpdated = processedCount; - console.log(` ✅ 更新了 ${this.stats.servicesUpdated} 个服务`); - } - - /** - * 创建服务 - */ - async createService(moduleName, serviceName, serviceInfo, layer) { - // 先去掉层级后缀,再去掉Service后缀 - const cleanServiceName = serviceName.replace(/_(admin|api|core)$/, ''); - const baseName = cleanServiceName.endsWith('Service') ? cleanServiceName.slice(0, -7) : cleanServiceName; - const servicePath = path.join( - this.config.nestjsBasePath, - moduleName, - 'services', - layer, - `${this.toKebabCase(baseName)}.service.ts` - ); - - // 确保目录存在 - const serviceDir = path.dirname(servicePath); - if (!fs.existsSync(serviceDir)) { - fs.mkdirSync(serviceDir, { recursive: true }); - } - - // 检查是否有对应的PHP服务文件 - // 从服务名中提取基础类名(去掉_layer后缀) - const baseServiceName = serviceName.replace(/_(admin|api|core)$/, ''); - const phpServicePath = path.join(this.config.phpBasePath, 'app/service', layer, moduleName, `${baseServiceName}.php`); - if (!fs.existsSync(phpServicePath)) { - console.log(` ❌ 未找到PHP服务文件,跳过生成: ${phpServicePath}`); - return; - } - - // 生成基础服务内容 - const serviceContent = this.generateBasicServiceContent(moduleName, serviceName, layer); - - // 写入文件 - fs.writeFileSync(servicePath, serviceContent); - console.log(` ✅ 创建服务: ${moduleName}/${layer}/${this.toKebabCase(baseName)}.service.ts`); - - this.stats.servicesCreated++; - } - - /** - * 更新服务为真实逻辑 - */ - async updateServiceWithRealLogic(moduleName, serviceName, serviceInfo, layer) { - // 先去掉层级后缀,再去掉Service后缀 - const cleanServiceName = serviceName.replace(/_(admin|api|core)$/, ''); - const baseName = cleanServiceName.endsWith('Service') ? cleanServiceName.slice(0, -7) : cleanServiceName; - const servicePath = path.join( - this.config.nestjsBasePath, - moduleName, - 'services', - layer, - `${this.toKebabCase(baseName)}.service.ts` - ); - - if (!fs.existsSync(servicePath)) { - console.log(` ⚠️ 服务文件不存在: ${servicePath}`); - return; - } - - try { - // 读取PHP服务文件 - const phpServicePath = serviceInfo.filePath; - const phpContent = fs.readFileSync(phpServicePath, 'utf-8'); - - // 提取PHP方法 - const phpMethods = this.converter.extractPHPMethods(phpContent); - - if (phpMethods.length === 0) { - console.log(` ⚠️ 未找到PHP方法: ${serviceName}`); - return; - } - - console.log(` 📝 找到 ${phpMethods.length} 个PHP方法`); - - // 生成NestJS服务内容 - const nestjsContent = this.generateRealServiceContent(moduleName, serviceName, layer, phpMethods); - - // 写入文件 - fs.writeFileSync(servicePath, nestjsContent); - console.log(` ✅ 更新服务: ${moduleName}/${layer}/${this.toKebabCase(baseName)}.service.ts`); - - this.stats.methodsProcessed += phpMethods.length; - - } catch (error) { - console.log(` ❌ 无法更新服务 ${serviceName}: ${error.message}`); - this.stats.errors++; - } - } - - /** - * 生成基础服务内容 - */ - generateBasicServiceContent(moduleName, serviceName, layer) { - // 先去掉层级后缀,再去掉Service后缀 - const cleanServiceName = serviceName.replace(/_(admin|api|core)$/, ''); - const baseName = cleanServiceName.endsWith('Service') ? cleanServiceName.slice(0, -7) : cleanServiceName; - - // 正确的命名规范:服务类名(与PHP/Java保持一致) - let className = `${baseName}Service`; - if (layer === 'core') { - // Core层服务需要Core前缀 - className = baseName.startsWith('Core') ? `${baseName}Service` : `Core${baseName}Service`; - } else { - // admin和api层直接使用业务名称 - className = `${baseName}Service`; - } - - // 获取基础设施导入 - const infrastructureImports = this.getInfrastructureImports(); - - return `import { Injectable, Logger } from '@nestjs/common'; -import { InjectRepository } from '@nestjs/typeorm'; -import { Repository } from 'typeorm'; -import { ConfigService } from '@nestjs/config'; -import { BaseService } from '@wwjCommon/base/base.service'; -import { CacheService } from '@wwjCommon/cache/cache.service'; -import { LoggingService } from '@wwjCommon/logging/logging.service'; -import { UploadService } from '@wwjVendor/upload/upload.service'; -import { PayService } from '@wwjVendor/pay/pay.service'; -import { SmsService } from '@wwjVendor/sms/sms.service'; -import { NoticeService } from '@wwjVendor/notice/notice.service'; - -/** - * ${className} - ${layer}层服务 - * 继承BaseService,使用TypeORM Repository模式 - * 对应 Java: @Service + @Autowired - * 对应 PHP: extends BaseCoreService - * - * 使用Common层基础设施: - * - CacheService (缓存,对应PHP Cache::) - * - ConfigService (配置读取,对应PHP Config::get) - * - LoggingService (日志记录,对应PHP Log::write) - * - * 使用Vendor层业务服务: - * - UploadService (文件上传,对应PHP Storage/UploadLoader) - * - PayService (支付服务,对应PHP PayLoader) - * - SmsService (短信服务,对应PHP SmsLoader) - * - NoticeService (通知服务,对应PHP NoticeService) - */ -@Injectable() -export class ${className} extends BaseService { - private readonly logger = new Logger(${className}.name); - - constructor( - @InjectRepository(Object) - protected readonly repository: Repository, - private readonly cacheService: CacheService, - private readonly configService: ConfigService, - private readonly loggingService: LoggingService, - private readonly uploadService: UploadService, - private readonly payService: PayService, - private readonly smsService: SmsService, - private readonly noticeService: NoticeService, - ) { - super(repository); - } - - // 服务方法需要基于真实PHP服务类解析 - // 禁止假设方法,所有方法必须来自PHP源码 - // 可使用注入的服务:configService, loggingService, uploadService, payService, smsService, noticeService -} -`; - } - - /** - * 获取基础设施导入 - */ - getInfrastructureImports() { - return `import { ConfigService } from '@nestjs/config'; -import { CacheService } from '@wwjCommon/cache/cache.service'; -import { LoggingService } from '@wwjCommon/logging/logging.service'; -import { UploadService } from '@wwjVendor/upload/upload.service'; -import { PayService } from '@wwjVendor/pay/pay.service'; -import { SmsService } from '@wwjVendor/sms/sms.service'; -import { NoticeService } from '@wwjVendor/notice/notice.service';`; - } - - /** - * 生成真实服务内容 - */ - generateRealServiceContent(moduleName, serviceName, layer, phpMethods) { - // 先去掉层级后缀,再去掉Service后缀 - const cleanServiceName = serviceName.replace(/_(admin|api|core)$/, ''); - const baseName = cleanServiceName.endsWith('Service') ? cleanServiceName.slice(0, -7) : cleanServiceName; - - // 正确的命名规范:服务类名(与PHP/Java保持一致) - let className = `${baseName}Service`; - if (layer === 'core') { - // Core层服务需要Core前缀 - className = baseName.startsWith('Core') ? `${baseName}Service` : `Core${baseName}Service`; - } else { - // admin和api层直接使用业务名称 - className = `${baseName}Service`; - } - - // BaseService 中已存在的方法,需要避免覆盖 - const baseServiceMethods = ['create', 'update', 'delete', 'find', 'findOne', 'findAll', 'save', 'remove']; - - const methodImplementations = phpMethods.filter(method => method && method.name).map(method => { - // 调试:检查参数格式 - console.log(`🔍 调试参数: ${method.name}`, method.parameters); - const parameters = this.converter.generateServiceParameters(method.parameters); - - // 检查是否与BaseService方法冲突 - if (baseServiceMethods.includes(method.name)) { - // 如果方法名与BaseService冲突,重命名方法 - const newMethodName = `${method.name}Record`; - console.log(`⚠️ 方法名冲突,重命名: ${method.name} -> ${newMethodName}`); - - const realLogic = this.generateRealServiceLogic(method); - const logic = method.logic || { type: 'real', description: '基于真实PHP业务逻辑' }; - - return ` /** - * ${newMethodName} (原方法名: ${method.name}) - * 对应 PHP: ${serviceName}::${method.name}() - * 逻辑类型: ${logic.type} - ${logic.description} - * 注意: 为避免与BaseService方法冲突,已重命名 - */ - async ${newMethodName}(${parameters}) { -${realLogic} - }`; - } else { - // 正常生成方法 - const realLogic = this.generateRealServiceLogic(method); - const logic = method.logic || { type: 'real', description: '基于真实PHP业务逻辑' }; - - return ` /** - * ${method.name} - * 对应 PHP: ${serviceName}::${method.name}() - * 逻辑类型: ${logic.type} - ${logic.description} - */ - async ${method.name}(${parameters}) { -${realLogic} - }`; - } - }).join('\n\n'); - - return `import { Injectable, Logger } from '@nestjs/common'; -import { InjectRepository } from '@nestjs/typeorm'; -import { Repository } from 'typeorm'; -import { ConfigService } from '@nestjs/config'; -import { BaseService } from '@wwjCommon/base/base.service'; -import { CacheService } from '@wwjCommon/cache/cache.service'; -import { LoggingService } from '@wwjCommon/logging/logging.service'; -import { UploadService } from '@wwjVendor/upload/upload.service'; -import { PayService } from '@wwjVendor/pay/pay.service'; -import { SmsService } from '@wwjVendor/sms/sms.service'; -import { NoticeService } from '@wwjVendor/notice/notice.service'; - -@Injectable() -export class ${className} extends BaseService { - private readonly logger = new Logger(${className}.name); - - constructor( - @InjectRepository(Object) - protected readonly repository: Repository, - private readonly cacheService: CacheService, - private readonly configService: ConfigService, - private readonly loggingService: LoggingService, - private readonly uploadService: UploadService, - private readonly payService: PayService, - private readonly smsService: SmsService, - private readonly noticeService: NoticeService, - ) { - super(repository); - } - -${methodImplementations} -} -`; - } - - /** - * 生成真实服务逻辑 - */ - generateRealServiceLogic(method) { - if (!method || !method.name) { - return ` // 方法信息缺失 - return { success: false, message: "Method information missing" };`; - } - - // 使用method.logic而不是method.body - const phpLogic = method.logic || method.body || ''; - - if (!phpLogic.trim()) { - return ` // TODO: 实现${method.name}业务逻辑 - throw new Error('${method.name} not implemented');`; - } - - // 转换PHP代码到TypeScript - const tsBody = this.converter.convertBusinessLogic('', method.name, phpLogic); - - return ` // 基于PHP真实逻辑: ${method.name} - // PHP原文: ${phpLogic.substring(0, 150).replace(/\n/g, ' ')}... -${tsBody}`; - } - - /** - * 从服务路径提取模块名 - */ - extractModuleNameFromServicePath(filePath) { - // 从路径中提取模块名 - const pathParts = filePath.split('/'); - const serviceIndex = pathParts.findIndex(part => part === 'service'); - - if (serviceIndex > 0 && serviceIndex < pathParts.length - 2) { - // service目录后面应该是层级(admin/api/core),再后面是模块名 - // 路径格式: .../app/service/admin/home/AuthSiteService.php - // 索引: .../8 9 10 11 12 - return pathParts[serviceIndex + 2]; - } - - // 如果找不到service目录,尝试从文件名推断 - const fileName = path.basename(filePath, '.php'); - if (fileName.includes('Service')) { - return fileName.replace('Service', '').toLowerCase(); - } - - return 'unknown'; - } - - /** - * 从服务路径提取层级 - */ - extractLayerFromServicePath(filePath) { - // 从路径中提取层级信息 - if (filePath.includes('/admin/')) { - return 'admin'; - } else if (filePath.includes('/api/')) { - return 'api'; - } else if (filePath.includes('/core/')) { - return 'core'; - } - - return 'core'; // 默认为core层 - } - - /** - * 转换为驼峰命名 - */ - toCamelCase(str) { - return str.replace(/(?:^\w|[A-Z]|\b\w)/g, (word, index) => { - return index === 0 ? word.toLowerCase() : word.toUpperCase(); - }).replace(/\s+/g, ''); - } - - /** - * 转换为PascalCase - */ - toPascalCase(str) { - return str.replace(/(^|-)([a-z])/g, (match, p1, p2) => p2.toUpperCase()); - } - - /** - * 转换为kebab-case(我们框架的标准命名格式) - */ - toKebabCase(str) { - return str - .replace(/([A-Z])/g, '-$1') - .replace(/^-/, '') - .toLowerCase(); - } - - /** - * 检查模块是否有PHP服务 - */ - hasPHPServices(moduleName, layer) { - const phpProjectPath = path.join(__dirname, '../../niucloud-php/niucloud'); - const servicePath = path.join(phpProjectPath, 'app/service', layer, moduleName); - - if (!fs.existsSync(servicePath)) return false; - - // 检查目录内是否有PHP文件 - try { - const files = fs.readdirSync(servicePath); - return files.some(file => file.endsWith('.php')); - } catch (error) { - return false; - } - } - - /** - * 生成统计报告 - */ - generateStatsReport() { - console.log('\n📊 服务生成统计报告'); - console.log('='.repeat(50)); - console.log(`✅ 创建服务数量: ${this.stats.servicesCreated}`); - console.log(`🔄 更新服务数量: ${this.stats.servicesUpdated}`); - console.log(`📝 处理方法数量: ${this.stats.methodsProcessed}`); - console.log(`❌ 错误数量: ${this.stats.errors}`); - console.log(`📈 成功率: ${this.stats.servicesCreated > 0 ? ((this.stats.servicesCreated - this.stats.errors) / this.stats.servicesCreated * 100).toFixed(2) : 0}%`); - } -} - -// 如果直接运行此文件 -if (require.main === module) { - const generator = new ServiceGenerator(); - generator.run().catch(console.error); -} - -module.exports = ServiceGenerator; diff --git a/tools/generators/validator-generator.js b/tools/generators/validator-generator.js deleted file mode 100644 index 6af88d0a..00000000 --- a/tools/generators/validator-generator.js +++ /dev/null @@ -1,372 +0,0 @@ -#!/usr/bin/env node - -const fs = require('fs'); -const path = require('path'); - -/** - * 📝 验证器生成器 - * 专门负责生成NestJS验证器/DTO文件 - */ -class ValidatorGenerator { - constructor() { - this.config = { - phpBasePath: '/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud', - nestjsBasePath: '/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/wwjcloud-nest/src/core', - discoveryResultPath: '/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/tools/php-discovery-result.json' - }; - - this.discoveryData = null; - this.stats = { - validatorsCreated: 0, - errors: 0 - }; - } - - /** - * 运行验证器生成 - */ - async run() { - try { - console.log('📝 启动验证器生成器...'); - console.log('目标:生成NestJS验证器/DTO文件\n'); - - // 加载PHP文件发现结果 - await this.loadDiscoveryData(); - - // 生成验证器 - await this.generateValidators(); - - // 输出统计报告 - this.printStats(); - - } catch (error) { - console.error('❌ 验证器生成失败:', error); - this.stats.errors++; - } - } - - /** - * 加载PHP文件发现结果 - */ - async loadDiscoveryData() { - try { - const data = fs.readFileSync(this.config.discoveryResultPath, 'utf8'); - this.discoveryData = JSON.parse(data); - console.log(' ✅ 成功加载PHP文件发现结果'); - } catch (error) { - console.error('❌ 加载发现结果失败:', error); - throw error; - } - } - - /** - * 生成验证器 - */ - async generateValidators() { - console.log(' 🔨 生成验证器...'); - - for (const [moduleName, validates] of Object.entries(this.discoveryData.validates)) { - for (const [validateName, validateInfo] of Object.entries(validates)) { - await this.createValidator(moduleName, validateName, validateInfo); - this.stats.validatorsCreated++; - } - } - - console.log(` ✅ 生成了 ${this.stats.validatorsCreated} 个验证器`); - } - - /** - * 创建验证器 - */ - async createValidator(moduleName, validateName, validateInfo) { - const validatorDir = path.join(this.config.nestjsBasePath, moduleName, 'dto'); - this.ensureDir(validatorDir); - - const validatorPath = path.join( - validatorDir, - `${this.toPascalCase(validateName)}Dto.ts` - ); - - const content = this.generateValidatorContent(moduleName, validateName); - if (content) { - fs.writeFileSync(validatorPath, content); - console.log(` ✅ 创建验证器: ${moduleName}/${this.toPascalCase(validateName)}Dto.ts`); - } else { - console.log(` ⚠️ 跳过验证器生成: ${moduleName}/${this.toPascalCase(validateName)}Dto.ts (无PHP源码)`); - } - } - - /** - * 生成验证器内容 - 基于真实PHP验证器 - */ - generateValidatorContent(moduleName, validateName) { - const className = `${this.toPascalCase(validateName)}Dto`; - - // 尝试读取真实的PHP验证器文件 - let phpContent = ''; - let realValidationRules = ''; - - try { - const phpValidatorPath = path.join(this.config.phpBasePath, 'app/validate', moduleName, `${validateName}.php`); - if (fs.existsSync(phpValidatorPath)) { - phpContent = fs.readFileSync(phpValidatorPath, 'utf-8'); - realValidationRules = this.extractValidationRulesFromPHP(phpContent, validateName); - console.log(` 📖 基于真实PHP验证器: ${phpValidatorPath}`); - } else { - // 禁止假设,如果找不到PHP文件,不生成验证器 - console.log(` ❌ 未找到PHP验证器文件,跳过生成: ${phpValidatorPath}`); - return null; - } - } catch (error) { - // 禁止假设,如果读取失败,不生成验证器 - console.log(` ❌ 读取PHP验证器文件失败,跳过生成: ${error.message}`); - return null; - } - - const content = `import { IsString, IsNumber, IsOptional, IsNotEmpty, IsEmail, IsUrl, IsArray, IsObject } from 'class-validator'; -import { ApiProperty } from '@nestjs/swagger'; -import { validateEvent } from '@wwjCommon/event/contract-validator'; -import { ParseDiyFormPipe } from '@wwjCommon/validation/pipes/parse-diy-form.pipe'; -import { JsonTransformPipe } from '@wwjCommon/validation/pipes/json-transform.pipe'; - -/** - * ${className} - 数据传输对象 - * 基于真实PHP验证器规则生成,禁止假设字段 - * 使用Core层基础设施:契约验证、管道验证、Swagger文档 - */ -export class ${className} { -${realValidationRules} -} - -/** - * ${className} 验证器类 - * 使用Core层contractValidator进行验证 (对应Java的Validator接口) - * 使用Core层基础设施:契约验证、管道验证 - */ -export class ${className}Validator { - /** - * 验证数据 - * 使用Core层统一验证体系 - */ - static validate(data: ${className}): void { - // 调用Core层contractValidator进行验证 - validateEvent('${moduleName}.${this.toCamelCase(validateName)}', data); - } - - /** - * 验证场景 - 基于真实PHP的$scene - */ - static validateAdd(data: ${className}): void { - // 基于真实PHP add场景验证规则 - this.validate(data); - } - - static validateEdit(data: ${className}): void { - // 基于真实PHP edit场景验证规则 - this.validate(data); - } -} - -export class Create${this.toPascalCase(validateName)}Dto { - // 字段定义需要基于真实PHP验证器解析 - // 禁止假设字段 - // 使用Core层基础设施:class-validator装饰器、Swagger文档 -} - -export class Update${this.toPascalCase(validateName)}Dto { - // 字段定义需要基于真实PHP验证器解析 - // 禁止假设字段 - // 使用Core层基础设施:class-validator装饰器、Swagger文档 -} - -export class Query${this.toPascalCase(validateName)}Dto { - // 字段定义需要基于真实PHP验证器解析 - // 禁止假设字段 - // 使用Core层基础设施:class-validator装饰器、Swagger文档 -} -`; - - return content; - } - - /** - * 从PHP验证器内容中提取验证规则 - */ - extractValidationRulesFromPHP(phpContent, validateName) { - // 提取验证规则 - const ruleMatch = phpContent.match(/protected\s+\$rule\s*=\s*\[([\s\S]*?)\];/); - const messageMatch = phpContent.match(/protected\s+\$message\s*=\s*\[([\s\S]*?)\];/); - const sceneMatch = phpContent.match(/protected\s+\$scene\s*=\s*\[([\s\S]*?)\];/); - - if (ruleMatch) { - console.log(` 📖 找到PHP验证规则: ${validateName}`); - // 解析规则内容 - return this.parsePHPValidationRules(ruleMatch[1], messageMatch ? messageMatch[1] : '', sceneMatch ? sceneMatch[1] : ''); - } - - return ''; - } - - /** - * 解析PHP验证规则 - */ - parsePHPValidationRules(rulesContent, messagesContent, scenesContent) { - const fields = []; - - // 解析规则 - const ruleMatches = rulesContent.match(/(['"][^'"]*['"])\s*=>\s*(['"][^'"]*['"])/g); - if (ruleMatches) { - ruleMatches.forEach(match => { - const fieldMatch = match.match(/(['"][^'"]*['"])\s*=>\s*(['"][^'"]*['"])/); - if (fieldMatch) { - const fieldName = fieldMatch[1].replace(/['"]/g, ''); - const fieldRules = fieldMatch[2].replace(/['"]/g, ''); - - // 解析规则类型 - const fieldType = this.parseFieldType(fieldRules); - const validators = this.parseValidators(fieldRules); - - fields.push({ - name: fieldName, - type: fieldType, - validators: validators, - rules: fieldRules - }); - } - }); - } - - // 生成DTO字段 - const dtoFields = fields.map(field => { - const validatorsStr = field.validators.map(v => `@${v}()`).join('\n '); - return ` @ApiProperty({ description: '${field.name}' }) - ${validatorsStr} - ${this.toCamelCase(field.name)}: ${field.type};`; - }).join('\n\n'); - - return dtoFields; - } - - /** - * 解析字段类型 - */ - parseFieldType(rules) { - if (rules.includes('number') || rules.includes('integer')) { - return 'number'; - } else if (rules.includes('email')) { - return 'string'; - } else if (rules.includes('url')) { - return 'string'; - } else if (rules.includes('array')) { - return 'any[]'; - } else if (rules.includes('object')) { - return 'object'; - } else { - return 'string'; - } - } - - /** - * 解析验证器 - */ - parseValidators(rules) { - const validators = []; - - if (rules.includes('require')) { - validators.push('IsNotEmpty'); - } - - if (rules.includes('number') || rules.includes('integer')) { - validators.push('IsNumber'); - } else if (rules.includes('email')) { - validators.push('IsEmail'); - } else if (rules.includes('url')) { - validators.push('IsUrl'); - } else if (rules.includes('array')) { - validators.push('IsArray'); - } else if (rules.includes('object')) { - validators.push('IsObject'); - } else { - validators.push('IsString'); - } - - return validators; - } - - /** - * 转换为PascalCase - 处理连字符 - */ - toPascalCase(str) { - return str.replace(/(^|-)([a-z])/g, (match, p1, p2) => p2.toUpperCase()); - } - - /** - * 转换为camelCase - */ - toCamelCase(str) { - return str.charAt(0).toLowerCase() + str.slice(1); - } - - toPascalCase(str) { - return str.charAt(0).toUpperCase() + str.slice(1); - } - - /** - * 确保目录存在 - 基于PHP实际存在的层级 - */ - ensureDir(dirPath) { - // 检查是否应该创建这个目录(基于PHP实际存在的层级) - if (this.shouldCreateDir(dirPath)) { - if (!fs.existsSync(dirPath)) { - fs.mkdirSync(dirPath, { recursive: true }); - } - } - } - - /** - * 检查是否应该创建目录 - */ - shouldCreateDir(dirPath) { - // 提取模块名和层级信息 - const pathParts = dirPath.split('/'); - const moduleIndex = pathParts.indexOf('common') + 1; - if (moduleIndex < pathParts.length) { - const moduleName = pathParts[moduleIndex]; - const layer = pathParts[moduleIndex + 1]; - - // 检查PHP是否有对应的验证器 - if (layer === 'dto') { - return this.hasPHPValidators(moduleName); - } - } - return true; // 默认创建 - } - - /** - * 检查模块是否有PHP验证器 - */ - hasPHPValidators(moduleName) { - const phpProjectPath = path.join(__dirname, '../../niucloud-php/niucloud'); - const validatePath = path.join(phpProjectPath, 'app/validate', moduleName); - return fs.existsSync(validatePath); - } - - /** - * 输出统计报告 - */ - printStats() { - console.log('\n📊 验证器生成统计报告'); - console.log('=================================================='); - console.log(`✅ 创建验证器数量: ${this.stats.validatorsCreated}`); - console.log(`❌ 错误数量: ${this.stats.errors}`); - console.log(`📈 成功率: ${this.stats.validatorsCreated > 0 ? '100.00%' : '0.00%'}`); - } -} - -// 如果直接运行此文件 -if (require.main === module) { - const generator = new ValidatorGenerator(); - generator.run().catch(console.error); -} - -module.exports = ValidatorGenerator; diff --git a/tools/incremental-update-cli.js b/tools/incremental-update-cli.js deleted file mode 100755 index 3669a33d..00000000 --- a/tools/incremental-update-cli.js +++ /dev/null @@ -1,186 +0,0 @@ -#!/usr/bin/env node - -const IncrementalUpdater = require('./incremental-updater'); - -/** - * 🔄 增量更新命令行工具 - * 提供独立的增量更新功能入口 - */ - -function showHelp() { - console.log(` -🔄 增量更新工具 - WWJCloud PHP to NestJS - -用法: - node incremental-update-cli.js [选项] - -选项: - --help, -h 显示帮助信息 - --dry-run 干运行模式,不实际修改文件 - --verbose, -v 详细输出模式 - --force 强制更新,忽略冲突警告 - --backup 创建备份(默认启用) - --no-backup 不创建备份 - -环境变量: - DRY_RUN=true 启用干运行模式 - VERBOSE=true 启用详细输出 - FORCE=true 启用强制模式 - -示例: - # 基本增量更新 - node incremental-update-cli.js - - # 干运行模式(查看将要进行的更改) - node incremental-update-cli.js --dry-run - - # 详细输出模式 - node incremental-update-cli.js --verbose - - # 强制更新模式 - node incremental-update-cli.js --force - - # 使用环境变量 - DRY_RUN=true node incremental-update-cli.js - -功能特性: - ✅ 智能变更检测 - 基于文件哈希和时间戳 - ✅ 用户代码保护 - 自动检测和保护用户自定义代码 - ✅ 三路合并算法 - 智能合并PHP变更和用户修改 - ✅ 冲突处理机制 - 自动标记和处理合并冲突 - ✅ 备份恢复功能 - 自动创建备份,支持快速恢复 - ✅ 增量状态跟踪 - 记录更新历史和文件状态 - ✅ 详细更新报告 - 提供完整的更新统计和结果 - -注意事项: - - 首次运行将建立基线状态 - - 建议在重要更新前手动备份 - - 冲突文件需要手动解决 - - 支持回滚到任意历史版本 -`); -} - -async function main() { - const args = process.argv.slice(2); - - // 处理帮助选项 - if (args.includes('--help') || args.includes('-h')) { - showHelp(); - return; - } - - // 解析命令行参数 - const options = { - dryRun: args.includes('--dry-run') || process.env.DRY_RUN === 'true', - verbose: args.includes('--verbose') || args.includes('-v') || process.env.VERBOSE === 'true', - force: args.includes('--force') || process.env.FORCE === 'true', - backup: !args.includes('--no-backup') - }; - - console.log('🔄 WWJCloud 增量更新工具'); - console.log('=================================================='); - - if (options.dryRun) { - console.log('🔍 运行模式: 干运行 (不会实际修改文件)'); - } - - if (options.verbose) { - console.log('📝 输出模式: 详细输出'); - } - - if (options.force) { - console.log('⚡ 更新模式: 强制更新'); - } - - if (!options.backup) { - console.log('⚠️ 备份模式: 已禁用备份'); - } - - console.log('==================================================\n'); - - try { - // 设置环境变量 - if (options.dryRun) { - process.env.DRY_RUN = 'true'; - } - - if (options.verbose) { - process.env.VERBOSE = 'true'; - } - - if (options.force) { - process.env.FORCE = 'true'; - } - - if (!options.backup) { - process.env.NO_BACKUP = 'true'; - } - - // 创建并运行增量更新器 - const updater = new IncrementalUpdater(); - const success = await updater.run(); - - if (success) { - console.log('\n✅ 增量更新成功完成!'); - - if (options.dryRun) { - console.log('\n💡 提示: 这是干运行模式,没有实际修改文件'); - console.log(' 要执行实际更新,请移除 --dry-run 参数'); - } - - process.exit(0); - } else { - console.log('\n❌ 增量更新失败'); - process.exit(1); - } - - } catch (error) { - console.error('\n💥 增量更新过程中发生错误:'); - console.error(error.message); - - if (options.verbose) { - console.error('\n📋 详细错误信息:'); - console.error(error.stack); - } - - console.log('\n🔧 故障排除建议:'); - console.log('1. 检查PHP项目路径是否正确'); - console.log('2. 检查NestJS项目路径是否正确'); - console.log('3. 确保有足够的文件系统权限'); - console.log('4. 尝试使用 --dry-run 模式查看详细信息'); - console.log('5. 查看备份目录是否有可恢复的版本'); - - process.exit(1); - } -} - -// 处理未捕获的异常 -process.on('unhandledRejection', (reason, promise) => { - console.error('💥 未处理的Promise拒绝:', reason); - process.exit(1); -}); - -process.on('uncaughtException', (error) => { - console.error('💥 未捕获的异常:', error); - process.exit(1); -}); - -// 处理中断信号 -process.on('SIGINT', () => { - console.log('\n\n⏹️ 用户中断操作'); - console.log('增量更新已停止'); - process.exit(0); -}); - -process.on('SIGTERM', () => { - console.log('\n\n⏹️ 收到终止信号'); - console.log('增量更新已停止'); - process.exit(0); -}); - -// 运行主程序 -if (require.main === module) { - main(); -} - -module.exports = { main, showHelp }; \ No newline at end of file diff --git a/tools/incremental-updater.js b/tools/incremental-updater.js deleted file mode 100644 index 5e4d0635..00000000 --- a/tools/incremental-updater.js +++ /dev/null @@ -1,772 +0,0 @@ -#!/usr/bin/env node - -const fs = require('fs'); -const path = require('path'); -const crypto = require('crypto'); -const { execSync } = require('child_process'); - -/** - * 🔄 增量更新器 - * 智能检测PHP项目变更,实现增量迁移到NestJS - */ -class IncrementalUpdater { - constructor() { - this.config = { - phpBasePath: '/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud', - nestjsBasePath: '/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/wwjcloud-nest/src/core', - stateFilePath: '/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/tools/.incremental-state.json', - backupPath: '/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/tools/backups', - dryRun: process.env.DRY_RUN === 'true' - }; - - this.state = { - lastUpdate: null, - fileHashes: {}, - migrationHistory: [], - userModifications: {}, - conflicts: [] - }; - - this.stats = { - filesChanged: 0, - filesAdded: 0, - filesDeleted: 0, - conflictsDetected: 0, - autoMerged: 0, - manualMergeRequired: 0 - }; - } - - /** - * 🚀 执行增量更新 - */ - async run() { - console.log('🔄 启动增量更新器...'); - console.log(`📁 PHP项目: ${this.config.phpBasePath}`); - console.log(`📁 NestJS项目: ${this.config.nestjsBasePath}`); - console.log(`🔍 Dry-run模式: ${this.config.dryRun ? '是' : '否'}\n`); - - try { - // 1. 加载上次更新状态 - await this.loadState(); - - // 2. 检测PHP项目变更 - const changes = await this.detectChanges(); - - if (changes.length === 0) { - console.log('✅ 没有检测到变更,无需更新'); - return; - } - - console.log(`📊 检测到 ${changes.length} 个变更文件`); - - // 3. 分析变更类型 - const changeAnalysis = await this.analyzeChanges(changes); - - // 4. 检测用户自定义修改 - await this.detectUserModifications(); - - // 5. 执行智能合并 - const mergeResults = await this.performSmartMerge(changeAnalysis); - - // 6. 生成更新报告 - this.generateUpdateReport(mergeResults); - - // 7. 保存新状态 - if (!this.config.dryRun) { - await this.saveState(); - } - - } catch (error) { - console.error('❌ 增量更新失败:', error.message); - throw error; - } - } - - /** - * 📂 加载上次更新状态 - */ - async loadState() { - try { - if (fs.existsSync(this.config.stateFilePath)) { - const data = fs.readFileSync(this.config.stateFilePath, 'utf8'); - this.state = { ...this.state, ...JSON.parse(data) }; - console.log(`📋 加载状态: 上次更新时间 ${this.state.lastUpdate || '从未更新'}`); - } else { - console.log('📋 首次运行,创建新状态'); - } - } catch (error) { - console.log(`⚠️ 加载状态失败,使用默认状态: ${error.message}`); - } - } - - /** - * 🔍 检测PHP项目变更 - */ - async detectChanges() { - console.log('🔍 检测PHP项目变更...'); - - const changes = []; - const phpFiles = this.getAllPHPFiles(); - - for (const filePath of phpFiles) { - const relativePath = path.relative(this.config.phpBasePath, filePath); - const currentHash = this.calculateFileHash(filePath); - const lastHash = this.state.fileHashes[relativePath]; - - if (!lastHash) { - // 新文件 - changes.push({ - type: 'added', - path: relativePath, - fullPath: filePath, - hash: currentHash - }); - this.stats.filesAdded++; - } else if (currentHash !== lastHash) { - // 修改的文件 - changes.push({ - type: 'modified', - path: relativePath, - fullPath: filePath, - hash: currentHash, - oldHash: lastHash - }); - this.stats.filesChanged++; - } - - // 更新哈希 - this.state.fileHashes[relativePath] = currentHash; - } - - // 检测删除的文件 - for (const [relativePath, hash] of Object.entries(this.state.fileHashes)) { - const fullPath = path.join(this.config.phpBasePath, relativePath); - if (!fs.existsSync(fullPath)) { - changes.push({ - type: 'deleted', - path: relativePath, - fullPath: fullPath, - hash: hash - }); - this.stats.filesDeleted++; - delete this.state.fileHashes[relativePath]; - } - } - - return changes; - } - - /** - * 📊 分析变更类型 - */ - async analyzeChanges(changes) { - console.log('📊 分析变更类型...'); - - const analysis = { - controllers: [], - services: [], - models: [], - validators: [], - others: [] - }; - - for (const change of changes) { - const category = this.categorizeFile(change.path); - analysis[category].push(change); - - console.log(` ${this.getChangeIcon(change.type)} ${change.type.toUpperCase()}: ${change.path} (${category})`); - } - - return analysis; - } - - /** - * 🔍 检测用户自定义修改 - */ - async detectUserModifications() { - console.log('🔍 检测用户自定义修改...'); - - const nestjsFiles = this.getAllNestJSFiles(); - - for (const filePath of nestjsFiles) { - const relativePath = path.relative(this.config.nestjsBasePath, filePath); - const content = fs.readFileSync(filePath, 'utf8'); - - // 检测用户自定义标记 - const userModifications = this.detectUserCode(content); - - if (userModifications.length > 0) { - this.state.userModifications[relativePath] = userModifications; - console.log(` 🔧 检测到用户修改: ${relativePath} (${userModifications.length}处)`); - } - } - } - - /** - * 🤖 执行智能合并 - */ - async performSmartMerge(changeAnalysis) { - console.log('🤖 执行智能合并...'); - - const mergeResults = { - autoMerged: [], - conflicts: [], - skipped: [] - }; - - // 创建备份 - if (!this.config.dryRun) { - await this.createBackup(); - } - - // 处理各类变更 - for (const [category, changes] of Object.entries(changeAnalysis)) { - if (changes.length === 0) continue; - - console.log(`\n📋 处理 ${category} 变更 (${changes.length}个文件):`); - - for (const change of changes) { - const result = await this.mergeFile(change, category); - mergeResults[result.status].push(result); - - console.log(` ${this.getMergeIcon(result.status)} ${change.path}: ${result.message}`); - } - } - - return mergeResults; - } - - /** - * 🔀 合并单个文件 - */ - async mergeFile(change, category) { - const nestjsPath = this.mapPHPToNestJS(change.path, category); - - if (!nestjsPath) { - return { - status: 'skipped', - change: change, - message: '无对应的NestJS文件映射' - }; - } - - const nestjsFullPath = path.join(this.config.nestjsBasePath, nestjsPath); - - // 检查是否存在用户修改 - const hasUserModifications = this.state.userModifications[nestjsPath]; - - if (change.type === 'deleted') { - return await this.handleDeletedFile(change, nestjsFullPath, hasUserModifications); - } - - if (change.type === 'added') { - return await this.handleAddedFile(change, nestjsFullPath, category); - } - - if (change.type === 'modified') { - return await this.handleModifiedFile(change, nestjsFullPath, hasUserModifications, category); - } - } - - /** - * ➕ 处理新增文件 - */ - async handleAddedFile(change, nestjsPath, category) { - if (fs.existsSync(nestjsPath)) { - return { - status: 'conflicts', - change: change, - message: 'NestJS文件已存在,需要手动处理' - }; - } - - if (this.config.dryRun) { - return { - status: 'autoMerged', - change: change, - message: '[DRY-RUN] 将生成新的NestJS文件' - }; - } - - // 生成NestJS文件 - const success = await this.generateNestJSFile(change.fullPath, nestjsPath, category); - - if (success) { - this.stats.autoMerged++; - return { - status: 'autoMerged', - change: change, - message: '成功生成新的NestJS文件' - }; - } else { - return { - status: 'conflicts', - change: change, - message: '生成NestJS文件失败' - }; - } - } - - /** - * ✏️ 处理修改文件 - */ - async handleModifiedFile(change, nestjsPath, hasUserModifications, category) { - if (!fs.existsSync(nestjsPath)) { - // NestJS文件不存在,直接生成 - return await this.handleAddedFile(change, nestjsPath, category); - } - - if (hasUserModifications) { - // 存在用户修改,需要智能合并 - return await this.performIntelligentMerge(change, nestjsPath, category); - } - - if (this.config.dryRun) { - return { - status: 'autoMerged', - change: change, - message: '[DRY-RUN] 将重新生成NestJS文件' - }; - } - - // 没有用户修改,直接重新生成 - const success = await this.generateNestJSFile(change.fullPath, nestjsPath, category); - - if (success) { - this.stats.autoMerged++; - return { - status: 'autoMerged', - change: change, - message: '成功重新生成NestJS文件' - }; - } else { - return { - status: 'conflicts', - change: change, - message: '重新生成NestJS文件失败' - }; - } - } - - /** - * 🗑️ 处理删除文件 - */ - async handleDeletedFile(change, nestjsPath, hasUserModifications) { - if (!fs.existsSync(nestjsPath)) { - return { - status: 'autoMerged', - change: change, - message: 'NestJS文件已不存在' - }; - } - - if (hasUserModifications) { - return { - status: 'conflicts', - change: change, - message: '文件包含用户修改,需要手动决定是否删除' - }; - } - - if (this.config.dryRun) { - return { - status: 'autoMerged', - change: change, - message: '[DRY-RUN] 将删除对应的NestJS文件' - }; - } - - // 删除NestJS文件 - fs.unlinkSync(nestjsPath); - this.stats.autoMerged++; - - return { - status: 'autoMerged', - change: change, - message: '成功删除对应的NestJS文件' - }; - } - - /** - * 🧠 执行智能合并 - */ - async performIntelligentMerge(change, nestjsPath, category) { - console.log(` 🧠 智能合并: ${change.path}`); - - // 读取现有NestJS文件 - const existingContent = fs.readFileSync(nestjsPath, 'utf8'); - - // 生成新的NestJS内容 - const newContent = await this.generateNestJSContent(change.fullPath, category); - - if (!newContent) { - return { - status: 'conflicts', - change: change, - message: '无法生成新的NestJS内容' - }; - } - - // 执行三路合并 - const mergeResult = this.performThreeWayMerge(existingContent, newContent, change); - - if (mergeResult.hasConflicts) { - this.stats.conflictsDetected++; - - // 保存冲突文件 - const conflictPath = `${nestjsPath}.conflict`; - if (!this.config.dryRun) { - fs.writeFileSync(conflictPath, mergeResult.conflictContent); - } - - return { - status: 'conflicts', - change: change, - message: `存在合并冲突,冲突文件保存为: ${conflictPath}` - }; - } - - if (this.config.dryRun) { - return { - status: 'autoMerged', - change: change, - message: '[DRY-RUN] 将执行智能合并' - }; - } - - // 保存合并结果 - fs.writeFileSync(nestjsPath, mergeResult.mergedContent); - this.stats.autoMerged++; - - return { - status: 'autoMerged', - change: change, - message: '成功执行智能合并' - }; - } - - /** - * 🔀 执行三路合并 - */ - performThreeWayMerge(existingContent, newContent, change) { - // 简化的三路合并实现 - // 在实际项目中,可以使用更复杂的合并算法 - - const userSections = this.extractUserSections(existingContent); - const generatedSections = this.extractGeneratedSections(newContent); - - let mergedContent = newContent; - let hasConflicts = false; - let conflictContent = ''; - - // 尝试保留用户自定义部分 - for (const userSection of userSections) { - const insertPosition = this.findInsertPosition(mergedContent, userSection); - - if (insertPosition !== -1) { - // 可以安全插入 - mergedContent = this.insertUserSection(mergedContent, userSection, insertPosition); - } else { - // 存在冲突 - hasConflicts = true; - conflictContent += `\n<<<<<<< 用户修改\n${userSection.content}\n=======\n`; - conflictContent += `${this.getConflictingSection(newContent, userSection)}\n>>>>>>> 新生成\n`; - } - } - - return { - mergedContent, - hasConflicts, - conflictContent: hasConflicts ? existingContent + '\n\n' + conflictContent : '' - }; - } - - /** - * 🏷️ 检测用户代码 - */ - detectUserCode(content) { - const userModifications = []; - - // 检测用户自定义注释 - const userCommentRegex = /\/\*\s*USER_CUSTOM_START\s*\*\/([\s\S]*?)\/\*\s*USER_CUSTOM_END\s*\*\//g; - let match; - - while ((match = userCommentRegex.exec(content)) !== null) { - userModifications.push({ - type: 'custom_block', - content: match[1].trim(), - start: match.index, - end: match.index + match[0].length - }); - } - - // 检测手动添加的方法 - const methodRegex = /\/\*\s*@user-added\s*\*\/\s*([\s\S]*?)(?=\/\*|$)/g; - while ((match = methodRegex.exec(content)) !== null) { - userModifications.push({ - type: 'user_method', - content: match[1].trim(), - start: match.index, - end: match.index + match[0].length - }); - } - - return userModifications; - } - - /** - * 🗂️ 文件分类 - */ - categorizeFile(filePath) { - if (filePath.includes('/controller/')) return 'controllers'; - if (filePath.includes('/service/')) return 'services'; - if (filePath.includes('/model/')) return 'models'; - if (filePath.includes('/validate/')) return 'validators'; - return 'others'; - } - - /** - * 🗺️ PHP到NestJS文件映射 - */ - mapPHPToNestJS(phpPath, category) { - // 简化的映射逻辑,实际项目中需要更复杂的映射规则 - const baseName = path.basename(phpPath, '.php'); - const dirName = path.dirname(phpPath); - - switch (category) { - case 'controllers': - return `${dirName}/${baseName.toLowerCase()}.controller.ts`; - case 'services': - return `${dirName}/${baseName.toLowerCase()}.service.ts`; - case 'models': - return `${dirName}/entity/${baseName.toLowerCase()}.entity.ts`; - case 'validators': - return `${dirName}/${baseName.toLowerCase()}.validator.ts`; - default: - return null; - } - } - - /** - * 📁 获取所有PHP文件 - */ - getAllPHPFiles() { - const files = []; - - const scanDir = (dir) => { - const items = fs.readdirSync(dir); - - for (const item of items) { - const fullPath = path.join(dir, item); - const stat = fs.statSync(fullPath); - - if (stat.isDirectory()) { - scanDir(fullPath); - } else if (item.endsWith('.php')) { - files.push(fullPath); - } - } - }; - - scanDir(this.config.phpBasePath); - return files; - } - - /** - * 📁 获取所有NestJS文件 - */ - getAllNestJSFiles() { - const files = []; - - const scanDir = (dir) => { - if (!fs.existsSync(dir)) return; - - const items = fs.readdirSync(dir); - - for (const item of items) { - const fullPath = path.join(dir, item); - const stat = fs.statSync(fullPath); - - if (stat.isDirectory()) { - scanDir(fullPath); - } else if (item.endsWith('.ts')) { - files.push(fullPath); - } - } - }; - - scanDir(this.config.nestjsBasePath); - return files; - } - - /** - * 🔐 计算文件哈希 - */ - calculateFileHash(filePath) { - const content = fs.readFileSync(filePath); - return crypto.createHash('md5').update(content).digest('hex'); - } - - /** - * 💾 创建备份 - */ - async createBackup() { - const timestamp = new Date().toISOString().replace(/[:.]/g, '-'); - const backupDir = path.join(this.config.backupPath, timestamp); - - if (!fs.existsSync(this.config.backupPath)) { - fs.mkdirSync(this.config.backupPath, { recursive: true }); - } - - fs.mkdirSync(backupDir, { recursive: true }); - - // 复制NestJS项目到备份目录 - this.copyDirectory(this.config.nestjsBasePath, backupDir); - - console.log(`💾 创建备份: ${backupDir}`); - } - - /** - * 📋 复制目录 - */ - copyDirectory(src, dest) { - if (!fs.existsSync(dest)) { - fs.mkdirSync(dest, { recursive: true }); - } - - const items = fs.readdirSync(src); - - for (const item of items) { - const srcPath = path.join(src, item); - const destPath = path.join(dest, item); - const stat = fs.statSync(srcPath); - - if (stat.isDirectory()) { - this.copyDirectory(srcPath, destPath); - } else { - fs.copyFileSync(srcPath, destPath); - } - } - } - - /** - * 🏗️ 生成NestJS文件 - */ - async generateNestJSFile(phpPath, nestjsPath, category) { - // 这里应该调用相应的生成器 - // 为了简化,这里只是创建一个占位符 - - const content = await this.generateNestJSContent(phpPath, category); - - if (!content) return false; - - // 确保目录存在 - const dir = path.dirname(nestjsPath); - if (!fs.existsSync(dir)) { - fs.mkdirSync(dir, { recursive: true }); - } - - fs.writeFileSync(nestjsPath, content); - return true; - } - - /** - * 📝 生成NestJS内容 - */ - async generateNestJSContent(phpPath, category) { - // 这里应该调用相应的转换器 - // 为了简化,返回一个基本模板 - - const className = path.basename(phpPath, '.php'); - - switch (category) { - case 'controllers': - return `import { Controller } from '@nestjs/common';\n\n@Controller()\nexport class ${className}Controller {\n // Generated from ${phpPath}\n}\n`; - case 'services': - return `import { Injectable } from '@nestjs/common';\n\n@Injectable()\nexport class ${className}Service {\n // Generated from ${phpPath}\n}\n`; - case 'models': - return `import { Entity } from 'typeorm';\n\n@Entity()\nexport class ${className} {\n // Generated from ${phpPath}\n}\n`; - default: - return `// Generated from ${phpPath}\nexport class ${className} {\n}\n`; - } - } - - /** - * 📊 生成更新报告 - */ - generateUpdateReport(mergeResults) { - console.log('\n📊 增量更新报告'); - console.log('=================================================='); - console.log(`📁 文件变更统计:`); - console.log(` ➕ 新增: ${this.stats.filesAdded}个`); - console.log(` ✏️ 修改: ${this.stats.filesChanged}个`); - console.log(` 🗑️ 删除: ${this.stats.filesDeleted}个`); - console.log(`\n🔀 合并结果统计:`); - console.log(` ✅ 自动合并: ${mergeResults.autoMerged.length}个`); - console.log(` ⚠️ 冲突需处理: ${mergeResults.conflicts.length}个`); - console.log(` ⏭️ 跳过: ${mergeResults.skipped.length}个`); - - if (mergeResults.conflicts.length > 0) { - console.log(`\n⚠️ 需要手动处理的冲突:`); - for (const conflict of mergeResults.conflicts) { - console.log(` - ${conflict.change.path}: ${conflict.message}`); - } - } - - console.log('=================================================='); - } - - /** - * 💾 保存状态 - */ - async saveState() { - this.state.lastUpdate = new Date().toISOString(); - this.state.migrationHistory.push({ - timestamp: this.state.lastUpdate, - stats: { ...this.stats } - }); - - fs.writeFileSync(this.config.stateFilePath, JSON.stringify(this.state, null, 2)); - console.log(`💾 状态已保存: ${this.config.stateFilePath}`); - } - - /** - * 🎨 获取变更图标 - */ - getChangeIcon(type) { - const icons = { - added: '➕', - modified: '✏️', - deleted: '🗑️' - }; - return icons[type] || '❓'; - } - - /** - * 🎨 获取合并图标 - */ - getMergeIcon(status) { - const icons = { - autoMerged: '✅', - conflicts: '⚠️', - skipped: '⏭️' - }; - return icons[status] || '❓'; - } - - // 辅助方法(简化实现) - extractUserSections(content) { return []; } - extractGeneratedSections(content) { return []; } - findInsertPosition(content, section) { return -1; } - insertUserSection(content, section, position) { return content; } - getConflictingSection(content, section) { return ''; } -} - -// 命令行执行 -if (require.main === module) { - const updater = new IncrementalUpdater(); - updater.run().catch(console.error); -} - -module.exports = IncrementalUpdater; \ No newline at end of file diff --git a/tools/migration-coordinator.js b/tools/migration-coordinator.js deleted file mode 100644 index edc864d6..00000000 --- a/tools/migration-coordinator.js +++ /dev/null @@ -1,1298 +0,0 @@ -#!/usr/bin/env node - -const fs = require('fs'); -const path = require('path'); -const ServiceGenerator = require('./generators/service-generator'); -const EntityGenerator = require('./generators/entity-generator'); -const ModuleGenerator = require('./generators/module-generator'); -const ControllerGenerator = require('./generators/controller-generator'); -const ValidatorGenerator = require('./generators/validator-generator'); -// const MiddlewareGenerator = require('./generators/middleware-generator'); // 已废弃,使用Core层Guards+Interceptors+Pipes -const RouteGenerator = require('./generators/route-generator'); -const JobGenerator = require('./generators/job-generator'); -const ListenerGenerator = require('./generators/listener-generator'); -// const CommandGenerator = require('./generators/command-generator'); // 文件不存在,暂时注释 -const DictGenerator = require('./generators/dict-generator'); -const QualityGate = require('./generators/quality-gate'); -const IncrementalUpdater = require('./incremental-updater'); - -/** - * 🎯 迁移协调器 - * 协调所有工具的执行,按步骤完成PHP到NestJS的迁移 - */ -class MigrationCoordinator { - constructor() { - this.config = { - phpBasePath: '/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud', - nestjsBasePath: '/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/wwjcloud-nest/src/core', - discoveryResultPath: '/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/tools/php-discovery-result.json', - enableJobs: true, - enableListeners: true, - enableCommands: false, - dryRun: false, - incrementalMode: process.env.INCREMENTAL === 'true' || process.argv.includes('--incremental') - }; - - this.stats = { - totalSteps: 0, - completedSteps: 0, - failedSteps: 0, - startTime: null, - endTime: null, - errors: 0 - }; - } - - /** - * 🚀 启动完整自动化迁移工具 - */ - async run() { - console.log('🚀 启动完整自动化迁移工具...'); - - if (this.config.incrementalMode) { - console.log('🔄 增量模式:仅处理变更的文件'); - return await this.runIncrementalUpdate(); - } else { - console.log('🏗️ 完整模式:重新生成所有文件'); - return await this.runFullMigration(); - } - } - - /** - * 🔄 运行增量更新 - */ - async runIncrementalUpdate() { - console.log('🔄 启动增量更新模式...\n'); - - try { - const incrementalUpdater = new IncrementalUpdater(); - await incrementalUpdater.run(); - - console.log('✅ 增量更新完成'); - return true; - } catch (error) { - console.error('❌ 增量更新失败:', error.message); - return false; - } - } - - /** - * 🏗️ 运行完整迁移 - */ - async runFullMigration() { - console.log('目标:完整迁移PHP项目到NestJS,包括所有组件\n'); - - this.stats.startTime = new Date(); - - try { - // 第1阶段:加载PHP文件发现结果 - console.log('📊 第1阶段:加载PHP文件发现结果...'); - await this.loadDiscoveryData(); - console.log('✅ 第1阶段完成 - 数据加载成功'); - - // 第2阶段:创建完整模块结构 - console.log('📊 第2阶段:创建完整模块结构...'); - await this.createCompleteModuleStructure(); - console.log('✅ 第2阶段完成 - 模块结构创建成功'); - - // 第3阶段:生成实体(数据模型层) - console.log('📊 第3阶段:生成实体...'); - await this.generateEntities(); - console.log('🔍 验证实体生成结果...'); - await this.validateEntities(); - console.log('✅ 第3阶段完成 - 实体生成和验证成功'); - - // 第4阶段:生成服务(业务逻辑层) - console.log('📊 第4阶段:生成服务...'); - await this.generateServices(); - console.log('🔍 验证服务生成结果...'); - await this.validateServices(); - console.log('✅ 第4阶段完成 - 服务生成和验证成功'); - - // 第5阶段:生成验证器(依赖服务) - console.log('📊 第5阶段:生成验证器...'); - await this.generateValidators(); - console.log('🔍 验证验证器生成结果...'); - await this.validateValidators(); - console.log('✅ 第5阶段完成 - 验证器生成和验证成功'); - - // 第6阶段:生成控制器(依赖服务和验证器) - console.log('📊 第6阶段:生成控制器...'); - await this.generateControllersWithClassification(); - console.log('🔍 验证控制器生成结果...'); - await this.validateControllers(); - console.log('✅ 第6阶段完成 - 控制器生成和验证成功'); - - // 第7阶段:生成路由(依赖控制器) - console.log('📊 第7阶段:生成路由...'); - await this.generateRoutes(); - console.log('🔍 验证路由生成结果...'); - await this.validateRoutes(); - console.log('✅ 第7阶段完成 - 路由生成和验证成功'); - - // 第8阶段:生成任务 - if (this.config.enableJobs) { - console.log('📊 第8阶段:生成任务...'); - await this.generateJobs(); - console.log('🔍 验证任务生成结果...'); - await this.validateJobs(); - console.log('✅ 第8阶段完成 - 任务生成和验证成功'); - } else { - console.log('⏭️ 跳过任务生成 (已禁用)'); - } - - // 第9阶段:生成监听器 - if (this.config.enableListeners) { - console.log('📊 第9阶段:生成监听器...'); - await this.generateListeners(); - console.log('🔍 验证监听器生成结果...'); - await this.validateListeners(); - console.log('✅ 第9阶段完成 - 监听器生成和验证成功'); - } else { - console.log('⏭️ 跳过监听器生成 (已禁用)'); - } - - // 第10阶段:生成命令 - if (this.config.enableCommands) { - console.log('📊 第10阶段:生成命令...'); - await this.generateCommands(); - console.log('🔍 验证命令生成结果...'); - await this.validateCommands(); - console.log('✅ 第10阶段完成 - 命令生成和验证成功'); - } else { - console.log('⏭️ 跳过命令生成 (已禁用)'); - } - - // 第11阶段:生成字典 - console.log('📊 第11阶段:生成字典...'); - await this.generateDicts(); - console.log('🔍 验证字典生成结果...'); - await this.validateDicts(); - console.log('✅ 第11阶段完成 - 字典生成和验证成功'); - - // 第12阶段:生成模块文件(依赖所有组件) - console.log('📊 第12阶段:生成模块文件...'); - await this.generateModuleFiles(); - console.log('🔍 验证模块文件生成结果...'); - await this.validateModuleFiles(); - console.log('✅ 第12阶段完成 - 模块文件生成和验证成功'); - - // 第13阶段:最终质量检查 - console.log('📊 第13阶段:最终质量检查...'); - await this.runQualityGate(); - console.log('✅ 第13阶段完成 - 质量检查通过'); - - // 第14阶段:生成统计报告 - console.log('📊 第14阶段:生成统计报告...'); - this.generateStatsReport(); - console.log('✅ 第14阶段完成 - 统计报告生成成功'); - - } catch (error) { - console.error('❌ 迁移过程中发生错误:', error.message); - this.stats.errors++; - throw error; - } finally { - this.stats.endTime = new Date(); - const duration = this.stats.endTime - this.stats.startTime; - console.log(`\n⏱️ 总耗时: ${(duration / 1000).toFixed(2)}秒`); - console.log('🎉 完整迁移流程完成!'); - } - } - - /** - * 加载PHP文件发现结果 - */ - async loadDiscoveryData() { - try { - console.log(' 🔍 开始读取发现结果文件:', this.config.discoveryResultPath); - - // 检查文件是否存在 - if (!fs.existsSync(this.config.discoveryResultPath)) { - throw new Error(`发现结果文件不存在: ${this.config.discoveryResultPath}`); - } - - // 获取文件大小 - const stats = fs.statSync(this.config.discoveryResultPath); - console.log(` 📏 文件大小: ${(stats.size / 1024 / 1024).toFixed(2)} MB`); - - console.log(' 📖 正在读取文件内容...'); - const data = fs.readFileSync(this.config.discoveryResultPath, 'utf-8'); - - console.log(' 🔄 正在解析JSON数据...'); - this.discoveryData = JSON.parse(data); - - // 输出数据统计 - const controllers = Object.keys(this.discoveryData.controllers || {}).length; - const services = Object.keys(this.discoveryData.services || {}).length; - const models = Object.keys(this.discoveryData.models || {}).length; - - console.log(` 📊 数据统计: 控制器${controllers}个, 服务${services}个, 模型${models}个`); - console.log(' ✅ 成功加载PHP文件发现结果'); - } catch (error) { - console.error(' ❌ 加载发现数据失败:', error.message); - throw error; - } - } - - /** - * 创建完整模块结构 - */ - async createCompleteModuleStructure() { - console.log(' 🏗️ 开始创建模块结构...'); - - // 获取所有模块 - const modules = new Set(); - - // 从控制器中提取模块 - const controllerModules = Object.keys(this.discoveryData.controllers || {}); - console.log(` 📁 从控制器提取到 ${controllerModules.length} 个模块:`, controllerModules.slice(0, 5).join(', ') + (controllerModules.length > 5 ? '...' : '')); - - for (const [moduleName, controllers] of Object.entries(this.discoveryData.controllers)) { - console.log(` 🔨 创建控制器模块: ${moduleName}`); - modules.add(moduleName); - } - - // 从服务中提取模块 - const serviceModules = []; - for (const [layerName, services] of Object.entries(this.discoveryData.services)) { - for (const [serviceName, serviceInfo] of Object.entries(services)) { - const moduleName = this.extractModuleNameFromServicePath(serviceInfo.filePath); - if (!modules.has(moduleName)) { - serviceModules.push(moduleName); - console.log(` 🔨 创建服务模块: ${moduleName}`); - } - modules.add(moduleName); - } - } - console.log(` 📁 从服务提取到 ${serviceModules.length} 个新模块:`, serviceModules.slice(0, 5).join(', ') + (serviceModules.length > 5 ? '...' : '')); - - // 从模型中提取模块 - const modelModules = []; - for (const [moduleName, models] of Object.entries(this.discoveryData.models)) { - if (!modules.has(moduleName)) { - modelModules.push(moduleName); - console.log(` 🔨 创建模型模块: ${moduleName}`); - } - modules.add(moduleName); - } - console.log(` 📁 从模型提取到 ${modelModules.length} 个新模块:`, modelModules.slice(0, 5).join(', ') + (modelModules.length > 5 ? '...' : '')); - - // 创建每个模块的目录结构 - console.log(` 📂 开始创建 ${modules.size} 个模块的目录结构...`); - let processedCount = 0; - - for (const moduleName of modules) { - processedCount++; - console.log(` 📁 [${processedCount}/${modules.size}] 创建模块目录: ${moduleName}`); - await this.createModuleStructure(moduleName); - } - - console.log(' ✅ 模块结构创建完成'); - } - - /** - * 创建模块结构 - 基于PHP实际存在的层级 - */ - async createModuleStructure(moduleName) { - const modulePath = path.join(this.config.nestjsBasePath, moduleName); - - // 创建模块目录 - if (!fs.existsSync(modulePath)) { - fs.mkdirSync(modulePath, { recursive: true }); - } - - // 检查PHP实际存在的层级,只创建对应的目录 - const phpLayers = this.getPHPLayersForModule(moduleName); - - for (const layer of phpLayers) { - const fullPath = path.join(modulePath, layer); - if (!fs.existsSync(fullPath)) { - fs.mkdirSync(fullPath, { recursive: true }); - } - } - } - - /** - * 获取模块在PHP中实际存在的层级 - */ - getPHPLayersForModule(moduleName) { - const layers = []; - - // 检查控制器层级 - if (this.hasPHPControllers(moduleName)) { - layers.push('controllers'); - if (this.hasPHPAdminControllers(moduleName)) { - layers.push('controllers/adminapi'); - } - if (this.hasPHPApiControllers(moduleName)) { - layers.push('controllers/api'); - } - } - - // 检查服务层级 - if (this.hasPHPServices(moduleName)) { - layers.push('services'); - if (this.hasPHPAdminServices(moduleName)) { - layers.push('services/admin'); - } - if (this.hasPHPApiServices(moduleName)) { - layers.push('services/api'); - } - if (this.hasPHPCoreServices(moduleName)) { - layers.push('services/core'); - } - } - - // 检查实体层级 - if (this.hasPHPModels(moduleName)) { - layers.push('entity'); - } - - // 检查验证器层级 - if (this.hasPHPValidators(moduleName)) { - layers.push('dto'); - if (this.hasPHPAdminValidators(moduleName)) { - layers.push('dto/admin'); - } - if (this.hasPHPApiValidators(moduleName)) { - layers.push('dto/api'); - } - } - - return layers; - } - - /** - * 智能分类:判断模块应该迁移到Core层还是跳过 - */ - classifyModule(moduleName, phpFilePath) { - const BusinessLogicConverter = require('./generators/business-logic-converter'); - const businessLogicConverter = new BusinessLogicConverter(); - const className = path.basename(phpFilePath, '.php'); - - // 读取文件内容用于智能分析 - let content = ''; - try { - content = fs.readFileSync(phpFilePath, 'utf-8'); - } catch (error) { - console.warn(`⚠️ 无法读取文件 ${phpFilePath}: ${error.message}`); - content = ''; - } - - const classification = businessLogicConverter.classifyFile(phpFilePath, className, content); - - return { - moduleName, - classification, // 'CORE_BUSINESS' | 'INFRASTRUCTURE' - shouldMigrate: classification === 'CORE_BUSINESS', - skipReason: classification === 'INFRASTRUCTURE' ? '属于基础设施,使用Common层服务' : null - }; - } - - /** - * 检查模块是否有PHP控制器 - */ - hasPHPControllers(moduleName) { - const adminPath = path.join(this.config.phpBasePath, 'app/adminapi/controller', moduleName); - const apiPath = path.join(this.config.phpBasePath, 'app/api/controller', moduleName); - return fs.existsSync(adminPath) || fs.existsSync(apiPath); - } - - /** - * 检查模块是否有PHP管理端控制器 - */ - hasPHPAdminControllers(moduleName) { - const adminPath = path.join(this.config.phpBasePath, 'app/adminapi/controller', moduleName); - return fs.existsSync(adminPath); - } - - /** - * 检查模块是否有PHP前台控制器 - */ - hasPHPApiControllers(moduleName) { - const apiPath = path.join(this.config.phpBasePath, 'app/api/controller', moduleName); - return fs.existsSync(apiPath); - } - - /** - * 检查模块是否有PHP服务 - */ - hasPHPServices(moduleName) { - const adminPath = path.join(this.config.phpBasePath, 'app/service/admin', moduleName); - const apiPath = path.join(this.config.phpBasePath, 'app/service/api', moduleName); - const corePath = path.join(this.config.phpBasePath, 'app/service/core', moduleName); - return fs.existsSync(adminPath) || fs.existsSync(apiPath) || fs.existsSync(corePath); - } - - /** - * 检查模块是否有PHP管理端服务 - */ - hasPHPAdminServices(moduleName) { - const adminPath = path.join(this.config.phpBasePath, 'app/service/admin', moduleName); - return fs.existsSync(adminPath); - } - - /** - * 检查模块是否有PHP前台服务 - */ - hasPHPApiServices(moduleName) { - const apiPath = path.join(this.config.phpBasePath, 'app/service/api', moduleName); - return fs.existsSync(apiPath); - } - - /** - * 检查模块是否有PHP核心服务 - */ - hasPHPCoreServices(moduleName) { - const corePath = path.join(this.config.phpBasePath, 'app/service/core', moduleName); - return fs.existsSync(corePath); - } - - /** - * 检查模块是否有PHP模型 - */ - hasPHPModels(moduleName) { - const modelPath = path.join(this.config.phpBasePath, 'app/model', moduleName); - return fs.existsSync(modelPath); - } - - /** - * 检查模块是否有PHP验证器 - */ - hasPHPValidators(moduleName) { - const adminPath = path.join(this.config.phpBasePath, 'app/adminapi/validate', moduleName); - const apiPath = path.join(this.config.phpBasePath, 'app/api/validate', moduleName); - return fs.existsSync(adminPath) || fs.existsSync(apiPath); - } - - /** - * 检查模块是否有PHP管理端验证器 - */ - hasPHPAdminValidators(moduleName) { - const adminPath = path.join(this.config.phpBasePath, 'app/adminapi/validate', moduleName); - return fs.existsSync(adminPath); - } - - /** - * 检查模块是否有PHP前台验证器 - */ - hasPHPApiValidators(moduleName) { - const apiPath = path.join(this.config.phpBasePath, 'app/api/validate', moduleName); - return fs.existsSync(apiPath); - } - - /** - * 智能分类生成控制器文件 - */ - async generateControllersWithClassification() { - console.log('🔍 开始智能分类分析...'); - - const classificationResults = []; - const modulesToMigrate = []; - - // 分析所有模块 - for (const moduleName in this.discoveryData.controllers) { - const controllers = this.discoveryData.controllers[moduleName]; - - for (const controllerName in controllers) { - const controllerInfo = controllers[controllerName]; - const classification = this.classifyModule(moduleName, controllerInfo.filePath); - - classificationResults.push({ - file: controllerInfo.filePath, - module: moduleName, - controller: controllerName, - classification: classification.classification, - shouldMigrate: classification.shouldMigrate, - skipReason: classification.skipReason - }); - - if (classification.shouldMigrate) { - modulesToMigrate.push(moduleName); - } - } - } - - // 生成分类报告 - console.log('\n📋 智能分类结果:'); - console.log('='.repeat(80)); - - const businessModules = classificationResults.filter(r => r.classification === 'CORE_BUSINESS'); - const infrastructureModules = classificationResults.filter(r => r.classification === 'INFRASTRUCTURE'); - - console.log(`✅ 业务模块 (需要迁移到Core层): ${businessModules.length}个`); - businessModules.forEach(r => console.log(` - ${r.module}/${r.controller}`)); - - console.log(`⚠️ 基础设施模块 (使用Common层): ${infrastructureModules.length}个`); - infrastructureModules.forEach(r => console.log(` - ${r.module}/${r.controller} (${r.skipReason})`)); - - console.log('\n🚀 开始生成业务模块...'); - - // 只迁移业务模块 - const uniqueModules = [...new Set(modulesToMigrate)]; - for (const moduleName of uniqueModules) { - console.log(`📁 生成模块: ${moduleName}`); - await this.generateControllersForModule(moduleName); - } - - console.log('✅ 智能分类控制器生成完成!'); - return { classificationResults, businessModules, infrastructureModules }; - } - - /** - * 为指定模块生成控制器 - */ - async generateControllersForModule(moduleName) { - if (!this.hasPHPControllers(moduleName)) return; - - const controllerGenerator = new ControllerGenerator(); - await controllerGenerator.run(); - this.stats.generatedControllers++; - } - - /** - * 生成控制器 - */ - async generateControllers() { - const controllerGenerator = new ControllerGenerator(); - await controllerGenerator.run(); - } - - /** - * 生成服务 - */ - async generateServices() { - const serviceGenerator = new ServiceGenerator(); - await serviceGenerator.run(); - } - - /** - * 生成实体 - */ - async generateEntities() { - console.log(' 🔨 生成实体文件...'); - - let processedCount = 0; - - for (const [moduleName, models] of Object.entries(this.discoveryData.models)) { - console.log(` 📁 处理模块: ${moduleName}, 模型数量: ${Object.keys(models).length}`); - - for (const [modelName, modelInfo] of Object.entries(models)) { - console.log(` 📊 处理模型: ${modelName}`); - - try { - await this.createEntity(moduleName, modelName, modelInfo); - processedCount++; - console.log(` ✅ 成功创建实体: ${moduleName}/${modelName}`); - } catch (error) { - console.error(` ❌ 创建实体失败 ${moduleName}/${modelName}:`, error.message); - this.stats.errors++; - } - } - } - - console.log(` ✅ 创建了 ${processedCount} 个实体`); - } - - /** - * 创建实体 - */ - async createEntity(moduleName, modelName, modelInfo) { - const entityPath = path.join( - this.config.nestjsBasePath, - moduleName, - 'entity', - `${this.toKebabCase(modelName)}.entity.ts` - ); - - // 确保目录存在 - const entityDir = path.dirname(entityPath); - if (!this.config.dryRun && !fs.existsSync(entityDir)) { - fs.mkdirSync(entityDir, { recursive: true }); - } - - // 生成实体内容 - const entityContent = this.generateEntityContent(moduleName, modelName, modelInfo); - - // 写入文件 - if (!this.config.dryRun) fs.writeFileSync(entityPath, entityContent); - console.log(` ✅ 创建实体: ${moduleName}/${this.toKebabCase(modelName)}.entity.ts`); - } - - /** - * 转换为kebab-case - */ - toKebabCase(str) { - return String(str) - .replace(/([a-z0-9])([A-Z])/g, '$1-$2') - .replace(/_/g, '-') - .toLowerCase(); - } - - /** - * 生成实体内容 - */ - generateEntityContent(moduleName, modelName, modelInfo) { - const className = this.toPascalCase(modelName); - - return `import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn } from 'typeorm'; - -@Entity('${this.toSnakeCase(modelName)}') -export class ${className} { - @PrimaryGeneratedColumn() - id: number; - - @Column({ type: 'varchar', length: 255, nullable: true }) - name: string; - - @Column({ type: 'text', nullable: true }) - description: string; - - @CreateDateColumn() - createdAt: Date; - - @UpdateDateColumn() - updatedAt: Date; -} -`; - } - - /** - * 生成验证器 - */ - async generateValidators() { - const validatorGenerator = new ValidatorGenerator(); - await validatorGenerator.run(); - } - - /** - * 生成中间件 - */ - async generateMiddlewares() { - // const middlewareGenerator = new MiddlewareGenerator(); // 已废弃,使用Core层Guards+Interceptors+Pipes - // await middlewareGenerator.run(); - } - - /** - * 生成路由 - */ - async generateRoutes() { - const routeGenerator = new RouteGenerator(); - await routeGenerator.run(); - } - - /** - * 生成任务 - */ - async generateJobs() { - const jobGenerator = new JobGenerator(); - await jobGenerator.run(); - } - - /** - * 生成监听器 - */ - async generateListeners() { - const listenerGenerator = new ListenerGenerator(); - await listenerGenerator.run(); - } - - /** - * 生成命令 - */ - async generateCommands() { - // const commandGenerator = new CommandGenerator(); // 文件不存在,暂时跳过 - // await commandGenerator.run(); - console.log(' ⏭️ 跳过命令生成 (文件不存在)'); - } - - /** - * 生成特征 - 已废弃 - * 原因:PHP项目只有2个Trait文件,NestJS不支持Trait概念 - * 应改用 Injectable Service 模式 - */ - async generateTraits() { - console.log(' ⏭️ 跳过特征生成 (已废弃:建议使用 Injectable Service)'); - } - - /** - * 生成字典 - */ - async generateDicts() { - const dictGenerator = new DictGenerator(); - await dictGenerator.run(); - } - - /** - * 生成模块文件 - */ - async generateModuleFiles() { - console.log(' 🔨 生成模块文件...'); - - // 获取所有模块 - const modules = new Set(); - - // 从发现数据中提取模块名 - if (this.discoveryData && this.discoveryData.modules) { - Object.keys(this.discoveryData.modules).forEach(moduleName => { - modules.add(moduleName); - }); - } - - // 从控制器中提取模块名 - if (this.discoveryData && this.discoveryData.controllers) { - Object.keys(this.discoveryData.controllers).forEach(controllerPath => { - const pathParts = controllerPath.split('/'); - if (pathParts.length > 0) { - modules.add(pathParts[0]); - } - }); - } - - // 从服务中提取模块名 - if (this.discoveryData && this.discoveryData.services) { - Object.keys(this.discoveryData.services).forEach(servicePath => { - const pathParts = servicePath.split('/'); - if (pathParts.length > 0) { - modules.add(pathParts[0]); - } - }); - } - - const moduleArray = Array.from(modules); - - for (const moduleName of moduleArray) { - await this.createModuleFile(moduleName); - } - - console.log(' ✅ 模块文件生成完成'); - } - - /** - * 创建模块文件 - */ - async createModuleFile(moduleName) { - const moduleDir = path.join(this.config.nestjsBasePath, moduleName); - const modulePath = path.join(moduleDir, `${moduleName}.module.ts`); - - // 确保目录存在 - if (!fs.existsSync(moduleDir)) { - fs.mkdirSync(moduleDir, { recursive: true }); - } - - const content = this.generateModuleContent(moduleName); - fs.writeFileSync(modulePath, content); - console.log(` ✅ 创建模块: ${moduleName}/${moduleName}.module.ts`); - } - - /** - * 生成模块内容 - */ - generateModuleContent(moduleName) { - const className = `${this.toPascalCase(moduleName)}Module`; - - return `import { Module } from '@nestjs/common'; - -@Module({ - imports: [], - controllers: [], - providers: [], - exports: [], -}) -export class ${className} {} -`; - } - - /** - * 从服务路径提取模块名 - */ - extractModuleNameFromServicePath(filePath) { - const pathParts = filePath.split('/'); - const serviceIndex = pathParts.findIndex(part => part === 'service'); - - if (serviceIndex > 0) { - return pathParts[serviceIndex - 1]; - } - - const fileName = path.basename(filePath, '.php'); - if (fileName.includes('Service')) { - return fileName.replace('Service', '').toLowerCase(); - } - - return 'unknown'; - } - - /** - * 转换为驼峰命名 - */ - toCamelCase(str) { - return str.replace(/(?:^\w|[A-Z]|\b\w)/g, (word, index) => { - return index === 0 ? word.toLowerCase() : word.toUpperCase(); - }).replace(/\s+/g, ''); - } - - /** - * 转换为帕斯卡命名 - 处理连字符 - */ - toPascalCase(str) { - return str.replace(/(^|-)([a-z])/g, (match, p1, p2) => p2.toUpperCase()); - } - - /** - * 转换为蛇形命名 - */ - toSnakeCase(str) { - return str.replace(/([A-Z])/g, '_$1').toLowerCase().replace(/^_/, ''); - } - - /** - * 运行 Quality Gate 质量检查 - */ - async runQualityGate() { - try { - const qualityGate = new QualityGate(path.dirname(this.config.nestjsBasePath)); - const passed = await qualityGate.run(); - - if (passed) { - console.log(' ✅ Quality Gate 通过'); - this.stats.completedSteps++; - } else { - console.log(' ❌ Quality Gate 失败'); - this.stats.failedSteps++; - - // Quality Gate 失败不中断流程,但记录错误 - console.log(' ⚠️ 继续执行,但建议修复质量问题'); - } - } catch (error) { - console.log(` ⚠️ Quality Gate 检查失败: ${error.message}`); - console.log(' ℹ️ 跳过质量检查,继续执行迁移流程'); - this.stats.failedSteps++; - } - } - - /** - * 生成统计报告 - */ - generateStatsReport() { - console.log('\n📊 完整迁移统计报告'); - console.log('='.repeat(50)); - console.log(`✅ 完成步骤: ${this.stats.completedSteps}`); - console.log(`❌ 失败步骤: ${this.stats.failedSteps}`); - console.log(`📈 成功率: ${this.stats.completedSteps > 0 ? ((this.stats.completedSteps - this.stats.failedSteps) / this.stats.completedSteps * 100).toFixed(2) : 0}%`); - console.log(`⏱️ 总耗时: ${this.stats.endTime ? ((this.stats.endTime - this.stats.startTime) / 1000).toFixed(2) : 0}秒`); - } - - /** - * 验证实体生成结果 - */ - async validateEntities() { - try { - const entityFiles = this.findFilesByPattern('**/*.entity.ts'); - console.log(` 📊 验证 ${entityFiles.length} 个实体文件...`); - - let validCount = 0; - let errorCount = 0; - - for (const file of entityFiles) { - try { - const content = fs.readFileSync(file, 'utf8'); - if (content.includes('@Entity') && content.includes('export class')) { - validCount++; - } else { - console.log(` ⚠️ 实体文件格式异常: ${file}`); - errorCount++; - } - } catch (error) { - console.log(` ❌ 实体文件读取失败: ${file} - ${error.message}`); - errorCount++; - } - } - - console.log(` ✅ 实体验证完成: ${validCount}个有效, ${errorCount}个错误`); - return errorCount === 0; - } catch (error) { - console.log(` ❌ 实体验证失败: ${error.message}`); - return false; - } - } - - /** - * 验证服务生成结果 - */ - async validateServices() { - try { - const serviceFiles = this.findFilesByPattern('**/*.service.ts'); - console.log(` 📊 验证 ${serviceFiles.length} 个服务文件...`); - - let validCount = 0; - let errorCount = 0; - - for (const file of serviceFiles) { - try { - const content = fs.readFileSync(file, 'utf8'); - if (content.includes('@Injectable') && content.includes('export class')) { - // 检查是否有语法错误 - if (content.includes(']]') || content.includes('BusinessBusinessException')) { - console.log(` ⚠️ 服务文件有语法错误: ${file}`); - errorCount++; - } else { - validCount++; - } - } else { - console.log(` ⚠️ 服务文件格式异常: ${file}`); - errorCount++; - } - } catch (error) { - console.log(` ❌ 服务文件读取失败: ${file} - ${error.message}`); - errorCount++; - } - } - - console.log(` ✅ 服务验证完成: ${validCount}个有效, ${errorCount}个错误`); - return errorCount === 0; - } catch (error) { - console.log(` ❌ 服务验证失败: ${error.message}`); - return false; - } - } - - /** - * 验证验证器生成结果 - */ - async validateValidators() { - try { - const validatorFiles = this.findFilesByPattern('**/*.validator.ts'); - console.log(` 📊 验证 ${validatorFiles.length} 个验证器文件...`); - - let validCount = 0; - let errorCount = 0; - - for (const file of validatorFiles) { - try { - const content = fs.readFileSync(file, 'utf8'); - if (content.includes('export class') && content.includes('validate')) { - validCount++; - } else { - console.log(` ⚠️ 验证器文件格式异常: ${file}`); - errorCount++; - } - } catch (error) { - console.log(` ❌ 验证器文件读取失败: ${file} - ${error.message}`); - errorCount++; - } - } - - console.log(` ✅ 验证器验证完成: ${validCount}个有效, ${errorCount}个错误`); - return errorCount === 0; - } catch (error) { - console.log(` ❌ 验证器验证失败: ${error.message}`); - return false; - } - } - - /** - * 验证控制器生成结果 - */ - async validateControllers() { - try { - const controllerFiles = this.findFilesByPattern('**/*.controller.ts'); - console.log(` 📊 验证 ${controllerFiles.length} 个控制器文件...`); - - let validCount = 0; - let errorCount = 0; - - for (const file of controllerFiles) { - try { - const content = fs.readFileSync(file, 'utf8'); - if (content.includes('@Controller') && content.includes('export class')) { - validCount++; - } else { - console.log(` ⚠️ 控制器文件格式异常: ${file}`); - errorCount++; - } - } catch (error) { - console.log(` ❌ 控制器文件读取失败: ${file} - ${error.message}`); - errorCount++; - } - } - - console.log(` ✅ 控制器验证完成: ${validCount}个有效, ${errorCount}个错误`); - return errorCount === 0; - } catch (error) { - console.log(` ❌ 控制器验证失败: ${error.message}`); - return false; - } - } - - /** - * 验证路由生成结果 - */ - async validateRoutes() { - try { - const routeFiles = this.findFilesByPattern('**/*.routes.ts'); - console.log(` 📊 验证 ${routeFiles.length} 个路由文件...`); - - let validCount = 0; - let errorCount = 0; - - for (const file of routeFiles) { - try { - const content = fs.readFileSync(file, 'utf8'); - if (content.includes('export') && content.includes('Routes')) { - validCount++; - } else { - console.log(` ⚠️ 路由文件格式异常: ${file}`); - errorCount++; - } - } catch (error) { - console.log(` ❌ 路由文件读取失败: ${file} - ${error.message}`); - errorCount++; - } - } - - console.log(` ✅ 路由验证完成: ${validCount}个有效, ${errorCount}个错误`); - return errorCount === 0; - } catch (error) { - console.log(` ❌ 路由验证失败: ${error.message}`); - return false; - } - } - - /** - * 验证任务生成结果 - */ - async validateJobs() { - try { - const jobFiles = this.findFilesByPattern('**/*.job.ts'); - console.log(` 📊 验证 ${jobFiles.length} 个任务文件...`); - - let validCount = 0; - let errorCount = 0; - - for (const file of jobFiles) { - try { - const content = fs.readFileSync(file, 'utf8'); - if (content.includes('@Processor') && content.includes('export class')) { - validCount++; - } else { - console.log(` ⚠️ 任务文件格式异常: ${file}`); - errorCount++; - } - } catch (error) { - console.log(` ❌ 任务文件读取失败: ${file} - ${error.message}`); - errorCount++; - } - } - - console.log(` ✅ 任务验证完成: ${validCount}个有效, ${errorCount}个错误`); - return errorCount === 0; - } catch (error) { - console.log(` ❌ 任务验证失败: ${error.message}`); - return false; - } - } - - /** - * 验证监听器生成结果 - */ - async validateListeners() { - try { - const listenerFiles = this.findFilesByPattern('**/*.listener.ts'); - console.log(` 📊 验证 ${listenerFiles.length} 个监听器文件...`); - - let validCount = 0; - let errorCount = 0; - - for (const file of listenerFiles) { - try { - const content = fs.readFileSync(file, 'utf8'); - if (content.includes('@OnEvent') && content.includes('export class')) { - validCount++; - } else { - console.log(` ⚠️ 监听器文件格式异常: ${file}`); - errorCount++; - } - } catch (error) { - console.log(` ❌ 监听器文件读取失败: ${file} - ${error.message}`); - errorCount++; - } - } - - console.log(` ✅ 监听器验证完成: ${validCount}个有效, ${errorCount}个错误`); - return errorCount === 0; - } catch (error) { - console.log(` ❌ 监听器验证失败: ${error.message}`); - return false; - } - } - - /** - * 验证命令生成结果 - */ - async validateCommands() { - try { - const commandFiles = this.findFilesByPattern('**/*.command.ts'); - console.log(` 📊 验证 ${commandFiles.length} 个命令文件...`); - - let validCount = 0; - let errorCount = 0; - - for (const file of commandFiles) { - try { - const content = fs.readFileSync(file, 'utf8'); - if (content.includes('@Command') && content.includes('export class')) { - validCount++; - } else { - console.log(` ⚠️ 命令文件格式异常: ${file}`); - errorCount++; - } - } catch (error) { - console.log(` ❌ 命令文件读取失败: ${file} - ${error.message}`); - errorCount++; - } - } - - console.log(` ✅ 命令验证完成: ${validCount}个有效, ${errorCount}个错误`); - return errorCount === 0; - } catch (error) { - console.log(` ❌ 命令验证失败: ${error.message}`); - return false; - } - } - - /** - * 验证字典生成结果 - */ - async validateDicts() { - try { - const dictFiles = this.findFilesByPattern('**/*.enum.ts'); - console.log(` 📊 验证 ${dictFiles.length} 个字典文件...`); - - let validCount = 0; - let errorCount = 0; - - for (const file of dictFiles) { - try { - const content = fs.readFileSync(file, 'utf8'); - if (content.includes('export enum') || content.includes('export const')) { - validCount++; - } else { - console.log(` ⚠️ 字典文件格式异常: ${file}`); - errorCount++; - } - } catch (error) { - console.log(` ❌ 字典文件读取失败: ${file} - ${error.message}`); - errorCount++; - } - } - - console.log(` ✅ 字典验证完成: ${validCount}个有效, ${errorCount}个错误`); - return errorCount === 0; - } catch (error) { - console.log(` ❌ 字典验证失败: ${error.message}`); - return false; - } - } - - /** - * 验证模块文件生成结果 - */ - async validateModuleFiles() { - try { - const moduleFiles = this.findFilesByPattern('**/*.module.ts'); - console.log(` 📊 验证 ${moduleFiles.length} 个模块文件...`); - - let validCount = 0; - let errorCount = 0; - - for (const file of moduleFiles) { - try { - const content = fs.readFileSync(file, 'utf8'); - if (content.includes('@Module') && content.includes('export class')) { - validCount++; - } else { - console.log(` ⚠️ 模块文件格式异常: ${file}`); - errorCount++; - } - } catch (error) { - console.log(` ❌ 模块文件读取失败: ${file} - ${error.message}`); - errorCount++; - } - } - - console.log(` ✅ 模块文件验证完成: ${validCount}个有效, ${errorCount}个错误`); - return errorCount === 0; - } catch (error) { - console.log(` ❌ 模块文件验证失败: ${error.message}`); - return false; - } - } - - /** - * 查找匹配模式的文件 - */ - findFilesByPattern(pattern) { - try { - const glob = require('glob'); - const searchPath = path.join(this.config.nestjsBasePath, pattern); - return glob.sync(searchPath); - } catch (error) { - // 如果glob模块不存在,使用简单的文件系统搜索 - console.log(` ⚠️ glob模块不可用,使用简单文件搜索: ${error.message}`); - return this.findFilesByPatternSimple(pattern); - } - } - - /** - * 简单的文件搜索(当glob不可用时) - */ - findFilesByPatternSimple(pattern) { - const files = []; - const searchDir = this.config.nestjsBasePath; - - if (!fs.existsSync(searchDir)) { - return files; - } - - const walkDir = (dir) => { - const items = fs.readdirSync(dir); - for (const item of items) { - const fullPath = path.join(dir, item); - const stat = fs.statSync(fullPath); - - if (stat.isDirectory()) { - walkDir(fullPath); - } else if (stat.isFile() && item.endsWith('.ts')) { - const relativePath = path.relative(this.config.nestjsBasePath, fullPath); - if (this.matchesPattern(relativePath, pattern)) { - files.push(fullPath); - } - } - } - }; - - walkDir(searchDir); - return files; - } - - /** - * 简单的模式匹配 - */ - matchesPattern(filePath, pattern) { - // 将glob模式转换为简单的字符串匹配 - const simplePattern = pattern - .replace(/\*\*/g, '') - .replace(/\*/g, '') - .replace(/\.ts$/, ''); - - return filePath.includes(simplePattern); - } -} - -// 如果直接运行此文件 -if (require.main === module) { - const coordinator = new MigrationCoordinator(); - coordinator.run().catch(console.error); -} - -module.exports = MigrationCoordinator; diff --git a/tools/php-discovery-result.json b/tools/php-discovery-result.json deleted file mode 100644 index 2b04cccf..00000000 --- a/tools/php-discovery-result.json +++ /dev/null @@ -1,6664 +0,0 @@ -{ - "controllers": { - "sys": { - "Agreement": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/adminapi/controller/sys/Agreement.php", - "className": "Agreement", - "layer": "adminapi", - "moduleName": "sys" - }, - "App": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/adminapi/controller/sys/App.php", - "className": "App", - "layer": "adminapi", - "moduleName": "sys" - }, - "Area": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/adminapi/controller/sys/Area.php", - "className": "Area", - "layer": "adminapi", - "moduleName": "sys" - }, - "Attachment": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/adminapi/controller/sys/Attachment.php", - "className": "Attachment", - "layer": "adminapi", - "moduleName": "sys" - }, - "Channel": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/adminapi/controller/sys/Channel.php", - "className": "Channel", - "layer": "adminapi", - "moduleName": "sys" - }, - "Common": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/adminapi/controller/sys/Common.php", - "className": "Common", - "layer": "adminapi", - "moduleName": "sys" - }, - "Config": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/adminapi/controller/sys/Config.php", - "className": "Config", - "layer": "adminapi", - "moduleName": "sys" - }, - "Export": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/adminapi/controller/sys/Export.php", - "className": "Export", - "layer": "adminapi", - "moduleName": "sys" - }, - "Menu": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/adminapi/controller/sys/Menu.php", - "className": "Menu", - "layer": "adminapi", - "moduleName": "sys" - }, - "Poster": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/adminapi/controller/sys/Poster.php", - "className": "Poster", - "layer": "adminapi", - "moduleName": "sys" - }, - "Printer": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/adminapi/controller/sys/Printer.php", - "className": "Printer", - "layer": "adminapi", - "moduleName": "sys" - }, - "Role": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/adminapi/controller/sys/Role.php", - "className": "Role", - "layer": "adminapi", - "moduleName": "sys" - }, - "Schedule": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/adminapi/controller/sys/Schedule.php", - "className": "Schedule", - "layer": "adminapi", - "moduleName": "sys" - }, - "ScheduleLog": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/adminapi/controller/sys/ScheduleLog.php", - "className": "ScheduleLog", - "layer": "adminapi", - "moduleName": "sys" - }, - "System": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/adminapi/controller/sys/System.php", - "className": "System", - "layer": "adminapi", - "moduleName": "sys" - }, - "Ueditor": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/adminapi/controller/sys/Ueditor.php", - "className": "Ueditor", - "layer": "adminapi", - "moduleName": "sys" - } - }, - "member": { - "Account": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/api/controller/member/Account.php", - "className": "Account", - "layer": "api", - "moduleName": "member" - }, - "Address": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/api/controller/member/Address.php", - "className": "Address", - "layer": "api", - "moduleName": "member" - }, - "CashOut": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/adminapi/controller/member/CashOut.php", - "className": "CashOut", - "layer": "adminapi", - "moduleName": "member" - }, - "Config": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/adminapi/controller/member/Config.php", - "className": "Config", - "layer": "adminapi", - "moduleName": "member" - }, - "Member": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/api/controller/member/Member.php", - "className": "Member", - "layer": "api", - "moduleName": "member" - }, - "MemberLabel": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/adminapi/controller/member/MemberLabel.php", - "className": "MemberLabel", - "layer": "adminapi", - "moduleName": "member" - }, - "MemberLevel": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/adminapi/controller/member/MemberLevel.php", - "className": "MemberLevel", - "layer": "adminapi", - "moduleName": "member" - }, - "MemberSign": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/api/controller/member/MemberSign.php", - "className": "MemberSign", - "layer": "api", - "moduleName": "member" - }, - "CashOutAccount": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/api/controller/member/CashOutAccount.php", - "className": "CashOutAccount", - "layer": "api", - "moduleName": "member" - }, - "Level": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/api/controller/member/Level.php", - "className": "Level", - "layer": "api", - "moduleName": "member" - }, - "MemberCashOut": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/api/controller/member/MemberCashOut.php", - "className": "MemberCashOut", - "layer": "api", - "moduleName": "member" - } - }, - "pay": { - "Pay": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/api/controller/pay/Pay.php", - "className": "Pay", - "layer": "api", - "moduleName": "pay" - }, - "PayChannel": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/adminapi/controller/pay/PayChannel.php", - "className": "PayChannel", - "layer": "adminapi", - "moduleName": "pay" - }, - "PayRefund": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/adminapi/controller/pay/PayRefund.php", - "className": "PayRefund", - "layer": "adminapi", - "moduleName": "pay" - }, - "Transfer": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/api/controller/pay/Transfer.php", - "className": "Transfer", - "layer": "api", - "moduleName": "pay" - } - }, - "upload": { - "Storage": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/adminapi/controller/upload/Storage.php", - "className": "Storage", - "layer": "adminapi", - "moduleName": "upload" - }, - "Upload": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/api/controller/upload/Upload.php", - "className": "Upload", - "layer": "api", - "moduleName": "upload" - } - }, - "login": { - "Captcha": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/adminapi/controller/login/Captcha.php", - "className": "Captcha", - "layer": "adminapi", - "moduleName": "login" - }, - "Config": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/api/controller/login/Config.php", - "className": "Config", - "layer": "api", - "moduleName": "login" - }, - "Login": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/api/controller/login/Login.php", - "className": "Login", - "layer": "api", - "moduleName": "login" - }, - "Register": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/api/controller/login/Register.php", - "className": "Register", - "layer": "api", - "moduleName": "login" - } - }, - "wechat": { - "Config": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/adminapi/controller/wechat/Config.php", - "className": "Config", - "layer": "adminapi", - "moduleName": "wechat" - }, - "Media": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/adminapi/controller/wechat/Media.php", - "className": "Media", - "layer": "adminapi", - "moduleName": "wechat" - }, - "Menu": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/adminapi/controller/wechat/Menu.php", - "className": "Menu", - "layer": "adminapi", - "moduleName": "wechat" - }, - "Reply": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/adminapi/controller/wechat/Reply.php", - "className": "Reply", - "layer": "adminapi", - "moduleName": "wechat" - }, - "Template": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/adminapi/controller/wechat/Template.php", - "className": "Template", - "layer": "adminapi", - "moduleName": "wechat" - }, - "Serve": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/api/controller/wechat/Serve.php", - "className": "Serve", - "layer": "api", - "moduleName": "wechat" - }, - "Wechat": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/api/controller/wechat/Wechat.php", - "className": "Wechat", - "layer": "api", - "moduleName": "wechat" - } - }, - "weapp": { - "Config": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/adminapi/controller/weapp/Config.php", - "className": "Config", - "layer": "adminapi", - "moduleName": "weapp" - }, - "Delivery": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/adminapi/controller/weapp/Delivery.php", - "className": "Delivery", - "layer": "adminapi", - "moduleName": "weapp" - }, - "Package": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/adminapi/controller/weapp/Package.php", - "className": "Package", - "layer": "adminapi", - "moduleName": "weapp" - }, - "Template": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/adminapi/controller/weapp/Template.php", - "className": "Template", - "layer": "adminapi", - "moduleName": "weapp" - }, - "Version": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/adminapi/controller/weapp/Version.php", - "className": "Version", - "layer": "adminapi", - "moduleName": "weapp" - }, - "Serve": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/api/controller/weapp/Serve.php", - "className": "Serve", - "layer": "api", - "moduleName": "weapp" - }, - "Weapp": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/api/controller/weapp/Weapp.php", - "className": "Weapp", - "layer": "api", - "moduleName": "weapp" - } - }, - "diy": { - "Config": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/adminapi/controller/diy/Config.php", - "className": "Config", - "layer": "adminapi", - "moduleName": "diy" - }, - "Diy": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/api/controller/diy/Diy.php", - "className": "Diy", - "layer": "api", - "moduleName": "diy" - }, - "DiyForm": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/api/controller/diy/DiyForm.php", - "className": "DiyForm", - "layer": "api", - "moduleName": "diy" - }, - "DiyRoute": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/adminapi/controller/diy/DiyRoute.php", - "className": "DiyRoute", - "layer": "adminapi", - "moduleName": "diy" - } - }, - "poster": { - "Poster": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/api/controller/poster/Poster.php", - "className": "Poster", - "layer": "api", - "moduleName": "poster" - } - }, - "addon": { - "Addon": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/api/controller/addon/Addon.php", - "className": "Addon", - "layer": "api", - "moduleName": "addon" - }, - "AddonDevelop": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/adminapi/controller/addon/AddonDevelop.php", - "className": "AddonDevelop", - "layer": "adminapi", - "moduleName": "addon" - }, - "App": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/adminapi/controller/addon/App.php", - "className": "App", - "layer": "adminapi", - "moduleName": "addon" - }, - "Backup": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/adminapi/controller/addon/Backup.php", - "className": "Backup", - "layer": "adminapi", - "moduleName": "addon" - }, - "Upgrade": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/adminapi/controller/addon/Upgrade.php", - "className": "Upgrade", - "layer": "adminapi", - "moduleName": "addon" - } - }, - "aliapp": { - "Config": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/adminapi/controller/aliapp/Config.php", - "className": "Config", - "layer": "adminapi", - "moduleName": "aliapp" - } - }, - "auth": { - "Auth": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/adminapi/controller/auth/Auth.php", - "className": "Auth", - "layer": "adminapi", - "moduleName": "auth" - } - }, - "generator": { - "Generator": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/adminapi/controller/generator/Generator.php", - "className": "Generator", - "layer": "adminapi", - "moduleName": "generator" - } - }, - "applet": { - "SiteVersion": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/adminapi/controller/applet/SiteVersion.php", - "className": "SiteVersion", - "layer": "adminapi", - "moduleName": "applet" - }, - "Version": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/adminapi/controller/applet/Version.php", - "className": "Version", - "layer": "adminapi", - "moduleName": "applet" - }, - "VersionDownload": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/adminapi/controller/applet/VersionDownload.php", - "className": "VersionDownload", - "layer": "adminapi", - "moduleName": "applet" - } - }, - "channel": { - "App": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/adminapi/controller/channel/App.php", - "className": "App", - "layer": "adminapi", - "moduleName": "channel" - }, - "H5": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/adminapi/controller/channel/H5.php", - "className": "H5", - "layer": "adminapi", - "moduleName": "channel" - }, - "Pc": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/adminapi/controller/channel/Pc.php", - "className": "Pc", - "layer": "adminapi", - "moduleName": "channel" - } - }, - "dict": { - "Dict": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/adminapi/controller/dict/Dict.php", - "className": "Dict", - "layer": "adminapi", - "moduleName": "dict" - } - }, - "home": { - "Site": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/adminapi/controller/home/Site.php", - "className": "Site", - "layer": "adminapi", - "moduleName": "home" - } - }, - "index": { - "PromotionAdv": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/adminapi/controller/index/PromotionAdv.php", - "className": "PromotionAdv", - "layer": "adminapi", - "moduleName": "index" - } - }, - "niucloud": { - "Cloud": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/adminapi/controller/niucloud/Cloud.php", - "className": "Cloud", - "layer": "adminapi", - "moduleName": "niucloud" - }, - "Module": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/adminapi/controller/niucloud/Module.php", - "className": "Module", - "layer": "adminapi", - "moduleName": "niucloud" - } - }, - "notice": { - "NiuSms": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/adminapi/controller/notice/NiuSms.php", - "className": "NiuSms", - "layer": "adminapi", - "moduleName": "notice" - }, - "Notice": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/adminapi/controller/notice/Notice.php", - "className": "Notice", - "layer": "adminapi", - "moduleName": "notice" - }, - "NoticeLog": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/adminapi/controller/notice/NoticeLog.php", - "className": "NoticeLog", - "layer": "adminapi", - "moduleName": "notice" - }, - "SmsLog": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/adminapi/controller/notice/SmsLog.php", - "className": "SmsLog", - "layer": "adminapi", - "moduleName": "notice" - } - }, - "site": { - "Site": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/adminapi/controller/site/Site.php", - "className": "Site", - "layer": "adminapi", - "moduleName": "site" - }, - "SiteAccount": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/adminapi/controller/site/SiteAccount.php", - "className": "SiteAccount", - "layer": "adminapi", - "moduleName": "site" - }, - "SiteGroup": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/adminapi/controller/site/SiteGroup.php", - "className": "SiteGroup", - "layer": "adminapi", - "moduleName": "site" - }, - "User": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/adminapi/controller/site/User.php", - "className": "User", - "layer": "adminapi", - "moduleName": "site" - }, - "UserLog": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/adminapi/controller/site/UserLog.php", - "className": "UserLog", - "layer": "adminapi", - "moduleName": "site" - } - }, - "stat": { - "SiteStat": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/adminapi/controller/stat/SiteStat.php", - "className": "SiteStat", - "layer": "adminapi", - "moduleName": "stat" - }, - "Stat": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/adminapi/controller/stat/Stat.php", - "className": "Stat", - "layer": "adminapi", - "moduleName": "stat" - } - }, - "user": { - "User": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/adminapi/controller/user/User.php", - "className": "User", - "layer": "adminapi", - "moduleName": "user" - } - }, - "verify": { - "Verifier": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/adminapi/controller/verify/Verifier.php", - "className": "Verifier", - "layer": "adminapi", - "moduleName": "verify" - }, - "Verify": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/adminapi/controller/verify/Verify.php", - "className": "Verify", - "layer": "adminapi", - "moduleName": "verify" - } - }, - "wxoplatform": { - "Config": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/adminapi/controller/wxoplatform/Config.php", - "className": "Config", - "layer": "adminapi", - "moduleName": "wxoplatform" - }, - "Oplatform": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/adminapi/controller/wxoplatform/Oplatform.php", - "className": "Oplatform", - "layer": "adminapi", - "moduleName": "wxoplatform" - }, - "Server": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/adminapi/controller/wxoplatform/Server.php", - "className": "Server", - "layer": "adminapi", - "moduleName": "wxoplatform" - }, - "WeappVersion": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/adminapi/controller/wxoplatform/WeappVersion.php", - "className": "WeappVersion", - "layer": "adminapi", - "moduleName": "wxoplatform" - } - }, - "agreement": { - "Agreement": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/api/controller/agreement/Agreement.php", - "className": "Agreement", - "layer": "api", - "moduleName": "agreement" - } - } - }, - "services": { - "sys": { - "AgreementService_admin": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/admin/sys/AgreementService.php", - "className": "AgreementService", - "layer": "admin", - "moduleName": "sys" - }, - "AppService_admin": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/admin/sys/AppService.php", - "className": "AppService", - "layer": "admin", - "moduleName": "sys" - }, - "AreaService_admin": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/admin/sys/AreaService.php", - "className": "AreaService", - "layer": "admin", - "moduleName": "sys" - }, - "AttachmentService_admin": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/admin/sys/AttachmentService.php", - "className": "AttachmentService", - "layer": "admin", - "moduleName": "sys" - }, - "ConfigService_admin": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/admin/sys/ConfigService.php", - "className": "ConfigService", - "layer": "admin", - "moduleName": "sys" - }, - "ExportService_admin": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/admin/sys/ExportService.php", - "className": "ExportService", - "layer": "admin", - "moduleName": "sys" - }, - "MenuService_admin": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/admin/sys/MenuService.php", - "className": "MenuService", - "layer": "admin", - "moduleName": "sys" - }, - "PosterService_admin": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/admin/sys/PosterService.php", - "className": "PosterService", - "layer": "admin", - "moduleName": "sys" - }, - "PrinterService_admin": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/admin/sys/PrinterService.php", - "className": "PrinterService", - "layer": "admin", - "moduleName": "sys" - }, - "PrinterTemplateService_admin": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/admin/sys/PrinterTemplateService.php", - "className": "PrinterTemplateService", - "layer": "admin", - "moduleName": "sys" - }, - "RoleService_admin": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/admin/sys/RoleService.php", - "className": "RoleService", - "layer": "admin", - "moduleName": "sys" - }, - "SystemService_admin": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/admin/sys/SystemService.php", - "className": "SystemService", - "layer": "admin", - "moduleName": "sys" - }, - "CoreAgreementService_core": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/core/sys/CoreAgreementService.php", - "className": "CoreAgreementService", - "layer": "core", - "moduleName": "sys" - }, - "CoreAreaService_core": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/core/sys/CoreAreaService.php", - "className": "CoreAreaService", - "layer": "core", - "moduleName": "sys" - }, - "CoreAttachmentService_core": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/core/sys/CoreAttachmentService.php", - "className": "CoreAttachmentService", - "layer": "core", - "moduleName": "sys" - }, - "CoreConfigService_core": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/core/sys/CoreConfigService.php", - "className": "CoreConfigService", - "layer": "core", - "moduleName": "sys" - }, - "CoreExportService_core": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/core/sys/CoreExportService.php", - "className": "CoreExportService", - "layer": "core", - "moduleName": "sys" - }, - "CoreSysConfigService_core": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/core/sys/CoreSysConfigService.php", - "className": "CoreSysConfigService", - "layer": "core", - "moduleName": "sys" - } - }, - "member": { - "AddressService_admin": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/admin/member/AddressService.php", - "className": "AddressService", - "layer": "admin", - "moduleName": "member" - }, - "MemberAccountService_admin": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/admin/member/MemberAccountService.php", - "className": "MemberAccountService", - "layer": "admin", - "moduleName": "member" - }, - "MemberCashOutService_admin": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/admin/member/MemberCashOutService.php", - "className": "MemberCashOutService", - "layer": "admin", - "moduleName": "member" - }, - "MemberConfigService_admin": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/admin/member/MemberConfigService.php", - "className": "MemberConfigService", - "layer": "admin", - "moduleName": "member" - }, - "MemberLabelService_admin": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/admin/member/MemberLabelService.php", - "className": "MemberLabelService", - "layer": "admin", - "moduleName": "member" - }, - "MemberLevelService_admin": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/admin/member/MemberLevelService.php", - "className": "MemberLevelService", - "layer": "admin", - "moduleName": "member" - }, - "MemberService_admin": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/admin/member/MemberService.php", - "className": "MemberService", - "layer": "admin", - "moduleName": "member" - }, - "MemberSignService_admin": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/admin/member/MemberSignService.php", - "className": "MemberSignService", - "layer": "admin", - "moduleName": "member" - }, - "AddressService_api": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/api/member/AddressService.php", - "className": "AddressService", - "layer": "api", - "moduleName": "member" - }, - "MemberAccountService_api": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/api/member/MemberAccountService.php", - "className": "MemberAccountService", - "layer": "api", - "moduleName": "member" - }, - "MemberCashOutAccountService_api": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/api/member/MemberCashOutAccountService.php", - "className": "MemberCashOutAccountService", - "layer": "api", - "moduleName": "member" - }, - "MemberCashOutService_api": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/api/member/MemberCashOutService.php", - "className": "MemberCashOutService", - "layer": "api", - "moduleName": "member" - }, - "MemberConfigService_api": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/api/member/MemberConfigService.php", - "className": "MemberConfigService", - "layer": "api", - "moduleName": "member" - }, - "MemberLevelService_api": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/api/member/MemberLevelService.php", - "className": "MemberLevelService", - "layer": "api", - "moduleName": "member" - }, - "MemberLogService_api": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/api/member/MemberLogService.php", - "className": "MemberLogService", - "layer": "api", - "moduleName": "member" - }, - "MemberService_api": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/api/member/MemberService.php", - "className": "MemberService", - "layer": "api", - "moduleName": "member" - }, - "MemberSignService_api": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/api/member/MemberSignService.php", - "className": "MemberSignService", - "layer": "api", - "moduleName": "member" - }, - "CoreMemberAccountService_core": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/core/member/CoreMemberAccountService.php", - "className": "CoreMemberAccountService", - "layer": "core", - "moduleName": "member" - }, - "CoreMemberAddressService_core": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/core/member/CoreMemberAddressService.php", - "className": "CoreMemberAddressService", - "layer": "core", - "moduleName": "member" - }, - "CoreMemberCashOutAccountService_core": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/core/member/CoreMemberCashOutAccountService.php", - "className": "CoreMemberCashOutAccountService", - "layer": "core", - "moduleName": "member" - }, - "CoreMemberCashOutService_core": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/core/member/CoreMemberCashOutService.php", - "className": "CoreMemberCashOutService", - "layer": "core", - "moduleName": "member" - }, - "CoreMemberConfigService_core": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/core/member/CoreMemberConfigService.php", - "className": "CoreMemberConfigService", - "layer": "core", - "moduleName": "member" - }, - "CoreMemberLabelService_core": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/core/member/CoreMemberLabelService.php", - "className": "CoreMemberLabelService", - "layer": "core", - "moduleName": "member" - }, - "CoreMemberLevelService_core": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/core/member/CoreMemberLevelService.php", - "className": "CoreMemberLevelService", - "layer": "core", - "moduleName": "member" - }, - "CoreMemberService_core": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/core/member/CoreMemberService.php", - "className": "CoreMemberService", - "layer": "core", - "moduleName": "member" - } - }, - "pay": { - "PayChannelService_admin": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/admin/pay/PayChannelService.php", - "className": "PayChannelService", - "layer": "admin", - "moduleName": "pay" - }, - "PayService_admin": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/admin/pay/PayService.php", - "className": "PayService", - "layer": "admin", - "moduleName": "pay" - }, - "RefundService_admin": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/admin/pay/RefundService.php", - "className": "RefundService", - "layer": "admin", - "moduleName": "pay" - }, - "TransferService_admin": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/admin/pay/TransferService.php", - "className": "TransferService", - "layer": "admin", - "moduleName": "pay" - }, - "PayService_api": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/api/pay/PayService.php", - "className": "PayService", - "layer": "api", - "moduleName": "pay" - }, - "TransferService_api": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/api/pay/TransferService.php", - "className": "TransferService", - "layer": "api", - "moduleName": "pay" - }, - "CorePayChannelService_core": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/core/pay/CorePayChannelService.php", - "className": "CorePayChannelService", - "layer": "core", - "moduleName": "pay" - }, - "CorePayEventService_core": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/core/pay/CorePayEventService.php", - "className": "CorePayEventService", - "layer": "core", - "moduleName": "pay" - }, - "CorePayService_core": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/core/pay/CorePayService.php", - "className": "CorePayService", - "layer": "core", - "moduleName": "pay" - }, - "CoreRefundService_core": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/core/pay/CoreRefundService.php", - "className": "CoreRefundService", - "layer": "core", - "moduleName": "pay" - }, - "CoreTransferSceneService_core": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/core/pay/CoreTransferSceneService.php", - "className": "CoreTransferSceneService", - "layer": "core", - "moduleName": "pay" - }, - "CoreTransferService_core": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/core/pay/CoreTransferService.php", - "className": "CoreTransferService", - "layer": "core", - "moduleName": "pay" - } - }, - "upload": { - "StorageConfigService_admin": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/admin/upload/StorageConfigService.php", - "className": "StorageConfigService", - "layer": "admin", - "moduleName": "upload" - }, - "UploadConfigService_admin": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/admin/upload/UploadConfigService.php", - "className": "UploadConfigService", - "layer": "admin", - "moduleName": "upload" - }, - "UploadService_admin": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/admin/upload/UploadService.php", - "className": "UploadService", - "layer": "admin", - "moduleName": "upload" - }, - "Base64Service_api": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/api/upload/Base64Service.php", - "className": "Base64Service", - "layer": "api", - "moduleName": "upload" - }, - "FetchService_api": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/api/upload/FetchService.php", - "className": "FetchService", - "layer": "api", - "moduleName": "upload" - }, - "UploadService_api": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/api/upload/UploadService.php", - "className": "UploadService", - "layer": "api", - "moduleName": "upload" - }, - "CoreBase64Service_core": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/core/upload/CoreBase64Service.php", - "className": "CoreBase64Service", - "layer": "core", - "moduleName": "upload" - }, - "CoreFetchService_core": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/core/upload/CoreFetchService.php", - "className": "CoreFetchService", - "layer": "core", - "moduleName": "upload" - }, - "CoreFileService_core": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/core/upload/CoreFileService.php", - "className": "CoreFileService", - "layer": "core", - "moduleName": "upload" - }, - "CoreImageService_core": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/core/upload/CoreImageService.php", - "className": "CoreImageService", - "layer": "core", - "moduleName": "upload" - }, - "CoreStorageService_core": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/core/upload/CoreStorageService.php", - "className": "CoreStorageService", - "layer": "core", - "moduleName": "upload" - }, - "CoreUploadConfigService_core": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/core/upload/CoreUploadConfigService.php", - "className": "CoreUploadConfigService", - "layer": "core", - "moduleName": "upload" - }, - "CoreUploadService_core": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/core/upload/CoreUploadService.php", - "className": "CoreUploadService", - "layer": "core", - "moduleName": "upload" - } - }, - "wechat": { - "WechatConfigService_admin": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/admin/wechat/WechatConfigService.php", - "className": "WechatConfigService", - "layer": "admin", - "moduleName": "wechat" - }, - "WechatEventService_admin": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/admin/wechat/WechatEventService.php", - "className": "WechatEventService", - "layer": "admin", - "moduleName": "wechat" - }, - "WechatFansService_admin": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/admin/wechat/WechatFansService.php", - "className": "WechatFansService", - "layer": "admin", - "moduleName": "wechat" - }, - "WechatMediaService_admin": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/admin/wechat/WechatMediaService.php", - "className": "WechatMediaService", - "layer": "admin", - "moduleName": "wechat" - }, - "WechatMenuService_admin": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/admin/wechat/WechatMenuService.php", - "className": "WechatMenuService", - "layer": "admin", - "moduleName": "wechat" - }, - "WechatReplyService_admin": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/admin/wechat/WechatReplyService.php", - "className": "WechatReplyService", - "layer": "admin", - "moduleName": "wechat" - }, - "WechatTemplateService_admin": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/admin/wechat/WechatTemplateService.php", - "className": "WechatTemplateService", - "layer": "admin", - "moduleName": "wechat" - }, - "WechatAppService_api": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/api/wechat/WechatAppService.php", - "className": "WechatAppService", - "layer": "api", - "moduleName": "wechat" - }, - "WechatAuthService_api": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/api/wechat/WechatAuthService.php", - "className": "WechatAuthService", - "layer": "api", - "moduleName": "wechat" - }, - "WechatServeService_api": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/api/wechat/WechatServeService.php", - "className": "WechatServeService", - "layer": "api", - "moduleName": "wechat" - }, - "CoreWechatApiService_core": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/core/wechat/CoreWechatApiService.php", - "className": "CoreWechatApiService", - "layer": "core", - "moduleName": "wechat" - }, - "CoreWechatAppService_core": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/core/wechat/CoreWechatAppService.php", - "className": "CoreWechatAppService", - "layer": "core", - "moduleName": "wechat" - }, - "CoreWechatConfigService_core": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/core/wechat/CoreWechatConfigService.php", - "className": "CoreWechatConfigService", - "layer": "core", - "moduleName": "wechat" - }, - "CoreWechatFansService_core": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/core/wechat/CoreWechatFansService.php", - "className": "CoreWechatFansService", - "layer": "core", - "moduleName": "wechat" - }, - "CoreWechatMediaService_core": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/core/wechat/CoreWechatMediaService.php", - "className": "CoreWechatMediaService", - "layer": "core", - "moduleName": "wechat" - }, - "CoreWechatMessageService_core": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/core/wechat/CoreWechatMessageService.php", - "className": "CoreWechatMessageService", - "layer": "core", - "moduleName": "wechat" - }, - "CoreWechatReplyService_core": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/core/wechat/CoreWechatReplyService.php", - "className": "CoreWechatReplyService", - "layer": "core", - "moduleName": "wechat" - }, - "CoreWechatServeService_core": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/core/wechat/CoreWechatServeService.php", - "className": "CoreWechatServeService", - "layer": "core", - "moduleName": "wechat" - }, - "CoreWechatService_core": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/core/wechat/CoreWechatService.php", - "className": "CoreWechatService", - "layer": "core", - "moduleName": "wechat" - }, - "CoreWechatTemplateService_core": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/core/wechat/CoreWechatTemplateService.php", - "className": "CoreWechatTemplateService", - "layer": "core", - "moduleName": "wechat" - } - }, - "weapp": { - "WeappConfigService_admin": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/admin/weapp/WeappConfigService.php", - "className": "WeappConfigService", - "layer": "admin", - "moduleName": "weapp" - }, - "WeappDeliveryService_admin": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/admin/weapp/WeappDeliveryService.php", - "className": "WeappDeliveryService", - "layer": "admin", - "moduleName": "weapp" - }, - "WeappPackageService_admin": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/admin/weapp/WeappPackageService.php", - "className": "WeappPackageService", - "layer": "admin", - "moduleName": "weapp" - }, - "WeappTemplateService_admin": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/admin/weapp/WeappTemplateService.php", - "className": "WeappTemplateService", - "layer": "admin", - "moduleName": "weapp" - }, - "WeappVersionService_admin": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/admin/weapp/WeappVersionService.php", - "className": "WeappVersionService", - "layer": "admin", - "moduleName": "weapp" - }, - "WeappAuthService_api": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/api/weapp/WeappAuthService.php", - "className": "WeappAuthService", - "layer": "api", - "moduleName": "weapp" - }, - "WeappDeliveryService_api": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/api/weapp/WeappDeliveryService.php", - "className": "WeappDeliveryService", - "layer": "api", - "moduleName": "weapp" - }, - "WeappServeService_api": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/api/weapp/WeappServeService.php", - "className": "WeappServeService", - "layer": "api", - "moduleName": "weapp" - }, - "CoreWeappAuthService_core": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/core/weapp/CoreWeappAuthService.php", - "className": "CoreWeappAuthService", - "layer": "core", - "moduleName": "weapp" - }, - "CoreWeappCloudService_core": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/core/weapp/CoreWeappCloudService.php", - "className": "CoreWeappCloudService", - "layer": "core", - "moduleName": "weapp" - }, - "CoreWeappConfigService_core": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/core/weapp/CoreWeappConfigService.php", - "className": "CoreWeappConfigService", - "layer": "core", - "moduleName": "weapp" - }, - "CoreWeappDeliveryService_core": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/core/weapp/CoreWeappDeliveryService.php", - "className": "CoreWeappDeliveryService", - "layer": "core", - "moduleName": "weapp" - }, - "CoreWeappServeService_core": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/core/weapp/CoreWeappServeService.php", - "className": "CoreWeappServeService", - "layer": "core", - "moduleName": "weapp" - }, - "CoreWeappService_core": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/core/weapp/CoreWeappService.php", - "className": "CoreWeappService", - "layer": "core", - "moduleName": "weapp" - }, - "CoreWeappTemplateService_core": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/core/weapp/CoreWeappTemplateService.php", - "className": "CoreWeappTemplateService", - "layer": "core", - "moduleName": "weapp" - } - }, - "diy": { - "DiyConfigService_admin": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/admin/diy/DiyConfigService.php", - "className": "DiyConfigService", - "layer": "admin", - "moduleName": "diy" - }, - "DiyRouteService_admin": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/admin/diy/DiyRouteService.php", - "className": "DiyRouteService", - "layer": "admin", - "moduleName": "diy" - }, - "DiyService_admin": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/admin/diy/DiyService.php", - "className": "DiyService", - "layer": "admin", - "moduleName": "diy" - }, - "DiyConfigService_api": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/api/diy/DiyConfigService.php", - "className": "DiyConfigService", - "layer": "api", - "moduleName": "diy" - }, - "DiyRouteService_api": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/api/diy/DiyRouteService.php", - "className": "DiyRouteService", - "layer": "api", - "moduleName": "diy" - }, - "DiyService_api": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/api/diy/DiyService.php", - "className": "DiyService", - "layer": "api", - "moduleName": "diy" - }, - "CoreDiyConfigService_core": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/core/diy/CoreDiyConfigService.php", - "className": "CoreDiyConfigService", - "layer": "core", - "moduleName": "diy" - }, - "CoreDiyService_core": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/core/diy/CoreDiyService.php", - "className": "CoreDiyService", - "layer": "core", - "moduleName": "diy" - } - }, - "addon": { - "AddonDevelopService_admin": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/admin/addon/AddonDevelopService.php", - "className": "AddonDevelopService", - "layer": "admin", - "moduleName": "addon" - }, - "AddonService_admin": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/admin/addon/AddonService.php", - "className": "AddonService", - "layer": "admin", - "moduleName": "addon" - }, - "AddonService_api": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/api/addon/AddonService.php", - "className": "AddonService", - "layer": "api", - "moduleName": "addon" - }, - "CoreAddonBaseService_core": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/core/addon/CoreAddonBaseService.php", - "className": "CoreAddonBaseService", - "layer": "core", - "moduleName": "addon" - }, - "CoreAddonCloudService_core": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/core/addon/CoreAddonCloudService.php", - "className": "CoreAddonCloudService", - "layer": "core", - "moduleName": "addon" - }, - "CoreAddonDevelopBuildService_core": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/core/addon/CoreAddonDevelopBuildService.php", - "className": "CoreAddonDevelopBuildService", - "layer": "core", - "moduleName": "addon" - }, - "CoreAddonDevelopDownloadService_core": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/core/addon/CoreAddonDevelopDownloadService.php", - "className": "CoreAddonDevelopDownloadService", - "layer": "core", - "moduleName": "addon" - }, - "CoreAddonDevelopService_core": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/core/addon/CoreAddonDevelopService.php", - "className": "CoreAddonDevelopService", - "layer": "core", - "moduleName": "addon" - }, - "CoreAddonDownloadService_core": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/core/addon/CoreAddonDownloadService.php", - "className": "CoreAddonDownloadService", - "layer": "core", - "moduleName": "addon" - }, - "CoreAddonInstallService_core": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/core/addon/CoreAddonInstallService.php", - "className": "CoreAddonInstallService", - "layer": "core", - "moduleName": "addon" - }, - "CoreAddonLogService_core": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/core/addon/CoreAddonLogService.php", - "className": "CoreAddonLogService", - "layer": "core", - "moduleName": "addon" - }, - "CoreAddonService_core": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/core/addon/CoreAddonService.php", - "className": "CoreAddonService", - "layer": "core", - "moduleName": "addon" - }, - "CoreDependService_core": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/core/addon/CoreDependService.php", - "className": "CoreDependService", - "layer": "core", - "moduleName": "addon" - }, - "WapTrait_core": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/core/addon/WapTrait.php", - "className": "WapTrait", - "layer": "core", - "moduleName": "addon" - } - }, - "aliapp": { - "AliappConfigService_admin": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/admin/aliapp/AliappConfigService.php", - "className": "AliappConfigService", - "layer": "admin", - "moduleName": "aliapp" - }, - "CoreAliappConfigService_core": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/core/aliapp/CoreAliappConfigService.php", - "className": "CoreAliappConfigService", - "layer": "core", - "moduleName": "aliapp" - } - }, - "auth": { - "AuthService_admin": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/admin/auth/AuthService.php", - "className": "AuthService", - "layer": "admin", - "moduleName": "auth" - }, - "AuthSiteService_admin": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/admin/auth/AuthSiteService.php", - "className": "AuthSiteService", - "layer": "admin", - "moduleName": "auth" - }, - "ConfigService_admin": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/admin/auth/ConfigService.php", - "className": "ConfigService", - "layer": "admin", - "moduleName": "auth" - }, - "LoginService_admin": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/admin/auth/LoginService.php", - "className": "LoginService", - "layer": "admin", - "moduleName": "auth" - } - }, - "captcha": { - "CaptchaService_admin": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/admin/captcha/CaptchaService.php", - "className": "CaptchaService", - "layer": "admin", - "moduleName": "captcha" - }, - "CaptchaService_api": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/api/captcha/CaptchaService.php", - "className": "CaptchaService", - "layer": "api", - "moduleName": "captcha" - }, - "CoreCaptchaImgService_core": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/core/captcha/CoreCaptchaImgService.php", - "className": "CoreCaptchaImgService", - "layer": "core", - "moduleName": "captcha" - }, - "CoreCaptchaService_core": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/core/captcha/CoreCaptchaService.php", - "className": "CoreCaptchaService", - "layer": "core", - "moduleName": "captcha" - } - }, - "generator": { - "Generate_admin": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/admin/generator/Generate.php", - "className": "Generate", - "layer": "admin", - "moduleName": "generator" - }, - "GenerateService_admin": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/admin/generator/GenerateService.php", - "className": "GenerateService", - "layer": "admin", - "moduleName": "generator" - } - }, - "applet": { - "AppletDownloadService_admin": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/admin/applet/AppletDownloadService.php", - "className": "AppletDownloadService", - "layer": "admin", - "moduleName": "applet" - }, - "AppletVersionService_admin": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/admin/applet/AppletVersionService.php", - "className": "AppletVersionService", - "layer": "admin", - "moduleName": "applet" - }, - "AppletVersionSiteService_admin": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/admin/applet/AppletVersionSiteService.php", - "className": "AppletVersionSiteService", - "layer": "admin", - "moduleName": "applet" - }, - "CoreAppletDownloadService_core": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/core/applet/CoreAppletDownloadService.php", - "className": "CoreAppletDownloadService", - "layer": "core", - "moduleName": "applet" - }, - "CoreAppletSiteVersionService_core": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/core/applet/CoreAppletSiteVersionService.php", - "className": "CoreAppletSiteVersionService", - "layer": "core", - "moduleName": "applet" - }, - "CoreAppletVersionService_core": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/core/applet/CoreAppletVersionService.php", - "className": "CoreAppletVersionService", - "layer": "core", - "moduleName": "applet" - } - }, - "channel": { - "AppService_admin": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/admin/channel/AppService.php", - "className": "AppService", - "layer": "admin", - "moduleName": "channel" - }, - "H5Service_admin": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/admin/channel/H5Service.php", - "className": "H5Service", - "layer": "admin", - "moduleName": "channel" - }, - "PcService_admin": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/admin/channel/PcService.php", - "className": "PcService", - "layer": "admin", - "moduleName": "channel" - }, - "CoreAppCloudService_core": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/core/channel/CoreAppCloudService.php", - "className": "CoreAppCloudService", - "layer": "core", - "moduleName": "channel" - }, - "CoreAppService_core": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/core/channel/CoreAppService.php", - "className": "CoreAppService", - "layer": "core", - "moduleName": "channel" - }, - "CoreH5Service_core": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/core/channel/CoreH5Service.php", - "className": "CoreH5Service", - "layer": "core", - "moduleName": "channel" - }, - "CorePcService_core": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/core/channel/CorePcService.php", - "className": "CorePcService", - "layer": "core", - "moduleName": "channel" - } - }, - "dict": { - "DictService_admin": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/admin/dict/DictService.php", - "className": "DictService", - "layer": "admin", - "moduleName": "dict" - } - }, - "home": { - "AuthSiteService_admin": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/admin/home/AuthSiteService.php", - "className": "AuthSiteService", - "layer": "admin", - "moduleName": "home" - } - }, - "niucloud": { - "NiucloudService_admin": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/admin/niucloud/NiucloudService.php", - "className": "NiucloudService", - "layer": "admin", - "moduleName": "niucloud" - }, - "CoreAuthService_core": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/core/niucloud/CoreAuthService.php", - "className": "CoreAuthService", - "layer": "core", - "moduleName": "niucloud" - }, - "CoreCloudBaseService_core": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/core/niucloud/CoreCloudBaseService.php", - "className": "CoreCloudBaseService", - "layer": "core", - "moduleName": "niucloud" - }, - "CoreCloudBuildService_core": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/core/niucloud/CoreCloudBuildService.php", - "className": "CoreCloudBuildService", - "layer": "core", - "moduleName": "niucloud" - }, - "CoreModuleService_core": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/core/niucloud/CoreModuleService.php", - "className": "CoreModuleService", - "layer": "core", - "moduleName": "niucloud" - }, - "CoreNiucloudConfigService_core": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/core/niucloud/CoreNiucloudConfigService.php", - "className": "CoreNiucloudConfigService", - "layer": "core", - "moduleName": "niucloud" - }, - "CoreNotifyService_core": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/core/niucloud/CoreNotifyService.php", - "className": "CoreNotifyService", - "layer": "core", - "moduleName": "niucloud" - } - }, - "notice": { - "NiuSmsService_admin": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/admin/notice/NiuSmsService.php", - "className": "NiuSmsService", - "layer": "admin", - "moduleName": "notice" - }, - "NoticeLogService_admin": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/admin/notice/NoticeLogService.php", - "className": "NoticeLogService", - "layer": "admin", - "moduleName": "notice" - }, - "NoticeService_admin": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/admin/notice/NoticeService.php", - "className": "NoticeService", - "layer": "admin", - "moduleName": "notice" - }, - "NoticeSmsLogService_admin": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/admin/notice/NoticeSmsLogService.php", - "className": "NoticeSmsLogService", - "layer": "admin", - "moduleName": "notice" - }, - "SmsService_admin": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/admin/notice/SmsService.php", - "className": "SmsService", - "layer": "admin", - "moduleName": "notice" - }, - "CoreNiuSmsService_core": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/core/notice/CoreNiuSmsService.php", - "className": "CoreNiuSmsService", - "layer": "core", - "moduleName": "notice" - }, - "CoreNoticeLogService_core": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/core/notice/CoreNoticeLogService.php", - "className": "CoreNoticeLogService", - "layer": "core", - "moduleName": "notice" - }, - "CoreNoticeService_core": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/core/notice/CoreNoticeService.php", - "className": "CoreNoticeService", - "layer": "core", - "moduleName": "notice" - }, - "CoreNoticeSmsLogService_core": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/core/notice/CoreNoticeSmsLogService.php", - "className": "CoreNoticeSmsLogService", - "layer": "core", - "moduleName": "notice" - }, - "CoreSmsService_core": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/core/notice/CoreSmsService.php", - "className": "CoreSmsService", - "layer": "core", - "moduleName": "notice" - }, - "NoticeService_core": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/core/notice/NoticeService.php", - "className": "NoticeService", - "layer": "core", - "moduleName": "notice" - } - }, - "site": { - "SiteAccountLogService_admin": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/admin/site/SiteAccountLogService.php", - "className": "SiteAccountLogService", - "layer": "admin", - "moduleName": "site" - }, - "SiteGroupService_admin": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/admin/site/SiteGroupService.php", - "className": "SiteGroupService", - "layer": "admin", - "moduleName": "site" - }, - "SiteService_admin": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/admin/site/SiteService.php", - "className": "SiteService", - "layer": "admin", - "moduleName": "site" - }, - "SiteUserService_admin": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/admin/site/SiteUserService.php", - "className": "SiteUserService", - "layer": "admin", - "moduleName": "site" - }, - "UserLogService_admin": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/admin/site/UserLogService.php", - "className": "UserLogService", - "layer": "admin", - "moduleName": "site" - }, - "CoreSiteAccountService_core": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/core/site/CoreSiteAccountService.php", - "className": "CoreSiteAccountService", - "layer": "core", - "moduleName": "site" - }, - "CoreSiteService_core": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/core/site/CoreSiteService.php", - "className": "CoreSiteService", - "layer": "core", - "moduleName": "site" - } - }, - "stat": { - "SiteStatService_admin": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/admin/stat/SiteStatService.php", - "className": "SiteStatService", - "layer": "admin", - "moduleName": "stat" - }, - "StatService_admin": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/admin/stat/StatService.php", - "className": "StatService", - "layer": "admin", - "moduleName": "stat" - }, - "CoreStatService_core": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/core/stat/CoreStatService.php", - "className": "CoreStatService", - "layer": "core", - "moduleName": "stat" - } - }, - "user": { - "UserRoleService_admin": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/admin/user/UserRoleService.php", - "className": "UserRoleService", - "layer": "admin", - "moduleName": "user" - }, - "UserService_admin": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/admin/user/UserService.php", - "className": "UserService", - "layer": "admin", - "moduleName": "user" - } - }, - "verify": { - "VerifierService_admin": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/admin/verify/VerifierService.php", - "className": "VerifierService", - "layer": "admin", - "moduleName": "verify" - }, - "VerifyService_admin": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/admin/verify/VerifyService.php", - "className": "VerifyService", - "layer": "admin", - "moduleName": "verify" - }, - "CoreVerifyService_core": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/core/verify/CoreVerifyService.php", - "className": "CoreVerifyService", - "layer": "core", - "moduleName": "verify" - } - }, - "upgrade": { - "BackupRecordsService_admin": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/admin/upgrade/BackupRecordsService.php", - "className": "BackupRecordsService", - "layer": "admin", - "moduleName": "upgrade" - }, - "BackupService_admin": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/admin/upgrade/BackupService.php", - "className": "BackupService", - "layer": "admin", - "moduleName": "upgrade" - }, - "ExecuteSqlTrait_admin": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/admin/upgrade/ExecuteSqlTrait.php", - "className": "ExecuteSqlTrait", - "layer": "admin", - "moduleName": "upgrade" - }, - "RestoreService_admin": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/admin/upgrade/RestoreService.php", - "className": "RestoreService", - "layer": "admin", - "moduleName": "upgrade" - }, - "UpgradeRecordsService_admin": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/admin/upgrade/UpgradeRecordsService.php", - "className": "UpgradeRecordsService", - "layer": "admin", - "moduleName": "upgrade" - }, - "UpgradeService_admin": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/admin/upgrade/UpgradeService.php", - "className": "UpgradeService", - "layer": "admin", - "moduleName": "upgrade" - } - }, - "wxoplatform": { - "OplatformConfigService_admin": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/admin/wxoplatform/OplatformConfigService.php", - "className": "OplatformConfigService", - "layer": "admin", - "moduleName": "wxoplatform" - }, - "OplatformServerService_admin": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/admin/wxoplatform/OplatformServerService.php", - "className": "OplatformServerService", - "layer": "admin", - "moduleName": "wxoplatform" - }, - "OplatformService_admin": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/admin/wxoplatform/OplatformService.php", - "className": "OplatformService", - "layer": "admin", - "moduleName": "wxoplatform" - }, - "WeappVersionService_admin": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/admin/wxoplatform/WeappVersionService.php", - "className": "WeappVersionService", - "layer": "admin", - "moduleName": "wxoplatform" - }, - "CoreOplatformConfigService_core": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/core/wxoplatform/CoreOplatformConfigService.php", - "className": "CoreOplatformConfigService", - "layer": "core", - "moduleName": "wxoplatform" - }, - "CoreOplatformService_core": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/core/wxoplatform/CoreOplatformService.php", - "className": "CoreOplatformService", - "layer": "core", - "moduleName": "wxoplatform" - } - }, - "login": { - "AuthService_api": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/api/login/AuthService.php", - "className": "AuthService", - "layer": "api", - "moduleName": "login" - }, - "ConfigService_api": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/api/login/ConfigService.php", - "className": "ConfigService", - "layer": "api", - "moduleName": "login" - }, - "LoginService_api": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/api/login/LoginService.php", - "className": "LoginService", - "layer": "api", - "moduleName": "login" - }, - "RegisterService_api": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/api/login/RegisterService.php", - "className": "RegisterService", - "layer": "api", - "moduleName": "login" - } - }, - "agreement": { - "AgreementService_api": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/api/agreement/AgreementService.php", - "className": "AgreementService", - "layer": "api", - "moduleName": "agreement" - } - }, - "poster": { - "CorePosterService_core": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/core/poster/CorePosterService.php", - "className": "CorePosterService", - "layer": "core", - "moduleName": "poster" - } - }, - "index": { - "CorePromotionAdvService_core": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/core/index/CorePromotionAdvService.php", - "className": "CorePromotionAdvService", - "layer": "core", - "moduleName": "index" - } - } - }, - "models": { - "addon": { - "Addon": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/model/addon/Addon.php", - "className": "Addon", - "moduleName": "addon" - }, - "AddonLog": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/model/addon/AddonLog.php", - "className": "AddonLog", - "moduleName": "addon" - } - }, - "applet": { - "AppletSiteVersion": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/model/applet/AppletSiteVersion.php", - "className": "AppletSiteVersion", - "moduleName": "applet" - }, - "AppletVersion": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/model/applet/AppletVersion.php", - "className": "AppletVersion", - "moduleName": "applet" - } - }, - "dict": { - "Dict": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/model/dict/Dict.php", - "className": "Dict", - "moduleName": "dict" - } - }, - "diy": { - "Diy": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/model/diy/Diy.php", - "className": "Diy", - "moduleName": "diy" - }, - "DiyRoute": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/model/diy/DiyRoute.php", - "className": "DiyRoute", - "moduleName": "diy" - }, - "DiyTheme": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/model/diy/DiyTheme.php", - "className": "DiyTheme", - "moduleName": "diy" - } - }, - "diy_form": { - "DiyForm": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/model/diy_form/DiyForm.php", - "className": "DiyForm", - "moduleName": "diy_form" - }, - "DiyFormFields": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/model/diy_form/DiyFormFields.php", - "className": "DiyFormFields", - "moduleName": "diy_form" - }, - "DiyFormRecords": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/model/diy_form/DiyFormRecords.php", - "className": "DiyFormRecords", - "moduleName": "diy_form" - }, - "DiyFormRecordsFields": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/model/diy_form/DiyFormRecordsFields.php", - "className": "DiyFormRecordsFields", - "moduleName": "diy_form" - }, - "DiyFormSubmitConfig": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/model/diy_form/DiyFormSubmitConfig.php", - "className": "DiyFormSubmitConfig", - "moduleName": "diy_form" - }, - "DiyFormWriteConfig": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/model/diy_form/DiyFormWriteConfig.php", - "className": "DiyFormWriteConfig", - "moduleName": "diy_form" - } - }, - "generator": { - "GenerateColumn": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/model/generator/GenerateColumn.php", - "className": "GenerateColumn", - "moduleName": "generator" - }, - "GenerateTable": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/model/generator/GenerateTable.php", - "className": "GenerateTable", - "moduleName": "generator" - } - }, - "member": { - "Member": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/model/member/Member.php", - "className": "Member", - "moduleName": "member" - }, - "MemberAccountLog": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/model/member/MemberAccountLog.php", - "className": "MemberAccountLog", - "moduleName": "member" - }, - "MemberAddress": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/model/member/MemberAddress.php", - "className": "MemberAddress", - "moduleName": "member" - }, - "MemberCashOut": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/model/member/MemberCashOut.php", - "className": "MemberCashOut", - "moduleName": "member" - }, - "MemberCashOutAccount": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/model/member/MemberCashOutAccount.php", - "className": "MemberCashOutAccount", - "moduleName": "member" - }, - "MemberLabel": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/model/member/MemberLabel.php", - "className": "MemberLabel", - "moduleName": "member" - }, - "MemberLevel": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/model/member/MemberLevel.php", - "className": "MemberLevel", - "moduleName": "member" - }, - "MemberSign": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/model/member/MemberSign.php", - "className": "MemberSign", - "moduleName": "member" - } - }, - "pay": { - "Pay": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/model/pay/Pay.php", - "className": "Pay", - "moduleName": "pay" - }, - "PayChannel": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/model/pay/PayChannel.php", - "className": "PayChannel", - "moduleName": "pay" - }, - "Refund": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/model/pay/Refund.php", - "className": "Refund", - "moduleName": "pay" - }, - "Transfer": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/model/pay/Transfer.php", - "className": "Transfer", - "moduleName": "pay" - }, - "TransferScene": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/model/pay/TransferScene.php", - "className": "TransferScene", - "moduleName": "pay" - } - }, - "site": { - "Site": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/model/site/Site.php", - "className": "Site", - "moduleName": "site" - }, - "SiteAccountLog": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/model/site/SiteAccountLog.php", - "className": "SiteAccountLog", - "moduleName": "site" - }, - "SiteGroup": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/model/site/SiteGroup.php", - "className": "SiteGroup", - "moduleName": "site" - } - }, - "stat": { - "StatHour": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/model/stat/StatHour.php", - "className": "StatHour", - "moduleName": "stat" - } - }, - "sys": { - "AppVersion": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/model/sys/AppVersion.php", - "className": "AppVersion", - "moduleName": "sys" - }, - "NiuSmsTemplate": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/model/sys/NiuSmsTemplate.php", - "className": "NiuSmsTemplate", - "moduleName": "sys" - }, - "Poster": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/model/sys/Poster.php", - "className": "Poster", - "moduleName": "sys" - }, - "SysAgreement": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/model/sys/SysAgreement.php", - "className": "SysAgreement", - "moduleName": "sys" - }, - "SysArea": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/model/sys/SysArea.php", - "className": "SysArea", - "moduleName": "sys" - }, - "SysAttachment": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/model/sys/SysAttachment.php", - "className": "SysAttachment", - "moduleName": "sys" - }, - "SysAttachmentCategory": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/model/sys/SysAttachmentCategory.php", - "className": "SysAttachmentCategory", - "moduleName": "sys" - }, - "SysBackupRecords": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/model/sys/SysBackupRecords.php", - "className": "SysBackupRecords", - "moduleName": "sys" - }, - "SysConfig": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/model/sys/SysConfig.php", - "className": "SysConfig", - "moduleName": "sys" - }, - "SysExport": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/model/sys/SysExport.php", - "className": "SysExport", - "moduleName": "sys" - }, - "SysMenu": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/model/sys/SysMenu.php", - "className": "SysMenu", - "moduleName": "sys" - }, - "SysNotice": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/model/sys/SysNotice.php", - "className": "SysNotice", - "moduleName": "sys" - }, - "SysNoticeLog": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/model/sys/SysNoticeLog.php", - "className": "SysNoticeLog", - "moduleName": "sys" - }, - "SysNoticeSmsLog": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/model/sys/SysNoticeSmsLog.php", - "className": "SysNoticeSmsLog", - "moduleName": "sys" - }, - "SysPrinter": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/model/sys/SysPrinter.php", - "className": "SysPrinter", - "moduleName": "sys" - }, - "SysPrinterTemplate": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/model/sys/SysPrinterTemplate.php", - "className": "SysPrinterTemplate", - "moduleName": "sys" - }, - "SysRole": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/model/sys/SysRole.php", - "className": "SysRole", - "moduleName": "sys" - }, - "SysSchedule": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/model/sys/SysSchedule.php", - "className": "SysSchedule", - "moduleName": "sys" - }, - "SysScheduleLog": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/model/sys/SysScheduleLog.php", - "className": "SysScheduleLog", - "moduleName": "sys" - }, - "SysUpgradeRecords": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/model/sys/SysUpgradeRecords.php", - "className": "SysUpgradeRecords", - "moduleName": "sys" - }, - "SysUser": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/model/sys/SysUser.php", - "className": "SysUser", - "moduleName": "sys" - }, - "SysUserLog": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/model/sys/SysUserLog.php", - "className": "SysUserLog", - "moduleName": "sys" - }, - "SysUserRole": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/model/sys/SysUserRole.php", - "className": "SysUserRole", - "moduleName": "sys" - }, - "UserCreateSiteLimit": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/model/sys/UserCreateSiteLimit.php", - "className": "UserCreateSiteLimit", - "moduleName": "sys" - }, - "WxOplatfromWeappVersion": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/model/sys/WxOplatfromWeappVersion.php", - "className": "WxOplatfromWeappVersion", - "moduleName": "sys" - } - }, - "verify": { - "Verifier": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/model/verify/Verifier.php", - "className": "Verifier", - "moduleName": "verify" - }, - "Verify": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/model/verify/Verify.php", - "className": "Verify", - "moduleName": "verify" - } - }, - "weapp": { - "WeappVersion": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/model/weapp/WeappVersion.php", - "className": "WeappVersion", - "moduleName": "weapp" - } - }, - "wechat": { - "WechatFans": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/model/wechat/WechatFans.php", - "className": "WechatFans", - "moduleName": "wechat" - }, - "WechatMedia": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/model/wechat/WechatMedia.php", - "className": "WechatMedia", - "moduleName": "wechat" - }, - "WechatReply": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/model/wechat/WechatReply.php", - "className": "WechatReply", - "moduleName": "wechat" - } - } - }, - "validates": { - "addon": { - "AddonDevelop": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/validate/addon/AddonDevelop.php", - "className": "AddonDevelop", - "moduleName": "addon" - } - }, - "channel": { - "Aliapp": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/validate/channel/Aliapp.php", - "className": "Aliapp", - "moduleName": "channel" - }, - "Weapp": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/validate/channel/Weapp.php", - "className": "Weapp", - "moduleName": "channel" - }, - "Wechat": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/validate/channel/Wechat.php", - "className": "Wechat", - "moduleName": "channel" - } - }, - "diy": { - "Diy": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/validate/diy/Diy.php", - "className": "Diy", - "moduleName": "diy" - }, - "DiyForm": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/validate/diy/DiyForm.php", - "className": "DiyForm", - "moduleName": "diy" - }, - "DiyRoute": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/validate/diy/DiyRoute.php", - "className": "DiyRoute", - "moduleName": "diy" - }, - "DiyTheme": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/validate/diy/DiyTheme.php", - "className": "DiyTheme", - "moduleName": "diy" - } - }, - "generator": { - "Generator": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/validate/generator/Generator.php", - "className": "Generator", - "moduleName": "generator" - } - }, - "member": { - "Address": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/validate/member/Address.php", - "className": "Address", - "moduleName": "member" - }, - "CashOut": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/validate/member/CashOut.php", - "className": "CashOut", - "moduleName": "member" - }, - "CashOutAccount": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/validate/member/CashOutAccount.php", - "className": "CashOutAccount", - "moduleName": "member" - }, - "CashOutConfig": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/validate/member/CashOutConfig.php", - "className": "CashOutConfig", - "moduleName": "member" - }, - "LoginConfig": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/validate/member/LoginConfig.php", - "className": "LoginConfig", - "moduleName": "member" - }, - "Member": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/validate/member/Member.php", - "className": "Member", - "moduleName": "member" - }, - "MemberConfig": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/validate/member/MemberConfig.php", - "className": "MemberConfig", - "moduleName": "member" - }, - "MemberLabel": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/validate/member/MemberLabel.php", - "className": "MemberLabel", - "moduleName": "member" - }, - "MemberLevel": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/validate/member/MemberLevel.php", - "className": "MemberLevel", - "moduleName": "member" - } - }, - "niucloud": { - "Module": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/validate/niucloud/Module.php", - "className": "Module", - "moduleName": "niucloud" - } - }, - "pay": { - "Pay": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/validate/pay/Pay.php", - "className": "Pay", - "moduleName": "pay" - }, - "PayTemplate": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/validate/pay/PayTemplate.php", - "className": "PayTemplate", - "moduleName": "pay" - } - }, - "site": { - "Site": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/validate/site/Site.php", - "className": "Site", - "moduleName": "site" - }, - "SiteGroup": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/validate/site/SiteGroup.php", - "className": "SiteGroup", - "moduleName": "site" - } - }, - "sys": { - "Agreement": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/validate/sys/Agreement.php", - "className": "Agreement", - "moduleName": "sys" - }, - "AttachmentCategory": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/validate/sys/AttachmentCategory.php", - "className": "AttachmentCategory", - "moduleName": "sys" - }, - "Menu": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/validate/sys/Menu.php", - "className": "Menu", - "moduleName": "sys" - }, - "Page": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/validate/sys/Page.php", - "className": "Page", - "moduleName": "sys" - }, - "Printer": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/validate/sys/Printer.php", - "className": "Printer", - "moduleName": "sys" - }, - "PrinterTemplate": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/validate/sys/PrinterTemplate.php", - "className": "PrinterTemplate", - "moduleName": "sys" - }, - "Role": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/validate/sys/Role.php", - "className": "Role", - "moduleName": "sys" - }, - "Schedule": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/validate/sys/Schedule.php", - "className": "Schedule", - "moduleName": "sys" - }, - "User": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/validate/sys/User.php", - "className": "User", - "moduleName": "sys" - } - }, - "lang": { - "enValidate": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/lang/en/validate.php", - "className": "enValidate", - "moduleName": "lang" - }, - "zh-cnValidate": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/lang/zh-cn/validate.php", - "className": "zh-cnValidate", - "moduleName": "lang" - } - } - }, - "middlewares": { - "adminapi": { - "AdminCheckRole": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/adminapi/middleware/AdminCheckRole.php", - "className": "AdminCheckRole", - "layer": "adminapi" - }, - "AdminCheckToken": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/adminapi/middleware/AdminCheckToken.php", - "className": "AdminCheckToken", - "layer": "adminapi" - }, - "AdminLog": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/adminapi/middleware/AdminLog.php", - "className": "AdminLog", - "layer": "adminapi" - }, - "AllowCrossDomain": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/adminapi/middleware/AllowCrossDomain.php", - "className": "AllowCrossDomain", - "layer": "adminapi" - } - }, - "api": { - "AllowCrossDomain": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/api/middleware/AllowCrossDomain.php", - "className": "AllowCrossDomain", - "layer": "api" - }, - "ApiChannel": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/api/middleware/ApiChannel.php", - "className": "ApiChannel", - "layer": "api" - }, - "ApiCheckToken": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/api/middleware/ApiCheckToken.php", - "className": "ApiCheckToken", - "layer": "api" - }, - "ApiLog": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/api/middleware/ApiLog.php", - "className": "ApiLog", - "layer": "api" - } - } - }, - "routes": { - "adminapi": { - "addon": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/adminapi/route/addon.php", - "className": "addon", - "layer": "adminapi" - }, - "aliapp": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/adminapi/route/aliapp.php", - "className": "aliapp", - "layer": "adminapi" - }, - "app": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/adminapi/route/app.php", - "className": "app", - "layer": "adminapi" - }, - "applet": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/adminapi/route/applet.php", - "className": "applet", - "layer": "adminapi" - }, - "auth": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/adminapi/route/auth.php", - "className": "auth", - "layer": "adminapi" - }, - "channel": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/adminapi/route/channel.php", - "className": "channel", - "layer": "adminapi" - }, - "dict": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/adminapi/route/dict.php", - "className": "dict", - "layer": "adminapi" - }, - "diy": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/adminapi/route/diy.php", - "className": "diy", - "layer": "adminapi" - }, - "generator": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/adminapi/route/generator.php", - "className": "generator", - "layer": "adminapi" - }, - "home": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/adminapi/route/home.php", - "className": "home", - "layer": "adminapi" - }, - "index": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/adminapi/route/index.php", - "className": "index", - "layer": "adminapi" - }, - "member": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/adminapi/route/member.php", - "className": "member", - "layer": "adminapi" - }, - "niucloud": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/adminapi/route/niucloud.php", - "className": "niucloud", - "layer": "adminapi" - }, - "notice": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/adminapi/route/notice.php", - "className": "notice", - "layer": "adminapi" - }, - "pay": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/adminapi/route/pay.php", - "className": "pay", - "layer": "adminapi" - }, - "route": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/adminapi/route/route.php", - "className": "route", - "layer": "adminapi" - }, - "site": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/adminapi/route/site.php", - "className": "site", - "layer": "adminapi" - }, - "stat": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/adminapi/route/stat.php", - "className": "stat", - "layer": "adminapi" - }, - "sys": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/adminapi/route/sys.php", - "className": "sys", - "layer": "adminapi" - }, - "upgrade": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/adminapi/route/upgrade.php", - "className": "upgrade", - "layer": "adminapi" - }, - "user": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/adminapi/route/user.php", - "className": "user", - "layer": "adminapi" - }, - "verify": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/adminapi/route/verify.php", - "className": "verify", - "layer": "adminapi" - }, - "weapp": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/adminapi/route/weapp.php", - "className": "weapp", - "layer": "adminapi" - }, - "wechat": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/adminapi/route/wechat.php", - "className": "wechat", - "layer": "adminapi" - }, - "wxoplatform": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/adminapi/route/wxoplatform.php", - "className": "wxoplatform", - "layer": "adminapi" - } - }, - "api": { - "addon": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/api/route/addon.php", - "className": "addon", - "layer": "api" - }, - "auth": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/api/route/auth.php", - "className": "auth", - "layer": "api" - }, - "diy": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/api/route/diy.php", - "className": "diy", - "layer": "api" - }, - "file": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/api/route/file.php", - "className": "file", - "layer": "api" - }, - "member": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/api/route/member.php", - "className": "member", - "layer": "api" - }, - "pay": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/api/route/pay.php", - "className": "pay", - "layer": "api" - }, - "route": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/api/route/route.php", - "className": "route", - "layer": "api" - } - } - }, - "jobs": { - "member": { - "MemberGiftGrantJob": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/job/member/MemberGiftGrantJob.php", - "className": "MemberGiftGrantJob", - "moduleName": "member" - }, - "SetMemberNoJob": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/job/member/SetMemberNoJob.php", - "className": "SetMemberNoJob", - "moduleName": "member" - } - }, - "notice": { - "Notice": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/job/notice/Notice.php", - "className": "Notice", - "moduleName": "notice" - } - }, - "pay": { - "PayReturnTo": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/job/pay/PayReturnTo.php", - "className": "PayReturnTo", - "moduleName": "pay" - } - }, - "schedule": { - "AutoClearPosterAndQrcode": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/job/schedule/AutoClearPosterAndQrcode.php", - "className": "AutoClearPosterAndQrcode", - "moduleName": "schedule" - }, - "AutoClearScheduleLog": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/job/schedule/AutoClearScheduleLog.php", - "className": "AutoClearScheduleLog", - "moduleName": "schedule" - }, - "OrderClose": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/job/schedule/OrderClose.php", - "className": "OrderClose", - "moduleName": "schedule" - }, - "SiteExpireClose": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/job/schedule/SiteExpireClose.php", - "className": "SiteExpireClose", - "moduleName": "schedule" - }, - "SiteStatJob": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/job/schedule/SiteStatJob.php", - "className": "SiteStatJob", - "moduleName": "schedule" - } - }, - "sys": { - "AddonInstall": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/job/sys/AddonInstall.php", - "className": "AddonInstall", - "moduleName": "sys" - }, - "CheckDeleteJob": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/job/sys/CheckDeleteJob.php", - "className": "CheckDeleteJob", - "moduleName": "sys" - }, - "CheckJob": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/job/sys/CheckJob.php", - "className": "CheckJob", - "moduleName": "sys" - }, - "ClearUserLog": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/job/sys/ClearUserLog.php", - "className": "ClearUserLog", - "moduleName": "sys" - }, - "ExportJob": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/job/sys/ExportJob.php", - "className": "ExportJob", - "moduleName": "sys" - } - }, - "transfer": {}, - "upgrade": { - "AutoClearUpgradeRecords": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/job/upgrade/AutoClearUpgradeRecords.php", - "className": "AutoClearUpgradeRecords", - "moduleName": "upgrade" - } - }, - "wxoplatform": { - "GetVersionUploadResult": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/job/wxoplatform/GetVersionUploadResult.php", - "className": "GetVersionUploadResult", - "moduleName": "wxoplatform" - }, - "SiteWeappCommit": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/job/wxoplatform/SiteWeappCommit.php", - "className": "SiteWeappCommit", - "moduleName": "wxoplatform" - }, - "SubmitAudit": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/job/wxoplatform/SubmitAudit.php", - "className": "SubmitAudit", - "moduleName": "wxoplatform" - }, - "VersionUploadSuccess": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/job/wxoplatform/VersionUploadSuccess.php", - "className": "VersionUploadSuccess", - "moduleName": "wxoplatform" - }, - "WeappAuthChangeAfter": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/job/wxoplatform/WeappAuthChangeAfter.php", - "className": "WeappAuthChangeAfter", - "moduleName": "wxoplatform" - }, - "WeappCommit": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/job/wxoplatform/WeappCommit.php", - "className": "WeappCommit", - "moduleName": "wxoplatform" - }, - "WechatAuthChangeAfter": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/job/wxoplatform/WechatAuthChangeAfter.php", - "className": "WechatAuthChangeAfter", - "moduleName": "wxoplatform" - } - } - }, - "listeners": { - "applet": { - "WeappListener": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/listener/applet/WeappListener.php", - "className": "WeappListener", - "moduleName": "applet" - } - }, - "diy": { - "ThemeColorListener": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/listener/diy/ThemeColorListener.php", - "className": "ThemeColorListener", - "moduleName": "diy" - } - }, - "diy_form_export": { - "DiyFormRecordsExportDataListener": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/listener/diy_form_export/DiyFormRecordsExportDataListener.php", - "className": "DiyFormRecordsExportDataListener", - "moduleName": "diy_form_export" - }, - "DiyFormRecordsExportTypeListener": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/listener/diy_form_export/DiyFormRecordsExportTypeListener.php", - "className": "DiyFormRecordsExportTypeListener", - "moduleName": "diy_form_export" - }, - "DiyFormRecordsFieldsExportDataListener": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/listener/diy_form_export/DiyFormRecordsFieldsExportDataListener.php", - "className": "DiyFormRecordsFieldsExportDataListener", - "moduleName": "diy_form_export" - }, - "DiyFormRecordsFieldsExportTypeListener": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/listener/diy_form_export/DiyFormRecordsFieldsExportTypeListener.php", - "className": "DiyFormRecordsFieldsExportTypeListener", - "moduleName": "diy_form_export" - }, - "DiyFormRecordsMemberExportDataListener": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/listener/diy_form_export/DiyFormRecordsMemberExportDataListener.php", - "className": "DiyFormRecordsMemberExportDataListener", - "moduleName": "diy_form_export" - }, - "DiyFormRecordsMemberExportTypeListener": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/listener/diy_form_export/DiyFormRecordsMemberExportTypeListener.php", - "className": "DiyFormRecordsMemberExportTypeListener", - "moduleName": "diy_form_export" - } - }, - "job": { - "QueueFailedLoggerListener": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/listener/job/QueueFailedLoggerListener.php", - "className": "QueueFailedLoggerListener", - "moduleName": "job" - } - }, - "member": { - "MemberAccountListener": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/listener/member/MemberAccountListener.php", - "className": "MemberAccountListener", - "moduleName": "member" - }, - "MemberLoginListener": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/listener/member/MemberLoginListener.php", - "className": "MemberLoginListener", - "moduleName": "member" - }, - "MemberRegisterListener": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/listener/member/MemberRegisterListener.php", - "className": "MemberRegisterListener", - "moduleName": "member" - } - }, - "member_export": { - "MemberExportDataListener": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/listener/member_export/MemberExportDataListener.php", - "className": "MemberExportDataListener", - "moduleName": "member_export" - }, - "MemberExportTypeListener": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/listener/member_export/MemberExportTypeListener.php", - "className": "MemberExportTypeListener", - "moduleName": "member_export" - } - }, - "notice": { - "Sms": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/listener/notice/Sms.php", - "className": "Sms", - "moduleName": "notice" - }, - "Weapp": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/listener/notice/Weapp.php", - "className": "Weapp", - "moduleName": "notice" - }, - "Wechat": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/listener/notice/Wechat.php", - "className": "Wechat", - "moduleName": "notice" - } - }, - "notice_template": { - "BaseNoticeTemplate": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/listener/notice_template/BaseNoticeTemplate.php", - "className": "BaseNoticeTemplate", - "moduleName": "notice_template" - }, - "MemberVerifySuccess": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/listener/notice_template/MemberVerifySuccess.php", - "className": "MemberVerifySuccess", - "moduleName": "notice_template" - }, - "VerifyCode": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/listener/notice_template/VerifyCode.php", - "className": "VerifyCode", - "moduleName": "notice_template" - } - }, - "pay": { - "PayCreateListener": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/listener/pay/PayCreateListener.php", - "className": "PayCreateListener", - "moduleName": "pay" - }, - "PayNotifyListener": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/listener/pay/PayNotifyListener.php", - "className": "PayNotifyListener", - "moduleName": "pay" - }, - "PaySuccessListener": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/listener/pay/PaySuccessListener.php", - "className": "PaySuccessListener", - "moduleName": "pay" - }, - "RefundSuccessListener": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/listener/pay/RefundSuccessListener.php", - "className": "RefundSuccessListener", - "moduleName": "pay" - }, - "TransferSuccessListener": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/listener/pay/TransferSuccessListener.php", - "className": "TransferSuccessListener", - "moduleName": "pay" - } - }, - "poster": { - "FriendspayPoster": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/listener/poster/FriendspayPoster.php", - "className": "FriendspayPoster", - "moduleName": "poster" - } - }, - "qrcode": { - "WeappQrcodeListener": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/listener/qrcode/WeappQrcodeListener.php", - "className": "WeappQrcodeListener", - "moduleName": "qrcode" - }, - "WechatQrcodeListener": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/listener/qrcode/WechatQrcodeListener.php", - "className": "WechatQrcodeListener", - "moduleName": "qrcode" - } - }, - "scan": { - "ScanListener": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/listener/scan/ScanListener.php", - "className": "ScanListener", - "moduleName": "scan" - } - }, - "system": { - "AddSiteAfterListener": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/listener/system/AddSiteAfterListener.php", - "className": "AddSiteAfterListener", - "moduleName": "system" - }, - "AdminIndexListener": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/listener/system/AdminIndexListener.php", - "className": "AdminIndexListener", - "moduleName": "system" - }, - "AppInitListener": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/listener/system/AppInitListener.php", - "className": "AppInitListener", - "moduleName": "system" - }, - "AppManageListener": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/listener/system/AppManageListener.php", - "className": "AppManageListener", - "moduleName": "system" - }, - "BottomNavigationListener": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/listener/system/BottomNavigationListener.php", - "className": "BottomNavigationListener", - "moduleName": "system" - }, - "Poster": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/listener/system/Poster.php", - "className": "Poster", - "moduleName": "system" - }, - "PosterType": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/listener/system/PosterType.php", - "className": "PosterType", - "moduleName": "system" - }, - "ShowAppListener": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/listener/system/ShowAppListener.php", - "className": "ShowAppListener", - "moduleName": "system" - }, - "ShowMarketingListener": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/listener/system/ShowMarketingListener.php", - "className": "ShowMarketingListener", - "moduleName": "system" - }, - "SiteIndexListener": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/listener/system/SiteIndexListener.php", - "className": "SiteIndexListener", - "moduleName": "system" - }, - "SiteInitListener": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/listener/system/SiteInitListener.php", - "className": "SiteInitListener", - "moduleName": "system" - }, - "SiteLayout": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/listener/system/SiteLayout.php", - "className": "SiteLayout", - "moduleName": "system" - }, - "WeappAuthChangeAfter": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/listener/system/WeappAuthChangeAfter.php", - "className": "WeappAuthChangeAfter", - "moduleName": "system" - } - }, - "transfer": { - "TransferCashOutListener": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/listener/transfer/TransferCashOutListener.php", - "className": "TransferCashOutListener", - "moduleName": "transfer" - } - } - }, - "commands": { - "Addon": { - "Install": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/command/Addon/Install.php", - "className": "Install", - "moduleName": "Addon" - }, - "Uninstall": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/command/Addon/Uninstall.php", - "className": "Uninstall", - "moduleName": "Addon" - } - }, - "queue": { - "Queue": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/command/queue/Queue.php", - "className": "Queue", - "moduleName": "queue" - } - }, - "schedule": { - "Schedule": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/command/schedule/Schedule.php", - "className": "Schedule", - "moduleName": "schedule" - } - }, - "workerman": { - "Workerman": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/command/workerman/Workerman.php", - "className": "Workerman", - "moduleName": "workerman" - } - } - }, - "dicts": { - "addon": { - "AddonDict": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/dict/addon/AddonDict.php", - "className": "AddonDict", - "moduleName": "addon" - } - }, - "applet": { - "AppletlDict": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/dict/applet/AppletlDict.php", - "className": "AppletlDict", - "moduleName": "applet" - } - }, - "cash_out": { - "CashOutTypeDict": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/dict/cash_out/CashOutTypeDict.php", - "className": "CashOutTypeDict", - "moduleName": "cash_out" - } - }, - "channel": { - "AppDict": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/dict/channel/AppDict.php", - "className": "AppDict", - "moduleName": "channel" - }, - "CertDict": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/dict/channel/CertDict.php", - "className": "CertDict", - "moduleName": "channel" - }, - "ReplyDict": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/dict/channel/ReplyDict.php", - "className": "ReplyDict", - "moduleName": "channel" - }, - "WechatDict": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/dict/channel/WechatDict.php", - "className": "WechatDict", - "moduleName": "channel" - } - }, - "common": { - "ChannelDict": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/dict/common/ChannelDict.php", - "className": "ChannelDict", - "moduleName": "common" - }, - "CommonActiveDict": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/dict/common/CommonActiveDict.php", - "className": "CommonActiveDict", - "moduleName": "common" - }, - "CommonDict": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/dict/common/CommonDict.php", - "className": "CommonDict", - "moduleName": "common" - } - }, - "diy": { - "ComponentDict": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/dict/diy/ComponentDict.php", - "className": "ComponentDict", - "moduleName": "diy" - }, - "LinkDict": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/dict/diy/LinkDict.php", - "className": "LinkDict", - "moduleName": "diy" - }, - "PagesDict": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/dict/diy/PagesDict.php", - "className": "PagesDict", - "moduleName": "diy" - }, - "TemplateDict": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/dict/diy/TemplateDict.php", - "className": "TemplateDict", - "moduleName": "diy" - } - }, - "diy_form": { - "ComponentDict": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/dict/diy_form/ComponentDict.php", - "className": "ComponentDict", - "moduleName": "diy_form" - }, - "ConfigDict": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/dict/diy_form/ConfigDict.php", - "className": "ConfigDict", - "moduleName": "diy_form" - }, - "TemplateDict": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/dict/diy_form/TemplateDict.php", - "className": "TemplateDict", - "moduleName": "diy_form" - }, - "TypeDict": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/dict/diy_form/TypeDict.php", - "className": "TypeDict", - "moduleName": "diy_form" - } - }, - "member": { - "MemberAccountChangeTypeDict": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/dict/member/MemberAccountChangeTypeDict.php", - "className": "MemberAccountChangeTypeDict", - "moduleName": "member" - }, - "MemberAccountTypeDict": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/dict/member/MemberAccountTypeDict.php", - "className": "MemberAccountTypeDict", - "moduleName": "member" - }, - "MemberCashOutDict": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/dict/member/MemberCashOutDict.php", - "className": "MemberCashOutDict", - "moduleName": "member" - }, - "MemberDict": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/dict/member/MemberDict.php", - "className": "MemberDict", - "moduleName": "member" - }, - "MemberLevelDict": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/dict/member/MemberLevelDict.php", - "className": "MemberLevelDict", - "moduleName": "member" - }, - "MemberLoginTypeDict": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/dict/member/MemberLoginTypeDict.php", - "className": "MemberLoginTypeDict", - "moduleName": "member" - }, - "MemberRegisterChannelDict": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/dict/member/MemberRegisterChannelDict.php", - "className": "MemberRegisterChannelDict", - "moduleName": "member" - }, - "MemberRegisterTypeDict": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/dict/member/MemberRegisterTypeDict.php", - "className": "MemberRegisterTypeDict", - "moduleName": "member" - }, - "MemberSignDict": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/dict/member/MemberSignDict.php", - "className": "MemberSignDict", - "moduleName": "member" - }, - "MemberSignTypeDict": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/dict/member/MemberSignTypeDict.php", - "className": "MemberSignTypeDict", - "moduleName": "member" - }, - "account_change_type": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/dict/member/account_change_type.php", - "className": "account_change_type", - "moduleName": "member" - }, - "benefits": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/dict/member/benefits.php", - "className": "benefits", - "moduleName": "member" - }, - "gift": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/dict/member/gift.php", - "className": "gift", - "moduleName": "member" - }, - "growth_rule": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/dict/member/growth_rule.php", - "className": "growth_rule", - "moduleName": "member" - }, - "point_rule": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/dict/member/point_rule.php", - "className": "point_rule", - "moduleName": "member" - } - }, - "menu": { - "admin": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/dict/menu/admin.php", - "className": "admin", - "moduleName": "menu" - }, - "site": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/dict/menu/site.php", - "className": "site", - "moduleName": "menu" - } - }, - "notice": { - "NoticeDict": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/dict/notice/NoticeDict.php", - "className": "NoticeDict", - "moduleName": "notice" - }, - "NoticeTypeDict": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/dict/notice/NoticeTypeDict.php", - "className": "NoticeTypeDict", - "moduleName": "notice" - }, - "notice": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/dict/notice/notice.php", - "className": "notice", - "moduleName": "notice" - }, - "sms": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/dict/notice/sms.php", - "className": "sms", - "moduleName": "notice" - }, - "weapp": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/dict/notice/weapp.php", - "className": "weapp", - "moduleName": "notice" - }, - "wechat": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/dict/notice/wechat.php", - "className": "wechat", - "moduleName": "notice" - } - }, - "pay": { - "OnlinePayDict": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/dict/pay/OnlinePayDict.php", - "className": "OnlinePayDict", - "moduleName": "pay" - }, - "OnlineRefundDict": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/dict/pay/OnlineRefundDict.php", - "className": "OnlineRefundDict", - "moduleName": "pay" - }, - "PayChannelDict": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/dict/pay/PayChannelDict.php", - "className": "PayChannelDict", - "moduleName": "pay" - }, - "PayDict": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/dict/pay/PayDict.php", - "className": "PayDict", - "moduleName": "pay" - }, - "PaySceneDict": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/dict/pay/PaySceneDict.php", - "className": "PaySceneDict", - "moduleName": "pay" - }, - "RefundDict": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/dict/pay/RefundDict.php", - "className": "RefundDict", - "moduleName": "pay" - }, - "TransferDict": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/dict/pay/TransferDict.php", - "className": "TransferDict", - "moduleName": "pay" - } - }, - "poster": { - "ComponentDict": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/dict/poster/ComponentDict.php", - "className": "ComponentDict", - "moduleName": "poster" - }, - "template": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/dict/poster/template.php", - "className": "template", - "moduleName": "poster" - } - }, - "scan": { - "ScanDict": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/dict/scan/ScanDict.php", - "className": "ScanDict", - "moduleName": "scan" - } - }, - "schedule": { - "ScheduleDict": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/dict/schedule/ScheduleDict.php", - "className": "ScheduleDict", - "moduleName": "schedule" - }, - "ScheduleLogDict": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/dict/schedule/ScheduleLogDict.php", - "className": "ScheduleLogDict", - "moduleName": "schedule" - }, - "schedule": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/dict/schedule/schedule.php", - "className": "schedule", - "moduleName": "schedule" - } - }, - "site": { - "SiteAccountLogDict": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/dict/site/SiteAccountLogDict.php", - "className": "SiteAccountLogDict", - "moduleName": "site" - }, - "SiteDict": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/dict/site/SiteDict.php", - "className": "SiteDict", - "moduleName": "site" - } - }, - "sys": { - "AgreementDict": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/dict/sys/AgreementDict.php", - "className": "AgreementDict", - "moduleName": "sys" - }, - "AppTypeDict": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/dict/sys/AppTypeDict.php", - "className": "AppTypeDict", - "moduleName": "sys" - }, - "BackupDict": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/dict/sys/BackupDict.php", - "className": "BackupDict", - "moduleName": "sys" - }, - "CloudDict": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/dict/sys/CloudDict.php", - "className": "CloudDict", - "moduleName": "sys" - }, - "ConfigKeyDict": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/dict/sys/ConfigKeyDict.php", - "className": "ConfigKeyDict", - "moduleName": "sys" - }, - "DateDict": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/dict/sys/DateDict.php", - "className": "DateDict", - "moduleName": "sys" - }, - "ExportDict": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/dict/sys/ExportDict.php", - "className": "ExportDict", - "moduleName": "sys" - }, - "FileDict": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/dict/sys/FileDict.php", - "className": "FileDict", - "moduleName": "sys" - }, - "MenuDict": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/dict/sys/MenuDict.php", - "className": "MenuDict", - "moduleName": "sys" - }, - "MenuTypeDict": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/dict/sys/MenuTypeDict.php", - "className": "MenuTypeDict", - "moduleName": "sys" - }, - "MethodDict": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/dict/sys/MethodDict.php", - "className": "MethodDict", - "moduleName": "sys" - }, - "PosterDict": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/dict/sys/PosterDict.php", - "className": "PosterDict", - "moduleName": "sys" - }, - "PrinterDict": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/dict/sys/PrinterDict.php", - "className": "PrinterDict", - "moduleName": "sys" - }, - "RoleStatusDict": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/dict/sys/RoleStatusDict.php", - "className": "RoleStatusDict", - "moduleName": "sys" - }, - "SmsDict": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/dict/sys/SmsDict.php", - "className": "SmsDict", - "moduleName": "sys" - }, - "StorageDict": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/dict/sys/StorageDict.php", - "className": "StorageDict", - "moduleName": "sys" - }, - "UpgradeDict": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/dict/sys/UpgradeDict.php", - "className": "UpgradeDict", - "moduleName": "sys" - }, - "UserDict": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/dict/sys/UserDict.php", - "className": "UserDict", - "moduleName": "sys" - }, - "WechatMediaDict": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/dict/sys/WechatMediaDict.php", - "className": "WechatMediaDict", - "moduleName": "sys" - }, - "WxOplatform": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/dict/sys/WxOplatform.php", - "className": "WxOplatform", - "moduleName": "sys" - } - }, - "verify": { - "VerifyDict": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/dict/verify/VerifyDict.php", - "className": "VerifyDict", - "moduleName": "verify" - } - }, - "dict": { - "Dict": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/model/dict/Dict.php", - "className": "Dict", - "moduleName": "dict" - }, - "DictService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/admin/dict/DictService.php", - "className": "DictService", - "moduleName": "dict" - } - }, - "lang": { - "enDict": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/lang/en/dict.php", - "className": "enDict", - "moduleName": "lang" - }, - "zh-cnDict": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/lang/zh-cn/dict.php", - "className": "zh-cnDict", - "moduleName": "lang" - } - } - }, - "traits": { - "admin": { - "ExecuteSqlTrait": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/admin/upgrade/ExecuteSqlTrait.php", - "className": "ExecuteSqlTrait", - "moduleName": "admin" - } - }, - "core": { - "WapTrait": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud/app/service/core/addon/WapTrait.php", - "className": "WapTrait", - "moduleName": "core" - } - } - }, - "javaControllers": { - "addon": { - "AddonController": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/controller/api/addon/AddonController.java", - "className": "AddonController", - "layer": "api", - "moduleName": "addon" - }, - "AddonDevelopController": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/controller/adminapi/addon/AddonDevelopController.java", - "className": "AddonDevelopController", - "layer": "adminapi", - "moduleName": "addon" - }, - "AddonLogController": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/controller/adminapi/addon/AddonLogController.java", - "className": "AddonLogController", - "layer": "adminapi", - "moduleName": "addon" - }, - "AppController": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/controller/adminapi/addon/AppController.java", - "className": "AppController", - "layer": "adminapi", - "moduleName": "addon" - }, - "BackupController": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/controller/adminapi/addon/BackupController.java", - "className": "BackupController", - "layer": "adminapi", - "moduleName": "addon" - }, - "UpgradeController": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/controller/adminapi/addon/UpgradeController.java", - "className": "UpgradeController", - "layer": "adminapi", - "moduleName": "addon" - } - }, - "aliapp": { - "ConfigController": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/controller/adminapi/aliapp/ConfigController.java", - "className": "ConfigController", - "layer": "adminapi", - "moduleName": "aliapp" - } - }, - "auth": { - "AuthController": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/controller/adminapi/auth/AuthController.java", - "className": "AuthController", - "layer": "adminapi", - "moduleName": "auth" - } - }, - "channel": { - "H5Controller": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/controller/adminapi/channel/H5Controller.java", - "className": "H5Controller", - "layer": "adminapi", - "moduleName": "channel" - }, - "PcController": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/controller/adminapi/channel/PcController.java", - "className": "PcController", - "layer": "adminapi", - "moduleName": "channel" - } - }, - "dict": { - "DictController": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/controller/adminapi/dict/DictController.java", - "className": "DictController", - "layer": "adminapi", - "moduleName": "dict" - } - }, - "diy": { - "ConfigController": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/controller/adminapi/diy/ConfigController.java", - "className": "ConfigController", - "layer": "adminapi", - "moduleName": "diy" - }, - "DiyController": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/controller/api/diy/DiyController.java", - "className": "DiyController", - "layer": "api", - "moduleName": "diy" - }, - "DiyFormController": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/controller/api/diy/DiyFormController.java", - "className": "DiyFormController", - "layer": "api", - "moduleName": "diy" - }, - "DiyRouteController": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/controller/adminapi/diy/DiyRouteController.java", - "className": "DiyRouteController", - "layer": "adminapi", - "moduleName": "diy" - }, - "DiyThemeController": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/controller/adminapi/diy/DiyThemeController.java", - "className": "DiyThemeController", - "layer": "adminapi", - "moduleName": "diy" - } - }, - "generator": { - "GenerateController": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/controller/adminapi/generator/GenerateController.java", - "className": "GenerateController", - "layer": "adminapi", - "moduleName": "generator" - } - }, - "home": { - "SiteController": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/controller/adminapi/home/SiteController.java", - "className": "SiteController", - "layer": "adminapi", - "moduleName": "home" - } - }, - "index": { - "PromotionAdvController": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/controller/adminapi/index/PromotionAdvController.java", - "className": "PromotionAdvController", - "layer": "adminapi", - "moduleName": "index" - } - }, - "login": { - "CaptchaController": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/controller/adminapi/login/CaptchaController.java", - "className": "CaptchaController", - "layer": "adminapi", - "moduleName": "login" - }, - "ConfigController": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/controller/adminapi/login/ConfigController.java", - "className": "ConfigController", - "layer": "adminapi", - "moduleName": "login" - }, - "LoginController": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/controller/api/login/LoginController.java", - "className": "LoginController", - "layer": "api", - "moduleName": "login" - }, - "RegisterController": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/controller/api/login/RegisterController.java", - "className": "RegisterController", - "layer": "api", - "moduleName": "login" - } - }, - "member": { - "MemberAccountController": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/controller/api/member/MemberAccountController.java", - "className": "MemberAccountController", - "layer": "api", - "moduleName": "member" - }, - "MemberAddressController": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/controller/api/member/MemberAddressController.java", - "className": "MemberAddressController", - "layer": "api", - "moduleName": "member" - }, - "MemberCashOutController": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/controller/api/member/MemberCashOutController.java", - "className": "MemberCashOutController", - "layer": "api", - "moduleName": "member" - }, - "MemberConfigController": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/controller/adminapi/member/MemberConfigController.java", - "className": "MemberConfigController", - "layer": "adminapi", - "moduleName": "member" - }, - "MemberController": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/controller/api/member/MemberController.java", - "className": "MemberController", - "layer": "api", - "moduleName": "member" - }, - "MemberLabelController": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/controller/adminapi/member/MemberLabelController.java", - "className": "MemberLabelController", - "layer": "adminapi", - "moduleName": "member" - }, - "MemberLevelController": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/controller/adminapi/member/MemberLevelController.java", - "className": "MemberLevelController", - "layer": "adminapi", - "moduleName": "member" - }, - "MemberSignController": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/controller/api/member/MemberSignController.java", - "className": "MemberSignController", - "layer": "api", - "moduleName": "member" - } - }, - "niucloud": { - "CloudController": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/controller/adminapi/niucloud/CloudController.java", - "className": "CloudController", - "layer": "adminapi", - "moduleName": "niucloud" - }, - "ModuleController": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/controller/adminapi/niucloud/ModuleController.java", - "className": "ModuleController", - "layer": "adminapi", - "moduleName": "niucloud" - } - }, - "notice": { - "NiuSmsController": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/controller/adminapi/notice/NiuSmsController.java", - "className": "NiuSmsController", - "layer": "adminapi", - "moduleName": "notice" - }, - "NoticeController": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/controller/adminapi/notice/NoticeController.java", - "className": "NoticeController", - "layer": "adminapi", - "moduleName": "notice" - }, - "NoticeLogController": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/controller/adminapi/notice/NoticeLogController.java", - "className": "NoticeLogController", - "layer": "adminapi", - "moduleName": "notice" - }, - "NoticeSmsLogController": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/controller/adminapi/notice/NoticeSmsLogController.java", - "className": "NoticeSmsLogController", - "layer": "adminapi", - "moduleName": "notice" - } - }, - "pay": { - "PayChannelController": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/controller/adminapi/pay/PayChannelController.java", - "className": "PayChannelController", - "layer": "adminapi", - "moduleName": "pay" - }, - "PayController": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/controller/api/pay/PayController.java", - "className": "PayController", - "layer": "api", - "moduleName": "pay" - }, - "PayRefundController": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/controller/adminapi/pay/PayRefundController.java", - "className": "PayRefundController", - "layer": "adminapi", - "moduleName": "pay" - }, - "PayTransferController": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/controller/adminapi/pay/PayTransferController.java", - "className": "PayTransferController", - "layer": "adminapi", - "moduleName": "pay" - } - }, - "site": { - "SiteAccountLogController": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/controller/adminapi/site/SiteAccountLogController.java", - "className": "SiteAccountLogController", - "layer": "adminapi", - "moduleName": "site" - }, - "SiteController": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/controller/adminapi/site/SiteController.java", - "className": "SiteController", - "layer": "adminapi", - "moduleName": "site" - }, - "SiteGroupController": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/controller/adminapi/site/SiteGroupController.java", - "className": "SiteGroupController", - "layer": "adminapi", - "moduleName": "site" - }, - "UserController": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/controller/adminapi/site/UserController.java", - "className": "UserController", - "layer": "adminapi", - "moduleName": "site" - }, - "UserLogController": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/controller/adminapi/site/UserLogController.java", - "className": "UserLogController", - "layer": "adminapi", - "moduleName": "site" - } - }, - "stat": { - "StatController": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/controller/adminapi/stat/StatController.java", - "className": "StatController", - "layer": "adminapi", - "moduleName": "stat" - }, - "StatHourController": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/controller/adminapi/stat/StatHourController.java", - "className": "StatHourController", - "layer": "adminapi", - "moduleName": "stat" - } - }, - "sys": { - "SysAgreementController": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/controller/adminapi/sys/SysAgreementController.java", - "className": "SysAgreementController", - "layer": "adminapi", - "moduleName": "sys" - }, - "SysAreaController": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/controller/api/sys/SysAreaController.java", - "className": "SysAreaController", - "layer": "api", - "moduleName": "sys" - }, - "SysAttachmentController": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/controller/adminapi/sys/SysAttachmentController.java", - "className": "SysAttachmentController", - "layer": "adminapi", - "moduleName": "sys" - }, - "SysConfigController": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/controller/api/sys/SysConfigController.java", - "className": "SysConfigController", - "layer": "api", - "moduleName": "sys" - }, - "SysExportController": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/controller/adminapi/sys/SysExportController.java", - "className": "SysExportController", - "layer": "adminapi", - "moduleName": "sys" - }, - "SysMenuController": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/controller/adminapi/sys/SysMenuController.java", - "className": "SysMenuController", - "layer": "adminapi", - "moduleName": "sys" - }, - "SysNoticeController": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/controller/adminapi/sys/SysNoticeController.java", - "className": "SysNoticeController", - "layer": "adminapi", - "moduleName": "sys" - }, - "SysPosterController": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/controller/api/sys/SysPosterController.java", - "className": "SysPosterController", - "layer": "api", - "moduleName": "sys" - }, - "SysPrinterController": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/controller/adminapi/sys/SysPrinterController.java", - "className": "SysPrinterController", - "layer": "adminapi", - "moduleName": "sys" - }, - "SysPrinterTemplateController": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/controller/adminapi/sys/SysPrinterTemplateController.java", - "className": "SysPrinterTemplateController", - "layer": "adminapi", - "moduleName": "sys" - }, - "SysRoleController": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/controller/adminapi/sys/SysRoleController.java", - "className": "SysRoleController", - "layer": "adminapi", - "moduleName": "sys" - }, - "SysScheduleController": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/controller/adminapi/sys/SysScheduleController.java", - "className": "SysScheduleController", - "layer": "adminapi", - "moduleName": "sys" - }, - "SysUeditorController": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/controller/adminapi/sys/SysUeditorController.java", - "className": "SysUeditorController", - "layer": "adminapi", - "moduleName": "sys" - }, - "SysUserRoleController": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/controller/adminapi/sys/SysUserRoleController.java", - "className": "SysUserRoleController", - "layer": "adminapi", - "moduleName": "sys" - }, - "SysWebConfigController": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/controller/adminapi/sys/SysWebConfigController.java", - "className": "SysWebConfigController", - "layer": "adminapi", - "moduleName": "sys" - }, - "SystemController": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/controller/adminapi/sys/SystemController.java", - "className": "SystemController", - "layer": "adminapi", - "moduleName": "sys" - }, - "CaptchaController": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/controller/api/sys/CaptchaController.java", - "className": "CaptchaController", - "layer": "api", - "moduleName": "sys" - }, - "SysVerifyController": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/controller/api/sys/SysVerifyController.java", - "className": "SysVerifyController", - "layer": "api", - "moduleName": "sys" - }, - "TaskController": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/controller/api/sys/TaskController.java", - "className": "TaskController", - "layer": "api", - "moduleName": "sys" - }, - "UploadController": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/controller/api/sys/UploadController.java", - "className": "UploadController", - "layer": "api", - "moduleName": "sys" - } - }, - "upload": { - "StorageController": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/controller/adminapi/upload/StorageController.java", - "className": "StorageController", - "layer": "adminapi", - "moduleName": "upload" - } - }, - "user": { - "UserController": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/controller/adminapi/user/UserController.java", - "className": "UserController", - "layer": "adminapi", - "moduleName": "user" - } - }, - "verify": { - "VerifierController": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/controller/adminapi/verify/VerifierController.java", - "className": "VerifierController", - "layer": "adminapi", - "moduleName": "verify" - }, - "VerifyController": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/controller/adminapi/verify/VerifyController.java", - "className": "VerifyController", - "layer": "adminapi", - "moduleName": "verify" - } - }, - "weapp": { - "ConfigController": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/controller/adminapi/weapp/ConfigController.java", - "className": "ConfigController", - "layer": "adminapi", - "moduleName": "weapp" - }, - "TemplateController": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/controller/adminapi/weapp/TemplateController.java", - "className": "TemplateController", - "layer": "adminapi", - "moduleName": "weapp" - }, - "VersionController": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/controller/adminapi/weapp/VersionController.java", - "className": "VersionController", - "layer": "adminapi", - "moduleName": "weapp" - }, - "ServeController": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/controller/api/weapp/ServeController.java", - "className": "ServeController", - "layer": "api", - "moduleName": "weapp" - }, - "WeappController": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/controller/api/weapp/WeappController.java", - "className": "WeappController", - "layer": "api", - "moduleName": "weapp" - } - }, - "wechat": { - "ConfigController": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/controller/adminapi/wechat/ConfigController.java", - "className": "ConfigController", - "layer": "adminapi", - "moduleName": "wechat" - }, - "MediaController": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/controller/adminapi/wechat/MediaController.java", - "className": "MediaController", - "layer": "adminapi", - "moduleName": "wechat" - }, - "MenuController": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/controller/adminapi/wechat/MenuController.java", - "className": "MenuController", - "layer": "adminapi", - "moduleName": "wechat" - }, - "ReplyController": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/controller/adminapi/wechat/ReplyController.java", - "className": "ReplyController", - "layer": "adminapi", - "moduleName": "wechat" - }, - "TemplateController": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/controller/adminapi/wechat/TemplateController.java", - "className": "TemplateController", - "layer": "adminapi", - "moduleName": "wechat" - }, - "ServeController": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/controller/api/wechat/ServeController.java", - "className": "ServeController", - "layer": "api", - "moduleName": "wechat" - }, - "WechatController": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/controller/api/wechat/WechatController.java", - "className": "WechatController", - "layer": "api", - "moduleName": "wechat" - } - }, - "wxoplatform": { - "ConfigController": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/controller/adminapi/wxoplatform/ConfigController.java", - "className": "ConfigController", - "layer": "adminapi", - "moduleName": "wxoplatform" - }, - "OplatformController": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/controller/adminapi/wxoplatform/OplatformController.java", - "className": "OplatformController", - "layer": "adminapi", - "moduleName": "wxoplatform" - }, - "ServerController": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/controller/adminapi/wxoplatform/ServerController.java", - "className": "ServerController", - "layer": "adminapi", - "moduleName": "wxoplatform" - }, - "WeappVersionController": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/controller/adminapi/wxoplatform/WeappVersionController.java", - "className": "WeappVersionController", - "layer": "adminapi", - "moduleName": "wxoplatform" - } - }, - "agreement": { - "AgreementController": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/controller/api/agreement/AgreementController.java", - "className": "AgreementController", - "layer": "api", - "moduleName": "agreement" - } - } - }, - "javaEntities": { - "addon": { - "Addon": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/entity/addon/Addon.java", - "className": "Addon", - "moduleName": "addon" - }, - "AddonLog": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/entity/addon/AddonLog.java", - "className": "AddonLog", - "moduleName": "addon" - } - }, - "applet": { - "AppletSiteVersion": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/entity/applet/AppletSiteVersion.java", - "className": "AppletSiteVersion", - "moduleName": "applet" - }, - "AppletVersion": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/entity/applet/AppletVersion.java", - "className": "AppletVersion", - "moduleName": "applet" - } - }, - "diy": { - "BottomConfigValue": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/entity/diy/BottomConfigValue.java", - "className": "BottomConfigValue", - "moduleName": "diy" - }, - "DiyPage": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/entity/diy/DiyPage.java", - "className": "DiyPage", - "moduleName": "diy" - }, - "DiyRoute": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/entity/diy/DiyRoute.java", - "className": "DiyRoute", - "moduleName": "diy" - }, - "DiyTheme": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/entity/diy/DiyTheme.java", - "className": "DiyTheme", - "moduleName": "diy" - } - }, - "diy_form": { - "DiyForm": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/entity/diy_form/DiyForm.java", - "className": "DiyForm", - "moduleName": "diy_form" - }, - "DiyFormFields": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/entity/diy_form/DiyFormFields.java", - "className": "DiyFormFields", - "moduleName": "diy_form" - }, - "DiyFormRecords": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/entity/diy_form/DiyFormRecords.java", - "className": "DiyFormRecords", - "moduleName": "diy_form" - }, - "DiyFormRecordsFields": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/entity/diy_form/DiyFormRecordsFields.java", - "className": "DiyFormRecordsFields", - "moduleName": "diy_form" - }, - "DiyFormSubmitConfig": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/entity/diy_form/DiyFormSubmitConfig.java", - "className": "DiyFormSubmitConfig", - "moduleName": "diy_form" - }, - "DiyFormWriteConfig": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/entity/diy_form/DiyFormWriteConfig.java", - "className": "DiyFormWriteConfig", - "moduleName": "diy_form" - } - }, - "generator": { - "GenerateColumn": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/entity/generator/GenerateColumn.java", - "className": "GenerateColumn", - "moduleName": "generator" - }, - "GenerateTable": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/entity/generator/GenerateTable.java", - "className": "GenerateTable", - "moduleName": "generator" - } - }, - "member": { - "Member": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/entity/member/Member.java", - "className": "Member", - "moduleName": "member" - }, - "MemberAccountLog": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/entity/member/MemberAccountLog.java", - "className": "MemberAccountLog", - "moduleName": "member" - }, - "MemberAddress": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/entity/member/MemberAddress.java", - "className": "MemberAddress", - "moduleName": "member" - }, - "MemberCashOut": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/entity/member/MemberCashOut.java", - "className": "MemberCashOut", - "moduleName": "member" - }, - "MemberCashOutAccount": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/entity/member/MemberCashOutAccount.java", - "className": "MemberCashOutAccount", - "moduleName": "member" - }, - "MemberLabel": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/entity/member/MemberLabel.java", - "className": "MemberLabel", - "moduleName": "member" - }, - "MemberLevel": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/entity/member/MemberLevel.java", - "className": "MemberLevel", - "moduleName": "member" - }, - "MemberSign": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/entity/member/MemberSign.java", - "className": "MemberSign", - "moduleName": "member" - } - }, - "oplatform": { - "WxOplatfromWeappVersion": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/entity/oplatform/WxOplatfromWeappVersion.java", - "className": "WxOplatfromWeappVersion", - "moduleName": "oplatform" - } - }, - "pay": { - "Pay": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/entity/pay/Pay.java", - "className": "Pay", - "moduleName": "pay" - }, - "PayChannel": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/entity/pay/PayChannel.java", - "className": "PayChannel", - "moduleName": "pay" - }, - "PayRefund": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/entity/pay/PayRefund.java", - "className": "PayRefund", - "moduleName": "pay" - }, - "PayTransfer": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/entity/pay/PayTransfer.java", - "className": "PayTransfer", - "moduleName": "pay" - }, - "PayTransferScene": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/entity/pay/PayTransferScene.java", - "className": "PayTransferScene", - "moduleName": "pay" - } - }, - "site": { - "Site": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/entity/site/Site.java", - "className": "Site", - "moduleName": "site" - }, - "SiteAccountLog": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/entity/site/SiteAccountLog.java", - "className": "SiteAccountLog", - "moduleName": "site" - }, - "SiteAddonInitRecord": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/entity/site/SiteAddonInitRecord.java", - "className": "SiteAddonInitRecord", - "moduleName": "site" - }, - "SiteGroup": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/entity/site/SiteGroup.java", - "className": "SiteGroup", - "moduleName": "site" - } - }, - "stat": { - "StatHour": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/entity/stat/StatHour.java", - "className": "StatHour", - "moduleName": "stat" - } - }, - "sys": { - "NiuSmsTemplate": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/entity/sys/NiuSmsTemplate.java", - "className": "NiuSmsTemplate", - "moduleName": "sys" - }, - "SysAgreement": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/entity/sys/SysAgreement.java", - "className": "SysAgreement", - "moduleName": "sys" - }, - "SysArea": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/entity/sys/SysArea.java", - "className": "SysArea", - "moduleName": "sys" - }, - "SysAttachment": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/entity/sys/SysAttachment.java", - "className": "SysAttachment", - "moduleName": "sys" - }, - "SysAttachmentCategory": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/entity/sys/SysAttachmentCategory.java", - "className": "SysAttachmentCategory", - "moduleName": "sys" - }, - "SysBackupRecords": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/entity/sys/SysBackupRecords.java", - "className": "SysBackupRecords", - "moduleName": "sys" - }, - "SysConfig": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/entity/sys/SysConfig.java", - "className": "SysConfig", - "moduleName": "sys" - }, - "SysDict": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/entity/sys/SysDict.java", - "className": "SysDict", - "moduleName": "sys" - }, - "SysExport": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/entity/sys/SysExport.java", - "className": "SysExport", - "moduleName": "sys" - }, - "SysMenu": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/entity/sys/SysMenu.java", - "className": "SysMenu", - "moduleName": "sys" - }, - "SysNotice": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/entity/sys/SysNotice.java", - "className": "SysNotice", - "moduleName": "sys" - }, - "SysNoticeLog": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/entity/sys/SysNoticeLog.java", - "className": "SysNoticeLog", - "moduleName": "sys" - }, - "SysNoticeSmsLog": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/entity/sys/SysNoticeSmsLog.java", - "className": "SysNoticeSmsLog", - "moduleName": "sys" - }, - "SysPoster": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/entity/sys/SysPoster.java", - "className": "SysPoster", - "moduleName": "sys" - }, - "SysPrinter": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/entity/sys/SysPrinter.java", - "className": "SysPrinter", - "moduleName": "sys" - }, - "SysPrinterTemplate": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/entity/sys/SysPrinterTemplate.java", - "className": "SysPrinterTemplate", - "moduleName": "sys" - }, - "SysRole": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/entity/sys/SysRole.java", - "className": "SysRole", - "moduleName": "sys" - }, - "SysSchedule": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/entity/sys/SysSchedule.java", - "className": "SysSchedule", - "moduleName": "sys" - }, - "SysScheduleLog": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/entity/sys/SysScheduleLog.java", - "className": "SysScheduleLog", - "moduleName": "sys" - }, - "SysUpgradeRecords": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/entity/sys/SysUpgradeRecords.java", - "className": "SysUpgradeRecords", - "moduleName": "sys" - }, - "SysUser": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/entity/sys/SysUser.java", - "className": "SysUser", - "moduleName": "sys" - }, - "SysUserLog": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/entity/sys/SysUserLog.java", - "className": "SysUserLog", - "moduleName": "sys" - }, - "SysUserRole": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/entity/sys/SysUserRole.java", - "className": "SysUserRole", - "moduleName": "sys" - } - }, - "user": { - "UserCreateSiteLimit": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/entity/user/UserCreateSiteLimit.java", - "className": "UserCreateSiteLimit", - "moduleName": "user" - } - }, - "verify": { - "Verifier": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/entity/verify/Verifier.java", - "className": "Verifier", - "moduleName": "verify" - }, - "Verify": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/entity/verify/Verify.java", - "className": "Verify", - "moduleName": "verify" - } - }, - "weapp": { - "WeappVersion": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/entity/weapp/WeappVersion.java", - "className": "WeappVersion", - "moduleName": "weapp" - } - }, - "wechat": { - "WechatFans": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/entity/wechat/WechatFans.java", - "className": "WechatFans", - "moduleName": "wechat" - }, - "WechatMedia": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/entity/wechat/WechatMedia.java", - "className": "WechatMedia", - "moduleName": "wechat" - }, - "WechatReply": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/entity/wechat/WechatReply.java", - "className": "WechatReply", - "moduleName": "wechat" - } - } - }, - "javaServices": { - "addon": { - "IAddonDevelopBuildService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/admin/addon/IAddonDevelopBuildService.java", - "className": "IAddonDevelopBuildService", - "layer": "admin", - "moduleName": "addon" - }, - "IAddonDevelopService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/admin/addon/IAddonDevelopService.java", - "className": "IAddonDevelopService", - "layer": "admin", - "moduleName": "addon" - }, - "IAddonLogService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/admin/addon/IAddonLogService.java", - "className": "IAddonLogService", - "layer": "admin", - "moduleName": "addon" - }, - "IAddonService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/admin/addon/IAddonService.java", - "className": "IAddonService", - "layer": "admin", - "moduleName": "addon" - }, - "AddonInstallJavaTools": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/core/addon/AddonInstallJavaTools.java", - "className": "AddonInstallJavaTools", - "layer": "core", - "moduleName": "addon" - }, - "AddonInstallTools": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/core/addon/AddonInstallTools.java", - "className": "AddonInstallTools", - "layer": "core", - "moduleName": "addon" - }, - "CoreAddonBaseService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/core/addon/CoreAddonBaseService.java", - "className": "CoreAddonBaseService", - "layer": "core", - "moduleName": "addon" - }, - "ICoreAddonInstallService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/core/addon/ICoreAddonInstallService.java", - "className": "ICoreAddonInstallService", - "layer": "core", - "moduleName": "addon" - }, - "ICoreAddonService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/core/addon/ICoreAddonService.java", - "className": "ICoreAddonService", - "layer": "core", - "moduleName": "addon" - } - }, - "aliapp": { - "IAliappConfigService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/admin/aliapp/IAliappConfigService.java", - "className": "IAliappConfigService", - "layer": "admin", - "moduleName": "aliapp" - }, - "ICoreAliappConfigService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/core/aliapp/ICoreAliappConfigService.java", - "className": "ICoreAliappConfigService", - "layer": "core", - "moduleName": "aliapp" - } - }, - "auth": { - "IAuthService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/admin/auth/IAuthService.java", - "className": "IAuthService", - "layer": "admin", - "moduleName": "auth" - }, - "IConfigService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/admin/auth/IConfigService.java", - "className": "IConfigService", - "layer": "admin", - "moduleName": "auth" - }, - "ILoginService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/admin/auth/ILoginService.java", - "className": "ILoginService", - "layer": "admin", - "moduleName": "auth" - } - }, - "captcha": { - "ICaptchaService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/admin/captcha/ICaptchaService.java", - "className": "ICaptchaService", - "layer": "admin", - "moduleName": "captcha" - }, - "ICoreCaptchaImgService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/core/captcha/ICoreCaptchaImgService.java", - "className": "ICoreCaptchaImgService", - "layer": "core", - "moduleName": "captcha" - } - }, - "dict": { - "IDictService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/admin/dict/IDictService.java", - "className": "IDictService", - "layer": "admin", - "moduleName": "dict" - } - }, - "diy": { - "IDiyConfigService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/admin/diy/IDiyConfigService.java", - "className": "IDiyConfigService", - "layer": "admin", - "moduleName": "diy" - }, - "IDiyRouteService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/admin/diy/IDiyRouteService.java", - "className": "IDiyRouteService", - "layer": "admin", - "moduleName": "diy" - }, - "IDiyService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/api/diy/IDiyService.java", - "className": "IDiyService", - "layer": "api", - "moduleName": "diy" - }, - "IDiyThemeService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/admin/diy/IDiyThemeService.java", - "className": "IDiyThemeService", - "layer": "admin", - "moduleName": "diy" - }, - "IDiyFormService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/api/diy/IDiyFormService.java", - "className": "IDiyFormService", - "layer": "api", - "moduleName": "diy" - }, - "ICoreDiyConfigService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/core/diy/ICoreDiyConfigService.java", - "className": "ICoreDiyConfigService", - "layer": "core", - "moduleName": "diy" - }, - "ICoreDiyService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/core/diy/ICoreDiyService.java", - "className": "ICoreDiyService", - "layer": "core", - "moduleName": "diy" - } - }, - "diy_form": { - "IDiyFormConfigService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/admin/diy_form/IDiyFormConfigService.java", - "className": "IDiyFormConfigService", - "layer": "admin", - "moduleName": "diy_form" - }, - "IDiyFormRecordsService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/admin/diy_form/IDiyFormRecordsService.java", - "className": "IDiyFormRecordsService", - "layer": "admin", - "moduleName": "diy_form" - }, - "IDiyFormService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/admin/diy_form/IDiyFormService.java", - "className": "IDiyFormService", - "layer": "admin", - "moduleName": "diy_form" - }, - "ICoreDiyFormConfigService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/core/diy_form/ICoreDiyFormConfigService.java", - "className": "ICoreDiyFormConfigService", - "layer": "core", - "moduleName": "diy_form" - }, - "ICoreDiyFormRecordsService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/core/diy_form/ICoreDiyFormRecordsService.java", - "className": "ICoreDiyFormRecordsService", - "layer": "core", - "moduleName": "diy_form" - } - }, - "generator": { - "IGenerateColumnService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/admin/generator/IGenerateColumnService.java", - "className": "IGenerateColumnService", - "layer": "admin", - "moduleName": "generator" - }, - "IGenerateService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/admin/generator/IGenerateService.java", - "className": "IGenerateService", - "layer": "admin", - "moduleName": "generator" - }, - "CoreGenerateService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/core/generator/CoreGenerateService.java", - "className": "CoreGenerateService", - "layer": "core", - "moduleName": "generator" - } - }, - "home": { - "IAuthSiteService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/admin/home/IAuthSiteService.java", - "className": "IAuthSiteService", - "layer": "admin", - "moduleName": "home" - } - }, - "install": { - "IInstallSystemService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/admin/install/IInstallSystemService.java", - "className": "IInstallSystemService", - "layer": "admin", - "moduleName": "install" - } - }, - "member": { - "IMemberAccountService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/api/member/IMemberAccountService.java", - "className": "IMemberAccountService", - "layer": "api", - "moduleName": "member" - }, - "IMemberAddressService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/api/member/IMemberAddressService.java", - "className": "IMemberAddressService", - "layer": "api", - "moduleName": "member" - }, - "IMemberCashOutService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/api/member/IMemberCashOutService.java", - "className": "IMemberCashOutService", - "layer": "api", - "moduleName": "member" - }, - "IMemberConfigService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/admin/member/IMemberConfigService.java", - "className": "IMemberConfigService", - "layer": "admin", - "moduleName": "member" - }, - "IMemberLabelService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/admin/member/IMemberLabelService.java", - "className": "IMemberLabelService", - "layer": "admin", - "moduleName": "member" - }, - "IMemberLevelService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/api/member/IMemberLevelService.java", - "className": "IMemberLevelService", - "layer": "api", - "moduleName": "member" - }, - "IMemberService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/api/member/IMemberService.java", - "className": "IMemberService", - "layer": "api", - "moduleName": "member" - }, - "IMemberSignService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/api/member/IMemberSignService.java", - "className": "IMemberSignService", - "layer": "api", - "moduleName": "member" - }, - "ICoreMemberAccountService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/core/member/ICoreMemberAccountService.java", - "className": "ICoreMemberAccountService", - "layer": "core", - "moduleName": "member" - }, - "ICoreMemberCashOutService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/core/member/ICoreMemberCashOutService.java", - "className": "ICoreMemberCashOutService", - "layer": "core", - "moduleName": "member" - }, - "ICoreMemberConfigService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/core/member/ICoreMemberConfigService.java", - "className": "ICoreMemberConfigService", - "layer": "core", - "moduleName": "member" - }, - "ICoreMemberLevelService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/core/member/ICoreMemberLevelService.java", - "className": "ICoreMemberLevelService", - "layer": "core", - "moduleName": "member" - }, - "ICoreMemberService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/core/member/ICoreMemberService.java", - "className": "ICoreMemberService", - "layer": "core", - "moduleName": "member" - } - }, - "niucloud": { - "ICloudBuildService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/admin/niucloud/ICloudBuildService.java", - "className": "ICloudBuildService", - "layer": "admin", - "moduleName": "niucloud" - }, - "INiucloudService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/admin/niucloud/INiucloudService.java", - "className": "INiucloudService", - "layer": "admin", - "moduleName": "niucloud" - }, - "ICoreAuthService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/core/niucloud/ICoreAuthService.java", - "className": "ICoreAuthService", - "layer": "core", - "moduleName": "niucloud" - }, - "ICoreNiucloudConfigService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/core/niucloud/ICoreNiucloudConfigService.java", - "className": "ICoreNiucloudConfigService", - "layer": "core", - "moduleName": "niucloud" - } - }, - "notice": { - "INoticeLogService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/admin/notice/INoticeLogService.java", - "className": "INoticeLogService", - "layer": "admin", - "moduleName": "notice" - }, - "INoticeService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/admin/notice/INoticeService.java", - "className": "INoticeService", - "layer": "admin", - "moduleName": "notice" - }, - "INoticeSmsLogService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/admin/notice/INoticeSmsLogService.java", - "className": "INoticeSmsLogService", - "layer": "admin", - "moduleName": "notice" - }, - "INuiSmsService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/admin/notice/INuiSmsService.java", - "className": "INuiSmsService", - "layer": "admin", - "moduleName": "notice" - }, - "ISmsService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/admin/notice/ISmsService.java", - "className": "ISmsService", - "layer": "admin", - "moduleName": "notice" - }, - "ICoreNoticeLogService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/core/notice/ICoreNoticeLogService.java", - "className": "ICoreNoticeLogService", - "layer": "core", - "moduleName": "notice" - }, - "ICoreNoticeService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/core/notice/ICoreNoticeService.java", - "className": "ICoreNoticeService", - "layer": "core", - "moduleName": "notice" - }, - "ICoreNoticeSmsLogService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/core/notice/ICoreNoticeSmsLogService.java", - "className": "ICoreNoticeSmsLogService", - "layer": "core", - "moduleName": "notice" - } - }, - "pay": { - "IPayChannelService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/admin/pay/IPayChannelService.java", - "className": "IPayChannelService", - "layer": "admin", - "moduleName": "pay" - }, - "IPayRefundService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/admin/pay/IPayRefundService.java", - "className": "IPayRefundService", - "layer": "admin", - "moduleName": "pay" - }, - "IPayService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/api/pay/IPayService.java", - "className": "IPayService", - "layer": "api", - "moduleName": "pay" - }, - "IPayTransferService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/admin/pay/IPayTransferService.java", - "className": "IPayTransferService", - "layer": "admin", - "moduleName": "pay" - }, - "ICorePayChannelService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/core/pay/ICorePayChannelService.java", - "className": "ICorePayChannelService", - "layer": "core", - "moduleName": "pay" - }, - "ICorePayEventService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/core/pay/ICorePayEventService.java", - "className": "ICorePayEventService", - "layer": "core", - "moduleName": "pay" - }, - "ICorePayService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/core/pay/ICorePayService.java", - "className": "ICorePayService", - "layer": "core", - "moduleName": "pay" - }, - "ICoreRefundService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/core/pay/ICoreRefundService.java", - "className": "ICoreRefundService", - "layer": "core", - "moduleName": "pay" - }, - "ICoreTransferSceneService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/core/pay/ICoreTransferSceneService.java", - "className": "ICoreTransferSceneService", - "layer": "core", - "moduleName": "pay" - }, - "ICoreTransferService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/core/pay/ICoreTransferService.java", - "className": "ICoreTransferService", - "layer": "core", - "moduleName": "pay" - } - }, - "site": { - "ISiteAccountLogService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/admin/site/ISiteAccountLogService.java", - "className": "ISiteAccountLogService", - "layer": "admin", - "moduleName": "site" - }, - "ISiteGroupService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/admin/site/ISiteGroupService.java", - "className": "ISiteGroupService", - "layer": "admin", - "moduleName": "site" - }, - "ISiteService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/admin/site/ISiteService.java", - "className": "ISiteService", - "layer": "admin", - "moduleName": "site" - }, - "ISiteUserService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/admin/site/ISiteUserService.java", - "className": "ISiteUserService", - "layer": "admin", - "moduleName": "site" - }, - "ICoreSiteAccountService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/core/site/ICoreSiteAccountService.java", - "className": "ICoreSiteAccountService", - "layer": "core", - "moduleName": "site" - }, - "ICoreSiteService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/core/site/ICoreSiteService.java", - "className": "ICoreSiteService", - "layer": "core", - "moduleName": "site" - } - }, - "stat": { - "IStatHourService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/admin/stat/IStatHourService.java", - "className": "IStatHourService", - "layer": "admin", - "moduleName": "stat" - }, - "IStatService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/admin/stat/IStatService.java", - "className": "IStatService", - "layer": "admin", - "moduleName": "stat" - } - }, - "sys": { - "ISysAgreementService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/admin/sys/ISysAgreementService.java", - "className": "ISysAgreementService", - "layer": "admin", - "moduleName": "sys" - }, - "ISysAreaService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/api/sys/ISysAreaService.java", - "className": "ISysAreaService", - "layer": "api", - "moduleName": "sys" - }, - "ISysAttachmentService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/admin/sys/ISysAttachmentService.java", - "className": "ISysAttachmentService", - "layer": "admin", - "moduleName": "sys" - }, - "ISysBackupRecordsService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/admin/sys/ISysBackupRecordsService.java", - "className": "ISysBackupRecordsService", - "layer": "admin", - "moduleName": "sys" - }, - "ISysConfigService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/api/sys/ISysConfigService.java", - "className": "ISysConfigService", - "layer": "api", - "moduleName": "sys" - }, - "ISysExportService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/admin/sys/ISysExportService.java", - "className": "ISysExportService", - "layer": "admin", - "moduleName": "sys" - }, - "ISysMenuService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/admin/sys/ISysMenuService.java", - "className": "ISysMenuService", - "layer": "admin", - "moduleName": "sys" - }, - "ISysNoticeLogService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/admin/sys/ISysNoticeLogService.java", - "className": "ISysNoticeLogService", - "layer": "admin", - "moduleName": "sys" - }, - "ISysNoticeService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/admin/sys/ISysNoticeService.java", - "className": "ISysNoticeService", - "layer": "admin", - "moduleName": "sys" - }, - "ISysNoticeSmsLogService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/admin/sys/ISysNoticeSmsLogService.java", - "className": "ISysNoticeSmsLogService", - "layer": "admin", - "moduleName": "sys" - }, - "ISysPosterService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/admin/sys/ISysPosterService.java", - "className": "ISysPosterService", - "layer": "admin", - "moduleName": "sys" - }, - "ISysPrinterService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/admin/sys/ISysPrinterService.java", - "className": "ISysPrinterService", - "layer": "admin", - "moduleName": "sys" - }, - "ISysPrinterTemplateService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/admin/sys/ISysPrinterTemplateService.java", - "className": "ISysPrinterTemplateService", - "layer": "admin", - "moduleName": "sys" - }, - "ISysRoleService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/admin/sys/ISysRoleService.java", - "className": "ISysRoleService", - "layer": "admin", - "moduleName": "sys" - }, - "ISysScheduleService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/admin/sys/ISysScheduleService.java", - "className": "ISysScheduleService", - "layer": "admin", - "moduleName": "sys" - }, - "ISysUpgradeRecordsService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/admin/sys/ISysUpgradeRecordsService.java", - "className": "ISysUpgradeRecordsService", - "layer": "admin", - "moduleName": "sys" - }, - "ISysUserLogService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/admin/sys/ISysUserLogService.java", - "className": "ISysUserLogService", - "layer": "admin", - "moduleName": "sys" - }, - "ISysUserRoleService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/admin/sys/ISysUserRoleService.java", - "className": "ISysUserRoleService", - "layer": "admin", - "moduleName": "sys" - }, - "ISysUserService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/admin/sys/ISysUserService.java", - "className": "ISysUserService", - "layer": "admin", - "moduleName": "sys" - }, - "ISystemService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/admin/sys/ISystemService.java", - "className": "ISystemService", - "layer": "admin", - "moduleName": "sys" - }, - "IBase64Service": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/api/sys/IBase64Service.java", - "className": "IBase64Service", - "layer": "api", - "moduleName": "sys" - }, - "ISysVerifyService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/api/sys/ISysVerifyService.java", - "className": "ISysVerifyService", - "layer": "api", - "moduleName": "sys" - }, - "ITaskService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/api/sys/ITaskService.java", - "className": "ITaskService", - "layer": "api", - "moduleName": "sys" - }, - "IUploadService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/api/sys/IUploadService.java", - "className": "IUploadService", - "layer": "api", - "moduleName": "sys" - }, - "ICoreAgreementService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/core/sys/ICoreAgreementService.java", - "className": "ICoreAgreementService", - "layer": "core", - "moduleName": "sys" - }, - "ICoreConfigService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/core/sys/ICoreConfigService.java", - "className": "ICoreConfigService", - "layer": "core", - "moduleName": "sys" - }, - "ICoreExportService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/core/sys/ICoreExportService.java", - "className": "ICoreExportService", - "layer": "core", - "moduleName": "sys" - }, - "ICoreMenuService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/core/sys/ICoreMenuService.java", - "className": "ICoreMenuService", - "layer": "core", - "moduleName": "sys" - }, - "ICorePrinterService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/core/sys/ICorePrinterService.java", - "className": "ICorePrinterService", - "layer": "core", - "moduleName": "sys" - }, - "ICoreScanService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/core/sys/ICoreScanService.java", - "className": "ICoreScanService", - "layer": "core", - "moduleName": "sys" - }, - "ICoreSysConfigService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/core/sys/ICoreSysConfigService.java", - "className": "ICoreSysConfigService", - "layer": "core", - "moduleName": "sys" - }, - "ICoreUploadService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/core/sys/ICoreUploadService.java", - "className": "ICoreUploadService", - "layer": "core", - "moduleName": "sys" - } - }, - "upgrade": { - "IUpgradeService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/admin/upgrade/IUpgradeService.java", - "className": "IUpgradeService", - "layer": "admin", - "moduleName": "upgrade" - } - }, - "upload": { - "IStorageConfigService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/admin/upload/IStorageConfigService.java", - "className": "IStorageConfigService", - "layer": "admin", - "moduleName": "upload" - }, - "ICoreBase64Service": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/core/upload/ICoreBase64Service.java", - "className": "ICoreBase64Service", - "layer": "core", - "moduleName": "upload" - }, - "ICoreFetchService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/core/upload/ICoreFetchService.java", - "className": "ICoreFetchService", - "layer": "core", - "moduleName": "upload" - }, - "ICoreStorageService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/core/upload/ICoreStorageService.java", - "className": "ICoreStorageService", - "layer": "core", - "moduleName": "upload" - } - }, - "verify": { - "IVerifierService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/admin/verify/IVerifierService.java", - "className": "IVerifierService", - "layer": "admin", - "moduleName": "verify" - }, - "IVerifyService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/admin/verify/IVerifyService.java", - "className": "IVerifyService", - "layer": "admin", - "moduleName": "verify" - } - }, - "weapp": { - "IWeappConfigService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/admin/weapp/IWeappConfigService.java", - "className": "IWeappConfigService", - "layer": "admin", - "moduleName": "weapp" - }, - "IWeappTemplateService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/admin/weapp/IWeappTemplateService.java", - "className": "IWeappTemplateService", - "layer": "admin", - "moduleName": "weapp" - }, - "IWeappVersionService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/admin/weapp/IWeappVersionService.java", - "className": "IWeappVersionService", - "layer": "admin", - "moduleName": "weapp" - }, - "IServeService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/api/weapp/IServeService.java", - "className": "IServeService", - "layer": "api", - "moduleName": "weapp" - }, - "IWeappService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/api/weapp/IWeappService.java", - "className": "IWeappService", - "layer": "api", - "moduleName": "weapp" - }, - "ICoreWeappCloudService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/core/weapp/ICoreWeappCloudService.java", - "className": "ICoreWeappCloudService", - "layer": "core", - "moduleName": "weapp" - }, - "ICoreWeappConfigService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/core/weapp/ICoreWeappConfigService.java", - "className": "ICoreWeappConfigService", - "layer": "core", - "moduleName": "weapp" - }, - "ICoreWeappDeliveryService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/core/weapp/ICoreWeappDeliveryService.java", - "className": "ICoreWeappDeliveryService", - "layer": "core", - "moduleName": "weapp" - }, - "ICoreWeappService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/core/weapp/ICoreWeappService.java", - "className": "ICoreWeappService", - "layer": "core", - "moduleName": "weapp" - } - }, - "wechat": { - "IWechatConfigService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/admin/wechat/IWechatConfigService.java", - "className": "IWechatConfigService", - "layer": "admin", - "moduleName": "wechat" - }, - "IWechatFansService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/admin/wechat/IWechatFansService.java", - "className": "IWechatFansService", - "layer": "admin", - "moduleName": "wechat" - }, - "IWechatMediaService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/admin/wechat/IWechatMediaService.java", - "className": "IWechatMediaService", - "layer": "admin", - "moduleName": "wechat" - }, - "IWechatMenuService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/admin/wechat/IWechatMenuService.java", - "className": "IWechatMenuService", - "layer": "admin", - "moduleName": "wechat" - }, - "IWechatReplyService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/admin/wechat/IWechatReplyService.java", - "className": "IWechatReplyService", - "layer": "admin", - "moduleName": "wechat" - }, - "IWechatTemplateService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/admin/wechat/IWechatTemplateService.java", - "className": "IWechatTemplateService", - "layer": "admin", - "moduleName": "wechat" - }, - "IServeService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/api/wechat/IServeService.java", - "className": "IServeService", - "layer": "api", - "moduleName": "wechat" - }, - "IWechatService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/api/wechat/IWechatService.java", - "className": "IWechatService", - "layer": "api", - "moduleName": "wechat" - }, - "ICoreWechatConfigService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/core/wechat/ICoreWechatConfigService.java", - "className": "ICoreWechatConfigService", - "layer": "core", - "moduleName": "wechat" - }, - "ICoreWechatReplyService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/core/wechat/ICoreWechatReplyService.java", - "className": "ICoreWechatReplyService", - "layer": "core", - "moduleName": "wechat" - } - }, - "wxoplatform": { - "IOplatformConfigService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/admin/wxoplatform/IOplatformConfigService.java", - "className": "IOplatformConfigService", - "layer": "admin", - "moduleName": "wxoplatform" - }, - "IOplatformServerService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/admin/wxoplatform/IOplatformServerService.java", - "className": "IOplatformServerService", - "layer": "admin", - "moduleName": "wxoplatform" - }, - "IOplatformService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/admin/wxoplatform/IOplatformService.java", - "className": "IOplatformService", - "layer": "admin", - "moduleName": "wxoplatform" - }, - "IWeappVersionService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/admin/wxoplatform/IWeappVersionService.java", - "className": "IWeappVersionService", - "layer": "admin", - "moduleName": "wxoplatform" - }, - "ICoreOplatformConfigService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/core/wxoplatform/ICoreOplatformConfigService.java", - "className": "ICoreOplatformConfigService", - "layer": "core", - "moduleName": "wxoplatform" - }, - "ICoreOplatformService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/core/wxoplatform/ICoreOplatformService.java", - "className": "ICoreOplatformService", - "layer": "core", - "moduleName": "wxoplatform" - } - }, - "agreement": { - "IAgreementService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/api/agreement/IAgreementService.java", - "className": "IAgreementService", - "layer": "api", - "moduleName": "agreement" - } - }, - "base": { - "ApiBaseParam": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/api/base/ApiBaseParam.java", - "className": "ApiBaseParam", - "layer": "api", - "moduleName": "base" - } - }, - "login": { - "IAuthService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/api/login/IAuthService.java", - "className": "IAuthService", - "layer": "api", - "moduleName": "login" - }, - "ILoginService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/api/login/ILoginService.java", - "className": "ILoginService", - "layer": "api", - "moduleName": "login" - }, - "IRegisterService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/api/login/IRegisterService.java", - "className": "IRegisterService", - "layer": "api", - "moduleName": "login" - } - }, - "app": { - "ICoreAppService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/core/app/ICoreAppService.java", - "className": "ICoreAppService", - "layer": "core", - "moduleName": "app" - }, - "ICoreAsyncTaskService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/core/app/ICoreAsyncTaskService.java", - "className": "ICoreAsyncTaskService", - "layer": "core", - "moduleName": "app" - }, - "ICoreQueueService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/core/app/ICoreQueueService.java", - "className": "ICoreQueueService", - "layer": "core", - "moduleName": "app" - } - }, - "channel": { - "ICoreH5Service": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/core/channel/ICoreH5Service.java", - "className": "ICoreH5Service", - "layer": "core", - "moduleName": "channel" - }, - "ICorePcService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/core/channel/ICorePcService.java", - "className": "ICorePcService", - "layer": "core", - "moduleName": "channel" - } - }, - "index": { - "ICorePromotionAdvService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/core/index/ICorePromotionAdvService.java", - "className": "ICorePromotionAdvService", - "layer": "core", - "moduleName": "index" - } - }, - "poster": { - "ICorePosterService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/core/poster/ICorePosterService.java", - "className": "ICorePosterService", - "layer": "core", - "moduleName": "poster" - } - }, - "schedule": { - "ICoreScheduleService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/core/schedule/ICoreScheduleService.java", - "className": "ICoreScheduleService", - "layer": "core", - "moduleName": "schedule" - } - }, - "sms": { - "ICoreSmsService": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/service/core/sms/ICoreSmsService.java", - "className": "ICoreSmsService", - "layer": "core", - "moduleName": "sms" - } - } - }, - "javaMappers": { - "addon": { - "AddonLogMapper": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/mapper/addon/AddonLogMapper.java", - "className": "AddonLogMapper", - "moduleName": "addon" - }, - "AddonMapper": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/mapper/addon/AddonMapper.java", - "className": "AddonMapper", - "moduleName": "addon" - } - }, - "applet": { - "AppletSiteVersionMapper": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/mapper/applet/AppletSiteVersionMapper.java", - "className": "AppletSiteVersionMapper", - "moduleName": "applet" - }, - "AppletVersionMapper": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/mapper/applet/AppletVersionMapper.java", - "className": "AppletVersionMapper", - "moduleName": "applet" - } - }, - "diy": { - "DiyPageMapper": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/mapper/diy/DiyPageMapper.java", - "className": "DiyPageMapper", - "moduleName": "diy" - }, - "DiyRouteMapper": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/mapper/diy/DiyRouteMapper.java", - "className": "DiyRouteMapper", - "moduleName": "diy" - }, - "DiyThemeMapper": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/mapper/diy/DiyThemeMapper.java", - "className": "DiyThemeMapper", - "moduleName": "diy" - } - }, - "diy_form": { - "DiyFormFieldsMapper": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/mapper/diy_form/DiyFormFieldsMapper.java", - "className": "DiyFormFieldsMapper", - "moduleName": "diy_form" - }, - "DiyFormMapper": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/mapper/diy_form/DiyFormMapper.java", - "className": "DiyFormMapper", - "moduleName": "diy_form" - }, - "DiyFormRecordsFieldsMapper": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/mapper/diy_form/DiyFormRecordsFieldsMapper.java", - "className": "DiyFormRecordsFieldsMapper", - "moduleName": "diy_form" - }, - "DiyFormRecordsMapper": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/mapper/diy_form/DiyFormRecordsMapper.java", - "className": "DiyFormRecordsMapper", - "moduleName": "diy_form" - }, - "DiyFormSubmitConfigMapper": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/mapper/diy_form/DiyFormSubmitConfigMapper.java", - "className": "DiyFormSubmitConfigMapper", - "moduleName": "diy_form" - }, - "DiyFormWriteConfigMapper": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/mapper/diy_form/DiyFormWriteConfigMapper.java", - "className": "DiyFormWriteConfigMapper", - "moduleName": "diy_form" - } - }, - "generator": { - "GenerateColumnMapper": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/mapper/generator/GenerateColumnMapper.java", - "className": "GenerateColumnMapper", - "moduleName": "generator" - }, - "GenerateTableMapper": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/mapper/generator/GenerateTableMapper.java", - "className": "GenerateTableMapper", - "moduleName": "generator" - } - }, - "member": { - "MemberAccountLogMapper": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/mapper/member/MemberAccountLogMapper.java", - "className": "MemberAccountLogMapper", - "moduleName": "member" - }, - "MemberAddressMapper": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/mapper/member/MemberAddressMapper.java", - "className": "MemberAddressMapper", - "moduleName": "member" - }, - "MemberCashOutAccountMapper": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/mapper/member/MemberCashOutAccountMapper.java", - "className": "MemberCashOutAccountMapper", - "moduleName": "member" - }, - "MemberCashOutMapper": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/mapper/member/MemberCashOutMapper.java", - "className": "MemberCashOutMapper", - "moduleName": "member" - }, - "MemberLabelMapper": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/mapper/member/MemberLabelMapper.java", - "className": "MemberLabelMapper", - "moduleName": "member" - }, - "MemberLevelMapper": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/mapper/member/MemberLevelMapper.java", - "className": "MemberLevelMapper", - "moduleName": "member" - }, - "MemberMapper": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/mapper/member/MemberMapper.java", - "className": "MemberMapper", - "moduleName": "member" - }, - "MemberSignMapper": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/mapper/member/MemberSignMapper.java", - "className": "MemberSignMapper", - "moduleName": "member" - } - }, - "oplatform": { - "WxOplatfromWeappVersionMapper": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/mapper/oplatform/WxOplatfromWeappVersionMapper.java", - "className": "WxOplatfromWeappVersionMapper", - "moduleName": "oplatform" - } - }, - "pay": { - "PayChannelMapper": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/mapper/pay/PayChannelMapper.java", - "className": "PayChannelMapper", - "moduleName": "pay" - }, - "PayMapper": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/mapper/pay/PayMapper.java", - "className": "PayMapper", - "moduleName": "pay" - }, - "PayRefundMapper": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/mapper/pay/PayRefundMapper.java", - "className": "PayRefundMapper", - "moduleName": "pay" - }, - "PayTransferMapper": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/mapper/pay/PayTransferMapper.java", - "className": "PayTransferMapper", - "moduleName": "pay" - }, - "PayTransferSceneMapper": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/mapper/pay/PayTransferSceneMapper.java", - "className": "PayTransferSceneMapper", - "moduleName": "pay" - } - }, - "site": { - "SiteAccountLogMapper": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/mapper/site/SiteAccountLogMapper.java", - "className": "SiteAccountLogMapper", - "moduleName": "site" - }, - "SiteAddonInitRecordMapper": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/mapper/site/SiteAddonInitRecordMapper.java", - "className": "SiteAddonInitRecordMapper", - "moduleName": "site" - }, - "SiteGroupMapper": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/mapper/site/SiteGroupMapper.java", - "className": "SiteGroupMapper", - "moduleName": "site" - }, - "SiteMapper": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/mapper/site/SiteMapper.java", - "className": "SiteMapper", - "moduleName": "site" - } - }, - "stat": { - "StatHourMapper": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/mapper/stat/StatHourMapper.java", - "className": "StatHourMapper", - "moduleName": "stat" - } - }, - "sys": { - "NiuSmsTemplateMapper": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/mapper/sys/NiuSmsTemplateMapper.java", - "className": "NiuSmsTemplateMapper", - "moduleName": "sys" - }, - "SysAgreementMapper": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/mapper/sys/SysAgreementMapper.java", - "className": "SysAgreementMapper", - "moduleName": "sys" - }, - "SysAreaMapper": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/mapper/sys/SysAreaMapper.java", - "className": "SysAreaMapper", - "moduleName": "sys" - }, - "SysAttachmentCategoryMapper": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/mapper/sys/SysAttachmentCategoryMapper.java", - "className": "SysAttachmentCategoryMapper", - "moduleName": "sys" - }, - "SysAttachmentMapper": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/mapper/sys/SysAttachmentMapper.java", - "className": "SysAttachmentMapper", - "moduleName": "sys" - }, - "SysBackupRecordsMapper": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/mapper/sys/SysBackupRecordsMapper.java", - "className": "SysBackupRecordsMapper", - "moduleName": "sys" - }, - "SysConfigMapper": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/mapper/sys/SysConfigMapper.java", - "className": "SysConfigMapper", - "moduleName": "sys" - }, - "SysDictMapper": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/mapper/sys/SysDictMapper.java", - "className": "SysDictMapper", - "moduleName": "sys" - }, - "SysExportMapper": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/mapper/sys/SysExportMapper.java", - "className": "SysExportMapper", - "moduleName": "sys" - }, - "SysMenuMapper": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/mapper/sys/SysMenuMapper.java", - "className": "SysMenuMapper", - "moduleName": "sys" - }, - "SysNoticeLogMapper": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/mapper/sys/SysNoticeLogMapper.java", - "className": "SysNoticeLogMapper", - "moduleName": "sys" - }, - "SysNoticeMapper": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/mapper/sys/SysNoticeMapper.java", - "className": "SysNoticeMapper", - "moduleName": "sys" - }, - "SysNoticeSmsLogMapper": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/mapper/sys/SysNoticeSmsLogMapper.java", - "className": "SysNoticeSmsLogMapper", - "moduleName": "sys" - }, - "SysPosterMapper": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/mapper/sys/SysPosterMapper.java", - "className": "SysPosterMapper", - "moduleName": "sys" - }, - "SysPrinterMapper": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/mapper/sys/SysPrinterMapper.java", - "className": "SysPrinterMapper", - "moduleName": "sys" - }, - "SysPrinterTemplateMapper": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/mapper/sys/SysPrinterTemplateMapper.java", - "className": "SysPrinterTemplateMapper", - "moduleName": "sys" - }, - "SysRoleMapper": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/mapper/sys/SysRoleMapper.java", - "className": "SysRoleMapper", - "moduleName": "sys" - }, - "SysScheduleLogMapper": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/mapper/sys/SysScheduleLogMapper.java", - "className": "SysScheduleLogMapper", - "moduleName": "sys" - }, - "SysScheduleMapper": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/mapper/sys/SysScheduleMapper.java", - "className": "SysScheduleMapper", - "moduleName": "sys" - }, - "SysUpgradeRecordsMapper": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/mapper/sys/SysUpgradeRecordsMapper.java", - "className": "SysUpgradeRecordsMapper", - "moduleName": "sys" - }, - "SysUserLogMapper": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/mapper/sys/SysUserLogMapper.java", - "className": "SysUserLogMapper", - "moduleName": "sys" - }, - "SysUserMapper": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/mapper/sys/SysUserMapper.java", - "className": "SysUserMapper", - "moduleName": "sys" - }, - "SysUserRoleMapper": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/mapper/sys/SysUserRoleMapper.java", - "className": "SysUserRoleMapper", - "moduleName": "sys" - } - }, - "user": { - "UserCreateSiteLimitMapper": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/mapper/user/UserCreateSiteLimitMapper.java", - "className": "UserCreateSiteLimitMapper", - "moduleName": "user" - } - }, - "verify": { - "VerifierMapper": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/mapper/verify/VerifierMapper.java", - "className": "VerifierMapper", - "moduleName": "verify" - }, - "VerifyMapper": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/mapper/verify/VerifyMapper.java", - "className": "VerifyMapper", - "moduleName": "verify" - } - }, - "weapp": { - "WeappVersionMapper": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/mapper/weapp/WeappVersionMapper.java", - "className": "WeappVersionMapper", - "moduleName": "weapp" - } - }, - "wechat": { - "WechatFansMapper": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/mapper/wechat/WechatFansMapper.java", - "className": "WechatFansMapper", - "moduleName": "wechat" - }, - "WechatMediaMapper": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/mapper/wechat/WechatMediaMapper.java", - "className": "WechatMediaMapper", - "moduleName": "wechat" - }, - "WechatReplyMapper": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/mapper/wechat/WechatReplyMapper.java", - "className": "WechatReplyMapper", - "moduleName": "wechat" - } - } - }, - "javaEnums": { - "addon": { - "AddonActionEnum": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/enums/addon/AddonActionEnum.java", - "className": "AddonActionEnum", - "moduleName": "addon" - }, - "AddonStatusEnum": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/enums/addon/AddonStatusEnum.java", - "className": "AddonStatusEnum", - "moduleName": "addon" - }, - "AddonTypeEnum": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/enums/addon/AddonTypeEnum.java", - "className": "AddonTypeEnum", - "moduleName": "addon" - } - }, - "applet": { - "AppletlEnum": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/enums/applet/AppletlEnum.java", - "className": "AppletlEnum", - "moduleName": "applet" - } - }, - "cashout": { - "CashOutTypeEnum": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/enums/cashout/CashOutTypeEnum.java", - "className": "CashOutTypeEnum", - "moduleName": "cashout" - } - }, - "channel": { - "CertEnum": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/enums/channel/CertEnum.java", - "className": "CertEnum", - "moduleName": "channel" - }, - "ReplyStatusEnum": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/enums/channel/ReplyStatusEnum.java", - "className": "ReplyStatusEnum", - "moduleName": "channel" - }, - "WeappVersionStatusEnum": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/enums/channel/WeappVersionStatusEnum.java", - "className": "WeappVersionStatusEnum", - "moduleName": "channel" - }, - "WechatEncryptionTypeEnum": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/enums/channel/WechatEncryptionTypeEnum.java", - "className": "WechatEncryptionTypeEnum", - "moduleName": "channel" - }, - "WechatEnum": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/enums/channel/WechatEnum.java", - "className": "WechatEnum", - "moduleName": "channel" - }, - "WechatMediaTypeEnum": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/enums/channel/WechatMediaTypeEnum.java", - "className": "WechatMediaTypeEnum", - "moduleName": "channel" - }, - "WechatReplyTypeEnum": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/enums/channel/WechatReplyTypeEnum.java", - "className": "WechatReplyTypeEnum", - "moduleName": "channel" - } - }, - "common": { - "ChannelEnum": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/enums/common/ChannelEnum.java", - "className": "ChannelEnum", - "moduleName": "common" - }, - "CommonEnum": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/enums/common/CommonEnum.java", - "className": "CommonEnum", - "moduleName": "common" - }, - "MonthEnum": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/enums/common/MonthEnum.java", - "className": "MonthEnum", - "moduleName": "common" - }, - "SexEnum": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/enums/common/SexEnum.java", - "className": "SexEnum", - "moduleName": "common" - }, - "WeekEnum": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/enums/common/WeekEnum.java", - "className": "WeekEnum", - "moduleName": "common" - } - }, - "diy": { - "ComponentEnum": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/enums/diy/ComponentEnum.java", - "className": "ComponentEnum", - "moduleName": "diy" - }, - "LinkEnum": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/enums/diy/LinkEnum.java", - "className": "LinkEnum", - "moduleName": "diy" - }, - "PagesEnum": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/enums/diy/PagesEnum.java", - "className": "PagesEnum", - "moduleName": "diy" - }, - "TemplateEnum": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/enums/diy/TemplateEnum.java", - "className": "TemplateEnum", - "moduleName": "diy" - }, - "ThemeColorEnum": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/enums/diy/ThemeColorEnum.java", - "className": "ThemeColorEnum", - "moduleName": "diy" - } - }, - "diy_form": { - "DiyFormActionEnum": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/enums/diy_form/DiyFormActionEnum.java", - "className": "DiyFormActionEnum", - "moduleName": "diy_form" - }, - "DiyFormAddTypeEnum": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/enums/diy_form/DiyFormAddTypeEnum.java", - "className": "DiyFormAddTypeEnum", - "moduleName": "diy_form" - }, - "DiyFormComponentEnum": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/enums/diy_form/DiyFormComponentEnum.java", - "className": "DiyFormComponentEnum", - "moduleName": "diy_form" - }, - "DiyFormContentEnum": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/enums/diy_form/DiyFormContentEnum.java", - "className": "DiyFormContentEnum", - "moduleName": "diy_form" - }, - "DiyFormEditEnum": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/enums/diy_form/DiyFormEditEnum.java", - "className": "DiyFormEditEnum", - "moduleName": "diy_form" - }, - "DiyFormLimitEnum": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/enums/diy_form/DiyFormLimitEnum.java", - "className": "DiyFormLimitEnum", - "moduleName": "diy_form" - }, - "DiyFormMemberEnum": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/enums/diy_form/DiyFormMemberEnum.java", - "className": "DiyFormMemberEnum", - "moduleName": "diy_form" - }, - "DiyFormTemplateEnum": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/enums/diy_form/DiyFormTemplateEnum.java", - "className": "DiyFormTemplateEnum", - "moduleName": "diy_form" - }, - "DiyFormTypeEnum": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/enums/diy_form/DiyFormTypeEnum.java", - "className": "DiyFormTypeEnum", - "moduleName": "diy_form" - }, - "DiyFormVerifyEnum": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/enums/diy_form/DiyFormVerifyEnum.java", - "className": "DiyFormVerifyEnum", - "moduleName": "diy_form" - } - }, - "generator": { - "SqlColumnEnum": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/enums/generator/SqlColumnEnum.java", - "className": "SqlColumnEnum", - "moduleName": "generator" - } - }, - "member": { - "AccountTypeEnum": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/enums/member/AccountTypeEnum.java", - "className": "AccountTypeEnum", - "moduleName": "member" - }, - "BenefitsEnum": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/enums/member/BenefitsEnum.java", - "className": "BenefitsEnum", - "moduleName": "member" - }, - "GiftEnum": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/enums/member/GiftEnum.java", - "className": "GiftEnum", - "moduleName": "member" - }, - "GrowthRuleEnum": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/enums/member/GrowthRuleEnum.java", - "className": "GrowthRuleEnum", - "moduleName": "member" - }, - "MemberAccountChangeTypeEnum": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/enums/member/MemberAccountChangeTypeEnum.java", - "className": "MemberAccountChangeTypeEnum", - "moduleName": "member" - }, - "MemberCashOutStatusEnum": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/enums/member/MemberCashOutStatusEnum.java", - "className": "MemberCashOutStatusEnum", - "moduleName": "member" - }, - "MemberLevelStyleEnum": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/enums/member/MemberLevelStyleEnum.java", - "className": "MemberLevelStyleEnum", - "moduleName": "member" - }, - "MemberLoginTypeEnum": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/enums/member/MemberLoginTypeEnum.java", - "className": "MemberLoginTypeEnum", - "moduleName": "member" - }, - "MemberRegisterChannelEnum": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/enums/member/MemberRegisterChannelEnum.java", - "className": "MemberRegisterChannelEnum", - "moduleName": "member" - }, - "MemberRegisterTypeEnum": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/enums/member/MemberRegisterTypeEnum.java", - "className": "MemberRegisterTypeEnum", - "moduleName": "member" - }, - "PointRuleEnum": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/enums/member/PointRuleEnum.java", - "className": "PointRuleEnum", - "moduleName": "member" - }, - "SignStatusEnum": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/enums/member/SignStatusEnum.java", - "className": "SignStatusEnum", - "moduleName": "member" - }, - "StatusEnum": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/enums/member/StatusEnum.java", - "className": "StatusEnum", - "moduleName": "member" - }, - "TestEnum": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/enums/member/TestEnum.java", - "className": "TestEnum", - "moduleName": "member" - } - }, - "notice": { - "NoticeEnum": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/enums/notice/NoticeEnum.java", - "className": "NoticeEnum", - "moduleName": "notice" - }, - "NoticeTypeEnum": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/enums/notice/NoticeTypeEnum.java", - "className": "NoticeTypeEnum", - "moduleName": "notice" - }, - "SignAuditStatusEnum": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/enums/notice/SignAuditStatusEnum.java", - "className": "SignAuditStatusEnum", - "moduleName": "notice" - }, - "TemplateAuditStatus": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/enums/notice/TemplateAuditStatus.java", - "className": "TemplateAuditStatus", - "moduleName": "notice" - }, - "TemplateParamsTypeEnum": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/enums/notice/TemplateParamsTypeEnum.java", - "className": "TemplateParamsTypeEnum", - "moduleName": "notice" - }, - "TemplateStatusEnum": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/enums/notice/TemplateStatusEnum.java", - "className": "TemplateStatusEnum", - "moduleName": "notice" - }, - "TemplateTypeEnum": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/enums/notice/TemplateTypeEnum.java", - "className": "TemplateTypeEnum", - "moduleName": "notice" - } - }, - "pay": { - "OnliepayStatusEnum": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/enums/pay/OnliepayStatusEnum.java", - "className": "OnliepayStatusEnum", - "moduleName": "pay" - }, - "OrderStatusEnum": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/enums/pay/OrderStatusEnum.java", - "className": "OrderStatusEnum", - "moduleName": "pay" - }, - "PayMainType": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/enums/pay/PayMainType.java", - "className": "PayMainType", - "moduleName": "pay" - }, - "PayStatusEnum": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/enums/pay/PayStatusEnum.java", - "className": "PayStatusEnum", - "moduleName": "pay" - }, - "PayTypeEnum": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/enums/pay/PayTypeEnum.java", - "className": "PayTypeEnum", - "moduleName": "pay" - }, - "RefundStatusEnum": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/enums/pay/RefundStatusEnum.java", - "className": "RefundStatusEnum", - "moduleName": "pay" - }, - "RefundTransferStatusEnum": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/enums/pay/RefundTransferStatusEnum.java", - "className": "RefundTransferStatusEnum", - "moduleName": "pay" - }, - "RefundTypeEnum": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/enums/pay/RefundTypeEnum.java", - "className": "RefundTypeEnum", - "moduleName": "pay" - }, - "TransferSceneEnum": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/enums/pay/TransferSceneEnum.java", - "className": "TransferSceneEnum", - "moduleName": "pay" - }, - "TransferStatusEnum": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/enums/pay/TransferStatusEnum.java", - "className": "TransferStatusEnum", - "moduleName": "pay" - }, - "TransferTypeEnum": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/enums/pay/TransferTypeEnum.java", - "className": "TransferTypeEnum", - "moduleName": "pay" - } - }, - "poster": { - "PosterStatusEnum": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/enums/poster/PosterStatusEnum.java", - "className": "PosterStatusEnum", - "moduleName": "poster" - }, - "PosterTypeEnum": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/enums/poster/PosterTypeEnum.java", - "className": "PosterTypeEnum", - "moduleName": "poster" - } - }, - "scan": { - "ScanEnum": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/enums/scan/ScanEnum.java", - "className": "ScanEnum", - "moduleName": "scan" - } - }, - "site": { - "ShowMarketingEnum": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/enums/site/ShowMarketingEnum.java", - "className": "ShowMarketingEnum", - "moduleName": "site" - }, - "SiteAccountLogEnum": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/enums/site/SiteAccountLogEnum.java", - "className": "SiteAccountLogEnum", - "moduleName": "site" - }, - "SiteInitEnum": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/enums/site/SiteInitEnum.java", - "className": "SiteInitEnum", - "moduleName": "site" - }, - "SiteStatusEnum": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/enums/site/SiteStatusEnum.java", - "className": "SiteStatusEnum", - "moduleName": "site" - } - }, - "sys": { - "AgreementEnum": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/enums/sys/AgreementEnum.java", - "className": "AgreementEnum", - "moduleName": "sys" - }, - "AppTypeEnum": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/enums/sys/AppTypeEnum.java", - "className": "AppTypeEnum", - "moduleName": "sys" - }, - "BackupRecordStatusEnum": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/enums/sys/BackupRecordStatusEnum.java", - "className": "BackupRecordStatusEnum", - "moduleName": "sys" - }, - "CacheTagEnum": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/enums/sys/CacheTagEnum.java", - "className": "CacheTagEnum", - "moduleName": "sys" - }, - "ConfigKeyEnum": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/enums/sys/ConfigKeyEnum.java", - "className": "ConfigKeyEnum", - "moduleName": "sys" - }, - "ExportDataType": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/enums/sys/ExportDataType.java", - "className": "ExportDataType", - "moduleName": "sys" - }, - "ExportEnum": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/enums/sys/ExportEnum.java", - "className": "ExportEnum", - "moduleName": "sys" - }, - "FileEnum": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/enums/sys/FileEnum.java", - "className": "FileEnum", - "moduleName": "sys" - }, - "MenuEnum": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/enums/sys/MenuEnum.java", - "className": "MenuEnum", - "moduleName": "sys" - }, - "MenuSourceEnum": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/enums/sys/MenuSourceEnum.java", - "className": "MenuSourceEnum", - "moduleName": "sys" - }, - "MenuStatusEnum": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/enums/sys/MenuStatusEnum.java", - "className": "MenuStatusEnum", - "moduleName": "sys" - }, - "RoleStatusEnum": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/enums/sys/RoleStatusEnum.java", - "className": "RoleStatusEnum", - "moduleName": "sys" - }, - "SmsStatusEnum": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/enums/sys/SmsStatusEnum.java", - "className": "SmsStatusEnum", - "moduleName": "sys" - }, - "SmsTypeEnum": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/enums/sys/SmsTypeEnum.java", - "className": "SmsTypeEnum", - "moduleName": "sys" - }, - "StorageEnum": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/enums/sys/StorageEnum.java", - "className": "StorageEnum", - "moduleName": "sys" - }, - "SysPrinterBrandEnum": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/enums/sys/SysPrinterBrandEnum.java", - "className": "SysPrinterBrandEnum", - "moduleName": "sys" - }, - "SysPrinterTypeEnum": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/enums/sys/SysPrinterTypeEnum.java", - "className": "SysPrinterTypeEnum", - "moduleName": "sys" - }, - "UpgradeRecordStatusEnum": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/enums/sys/UpgradeRecordStatusEnum.java", - "className": "UpgradeRecordStatusEnum", - "moduleName": "sys" - }, - "UserEnum": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/enums/sys/UserEnum.java", - "className": "UserEnum", - "moduleName": "sys" - }, - "VerifyTypeEnum": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/enums/sys/VerifyTypeEnum.java", - "className": "VerifyTypeEnum", - "moduleName": "sys" - } - }, - "upload": { - "UploadRolesEnum": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/enums/upload/UploadRolesEnum.java", - "className": "UploadRolesEnum", - "moduleName": "upload" - }, - "UploadThumbTypeEnum": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/enums/upload/UploadThumbTypeEnum.java", - "className": "UploadThumbTypeEnum", - "moduleName": "upload" - } - } - }, - "javaEvents": { - "common": { - "CommonEvent": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/event/common/CommonEvent.java", - "className": "CommonEvent", - "moduleName": "common" - }, - "CommonEventDefiner": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/event/common/CommonEventDefiner.java", - "className": "CommonEventDefiner", - "moduleName": "common" - } - }, - "diy": { - "DiyFormDelBeforeEventDefiner": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/event/diy/DiyFormDelBeforeEventDefiner.java", - "className": "DiyFormDelBeforeEventDefiner", - "moduleName": "diy" - } - }, - "example": { - "CoreSourceEvent": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/event/example/CoreSourceEvent.java", - "className": "CoreSourceEvent", - "moduleName": "example" - }, - "DemoEventDefiner": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/event/example/DemoEventDefiner.java", - "className": "DemoEventDefiner", - "moduleName": "example" - }, - "ExampleEventDefiner": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/event/example/ExampleEventDefiner.java", - "className": "ExampleEventDefiner", - "moduleName": "example" - } - }, - "member": { - "MemberAccountEvent": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/event/member/MemberAccountEvent.java", - "className": "MemberAccountEvent", - "moduleName": "member" - }, - "MemberLoginEvent": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/event/member/MemberLoginEvent.java", - "className": "MemberLoginEvent", - "moduleName": "member" - }, - "MemberRegisterEvent": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/event/member/MemberRegisterEvent.java", - "className": "MemberRegisterEvent", - "moduleName": "member" - } - }, - "notice": { - "SendNoticeEventDefiner": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/event/notice/SendNoticeEventDefiner.java", - "className": "SendNoticeEventDefiner", - "moduleName": "notice" - } - }, - "order": { - "WapOrderDetailPathDefiner": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/event/order/WapOrderDetailPathDefiner.java", - "className": "WapOrderDetailPathDefiner", - "moduleName": "order" - } - }, - "pay": { - "PayCloseEvent": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/event/pay/PayCloseEvent.java", - "className": "PayCloseEvent", - "moduleName": "pay" - }, - "PayCreateEventDefiner": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/event/pay/PayCreateEventDefiner.java", - "className": "PayCreateEventDefiner", - "moduleName": "pay" - }, - "PaySuccessEvent": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/event/pay/PaySuccessEvent.java", - "className": "PaySuccessEvent", - "moduleName": "pay" - }, - "PayTradeInfoDefiner": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/event/pay/PayTradeInfoDefiner.java", - "className": "PayTradeInfoDefiner", - "moduleName": "pay" - }, - "TransferSuccessEvent": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/event/pay/TransferSuccessEvent.java", - "className": "TransferSuccessEvent", - "moduleName": "pay" - } - }, - "refund": { - "RefundFailEvent": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/event/refund/RefundFailEvent.java", - "className": "RefundFailEvent", - "moduleName": "refund" - }, - "RefundSuccessEvent": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/event/refund/RefundSuccessEvent.java", - "className": "RefundSuccessEvent", - "moduleName": "refund" - } - }, - "site": { - "SiteAddAfterEvent": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/event/site/SiteAddAfterEvent.java", - "className": "SiteAddAfterEvent", - "moduleName": "site" - }, - "SiteEditAfterEvent": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/event/site/SiteEditAfterEvent.java", - "className": "SiteEditAfterEvent", - "moduleName": "site" - } - }, - "sys": { - "CommonEvent": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/event/sys/CommonEvent.java", - "className": "CommonEvent", - "moduleName": "sys" - }, - "CommonEventDefiner": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/event/sys/CommonEventDefiner.java", - "className": "CommonEventDefiner", - "moduleName": "sys" - }, - "ExportDataEventDefiner": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/event/sys/ExportDataEventDefiner.java", - "className": "ExportDataEventDefiner", - "moduleName": "sys" - }, - "ExportDataTypeEventDefiner": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/event/sys/ExportDataTypeEventDefiner.java", - "className": "ExportDataTypeEventDefiner", - "moduleName": "sys" - }, - "GetPosterDataEventDefiner": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/event/sys/GetPosterDataEventDefiner.java", - "className": "GetPosterDataEventDefiner", - "moduleName": "sys" - }, - "GetQrcodeOfChannelDefiner": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/event/sys/GetQrcodeOfChannelDefiner.java", - "className": "GetQrcodeOfChannelDefiner", - "moduleName": "sys" - }, - "InitWapEvent": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/event/sys/InitWapEvent.java", - "className": "InitWapEvent", - "moduleName": "sys" - }, - "PosterDrawEvent": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/event/sys/PosterDrawEvent.java", - "className": "PosterDrawEvent", - "moduleName": "sys" - }, - "VerifyCheckEventDefiner": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/event/sys/VerifyCheckEventDefiner.java", - "className": "VerifyCheckEventDefiner", - "moduleName": "sys" - }, - "VerifyCreateEventDefiner": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/event/sys/VerifyCreateEventDefiner.java", - "className": "VerifyCreateEventDefiner", - "moduleName": "sys" - }, - "VerifyEventDefiner": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/event/sys/VerifyEventDefiner.java", - "className": "VerifyEventDefiner", - "moduleName": "sys" - } - }, - "test": { - "TestEvent": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/event/test/TestEvent.java", - "className": "TestEvent", - "moduleName": "test" - } - } - }, - "javaListeners": { - "example": { - "CoreEventListener": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/listener/example/CoreEventListener.java", - "className": "CoreEventListener", - "moduleName": "example" - }, - "CoreExampleEventListener": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/listener/example/CoreExampleEventListener.java", - "className": "CoreExampleEventListener", - "moduleName": "example" - }, - "DemoEventListener": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/listener/example/DemoEventListener.java", - "className": "DemoEventListener", - "moduleName": "example" - }, - "ShopExampleEventListener": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/listener/example/ShopExampleEventListener.java", - "className": "ShopExampleEventListener", - "moduleName": "example" - } - }, - "member": { - "MemberAccountListener": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/listener/member/MemberAccountListener.java", - "className": "MemberAccountListener", - "moduleName": "member" - }, - "MemberCashOutTransferSuccessListener": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/listener/member/MemberCashOutTransferSuccessListener.java", - "className": "MemberCashOutTransferSuccessListener", - "moduleName": "member" - }, - "MemberLoginListener": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/listener/member/MemberLoginListener.java", - "className": "MemberLoginListener", - "moduleName": "member" - }, - "MemberRegisterListener": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/listener/member/MemberRegisterListener.java", - "className": "MemberRegisterListener", - "moduleName": "member" - } - }, - "notice": { - "SmsSendNoticeEventListener": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/listener/notice/SmsSendNoticeEventListener.java", - "className": "SmsSendNoticeEventListener", - "moduleName": "notice" - }, - "WeappSendNoticeEventListener": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/listener/notice/WeappSendNoticeEventListener.java", - "className": "WeappSendNoticeEventListener", - "moduleName": "notice" - }, - "WechatSendNoticeEventListener": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/listener/notice/WechatSendNoticeEventListener.java", - "className": "WechatSendNoticeEventListener", - "moduleName": "notice" - } - }, - "pay": { - "PaySuccessListener": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/listener/pay/PaySuccessListener.java", - "className": "PaySuccessListener", - "moduleName": "pay" - }, - "RefundSuccessListener": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/listener/pay/RefundSuccessListener.java", - "className": "RefundSuccessListener", - "moduleName": "pay" - }, - "TransferSuccessListener": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/listener/pay/TransferSuccessListener.java", - "className": "TransferSuccessListener", - "moduleName": "pay" - } - }, - "poster": { - "GetPosterDataListener": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/listener/poster/GetPosterDataListener.java", - "className": "GetPosterDataListener", - "moduleName": "poster" - } - }, - "site": { - "SiteAddAfterListener": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/listener/site/SiteAddAfterListener.java", - "className": "SiteAddAfterListener", - "moduleName": "site" - } - }, - "sys": { - "MemberExportDataListener": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/listener/sys/MemberExportDataListener.java", - "className": "MemberExportDataListener", - "moduleName": "sys" - }, - "PosterDrawListener": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/listener/sys/PosterDrawListener.java", - "className": "PosterDrawListener", - "moduleName": "sys" - }, - "SystemRestartListener": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/listener/sys/SystemRestartListener.java", - "className": "SystemRestartListener", - "moduleName": "sys" - }, - "WeappQrcodeListener": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/listener/sys/WeappQrcodeListener.java", - "className": "WeappQrcodeListener", - "moduleName": "sys" - }, - "WechatQrcodeListener": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/listener/sys/WechatQrcodeListener.java", - "className": "WechatQrcodeListener", - "moduleName": "sys" - } - }, - "test": { - "TestListener": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/listener/test/TestListener.java", - "className": "TestListener", - "moduleName": "test" - } - } - }, - "javaJobs": { - "schedule": { - "AutoClearPosterAndQrcode": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/job/schedule/AutoClearPosterAndQrcode.java", - "className": "AutoClearPosterAndQrcode", - "moduleName": "schedule" - }, - "AutoClearScheduleLog": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/job/schedule/AutoClearScheduleLog.java", - "className": "AutoClearScheduleLog", - "moduleName": "schedule" - } - }, - "site": { - "SiteExpireCloseJob": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/job/site/SiteExpireCloseJob.java", - "className": "SiteExpireCloseJob", - "moduleName": "site" - } - }, - "sys": { - "AutoClearUserLog": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/job/sys/AutoClearUserLog.java", - "className": "AutoClearUserLog", - "moduleName": "sys" - } - }, - "upgrade": { - "AutoClearUpgradeRecords": { - "filePath": "/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core/job/upgrade/AutoClearUpgradeRecords.java", - "className": "AutoClearUpgradeRecords", - "moduleName": "upgrade" - } - } - } -} \ No newline at end of file diff --git a/tools/php-file-discovery.js b/tools/php-file-discovery.js deleted file mode 100644 index 595abce2..00000000 --- a/tools/php-file-discovery.js +++ /dev/null @@ -1,1330 +0,0 @@ -#!/usr/bin/env node - -/** - * PHP文件发现工具 - * 自动发现所有PHP控制器和服务文件,建立正确的映射关系 - */ - -const fs = require('fs'); -const path = require('path'); - -class PHPFileDiscovery { - constructor() { - this.phpBasePath = '/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-php/niucloud'; - this.javaBasePath = '/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/niucloud-java/niucloud-core/src/main/java/com/niu/core'; - this.discoveredFiles = { - // PHP层级 - controllers: {}, - services: {}, - models: {}, - validates: {}, - middlewares: {}, - routes: {}, - jobs: {}, - listeners: {}, - commands: {}, - dicts: {}, - traits: {}, - // Java层级(用于对比) - javaControllers: {}, - javaEntities: {}, - javaServices: {}, - javaMappers: {}, - javaEnums: {}, - javaEvents: {}, - javaListeners: {}, - javaJobs: {} - }; - } - - /** - * 发现所有PHP控制器文件 - */ - discoverControllers() { - console.log('🔍 发现PHP控制器文件...'); - - const controllerPaths = [ - // adminapi控制器路径 - 'app/adminapi/controller/sys', - 'app/adminapi/controller/member', - 'app/adminapi/controller/pay', - 'app/adminapi/controller/upload', - 'app/adminapi/controller/login', - 'app/adminapi/controller/agreement', - 'app/adminapi/controller/wechat', - 'app/adminapi/controller/weapp', - 'app/adminapi/controller/diy', - 'app/adminapi/controller/poster', - 'app/adminapi/controller/addon', - 'app/adminapi/controller/aliapp', - 'app/adminapi/controller/auth', - 'app/adminapi/controller/generator', - // 新增缺失的adminapi控制器路径 - 'app/adminapi/controller/applet', - 'app/adminapi/controller/channel', - 'app/adminapi/controller/dict', - 'app/adminapi/controller/home', - 'app/adminapi/controller/index', - 'app/adminapi/controller/niucloud', - 'app/adminapi/controller/notice', - 'app/adminapi/controller/site', - 'app/adminapi/controller/stat', - 'app/adminapi/controller/user', - 'app/adminapi/controller/verify', - 'app/adminapi/controller/wxoplatform', - // api控制器路径 - 'app/api/controller/member', - 'app/api/controller/pay', - 'app/api/controller/upload', - 'app/api/controller/login', - 'app/api/controller/agreement', - 'app/api/controller/wechat', - 'app/api/controller/weapp', - 'app/api/controller/diy', - 'app/api/controller/poster', - 'app/api/controller/addon', - 'app/api/controller/aliapp', - 'app/api/controller/auth', - 'app/api/controller/generator' - ]; - - for (const controllerPath of controllerPaths) { - const fullPath = path.join(this.phpBasePath, controllerPath); - if (fs.existsSync(fullPath)) { - const files = fs.readdirSync(fullPath).filter(file => file.endsWith('.php')); - - for (const file of files) { - const className = file.replace('.php', ''); - const moduleName = this.extractModuleName(controllerPath); - const layer = this.extractLayer(controllerPath); - - if (!this.discoveredFiles.controllers[moduleName]) { - this.discoveredFiles.controllers[moduleName] = {}; - } - - this.discoveredFiles.controllers[moduleName][className] = { - filePath: path.join(fullPath, file), - className: className, - layer: layer, - moduleName: moduleName - }; - - console.log(` ✅ 发现控制器: ${moduleName}/${className} (${layer})`); - } - } - } - } - - /** - * 发现所有PHP服务文件 - */ - discoverServices() { - console.log('🔍 发现PHP服务文件...'); - - const servicePaths = [ - // admin服务路径 - 'app/service/admin/sys', - 'app/service/admin/member', - 'app/service/admin/pay', - 'app/service/admin/upload', - 'app/service/admin/login', - 'app/service/admin/agreement', - 'app/service/admin/wechat', - 'app/service/admin/weapp', - 'app/service/admin/diy', - 'app/service/admin/poster', - 'app/service/admin/addon', - 'app/service/admin/aliapp', - 'app/service/admin/auth', - 'app/service/admin/captcha', - 'app/service/admin/generator', - // 新增缺失的admin服务路径 - 'app/service/admin/applet', - 'app/service/admin/channel', - 'app/service/admin/dict', - 'app/service/admin/home', - 'app/service/admin/index', - 'app/service/admin/niucloud', - 'app/service/admin/notice', - 'app/service/admin/site', - 'app/service/admin/stat', - 'app/service/admin/user', - 'app/service/admin/verify', - 'app/service/admin/upgrade', - 'app/service/admin/wxoplatform', - // api服务路径 - 'app/service/api/member', - 'app/service/api/pay', - 'app/service/api/upload', - 'app/service/api/login', - 'app/service/api/agreement', - 'app/service/api/wechat', - 'app/service/api/weapp', - 'app/service/api/diy', - 'app/service/api/poster', - 'app/service/api/addon', - 'app/service/api/aliapp', - 'app/service/api/auth', - 'app/service/api/captcha', - 'app/service/api/generator', - // core服务路径 - 'app/service/core/sys', - 'app/service/core/member', - 'app/service/core/pay', - 'app/service/core/upload', - 'app/service/core/login', - 'app/service/core/agreement', - 'app/service/core/wechat', - 'app/service/core/weapp', - 'app/service/core/diy', - 'app/service/core/poster', - 'app/service/core/addon', - 'app/service/core/aliapp', - 'app/service/core/auth', - 'app/service/core/captcha', - 'app/service/core/generator', - // 新增缺失的core服务路径 - 'app/service/core/applet', - 'app/service/core/channel', - 'app/service/core/dict', - 'app/service/core/home', - 'app/service/core/index', - 'app/service/core/niucloud', - 'app/service/core/notice', - 'app/service/core/site', - 'app/service/core/stat', - 'app/service/core/user', - 'app/service/core/verify', - 'app/service/core/wxoplatform' - ]; - - for (const servicePath of servicePaths) { - const fullPath = path.join(this.phpBasePath, servicePath); - if (fs.existsSync(fullPath)) { - const files = fs.readdirSync(fullPath).filter(file => file.endsWith('.php')); - - for (const file of files) { - const className = file.replace('.php', ''); - const moduleName = this.extractModuleName(servicePath); - const layer = this.extractLayer(servicePath); - - if (!this.discoveredFiles.services[moduleName]) { - this.discoveredFiles.services[moduleName] = {}; - } - - // 使用 className + layer 作为唯一键,避免不同层级服务被覆盖 - const serviceKey = `${className}_${layer}`; - this.discoveredFiles.services[moduleName][serviceKey] = { - filePath: path.join(fullPath, file), - className: className, - layer: layer, - moduleName: moduleName - }; - - console.log(` ✅ 发现服务: ${moduleName}/${className} (${layer})`); - } - } - } - } - - /** - * 从路径中提取模块名 - */ - extractModuleName(filePath) { - const parts = filePath.split('/'); - - // 对于控制器路径: app/adminapi/controller/member/Member.php - // 模块名是 controller 后面的部分 - const controllerIndex = parts.findIndex(part => part === 'controller'); - if (controllerIndex > 0 && controllerIndex < parts.length - 1) { - return parts[controllerIndex + 1]; - } - - // 对于服务路径: app/service/admin/member/MemberService.php - // 模块名是 service 后面第二层(跳过层级admin/api/core) - const serviceIndex = parts.findIndex(part => part === 'service'); - if (serviceIndex > 0 && serviceIndex < parts.length - 2) { - return parts[serviceIndex + 2]; - } - - return 'unknown'; - } - - /** - * 从路径中提取层级 - */ - extractLayer(filePath) { - if (filePath.includes('/adminapi/')) { - return 'adminapi'; - } else if (filePath.includes('/api/')) { - return 'api'; - } else if (filePath.includes('/core/')) { - return 'core'; - } else if (filePath.includes('/admin/')) { - return 'admin'; - } - return 'unknown'; - } - - /** - * 分析PHP文件内容 - */ - analyzePHPFile(filePath) { - try { - const content = fs.readFileSync(filePath, 'utf-8'); - const methods = this.extractMethods(content); - return { - filePath: filePath, - methods: methods, - content: content - }; - } catch (error) { - console.warn(` ⚠️ 无法读取PHP文件 ${filePath}: ${error.message}`); - return null; - } - } - - /** - * 提取PHP方法 - */ - extractMethods(content) { - const methods = []; - const methodRegex = /public function (\w+)\([^)]*\)\s*\{([^}]+(?:\{[^}]*\}[^}]*)*)\}/g; - let match; - - while ((match = methodRegex.exec(content)) !== null) { - methods.push({ - name: match[1], - content: match[2], - parameters: this.extractParameters(match[0]) - }); - } - - return methods; - } - - /** - * 提取方法参数 - */ - extractParameters(methodSignature) { - const params = []; - const paramRegex = /\$(\w+)/g; - let match; - - while ((match = paramRegex.exec(methodSignature)) !== null) { - params.push({ - name: match[1], - type: 'any' - }); - } - - return params; - } - - /** - * 生成文件映射报告 - */ - generateMappingReport() { - console.log('\n📊 PHP+Java文件映射报告:'); - console.log('='.repeat(60)); - - // 统计PHP总数 - let totalPHPControllers = 0; - let totalPHPServices = 0; - let totalPHPModels = 0; - let totalPHPValidates = 0; - let totalPHPMiddlewares = 0; - let totalPHPRoutes = 0; - let totalPHPJobs = 0; - let totalPHPListeners = 0; - let totalPHPCommands = 0; - let totalPHPDicts = 0; - - // 统计Java总数 - let totalJavaControllers = 0; - let totalJavaEntities = 0; - let totalJavaServices = 0; - let totalJavaMappers = 0; - let totalJavaEnums = 0; - let totalJavaEvents = 0; - let totalJavaListeners = 0; - let totalJavaJobs = 0; - - // 计算PHP总数 - for (const controllers of Object.values(this.discoveredFiles.controllers)) { - totalPHPControllers += Object.keys(controllers).length; - } - for (const services of Object.values(this.discoveredFiles.services)) { - totalPHPServices += Object.keys(services).length; - } - for (const models of Object.values(this.discoveredFiles.models)) { - totalPHPModels += Object.keys(models).length; - } - for (const validates of Object.values(this.discoveredFiles.validates)) { - totalPHPValidates += Object.keys(validates).length; - } - for (const middlewares of Object.values(this.discoveredFiles.middlewares)) { - totalPHPMiddlewares += Object.keys(middlewares).length; - } - for (const routes of Object.values(this.discoveredFiles.routes)) { - totalPHPRoutes += Object.keys(routes).length; - } - for (const jobs of Object.values(this.discoveredFiles.jobs)) { - totalPHPJobs += Object.keys(jobs).length; - } - for (const listeners of Object.values(this.discoveredFiles.listeners)) { - totalPHPListeners += Object.keys(listeners).length; - } - for (const commands of Object.values(this.discoveredFiles.commands)) { - totalPHPCommands += Object.keys(commands).length; - } - for (const dicts of Object.values(this.discoveredFiles.dicts)) { - totalPHPDicts += Object.keys(dicts).length; - } - - // 计算Java总数 - for (const controllers of Object.values(this.discoveredFiles.javaControllers)) { - totalJavaControllers += Object.keys(controllers).length; - } - for (const entities of Object.values(this.discoveredFiles.javaEntities)) { - totalJavaEntities += Object.keys(entities).length; - } - for (const services of Object.values(this.discoveredFiles.javaServices)) { - totalJavaServices += Object.keys(services).length; - } - for (const mappers of Object.values(this.discoveredFiles.javaMappers)) { - totalJavaMappers += Object.keys(mappers).length; - } - for (const enums of Object.values(this.discoveredFiles.javaEnums)) { - totalJavaEnums += Object.keys(enums).length; - } - for (const events of Object.values(this.discoveredFiles.javaEvents)) { - totalJavaEvents += Object.keys(events).length; - } - for (const listeners of Object.values(this.discoveredFiles.javaListeners)) { - totalJavaListeners += Object.keys(listeners).length; - } - for (const jobs of Object.values(this.discoveredFiles.javaJobs)) { - totalJavaJobs += Object.keys(jobs).length; - } - - const totalPHPFiles = totalPHPControllers + totalPHPServices + totalPHPModels + totalPHPValidates + - totalPHPMiddlewares + totalPHPRoutes + totalPHPJobs + totalPHPListeners + - totalPHPCommands + totalPHPDicts; - - const totalJavaFiles = totalJavaControllers + totalJavaEntities + totalJavaServices + totalJavaMappers + - totalJavaEnums + totalJavaEvents + totalJavaListeners + totalJavaJobs; - - console.log(`\n📈 PHP项目统计:`); - console.log(` 控制器: ${totalPHPControllers} 个`); - console.log(` 服务: ${totalPHPServices} 个`); - console.log(` 模型: ${totalPHPModels} 个`); - console.log(` 验证器: ${totalPHPValidates} 个`); - console.log(` 中间件: ${totalPHPMiddlewares} 个`); - console.log(` 路由: ${totalPHPRoutes} 个`); - console.log(` 任务: ${totalPHPJobs} 个`); - console.log(` 监听器: ${totalPHPListeners} 个`); - console.log(` 命令: ${totalPHPCommands} 个`); - console.log(` 字典: ${totalPHPDicts} 个`); - console.log(` PHP总计: ${totalPHPFiles} 个文件`); - - console.log(`\n📈 Java项目统计:`); - console.log(` 控制器: ${totalJavaControllers} 个`); - console.log(` 实体: ${totalJavaEntities} 个`); - console.log(` 服务: ${totalJavaServices} 个`); - console.log(` 映射器: ${totalJavaMappers} 个`); - console.log(` 枚举: ${totalJavaEnums} 个`); - console.log(` 事件: ${totalJavaEvents} 个`); - console.log(` 监听器: ${totalJavaListeners} 个`); - console.log(` 任务: ${totalJavaJobs} 个`); - console.log(` Java总计: ${totalJavaFiles} 个文件`); - - console.log(`\n📈 项目对比:`); - console.log(` PHP总文件数: ${totalPHPFiles}`); - console.log(` Java总文件数: ${totalJavaFiles}`); - console.log(` 差异: ${Math.abs(totalPHPFiles - totalJavaFiles)} 个文件`); - - // 按模块显示详细信息 - const allModules = new Set(); - Object.keys(this.discoveredFiles.controllers).forEach(m => allModules.add(m)); - Object.keys(this.discoveredFiles.services).forEach(m => allModules.add(m)); - Object.keys(this.discoveredFiles.models).forEach(m => allModules.add(m)); - Object.keys(this.discoveredFiles.validates).forEach(m => allModules.add(m)); - Object.keys(this.discoveredFiles.jobs).forEach(m => allModules.add(m)); - Object.keys(this.discoveredFiles.listeners).forEach(m => allModules.add(m)); - Object.keys(this.discoveredFiles.commands).forEach(m => allModules.add(m)); - Object.keys(this.discoveredFiles.dicts).forEach(m => allModules.add(m)); - - for (const moduleName of allModules) { - console.log(`\n📁 模块: ${moduleName}`); - - if (this.discoveredFiles.controllers[moduleName]) { - console.log(' 控制器:'); - for (const [controllerName, info] of Object.entries(this.discoveredFiles.controllers[moduleName])) { - console.log(` - ${controllerName} (${info.layer})`); - } - } - - if (this.discoveredFiles.services[moduleName]) { - console.log(' 服务:'); - for (const [serviceName, info] of Object.entries(this.discoveredFiles.services[moduleName])) { - console.log(` - ${serviceName} (${info.layer})`); - } - } - - if (this.discoveredFiles.models[moduleName]) { - console.log(' 模型:'); - for (const [modelName, info] of Object.entries(this.discoveredFiles.models[moduleName])) { - console.log(` - ${modelName}`); - } - } - - if (this.discoveredFiles.validates[moduleName]) { - console.log(' 验证器:'); - for (const [validateName, info] of Object.entries(this.discoveredFiles.validates[moduleName])) { - console.log(` - ${validateName}`); - } - } - - if (this.discoveredFiles.jobs[moduleName]) { - console.log(' 任务:'); - for (const [jobName, info] of Object.entries(this.discoveredFiles.jobs[moduleName])) { - console.log(` - ${jobName}`); - } - } - - if (this.discoveredFiles.listeners[moduleName]) { - console.log(' 监听器:'); - for (const [listenerName, info] of Object.entries(this.discoveredFiles.listeners[moduleName])) { - console.log(` - ${listenerName}`); - } - } - - if (this.discoveredFiles.commands[moduleName]) { - console.log(' 命令:'); - for (const [commandName, info] of Object.entries(this.discoveredFiles.commands[moduleName])) { - console.log(` - ${commandName}`); - } - } - - if (this.discoveredFiles.dicts[moduleName]) { - console.log(' 字典:'); - for (const [dictName, info] of Object.entries(this.discoveredFiles.dicts[moduleName])) { - console.log(` - ${dictName}`); - } - } - } - - // 显示中间件和路由 - if (Object.keys(this.discoveredFiles.middlewares).length > 0) { - console.log(`\n📁 中间件:`); - for (const [layer, middlewares] of Object.entries(this.discoveredFiles.middlewares)) { - console.log(` ${layer}:`); - for (const [middlewareName, info] of Object.entries(middlewares)) { - console.log(` - ${middlewareName}`); - } - } - } - - if (Object.keys(this.discoveredFiles.routes).length > 0) { - console.log(`\n📁 路由:`); - for (const [layer, routes] of Object.entries(this.discoveredFiles.routes)) { - console.log(` ${layer}:`); - for (const [routeName, info] of Object.entries(routes)) { - console.log(` - ${routeName}`); - } - } - } - } - - /** - * 保存发现结果到文件 - */ - saveDiscoveryResult() { - const resultPath = path.join(__dirname, 'php-discovery-result.json'); - fs.writeFileSync(resultPath, JSON.stringify(this.discoveredFiles, null, 2)); - console.log(`\n💾 发现结果已保存到: ${resultPath}`); - } - - /** - * 发现所有PHP模型文件 - */ - discoverModels() { - console.log('🔍 发现PHP模型文件...'); - - const modelPath = path.join(this.phpBasePath, 'app/model'); - if (fs.existsSync(modelPath)) { - const modules = fs.readdirSync(modelPath); - - for (const module of modules) { - const modulePath = path.join(modelPath, module); - if (fs.statSync(modulePath).isDirectory()) { - const files = fs.readdirSync(modulePath).filter(file => file.endsWith('.php')); - - if (!this.discoveredFiles.models[module]) { - this.discoveredFiles.models[module] = {}; - } - - for (const file of files) { - const className = file.replace('.php', ''); - this.discoveredFiles.models[module][className] = { - filePath: path.join(modulePath, file), - className: className, - moduleName: module - }; - - console.log(` ✅ 发现模型: ${module}/${className}`); - } - } - } - } - } - - /** - * 发现所有PHP验证器文件 - */ - discoverValidates() { - console.log('🔍 发现PHP验证器文件...'); - - // 发现 app/validate 目录下的验证器文件 - const validatePath = path.join(this.phpBasePath, 'app/validate'); - if (fs.existsSync(validatePath)) { - const modules = fs.readdirSync(validatePath); - - for (const module of modules) { - const modulePath = path.join(validatePath, module); - if (fs.statSync(modulePath).isDirectory()) { - const files = fs.readdirSync(modulePath).filter(file => file.endsWith('.php')); - - if (!this.discoveredFiles.validates[module]) { - this.discoveredFiles.validates[module] = {}; - } - - for (const file of files) { - const className = file.replace('.php', ''); - this.discoveredFiles.validates[module][className] = { - filePath: path.join(modulePath, file), - className: className, - moduleName: module - }; - - console.log(` ✅ 发现验证器: ${module}/${className}`); - } - } - } - } - - // 发现 app/lang 目录下的验证器文件 - const langPath = path.join(this.phpBasePath, 'app/lang'); - if (fs.existsSync(langPath)) { - const languages = fs.readdirSync(langPath); - - for (const lang of languages) { - const langPath = path.join(this.phpBasePath, 'app/lang', lang); - if (fs.statSync(langPath).isDirectory()) { - const validateFile = path.join(langPath, 'validate.php'); - if (fs.existsSync(validateFile)) { - if (!this.discoveredFiles.validates['lang']) { - this.discoveredFiles.validates['lang'] = {}; - } - - this.discoveredFiles.validates['lang'][`${lang}Validate`] = { - filePath: validateFile, - className: `${lang}Validate`, - moduleName: 'lang' - }; - - console.log(` ✅ 发现语言验证器: lang/${lang}Validate`); - } - } - } - } - } - - /** - * 发现所有PHP中间件文件 - */ - discoverMiddlewares() { - console.log('🔍 发现PHP中间件文件...'); - - const middlewarePaths = [ - 'app/adminapi/middleware', - 'app/api/middleware' - ]; - - for (const middlewarePath of middlewarePaths) { - const fullPath = path.join(this.phpBasePath, middlewarePath); - if (fs.existsSync(fullPath)) { - const files = fs.readdirSync(fullPath).filter(file => file.endsWith('.php')); - const layer = middlewarePath.includes('adminapi') ? 'adminapi' : 'api'; - - if (!this.discoveredFiles.middlewares[layer]) { - this.discoveredFiles.middlewares[layer] = {}; - } - - for (const file of files) { - const className = file.replace('.php', ''); - this.discoveredFiles.middlewares[layer][className] = { - filePath: path.join(fullPath, file), - className: className, - layer: layer - }; - - console.log(` ✅ 发现中间件: ${layer}/${className}`); - } - } - } - } - - /** - * 发现所有PHP路由文件 - */ - discoverRoutes() { - console.log('🔍 发现PHP路由文件...'); - - const routePaths = [ - 'app/adminapi/route', - 'app/api/route' - ]; - - for (const routePath of routePaths) { - const fullPath = path.join(this.phpBasePath, routePath); - if (fs.existsSync(fullPath)) { - const files = fs.readdirSync(fullPath).filter(file => file.endsWith('.php')); - const layer = routePath.includes('adminapi') ? 'adminapi' : 'api'; - - if (!this.discoveredFiles.routes[layer]) { - this.discoveredFiles.routes[layer] = {}; - } - - for (const file of files) { - const className = file.replace('.php', ''); - this.discoveredFiles.routes[layer][className] = { - filePath: path.join(fullPath, file), - className: className, - layer: layer - }; - - console.log(` ✅ 发现路由: ${layer}/${className}`); - } - } - } - } - - /** - * 发现所有PHP任务文件 - */ - discoverJobs() { - console.log('🔍 发现PHP任务文件...'); - - const jobPath = path.join(this.phpBasePath, 'app/job'); - if (fs.existsSync(jobPath)) { - const modules = fs.readdirSync(jobPath); - - for (const module of modules) { - const modulePath = path.join(jobPath, module); - if (fs.statSync(modulePath).isDirectory()) { - const files = fs.readdirSync(modulePath).filter(file => file.endsWith('.php')); - - if (!this.discoveredFiles.jobs[module]) { - this.discoveredFiles.jobs[module] = {}; - } - - for (const file of files) { - const className = file.replace('.php', ''); - this.discoveredFiles.jobs[module][className] = { - filePath: path.join(modulePath, file), - className: className, - moduleName: module - }; - - console.log(` ✅ 发现任务: ${module}/${className}`); - } - } - } - } - } - - /** - * 发现所有PHP监听器文件 - */ - discoverListeners() { - console.log('🔍 发现PHP监听器文件...'); - - const listenerPath = path.join(this.phpBasePath, 'app/listener'); - if (fs.existsSync(listenerPath)) { - const modules = fs.readdirSync(listenerPath); - - for (const module of modules) { - const modulePath = path.join(listenerPath, module); - if (fs.statSync(modulePath).isDirectory()) { - const files = fs.readdirSync(modulePath).filter(file => file.endsWith('.php')); - - if (!this.discoveredFiles.listeners[module]) { - this.discoveredFiles.listeners[module] = {}; - } - - for (const file of files) { - const className = file.replace('.php', ''); - this.discoveredFiles.listeners[module][className] = { - filePath: path.join(modulePath, file), - className: className, - moduleName: module - }; - - console.log(` ✅ 发现监听器: ${module}/${className}`); - } - } - } - } - } - - /** - * 发现所有PHP命令文件 - */ - discoverCommands() { - console.log('🔍 发现PHP命令文件...'); - - const commandPath = path.join(this.phpBasePath, 'app/command'); - if (fs.existsSync(commandPath)) { - const modules = fs.readdirSync(commandPath); - - for (const module of modules) { - const modulePath = path.join(commandPath, module); - if (fs.statSync(modulePath).isDirectory()) { - const files = fs.readdirSync(modulePath).filter(file => file.endsWith('.php')); - - if (!this.discoveredFiles.commands[module]) { - this.discoveredFiles.commands[module] = {}; - } - - for (const file of files) { - const className = file.replace('.php', ''); - this.discoveredFiles.commands[module][className] = { - filePath: path.join(modulePath, file), - className: className, - moduleName: module - }; - - console.log(` ✅ 发现命令: ${module}/${className}`); - } - } - } - } - } - - /** - * 发现所有PHP字典文件 - */ - discoverDicts() { - console.log('🔍 发现PHP字典文件...'); - - // 发现 app/dict 目录下的字典文件 - const dictPath = path.join(this.phpBasePath, 'app/dict'); - if (fs.existsSync(dictPath)) { - const modules = fs.readdirSync(dictPath); - - for (const module of modules) { - const modulePath = path.join(dictPath, module); - if (fs.statSync(modulePath).isDirectory()) { - const files = fs.readdirSync(modulePath).filter(file => file.endsWith('.php')); - - if (!this.discoveredFiles.dicts[module]) { - this.discoveredFiles.dicts[module] = {}; - } - - for (const file of files) { - const className = file.replace('.php', ''); - this.discoveredFiles.dicts[module][className] = { - filePath: path.join(modulePath, file), - className: className, - moduleName: module - }; - - console.log(` ✅ 发现字典: ${module}/${className}`); - } - } - } - } - - // 发现其他位置的字典文件 - const otherDictPaths = [ - 'app/adminapi/controller/dict', - 'app/model/dict', - 'app/service/admin/dict' - ]; - - for (const dictPath of otherDictPaths) { - const fullPath = path.join(this.phpBasePath, dictPath); - if (fs.existsSync(fullPath)) { - const files = fs.readdirSync(fullPath).filter(file => file.endsWith('.php')); - - for (const file of files) { - const className = file.replace('.php', ''); - const moduleName = 'dict'; // 统一归类到dict模块 - - if (!this.discoveredFiles.dicts[moduleName]) { - this.discoveredFiles.dicts[moduleName] = {}; - } - - this.discoveredFiles.dicts[moduleName][className] = { - filePath: path.join(fullPath, file), - className: className, - moduleName: moduleName - }; - - console.log(` ✅ 发现其他字典: ${moduleName}/${className}`); - } - } - } - - // 发现 app/lang 目录下的字典文件 - const langPath = path.join(this.phpBasePath, 'app/lang'); - if (fs.existsSync(langPath)) { - const languages = fs.readdirSync(langPath); - - for (const lang of languages) { - const langPath = path.join(this.phpBasePath, 'app/lang', lang); - if (fs.statSync(langPath).isDirectory()) { - const dictFile = path.join(langPath, 'dict.php'); - if (fs.existsSync(dictFile)) { - if (!this.discoveredFiles.dicts['lang']) { - this.discoveredFiles.dicts['lang'] = {}; - } - - this.discoveredFiles.dicts['lang'][`${lang}Dict`] = { - filePath: dictFile, - className: `${lang}Dict`, - moduleName: 'lang' - }; - - console.log(` ✅ 发现语言字典: lang/${lang}Dict`); - } - } - } - } - } - - /** - * 发现所有PHP Trait文件 - */ - discoverTraits() { - console.log('🔍 发现PHP Trait文件...'); - - // 搜索所有PHP文件中的trait定义 - const searchPaths = [ - 'app/service', - 'app/model', - 'app/controller' - ]; - - for (const searchPath of searchPaths) { - const fullPath = path.join(this.phpBasePath, searchPath); - if (fs.existsSync(fullPath)) { - this.searchTraitsInDirectory(fullPath, searchPath); - } - } - } - - /** - * 在目录中搜索Trait文件 - */ - searchTraitsInDirectory(dirPath, relativePath) { - const files = fs.readdirSync(dirPath); - - for (const file of files) { - const filePath = path.join(dirPath, file); - const stat = fs.statSync(filePath); - - if (stat.isDirectory()) { - this.searchTraitsInDirectory(filePath, path.join(relativePath, file)); - } else if (file.endsWith('.php')) { - this.extractTraitsFromFile(filePath, relativePath); - } - } - } - - /** - * 从PHP文件中提取Trait定义 - */ - extractTraitsFromFile(filePath, relativePath) { - try { - const content = fs.readFileSync(filePath, 'utf-8'); - - // 匹配trait定义 - const traitRegex = /trait\s+(\w+)\s*\{/g; - let match; - - while ((match = traitRegex.exec(content)) !== null) { - const traitName = match[1]; - const moduleName = this.extractModuleNameFromPath(relativePath); - - if (!this.discoveredFiles.traits[moduleName]) { - this.discoveredFiles.traits[moduleName] = {}; - } - - this.discoveredFiles.traits[moduleName][traitName] = { - filePath: filePath, - className: traitName, - moduleName: moduleName - }; - - console.log(` ✅ 发现Trait: ${moduleName}/${traitName}`); - } - } catch (error) { - console.log(` ⚠️ 读取文件失败: ${filePath}`); - } - } - - /** - * 从路径中提取模块名 - */ - extractModuleNameFromPath(relativePath) { - const parts = relativePath.split(path.sep); - // 跳过 'app' 和 'service'/'model'/'controller' 部分 - if (parts.length > 2) { - return parts[2]; - } - return 'common'; - } - - /** - * 发现Java控制器文件 - */ - discoverJavaControllers() { - console.log('🔍 发现Java控制器文件...'); - - const controllerPaths = [ - 'controller/adminapi', - 'controller/api', - 'controller/core' - ]; - - for (const controllerPath of controllerPaths) { - const fullPath = path.join(this.javaBasePath, controllerPath); - if (fs.existsSync(fullPath)) { - const modules = fs.readdirSync(fullPath); - const layer = controllerPath.includes('adminapi') ? 'adminapi' : - controllerPath.includes('api') ? 'api' : 'core'; - - for (const module of modules) { - const modulePath = path.join(fullPath, module); - if (fs.statSync(modulePath).isDirectory()) { - const files = fs.readdirSync(modulePath).filter(file => file.endsWith('.java')); - - if (!this.discoveredFiles.javaControllers[module]) { - this.discoveredFiles.javaControllers[module] = {}; - } - - for (const file of files) { - const className = file.replace('.java', ''); - this.discoveredFiles.javaControllers[module][className] = { - filePath: path.join(modulePath, file), - className: className, - layer: layer, - moduleName: module - }; - - console.log(` ✅ 发现Java控制器: ${module}/${className} (${layer})`); - } - } - } - } - } - } - - /** - * 发现Java实体文件 - */ - discoverJavaEntities() { - console.log('🔍 发现Java实体文件...'); - - const entityPath = path.join(this.javaBasePath, 'entity'); - if (fs.existsSync(entityPath)) { - const modules = fs.readdirSync(entityPath); - - for (const module of modules) { - const modulePath = path.join(entityPath, module); - if (fs.statSync(modulePath).isDirectory()) { - const files = fs.readdirSync(modulePath).filter(file => file.endsWith('.java')); - - if (!this.discoveredFiles.javaEntities[module]) { - this.discoveredFiles.javaEntities[module] = {}; - } - - for (const file of files) { - const className = file.replace('.java', ''); - this.discoveredFiles.javaEntities[module][className] = { - filePath: path.join(modulePath, file), - className: className, - moduleName: module - }; - - console.log(` ✅ 发现Java实体: ${module}/${className}`); - } - } - } - } - } - - /** - * 发现Java服务文件 - */ - discoverJavaServices() { - console.log('🔍 发现Java服务文件...'); - - const servicePaths = [ - 'service/admin', - 'service/api', - 'service/core' - ]; - - for (const servicePath of servicePaths) { - const fullPath = path.join(this.javaBasePath, servicePath); - if (fs.existsSync(fullPath)) { - const modules = fs.readdirSync(fullPath); - const layer = servicePath.includes('admin') ? 'admin' : - servicePath.includes('api') ? 'api' : 'core'; - - for (const module of modules) { - const modulePath = path.join(fullPath, module); - if (fs.statSync(modulePath).isDirectory()) { - const files = fs.readdirSync(modulePath).filter(file => file.endsWith('.java')); - - if (!this.discoveredFiles.javaServices[module]) { - this.discoveredFiles.javaServices[module] = {}; - } - - for (const file of files) { - const className = file.replace('.java', ''); - this.discoveredFiles.javaServices[module][className] = { - filePath: path.join(modulePath, file), - className: className, - layer: layer, - moduleName: module - }; - - console.log(` ✅ 发现Java服务: ${module}/${className} (${layer})`); - } - } - } - } - } - } - - /** - * 发现Java映射器文件 - */ - discoverJavaMappers() { - console.log('🔍 发现Java映射器文件...'); - - const mapperPath = path.join(this.javaBasePath, 'mapper'); - if (fs.existsSync(mapperPath)) { - const modules = fs.readdirSync(mapperPath); - - for (const module of modules) { - const modulePath = path.join(mapperPath, module); - if (fs.statSync(modulePath).isDirectory()) { - const files = fs.readdirSync(modulePath).filter(file => file.endsWith('.java')); - - if (!this.discoveredFiles.javaMappers[module]) { - this.discoveredFiles.javaMappers[module] = {}; - } - - for (const file of files) { - const className = file.replace('.java', ''); - this.discoveredFiles.javaMappers[module][className] = { - filePath: path.join(modulePath, file), - className: className, - moduleName: module - }; - - console.log(` ✅ 发现Java映射器: ${module}/${className}`); - } - } - } - } - } - - /** - * 发现Java枚举文件 - */ - discoverJavaEnums() { - console.log('🔍 发现Java枚举文件...'); - - const enumPath = path.join(this.javaBasePath, 'enums'); - if (fs.existsSync(enumPath)) { - const modules = fs.readdirSync(enumPath); - - for (const module of modules) { - const modulePath = path.join(enumPath, module); - if (fs.statSync(modulePath).isDirectory()) { - const files = fs.readdirSync(modulePath).filter(file => file.endsWith('.java')); - - if (!this.discoveredFiles.javaEnums[module]) { - this.discoveredFiles.javaEnums[module] = {}; - } - - for (const file of files) { - const className = file.replace('.java', ''); - this.discoveredFiles.javaEnums[module][className] = { - filePath: path.join(modulePath, file), - className: className, - moduleName: module - }; - - console.log(` ✅ 发现Java枚举: ${module}/${className}`); - } - } - } - } - } - - /** - * 发现Java事件文件 - */ - discoverJavaEvents() { - console.log('🔍 发现Java事件文件...'); - - const eventPath = path.join(this.javaBasePath, 'event'); - if (fs.existsSync(eventPath)) { - const modules = fs.readdirSync(eventPath); - - for (const module of modules) { - const modulePath = path.join(eventPath, module); - if (fs.statSync(modulePath).isDirectory()) { - const files = fs.readdirSync(modulePath).filter(file => file.endsWith('.java')); - - if (!this.discoveredFiles.javaEvents[module]) { - this.discoveredFiles.javaEvents[module] = {}; - } - - for (const file of files) { - const className = file.replace('.java', ''); - this.discoveredFiles.javaEvents[module][className] = { - filePath: path.join(modulePath, file), - className: className, - moduleName: module - }; - - console.log(` ✅ 发现Java事件: ${module}/${className}`); - } - } - } - } - } - - /** - * 发现Java监听器文件 - */ - discoverJavaListeners() { - console.log('🔍 发现Java监听器文件...'); - - const listenerPath = path.join(this.javaBasePath, 'listener'); - if (fs.existsSync(listenerPath)) { - const modules = fs.readdirSync(listenerPath); - - for (const module of modules) { - const modulePath = path.join(listenerPath, module); - if (fs.statSync(modulePath).isDirectory()) { - const files = fs.readdirSync(modulePath).filter(file => file.endsWith('.java')); - - if (!this.discoveredFiles.javaListeners[module]) { - this.discoveredFiles.javaListeners[module] = {}; - } - - for (const file of files) { - const className = file.replace('.java', ''); - this.discoveredFiles.javaListeners[module][className] = { - filePath: path.join(modulePath, file), - className: className, - moduleName: module - }; - - console.log(` ✅ 发现Java监听器: ${module}/${className}`); - } - } - } - } - } - - /** - * 发现Java任务文件 - */ - discoverJavaJobs() { - console.log('🔍 发现Java任务文件...'); - - const jobPath = path.join(this.javaBasePath, 'job'); - if (fs.existsSync(jobPath)) { - const modules = fs.readdirSync(jobPath); - - for (const module of modules) { - const modulePath = path.join(jobPath, module); - if (fs.statSync(modulePath).isDirectory()) { - const files = fs.readdirSync(modulePath).filter(file => file.endsWith('.java')); - - if (!this.discoveredFiles.javaJobs[module]) { - this.discoveredFiles.javaJobs[module] = {}; - } - - for (const file of files) { - const className = file.replace('.java', ''); - this.discoveredFiles.javaJobs[module][className] = { - filePath: path.join(modulePath, file), - className: className, - moduleName: module - }; - - console.log(` ✅ 发现Java任务: ${module}/${className}`); - } - } - } - } - } - - /** - * 运行发现过程 - */ - async run() { - console.log('🚀 启动PHP+Java文件发现工具...'); - - // 发现PHP文件 - console.log('\n📁 发现PHP文件...'); - this.discoverControllers(); - this.discoverServices(); - this.discoverModels(); - this.discoverValidates(); - this.discoverMiddlewares(); - this.discoverRoutes(); - this.discoverJobs(); - this.discoverListeners(); - this.discoverCommands(); - this.discoverDicts(); - this.discoverTraits(); - - // 发现Java文件 - console.log('\n📁 发现Java文件...'); - this.discoverJavaControllers(); - this.discoverJavaEntities(); - this.discoverJavaServices(); - this.discoverJavaMappers(); - this.discoverJavaEnums(); - this.discoverJavaEvents(); - this.discoverJavaListeners(); - this.discoverJavaJobs(); - - this.generateMappingReport(); - this.saveDiscoveryResult(); - - console.log('\n✅ PHP+Java文件发现完成!'); - return this.discoveredFiles; - } -} - -// 如果直接运行此脚本 -if (require.main === module) { - const discovery = new PHPFileDiscovery(); - discovery.run().catch(console.error); -} - -module.exports = PHPFileDiscovery; diff --git a/tools/quality-assurance.js b/tools/quality-assurance.js deleted file mode 100644 index cca421ec..00000000 --- a/tools/quality-assurance.js +++ /dev/null @@ -1,595 +0,0 @@ -/** - * 质量保证系统 - * 为AI自动生成打下基石 - */ - -class QualityAssurance { - constructor() { - this.validators = { - syntax: this.validateSyntax.bind(this), - types: this.validateTypes.bind(this), - imports: this.validateImports.bind(this), - business: this.validateBusinessLogic.bind(this), - performance: this.validatePerformance.bind(this), - security: this.validateSecurity.bind(this) - }; - - this.fixers = { - syntax: this.fixSyntaxErrors.bind(this), - types: this.fixTypeErrors.bind(this), - imports: this.fixImportErrors.bind(this), - business: this.fixBusinessLogicErrors.bind(this) - }; - - this.metrics = { - complexity: this.calculateComplexity.bind(this), - maintainability: this.calculateMaintainability.bind(this), - testability: this.calculateTestability.bind(this), - performance: this.calculatePerformance.bind(this) - }; - } - - /** - * 执行完整的质量检查 - */ - async performQualityCheck(code, context = {}) { - const results = { - overall: 'pass', - validations: {}, - fixes: {}, - metrics: {}, - recommendations: [], - errors: [], - warnings: [] - }; - - console.log('🛡️ 开始质量检查...'); - - // 执行所有验证 - for (const [type, validator] of Object.entries(this.validators)) { - try { - console.log(` 🔍 执行${type}验证...`); - const validation = await validator(code, context); - results.validations[type] = validation; - - if (validation.errors.length > 0) { - results.errors.push(...validation.errors); - results.overall = 'fail'; - } - - if (validation.warnings.length > 0) { - results.warnings.push(...validation.warnings); - } - - console.log(` ✅ ${type}验证完成: ${validation.errors.length}个错误, ${validation.warnings.length}个警告`); - } catch (error) { - console.error(` ❌ ${type}验证失败:`, error.message); - results.errors.push({ - type, - message: error.message, - stack: error.stack - }); - results.overall = 'fail'; - } - } - - // 计算质量指标 - for (const [type, calculator] of Object.entries(this.metrics)) { - try { - results.metrics[type] = calculator(code, context); - } catch (error) { - console.error(` ❌ ${type}指标计算失败:`, error.message); - } - } - - // 生成建议 - results.recommendations = this.generateRecommendations(results); - - console.log(`🎯 质量检查完成: ${results.overall.toUpperCase()}`); - return results; - } - - /** - * 自动修复代码问题 - */ - async autoFix(code, qualityResults) { - let fixedCode = code; - const fixes = []; - - console.log('🔧 开始自动修复...'); - - // 修复语法错误 - if (qualityResults.validations.syntax?.errors.length > 0) { - const syntaxFixes = await this.fixers.syntax(fixedCode, qualityResults.validations.syntax); - fixedCode = syntaxFixes.code; - fixes.push(...syntaxFixes.fixes); - } - - // 修复类型错误 - if (qualityResults.validations.types?.errors.length > 0) { - const typeFixes = await this.fixers.types(fixedCode, qualityResults.validations.types); - fixedCode = typeFixes.code; - fixes.push(...typeFixes.fixes); - } - - // 修复导入错误 - if (qualityResults.validations.imports?.errors.length > 0) { - const importFixes = await this.fixers.imports(fixedCode, qualityResults.validations.imports); - fixedCode = importFixes.code; - fixes.push(...importFixes.fixes); - } - - // 修复业务逻辑错误 - if (qualityResults.validations.business?.errors.length > 0) { - const businessFixes = await this.fixers.business(fixedCode, qualityResults.validations.business); - fixedCode = businessFixes.code; - fixes.push(...businessFixes.fixes); - } - - console.log(`✅ 自动修复完成: ${fixes.length}个修复`); - - return { - code: fixedCode, - fixes, - summary: { - totalFixes: fixes.length, - fixedTypes: [...new Set(fixes.map(f => f.type))] - } - }; - } - - /** - * 验证语法 - */ - async validateSyntax(code, context) { - const errors = []; - const warnings = []; - - // 检查方括号错误 - const bracketErrors = this.findBracketErrors(code); - errors.push(...bracketErrors); - - // 检查重复前缀 - const prefixErrors = this.findPrefixErrors(code); - errors.push(...prefixErrors); - - // 检查语法错误 - const syntaxErrors = this.findSyntaxErrors(code); - errors.push(...syntaxErrors); - - // 检查代码风格 - const styleWarnings = this.findStyleWarnings(code); - warnings.push(...styleWarnings); - - return { errors, warnings }; - } - - /** - * 验证类型 - */ - async validateTypes(code, context) { - const errors = []; - const warnings = []; - - // 检查类型声明 - const typeErrors = this.findTypeErrors(code); - errors.push(...typeErrors); - - // 检查类型使用 - const usageWarnings = this.findTypeUsageWarnings(code); - warnings.push(...usageWarnings); - - return { errors, warnings }; - } - - /** - * 验证导入 - */ - async validateImports(code, context) { - const errors = []; - const warnings = []; - - // 检查缺失的导入 - const missingImports = this.findMissingImports(code); - errors.push(...missingImports); - - // 检查未使用的导入 - const unusedImports = this.findUnusedImports(code); - warnings.push(...unusedImports); - - return { errors, warnings }; - } - - /** - * 验证业务逻辑 - */ - async validateBusinessLogic(code, context) { - const errors = []; - const warnings = []; - - // 检查业务逻辑完整性 - const businessErrors = this.findBusinessLogicErrors(code); - errors.push(...businessErrors); - - // 检查业务规则 - const ruleWarnings = this.findBusinessRuleWarnings(code); - warnings.push(...ruleWarnings); - - return { errors, warnings }; - } - - /** - * 验证性能 - */ - async validatePerformance(code, context) { - const errors = []; - const warnings = []; - - // 检查性能问题 - const performanceIssues = this.findPerformanceIssues(code); - warnings.push(...performanceIssues); - - return { errors, warnings }; - } - - /** - * 验证安全性 - */ - async validateSecurity(code, context) { - const errors = []; - const warnings = []; - - // 检查安全问题 - const securityIssues = this.findSecurityIssues(code); - errors.push(...securityIssues); - - return { errors, warnings }; - } - - // 错误检测方法 - findBracketErrors(code) { - const errors = []; - const lines = code.split('\n'); - - lines.forEach((line, index) => { - if (line.includes(']') && !line.includes('[')) { - // 检查是否是函数调用中的方括号错误 - if (line.match(/\w+\]/)) { - errors.push({ - type: 'syntax', - message: '方括号错误: 应该是圆括号', - line: index + 1, - code: line.trim(), - severity: 'error' - }); - } - } - }); - - return errors; - } - - findPrefixErrors(code) { - const errors = []; - const lines = code.split('\n'); - - lines.forEach((line, index) => { - if (line.includes('BusinessBusinessException')) { - errors.push({ - type: 'syntax', - message: '重复的Business前缀', - line: index + 1, - code: line.trim(), - severity: 'error' - }); - } - }); - - return errors; - } - - findSyntaxErrors(code) { - const errors = []; - const lines = code.split('\n'); - - lines.forEach((line, index) => { - // 检查等号错误 - if (line.includes('====')) { - errors.push({ - type: 'syntax', - message: '重复的等号', - line: index + 1, - code: line.trim(), - severity: 'error' - }); - } - - // 检查括号不匹配 - const openParens = (line.match(/\(/g) || []).length; - const closeParens = (line.match(/\)/g) || []).length; - const openBrackets = (line.match(/\[/g) || []).length; - const closeBrackets = (line.match(/\]/g) || []).length; - - if (openParens !== closeParens) { - errors.push({ - type: 'syntax', - message: '括号不匹配', - line: index + 1, - code: line.trim(), - severity: 'error' - }); - } - - if (openBrackets !== closeBrackets) { - errors.push({ - type: 'syntax', - message: '方括号不匹配', - line: index + 1, - code: line.trim(), - severity: 'error' - }); - } - }); - - return errors; - } - - findStyleWarnings(code) { - const warnings = []; - const lines = code.split('\n'); - - lines.forEach((line, index) => { - // 检查行长度 - if (line.length > 120) { - warnings.push({ - type: 'style', - message: '行长度超过120字符', - line: index + 1, - code: line.trim(), - severity: 'warning' - }); - } - - // 检查尾随空格 - if (line.endsWith(' ')) { - warnings.push({ - type: 'style', - message: '尾随空格', - line: index + 1, - code: line.trim(), - severity: 'warning' - }); - } - }); - - return warnings; - } - - findTypeErrors(code) { - const errors = []; - // 类型错误检测逻辑 - return errors; - } - - findTypeUsageWarnings(code) { - const warnings = []; - // 类型使用警告检测逻辑 - return warnings; - } - - findMissingImports(code) { - const errors = []; - const lines = code.split('\n'); - - // 检查使用的类是否已导入 - const usedClasses = this.extractUsedClasses(code); - const importedClasses = this.extractImportedClasses(code); - - usedClasses.forEach(className => { - if (!importedClasses.includes(className)) { - errors.push({ - type: 'import', - message: `缺失导入: ${className}`, - line: -1, - code: '', - severity: 'error' - }); - } - }); - - return errors; - } - - findUnusedImports(code) { - const warnings = []; - // 未使用导入检测逻辑 - return warnings; - } - - findBusinessLogicErrors(code) { - const errors = []; - // 业务逻辑错误检测逻辑 - return errors; - } - - findBusinessRuleWarnings(code) { - const warnings = []; - // 业务规则警告检测逻辑 - return warnings; - } - - findPerformanceIssues(code) { - const warnings = []; - // 性能问题检测逻辑 - return warnings; - } - - findSecurityIssues(code) { - const errors = []; - // 安全问题检测逻辑 - return errors; - } - - // 修复方法 - async fixSyntaxErrors(code, validation) { - let fixedCode = code; - const fixes = []; - - validation.errors.forEach(error => { - if (error.message.includes('方括号错误')) { - fixedCode = fixedCode.replace(/(\w+)\]/g, '$1)'); - fixes.push({ - type: 'syntax', - description: '修复方括号错误', - line: error.line - }); - } - - if (error.message.includes('重复的Business前缀')) { - fixedCode = fixedCode.replace(/BusinessBusinessException/g, 'BusinessException'); - fixes.push({ - type: 'syntax', - description: '修复重复的Business前缀', - line: error.line - }); - } - - if (error.message.includes('重复的等号')) { - fixedCode = fixedCode.replace(/====/g, '==='); - fixes.push({ - type: 'syntax', - description: '修复重复的等号', - line: error.line - }); - } - }); - - return { code: fixedCode, fixes }; - } - - async fixTypeErrors(code, validation) { - let fixedCode = code; - const fixes = []; - // 类型错误修复逻辑 - return { code: fixedCode, fixes }; - } - - async fixImportErrors(code, validation) { - let fixedCode = code; - const fixes = []; - // 导入错误修复逻辑 - return { code: fixedCode, fixes }; - } - - async fixBusinessLogicErrors(code, validation) { - let fixedCode = code; - const fixes = []; - // 业务逻辑错误修复逻辑 - return { code: fixedCode, fixes }; - } - - // 指标计算方法 - calculateComplexity(code, context) { - const lines = code.split('\n'); - const methods = (code.match(/function\s+\w+/g) || []).length; - const conditions = (code.match(/if\s*\(|else\s*if\s*\(|switch\s*\(/g) || []).length; - const loops = (code.match(/for\s*\(|while\s*\(|foreach\s*\(/g) || []).length; - - return { - lines: lines.length, - methods, - conditions, - loops, - cyclomatic: methods + conditions + loops + 1 - }; - } - - calculateMaintainability(code, context) { - const complexity = this.calculateComplexity(code, context); - const maintainabilityIndex = Math.max(0, 171 - 5.2 * Math.log(complexity.lines) - 0.23 * complexity.cyclomatic); - - return { - index: maintainabilityIndex, - rating: maintainabilityIndex > 80 ? 'A' : maintainabilityIndex > 60 ? 'B' : maintainabilityIndex > 40 ? 'C' : 'D' - }; - } - - calculateTestability(code, context) { - const methods = (code.match(/function\s+\w+/g) || []).length; - const dependencies = (code.match(/this\.\w+Service/g) || []).length; - - return { - methods, - dependencies, - testabilityScore: Math.max(0, 100 - dependencies * 10) - }; - } - - calculatePerformance(code, context) { - const loops = (code.match(/for\s*\(|while\s*\(|foreach\s*\(/g) || []).length; - const asyncCalls = (code.match(/await\s+/g) || []).length; - - return { - loops, - asyncCalls, - performanceScore: Math.max(0, 100 - loops * 5 - asyncCalls * 2) - }; - } - - // 辅助方法 - extractUsedClasses(code) { - const classes = []; - const matches = code.match(/([A-Z][a-zA-Z0-9_]*)/g); - if (matches) { - classes.push(...matches); - } - return [...new Set(classes)]; - } - - extractImportedClasses(code) { - const imports = []; - const matches = code.match(/import\s*\{\s*([^}]+)\s*\}\s*from/g); - if (matches) { - matches.forEach(match => { - const importMatch = match.match(/import\s*\{\s*([^}]+)\s*\}\s*from/); - if (importMatch) { - const classNames = importMatch[1].split(',').map(name => name.trim()); - imports.push(...classNames); - } - }); - } - return imports; - } - - generateRecommendations(results) { - const recommendations = []; - - if (results.errors.length > 0) { - recommendations.push({ - type: 'error', - message: '修复所有语法错误以提高代码质量', - priority: 'high' - }); - } - - if (results.warnings.length > 10) { - recommendations.push({ - type: 'warning', - message: '减少警告数量以提高代码质量', - priority: 'medium' - }); - } - - if (results.metrics.complexity?.cyclomatic > 10) { - recommendations.push({ - type: 'complexity', - message: '降低代码复杂度以提高可维护性', - priority: 'medium' - }); - } - - return recommendations; - } -} - -module.exports = QualityAssurance; diff --git a/tools/test-dict-fix.js b/tools/test-dict-fix.js deleted file mode 100644 index d0b82632..00000000 --- a/tools/test-dict-fix.js +++ /dev/null @@ -1,175 +0,0 @@ -#!/usr/bin/env node - -/** - * 测试 dict-generator 修复 - * 验证文件命名和重叠名问题 - */ - -const DictGenerator = require('./generators/dict-generator'); - -class DictFixTester { - constructor() { - this.errors = []; - this.passed = []; - } - - async run() { - console.log('🧪 测试 dict-generator 修复...\n'); - - // 测试1: 继承 BaseGenerator - this.testInheritance(); - - // 测试2: 文件命名规范 - this.testFileNaming(); - - // 测试3: 避免重叠名 - this.testNoOverlappingNames(); - - // 输出结果 - this.printResults(); - } - - testInheritance() { - console.log('📝 测试1: 继承 BaseGenerator'); - - const generator = new DictGenerator(); - - if (typeof generator.writeFile === 'function') { - this.passed.push('DictGenerator 继承了 BaseGenerator.writeFile'); - console.log(' ✅ 继承了 BaseGenerator.writeFile'); - } else { - this.errors.push('DictGenerator 未继承 BaseGenerator.writeFile'); - console.log(' ❌ 未继承 BaseGenerator.writeFile'); - } - - if (typeof generator.printStats === 'function') { - this.passed.push('DictGenerator 继承了 BaseGenerator.printStats'); - console.log(' ✅ 继承了 BaseGenerator.printStats'); - } else { - this.errors.push('DictGenerator 未继承 BaseGenerator.printStats'); - console.log(' ❌ 未继承 BaseGenerator.printStats'); - } - - if (generator.dryRun !== undefined) { - this.passed.push('DictGenerator 支持 dry-run 模式'); - console.log(' ✅ 支持 dry-run 模式'); - } else { - this.errors.push('DictGenerator 不支持 dry-run 模式'); - console.log(' ❌ 不支持 dry-run 模式'); - } - } - - testFileNaming() { - console.log('\n📝 测试2: 文件命名规范(kebab-case)'); - - const generator = new DictGenerator(); - - // 模拟生成内容并检查 - const testCases = [ - { input: 'Dict', expected: 'dict.enum.ts' }, - { input: 'MemberLevel', expected: 'member-level.enum.ts' }, - { input: 'PayChannel', expected: 'pay-channel.enum.ts' }, - { input: 'dict_service', expected: 'dict-service.enum.ts' } - ]; - - for (const testCase of testCases) { - const kebabName = generator.toKebabCase(testCase.input); - const fileName = `${kebabName}.enum.ts`; - - if (fileName === testCase.expected) { - this.passed.push(`文件命名正确: ${testCase.input} → ${fileName}`); - console.log(` ✅ ${testCase.input} → ${fileName}`); - } else { - this.errors.push(`文件命名错误: ${testCase.input} 应为 ${testCase.expected},实际为 ${fileName}`); - console.log(` ❌ ${testCase.input} 应为 ${testCase.expected},实际为 ${fileName}`); - } - } - } - - testNoOverlappingNames() { - console.log('\n📝 测试3: 避免重叠名问题'); - - const generator = new DictGenerator(); - const content = generator.generateDictContent('test', 'Dict'); - - // 检查1: 应该生成 DictEnum 而不是 DictDict - if (content.includes('export enum DictEnum')) { - this.passed.push('使用 DictEnum 而不是 DictDict'); - console.log(' ✅ 使用 DictEnum(避免重叠名)'); - } else if (content.includes('export enum DictDict')) { - this.errors.push('错误使用了 DictDict(重叠名)'); - console.log(' ❌ 错误使用了 DictDict(重叠名)'); - } else { - this.errors.push('未找到枚举定义'); - console.log(' ❌ 未找到枚举定义'); - } - - // 检查2: dictDict 变量名是合理的 - if (content.includes('export const dictDict')) { - this.passed.push('dictDict 变量名符合预期'); - console.log(' ✅ dictDict 变量名符合预期'); - } else { - this.errors.push('dictDict 变量名不正确'); - console.log(' ❌ dictDict 变量名不正确'); - } - - // 检查3: 工具类命名 - if (content.includes('export class DictEnumUtil')) { - this.passed.push('工具类使用 DictEnumUtil'); - console.log(' ✅ 工具类使用 DictEnumUtil'); - } else { - this.errors.push('工具类命名不正确'); - console.log(' ❌ 工具类命名不正确'); - } - - // 检查4: 文件名建议 - console.log('\n 💡 推荐文件名模式:'); - console.log(' - dict.enum.ts (kebab-case + .enum.ts 后缀)'); - console.log(' - member-level.enum.ts'); - console.log(' - pay-channel.enum.ts'); - console.log('\n ❌ 禁止的文件名:'); - console.log(' - DictDict.ts (PascalCase + 重叠名)'); - console.log(' - Dict.ts (无后缀)'); - } - - printResults() { - console.log('\n\n📊 测试结果汇总'); - console.log('='.repeat(60)); - - console.log(`\n✅ 通过项 (${this.passed.length}):`); - this.passed.forEach(item => console.log(` - ${item}`)); - - if (this.errors.length > 0) { - console.log(`\n❌ 错误项 (${this.errors.length}):`); - this.errors.forEach(item => console.log(` - ${item}`)); - } - - console.log('\n' + '='.repeat(60)); - - const totalChecks = this.passed.length + this.errors.length; - const successRate = totalChecks > 0 - ? ((this.passed.length / totalChecks) * 100).toFixed(2) - : '0.00'; - - console.log(`📈 成功率: ${successRate}% (${this.passed.length}/${totalChecks})`); - - if (this.errors.length === 0) { - console.log('\n🎉 dict-generator 修复验证通过!'); - return true; - } else { - console.log(`\n💔 发现 ${this.errors.length} 个错误,需要修复`); - return false; - } - } -} - -// 运行测试 -if (require.main === module) { - const tester = new DictFixTester(); - tester.run().then(passed => { - process.exit(passed ? 0 : 1); - }); -} - -module.exports = DictFixTester; - diff --git a/tools/test-fixes.js b/tools/test-fixes.js deleted file mode 100644 index 4eeee35c..00000000 --- a/tools/test-fixes.js +++ /dev/null @@ -1,319 +0,0 @@ -#!/usr/bin/env node - -/** - * 测试修复脚本 - * 验证所有修复是否正确 - */ - -const fs = require('fs'); -const path = require('path'); - -class FixValidator { - constructor() { - this.errors = []; - this.warnings = []; - this.passed = []; - } - - /** - * 运行所有验证 - */ - async run() { - console.log('🧪 开始验证修复...\n'); - - // 验证1: command-generator.js 导入路径 - console.log('📝 验证1: command-generator.js 导入路径修复'); - this.validateCommandGeneratorImport(); - - // 验证2: BaseGenerator 存在性 - console.log('\n📝 验证2: BaseGenerator 基类存在性'); - this.validateBaseGenerator(); - - // 验证3: entity-generator.js 继承 BaseGenerator - console.log('\n📝 验证3: entity-generator.js 继承 BaseGenerator'); - this.validateEntityGeneratorInheritance(); - - // 验证4: command-generator.js 继承 BaseGenerator - console.log('\n📝 验证4: command-generator.js 继承 BaseGenerator'); - this.validateCommandGeneratorInheritance(); - - // 验证5: Quality Gate 工具存在 - console.log('\n📝 验证5: Quality Gate 工具存在'); - this.validateQualityGate(); - - // 验证6: migration-coordinator.js 集成 Quality Gate - console.log('\n📝 验证6: migration-coordinator.js 集成 Quality Gate'); - this.validateCoordinatorQualityGate(); - - // 验证7: README.md 文档更新 - console.log('\n📝 验证7: README.md 文档更新'); - this.validateReadmeUpdate(); - - // 输出验证结果 - this.printResults(); - } - - /** - * 验证 command-generator.js 导入路径 - */ - validateCommandGeneratorImport() { - const filePath = path.join(__dirname, 'generators/command-generator.js'); - const content = fs.readFileSync(filePath, 'utf8'); - - // 检查错误的导入 - if (content.includes("@wwjCore/exceptions/Customexceptions")) { - this.errors.push('command-generator.js 仍使用错误的导入路径 @wwjCore/exceptions/Customexceptions'); - console.log(' ❌ 仍使用错误的导入路径'); - } else if (content.includes("@wwjCommon/exceptions/business.exception")) { - this.passed.push('command-generator.js 使用正确的导入路径'); - console.log(' ✅ 使用正确的导入路径 @wwjCommon/exceptions/business.exception'); - } else { - this.warnings.push('command-generator.js 未找到 BusinessException 导入'); - console.log(' ⚠️ 未找到 BusinessException 导入'); - } - } - - /** - * 验证 BaseGenerator 存在 - */ - validateBaseGenerator() { - const filePath = path.join(__dirname, 'generators/base-generator.js'); - - if (!fs.existsSync(filePath)) { - this.errors.push('base-generator.js 不存在'); - console.log(' ❌ base-generator.js 不存在'); - return; - } - - const content = fs.readFileSync(filePath, 'utf8'); - - // 检查关键方法 - const requiredMethods = ['writeFile', 'ensureDir', 'readFile', 'printStats']; - let allMethodsPresent = true; - - for (const method of requiredMethods) { - if (!content.includes(`${method}(`)) { - this.errors.push(`base-generator.js 缺少方法: ${method}`); - allMethodsPresent = false; - } - } - - if (allMethodsPresent) { - this.passed.push('BaseGenerator 包含所有必需方法'); - console.log(' ✅ 包含所有必需方法'); - } else { - console.log(' ❌ 缺少部分方法'); - } - - // 检查 dry-run 支持 - if (content.includes('this.dryRun')) { - this.passed.push('BaseGenerator 支持 dry-run 模式'); - console.log(' ✅ 支持 dry-run 模式'); - } else { - this.errors.push('BaseGenerator 不支持 dry-run 模式'); - console.log(' ❌ 不支持 dry-run 模式'); - } - } - - /** - * 验证 entity-generator.js 继承 - */ - validateEntityGeneratorInheritance() { - const filePath = path.join(__dirname, 'generators/entity-generator.js'); - const content = fs.readFileSync(filePath, 'utf8'); - - if (content.includes("extends BaseGenerator")) { - this.passed.push('entity-generator.js 继承 BaseGenerator'); - console.log(' ✅ 继承 BaseGenerator'); - } else { - this.errors.push('entity-generator.js 未继承 BaseGenerator'); - console.log(' ❌ 未继承 BaseGenerator'); - } - - if (content.includes("require('./base-generator')")) { - this.passed.push('entity-generator.js 导入 BaseGenerator'); - console.log(' ✅ 导入 BaseGenerator'); - } else { - this.errors.push('entity-generator.js 未导入 BaseGenerator'); - console.log(' ❌ 未导入 BaseGenerator'); - } - - if (content.includes("this.writeFile(")) { - this.passed.push('entity-generator.js 使用 BaseGenerator.writeFile'); - console.log(' ✅ 使用 BaseGenerator.writeFile'); - } else { - this.warnings.push('entity-generator.js 可能未使用 BaseGenerator.writeFile'); - console.log(' ⚠️ 可能未使用 BaseGenerator.writeFile'); - } - } - - /** - * 验证 command-generator.js 继承 - */ - validateCommandGeneratorInheritance() { - const filePath = path.join(__dirname, 'generators/command-generator.js'); - const content = fs.readFileSync(filePath, 'utf8'); - - if (content.includes("extends BaseGenerator")) { - this.passed.push('command-generator.js 继承 BaseGenerator'); - console.log(' ✅ 继承 BaseGenerator'); - } else { - this.errors.push('command-generator.js 未继承 BaseGenerator'); - console.log(' ❌ 未继承 BaseGenerator'); - } - - if (content.includes("this.writeFile(")) { - this.passed.push('command-generator.js 使用 BaseGenerator.writeFile'); - console.log(' ✅ 使用 BaseGenerator.writeFile'); - } else { - this.warnings.push('command-generator.js 可能未使用 BaseGenerator.writeFile'); - console.log(' ⚠️ 可能未使用 BaseGenerator.writeFile'); - } - } - - /** - * 验证 Quality Gate 工具 - */ - validateQualityGate() { - const filePath = path.join(__dirname, 'generators/quality-gate.js'); - - if (!fs.existsSync(filePath)) { - this.errors.push('quality-gate.js 不存在'); - console.log(' ❌ quality-gate.js 不存在'); - return; - } - - const content = fs.readFileSync(filePath, 'utf8'); - - // 检查关键方法 - const requiredMethods = ['checkTypeScript', 'checkESLint', 'run', 'printStats']; - let allMethodsPresent = true; - - for (const method of requiredMethods) { - if (!content.includes(`${method}(`)) { - this.errors.push(`quality-gate.js 缺少方法: ${method}`); - allMethodsPresent = false; - } - } - - if (allMethodsPresent) { - this.passed.push('Quality Gate 包含所有必需方法'); - console.log(' ✅ 包含所有必需方法'); - } else { - console.log(' ❌ 缺少部分方法'); - } - } - - /** - * 验证 migration-coordinator.js 集成 - */ - validateCoordinatorQualityGate() { - const filePath = path.join(__dirname, 'migration-coordinator.js'); - const content = fs.readFileSync(filePath, 'utf8'); - - if (content.includes("require('./generators/quality-gate')")) { - this.passed.push('migration-coordinator.js 导入 QualityGate'); - console.log(' ✅ 导入 QualityGate'); - } else { - this.errors.push('migration-coordinator.js 未导入 QualityGate'); - console.log(' ❌ 未导入 QualityGate'); - } - - if (content.includes("runQualityGate")) { - this.passed.push('migration-coordinator.js 包含 runQualityGate 方法'); - console.log(' ✅ 包含 runQualityGate 方法'); - } else { - this.errors.push('migration-coordinator.js 未包含 runQualityGate 方法'); - console.log(' ❌ 未包含 runQualityGate 方法'); - } - - if (content.includes("await this.runQualityGate()")) { - this.passed.push('migration-coordinator.js 调用 runQualityGate'); - console.log(' ✅ 在流程中调用 runQualityGate'); - } else { - this.errors.push('migration-coordinator.js 未在流程中调用 runQualityGate'); - console.log(' ❌ 未在流程中调用 runQualityGate'); - } - } - - /** - * 验证 README.md 更新 - */ - validateReadmeUpdate() { - const filePath = path.join(__dirname, 'README.md'); - const content = fs.readFileSync(filePath, 'utf8'); - - if (content.includes('dry-run') || content.includes('DRY_RUN')) { - this.passed.push('README.md 包含 dry-run 使用说明'); - console.log(' ✅ 包含 dry-run 使用说明'); - } else { - this.warnings.push('README.md 缺少 dry-run 使用说明'); - console.log(' ⚠️ 缺少 dry-run 使用说明'); - } - - if (content.includes('quality-gate') || content.includes('Quality Gate')) { - this.passed.push('README.md 包含 Quality Gate 说明'); - console.log(' ✅ 包含 Quality Gate 说明'); - } else { - this.warnings.push('README.md 缺少 Quality Gate 说明'); - console.log(' ⚠️ 缺少 Quality Gate 说明'); - } - - if (content.includes('base-generator')) { - this.passed.push('README.md 包含 BaseGenerator 说明'); - console.log(' ✅ 包含 BaseGenerator 说明'); - } else { - this.warnings.push('README.md 缺少 BaseGenerator 说明'); - console.log(' ⚠️ 缺少 BaseGenerator 说明'); - } - } - - /** - * 输出验证结果 - */ - printResults() { - console.log('\n\n📊 验证结果汇总'); - console.log('='.repeat(60)); - - console.log(`\n✅ 通过项 (${this.passed.length}):`); - this.passed.forEach(item => console.log(` - ${item}`)); - - if (this.warnings.length > 0) { - console.log(`\n⚠️ 警告项 (${this.warnings.length}):`); - this.warnings.forEach(item => console.log(` - ${item}`)); - } - - if (this.errors.length > 0) { - console.log(`\n❌ 错误项 (${this.errors.length}):`); - this.errors.forEach(item => console.log(` - ${item}`)); - } - - console.log('\n' + '='.repeat(60)); - - const totalChecks = this.passed.length + this.warnings.length + this.errors.length; - const successRate = totalChecks > 0 - ? ((this.passed.length / totalChecks) * 100).toFixed(2) - : '0.00'; - - console.log(`📈 成功率: ${successRate}% (${this.passed.length}/${totalChecks})`); - - if (this.errors.length === 0) { - console.log('\n🎉 所有必需检查已通过!'); - return true; - } else { - console.log(`\n💔 发现 ${this.errors.length} 个错误,需要修复`); - return false; - } - } -} - -// 运行验证 -if (require.main === module) { - const validator = new FixValidator(); - validator.run().then(passed => { - process.exit(passed ? 0 : 1); - }); -} - -module.exports = FixValidator; - diff --git a/tools/test-incremental.js b/tools/test-incremental.js deleted file mode 100644 index c79191ad..00000000 --- a/tools/test-incremental.js +++ /dev/null @@ -1,62 +0,0 @@ -#!/usr/bin/env node - -const IncrementalUpdater = require('./incremental-updater'); - -/** - * 🧪 增量更新功能测试 - */ -async function testIncrementalUpdate() { - console.log('🧪 开始测试增量更新功能...\n'); - - try { - // 设置测试环境 - process.env.DRY_RUN = 'true'; - - console.log('📋 测试配置:'); - console.log('- 干运行模式: 启用'); - console.log('- 详细输出: 启用'); - console.log('- 测试环境: 开发环境\n'); - - // 创建增量更新器实例 - const updater = new IncrementalUpdater(); - - console.log('🔧 增量更新器配置:'); - console.log(`- PHP项目路径: ${updater.config.phpBasePath}`); - console.log(`- NestJS项目路径: ${updater.config.nestjsBasePath}`); - console.log(`- 状态文件路径: ${updater.config.stateFilePath}`); - console.log(`- 备份路径: ${updater.config.backupPath}`); - console.log(`- 干运行模式: ${updater.config.dryRun}\n`); - - // 执行增量更新 - console.log('🚀 执行增量更新...'); - const result = await updater.run(); - - if (result !== false) { - console.log('\n✅ 增量更新测试成功完成!'); - console.log('📊 测试结果: 所有功能正常工作'); - } else { - console.log('\n❌ 增量更新测试失败'); - console.log('📊 测试结果: 存在功能问题'); - } - - } catch (error) { - console.error('\n💥 测试过程中发生错误:'); - console.error('错误信息:', error.message); - console.error('错误堆栈:', error.stack); - - console.log('\n🔧 可能的原因:'); - console.log('1. PHP项目路径不存在或无法访问'); - console.log('2. NestJS项目路径不存在或无法访问'); - console.log('3. 文件权限不足'); - console.log('4. 依赖模块缺失'); - - process.exit(1); - } -} - -// 运行测试 -if (require.main === module) { - testIncrementalUpdate(); -} - -module.exports = { testIncrementalUpdate }; \ No newline at end of file diff --git a/tools/test-migration-simple.js b/tools/test-migration-simple.js deleted file mode 100644 index 235f2dd1..00000000 --- a/tools/test-migration-simple.js +++ /dev/null @@ -1,133 +0,0 @@ -#!/usr/bin/env node - -const fs = require('fs'); -const path = require('path'); - -/** - * 简化版迁移工具测试 - * 用于诊断迁移工具卡住的问题 - */ -class SimpleMigrationTest { - constructor() { - this.discoveryData = null; - } - - async run() { - console.log('🚀 开始简化版迁移测试...'); - - try { - // 第1步:加载数据 - console.log('📊 第1步:加载PHP文件发现结果...'); - await this.loadDiscoveryData(); - - // 第2步:分析数据 - console.log('📊 第2步:分析数据结构...'); - this.analyzeData(); - - // 第3步:测试模块提取 - console.log('📊 第3步:测试模块提取...'); - this.testModuleExtraction(); - - console.log('✅ 简化版迁移测试完成'); - - } catch (error) { - console.error('❌ 测试失败:', error.message); - console.error('错误堆栈:', error.stack); - } - } - - async loadDiscoveryData() { - const filePath = path.join(__dirname, 'php-discovery-result.json'); - - console.log(' 📁 检查文件存在性...'); - if (!fs.existsSync(filePath)) { - throw new Error(`发现结果文件不存在: ${filePath}`); - } - - const stats = fs.statSync(filePath); - console.log(` 📏 文件大小: ${(stats.size / 1024).toFixed(2)} KB`); - - console.log(' 📖 开始读取文件...'); - const fileContent = fs.readFileSync(filePath, 'utf8'); - console.log(` 📄 文件内容长度: ${fileContent.length} 字符`); - - console.log(' 🔍 开始解析JSON...'); - this.discoveryData = JSON.parse(fileContent); - console.log(' ✅ JSON解析成功'); - } - - analyzeData() { - if (!this.discoveryData) { - throw new Error('数据未加载'); - } - - console.log(' 📊 数据统计:'); - console.log(` - 控制器模块数: ${Object.keys(this.discoveryData.controllers || {}).length}`); - console.log(` - 服务层数: ${Object.keys(this.discoveryData.services || {}).length}`); - console.log(` - 模型模块数: ${Object.keys(this.discoveryData.models || {}).length}`); - - // 显示前5个控制器模块 - const controllerModules = Object.keys(this.discoveryData.controllers || {}); - console.log(` - 控制器模块示例: ${controllerModules.slice(0, 5).join(', ')}`); - - // 显示前5个服务层 - const serviceModules = Object.keys(this.discoveryData.services || {}); - console.log(` - 服务层示例: ${serviceModules.slice(0, 5).join(', ')}`); - } - - testModuleExtraction() { - const modules = new Set(); - - // 从控制器中提取模块 - console.log(' 🔨 从控制器提取模块...'); - for (const moduleName of Object.keys(this.discoveryData.controllers || {})) { - modules.add(moduleName); - } - console.log(` - 提取到 ${modules.size} 个控制器模块`); - - // 从服务中提取模块 - console.log(' 🔨 从服务提取模块...'); - let serviceModuleCount = 0; - for (const [layerName, services] of Object.entries(this.discoveryData.services || {})) { - for (const [serviceName, serviceInfo] of Object.entries(services)) { - const moduleName = this.extractModuleNameFromServicePath(serviceInfo.filePath); - if (!modules.has(moduleName)) { - serviceModuleCount++; - } - modules.add(moduleName); - } - } - console.log(` - 从服务提取到 ${serviceModuleCount} 个新模块`); - - // 从模型中提取模块 - console.log(' 🔨 从模型提取模块...'); - let modelModuleCount = 0; - for (const moduleName of Object.keys(this.discoveryData.models || {})) { - if (!modules.has(moduleName)) { - modelModuleCount++; - } - modules.add(moduleName); - } - console.log(` - 从模型提取到 ${modelModuleCount} 个新模块`); - - console.log(` 📂 总共提取到 ${modules.size} 个模块`); - console.log(` - 模块列表: ${Array.from(modules).slice(0, 10).join(', ')}${modules.size > 10 ? '...' : ''}`); - } - - extractModuleNameFromServicePath(filePath) { - // 简化版模块名提取 - const parts = filePath.split('/'); - const serviceIndex = parts.findIndex(part => part === 'service'); - if (serviceIndex !== -1 && serviceIndex + 1 < parts.length) { - return parts[serviceIndex + 1]; - } - return 'unknown'; - } -} - -if (require.main === module) { - const test = new SimpleMigrationTest(); - test.run().catch(console.error); -} - -module.exports = SimpleMigrationTest; \ No newline at end of file diff --git a/wwjcloud-nest-v1/application-boot.json b/wwjcloud-nest-v1/application-boot.json deleted file mode 100644 index b04f0fbc..00000000 --- a/wwjcloud-nest-v1/application-boot.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "NODE_ENV": "development", - "GLOBAL_PREFIX": "api", - "PORT": 3001, - "SWAGGER_ENABLED": true, - "AUTH_ENABLED": false, - "RBAC_ENABLED": false, - "RATE_LIMIT_ENABLED": false, - "REDIS_ENABLED": false, - "QUEUE_ENABLED": false -} \ No newline at end of file diff --git a/wwjcloud-nest-v1/apps/api/src/app.module.ts b/wwjcloud-nest-v1/apps/api/src/app.module.ts index c9710287..c78f2ce2 100644 --- a/wwjcloud-nest-v1/apps/api/src/app.module.ts +++ b/wwjcloud-nest-v1/apps/api/src/app.module.ts @@ -1,5 +1,5 @@ import { Module } from '@nestjs/common'; -import { WwjCloudPlatformPreset } from '@wwjBoot/preset'; +import { WwjCloudPlatformPreset } from '@wwjBoot/config/preset'; import { SecureController } from './secure.controller'; @Module({ diff --git a/wwjcloud-nest-v1/docker/k6/ai_governance_test.js b/wwjcloud-nest-v1/docker/k6/ai_governance_test.js new file mode 100644 index 00000000..05a26dfb --- /dev/null +++ b/wwjcloud-nest-v1/docker/k6/ai_governance_test.js @@ -0,0 +1,237 @@ +import http from 'k6/http'; +import { check, sleep } from 'k6'; + +export const options = { + stages: [ + { duration: '30s', target: 10 }, // 预热阶段 + { duration: '60s', target: Number(__ENV.VUS || 50) }, // 正常负载 + { duration: '30s', target: 100 }, // 高负载 + { duration: '30s', target: Number(__ENV.VUS || 50) }, // 降负载 + { duration: '20s', target: 0 }, // 冷却 + ], + thresholds: { + http_req_duration: ['p(95)<1000', 'p(99)<2000'], // AI请求允许更长的响应时间 + http_req_failed: ['rate<0.05'], // AI请求允许5%的失败率 + checks: ['rate>0.90'], // 90%的检查通过率 + }, +}; + +const BASE = __ENV.BASE_URL || 'http://api:3000'; +const API = BASE.endsWith('/api') ? BASE : `${BASE}/api`; + +function safeJson(res) { + try { return res.json(); } catch (e) { return null; } +} + +function getRandomInt(min, max) { + return Math.floor(Math.random() * (max - min + 1)) + min; +} + +export default function () { + const testType = getRandomInt(1, 8); + + switch (testType) { + case 1: + testAIRecoveryService(); + break; + case 2: + testAIRecoveryDrain(); + break; + case 3: + testAIFailureSimulation(); + break; + case 4: + testAICoordinatorService(); + break; + case 5: + testAIManagerOrchestrator(); + break; + case 6: + testAICacheOptimization(); + break; + case 7: + testAIEventHandling(); + break; + case 8: + testAIBootstrapProvider(); + break; + } + + sleep(getRandomInt(0.1, 0.5)); +} + +// 1. AI Recovery Service 测试 +function testAIRecoveryService() { + const recoveryStatus = http.get(`${API}/ai/recovery/status`); + const statusData = safeJson(recoveryStatus); + + check(recoveryStatus, { + 'ai/recovery/status 200': (r) => r.status === 200, + 'ai/recovery/status success': () => statusData && statusData.code === 1, + 'ai/recovery/status has data': () => statusData && statusData.data !== null, + }); + + sleep(0.1); + + // 测试恢复处理能力 + const processTest = http.get(`${API}/ai/recovery/process-one`); + const processData = safeJson(processTest); + + check(processTest, { + 'ai/recovery/process-one response': (r) => r.status === 200, + 'ai/recovery/process-one handled': () => processData && typeof processData === 'object', + }); +} + +// 2. AI Recovery Drain 测试 +function testAIRecoveryDrain() { + const drainResult = http.get(`${API}/ai/recovery/drain?max=5`); + const drainData = safeJson(drainResult); + + check(drainResult, { + 'ai/recovery/drain response': (r) => r.status === 200, + 'ai/recovery/drain success': () => drainData && drainData.code === 1, + 'ai/recovery/drain processed': () => drainData && drainData.data && typeof drainData.data.processed === 'number', + }); +} + +// 3. AI Failure Simulation 测试 +function testAIFailureSimulation() { + const failTest = http.get(`${API}/ai/recovery/simulate-failure?severity=medium&reason=governance-test`); + const failData = safeJson(failTest); + + check(failTest, { + 'ai/recovery/simulate-failure response': (r) => r.status === 200, + 'ai/recovery/simulate-failure handled': () => failData && typeof failData === 'object', + }); +} + +// 4. AI 治理压力测试 - 组合操作 +function testAICoordinatorService() { + // 测试AI治理的协调能力:状态检查 + 处理操作 + const status1 = http.get(`${API}/ai/recovery/status`); + const statusData1 = safeJson(status1); + + check(status1, { + 'ai governance coordination - status check': (r) => r.status === 200, + 'ai governance coordination - valid status': () => statusData1 && statusData1.code === 1, + }); + + sleep(0.1); + + // 紧接着处理一个任务 + const processResult = http.post(`${API}/ai/recovery/process-one`); + const processData = safeJson(processResult); + + check(processResult, { + 'ai governance coordination - process task': (r) => r.status === 200, + 'ai governance coordination - process result': () => processData && typeof processData === 'object', + }); +} + +// 5. AI 治理综合测试 +function testAIManagerOrchestrator() { + // 测试AI治理的综合管理能力:多端点组合测试 + const requests = [ + { url: `${API}/ai/recovery/status`, method: 'GET' }, + { url: `${API}/ai/recovery/drain?max=3`, method: 'GET' }, + { url: `${API}/health/quick`, method: 'GET' }, // 系统整体健康 + ]; + + const results = requests.map(req => { + const response = req.method === 'GET' ? + http.get(req.url) : + http.post(req.url, '', { headers: { 'Content-Type': 'application/json' } }); + return { response, data: safeJson(response) }; + }); + + // 验证所有请求都成功 + results.forEach((result, index) => { + check(result.response, { + [`ai governance orchestration - request ${index + 1}`]: (r) => r.status >= 200 && r.status < 500, + }); + }); +} + +// 6. AI Cache Optimization 测试 +function testAICacheOptimization() { + // 测试缓存优化器的性能监控 + const cacheOptTest = http.get(`${API}/cache/ping`); + const cacheData = safeJson(cacheOptTest); + + check(cacheOptTest, { + 'cache optimization response': (r) => r.status === 200, + 'cache working': () => cacheData && cacheData.code === 1, + }); + + sleep(0.05); + + // 测试缓存设置 + const cacheSet = http.get(`${API}/cache/set?key=ai-test&value=governance&ttl=10`); + const setData = safeJson(cacheSet); + + check(cacheSet, { + 'ai cache set operation': (r) => r.status === 200, + 'ai cache set success': () => setData && setData.code === 1, + }); +} + +// 7. AI 治理压力测试 - 高并发恢复操作 +function testAIEventHandling() { + // 模拟高并发AI治理操作:同时进行状态检查和恢复处理 + const tasks = [ + http.get(`${API}/ai/recovery/status`), + http.get(`${API}/ai/recovery/process-one`), + http.get(`${API}/health/quick`), + ]; + + // 并行请求测试AI治理的并发处理能力 + tasks.forEach((response, index) => { + const data = safeJson(response); + check(response, { + [`ai governance concurrent - task ${index + 1}`]: (r) => r.status >= 200 && r.status < 500, + [`ai governance concurrent - data ${index + 1}`]: () => data && typeof data === 'object', + }); + }); +} + +// 8. AI 治理故障恢复测试 +function testAIBootstrapProvider() { + // 测试AI治理的故障恢复能力:模拟失败然后恢复 + const simulatePayload = { + severity: 'medium', + reason: `governance-stress-test-${Date.now()}`, + taskId: `test-${getRandomInt(1000, 9999)}` + }; + + // 先模拟一个失败 + const failResponse = http.get(`${API}/ai/recovery/simulate-failure?severity=${simulatePayload.severity}&reason=${simulatePayload.reason}&taskId=${simulatePayload.taskId}`); + const failData = safeJson(failResponse); + + check(failResponse, { + 'ai governance failure simulation': (r) => r.status === 200, + 'ai governance failure handled': () => failData && typeof failData === 'object', + }); + + sleep(0.2); + + // 然后检查恢复状态 + const recoveryStatus = http.get(`${API}/ai/recovery/status`); + const recoveryData = safeJson(recoveryStatus); + + check(recoveryStatus, { + 'ai governance recovery status': (r) => r.status === 200, + 'ai governance recovery working': () => recoveryData && recoveryData.code === 1, + }); +} + +// 压力测试场景:连续AI治理操作 +export function aiGovernanceStressTest() { + // 模拟高频率的AI治理操作 + for (let i = 0; i < 5; i++) { + testAIRecoveryService(); + sleep(0.05); + testAICacheOptimization(); + sleep(0.05); + } +} diff --git a/wwjcloud-nest-v1/docker/k6/ai_simple_test.js b/wwjcloud-nest-v1/docker/k6/ai_simple_test.js new file mode 100644 index 00000000..4fc99bd1 --- /dev/null +++ b/wwjcloud-nest-v1/docker/k6/ai_simple_test.js @@ -0,0 +1,66 @@ +import http from 'k6/http'; +import { check, sleep } from 'k6'; + +export const options = { + stages: [ + { duration: '10s', target: 5 }, // 预热阶段 + { duration: '30s', target: 20 }, // 正常负载 + { duration: '20s', target: 50 }, // 高负载 + { duration: '10s', target: 0 }, // 冷却 + ], + thresholds: { + http_req_duration: ['p(95)<500', 'p(99)<1000'], + http_req_failed: ['rate<0.1'], + checks: ['rate>0.8'], + }, +}; + +const BASE = __ENV.BASE_URL || 'http://api:3000'; +const API = BASE.endsWith('/api') ? BASE : `${BASE}/api`; + +function safeJson(res) { + try { return res.json(); } catch (e) { return null; } +} + +export default function () { + // 1. 测试AI恢复状态(公开端点) + const aiStatus = http.get(`${API}/ai/recovery/status`); + const statusData = safeJson(aiStatus); + + check(aiStatus, { + 'ai recovery status 200': (r) => r.status === 200, + 'ai recovery status success': () => statusData && statusData.code === 1, + 'ai recovery status has data': () => statusData && statusData.data !== null, + 'ai recovery status structure': () => statusData && statusData.data && typeof statusData.data === 'object', + }); + + sleep(0.1); + + // 2. 测试系统健康状态 + const health = http.get(`${API}/health/quick`); + const healthData = safeJson(health); + + check(health, { + 'system health 200': (r) => r.status === 200, + 'system health success': () => healthData && healthData.code === 1, + 'system health status ok': () => healthData && healthData.data && healthData.data.status === 'ok', + }); + + sleep(0.1); + + // 3. 测试AI治理的并发能力 + const concurrentRequests = [ + http.get(`${API}/ai/recovery/status`), + http.get(`${API}/health/quick`), + ]; + + concurrentRequests.forEach((response, index) => { + const data = safeJson(response); + check(response, { + [`ai governance concurrent ${index + 1} response`]: (r) => r.status === 200, + [`ai governance concurrent ${index + 1} valid`]: () => data && data.code >= 0, + }); + }); + + sleep(0.1); +} diff --git a/wwjcloud-nest-v1/docker/k6/boot_test.js b/wwjcloud-nest-v1/docker/k6/boot_test.js new file mode 100644 index 00000000..b15fc8eb --- /dev/null +++ b/wwjcloud-nest-v1/docker/k6/boot_test.js @@ -0,0 +1,66 @@ +import http from 'k6/http'; +import { check, sleep } from 'k6'; + +export const options = { + vus: Number(__ENV.VUS || 100), + iterations: Number(__ENV.ITERATIONS || 1000), + thresholds: { + http_req_duration: ['p(95)<500'], + http_req_failed: ['rate<0.01'], + checks: ['rate>0.95'], + }, +}; + +const BASE = __ENV.BASE_URL || 'http://api:3000'; +const API = BASE.endsWith('/api') ? BASE : `${BASE}/api`; + +function safeJson(res) { + try { return res.json(); } catch (e) { return null; } +} + +export default function () { + // 1) Health check - quick version + const healthQuick = http.get(`${API}/health/quick`); + const healthQuickData = safeJson(healthQuick); + check(healthQuick, { + 'health/quick 200': (r) => r.status === 200, + 'health/quick success code': () => healthQuickData && healthQuickData.code === 1, + 'health/quick JSON response': () => healthQuickData && healthQuickData.data, + 'health/quick status ok': () => healthQuickData && healthQuickData.data && healthQuickData.data.status === 'ok', + }); + + sleep(0.05); + + // 2) Health check - full version + const healthFull = http.get(`${API}/health`); + const healthData = safeJson(healthFull); + check(healthFull, { + 'health 200': (r) => r.status === 200, + 'health has memory check': () => healthData && healthData.data && healthData.data.info && healthData.data.info.memory_heap, + 'health has disk check': () => healthData && healthData.data && healthData.data.info && healthData.data.info.disk, + 'health status ok': () => healthData && healthData.data && healthData.data.status === 'ok', + }); + + sleep(0.05); + + // 3) Test secure endpoints (should be protected) + const secure = http.get(`${API}/secure/ping`); + const secureData = safeJson(secure); + check(secure, { + 'secure/ping auth required': () => { + // 检查是否返回认证错误(code=0表示失败,这是预期的认证失败) + return secureData && secureData.code === 0 && + secureData.msg_key && secureData.msg_key.includes('auth'); + }, + }); + + sleep(0.1); + + // 4) Test public secure endpoint + const securePublic = http.get(`${API}/secure/public`); + check(securePublic, { + 'secure/public accessible': (r) => r.status === 200, + }); + + sleep(0.05); +} diff --git a/wwjcloud-nest-v1/docker/k6/out.json b/wwjcloud-nest-v1/docker/k6/out.json deleted file mode 100644 index a5f7036b..00000000 Binary files a/wwjcloud-nest-v1/docker/k6/out.json and /dev/null differ diff --git a/wwjcloud-nest-v1/docker/k6/summary-100k.json b/wwjcloud-nest-v1/docker/k6/summary-100k.json deleted file mode 100644 index 44bdce7a..00000000 --- a/wwjcloud-nest-v1/docker/k6/summary-100k.json +++ /dev/null @@ -1,248 +0,0 @@ -{ - "metrics": { - "http_req_receiving": { - "max": 29.393333, - "p(90)": 0.05475, - "p(95)": 0.077084, - "avg": 0.025036205579999773, - "min": 0.00375, - "med": 0.013541 - }, - "data_sent": { - "count": 69533637, - "rate": 274441.77157841175 - }, - "http_req_duration": { - "avg": 14.82422653465047, - "min": 0.167083, - "med": 8.9653125, - "max": 1639.884376, - "p(90)": 37.24386630000001, - "p(95)": 48.89163539999999, - "thresholds": { - "p(95)<800": false - } - }, - "http_req_sending": { - "avg": 0.007983382192856192, - "min": 0.000917, - "med": 0.002792, - "max": 38.783375, - "p(90)": 0.009292, - "p(95)": 0.016792 - }, - "iteration_duration": { - "avg": 506.2525345114418, - "min": 408.838583, - "med": 498.9673545, - "max": 2222.591209, - "p(90)": 562.2870919000001, - "p(95)": 591.99881045 - }, - "http_req_duration{expected_response:true}": { - "med": 8.9653125, - "max": 1639.884376, - "p(90)": 37.24386630000001, - "p(95)": 48.89163539999999, - "avg": 14.82422653465047, - "min": 0.167083 - }, - "http_req_blocked": { - "avg": 0.007475345272844883, - "min": 0.000208, - "med": 0.00075, - "max": 42.163625, - "p(90)": 0.002333, - "p(95)": 0.003042 - }, - "http_req_tls_handshaking": { - "min": 0, - "med": 0, - "max": 0, - "p(90)": 0, - "p(95)": 0, - "avg": 0 - }, - "http_req_waiting": { - "avg": 14.791206946876786, - "min": 0.153417, - "med": 8.933688, - "max": 1639.857584, - "p(90)": 37.19676630000001, - "p(95)": 48.84530864999999 - }, - "vus_max": { - "value": 200, - "min": 200, - "max": 200 - }, - "checks": { - "passes": 1639568, - "fails": 60432, - "thresholds": { - "rate>0.9": false - }, - "value": 0.9644517647058823 - }, - "http_req_connecting": { - "med": 0, - "max": 38.540542, - "p(90)": 0, - "p(95)": 0, - "avg": 0.0006034723771428572, - "min": 0 - }, - "data_received": { - "count": 2303055376, - "rate": 9089911.368114186 - }, - "http_reqs": { - "count": 700000, - "rate": 2762.824560793336 - }, - "iterations": { - "count": 100000, - "rate": 394.6892229704765 - }, - "vus": { - "value": 150, - "min": 150, - "max": 200 - }, - "http_req_failed": { - "passes": 0, - "fails": 700000, - "thresholds": { - "rate<0.05": false - }, - "value": 0 - } - }, - "root_group": { - "groups": {}, - "checks": { - "status1 200": { - "name": "status1 200", - "path": "::status1 200", - "id": "b0966ed9f78c49ab46436f14191cc0c6", - "passes": 100000, - "fails": 0 - }, - "status1 has size": { - "path": "::status1 has size", - "id": "33d01e3c34cb094970818835f2d7d62e", - "passes": 100000, - "fails": 0, - "name": "status1 has size" - }, - "simulate 200": { - "name": "simulate 200", - "path": "::simulate 200", - "id": "cf998bfbb9da1109703c694d2d426536", - "passes": 100000, - "fails": 0 - }, - "simulate ok+emitted": { - "fails": 0, - "name": "simulate ok+emitted", - "path": "::simulate ok+emitted", - "id": "be644ba113375a35db442ae2344525b5", - "passes": 100000 - }, - "statusMid 200": { - "name": "statusMid 200", - "path": "::statusMid 200", - "id": "1f2c62a4c447fdc0317aff26a290f3eb", - "passes": 100000, - "fails": 0 - }, - "statusMid size >= status1+1": { - "passes": 39568, - "fails": 60432, - "name": "statusMid size >= status1+1", - "path": "::statusMid size >= status1+1", - "id": "e2e294e30f182a67708f18e217c025b3" - }, - "process-one 200": { - "name": "process-one 200", - "path": "::process-one 200", - "id": "7d02970bccd1fafe9e03179a6046efff", - "passes": 100000, - "fails": 0 - }, - "drain 200": { - "name": "drain 200", - "path": "::drain 200", - "id": "e1fcdd397c94e954b23f487bdd3f0cbb", - "passes": 100000, - "fails": 0 - }, - "drain processed>=0": { - "name": "drain processed>=0", - "path": "::drain processed>=0", - "id": "98bb23e10c63609a18d120bdcfc82112", - "passes": 100000, - "fails": 0 - }, - "status2 200": { - "name": "status2 200", - "path": "::status2 200", - "id": "660bccd927b58520b53278128962c31b", - "passes": 100000, - "fails": 0 - }, - "status2 has size": { - "name": "status2 has size", - "path": "::status2 has size", - "id": "6211e86b783848c1967e4c5a86c5dde1", - "passes": 100000, - "fails": 0 - }, - "metrics 200": { - "fails": 0, - "name": "metrics 200", - "path": "::metrics 200", - "id": "6025b93ff340487de79d60f9527333fc", - "passes": 100000 - }, - "metrics ai_events_total": { - "name": "metrics ai_events_total", - "path": "::metrics ai_events_total", - "id": "ffc2410f8720ecfb3ea20ee065280a55", - "passes": 100000, - "fails": 0 - }, - "metrics task.failed": { - "name": "metrics task.failed", - "path": "::metrics task.failed", - "id": "c2589d168814660827ab007029490d0a", - "passes": 100000, - "fails": 0 - }, - "metrics failed has severity": { - "path": "::metrics failed has severity", - "id": "40e13307a002f007932f6a621c2f1006", - "passes": 100000, - "fails": 0, - "name": "metrics failed has severity" - }, - "metrics recovery.requested has strategy": { - "passes": 100000, - "fails": 0, - "name": "metrics recovery.requested has strategy", - "path": "::metrics recovery.requested has strategy", - "id": "1a76328dd3ba77bb8b5f0879a33dc329" - }, - "metrics recovery.completed has strategy": { - "path": "::metrics recovery.completed has strategy", - "id": "7c883b8c4858f369c9b139b0df05607b", - "passes": 100000, - "fails": 0, - "name": "metrics recovery.completed has strategy" - } - }, - "name": "", - "path": "", - "id": "d41d8cd98f00b204e9800998ecf8427e" - } -} \ No newline at end of file diff --git a/wwjcloud-nest-v1/docker/k6/summary-300k.json b/wwjcloud-nest-v1/docker/k6/summary-300k.json deleted file mode 100644 index ad28121f..00000000 --- a/wwjcloud-nest-v1/docker/k6/summary-300k.json +++ /dev/null @@ -1,248 +0,0 @@ -{ - "root_group": { - "name": "", - "path": "", - "id": "d41d8cd98f00b204e9800998ecf8427e", - "groups": {}, - "checks": { - "status1 200": { - "name": "status1 200", - "path": "::status1 200", - "id": "b0966ed9f78c49ab46436f14191cc0c6", - "passes": 16751, - "fails": 0 - }, - "status1 has size": { - "fails": 0, - "name": "status1 has size", - "path": "::status1 has size", - "id": "33d01e3c34cb094970818835f2d7d62e", - "passes": 16751 - }, - "simulate 200": { - "name": "simulate 200", - "path": "::simulate 200", - "id": "cf998bfbb9da1109703c694d2d426536", - "passes": 16724, - "fails": 0 - }, - "simulate ok+emitted": { - "name": "simulate ok+emitted", - "path": "::simulate ok+emitted", - "id": "be644ba113375a35db442ae2344525b5", - "passes": 16724, - "fails": 0 - }, - "statusMid 200": { - "name": "statusMid 200", - "path": "::statusMid 200", - "id": "1f2c62a4c447fdc0317aff26a290f3eb", - "passes": 16664, - "fails": 0 - }, - "statusMid size >= status1+1": { - "passes": 3224, - "fails": 13440, - "name": "statusMid size >= status1+1", - "path": "::statusMid size >= status1+1", - "id": "e2e294e30f182a67708f18e217c025b3" - }, - "process-one 200": { - "name": "process-one 200", - "path": "::process-one 200", - "id": "7d02970bccd1fafe9e03179a6046efff", - "passes": 16644, - "fails": 0 - }, - "drain 200": { - "id": "e1fcdd397c94e954b23f487bdd3f0cbb", - "passes": 16637, - "fails": 0, - "name": "drain 200", - "path": "::drain 200" - }, - "drain processed>=0": { - "name": "drain processed>=0", - "path": "::drain processed>=0", - "id": "98bb23e10c63609a18d120bdcfc82112", - "passes": 16637, - "fails": 0 - }, - "status2 200": { - "id": "660bccd927b58520b53278128962c31b", - "passes": 16509, - "fails": 0, - "name": "status2 200", - "path": "::status2 200" - }, - "status2 has size": { - "name": "status2 has size", - "path": "::status2 has size", - "id": "6211e86b783848c1967e4c5a86c5dde1", - "passes": 16509, - "fails": 0 - }, - "metrics 200": { - "name": "metrics 200", - "path": "::metrics 200", - "id": "6025b93ff340487de79d60f9527333fc", - "passes": 16494, - "fails": 0 - }, - "metrics ai_events_total": { - "path": "::metrics ai_events_total", - "id": "ffc2410f8720ecfb3ea20ee065280a55", - "passes": 16494, - "fails": 0, - "name": "metrics ai_events_total" - }, - "metrics task.failed": { - "fails": 0, - "name": "metrics task.failed", - "path": "::metrics task.failed", - "id": "c2589d168814660827ab007029490d0a", - "passes": 16494 - }, - "metrics failed has severity": { - "name": "metrics failed has severity", - "path": "::metrics failed has severity", - "id": "40e13307a002f007932f6a621c2f1006", - "passes": 16494, - "fails": 0 - }, - "metrics recovery.requested has strategy": { - "id": "1a76328dd3ba77bb8b5f0879a33dc329", - "passes": 16494, - "fails": 0, - "name": "metrics recovery.requested has strategy", - "path": "::metrics recovery.requested has strategy" - }, - "metrics recovery.completed has strategy": { - "passes": 16494, - "fails": 0, - "name": "metrics recovery.completed has strategy", - "path": "::metrics recovery.completed has strategy", - "id": "7c883b8c4858f369c9b139b0df05607b" - } - } - }, - "metrics": { - "vus_max": { - "value": 400, - "min": 400, - "max": 400 - }, - "http_req_duration": { - "avg": 54.76594566550441, - "min": 0.51675, - "med": 52.258708, - "max": 2858.466127, - "p(90)": 82.37481640000001, - "p(95)": 95.10029639999999, - "thresholds": { - "p(95)<800": false - } - }, - "http_req_blocked": { - "avg": 0.0913915984726337, - "min": 0.000166, - "med": 0.000416, - "max": 32.724042, - "p(90)": 0.001083, - "p(95)": 0.001583 - }, - "http_req_tls_handshaking": { - "avg": 0, - "min": 0, - "med": 0, - "max": 0, - "p(90)": 0, - "p(95)": 0 - }, - "http_req_failed": { - "fails": 116423, - "passes": 0, - "thresholds": { - "rate<0.05": false - }, - "value": 0 - }, - "http_req_receiving": { - "p(90)": 0.019666, - "p(95)": 0.029333, - "avg": 0.012086685156712918, - "min": 0.004166, - "med": 0.007958, - "max": 5.401916 - }, - "data_sent": { - "rate": 355024.735935829, - "count": 11589506 - }, - "data_received": { - "count": 383027598, - "rate": 11733396.732879285 - }, - "iteration_duration": { - "avg": 783.9958139973778, - "min": 504.652417, - "med": 763.0504585, - "max": 3615.660168, - "p(90)": 870.9664503, - "p(95)": 910.8626922999999 - }, - "http_reqs": { - "count": 116423, - "rate": 3566.419900197387 - }, - "vus": { - "value": 400, - "min": 400, - "max": 400 - }, - "http_req_duration{expected_response:true}": { - "med": 52.258708, - "max": 2858.466127, - "p(90)": 82.37481640000001, - "p(95)": 95.10029639999999, - "avg": 54.76594566550441, - "min": 0.51675 - }, - "http_req_connecting": { - "max": 21.82925, - "p(90)": 0, - "p(95)": 0, - "avg": 0.022368905894883315, - "min": 0, - "med": 0 - }, - "http_req_sending": { - "avg": 0.004390420638533219, - "min": 0.000875, - "med": 0.002, - "max": 7.456, - "p(90)": 0.004042, - "p(95)": 0.006828899999999788 - }, - "checks": { - "passes": 268738, - "fails": 13440, - "thresholds": { - "rate>0.9": false - }, - "value": 0.9523704895491498 - }, - "http_req_waiting": { - "med": 52.242084, - "max": 2858.438376, - "p(90)": 82.3623506, - "p(95)": 95.0820869, - "avg": 54.749468559709484, - "min": 0.475625 - }, - "iterations": { - "count": 16390, - "rate": 502.0796763889882 - } - } -} \ No newline at end of file diff --git a/wwjcloud-nest-v1/docker/k6/summary-600k.json b/wwjcloud-nest-v1/docker/k6/summary-600k.json deleted file mode 100644 index 2b3c984b..00000000 --- a/wwjcloud-nest-v1/docker/k6/summary-600k.json +++ /dev/null @@ -1,248 +0,0 @@ -{ - "root_group": { - "name": "", - "path": "", - "id": "d41d8cd98f00b204e9800998ecf8427e", - "groups": {}, - "checks": { - "status1 200": { - "name": "status1 200", - "path": "::status1 200", - "id": "b0966ed9f78c49ab46436f14191cc0c6", - "passes": 17142, - "fails": 0 - }, - "status1 has size": { - "name": "status1 has size", - "path": "::status1 has size", - "id": "33d01e3c34cb094970818835f2d7d62e", - "passes": 17142, - "fails": 0 - }, - "simulate 200": { - "name": "simulate 200", - "path": "::simulate 200", - "id": "cf998bfbb9da1109703c694d2d426536", - "passes": 17098, - "fails": 0 - }, - "simulate ok+emitted": { - "name": "simulate ok+emitted", - "path": "::simulate ok+emitted", - "id": "be644ba113375a35db442ae2344525b5", - "passes": 17098, - "fails": 0 - }, - "statusMid 200": { - "name": "statusMid 200", - "path": "::statusMid 200", - "id": "1f2c62a4c447fdc0317aff26a290f3eb", - "passes": 17067, - "fails": 0 - }, - "statusMid size >= status1+1": { - "id": "e2e294e30f182a67708f18e217c025b3", - "passes": 3548, - "fails": 13519, - "name": "statusMid size >= status1+1", - "path": "::statusMid size >= status1+1" - }, - "process-one 200": { - "name": "process-one 200", - "path": "::process-one 200", - "id": "7d02970bccd1fafe9e03179a6046efff", - "passes": 17001, - "fails": 0 - }, - "drain 200": { - "name": "drain 200", - "path": "::drain 200", - "id": "e1fcdd397c94e954b23f487bdd3f0cbb", - "passes": 17001, - "fails": 0 - }, - "drain processed>=0": { - "name": "drain processed>=0", - "path": "::drain processed>=0", - "id": "98bb23e10c63609a18d120bdcfc82112", - "passes": 17001, - "fails": 0 - }, - "status2 200": { - "id": "660bccd927b58520b53278128962c31b", - "passes": 16924, - "fails": 0, - "name": "status2 200", - "path": "::status2 200" - }, - "status2 has size": { - "fails": 0, - "name": "status2 has size", - "path": "::status2 has size", - "id": "6211e86b783848c1967e4c5a86c5dde1", - "passes": 16924 - }, - "metrics 200": { - "name": "metrics 200", - "path": "::metrics 200", - "id": "6025b93ff340487de79d60f9527333fc", - "passes": 16870, - "fails": 0 - }, - "metrics ai_events_total": { - "name": "metrics ai_events_total", - "path": "::metrics ai_events_total", - "id": "ffc2410f8720ecfb3ea20ee065280a55", - "passes": 16870, - "fails": 0 - }, - "metrics task.failed": { - "passes": 16870, - "fails": 0, - "name": "metrics task.failed", - "path": "::metrics task.failed", - "id": "c2589d168814660827ab007029490d0a" - }, - "metrics failed has severity": { - "id": "40e13307a002f007932f6a621c2f1006", - "passes": 16870, - "fails": 0, - "name": "metrics failed has severity", - "path": "::metrics failed has severity" - }, - "metrics recovery.requested has strategy": { - "id": "1a76328dd3ba77bb8b5f0879a33dc329", - "passes": 16870, - "fails": 0, - "name": "metrics recovery.requested has strategy", - "path": "::metrics recovery.requested has strategy" - }, - "metrics recovery.completed has strategy": { - "name": "metrics recovery.completed has strategy", - "path": "::metrics recovery.completed has strategy", - "id": "7c883b8c4858f369c9b139b0df05607b", - "passes": 16870, - "fails": 0 - } - } - }, - "metrics": { - "http_reqs": { - "count": 119103, - "rate": 3570.569160141566 - }, - "http_req_duration{expected_response:true}": { - "avg": 54.731439980957354, - "min": 0.365458, - "med": 52.390292, - "max": 2951.556085, - "p(90)": 80.8724672, - "p(95)": 94.67780899999998 - }, - "iteration_duration": { - "min": 429.174875, - "med": 762.605084, - "max": 3693.962669, - "p(90)": 865.088626, - "p(95)": 898.9440205, - "avg": 782.8294353733804 - }, - "http_req_blocked": { - "p(95)": 0.001625, - "avg": 0.0029061144051773114, - "min": 0.000166, - "med": 0.000375, - "max": 10.651334, - "p(90)": 0.001125 - }, - "http_req_duration": { - "avg": 54.731439980957354, - "min": 0.365458, - "med": 52.390292, - "max": 2951.556085, - "p(90)": 80.8724672, - "p(95)": 94.67780899999998, - "thresholds": { - "p(95)<800": false - } - }, - "http_req_waiting": { - "p(95)": 94.6652209, - "avg": 54.71542946590838, - "min": 0.357542, - "med": 52.378291, - "max": 2951.539709, - "p(90)": 80.8539578 - }, - "iterations": { - "count": 16771, - "rate": 502.7750382839576 - }, - "http_req_sending": { - "p(90)": 0.004042, - "p(95)": 0.00675, - "avg": 0.0035785966012608613, - "min": 0.000875, - "med": 0.001958, - "max": 8.114209 - }, - "data_received": { - "count": 391821679, - "rate": 11746357.382368943 - }, - "http_req_receiving": { - "avg": 0.012431918448737813, - "min": 0.004083, - "med": 0.007959, - "max": 6.2465, - "p(90)": 0.019459, - "p(95)": 0.029459 - }, - "vus": { - "value": 400, - "min": 400, - "max": 400 - }, - "checks": { - "passes": 275166, - "fails": 13519, - "thresholds": { - "rate>0.9": false - }, - "value": 0.9531704106552125 - }, - "http_req_connecting": { - "p(95)": 0, - "avg": 0.0019836958011133225, - "min": 0, - "med": 0, - "max": 10.641292, - "p(90)": 0 - }, - "vus_max": { - "value": 400, - "min": 400, - "max": 400 - }, - "data_sent": { - "count": 11857037, - "rate": 355460.15333667054 - }, - "http_req_failed": { - "passes": 0, - "fails": 119103, - "thresholds": { - "rate<0.05": false - }, - "value": 0 - }, - "http_req_tls_handshaking": { - "avg": 0, - "min": 0, - "med": 0, - "max": 0, - "p(90)": 0, - "p(95)": 0 - } - } -} \ No newline at end of file diff --git a/wwjcloud-nest-v1/docker/k6/summary-990k.json b/wwjcloud-nest-v1/docker/k6/summary-990k.json deleted file mode 100644 index 69251c0c..00000000 --- a/wwjcloud-nest-v1/docker/k6/summary-990k.json +++ /dev/null @@ -1,248 +0,0 @@ -{ - "root_group": { - "name": "", - "path": "", - "id": "d41d8cd98f00b204e9800998ecf8427e", - "groups": {}, - "checks": { - "status1 200": { - "path": "::status1 200", - "id": "b0966ed9f78c49ab46436f14191cc0c6", - "passes": 76732, - "fails": 0, - "name": "status1 200" - }, - "status1 has size": { - "path": "::status1 has size", - "id": "33d01e3c34cb094970818835f2d7d62e", - "passes": 76732, - "fails": 0, - "name": "status1 has size" - }, - "simulate 200": { - "name": "simulate 200", - "path": "::simulate 200", - "id": "cf998bfbb9da1109703c694d2d426536", - "passes": 76686, - "fails": 0 - }, - "simulate ok+emitted": { - "passes": 76686, - "fails": 0, - "name": "simulate ok+emitted", - "path": "::simulate ok+emitted", - "id": "be644ba113375a35db442ae2344525b5" - }, - "statusMid 200": { - "path": "::statusMid 200", - "id": "1f2c62a4c447fdc0317aff26a290f3eb", - "passes": 76635, - "fails": 0, - "name": "statusMid 200" - }, - "statusMid size >= status1+1": { - "id": "e2e294e30f182a67708f18e217c025b3", - "passes": 16069, - "fails": 60566, - "name": "statusMid size >= status1+1", - "path": "::statusMid size >= status1+1" - }, - "process-one 200": { - "path": "::process-one 200", - "id": "7d02970bccd1fafe9e03179a6046efff", - "passes": 76621, - "fails": 0, - "name": "process-one 200" - }, - "drain 200": { - "name": "drain 200", - "path": "::drain 200", - "id": "e1fcdd397c94e954b23f487bdd3f0cbb", - "passes": 76600, - "fails": 0 - }, - "drain processed>=0": { - "fails": 0, - "name": "drain processed>=0", - "path": "::drain processed>=0", - "id": "98bb23e10c63609a18d120bdcfc82112", - "passes": 76600 - }, - "status2 200": { - "name": "status2 200", - "path": "::status2 200", - "id": "660bccd927b58520b53278128962c31b", - "passes": 76529, - "fails": 0 - }, - "status2 has size": { - "fails": 0, - "name": "status2 has size", - "path": "::status2 has size", - "id": "6211e86b783848c1967e4c5a86c5dde1", - "passes": 76529 - }, - "metrics 200": { - "fails": 0, - "name": "metrics 200", - "path": "::metrics 200", - "id": "6025b93ff340487de79d60f9527333fc", - "passes": 76469 - }, - "metrics ai_events_total": { - "passes": 76469, - "fails": 0, - "name": "metrics ai_events_total", - "path": "::metrics ai_events_total", - "id": "ffc2410f8720ecfb3ea20ee065280a55" - }, - "metrics task.failed": { - "fails": 0, - "name": "metrics task.failed", - "path": "::metrics task.failed", - "id": "c2589d168814660827ab007029490d0a", - "passes": 76469 - }, - "metrics failed has severity": { - "name": "metrics failed has severity", - "path": "::metrics failed has severity", - "id": "40e13307a002f007932f6a621c2f1006", - "passes": 76469, - "fails": 0 - }, - "metrics recovery.requested has strategy": { - "id": "1a76328dd3ba77bb8b5f0879a33dc329", - "passes": 76469, - "fails": 0, - "name": "metrics recovery.requested has strategy", - "path": "::metrics recovery.requested has strategy" - }, - "metrics recovery.completed has strategy": { - "id": "7c883b8c4858f369c9b139b0df05607b", - "passes": 76469, - "fails": 0, - "name": "metrics recovery.completed has strategy", - "path": "::metrics recovery.completed has strategy" - } - } - }, - "metrics": { - "iteration_duration": { - "avg": 794.4410957618475, - "min": 559.052292, - "med": 763.7009795, - "max": 2454.289418, - "p(90)": 921.6397795, - "p(95)": 959.8251259 - }, - "http_req_receiving": { - "max": 6.411, - "p(90)": 0.021041, - "p(95)": 0.031084, - "avg": 0.012620682923964174, - "min": 0.003916, - "med": 0.008125 - }, - "vus": { - "value": 400, - "min": 400, - "max": 400 - }, - "data_sent": { - "count": 53297070, - "rate": 350384.8332824616 - }, - "http_req_waiting": { - "avg": 56.020666320876515, - "min": 0.486875, - "med": 54.016208, - "max": 1693.721043, - "p(90)": 85.715642, - "p(95)": 100.466708 - }, - "vus_max": { - "value": 400, - "min": 400, - "max": 400 - }, - "http_req_failed": { - "passes": 0, - "fails": 536272, - "thresholds": { - "rate<0.05": false - }, - "value": 0 - }, - "http_req_duration{expected_response:true}": { - "min": 0.529958, - "med": 54.031771000000006, - "max": 1693.770418, - "p(90)": 85.73500810000002, - "p(95)": 100.48790815, - "avg": 56.03699503205073 - }, - "http_req_tls_handshaking": { - "min": 0, - "med": 0, - "max": 0, - "p(90)": 0, - "p(95)": 0, - "avg": 0 - }, - "http_req_connecting": { - "avg": 0.009859584460870607, - "min": 0, - "med": 0, - "max": 31.446708, - "p(90)": 0, - "p(95)": 0 - }, - "http_reqs": { - "rate": 3525.5516919420197, - "count": 536272 - }, - "http_req_blocked": { - "avg": 0.025469064135193367, - "min": 0.000166, - "med": 0.000417, - "max": 35.618917, - "p(90)": 0.001167, - "p(95)": 0.001792 - }, - "http_req_duration": { - "p(95)": 100.48790815, - "avg": 56.03699503205073, - "min": 0.529958, - "med": 54.031771000000006, - "max": 1693.770418, - "p(90)": 85.73500810000002, - "thresholds": { - "p(95)<800": false - } - }, - "http_req_sending": { - "min": 0.000833, - "med": 0.002125, - "max": 6.155458, - "p(90)": 0.004584, - "p(95)": 0.007208, - "avg": 0.0037080282505896614 - }, - "iterations": { - "count": 76378, - "rate": 502.12315229426036 - }, - "checks": { - "passes": 1241233, - "fails": 60566, - "thresholds": { - "rate>0.9": false - }, - "value": 0.9534751524620928 - }, - "data_received": { - "rate": 11663194.715811512, - "count": 1774089647 - } - } -} \ No newline at end of file diff --git a/wwjcloud-nest-v1/docker/k6/summary-ai-governance-test.json b/wwjcloud-nest-v1/docker/k6/summary-ai-governance-test.json new file mode 100644 index 00000000..32c253a2 --- /dev/null +++ b/wwjcloud-nest-v1/docker/k6/summary-ai-governance-test.json @@ -0,0 +1,347 @@ +{ + "root_group": { + "checks": { + "ai governance failure simulation": { + "name": "ai governance failure simulation", + "path": "::ai governance failure simulation", + "id": "b2793f9429c4255e1722f4a39a8720f2", + "passes": 1912, + "fails": 0 + }, + "ai governance failure handled": { + "name": "ai governance failure handled", + "path": "::ai governance failure handled", + "id": "b127dd75dd349b32de577f05c6854048", + "passes": 1912, + "fails": 0 + }, + "ai governance recovery status": { + "name": "ai governance recovery status", + "path": "::ai governance recovery status", + "id": "433e4d0c9c17d766d0f8bc76b0723306", + "passes": 1228, + "fails": 684 + }, + "ai governance recovery working": { + "passes": 1228, + "fails": 684, + "name": "ai governance recovery working", + "path": "::ai governance recovery working", + "id": "c20876de077e1949f598c6bbe021eddf" + }, + "ai governance coordination - status check": { + "name": "ai governance coordination - status check", + "path": "::ai governance coordination - status check", + "id": "f52580b26577db4104f3fe45888d68cc", + "passes": 1191, + "fails": 739 + }, + "ai governance coordination - valid status": { + "path": "::ai governance coordination - valid status", + "id": "27be3b3e2d76418554e2f9b9120aa1e6", + "passes": 1191, + "fails": 739, + "name": "ai governance coordination - valid status" + }, + "ai governance coordination - process task": { + "path": "::ai governance coordination - process task", + "id": "1932bf25810927b0e6e983d692450dcf", + "passes": 1930, + "fails": 0, + "name": "ai governance coordination - process task" + }, + "ai governance coordination - process result": { + "id": "511807f39cbbb2c72af50a89bee0d8ab", + "passes": 1930, + "fails": 0, + "name": "ai governance coordination - process result", + "path": "::ai governance coordination - process result" + }, + "ai/recovery/status 200": { + "path": "::ai/recovery/status 200", + "id": "30c918f1145c72a86fbe9b36fe5e320d", + "passes": 1211, + "fails": 746, + "name": "ai/recovery/status 200" + }, + "ai/recovery/status success": { + "path": "::ai/recovery/status success", + "id": "194b740c67973bf971ee1fde17fd08a8", + "passes": 1211, + "fails": 746, + "name": "ai/recovery/status success" + }, + "ai/recovery/status has data": { + "name": "ai/recovery/status has data", + "path": "::ai/recovery/status has data", + "id": "4a4c8ef56513c3bf77ae18dfa005b2ac", + "passes": 1211, + "fails": 746 + }, + "ai/recovery/process-one response": { + "passes": 1957, + "fails": 0, + "name": "ai/recovery/process-one response", + "path": "::ai/recovery/process-one response", + "id": "e0452107920e63be920027e5a9cc93a4" + }, + "ai/recovery/process-one handled": { + "name": "ai/recovery/process-one handled", + "path": "::ai/recovery/process-one handled", + "id": "7b847f1d98896b0b6dbbd8ad46a7ebf3", + "passes": 1957, + "fails": 0 + }, + "cache optimization response": { + "name": "cache optimization response", + "path": "::cache optimization response", + "id": "1d8af0c4d882d56db43d61f6a9568e9e", + "passes": 1943, + "fails": 0 + }, + "cache working": { + "id": "1c92719d88ab1fa22fb92945db913aab", + "passes": 0, + "fails": 1943, + "name": "cache working", + "path": "::cache working" + }, + "ai cache set operation": { + "id": "b6672addeab0e8f7101aaa8ef1c11ba6", + "passes": 1943, + "fails": 0, + "name": "ai cache set operation", + "path": "::ai cache set operation" + }, + "ai cache set success": { + "name": "ai cache set success", + "path": "::ai cache set success", + "id": "937384c6154f8a5c96b80c5a5b9f2465", + "passes": 0, + "fails": 1943 + }, + "ai governance orchestration - request 1": { + "id": "fa2f789ead527a9bb8ea0009a405608a", + "passes": 1933, + "fails": 0, + "name": "ai governance orchestration - request 1", + "path": "::ai governance orchestration - request 1" + }, + "ai governance orchestration - request 2": { + "path": "::ai governance orchestration - request 2", + "id": "4c963c131d2d22f960f8e3a62f91187e", + "passes": 1933, + "fails": 0, + "name": "ai governance orchestration - request 2" + }, + "ai governance orchestration - request 3": { + "name": "ai governance orchestration - request 3", + "path": "::ai governance orchestration - request 3", + "id": "8653b6d8157f7a6c7b9a7e6c9aeb3077", + "passes": 1933, + "fails": 0 + }, + "ai/recovery/simulate-failure response": { + "name": "ai/recovery/simulate-failure response", + "path": "::ai/recovery/simulate-failure response", + "id": "ffc70e49da7063c40dbe9cfceb0083c0", + "passes": 1918, + "fails": 0 + }, + "ai/recovery/simulate-failure handled": { + "name": "ai/recovery/simulate-failure handled", + "path": "::ai/recovery/simulate-failure handled", + "id": "5f4230ca243d75aace7adcea82bc54a1", + "passes": 1918, + "fails": 0 + }, + "ai/recovery/drain response": { + "fails": 0, + "name": "ai/recovery/drain response", + "path": "::ai/recovery/drain response", + "id": "1548cde96fe824dee26a561d91411681", + "passes": 1947 + }, + "ai/recovery/drain success": { + "name": "ai/recovery/drain success", + "path": "::ai/recovery/drain success", + "id": "baad670f1ee5f1a94fb31bd4e264fbd6", + "passes": 0, + "fails": 1947 + }, + "ai/recovery/drain processed": { + "id": "9638c324173d646d7c3a86ff21a61e15", + "passes": 0, + "fails": 1947, + "name": "ai/recovery/drain processed", + "path": "::ai/recovery/drain processed" + }, + "ai governance concurrent - task 1": { + "fails": 0, + "name": "ai governance concurrent - task 1", + "path": "::ai governance concurrent - task 1", + "id": "81a6a78fcebbd338a364377f6d1598aa", + "passes": 1912 + }, + "ai governance concurrent - data 1": { + "name": "ai governance concurrent - data 1", + "path": "::ai governance concurrent - data 1", + "id": "9eca428bba8781e100d37e693c4fa875", + "passes": 1912, + "fails": 0 + }, + "ai governance concurrent - task 2": { + "fails": 0, + "name": "ai governance concurrent - task 2", + "path": "::ai governance concurrent - task 2", + "id": "52c41fa7635c5c263a883e444387ed77", + "passes": 1912 + }, + "ai governance concurrent - data 2": { + "name": "ai governance concurrent - data 2", + "path": "::ai governance concurrent - data 2", + "id": "82f34ee0e191a8eeb5443caff9829be6", + "passes": 1912, + "fails": 0 + }, + "ai governance concurrent - task 3": { + "name": "ai governance concurrent - task 3", + "path": "::ai governance concurrent - task 3", + "id": "c8ef3126fa097383bce18c0257968b27", + "passes": 1912, + "fails": 0 + }, + "ai governance concurrent - data 3": { + "name": "ai governance concurrent - data 3", + "path": "::ai governance concurrent - data 3", + "id": "c408024e3b6a018f33f2c296b0eb6a55", + "passes": 1912, + "fails": 0 + } + }, + "name": "", + "path": "", + "id": "d41d8cd98f00b204e9800998ecf8427e", + "groups": {} + }, + "metrics": { + "checks": { + "passes": 47009, + "fails": 12864, + "thresholds": { + "rate>0.90": true + }, + "value": 0.7851452240575886 + }, + "http_req_receiving": { + "avg": 0.052418287365625746, + "min": 0.005709, + "med": 0.031167, + "max": 3.116166, + "p(90)": 0.11483370000000001, + "p(95)": 0.137458 + }, + "iteration_duration": { + "p(95)": 1208.3365526, + "avg": 451.0738799943679, + "min": 100.248959, + "med": 204.11681249999998, + "max": 1364.044542, + "p(90)": 1202.8716596 + }, + "http_req_duration{expected_response:true}": { + "avg": 1.5797777827314392, + "min": 0.151583, + "med": 1.162458, + "max": 62.37875, + "p(90)": 3.319024800000002, + "p(95)": 4.2091623999999985 + }, + "http_req_waiting": { + "avg": 1.5149925643375142, + "min": 0.14125, + "med": 1.0924375, + "max": 62.189667, + "p(90)": 3.156679500000001, + "p(95)": 4.032752749999998 + }, + "http_req_duration": { + "p(90)": 3.2700251000000002, + "p(95)": 4.153035749999999, + "avg": 1.5842743895220708, + "min": 0.151583, + "med": 1.149875, + "max": 62.37875, + "thresholds": { + "p(99)<2000": false, + "p(95)<1000": false + } + }, + "http_req_sending": { + "min": 0.001167, + "med": 0.011375, + "max": 7.667375, + "p(90)": 0.0345837, + "p(95)": 0.043459, + "avg": 0.016863537818935393 + }, + "http_req_connecting": { + "avg": 0.0011851645188447094, + "min": 0, + "med": 0, + "max": 11.256, + "p(90)": 0, + "p(95)": 0 + }, + "http_reqs": { + "count": 30884, + "rate": 181.4159583155162 + }, + "vus": { + "min": 1, + "max": 99, + "value": 3 + }, + "http_req_failed": { + "passes": 3609, + "fails": 27275, + "thresholds": { + "rate<0.05": true + }, + "value": 0.11685662478953504 + }, + "http_req_blocked": { + "p(95)": 0.009542, + "avg": 0.005366002978888719, + "min": 0.00025, + "med": 0.002625, + "max": 11.351542, + "p(90)": 0.007625 + }, + "iterations": { + "count": 15452, + "rate": 90.76672023997398 + }, + "http_req_tls_handshaking": { + "avg": 0, + "min": 0, + "med": 0, + "max": 0, + "p(90)": 0, + "p(95)": 0 + }, + "data_received": { + "count": 16441388, + "rate": 96578.49242511424 + }, + "vus_max": { + "min": 100, + "max": 100, + "value": 100 + }, + "data_sent": { + "count": 3326032, + "rate": 19537.47191646396 + } + } +} \ No newline at end of file diff --git a/wwjcloud-nest-v1/docker/k6/summary-ai-simple-test.json b/wwjcloud-nest-v1/docker/k6/summary-ai-simple-test.json new file mode 100644 index 00000000..ee896c11 --- /dev/null +++ b/wwjcloud-nest-v1/docker/k6/summary-ai-simple-test.json @@ -0,0 +1,207 @@ +{ + "root_group": { + "path": "", + "id": "d41d8cd98f00b204e9800998ecf8427e", + "groups": {}, + "checks": { + "ai recovery status 200": { + "id": "0d1b62245c7430b8492c28ad04f20216", + "passes": 1402, + "fails": 2648, + "name": "ai recovery status 200", + "path": "::ai recovery status 200" + }, + "ai recovery status success": { + "name": "ai recovery status success", + "path": "::ai recovery status success", + "id": "254b0799b04fc6fe117e65b777fa50e9", + "passes": 1402, + "fails": 2648 + }, + "ai recovery status has data": { + "name": "ai recovery status has data", + "path": "::ai recovery status has data", + "id": "54c77f4c7f87281f42c12e2945dc7f84", + "passes": 1402, + "fails": 2648 + }, + "ai recovery status structure": { + "name": "ai recovery status structure", + "path": "::ai recovery status structure", + "id": "2939beb29002bfb12c58c81e93373973", + "passes": 1402, + "fails": 2648 + }, + "system health 200": { + "name": "system health 200", + "path": "::system health 200", + "id": "84d1e2f887d80a15d4a672b18769d77c", + "passes": 2537, + "fails": 1513 + }, + "system health success": { + "passes": 2537, + "fails": 1513, + "name": "system health success", + "path": "::system health success", + "id": "bba0f1a6ff4835fe75035049e3d84ed9" + }, + "system health status ok": { + "name": "system health status ok", + "path": "::system health status ok", + "id": "b2cd58fc9e305c42a034671cd42afddd", + "passes": 2537, + "fails": 1513 + }, + "ai governance concurrent 1 response": { + "fails": 2584, + "name": "ai governance concurrent 1 response", + "path": "::ai governance concurrent 1 response", + "id": "5c43ed9c9c2b08bca05111a5738b2559", + "passes": 1466 + }, + "ai governance concurrent 1 valid": { + "name": "ai governance concurrent 1 valid", + "path": "::ai governance concurrent 1 valid", + "id": "25140bd774f2c5a608503268fc0e9ae4", + "passes": 4050, + "fails": 0 + }, + "ai governance concurrent 2 response": { + "name": "ai governance concurrent 2 response", + "path": "::ai governance concurrent 2 response", + "id": "f48c0f34a0171a0a9cdb3a112353686f", + "passes": 2522, + "fails": 1528 + }, + "ai governance concurrent 2 valid": { + "path": "::ai governance concurrent 2 valid", + "id": "ba94bcfb021a913558764c8b55f30c63", + "passes": 4050, + "fails": 0, + "name": "ai governance concurrent 2 valid" + } + }, + "name": "" + }, + "metrics": { + "http_req_receiving": { + "p(95)": 0.133208, + "avg": 0.04347011080246939, + "min": 0.00475, + "med": 0.0262705, + "max": 0.947167, + "p(90)": 0.1049202 + }, + "vus": { + "value": 1, + "min": 1, + "max": 49 + }, + "data_sent": { + "count": 1506600, + "rate": 21432.00958253161 + }, + "http_req_connecting": { + "p(95)": 0, + "avg": 0.0008311365432098767, + "min": 0, + "med": 0, + "max": 0.591125, + "p(90)": 0 + }, + "http_req_sending": { + "min": 0.001167, + "med": 0.010459, + "max": 3.436625, + "p(90)": 0.03425, + "p(95)": 0.04891904999999997, + "avg": 0.01847890604938268 + }, + "checks": { + "passes": 25307, + "fails": 19243, + "thresholds": { + "rate>0.8": true + }, + "value": 0.5680583613916947 + }, + "data_received": { + "count": 9082898, + "rate": 129207.9894949935 + }, + "iteration_duration": { + "avg": 330.4368448577768, + "min": 303.681417, + "med": 329.38627099999997, + "max": 372.732834, + "p(90)": 344.7535128, + "p(95)": 351.2180439 + }, + "http_req_failed": { + "passes": 8273, + "fails": 7927, + "thresholds": { + "rate<0.1": true + }, + "value": 0.510679012345679 + }, + "http_reqs": { + "rate": 230.45171594120012, + "count": 16200 + }, + "http_req_duration{expected_response:true}": { + "avg": 6.637413217106077, + "min": 0.327667, + "med": 5.773583, + "max": 30.198875, + "p(90)": 12.477991000000001, + "p(95)": 14.527058199999997 + }, + "http_req_blocked": { + "max": 4.669375, + "p(90)": 0.00775, + "p(95)": 0.01, + "avg": 0.005797693209876497, + "min": 0.00025, + "med": 0.003292 + }, + "http_req_duration": { + "p(90)": 11.7612083, + "p(95)": 13.767574649999997, + "avg": 6.318382455185168, + "min": 0.258209, + "med": 5.4987915, + "max": 30.198875, + "thresholds": { + "p(95)<500": false, + "p(99)<1000": false + } + }, + "http_req_waiting": { + "avg": 6.256433438333305, + "min": 0.244667, + "med": 5.426188, + "max": 30.142667, + "p(90)": 11.711834000000001, + "p(95)": 13.734954499999999 + }, + "http_req_tls_handshaking": { + "max": 0, + "p(90)": 0, + "p(95)": 0, + "avg": 0, + "min": 0, + "med": 0 + }, + "iterations": { + "count": 4050, + "rate": 57.61292898530003 + }, + "vus_max": { + "value": 50, + "min": 50, + "max": 50 + } + } +} \ No newline at end of file diff --git a/wwjcloud-nest-v1/docker/k6/summary-boot-final.json b/wwjcloud-nest-v1/docker/k6/summary-boot-final.json new file mode 100644 index 00000000..6a25db60 --- /dev/null +++ b/wwjcloud-nest-v1/docker/k6/summary-boot-final.json @@ -0,0 +1,199 @@ +{ + "root_group": { + "groups": {}, + "checks": { + "health/quick 200": { + "name": "health/quick 200", + "path": "::health/quick 200", + "id": "8fe3180cd47bb58366d47cea0c42dcf8", + "passes": 100, + "fails": 0 + }, + "health/quick success code": { + "name": "health/quick success code", + "path": "::health/quick success code", + "id": "43358b476138296aca5e2534cf2de1bc", + "passes": 100, + "fails": 0 + }, + "health/quick JSON response": { + "name": "health/quick JSON response", + "path": "::health/quick JSON response", + "id": "837537268797f1cbfff95b174709b2f6", + "passes": 100, + "fails": 0 + }, + "health/quick status ok": { + "path": "::health/quick status ok", + "id": "933f71ce7b758b96be6444269c8a5c6b", + "passes": 100, + "fails": 0, + "name": "health/quick status ok" + }, + "health 200": { + "name": "health 200", + "path": "::health 200", + "id": "8e4f90a842a57472549a6b2cf699032d", + "passes": 100, + "fails": 0 + }, + "health has memory check": { + "path": "::health has memory check", + "id": "34a50eef53846bb1c7cc2f582dbd4e09", + "passes": 100, + "fails": 0, + "name": "health has memory check" + }, + "health has disk check": { + "name": "health has disk check", + "path": "::health has disk check", + "id": "3ecf4cd2455d39c167f500987a5d0228", + "passes": 100, + "fails": 0 + }, + "health status ok": { + "path": "::health status ok", + "id": "53677fecf8cdb2e355a9ac158d8f0e54", + "passes": 100, + "fails": 0, + "name": "health status ok" + }, + "secure/ping auth required": { + "name": "secure/ping auth required", + "path": "::secure/ping auth required", + "id": "5c45c248261c98b16e94f785d2c83487", + "passes": 100, + "fails": 0 + }, + "secure/public accessible": { + "id": "d7174c3ee1c9b192cc9d6f775885056d", + "passes": 100, + "fails": 0, + "name": "secure/public accessible", + "path": "::secure/public accessible" + } + }, + "name": "", + "path": "", + "id": "d41d8cd98f00b204e9800998ecf8427e" + }, + "metrics": { + "checks": { + "passes": 1000, + "fails": 0, + "thresholds": { + "rate>0.95": false + }, + "value": 1 + }, + "vus_max": { + "value": 20, + "min": 20, + "max": 20 + }, + "data_received": { + "count": 238700, + "rate": 170846.72207334416 + }, + "http_req_sending": { + "avg": 0.011104370000000006, + "min": 0.002041, + "med": 0.0071875, + "max": 0.08775, + "p(90)": 0.0229631, + "p(95)": 0.030420199999999998 + }, + "vus": { + "max": 20, + "value": 20, + "min": 20 + }, + "http_req_duration": { + "avg": 5.605405417499997, + "min": 0.236666, + "med": 2.7776255, + "max": 25.473959, + "p(90)": 16.400716900000003, + "p(95)": 18.972780649999997, + "thresholds": { + "p(95)<500": false + } + }, + "http_reqs": { + "count": 400, + "rate": 286.29530301356374 + }, + "iterations": { + "count": 100, + "rate": 71.57382575339093 + }, + "http_req_tls_handshaking": { + "avg": 0, + "min": 0, + "med": 0, + "max": 0, + "p(90)": 0, + "p(95)": 0 + }, + "iteration_duration": { + "p(95)": 287.15976075, + "avg": 276.27076715999993, + "min": 264.714209, + "med": 276.549521, + "max": 291.53975, + "p(90)": 285.0274453 + }, + "data_sent": { + "rate": 25337.13431670039, + "count": 35400 + }, + "http_req_duration{expected_response:true}": { + "p(95)": 18.972780649999997, + "avg": 5.605405417499997, + "min": 0.236666, + "med": 2.7776255, + "max": 25.473959, + "p(90)": 16.400716900000003 + }, + "http_req_connecting": { + "med": 0, + "max": 0.339042, + "p(90)": 0, + "p(95)": 0.003191649999998869, + "avg": 0.007698435, + "min": 0 + }, + "http_req_waiting": { + "avg": 5.5673987625000025, + "min": 0.218583, + "med": 2.7176045, + "max": 25.449708, + "p(90)": 16.375625600000003, + "p(95)": 18.941949349999994 + }, + "http_req_receiving": { + "max": 0.156417, + "p(90)": 0.058778600000000014, + "p(95)": 0.08209789999999997, + "avg": 0.026902285000000022, + "min": 0.005, + "med": 0.0175205 + }, + "http_req_failed": { + "passes": 0, + "fails": 400, + "thresholds": { + "rate<0.01": false + }, + "value": 0 + }, + "http_req_blocked": { + "avg": 0.03572482000000002, + "min": 0.000458, + "med": 0.0018335, + "max": 0.963084, + "p(90)": 0.007225600000000001, + "p(95)": 0.10878189999999403 + } + } +} \ No newline at end of file diff --git a/wwjcloud-nest-v1/docker/k6/summary-boot-small.json b/wwjcloud-nest-v1/docker/k6/summary-boot-small.json new file mode 100644 index 00000000..ee5d2dd2 --- /dev/null +++ b/wwjcloud-nest-v1/docker/k6/summary-boot-small.json @@ -0,0 +1,192 @@ +{ + "metrics": { + "http_req_blocked": { + "p(95)": 0.8462457999999998, + "avg": 0.05993186749999981, + "min": 0.000417, + "med": 0.001334, + "max": 1.225333, + "p(90)": 0.004792 + }, + "iteration_duration": { + "max": 322.047667, + "p(90)": 314.27602509999997, + "p(95)": 319.2262042, + "avg": 282.52515201000006, + "min": 257.870125, + "med": 270.8883545 + }, + "vus_max": { + "value": 50, + "min": 50, + "max": 50 + }, + "http_req_sending": { + "min": 0.001416, + "med": 0.004625, + "max": 0.593125, + "p(90)": 0.025375, + "p(95)": 0.1109631, + "avg": 0.01783334875000002 + }, + "data_received": { + "count": 448600, + "rate": 391749.3216036566 + }, + "checks": { + "passes": 1000, + "fails": 800, + "thresholds": { + "rate>0.95": true + }, + "value": 0.5555555555555556 + }, + "http_reqs": { + "count": 800, + "rate": 698.6167126235516 + }, + "iterations": { + "count": 200, + "rate": 174.6541781558879 + }, + "data_sent": { + "count": 70800, + "rate": 61827.57906718431 + }, + "http_req_duration": { + "p(90)": 28.836483, + "p(95)": 35.1579774, + "avg": 7.038902765000004, + "min": 0.269708, + "med": 2.8832500000000003, + "max": 45.526834, + "thresholds": { + "p(95)<500": false + } + }, + "http_req_waiting": { + "max": 45.505542, + "p(90)": 28.815295199999998, + "p(95)": 35.145794099999996, + "avg": 6.99865770125001, + "min": 0.248333, + "med": 2.812125 + }, + "http_req_duration{expected_response:true}": { + "min": 0.269708, + "med": 4.0765625, + "max": 45.526834, + "p(90)": 32.073949999999996, + "p(95)": 37.803913949999995, + "avg": 9.804880770000002 + }, + "http_req_receiving": { + "avg": 0.022411715000000002, + "min": 0.00475, + "med": 0.012396, + "max": 1.181667, + "p(90)": 0.03977920000000001, + "p(95)": 0.05975804999999996 + }, + "http_req_connecting": { + "avg": 0.012395004999999997, + "min": 0, + "med": 0, + "max": 0.6115, + "p(90)": 0, + "p(95)": 0.05510209999999966 + }, + "http_req_failed": { + "passes": 300, + "fails": 500, + "thresholds": { + "rate<0.01": true + }, + "value": 0.375 + }, + "http_req_tls_handshaking": { + "p(90)": 0, + "p(95)": 0, + "avg": 0, + "min": 0, + "med": 0, + "max": 0 + }, + "vus": { + "value": 50, + "min": 50, + "max": 50 + } + }, + "root_group": { + "checks": { + "health/quick 200": { + "path": "::health/quick 200", + "id": "8fe3180cd47bb58366d47cea0c42dcf8", + "passes": 100, + "fails": 100, + "name": "health/quick 200" + }, + "health/quick JSON response": { + "name": "health/quick JSON response", + "path": "::health/quick JSON response", + "id": "837537268797f1cbfff95b174709b2f6", + "passes": 100, + "fails": 100 + }, + "health/quick status ok": { + "passes": 100, + "fails": 100, + "name": "health/quick status ok", + "path": "::health/quick status ok", + "id": "933f71ce7b758b96be6444269c8a5c6b" + }, + "health 200": { + "passes": 100, + "fails": 100, + "name": "health 200", + "path": "::health 200", + "id": "8e4f90a842a57472549a6b2cf699032d" + }, + "health has memory check": { + "name": "health has memory check", + "path": "::health has memory check", + "id": "34a50eef53846bb1c7cc2f582dbd4e09", + "passes": 100, + "fails": 100 + }, + "health has disk check": { + "id": "3ecf4cd2455d39c167f500987a5d0228", + "passes": 100, + "fails": 100, + "name": "health has disk check", + "path": "::health has disk check" + }, + "health status ok": { + "passes": 100, + "fails": 100, + "name": "health status ok", + "path": "::health status ok", + "id": "53677fecf8cdb2e355a9ac158d8f0e54" + }, + "secure/ping auth required": { + "name": "secure/ping auth required", + "path": "::secure/ping auth required", + "id": "5c45c248261c98b16e94f785d2c83487", + "passes": 200, + "fails": 0 + }, + "secure/public accessible": { + "name": "secure/public accessible", + "path": "::secure/public accessible", + "id": "d7174c3ee1c9b192cc9d6f775885056d", + "passes": 100, + "fails": 100 + } + }, + "name": "", + "path": "", + "id": "d41d8cd98f00b204e9800998ecf8427e", + "groups": {} + } +} \ No newline at end of file diff --git a/wwjcloud-nest-v1/docker/k6/summary-boot-test.json b/wwjcloud-nest-v1/docker/k6/summary-boot-test.json new file mode 100644 index 00000000..9d7d0172 --- /dev/null +++ b/wwjcloud-nest-v1/docker/k6/summary-boot-test.json @@ -0,0 +1,185 @@ +{ + "root_group": { + "checks": { + "health/quick 200": { + "name": "health/quick 200", + "path": "::health/quick 200", + "id": "8fe3180cd47bb58366d47cea0c42dcf8", + "passes": 300, + "fails": 700 + }, + "health/quick body": { + "name": "health/quick body", + "path": "::health/quick body", + "id": "5a9d4a8e6f4752dd1780a3285c46b71b", + "passes": 300, + "fails": 700 + }, + "health 200": { + "name": "health 200", + "path": "::health 200", + "id": "8e4f90a842a57472549a6b2cf699032d", + "passes": 300, + "fails": 700 + }, + "health has memory check": { + "passes": 300, + "fails": 700, + "name": "health has memory check", + "path": "::health has memory check", + "id": "34a50eef53846bb1c7cc2f582dbd4e09" + }, + "health has disk check": { + "name": "health has disk check", + "path": "::health has disk check", + "id": "3ecf4cd2455d39c167f500987a5d0228", + "passes": 300, + "fails": 700 + }, + "health status ok": { + "name": "health status ok", + "path": "::health status ok", + "id": "53677fecf8cdb2e355a9ac158d8f0e54", + "passes": 300, + "fails": 700 + }, + "secure/ping auth required": { + "id": "5c45c248261c98b16e94f785d2c83487", + "passes": 0, + "fails": 1000, + "name": "secure/ping auth required", + "path": "::secure/ping auth required" + }, + "secure/public accessible": { + "name": "secure/public accessible", + "path": "::secure/public accessible", + "id": "d7174c3ee1c9b192cc9d6f775885056d", + "passes": 300, + "fails": 700 + } + }, + "name": "", + "path": "", + "id": "d41d8cd98f00b204e9800998ecf8427e", + "groups": {} + }, + "metrics": { + "iteration_duration": { + "med": 269.1536665, + "max": 417.944417, + "p(90)": 320.46755030000077, + "p(95)": 383.16458124999974, + "avg": 281.75394208799975, + "min": 255.217125 + }, + "data_received": { + "count": 2185400, + "rate": 760574.7961435418 + }, + "http_req_waiting": { + "avg": 6.768836935250007, + "min": 0.145583, + "med": 2.394125, + "max": 108.299708, + "p(90)": 14.322866300000005, + "p(95)": 28.83913299999984 + }, + "vus_max": { + "value": 100, + "min": 100, + "max": 100 + }, + "http_req_connecting": { + "max": 26.683334, + "p(90)": 0, + "p(95)": 0, + "avg": 0.06447692800000002, + "min": 0, + "med": 0 + }, + "data_sent": { + "rate": 123201.00568994867, + "count": 354000 + }, + "checks": { + "passes": 2100, + "fails": 5900, + "thresholds": { + "rate>0.95": true + }, + "value": 0.2625 + }, + "http_req_receiving": { + "avg": 0.01403034574999999, + "min": 0.00425, + "med": 0.009459, + "max": 1.464791, + "p(90)": 0.022083, + "p(95)": 0.036625 + }, + "http_req_tls_handshaking": { + "p(95)": 0, + "avg": 0, + "min": 0, + "med": 0, + "max": 0, + "p(90)": 0 + }, + "http_reqs": { + "rate": 1392.1017592084595, + "count": 4000 + }, + "http_req_blocked": { + "avg": 0.09514450499999962, + "min": 0.000375, + "med": 0.001166, + "max": 28.856625, + "p(90)": 0.0027541000000000037, + "p(95)": 0.004585099999999993 + }, + "http_req_sending": { + "avg": 0.00952042399999993, + "min": 0.001292, + "med": 0.004, + "max": 2.534334, + "p(90)": 0.010125, + "p(95)": 0.02 + }, + "http_req_duration{expected_response:true}": { + "avg": 11.01187251894737, + "min": 0.155667, + "med": 2.807687, + "max": 108.312666, + "p(90)": 31.97630800000001, + "p(95)": 50.96055654999998 + }, + "http_req_duration": { + "avg": 6.792387705000011, + "min": 0.155667, + "med": 2.414896, + "max": 108.312666, + "p(90)": 14.341953900000004, + "p(95)": 28.85447294999983, + "thresholds": { + "p(95)<500": false + } + }, + "iterations": { + "rate": 348.0254398021149, + "count": 1000 + }, + "http_req_failed": { + "passes": 2100, + "fails": 1900, + "thresholds": { + "rate<0.01": true + }, + "value": 0.525 + }, + "vus": { + "value": 100, + "min": 100, + "max": 100 + } + } +} \ No newline at end of file diff --git a/wwjcloud-nest-v1/docker/k6/summary-run.json b/wwjcloud-nest-v1/docker/k6/summary-run.json deleted file mode 100644 index a9858467..00000000 --- a/wwjcloud-nest-v1/docker/k6/summary-run.json +++ /dev/null @@ -1,248 +0,0 @@ -{ - "root_group": { - "checks": { - "status1 200": { - "name": "status1 200", - "path": "::status1 200", - "id": "b0966ed9f78c49ab46436f14191cc0c6", - "passes": 5000, - "fails": 0 - }, - "status1 has size": { - "id": "33d01e3c34cb094970818835f2d7d62e", - "passes": 5000, - "fails": 0, - "name": "status1 has size", - "path": "::status1 has size" - }, - "simulate 200": { - "name": "simulate 200", - "path": "::simulate 200", - "id": "cf998bfbb9da1109703c694d2d426536", - "passes": 5000, - "fails": 0 - }, - "simulate ok+emitted": { - "passes": 5000, - "fails": 0, - "name": "simulate ok+emitted", - "path": "::simulate ok+emitted", - "id": "be644ba113375a35db442ae2344525b5" - }, - "statusMid 200": { - "name": "statusMid 200", - "path": "::statusMid 200", - "id": "1f2c62a4c447fdc0317aff26a290f3eb", - "passes": 5000, - "fails": 0 - }, - "statusMid size >= status1+1": { - "id": "e2e294e30f182a67708f18e217c025b3", - "passes": 1781, - "fails": 3219, - "name": "statusMid size >= status1+1", - "path": "::statusMid size >= status1+1" - }, - "process-one 200": { - "passes": 5000, - "fails": 0, - "name": "process-one 200", - "path": "::process-one 200", - "id": "7d02970bccd1fafe9e03179a6046efff" - }, - "drain 200": { - "path": "::drain 200", - "id": "e1fcdd397c94e954b23f487bdd3f0cbb", - "passes": 5000, - "fails": 0, - "name": "drain 200" - }, - "drain processed>=0": { - "passes": 5000, - "fails": 0, - "name": "drain processed>=0", - "path": "::drain processed>=0", - "id": "98bb23e10c63609a18d120bdcfc82112" - }, - "status2 200": { - "name": "status2 200", - "path": "::status2 200", - "id": "660bccd927b58520b53278128962c31b", - "passes": 5000, - "fails": 0 - }, - "status2 has size": { - "name": "status2 has size", - "path": "::status2 has size", - "id": "6211e86b783848c1967e4c5a86c5dde1", - "passes": 5000, - "fails": 0 - }, - "metrics 200": { - "path": "::metrics 200", - "id": "6025b93ff340487de79d60f9527333fc", - "passes": 5000, - "fails": 0, - "name": "metrics 200" - }, - "metrics ai_events_total": { - "name": "metrics ai_events_total", - "path": "::metrics ai_events_total", - "id": "ffc2410f8720ecfb3ea20ee065280a55", - "passes": 5000, - "fails": 0 - }, - "metrics task.failed": { - "path": "::metrics task.failed", - "id": "c2589d168814660827ab007029490d0a", - "passes": 5000, - "fails": 0, - "name": "metrics task.failed" - }, - "metrics failed has severity": { - "name": "metrics failed has severity", - "path": "::metrics failed has severity", - "id": "40e13307a002f007932f6a621c2f1006", - "passes": 5000, - "fails": 0 - }, - "metrics recovery.requested has strategy": { - "id": "1a76328dd3ba77bb8b5f0879a33dc329", - "passes": 5000, - "fails": 0, - "name": "metrics recovery.requested has strategy", - "path": "::metrics recovery.requested has strategy" - }, - "metrics recovery.completed has strategy": { - "passes": 5000, - "fails": 0, - "name": "metrics recovery.completed has strategy", - "path": "::metrics recovery.completed has strategy", - "id": "7c883b8c4858f369c9b139b0df05607b" - } - }, - "name": "", - "path": "", - "id": "d41d8cd98f00b204e9800998ecf8427e", - "groups": {} - }, - "metrics": { - "checks": { - "passes": 81781, - "fails": 3219, - "thresholds": { - "rate>0.9": false - }, - "value": 0.9621294117647059 - }, - "http_req_duration": { - "min": 0.158291, - "med": 3.3887295, - "max": 471.565125, - "p(90)": 15.538350300000001, - "p(95)": 22.278262799999993, - "avg": 7.367607330285692, - "thresholds": { - "p(95)<800": false - } - }, - "http_req_sending": { - "min": 0.001, - "med": 0.002166, - "max": 34.621542, - "p(90)": 0.005625, - "p(95)": 0.009375, - "avg": 0.011979547399999334 - }, - "http_req_blocked": { - "avg": 0.12161503254283203, - "min": 0.000208, - "med": 0.0005, - "max": 37.433583, - "p(90)": 0.001209, - "p(95)": 0.002 - }, - "http_req_waiting": { - "avg": 7.339652192714295, - "min": 0.149167, - "med": 3.3716245000000002, - "max": 471.427542, - "p(90)": 15.510954700000001, - "p(95)": 22.21943719999999 - }, - "iterations": { - "rate": 432.34243543280434, - "count": 5000 - }, - "http_req_duration{expected_response:true}": { - "avg": 7.367607330285692, - "min": 0.158291, - "med": 3.3887295, - "max": 471.565125, - "p(90)": 15.538350300000001, - "p(95)": 22.278262799999993 - }, - "vus_max": { - "value": 200, - "min": 200, - "max": 200 - }, - "vus": { - "value": 200, - "min": 200, - "max": 200 - }, - "http_req_tls_handshaking": { - "max": 0, - "p(90)": 0, - "p(95)": 0, - "avg": 0, - "min": 0, - "med": 0 - }, - "data_sent": { - "count": 3476661, - "rate": 300621.6167828498 - }, - "data_received": { - "rate": 9915248.460592316, - "count": 114668925 - }, - "http_req_failed": { - "passes": 0, - "fails": 35000, - "thresholds": { - "rate<0.05": false - }, - "value": 0 - }, - "iteration_duration": { - "max": 1068.59275, - "p(90)": 487.1109673, - "p(95)": 551.2053738999999, - "avg": 454.3379871375994, - "min": 405.003, - "med": 435.96527100000003 - }, - "http_reqs": { - "count": 35000, - "rate": 3026.3970480296302 - }, - "http_req_connecting": { - "avg": 0.013457821514285722, - "min": 0, - "med": 0, - "max": 22.735584, - "p(90)": 0, - "p(95)": 0 - }, - "http_req_receiving": { - "min": 0.004166, - "med": 0.008708, - "max": 5.218958, - "p(90)": 0.030459, - "p(95)": 0.046625, - "avg": 0.015975590171428515 - } - } -} \ No newline at end of file diff --git a/wwjcloud-nest-v1/docker/k6/summary.json b/wwjcloud-nest-v1/docker/k6/summary.json deleted file mode 100644 index 6d1eb749..00000000 --- a/wwjcloud-nest-v1/docker/k6/summary.json +++ /dev/null @@ -1,248 +0,0 @@ -{ - "metrics": { - "http_req_waiting": { - "avg": 56.814392751251326, - "min": 0.516125, - "med": 54.433833, - "max": 3896.69896, - "p(90)": 85.925917, - "p(95)": 99.93502099999999 - }, - "checks": { - "passes": 692777, - "fails": 34417, - "thresholds": { - "rate>0.9": false - }, - "value": 0.952671501690058 - }, - "http_req_duration{expected_response:true}": { - "min": 0.539542, - "med": 54.449208, - "max": 3896.767543, - "p(90)": 85.941416, - "p(95)": 99.95577049999996, - "avg": 56.83070911392229 - }, - "iterations": { - "count": 42566, - "rate": 497.31117899936015 - }, - "vus": { - "value": 400, - "min": 400, - "max": 400 - }, - "http_req_connecting": { - "avg": 0.010233943017043149, - "min": 0, - "med": 0, - "max": 37.247333, - "p(90)": 0, - "p(95)": 0 - }, - "http_req_sending": { - "avg": 0.0037536761198858704, - "min": 0.000792, - "med": 0.002083, - "max": 8.47775, - "p(90)": 0.004458, - "p(95)": 0.007084 - }, - "iteration_duration": { - "max": 4721.682419, - "p(90)": 907.2673960000001, - "p(95)": 942.068876, - "avg": 799.6849483602648, - "min": 510.674917, - "med": 768.036188 - }, - "data_sent": { - "count": 29787490, - "rate": 348016.06379109266 - }, - "http_reqs": { - "count": 299651, - "rate": 3500.9113399975863 - }, - "data_received": { - "count": 990190407, - "rate": 11568687.655382847 - }, - "http_req_duration": { - "p(95)": 99.95577049999996, - "avg": 56.83070911392229, - "min": 0.539542, - "med": 54.449208, - "max": 3896.767543, - "p(90)": 85.941416, - "thresholds": { - "p(95)<800": false - } - }, - "http_req_failed": { - "passes": 0, - "fails": 299651, - "thresholds": { - "rate<0.05": false - }, - "value": 0 - }, - "http_req_receiving": { - "min": 0.00375, - "med": 0.008125, - "max": 12.757292, - "p(90)": 0.020541, - "p(95)": 0.030666, - "avg": 0.012562686552022487 - }, - "vus_max": { - "value": 400, - "min": 400, - "max": 400 - }, - "http_req_blocked": { - "p(95)": 0.001708, - "avg": 0.055270194209485674, - "min": 0.000166, - "med": 0.000417, - "max": 48.482, - "p(90)": 0.001125 - }, - "http_req_tls_handshaking": { - "avg": 0, - "min": 0, - "med": 0, - "max": 0, - "p(90)": 0, - "p(95)": 0 - } - }, - "root_group": { - "name": "", - "path": "", - "id": "d41d8cd98f00b204e9800998ecf8427e", - "groups": {}, - "checks": { - "status1 200": { - "name": "status1 200", - "path": "::status1 200", - "id": "b0966ed9f78c49ab46436f14191cc0c6", - "passes": 42921, - "fails": 0 - }, - "status1 has size": { - "passes": 42921, - "fails": 0, - "name": "status1 has size", - "path": "::status1 has size", - "id": "33d01e3c34cb094970818835f2d7d62e" - }, - "simulate 200": { - "passes": 42905, - "fails": 0, - "name": "simulate 200", - "path": "::simulate 200", - "id": "cf998bfbb9da1109703c694d2d426536" - }, - "simulate ok+emitted": { - "name": "simulate ok+emitted", - "path": "::simulate ok+emitted", - "id": "be644ba113375a35db442ae2344525b5", - "passes": 42905, - "fails": 0 - }, - "statusMid 200": { - "path": "::statusMid 200", - "id": "1f2c62a4c447fdc0317aff26a290f3eb", - "passes": 42838, - "fails": 0, - "name": "statusMid 200" - }, - "statusMid size >= status1+1": { - "name": "statusMid size >= status1+1", - "path": "::statusMid size >= status1+1", - "id": "e2e294e30f182a67708f18e217c025b3", - "passes": 8421, - "fails": 34417 - }, - "process-one 200": { - "name": "process-one 200", - "path": "::process-one 200", - "id": "7d02970bccd1fafe9e03179a6046efff", - "passes": 42810, - "fails": 0 - }, - "drain 200": { - "name": "drain 200", - "path": "::drain 200", - "id": "e1fcdd397c94e954b23f487bdd3f0cbb", - "passes": 42807, - "fails": 0 - }, - "drain processed>=0": { - "name": "drain processed>=0", - "path": "::drain processed>=0", - "id": "98bb23e10c63609a18d120bdcfc82112", - "passes": 42807, - "fails": 0 - }, - "status2 200": { - "fails": 0, - "name": "status2 200", - "path": "::status2 200", - "id": "660bccd927b58520b53278128962c31b", - "passes": 42693 - }, - "status2 has size": { - "name": "status2 has size", - "path": "::status2 has size", - "id": "6211e86b783848c1967e4c5a86c5dde1", - "passes": 42693, - "fails": 0 - }, - "metrics 200": { - "passes": 42676, - "fails": 0, - "name": "metrics 200", - "path": "::metrics 200", - "id": "6025b93ff340487de79d60f9527333fc" - }, - "metrics ai_events_total": { - "name": "metrics ai_events_total", - "path": "::metrics ai_events_total", - "id": "ffc2410f8720ecfb3ea20ee065280a55", - "passes": 42676, - "fails": 0 - }, - "metrics task.failed": { - "fails": 0, - "name": "metrics task.failed", - "path": "::metrics task.failed", - "id": "c2589d168814660827ab007029490d0a", - "passes": 42676 - }, - "metrics failed has severity": { - "passes": 42676, - "fails": 0, - "name": "metrics failed has severity", - "path": "::metrics failed has severity", - "id": "40e13307a002f007932f6a621c2f1006" - }, - "metrics recovery.requested has strategy": { - "id": "1a76328dd3ba77bb8b5f0879a33dc329", - "passes": 42676, - "fails": 0, - "name": "metrics recovery.requested has strategy", - "path": "::metrics recovery.requested has strategy" - }, - "metrics recovery.completed has strategy": { - "fails": 0, - "name": "metrics recovery.completed has strategy", - "path": "::metrics recovery.completed has strategy", - "id": "7c883b8c4858f369c9b139b0df05607b", - "passes": 42676 - } - } - } -} \ No newline at end of file diff --git a/wwjcloud-nest-v1/eslint-report.json b/wwjcloud-nest-v1/eslint-report.json deleted file mode 100644 index 8a1a40ff..00000000 --- a/wwjcloud-nest-v1/eslint-report.json +++ /dev/null @@ -1 +0,0 @@ -[{"filePath":"/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/wwjcloud-nest-v1/apps/api/src/app.module.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/wwjcloud-nest-v1/apps/api/src/main.ts","messages":[{"ruleId":"@typescript-eslint/no-floating-promises","severity":2,"message":"Promises must be awaited, end with a call to .catch, end with a call to .then with a rejection handler or be explicitly marked as ignored with the `void` operator.","line":15,"column":1,"nodeType":"ExpressionStatement","messageId":"floatingVoid","endLine":15,"endColumn":13,"suggestions":[{"messageId":"floatingFixVoid","fix":{"range":[514,514],"text":"void "},"desc":"Add void operator to ignore."},{"messageId":"floatingFixAwait","fix":{"range":[514,514],"text":"await "},"desc":"Add await operator."}]}],"suppressedMessages":[],"errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":"import { NestFactory } from '@nestjs/core';\nimport { AppModule } from './app.module';\nimport { BootHttp } from '@wwjCommon/http/boot-http';\nimport { ConfigService } from '@nestjs/config';\n\nasync function bootstrap() {\n const app = await NestFactory.create(AppModule);\n await BootHttp.start(app);\n const config = app.get(ConfigService);\n const raw = config.get('PORT');\n const port =\n typeof raw === 'number' ? raw : parseInt(String(raw ?? '3000'), 10) || 3000;\n await app.listen(port);\n}\nbootstrap();\n","usedDeprecatedRules":[]},{"filePath":"/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/wwjcloud-nest-v1/apps/api/src/secure.controller.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/wwjcloud-nest-v1/libs/wwjcloud-addon/src/index.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/wwjcloud-nest-v1/libs/wwjcloud-addon/src/registry.ts","messages":[{"ruleId":"@typescript-eslint/no-explicit-any","severity":2,"message":"Unexpected any. Specify a different type.","line":1,"column":31,"nodeType":"TSAnyKeyword","messageId":"unexpectedAny","endLine":1,"endColumn":34,"suggestions":[{"messageId":"suggestUnknown","fix":{"range":[30,33],"text":"unknown"},"desc":"Use `unknown` instead, this will force you to explicitly, and safely assert the type is correct."},{"messageId":"suggestNever","fix":{"range":[30,33],"text":"never"},"desc":"Use `never` instead, this is useful when instantiating generic type parameters that you don't need to know the type of."}]}],"suppressedMessages":[],"errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":"export type AddonModuleType = any;\n\n// Keyed by lowercase addon name, e.g. { 'oss': OssAddonModule }\nexport const ADDON_REGISTRY: Record = {};\n","usedDeprecatedRules":[]},{"filePath":"/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/wwjcloud-nest-v1/libs/wwjcloud-addon/src/wwjcloud-addon.module.ts","messages":[{"ruleId":"@typescript-eslint/no-unsafe-return","severity":2,"message":"Unsafe return of a value of type `any`.","line":21,"column":9,"nodeType":"ReturnStatement","messageId":"unsafeReturn","endLine":21,"endColumn":72},{"ruleId":"@typescript-eslint/no-explicit-any","severity":2,"message":"Unexpected any. Specify a different type.","line":24,"column":12,"nodeType":"TSAnyKeyword","messageId":"unexpectedAny","endLine":24,"endColumn":15,"suggestions":[{"messageId":"suggestUnknown","fix":{"range":[729,732],"text":"unknown"},"desc":"Use `unknown` instead, this will force you to explicitly, and safely assert the type is correct."},{"messageId":"suggestNever","fix":{"range":[729,732],"text":"never"},"desc":"Use `never` instead, this is useful when instantiating generic type parameters that you don't need to know the type of."}]},{"ruleId":"@typescript-eslint/no-explicit-any","severity":2,"message":"Unexpected any. Specify a different type.","line":24,"column":77,"nodeType":"TSAnyKeyword","messageId":"unexpectedAny","endLine":24,"endColumn":80,"suggestions":[{"messageId":"suggestUnknown","fix":{"range":[794,797],"text":"unknown"},"desc":"Use `unknown` instead, this will force you to explicitly, and safely assert the type is correct."},{"messageId":"suggestNever","fix":{"range":[794,797],"text":"never"},"desc":"Use `never` instead, this is useful when instantiating generic type parameters that you don't need to know the type of."}]}],"suppressedMessages":[],"errorCount":3,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":"import { Module, DynamicModule, ForwardReference, Type } from '@nestjs/common';\nimport { ADDON_REGISTRY } from './registry';\n\n@Module({\n imports: [],\n providers: [],\n exports: [],\n})\nexport class AddonModule {\n static register(): DynamicModule {\n const enabledKeys = Object.keys(process.env).filter(\n (k) =>\n /^ADDON_.+_ENABLED$/.test(k) &&\n ['true', '1', 'yes'].includes(String(process.env[k]).toLowerCase()),\n );\n\n const imports = enabledKeys\n .map((k) => {\n const m = k.match(/^ADDON_(.+)_ENABLED$/);\n const key = m ? m[1].toLowerCase() : undefined;\n return key && ADDON_REGISTRY[key] ? ADDON_REGISTRY[key] : null;\n })\n .filter(Boolean) as Array<\n Type | DynamicModule | Promise | ForwardReference\n >;\n\n return {\n module: AddonModule,\n imports,\n exports: [],\n };\n }\n}\n","usedDeprecatedRules":[]},{"filePath":"/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/wwjcloud-nest-v1/libs/wwjcloud-ai/src/events.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/wwjcloud-nest-v1/libs/wwjcloud-ai/src/healing/healing.module.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/wwjcloud-nest-v1/libs/wwjcloud-ai/src/healing/interfaces/healing.interface.ts","messages":[{"ruleId":"@typescript-eslint/no-explicit-any","severity":2,"message":"Unexpected any. Specify a different type.","line":11,"column":20,"nodeType":"TSAnyKeyword","messageId":"unexpectedAny","endLine":11,"endColumn":23,"suggestions":[{"messageId":"suggestUnknown","fix":{"range":[161,164],"text":"unknown"},"desc":"Use `unknown` instead, this will force you to explicitly, and safely assert the type is correct."},{"messageId":"suggestNever","fix":{"range":[161,164],"text":"never"},"desc":"Use `never` instead, this is useful when instantiating generic type parameters that you don't need to know the type of."}]},{"ruleId":"@typescript-eslint/no-explicit-any","severity":2,"message":"Unexpected any. Specify a different type.","line":21,"column":10,"nodeType":"TSAnyKeyword","messageId":"unexpectedAny","endLine":21,"endColumn":13,"suggestions":[{"messageId":"suggestUnknown","fix":{"range":[352,355],"text":"unknown"},"desc":"Use `unknown` instead, this will force you to explicitly, and safely assert the type is correct."},{"messageId":"suggestNever","fix":{"range":[352,355],"text":"never"},"desc":"Use `never` instead, this is useful when instantiating generic type parameters that you don't need to know the type of."}]},{"ruleId":"@typescript-eslint/no-explicit-any","severity":2,"message":"Unexpected any. Specify a different type.","line":22,"column":28,"nodeType":"TSAnyKeyword","messageId":"unexpectedAny","endLine":22,"endColumn":31,"suggestions":[{"messageId":"suggestUnknown","fix":{"range":[384,387],"text":"unknown"},"desc":"Use `unknown` instead, this will force you to explicitly, and safely assert the type is correct."},{"messageId":"suggestNever","fix":{"range":[384,387],"text":"never"},"desc":"Use `never` instead, this is useful when instantiating generic type parameters that you don't need to know the type of."}]},{"ruleId":"@typescript-eslint/no-explicit-any","severity":2,"message":"Unexpected any. Specify a different type.","line":35,"column":12,"nodeType":"TSAnyKeyword","messageId":"unexpectedAny","endLine":35,"endColumn":15,"suggestions":[{"messageId":"suggestUnknown","fix":{"range":[581,584],"text":"unknown"},"desc":"Use `unknown` instead, this will force you to explicitly, and safely assert the type is correct."},{"messageId":"suggestNever","fix":{"range":[581,584],"text":"never"},"desc":"Use `never` instead, this is useful when instantiating generic type parameters that you don't need to know the type of."}]},{"ruleId":"@typescript-eslint/no-explicit-any","severity":2,"message":"Unexpected any. Specify a different type.","line":44,"column":20,"nodeType":"TSAnyKeyword","messageId":"unexpectedAny","endLine":44,"endColumn":23,"suggestions":[{"messageId":"suggestUnknown","fix":{"range":[728,731],"text":"unknown"},"desc":"Use `unknown` instead, this will force you to explicitly, and safely assert the type is correct."},{"messageId":"suggestNever","fix":{"range":[728,731],"text":"never"},"desc":"Use `never` instead, this is useful when instantiating generic type parameters that you don't need to know the type of."}]},{"ruleId":"@typescript-eslint/no-explicit-any","severity":2,"message":"Unexpected any. Specify a different type.","line":45,"column":17,"nodeType":"TSAnyKeyword","messageId":"unexpectedAny","endLine":45,"endColumn":20,"suggestions":[{"messageId":"suggestUnknown","fix":{"range":[759,762],"text":"unknown"},"desc":"Use `unknown` instead, this will force you to explicitly, and safely assert the type is correct."},{"messageId":"suggestNever","fix":{"range":[759,762],"text":"never"},"desc":"Use `never` instead, this is useful when instantiating generic type parameters that you don't need to know the type of."}]},{"ruleId":"@typescript-eslint/no-explicit-any","severity":2,"message":"Unexpected any. Specify a different type.","line":64,"column":28,"nodeType":"TSAnyKeyword","messageId":"unexpectedAny","endLine":64,"endColumn":31,"suggestions":[{"messageId":"suggestUnknown","fix":{"range":[1130,1133],"text":"unknown"},"desc":"Use `unknown` instead, this will force you to explicitly, and safely assert the type is correct."},{"messageId":"suggestNever","fix":{"range":[1130,1133],"text":"never"},"desc":"Use `never` instead, this is useful when instantiating generic type parameters that you don't need to know the type of."}]},{"ruleId":"@typescript-eslint/no-explicit-any","severity":2,"message":"Unexpected any. Specify a different type.","line":73,"column":27,"nodeType":"TSAnyKeyword","messageId":"unexpectedAny","endLine":73,"endColumn":30,"suggestions":[{"messageId":"suggestUnknown","fix":{"range":[1291,1294],"text":"unknown"},"desc":"Use `unknown` instead, this will force you to explicitly, and safely assert the type is correct."},{"messageId":"suggestNever","fix":{"range":[1291,1294],"text":"never"},"desc":"Use `never` instead, this is useful when instantiating generic type parameters that you don't need to know the type of."}]}],"suppressedMessages":[],"errorCount":8,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/**\n * Healing Module Interfaces - AI 自愈模块接口定义\n */\n\n/**\n * 恢复策略接口\n */\nexport interface RecoveryStrategy {\n name: string;\n priority: number;\n canHandle(error: any): boolean;\n execute(context: RecoveryContext): Promise;\n getEstimatedTime(): number;\n}\n\n/**\n * 恢复上下文接口\n */\nexport interface RecoveryContext {\n taskId: string;\n error: any;\n metadata: Record;\n retryCount: number;\n maxRetries: number;\n startTime: number;\n}\n\n/**\n * 恢复结果接口\n */\nexport interface RecoveryResult {\n success: boolean;\n strategy: string;\n duration: number;\n result?: any;\n error?: string;\n nextAction?: 'retry' | 'escalate' | 'abort';\n}\n\n/**\n * 自愈监听器接口\n */\nexport interface SelfHealListener {\n canHandle(event: any): boolean;\n handle(event: any): Promise;\n getPriority(): number;\n}\n\n/**\n * 错误分析结果接口\n */\nexport interface ErrorAnalysis {\n errorType: string;\n severity: 'low' | 'medium' | 'high' | 'critical';\n category:\n | 'network'\n | 'database'\n | 'service'\n | 'validation'\n | 'system'\n | 'unknown';\n recoverable: boolean;\n suggestedStrategies: string[];\n metadata: Record;\n}\n\n/**\n * 健康检查结果接口\n */\nexport interface HealthCheckResult {\n component: string;\n status: 'healthy' | 'degraded' | 'unhealthy';\n details: Record;\n timestamp: number;\n responseTime?: number;\n}\n\n/**\n * 自愈统计信息接口\n */\nexport interface HealingStats {\n totalRecoveries: number;\n successfulRecoveries: number;\n failedRecoveries: number;\n averageRecoveryTime: number;\n strategiesUsed: Record;\n errorCategories: Record;\n}\n","usedDeprecatedRules":[]},{"filePath":"/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/wwjcloud-nest-v1/libs/wwjcloud-ai/src/healing/listeners/ai-recovery.listener.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/wwjcloud-nest-v1/libs/wwjcloud-ai/src/healing/listeners/ai-self-heal.listener.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/wwjcloud-nest-v1/libs/wwjcloud-ai/src/healing/services/ai-recovery.service.ts","messages":[{"ruleId":"@typescript-eslint/no-unsafe-member-access","severity":2,"message":"Unsafe member access .message on an `any` value.","line":40,"column":52,"nodeType":"Identifier","messageId":"unsafeMemberExpression","endLine":40,"endColumn":59},{"ruleId":"@typescript-eslint/require-await","severity":2,"message":"Async arrow function has no 'await' expression.","line":45,"column":52,"nodeType":"ArrowFunctionExpression","messageId":"missingAwait","endLine":45,"endColumn":54,"suggestions":[{"messageId":"removeAsync","fix":{"range":[1560,1566],"text":""},"desc":"Remove 'async'."}]},{"ruleId":"@typescript-eslint/no-unsafe-assignment","severity":2,"message":"Unsafe assignment of an error typed value.","line":180,"column":13,"nodeType":"VariableDeclarator","messageId":"anyAssignment","endLine":180,"endColumn":60},{"ruleId":"@typescript-eslint/no-unsafe-argument","severity":2,"message":"Unsafe argument of type error typed assigned to a parameter of type `string | undefined`.","line":184,"column":9,"nodeType":"Identifier","messageId":"unsafeArgument","endLine":184,"endColumn":16},{"ruleId":"@typescript-eslint/no-unsafe-assignment","severity":2,"message":"Unsafe assignment of an error typed value.","line":188,"column":9,"nodeType":"Property","messageId":"anyAssignment","endLine":188,"endColumn":26}],"suppressedMessages":[],"errorCount":5,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":"import { Injectable, Logger } from '@nestjs/common';\nimport { CacheService } from '@wwjCommon/cache/cache.service';\nimport { LockService } from '@wwjCommon/cache/lock.service';\nimport { MetricsService } from '@wwjCommon/metrics/metrics.service';\nimport {\n TASK_RECOVERY_COMPLETED_EVENT,\n TaskRecoveryRequestedPayload,\n TaskRecoveryCompletedPayload,\n TASK_FAILED_EVENT,\n TASK_RECOVERY_REQUESTED_EVENT,\n Severity,\n TaskFailedPayload,\n} from '@wwjAi';\nimport { EventBus } from '@wwjCommon/events/event-bus';\nimport { QueueService } from '@wwjCommon/queue/queue.service';\nimport { ConfigService } from '@nestjs/config';\nimport { AiStrategyService } from '@wwjAi';\n\nconst QUEUE_KEY = 'ai:recovery:queue';\nconst QUEUE_LOCK_KEY = 'ai:recovery:lock';\n\n@Injectable()\nexport class AiRecoveryService {\n private readonly logger = new Logger(AiRecoveryService.name);\n // metrics injected via constructor now\n\n constructor(\n private readonly cache: CacheService,\n private readonly lock: LockService,\n private readonly metrics: MetricsService,\n private readonly eventBus: EventBus,\n private readonly queue: QueueService,\n private readonly config: ConfigService,\n private readonly strategy: AiStrategyService,\n ) {}\n\n onModuleInit() {\n // 初始化可选的队列(BullMQ / Kafka)\n this.queue.init('ai-recovery').catch((err) => {\n this.logger.error(`Queue init failed: ${err?.message || err}`);\n });\n if (this.queue.isBullmq() || this.queue.isKafka()) {\n // 注册 Worker 处理恢复请求(BullMQ/Kafka 共用统一处理器)\n this.queue.registerWorker(\n async (data: TaskRecoveryRequestedPayload) => {\n const start = Date.now();\n this.logger.log(\n `Processing recovery (worker) for taskId=${data.taskId}`,\n );\n const durationMs = Date.now() - start;\n const payload: TaskRecoveryCompletedPayload = {\n taskId: data.taskId,\n strategy: data.strategy,\n result: 'success',\n durationMs,\n timestamp: Date.now(),\n };\n this.eventBus.emit(TASK_RECOVERY_COMPLETED_EVENT, payload);\n this.metrics?.observeAiEvent(\n TASK_RECOVERY_COMPLETED_EVENT,\n undefined,\n data.strategy,\n );\n },\n 1,\n 'ai-recovery',\n );\n }\n }\n\n async enqueue(req: TaskRecoveryRequestedPayload): Promise {\n // 若启用队列,优先走队列(BullMQ/Kafka)\n if (this.queue.isBullmq() || this.queue.isKafka()) {\n await this.queue.enqueue('ai.recovery', req);\n // BullMQ 可以返回计数,Kafka 不易获取队列深度,这里统一返回 0 或 BullMQ 等待数量\n if (this.queue.isBullmq()) {\n const counts = await this.queue.getQueueCounts();\n const waiting = counts?.waiting ?? 0;\n const delayed = counts?.delayed ?? 0;\n return waiting + delayed;\n }\n return 0;\n }\n // 默认使用内存/Redis 模拟队列\n const list =\n (await this.cache.get(QUEUE_KEY)) ?? [];\n list.push(req);\n await this.cache.set(QUEUE_KEY, list);\n this.logger.log(\n `Enqueued recovery request: taskId=${req.taskId}, strategy=${req.strategy}`,\n );\n return list.length;\n }\n\n async status() {\n if (this.queue.isBullmq()) {\n const counts = await this.queue.getQueueCounts();\n const waiting = counts?.waiting ?? 0;\n const delayed = counts?.delayed ?? 0;\n return { size: waiting + delayed };\n }\n if (this.queue.isKafka()) {\n // Kafka 模式下无法快速获取队列大小,返回 0 以表示“由后台异步处理”\n return { size: 0 };\n }\n const list =\n (await this.cache.get(QUEUE_KEY)) ?? [];\n return { size: list.length };\n }\n\n async processOne(): Promise {\n // 队列模式下由 Worker 自动处理,processOne 返回 false 表示无需手动触发\n if (this.queue.isBullmq() || this.queue.isKafka()) return false;\n\n const list =\n (await this.cache.get(QUEUE_KEY)) ?? [];\n if (list.length === 0) return false;\n\n const lockToken = await this.lock.acquire(QUEUE_LOCK_KEY, 5000);\n if (!lockToken) return false; // someone else is processing\n\n try {\n const req = list.shift()!;\n await this.cache.set(QUEUE_KEY, list);\n // simulate processing logic here\n const start = Date.now();\n this.logger.log(`Processed recovery for taskId=${req.taskId}`);\n const durationMs = Date.now() - start;\n this.logger.log(\n `Processed recovery request: taskId=${req.taskId}, strategy=${req.strategy}`,\n );\n const payload: TaskRecoveryCompletedPayload = {\n taskId: req.taskId,\n strategy: req.strategy,\n result: 'success',\n durationMs,\n timestamp: Date.now(),\n };\n this.eventBus.emit(TASK_RECOVERY_COMPLETED_EVENT, payload);\n this.metrics?.observeAiEvent(\n TASK_RECOVERY_COMPLETED_EVENT,\n undefined,\n req.strategy,\n );\n return true;\n } finally {\n await this.lock.release(QUEUE_LOCK_KEY, lockToken);\n }\n }\n\n async drain(max = 10): Promise {\n // 队列模式下由 Worker 自动处理,这里返回 0 表示无需手动 drain\n if (this.queue.isBullmq() || this.queue.isKafka()) return 0;\n\n let processed = 0;\n while (processed < max) {\n const ok = await this.processOne();\n if (!ok) break;\n processed++;\n }\n return processed;\n }\n async simulateFailure(params: {\n taskId?: string;\n severity?: Severity;\n reason?: string;\n }): Promise<{ ok: true; emitted: boolean }> {\n const taskId = params.taskId ?? 'demo-task';\n const severity: Severity = params.severity ?? 'medium';\n const reason = params.reason ?? 'demo failure';\n const payload: TaskFailedPayload = {\n taskId,\n reason,\n severity,\n timestamp: Date.now(),\n };\n this.eventBus.emit(TASK_FAILED_EVENT, payload);\n this.metrics?.observeAiEvent(TASK_FAILED_EVENT, severity);\n if (this.readBoolean('AI_SIMULATE_DIRECT_ENQUEUE')) {\n const decided = this.strategy.decideStrategy(payload);\n this.metrics?.observeAiEvent(\n TASK_RECOVERY_REQUESTED_EVENT,\n undefined,\n decided,\n );\n const request: TaskRecoveryRequestedPayload = {\n taskId,\n strategy: decided,\n requestedBy: 'manual',\n timestamp: Date.now(),\n };\n await this.enqueue(request);\n }\n return { ok: true, emitted: true };\n }\n private readBoolean(key: string): boolean {\n const v = this.config.get(key);\n if (typeof v === 'boolean') return v;\n if (typeof v === 'string')\n return ['true', '1', 'yes', 'on'].includes(v.toLowerCase());\n return false;\n }\n}\n","usedDeprecatedRules":[]},{"filePath":"/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/wwjcloud-nest-v1/libs/wwjcloud-ai/src/healing/services/ai-strategy.service.ts","messages":[{"ruleId":"@typescript-eslint/no-unsafe-assignment","severity":2,"message":"Unsafe assignment of an error typed value.","line":21,"column":11,"nodeType":"VariableDeclarator","messageId":"anyAssignment","endLine":21,"endColumn":43},{"ruleId":"@typescript-eslint/no-unsafe-member-access","severity":2,"message":"Computed name [evt.severity] resolves to an `error` typed value.","line":21,"column":19,"nodeType":"MemberExpression","messageId":"unsafeComputedMemberAccess","endLine":21,"endColumn":31},{"ruleId":"@typescript-eslint/no-unsafe-member-access","severity":2,"message":"Unsafe member access .severity on an `error` typed value.","line":21,"column":23,"nodeType":"Identifier","messageId":"unsafeMemberExpression","endLine":21,"endColumn":31},{"ruleId":"@typescript-eslint/no-unsafe-member-access","severity":2,"message":"Unsafe member access .metadata on an `error` typed value.","line":23,"column":22,"nodeType":"Identifier","messageId":"unsafeMemberExpression","endLine":23,"endColumn":30}],"suppressedMessages":[],"errorCount":4,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":"import { Injectable } from '@nestjs/common';\nimport { ConfigService } from '@nestjs/config';\nimport type { Severity, RecoveryStrategy, TaskFailedPayload } from '../types';\n\n@Injectable()\nexport class AiStrategyService {\n constructor(private readonly config: ConfigService) {}\n\n decideStrategy(evt: TaskFailedPayload): RecoveryStrategy {\n // allow override via env for quick testing\n const override = this.config.get('AI_STRATEGY_OVERRIDE');\n if (override && this.isValidStrategy(override)) {\n return override as RecoveryStrategy;\n }\n // simple mapping by severity; can be extended to rules by metadata\n const map: Record = {\n low: 'retry',\n medium: 'retry',\n high: 'fallback',\n };\n const s = map[evt.severity] ?? 'retry';\n // extend: if metadata.hint === 'reroute', do reroute\n const hint = evt.metadata?.hint as string | undefined;\n if (hint === 'reroute') return 'reroute';\n if (hint === 'restart') return 'restart';\n return s;\n }\n\n private isValidStrategy(v: string): boolean {\n return ['retry', 'restart', 'reroute', 'fallback', 'noop'].includes(v);\n }\n}\n","usedDeprecatedRules":[]},{"filePath":"/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/wwjcloud-nest-v1/libs/wwjcloud-ai/src/healing/strategies/fallback.strategy.ts","messages":[{"ruleId":"@typescript-eslint/no-explicit-any","severity":2,"message":"Unexpected any. Specify a different type.","line":26,"column":20,"nodeType":"TSAnyKeyword","messageId":"unexpectedAny","endLine":26,"endColumn":23,"suggestions":[{"messageId":"suggestUnknown","fix":{"range":[506,509],"text":"unknown"},"desc":"Use `unknown` instead, this will force you to explicitly, and safely assert the type is correct."},{"messageId":"suggestNever","fix":{"range":[506,509],"text":"never"},"desc":"Use `never` instead, this is useful when instantiating generic type parameters that you don't need to know the type of."}]},{"ruleId":"@typescript-eslint/no-unsafe-member-access","severity":2,"message":"Unsafe member access .code on an `any` value.","line":36,"column":16,"nodeType":"Identifier","messageId":"unsafeMemberExpression","endLine":36,"endColumn":20},{"ruleId":"@typescript-eslint/no-unsafe-argument","severity":2,"message":"Unsafe argument of type `any` assigned to a parameter of type `string`.","line":36,"column":48,"nodeType":"MemberExpression","messageId":"unsafeArgument","endLine":36,"endColumn":58},{"ruleId":"@typescript-eslint/no-unsafe-member-access","severity":2,"message":"Unsafe member access .code on an `any` value.","line":36,"column":54,"nodeType":"Identifier","messageId":"unsafeMemberExpression","endLine":36,"endColumn":58},{"ruleId":"@typescript-eslint/no-unsafe-member-access","severity":2,"message":"Unsafe member access .severity on an `any` value.","line":41,"column":16,"nodeType":"Identifier","messageId":"unsafeMemberExpression","endLine":41,"endColumn":24},{"ruleId":"@typescript-eslint/no-unsafe-member-access","severity":2,"message":"Unsafe member access .severity on an `any` value.","line":41,"column":46,"nodeType":"Identifier","messageId":"unsafeMemberExpression","endLine":41,"endColumn":54},{"ruleId":"@typescript-eslint/no-unsafe-assignment","severity":2,"message":"Unsafe assignment of an `any` value.","line":58,"column":13,"nodeType":"VariableDeclarator","messageId":"anyAssignment","endLine":58,"endColumn":70},{"ruleId":"@typescript-eslint/no-unsafe-assignment","severity":2,"message":"Unsafe assignment of an `any` value.","line":64,"column":9,"nodeType":"Property","messageId":"anyAssignment","endLine":64,"endColumn":31},{"ruleId":"@typescript-eslint/no-explicit-any","severity":2,"message":"Unexpected any. Specify a different type.","line":93,"column":73,"nodeType":"TSAnyKeyword","messageId":"unexpectedAny","endLine":93,"endColumn":76,"suggestions":[{"messageId":"suggestUnknown","fix":{"range":[2007,2010],"text":"unknown"},"desc":"Use `unknown` instead, this will force you to explicitly, and safely assert the type is correct."},{"messageId":"suggestNever","fix":{"range":[2007,2010],"text":"never"},"desc":"Use `never` instead, this is useful when instantiating generic type parameters that you don't need to know the type of."}]},{"ruleId":"@typescript-eslint/no-unsafe-assignment","severity":2,"message":"Unsafe assignment of an `any` value.","line":94,"column":11,"nodeType":"VariableDeclarator","messageId":"anyAssignment","endLine":94,"endColumn":61},{"ruleId":"@typescript-eslint/require-await","severity":2,"message":"Async method 'handleDatabaseFallback' has no 'await' expression.","line":119,"column":3,"nodeType":"FunctionExpression","messageId":"missingAwait","endLine":119,"endColumn":39,"suggestions":[{"messageId":"removeAsync","fix":{"range":[2608,2676],"text":"handleDatabaseFallback(context: RecoveryContext): any"},"desc":"Remove 'async'."}]},{"ruleId":"@typescript-eslint/no-explicit-any","severity":2,"message":"Unexpected any. Specify a different type.","line":119,"column":75,"nodeType":"TSAnyKeyword","messageId":"unexpectedAny","endLine":119,"endColumn":78,"suggestions":[{"messageId":"suggestUnknown","fix":{"range":[2672,2675],"text":"unknown"},"desc":"Use `unknown` instead, this will force you to explicitly, and safely assert the type is correct."},{"messageId":"suggestNever","fix":{"range":[2672,2675],"text":"never"},"desc":"Use `never` instead, this is useful when instantiating generic type parameters that you don't need to know the type of."}]},{"ruleId":"@typescript-eslint/no-unsafe-assignment","severity":2,"message":"Unsafe assignment of an `any` value.","line":125,"column":7,"nodeType":"Property","messageId":"anyAssignment","endLine":125,"endColumn":49},{"ruleId":"@typescript-eslint/require-await","severity":2,"message":"Async method 'handleApiFallback' has no 'await' expression.","line":134,"column":3,"nodeType":"FunctionExpression","messageId":"missingAwait","endLine":134,"endColumn":34,"suggestions":[{"messageId":"removeAsync","fix":{"range":[3008,3071],"text":"handleApiFallback(context: RecoveryContext): any"},"desc":"Remove 'async'."}]},{"ruleId":"@typescript-eslint/no-explicit-any","severity":2,"message":"Unexpected any. Specify a different type.","line":134,"column":70,"nodeType":"TSAnyKeyword","messageId":"unexpectedAny","endLine":134,"endColumn":73,"suggestions":[{"messageId":"suggestUnknown","fix":{"range":[3067,3070],"text":"unknown"},"desc":"Use `unknown` instead, this will force you to explicitly, and safely assert the type is correct."},{"messageId":"suggestNever","fix":{"range":[3067,3070],"text":"never"},"desc":"Use `never` instead, this is useful when instantiating generic type parameters that you don't need to know the type of."}]},{"ruleId":"@typescript-eslint/no-unsafe-assignment","severity":2,"message":"Unsafe assignment of an `any` value.","line":140,"column":7,"nodeType":"Property","messageId":"anyAssignment","endLine":140,"endColumn":75},{"ruleId":"@typescript-eslint/no-explicit-any","severity":2,"message":"Unexpected any. Specify a different type.","line":149,"column":72,"nodeType":"TSAnyKeyword","messageId":"unexpectedAny","endLine":149,"endColumn":75,"suggestions":[{"messageId":"suggestUnknown","fix":{"range":[3479,3482],"text":"unknown"},"desc":"Use `unknown` instead, this will force you to explicitly, and safely assert the type is correct."},{"messageId":"suggestNever","fix":{"range":[3479,3482],"text":"never"},"desc":"Use `never` instead, this is useful when instantiating generic type parameters that you don't need to know the type of."}]},{"ruleId":"@typescript-eslint/no-unsafe-assignment","severity":2,"message":"Unsafe assignment of an `any` value.","line":155,"column":7,"nodeType":"Property","messageId":"anyAssignment","endLine":155,"endColumn":52},{"ruleId":"@typescript-eslint/require-await","severity":2,"message":"Async method 'handleFileFallback' has no 'await' expression.","line":164,"column":3,"nodeType":"FunctionExpression","messageId":"missingAwait","endLine":164,"endColumn":35,"suggestions":[{"messageId":"removeAsync","fix":{"range":[3804,3868],"text":"handleFileFallback(context: RecoveryContext): any"},"desc":"Remove 'async'."}]},{"ruleId":"@typescript-eslint/no-explicit-any","severity":2,"message":"Unexpected any. Specify a different type.","line":164,"column":71,"nodeType":"TSAnyKeyword","messageId":"unexpectedAny","endLine":164,"endColumn":74,"suggestions":[{"messageId":"suggestUnknown","fix":{"range":[3864,3867],"text":"unknown"},"desc":"Use `unknown` instead, this will force you to explicitly, and safely assert the type is correct."},{"messageId":"suggestNever","fix":{"range":[3864,3867],"text":"never"},"desc":"Use `never` instead, this is useful when instantiating generic type parameters that you don't need to know the type of."}]},{"ruleId":"@typescript-eslint/no-unsafe-assignment","severity":2,"message":"Unsafe assignment of an `any` value.","line":170,"column":7,"nodeType":"Property","messageId":"anyAssignment","endLine":170,"endColumn":50},{"ruleId":"@typescript-eslint/require-await","severity":2,"message":"Async method 'handleGenericFallback' has no 'await' expression.","line":179,"column":3,"nodeType":"FunctionExpression","messageId":"missingAwait","endLine":179,"endColumn":38,"suggestions":[{"messageId":"removeAsync","fix":{"range":[4191,4258],"text":"handleGenericFallback(context: RecoveryContext): any"},"desc":"Remove 'async'."}]},{"ruleId":"@typescript-eslint/no-explicit-any","severity":2,"message":"Unexpected any. Specify a different type.","line":179,"column":74,"nodeType":"TSAnyKeyword","messageId":"unexpectedAny","endLine":179,"endColumn":77,"suggestions":[{"messageId":"suggestUnknown","fix":{"range":[4254,4257],"text":"unknown"},"desc":"Use `unknown` instead, this will force you to explicitly, and safely assert the type is correct."},{"messageId":"suggestNever","fix":{"range":[4254,4257],"text":"never"},"desc":"Use `never` instead, this is useful when instantiating generic type parameters that you don't need to know the type of."}]},{"ruleId":"@typescript-eslint/no-explicit-any","severity":2,"message":"Unexpected any. Specify a different type.","line":193,"column":72,"nodeType":"TSAnyKeyword","messageId":"unexpectedAny","endLine":193,"endColumn":75,"suggestions":[{"messageId":"suggestUnknown","fix":{"range":[4606,4609],"text":"unknown"},"desc":"Use `unknown` instead, this will force you to explicitly, and safely assert the type is correct."},{"messageId":"suggestNever","fix":{"range":[4606,4609],"text":"never"},"desc":"Use `never` instead, this is useful when instantiating generic type parameters that you don't need to know the type of."}]},{"ruleId":"@typescript-eslint/no-unsafe-call","severity":2,"message":"Unsafe call of a(n) `any` typed value.","line":198,"column":20,"nodeType":"MemberExpression","messageId":"unsafeCall","endLine":198,"endColumn":55}],"suppressedMessages":[],"errorCount":25,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":"import { Injectable, Logger } from '@nestjs/common';\nimport {\n RecoveryStrategy,\n RecoveryContext,\n RecoveryResult,\n} from '../interfaces/healing.interface';\n\n/**\n * Fallback Recovery Strategy - 降级恢复策略\n *\n * 职责:\n * - 提供服务降级方案\n * - 处理不可恢复的错误\n * - 确保系统基本功能可用\n */\n@Injectable()\nexport class FallbackStrategy implements RecoveryStrategy {\n private readonly logger = new Logger(FallbackStrategy.name);\n\n readonly name = 'fallback';\n readonly priority = 3;\n\n /**\n * 判断是否可以处理该错误\n */\n canHandle(error: any): boolean {\n // 需要降级处理的错误类型\n const fallbackErrors = [\n 'SERVICE_UNAVAILABLE',\n 'DEPENDENCY_FAILURE',\n 'RESOURCE_EXHAUSTED',\n 'CIRCUIT_BREAKER_OPEN',\n 'RATE_LIMIT_EXCEEDED',\n ];\n\n if (error?.code && fallbackErrors.includes(error.code)) {\n return true;\n }\n\n // 检查错误严重程度\n if (error?.severity === 'high' || error?.severity === 'critical') {\n return true;\n }\n\n return false;\n }\n\n /**\n * 执行降级恢复\n */\n async execute(context: RecoveryContext): Promise {\n const startTime = Date.now();\n\n this.logger.log(`Executing fallback strategy for task: ${context.taskId}`);\n\n try {\n // 根据任务类型选择降级方案\n const fallbackResult = await this.selectFallbackOption(context);\n\n return {\n success: true,\n strategy: this.name,\n duration: Date.now() - startTime,\n result: fallbackResult,\n nextAction: 'abort', // 降级后通常不再重试\n };\n } catch (error) {\n this.logger.error(\n `Fallback strategy failed for task: ${context.taskId}`,\n error,\n );\n\n return {\n success: false,\n strategy: this.name,\n duration: Date.now() - startTime,\n error: error instanceof Error ? error.message : 'Fallback failed',\n nextAction: 'abort',\n };\n }\n }\n\n /**\n * 获取预估执行时间\n */\n getEstimatedTime(): number {\n return 2000; // 2秒预估时间\n }\n\n /**\n * 选择降级方案\n */\n private async selectFallbackOption(context: RecoveryContext): Promise {\n const taskType = context.metadata?.taskType || 'unknown';\n\n this.logger.debug(`Selecting fallback option for task type: ${taskType}`);\n\n switch (taskType) {\n case 'database':\n return await this.handleDatabaseFallback(context);\n\n case 'api':\n return await this.handleApiFallback(context);\n\n case 'cache':\n return await this.handleCacheFallback(context);\n\n case 'file':\n return await this.handleFileFallback(context);\n\n default:\n return await this.handleGenericFallback(context);\n }\n }\n\n /**\n * 数据库降级处理\n */\n private async handleDatabaseFallback(context: RecoveryContext): Promise {\n this.logger.warn(`Database fallback for task: ${context.taskId}`);\n\n // 返回缓存数据或默认值\n return {\n fallbackType: 'database',\n data: context.metadata?.cachedData || null,\n message: 'Using cached data due to database unavailability',\n timestamp: Date.now(),\n };\n }\n\n /**\n * API 降级处理\n */\n private async handleApiFallback(context: RecoveryContext): Promise {\n this.logger.warn(`API fallback for task: ${context.taskId}`);\n\n // 返回默认响应或离线数据\n return {\n fallbackType: 'api',\n data: context.metadata?.defaultResponse || { status: 'unavailable' },\n message: 'Using default response due to API unavailability',\n timestamp: Date.now(),\n };\n }\n\n /**\n * 缓存降级处理\n */\n private async handleCacheFallback(context: RecoveryContext): Promise {\n this.logger.warn(`Cache fallback for task: ${context.taskId}`);\n\n // 直接访问数据源\n return {\n fallbackType: 'cache',\n data: await this.fetchFromDataSource(context),\n message: 'Bypassing cache and fetching from data source',\n timestamp: Date.now(),\n };\n }\n\n /**\n * 文件降级处理\n */\n private async handleFileFallback(context: RecoveryContext): Promise {\n this.logger.warn(`File fallback for task: ${context.taskId}`);\n\n // 使用备用文件或默认内容\n return {\n fallbackType: 'file',\n data: context.metadata?.backupContent || '',\n message: 'Using backup content due to file access failure',\n timestamp: Date.now(),\n };\n }\n\n /**\n * 通用降级处理\n */\n private async handleGenericFallback(context: RecoveryContext): Promise {\n this.logger.warn(`Generic fallback for task: ${context.taskId}`);\n\n return {\n fallbackType: 'generic',\n data: null,\n message: 'Service temporarily unavailable, please try again later',\n timestamp: Date.now(),\n };\n }\n\n /**\n * 从数据源获取数据\n */\n private async fetchFromDataSource(context: RecoveryContext): Promise {\n // 这里应该实现从原始数据源获取数据的逻辑\n // 具体实现取决于数据源类型\n\n if (context.metadata?.dataSourceFunction) {\n return await context.metadata.dataSourceFunction();\n }\n\n return null;\n }\n}\n","usedDeprecatedRules":[]},{"filePath":"/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/wwjcloud-nest-v1/libs/wwjcloud-ai/src/healing/strategies/retry.strategy.ts","messages":[{"ruleId":"@typescript-eslint/no-explicit-any","severity":2,"message":"Unexpected any. Specify a different type.","line":26,"column":20,"nodeType":"TSAnyKeyword","messageId":"unexpectedAny","endLine":26,"endColumn":23,"suggestions":[{"messageId":"suggestUnknown","fix":{"range":[492,495],"text":"unknown"},"desc":"Use `unknown` instead, this will force you to explicitly, and safely assert the type is correct."},{"messageId":"suggestNever","fix":{"range":[492,495],"text":"never"},"desc":"Use `never` instead, this is useful when instantiating generic type parameters that you don't need to know the type of."}]},{"ruleId":"@typescript-eslint/no-unsafe-member-access","severity":2,"message":"Unsafe member access .code on an `any` value.","line":37,"column":16,"nodeType":"Identifier","messageId":"unsafeMemberExpression","endLine":37,"endColumn":20},{"ruleId":"@typescript-eslint/no-unsafe-argument","severity":2,"message":"Unsafe argument of type `any` assigned to a parameter of type `string`.","line":37,"column":49,"nodeType":"MemberExpression","messageId":"unsafeArgument","endLine":37,"endColumn":59},{"ruleId":"@typescript-eslint/no-unsafe-member-access","severity":2,"message":"Unsafe member access .code on an `any` value.","line":37,"column":55,"nodeType":"Identifier","messageId":"unsafeMemberExpression","endLine":37,"endColumn":59},{"ruleId":"@typescript-eslint/no-unsafe-member-access","severity":2,"message":"Unsafe member access .message on an `any` value.","line":41,"column":16,"nodeType":"Identifier","messageId":"unsafeMemberExpression","endLine":41,"endColumn":23},{"ruleId":"@typescript-eslint/no-unsafe-assignment","severity":2,"message":"Unsafe assignment of an `any` value.","line":42,"column":13,"nodeType":"VariableDeclarator","messageId":"anyAssignment","endLine":42,"endColumn":50},{"ruleId":"@typescript-eslint/no-unsafe-call","severity":2,"message":"Unsafe call of a(n) `any` typed value.","line":42,"column":23,"nodeType":"MemberExpression","messageId":"unsafeCall","endLine":42,"endColumn":48},{"ruleId":"@typescript-eslint/no-unsafe-member-access","severity":2,"message":"Unsafe member access .message on an `any` value.","line":42,"column":29,"nodeType":"Identifier","messageId":"unsafeMemberExpression","endLine":42,"endColumn":36},{"ruleId":"@typescript-eslint/no-unsafe-return","severity":2,"message":"Unsafe return of a value of type `any`.","line":43,"column":7,"nodeType":"ReturnStatement","messageId":"unsafeReturn","endLine":48,"endColumn":9},{"ruleId":"@typescript-eslint/no-unsafe-call","severity":2,"message":"Unsafe call of a(n) `any` typed value.","line":44,"column":9,"nodeType":"MemberExpression","messageId":"unsafeCall","endLine":44,"endColumn":25},{"ruleId":"@typescript-eslint/no-unsafe-member-access","severity":2,"message":"Unsafe member access .includes on an `any` value.","line":44,"column":17,"nodeType":"Identifier","messageId":"unsafeMemberExpression","endLine":44,"endColumn":25},{"ruleId":"@typescript-eslint/no-unsafe-call","severity":2,"message":"Unsafe call of a(n) `any` typed value.","line":45,"column":9,"nodeType":"MemberExpression","messageId":"unsafeCall","endLine":45,"endColumn":25},{"ruleId":"@typescript-eslint/no-unsafe-member-access","severity":2,"message":"Unsafe member access .includes on an `any` value.","line":45,"column":17,"nodeType":"Identifier","messageId":"unsafeMemberExpression","endLine":45,"endColumn":25},{"ruleId":"@typescript-eslint/no-unsafe-call","severity":2,"message":"Unsafe call of a(n) `any` typed value.","line":46,"column":9,"nodeType":"MemberExpression","messageId":"unsafeCall","endLine":46,"endColumn":25},{"ruleId":"@typescript-eslint/no-unsafe-member-access","severity":2,"message":"Unsafe member access .includes on an `any` value.","line":46,"column":17,"nodeType":"Identifier","messageId":"unsafeMemberExpression","endLine":46,"endColumn":25},{"ruleId":"@typescript-eslint/no-unsafe-call","severity":2,"message":"Unsafe call of a(n) `any` typed value.","line":47,"column":9,"nodeType":"MemberExpression","messageId":"unsafeCall","endLine":47,"endColumn":25},{"ruleId":"@typescript-eslint/no-unsafe-member-access","severity":2,"message":"Unsafe member access .includes on an `any` value.","line":47,"column":17,"nodeType":"Identifier","messageId":"unsafeMemberExpression","endLine":47,"endColumn":25},{"ruleId":"@typescript-eslint/no-unsafe-assignment","severity":2,"message":"Unsafe assignment of an `any` value.","line":85,"column":13,"nodeType":"VariableDeclarator","messageId":"anyAssignment","endLine":85,"endColumn":54},{"ruleId":"@typescript-eslint/no-unsafe-assignment","severity":2,"message":"Unsafe assignment of an `any` value.","line":91,"column":9,"nodeType":"Property","messageId":"anyAssignment","endLine":91,"endColumn":15},{"ruleId":"@typescript-eslint/no-explicit-any","severity":2,"message":"Unexpected any. Specify a different type.","line":135,"column":65,"nodeType":"TSAnyKeyword","messageId":"unexpectedAny","endLine":135,"endColumn":68,"suggestions":[{"messageId":"suggestUnknown","fix":{"range":[3060,3063],"text":"unknown"},"desc":"Use `unknown` instead, this will force you to explicitly, and safely assert the type is correct."},{"messageId":"suggestNever","fix":{"range":[3060,3063],"text":"never"},"desc":"Use `never` instead, this is useful when instantiating generic type parameters that you don't need to know the type of."}]},{"ruleId":"@typescript-eslint/no-unsafe-call","severity":2,"message":"Unsafe call of a(n) `any` typed value.","line":143,"column":20,"nodeType":"MemberExpression","messageId":"unsafeCall","endLine":143,"endColumn":53}],"suppressedMessages":[],"errorCount":21,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":"import { Injectable, Logger } from '@nestjs/common';\nimport {\n RecoveryStrategy,\n RecoveryContext,\n RecoveryResult,\n} from '../interfaces/healing.interface';\n\n/**\n * Retry Recovery Strategy - 重试恢复策略\n *\n * 职责:\n * - 处理可重试的错误\n * - 实现指数退避重试机制\n * - 监控重试成功率\n */\n@Injectable()\nexport class RetryStrategy implements RecoveryStrategy {\n private readonly logger = new Logger(RetryStrategy.name);\n\n readonly name = 'retry';\n readonly priority = 1;\n\n /**\n * 判断是否可以处理该错误\n */\n canHandle(error: any): boolean {\n // 可重试的错误类型\n const retryableErrors = [\n 'ECONNRESET',\n 'ETIMEDOUT',\n 'ENOTFOUND',\n 'ECONNREFUSED',\n 'NETWORK_ERROR',\n 'TEMPORARY_FAILURE',\n ];\n\n if (error?.code && retryableErrors.includes(error.code)) {\n return true;\n }\n\n if (error?.message) {\n const message = error.message.toLowerCase();\n return (\n message.includes('timeout') ||\n message.includes('connection') ||\n message.includes('network') ||\n message.includes('temporary')\n );\n }\n\n return false;\n }\n\n /**\n * 执行重试恢复\n */\n async execute(context: RecoveryContext): Promise {\n const startTime = Date.now();\n\n this.logger.log(\n `Executing retry strategy for task: ${context.taskId}, attempt: ${context.retryCount + 1}`,\n );\n\n try {\n // 计算退避延迟\n const delay = this.calculateBackoffDelay(context.retryCount);\n\n if (delay > 0) {\n this.logger.debug(`Waiting ${delay}ms before retry`);\n await this.sleep(delay);\n }\n\n // 检查是否超过最大重试次数\n if (context.retryCount >= context.maxRetries) {\n return {\n success: false,\n strategy: this.name,\n duration: Date.now() - startTime,\n error: 'Maximum retry attempts exceeded',\n nextAction: 'escalate',\n };\n }\n\n // 执行重试逻辑\n const result = await this.performRetry(context);\n\n return {\n success: true,\n strategy: this.name,\n duration: Date.now() - startTime,\n result,\n nextAction: 'retry',\n };\n } catch (error) {\n this.logger.error(\n `Retry strategy failed for task: ${context.taskId}`,\n error,\n );\n\n return {\n success: false,\n strategy: this.name,\n duration: Date.now() - startTime,\n error: error instanceof Error ? error.message : 'Unknown error',\n nextAction:\n context.retryCount < context.maxRetries ? 'retry' : 'escalate',\n };\n }\n }\n\n /**\n * 获取预估执行时间\n */\n getEstimatedTime(): number {\n return 5000; // 5秒预估时间\n }\n\n /**\n * 计算指数退避延迟\n */\n private calculateBackoffDelay(retryCount: number): number {\n // 指数退避:2^retryCount * 1000ms,最大30秒\n const baseDelay = 1000;\n const maxDelay = 30000;\n const delay = Math.min(baseDelay * Math.pow(2, retryCount), maxDelay);\n\n // 添加随机抖动,避免雷群效应\n const jitter = Math.random() * 0.1 * delay;\n return Math.floor(delay + jitter);\n }\n\n /**\n * 执行重试\n */\n private async performRetry(context: RecoveryContext): Promise {\n // 这里应该重新执行原始任务\n // 具体实现取决于任务类型和上下文\n\n this.logger.debug(`Performing retry for task: ${context.taskId}`);\n\n // 模拟重试逻辑\n if (context.metadata?.originalFunction) {\n return await context.metadata.originalFunction();\n }\n\n // 如果没有原始函数,返回成功标记\n return { retried: true, timestamp: Date.now() };\n }\n\n /**\n * 睡眠函数\n */\n private sleep(ms: number): Promise {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n}\n","usedDeprecatedRules":[]},{"filePath":"/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/wwjcloud-nest-v1/libs/wwjcloud-ai/src/index.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/wwjcloud-nest-v1/libs/wwjcloud-ai/src/manager/bootstrap/ai-bootstrap.provider.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/wwjcloud-nest-v1/libs/wwjcloud-ai/src/manager/controllers/ai.controller.ts","messages":[{"ruleId":"@typescript-eslint/no-unused-vars","severity":2,"message":"'TASK_FAILED_EVENT' is defined but never used.","line":9,"column":10,"nodeType":null,"messageId":"unusedVar","endLine":9,"endColumn":27},{"ruleId":"@typescript-eslint/no-unused-vars","severity":2,"message":"'TASK_RECOVERY_REQUESTED_EVENT' is defined but never used.","line":9,"column":29,"nodeType":null,"messageId":"unusedVar","endLine":9,"endColumn":58},{"ruleId":"@typescript-eslint/no-unused-vars","severity":2,"message":"'TaskFailedPayload' is defined but never used.","line":12,"column":3,"nodeType":null,"messageId":"unusedVar","endLine":12,"endColumn":20},{"ruleId":"@typescript-eslint/no-unused-vars","severity":2,"message":"'TaskRecoveryRequestedPayload' is defined but never used.","line":13,"column":3,"nodeType":null,"messageId":"unusedVar","endLine":13,"endColumn":31}],"suppressedMessages":[],"errorCount":4,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":"import { Controller, Get, Query, UseGuards, Post } from '@nestjs/common';\nimport { RateLimitGuard } from '@wwjCommon/http/rate-limit.guard';\nimport { AiRecoveryService } from '../../healing/services/ai-recovery.service';\nimport { ApiTags } from '@nestjs/swagger';\nimport { ApiQuery } from '@nestjs/swagger';\nimport { IsInt, IsOptional, Min, IsString, IsIn } from 'class-validator';\nimport { Public, Roles } from '@wwjCommon/auth/decorators';\nimport { EventBus } from '@wwjCommon/events/event-bus';\nimport { TASK_FAILED_EVENT, TASK_RECOVERY_REQUESTED_EVENT } from '@wwjAi';\nimport type {\n Severity,\n TaskFailedPayload,\n TaskRecoveryRequestedPayload,\n} from '@wwjAi';\nimport { ConfigService } from '@nestjs/config';\nimport { MetricsService } from '@wwjCommon/metrics/metrics.service';\nimport { AuthGuard } from '@wwjCommon/auth/auth.guard';\nimport { RbacGuard } from '@wwjCommon/auth/rbac.guard';\nimport { AiStrategyService } from '@wwjAi';\n\nclass DrainQueryDto {\n @IsInt()\n @Min(1)\n @IsOptional()\n max?: number;\n}\n\nclass SimulateFailureQueryDto {\n @IsString()\n @IsOptional()\n taskId?: string;\n\n @IsString()\n @IsIn(['low', 'medium', 'high'])\n @IsOptional()\n severity?: Severity;\n\n @IsString()\n @IsOptional()\n reason?: string;\n}\n\n@UseGuards(AuthGuard, RbacGuard, RateLimitGuard)\n@ApiTags('AI')\n@Controller('ai/recovery')\nexport class AiController {\n constructor(\n private readonly recovery: AiRecoveryService,\n private readonly eventBus: EventBus,\n private readonly config: ConfigService,\n private readonly metrics: MetricsService,\n private readonly strategy: AiStrategyService,\n ) {}\n\n @Get('status')\n @Public()\n async status() {\n return await this.recovery.status();\n }\n\n @Get('process-one')\n @Post('process-one')\n @Roles('admin')\n async processOne() {\n const ok = await this.recovery.processOne();\n return { ok };\n }\n\n @Get('drain')\n @Post('drain')\n @Roles('admin')\n @ApiQuery({\n name: 'max',\n required: false,\n type: Number,\n description: '最大处理数量(默认10)',\n })\n async drain(@Query() query: DrainQueryDto) {\n const n = await this.recovery.drain(query.max ?? 10);\n return { processed: n };\n }\n\n @Get('simulate-failure')\n @Post('simulate-failure')\n @Roles('admin')\n @ApiQuery({ name: 'taskId', required: false, type: String })\n @ApiQuery({\n name: 'severity',\n required: false,\n enum: ['low', 'medium', 'high'],\n })\n @ApiQuery({ name: 'reason', required: false, type: String })\n async simulateFailure(\n @Query() q: SimulateFailureQueryDto,\n ): Promise<{ ok: true; emitted: boolean }> {\n // 委派到服务层,控制器不再直接发事件或打点\n return await this.recovery.simulateFailure({\n taskId: q.taskId,\n severity: q.severity,\n reason: q.reason,\n });\n }\n\n // 移除 readBoolean 与直接依赖 metrics/strategy\n private readBoolean(key: string): boolean {\n const v = this.config.get(key);\n if (typeof v === 'boolean') return v;\n if (typeof v === 'string') return v === 'true' || v === '1' || v === 'yes';\n return false;\n }\n}\n","usedDeprecatedRules":[]},{"filePath":"/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/wwjcloud-nest-v1/libs/wwjcloud-ai/src/manager/interfaces/ai-manager.interface.ts","messages":[{"ruleId":"@typescript-eslint/no-explicit-any","severity":2,"message":"Unexpected any. Specify a different type.","line":23,"column":29,"nodeType":"TSAnyKeyword","messageId":"unexpectedAny","endLine":23,"endColumn":32,"suggestions":[{"messageId":"suggestUnknown","fix":{"range":[356,359],"text":"unknown"},"desc":"Use `unknown` instead, this will force you to explicitly, and safely assert the type is correct."},{"messageId":"suggestNever","fix":{"range":[356,359],"text":"never"},"desc":"Use `never` instead, this is useful when instantiating generic type parameters that you don't need to know the type of."}]},{"ruleId":"@typescript-eslint/no-explicit-any","severity":2,"message":"Unexpected any. Specify a different type.","line":44,"column":12,"nodeType":"TSAnyKeyword","messageId":"unexpectedAny","endLine":44,"endColumn":15,"suggestions":[{"messageId":"suggestUnknown","fix":{"range":[643,646],"text":"unknown"},"desc":"Use `unknown` instead, this will force you to explicitly, and safely assert the type is correct."},{"messageId":"suggestNever","fix":{"range":[643,646],"text":"never"},"desc":"Use `never` instead, this is useful when instantiating generic type parameters that you don't need to know the type of."}]},{"ruleId":"@typescript-eslint/no-explicit-any","severity":2,"message":"Unexpected any. Specify a different type.","line":56,"column":29,"nodeType":"TSAnyKeyword","messageId":"unexpectedAny","endLine":56,"endColumn":32,"suggestions":[{"messageId":"suggestUnknown","fix":{"range":[876,879],"text":"unknown"},"desc":"Use `unknown` instead, this will force you to explicitly, and safely assert the type is correct."},{"messageId":"suggestNever","fix":{"range":[876,879],"text":"never"},"desc":"Use `never` instead, this is useful when instantiating generic type parameters that you don't need to know the type of."}]},{"ruleId":"@typescript-eslint/no-explicit-any","severity":2,"message":"Unexpected any. Specify a different type.","line":66,"column":12,"nodeType":"TSAnyKeyword","messageId":"unexpectedAny","endLine":66,"endColumn":15,"suggestions":[{"messageId":"suggestUnknown","fix":{"range":[1049,1052],"text":"unknown"},"desc":"Use `unknown` instead, this will force you to explicitly, and safely assert the type is correct."},{"messageId":"suggestNever","fix":{"range":[1049,1052],"text":"never"},"desc":"Use `never` instead, this is useful when instantiating generic type parameters that you don't need to know the type of."}]},{"ruleId":"@typescript-eslint/no-explicit-any","severity":2,"message":"Unexpected any. Specify a different type.","line":77,"column":12,"nodeType":"TSAnyKeyword","messageId":"unexpectedAny","endLine":77,"endColumn":15,"suggestions":[{"messageId":"suggestUnknown","fix":{"range":[1218,1221],"text":"unknown"},"desc":"Use `unknown` instead, this will force you to explicitly, and safely assert the type is correct."},{"messageId":"suggestNever","fix":{"range":[1218,1221],"text":"never"},"desc":"Use `never` instead, this is useful when instantiating generic type parameters that you don't need to know the type of."}]}],"suppressedMessages":[],"errorCount":5,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/**\n * AI Manager Interfaces - AI 管理模块接口定义\n */\n\n/**\n * 工作流程配置接口\n */\nexport interface WorkflowConfig {\n steps: string[];\n timeout: number;\n retryCount: number;\n parallel?: boolean;\n dependencies?: string[];\n}\n\n/**\n * 工作流程执行上下文接口\n */\nexport interface WorkflowContext {\n taskId: string;\n userId?: string;\n siteId?: number;\n metadata?: Record;\n startTime: number;\n}\n\n/**\n * 工作流程执行结果接口\n */\nexport interface WorkflowResult {\n success: boolean;\n steps: StepResult[];\n duration: number;\n error?: string;\n}\n\n/**\n * 步骤执行结果接口\n */\nexport interface StepResult {\n step: string;\n success: boolean;\n duration: number;\n result?: any;\n error?: string;\n}\n\n/**\n * 模块状态接口\n */\nexport interface ModuleState {\n name: string;\n status: 'initializing' | 'ready' | 'active' | 'error' | 'unavailable';\n version: string;\n lastUpdate: number;\n metadata?: Record;\n}\n\n/**\n * 任务协调请求接口\n */\nexport interface TaskCoordinationRequest {\n taskId: string;\n taskType: string;\n priority: 'low' | 'medium' | 'high' | 'critical';\n payload: any;\n requiredModules?: string[];\n timeout?: number;\n}\n\n/**\n * 任务协调结果接口\n */\nexport interface TaskCoordinationResult {\n taskId: string;\n success: boolean;\n result?: any;\n error?: string;\n duration: number;\n modulesUsed: string[];\n}\n\n/**\n * AI 管理器统计信息接口\n */\nexport interface AiManagerStats {\n modules: {\n total: number;\n active: number;\n error: number;\n };\n services: {\n total: number;\n healthy: number;\n byType: Record;\n };\n workflows: {\n active: string[];\n completed: number;\n failed: number;\n };\n tasks: {\n pending: number;\n byType: Record;\n oldestAge?: number;\n };\n}\n","usedDeprecatedRules":[]},{"filePath":"/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/wwjcloud-nest-v1/libs/wwjcloud-ai/src/manager/manager.module.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[]},{"filePath":"/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/wwjcloud-nest-v1/libs/wwjcloud-ai/src/manager/services/ai-coordinator.service.ts","messages":[{"ruleId":"@typescript-eslint/no-explicit-any","severity":2,"message":"Unexpected any. Specify a different type.","line":19,"column":51,"nodeType":"TSAnyKeyword","messageId":"unexpectedAny","endLine":19,"endColumn":54,"suggestions":[{"messageId":"suggestUnknown","fix":{"range":[632,635],"text":"unknown"},"desc":"Use `unknown` instead, this will force you to explicitly, and safely assert the type is correct."},{"messageId":"suggestNever","fix":{"range":[632,635],"text":"never"},"desc":"Use `never` instead, this is useful when instantiating generic type parameters that you don't need to know the type of."}]},{"ruleId":"@typescript-eslint/require-await","severity":2,"message":"Async method 'initializeModuleStates' has no 'await' expression.","line":37,"column":3,"nodeType":"FunctionExpression","messageId":"missingAwait","endLine":37,"endColumn":39,"suggestions":[{"messageId":"removeAsync","fix":{"range":[1102,1147],"text":"initializeModuleStates(): void"},"desc":"Remove 'async'."}]},{"ruleId":"@typescript-eslint/no-explicit-any","severity":2,"message":"Unexpected any. Specify a different type.","line":84,"column":14,"nodeType":"TSAnyKeyword","messageId":"unexpectedAny","endLine":84,"endColumn":17,"suggestions":[{"messageId":"suggestUnknown","fix":{"range":[2163,2166],"text":"unknown"},"desc":"Use `unknown` instead, this will force you to explicitly, and safely assert the type is correct."},{"messageId":"suggestNever","fix":{"range":[2163,2166],"text":"never"},"desc":"Use `never` instead, this is useful when instantiating generic type parameters that you don't need to know the type of."}]},{"ruleId":"@typescript-eslint/no-explicit-any","severity":2,"message":"Unexpected any. Specify a different type.","line":85,"column":14,"nodeType":"TSAnyKeyword","messageId":"unexpectedAny","endLine":85,"endColumn":17,"suggestions":[{"messageId":"suggestUnknown","fix":{"range":[2181,2184],"text":"unknown"},"desc":"Use `unknown` instead, this will force you to explicitly, and safely assert the type is correct."},{"messageId":"suggestNever","fix":{"range":[2181,2184],"text":"never"},"desc":"Use `never` instead, this is useful when instantiating generic type parameters that you don't need to know the type of."}]},{"ruleId":"@typescript-eslint/no-unsafe-assignment","severity":2,"message":"Unsafe assignment of an `any` value.","line":100,"column":13,"nodeType":"VariableDeclarator","messageId":"anyAssignment","endLine":104,"endColumn":8},{"ruleId":"@typescript-eslint/no-unsafe-assignment","severity":2,"message":"Unsafe assignment of an `any` value.","line":106,"column":66,"nodeType":"Property","messageId":"anyAssignment","endLine":106,"endColumn":72},{"ruleId":"@typescript-eslint/no-unsafe-assignment","severity":2,"message":"Unsafe assignment of an `any` value.","line":113,"column":9,"nodeType":"Property","messageId":"anyAssignment","endLine":113,"endColumn":14},{"ruleId":"@typescript-eslint/require-await","severity":2,"message":"Async method 'checkModuleAvailability' has no 'await' expression.","line":136,"column":3,"nodeType":"FunctionExpression","messageId":"missingAwait","endLine":136,"endColumn":40,"suggestions":[{"messageId":"removeAsync","fix":{"range":[3472,3615],"text":"checkModuleAvailability(modules: string[]): {\n allAvailable: boolean;\n available: string[];\n unavailable: string[];\n }"},"desc":"Remove 'async'."}]},{"ruleId":"@typescript-eslint/no-explicit-any","severity":2,"message":"Unexpected any. Specify a different type.","line":166,"column":14,"nodeType":"TSAnyKeyword","messageId":"unexpectedAny","endLine":166,"endColumn":17,"suggestions":[{"messageId":"suggestUnknown","fix":{"range":[4155,4158],"text":"unknown"},"desc":"Use `unknown` instead, this will force you to explicitly, and safely assert the type is correct."},{"messageId":"suggestNever","fix":{"range":[4155,4158],"text":"never"},"desc":"Use `never` instead, this is useful when instantiating generic type parameters that you don't need to know the type of."}]},{"ruleId":"@typescript-eslint/no-explicit-any","severity":2,"message":"Unexpected any. Specify a different type.","line":167,"column":14,"nodeType":"TSAnyKeyword","messageId":"unexpectedAny","endLine":167,"endColumn":17,"suggestions":[{"messageId":"suggestUnknown","fix":{"range":[4173,4176],"text":"unknown"},"desc":"Use `unknown` instead, this will force you to explicitly, and safely assert the type is correct."},{"messageId":"suggestNever","fix":{"range":[4173,4176],"text":"never"},"desc":"Use `never` instead, this is useful when instantiating generic type parameters that you don't need to know the type of."}]},{"ruleId":"@typescript-eslint/no-unsafe-assignment","severity":2,"message":"Unsafe assignment of an `any` value.","line":169,"column":47,"nodeType":"Property","messageId":"anyAssignment","endLine":169,"endColumn":54},{"ruleId":"@typescript-eslint/no-unsafe-assignment","severity":2,"message":"Unsafe assignment of an `any` value.","line":177,"column":11,"nodeType":"AssignmentExpression","messageId":"anyAssignment","endLine":180,"endColumn":12},{"ruleId":"@typescript-eslint/no-unsafe-assignment","severity":2,"message":"Unsafe assignment of an `any` value.","line":183,"column":11,"nodeType":"AssignmentExpression","messageId":"anyAssignment","endLine":186,"endColumn":12},{"ruleId":"@typescript-eslint/no-unsafe-assignment","severity":2,"message":"Unsafe assignment of an `any` value.","line":189,"column":11,"nodeType":"AssignmentExpression","messageId":"anyAssignment","endLine":192,"endColumn":12},{"ruleId":"@typescript-eslint/no-unsafe-assignment","severity":2,"message":"Unsafe assignment of an `any` value.","line":195,"column":11,"nodeType":"AssignmentExpression","messageId":"anyAssignment","endLine":195,"endColumn":67},{"ruleId":"@typescript-eslint/no-explicit-any","severity":2,"message":"Unexpected any. Specify a different type.","line":210,"column":14,"nodeType":"TSAnyKeyword","messageId":"unexpectedAny","endLine":210,"endColumn":17,"suggestions":[{"messageId":"suggestUnknown","fix":{"range":[5159,5162],"text":"unknown"},"desc":"Use `unknown` instead, this will force you to explicitly, and safely assert the type is correct."},{"messageId":"suggestNever","fix":{"range":[5159,5162],"text":"never"},"desc":"Use `never` instead, this is useful when instantiating generic type parameters that you don't need to know the type of."}]},{"ruleId":"@typescript-eslint/no-explicit-any","severity":2,"message":"Unexpected any. Specify a different type.","line":211,"column":14,"nodeType":"TSAnyKeyword","messageId":"unexpectedAny","endLine":211,"endColumn":17,"suggestions":[{"messageId":"suggestUnknown","fix":{"range":[5177,5180],"text":"unknown"},"desc":"Use `unknown` instead, this will force you to explicitly, and safely assert the type is correct."},{"messageId":"suggestNever","fix":{"range":[5177,5180],"text":"never"},"desc":"Use `never` instead, this is useful when instantiating generic type parameters that you don't need to know the type of."}]},{"ruleId":"@typescript-eslint/no-explicit-any","severity":2,"message":"Unexpected any. Specify a different type.","line":226,"column":35,"nodeType":"TSAnyKeyword","messageId":"unexpectedAny","endLine":226,"endColumn":38,"suggestions":[{"messageId":"suggestUnknown","fix":{"range":[5526,5529],"text":"unknown"},"desc":"Use `unknown` instead, this will force you to explicitly, and safely assert the type is correct."},{"messageId":"suggestNever","fix":{"range":[5526,5529],"text":"never"},"desc":"Use `never` instead, this is useful when instantiating generic type parameters that you don't need to know the type of."}]},{"ruleId":"@typescript-eslint/no-unsafe-member-access","severity":2,"message":"Unsafe member access .taskId on an `any` value.","line":227,"column":46,"nodeType":"Identifier","messageId":"unsafeMemberExpression","endLine":227,"endColumn":52},{"ruleId":"@typescript-eslint/no-unsafe-member-access","severity":2,"message":"Unsafe member access .severity on an `any` value.","line":230,"column":17,"nodeType":"Identifier","messageId":"unsafeMemberExpression","endLine":230,"endColumn":25},{"ruleId":"@typescript-eslint/no-unsafe-member-access","severity":2,"message":"Unsafe member access .taskId on an `any` value.","line":231,"column":53,"nodeType":"Identifier","messageId":"unsafeMemberExpression","endLine":231,"endColumn":59},{"ruleId":"@typescript-eslint/no-unsafe-assignment","severity":2,"message":"Unsafe assignment of an `any` value.","line":232,"column":9,"nodeType":"Property","messageId":"anyAssignment","endLine":232,"endColumn":30},{"ruleId":"@typescript-eslint/no-explicit-any","severity":2,"message":"Unexpected any. Specify a different type.","line":241,"column":43,"nodeType":"TSAnyKeyword","messageId":"unexpectedAny","endLine":241,"endColumn":46,"suggestions":[{"messageId":"suggestUnknown","fix":{"range":[5890,5893],"text":"unknown"},"desc":"Use `unknown` instead, this will force you to explicitly, and safely assert the type is correct."},{"messageId":"suggestNever","fix":{"range":[5890,5893],"text":"never"},"desc":"Use `never` instead, this is useful when instantiating generic type parameters that you don't need to know the type of."}]},{"ruleId":"@typescript-eslint/no-unsafe-member-access","severity":2,"message":"Unsafe member access .module on an `any` value.","line":243,"column":40,"nodeType":"Identifier","messageId":"unsafeMemberExpression","endLine":243,"endColumn":46},{"ruleId":"@typescript-eslint/no-unsafe-member-access","severity":2,"message":"Unsafe member access .currentState on an `any` value.","line":243,"column":61,"nodeType":"Identifier","messageId":"unsafeMemberExpression","endLine":243,"endColumn":73},{"ruleId":"@typescript-eslint/no-unsafe-argument","severity":2,"message":"Unsafe argument of type `any` assigned to a parameter of type `string`.","line":247,"column":27,"nodeType":"MemberExpression","messageId":"unsafeArgument","endLine":247,"endColumn":41},{"ruleId":"@typescript-eslint/no-unsafe-member-access","severity":2,"message":"Unsafe member access .module on an `any` value.","line":247,"column":35,"nodeType":"Identifier","messageId":"unsafeMemberExpression","endLine":247,"endColumn":41},{"ruleId":"@typescript-eslint/no-unsafe-argument","severity":2,"message":"Unsafe argument of type `any` assigned to a parameter of type `string`.","line":247,"column":43,"nodeType":"MemberExpression","messageId":"unsafeArgument","endLine":247,"endColumn":63},{"ruleId":"@typescript-eslint/no-unsafe-member-access","severity":2,"message":"Unsafe member access .currentState on an `any` value.","line":247,"column":51,"nodeType":"Identifier","messageId":"unsafeMemberExpression","endLine":247,"endColumn":63},{"ruleId":"@typescript-eslint/no-unsafe-member-access","severity":2,"message":"Unsafe member access .currentState on an `any` value.","line":251,"column":15,"nodeType":"Identifier","messageId":"unsafeMemberExpression","endLine":251,"endColumn":27},{"ruleId":"@typescript-eslint/no-unsafe-member-access","severity":2,"message":"Unsafe member access .currentState on an `any` value.","line":252,"column":15,"nodeType":"Identifier","messageId":"unsafeMemberExpression","endLine":252,"endColumn":27},{"ruleId":"@typescript-eslint/no-unsafe-argument","severity":2,"message":"Unsafe argument of type `any` assigned to a parameter of type `string`.","line":254,"column":35,"nodeType":"MemberExpression","messageId":"unsafeArgument","endLine":254,"endColumn":49},{"ruleId":"@typescript-eslint/no-unsafe-member-access","severity":2,"message":"Unsafe member access .module on an `any` value.","line":254,"column":43,"nodeType":"Identifier","messageId":"unsafeMemberExpression","endLine":254,"endColumn":49},{"ruleId":"@typescript-eslint/require-await","severity":2,"message":"Async method 'pauseModuleTasks' has no 'await' expression.","line":261,"column":3,"nodeType":"FunctionExpression","messageId":"missingAwait","endLine":261,"endColumn":33,"suggestions":[{"messageId":"removeAsync","fix":{"range":[6336,6393],"text":"pauseModuleTasks(moduleName: string): void"},"desc":"Remove 'async'."}]},{"ruleId":"@typescript-eslint/no-unsafe-argument","severity":2,"message":"Unsafe argument of type `any` assigned to a parameter of type `string`.","line":265,"column":55,"nodeType":"MemberExpression","messageId":"unsafeArgument","endLine":265,"endColumn":68},{"ruleId":"@typescript-eslint/no-unsafe-member-access","severity":2,"message":"Unsafe member access .taskType on an `any` value.","line":265,"column":60,"nodeType":"Identifier","messageId":"unsafeMemberExpression","endLine":265,"endColumn":68},{"ruleId":"@typescript-eslint/no-unsafe-member-access","severity":2,"message":"Computed name [task.taskType] resolves to an `any` value.","line":289,"column":14,"nodeType":"MemberExpression","messageId":"unsafeComputedMemberAccess","endLine":289,"endColumn":27},{"ruleId":"@typescript-eslint/no-unsafe-member-access","severity":2,"message":"Unsafe member access .taskType on an `any` value.","line":289,"column":19,"nodeType":"Identifier","messageId":"unsafeMemberExpression","endLine":289,"endColumn":27},{"ruleId":"@typescript-eslint/no-unsafe-member-access","severity":2,"message":"Computed name [task.taskType] resolves to an `any` value.","line":289,"column":39,"nodeType":"MemberExpression","messageId":"unsafeComputedMemberAccess","endLine":289,"endColumn":52},{"ruleId":"@typescript-eslint/no-unsafe-member-access","severity":2,"message":"Unsafe member access .taskType on an `any` value.","line":289,"column":44,"nodeType":"Identifier","messageId":"unsafeMemberExpression","endLine":289,"endColumn":52},{"ruleId":"@typescript-eslint/no-unsafe-member-access","severity":2,"message":"Unsafe member access .startTime on an `any` value.","line":291,"column":37,"nodeType":"Identifier","messageId":"unsafeMemberExpression","endLine":291,"endColumn":46}],"suppressedMessages":[],"errorCount":41,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":"import { Injectable, Logger, OnModuleInit } from '@nestjs/common';\nimport { EventBus, OnEvent } from '@wwjCommon/events/event-bus';\nimport { AiRegistryService } from './ai-registry.service';\nimport { AiOrchestratorService } from './ai-orchestrator.service';\n\n/**\n * AI Coordinator Service - AI 协调服务\n *\n * 职责:\n * - 协调各 AI 模块间的通信\n * - 处理跨模块的事件和消息\n * - 管理模块间的依赖关系\n * - 提供统一的协调接口\n */\n@Injectable()\nexport class AiCoordinatorService implements OnModuleInit {\n private readonly logger = new Logger(AiCoordinatorService.name);\n private readonly moduleStates = new Map();\n private readonly pendingTasks = new Map();\n\n constructor(\n private readonly eventBus: EventBus,\n private readonly registryService: AiRegistryService,\n private readonly orchestratorService: AiOrchestratorService,\n ) {}\n\n async onModuleInit() {\n this.logger.log('AI Coordinator Service initialized');\n await this.initializeModuleStates();\n // Mark manager as ready once coordinator has initialized\n this.updateModuleState('manager', 'ready');\n }\n\n /**\n * 初始化模块状态\n */\n private async initializeModuleStates(): Promise {\n const modules = ['healing', 'safe', 'tuner', 'manager'];\n\n for (const module of modules) {\n this.moduleStates.set(module, 'initializing');\n }\n\n this.logger.log('Module states initialized');\n }\n\n /**\n * 更新模块状态\n */\n updateModuleState(moduleName: string, state: string): void {\n const previousState = this.moduleStates.get(moduleName);\n this.moduleStates.set(moduleName, state);\n\n this.logger.log(\n `Module state updated: ${moduleName} ${previousState} -> ${state}`,\n );\n this.eventBus.emit('module.state.changed', {\n module: moduleName,\n previousState,\n currentState: state,\n });\n }\n\n /**\n * 获取模块状态\n */\n getModuleState(moduleName: string): string | undefined {\n return this.moduleStates.get(moduleName);\n }\n\n /**\n * 获取所有模块状态\n */\n getAllModuleStates(): Record {\n return Object.fromEntries(this.moduleStates);\n }\n\n /**\n * 协调任务执行\n */\n async coordinateTask(\n taskId: string,\n taskType: string,\n payload: any,\n ): Promise {\n this.logger.log(`Coordinating task: ${taskId} (${taskType})`);\n\n try {\n // 检查相关模块状态\n const requiredModules = this.getRequiredModules(taskType);\n const moduleCheck = await this.checkModuleAvailability(requiredModules);\n\n if (!moduleCheck.allAvailable) {\n throw new Error(\n `Required modules not available: ${moduleCheck.unavailable.join(', ')}`,\n );\n }\n\n // 执行任务协调\n const result = await this.executeCoordinatedTask(\n taskId,\n taskType,\n payload,\n );\n\n this.eventBus.emit('task.coordinated', { taskId, taskType, result });\n return result;\n } catch (error) {\n this.logger.error(`Task coordination failed: ${taskId}`, error);\n this.eventBus.emit('task.coordination.failed', {\n taskId,\n taskType,\n error,\n });\n throw error;\n }\n }\n\n /**\n * 获取任务所需模块\n */\n private getRequiredModules(taskType: string): string[] {\n const moduleMap: Record = {\n healing: ['healing', 'manager'],\n security: ['safe', 'manager'],\n performance: ['tuner', 'manager'],\n comprehensive: ['healing', 'safe', 'tuner', 'manager'],\n };\n\n return moduleMap[taskType] || ['manager'];\n }\n\n /**\n * 检查模块可用性\n */\n private async checkModuleAvailability(modules: string[]): Promise<{\n allAvailable: boolean;\n available: string[];\n unavailable: string[];\n }> {\n const available: string[] = [];\n const unavailable: string[] = [];\n\n for (const module of modules) {\n const state = this.moduleStates.get(module);\n if (state === 'ready' || state === 'active') {\n available.push(module);\n } else {\n unavailable.push(module);\n }\n }\n\n return {\n allAvailable: unavailable.length === 0,\n available,\n unavailable,\n };\n }\n\n /**\n * 执行协调任务\n */\n private async executeCoordinatedTask(\n taskId: string,\n taskType: string,\n payload: any,\n ): Promise {\n // 将任务添加到待处理队列\n this.pendingTasks.set(taskId, { taskType, payload, startTime: Date.now() });\n\n try {\n // 根据任务类型选择执行策略\n let result;\n\n switch (taskType) {\n case 'healing':\n result = await this.orchestratorService.executeWorkflow(\n 'healing',\n payload,\n );\n break;\n case 'security':\n result = await this.orchestratorService.executeWorkflow(\n 'security',\n payload,\n );\n break;\n case 'performance':\n result = await this.orchestratorService.executeWorkflow(\n 'performance',\n payload,\n );\n break;\n default:\n result = await this.executeCustomTask(taskType, payload);\n }\n\n return result;\n } finally {\n // 从待处理队列中移除\n this.pendingTasks.delete(taskId);\n }\n }\n\n /**\n * 执行自定义任务\n */\n private async executeCustomTask(\n taskType: string,\n payload: any,\n ): Promise {\n const services = this.registryService.getServicesByType(taskType);\n\n if (services.length === 0) {\n throw new Error(`No services available for task type: ${taskType}`);\n }\n\n // 执行第一个可用服务\n return await services[0].execute(payload);\n }\n\n /**\n * 处理任务失败事件\n */\n @OnEvent('task.failed')\n async handleTaskFailed(payload: any): Promise {\n this.logger.warn(`Task failed: ${payload.taskId}`);\n\n // 尝试协调恢复\n if (payload.severity === 'high') {\n await this.coordinateTask(`recovery-${payload.taskId}`, 'healing', {\n originalTask: payload,\n });\n }\n }\n\n /**\n * 处理模块状态变化事件\n */\n @OnEvent('module.state.changed')\n async handleModuleStateChanged(payload: any): Promise {\n this.logger.debug(\n `Module state changed: ${payload.module} -> ${payload.currentState}`,\n );\n\n // 同步内部状态映射,保持状态来源一致\n this.moduleStates.set(payload.module, payload.currentState);\n\n // 如果模块变为不可用,暂停相关任务\n if (\n payload.currentState === 'error' ||\n payload.currentState === 'unavailable'\n ) {\n await this.pauseModuleTasks(payload.module);\n }\n }\n\n /**\n * 暂停模块相关任务\n */\n private async pauseModuleTasks(moduleName: string): Promise {\n this.logger.warn(`Pausing tasks for module: ${moduleName}`);\n\n for (const [taskId, task] of this.pendingTasks) {\n const requiredModules = this.getRequiredModules(task.taskType);\n if (requiredModules.includes(moduleName)) {\n this.logger.warn(`Pausing task: ${taskId}`);\n this.eventBus.emit('task.paused', {\n taskId,\n reason: `Module unavailable: ${moduleName}`,\n });\n }\n }\n }\n\n /**\n * 获取待处理任务统计\n */\n getPendingTasksStats(): {\n total: number;\n byType: Record;\n oldestTask?: { id: string; age: number };\n } {\n const total = this.pendingTasks.size;\n const byType: Record = {};\n let oldestTask: { id: string; age: number } | undefined;\n\n for (const [taskId, task] of this.pendingTasks) {\n byType[task.taskType] = (byType[task.taskType] || 0) + 1;\n\n const age = Date.now() - task.startTime;\n if (!oldestTask || age > oldestTask.age) {\n oldestTask = { id: taskId, age };\n }\n }\n\n return { total, byType, oldestTask };\n }\n}\n","usedDeprecatedRules":[]},{"filePath":"/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/wwjcloud-nest-v1/libs/wwjcloud-ai/src/manager/services/ai-orchestrator.service.ts","messages":[{"ruleId":"@typescript-eslint/no-explicit-any","severity":2,"message":"Unexpected any. Specify a different type.","line":17,"column":54,"nodeType":"TSAnyKeyword","messageId":"unexpectedAny","endLine":17,"endColumn":57,"suggestions":[{"messageId":"suggestUnknown","fix":{"range":[506,509],"text":"unknown"},"desc":"Use `unknown` instead, this will force you to explicitly, and safely assert the type is correct."},{"messageId":"suggestNever","fix":{"range":[506,509],"text":"never"},"desc":"Use `never` instead, this is useful when instantiating generic type parameters that you don't need to know the type of."}]},{"ruleId":"@typescript-eslint/require-await","severity":2,"message":"Async method 'registerDefaultWorkflows' has no 'await' expression.","line":41,"column":3,"nodeType":"FunctionExpression","messageId":"missingAwait","endLine":41,"endColumn":41,"suggestions":[{"messageId":"removeAsync","fix":{"range":[997,1044],"text":"registerDefaultWorkflows(): void"},"desc":"Remove 'async'."}]},{"ruleId":"@typescript-eslint/no-explicit-any","severity":2,"message":"Unexpected any. Specify a different type.","line":67,"column":42,"nodeType":"TSAnyKeyword","messageId":"unexpectedAny","endLine":67,"endColumn":45,"suggestions":[{"messageId":"suggestUnknown","fix":{"range":[1613,1616],"text":"unknown"},"desc":"Use `unknown` instead, this will force you to explicitly, and safely assert the type is correct."},{"messageId":"suggestNever","fix":{"range":[1613,1616],"text":"never"},"desc":"Use `never` instead, this is useful when instantiating generic type parameters that you don't need to know the type of."}]},{"ruleId":"@typescript-eslint/no-explicit-any","severity":2,"message":"Unexpected any. Specify a different type.","line":75,"column":48,"nodeType":"TSAnyKeyword","messageId":"unexpectedAny","endLine":75,"endColumn":51,"suggestions":[{"messageId":"suggestUnknown","fix":{"range":[1799,1802],"text":"unknown"},"desc":"Use `unknown` instead, this will force you to explicitly, and safely assert the type is correct."},{"messageId":"suggestNever","fix":{"range":[1799,1802],"text":"never"},"desc":"Use `never` instead, this is useful when instantiating generic type parameters that you don't need to know the type of."}]},{"ruleId":"@typescript-eslint/no-explicit-any","severity":2,"message":"Unexpected any. Specify a different type.","line":75,"column":62,"nodeType":"TSAnyKeyword","messageId":"unexpectedAny","endLine":75,"endColumn":65,"suggestions":[{"messageId":"suggestUnknown","fix":{"range":[1813,1816],"text":"unknown"},"desc":"Use `unknown` instead, this will force you to explicitly, and safely assert the type is correct."},{"messageId":"suggestNever","fix":{"range":[1813,1816],"text":"never"},"desc":"Use `never` instead, this is useful when instantiating generic type parameters that you don't need to know the type of."}]},{"ruleId":"@typescript-eslint/no-unsafe-assignment","severity":2,"message":"Unsafe assignment of an `any` value.","line":76,"column":11,"nodeType":"VariableDeclarator","messageId":"anyAssignment","endLine":76,"endColumn":52},{"ruleId":"@typescript-eslint/no-unsafe-assignment","severity":2,"message":"Unsafe assignment of an `any` value.","line":84,"column":13,"nodeType":"VariableDeclarator","messageId":"anyAssignment","endLine":84,"endColumn":72},{"ruleId":"@typescript-eslint/no-unsafe-assignment","severity":2,"message":"Unsafe assignment of an `any` value.","line":85,"column":56,"nodeType":"Property","messageId":"anyAssignment","endLine":85,"endColumn":62},{"ruleId":"@typescript-eslint/no-unsafe-assignment","severity":2,"message":"Unsafe assignment of an `any` value.","line":89,"column":53,"nodeType":"Property","messageId":"anyAssignment","endLine":89,"endColumn":58},{"ruleId":"@typescript-eslint/no-explicit-any","severity":2,"message":"Unexpected any. Specify a different type.","line":98,"column":15,"nodeType":"TSAnyKeyword","messageId":"unexpectedAny","endLine":98,"endColumn":18,"suggestions":[{"messageId":"suggestUnknown","fix":{"range":[2440,2443],"text":"unknown"},"desc":"Use `unknown` instead, this will force you to explicitly, and safely assert the type is correct."},{"messageId":"suggestNever","fix":{"range":[2440,2443],"text":"never"},"desc":"Use `never` instead, this is useful when instantiating generic type parameters that you don't need to know the type of."}]},{"ruleId":"@typescript-eslint/no-explicit-any","severity":2,"message":"Unexpected any. Specify a different type.","line":99,"column":14,"nodeType":"TSAnyKeyword","messageId":"unexpectedAny","endLine":99,"endColumn":17,"suggestions":[{"messageId":"suggestUnknown","fix":{"range":[2458,2461],"text":"unknown"},"desc":"Use `unknown` instead, this will force you to explicitly, and safely assert the type is correct."},{"messageId":"suggestNever","fix":{"range":[2458,2461],"text":"never"},"desc":"Use `never` instead, this is useful when instantiating generic type parameters that you don't need to know the type of."}]},{"ruleId":"@typescript-eslint/no-explicit-any","severity":2,"message":"Unexpected any. Specify a different type.","line":100,"column":14,"nodeType":"TSAnyKeyword","messageId":"unexpectedAny","endLine":100,"endColumn":17,"suggestions":[{"messageId":"suggestUnknown","fix":{"range":[2476,2479],"text":"unknown"},"desc":"Use `unknown` instead, this will force you to explicitly, and safely assert the type is correct."},{"messageId":"suggestNever","fix":{"range":[2476,2479],"text":"never"},"desc":"Use `never` instead, this is useful when instantiating generic type parameters that you don't need to know the type of."}]},{"ruleId":"@typescript-eslint/no-unsafe-member-access","severity":2,"message":"Unsafe member access .steps on an `any` value.","line":103,"column":33,"nodeType":"Identifier","messageId":"unsafeMemberExpression","endLine":103,"endColumn":38},{"ruleId":"@typescript-eslint/no-unsafe-assignment","severity":2,"message":"Unsafe assignment of an `any` value.","line":105,"column":13,"nodeType":"VariableDeclarator","messageId":"anyAssignment","endLine":105,"endColumn":71},{"ruleId":"@typescript-eslint/no-unsafe-argument","severity":2,"message":"Unsafe argument of type `any` assigned to a parameter of type `string`.","line":105,"column":57,"nodeType":"Identifier","messageId":"unsafeArgument","endLine":105,"endColumn":61},{"ruleId":"@typescript-eslint/no-unsafe-argument","severity":2,"message":"Unsafe argument of type `any` assigned to a parameter of type `never`.","line":106,"column":20,"nodeType":"Identifier","messageId":"unsafeArgument","endLine":106,"endColumn":30},{"ruleId":"@typescript-eslint/no-explicit-any","severity":2,"message":"Unexpected any. Specify a different type.","line":115,"column":60,"nodeType":"TSAnyKeyword","messageId":"unexpectedAny","endLine":115,"endColumn":63,"suggestions":[{"messageId":"suggestUnknown","fix":{"range":[2832,2835],"text":"unknown"},"desc":"Use `unknown` instead, this will force you to explicitly, and safely assert the type is correct."},{"messageId":"suggestNever","fix":{"range":[2832,2835],"text":"never"},"desc":"Use `never` instead, this is useful when instantiating generic type parameters that you don't need to know the type of."}]},{"ruleId":"@typescript-eslint/no-explicit-any","severity":2,"message":"Unexpected any. Specify a different type.","line":115,"column":74,"nodeType":"TSAnyKeyword","messageId":"unexpectedAny","endLine":115,"endColumn":77,"suggestions":[{"messageId":"suggestUnknown","fix":{"range":[2846,2849],"text":"unknown"},"desc":"Use `unknown` instead, this will force you to explicitly, and safely assert the type is correct."},{"messageId":"suggestNever","fix":{"range":[2846,2849],"text":"never"},"desc":"Use `never` instead, this is useful when instantiating generic type parameters that you don't need to know the type of."}]}],"suppressedMessages":[],"errorCount":18,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":"import { Injectable, Logger, OnModuleInit } from '@nestjs/common';\nimport { EventBus } from '@wwjCommon/events/event-bus';\nimport { AiRegistryService } from './ai-registry.service';\n\n/**\n * AI Orchestrator Service - AI 编排服务\n *\n * 职责:\n * - 协调各 AI 模块的工作流程\n * - 管理 AI 任务的执行顺序\n * - 处理模块间的依赖关系\n * - 监控和调度 AI 服务\n */\n@Injectable()\nexport class AiOrchestratorService implements OnModuleInit {\n private readonly logger = new Logger(AiOrchestratorService.name);\n private readonly activeWorkflows = new Map();\n\n constructor(\n private readonly eventBus: EventBus,\n private readonly registryService: AiRegistryService,\n ) {}\n\n async onModuleInit() {\n this.logger.log('AI Orchestrator Service initialized');\n await this.initializeWorkflows();\n }\n\n /**\n * 初始化工作流程\n */\n private async initializeWorkflows(): Promise {\n this.logger.log('Initializing AI workflows...');\n // 注册默认工作流程\n await this.registerDefaultWorkflows();\n }\n\n /**\n * 注册默认工作流程\n */\n private async registerDefaultWorkflows(): Promise {\n // 自愈工作流程\n this.registerWorkflow('healing', {\n steps: ['detect', 'analyze', 'recover', 'verify'],\n timeout: 30000,\n retryCount: 3,\n });\n\n // 安全检查工作流程\n this.registerWorkflow('security', {\n steps: ['scan', 'analyze', 'protect', 'report'],\n timeout: 15000,\n retryCount: 2,\n });\n\n // 性能优化工作流程\n this.registerWorkflow('performance', {\n steps: ['monitor', 'analyze', 'optimize', 'validate'],\n timeout: 60000,\n retryCount: 1,\n });\n }\n\n /**\n * 注册工作流程\n */\n registerWorkflow(name: string, config: any): void {\n this.activeWorkflows.set(name, config);\n this.logger.log(`Workflow registered: ${name}`);\n }\n\n /**\n * 执行工作流程\n */\n async executeWorkflow(name: string, context: any): Promise {\n const workflow = this.activeWorkflows.get(name);\n if (!workflow) {\n throw new Error(`Workflow not found: ${name}`);\n }\n\n this.logger.log(`Executing workflow: ${name}`);\n\n try {\n const result = await this.processWorkflowSteps(workflow, context);\n this.eventBus.emit('workflow.completed', { name, result });\n return result;\n } catch (error) {\n this.logger.error(`Workflow execution failed: ${name}`, error);\n this.eventBus.emit('workflow.failed', { name, error });\n throw error;\n }\n }\n\n /**\n * 处理工作流程步骤\n */\n private async processWorkflowSteps(\n workflow: any,\n context: any,\n ): Promise {\n const results = [];\n\n for (const step of workflow.steps) {\n this.logger.debug(`Processing workflow step: ${step}`);\n const stepResult = await this.executeWorkflowStep(step, context);\n results.push(stepResult);\n }\n\n return results;\n }\n\n /**\n * 执行工作流程步骤\n */\n private async executeWorkflowStep(step: string, context: any): Promise {\n // 根据步骤类型调用相应的服务\n const services = this.registryService.getServicesByType(step);\n\n if (services.length === 0) {\n this.logger.warn(`No services found for step: ${step}`);\n return null;\n }\n\n // 执行第一个匹配的服务\n const service = services[0];\n return await service.execute(context);\n }\n\n /**\n * 获取活动工作流程\n */\n getActiveWorkflows(): string[] {\n return Array.from(this.activeWorkflows.keys());\n }\n\n /**\n * 停止工作流程\n */\n stopWorkflow(name: string): boolean {\n const removed = this.activeWorkflows.delete(name);\n if (removed) {\n this.logger.log(`Workflow stopped: ${name}`);\n this.eventBus.emit('workflow.stopped', { name });\n }\n return removed;\n }\n}\n","usedDeprecatedRules":[]},{"filePath":"/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/wwjcloud-nest-v1/libs/wwjcloud-ai/src/manager/services/ai-registry.service.ts","messages":[{"ruleId":"@typescript-eslint/no-explicit-any","severity":2,"message":"Unexpected any. Specify a different type.","line":16,"column":20,"nodeType":"TSAnyKeyword","messageId":"unexpectedAny","endLine":16,"endColumn":23,"suggestions":[{"messageId":"suggestUnknown","fix":{"range":[291,294],"text":"unknown"},"desc":"Use `unknown` instead, this will force you to explicitly, and safely assert the type is correct."},{"messageId":"suggestNever","fix":{"range":[291,294],"text":"never"},"desc":"Use `never` instead, this is useful when instantiating generic type parameters that you don't need to know the type of."}]},{"ruleId":"@typescript-eslint/no-explicit-any","severity":2,"message":"Unexpected any. Specify a different type.","line":16,"column":34,"nodeType":"TSAnyKeyword","messageId":"unexpectedAny","endLine":16,"endColumn":37,"suggestions":[{"messageId":"suggestUnknown","fix":{"range":[305,308],"text":"unknown"},"desc":"Use `unknown` instead, this will force you to explicitly, and safely assert the type is correct."},{"messageId":"suggestNever","fix":{"range":[305,308],"text":"never"},"desc":"Use `never` instead, this is useful when instantiating generic type parameters that you don't need to know the type of."}]},{"ruleId":"@typescript-eslint/require-await","severity":2,"message":"Async method 'onModuleDestroy' has no 'await' expression.","line":43,"column":3,"nodeType":"FunctionExpression","messageId":"missingAwait","endLine":43,"endColumn":24,"suggestions":[{"messageId":"removeAsync","fix":{"range":[979,985],"text":""},"desc":"Remove 'async'."}]},{"ruleId":"@typescript-eslint/require-await","severity":2,"message":"Async method 'startHealthCheck' has no 'await' expression.","line":139,"column":3,"nodeType":"FunctionExpression","messageId":"missingAwait","endLine":139,"endColumn":33,"suggestions":[{"messageId":"removeAsync","fix":{"range":[3083,3122],"text":"startHealthCheck(): void"},"desc":"Remove 'async'."}]},{"ruleId":"@typescript-eslint/no-misused-promises","severity":2,"message":"Promise returned in function argument where a void return was expected.","line":140,"column":44,"nodeType":"ArrowFunctionExpression","messageId":"voidReturnArgument","endLine":142,"endColumn":6},{"ruleId":"@typescript-eslint/no-unsafe-assignment","severity":2,"message":"Unsafe assignment of an `any` value.","line":165,"column":56,"nodeType":"Property","messageId":"anyAssignment","endLine":165,"endColumn":61}],"suppressedMessages":[],"errorCount":6,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":"import {\n Injectable,\n Logger,\n OnModuleInit,\n OnModuleDestroy,\n} from '@nestjs/common';\nimport { EventBus } from '@wwjCommon/events/event-bus';\n\n/**\n * AI Service Interface - AI 服务接口\n */\nexport interface AiService {\n name: string;\n type: string;\n version: string;\n execute(context: any): Promise;\n isHealthy(): Promise;\n}\n\n/**\n * AI Registry Service - AI 注册服务\n *\n * 职责:\n * - 管理 AI 服务的注册和注销\n * - 提供服务发现功能\n * - 监控服务健康状态\n * - 维护服务元数据\n */\n@Injectable()\nexport class AiRegistryService implements OnModuleInit, OnModuleDestroy {\n private readonly logger = new Logger(AiRegistryService.name);\n private readonly services = new Map();\n private readonly servicesByType = new Map();\n private healthCheckInterval: NodeJS.Timeout | null = null;\n\n constructor(private readonly eventBus: EventBus) {}\n\n async onModuleInit() {\n this.logger.log('AI Registry Service initialized');\n await this.startHealthCheck();\n }\n\n async onModuleDestroy() {\n // 停止健康检查定时器,避免残留句柄\n if (this.healthCheckInterval) {\n clearInterval(this.healthCheckInterval);\n this.healthCheckInterval = null;\n this.logger.log('AI Registry Service health check stopped');\n }\n }\n\n /**\n * 注册 AI 服务\n */\n registerService(service: AiService): void {\n this.services.set(service.name, service);\n\n // 按类型分组\n if (!this.servicesByType.has(service.type)) {\n this.servicesByType.set(service.type, []);\n }\n this.servicesByType.get(service.type)!.push(service);\n\n this.logger.log(`Service registered: ${service.name} (${service.type})`);\n this.eventBus.emit('service.registered', service);\n }\n\n /**\n * 注销 AI 服务\n */\n unregisterService(serviceName: string): boolean {\n const service = this.services.get(serviceName);\n if (!service) {\n return false;\n }\n\n this.services.delete(serviceName);\n\n // 从类型分组中移除\n const typeServices = this.servicesByType.get(service.type);\n if (typeServices) {\n const index = typeServices.findIndex((s) => s.name === serviceName);\n if (index > -1) {\n typeServices.splice(index, 1);\n }\n }\n\n this.logger.log(`Service unregistered: ${serviceName}`);\n this.eventBus.emit('service.unregistered', service);\n return true;\n }\n\n /**\n * 获取服务\n */\n getService(serviceName: string): AiService | undefined {\n return this.services.get(serviceName);\n }\n\n /**\n * 根据类型获取服务列表\n */\n getServicesByType(type: string): AiService[] {\n return this.servicesByType.get(type) || [];\n }\n\n /**\n * 获取所有服务\n */\n getAllServices(): AiService[] {\n return Array.from(this.services.values());\n }\n\n /**\n * 获取服务统计信息\n */\n getServiceStats(): {\n total: number;\n byType: Record;\n healthy: number;\n } {\n const total = this.services.size;\n const byType: Record = {};\n\n for (const [type, services] of this.servicesByType) {\n byType[type] = services.length;\n }\n\n return {\n total,\n byType,\n healthy: 0, // 将在健康检查中更新\n };\n }\n\n /**\n * 启动健康检查\n */\n private async startHealthCheck(): Promise {\n this.healthCheckInterval = setInterval(async () => {\n await this.performHealthCheck();\n }, 30000);\n }\n\n /**\n * 执行健康检查\n */\n private async performHealthCheck(): Promise {\n let healthyCount = 0;\n\n for (const service of this.services.values()) {\n try {\n const isHealthy = await service.isHealthy();\n if (isHealthy) {\n healthyCount++;\n } else {\n this.logger.warn(`Service unhealthy: ${service.name}`);\n this.eventBus.emit('service.unhealthy', service);\n }\n } catch (error) {\n this.logger.error(\n `Health check failed for service: ${service.name}`,\n error,\n );\n this.eventBus.emit('service.error', { service, error });\n }\n }\n\n this.logger.debug(\n `Health check completed: ${healthyCount}/${this.services.size} services healthy`,\n );\n }\n\n /**\n * 查找服务\n */\n findServices(predicate: (service: AiService) => boolean): AiService[] {\n return Array.from(this.services.values()).filter(predicate);\n }\n\n /**\n * 检查服务是否存在\n */\n hasService(serviceName: string): boolean {\n return this.services.has(serviceName);\n }\n}\n","usedDeprecatedRules":[]},{"filePath":"/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/wwjcloud-nest-v1/libs/wwjcloud-ai/src/safe/analyzers/security.analyzer.ts","messages":[{"ruleId":"@typescript-eslint/require-await","severity":2,"message":"Async method 'checkJwtSecurity' has no 'await' expression.","line":151,"column":3,"nodeType":"FunctionExpression","messageId":"missingAwait","endLine":151,"endColumn":33,"suggestions":[{"messageId":"removeAsync","fix":{"range":[3559,3613],"text":"checkJwtSecurity(): SecurityCheckResult"},"desc":"Remove 'async'."}]},{"ruleId":"@typescript-eslint/require-await","severity":2,"message":"Async method 'checkPasswordPolicy' has no 'await' expression.","line":169,"column":3,"nodeType":"FunctionExpression","messageId":"missingAwait","endLine":169,"endColumn":36,"suggestions":[{"messageId":"removeAsync","fix":{"range":[3926,3983],"text":"checkPasswordPolicy(): SecurityCheckResult"},"desc":"Remove 'async'."}]},{"ruleId":"@typescript-eslint/require-await","severity":2,"message":"Async method 'checkSessionSecurity' has no 'await' expression.","line":186,"column":3,"nodeType":"FunctionExpression","messageId":"missingAwait","endLine":186,"endColumn":37,"suggestions":[{"messageId":"removeAsync","fix":{"range":[4282,4340],"text":"checkSessionSecurity(): SecurityCheckResult"},"desc":"Remove 'async'."}]},{"ruleId":"@typescript-eslint/require-await","severity":2,"message":"Async method 'checkMfaSecurity' has no 'await' expression.","line":203,"column":3,"nodeType":"FunctionExpression","messageId":"missingAwait","endLine":203,"endColumn":33,"suggestions":[{"messageId":"removeAsync","fix":{"range":[4642,4696],"text":"checkMfaSecurity(): SecurityCheckResult"},"desc":"Remove 'async'."}]},{"ruleId":"@typescript-eslint/require-await","severity":2,"message":"Async method 'checkDataEncryption' has no 'await' expression.","line":219,"column":3,"nodeType":"FunctionExpression","messageId":"missingAwait","endLine":219,"endColumn":36,"suggestions":[{"messageId":"removeAsync","fix":{"range":[4979,5036],"text":"checkDataEncryption(): SecurityCheckResult"},"desc":"Remove 'async'."}]},{"ruleId":"@typescript-eslint/require-await","severity":2,"message":"Async method 'checkDataAccess' has no 'await' expression.","line":236,"column":3,"nodeType":"FunctionExpression","messageId":"missingAwait","endLine":236,"endColumn":32,"suggestions":[{"messageId":"removeAsync","fix":{"range":[5335,5388],"text":"checkDataAccess(): SecurityCheckResult"},"desc":"Remove 'async'."}]},{"ruleId":"@typescript-eslint/require-await","severity":2,"message":"Async method 'checkDataBackup' has no 'await' expression.","line":253,"column":3,"nodeType":"FunctionExpression","messageId":"missingAwait","endLine":253,"endColumn":32,"suggestions":[{"messageId":"removeAsync","fix":{"range":[5688,5741],"text":"checkDataBackup(): SecurityCheckResult"},"desc":"Remove 'async'."}]},{"ruleId":"@typescript-eslint/require-await","severity":2,"message":"Async method 'checkDataRetention' has no 'await' expression.","line":270,"column":3,"nodeType":"FunctionExpression","messageId":"missingAwait","endLine":270,"endColumn":35,"suggestions":[{"messageId":"removeAsync","fix":{"range":[6030,6086],"text":"checkDataRetention(): SecurityCheckResult"},"desc":"Remove 'async'."}]},{"ruleId":"@typescript-eslint/require-await","severity":2,"message":"Async method 'checkHttpsSecurity' has no 'await' expression.","line":287,"column":3,"nodeType":"FunctionExpression","messageId":"missingAwait","endLine":287,"endColumn":35,"suggestions":[{"messageId":"removeAsync","fix":{"range":[6391,6447],"text":"checkHttpsSecurity(): SecurityCheckResult"},"desc":"Remove 'async'."}]},{"ruleId":"@typescript-eslint/require-await","severity":2,"message":"Async method 'checkCorsConfiguration' has no 'await' expression.","line":304,"column":3,"nodeType":"FunctionExpression","messageId":"missingAwait","endLine":304,"endColumn":39,"suggestions":[{"messageId":"removeAsync","fix":{"range":[6732,6792],"text":"checkCorsConfiguration(): SecurityCheckResult"},"desc":"Remove 'async'."}]},{"ruleId":"@typescript-eslint/require-await","severity":2,"message":"Async method 'checkRateLimiting' has no 'await' expression.","line":321,"column":3,"nodeType":"FunctionExpression","messageId":"missingAwait","endLine":321,"endColumn":34,"suggestions":[{"messageId":"removeAsync","fix":{"range":[7127,7182],"text":"checkRateLimiting(): SecurityCheckResult"},"desc":"Remove 'async'."}]},{"ruleId":"@typescript-eslint/require-await","severity":2,"message":"Async method 'checkFirewallRules' has no 'await' expression.","line":338,"column":3,"nodeType":"FunctionExpression","messageId":"missingAwait","endLine":338,"endColumn":35,"suggestions":[{"messageId":"removeAsync","fix":{"range":[7470,7526],"text":"checkFirewallRules(): SecurityCheckResult"},"desc":"Remove 'async'."}]},{"ruleId":"@typescript-eslint/require-await","severity":2,"message":"Async method 'checkInputValidation' has no 'await' expression.","line":355,"column":3,"nodeType":"FunctionExpression","messageId":"missingAwait","endLine":355,"endColumn":37,"suggestions":[{"messageId":"removeAsync","fix":{"range":[7820,7878],"text":"checkInputValidation(): SecurityCheckResult"},"desc":"Remove 'async'."}]},{"ruleId":"@typescript-eslint/require-await","severity":2,"message":"Async method 'checkSqlInjection' has no 'await' expression.","line":372,"column":3,"nodeType":"FunctionExpression","messageId":"missingAwait","endLine":372,"endColumn":34,"suggestions":[{"messageId":"removeAsync","fix":{"range":[8180,8235],"text":"checkSqlInjection(): SecurityCheckResult"},"desc":"Remove 'async'."}]},{"ruleId":"@typescript-eslint/require-await","severity":2,"message":"Async method 'checkXssProtection' has no 'await' expression.","line":389,"column":3,"nodeType":"FunctionExpression","messageId":"missingAwait","endLine":389,"endColumn":35,"suggestions":[{"messageId":"removeAsync","fix":{"range":[8551,8607],"text":"checkXssProtection(): SecurityCheckResult"},"desc":"Remove 'async'."}]},{"ruleId":"@typescript-eslint/require-await","severity":2,"message":"Async method 'checkDependencyVulnerabilities' has no 'await' expression.","line":406,"column":3,"nodeType":"FunctionExpression","messageId":"missingAwait","endLine":406,"endColumn":47,"suggestions":[{"messageId":"removeAsync","fix":{"range":[8899,8967],"text":"checkDependencyVulnerabilities(): SecurityCheckResult"},"desc":"Remove 'async'."}]},{"ruleId":"@typescript-eslint/no-explicit-any","severity":2,"message":"Unexpected any. Specify a different type.","line":524,"column":27,"nodeType":"TSAnyKeyword","messageId":"unexpectedAny","endLine":524,"endColumn":30,"suggestions":[{"messageId":"suggestUnknown","fix":{"range":[12229,12232],"text":"unknown"},"desc":"Use `unknown` instead, this will force you to explicitly, and safely assert the type is correct."},{"messageId":"suggestNever","fix":{"range":[12229,12232],"text":"never"},"desc":"Use `never` instead, this is useful when instantiating generic type parameters that you don't need to know the type of."}]}],"suppressedMessages":[],"errorCount":17,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":"import { Injectable, Logger } from '@nestjs/common';\n\n/**\n * Security Analyzer - 安全分析器\n *\n * 职责:\n * - 分析系统安全状态\n * - 识别潜在安全威胁\n * - 评估安全风险等级\n * - 生成安全报告\n */\n@Injectable()\nexport class SecurityAnalyzer {\n private readonly logger = new Logger(SecurityAnalyzer.name);\n\n /**\n * 分析系统安全状态\n */\n async analyzeSystemSecurity(): Promise {\n this.logger.log('Starting system security analysis');\n\n const startTime = Date.now();\n\n try {\n // 执行各项安全检查\n const [authSecurity, dataSecurity, networkSecurity, codeSecurity] =\n await Promise.all([\n this.analyzeAuthSecurity(),\n this.analyzeDataSecurity(),\n this.analyzeNetworkSecurity(),\n this.analyzeCodeSecurity(),\n ]);\n\n const overallRisk = this.calculateOverallRisk([\n authSecurity.riskLevel,\n dataSecurity.riskLevel,\n networkSecurity.riskLevel,\n codeSecurity.riskLevel,\n ]);\n\n return {\n timestamp: Date.now(),\n duration: Date.now() - startTime,\n overallRisk,\n categories: {\n authentication: authSecurity,\n dataProtection: dataSecurity,\n networkSecurity: networkSecurity,\n codeQuality: codeSecurity,\n },\n recommendations: this.generateRecommendations(overallRisk),\n };\n } catch (error) {\n this.logger.error('Security analysis failed', error);\n throw error;\n }\n }\n\n /**\n * 分析认证安全\n */\n private async analyzeAuthSecurity(): Promise {\n // 检查认证机制\n const checks = [\n this.checkJwtSecurity(),\n this.checkPasswordPolicy(),\n this.checkSessionSecurity(),\n this.checkMfaSecurity(),\n ];\n\n const results = await Promise.all(checks);\n const riskLevel = this.calculateCategoryRisk(results);\n\n return {\n category: 'authentication',\n riskLevel,\n checks: results,\n score: this.calculateSecurityScore(results),\n };\n }\n\n /**\n * 分析数据安全\n */\n private async analyzeDataSecurity(): Promise {\n const checks = [\n this.checkDataEncryption(),\n this.checkDataAccess(),\n this.checkDataBackup(),\n this.checkDataRetention(),\n ];\n\n const results = await Promise.all(checks);\n const riskLevel = this.calculateCategoryRisk(results);\n\n return {\n category: 'dataProtection',\n riskLevel,\n checks: results,\n score: this.calculateSecurityScore(results),\n };\n }\n\n /**\n * 分析网络安全\n */\n private async analyzeNetworkSecurity(): Promise {\n const checks = [\n this.checkHttpsSecurity(),\n this.checkCorsConfiguration(),\n this.checkRateLimiting(),\n this.checkFirewallRules(),\n ];\n\n const results = await Promise.all(checks);\n const riskLevel = this.calculateCategoryRisk(results);\n\n return {\n category: 'networkSecurity',\n riskLevel,\n checks: results,\n score: this.calculateSecurityScore(results),\n };\n }\n\n /**\n * 分析代码安全\n */\n private async analyzeCodeSecurity(): Promise {\n const checks = [\n this.checkInputValidation(),\n this.checkSqlInjection(),\n this.checkXssProtection(),\n this.checkDependencyVulnerabilities(),\n ];\n\n const results = await Promise.all(checks);\n const riskLevel = this.calculateCategoryRisk(results);\n\n return {\n category: 'codeQuality',\n riskLevel,\n checks: results,\n score: this.calculateSecurityScore(results),\n };\n }\n\n /**\n * JWT 安全检查\n */\n private async checkJwtSecurity(): Promise {\n // 实现 JWT 安全检查逻辑\n return {\n name: 'JWT Security',\n status: 'pass',\n riskLevel: 'low',\n message: 'JWT configuration is secure',\n details: {\n algorithm: 'RS256',\n expiration: '1h',\n secretRotation: true,\n },\n };\n }\n\n /**\n * 密码策略检查\n */\n private async checkPasswordPolicy(): Promise {\n return {\n name: 'Password Policy',\n status: 'pass',\n riskLevel: 'low',\n message: 'Password policy meets security requirements',\n details: {\n minLength: 8,\n complexity: true,\n expiration: 90,\n },\n };\n }\n\n /**\n * 会话安全检查\n */\n private async checkSessionSecurity(): Promise {\n return {\n name: 'Session Security',\n status: 'pass',\n riskLevel: 'medium',\n message: 'Session configuration needs improvement',\n details: {\n httpOnly: true,\n secure: true,\n sameSite: 'strict',\n },\n };\n }\n\n /**\n * 多因素认证检查\n */\n private async checkMfaSecurity(): Promise {\n return {\n name: 'Multi-Factor Authentication',\n status: 'warning',\n riskLevel: 'medium',\n message: 'MFA is not enabled for all users',\n details: {\n enabled: false,\n coverage: '30%',\n },\n };\n }\n\n /**\n * 数据加密检查\n */\n private async checkDataEncryption(): Promise {\n return {\n name: 'Data Encryption',\n status: 'pass',\n riskLevel: 'low',\n message: 'Data encryption is properly configured',\n details: {\n atRest: true,\n inTransit: true,\n algorithm: 'AES-256',\n },\n };\n }\n\n /**\n * 数据访问检查\n */\n private async checkDataAccess(): Promise {\n return {\n name: 'Data Access Control',\n status: 'pass',\n riskLevel: 'low',\n message: 'Data access controls are properly implemented',\n details: {\n rbac: true,\n audit: true,\n encryption: true,\n },\n };\n }\n\n /**\n * 数据备份检查\n */\n private async checkDataBackup(): Promise {\n return {\n name: 'Data Backup',\n status: 'pass',\n riskLevel: 'low',\n message: 'Data backup strategy is adequate',\n details: {\n frequency: 'daily',\n encryption: true,\n offsite: true,\n },\n };\n }\n\n /**\n * 数据保留检查\n */\n private async checkDataRetention(): Promise {\n return {\n name: 'Data Retention',\n status: 'pass',\n riskLevel: 'low',\n message: 'Data retention policies are compliant',\n details: {\n policy: 'defined',\n automation: true,\n compliance: 'GDPR',\n },\n };\n }\n\n /**\n * HTTPS 安全检查\n */\n private async checkHttpsSecurity(): Promise {\n return {\n name: 'HTTPS Security',\n status: 'pass',\n riskLevel: 'low',\n message: 'HTTPS is properly configured',\n details: {\n enforced: true,\n tlsVersion: '1.3',\n hsts: true,\n },\n };\n }\n\n /**\n * CORS 配置检查\n */\n private async checkCorsConfiguration(): Promise {\n return {\n name: 'CORS Configuration',\n status: 'warning',\n riskLevel: 'medium',\n message: 'CORS configuration may be too permissive',\n details: {\n origins: ['*'],\n credentials: true,\n methods: ['GET', 'POST', 'PUT', 'DELETE'],\n },\n };\n }\n\n /**\n * 速率限制检查\n */\n private async checkRateLimiting(): Promise {\n return {\n name: 'Rate Limiting',\n status: 'pass',\n riskLevel: 'low',\n message: 'Rate limiting is properly configured',\n details: {\n enabled: true,\n limits: '100/min',\n burst: 10,\n },\n };\n }\n\n /**\n * 防火墙规则检查\n */\n private async checkFirewallRules(): Promise {\n return {\n name: 'Firewall Rules',\n status: 'pass',\n riskLevel: 'low',\n message: 'Firewall rules are properly configured',\n details: {\n enabled: true,\n defaultDeny: true,\n logging: true,\n },\n };\n }\n\n /**\n * 输入验证检查\n */\n private async checkInputValidation(): Promise {\n return {\n name: 'Input Validation',\n status: 'pass',\n riskLevel: 'low',\n message: 'Input validation is comprehensive',\n details: {\n sanitization: true,\n validation: true,\n whitelisting: true,\n },\n };\n }\n\n /**\n * SQL 注入检查\n */\n private async checkSqlInjection(): Promise {\n return {\n name: 'SQL Injection Protection',\n status: 'pass',\n riskLevel: 'low',\n message: 'SQL injection protection is effective',\n details: {\n parameterizedQueries: true,\n orm: 'TypeORM',\n escaping: true,\n },\n };\n }\n\n /**\n * XSS 保护检查\n */\n private async checkXssProtection(): Promise {\n return {\n name: 'XSS Protection',\n status: 'pass',\n riskLevel: 'low',\n message: 'XSS protection is properly implemented',\n details: {\n csp: true,\n sanitization: true,\n encoding: true,\n },\n };\n }\n\n /**\n * 依赖漏洞检查\n */\n private async checkDependencyVulnerabilities(): Promise {\n return {\n name: 'Dependency Vulnerabilities',\n status: 'warning',\n riskLevel: 'medium',\n message: 'Some dependencies have known vulnerabilities',\n details: {\n total: 150,\n vulnerable: 3,\n critical: 0,\n high: 1,\n medium: 2,\n },\n };\n }\n\n /**\n * 计算分类风险等级\n */\n private calculateCategoryRisk(results: SecurityCheckResult[]): RiskLevel {\n const riskLevels = results.map((r) => r.riskLevel);\n\n if (riskLevels.includes('critical')) return 'critical';\n if (riskLevels.includes('high')) return 'high';\n if (riskLevels.includes('medium')) return 'medium';\n return 'low';\n }\n\n /**\n * 计算整体风险等级\n */\n private calculateOverallRisk(categoryRisks: RiskLevel[]): RiskLevel {\n const riskWeights = { critical: 4, high: 3, medium: 2, low: 1 };\n const totalWeight = categoryRisks.reduce(\n (sum, risk) => sum + riskWeights[risk],\n 0,\n );\n const avgWeight = totalWeight / categoryRisks.length;\n\n if (avgWeight >= 3.5) return 'critical';\n if (avgWeight >= 2.5) return 'high';\n if (avgWeight >= 1.5) return 'medium';\n return 'low';\n }\n\n /**\n * 计算安全评分\n */\n private calculateSecurityScore(results: SecurityCheckResult[]): number {\n const statusWeights = { pass: 100, warning: 60, fail: 0 };\n const totalScore = results.reduce(\n (sum, result) => sum + statusWeights[result.status],\n 0,\n );\n return Math.round(totalScore / results.length);\n }\n\n /**\n * 生成安全建议\n */\n private generateRecommendations(riskLevel: RiskLevel): string[] {\n const recommendations: Record = {\n critical: [\n 'Immediately address critical security vulnerabilities',\n 'Implement emergency security patches',\n 'Review and strengthen access controls',\n 'Conduct comprehensive security audit',\n ],\n high: [\n 'Address high-priority security issues within 24 hours',\n 'Implement additional security monitoring',\n 'Review security policies and procedures',\n 'Consider security training for development team',\n ],\n medium: [\n 'Address medium-priority security issues within a week',\n 'Implement security best practices',\n 'Regular security assessments',\n 'Update security documentation',\n ],\n low: [\n 'Maintain current security posture',\n 'Continue regular security monitoring',\n 'Keep security tools and policies updated',\n 'Periodic security reviews',\n ],\n };\n\n return recommendations[riskLevel] || recommendations.low;\n }\n}\n\n// 类型定义\nexport interface SecurityAnalysisResult {\n timestamp: number;\n duration: number;\n overallRisk: RiskLevel;\n categories: {\n authentication: SecurityCategoryResult;\n dataProtection: SecurityCategoryResult;\n networkSecurity: SecurityCategoryResult;\n codeQuality: SecurityCategoryResult;\n };\n recommendations: string[];\n}\n\nexport interface SecurityCategoryResult {\n category: string;\n riskLevel: RiskLevel;\n checks: SecurityCheckResult[];\n score: number;\n}\n\nexport interface SecurityCheckResult {\n name: string;\n status: 'pass' | 'warning' | 'fail';\n riskLevel: RiskLevel;\n message: string;\n details: Record;\n}\n\nexport type RiskLevel = 'low' | 'medium' | 'high' | 'critical';\n","usedDeprecatedRules":[]},{"filePath":"/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/wwjcloud-nest-v1/libs/wwjcloud-ai/src/safe/detectors/vulnerability.detector.ts","messages":[{"ruleId":"@typescript-eslint/require-await","severity":2,"message":"Async method 'scanDependencyVulnerabilities' has no 'await' expression.","line":90,"column":3,"nodeType":"FunctionExpression","messageId":"missingAwait","endLine":90,"endColumn":46,"suggestions":[{"messageId":"removeAsync","fix":{"range":[2315,2378],"text":"scanDependencyVulnerabilities(): Vulnerability[]"},"desc":"Remove 'async'."}]},{"ruleId":"@typescript-eslint/require-await","severity":2,"message":"Async method 'scanConfigurationVulnerabilities' has no 'await' expression.","line":138,"column":3,"nodeType":"FunctionExpression","messageId":"missingAwait","endLine":138,"endColumn":49,"suggestions":[{"messageId":"removeAsync","fix":{"range":[3685,3751],"text":"scanConfigurationVulnerabilities(): Vulnerability[]"},"desc":"Remove 'async'."}]},{"ruleId":"@typescript-eslint/require-await","severity":2,"message":"Async method 'scanNetworkVulnerabilities' has no 'await' expression.","line":166,"column":3,"nodeType":"FunctionExpression","messageId":"missingAwait","endLine":166,"endColumn":43,"suggestions":[{"messageId":"removeAsync","fix":{"range":[4453,4513],"text":"scanNetworkVulnerabilities(): Vulnerability[]"},"desc":"Remove 'async'."}]},{"ruleId":"@typescript-eslint/require-await","severity":2,"message":"Async method 'detectSqlInjection' has no 'await' expression.","line":194,"column":3,"nodeType":"FunctionExpression","messageId":"missingAwait","endLine":194,"endColumn":35,"suggestions":[{"messageId":"removeAsync","fix":{"range":[5186,5238],"text":"detectSqlInjection(): Vulnerability[]"},"desc":"Remove 'async'."}]},{"ruleId":"@typescript-eslint/require-await","severity":2,"message":"Async method 'detectXssVulnerabilities' has no 'await' expression.","line":202,"column":3,"nodeType":"FunctionExpression","messageId":"missingAwait","endLine":202,"endColumn":41,"suggestions":[{"messageId":"removeAsync","fix":{"range":[5317,5375],"text":"detectXssVulnerabilities(): Vulnerability[]"},"desc":"Remove 'async'."}]},{"ruleId":"@typescript-eslint/require-await","severity":2,"message":"Async method 'detectAuthenticationBypass' has no 'await' expression.","line":210,"column":3,"nodeType":"FunctionExpression","messageId":"missingAwait","endLine":210,"endColumn":43,"suggestions":[{"messageId":"removeAsync","fix":{"range":[5451,5511],"text":"detectAuthenticationBypass(): Vulnerability[]"},"desc":"Remove 'async'."}]},{"ruleId":"@typescript-eslint/require-await","severity":2,"message":"Async method 'detectPrivilegeEscalation' has no 'await' expression.","line":218,"column":3,"nodeType":"FunctionExpression","messageId":"missingAwait","endLine":218,"endColumn":42,"suggestions":[{"messageId":"removeAsync","fix":{"range":[5586,5645],"text":"detectPrivilegeEscalation(): Vulnerability[]"},"desc":"Remove 'async'."}]},{"ruleId":"@typescript-eslint/require-await","severity":2,"message":"Async method 'detectSuspiciousActivity' has no 'await' expression.","line":307,"column":3,"nodeType":"FunctionExpression","messageId":"missingAwait","endLine":307,"endColumn":41,"suggestions":[{"messageId":"removeAsync","fix":{"range":[7603,7654],"text":"detectSuspiciousActivity(): Threat[]"},"desc":"Remove 'async'."}]},{"ruleId":"@typescript-eslint/require-await","severity":2,"message":"Async method 'detectAnomalousTraffic' has no 'await' expression.","line":315,"column":3,"nodeType":"FunctionExpression","messageId":"missingAwait","endLine":315,"endColumn":39,"suggestions":[{"messageId":"removeAsync","fix":{"range":[7727,7776],"text":"detectAnomalousTraffic(): Threat[]"},"desc":"Remove 'async'."}]},{"ruleId":"@typescript-eslint/require-await","severity":2,"message":"Async method 'detectBruteForceAttacks' has no 'await' expression.","line":323,"column":3,"nodeType":"FunctionExpression","messageId":"missingAwait","endLine":323,"endColumn":40,"suggestions":[{"messageId":"removeAsync","fix":{"range":[7851,7901],"text":"detectBruteForceAttacks(): Threat[]"},"desc":"Remove 'async'."}]},{"ruleId":"@typescript-eslint/require-await","severity":2,"message":"Async method 'detectMaliciousPayloads' has no 'await' expression.","line":331,"column":3,"nodeType":"FunctionExpression","messageId":"missingAwait","endLine":331,"endColumn":40,"suggestions":[{"messageId":"removeAsync","fix":{"range":[7974,8024],"text":"detectMaliciousPayloads(): Threat[]"},"desc":"Remove 'async'."}]}],"suppressedMessages":[],"errorCount":11,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":"import { Injectable, Logger } from '@nestjs/common';\n\n/**\n * Vulnerability Detector - 漏洞检测器\n *\n * 职责:\n * - 扫描系统漏洞\n * - 检测安全威胁\n * - 监控异常行为\n * - 生成威胁报告\n */\n@Injectable()\nexport class VulnerabilityDetector {\n private readonly logger = new Logger(VulnerabilityDetector.name);\n\n /**\n * 执行全面漏洞扫描\n */\n async scanVulnerabilities(): Promise {\n this.logger.log('Starting comprehensive vulnerability scan');\n\n const startTime = Date.now();\n\n try {\n const [\n codeVulnerabilities,\n dependencyVulnerabilities,\n configVulnerabilities,\n networkVulnerabilities,\n ] = await Promise.all([\n this.scanCodeVulnerabilities(),\n this.scanDependencyVulnerabilities(),\n this.scanConfigurationVulnerabilities(),\n this.scanNetworkVulnerabilities(),\n ]);\n\n const allVulnerabilities = [\n ...codeVulnerabilities,\n ...dependencyVulnerabilities,\n ...configVulnerabilities,\n ...networkVulnerabilities,\n ];\n\n return {\n timestamp: Date.now(),\n duration: Date.now() - startTime,\n totalVulnerabilities: allVulnerabilities.length,\n severityBreakdown: this.calculateSeverityBreakdown(allVulnerabilities),\n vulnerabilities: allVulnerabilities,\n recommendations:\n this.generateVulnerabilityRecommendations(allVulnerabilities),\n };\n } catch (error) {\n this.logger.error('Vulnerability scan failed', error);\n throw error;\n }\n }\n\n /**\n * 扫描代码漏洞\n */\n private async scanCodeVulnerabilities(): Promise {\n this.logger.debug('Scanning code vulnerabilities');\n\n // 模拟代码漏洞扫描\n const vulnerabilities: Vulnerability[] = [];\n\n // SQL 注入检测\n const sqlInjectionVulns = await this.detectSqlInjection();\n vulnerabilities.push(...sqlInjectionVulns);\n\n // XSS 检测\n const xssVulns = await this.detectXssVulnerabilities();\n vulnerabilities.push(...xssVulns);\n\n // 认证绕过检测\n const authBypassVulns = await this.detectAuthenticationBypass();\n vulnerabilities.push(...authBypassVulns);\n\n // 权限提升检测\n const privilegeEscalationVulns = await this.detectPrivilegeEscalation();\n vulnerabilities.push(...privilegeEscalationVulns);\n\n return vulnerabilities;\n }\n\n /**\n * 扫描依赖漏洞\n */\n private async scanDependencyVulnerabilities(): Promise {\n this.logger.debug('Scanning dependency vulnerabilities');\n\n // 模拟依赖漏洞扫描结果\n return [\n {\n id: 'CVE-2023-1234',\n type: 'dependency',\n severity: 'high',\n title: 'Remote Code Execution in lodash',\n description:\n 'A prototype pollution vulnerability in lodash allows remote code execution',\n affectedComponent: 'lodash@4.17.20',\n cweId: 'CWE-1321',\n cvssScore: 8.5,\n discoveredAt: Date.now(),\n status: 'open',\n remediation: {\n type: 'update',\n description: 'Update lodash to version 4.17.21 or later',\n effort: 'low',\n },\n },\n {\n id: 'CVE-2023-5678',\n type: 'dependency',\n severity: 'medium',\n title: 'Information Disclosure in express',\n description:\n 'Express middleware may leak sensitive information in error messages',\n affectedComponent: 'express@4.18.0',\n cweId: 'CWE-200',\n cvssScore: 5.3,\n discoveredAt: Date.now(),\n status: 'open',\n remediation: {\n type: 'configuration',\n description:\n 'Configure error handling to prevent information leakage',\n effort: 'medium',\n },\n },\n ];\n }\n\n /**\n * 扫描配置漏洞\n */\n private async scanConfigurationVulnerabilities(): Promise {\n this.logger.debug('Scanning configuration vulnerabilities');\n\n return [\n {\n id: 'CONFIG-001',\n type: 'configuration',\n severity: 'medium',\n title: 'Weak CORS Configuration',\n description:\n 'CORS is configured to allow all origins which may lead to security issues',\n affectedComponent: 'CORS Middleware',\n cweId: 'CWE-346',\n cvssScore: 4.3,\n discoveredAt: Date.now(),\n status: 'open',\n remediation: {\n type: 'configuration',\n description: 'Restrict CORS origins to specific trusted domains',\n effort: 'low',\n },\n },\n ];\n }\n\n /**\n * 扫描网络漏洞\n */\n private async scanNetworkVulnerabilities(): Promise {\n this.logger.debug('Scanning network vulnerabilities');\n\n return [\n {\n id: 'NET-001',\n type: 'network',\n severity: 'low',\n title: 'Missing Security Headers',\n description: 'Some security headers are not configured properly',\n affectedComponent: 'HTTP Headers',\n cweId: 'CWE-693',\n cvssScore: 3.1,\n discoveredAt: Date.now(),\n status: 'open',\n remediation: {\n type: 'configuration',\n description:\n 'Add missing security headers (CSP, HSTS, X-Frame-Options)',\n effort: 'low',\n },\n },\n ];\n }\n\n /**\n * 检测 SQL 注入漏洞\n */\n private async detectSqlInjection(): Promise {\n // 模拟 SQL 注入检测\n return [];\n }\n\n /**\n * 检测 XSS 漏洞\n */\n private async detectXssVulnerabilities(): Promise {\n // 模拟 XSS 检测\n return [];\n }\n\n /**\n * 检测认证绕过漏洞\n */\n private async detectAuthenticationBypass(): Promise {\n // 模拟认证绕过检测\n return [];\n }\n\n /**\n * 检测权限提升漏洞\n */\n private async detectPrivilegeEscalation(): Promise {\n // 模拟权限提升检测\n return [];\n }\n\n /**\n * 计算严重程度分布\n */\n private calculateSeverityBreakdown(\n vulnerabilities: Vulnerability[],\n ): SeverityBreakdown {\n const breakdown = {\n critical: 0,\n high: 0,\n medium: 0,\n low: 0,\n };\n\n vulnerabilities.forEach((vuln) => {\n breakdown[vuln.severity]++;\n });\n\n return breakdown;\n }\n\n /**\n * 生成漏洞修复建议\n */\n private generateVulnerabilityRecommendations(\n vulnerabilities: Vulnerability[],\n ): string[] {\n const recommendations: string[] = [];\n\n const criticalCount = vulnerabilities.filter(\n (v) => v.severity === 'critical',\n ).length;\n const highCount = vulnerabilities.filter(\n (v) => v.severity === 'high',\n ).length;\n\n if (criticalCount > 0) {\n recommendations.push(\n `Immediately address ${criticalCount} critical vulnerabilities`,\n );\n }\n\n if (highCount > 0) {\n recommendations.push(\n `Address ${highCount} high-severity vulnerabilities within 24 hours`,\n );\n }\n\n recommendations.push(\n 'Implement automated vulnerability scanning in CI/CD pipeline',\n );\n recommendations.push('Regular security training for development team');\n recommendations.push(\n 'Establish vulnerability disclosure and response process',\n );\n\n return recommendations;\n }\n\n /**\n * 检测实时威胁\n */\n async detectRealTimeThreats(): Promise {\n this.logger.log('Starting real-time threat detection');\n\n const threats = await Promise.all([\n this.detectSuspiciousActivity(),\n this.detectAnomalousTraffic(),\n this.detectBruteForceAttacks(),\n this.detectMaliciousPayloads(),\n ]);\n\n const allThreats = threats.flat();\n\n return {\n timestamp: Date.now(),\n threatsDetected: allThreats.length,\n threats: allThreats,\n riskLevel: this.calculateThreatRiskLevel(allThreats),\n };\n }\n\n /**\n * 检测可疑活动\n */\n private async detectSuspiciousActivity(): Promise {\n // 模拟可疑活动检测\n return [];\n }\n\n /**\n * 检测异常流量\n */\n private async detectAnomalousTraffic(): Promise {\n // 模拟异常流量检测\n return [];\n }\n\n /**\n * 检测暴力破解攻击\n */\n private async detectBruteForceAttacks(): Promise {\n // 模拟暴力破解检测\n return [];\n }\n\n /**\n * 检测恶意载荷\n */\n private async detectMaliciousPayloads(): Promise {\n // 模拟恶意载荷检测\n return [];\n }\n\n /**\n * 计算威胁风险等级\n */\n private calculateThreatRiskLevel(\n threats: Threat[],\n ): 'low' | 'medium' | 'high' | 'critical' {\n if (threats.length === 0) return 'low';\n\n const highSeverityThreats = threats.filter(\n (t) => t.severity === 'high' || t.severity === 'critical',\n );\n\n if (highSeverityThreats.length > 5) return 'critical';\n if (highSeverityThreats.length > 2) return 'high';\n if (threats.length > 10) return 'medium';\n\n return 'low';\n }\n}\n\n// 类型定义\nexport interface VulnerabilityScanResult {\n timestamp: number;\n duration: number;\n totalVulnerabilities: number;\n severityBreakdown: SeverityBreakdown;\n vulnerabilities: Vulnerability[];\n recommendations: string[];\n}\n\nexport interface Vulnerability {\n id: string;\n type: 'code' | 'dependency' | 'configuration' | 'network';\n severity: 'low' | 'medium' | 'high' | 'critical';\n title: string;\n description: string;\n affectedComponent: string;\n cweId?: string;\n cvssScore?: number;\n discoveredAt: number;\n status: 'open' | 'in_progress' | 'resolved' | 'false_positive';\n remediation: {\n type: 'update' | 'patch' | 'configuration' | 'code_change';\n description: string;\n effort: 'low' | 'medium' | 'high';\n };\n}\n\nexport interface SeverityBreakdown {\n critical: number;\n high: number;\n medium: number;\n low: number;\n}\n\nexport interface ThreatDetectionResult {\n timestamp: number;\n threatsDetected: number;\n threats: Threat[];\n riskLevel: 'low' | 'medium' | 'high' | 'critical';\n}\n\nexport interface Threat {\n id: string;\n type:\n | 'suspicious_activity'\n | 'anomalous_traffic'\n | 'brute_force'\n | 'malicious_payload';\n severity: 'low' | 'medium' | 'high' | 'critical';\n source: string;\n description: string;\n detectedAt: number;\n indicators: string[];\n}\n","usedDeprecatedRules":[]},{"filePath":"/Users/wanwu/Documents/wwjcloud/wwjcloud-nsetjs/wwjcloud-nest-v1/libs/wwjcloud-ai/src/safe/protectors/access.protector.ts","messages":[{"ruleId":"@typescript-eslint/no-unsafe-assignment","severity":2,"message":"Unsafe assignment of an `any` value.","line":37,"column":11,"nodeType":"VariableDeclarator","messageId":"anyAssignment","endLine":37,"endColumn":56},{"ruleId":"@typescript-eslint/require-await","severity":2,"message":"Async method 'monitorAccessPatterns' has no 'await' expression.","line":143,"column":3,"nodeType":"FunctionExpression","messageId":"missingAwait","endLine":143,"endColumn":30,"suggestions":[{"messageId":"removeAsync","fix":{"range":[3194,3255],"text":"monitorAccessPatterns(): AccessPatternAnalysis"},"desc":"Remove 'async'."}]},{"ruleId":"@typescript-eslint/no-explicit-any","severity":2,"message":"Unexpected any. Specify a different type.","line":176,"column":32,"nodeType":"TSAnyKeyword","messageId":"unexpectedAny","endLine":176,"endColumn":35,"suggestions":[{"messageId":"suggestUnknown","fix":{"range":[4124,4127],"text":"unknown"},"desc":"Use `unknown` instead, this will force you to explicitly, and safely assert the type is correct."},{"messageId":"suggestNever","fix":{"range":[4124,4127],"text":"never"},"desc":"Use `never` instead, this is useful when instantiating generic type parameters that you don't need to know the type of."}]},{"ruleId":"@typescript-eslint/no-unsafe-return","severity":2,"message":"Unsafe return of a value of type `any`.","line":177,"column":5,"nodeType":"ReturnStatement","messageId":"unsafeReturn","endLine":183,"endColumn":7},{"ruleId":"@typescript-eslint/no-unsafe-member-access","severity":2,"message":"Unsafe member access .ip on an `any` value.","line":178,"column":15,"nodeType":"Identifier","messageId":"unsafeMemberExpression","endLine":178,"endColumn":17},{"ruleId":"@typescript-eslint/no-unsafe-member-access","severity":2,"message":"Unsafe member access .connection on an `any` value.","line":179,"column":15,"nodeType":"Identifier","messageId":"unsafeMemberExpression","endLine":179,"endColumn":25},{"ruleId":"@typescript-eslint/no-unsafe-member-access","severity":2,"message":"Unsafe member access .socket on an `any` value.","line":180,"column":15,"nodeType":"Identifier","messageId":"unsafeMemberExpression","endLine":180,"endColumn":21},{"ruleId":"@typescript-eslint/no-unsafe-call","severity":2,"message":"Unsafe call of a(n) `any` typed value.","line":181,"column":7,"nodeType":"MemberExpression","messageId":"unsafeCall","endLine":181,"endColumn":48},{"ruleId":"@typescript-eslint/no-unsafe-member-access","severity":2,"message":"Unsafe member access .headers on an `any` value.","line":181,"column":15,"nodeType":"Identifier","messageId":"unsafeMemberExpression","endLine":181,"endColumn":22},{"ruleId":"@typescript-eslint/no-unsafe-member-access","severity":2,"message":"Unsafe member access [0] on an `any` value.","line":181,"column":54,"nodeType":"Literal","messageId":"unsafeMemberExpression","endLine":181,"endColumn":55},{"ruleId":"@typescript-eslint/no-explicit-any","severity":2,"message":"Unexpected any. Specify a different type.","line":189,"column":52,"nodeType":"TSAnyKeyword","messageId":"unexpectedAny","endLine":189,"endColumn":55,"suggestions":[{"messageId":"suggestUnknown","fix":{"range":[4416,4419],"text":"unknown"},"desc":"Use `unknown` instead, this will force you to explicitly, and safely assert the type is correct."},{"messageId":"suggestNever","fix":{"range":[4416,4419],"text":"never"},"desc":"Use `never` instead, this is useful when instantiating generic type parameters that you don't need to know the type of."}]},{"ruleId":"@typescript-eslint/no-unsafe-assignment","severity":2,"message":"Unsafe assignment of an `any` value.","line":197,"column":7,"nodeType":"Property","messageId":"anyAssignment","endLine":197,"endColumn":29},{"ruleId":"@typescript-eslint/no-unsafe-member-access","severity":2,"message":"Unsafe member access .method on an `any` value.","line":197,"column":23,"nodeType":"Identifier","messageId":"unsafeMemberExpression","endLine":197,"endColumn":29},{"ruleId":"@typescript-eslint/no-unsafe-assignment","severity":2,"message":"Unsafe assignment of an `any` value.","line":198,"column":7,"nodeType":"Property","messageId":"anyAssignment","endLine":198,"endColumn":23},{"ruleId":"@typescript-eslint/no-unsafe-member-access","severity":2,"message":"Unsafe member access .url on an `any` value.","line":198,"column":20,"nodeType":"Identifier","messageId":"unsafeMemberExpression","endLine":198,"endColumn":23},{"ruleId":"@typescript-eslint/no-unsafe-assignment","severity":2,"message":"Unsafe assignment of an `any` value.","line":199,"column":7,"nodeType":"Property","messageId":"anyAssignment","endLine":199,"endColumn":47},{"ruleId":"@typescript-eslint/no-unsafe-member-access","severity":2,"message":"Unsafe member access .headers on an `any` value.","line":199,"column":26,"nodeType":"Identifier","messageId":"unsafeMemberExpression","endLine":199,"endColumn":33},{"ruleId":"@typescript-eslint/no-explicit-any","severity":2,"message":"Unexpected any. Specify a different type.","line":224,"column":57,"nodeType":"TSAnyKeyword","messageId":"unexpectedAny","endLine":224,"endColumn":60,"suggestions":[{"messageId":"suggestUnknown","fix":{"range":[5259,5262],"text":"unknown"},"desc":"Use `unknown` instead, this will force you to explicitly, and safely assert the type is correct."},{"messageId":"suggestNever","fix":{"range":[5259,5262],"text":"never"},"desc":"Use `never` instead, this is useful when instantiating generic type parameters that you don't need to know the type of."}]},{"ruleId":"@typescript-eslint/no-unsafe-assignment","severity":2,"message":"Unsafe assignment of an `any` value.","line":237,"column":11,"nodeType":"VariableDeclarator","messageId":"anyAssignment","endLine":237,"endColumn":52},{"ruleId":"@typescript-eslint/no-unsafe-member-access","severity":2,"message":"Unsafe member access .headers on an `any` value.","line":237,"column":31,"nodeType":"Identifier","messageId":"unsafeMemberExpression","endLine":237,"endColumn":38},{"ruleId":"@typescript-eslint/no-unsafe-argument","severity":2,"message":"Unsafe argument of type `any` assigned to a parameter of type `string`.","line":238,"column":50,"nodeType":"Identifier","messageId":"unsafeArgument","endLine":238,"endColumn":59},{"ruleId":"@typescript-eslint/no-unsafe-argument","severity":2,"message":"Unsafe argument of type `any` assigned to a parameter of type `string`.","line":243,"column":40,"nodeType":"MemberExpression","messageId":"unsafeArgument","endLine":243,"endColumn":51},{"ruleId":"@typescript-eslint/no-unsafe-member-access","severity":2,"message":"Unsafe member access .url on an `any` value.","line":243,"column":48,"nodeType":"Identifier","messageId":"unsafeMemberExpression","endLine":243,"endColumn":51},{"ruleId":"@typescript-eslint/no-explicit-any","severity":2,"message":"Unexpected any. Specify a different type.","line":253,"column":57,"nodeType":"TSAnyKeyword","messageId":"unexpectedAny","endLine":253,"endColumn":60,"suggestions":[{"messageId":"suggestUnknown","fix":{"range":[5894,5897],"text":"unknown"},"desc":"Use `unknown` instead, this will force you to explicitly, and safely assert the type is correct."},{"messageId":"suggestNever","fix":{"range":[5894,5897],"text":"never"},"desc":"Use `never` instead, this is useful when instantiating generic type parameters that you don't need to know the type of."}]},{"ruleId":"@typescript-eslint/no-unsafe-assignment","severity":2,"message":"Unsafe assignment of an `any` value.","line":263,"column":9,"nodeType":"Property","messageId":"anyAssignment","endLine":263,"endColumn":31},{"ruleId":"@typescript-eslint/no-unsafe-member-access","severity":2,"message":"Unsafe member access .method on an `any` value.","line":263,"column":25,"nodeType":"Identifier","messageId":"unsafeMemberExpression","endLine":263,"endColumn":31},{"ruleId":"@typescript-eslint/no-unsafe-assignment","severity":2,"message":"Unsafe assignment of an `any` value.","line":264,"column":9,"nodeType":"Property","messageId":"anyAssignment","endLine":264,"endColumn":25},{"ruleId":"@typescript-eslint/no-unsafe-member-access","severity":2,"message":"Unsafe member access .url on an `any` value.","line":264,"column":22,"nodeType":"Identifier","messageId":"unsafeMemberExpression","endLine":264,"endColumn":25},{"ruleId":"@typescript-eslint/no-unsafe-assignment","severity":2,"message":"Unsafe assignment of an `any` value.","line":265,"column":9,"nodeType":"Property","messageId":"anyAssignment","endLine":265,"endColumn":49},{"ruleId":"@typescript-eslint/no-unsafe-member-access","severity":2,"message":"Unsafe member access .headers on an `any` value.","line":265,"column":28,"nodeType":"Identifier","messageId":"unsafeMemberExpression","endLine":265,"endColumn":35},{"ruleId":"@typescript-eslint/require-await","severity":2,"message":"Async method 'getUserPermissions' has no 'await' expression.","line":314,"column":3,"nodeType":"FunctionExpression","messageId":"missingAwait","endLine":314,"endColumn":35,"suggestions":[{"messageId":"removeAsync","fix":{"range":[7217,7283],"text":"getUserPermissions(userId: string): UserPermissions"},"desc":"Remove 'async'."}]},{"ruleId":"@typescript-eslint/require-await","severity":2,"message":"Async method 'getSecurityPolicy' has no 'await' expression.","line":344,"column":3,"nodeType":"FunctionExpression","messageId":"missingAwait","endLine":344,"endColumn":34,"suggestions":[{"messageId":"removeAsync","fix":{"range":[7889,7973],"text":"getSecurityPolicy(\n policyName: string,\n ): SecurityPolicy | null"},"desc":"Remove 'async'."}]},{"ruleId":"@typescript-eslint/require-await","severity":2,"message":"Async method 'evaluateCondition' has no 'await' expression.","line":388,"column":3,"nodeType":"FunctionExpression","messageId":"missingAwait","endLine":388,"endColumn":34,"suggestions":[{"messageId":"removeAsync","fix":{"range":[8991,9104],"text":"evaluateCondition(\n condition: PolicyCondition,\n context: SecurityContext,\n ): PolicyResult"},"desc":"Remove 'async'."}]},{"ruleId":"@typescript-eslint/no-unused-vars","severity":2,"message":"'context' is defined but never used.","line":434,"column":5,"nodeType":null,"messageId":"unusedVar","endLine":434,"endColumn":12},{"ruleId":"@typescript-eslint/require-await","severity":2,"message":"Async method 'logSecurityEvent' has no 'await' expression.","line":479,"column":3,"nodeType":"FunctionExpression","messageId":"missingAwait","endLine":479,"endColumn":33,"suggestions":[{"messageId":"removeAsync","fix":{"range":[11195,11262],"text":"logSecurityEvent(eventType: string, data: any): void"},"desc":"Remove 'async'."}]},{"ruleId":"@typescript-eslint/no-explicit-any","severity":2,"message":"Unexpected any. Specify a different type.","line":479,"column":59,"nodeType":"TSAnyKeyword","messageId":"unexpectedAny","endLine":479,"endColumn":62,"suggestions":[{"messageId":"suggestUnknown","fix":{"range":[11243,11246],"text":"unknown"},"desc":"Use `unknown` instead, this will force you to explicitly, and safely assert the type is correct."},{"messageId":"suggestNever","fix":{"range":[11243,11246],"text":"never"},"desc":"Use `never` instead, this is useful when instantiating generic type parameters that you don't need to know the type of."}]},{"ruleId":"@typescript-eslint/no-explicit-any","severity":2,"message":"Unexpected any. Specify a different type.","line":541,"column":27,"nodeType":"TSAnyKeyword","messageId":"unexpectedAny","endLine":541,"endColumn":30,"suggestions":[{"messageId":"suggestUnknown","fix":{"range":[12638,12641],"text":"unknown"},"desc":"Use `unknown` instead, this will force you to explicitly, and safely assert the type is correct."},{"messageId":"suggestNever","fix":{"range":[12638,12641],"text":"never"},"desc":"Use `never` instead, this is useful when instantiating generic type parameters that you don't need to know the type of."}]}],"suppressedMessages":[],"errorCount":37,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":"import {\n Injectable,\n Logger,\n CanActivate,\n ExecutionContext,\n} from '@nestjs/common';\nimport { Reflector } from '@nestjs/core';\nimport { Observable } from 'rxjs';\n\n/**\n * Access Protector - 访问保护器\n *\n * 职责:\n * - 控制系统访问权限\n * - 实施安全策略\n * - 监控访问行为\n * - 防止未授权访问\n */\n@Injectable()\nexport class AccessProtector implements CanActivate {\n private readonly logger = new Logger(AccessProtector.name);\n private readonly accessAttempts = new Map();\n private readonly blockedIps = new Set();\n private readonly suspiciousActivities = new Map<\n string,\n SuspiciousActivity[]\n >();\n\n constructor(private reflector: Reflector) {}\n\n /**\n * 守卫方法 - 检查访问权限\n */\n canActivate(\n context: ExecutionContext,\n ): boolean | Promise | Observable {\n const request = context.switchToHttp().getRequest();\n const clientIp = this.getClientIp(request);\n\n // 检查 IP 是否被阻止\n if (this.blockedIps.has(clientIp)) {\n this.logger.warn(`Blocked IP attempted access: ${clientIp}`);\n return false;\n }\n\n // 记录访问尝试\n this.recordAccessAttempt(clientIp, request);\n\n // 检查访问频率\n if (this.isAccessRateLimited(clientIp)) {\n this.logger.warn(`Rate limit exceeded for IP: ${clientIp}`);\n return false;\n }\n\n // 检查可疑活动\n if (this.detectSuspiciousActivity(clientIp, request)) {\n this.logger.warn(`Suspicious activity detected from IP: ${clientIp}`);\n this.handleSuspiciousActivity(clientIp, request);\n return false;\n }\n\n return true;\n }\n\n /**\n * 验证用户权限\n */\n async validateUserPermissions(\n userId: string,\n resource: string,\n action: string,\n ): Promise {\n this.logger.debug(\n `Validating permissions for user ${userId}: ${action} on ${resource}`,\n );\n\n try {\n // 获取用户角色和权限\n const userPermissions = await this.getUserPermissions(userId);\n\n // 检查资源访问权限\n const hasPermission = this.checkResourcePermission(\n userPermissions,\n resource,\n action,\n );\n\n if (!hasPermission) {\n this.logger.warn(\n `Permission denied for user ${userId}: ${action} on ${resource}`,\n );\n await this.logSecurityEvent('PERMISSION_DENIED', {\n userId,\n resource,\n action,\n timestamp: Date.now(),\n });\n }\n\n return hasPermission;\n } catch (error) {\n this.logger.error(\n `Error validating permissions for user ${userId}`,\n error,\n );\n return false;\n }\n }\n\n /**\n * 实施安全策略\n */\n async enforceSecurityPolicy(\n policyName: string,\n context: SecurityContext,\n ): Promise {\n this.logger.debug(`Enforcing security policy: ${policyName}`);\n\n const policy = await this.getSecurityPolicy(policyName);\n\n if (!policy) {\n return {\n allowed: false,\n reason: 'Policy not found',\n actions: [],\n };\n }\n\n // 评估策略条件\n const evaluation = await this.evaluatePolicyConditions(policy, context);\n\n if (!evaluation.allowed) {\n // 执行策略动作\n await this.executePolicyActions(policy.denyActions, context);\n }\n\n return evaluation;\n }\n\n /**\n * 监控访问模式\n */\n async monitorAccessPatterns(): Promise {\n this.logger.log('Analyzing access patterns');\n\n const analysis = {\n timestamp: Date.now(),\n totalAccesses: 0,\n uniqueIps: 0,\n suspiciousActivities: 0,\n blockedAttempts: 0,\n topSources: [] as AccessSource[],\n anomalies: [] as AccessAnomaly[],\n };\n\n // 分析访问尝试\n for (const [ip, attempts] of this.accessAttempts.entries()) {\n analysis.totalAccesses += attempts.length;\n\n // 检查异常模式\n const anomalies = this.detectAccessAnomalies(ip, attempts);\n analysis.anomalies.push(...anomalies);\n }\n\n analysis.uniqueIps = this.accessAttempts.size;\n analysis.suspiciousActivities = this.suspiciousActivities.size;\n analysis.blockedAttempts = this.blockedIps.size;\n analysis.topSources = this.getTopAccessSources();\n\n return analysis;\n }\n\n /**\n * 获取客户端 IP\n */\n private getClientIp(request: any): string {\n return (\n request.ip ||\n request.connection?.remoteAddress ||\n request.socket?.remoteAddress ||\n request.headers['x-forwarded-for']?.split(',')[0] ||\n 'unknown'\n );\n }\n\n /**\n * 记录访问尝试\n */\n private recordAccessAttempt(ip: string, request: any): void {\n if (!this.accessAttempts.has(ip)) {\n this.accessAttempts.set(ip, []);\n }\n\n const attempts = this.accessAttempts.get(ip)!;\n attempts.push({\n timestamp: Date.now(),\n method: request.method,\n url: request.url,\n userAgent: request.headers['user-agent'],\n success: true,\n });\n\n // 保持最近 1000 次访问记录\n if (attempts.length > 1000) {\n attempts.splice(0, attempts.length - 1000);\n }\n }\n\n /**\n * 检查访问频率限制\n */\n private isAccessRateLimited(ip: string): boolean {\n const attempts = this.accessAttempts.get(ip) || [];\n const recentAttempts = attempts.filter(\n (attempt) => Date.now() - attempt.timestamp < 60000, // 1分钟内\n );\n\n return recentAttempts.length > 100; // 每分钟最多100次请求\n }\n\n /**\n * 检测可疑活动\n */\n private detectSuspiciousActivity(ip: string, request: any): boolean {\n const attempts = this.accessAttempts.get(ip) || [];\n\n // 检查快速连续请求\n const recentAttempts = attempts.filter(\n (attempt) => Date.now() - attempt.timestamp < 10000, // 10秒内\n );\n\n if (recentAttempts.length > 50) {\n return true;\n }\n\n // 检查异常 User-Agent\n const userAgent = request.headers['user-agent'];\n if (!userAgent || this.isSuspiciousUserAgent(userAgent)) {\n return true;\n }\n\n // 检查恶意路径\n if (this.containsMaliciousPatterns(request.url)) {\n return true;\n }\n\n return false;\n }\n\n /**\n * 处理可疑活动\n */\n private handleSuspiciousActivity(ip: string, request: any): void {\n if (!this.suspiciousActivities.has(ip)) {\n this.suspiciousActivities.set(ip, []);\n }\n\n const activities = this.suspiciousActivities.get(ip)!;\n activities.push({\n timestamp: Date.now(),\n type: 'suspicious_request',\n details: {\n method: request.method,\n url: request.url,\n userAgent: request.headers['user-agent'],\n },\n });\n\n // 如果可疑活动过多,阻止该 IP\n if (activities.length > 10) {\n this.blockedIps.add(ip);\n this.logger.warn(\n `IP ${ip} has been blocked due to excessive suspicious activities`,\n );\n }\n }\n\n /**\n * 检查可疑 User-Agent\n */\n private isSuspiciousUserAgent(userAgent: string): boolean {\n const suspiciousPatterns = [\n /bot/i,\n /crawler/i,\n /spider/i,\n /scanner/i,\n /sqlmap/i,\n /nikto/i,\n ];\n\n return suspiciousPatterns.some((pattern) => pattern.test(userAgent));\n }\n\n /**\n * 检查恶意路径模式\n */\n private containsMaliciousPatterns(url: string): boolean {\n const maliciousPatterns = [\n /\\.\\./, // 路径遍历\n /\\/etc\\/passwd/,\n /\\/proc\\/self/,\n /