From 0f105d3a2172b5d2a4d869ef1cf9373a8df1e936 Mon Sep 17 00:00:00 2001 From: wanwujie Date: Tue, 21 Oct 2025 13:38:58 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=8E=AF=20=E9=87=8D=E6=9E=84=E7=9B=AE?= =?UTF-8?q?=E5=BD=95=E7=BB=93=E6=9E=84=EF=BC=9A=E5=AE=8C=E6=88=90=E9=A1=B9?= =?UTF-8?q?=E7=9B=AE=E7=BB=84=E7=BB=87=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 将wwjcloud目录重命名为wwjcloud-nest-v1作为项目根目录 - 将原nestjs目录重命名为wwjcloud作为NestJS后端目录 - 实现真正的前后端分离架构 - 恢复工作区中丢失的目录结构 - 更新相关配置文件路径引用 - 清理重复和嵌套目录问题 目录结构: wwjcloud-nest-v1/ ├── wwjcloud/ # NestJS 后端 ├── admin/ # 管理端前端 ├── web/ # PC端前端 ├── uni-app-x/ # 移动端前端 ├── wwjcloud-web/ # 部署根目录 ├── docker/ # Docker 配置 ├── docs/ # 文档 └── tools/ # 工具集 --- .../java-tools/generators/entity-generator.js | 410 --- .../generators/service-generator.js | 893 ------ wwjcloud-nest-v1/.gitignore | 2 - wwjcloud-nest-v1/.prettierrc | 4 - wwjcloud-nest-v1/admin/Dockerfile | 25 + wwjcloud-nest-v1/admin/publish.cjs | 2 +- wwjcloud-nest-v1/application-boot.json | 11 + wwjcloud-nest-v1/docker/docker-compose.yml | 131 +- wwjcloud-nest-v1/docker/k6/full_test.js | 132 + .../docker/k6/summary-full-test.json | 227 ++ wwjcloud-nest-v1/eslint-report.json | 1 + wwjcloud-nest-v1/startup-check.report.json | 11 + wwjcloud-nest-v1/tmp-dist/boot-lang.module.js | 37 + wwjcloud-nest-v1/tools/tools-uni/README.md | 93 + .../tools-uni/generators/config-generator.js | 312 ++ .../generators/script-transformer.js | 290 ++ .../tools-uni/generators/style-transformer.js | 307 ++ .../generators/template-transformer.js | 289 ++ .../tools/tools-uni/migration-coordinator.js | 583 ++++ .../tools/tools-uni/utils/analysis-utils.js | 513 +++ .../tools/tools-uni/utils/file-utils.js | 447 +++ .../tools/tools-v1}/QUICK-START.md | 0 .../tools/tools-v1}/README.md | 0 .../env/apps-api.development.example | 0 .../tools-v1}/env/apps-api.feature-all.env | 0 .../tools-v1}/env/apps-api.production.example | 0 .../java-tools/.incremental-state.json | 0 .../java-tools/INFRASTRUCTURE-USAGE-GUIDE.md | 0 .../tools-v1}/java-tools/MIGRATION-RULES.md | 0 .../tools/tools-v1}/java-tools/QUICK-START.md | 0 .../tools/tools-v1}/java-tools/README.md | 0 .../java-tools/context-aware-converter.js | 0 .../java-tools/conversion-pipeline.js | 0 .../java-tools/conversion-rules-database.js | 0 .../enhanced-business-logic-converter.js | 0 .../java-tools/generators/base-generator.js | 0 .../generators/business-logic-converter.js | 0 .../generators/controller-generator.js | 425 ++- .../java-tools/generators/dict-generator.js | 19 +- .../java-tools/generators/entity-generator.js | 290 ++ .../java-tools/generators/job-generator.js | 19 +- .../generators/listener-generator.js | 19 +- .../java-tools/generators/module-generator.js | 0 .../java-tools/generators/quality-gate.js | 0 .../java-tools/generators/route-generator.js | 19 +- .../generators/service-generator.js | 1520 +++++++++ .../generators/validator-generator.js | 21 +- .../java-tools/incremental-update-cli.js | 0 .../java-tools/incremental-updater.js | 0 .../java-tools/java-discovery-result.json | 0 .../java-tools/migration-coordinator.js | 365 ++- .../tools/tools-v1/migration-log.txt | 1679 ++++++++++ .../tools/tools-v1}/scripts/dev-start.sh | 0 .../tools-v1}/scripts/java-file-discovery.js | 0 .../tools-v1/scripts/php-file-discovery.js | 1330 ++++++++ .../tools-v1}/scripts/quality-assurance.js | 0 .../tools/tools-v1}/scripts/test-dict-fix.js | 0 .../tools/tools-v1}/scripts/test-fixes.js | 0 .../tools-v1}/scripts/test-incremental.js | 0 wwjcloud-nest-v1/uni-app-x/publish.cjs | 183 ++ wwjcloud-nest-v1/web/publish.cjs | 40 + wwjcloud-nest-v1/wwjcloud-web/README.md | 82 + .../{ => wwjcloud}/apps/api/src/app.module.ts | 0 .../apps/api/src/config/example.env | 0 .../apps/api/src/lang/en-US/common.json | 0 .../apps/api/src/lang/en-US/error.json | 0 .../apps/api/src/lang/en-US/user.json | 0 .../apps/api/src/lang/zh-CN/common.json | 0 .../apps/api/src/lang/zh-CN/error.json | 0 .../apps/api/src/lang/zh-CN/user.json | 0 .../{ => wwjcloud}/apps/api/src/main.ts | 0 .../apps/api/src/secure.controller.ts | 0 wwjcloud-nest-v1/wwjcloud/eslint-report.json | 1 + wwjcloud-nest-v1/wwjcloud/eslint.config.mjs | 63 + .../libs/wwjcloud-addon/src/index.ts | 0 .../libs/wwjcloud-addon/src/registry.ts | 0 .../src/wwjcloud-addon.module.ts | 0 .../{ => wwjcloud}/libs/wwjcloud-ai/README.md | 0 .../libs/wwjcloud-ai/src/events.ts | 0 .../wwjcloud-ai/src/healing/healing.module.ts | 0 .../healing/interfaces/healing.interface.ts | 0 .../healing/listeners/ai-recovery.listener.ts | 0 .../listeners/ai-self-heal.listener.ts | 0 .../healing/services/ai-recovery.service.ts | 0 .../healing/services/ai-strategy.service.ts | 0 .../healing/strategies/fallback.strategy.ts | 0 .../src/healing/strategies/retry.strategy.ts | 0 .../libs/wwjcloud-ai/src/index.ts | 0 .../bootstrap/ai-bootstrap.provider.ts | 0 .../src/manager/controllers/ai.controller.ts | 0 .../interfaces/ai-manager.interface.ts | 0 .../wwjcloud-ai/src/manager/manager.module.ts | 0 .../services/ai-coordinator.service.ts | 0 .../services/ai-orchestrator.service.ts | 0 .../manager/services/ai-registry.service.ts | 0 .../src/safe/analyzers/security.analyzer.ts | 0 .../safe/detectors/vulnerability.detector.ts | 0 .../src/safe/protectors/access.protector.ts | 0 .../libs/wwjcloud-ai/src/safe/safe.module.ts | 0 .../src/safe/services/ai-audit.service.ts | 0 .../src/safe/services/ai-security.service.ts | 0 .../src/safe/services/safe-ready.service.ts | 0 .../tuner/analyzers/performance.analyzer.ts | 0 .../src/tuner/monitors/resource.monitor.ts | 0 .../src/tuner/optimizers/cache.optimizer.ts | 0 .../src/tuner/optimizers/query.optimizer.ts | 0 .../src/tuner/services/ai-metrics.service.ts | 0 .../src/tuner/services/ai-tuner.service.ts | 0 .../src/tuner/services/tuner-ready.service.ts | 0 .../wwjcloud-ai/src/tuner/tuner.module.ts | 0 .../libs/wwjcloud-ai/src/types.ts | 0 .../wwjcloud-ai/src/wwjcloud-ai.module.ts | 0 .../libs/wwjcloud-boot/src/config/preset.ts | 0 .../wwjcloud-boot/src/config/validation.ts | 0 .../libs/wwjcloud-boot/src/index.ts | 0 .../src/infra/auth/auth-ready.service.ts | 0 .../src/infra/auth/auth.guard.ts | 0 .../src/infra/auth/auth.service.ts | 0 .../src/infra/auth/boot-auth.module.ts | 0 .../src/infra/auth/decorators.ts | 0 .../src/infra/auth/rbac.guard.ts | 0 .../src/infra/cache/boot-cache.module.ts | 0 .../src/infra/cache/cache-manager.service.ts | 0 .../src/infra/cache/cache-ready.service.ts | 0 .../src/infra/cache/cache.controller.ts | 0 .../src/infra/cache/cache.service.ts | 0 .../src/infra/cache/lock.service.ts | 0 .../src/infra/cache/redis.service.ts | 0 .../wwjcloud-boot/src/infra/cache/tokens.ts | 0 .../src/infra/events/event-bus.ts | 0 .../infra/events/event-listener.service.ts | 0 .../src/infra/health/boot-health.module.ts | 0 .../src/infra/health/health.controller.ts | 0 .../wwjcloud-boot/src/infra/http/boot-http.ts | 0 .../src/infra/http/http-exception.filter.ts | 0 .../src/infra/http/ip-filter.middleware.ts | 0 .../src/infra/http/logging.interceptor.ts | 0 .../src/infra/http/rate-limit.guard.ts | 0 .../infra/http/request-context.middleware.ts | 0 .../src/infra/http/request-context.service.ts | 0 .../src/infra/http/request-id.middleware.ts | 0 .../wwjcloud-boot/src/infra/http/swagger.ts | 0 .../wwjcloud-boot/src/infra/lang/aliases.ts | 0 .../src/infra/lang/boot-lang.module.ts | 0 .../src/infra/lang/lang-ready.service.ts | 0 .../src/infra/metrics/boot-metrics.module.ts | 0 .../src/infra/metrics/metrics.controller.ts | 0 .../src/infra/metrics/metrics.interceptor.ts | 0 .../src/infra/metrics/metrics.service.ts | 0 .../wwjcloud-boot/src/infra/metrics/tokens.ts | 0 .../src/infra/queue/boot-queue.module.ts | 0 .../src/infra/queue/job-scheduler.service.ts | 0 .../src/infra/queue/queue-ready.service.ts | 0 .../src/infra/queue/queue.controller.ts | 0 .../src/infra/queue/queue.module.ts | 0 .../src/infra/queue/queue.service.ts | 0 .../infra/resilience/http-client.service.ts | 0 .../infra/resilience/resilience.service.ts | 0 .../infra/response/response.interceptor.ts | 0 .../src/infra/startup/boot-startup.module.ts | 0 .../startup/initialize-provider.service.ts | 0 .../startup/startup-validator.service.ts | 0 .../src/infra/telemetry/telemetry.module.ts | 0 .../src/infra/tenant/boot-tenant.module.ts | 0 .../src/infra/tenant/tenant.middleware.ts | 0 .../src/infra/tenant/tenant.service.ts | 0 .../vendor/mappers/mapper-registry.service.ts | 0 .../wwjcloud-boot/src/vendor/notice/index.ts | 0 .../src/vendor/notice/notice.module.ts | 0 .../src/vendor/notice/notice.service.ts | 0 .../wwjcloud-boot/src/vendor/pay/index.ts | 0 .../src/vendor/pay/pay.module.ts | 0 .../src/vendor/pay/pay.service.ts | 0 .../pay-provider.factory.ts | 0 .../upload-provider.factory.ts | 0 .../wwjcloud-boot/src/vendor/sms/index.ts | 0 .../src/vendor/sms/sms.module.ts | 0 .../src/vendor/sms/sms.service.ts | 0 .../wwjcloud-boot/src/vendor/upload/index.ts | 0 .../src/vendor/upload/upload.module.ts | 0 .../src/vendor/upload/upload.service.ts | 0 .../src/vendor/utils/common.utils.ts | 0 .../wwjcloud-boot/src/vendor/utils/index.ts | 0 .../src/vendor/utils/string.utils.ts | 0 .../wwjcloud-boot/src/vendor/vendor.module.ts | 0 .../wwjcloud-boot/src/wwjcloud-boot.module.ts | 0 .../wwjcloud-core/src/addon/addon.module.ts | 9 + .../adminapi/addon-develop.controller.ts | 23 + .../controllers/adminapi/app.controller.ts | 23 + .../controllers/adminapi/backup.controller.ts | 23 + .../adminapi/upgrade.controller.ts | 23 + .../addon/controllers/api/addon.controller.ts | 35 + .../src/addon/dto/AddonDevelopDto.ts | 70 + .../src/addon/entity/addon-log.entity.ts | 19 + .../src/addon/entity/addon.entity.ts | 19 + .../src/addon/enums/addon-dict.enum.ts | 135 + .../services/admin/addon-develop.service.ts | 414 +++ .../src/addon/services/admin/addon.service.ts | 1871 +++++++++++ .../src/addon/services/api/addon.service.ts | 50 + .../services/core/core-addon-base.service.ts | 138 + .../services/core/core-addon-cloud.service.ts | 290 ++ .../core/core-addon-develop-build.service.ts | 385 +++ .../core-addon-develop-download.service.ts | 83 + .../core/core-addon-develop.service.ts | 192 ++ .../core/core-addon-download.service.ts | 92 + .../core/core-addon-install.service.ts | 1463 +++++++++ .../services/core/core-addon-log.service.ts | 57 + .../addon/services/core/core-addon.service.ts | 619 ++++ .../services/core/core-depend.service.ts | 182 ++ .../addon/services/core/wap-trait.service.ts | 191 ++ .../src/agreement/agreement.module.ts | 9 + .../controllers/api/agreement.controller.ts | 21 + .../services/api/agreement.service.ts | 50 + .../wwjcloud-core/src/aliapp/aliapp.module.ts | 9 + .../controllers/adminapi/config.controller.ts | 69 + .../services/admin/aliapp-config.service.ts | 113 + .../core/core-aliapp-config.service.ts | 106 + .../wwjcloud-core/src/applet/applet.module.ts | 9 + .../adminapi/site-version.controller.ts | 85 + .../adminapi/version-download.controller.ts | 37 + .../adminapi/version.controller.ts | 133 + .../entity/applet-site-version.entity.ts | 19 + .../applet/entity/applet-version.entity.ts | 19 + .../src/applet/enums/appletl-dict.enum.ts | 135 + .../services/admin/applet-download.service.ts | 52 + .../admin/applet-version-site.service.ts | 148 + .../services/admin/applet-version.service.ts | 426 +++ .../core/core-applet-download.service.ts | 129 + .../core/core-applet-site-version.service.ts | 223 ++ .../core/core-applet-version.service.ts | 105 + .../wwjcloud-core/src/auth/auth.module.ts | 9 + .../controllers/adminapi/auth.controller.ts | 133 + .../auth/services/admin/auth-site.service.ts | 227 ++ .../src/auth/services/admin/auth.service.ts | 209 ++ .../src/auth/services/admin/config.service.ts | 94 + .../src/auth/services/admin/login.service.ts | 167 + .../src/captcha/captcha.module.ts | 9 + .../captcha/services/admin/captcha.service.ts | 97 + .../captcha/services/api/captcha.service.ts | 72 + .../services/core/core-captcha-img.service.ts | 91 + .../services/core/core-captcha.service.ts | 94 + .../cash_out/enums/cash-out-type-dict.enum.ts | 135 + .../src/channel/channel.module.ts | 9 + .../controllers/adminapi/app.controller.ts | 197 ++ .../controllers/adminapi/h5.controller.ts | 53 + .../controllers/adminapi/pc.controller.ts | 53 + .../src/channel/dto/AliappDto.ts | 75 + .../wwjcloud-core/src/channel/dto/WeappDto.ts | 70 + .../src/channel/dto/WechatDto.ts | 70 + .../src/channel/enums/app-dict.enum.ts | 135 + .../src/channel/enums/cert-dict.enum.ts | 135 + .../src/channel/enums/reply-dict.enum.ts | 135 + .../src/channel/enums/wechat-dict.enum.ts | 135 + .../src/channel/services/admin/app.service.ts | 391 +++ .../src/channel/services/admin/h5.service.ts | 73 + .../src/channel/services/admin/pc.service.ts | 73 + .../services/core/core-app-cloud.service.ts | 343 ++ .../channel/services/core/core-app.service.ts | 70 + .../channel/services/core/core-h5.service.ts | 86 + .../channel/services/core/core-pc.service.ts | 52 + .../src/common/enums/channel-dict.enum.ts | 135 + .../common/enums/common-active-dict.enum.ts | 135 + .../src/common/enums/common-dict.enum.ts | 135 + .../controllers/adminapi/dict.controller.ts | 149 + .../wwjcloud-core/src/dict/dict.module.ts | 9 + .../src/dict/entity/dict.entity.ts | 19 + .../src/dict/enums/dict-service.enum.ts | 135 + .../wwjcloud-core/src/dict/enums/dict.enum.ts | 135 + .../src/dict/services/admin/dict.service.ts | 256 ++ .../controllers/adminapi/config.controller.ts | 69 + .../adminapi/diy-route.controller.ts | 85 + .../controllers/api/diy-form.controller.ts | 35 + .../src/diy/controllers/api/diy.controller.ts | 83 + .../libs/wwjcloud-core/src/diy/diy.module.ts | 9 + .../libs/wwjcloud-core/src/diy/dto/DiyDto.ts | 84 + .../wwjcloud-core/src/diy/dto/DiyFormDto.ts | 80 + .../wwjcloud-core/src/diy/dto/DiyRouteDto.ts | 79 + .../wwjcloud-core/src/diy/dto/DiyThemeDto.ts | 70 + .../src/diy/entity/diy-route.entity.ts | 19 + .../src/diy/entity/diy-theme.entity.ts | 19 + .../src/diy/entity/diy.entity.ts | 19 + .../src/diy/enums/component-dict.enum.ts | 135 + .../src/diy/enums/link-dict.enum.ts | 135 + .../src/diy/enums/pages-dict.enum.ts | 135 + .../src/diy/enums/template-dict.enum.ts | 135 + .../diy/services/admin/diy-config.service.ts | 169 + .../diy/services/admin/diy-route.service.ts | 405 +++ .../src/diy/services/admin/diy.service.ts | 1249 ++++++++ .../diy/services/api/diy-config.service.ts | 94 + .../src/diy/services/api/diy-route.service.ts | 72 + .../src/diy/services/api/diy.service.ts | 138 + .../services/core/core-diy-config.service.ts | 141 + .../src/diy/services/core/core-diy.service.ts | 60 + .../diy_form/entity/diy-form-fields.entity.ts | 19 + .../entity/diy-form-records-fields.entity.ts | 19 + .../entity/diy-form-records.entity.ts | 19 + .../entity/diy-form-submit-config.entity.ts | 19 + .../entity/diy-form-write-config.entity.ts | 19 + .../src/diy_form/entity/diy-form.entity.ts | 19 + .../src/diy_form/enums/component-dict.enum.ts | 135 + .../src/diy_form/enums/config-dict.enum.ts | 135 + .../src/diy_form/enums/template-dict.enum.ts | 135 + .../src/diy_form/enums/type-dict.enum.ts | 135 + .../adminapi/generator.controller.ts | 23 + .../src/generator/dto/GeneratorDto.ts | 70 + .../entity/generate-column.entity.ts | 19 + .../generator/entity/generate-table.entity.ts | 19 + .../src/generator/generator.module.ts | 9 + .../services/admin/generate.service.ts | 462 +++ .../controllers/adminapi/site.controller.ts | 117 + .../wwjcloud-core/src/home/home.module.ts | 9 + .../home/services/admin/auth-site.service.ts | 284 ++ .../adminapi/promotion-adv.controller.ts | 37 + .../wwjcloud-core/src/index/index.module.ts | 9 + .../core/core-promotion-adv.service.ts | 48 + .../src/lang/enums/en-dict.enum.ts | 135 + .../src/lang/enums/zh-cn-dict.enum.ts | 135 + .../adminapi/captcha.controller.ts | 23 + .../controllers/api/config.controller.ts | 21 + .../login/controllers/api/login.controller.ts | 21 + .../controllers/api/register.controller.ts | 21 + .../wwjcloud-core/src/login/login.module.ts | 9 + .../src/login/services/api/auth.service.ts | 136 + .../src/login/services/api/config.service.ts | 52 + .../src/login/services/api/login.service.ts | 929 ++++++ .../login/services/api/register.service.ts | 210 ++ .../adminapi/cash-out.controller.ts | 181 ++ .../controllers/adminapi/config.controller.ts | 181 ++ .../adminapi/member-label.controller.ts | 117 + .../adminapi/member-level.controller.ts | 117 + .../controllers/api/account.controller.ts | 35 + .../controllers/api/address.controller.ts | 99 + .../api/cash-out-account.controller.ts | 115 + .../controllers/api/level.controller.ts | 21 + .../api/member-cash-out.controller.ts | 131 + .../controllers/api/member-sign.controller.ts | 115 + .../controllers/api/member.controller.ts | 115 + .../src/member/dto/AddressDto.ts | 95 + .../src/member/dto/CashOutAccountDto.ts | 78 + .../src/member/dto/CashOutConfigDto.ts | 85 + .../src/member/dto/CashOutDto.ts | 76 + .../src/member/dto/LoginConfigDto.ts | 80 + .../src/member/dto/MemberConfigDto.ts | 64 + .../wwjcloud-core/src/member/dto/MemberDto.ts | 92 + .../src/member/dto/MemberLabelDto.ts | 73 + .../src/member/dto/MemberLevelDto.ts | 70 + .../entity/member-account-log.entity.ts | 19 + .../member/entity/member-address.entity.ts | 19 + .../entity/member-cash-out-account.entity.ts | 19 + .../member/entity/member-cash-out.entity.ts | 19 + .../src/member/entity/member-label.entity.ts | 19 + .../src/member/entity/member-level.entity.ts | 19 + .../src/member/entity/member-sign.entity.ts | 19 + .../src/member/entity/member.entity.ts | 19 + .../member/enums/account-change-type.enum.ts | 135 + .../src/member/enums/benefits.enum.ts | 135 + .../src/member/enums/gift.enum.ts | 135 + .../src/member/enums/growth-rule.enum.ts | 135 + .../member-account-change-type-dict.enum.ts | 135 + .../enums/member-account-type-dict.enum.ts | 135 + .../member/enums/member-cash-out-dict.enum.ts | 135 + .../src/member/enums/member-dict.enum.ts | 135 + .../member/enums/member-level-dict.enum.ts | 135 + .../enums/member-login-type-dict.enum.ts | 135 + .../member-register-channel-dict.enum.ts | 135 + .../enums/member-register-type-dict.enum.ts | 135 + .../src/member/enums/member-sign-dict.enum.ts | 135 + .../enums/member-sign-type-dict.enum.ts | 135 + .../src/member/enums/point-rule.enum.ts | 135 + .../wwjcloud-core/src/member/member.module.ts | 9 + .../member/services/admin/address.service.ts | 125 + .../services/admin/member-account.service.ts | 627 ++++ .../services/admin/member-cash-out.service.ts | 405 +++ .../services/admin/member-config.service.ts | 340 ++ .../services/admin/member-label.service.ts | 410 +++ .../services/admin/member-level.service.ts | 356 +++ .../services/admin/member-sign.service.ts | 111 + .../member/services/admin/member.service.ts | 635 ++++ .../member/services/api/address.service.ts | 238 ++ .../services/api/member-account.service.ts | 277 ++ .../api/member-cash-out-account.service.ts | 345 ++ .../services/api/member-cash-out.service.ts | 340 ++ .../services/api/member-config.service.ts | 54 + .../services/api/member-level.service.ts | 80 + .../member/services/api/member-log.service.ts | 52 + .../services/api/member-sign.service.ts | 653 ++++ .../src/member/services/api/member.service.ts | 388 +++ .../core/core-member-account.service.ts | 58 + .../core/core-member-address.service.ts | 199 ++ .../core-member-cash-out-account.service.ts | 49 + .../core/core-member-cash-out.service.ts | 703 +++++ .../core/core-member-config.service.ts | 563 ++++ .../core/core-member-label.service.ts | 82 + .../core/core-member-level.service.ts | 101 + .../services/core/core-member.service.ts | 398 +++ .../src/menu/enums/admin.enum.ts | 135 + .../wwjcloud-core/src/menu/enums/site.enum.ts | 135 + .../controllers/adminapi/cloud.controller.ts | 149 + .../controllers/adminapi/module.controller.ts | 117 + .../src/niucloud/dto/ModuleDto.ts | 70 + .../src/niucloud/niucloud.module.ts | 9 + .../services/admin/niucloud.service.ts | 271 ++ .../services/core/core-auth.service.ts | 50 + .../services/core/core-cloud-base.service.ts | 49 + .../services/core/core-cloud-build.service.ts | 264 ++ .../services/core/core-module.service.ts | 624 ++++ .../core/core-niucloud-config.service.ts | 53 + .../services/core/core-notify.service.ts | 54 + .../adminapi/niu-sms.controller.ts | 197 ++ .../adminapi/notice-log.controller.ts | 53 + .../controllers/adminapi/notice.controller.ts | 133 + .../adminapi/sms-log.controller.ts | 53 + .../src/notice/enums/notice-dict.enum.ts | 135 + .../src/notice/enums/notice-type-dict.enum.ts | 135 + .../src/notice/enums/notice.enum.ts | 135 + .../src/notice/enums/sms.enum.ts | 135 + .../src/notice/enums/weapp.enum.ts | 135 + .../src/notice/enums/wechat.enum.ts | 135 + .../wwjcloud-core/src/notice/notice.module.ts | 9 + .../notice/services/admin/niu-sms.service.ts | 1106 +++++++ .../services/admin/notice-log.service.ts | 71 + .../services/admin/notice-sms-log.service.ts | 71 + .../notice/services/admin/notice.service.ts | 278 ++ .../src/notice/services/admin/sms.service.ts | 83 + .../services/core/core-niu-sms.service.ts | 1307 ++++++++ .../services/core/core-notice-log.service.ts | 94 + .../core/core-notice-sms-log.service.ts | 231 ++ .../services/core/core-notice.service.ts | 132 + .../notice/services/core/core-sms.service.ts | 112 + .../notice/services/core/notice.service.ts | 53 + .../adminapi/pay-channel.controller.ts | 117 + .../adminapi/pay-refund.controller.ts | 101 + .../src/pay/controllers/api/pay.controller.ts | 35 + .../controllers/api/transfer.controller.ts | 21 + .../libs/wwjcloud-core/src/pay/dto/PayDto.ts | 110 + .../src/pay/dto/PayTemplateDto.ts | 115 + .../src/pay/entity/pay-channel.entity.ts | 19 + .../src/pay/entity/pay.entity.ts | 19 + .../src/pay/entity/refund.entity.ts | 19 + .../src/pay/entity/transfer-scene.entity.ts | 19 + .../src/pay/entity/transfer.entity.ts | 19 + .../src/pay/enums/online-pay-dict.enum.ts | 135 + .../src/pay/enums/online-refund-dict.enum.ts | 135 + .../src/pay/enums/pay-channel-dict.enum.ts | 135 + .../src/pay/enums/pay-dict.enum.ts | 135 + .../src/pay/enums/pay-scene-dict.enum.ts | 135 + .../src/pay/enums/refund-dict.enum.ts | 135 + .../src/pay/enums/transfer-dict.enum.ts | 135 + .../libs/wwjcloud-core/src/pay/pay.module.ts | 9 + .../pay/services/admin/pay-channel.service.ts | 220 ++ .../src/pay/services/admin/pay.service.ts | 713 +++++ .../src/pay/services/admin/refund.service.ts | 120 + .../pay/services/admin/transfer.service.ts | 123 + .../src/pay/services/api/pay.service.ts | 337 ++ .../src/pay/services/api/transfer.service.ts | 39 + .../services/core/core-pay-channel.service.ts | 135 + .../services/core/core-pay-event.service.ts | 442 +++ .../src/pay/services/core/core-pay.service.ts | 595 ++++ .../pay/services/core/core-refund.service.ts | 402 +++ .../core/core-transfer-scene.service.ts | 177 ++ .../services/core/core-transfer.service.ts | 441 +++ .../controllers/api/poster.controller.ts | 21 + .../src/poster/enums/component-dict.enum.ts | 135 + .../src/poster/enums/template.enum.ts | 135 + .../wwjcloud-core/src/poster/poster.module.ts | 9 + .../services/core/core-poster.service.ts | 469 +++ .../src/scan/enums/scan-dict.enum.ts | 135 + .../src/schedule/enums/schedule-dict.enum.ts | 135 + .../schedule/enums/schedule-log-dict.enum.ts | 135 + .../src/schedule/enums/schedule.enum.ts | 135 + .../adminapi/site-account.controller.ts | 85 + .../adminapi/site-group.controller.ts | 133 + .../controllers/adminapi/site.controller.ts | 277 ++ .../adminapi/user-log.controller.ts | 69 + .../controllers/adminapi/user.controller.ts | 149 + .../wwjcloud-core/src/site/dto/SiteDto.ts | 78 + .../src/site/dto/SiteGroupDto.ts | 70 + .../site/entity/site-account-log.entity.ts | 19 + .../src/site/entity/site-group.entity.ts | 19 + .../src/site/entity/site.entity.ts | 99 + .../site/enums/site-account-log-dict.enum.ts | 135 + .../src/site/enums/site-dict.enum.ts | 135 + .../admin/site-account-log.service.ts | 115 + .../site/services/admin/site-group.service.ts | 475 +++ .../site/services/admin/site-user.service.ts | 270 ++ .../src/site/services/admin/site.service.ts | 868 +++++ .../site/services/admin/user-log.service.ts | 148 + .../core/core-site-account.service.ts | 159 + .../site/services/core/core-site.service.ts | 316 ++ .../wwjcloud-core/src/site/site.module.ts | 9 + .../adminapi/site-stat.controller.ts | 37 + .../controllers/adminapi/stat.controller.ts | 37 + .../src/stat/entity/stat-hour.entity.ts | 19 + .../stat/services/admin/site-stat.service.ts | 60 + .../src/stat/services/admin/stat.service.ts | 115 + .../stat/services/core/core-stat.service.ts | 232 ++ .../wwjcloud-core/src/stat/stat.module.ts | 9 + .../adminapi/agreement.controller.ts | 69 + .../controllers/adminapi/app.controller.ts | 37 + .../controllers/adminapi/area.controller.ts | 101 + .../adminapi/attachment.controller.ts | 149 + .../adminapi/channel.controller.ts | 37 + .../controllers/adminapi/common.controller.ts | 53 + .../controllers/adminapi/config.controller.ts | 487 +++ .../controllers/adminapi/export.controller.ts | 117 + .../controllers/adminapi/menu.controller.ts | 197 ++ .../controllers/adminapi/poster.controller.ts | 213 ++ .../adminapi/printer.controller.ts | 309 ++ .../controllers/adminapi/role.controller.ts | 133 + .../adminapi/schedule-log.controller.ts | 69 + .../adminapi/schedule.controller.ts | 197 ++ .../controllers/adminapi/system.controller.ts | 181 ++ .../adminapi/ueditor.controller.ts | 53 + .../wwjcloud-core/src/sys/dto/AgreementDto.ts | 70 + .../src/sys/dto/AttachmentCategoryDto.ts | 70 + .../libs/wwjcloud-core/src/sys/dto/MenuDto.ts | 89 + .../libs/wwjcloud-core/src/sys/dto/PageDto.ts | 68 + .../wwjcloud-core/src/sys/dto/PrinterDto.ts | 95 + .../src/sys/dto/PrinterTemplateDto.ts | 70 + .../libs/wwjcloud-core/src/sys/dto/RoleDto.ts | 65 + .../wwjcloud-core/src/sys/dto/ScheduleDto.ts | 65 + .../libs/wwjcloud-core/src/sys/dto/UserDto.ts | 75 + .../src/sys/entity/app-version.entity.ts | 19 + .../src/sys/entity/niu-sms-template.entity.ts | 19 + .../src/sys/entity/poster.entity.ts | 19 + .../src/sys/entity/sys-agreement.entity.ts | 19 + .../src/sys/entity/sys-area.entity.ts | 19 + .../entity/sys-attachment-category.entity.ts | 19 + .../src/sys/entity/sys-attachment.entity.ts | 19 + .../sys/entity/sys-backup-records.entity.ts | 19 + .../src/sys/entity/sys-config.entity.ts | 86 + .../src/sys/entity/sys-export.entity.ts | 19 + .../src/sys/entity/sys-menu.entity.ts | 19 + .../src/sys/entity/sys-notice-log.entity.ts | 19 + .../sys/entity/sys-notice-sms-log.entity.ts | 19 + .../src/sys/entity/sys-notice.entity.ts | 19 + .../sys/entity/sys-printer-template.entity.ts | 19 + .../src/sys/entity/sys-printer.entity.ts | 19 + .../src/sys/entity/sys-role.entity.ts | 19 + .../src/sys/entity/sys-schedule-log.entity.ts | 19 + .../src/sys/entity/sys-schedule.entity.ts | 19 + .../sys/entity/sys-upgrade-records.entity.ts | 19 + .../src/sys/entity/sys-user-log.entity.ts | 19 + .../src/sys/entity/sys-user-role.entity.ts | 19 + .../src/sys/entity/sys-user.entity.ts | 19 + .../entity/user-create-site-limit.entity.ts | 19 + .../wx-oplatfrom-weapp-version.entity.ts | 19 + .../src/sys/enums/agreement-dict.enum.ts | 135 + .../src/sys/enums/app-type-dict.enum.ts | 135 + .../src/sys/enums/backup-dict.enum.ts | 135 + .../src/sys/enums/cloud-dict.enum.ts | 135 + .../src/sys/enums/config-key-dict.enum.ts | 135 + .../src/sys/enums/date-dict.enum.ts | 135 + .../src/sys/enums/export-dict.enum.ts | 135 + .../src/sys/enums/file-dict.enum.ts | 135 + .../src/sys/enums/menu-dict.enum.ts | 135 + .../src/sys/enums/menu-type-dict.enum.ts | 135 + .../src/sys/enums/method-dict.enum.ts | 135 + .../src/sys/enums/poster-dict.enum.ts | 135 + .../src/sys/enums/printer-dict.enum.ts | 135 + .../src/sys/enums/role-status-dict.enum.ts | 135 + .../src/sys/enums/sms-dict.enum.ts | 135 + .../src/sys/enums/storage-dict.enum.ts | 135 + .../src/sys/enums/upgrade-dict.enum.ts | 135 + .../src/sys/enums/user-dict.enum.ts | 135 + .../src/sys/enums/wechat-media-dict.enum.ts | 135 + .../src/sys/enums/wx-oplatform.enum.ts | 135 + .../sys/services/admin/agreement.service.ts | 90 + .../src/sys/services/admin/app.service.ts | 60 + .../src/sys/services/admin/area.service.ts | 189 ++ .../sys/services/admin/attachment.service.ts | 655 ++++ .../src/sys/services/admin/config.service.ts | 522 +++ .../src/sys/services/admin/export.service.ts | 253 ++ .../src/sys/services/admin/menu.service.ts | 677 ++++ .../src/sys/services/admin/poster.service.ts | 720 +++++ .../admin/printer-template.service.ts | 410 +++ .../src/sys/services/admin/printer.service.ts | 617 ++++ .../src/sys/services/admin/role.service.ts | 464 +++ .../src/sys/services/admin/system.service.ts | 637 ++++ .../services/core/core-agreement.service.ts | 130 + .../sys/services/core/core-area.service.ts | 181 ++ .../services/core/core-attachment.service.ts | 244 ++ .../sys/services/core/core-config.service.ts | 98 + .../sys/services/core/core-export.service.ts | 240 ++ .../services/core/core-sys-config.service.ts | 134 + .../libs/wwjcloud-core/src/sys/sys.module.ts | 9 + .../services/admin/backup-records.service.ts | 967 ++++++ .../upgrade/services/admin/backup.service.ts | 68 + .../admin/execute-sql-trait.service.ts | 75 + .../upgrade/services/admin/restore.service.ts | 39 + .../services/admin/upgrade-records.service.ts | 320 ++ .../upgrade/services/admin/upgrade.service.ts | 721 +++++ .../src/upgrade/upgrade.module.ts | 9 + .../adminapi/storage.controller.ts | 23 + .../controllers/api/upload.controller.ts | 21 + .../services/admin/storage-config.service.ts | 98 + .../services/admin/upload-config.service.ts | 79 + .../upload/services/admin/upload.service.ts | 180 ++ .../src/upload/services/api/base64.service.ts | 53 + .../src/upload/services/api/fetch.service.ts | 53 + .../src/upload/services/api/upload.service.ts | 125 + .../services/core/core-base64.service.ts | 57 + .../services/core/core-fetch.service.ts | 60 + .../upload/services/core/core-file.service.ts | 200 ++ .../services/core/core-image.service.ts | 65 + .../services/core/core-storage.service.ts | 159 + .../core/core-upload-config.service.ts | 77 + .../services/core/core-upload.service.ts | 225 ++ .../wwjcloud-core/src/upload/upload.module.ts | 9 + .../controllers/adminapi/user.controller.ts | 229 ++ .../user/services/admin/user-role.service.ts | 177 ++ .../src/user/services/admin/user.service.ts | 611 ++++ .../wwjcloud-core/src/user/user.module.ts | 9 + .../adminapi/verifier.controller.ts | 133 + .../controllers/adminapi/verify.controller.ts | 85 + .../src/verify/entity/verifier.entity.ts | 19 + .../src/verify/entity/verify.entity.ts | 19 + .../src/verify/enums/verify-dict.enum.ts | 135 + .../verify/services/admin/verifier.service.ts | 174 + .../verify/services/admin/verify.service.ts | 120 + .../services/core/core-verify.service.ts | 332 ++ .../wwjcloud-core/src/verify/verify.module.ts | 9 + .../controllers/adminapi/config.controller.ts | 101 + .../adminapi/delivery.controller.ts | 37 + .../adminapi/package.controller.ts | 23 + .../adminapi/template.controller.ts | 53 + .../adminapi/version.controller.ts | 85 + .../weapp/controllers/api/serve.controller.ts | 21 + .../weapp/controllers/api/weapp.controller.ts | 21 + .../src/weapp/entity/weapp-version.entity.ts | 19 + .../services/admin/weapp-config.service.ts | 146 + .../services/admin/weapp-delivery.service.ts | 51 + .../services/admin/weapp-package.service.ts | 51 + .../services/admin/weapp-template.service.ts | 102 + .../services/admin/weapp-version.service.ts | 231 ++ .../weapp/services/api/weapp-auth.service.ts | 168 + .../services/api/weapp-delivery.service.ts | 69 + .../weapp/services/api/weapp-serve.service.ts | 50 + .../services/core/core-weapp-auth.service.ts | 95 + .../services/core/core-weapp-cloud.service.ts | 328 ++ .../core/core-weapp-config.service.ts | 190 ++ .../core/core-weapp-delivery.service.ts | 455 +++ .../services/core/core-weapp-serve.service.ts | 49 + .../core/core-weapp-template.service.ts | 141 + .../weapp/services/core/core-weapp.service.ts | 121 + .../wwjcloud-core/src/weapp/weapp.module.ts | 9 + .../controllers/adminapi/config.controller.ts | 69 + .../controllers/adminapi/media.controller.ts | 85 + .../controllers/adminapi/menu.controller.ts | 53 + .../controllers/adminapi/reply.controller.ts | 165 + .../adminapi/template.controller.ts | 53 + .../controllers/api/serve.controller.ts | 21 + .../controllers/api/wechat.controller.ts | 21 + .../src/wechat/entity/wechat-fans.entity.ts | 19 + .../src/wechat/entity/wechat-media.entity.ts | 19 + .../src/wechat/entity/wechat-reply.entity.ts | 19 + .../services/admin/wechat-config.service.ts | 79 + .../services/admin/wechat-event.service.ts | 50 + .../services/admin/wechat-fans.service.ts | 39 + .../services/admin/wechat-media.service.ts | 214 ++ .../services/admin/wechat-menu.service.ts | 89 + .../services/admin/wechat-reply.service.ts | 466 +++ .../services/admin/wechat-template.service.ts | 100 + .../wechat/services/api/wechat-app.service.ts | 162 + .../services/api/wechat-auth.service.ts | 367 +++ .../services/api/wechat-serve.service.ts | 50 + .../services/core/core-wechat-api.service.ts | 132 + .../services/core/core-wechat-app.service.ts | 122 + .../core/core-wechat-config.service.ts | 264 ++ .../services/core/core-wechat-fans.service.ts | 242 ++ .../core/core-wechat-media.service.ts | 92 + .../core/core-wechat-message.service.ts | 161 + .../core/core-wechat-reply.service.ts | 549 ++++ .../core/core-wechat-serve.service.ts | 178 ++ .../core/core-wechat-template.service.ts | 110 + .../services/core/core-wechat.service.ts | 344 ++ .../wwjcloud-core/src/wechat/wechat.module.ts | 9 + .../controllers/adminapi/config.controller.ts | 69 + .../adminapi/oplatform.controller.ts | 69 + .../controllers/adminapi/server.controller.ts | 23 + .../adminapi/weapp-version.controller.ts | 133 + .../admin/oplatform-config.service.ts | 79 + .../admin/oplatform-server.service.ts | 129 + .../services/admin/oplatform.service.ts | 217 ++ .../services/admin/weapp-version.service.ts | 478 +++ .../core/core-oplatform-config.service.ts | 145 + .../services/core/core-oplatform.service.ts | 2809 +++++++++++++++++ .../src/wxoplatform/wxoplatform.module.ts | 9 + wwjcloud-nest-v1/wwjcloud/nest-cli.json | 42 + wwjcloud-nest-v1/wwjcloud/package.json | 102 + .../ai-layer/ai-coordinator.service.spec.ts | 0 .../src/ai-layer/ai-security.service.spec.ts | 0 .../src/ai-layer/performance.analyzer.spec.ts | 0 .../src/ai-layer/resource-monitor.spec.ts | 0 .../src/ai-layer/resource.monitor.spec.ts | 0 .../src/ai-layer/safe-ready.service.spec.ts | 0 .../src/ai-layer/tuner-ready.service.spec.ts | 0 .../{ => wwjcloud}/src/app.controller.spec.ts | 0 .../{ => wwjcloud}/src/app.controller.ts | 0 .../{ => wwjcloud}/src/app.e2e-spec.ts | 0 .../{ => wwjcloud}/src/app.module.ts | 0 .../{ => wwjcloud}/src/app.service.ts | 0 .../src/boot-layer/auth-ready.service.spec.ts | 0 .../boot-layer/cache-ready.service.spec.ts | 0 .../src/boot-layer/i18n-ready.service.spec.ts | 0 .../src/boot-layer/lang-ready.service.spec.ts | 0 .../src/boot-layer/metrics.service.spec.ts | 0 .../boot-layer/queue-ready.service.spec.ts | 0 .../startup-validator.service.spec.ts | 0 wwjcloud-nest-v1/{ => wwjcloud}/src/main.ts | 0 .../{ => wwjcloud}/test/app.e2e-spec.ts | 0 .../{ => wwjcloud}/test/jest-e2e.json | 0 .../{ => wwjcloud}/test/testing-preset.ts | 0 wwjcloud-nest-v1/wwjcloud/tsconfig.build.json | 19 + wwjcloud-nest-v1/wwjcloud/tsconfig.json | 53 + 715 files changed, 88110 insertions(+), 1496 deletions(-) delete mode 100644 tools-v1/java-tools/generators/entity-generator.js delete mode 100644 tools-v1/java-tools/generators/service-generator.js delete mode 100644 wwjcloud-nest-v1/.gitignore delete mode 100644 wwjcloud-nest-v1/.prettierrc create mode 100644 wwjcloud-nest-v1/admin/Dockerfile create mode 100644 wwjcloud-nest-v1/application-boot.json create mode 100644 wwjcloud-nest-v1/docker/k6/full_test.js create mode 100644 wwjcloud-nest-v1/docker/k6/summary-full-test.json create mode 100644 wwjcloud-nest-v1/eslint-report.json create mode 100644 wwjcloud-nest-v1/startup-check.report.json create mode 100644 wwjcloud-nest-v1/tmp-dist/boot-lang.module.js create mode 100644 wwjcloud-nest-v1/tools/tools-uni/README.md create mode 100644 wwjcloud-nest-v1/tools/tools-uni/generators/config-generator.js create mode 100644 wwjcloud-nest-v1/tools/tools-uni/generators/script-transformer.js create mode 100644 wwjcloud-nest-v1/tools/tools-uni/generators/style-transformer.js create mode 100644 wwjcloud-nest-v1/tools/tools-uni/generators/template-transformer.js create mode 100755 wwjcloud-nest-v1/tools/tools-uni/migration-coordinator.js create mode 100644 wwjcloud-nest-v1/tools/tools-uni/utils/analysis-utils.js create mode 100644 wwjcloud-nest-v1/tools/tools-uni/utils/file-utils.js rename {tools-v1 => wwjcloud-nest-v1/tools/tools-v1}/QUICK-START.md (100%) rename {tools-v1 => wwjcloud-nest-v1/tools/tools-v1}/README.md (100%) rename {tools-v1 => wwjcloud-nest-v1/tools/tools-v1}/env/apps-api.development.example (100%) rename {tools-v1 => wwjcloud-nest-v1/tools/tools-v1}/env/apps-api.feature-all.env (100%) rename {tools-v1 => wwjcloud-nest-v1/tools/tools-v1}/env/apps-api.production.example (100%) rename {tools-v1 => wwjcloud-nest-v1/tools/tools-v1}/java-tools/.incremental-state.json (100%) rename {tools-v1 => wwjcloud-nest-v1/tools/tools-v1}/java-tools/INFRASTRUCTURE-USAGE-GUIDE.md (100%) rename {tools-v1 => wwjcloud-nest-v1/tools/tools-v1}/java-tools/MIGRATION-RULES.md (100%) rename {tools-v1 => wwjcloud-nest-v1/tools/tools-v1}/java-tools/QUICK-START.md (100%) rename {tools-v1 => wwjcloud-nest-v1/tools/tools-v1}/java-tools/README.md (100%) rename {tools-v1 => wwjcloud-nest-v1/tools/tools-v1}/java-tools/context-aware-converter.js (100%) rename {tools-v1 => wwjcloud-nest-v1/tools/tools-v1}/java-tools/conversion-pipeline.js (100%) rename {tools-v1 => wwjcloud-nest-v1/tools/tools-v1}/java-tools/conversion-rules-database.js (100%) rename {tools-v1 => wwjcloud-nest-v1/tools/tools-v1}/java-tools/enhanced-business-logic-converter.js (100%) rename {tools-v1 => wwjcloud-nest-v1/tools/tools-v1}/java-tools/generators/base-generator.js (100%) rename {tools-v1 => wwjcloud-nest-v1/tools/tools-v1}/java-tools/generators/business-logic-converter.js (100%) rename {tools-v1 => wwjcloud-nest-v1/tools/tools-v1}/java-tools/generators/controller-generator.js (66%) rename {tools-v1 => wwjcloud-nest-v1/tools/tools-v1}/java-tools/generators/dict-generator.js (92%) create mode 100644 wwjcloud-nest-v1/tools/tools-v1/java-tools/generators/entity-generator.js rename {tools-v1 => wwjcloud-nest-v1/tools/tools-v1}/java-tools/generators/job-generator.js (92%) rename {tools-v1 => wwjcloud-nest-v1/tools/tools-v1}/java-tools/generators/listener-generator.js (93%) rename {tools-v1 => wwjcloud-nest-v1/tools/tools-v1}/java-tools/generators/module-generator.js (100%) rename {tools-v1 => wwjcloud-nest-v1/tools/tools-v1}/java-tools/generators/quality-gate.js (100%) rename {tools-v1 => wwjcloud-nest-v1/tools/tools-v1}/java-tools/generators/route-generator.js (86%) create mode 100644 wwjcloud-nest-v1/tools/tools-v1/java-tools/generators/service-generator.js rename {tools-v1 => wwjcloud-nest-v1/tools/tools-v1}/java-tools/generators/validator-generator.js (94%) rename {tools-v1 => wwjcloud-nest-v1/tools/tools-v1}/java-tools/incremental-update-cli.js (100%) rename {tools-v1 => wwjcloud-nest-v1/tools/tools-v1}/java-tools/incremental-updater.js (100%) rename {tools-v1 => wwjcloud-nest-v1/tools/tools-v1}/java-tools/java-discovery-result.json (100%) rename {tools-v1 => wwjcloud-nest-v1/tools/tools-v1}/java-tools/migration-coordinator.js (73%) create mode 100644 wwjcloud-nest-v1/tools/tools-v1/migration-log.txt rename {tools-v1 => wwjcloud-nest-v1/tools/tools-v1}/scripts/dev-start.sh (100%) rename {tools-v1 => wwjcloud-nest-v1/tools/tools-v1}/scripts/java-file-discovery.js (100%) create mode 100644 wwjcloud-nest-v1/tools/tools-v1/scripts/php-file-discovery.js rename {tools-v1 => wwjcloud-nest-v1/tools/tools-v1}/scripts/quality-assurance.js (100%) rename {tools-v1 => wwjcloud-nest-v1/tools/tools-v1}/scripts/test-dict-fix.js (100%) rename {tools-v1 => wwjcloud-nest-v1/tools/tools-v1}/scripts/test-fixes.js (100%) rename {tools-v1 => wwjcloud-nest-v1/tools/tools-v1}/scripts/test-incremental.js (100%) create mode 100644 wwjcloud-nest-v1/uni-app-x/publish.cjs create mode 100644 wwjcloud-nest-v1/web/publish.cjs create mode 100644 wwjcloud-nest-v1/wwjcloud-web/README.md rename wwjcloud-nest-v1/{ => wwjcloud}/apps/api/src/app.module.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/apps/api/src/config/example.env (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/apps/api/src/lang/en-US/common.json (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/apps/api/src/lang/en-US/error.json (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/apps/api/src/lang/en-US/user.json (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/apps/api/src/lang/zh-CN/common.json (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/apps/api/src/lang/zh-CN/error.json (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/apps/api/src/lang/zh-CN/user.json (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/apps/api/src/main.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/apps/api/src/secure.controller.ts (100%) create mode 100644 wwjcloud-nest-v1/wwjcloud/eslint-report.json create mode 100644 wwjcloud-nest-v1/wwjcloud/eslint.config.mjs rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-addon/src/index.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-addon/src/registry.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-addon/src/wwjcloud-addon.module.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-ai/README.md (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-ai/src/events.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-ai/src/healing/healing.module.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-ai/src/healing/interfaces/healing.interface.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-ai/src/healing/listeners/ai-recovery.listener.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-ai/src/healing/listeners/ai-self-heal.listener.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-ai/src/healing/services/ai-recovery.service.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-ai/src/healing/services/ai-strategy.service.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-ai/src/healing/strategies/fallback.strategy.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-ai/src/healing/strategies/retry.strategy.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-ai/src/index.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-ai/src/manager/bootstrap/ai-bootstrap.provider.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-ai/src/manager/controllers/ai.controller.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-ai/src/manager/interfaces/ai-manager.interface.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-ai/src/manager/manager.module.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-ai/src/manager/services/ai-coordinator.service.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-ai/src/manager/services/ai-orchestrator.service.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-ai/src/manager/services/ai-registry.service.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-ai/src/safe/analyzers/security.analyzer.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-ai/src/safe/detectors/vulnerability.detector.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-ai/src/safe/protectors/access.protector.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-ai/src/safe/safe.module.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-ai/src/safe/services/ai-audit.service.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-ai/src/safe/services/ai-security.service.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-ai/src/safe/services/safe-ready.service.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-ai/src/tuner/analyzers/performance.analyzer.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-ai/src/tuner/monitors/resource.monitor.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-ai/src/tuner/optimizers/cache.optimizer.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-ai/src/tuner/optimizers/query.optimizer.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-ai/src/tuner/services/ai-metrics.service.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-ai/src/tuner/services/ai-tuner.service.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-ai/src/tuner/services/tuner-ready.service.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-ai/src/tuner/tuner.module.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-ai/src/types.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-ai/src/wwjcloud-ai.module.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-boot/src/config/preset.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-boot/src/config/validation.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-boot/src/index.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-boot/src/infra/auth/auth-ready.service.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-boot/src/infra/auth/auth.guard.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-boot/src/infra/auth/auth.service.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-boot/src/infra/auth/boot-auth.module.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-boot/src/infra/auth/decorators.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-boot/src/infra/auth/rbac.guard.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-boot/src/infra/cache/boot-cache.module.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-boot/src/infra/cache/cache-manager.service.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-boot/src/infra/cache/cache-ready.service.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-boot/src/infra/cache/cache.controller.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-boot/src/infra/cache/cache.service.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-boot/src/infra/cache/lock.service.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-boot/src/infra/cache/redis.service.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-boot/src/infra/cache/tokens.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-boot/src/infra/events/event-bus.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-boot/src/infra/events/event-listener.service.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-boot/src/infra/health/boot-health.module.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-boot/src/infra/health/health.controller.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-boot/src/infra/http/boot-http.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-boot/src/infra/http/http-exception.filter.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-boot/src/infra/http/ip-filter.middleware.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-boot/src/infra/http/logging.interceptor.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-boot/src/infra/http/rate-limit.guard.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-boot/src/infra/http/request-context.middleware.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-boot/src/infra/http/request-context.service.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-boot/src/infra/http/request-id.middleware.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-boot/src/infra/http/swagger.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-boot/src/infra/lang/aliases.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-boot/src/infra/lang/boot-lang.module.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-boot/src/infra/lang/lang-ready.service.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-boot/src/infra/metrics/boot-metrics.module.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-boot/src/infra/metrics/metrics.controller.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-boot/src/infra/metrics/metrics.interceptor.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-boot/src/infra/metrics/metrics.service.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-boot/src/infra/metrics/tokens.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-boot/src/infra/queue/boot-queue.module.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-boot/src/infra/queue/job-scheduler.service.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-boot/src/infra/queue/queue-ready.service.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-boot/src/infra/queue/queue.controller.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-boot/src/infra/queue/queue.module.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-boot/src/infra/queue/queue.service.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-boot/src/infra/resilience/http-client.service.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-boot/src/infra/resilience/resilience.service.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-boot/src/infra/response/response.interceptor.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-boot/src/infra/startup/boot-startup.module.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-boot/src/infra/startup/initialize-provider.service.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-boot/src/infra/startup/startup-validator.service.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-boot/src/infra/telemetry/telemetry.module.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-boot/src/infra/tenant/boot-tenant.module.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-boot/src/infra/tenant/tenant.middleware.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-boot/src/infra/tenant/tenant.service.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-boot/src/vendor/mappers/mapper-registry.service.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-boot/src/vendor/notice/index.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-boot/src/vendor/notice/notice.module.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-boot/src/vendor/notice/notice.service.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-boot/src/vendor/pay/index.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-boot/src/vendor/pay/pay.module.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-boot/src/vendor/pay/pay.service.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-boot/src/vendor/provider-factories/pay-provider.factory.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-boot/src/vendor/provider-factories/upload-provider.factory.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-boot/src/vendor/sms/index.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-boot/src/vendor/sms/sms.module.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-boot/src/vendor/sms/sms.service.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-boot/src/vendor/upload/index.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-boot/src/vendor/upload/upload.module.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-boot/src/vendor/upload/upload.service.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-boot/src/vendor/utils/common.utils.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-boot/src/vendor/utils/index.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-boot/src/vendor/utils/string.utils.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-boot/src/vendor/vendor.module.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/libs/wwjcloud-boot/src/wwjcloud-boot.module.ts (100%) create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/addon/addon.module.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/addon/controllers/adminapi/addon-develop.controller.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/addon/controllers/adminapi/app.controller.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/addon/controllers/adminapi/backup.controller.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/addon/controllers/adminapi/upgrade.controller.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/addon/controllers/api/addon.controller.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/addon/dto/AddonDevelopDto.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/addon/entity/addon-log.entity.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/addon/entity/addon.entity.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/addon/enums/addon-dict.enum.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/addon/services/admin/addon-develop.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/addon/services/admin/addon.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/addon/services/api/addon.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/addon/services/core/core-addon-base.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/addon/services/core/core-addon-cloud.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/addon/services/core/core-addon-develop-build.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/addon/services/core/core-addon-develop-download.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/addon/services/core/core-addon-develop.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/addon/services/core/core-addon-download.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/addon/services/core/core-addon-install.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/addon/services/core/core-addon-log.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/addon/services/core/core-addon.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/addon/services/core/core-depend.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/addon/services/core/wap-trait.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/agreement/agreement.module.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/agreement/controllers/api/agreement.controller.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/agreement/services/api/agreement.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/aliapp/aliapp.module.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/aliapp/controllers/adminapi/config.controller.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/aliapp/services/admin/aliapp-config.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/aliapp/services/core/core-aliapp-config.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/applet/applet.module.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/applet/controllers/adminapi/site-version.controller.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/applet/controllers/adminapi/version-download.controller.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/applet/controllers/adminapi/version.controller.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/applet/entity/applet-site-version.entity.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/applet/entity/applet-version.entity.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/applet/enums/appletl-dict.enum.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/applet/services/admin/applet-download.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/applet/services/admin/applet-version-site.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/applet/services/admin/applet-version.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/applet/services/core/core-applet-download.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/applet/services/core/core-applet-site-version.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/applet/services/core/core-applet-version.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/auth/auth.module.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/auth/controllers/adminapi/auth.controller.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/auth/services/admin/auth-site.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/auth/services/admin/auth.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/auth/services/admin/config.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/auth/services/admin/login.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/captcha/captcha.module.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/captcha/services/admin/captcha.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/captcha/services/api/captcha.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/captcha/services/core/core-captcha-img.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/captcha/services/core/core-captcha.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/cash_out/enums/cash-out-type-dict.enum.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/channel/channel.module.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/channel/controllers/adminapi/app.controller.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/channel/controllers/adminapi/h5.controller.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/channel/controllers/adminapi/pc.controller.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/channel/dto/AliappDto.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/channel/dto/WeappDto.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/channel/dto/WechatDto.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/channel/enums/app-dict.enum.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/channel/enums/cert-dict.enum.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/channel/enums/reply-dict.enum.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/channel/enums/wechat-dict.enum.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/channel/services/admin/app.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/channel/services/admin/h5.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/channel/services/admin/pc.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/channel/services/core/core-app-cloud.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/channel/services/core/core-app.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/channel/services/core/core-h5.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/channel/services/core/core-pc.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/common/enums/channel-dict.enum.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/common/enums/common-active-dict.enum.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/common/enums/common-dict.enum.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/dict/controllers/adminapi/dict.controller.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/dict/dict.module.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/dict/entity/dict.entity.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/dict/enums/dict-service.enum.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/dict/enums/dict.enum.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/dict/services/admin/dict.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/diy/controllers/adminapi/config.controller.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/diy/controllers/adminapi/diy-route.controller.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/diy/controllers/api/diy-form.controller.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/diy/controllers/api/diy.controller.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/diy/diy.module.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/diy/dto/DiyDto.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/diy/dto/DiyFormDto.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/diy/dto/DiyRouteDto.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/diy/dto/DiyThemeDto.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/diy/entity/diy-route.entity.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/diy/entity/diy-theme.entity.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/diy/entity/diy.entity.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/diy/enums/component-dict.enum.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/diy/enums/link-dict.enum.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/diy/enums/pages-dict.enum.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/diy/enums/template-dict.enum.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/diy/services/admin/diy-config.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/diy/services/admin/diy-route.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/diy/services/admin/diy.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/diy/services/api/diy-config.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/diy/services/api/diy-route.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/diy/services/api/diy.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/diy/services/core/core-diy-config.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/diy/services/core/core-diy.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/diy_form/entity/diy-form-fields.entity.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/diy_form/entity/diy-form-records-fields.entity.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/diy_form/entity/diy-form-records.entity.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/diy_form/entity/diy-form-submit-config.entity.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/diy_form/entity/diy-form-write-config.entity.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/diy_form/entity/diy-form.entity.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/diy_form/enums/component-dict.enum.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/diy_form/enums/config-dict.enum.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/diy_form/enums/template-dict.enum.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/diy_form/enums/type-dict.enum.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/generator/controllers/adminapi/generator.controller.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/generator/dto/GeneratorDto.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/generator/entity/generate-column.entity.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/generator/entity/generate-table.entity.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/generator/generator.module.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/generator/services/admin/generate.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/home/controllers/adminapi/site.controller.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/home/home.module.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/home/services/admin/auth-site.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/index/controllers/adminapi/promotion-adv.controller.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/index/index.module.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/index/services/core/core-promotion-adv.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/lang/enums/en-dict.enum.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/lang/enums/zh-cn-dict.enum.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/login/controllers/adminapi/captcha.controller.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/login/controllers/api/config.controller.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/login/controllers/api/login.controller.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/login/controllers/api/register.controller.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/login/login.module.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/login/services/api/auth.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/login/services/api/config.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/login/services/api/login.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/login/services/api/register.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/member/controllers/adminapi/cash-out.controller.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/member/controllers/adminapi/config.controller.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/member/controllers/adminapi/member-label.controller.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/member/controllers/adminapi/member-level.controller.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/member/controllers/api/account.controller.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/member/controllers/api/address.controller.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/member/controllers/api/cash-out-account.controller.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/member/controllers/api/level.controller.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/member/controllers/api/member-cash-out.controller.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/member/controllers/api/member-sign.controller.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/member/controllers/api/member.controller.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/member/dto/AddressDto.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/member/dto/CashOutAccountDto.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/member/dto/CashOutConfigDto.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/member/dto/CashOutDto.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/member/dto/LoginConfigDto.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/member/dto/MemberConfigDto.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/member/dto/MemberDto.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/member/dto/MemberLabelDto.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/member/dto/MemberLevelDto.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/member/entity/member-account-log.entity.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/member/entity/member-address.entity.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/member/entity/member-cash-out-account.entity.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/member/entity/member-cash-out.entity.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/member/entity/member-label.entity.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/member/entity/member-level.entity.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/member/entity/member-sign.entity.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/member/entity/member.entity.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/member/enums/account-change-type.enum.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/member/enums/benefits.enum.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/member/enums/gift.enum.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/member/enums/growth-rule.enum.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/member/enums/member-account-change-type-dict.enum.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/member/enums/member-account-type-dict.enum.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/member/enums/member-cash-out-dict.enum.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/member/enums/member-dict.enum.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/member/enums/member-level-dict.enum.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/member/enums/member-login-type-dict.enum.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/member/enums/member-register-channel-dict.enum.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/member/enums/member-register-type-dict.enum.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/member/enums/member-sign-dict.enum.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/member/enums/member-sign-type-dict.enum.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/member/enums/point-rule.enum.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/member/member.module.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/member/services/admin/address.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/member/services/admin/member-account.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/member/services/admin/member-cash-out.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/member/services/admin/member-config.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/member/services/admin/member-label.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/member/services/admin/member-level.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/member/services/admin/member-sign.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/member/services/admin/member.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/member/services/api/address.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/member/services/api/member-account.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/member/services/api/member-cash-out-account.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/member/services/api/member-cash-out.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/member/services/api/member-config.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/member/services/api/member-level.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/member/services/api/member-log.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/member/services/api/member-sign.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/member/services/api/member.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/member/services/core/core-member-account.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/member/services/core/core-member-address.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/member/services/core/core-member-cash-out-account.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/member/services/core/core-member-cash-out.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/member/services/core/core-member-config.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/member/services/core/core-member-label.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/member/services/core/core-member-level.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/member/services/core/core-member.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/menu/enums/admin.enum.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/menu/enums/site.enum.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/niucloud/controllers/adminapi/cloud.controller.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/niucloud/controllers/adminapi/module.controller.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/niucloud/dto/ModuleDto.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/niucloud/niucloud.module.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/niucloud/services/admin/niucloud.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/niucloud/services/core/core-auth.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/niucloud/services/core/core-cloud-base.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/niucloud/services/core/core-cloud-build.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/niucloud/services/core/core-module.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/niucloud/services/core/core-niucloud-config.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/niucloud/services/core/core-notify.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/notice/controllers/adminapi/niu-sms.controller.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/notice/controllers/adminapi/notice-log.controller.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/notice/controllers/adminapi/notice.controller.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/notice/controllers/adminapi/sms-log.controller.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/notice/enums/notice-dict.enum.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/notice/enums/notice-type-dict.enum.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/notice/enums/notice.enum.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/notice/enums/sms.enum.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/notice/enums/weapp.enum.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/notice/enums/wechat.enum.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/notice/notice.module.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/notice/services/admin/niu-sms.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/notice/services/admin/notice-log.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/notice/services/admin/notice-sms-log.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/notice/services/admin/notice.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/notice/services/admin/sms.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/notice/services/core/core-niu-sms.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/notice/services/core/core-notice-log.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/notice/services/core/core-notice-sms-log.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/notice/services/core/core-notice.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/notice/services/core/core-sms.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/notice/services/core/notice.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/pay/controllers/adminapi/pay-channel.controller.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/pay/controllers/adminapi/pay-refund.controller.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/pay/controllers/api/pay.controller.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/pay/controllers/api/transfer.controller.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/pay/dto/PayDto.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/pay/dto/PayTemplateDto.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/pay/entity/pay-channel.entity.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/pay/entity/pay.entity.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/pay/entity/refund.entity.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/pay/entity/transfer-scene.entity.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/pay/entity/transfer.entity.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/pay/enums/online-pay-dict.enum.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/pay/enums/online-refund-dict.enum.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/pay/enums/pay-channel-dict.enum.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/pay/enums/pay-dict.enum.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/pay/enums/pay-scene-dict.enum.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/pay/enums/refund-dict.enum.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/pay/enums/transfer-dict.enum.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/pay/pay.module.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/pay/services/admin/pay-channel.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/pay/services/admin/pay.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/pay/services/admin/refund.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/pay/services/admin/transfer.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/pay/services/api/pay.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/pay/services/api/transfer.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/pay/services/core/core-pay-channel.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/pay/services/core/core-pay-event.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/pay/services/core/core-pay.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/pay/services/core/core-refund.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/pay/services/core/core-transfer-scene.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/pay/services/core/core-transfer.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/poster/controllers/api/poster.controller.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/poster/enums/component-dict.enum.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/poster/enums/template.enum.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/poster/poster.module.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/poster/services/core/core-poster.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/scan/enums/scan-dict.enum.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/schedule/enums/schedule-dict.enum.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/schedule/enums/schedule-log-dict.enum.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/schedule/enums/schedule.enum.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/site/controllers/adminapi/site-account.controller.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/site/controllers/adminapi/site-group.controller.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/site/controllers/adminapi/site.controller.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/site/controllers/adminapi/user-log.controller.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/site/controllers/adminapi/user.controller.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/site/dto/SiteDto.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/site/dto/SiteGroupDto.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/site/entity/site-account-log.entity.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/site/entity/site-group.entity.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/site/entity/site.entity.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/site/enums/site-account-log-dict.enum.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/site/enums/site-dict.enum.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/site/services/admin/site-account-log.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/site/services/admin/site-group.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/site/services/admin/site-user.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/site/services/admin/site.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/site/services/admin/user-log.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/site/services/core/core-site-account.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/site/services/core/core-site.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/site/site.module.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/stat/controllers/adminapi/site-stat.controller.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/stat/controllers/adminapi/stat.controller.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/stat/entity/stat-hour.entity.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/stat/services/admin/site-stat.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/stat/services/admin/stat.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/stat/services/core/core-stat.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/stat/stat.module.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/sys/controllers/adminapi/agreement.controller.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/sys/controllers/adminapi/app.controller.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/sys/controllers/adminapi/area.controller.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/sys/controllers/adminapi/attachment.controller.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/sys/controllers/adminapi/channel.controller.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/sys/controllers/adminapi/common.controller.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/sys/controllers/adminapi/config.controller.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/sys/controllers/adminapi/export.controller.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/sys/controllers/adminapi/menu.controller.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/sys/controllers/adminapi/poster.controller.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/sys/controllers/adminapi/printer.controller.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/sys/controllers/adminapi/role.controller.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/sys/controllers/adminapi/schedule-log.controller.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/sys/controllers/adminapi/schedule.controller.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/sys/controllers/adminapi/system.controller.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/sys/controllers/adminapi/ueditor.controller.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/sys/dto/AgreementDto.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/sys/dto/AttachmentCategoryDto.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/sys/dto/MenuDto.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/sys/dto/PageDto.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/sys/dto/PrinterDto.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/sys/dto/PrinterTemplateDto.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/sys/dto/RoleDto.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/sys/dto/ScheduleDto.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/sys/dto/UserDto.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/sys/entity/app-version.entity.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/sys/entity/niu-sms-template.entity.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/sys/entity/poster.entity.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/sys/entity/sys-agreement.entity.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/sys/entity/sys-area.entity.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/sys/entity/sys-attachment-category.entity.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/sys/entity/sys-attachment.entity.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/sys/entity/sys-backup-records.entity.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/sys/entity/sys-config.entity.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/sys/entity/sys-export.entity.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/sys/entity/sys-menu.entity.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/sys/entity/sys-notice-log.entity.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/sys/entity/sys-notice-sms-log.entity.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/sys/entity/sys-notice.entity.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/sys/entity/sys-printer-template.entity.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/sys/entity/sys-printer.entity.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/sys/entity/sys-role.entity.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/sys/entity/sys-schedule-log.entity.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/sys/entity/sys-schedule.entity.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/sys/entity/sys-upgrade-records.entity.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/sys/entity/sys-user-log.entity.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/sys/entity/sys-user-role.entity.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/sys/entity/sys-user.entity.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/sys/entity/user-create-site-limit.entity.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/sys/entity/wx-oplatfrom-weapp-version.entity.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/sys/enums/agreement-dict.enum.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/sys/enums/app-type-dict.enum.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/sys/enums/backup-dict.enum.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/sys/enums/cloud-dict.enum.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/sys/enums/config-key-dict.enum.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/sys/enums/date-dict.enum.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/sys/enums/export-dict.enum.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/sys/enums/file-dict.enum.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/sys/enums/menu-dict.enum.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/sys/enums/menu-type-dict.enum.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/sys/enums/method-dict.enum.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/sys/enums/poster-dict.enum.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/sys/enums/printer-dict.enum.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/sys/enums/role-status-dict.enum.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/sys/enums/sms-dict.enum.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/sys/enums/storage-dict.enum.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/sys/enums/upgrade-dict.enum.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/sys/enums/user-dict.enum.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/sys/enums/wechat-media-dict.enum.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/sys/enums/wx-oplatform.enum.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/sys/services/admin/agreement.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/sys/services/admin/app.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/sys/services/admin/area.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/sys/services/admin/attachment.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/sys/services/admin/config.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/sys/services/admin/export.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/sys/services/admin/menu.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/sys/services/admin/poster.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/sys/services/admin/printer-template.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/sys/services/admin/printer.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/sys/services/admin/role.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/sys/services/admin/system.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/sys/services/core/core-agreement.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/sys/services/core/core-area.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/sys/services/core/core-attachment.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/sys/services/core/core-config.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/sys/services/core/core-export.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/sys/services/core/core-sys-config.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/sys/sys.module.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/upgrade/services/admin/backup-records.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/upgrade/services/admin/backup.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/upgrade/services/admin/execute-sql-trait.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/upgrade/services/admin/restore.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/upgrade/services/admin/upgrade-records.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/upgrade/services/admin/upgrade.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/upgrade/upgrade.module.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/upload/controllers/adminapi/storage.controller.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/upload/controllers/api/upload.controller.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/upload/services/admin/storage-config.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/upload/services/admin/upload-config.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/upload/services/admin/upload.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/upload/services/api/base64.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/upload/services/api/fetch.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/upload/services/api/upload.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/upload/services/core/core-base64.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/upload/services/core/core-fetch.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/upload/services/core/core-file.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/upload/services/core/core-image.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/upload/services/core/core-storage.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/upload/services/core/core-upload-config.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/upload/services/core/core-upload.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/upload/upload.module.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/user/controllers/adminapi/user.controller.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/user/services/admin/user-role.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/user/services/admin/user.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/user/user.module.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/verify/controllers/adminapi/verifier.controller.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/verify/controllers/adminapi/verify.controller.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/verify/entity/verifier.entity.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/verify/entity/verify.entity.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/verify/enums/verify-dict.enum.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/verify/services/admin/verifier.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/verify/services/admin/verify.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/verify/services/core/core-verify.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/verify/verify.module.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/weapp/controllers/adminapi/config.controller.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/weapp/controllers/adminapi/delivery.controller.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/weapp/controllers/adminapi/package.controller.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/weapp/controllers/adminapi/template.controller.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/weapp/controllers/adminapi/version.controller.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/weapp/controllers/api/serve.controller.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/weapp/controllers/api/weapp.controller.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/weapp/entity/weapp-version.entity.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/weapp/services/admin/weapp-config.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/weapp/services/admin/weapp-delivery.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/weapp/services/admin/weapp-package.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/weapp/services/admin/weapp-template.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/weapp/services/admin/weapp-version.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/weapp/services/api/weapp-auth.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/weapp/services/api/weapp-delivery.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/weapp/services/api/weapp-serve.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/weapp/services/core/core-weapp-auth.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/weapp/services/core/core-weapp-cloud.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/weapp/services/core/core-weapp-config.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/weapp/services/core/core-weapp-delivery.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/weapp/services/core/core-weapp-serve.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/weapp/services/core/core-weapp-template.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/weapp/services/core/core-weapp.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/weapp/weapp.module.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/wechat/controllers/adminapi/config.controller.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/wechat/controllers/adminapi/media.controller.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/wechat/controllers/adminapi/menu.controller.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/wechat/controllers/adminapi/reply.controller.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/wechat/controllers/adminapi/template.controller.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/wechat/controllers/api/serve.controller.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/wechat/controllers/api/wechat.controller.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/wechat/entity/wechat-fans.entity.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/wechat/entity/wechat-media.entity.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/wechat/entity/wechat-reply.entity.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/wechat/services/admin/wechat-config.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/wechat/services/admin/wechat-event.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/wechat/services/admin/wechat-fans.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/wechat/services/admin/wechat-media.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/wechat/services/admin/wechat-menu.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/wechat/services/admin/wechat-reply.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/wechat/services/admin/wechat-template.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/wechat/services/api/wechat-app.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/wechat/services/api/wechat-auth.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/wechat/services/api/wechat-serve.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/wechat/services/core/core-wechat-api.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/wechat/services/core/core-wechat-app.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/wechat/services/core/core-wechat-config.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/wechat/services/core/core-wechat-fans.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/wechat/services/core/core-wechat-media.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/wechat/services/core/core-wechat-message.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/wechat/services/core/core-wechat-reply.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/wechat/services/core/core-wechat-serve.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/wechat/services/core/core-wechat-template.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/wechat/services/core/core-wechat.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/wechat/wechat.module.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/wxoplatform/controllers/adminapi/config.controller.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/wxoplatform/controllers/adminapi/oplatform.controller.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/wxoplatform/controllers/adminapi/server.controller.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/wxoplatform/controllers/adminapi/weapp-version.controller.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/wxoplatform/services/admin/oplatform-config.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/wxoplatform/services/admin/oplatform-server.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/wxoplatform/services/admin/oplatform.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/wxoplatform/services/admin/weapp-version.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/wxoplatform/services/core/core-oplatform-config.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/wxoplatform/services/core/core-oplatform.service.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/libs/wwjcloud-core/src/wxoplatform/wxoplatform.module.ts create mode 100644 wwjcloud-nest-v1/wwjcloud/nest-cli.json create mode 100644 wwjcloud-nest-v1/wwjcloud/package.json rename wwjcloud-nest-v1/{ => wwjcloud}/src/ai-layer/ai-coordinator.service.spec.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/src/ai-layer/ai-security.service.spec.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/src/ai-layer/performance.analyzer.spec.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/src/ai-layer/resource-monitor.spec.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/src/ai-layer/resource.monitor.spec.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/src/ai-layer/safe-ready.service.spec.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/src/ai-layer/tuner-ready.service.spec.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/src/app.controller.spec.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/src/app.controller.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/src/app.e2e-spec.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/src/app.module.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/src/app.service.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/src/boot-layer/auth-ready.service.spec.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/src/boot-layer/cache-ready.service.spec.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/src/boot-layer/i18n-ready.service.spec.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/src/boot-layer/lang-ready.service.spec.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/src/boot-layer/metrics.service.spec.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/src/boot-layer/queue-ready.service.spec.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/src/boot-layer/startup-validator.service.spec.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/src/main.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/test/app.e2e-spec.ts (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/test/jest-e2e.json (100%) rename wwjcloud-nest-v1/{ => wwjcloud}/test/testing-preset.ts (100%) create mode 100644 wwjcloud-nest-v1/wwjcloud/tsconfig.build.json create mode 100644 wwjcloud-nest-v1/wwjcloud/tsconfig.json diff --git a/tools-v1/java-tools/generators/entity-generator.js b/tools-v1/java-tools/generators/entity-generator.js deleted file mode 100644 index 18eb9ee7..00000000 --- a/tools-v1/java-tools/generators/entity-generator.js +++ /dev/null @@ -1,410 +0,0 @@ -#!/usr/bin/env node - -const fs = require('fs'); -const path = require('path'); -const BaseGenerator = require('./base-generator'); - -/** - * 🏗️ 实体生成器 - * 专门负责生成NestJS实体文件 (参考Java架构) - */ -class EntityGenerator extends BaseGenerator { - constructor() { - super('EntityGenerator'); - - 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.entityStats = { - entitiesCreated: 0, - entitiesSkipped: 0 - }; - } - - /** - * 运行实体生成 - */ - async run() { - try { - console.log('🏗️ 启动实体生成器...'); - console.log('目标:生成NestJS实体文件\n'); - - // 加载Java架构发现结果(含PHP业务逻辑) - await this.loadDiscoveryData(); - - // 生成实体 - await this.generateEntities(); - - // 输出统计报告 - this.printStats(); - - } catch (error) { - console.error('❌ 实体生成失败:', error); - this.stats.errors++; - } - } - - /** - * 加载Java架构发现结果(含PHP业务逻辑) - */ - async loadDiscoveryData() { - try { - const data = fs.readFileSync(this.config.discoveryResultPath, 'utf8'); - this.discoveryData = JSON.parse(data); - console.log(' ✅ 成功加载Java架构发现结果(含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)) { - // 检查Java架构是否有对应的模型目录 - if (!this.hasPHPModels(moduleName)) { - console.log(` ⚠️ 模块 ${moduleName} 在Java架构中无对应,且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'; - -/** - * ${className} - 数据库实体 - * 基于真实 PHP 模型生成,不依赖旧的 Common 基类 - */ -@Entity('${tableName}') -export class ${className} { -${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-v1/java-tools/generators/service-generator.js b/tools-v1/java-tools/generators/service-generator.js deleted file mode 100644 index ea8307cc..00000000 --- a/tools-v1/java-tools/generators/service-generator.js +++ /dev/null @@ -1,893 +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 = { - 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/wwjcloud-nest-v1/.gitignore b/wwjcloud-nest-v1/.gitignore deleted file mode 100644 index 644d8b08..00000000 --- a/wwjcloud-nest-v1/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -# Generated startup diagnostics report -startup-check.report.json \ No newline at end of file diff --git a/wwjcloud-nest-v1/.prettierrc b/wwjcloud-nest-v1/.prettierrc deleted file mode 100644 index a20502b7..00000000 --- a/wwjcloud-nest-v1/.prettierrc +++ /dev/null @@ -1,4 +0,0 @@ -{ - "singleQuote": true, - "trailingComma": "all" -} diff --git a/wwjcloud-nest-v1/admin/Dockerfile b/wwjcloud-nest-v1/admin/Dockerfile new file mode 100644 index 00000000..591454bf --- /dev/null +++ b/wwjcloud-nest-v1/admin/Dockerfile @@ -0,0 +1,25 @@ +# Admin Frontend Dockerfile +FROM node:20-alpine as build + +WORKDIR /app + +# Copy package files +COPY package*.json ./ +RUN npm ci && npm cache clean --force + +# Copy source code and build +COPY . . +RUN npm run build + +# Production stage with nginx +FROM nginx:alpine + +# Copy built files +COPY --from=build /app/dist /usr/share/nginx/html + +# Create default nginx config +RUN echo 'server { listen 80; location / { root /usr/share/nginx/html; index index.html; try_files $uri $uri/ /index.html; } }' > /etc/nginx/conf.d/default.conf + +EXPOSE 80 + +CMD ["nginx", "-g", "daemon off;"] diff --git a/wwjcloud-nest-v1/admin/publish.cjs b/wwjcloud-nest-v1/admin/publish.cjs index 4c65a612..c8723c02 100644 --- a/wwjcloud-nest-v1/admin/publish.cjs +++ b/wwjcloud-nest-v1/admin/publish.cjs @@ -2,7 +2,7 @@ const fs = require('fs') const publish = () => { const src = './dist' - const dest = '../webroot/public/admin' + const dest = '../wwjcloud-web/public/admin' solve() diff --git a/wwjcloud-nest-v1/application-boot.json b/wwjcloud-nest-v1/application-boot.json new file mode 100644 index 00000000..b04f0fbc --- /dev/null +++ b/wwjcloud-nest-v1/application-boot.json @@ -0,0 +1,11 @@ +{ + "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/docker/docker-compose.yml b/wwjcloud-nest-v1/docker/docker-compose.yml index ff7ecfd0..17607158 100644 --- a/wwjcloud-nest-v1/docker/docker-compose.yml +++ b/wwjcloud-nest-v1/docker/docker-compose.yml @@ -1,9 +1,62 @@ version: "3.8" services: + # ======================================== + # MySQL 数据库 + # ======================================== + mysql: + image: mysql:8.0 + container_name: wwjcloud-mysql-v1 + restart: unless-stopped + environment: + MYSQL_ROOT_PASSWORD: wwjcloud + MYSQL_DATABASE: wwjcloud + MYSQL_USER: wwjcloud + MYSQL_PASSWORD: wwjcloud + TZ: Asia/Shanghai + ports: + - "3307:3306" # 使用3307避免与现有mysql冲突 + volumes: + - wwjcloud_mysql_data_v1:/var/lib/mysql + - ../../../sql:/docker-entrypoint-initdb.d + command: + - --character-set-server=utf8mb4 + - --collation-server=utf8mb4_unicode_ci + - --default-authentication-plugin=mysql_native_password + healthcheck: + test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-pwwjcloud"] + interval: 10s + timeout: 5s + retries: 5 + networks: + - wwjcloud-network-v1 + + # ======================================== + # Redis 缓存 + # ======================================== + redis: + image: redis:7-alpine + container_name: wwjcloud-redis-v1 + restart: unless-stopped + ports: + - "6380:6379" # 使用6380避免与现有redis冲突 + command: redis-server --appendonly yes + healthcheck: + test: ["CMD", "redis-cli", "ping"] + interval: 10s + timeout: 3s + retries: 5 + networks: + - wwjcloud-network-v1 + + # ======================================== + # NestJS 后端服务 (包含Core层) + # ======================================== api: build: - context: ../ - dockerfile: ./docker/Dockerfile + context: ../wwjcloud-nest-v1 + dockerfile: ../docker/Dockerfile + container_name: wwjcloud-api-v1 + restart: unless-stopped ports: - "3000:3000" environment: @@ -14,8 +67,15 @@ services: - AI_SIMULATE_DIRECT_ENQUEUE=false - PROMETHEUS_ENABLED=true - METRICS_ENABLED=true - - SWAGGER_ENABLED=false + - SWAGGER_ENABLED=true # 启用Swagger用于API测试 - RESPONSE_WRAPPER_ENABLED=true + # 数据库配置 + - DB_HOST=mysql + - DB_PORT=3306 + - DB_USERNAME=wwjcloud + - DB_PASSWORD=wwjcloud + - DB_DATABASE=wwjcloud + - DB_SYNC=false # 安全守卫 - AUTH_ENABLED=true - RBAC_ENABLED=true @@ -35,17 +95,66 @@ services: - QUEUE_REDIS_HOST=redis - QUEUE_REDIS_PORT=6379 depends_on: - - redis - redis: - image: redis:7-alpine - command: ["redis-server", "--save", "", "--appendonly", "no"] - ports: - - "6379:6379" + mysql: + condition: service_healthy + redis: + condition: service_healthy + healthcheck: + test: ["CMD", "node", "-e", "require('http').get('http://localhost:3000/api/health', (r) => {process.exit(r.statusCode === 200 ? 0 : 1)})"] + interval: 30s + timeout: 10s + retries: 3 + start_period: 60s + networks: + - wwjcloud-network-v1 + + # ======================================== + # Admin 前端管理面板 (暂时注释,等待修复构建问题) + # ======================================== + # admin: + # build: + # context: ../admin + # dockerfile: Dockerfile + # container_name: wwjcloud-admin-v1 + # restart: unless-stopped + # ports: + # - "8080:80" # Admin面板端口 + # depends_on: + # api: + # condition: service_healthy + # healthcheck: + # test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://localhost/"] + # interval: 30s + # timeout: 3s + # retries: 3 + # networks: + # - wwjcloud-network-v1 + + # ======================================== + # K6 压测工具 + # ======================================== k6: image: ghcr.io/grafana/k6:0.50.0 working_dir: /scripts volumes: - ./k6:/scripts - command: ["run", "-e", "VUS=100000", "-e", "ITERATIONS=1000000", "--summary-export=/scripts/summary-100k-vus.json", "/scripts/aio_test.js"] + command: ["run", "-e", "VUS=50", "-e", "ITERATIONS=2000", "--summary-export=/scripts/summary-full-test.json", "/scripts/full_test.js"] depends_on: - - api \ No newline at end of file + api: + condition: service_healthy + networks: + - wwjcloud-network-v1 + +# ======================================== +# 数据卷 +# ======================================== +volumes: + wwjcloud_mysql_data_v1: + driver: local + +# ======================================== +# 网络 +# ======================================== +networks: + wwjcloud-network-v1: + driver: bridge \ No newline at end of file diff --git a/wwjcloud-nest-v1/docker/k6/full_test.js b/wwjcloud-nest-v1/docker/k6/full_test.js new file mode 100644 index 00000000..3ace90c9 --- /dev/null +++ b/wwjcloud-nest-v1/docker/k6/full_test.js @@ -0,0 +1,132 @@ +import http from 'k6/http'; +import { check, sleep } from 'k6'; + +export const options = { + vus: Number(__ENV.VUS || 50), + iterations: Number(__ENV.ITERATIONS || 1000), + thresholds: { + http_req_duration: ['p(95)<1000'], + http_req_failed: ['rate<0.1'], + checks: ['rate>0.85'], + }, +}; + +const BASE_API = __ENV.BASE_URL || 'http://api:3000'; +const BASE_ADMIN = __ENV.ADMIN_URL || 'http://admin:80'; +const API = `${BASE_API}/api`; + +function safeJson(res) { + try { return res.json(); } catch (e) { return null; } +} + +export default function () { + // ======================================== + // 1. 基础健康检查 + // ======================================== + const health = http.get(`${API}/health`); + const healthJson = safeJson(health); + check(health, { + 'health check 200': (r) => r.status === 200, + 'health check ok': () => healthJson && healthJson.code === 1, + }); + + // ======================================== + // 2. Core层测试 - 系统配置相关 + // ======================================== + + // 测试系统配置接口 (core层) + const configTest = Math.random(); + if (configTest < 0.3) { + // 测试网站配置 + const website = http.get(`${API}/adminapi/sys/config/website`); + const websiteJson = safeJson(website); + check(website, { + 'sys config website 200': (r) => r.status === 200, + 'sys config website response': () => websiteJson && typeof websiteJson === 'object', + }, 'Core层 - 系统配置'); + } + + if (configTest < 0.4 && configTest >= 0.3) { + // 测试配置URL接口 + const url = http.get(`${API}/adminapi/sys/config/url`); + check(url, { + 'sys config url 200': (r) => r.status === 200, + }, 'Core层 - 配置URL'); + } + + if (configTest >= 0.4 && configTest < 0.7) { + // 测试其他配置接口 + const config = http.get(`${API}/adminapi/sys/config/layout`); + check(config, { + 'sys config layout 200': (r) => r.status === 200, + }, 'Core层 - 布局配置'); + } + + // ======================================== + // 3. Admin面板测试 + // ======================================== + if (configTest >= 0.7) { + // 测试admin面板前端页面 + const adminPage = http.get(`${BASE_ADMIN}/`); + check(adminPage, { + 'admin page 200': (r) => r.status === 200, + 'admin page html': () => r.body.includes('html') || r.body.includes(' r.status === 200, + 'ai recovery status valid': () => aiStatusJson && aiStatusJson.code === 1, + }, 'AI治理 - 恢复状态'); + } + + // ======================================== + // 5. 基础设施测试 + // ======================================== + const infraTest = Math.random(); + if (infraTest < 0.3) { + // 测试缓存系统 + const cache = http.get(`${API}/cache/ping`); + check(cache, { + 'cache ping 200': (r) => r.status === 200, + }, '基础设施 - 缓存'); + } + + if (infraTest >= 0.3 && infraTest < 0.6) { + // 测试队列系统 + const queue = http.get(`${API}/infra/queue/status`); + check(queue, { + 'queue status 200': (r) => r.status === 200, + }, '基础设施 - 队列'); + } + + if (infraTest >= 0.6) { + // 测试指标系统 + const metrics = http.get(`${API}/metrics`); + check(metrics, { + 'metrics 200': (r) => r.status === 200, + }, '基础设施 - 指标'); + } + + // ======================================== + // 6. 数据库连接测试 (通过API) + // ======================================== + const dbTest = Math.random(); + if (dbTest < 0.2) { + // 测试需要数据库的接口,验证core层数据库连接 + const secure = http.get(`${API}/secure/ping`); + check(secure, { + 'secure ping 200': (r) => r.status === 200, + }, '数据库 - 连接测试'); + } + + sleep(0.1); +} diff --git a/wwjcloud-nest-v1/docker/k6/summary-full-test.json b/wwjcloud-nest-v1/docker/k6/summary-full-test.json new file mode 100644 index 00000000..32bfabed --- /dev/null +++ b/wwjcloud-nest-v1/docker/k6/summary-full-test.json @@ -0,0 +1,227 @@ +{ + "metrics": { + "http_reqs": { + "count": 6353, + "rate": 1886.1963909291426 + }, + "http_req_blocked": { + "avg": 0.008377710373052018, + "min": 0, + "med": 0.0005, + "max": 1.55625, + "p(90)": 0.002042, + "p(95)": 0.002958 + }, + "iteration_duration": { + "med": 102.237708, + "max": 317.154958, + "p(90)": 125.29083750000001, + "p(95)": 161.67191284999998, + "avg": 82.89243237149998, + "min": 0.548708 + }, + "http_req_connecting": { + "p(90)": 0, + "p(95)": 0, + "avg": 0.000852412403588856, + "min": 0, + "med": 0, + "max": 0.488375 + }, + "data_sent": { + "count": 525622, + "rate": 156056.4016044322 + }, + "iterations": { + "count": 2000, + "rate": 593.7970693937172 + }, + "data_received": { + "count": 3063853, + "rate": 909653.4662265743 + }, + "vus": { + "min": 50, + "max": 50, + "value": 50 + }, + "http_req_waiting": { + "avg": 3.938315149063437, + "min": 0, + "med": 0.527625, + "max": 201.383833, + "p(90)": 6.378475000000001, + "p(95)": 14.274491199999984 + }, + "http_req_failed": { + "fails": 3075, + "passes": 3278, + "thresholds": { + "rate<0.1": true + }, + "value": 0.5159767039194082 + }, + "http_req_sending": { + "p(95)": 0.011542, + "avg": 0.004691097591688901, + "min": 0, + "med": 0.002291, + "max": 0.854, + "p(90)": 0.007741800000000005 + }, + "http_req_receiving": { + "med": 0.009, + "max": 0.941125, + "p(90)": 0.036782800000000004, + "p(95)": 0.05386659999999997, + "avg": 0.016415973240988493, + "min": 0 + }, + "vus_max": { + "max": 50, + "value": 50, + "min": 50 + }, + "http_req_duration": { + "p(95)": 14.309283199999978, + "avg": 3.959422219896119, + "min": 0, + "med": 0.546833, + "max": 201.405125, + "p(90)": 6.419382800000002, + "thresholds": { + "p(95)<1000": false + } + }, + "checks": { + "passes": 4253, + "fails": 6003, + "thresholds": { + "rate>0.85": true + }, + "value": 0.41468408736349455 + }, + "http_req_duration{expected_response:true}": { + "avg": 6.610590411707327, + "min": 0.106792, + "med": 0.605709, + "max": 201.405125, + "p(90)": 13.26397520000001, + "p(95)": 26.186396199999862 + }, + "http_req_tls_handshaking": { + "avg": 0, + "min": 0, + "med": 0, + "max": 0, + "p(90)": 0, + "p(95)": 0 + } + }, + "root_group": { + "groups": {}, + "checks": { + "health check 200": { + "id": "ef22380228847fa5ed6e59a4345f5746", + "passes": 400, + "fails": 1600, + "name": "health check 200", + "path": "::health check 200" + }, + "health check ok": { + "passes": 400, + "fails": 1600, + "name": "health check ok", + "path": "::health check ok", + "id": "5bec5732926ad80f89854801101e9430" + }, + "sys config url 200": { + "passes": 201, + "fails": 0, + "name": "sys config url 200", + "path": "::sys config url 200", + "id": "87fd0ea455e9ec34a855cf7a653ad960" + }, + "sys config website 200": { + "passes": 593, + "fails": 0, + "name": "sys config website 200", + "path": "::sys config website 200", + "id": "9bb682fa2b44d914da3b151a36607c59" + }, + "sys config website response": { + "id": "67598ff050375cde940c593f770c3aa1", + "passes": 593, + "fails": 0, + "name": "sys config website response", + "path": "::sys config website response" + }, + "metrics 200": { + "name": "metrics 200", + "path": "::metrics 200", + "id": "6025b93ff340487de79d60f9527333fc", + "passes": 0, + "fails": 553 + }, + "sys config layout 200": { + "name": "sys config layout 200", + "path": "::sys config layout 200", + "id": "d3e5739c1affcda7072abbc74c5cdabb", + "passes": 582, + "fails": 0 + }, + "ai recovery status 200": { + "name": "ai recovery status 200", + "path": "::ai recovery status 200", + "id": "0d1b62245c7430b8492c28ad04f20216", + "passes": 185, + "fails": 501 + }, + "ai recovery status valid": { + "name": "ai recovery status valid", + "path": "::ai recovery status valid", + "id": "25622428db5a9b849652b4dee412c123", + "passes": 185, + "fails": 501 + }, + "queue status 200": { + "path": "::queue status 200", + "id": "b297070db6c43b9f395115d8c2467a09", + "passes": 418, + "fails": 0, + "name": "queue status 200" + }, + "secure ping 200": { + "name": "secure ping 200", + "path": "::secure ping 200", + "id": "7bc4a41e979a208a4943a17271a920d8", + "passes": 291, + "fails": 0 + }, + "admin page 200": { + "name": "admin page 200", + "path": "::admin page 200", + "id": "57625b6505a9f9e83dcf9dc62af4a300", + "passes": 0, + "fails": 624 + }, + "admin page html": { + "name": "admin page html", + "path": "::admin page html", + "id": "a181e434bf1c9e5ce391b7f17e26b0d3", + "passes": 0, + "fails": 624 + }, + "cache ping 200": { + "name": "cache ping 200", + "path": "::cache ping 200", + "id": "cfac677d446dc8d58eb7f3ed8c6c85ef", + "passes": 405, + "fails": 0 + } + }, + "name": "", + "path": "", + "id": "d41d8cd98f00b204e9800998ecf8427e" + } +} \ No newline at end of file diff --git a/wwjcloud-nest-v1/eslint-report.json b/wwjcloud-nest-v1/eslint-report.json new file mode 100644 index 00000000..8a1a40ff --- /dev/null +++ b/wwjcloud-nest-v1/eslint-report.json @@ -0,0 +1 @@ +[{"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 /