cancan-microstack 0.0.2__tar.gz → 0.0.3__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {cancan_microstack-0.0.2/cancan_microstack.egg-info → cancan_microstack-0.0.3}/PKG-INFO +2 -2
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/__version__.py +1 -1
- cancan_microstack-0.0.3/assets/www/adminops/assets/AppEmpty.vue_vue_type_script_setup_true_lang-Bf2bE_Hw.js +1 -0
- cancan_microstack-0.0.2/assets/www/adminops/assets/ConfigManage-DKV5YOUz.js → cancan_microstack-0.0.3/assets/www/adminops/assets/ConfigManage-xlb34pwd.js +1 -1
- cancan_microstack-0.0.2/assets/www/adminops/assets/ConsoleManage-8ljYvCW2.js → cancan_microstack-0.0.3/assets/www/adminops/assets/ConsoleManage-DSJYsKqv.js +1 -1
- cancan_microstack-0.0.2/assets/www/adminops/assets/DashboardNew-B9Nf1OPl.js → cancan_microstack-0.0.3/assets/www/adminops/assets/DashboardNew-BVFcXUNv.js +1 -1
- cancan_microstack-0.0.2/assets/www/adminops/assets/LogSearch-CA0Jhe78.js → cancan_microstack-0.0.3/assets/www/adminops/assets/LogSearch-CoJXnwAZ.js +1 -1
- cancan_microstack-0.0.3/assets/www/adminops/assets/LoginView-BD1wBxg2.css +1 -0
- cancan_microstack-0.0.3/assets/www/adminops/assets/LoginView-Bc5xsdrl.js +1 -0
- cancan_microstack-0.0.2/assets/www/adminops/assets/OperationProgressDialog-BdEYwqFq.js → cancan_microstack-0.0.3/assets/www/adminops/assets/OperationProgressDialog-C06wo1xn.js +1 -1
- cancan_microstack-0.0.2/assets/www/adminops/assets/PageContainer-Byss-yUC.js → cancan_microstack-0.0.3/assets/www/adminops/assets/PageContainer-CVLD10ut.js +1 -1
- cancan_microstack-0.0.2/assets/www/adminops/assets/RateLimitManage-DJY4NiF-.js → cancan_microstack-0.0.3/assets/www/adminops/assets/RateLimitManage-DyUFBHmU.js +1 -1
- cancan_microstack-0.0.3/assets/www/adminops/assets/RouteManage-DGvdTuUT.js +1 -0
- cancan_microstack-0.0.3/assets/www/adminops/assets/ServiceCard-XhvfcuNQ.js +1 -0
- cancan_microstack-0.0.3/assets/www/adminops/assets/ServiceDetail-C2J7RZd1.js +1 -0
- cancan_microstack-0.0.2/assets/www/adminops/assets/ServiceList-C7ryvbhE.js → cancan_microstack-0.0.3/assets/www/adminops/assets/ServiceList-IUYOGtP9.js +1 -1
- cancan_microstack-0.0.3/assets/www/adminops/assets/ServiceLogs-iXJ3IIqG.js +1 -0
- cancan_microstack-0.0.2/assets/www/adminops/assets/StatsOverview-D0TwMQkA.js → cancan_microstack-0.0.3/assets/www/adminops/assets/StatsOverview-BC4-eTZo.js +1 -1
- cancan_microstack-0.0.2/assets/www/adminops/assets/TotpBindView-CWlAmzFt.js → cancan_microstack-0.0.3/assets/www/adminops/assets/TotpBindView-BW6ljc6n.js +1 -1
- cancan_microstack-0.0.3/assets/www/adminops/assets/TotpVerifyView-CyqvuGOq.js +1 -0
- cancan_microstack-0.0.2/assets/www/adminops/assets/WorkflowCenter-i50rZyxN.js → cancan_microstack-0.0.3/assets/www/adminops/assets/WorkflowCenter-BOtrjzsd.js +1 -1
- cancan_microstack-0.0.2/assets/www/adminops/assets/WorkflowDesigner-CnHokPL9.js → cancan_microstack-0.0.3/assets/www/adminops/assets/WorkflowDesigner-Dxg_7SAS.js +1 -1
- cancan_microstack-0.0.2/assets/www/adminops/assets/WorkflowRuns-B09hK48c.js → cancan_microstack-0.0.3/assets/www/adminops/assets/WorkflowRuns-B4HsknCb.js +1 -1
- cancan_microstack-0.0.2/assets/www/adminops/assets/caddy-nnCKf8fG.js → cancan_microstack-0.0.3/assets/www/adminops/assets/caddy-Cmwd6W2n.js +1 -1
- cancan_microstack-0.0.2/assets/www/adminops/assets/index-CiFlm8oc.js → cancan_microstack-0.0.3/assets/www/adminops/assets/index-Eu9iwQmC.js +13 -13
- cancan_microstack-0.0.2/assets/www/adminops/assets/service-BYlgGPs_.js → cancan_microstack-0.0.3/assets/www/adminops/assets/service-BlXlgg12.js +1 -1
- cancan_microstack-0.0.2/assets/www/adminops/assets/service-operation-6GzLw2Z1.js → cancan_microstack-0.0.3/assets/www/adminops/assets/service-operation-DAaEb_pH.js +1 -1
- cancan_microstack-0.0.2/assets/www/adminops/assets/style-lRnStdGu.js → cancan_microstack-0.0.3/assets/www/adminops/assets/style-DpM4ysR1.js +1 -1
- cancan_microstack-0.0.2/assets/www/adminops/assets/useDebounce-BRlqfXqf.js → cancan_microstack-0.0.3/assets/www/adminops/assets/useDebounce-Cwe6JT9l.js +1 -1
- cancan_microstack-0.0.2/assets/www/adminops/assets/workflow-CUXs39Ac.js → cancan_microstack-0.0.3/assets/www/adminops/assets/workflow-DDj36jU5.js +1 -1
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/assets/www/adminops/index.html +1 -1
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3/cancan_microstack.egg-info}/PKG-INFO +2 -2
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/cancan_microstack.egg-info/SOURCES.txt +56 -56
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/cancan_microstack.egg-info/requires.txt +1 -1
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/cli/main.py +6 -1
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/core/compose_builder.py +48 -2
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/pyproject.toml +1 -1
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/opsbffsrv/application/auth_app.py +9 -1
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/opsbffsrv/conf/config.py +11 -1
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/opsbffsrv/domain/auth/admin_init.py +11 -2
- cancan_microstack-0.0.3/services/opsbffsrv/infrastructure/auth/captcha_service.py +112 -0
- cancan_microstack-0.0.3/services/opsbffsrv/infrastructure/auth/password_service.py +39 -0
- cancan_microstack-0.0.2/assets/www/adminops/assets/AppEmpty.vue_vue_type_script_setup_true_lang-BOKUurnM.js +0 -1
- cancan_microstack-0.0.2/assets/www/adminops/assets/LoginView-BId3kP3M.css +0 -1
- cancan_microstack-0.0.2/assets/www/adminops/assets/LoginView-BQZTV_Qy.js +0 -1
- cancan_microstack-0.0.2/assets/www/adminops/assets/RouteManage-w9XCU0UA.js +0 -1
- cancan_microstack-0.0.2/assets/www/adminops/assets/ServiceCard-BJUhWnA-.js +0 -1
- cancan_microstack-0.0.2/assets/www/adminops/assets/ServiceDetail-Cw24WuKp.js +0 -1
- cancan_microstack-0.0.2/assets/www/adminops/assets/ServiceLogs-COpG9H0h.js +0 -1
- cancan_microstack-0.0.2/assets/www/adminops/assets/TotpVerifyView-D3w_lZk8.js +0 -1
- cancan_microstack-0.0.2/services/opsbffsrv/infrastructure/auth/captcha_service.py +0 -67
- cancan_microstack-0.0.2/services/opsbffsrv/infrastructure/auth/password_service.py +0 -12
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/LICENSE +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/MANIFEST.in +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/README.md +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/__init__.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/assets/__init__.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/assets/builds/caddy/.gitignore +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/assets/builds/caddy/Caddyfile +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/assets/builds/caddy/DEPLOYMENT.md +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/assets/builds/caddy/Dockerfile +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/assets/builds/caddy/README.md +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/assets/builds/caddy/geoip/README.md +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/assets/builds/caddy/start.sh +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/assets/builds/caddy/waf/coraza.conf +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/assets/builds/caddy/www/.gitignore +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/assets/builds/service/Dockerfile +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/assets/builds/service/README.md +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/assets/ddl/create_db.sql +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/assets/ddl/infra/execution_log_tbl.sql +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/assets/ddl/infra/node_instance_tbl.sql +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/assets/ddl/infra/service_action_log_tbl.sql +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/assets/ddl/infra/service_config_tbl.sql +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/assets/ddl/infra/service_info_tbl.sql +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/assets/ddl/infra/service_instance_tbl.sql +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/assets/ddl/infra/service_operation_tbl.sql +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/assets/ddl/infra/workflow_definition_tbl.sql +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/assets/ddl/infra/workflow_definition_version_tbl.sql +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/assets/ddl/infra/workflow_engine_alert_tbl.sql +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/assets/ddl/infra/workflow_run_tbl.sql +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/assets/ddl/ops/admin_user_tbl.sql +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/assets/ddl/ops/caddy_access_log_tbl.sql +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/assets/ddl/ops/caddy_certificate_tbl.sql +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/assets/ddl/ops/caddy_rate_limit_tbl.sql +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/assets/ddl/ops/caddy_route_tbl.sql +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/assets/ddl/ops/caddy_stats_tbl.sql +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/assets/ddl/trigger.sql +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/assets/docker/docker-compose.infra.yml +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/assets/env/env.example +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/assets/scripts/README.md +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/assets/scripts/docker/build_images.sh +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/assets/scripts/docker/force_rebuild_images.sh +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/assets/scripts/docker/rebuild_all.sh +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/assets/scripts/docker/rebuild_compose.sh +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/assets/scripts/docker/restart.sh +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/assets/scripts/docker/restart_compose.sh +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/assets/scripts/docker/start.sh +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/assets/scripts/docker/start_all.sh +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/assets/scripts/docker/start_compose.sh +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/assets/scripts/docker/stop.sh +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/assets/scripts/docker/stop_all.sh +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/assets/scripts/docker/stop_compose.sh +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/assets/scripts/podman/build_images_podman.sh +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/assets/scripts/podman/cleanup_podman.sh +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/assets/scripts/podman/force_rebuild_images_podman.sh +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/assets/scripts/podman/rebuild_all_podman.sh +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/assets/scripts/podman/rebuild_compose_podman.sh +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/assets/scripts/podman/restart_compose_podman.sh +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/assets/scripts/podman/start_all_podman.sh +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/assets/scripts/podman/start_compose_podman.sh +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/assets/scripts/podman/start_podman.sh +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/assets/scripts/podman/stop.sh +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/assets/scripts/podman/stop_all_podman.sh +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/assets/scripts/podman/stop_compose_podman.sh +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/assets/scripts/start_controllersrv.sh +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/assets/scripts/utils/check_all_db_tables.sh +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/assets/scripts/utils/check_env.sh +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/assets/scripts/utils/check_service_management_deployment.sh +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/assets/scripts/utils/deploy_service_management.sh +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/assets/scripts/utils/force_reload_infrasrv.sh +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/assets/scripts/utils/monitor_service_management.sh +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/assets/scripts/utils/reset_postgres_volume.sh +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/assets/scripts/utils/test_async_operations.sh +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/assets/scripts/utils/verify_real_operations.sh +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/assets/service/Dockerfile +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/assets/www/adminops/assets/ConfigManage-Y5bhy7wG.css +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/assets/www/adminops/assets/ConsoleManage-BWpyqbuQ.css +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/assets/www/adminops/assets/DashboardNew-DYWZKQ1V.css +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/assets/www/adminops/assets/LogSearch-CCZfTNPF.css +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/assets/www/adminops/assets/OperationProgressDialog-D-pASR8G.css +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/assets/www/adminops/assets/PageContainer-C3nSZwM7.css +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/assets/www/adminops/assets/RateLimitManage-BDI8jLpC.css +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/assets/www/adminops/assets/RouteManage-DaUQ4QLw.css +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/assets/www/adminops/assets/ServiceCard-BFzHe6Tw.css +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/assets/www/adminops/assets/ServiceDetail-Yum47zdB.css +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/assets/www/adminops/assets/ServiceList-Cgd01fUx.css +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/assets/www/adminops/assets/ServiceLogs-H_Alq0cf.css +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/assets/www/adminops/assets/StatsOverview-lqAN6pqM.css +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/assets/www/adminops/assets/TotpBindView-HoQC1lhx.css +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/assets/www/adminops/assets/TotpVerifyView-BHN1VtX1.css +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/assets/www/adminops/assets/WorkflowCenter-DU_mpIA0.css +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/assets/www/adminops/assets/WorkflowDesigner-DaZaZpLd.css +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/assets/www/adminops/assets/WorkflowRuns-wGutKIIU.css +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/assets/www/adminops/assets/format-Cuzxgna9.js +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/assets/www/adminops/assets/index-UW0T1Dkc.css +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/assets/www/adminops/assets/style-CcIXnQ5y.css +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/assets/www/adminops/vite.svg +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/cancan_microstack.egg-info/dependency_links.txt +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/cancan_microstack.egg-info/entry_points.txt +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/cancan_microstack.egg-info/not-zip-safe +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/cancan_microstack.egg-info/top_level.txt +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/cli/__init__.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/cli/__main__.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/cmd/__init__.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/cmd/cancan/__init__.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/cmd/cancan/run.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/cmd/controllersrv/__init__.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/cmd/controllersrv/run.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/cmd/infrasrv/__init__.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/cmd/infrasrv/run.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/cmd/opsbffsrv/__init__.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/cmd/opsbffsrv/run.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/core/__init__.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/core/assets.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/core/doctor.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/core/microstack.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/core/runner.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/core/stack_manager.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/public/__init__.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/public/api/__init__.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/public/api/controllersrv_client.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/public/api/infrasrv_client.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/public/const/__init__.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/public/const/action_consts.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/public/const/app_consts.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/public/const/caddy_consts.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/public/const/controllersrv_consts.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/public/const/docker_consts.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/public/const/error.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/public/const/health_consts.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/public/const/hook_enums.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/public/const/logging_enums.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/public/const/metrics_enums.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/public/const/monitor_enums.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/public/const/operation_consts.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/public/const/opsbffsrv_error.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/public/const/overrides_consts.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/public/const/redis.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/public/const/service_consts.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/public/const/workflow_consts.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/public/error.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/public/logging/__init__.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/public/logging/initializer.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/public/logging/mq_handler.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/public/schemas/__init__.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/public/schemas/caddy/__init__.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/public/schemas/caddy/analysis.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/public/schemas/caddy/route.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/public/schemas/common.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/public/schemas/controllersrv/__init__.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/public/schemas/controllersrv/async_requests.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/public/schemas/controllersrv/compose_models.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/public/schemas/controllersrv/const.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/public/schemas/controllersrv/docker_models.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/public/schemas/controllersrv/docker_responses.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/public/schemas/controllersrv/requests.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/public/schemas/controllersrv/responses.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/public/schemas/controllersrv/task_models.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/public/schemas/controllersrv/validation.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/public/schemas/hook_metrics.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/public/schemas/hooks.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/public/schemas/infra/__init__.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/public/schemas/infra/cleanup.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/public/schemas/infra/container.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/public/schemas/infra/enums.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/public/schemas/infra/health_check.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/public/schemas/infra/hook_log.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/public/schemas/infra/operation.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/public/schemas/infra/overview.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/public/schemas/infra/push.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/public/schemas/infra/service_action_log.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/public/schemas/infra/service_config.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/public/schemas/infra/service_info.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/public/schemas/infra/service_instance.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/public/schemas/infra/service_management.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/public/schemas/infra/service_operation.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/public/schemas/infra/service_registry.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/public/schemas/infra/status_types.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/public/schemas/infra/workflow.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/public/schemas/logging/__init__.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/public/schemas/logging/log_event.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/public/schemas/opsbffsrv/__init__.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/public/schemas/opsbffsrv/async_ops.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/public/schemas/opsbffsrv/db_admin.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/public/schemas/opsbffsrv/db_init.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/public/schemas/opsbffsrv/service_config.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/public/schemas/opsbffsrv/service_logs.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/public/schemas/service_operation.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/public/schemas/service_registry.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/public/types/__init__.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/public/web/__init__.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/public/web/config_value.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/public/web/server.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/py.typed +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/runtime/__init__.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/runtime/compose_cmd.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/runtime/host_daemon.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/runtime/overrides.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/runtime/resources.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/runtime/workspace.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/__init__.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/controllersrv/__init__.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/controllersrv/application/__init__.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/controllersrv/application/docker_compose_app.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/controllersrv/conf/__init__.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/controllersrv/conf/config.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/controllersrv/conf/settings.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/controllersrv/domain/__init__.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/controllersrv/domain/docker_compose/__init__.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/controllersrv/domain/docker_compose/docker_compose_domain.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/controllersrv/domain/service_validator.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/controllersrv/domain/task/__init__.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/controllersrv/domain/task/task_queue.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/controllersrv/domain/task/task_worker.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/controllersrv/infrastructure/__init__.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/controllersrv/interface/__init__.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/controllersrv/interface/api/__init__.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/controllersrv/interface/api/docker_control_api.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/controllersrv/router.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/infrasrv/__init__.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/infrasrv/application/__init__.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/infrasrv/application/health_check_app.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/infrasrv/application/logging/__init__.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/infrasrv/application/logging/log_ingestion_service.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/infrasrv/application/service_config.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/infrasrv/application/service_logs_app.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/infrasrv/application/service_management_app.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/infrasrv/application/service_operation_tracker.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/infrasrv/application/service_registry.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/infrasrv/application/workflow/__init__.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/infrasrv/application/workflow/workflow_app.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/infrasrv/application/workflow/workflow_queue.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/infrasrv/application/workflow/workflow_tasks.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/infrasrv/application/workflow/workflow_worker_runtime.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/infrasrv/conf/__init__.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/infrasrv/conf/config.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/infrasrv/domain/__init__.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/infrasrv/domain/health_check/__init__.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/infrasrv/domain/health_check/health_check_domain.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/infrasrv/domain/hooks/__init__.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/infrasrv/domain/hooks/builtin_hooks.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/infrasrv/domain/hooks/hook_registry.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/infrasrv/domain/hooks/hooks_log_utils.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/infrasrv/domain/hooks/init.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/infrasrv/domain/hooks/metrics.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/infrasrv/domain/hooks/pre_registration_hooks.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/infrasrv/domain/registry/__init__.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/infrasrv/domain/registry/service_registry.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/infrasrv/domain/service_config/__init__.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/infrasrv/domain/service_config/service_config.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/infrasrv/domain/service_logs/__init__.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/infrasrv/domain/service_logs/service_logs_domain.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/infrasrv/domain/workflow/__init__.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/infrasrv/domain/workflow/engine.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/infrasrv/domain/workflow/node_handlers.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/infrasrv/domain/workflow/workflow_domain.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/infrasrv/infrastructure/__init__.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/infrasrv/infrastructure/api/__init__.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/infrasrv/infrastructure/api/controllersrv_api.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/infrasrv/infrastructure/cache/__init__.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/infrasrv/infrastructure/cache/service_registry_cache.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/infrasrv/infrastructure/db/__init__.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/infrasrv/infrastructure/db/model/__init__.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/infrasrv/infrastructure/db/model/execution_log_tbl.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/infrasrv/infrastructure/db/model/node_instance_tbl.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/infrasrv/infrastructure/db/model/service_action_log_tbl.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/infrasrv/infrastructure/db/model/service_config_tbl.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/infrasrv/infrastructure/db/model/service_info_tbl.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/infrasrv/infrastructure/db/model/service_instance_tbl.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/infrasrv/infrastructure/db/model/service_operation_tbl.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/infrasrv/infrastructure/db/model/workflow_definition_tbl.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/infrasrv/infrastructure/db/model/workflow_definition_version_tbl.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/infrasrv/infrastructure/db/model/workflow_engine_alert_tbl.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/infrasrv/infrastructure/db/model/workflow_run_tbl.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/infrasrv/infrastructure/db/operate/__init__.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/infrasrv/infrastructure/db/operate/service_action_log_op.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/infrasrv/infrastructure/db/operate/service_config.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/infrasrv/infrastructure/db/operate/service_config_manager.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/infrasrv/infrastructure/db/operate/service_info_op.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/infrasrv/infrastructure/db/operate/service_instance_op.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/infrasrv/infrastructure/db/operate/service_operation_op.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/infrasrv/infrastructure/db/operate/service_registry.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/infrasrv/infrastructure/db/operate/workflow_op.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/infrasrv/infrastructure/ddl_manager.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/infrasrv/infrastructure/mongo/__init__.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/infrasrv/infrastructure/mongo/log_repository.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/infrasrv/interface/__init__.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/infrasrv/interface/api/__init__.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/infrasrv/interface/api/health_check_api.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/infrasrv/interface/api/hooks.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/infrasrv/interface/api/internal.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/infrasrv/interface/api/internal_instance_api.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/infrasrv/interface/api/internal_operation_api.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/infrasrv/interface/api/service_config.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/infrasrv/interface/api/service_logs_api.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/infrasrv/interface/api/service_management_api.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/infrasrv/interface/api/service_registry.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/infrasrv/interface/api/workflow_api.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/infrasrv/interface/schedule/__init__.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/infrasrv/interface/schedule/cleanup.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/infrasrv/interface/schedule/health_check.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/infrasrv/interface/schedule/log_cleanup.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/infrasrv/interface/schedule/operation_tracker.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/infrasrv/interface/schedule/scheduler.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/infrasrv/interface/schedule/workflow_scheduler.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/infrasrv/router.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/opsbffsrv/__init__.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/opsbffsrv/application/__init__.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/opsbffsrv/application/async_operation_app.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/opsbffsrv/application/caddy/__init__.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/opsbffsrv/application/caddy/access_log_analysis_app.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/opsbffsrv/application/caddy/access_log_ingestion_service.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/opsbffsrv/application/caddy/certificate_management_app.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/opsbffsrv/application/caddy/rate_limit_management_app.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/opsbffsrv/application/caddy/route_management_app.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/opsbffsrv/application/caddy/stats_aggregation_app.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/opsbffsrv/application/db_admin_app.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/opsbffsrv/application/db_init_app.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/opsbffsrv/application/logging/__init__.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/opsbffsrv/application/logging/log_query_app.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/opsbffsrv/application/service_config.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/opsbffsrv/application/service_logs_app.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/opsbffsrv/application/service_registry.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/opsbffsrv/application/workflow_ops_app.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/opsbffsrv/conf/__init__.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/opsbffsrv/domain/__init__.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/opsbffsrv/domain/auth/__init__.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/opsbffsrv/domain/auth/auth_domain.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/opsbffsrv/domain/caddy/__init__.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/opsbffsrv/domain/caddy/access_log_analysis.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/opsbffsrv/domain/caddy/certificate_management.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/opsbffsrv/domain/caddy/default_routes.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/opsbffsrv/domain/caddy/rate_limit_management.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/opsbffsrv/domain/caddy/route_management.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/opsbffsrv/domain/caddy/stats_aggregation.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/opsbffsrv/domain/db_admin/__init__.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/opsbffsrv/domain/db_admin/db_admin_domain.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/opsbffsrv/domain/db_init/__init__.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/opsbffsrv/domain/db_init/db_init_domain.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/opsbffsrv/domain/logging/__init__.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/opsbffsrv/domain/logging/log_query_domain.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/opsbffsrv/domain/service_config/__init__.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/opsbffsrv/domain/service_config/service_config.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/opsbffsrv/domain/service_registry/__init__.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/opsbffsrv/domain/service_registry/service_registry.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/opsbffsrv/infrastructure/__init__.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/opsbffsrv/infrastructure/api/__init__.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/opsbffsrv/infrastructure/api/infrasrv_api.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/opsbffsrv/infrastructure/auth/__init__.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/opsbffsrv/infrastructure/auth/redis_store.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/opsbffsrv/infrastructure/auth/totp_service.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/opsbffsrv/infrastructure/caddy/__init__.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/opsbffsrv/infrastructure/caddy/access_log_parser.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/opsbffsrv/infrastructure/caddy/admin_api_client.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/opsbffsrv/infrastructure/caddy/ip_geo_locator.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/opsbffsrv/infrastructure/db/__init__.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/opsbffsrv/infrastructure/db/model/__init__.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/opsbffsrv/infrastructure/db/model/admin_user_tbl.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/opsbffsrv/infrastructure/db/model/caddy_access_log_tbl.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/opsbffsrv/infrastructure/db/model/caddy_certificate_tbl.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/opsbffsrv/infrastructure/db/model/caddy_rate_limit_tbl.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/opsbffsrv/infrastructure/db/model/caddy_route_tbl.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/opsbffsrv/infrastructure/db/model/caddy_stats_tbl.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/opsbffsrv/infrastructure/db/model/service_action_log_tbl.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/opsbffsrv/infrastructure/db/model/service_config_tbl.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/opsbffsrv/infrastructure/db/model/service_info_tbl.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/opsbffsrv/infrastructure/db/model/service_instance_tbl.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/opsbffsrv/infrastructure/db/operate/__init__.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/opsbffsrv/infrastructure/db/operate/admin_user_operate.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/opsbffsrv/infrastructure/db/operate/caddy_access_log.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/opsbffsrv/infrastructure/db/operate/caddy_certificate.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/opsbffsrv/infrastructure/db/operate/caddy_rate_limit.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/opsbffsrv/infrastructure/db/operate/caddy_route.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/opsbffsrv/infrastructure/db/operate/caddy_stats.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/opsbffsrv/infrastructure/db/operate/service_action_log_op.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/opsbffsrv/infrastructure/db/operate/service_config.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/opsbffsrv/infrastructure/db/operate/service_info_op.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/opsbffsrv/infrastructure/db/operate/service_instance.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/opsbffsrv/infrastructure/db/operate/service_registry.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/opsbffsrv/infrastructure/ddl_manager.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/opsbffsrv/infrastructure/mongo/__init__.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/opsbffsrv/infrastructure/mongo/log_query_repository.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/opsbffsrv/interface/__init__.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/opsbffsrv/interface/api/__init__.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/opsbffsrv/interface/api/async_operation_api.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/opsbffsrv/interface/api/auth_api.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/opsbffsrv/interface/api/caddy/__init__.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/opsbffsrv/interface/api/caddy/access_log_api.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/opsbffsrv/interface/api/caddy/certificate_api.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/opsbffsrv/interface/api/caddy/rate_limit_api.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/opsbffsrv/interface/api/caddy/route_api.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/opsbffsrv/interface/api/caddy/stats_api.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/opsbffsrv/interface/api/db_admin_api.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/opsbffsrv/interface/api/db_init_api.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/opsbffsrv/interface/api/instance_management_api.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/opsbffsrv/interface/api/log_query_api.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/opsbffsrv/interface/api/mongo_express_proxy_api.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/opsbffsrv/interface/api/pgweb_proxy_api.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/opsbffsrv/interface/api/rabbitmq_mgmt_proxy_api.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/opsbffsrv/interface/api/redis_commander_proxy_api.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/opsbffsrv/interface/api/service_config.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/opsbffsrv/interface/api/service_logs_api.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/opsbffsrv/interface/api/service_registry.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/opsbffsrv/interface/api/workflow_ops_api.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/opsbffsrv/interface/middleware/__init__.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/opsbffsrv/interface/middleware/auth_middleware.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/services/opsbffsrv/router.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/setup.cfg +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/tests/test_app_server_registry.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/tests/test_assets.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/tests/test_cli.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/tests/test_compose_builder.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/tests/test_config_value.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/tests/test_stack_cli.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/tests/test_workflow_consts.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/tests/test_workflow_engine_flow_baseline.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/tests/test_workflow_inline_queue.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/tests/test_workflow_nodes_baseline.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/tests/test_workflow_ops_app_baseline.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/tests/test_workflow_runtime_context.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/tests/test_workflow_scheduler_risk.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/tests/test_workflow_snapshot_baseline.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/utils/__init__.py +0 -0
- {cancan_microstack-0.0.2 → cancan_microstack-0.0.3}/utils/container_env.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: cancan-microstack
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.3
|
|
4
4
|
Summary: Controllersrv/Infrasrv/Opsbffsrv bundle with compose tooling
|
|
5
5
|
Author-email: Victor Lai <victor.lai@foxmail.com>
|
|
6
6
|
License-Expression: MIT
|
|
@@ -38,7 +38,7 @@ Requires-Dist: jinja2<4.0.0,>=3.1.0
|
|
|
38
38
|
Requires-Dist: geoip2<6.0.0,>=4.7.0
|
|
39
39
|
Requires-Dist: jmespath<2.0.0,>=1.0.0
|
|
40
40
|
Requires-Dist: dragonfly-container[all]>=0.0.1
|
|
41
|
-
Requires-Dist: linglong-web[all]>=0.0.
|
|
41
|
+
Requires-Dist: linglong-web[all]>=0.0.2
|
|
42
42
|
Provides-Extra: dev
|
|
43
43
|
Requires-Dist: pytest>=8.0.0; extra == "dev"
|
|
44
44
|
Requires-Dist: pytest-asyncio>=0.23.0; extra == "dev"
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
__title__ = "cancan-microstack"
|
|
4
4
|
__description__ = "Infrastructure microservice bundle providing controllersrv/infrasrv/opsbffsrv, assets, and orchestration tooling"
|
|
5
5
|
__url__ = "https://github.com/10000ms/cancan_microstack"
|
|
6
|
-
__version__ = "0.0.
|
|
6
|
+
__version__ = "0.0.3"
|
|
7
7
|
__author__ = "Victor Lai"
|
|
8
8
|
__author_email__ = "victor.lai@foxmail.com"
|
|
9
9
|
__license__ = "MIT"
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{d as m,B as o,c as r,b as n,e as s,h as d,q as a,y,Q as u}from"./index-Eu9iwQmC.js";const x={class:"app-empty flex flex-col items-center justify-center py-12"},_={class:"text-gray-500 text-lg mb-2"},f={key:0,class:"mt-4"},g=m({__name:"AppEmpty",props:{type:{default:"empty"},description:{default:""}},setup(c){const t=c,i=o(()=>{const e={empty:"i-carbon-document-blank",error:"i-carbon-warning-hex",noPermission:"i-carbon-locked"};return e[t.type]||e.empty}),p=o(()=>{const e={empty:"text-gray-400",error:"text-red-400",noPermission:"text-orange-400"};return e[t.type]||e.empty}),l=o(()=>{if(t.description)return t.description;const e={empty:"暂无数据",error:"加载失败",noPermission:"暂无权限"};return e[t.type]||e.empty});return(e,b)=>(n(),r("div",x,[s("div",{class:a(["empty-icon text-6xl mb-4",p.value])},[s("i",{class:a(i.value)},null,2)],2),s("div",_,y(l.value),1),e.$slots.extra?(n(),r("div",f,[u(e.$slots,"extra")])):d("",!0)]))}});export{g as _};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{L as A,M as N,N as oe,r as m,G as f,O as ie,d as ue,A as re,B as G,I as ce,J as de,o as ve,g as $,b as k,w as t,i as l,e as a,y as R,j as C,k as h,H as fe,C as me,D as pe,c as H,h as ge,m as Z,s as V,x as _e,_ as ye}from"./index-Eu9iwQmC.js";import{u as Ce}from"./useDebounce-Cwe6JT9l.js";import{P as be}from"./PageContainer-CVLD10ut.js";import{_ as ke}from"./AppEmpty.vue_vue_type_script_setup_true_lang-Bf2bE_Hw.js";const we=r=>A.Get(N.SERVICE_CONFIG,{name:"getServiceConfig",params:{service_name:r,_t:Date.now()}}),xe=()=>A.Get(N.SERVICE_CONFIG_ALL,{name:"getAllServicesConfig",params:{_t:Date.now()}}),he=(r,p)=>A.Post(N.SERVICE_CONFIG,{conf_dict:p},{name:"addServiceConfig",params:{service_name:r}}),Ve=(r,p)=>A.Put(N.SERVICE_CONFIG,{conf_dict:p},{name:"updateServiceConfig",params:{service_name:r}}),Se=(r,p)=>A.Delete(N.SERVICE_CONFIG,{name:"deleteServiceConfigItem",params:{service_name:r,conf_key:p}}),Ee=oe("config",()=>{const r=m({}),p=m({}),I=m(""),d=m(!1),b=m(null),w=async s=>{d.value=!0,b.value=null,I.value=s;try{const o=await we(s);return r.value=o,o}catch(o){throw b.value=o,f.error("获取配置失败"),o}finally{d.value=!1}};return{currentConfig:r,allConfigs:p,currentServiceName:I,loading:d,error:b,fetchConfig:w,fetchAllConfigs:async()=>{d.value=!0,b.value=null;try{const s=await xe();return p.value=s,s}catch(s){throw b.value=s,f.error("获取配置失败"),s}finally{d.value=!1}},addConfig:async(s,o)=>{try{const n=await he(s,o);if(r.value={...r.value,...o},f.success("添加配置成功"),n.push_result){const{success_count:_,total_instances:c}=n.push_result;f.info(`已推送到 ${_}/${c} 个实例`)}return n}catch(n){throw f.error("添加配置失败"),n}},updateConfig:async(s,o)=>{try{const n=await Ve(s,o);if(r.value={...r.value,...o},f.success("更新配置成功"),n.push_result){const{success_count:_,total_instances:c}=n.push_result;f.info(`已推送到 ${_}/${c} 个实例`)}return n}catch(n){throw f.error("更新配置失败"),n}},deleteConfig:async(s,o)=>{try{await ie.confirm(`确定要删除配置项 "${o}" 吗?`,"确认删除",{type:"warning",confirmButtonText:"确定",cancelButtonText:"取消"});const n=await Se(s,o),_={...r.value};if(delete _[o],r.value=_,f.success("删除配置成功"),n.push_result){const{success_count:c,total_instances:M}=n.push_result;f.info(`已推送到 ${c}/${M} 个实例`)}return n}catch(n){if(n!=="cancel")throw f.error("删除配置失败"),n}},refreshConfig:async s=>{await w(s),f.success("刷新成功")},clearData:()=>{r.value={},p.value={},I.value="",b.value=null}}});function $e(r){return/^[A-Za-z0-9][A-Za-z0-9_.-]*$/.test(r)}const Ie={class:"config-actions"},Re={class:"stats-grid"},Ae={class:"stat-item text-center"},Ne={class:"stat-value stat-value-primary"},Be={class:"stat-item text-center"},De={class:"stat-value stat-value-success"},Fe={class:"stat-item text-center"},Ge={class:"stat-value stat-value-tertiary"},Me={class:"min-h-300px"},Te={class:"config-key"},Le={class:"config-key-text"},Oe={key:1,class:"flex items-center justify-between group"},ze={class:"font-mono text-sm"},Pe=ue({__name:"ConfigManage",setup(r){const p=ce(),I=_e(),d=Ee(),{currentConfig:b,loading:w}=re(d),g=G(()=>p.params.serviceName),y=Ce("",300),B=G(()=>Object.entries(b.value).map(([i,e])=>({key:i,value:e,editable:!0}))),P=G(()=>B.value.length),S=m("刚刚"),D=G(()=>{if(!y.value)return B.value;const i=y.value.toLowerCase();return B.value.filter(e=>e.key.toLowerCase().includes(i)||e.value.toLowerCase().includes(i))}),s=m(!1),o=m("add"),n=m(),_=m(!1),c=m({key:"",value:""}),M={key:[{required:!0,message:"请输入配置键",trigger:"blur"},{validator:(i,e,v)=>{$e(e)?v():v(new Error("请输入合法配置键:字母/数字开头,仅允许字母、数字、下划线、点、中划线"))},trigger:"blur"}],value:[{required:!0,message:"请输入配置值",trigger:"blur"}]},T=m(""),E=m(""),J=()=>{I.back()},X=async()=>{await d.refreshConfig(g.value),S.value="刚刚"},U=()=>{o.value="add",c.value={key:"",value:""},s.value=!0},Y=i=>{o.value="edit",c.value={key:i.key,value:i.value},s.value=!0},Q=async i=>{try{await d.deleteConfig(g.value,i.key),S.value="刚刚"}catch{}},W=i=>{navigator.clipboard.writeText(i.value).then(()=>{f.success("复制成功")}).catch(()=>{f.error("复制失败")})},ee=i=>{T.value=i.key,E.value=i.value},j=async i=>{if(E.value===i.value){L();return}try{await d.updateConfig(g.value,{[i.key]:E.value}),S.value="刚刚",L()}catch{}},L=()=>{T.value="",E.value=""},te=async()=>{n.value&&await n.value.validate(async i=>{if(i){_.value=!0;try{o.value==="add"?await d.addConfig(g.value,{[c.value.key]:c.value.value}):await d.updateConfig(g.value,{[c.value.key]:c.value.value}),S.value="刚刚",s.value=!1,c.value={key:"",value:""}}catch{}finally{_.value=!1}}})};return de(g,()=>{d.fetchConfig(g.value)},{immediate:!0}),ve(async()=>{await d.fetchConfig(g.value)}),(i,e)=>{const v=C("el-button"),O=C("el-card"),F=C("el-input"),z=C("el-table-column"),K=C("el-space"),ae=C("el-table"),q=C("el-form-item"),le=C("el-form"),se=C("el-dialog"),ne=pe("loading");return k(),$(be,{title:`${g.value} 配置管理`,subtitle:"管理服务的配置项",icon:"i-carbon-settings"},{actions:t(()=>[a("div",Ie,[l(v,{onClick:J,class:"action-btn back-btn"},{default:t(()=>[...e[7]||(e[7]=[a("i",{class:"i-carbon-arrow-left"},null,-1),a("span",{class:"btn-text"},"返回",-1)])]),_:1}),l(v,{type:"success",onClick:U,class:"action-btn add-btn"},{default:t(()=>[...e[8]||(e[8]=[a("i",{class:"i-carbon-add"},null,-1),a("span",{class:"btn-text"},"添加",-1)])]),_:1}),l(v,{onClick:X,loading:h(w),class:"action-btn refresh-btn"},{default:t(()=>[...e[9]||(e[9]=[a("i",{class:"i-carbon-renew"},null,-1),a("span",{class:"btn-text"},"刷新",-1)])]),_:1},8,["loading"])])]),default:t(()=>[l(O,{class:"mb-4 stats-card"},{default:t(()=>[a("div",Re,[a("div",Ae,[a("div",Ne,R(P.value),1),e[10]||(e[10]=a("div",{class:"stat-label"},"配置项总数",-1))]),a("div",Be,[a("div",De,R(g.value),1),e[11]||(e[11]=a("div",{class:"stat-label"},"服务名称",-1))]),a("div",Fe,[a("div",Ge,R(S.value),1),e[12]||(e[12]=a("div",{class:"stat-label"},"最后更新",-1))])])]),_:1}),l(O,{class:"mb-4"},{default:t(()=>[l(F,{modelValue:h(y),"onUpdate:modelValue":e[0]||(e[0]=u=>fe(y)?y.value=u:null),placeholder:"搜索配置项名称或值",class:"w-full",clearable:""},{prefix:t(()=>[...e[13]||(e[13]=[a("i",{class:"i-carbon-search"},null,-1)])]),_:1},8,["modelValue"])]),_:1}),l(O,null,{header:t(()=>[...e[14]||(e[14]=[a("span",{class:"text-lg font-semibold"},"配置列表",-1)])]),default:t(()=>[me((k(),H("div",Me,[!h(w)&&D.value.length>0?(k(),$(ae,{key:0,data:D.value,stripe:"",style:{width:"100%"}},{default:t(()=>[l(z,{prop:"key",label:"配置键","min-width":"200"},{default:t(({row:u})=>[a("div",Te,[e[15]||(e[15]=a("i",{class:"i-carbon-settings-adjust config-icon"},null,-1)),a("span",Le,R(u.key),1)])]),_:1}),l(z,{prop:"value",label:"配置值","min-width":"300"},{default:t(({row:u})=>[T.value===u.key?(k(),$(F,{key:0,modelValue:E.value,"onUpdate:modelValue":e[1]||(e[1]=x=>E.value=x),onBlur:x=>j(u),onKeyup:[Z(x=>j(u),["enter"]),Z(L,["esc"])]},null,8,["modelValue","onBlur","onKeyup"])):(k(),H("div",Oe,[a("span",ze,R(u.value),1),l(v,{text:"",size:"small",class:"opacity-0 group-hover:opacity-100 transition-opacity",onClick:x=>ee(u)},{default:t(()=>[...e[16]||(e[16]=[a("i",{class:"i-carbon-edit"},null,-1)])]),_:1},8,["onClick"])]))]),_:1}),l(z,{label:"操作",width:"200",fixed:"right"},{default:t(({row:u})=>[l(K,null,{default:t(()=>[l(v,{text:"",type:"primary",size:"small",onClick:x=>Y(u)},{default:t(()=>[...e[17]||(e[17]=[a("i",{class:"i-carbon-edit mr-1"},null,-1),V(" 编辑 ",-1)])]),_:1},8,["onClick"]),l(v,{text:"",type:"danger",size:"small",onClick:x=>Q(u)},{default:t(()=>[...e[18]||(e[18]=[a("i",{class:"i-carbon-trash-can mr-1"},null,-1),V(" 删除 ",-1)])]),_:1},8,["onClick"]),l(v,{text:"",type:"info",size:"small",onClick:x=>W(u)},{default:t(()=>[...e[19]||(e[19]=[a("i",{class:"i-carbon-copy mr-1"},null,-1),V(" 复制 ",-1)])]),_:1},8,["onClick"])]),_:2},1024)]),_:1})]),_:1},8,["data"])):!h(w)&&D.value.length===0?(k(),$(ke,{key:1,type:"empty",description:h(y)?"未找到匹配的配置项":"暂无配置数据"},{extra:t(()=>[h(y)?(k(),$(v,{key:0,onClick:e[2]||(e[2]=u=>y.value="")},{default:t(()=>[...e[20]||(e[20]=[V(" 清空搜索 ",-1)])]),_:1})):(k(),$(v,{key:1,type:"primary",onClick:U},{default:t(()=>[...e[21]||(e[21]=[V(" 添加配置 ",-1)])]),_:1}))]),_:1},8,["description"])):ge("",!0)])),[[ne,h(w)]])]),_:1}),l(se,{modelValue:s.value,"onUpdate:modelValue":e[6]||(e[6]=u=>s.value=u),title:o.value==="add"?"添加配置":"编辑配置",width:"600px"},{footer:t(()=>[l(K,null,{default:t(()=>[l(v,{onClick:e[5]||(e[5]=u=>s.value=!1)},{default:t(()=>[...e[23]||(e[23]=[V("取消",-1)])]),_:1}),l(v,{type:"primary",onClick:te,loading:_.value},{default:t(()=>[...e[24]||(e[24]=[V(" 确定 ",-1)])]),_:1},8,["loading"])]),_:1})]),default:t(()=>[l(le,{ref_key:"configFormRef",ref:n,model:c.value,rules:M,"label-width":"100px"},{default:t(()=>[l(q,{label:"配置键",prop:"key"},{default:t(()=>[l(F,{modelValue:c.value.key,"onUpdate:modelValue":e[3]||(e[3]=u=>c.value.key=u),placeholder:"字母/数字开头,允许字母、数字、下划线、点、中划线,如:MAX_RETRY 或 app.config-v1",disabled:o.value==="edit"},null,8,["modelValue","disabled"]),e[22]||(e[22]=a("div",{class:"form-hint"}," 字母或数字开头;可包含字母、数字、下划线、点、中划线 ",-1))]),_:1}),l(q,{label:"配置值",prop:"value"},{default:t(()=>[l(F,{modelValue:c.value.value,"onUpdate:modelValue":e[4]||(e[4]=u=>c.value.value=u),type:"textarea",rows:4,placeholder:"请输入配置值"},null,8,["modelValue"])]),_:1})]),_:1},8,["model"])]),_:1},8,["modelValue","title"])]),_:1},8,["title"])}}}),He=ye(Pe,[["__scopeId","data-v-23bbf448"]]);export{He as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{d as
|
|
1
|
+
import{d as H,B as Y,I as Z,r as w,J as ee,o as te,K as le,g as d,b as l,w as t,i as a,h as g,c as i,e as n,s as c,j as m,C as ne,y as f,S as se,q as oe,F as k,E as h,G as ae,_ as re}from"./index-Eu9iwQmC.js";import{P as ie}from"./PageContainer-CVLD10ut.js";const R="/v1/opsbffsrv",T={pgweb:{id:"pgweb",title:"PGWeb 数据库控制台",subtitle:"PostgreSQL Web UI",icon:"i-carbon-data-base",iframeUrl:`${R}/pgweb/`,description:"通过 pgweb 直接管理 PostgreSQL,支持 SQL 查询、表结构调整与导出。",features:["SQL 查询","表结构浏览","结果导出","快捷键执行"],notes:["仅在内网环境开放,请勿暴露公网。","执行数据修改指令前请再次确认条件。","若页面空白,请检查 opsbffsrv 与 Caddy 代理状态。"],infoSections:[{title:"快捷键",tags:["Cmd/Ctrl + Enter 执行","Cmd/Ctrl + S 保存查询"]},{title:"安全提醒",description:"请谨慎执行 DELETE、DROP、UPDATE 等语句,建议先备份关键数据。",alertType:"warning"}],docLinks:[{label:"PGWeb 官方文档",url:"https://github.com/sosedoff/pgweb"}]},"redis-commander":{id:"redis-commander",title:"Redis Commander",subtitle:"Redis Web 管理器",icon:"i-carbon-ibm-data-replication",iframeUrl:`${R}/redis_commander/`,description:"查看与编辑 Redis key,支持多 DB 与 TTL 监控。",features:["Key 搜索","结构化查看","TTL 监控","命令行执行"],notes:["默认只读,请在执行写操作前确认环境。","若无法连接,请确认 Redis 内部服务是否就绪。"],infoSections:[{title:"使用提示",tags:["支持 JSON/Hash 预览","命令历史可搜索"]}],docLinks:[{label:"项目主页",url:"https://github.com/joeferner/redis-commander"}]},"mongo-express":{id:"mongo-express",title:"Mongo Express",subtitle:"日志存储浏览器",icon:"i-carbon-tree-view",iframeUrl:`${R}/mongo_express/`,description:"直接浏览 infra_logging.service_logs 库,支持集合内查询与导出。",features:["集合预览","文档编辑","索引查看","导出 JSON"],notes:["日志库数据量较大,查询时请设置条件。","后台依赖 Mongo 与 RabbitMQ,请关注基础设施健康。"],infoSections:[{title:"集合关注",tags:["infra_logging.service_logs","infra_logging.metadata"]}],docLinks:[{label:"Mongo Express 官方",url:"https://github.com/mongo-express/mongo-express"}]},"rabbitmq-mgmt":{id:"rabbitmq-mgmt",title:"RabbitMQ Management",subtitle:"消息队列监控",icon:"i-carbon-data-1",iframeUrl:`${R}/rabbitmq_mgmt/`,description:"查看交换机、队列与消息堆积,配合日志管线排查延迟。",features:["队列监控","连接/信道管理","流量速率可视化"],notes:["默认账户具备只读权限,执行写操作前请确认。","如需访问宿主暴露端口,可打开 35673 端口代理。"],infoSections:[{title:"关键队列",tags:["besrv.logs.ingress","infra.logging.persist"]}],docLinks:[{label:"RabbitMQ Docs",url:"https://www.rabbitmq.com/management.html"}],disableCacheParam:!0}},ue=C=>C&&T[C]?T[C]:T.pgweb,ce={class:"page-actions"},de={class:"mt-2"},me={key:0,class:"loading-container"},pe={class:"loading-text"},fe={key:1,class:"error-container"},ve={key:2,class:"error-container"},be=["src"],ge={class:"card-header"},_e={class:"help-description"},ye={key:0,class:"help-tags"},ke={key:1,class:"text-secondary"},we={key:3,class:"note-list"},he={key:4,class:"doc-links"},Ce={key:1,class:"fullscreen-actions"},Le=H({__name:"ConsoleManage",setup(C){const Q=Z(),s=Y(()=>ue(Q.meta.consoleId)),v=w(!0),p=w(""),b=w(!1),L=()=>{const r=s.value.iframeUrl;if(s.value.disableCacheParam)return r;const e=r.includes("?")?"&":"?";return`${r}${e}ts=${Date.now()}`},y=w(""),_=w(!1),$=r=>r===401||r===403,z=r=>{const e=r.toLowerCase();return["login","signin","auth"].some(u=>e.includes(u))},G=async()=>{const r=s.value.iframeUrl;try{const e=await fetch(r,{method:"GET",credentials:"include",headers:{"X-Requested-With":"XMLHttpRequest"}});if($(e.status)){console.warn("[Precheck] Auth status detected:",e.status),_.value=!0;return}if(e.redirected&&z(e.url)){console.warn("[Precheck] Redirect to login detected:",e.url),_.value=!0;return}y.value=L(),_.value=!1}catch(e){console.warn("[Precheck] Network error, attempting to render iframe anyway:",e),y.value=L(),_.value=!1}};ee(()=>s.value.id,()=>{v.value=!0,p.value="",y.value=L()});const P=()=>{v.value=!1},W=()=>{P(),p.value=""},A=()=>{P(),p.value="无法连接到控制台,请检查服务是否正常运行",ae.error("加载失败")},S=()=>{v.value=!0,p.value="",y.value=L()},M=()=>{S()},F=()=>{b.value=!0,document.body.style.overflow="hidden"},E=()=>{b.value=!1,document.body.style.overflow=""},I=r=>{r.key==="Escape"&&b.value&&E(),r.key==="F11"&&(r.preventDefault(),b.value?E():F())},x=()=>{window.open(s.value.iframeUrl,"_blank","noopener")};return te(()=>{window.addEventListener("keydown",I),G().then(()=>{_.value&&(setTimeout(()=>{x()},200),v.value=!1,p.value="该控制台无法在内嵌 iframe 中直接访问,已在新标签打开。")}),setTimeout(()=>{v.value&&(v.value=!1,p.value)},15e3)}),le(()=>{window.removeEventListener("keydown",I),document.body.style.overflow=""}),(r,e)=>{const u=m("el-button"),U=m("el-alert"),V=m("el-icon"),N=m("el-result"),D=m("el-card"),q=m("el-tag"),J=m("el-divider"),K=m("el-descriptions-item"),X=m("el-descriptions"),j=m("el-link"),B=m("el-tooltip");return l(),d(ie,{title:s.value.title,icon:s.value.icon},{actions:t(()=>[n("div",ce,[a(u,{onClick:S},{default:t(()=>[...e[0]||(e[0]=[n("i",{class:"i-carbon-renew mr-2"},null,-1),n("span",null,"刷新",-1)])]),_:1}),b.value?(l(),d(u,{key:1,onClick:E},{default:t(()=>[...e[2]||(e[2]=[n("i",{class:"i-carbon-minimize mr-2"},null,-1),n("span",null,"退出全屏",-1)])]),_:1})):(l(),d(u,{key:0,onClick:F},{default:t(()=>[...e[1]||(e[1]=[n("i",{class:"i-carbon-fit-to-screen mr-2"},null,-1),n("span",null,"全屏",-1)])]),_:1})),a(u,{onClick:x},{default:t(()=>[...e[3]||(e[3]=[n("i",{class:"i-carbon-launch mr-2"},null,-1),n("span",null,"新标签打开",-1)])]),_:1})])]),default:t(()=>[a(U,{type:"info","show-icon":"",closable:!1,class:"mb-4 console-tip",title:"控制台加载提示"},{default:t(()=>[e[9]||(e[9]=n("p",null,"若页面长时间加载或加载失败,请检查 Caddy / opsbffsrv 代理以及相关服务是否健康。",-1)),n("p",de,[e[6]||(e[6]=c("如果页面加载后显示空白、部分异常或报错,说明该组件服务内部发生故障,请联系后端排查。您仍可以尝试 ",-1)),a(u,{type:"primary",link:"",onClick:S},{default:t(()=>[...e[4]||(e[4]=[c("刷新",-1)])]),_:1}),e[7]||(e[7]=c(" 或 ",-1)),a(u,{type:"primary",link:"",onClick:x},{default:t(()=>[...e[5]||(e[5]=[c("在新标签页打开",-1)])]),_:1}),e[8]||(e[8]=c("。",-1))])]),_:1}),a(D,{class:oe(["pgweb-card",{"pgweb-fullscreen":b.value}])},{default:t(()=>[v.value?(l(),i("div",me,[a(V,{class:"is-loading",size:40},{default:t(()=>[...e[10]||(e[10]=[n("i",{class:"i-carbon-progress-bar"},null,-1)])]),_:1}),n("p",pe,"正在加载 "+f(s.value.title)+"...",1)])):p.value?(l(),i("div",fe,[a(N,{icon:"error",title:"加载失败","sub-title":p.value},{extra:t(()=>[a(u,{type:"primary",onClick:M},{default:t(()=>[...e[11]||(e[11]=[n("i",{class:"i-carbon-renew mr-2"},null,-1),c(" 重试 ",-1)])]),_:1})]),_:1},8,["sub-title"])])):_.value?(l(),i("div",ve,[a(N,{icon:"warning",title:"嵌入检测失败","sub-title":"该控制台无法在内嵌 iframe 中直接访问"},{extra:t(()=>[a(u,{type:"primary",onClick:x},{default:t(()=>[...e[12]||(e[12]=[n("i",{class:"i-carbon-launch mr-2"},null,-1),c(" 在新标签页打开 ",-1)])]),_:1}),a(u,{onClick:M},{default:t(()=>[...e[13]||(e[13]=[n("i",{class:"i-carbon-renew mr-2"},null,-1),c(" 再试一次 ",-1)])]),_:1})]),_:1})])):g("",!0),ne(n("iframe",{src:y.value,class:"pgweb-iframe",frameborder:"0",onLoad:W,onError:A},null,40,be),[[se,!v.value&&!p.value&&!_.value&&y.value]])]),_:1},8,["class"]),b.value?g("",!0):(l(),d(D,{key:0,class:"help-card mt-4"},{header:t(()=>[n("div",ge,[e[14]||(e[14]=n("i",{class:"i-carbon-help mr-2"},null,-1)),n("span",null,f(s.value.title)+" 使用指南",1)])]),default:t(()=>[n("p",_e,f(s.value.description),1),s.value.features.length?(l(),i("div",ye,[(l(!0),i(k,null,h(s.value.features,o=>(l(),d(q,{key:o,size:"small",type:"info",class:"mr-2 mb-2"},{default:t(()=>[c(f(o),1)]),_:2},1024))),128))])):g("",!0),s.value.infoSections?.length||s.value.notes.length?(l(),d(J,{key:1})):g("",!0),s.value.infoSections?.length?(l(),d(X,{key:2,column:1,border:""},{default:t(()=>[(l(!0),i(k,null,h(s.value.infoSections,o=>(l(),d(K,{key:o.title,label:o.title},{default:t(()=>[o.tags?.length?(l(!0),i(k,{key:0},h(o.tags,O=>(l(),d(q,{key:O,size:"small",class:"mr-2 mb-2",type:o.alertType==="warning"?"warning":"info"},{default:t(()=>[c(f(O),1)]),_:2},1032,["type"]))),128)):(l(),i(k,{key:1},[o.alertType?(l(),d(U,{key:0,type:o.alertType==="danger"?"error":o.alertType,closable:!1,"show-icon":""},{title:t(()=>[c(f(o.description),1)]),_:2},1032,["type"])):(l(),i("p",ke,f(o.description),1))],64))]),_:2},1032,["label"]))),128))]),_:1})):g("",!0),s.value.notes.length?(l(),i("ul",we,[(l(!0),i(k,null,h(s.value.notes,o=>(l(),i("li",{key:o},f(o),1))),128))])):g("",!0),s.value.docLinks?.length?(l(),i("div",he,[e[15]||(e[15]=n("span",{class:"text-secondary"},"参考文档:",-1)),(l(!0),i(k,null,h(s.value.docLinks,o=>(l(),d(j,{key:o.url,href:o.url,target:"_blank",rel:"noopener",type:"primary",class:"mr-2"},{default:t(()=>[c(f(o.label),1)]),_:2},1032,["href"]))),128))])):g("",!0)]),_:1})),b.value?(l(),i("div",Ce,[a(B,{content:"刷新",placement:"left"},{default:t(()=>[a(u,{circle:"",onClick:S},{default:t(()=>[...e[16]||(e[16]=[n("i",{class:"i-carbon-renew"},null,-1)])]),_:1})]),_:1}),a(B,{content:"退出全屏",placement:"left"},{default:t(()=>[a(u,{circle:"",onClick:E},{default:t(()=>[...e[17]||(e[17]=[n("i",{class:"i-carbon-minimize"},null,-1)])]),_:1})]),_:1})])):g("",!0)]),_:1},8,["title","icon"])}}}),xe=re(Le,[["__scopeId","data-v-1b0c8a40"]]);export{xe as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{d as
|
|
1
|
+
import{d as j,A as z,B as n,c as p,b as r,e as s,i as S,w as m,s as b,k as i,j as G,y as l,q as v,C as H,D as M,g as w,h as P,F as J,E as K,x as Q,G as k,_ as U}from"./index-Eu9iwQmC.js";import{u as W}from"./service-BlXlgg12.js";import{O as f}from"./service-operation-DAaEb_pH.js";import{S as X}from"./ServiceCard-XhvfcuNQ.js";import{_ as Y}from"./AppEmpty.vue_vue_type_script_setup_true_lang-Bf2bE_Hw.js";import"./OperationProgressDialog-C06wo1xn.js";const Z={class:"dashboard-container"},ss={class:"dashboard-header animate-fade-in"},ts={class:"header-content"},es={class:"stats-grid animate-fade-in",style:{"animation-delay":"100ms"}},as={class:"stat-card card gradient-primary"},ns={class:"stat-content"},is={class:"stat-info"},os={class:"stat-value"},rs={class:"stat-card card gradient-success"},ls={class:"stat-content"},cs={class:"stat-info"},ds={class:"stat-value"},vs={class:"stat-card card gradient-warning"},us={class:"stat-content"},ps={class:"stat-info"},ms={class:"stat-value"},fs={class:"stat-content"},gs={class:"stat-info"},hs={class:"stat-value"},_s={class:"stat-trend"},ys={class:"services-section animate-fade-in",style:{"animation-delay":"200ms"}},Ss={class:"services-grid"},bs=j({__name:"DashboardNew",setup(ws){const a=Q(),c=W(),{services:d,loading:u,healthyServices:C,systemHealthRate:o}=z(c),R=n(()=>d.value.length),N=n(()=>C.value.length),D=n(()=>d.value.reduce((e,t)=>e+(t.total_instances||0),0)),T=n(()=>{const e=o.value;return e>=90?"gradient-success":e>=70?"gradient-warning":"gradient-error"}),g=n(()=>{const e=o.value;return e>=90?"success":e>=70?"warning":"error"}),x=n(()=>{const e=o.value;return e>=90?"i-carbon-checkmark-filled":e>=70?"i-carbon-warning":"i-carbon-warning-filled"}),q=n(()=>{const e=o.value;return e>=90?"优秀":e>=70?"良好":"需关注"}),h=async()=>{await c.fetchServices(),k.success("数据已刷新")},B=e=>{const t=typeof e=="string"?e:e.service_name;a.push(`/services/${t}`)},$=e=>{const t=typeof e=="string"?e:e.service_name;a.push(`/services/${t}`)},E=e=>{const t=typeof e=="string"?e:e.service_name;a.push(`/config/${t}`)},I=async e=>{const t=typeof e=="string"?e:e.service_name;await c.refreshServices(),k.success(`服务 ${t} 已刷新`)},L=e=>{const t=typeof e=="string"?e:e.service_name;a.push({name:"ServiceLogs",query:{serviceName:t}})},V=e=>{const t=typeof e=="string"?e:e.service_name;a.push({name:"ServiceDetail",params:{serviceName:t},query:{action:f.RESTART}})},A=e=>{const t=typeof e=="string"?e:e.service_name;a.push({name:"ServiceDetail",params:{serviceName:t},query:{action:f.START}})},O=e=>{const t=typeof e=="string"?e:e.service_name;a.push({name:"ServiceDetail",params:{serviceName:t},query:{action:f.STOP}})};return c.fetchServices(),(e,t)=>{const _=G("el-button"),F=M("loading");return r(),p("div",Z,[s("div",ss,[s("div",ts,[t[1]||(t[1]=s("div",null,[s("h1",{class:"page-title"},"仪表板"),s("p",{class:"page-subtitle"},"系统整体运行状态监控")],-1)),S(_,{type:"primary",loading:i(u),onClick:h,class:"refresh-btn"},{default:m(()=>[...t[0]||(t[0]=[s("i",{class:"i-carbon-renew mr-2"},null,-1),b(" 刷新数据 ",-1)])]),_:1},8,["loading"])])]),s("div",es,[s("div",as,[s("div",ns,[s("div",is,[t[2]||(t[2]=s("div",{class:"stat-label"},"服务总数",-1)),s("div",os,l(R.value),1),t[3]||(t[3]=s("div",{class:"stat-trend"},[s("i",{class:"i-carbon-arrow-up"}),s("span",null,"所有注册服务")],-1))]),t[4]||(t[4]=s("div",{class:"stat-icon-wrapper primary"},[s("i",{class:"i-carbon-application stat-icon"})],-1))]),t[5]||(t[5]=s("div",{class:"stat-glow primary"},null,-1))]),s("div",rs,[s("div",ls,[s("div",cs,[t[6]||(t[6]=s("div",{class:"stat-label"},"健康服务",-1)),s("div",ds,l(N.value),1),t[7]||(t[7]=s("div",{class:"stat-trend"},[s("i",{class:"i-carbon-checkmark"}),s("span",null,"运行正常")],-1))]),t[8]||(t[8]=s("div",{class:"stat-icon-wrapper success"},[s("i",{class:"i-carbon-checkmark-filled stat-icon"})],-1))]),t[9]||(t[9]=s("div",{class:"stat-glow success"},null,-1))]),s("div",vs,[s("div",us,[s("div",ps,[t[10]||(t[10]=s("div",{class:"stat-label"},"总实例数",-1)),s("div",ms,l(D.value),1),t[11]||(t[11]=s("div",{class:"stat-trend"},[s("i",{class:"i-carbon-container-software"}),s("span",null,"活跃实例")],-1))]),t[12]||(t[12]=s("div",{class:"stat-icon-wrapper warning"},[s("i",{class:"i-carbon-container-software stat-icon"})],-1))]),t[13]||(t[13]=s("div",{class:"stat-glow warning"},null,-1))]),s("div",{class:v(["stat-card card",T.value])},[s("div",fs,[s("div",gs,[t[14]||(t[14]=s("div",{class:"stat-label"},"系统健康率",-1)),s("div",hs,l(i(o))+"%",1),s("div",_s,[s("i",{class:v(x.value)},null,2),s("span",null,l(q.value),1)])]),s("div",{class:v(["stat-icon-wrapper",g.value])},[...t[15]||(t[15]=[s("i",{class:"i-carbon-health-cross stat-icon"},null,-1)])],2)]),s("div",{class:v(["stat-glow",g.value])},null,2)],2)]),s("div",ys,[t[17]||(t[17]=s("div",{class:"section-header"},[s("div",null,[s("h2",{class:"section-title"},"服务列表"),s("p",{class:"section-subtitle"},"查看所有注册的服务及其状态")])],-1)),H((r(),p("div",Ss,[(r(!0),p(J,null,K(i(d),y=>(r(),w(X,{key:y.service_name,service:y,class:"service-card-item",onClick:B,onDetail:$,onConfig:E,onRefresh:I,onLogs:L,onRestart:V,onStart:A,onStop:O},null,8,["service"]))),128)),!i(u)&&i(d).length===0?(r(),w(Y,{key:0,type:"empty",description:"暂无服务数据,请检查服务注册中心",class:"col-span-full"},{extra:m(()=>[S(_,{type:"primary",onClick:h},{default:m(()=>[...t[16]||(t[16]=[b(" 刷新数据 ",-1)])]),_:1})]),_:1})):P("",!0)])),[[F,i(u)]])])])}}}),xs=U(bs,[["__scopeId","data-v-1d4a4b8c"]]);export{xs as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{I as ce,J as pe,d as ge,r as b,x as U,o as ve,g as R,b as f,w as n,i as a,l as d,j as m,m as fe,y as W,c as V,B as z,F as x,e as s,t as r,h as _e,E as T,_ as be}from"./index-CiFlm8oc.js";import{P as he}from"./PageContainer-Byss-yUC.js";import{u as Ne}from"./service-BYlgGPs_.js";import{a as ye}from"./format-Cuzxgna9.js";const we=P=>ce.Post(pe.OPSBFF_LOG_SEARCH,P),ke={class:"result-header"},Se={class:"result-desc"},Ce={class:"result-actions"},Re={class:"expand-panel"},Ve={class:"meta-block"},ze={class:"meta-block"},xe={class:"meta-block"},Te={class:"metadata-tags"},Ie={class:"expand-actions"},De={class:"cell-time"},Oe={class:"cell-instance"},Le={class:"instance-id"},Ae={class:"instance-ip"},Ee={class:"cell-message"},Ue={class:"cell-actions"},Pe={class:"table-footer"},$e={class:"json-viewer"},Be=ge({__name:"LogSearch",setup(P){const h=Ne(),j=["DEBUG","INFO","WARNING","ERROR","CRITICAL"],Z=[50,100,200],k=b("local");function q(l){if(l instanceof Date)return l;const e=String(l);return/Z$|[+-]\d{2}:\d{2}$|[+-]\d{4}$/.test(e)?new Date(e):new Date(e.endsWith("Z")?e:e+"Z")}function $(l){const e=q(l);if(isNaN(e.getTime()))return"无效时间";const i={year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1};return k.value==="local"?e.toLocaleString("zh-CN",i).replace(/\//g,"-"):e.toLocaleString("zh-CN",{...i,timeZone:k.value}).replace(/\//g,"-")}const o=b({serviceNames:[],timeRange:A(),levels:["INFO","WARNING","ERROR"],methodNames:[],keywords:[],targets:[]}),S=b([]),N=b(!1),u=b({page:1,pageSize:100,total:0,hasNext:!1}),I=b(!1),D=b(null),B=U(()=>h.serviceNames),F=U(()=>!N.value&&o.value.serviceNames.length>0&&o.value.timeRange?.length===2),H=[{text:"近 24 小时",value:()=>{const l=new Date;return[new Date(l.getTime()-1440*60*1e3),l]}},{text:"近 3 天",value:()=>{const l=new Date;return[new Date(l.getTime()-4320*60*1e3),l]}},{text:"近 7 天",value:()=>{const l=new Date;return[new Date(l.getTime()-10080*60*1e3),l]}}],Y=l=>l.getTime()>Date.now(),K=U(()=>D.value?JSON.stringify(D.value,null,2):""),Q=l=>{if(!l||l.length!==2)return;const[e,i]=l;i.getTime()-e.getTime()>10080*60*1e3&&(T.error("时间范围不能超过 7 天"),o.value.timeRange=A())},C=async()=>{if(!F.value){T.warning("请至少选择一个服务并设置时间范围");return}N.value=!0;try{const l=X(),e=await we(l);S.value=e.items,u.value={page:e.page,pageSize:e.page_size,total:e.total,hasNext:e.has_next},S.value.length===1&&L(S.value[0]),e.items.length||T.info("未查询到日志记录,尝试缩小时间范围或调整关键词")}catch(l){console.error(l)}finally{N.value=!1}},X=()=>{const[l,e]=o.value.timeRange,[i,c]=ne(O(o.value.targets)),p=O(o.value.keywords),g=O(o.value.methodNames);return{service_names:o.value.serviceNames,start_time:G(l),end_time:G(e),levels:o.value.levels.length?o.value.levels:void 0,keywords:p.length?p:void 0,method_names:g.length?g:void 0,ip_addresses:i.length?i:void 0,instance_ids:c.length?c:void 0,page:u.value.page,page_size:u.value.pageSize}},O=l=>{const e=[];return l.forEach(i=>{const c=String(i||"").trim();c&&(e.includes(c)||e.push(c))}),e},ee=()=>{o.value={serviceNames:B.value.slice(0,1),timeRange:A(),levels:["INFO","WARNING","ERROR"],methodNames:[],keywords:[],targets:[]},u.value.page=1},le=l=>{u.value.page=l,C()},te=l=>{u.value.pageSize=l,u.value.page=1,C()},L=l=>{D.value=l,I.value=!0},ae=l=>{l.func_name&&!o.value.methodNames.includes(l.func_name)&&o.value.methodNames.push(l.func_name),l.trace_id&&!o.value.keywords.includes(l.trace_id)&&o.value.keywords.push(l.trace_id),T.success("已根据该行更新过滤条件,可重新检索")},M=l=>{const e=l==="mongo"?"/infra/mongo-express":"/infra/rabbitmq";window.open(e,"_blank")},se=l=>{switch(l){case"ERROR":case"CRITICAL":return"danger";case"WARNING":return"warning";case"INFO":case"DEBUG":return"success";default:return"info"}},ne=l=>{const e=[],i=[];return l.forEach(c=>{/^\d+\.\d+\.\d+\.\d+$/.test(c)?e.push(c):i.push(c)}),[e,i]},G=l=>(l instanceof Date?l:new Date(l)).toISOString();function A(){const l=new Date;return[new Date(l.getTime()-1440*60*1e3),l]}return ve(async()=>{h.serviceNames.length||await h.fetchServiceNames(),!o.value.serviceNames.length&&h.serviceNames.length&&(o.value.serviceNames=h.serviceNames.slice(0,1)),o.value.serviceNames.length&&await C()}),(l,e)=>{const i=m("el-button"),c=m("el-alert"),p=m("el-option"),g=m("el-select"),y=m("el-form-item"),w=m("el-col"),oe=m("el-date-picker"),ie=m("el-row"),re=m("el-form"),J=m("el-card"),E=m("el-tag"),v=m("el-table-column"),ue=m("el-table"),de=m("el-pagination"),me=m("el-drawer");return f(),R(he,{title:"业务日志检索",icon:"i-carbon-search"},{actions:n(()=>[a(i,{type:"primary",disabled:!F.value,loading:N.value,onClick:C},{default:n(()=>[...e[12]||(e[12]=[s("i",{class:"i-carbon-search mr-2"},null,-1),s("span",null,"检索",-1)])]),_:1},8,["disabled","loading"]),a(i,{onClick:ee,disabled:N.value},{default:n(()=>[...e[13]||(e[13]=[s("i",{class:"i-carbon-renew mr-2"},null,-1),s("span",null,"重置",-1)])]),_:1},8,["disabled"])]),default:n(()=>[a(c,{type:"info","show-icon":"",class:"mb-4"},{title:n(()=>[...e[14]||(e[14]=[d(" 日志来自 infra_logging.service_logs,时间跨度最大 7 天,若结果为空可尝试缩小时间范围或减少关键词。 ",-1)])]),_:1}),a(J,{class:"filter-card mb-6"},{default:n(()=>[a(re,{model:o.value,"label-width":"120px",onSubmit:e[6]||(e[6]=fe(()=>{},["prevent"]))},{default:n(()=>[a(ie,{gutter:20},{default:n(()=>[a(w,{xs:24,sm:12,lg:8},{default:n(()=>[a(y,{label:"服务"},{default:n(()=>[a(g,{modelValue:o.value.serviceNames,"onUpdate:modelValue":e[0]||(e[0]=t=>o.value.serviceNames=t),multiple:"",filterable:"",placeholder:"请选择服务",loading:W(h).loading,"collapse-tags":"","collapse-tags-tooltip":""},{default:n(()=>[(f(!0),V(x,null,z(B.value,t=>(f(),R(p,{key:t,label:t,value:t},null,8,["label","value"]))),128))]),_:1},8,["modelValue","loading"])]),_:1})]),_:1}),a(w,{xs:24,sm:12,lg:8},{default:n(()=>[a(y,{label:"时间范围"},{default:n(()=>[a(oe,{modelValue:o.value.timeRange,"onUpdate:modelValue":e[1]||(e[1]=t=>o.value.timeRange=t),type:"datetimerange","range-separator":"至","start-placeholder":"开始时间","end-placeholder":"结束时间","disabled-date":Y,shortcuts:H,onChange:Q},null,8,["modelValue"])]),_:1})]),_:1}),a(w,{xs:24,sm:12,lg:8},{default:n(()=>[a(y,{label:"日志等级"},{default:n(()=>[a(g,{modelValue:o.value.levels,"onUpdate:modelValue":e[2]||(e[2]=t=>o.value.levels=t),multiple:"",placeholder:"全部","collapse-tags":""},{default:n(()=>[(f(),V(x,null,z(j,t=>a(p,{key:t,label:t,value:t},null,8,["label","value"])),64))]),_:1},8,["modelValue"])]),_:1})]),_:1}),a(w,{xs:24,sm:12,lg:8},{default:n(()=>[a(y,{label:"方法名"},{default:n(()=>[a(g,{modelValue:o.value.methodNames,"onUpdate:modelValue":e[3]||(e[3]=t=>o.value.methodNames=t),multiple:"","allow-create":"",filterable:"","default-first-option":"",placeholder:"输入后回车添加"},null,8,["modelValue"])]),_:1})]),_:1}),a(w,{xs:24,sm:12,lg:8},{default:n(()=>[a(y,{label:"关键词"},{default:n(()=>[a(g,{modelValue:o.value.keywords,"onUpdate:modelValue":e[4]||(e[4]=t=>o.value.keywords=t),multiple:"","allow-create":"",filterable:"","default-first-option":"",placeholder:"支持多关键词"},null,8,["modelValue"])]),_:1})]),_:1}),a(w,{xs:24,sm:12,lg:8},{default:n(()=>[a(y,{label:"IP / 实例"},{default:n(()=>[a(g,{modelValue:o.value.targets,"onUpdate:modelValue":e[5]||(e[5]=t=>o.value.targets=t),multiple:"","allow-create":"",filterable:"","default-first-option":"",placeholder:"输入 IP 或实例 ID"},null,8,["modelValue"])]),_:1})]),_:1})]),_:1})]),_:1},8,["model"])]),_:1}),a(J,{class:"result-card"},{default:n(()=>[s("div",ke,[s("div",null,[e[15]||(e[15]=s("p",{class:"result-title"},"查询结果",-1)),s("p",Se,"共 "+r(u.value.total)+" 条,展示第 "+r(u.value.page)+" 页",1)]),s("div",Ce,[a(g,{modelValue:k.value,"onUpdate:modelValue":e[7]||(e[7]=t=>k.value=t),size:"small",class:"timezone-select"},{prefix:n(()=>[...e[16]||(e[16]=[s("i",{class:"i-carbon-time"},null,-1)])]),default:n(()=>[a(p,{label:"本地时间",value:"local"}),a(p,{label:"UTC",value:"UTC"}),a(p,{label:"Asia/Shanghai",value:"Asia/Shanghai"}),a(p,{label:"America/New_York",value:"America/New_York"}),a(p,{label:"Europe/London",value:"Europe/London"})]),_:1},8,["modelValue"]),u.value.hasNext?(f(),R(E,{key:0,type:"warning"},{default:n(()=>[...e[17]||(e[17]=[d("仍有更多结果",-1)])]),_:1})):_e("",!0)])]),a(ue,{data:S.value,loading:N.value,stripe:"",border:"",class:"log-table","empty-text":"暂无日志"},{default:n(()=>[a(v,{type:"expand"},{default:n(({row:t})=>[s("div",Re,[s("div",Ve,[s("p",null,[e[18]||(e[18]=s("strong",null,"Trace ID:",-1)),d(r(t.trace_id||"-"),1)]),s("p",null,[e[19]||(e[19]=s("strong",null,"Logger:",-1)),d(r(t.logger_name||"-"),1)]),s("p",null,[e[20]||(e[20]=s("strong",null,"源文件:",-1)),d(r(t.file)+":"+r(t.line_no),1)])]),s("div",ze,[s("p",null,[e[21]||(e[21]=s("strong",null,"函数:",-1)),d(r(t.func_name||"-"),1)]),s("p",null,[e[22]||(e[22]=s("strong",null,"主机:",-1)),d(r(t.host||"-")+" / "+r(t.ip||"-"),1)]),s("p",null,[e[23]||(e[23]=s("strong",null,"创建时间:",-1)),d(r($(t.created_at||t.timestamp)),1)])]),s("div",xe,[e[24]||(e[24]=s("p",null,[s("strong",null,"Metadata:")],-1)),s("div",Te,[(f(!0),V(x,null,z(t.metadata_flattened||[],_=>(f(),R(E,{key:_,type:"info",size:"small"},{default:n(()=>[d(r(_),1)]),_:2},1024))),128))])])]),s("div",Ie,[a(i,{link:"",type:"primary",size:"small",onClick:_=>L(t)},{default:n(()=>[...e[25]||(e[25]=[s("i",{class:"i-carbon-code mr-1"},null,-1),d("查看原始 JSON ",-1)])]),_:1},8,["onClick"]),a(i,{link:"",type:"success",size:"small",onClick:e[8]||(e[8]=_=>M("mongo"))},{default:n(()=>[...e[26]||(e[26]=[s("i",{class:"i-carbon-data-base mr-1"},null,-1),d("打开 Mongo 控制台 ",-1)])]),_:1}),a(i,{link:"",type:"warning",size:"small",onClick:e[9]||(e[9]=_=>M("rabbitmq"))},{default:n(()=>[...e[27]||(e[27]=[s("i",{class:"i-carbon-data-1 mr-1"},null,-1),d("查看 RabbitMQ 管理台 ",-1)])]),_:1})])]),_:1}),a(v,{prop:"timestamp",label:"时间",width:"140","class-name":"cell-compact"},{default:n(({row:t})=>[s("div",De,[s("span",null,r($(t.timestamp)),1),s("small",null,r(W(ye)(t.timestamp)),1)])]),_:1}),a(v,{prop:"service_name",label:"服务",width:"90","class-name":"cell-compact","show-overflow-tooltip":""}),a(v,{prop:"host",label:"实例",width:"130","class-name":"cell-compact"},{default:n(({row:t})=>[s("div",Oe,[s("span",Le,r(t.host||"-"),1),s("span",Ae,r(t.ip||""),1)])]),_:1}),a(v,{prop:"level",label:"Level",width:"85",align:"center"},{default:n(({row:t})=>[a(E,{type:se(t.level),size:"small"},{default:n(()=>[d(r(t.level),1)]),_:2},1032,["type"])]),_:1}),a(v,{prop:"message",label:"Message","min-width":"500"},{default:n(({row:t})=>[s("div",Ee,r(t.message),1)]),_:1}),a(v,{prop:"trace_id",label:"Trace","min-width":"180","class-name":"cell-compact cell-mono"}),a(v,{prop:"func_name",label:"Method","min-width":"150","class-name":"cell-compact cell-mono"}),a(v,{label:"操作",width:"90",align:"center"},{default:n(({row:t})=>[s("div",Ue,[a(i,{link:"",type:"primary",size:"small",onClick:_=>L(t)},{default:n(()=>[...e[28]||(e[28]=[d(" JSON ",-1)])]),_:1},8,["onClick"]),a(i,{link:"",type:"warning",size:"small",class:"btn-keyword",onClick:_=>ae(t)},{default:n(()=>[...e[29]||(e[29]=[d(" +关键词 ",-1)])]),_:1},8,["onClick"])])]),_:1})]),_:1},8,["data","loading"]),s("div",Pe,[a(g,{modelValue:u.value.pageSize,"onUpdate:modelValue":e[10]||(e[10]=t=>u.value.pageSize=t),size:"small",onChange:te},{default:n(()=>[(f(),V(x,null,z(Z,t=>a(p,{key:t,label:`${t} 条/页`,value:t},null,8,["label","value"])),64))]),_:1},8,["modelValue"]),a(de,{layout:"prev, pager, next","current-page":u.value.page,"page-size":u.value.pageSize,total:u.value.total,onCurrentChange:le},null,8,["current-page","page-size","total"])])]),_:1}),a(me,{modelValue:I.value,"onUpdate:modelValue":e[11]||(e[11]=t=>I.value=t),title:"日志详情 (JSON)",size:"40%"},{default:n(()=>[s("pre",$e,r(K.value),1)]),_:1},8,["modelValue"])]),_:1})}}}),We=be(Be,[["__scopeId","data-v-c13a1ce4"]]);export{We as default};
|
|
1
|
+
import{L as ce,M as pe,d as ge,r as b,B as U,o as ve,g as R,b as f,w as n,i as a,s as d,j as m,t as fe,k as W,c as V,E as z,F as x,e as s,y as r,h as _e,G as T,_ as be}from"./index-Eu9iwQmC.js";import{P as he}from"./PageContainer-CVLD10ut.js";import{u as Ne}from"./service-BlXlgg12.js";import{a as ye}from"./format-Cuzxgna9.js";const we=P=>ce.Post(pe.OPSBFF_LOG_SEARCH,P),ke={class:"result-header"},Se={class:"result-desc"},Ce={class:"result-actions"},Re={class:"expand-panel"},Ve={class:"meta-block"},ze={class:"meta-block"},xe={class:"meta-block"},Te={class:"metadata-tags"},De={class:"expand-actions"},Ie={class:"cell-time"},Oe={class:"cell-instance"},Le={class:"instance-id"},Ae={class:"instance-ip"},Ee={class:"cell-message"},Ue={class:"cell-actions"},Pe={class:"table-footer"},$e={class:"json-viewer"},Be=ge({__name:"LogSearch",setup(P){const h=Ne(),j=["DEBUG","INFO","WARNING","ERROR","CRITICAL"],Z=[50,100,200],k=b("local");function q(l){if(l instanceof Date)return l;const e=String(l);return/Z$|[+-]\d{2}:\d{2}$|[+-]\d{4}$/.test(e)?new Date(e):new Date(e.endsWith("Z")?e:e+"Z")}function $(l){const e=q(l);if(isNaN(e.getTime()))return"无效时间";const i={year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1};return k.value==="local"?e.toLocaleString("zh-CN",i).replace(/\//g,"-"):e.toLocaleString("zh-CN",{...i,timeZone:k.value}).replace(/\//g,"-")}const o=b({serviceNames:[],timeRange:A(),levels:["INFO","WARNING","ERROR"],methodNames:[],keywords:[],targets:[]}),S=b([]),N=b(!1),u=b({page:1,pageSize:100,total:0,hasNext:!1}),D=b(!1),I=b(null),B=U(()=>h.serviceNames),F=U(()=>!N.value&&o.value.serviceNames.length>0&&o.value.timeRange?.length===2),H=[{text:"近 24 小时",value:()=>{const l=new Date;return[new Date(l.getTime()-1440*60*1e3),l]}},{text:"近 3 天",value:()=>{const l=new Date;return[new Date(l.getTime()-4320*60*1e3),l]}},{text:"近 7 天",value:()=>{const l=new Date;return[new Date(l.getTime()-10080*60*1e3),l]}}],Y=l=>l.getTime()>Date.now(),K=U(()=>I.value?JSON.stringify(I.value,null,2):""),Q=l=>{if(!l||l.length!==2)return;const[e,i]=l;i.getTime()-e.getTime()>10080*60*1e3&&(T.error("时间范围不能超过 7 天"),o.value.timeRange=A())},C=async()=>{if(!F.value){T.warning("请至少选择一个服务并设置时间范围");return}N.value=!0;try{const l=X(),e=await we(l);S.value=e.items,u.value={page:e.page,pageSize:e.page_size,total:e.total,hasNext:e.has_next},S.value.length===1&&L(S.value[0]),e.items.length||T.info("未查询到日志记录,尝试缩小时间范围或调整关键词")}catch(l){console.error(l)}finally{N.value=!1}},X=()=>{const[l,e]=o.value.timeRange,[i,c]=ne(O(o.value.targets)),p=O(o.value.keywords),g=O(o.value.methodNames);return{service_names:o.value.serviceNames,start_time:G(l),end_time:G(e),levels:o.value.levels.length?o.value.levels:void 0,keywords:p.length?p:void 0,method_names:g.length?g:void 0,ip_addresses:i.length?i:void 0,instance_ids:c.length?c:void 0,page:u.value.page,page_size:u.value.pageSize}},O=l=>{const e=[];return l.forEach(i=>{const c=String(i||"").trim();c&&(e.includes(c)||e.push(c))}),e},ee=()=>{o.value={serviceNames:B.value.slice(0,1),timeRange:A(),levels:["INFO","WARNING","ERROR"],methodNames:[],keywords:[],targets:[]},u.value.page=1},le=l=>{u.value.page=l,C()},te=l=>{u.value.pageSize=l,u.value.page=1,C()},L=l=>{I.value=l,D.value=!0},ae=l=>{l.func_name&&!o.value.methodNames.includes(l.func_name)&&o.value.methodNames.push(l.func_name),l.trace_id&&!o.value.keywords.includes(l.trace_id)&&o.value.keywords.push(l.trace_id),T.success("已根据该行更新过滤条件,可重新检索")},M=l=>{const e=l==="mongo"?"/infra/mongo-express":"/infra/rabbitmq";window.open(e,"_blank")},se=l=>{switch(l){case"ERROR":case"CRITICAL":return"danger";case"WARNING":return"warning";case"INFO":case"DEBUG":return"success";default:return"info"}},ne=l=>{const e=[],i=[];return l.forEach(c=>{/^\d+\.\d+\.\d+\.\d+$/.test(c)?e.push(c):i.push(c)}),[e,i]},G=l=>(l instanceof Date?l:new Date(l)).toISOString();function A(){const l=new Date;return[new Date(l.getTime()-1440*60*1e3),l]}return ve(async()=>{h.serviceNames.length||await h.fetchServiceNames(),!o.value.serviceNames.length&&h.serviceNames.length&&(o.value.serviceNames=h.serviceNames.slice(0,1)),o.value.serviceNames.length&&await C()}),(l,e)=>{const i=m("el-button"),c=m("el-alert"),p=m("el-option"),g=m("el-select"),y=m("el-form-item"),w=m("el-col"),oe=m("el-date-picker"),ie=m("el-row"),re=m("el-form"),J=m("el-card"),E=m("el-tag"),v=m("el-table-column"),ue=m("el-table"),de=m("el-pagination"),me=m("el-drawer");return f(),R(he,{title:"业务日志检索",icon:"i-carbon-search"},{actions:n(()=>[a(i,{type:"primary",disabled:!F.value,loading:N.value,onClick:C},{default:n(()=>[...e[12]||(e[12]=[s("i",{class:"i-carbon-search mr-2"},null,-1),s("span",null,"检索",-1)])]),_:1},8,["disabled","loading"]),a(i,{onClick:ee,disabled:N.value},{default:n(()=>[...e[13]||(e[13]=[s("i",{class:"i-carbon-renew mr-2"},null,-1),s("span",null,"重置",-1)])]),_:1},8,["disabled"])]),default:n(()=>[a(c,{type:"info","show-icon":"",class:"mb-4"},{title:n(()=>[...e[14]||(e[14]=[d(" 日志来自 infra_logging.service_logs,时间跨度最大 7 天,若结果为空可尝试缩小时间范围或减少关键词。 ",-1)])]),_:1}),a(J,{class:"filter-card mb-6"},{default:n(()=>[a(re,{model:o.value,"label-width":"120px",onSubmit:e[6]||(e[6]=fe(()=>{},["prevent"]))},{default:n(()=>[a(ie,{gutter:20},{default:n(()=>[a(w,{xs:24,sm:12,lg:8},{default:n(()=>[a(y,{label:"服务"},{default:n(()=>[a(g,{modelValue:o.value.serviceNames,"onUpdate:modelValue":e[0]||(e[0]=t=>o.value.serviceNames=t),multiple:"",filterable:"",placeholder:"请选择服务",loading:W(h).loading,"collapse-tags":"","collapse-tags-tooltip":""},{default:n(()=>[(f(!0),V(x,null,z(B.value,t=>(f(),R(p,{key:t,label:t,value:t},null,8,["label","value"]))),128))]),_:1},8,["modelValue","loading"])]),_:1})]),_:1}),a(w,{xs:24,sm:12,lg:8},{default:n(()=>[a(y,{label:"时间范围"},{default:n(()=>[a(oe,{modelValue:o.value.timeRange,"onUpdate:modelValue":e[1]||(e[1]=t=>o.value.timeRange=t),type:"datetimerange","range-separator":"至","start-placeholder":"开始时间","end-placeholder":"结束时间","disabled-date":Y,shortcuts:H,onChange:Q},null,8,["modelValue"])]),_:1})]),_:1}),a(w,{xs:24,sm:12,lg:8},{default:n(()=>[a(y,{label:"日志等级"},{default:n(()=>[a(g,{modelValue:o.value.levels,"onUpdate:modelValue":e[2]||(e[2]=t=>o.value.levels=t),multiple:"",placeholder:"全部","collapse-tags":""},{default:n(()=>[(f(),V(x,null,z(j,t=>a(p,{key:t,label:t,value:t},null,8,["label","value"])),64))]),_:1},8,["modelValue"])]),_:1})]),_:1}),a(w,{xs:24,sm:12,lg:8},{default:n(()=>[a(y,{label:"方法名"},{default:n(()=>[a(g,{modelValue:o.value.methodNames,"onUpdate:modelValue":e[3]||(e[3]=t=>o.value.methodNames=t),multiple:"","allow-create":"",filterable:"","default-first-option":"",placeholder:"输入后回车添加"},null,8,["modelValue"])]),_:1})]),_:1}),a(w,{xs:24,sm:12,lg:8},{default:n(()=>[a(y,{label:"关键词"},{default:n(()=>[a(g,{modelValue:o.value.keywords,"onUpdate:modelValue":e[4]||(e[4]=t=>o.value.keywords=t),multiple:"","allow-create":"",filterable:"","default-first-option":"",placeholder:"支持多关键词"},null,8,["modelValue"])]),_:1})]),_:1}),a(w,{xs:24,sm:12,lg:8},{default:n(()=>[a(y,{label:"IP / 实例"},{default:n(()=>[a(g,{modelValue:o.value.targets,"onUpdate:modelValue":e[5]||(e[5]=t=>o.value.targets=t),multiple:"","allow-create":"",filterable:"","default-first-option":"",placeholder:"输入 IP 或实例 ID"},null,8,["modelValue"])]),_:1})]),_:1})]),_:1})]),_:1},8,["model"])]),_:1}),a(J,{class:"result-card"},{default:n(()=>[s("div",ke,[s("div",null,[e[15]||(e[15]=s("p",{class:"result-title"},"查询结果",-1)),s("p",Se,"共 "+r(u.value.total)+" 条,展示第 "+r(u.value.page)+" 页",1)]),s("div",Ce,[a(g,{modelValue:k.value,"onUpdate:modelValue":e[7]||(e[7]=t=>k.value=t),size:"small",class:"timezone-select"},{prefix:n(()=>[...e[16]||(e[16]=[s("i",{class:"i-carbon-time"},null,-1)])]),default:n(()=>[a(p,{label:"本地时间",value:"local"}),a(p,{label:"UTC",value:"UTC"}),a(p,{label:"Asia/Shanghai",value:"Asia/Shanghai"}),a(p,{label:"America/New_York",value:"America/New_York"}),a(p,{label:"Europe/London",value:"Europe/London"})]),_:1},8,["modelValue"]),u.value.hasNext?(f(),R(E,{key:0,type:"warning"},{default:n(()=>[...e[17]||(e[17]=[d("仍有更多结果",-1)])]),_:1})):_e("",!0)])]),a(ue,{data:S.value,loading:N.value,stripe:"",border:"",class:"log-table","empty-text":"暂无日志"},{default:n(()=>[a(v,{type:"expand"},{default:n(({row:t})=>[s("div",Re,[s("div",Ve,[s("p",null,[e[18]||(e[18]=s("strong",null,"Trace ID:",-1)),d(r(t.trace_id||"-"),1)]),s("p",null,[e[19]||(e[19]=s("strong",null,"Logger:",-1)),d(r(t.logger_name||"-"),1)]),s("p",null,[e[20]||(e[20]=s("strong",null,"源文件:",-1)),d(r(t.file)+":"+r(t.line_no),1)])]),s("div",ze,[s("p",null,[e[21]||(e[21]=s("strong",null,"函数:",-1)),d(r(t.func_name||"-"),1)]),s("p",null,[e[22]||(e[22]=s("strong",null,"主机:",-1)),d(r(t.host||"-")+" / "+r(t.ip||"-"),1)]),s("p",null,[e[23]||(e[23]=s("strong",null,"创建时间:",-1)),d(r($(t.created_at||t.timestamp)),1)])]),s("div",xe,[e[24]||(e[24]=s("p",null,[s("strong",null,"Metadata:")],-1)),s("div",Te,[(f(!0),V(x,null,z(t.metadata_flattened||[],_=>(f(),R(E,{key:_,type:"info",size:"small"},{default:n(()=>[d(r(_),1)]),_:2},1024))),128))])])]),s("div",De,[a(i,{link:"",type:"primary",size:"small",onClick:_=>L(t)},{default:n(()=>[...e[25]||(e[25]=[s("i",{class:"i-carbon-code mr-1"},null,-1),d("查看原始 JSON ",-1)])]),_:1},8,["onClick"]),a(i,{link:"",type:"success",size:"small",onClick:e[8]||(e[8]=_=>M("mongo"))},{default:n(()=>[...e[26]||(e[26]=[s("i",{class:"i-carbon-data-base mr-1"},null,-1),d("打开 Mongo 控制台 ",-1)])]),_:1}),a(i,{link:"",type:"warning",size:"small",onClick:e[9]||(e[9]=_=>M("rabbitmq"))},{default:n(()=>[...e[27]||(e[27]=[s("i",{class:"i-carbon-data-1 mr-1"},null,-1),d("查看 RabbitMQ 管理台 ",-1)])]),_:1})])]),_:1}),a(v,{prop:"timestamp",label:"时间",width:"140","class-name":"cell-compact"},{default:n(({row:t})=>[s("div",Ie,[s("span",null,r($(t.timestamp)),1),s("small",null,r(W(ye)(t.timestamp)),1)])]),_:1}),a(v,{prop:"service_name",label:"服务",width:"90","class-name":"cell-compact","show-overflow-tooltip":""}),a(v,{prop:"host",label:"实例",width:"130","class-name":"cell-compact"},{default:n(({row:t})=>[s("div",Oe,[s("span",Le,r(t.host||"-"),1),s("span",Ae,r(t.ip||""),1)])]),_:1}),a(v,{prop:"level",label:"Level",width:"85",align:"center"},{default:n(({row:t})=>[a(E,{type:se(t.level),size:"small"},{default:n(()=>[d(r(t.level),1)]),_:2},1032,["type"])]),_:1}),a(v,{prop:"message",label:"Message","min-width":"500"},{default:n(({row:t})=>[s("div",Ee,r(t.message),1)]),_:1}),a(v,{prop:"trace_id",label:"Trace","min-width":"180","class-name":"cell-compact cell-mono"}),a(v,{prop:"func_name",label:"Method","min-width":"150","class-name":"cell-compact cell-mono"}),a(v,{label:"操作",width:"90",align:"center"},{default:n(({row:t})=>[s("div",Ue,[a(i,{link:"",type:"primary",size:"small",onClick:_=>L(t)},{default:n(()=>[...e[28]||(e[28]=[d(" JSON ",-1)])]),_:1},8,["onClick"]),a(i,{link:"",type:"warning",size:"small",class:"btn-keyword",onClick:_=>ae(t)},{default:n(()=>[...e[29]||(e[29]=[d(" +关键词 ",-1)])]),_:1},8,["onClick"])])]),_:1})]),_:1},8,["data","loading"]),s("div",Pe,[a(g,{modelValue:u.value.pageSize,"onUpdate:modelValue":e[10]||(e[10]=t=>u.value.pageSize=t),size:"small",onChange:te},{default:n(()=>[(f(),V(x,null,z(Z,t=>a(p,{key:t,label:`${t} 条/页`,value:t},null,8,["label","value"])),64))]),_:1},8,["modelValue"]),a(de,{layout:"prev, pager, next","current-page":u.value.page,"page-size":u.value.pageSize,total:u.value.total,onCurrentChange:le},null,8,["current-page","page-size","total"])])]),_:1}),a(me,{modelValue:D.value,"onUpdate:modelValue":e[11]||(e[11]=t=>D.value=t),title:"日志详情 (JSON)",size:"40%"},{default:n(()=>[s("pre",$e,r(K.value),1)]),_:1},8,["modelValue"])]),_:1})}}}),We=be(Be,[["__scopeId","data-v-c13a1ce4"]]);export{We as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.login-container[data-v-247ecbd2]{min-height:100vh;display:flex;align-items:center;justify-content:center;background:var(--bg-page);padding:20px}.login-card[data-v-247ecbd2]{width:100%;max-width:440px;padding:44px 40px;border-radius:var(--radius-xl, 16px);background:var(--bg-container, #fff);box-shadow:var(--shadow-lg, 0 8px 32px rgba(0, 0, 0, .08));border:1px solid var(--border-secondary, #e5e7eb)}.login-header[data-v-247ecbd2]{text-align:center;margin-bottom:32px}.logo-icon[data-v-247ecbd2]{width:56px;height:56px;margin:0 auto 16px;display:flex;align-items:center;justify-content:center;border-radius:var(--radius-lg, 12px);background:var(--gradient-primary, linear-gradient(135deg, #6366f1, #8b5cf6));box-shadow:var(--shadow-sm)}.login-title[data-v-247ecbd2]{font-size:22px;font-weight:600;color:var(--text-primary);margin-bottom:4px}.login-subtitle[data-v-247ecbd2]{font-size:14px;color:var(--text-tertiary)}.login-form[data-v-247ecbd2] .el-form-item{margin-bottom:20px}.login-form[data-v-247ecbd2] .el-input__wrapper{height:48px;border-radius:var(--radius-base, 10px);padding:0 14px;box-shadow:0 0 0 1px var(--border-secondary, #dcdfe6) inset;transition:box-shadow .2s ease}.login-form[data-v-247ecbd2] .el-input__wrapper:hover{box-shadow:0 0 0 1px var(--color-primary, #409eff) inset}.login-form[data-v-247ecbd2] .el-input__wrapper.is-focus{box-shadow:0 0 0 2px var(--color-primary, #409eff) inset}.login-form[data-v-247ecbd2] .el-input__prefix{font-size:17px;color:var(--text-tertiary, #909399)}.login-form[data-v-247ecbd2] .el-input__inner{font-size:15px}.captcha-row[data-v-247ecbd2]{display:flex;gap:12px;width:100%}.captcha-input[data-v-247ecbd2]{flex:1}.captcha-image-wrapper[data-v-247ecbd2]{width:168px;height:48px;border-radius:var(--radius-base, 10px);overflow:hidden;cursor:pointer;border:1px solid var(--border-secondary, #e5e7eb);flex-shrink:0;display:flex;align-items:center;justify-content:center;background:#fff;transition:border-color .2s,opacity .2s}.captcha-image-wrapper[data-v-247ecbd2]:hover{border-color:var(--color-primary, #409eff);opacity:.92}.captcha-image[data-v-247ecbd2]{width:100%;height:100%;object-fit:contain}.captcha-placeholder[data-v-247ecbd2]{font-size:22px;color:var(--text-tertiary)}.submit-item[data-v-247ecbd2]{margin-top:8px;margin-bottom:0}.login-btn[data-v-247ecbd2]{width:100%;height:48px;font-size:16px;font-weight:600;letter-spacing:2px;border-radius:var(--radius-base, 10px)}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{d as M,u as U,r as t,a as E,o as K,c as V,b as m,e as b,f as R,g as B,h as N,i as s,j as f,w as r,k,l as $,m as P,n as j,p as z,q as H,s as O,t as W,v as D,x as F,_ as G}from"./index-Eu9iwQmC.js";async function J(C,v){const _=globalThis.crypto?.subtle;if(!_)throw new Error("当前环境不支持 Web Crypto(需 HTTPS 或 localhost)");const c=new TextEncoder().encode(`${C}${v}`),l=await _.digest("SHA-256",c);return Array.from(new Uint8Array(l)).map(i=>i.toString(16).padStart(2,"0")).join("")}const Q={class:"login-container"},X={class:"login-card"},Y={class:"captcha-row"},Z=["src"],ee={key:1,class:"captcha-placeholder"},ae=M({__name:"LoginView",setup(C){const v=F(),_=U(),c=t(),l=t(!1),i=t(!1),h=t(""),S=t(""),L=t(""),d=t(""),o=t(!1),T=t(""),a=E({username:"",password:"",captcha_answer:""}),q={username:[{required:!0,message:"请输入用户名",trigger:"blur"}],password:[{required:!0,message:"请输入密码",trigger:"blur"}],captcha_answer:[{required:!0,message:"请输入验证码",trigger:"blur"}]};async function y(){i.value=!0;try{const u=await D();S.value=u.captcha_id,h.value=u.image_base64,L.value=u.password_salt}catch{h.value=""}finally{i.value=!1}}async function w(){if(!(!c.value||!await c.value.validate().catch(()=>!1))){l.value=!0,d.value="",o.value=!1;try{const e=await J(L.value,a.password),p=await _.doLogin({username:a.username,password:e,captcha_id:S.value,captcha_answer:a.captcha_answer});p.next_step==="totp_bind"?v.push({name:"TotpBind"}):p.next_step==="totp_verify"&&v.push({name:"TotpVerify"})}catch(e){e?.code==="60003"?(o.value=!0,T.value=e?.message||"IP 已锁定,请稍后重试"):d.value=e?.message||"登录失败",a.captcha_answer="",y()}finally{l.value=!1}}}return K(()=>{y()}),(u,e)=>{const p=f("el-alert"),x=f("el-input"),g=f("el-form-item"),A=f("el-button"),I=f("el-form");return m(),V("div",Q,[b("div",X,[e[5]||(e[5]=R('<div class="login-header" data-v-247ecbd2><div class="logo-icon" data-v-247ecbd2><i class="i-carbon-cloud-satellite text-3xl" style="color:white;" data-v-247ecbd2></i></div><h2 class="login-title" data-v-247ecbd2>OPS 管理平台</h2><p class="login-subtitle" data-v-247ecbd2>请输入账号信息登录</p></div>',1)),o.value?(m(),B(p,{key:0,type:"error",title:T.value,"show-icon":"",closable:!1,class:"mb-4"},null,8,["title"])):N("",!0),s(I,{ref_key:"formRef",ref:c,model:a,rules:q,"label-width":"0",size:"large",class:"login-form",onSubmit:W(w,["prevent"])},{default:r(()=>[s(g,{prop:"username"},{default:r(()=>[s(x,{modelValue:a.username,"onUpdate:modelValue":e[0]||(e[0]=n=>a.username=n),placeholder:"用户名","prefix-icon":k($),disabled:l.value||o.value,autocomplete:"username"},null,8,["modelValue","prefix-icon","disabled"])]),_:1}),s(g,{prop:"password"},{default:r(()=>[s(x,{modelValue:a.password,"onUpdate:modelValue":e[1]||(e[1]=n=>a.password=n),type:"password",placeholder:"密码","prefix-icon":k(j),"show-password":"",disabled:l.value||o.value,autocomplete:"current-password",onKeyup:P(w,["enter"])},null,8,["modelValue","prefix-icon","disabled"])]),_:1}),s(g,{prop:"captcha_answer"},{default:r(()=>[b("div",Y,[s(x,{modelValue:a.captcha_answer,"onUpdate:modelValue":e[2]||(e[2]=n=>a.captcha_answer=n),placeholder:"验证码","prefix-icon":k(z),disabled:l.value||o.value,class:"captcha-input",maxlength:"8",onKeyup:P(w,["enter"])},null,8,["modelValue","prefix-icon","disabled"]),b("div",{class:"captcha-image-wrapper",title:"点击刷新验证码",onClick:y},[h.value?(m(),V("img",{key:0,src:h.value,alt:"验证码",class:"captcha-image"},null,8,Z)):(m(),V("div",ee,[b("i",{class:H(["i-carbon-renew",{"animate-spin":i.value}])},null,2)]))])])]),_:1}),s(g,{class:"submit-item"},{default:r(()=>[s(A,{type:"primary",class:"login-btn",loading:l.value,disabled:o.value,onClick:w},{default:r(()=>[...e[4]||(e[4]=[O(" 登 录 ",-1)])]),_:1},8,["loading","disabled"])]),_:1})]),_:1},8,["model"]),d.value&&!o.value?(m(),B(p,{key:1,type:"warning",title:d.value,"show-icon":"",closable:"",class:"mt-2",onClose:e[3]||(e[3]=n=>d.value="")},null,8,["title"])):N("",!0)])])}}}),se=G(ae,[["__scopeId","data-v-247ecbd2"]]);export{se as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{c as ee,d as M,I as te,H as se,e as ae,u as le,O as x,D as z,f as c,g as Q,h as oe}from"./service-operation-6GzLw2Z1.js";import{d as J,x as g,g as V,b as r,j as D,n as j,w as E,c as p,h as S,e,t as d,_ as K,r as L,i as P,y as a,F as H,B as Y,l as $,H as ne,E as q,G as W}from"./index-CiFlm8oc.js";const re=J({__name:"StatusTag",props:{status:{},type:{default:"service"},size:{default:"default"},effect:{default:"light"},showIcon:{type:Boolean,default:!0}},setup(A){const k=A,m=s=>te[s],f=s=>se[s],T=s=>ae[s],b=g(()=>{const s=k.status.toString();switch(k.type){case"instance":return m(s)?.type||"info";case"health":return f(s)?.type||"info";case"operation":return T(s)?.type||"info";case"service":default:return ee[s]||"info"}}),t=g(()=>{const s=k.status.toString();switch(k.type){case"instance":return m(s)?.label||s;case"health":return f(s)?.label||s;case"operation":return T(s)?.label||s;case"service":default:return M[s]?.label||s}}),i=g(()=>{const s=k.status.toString();switch(k.type){case"instance":return m(s)?.icon||"";case"health":return f(s)?.icon||"";case"operation":return T(s)?.icon||"";case"service":default:return M[s]?.icon||""}}),v=g(()=>{if(k.type==="service"){const s=M[k.status];return`${s?.color||""} ${s?.bgColor||""}`}return""});return(s,I)=>{const C=D("el-tag");return r(),V(C,{type:b.value,effect:s.effect,size:s.size,class:j(["status-tag",v.value])},{default:E(()=>[s.showIcon?(r(),p("i",{key:0,class:j([i.value,"mr-1"])},null,2)):S("",!0),e("span",null,d(t.value),1)]),_:1},8,["type","effect","size","class"])}}}),ie=K(re,[["__scopeId","data-v-5fdd77e5"]]),ue={class:"service-list"},ce={class:"service-list"},de={class:"service-list"},pe=J({__name:"ServiceOperationDialog",props:{modelValue:{type:Boolean},operation:{},serviceNames:{}},emits:["update:modelValue","success","operationSubmitted"],setup(A,{emit:k}){const m=A,f=k,T=le(),b=L(),t=L(!1),i=L({confirmText:""}),v=g({get:()=>m.modelValue,set:n=>f("update:modelValue",n)}),s=g(()=>({[x.RESTART]:"重启服务",[x.START]:"启动服务",[x.STOP]:"停止服务",[x.REBUILD]:"重建服务",[z.DELETE]:"删除服务信息"})[m.operation]),I={confirmText:[{required:!0,message:"请输入服务名称以确认删除",trigger:"blur"}]},C=()=>{b.value?.resetFields(),i.value.confirmText="",v.value=!1},F=async()=>{if(m.operation===z.DELETE){if(!b.value)return;try{await b.value.validate()}catch{return}}t.value=!0;try{let n;switch(m.operation){case x.RESTART:n=await T.restart(m.serviceNames);break;case x.START:n=await T.start(m.serviceNames);break;case x.STOP:n=await T.stop(m.serviceNames);break;case x.REBUILD:n=await T.rebuild(m.serviceNames);break;case z.DELETE:await T.remove(m.serviceNames[0]),f("success"),C();return}n&&(f("operationSubmitted",n),C())}catch(n){console.error("操作失败:",n)}finally{t.value=!1}};return(n,l)=>{const U=D("el-alert"),B=D("el-input"),w=D("el-form-item"),R=D("el-form"),h=D("el-button"),G=D("el-dialog");return r(),V(G,{modelValue:v.value,"onUpdate:modelValue":l[1]||(l[1]=y=>v.value=y),title:s.value,width:"500px",onClose:C},{footer:E(()=>[P(h,{onClick:C},{default:E(()=>[...l[10]||(l[10]=[$("取消",-1)])]),_:1}),P(h,{type:"primary",loading:t.value,onClick:F,disabled:n.operation===a(z).DELETE&&i.value.confirmText!==n.serviceNames[0]},{default:E(()=>[...l[11]||(l[11]=[$(" 确认 ",-1)])]),_:1},8,["loading","disabled"])]),default:E(()=>[P(R,{ref_key:"formRef",ref:b,model:i.value,rules:I,"label-width":"100px"},{default:E(()=>[n.operation===a(x).RESTART?(r(),V(U,{key:0,title:"重启服务",type:"warning",closable:!1,"show-icon":"",class:"mb-4"},{default:E(()=>[l[2]||(l[2]=e("p",null,"此操作将重启以下服务:",-1)),e("ul",ue,[(r(!0),p(H,null,Y(n.serviceNames,y=>(r(),p("li",{key:y},d(y),1))),128))])]),_:1})):S("",!0),n.operation===a(x).START?(r(),V(U,{key:1,title:"启动服务",type:"success",closable:!1,"show-icon":"",class:"mb-4"},{default:E(()=>[l[3]||(l[3]=e("p",null,"此操作将启动以下服务:",-1)),e("ul",ce,[(r(!0),p(H,null,Y(n.serviceNames,y=>(r(),p("li",{key:y},d(y),1))),128))])]),_:1})):S("",!0),n.operation===a(x).STOP?(r(),V(U,{key:2,title:"停止服务",type:"error",closable:!1,"show-icon":"",class:"mb-4"},{default:E(()=>[l[4]||(l[4]=e("p",null,"⚠️ 此操作将停止以下服务:",-1)),e("ul",de,[(r(!0),p(H,null,Y(n.serviceNames,y=>(r(),p("li",{key:y},d(y),1))),128))]),l[5]||(l[5]=e("p",{class:"mt-2"},"停止后服务将无法访问,请谨慎操作!",-1))]),_:1})):S("",!0),n.operation===a(z).DELETE?(r(),p(H,{key:3},[P(U,{title:"删除服务信息",type:"error",closable:!1,"show-icon":"",class:"mb-4"},{default:E(()=>[e("p",null,[l[6]||(l[6]=$("⚠️ 此操作将删除服务 ",-1)),e("strong",null,d(n.serviceNames[0]),1),l[7]||(l[7]=$(" 的基本信息记录",-1))]),l[8]||(l[8]=e("p",{class:"mt-2"},[e("strong",null,"注意:")],-1)),l[9]||(l[9]=e("ul",{class:"warning-list"},[e("li",null,"只删除 service_info_tbl 中的记录"),e("li",null,"不会删除实例记录(service_registry_tbl)"),e("li",null,"不会删除配置记录(service_config_tbl)"),e("li",null,"建议先停止服务实例,再删除配置,最后删除服务信息")],-1))]),_:1}),P(w,{label:"确认操作",prop:"confirmText"},{default:E(()=>[P(B,{modelValue:i.value.confirmText,"onUpdate:modelValue":l[0]||(l[0]=y=>i.value.confirmText=y),placeholder:"请输入服务名称以确认删除"},null,8,["modelValue"])]),_:1})],64)):S("",!0)]),_:1},8,["model"])]),_:1},8,["modelValue","title"])}}}),Me=K(pe,[["__scopeId","data-v-c06a7005"]]);function me(A={}){const{interval:k=2e3,timeout:m=300*1e3,onProgress:f,onSuccess:T,onError:b,onTimeout:t}=A,i=L(null),v=L(!1),s=L(null);let I=null,C=null;const F=g(()=>{if(!i.value)return!1;const N=i.value.status;return N===c.SUCCESS||N===c.FAILED}),n=g(()=>i.value?.status===c.SUCCESS),l=g(()=>i.value?.status===c.FAILED),U=g(()=>i.value?.status===c.PENDING),B=g(()=>i.value?.status===c.RUNNING),w=()=>{I!==null&&(clearInterval(I),I=null),C!==null&&(clearTimeout(C),C=null)},R=async N=>{w(),v.value=!0,s.value=null,i.value=null;try{const _=await Q(N);if(i.value=_,_.status===c.SUCCESS||_.status===c.FAILED){v.value=!1,h(_);return}f?.(_)}catch(_){s.value=_,v.value=!1,q.error("查询操作状态失败");return}C=window.setTimeout(()=>{w(),v.value=!1,q.warning("操作超时,请检查操作状态"),t?.()},m),I=window.setInterval(async()=>{try{const _=await Q(N);i.value=_,f?.(_),(_.status===c.SUCCESS||_.status===c.FAILED)&&(w(),v.value=!1,h(_))}catch(_){w(),s.value=_,v.value=!1,q.error("查询操作状态失败")}},k)},h=N=>{N.status===c.SUCCESS?T?.(N):N.status===c.FAILED&&b?.(N)},G=()=>{w(),v.value=!1},y=()=>{w(),i.value=null,v.value=!1,s.value=null};return ne(()=>{w()}),{currentOperation:i,loading:v,error:s,isCompleted:F,isSuccess:n,isFailed:l,isPending:U,isRunning:B,startPolling:R,stopPolling:G,reset:y}}const fe={key:0,class:"operation-progress"},ve={class:"text-center mb-4"},_e={class:"text-lg font-medium text-gray-700"},ge={key:1,class:"text-sm text-gray-500 mt-2"},ye={key:0,class:"operation-info bg-gray-50 rounded p-4 text-sm"},Se={class:"info-item"},Te={class:"value"},be={class:"info-item"},Ce={class:"value"},Ee={key:0,class:"info-item"},ke={class:"value"},Ie={key:1,class:"info-item"},we={class:"value"},Ne={key:1,class:"operation-result"},xe={class:"flex items-center justify-center mb-6"},he={class:"text-center mb-4"},Oe={key:0,class:"text-sm text-red-600 mt-2 px-4"},De={class:"operation-info bg-gray-50 rounded p-4 text-sm"},Ue={class:"info-item"},Ve={class:"value"},Ae={class:"info-item"},Re={class:"value"},Pe={key:0,class:"info-item"},Le={class:"value"},Fe={key:1,class:"info-item"},$e={class:"value"},Be={key:2,class:"info-item"},Ge={class:"value"},ze=J({__name:"OperationProgressDialog",props:{modelValue:{type:Boolean},operationId:{}},emits:["update:modelValue","success","error"],setup(A,{expose:k,emit:m}){const f=A,T=m,b=g({get:()=>f.modelValue,set:u=>T("update:modelValue",u)}),{currentOperation:t,loading:i,isCompleted:v,startPolling:s,reset:I}=me({interval:2e3,onSuccess:u=>{T("success",u)},onError:u=>{T("error",u)}}),C=L(),F=()=>{!f.operationId||!b.value||f.operationId===C.value&&(i.value||t.value)||(C.value=f.operationId,s(f.operationId))};W(()=>f.operationId,()=>{F()},{immediate:!0}),W(b,u=>{u?F():(I(),C.value=void 0)});const n=g(()=>t.value?i.value?"操作进行中":"操作结果":"操作进度"),l=g(()=>{if(!t.value)return"准备中...";const u=R(t.value.operation_type);switch(t.value.status){case c.PENDING:return`${u}操作等待执行中...`;case c.RUNNING:return`${u}操作执行中...`;case c.SUCCESS:return`${u}操作成功!`;case c.FAILED:return`${u}操作失败`;default:return"处理中..."}}),U=g(()=>t.value?t.value.status===c.SUCCESS?"操作成功":"操作失败":""),B=g(()=>t.value?t.value.status===c.SUCCESS?"text-green-600":"text-red-600":""),w=g(()=>{if(!t.value?.started_at||!t.value?.completed_at)return null;const u=new Date(t.value.started_at).getTime(),O=new Date(t.value.completed_at).getTime()-u;return O<1e3?`${O}ms`:O<6e4?`${(O/1e3).toFixed(1)}s`:`${Math.floor(O/6e4)}m ${Math.floor(O%6e4/1e3)}s`}),R=u=>oe[u]?.label||u,h=u=>new Date(u).toLocaleString("zh-CN",{year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1}),G=u=>{I(),u()},y=()=>{b.value=!1},N=()=>{b.value=!1},_=()=>{I()};return k({currentOperation:t,isPolling:i,isCompleted:v}),(u,o)=>{const O=D("el-button"),X=D("el-dialog");return r(),V(X,{modelValue:b.value,"onUpdate:modelValue":o[0]||(o[0]=Z=>b.value=Z),title:n.value,width:"600px","close-on-click-modal":!1,"close-on-press-escape":!0,"show-close":!0,"append-to-body":"","before-close":G,onClosed:_},{footer:E(()=>[e("div",null,[P(O,{onClick:y},{default:E(()=>[...o[11]||(o[11]=[$("关闭",-1)])]),_:1}),a(t)?.status===a(c).SUCCESS?(r(),V(O,{key:0,type:"primary",onClick:N},{default:E(()=>[...o[12]||(o[12]=[$(" 确定 ",-1)])]),_:1})):S("",!0)])]),default:E(()=>[a(i)?(r(),p("div",fe,[o[5]||(o[5]=e("div",{class:"flex items-center justify-center mb-6"},[e("i",{class:"i-carbon-in-progress text-6xl text-blue-500 animate-spin"})],-1)),e("div",ve,[a(t)?(r(),V(ie,{key:0,status:a(t).status,type:"operation",size:"large",class:"mb-3"},null,8,["status"])):S("",!0),e("div",_e,d(l.value),1),a(t)?(r(),p("div",ge," 操作 ID: "+d(a(t).operation_id.slice(0,12))+"... ",1)):S("",!0)]),a(t)?(r(),p("div",ye,[e("div",Se,[o[1]||(o[1]=e("span",{class:"label"},"操作类型:",-1)),e("span",Te,d(R(a(t).operation_type)),1)]),e("div",be,[o[2]||(o[2]=e("span",{class:"label"},"服务名称:",-1)),e("span",Ce,d(a(t).service_name),1)]),a(t).target_replicas?(r(),p("div",Ee,[o[3]||(o[3]=e("span",{class:"label"},"目标副本数:",-1)),e("span",ke,d(a(t).target_replicas),1)])):S("",!0),a(t).started_at?(r(),p("div",Ie,[o[4]||(o[4]=e("span",{class:"label"},"开始时间:",-1)),e("span",we,d(h(a(t).started_at)),1)])):S("",!0)])):S("",!0)])):a(t)?(r(),p("div",Ne,[e("div",xe,[e("i",{class:j(["text-6xl",a(t).status===a(c).SUCCESS?"i-carbon-checkmark-filled text-green-500":"i-carbon-close-filled text-red-500"])},null,2)]),e("div",he,[e("div",{class:j(["text-xl font-medium mb-2",B.value])},d(U.value),3),a(t).error_message?(r(),p("div",Oe,d(a(t).error_message),1)):S("",!0)]),e("div",De,[e("div",Ue,[o[6]||(o[6]=e("span",{class:"label"},"操作类型:",-1)),e("span",Ve,d(R(a(t).operation_type)),1)]),e("div",Ae,[o[7]||(o[7]=e("span",{class:"label"},"服务名称:",-1)),e("span",Re,d(a(t).service_name),1)]),a(t).started_at?(r(),p("div",Pe,[o[8]||(o[8]=e("span",{class:"label"},"开始时间:",-1)),e("span",Le,d(h(a(t).started_at)),1)])):S("",!0),a(t).completed_at?(r(),p("div",Fe,[o[9]||(o[9]=e("span",{class:"label"},"完成时间:",-1)),e("span",$e,d(h(a(t).completed_at)),1)])):S("",!0),w.value?(r(),p("div",Be,[o[10]||(o[10]=e("span",{class:"label"},"耗时:",-1)),e("span",Ge,d(w.value),1)])):S("",!0)])])):S("",!0)]),_:1},8,["modelValue","title"])}}}),Ye=K(ze,[["__scopeId","data-v-f6597358"]]);export{Ye as O,ie as S,Me as a};
|
|
1
|
+
import{c as ee,d as M,I as te,H as se,e as ae,u as le,O as x,D as z,f as c,g as Q,h as oe}from"./service-operation-DAaEb_pH.js";import{d as J,B as g,g as V,b as r,j as D,q as j,w as E,c as p,h as S,e,y as d,_ as K,r as L,i as P,k as a,F as H,E as q,s as $,K as ne,G as Y,J as W}from"./index-Eu9iwQmC.js";const re=J({__name:"StatusTag",props:{status:{},type:{default:"service"},size:{default:"default"},effect:{default:"light"},showIcon:{type:Boolean,default:!0}},setup(A){const k=A,m=s=>te[s],f=s=>se[s],T=s=>ae[s],b=g(()=>{const s=k.status.toString();switch(k.type){case"instance":return m(s)?.type||"info";case"health":return f(s)?.type||"info";case"operation":return T(s)?.type||"info";case"service":default:return ee[s]||"info"}}),t=g(()=>{const s=k.status.toString();switch(k.type){case"instance":return m(s)?.label||s;case"health":return f(s)?.label||s;case"operation":return T(s)?.label||s;case"service":default:return M[s]?.label||s}}),i=g(()=>{const s=k.status.toString();switch(k.type){case"instance":return m(s)?.icon||"";case"health":return f(s)?.icon||"";case"operation":return T(s)?.icon||"";case"service":default:return M[s]?.icon||""}}),v=g(()=>{if(k.type==="service"){const s=M[k.status];return`${s?.color||""} ${s?.bgColor||""}`}return""});return(s,I)=>{const C=D("el-tag");return r(),V(C,{type:b.value,effect:s.effect,size:s.size,class:j(["status-tag",v.value])},{default:E(()=>[s.showIcon?(r(),p("i",{key:0,class:j([i.value,"mr-1"])},null,2)):S("",!0),e("span",null,d(t.value),1)]),_:1},8,["type","effect","size","class"])}}}),ie=K(re,[["__scopeId","data-v-5fdd77e5"]]),ue={class:"service-list"},ce={class:"service-list"},de={class:"service-list"},pe=J({__name:"ServiceOperationDialog",props:{modelValue:{type:Boolean},operation:{},serviceNames:{}},emits:["update:modelValue","success","operationSubmitted"],setup(A,{emit:k}){const m=A,f=k,T=le(),b=L(),t=L(!1),i=L({confirmText:""}),v=g({get:()=>m.modelValue,set:n=>f("update:modelValue",n)}),s=g(()=>({[x.RESTART]:"重启服务",[x.START]:"启动服务",[x.STOP]:"停止服务",[x.REBUILD]:"重建服务",[z.DELETE]:"删除服务信息"})[m.operation]),I={confirmText:[{required:!0,message:"请输入服务名称以确认删除",trigger:"blur"}]},C=()=>{b.value?.resetFields(),i.value.confirmText="",v.value=!1},F=async()=>{if(m.operation===z.DELETE){if(!b.value)return;try{await b.value.validate()}catch{return}}t.value=!0;try{let n;switch(m.operation){case x.RESTART:n=await T.restart(m.serviceNames);break;case x.START:n=await T.start(m.serviceNames);break;case x.STOP:n=await T.stop(m.serviceNames);break;case x.REBUILD:n=await T.rebuild(m.serviceNames);break;case z.DELETE:await T.remove(m.serviceNames[0]),f("success"),C();return}n&&(f("operationSubmitted",n),C())}catch(n){console.error("操作失败:",n)}finally{t.value=!1}};return(n,l)=>{const U=D("el-alert"),B=D("el-input"),w=D("el-form-item"),R=D("el-form"),h=D("el-button"),G=D("el-dialog");return r(),V(G,{modelValue:v.value,"onUpdate:modelValue":l[1]||(l[1]=y=>v.value=y),title:s.value,width:"500px",onClose:C},{footer:E(()=>[P(h,{onClick:C},{default:E(()=>[...l[10]||(l[10]=[$("取消",-1)])]),_:1}),P(h,{type:"primary",loading:t.value,onClick:F,disabled:n.operation===a(z).DELETE&&i.value.confirmText!==n.serviceNames[0]},{default:E(()=>[...l[11]||(l[11]=[$(" 确认 ",-1)])]),_:1},8,["loading","disabled"])]),default:E(()=>[P(R,{ref_key:"formRef",ref:b,model:i.value,rules:I,"label-width":"100px"},{default:E(()=>[n.operation===a(x).RESTART?(r(),V(U,{key:0,title:"重启服务",type:"warning",closable:!1,"show-icon":"",class:"mb-4"},{default:E(()=>[l[2]||(l[2]=e("p",null,"此操作将重启以下服务:",-1)),e("ul",ue,[(r(!0),p(H,null,q(n.serviceNames,y=>(r(),p("li",{key:y},d(y),1))),128))])]),_:1})):S("",!0),n.operation===a(x).START?(r(),V(U,{key:1,title:"启动服务",type:"success",closable:!1,"show-icon":"",class:"mb-4"},{default:E(()=>[l[3]||(l[3]=e("p",null,"此操作将启动以下服务:",-1)),e("ul",ce,[(r(!0),p(H,null,q(n.serviceNames,y=>(r(),p("li",{key:y},d(y),1))),128))])]),_:1})):S("",!0),n.operation===a(x).STOP?(r(),V(U,{key:2,title:"停止服务",type:"error",closable:!1,"show-icon":"",class:"mb-4"},{default:E(()=>[l[4]||(l[4]=e("p",null,"⚠️ 此操作将停止以下服务:",-1)),e("ul",de,[(r(!0),p(H,null,q(n.serviceNames,y=>(r(),p("li",{key:y},d(y),1))),128))]),l[5]||(l[5]=e("p",{class:"mt-2"},"停止后服务将无法访问,请谨慎操作!",-1))]),_:1})):S("",!0),n.operation===a(z).DELETE?(r(),p(H,{key:3},[P(U,{title:"删除服务信息",type:"error",closable:!1,"show-icon":"",class:"mb-4"},{default:E(()=>[e("p",null,[l[6]||(l[6]=$("⚠️ 此操作将删除服务 ",-1)),e("strong",null,d(n.serviceNames[0]),1),l[7]||(l[7]=$(" 的基本信息记录",-1))]),l[8]||(l[8]=e("p",{class:"mt-2"},[e("strong",null,"注意:")],-1)),l[9]||(l[9]=e("ul",{class:"warning-list"},[e("li",null,"只删除 service_info_tbl 中的记录"),e("li",null,"不会删除实例记录(service_registry_tbl)"),e("li",null,"不会删除配置记录(service_config_tbl)"),e("li",null,"建议先停止服务实例,再删除配置,最后删除服务信息")],-1))]),_:1}),P(w,{label:"确认操作",prop:"confirmText"},{default:E(()=>[P(B,{modelValue:i.value.confirmText,"onUpdate:modelValue":l[0]||(l[0]=y=>i.value.confirmText=y),placeholder:"请输入服务名称以确认删除"},null,8,["modelValue"])]),_:1})],64)):S("",!0)]),_:1},8,["model"])]),_:1},8,["modelValue","title"])}}}),Me=K(pe,[["__scopeId","data-v-c06a7005"]]);function me(A={}){const{interval:k=2e3,timeout:m=300*1e3,onProgress:f,onSuccess:T,onError:b,onTimeout:t}=A,i=L(null),v=L(!1),s=L(null);let I=null,C=null;const F=g(()=>{if(!i.value)return!1;const N=i.value.status;return N===c.SUCCESS||N===c.FAILED}),n=g(()=>i.value?.status===c.SUCCESS),l=g(()=>i.value?.status===c.FAILED),U=g(()=>i.value?.status===c.PENDING),B=g(()=>i.value?.status===c.RUNNING),w=()=>{I!==null&&(clearInterval(I),I=null),C!==null&&(clearTimeout(C),C=null)},R=async N=>{w(),v.value=!0,s.value=null,i.value=null;try{const _=await Q(N);if(i.value=_,_.status===c.SUCCESS||_.status===c.FAILED){v.value=!1,h(_);return}f?.(_)}catch(_){s.value=_,v.value=!1,Y.error("查询操作状态失败");return}C=window.setTimeout(()=>{w(),v.value=!1,Y.warning("操作超时,请检查操作状态"),t?.()},m),I=window.setInterval(async()=>{try{const _=await Q(N);i.value=_,f?.(_),(_.status===c.SUCCESS||_.status===c.FAILED)&&(w(),v.value=!1,h(_))}catch(_){w(),s.value=_,v.value=!1,Y.error("查询操作状态失败")}},k)},h=N=>{N.status===c.SUCCESS?T?.(N):N.status===c.FAILED&&b?.(N)},G=()=>{w(),v.value=!1},y=()=>{w(),i.value=null,v.value=!1,s.value=null};return ne(()=>{w()}),{currentOperation:i,loading:v,error:s,isCompleted:F,isSuccess:n,isFailed:l,isPending:U,isRunning:B,startPolling:R,stopPolling:G,reset:y}}const fe={key:0,class:"operation-progress"},ve={class:"text-center mb-4"},_e={class:"text-lg font-medium text-gray-700"},ge={key:1,class:"text-sm text-gray-500 mt-2"},ye={key:0,class:"operation-info bg-gray-50 rounded p-4 text-sm"},Se={class:"info-item"},Te={class:"value"},be={class:"info-item"},Ce={class:"value"},Ee={key:0,class:"info-item"},ke={class:"value"},Ie={key:1,class:"info-item"},we={class:"value"},Ne={key:1,class:"operation-result"},xe={class:"flex items-center justify-center mb-6"},he={class:"text-center mb-4"},Oe={key:0,class:"text-sm text-red-600 mt-2 px-4"},De={class:"operation-info bg-gray-50 rounded p-4 text-sm"},Ue={class:"info-item"},Ve={class:"value"},Ae={class:"info-item"},Re={class:"value"},Pe={key:0,class:"info-item"},Le={class:"value"},Fe={key:1,class:"info-item"},$e={class:"value"},Be={key:2,class:"info-item"},Ge={class:"value"},ze=J({__name:"OperationProgressDialog",props:{modelValue:{type:Boolean},operationId:{}},emits:["update:modelValue","success","error"],setup(A,{expose:k,emit:m}){const f=A,T=m,b=g({get:()=>f.modelValue,set:u=>T("update:modelValue",u)}),{currentOperation:t,loading:i,isCompleted:v,startPolling:s,reset:I}=me({interval:2e3,onSuccess:u=>{T("success",u)},onError:u=>{T("error",u)}}),C=L(),F=()=>{!f.operationId||!b.value||f.operationId===C.value&&(i.value||t.value)||(C.value=f.operationId,s(f.operationId))};W(()=>f.operationId,()=>{F()},{immediate:!0}),W(b,u=>{u?F():(I(),C.value=void 0)});const n=g(()=>t.value?i.value?"操作进行中":"操作结果":"操作进度"),l=g(()=>{if(!t.value)return"准备中...";const u=R(t.value.operation_type);switch(t.value.status){case c.PENDING:return`${u}操作等待执行中...`;case c.RUNNING:return`${u}操作执行中...`;case c.SUCCESS:return`${u}操作成功!`;case c.FAILED:return`${u}操作失败`;default:return"处理中..."}}),U=g(()=>t.value?t.value.status===c.SUCCESS?"操作成功":"操作失败":""),B=g(()=>t.value?t.value.status===c.SUCCESS?"text-green-600":"text-red-600":""),w=g(()=>{if(!t.value?.started_at||!t.value?.completed_at)return null;const u=new Date(t.value.started_at).getTime(),O=new Date(t.value.completed_at).getTime()-u;return O<1e3?`${O}ms`:O<6e4?`${(O/1e3).toFixed(1)}s`:`${Math.floor(O/6e4)}m ${Math.floor(O%6e4/1e3)}s`}),R=u=>oe[u]?.label||u,h=u=>new Date(u).toLocaleString("zh-CN",{year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1}),G=u=>{I(),u()},y=()=>{b.value=!1},N=()=>{b.value=!1},_=()=>{I()};return k({currentOperation:t,isPolling:i,isCompleted:v}),(u,o)=>{const O=D("el-button"),X=D("el-dialog");return r(),V(X,{modelValue:b.value,"onUpdate:modelValue":o[0]||(o[0]=Z=>b.value=Z),title:n.value,width:"600px","close-on-click-modal":!1,"close-on-press-escape":!0,"show-close":!0,"append-to-body":"","before-close":G,onClosed:_},{footer:E(()=>[e("div",null,[P(O,{onClick:y},{default:E(()=>[...o[11]||(o[11]=[$("关闭",-1)])]),_:1}),a(t)?.status===a(c).SUCCESS?(r(),V(O,{key:0,type:"primary",onClick:N},{default:E(()=>[...o[12]||(o[12]=[$(" 确定 ",-1)])]),_:1})):S("",!0)])]),default:E(()=>[a(i)?(r(),p("div",fe,[o[5]||(o[5]=e("div",{class:"flex items-center justify-center mb-6"},[e("i",{class:"i-carbon-in-progress text-6xl text-blue-500 animate-spin"})],-1)),e("div",ve,[a(t)?(r(),V(ie,{key:0,status:a(t).status,type:"operation",size:"large",class:"mb-3"},null,8,["status"])):S("",!0),e("div",_e,d(l.value),1),a(t)?(r(),p("div",ge," 操作 ID: "+d(a(t).operation_id.slice(0,12))+"... ",1)):S("",!0)]),a(t)?(r(),p("div",ye,[e("div",Se,[o[1]||(o[1]=e("span",{class:"label"},"操作类型:",-1)),e("span",Te,d(R(a(t).operation_type)),1)]),e("div",be,[o[2]||(o[2]=e("span",{class:"label"},"服务名称:",-1)),e("span",Ce,d(a(t).service_name),1)]),a(t).target_replicas?(r(),p("div",Ee,[o[3]||(o[3]=e("span",{class:"label"},"目标副本数:",-1)),e("span",ke,d(a(t).target_replicas),1)])):S("",!0),a(t).started_at?(r(),p("div",Ie,[o[4]||(o[4]=e("span",{class:"label"},"开始时间:",-1)),e("span",we,d(h(a(t).started_at)),1)])):S("",!0)])):S("",!0)])):a(t)?(r(),p("div",Ne,[e("div",xe,[e("i",{class:j(["text-6xl",a(t).status===a(c).SUCCESS?"i-carbon-checkmark-filled text-green-500":"i-carbon-close-filled text-red-500"])},null,2)]),e("div",he,[e("div",{class:j(["text-xl font-medium mb-2",B.value])},d(U.value),3),a(t).error_message?(r(),p("div",Oe,d(a(t).error_message),1)):S("",!0)]),e("div",De,[e("div",Ue,[o[6]||(o[6]=e("span",{class:"label"},"操作类型:",-1)),e("span",Ve,d(R(a(t).operation_type)),1)]),e("div",Ae,[o[7]||(o[7]=e("span",{class:"label"},"服务名称:",-1)),e("span",Re,d(a(t).service_name),1)]),a(t).started_at?(r(),p("div",Pe,[o[8]||(o[8]=e("span",{class:"label"},"开始时间:",-1)),e("span",Le,d(h(a(t).started_at)),1)])):S("",!0),a(t).completed_at?(r(),p("div",Fe,[o[9]||(o[9]=e("span",{class:"label"},"完成时间:",-1)),e("span",$e,d(h(a(t).completed_at)),1)])):S("",!0),w.value?(r(),p("div",Be,[o[10]||(o[10]=e("span",{class:"label"},"耗时:",-1)),e("span",Ge,d(w.value),1)])):S("",!0)])])):S("",!0)]),_:1},8,["modelValue","title"])}}}),qe=K(ze,[["__scopeId","data-v-f6597358"]]);export{qe as O,ie as S,Me as a};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{d as l,c as s,b as t,h as a,e as o,
|
|
1
|
+
import{d as l,c as s,b as t,h as a,e as o,q as c,y as i,Q as n,_ as r}from"./index-Eu9iwQmC.js";const d={class:"page-container"},p={key:0,class:"page-header mb-6"},_={class:"flex flex-col md:flex-row md:items-center justify-between gap-4"},u={class:"flex items-center"},h={class:"page-title"},m={key:0,class:"page-subtitle"},f={key:0,class:"page-actions"},g={class:"page-content"},v=l({__name:"PageContainer",props:{title:{},subtitle:{},icon:{},showHeader:{type:Boolean,default:!0}},setup(b){return(e,y)=>(t(),s("div",d,[e.showHeader?(t(),s("div",p,[o("div",_,[o("div",u,[e.icon?(t(),s("i",{key:0,class:c([e.icon,"page-icon"])},null,2)):a("",!0),o("div",null,[o("h1",h,i(e.title),1),e.subtitle?(t(),s("p",m,i(e.subtitle),1)):a("",!0)])]),e.$slots.actions?(t(),s("div",f,[n(e.$slots,"actions",{},void 0,!0)])):a("",!0)])])):a("",!0),o("div",g,[n(e.$slots,"default",{},void 0,!0)])]))}}),C=r(v,[["__scopeId","data-v-35fbb750"]]);export{C as P};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{K as de,r as b,x as G,E as m,d as re,v as ce,a as me,o as _e,g as j,b as E,w as a,c as X,h as Y,i as l,y as M,e as n,t as w,j as h,l as g,n as pe,B as ve,F as fe,L as be,_ as ye}from"./index-CiFlm8oc.js";import{P as we}from"./PageContainer-Byss-yUC.js";import{n as he,o as ge,p as ke,q as Ve,r as Re,v as xe,w as Ce,x as Le,y as Ue,z as Be,A as Ie}from"./caddy-nnCKf8fG.js";const qe=de("caddyRateLimit",()=>{const D=b([]),c=b(null),x=b(null),r=b(!1),V=b(null),k=G(()=>D.value.filter(u=>u.is_enabled)),C=G(()=>D.value.filter(u=>!u.is_enabled)),y=async u=>{r.value=!0,V.value=null;try{const s=await he(u);return D.value=s.rules||[],s}catch(s){throw V.value=s,m.error("获取限流规则失败"),s}finally{r.value=!1}},L=async u=>{r.value=!0;try{const s=await ge(u);return c.value=s,s}catch(s){throw m.error("获取限流规则详情失败"),s}finally{r.value=!1}},P=async u=>{r.value=!0;try{const s=await ke(u);return m.success(s.message||"限流规则创建成功"),await y(),await I(),s}catch(s){throw m.error("创建限流规则失败"),s}finally{r.value=!1}},z=async(u,s)=>{r.value=!0;try{const d=await Ve(u,s);return m.success(d.message||"限流规则更新成功"),await y(),await I(),d}catch(d){throw m.error("更新限流规则失败"),d}finally{r.value=!1}},o=async u=>{r.value=!0;try{const s=await Re(u);return m.success(s.message||"限流规则删除成功"),await y(),await I(),s}catch(s){throw m.error("删除限流规则失败"),s}finally{r.value=!1}},N=async u=>{r.value=!0;try{const s=await xe(u);return m.success(s.message||"规则状态切换成功"),await y(),await I(),s}catch(s){throw m.error("切换限流规则状态失败"),s}finally{r.value=!1}},q=async(u,s)=>{r.value=!0;try{const d=await Ce(u,{ips:s});return m.success(d.message||"白名单已添加"),await y(),d}catch(d){throw m.error("添加白名单失败"),d}finally{r.value=!1}},U=async(u,s)=>{r.value=!0;try{const d=await Le(u,{ips:s});return m.success(d.message||"白名单已移除"),await y(),d}catch(d){throw m.error("移除白名单失败"),d}finally{r.value=!1}},p=async(u,s)=>{r.value=!0;try{const d=await Ue(u,{ips:s});return m.success(d.message||"黑名单已添加"),await y(),d}catch(d){throw m.error("添加黑名单失败"),d}finally{r.value=!1}},B=async(u,s)=>{r.value=!0;try{const d=await Be(u,{ips:s});return m.success(d.message||"黑名单已移除"),await y(),d}catch(d){throw m.error("移除黑名单失败"),d}finally{r.value=!1}},I=async()=>{try{const u=await Ie();return x.value={total:u.total,enabled:u.enabled,disabled:u.disabled,by_match_type:u.by_match_type||{},total_whitelist_ips:u.total_whitelist_ips||0,total_blacklist_ips:u.total_blacklist_ips||0},x.value}catch(u){throw m.error("获取限流统计失败"),u}};return{rules:D,currentRule:c,statistics:x,loading:r,error:V,enabledRules:k,disabledRules:C,fetchRules:y,fetchRuleDetail:L,createRule:P,updateRule:z,deleteRule:o,toggleRule:N,addWhitelist:q,removeWhitelist:U,addBlacklist:p,removeBlacklist:B,fetchStatistics:I,clearData:()=>{D.value=[],c.value=null,x.value=null,V.value=null}}}),De={key:0,class:"stats-cards mb-6"},ze={class:"stat-content"},$e={class:"stat-info"},Ee={class:"stat-value"},Me={class:"stat-content"},Pe={class:"stat-info"},Se={class:"stat-value"},Te={class:"stat-content"},We={class:"stat-info"},Fe={class:"stat-value"},Ne={class:"flex flex-col gap-1"},Ae={class:"text-sm text-secondary"},Ke={class:"action-buttons"},je={class:"ip-chips"},Xe={key:0,class:"text-secondary"},Ye=re({__name:"RateLimitManage",setup(D){const c=qe(),{rules:x,loading:r,statistics:V}=ce(c),k=me({match_type:void 0,is_enabled:void 0}),C=b(!1),y=b(!1),L=b(!1),P=b(),z=b(null),o=b({rule_name:"",description:"",match_type:"path",match_pattern:"/v1/besrv/*",match_domain:"",limit_type:"request",limit_value:30,limit_window:60,limit_key:"ip",block_status_code:429,block_message:"Too Many Requests",is_enabled:!0}),N={rule_name:[{required:!0,message:"请输入规则名称",trigger:"blur"}],match_type:[{required:!0,message:"请选择匹配类型",trigger:"change"}],match_pattern:[{required:!0,message:"请输入匹配模式",trigger:"blur"}],limit_type:[{required:!0,message:"请选择限流类型",trigger:"change"}],limit_value:[{required:!0,message:"请输入限流值",trigger:"blur"}],limit_window:[{required:!0,message:"请输入时间窗口",trigger:"blur"}],limit_key:[{required:!0,message:"请选择限流键",trigger:"change"}]},q=b(!1),U=b("whitelist"),p=b(null),B=b(""),I=G(()=>p.value?U.value==="whitelist"?p.value.whitelist_ips||[]:p.value.blacklist_ips||[]:[]),H=i=>i.split(",").map(e=>e.trim()).filter(e=>e.length>0),u=()=>{o.value={rule_name:"",description:"",match_type:"path",match_pattern:"/v1/besrv/*",match_domain:"",limit_type:"request",limit_value:30,limit_window:60,limit_key:"ip",block_status_code:429,block_message:"Too Many Requests",is_enabled:!0}},s=()=>{y.value=!1,z.value=null,u(),C.value=!0},d=i=>{y.value=!0,z.value=i.id,o.value={rule_name:i.rule_name,description:i.description,match_type:i.match_type,match_pattern:i.match_pattern,match_domain:i.match_domain,limit_type:i.limit_type,limit_value:i.limit_value,limit_window:i.limit_window,limit_key:i.limit_key,block_status_code:i.block_status_code,block_message:i.block_message,is_enabled:i.is_enabled,whitelist_ips:i.whitelist_ips,blacklist_ips:i.blacklist_ips,rule_metadata:i.rule_metadata},C.value=!0},O=async()=>{P.value&&await P.value.validate(async i=>{if(i){L.value=!0;try{if(y.value&&z.value){const e={...o.value};await c.updateRule(z.value,e)}else await c.createRule(o.value);C.value=!1}finally{L.value=!1}}})},Q=async i=>{await c.toggleRule(i.id)},Z=async i=>{try{await be.confirm(`确定删除限流规则「${i.rule_name}」吗?`,"删除确认",{type:"warning",confirmButtonText:"确定",cancelButtonText:"取消"}),await c.deleteRule(i.id)}catch{}},ee=i=>{U.value="whitelist",p.value=i,B.value="",q.value=!0},le=i=>{U.value="blacklist",p.value=i,B.value="",q.value=!0},te=async()=>{if(!p.value)return;const i=H(B.value);if(i.length!==0){L.value=!0;try{U.value==="whitelist"?await c.addWhitelist(p.value.id,i):await c.addBlacklist(p.value.id,i),B.value="";const e=x.value.find(v=>v.id===p.value?.id);e&&(p.value=e)}finally{L.value=!1}}},ae=async i=>{if(!p.value)return;U.value==="whitelist"?await c.removeWhitelist(p.value.id,[i]):await c.removeBlacklist(p.value.id,[i]);const e=x.value.find(v=>v.id===p.value?.id);e&&(p.value=e)},se=async()=>{await c.fetchRules({match_type:k.match_type,is_enabled:k.is_enabled})},ie=async()=>{k.match_type=void 0,k.is_enabled=void 0,await c.fetchRules()},ne=async()=>{await c.fetchRules(),await c.fetchStatistics()};return _e(async()=>{await c.fetchRules(),await c.fetchStatistics()}),(i,e)=>{const v=h("el-button"),S=h("el-card"),_=h("el-option"),T=h("el-select"),f=h("el-form-item"),A=h("el-form"),R=h("el-table-column"),F=h("el-tag"),ue=h("el-table"),$=h("el-input"),K=h("el-input-number"),oe=h("el-switch"),J=h("el-dialog");return E(),j(we,{title:"限流管理",icon:"i-carbon-traffic-cone"},{actions:a(()=>[l(v,{type:"primary",onClick:s},{default:a(()=>[...e[19]||(e[19]=[n("i",{class:"i-carbon-add mr-2"},null,-1),n("span",null,"创建规则",-1)])]),_:1}),l(v,{onClick:ne},{default:a(()=>[...e[20]||(e[20]=[n("i",{class:"i-carbon-renew mr-2"},null,-1),n("span",null,"刷新",-1)])]),_:1})]),default:a(()=>[M(V)?(E(),X("div",De,[l(S,{class:"stat-card"},{default:a(()=>[n("div",ze,[e[22]||(e[22]=n("div",{class:"stat-icon stat-icon-primary"},[n("i",{class:"i-carbon-traffic-cone"})],-1)),n("div",$e,[e[21]||(e[21]=n("p",{class:"stat-label"},"总规则数",-1)),n("h3",Ee,w(M(V).total),1)])])]),_:1}),l(S,{class:"stat-card"},{default:a(()=>[n("div",Me,[e[24]||(e[24]=n("div",{class:"stat-icon stat-icon-success"},[n("i",{class:"i-carbon-checkmark"})],-1)),n("div",Pe,[e[23]||(e[23]=n("p",{class:"stat-label"},"启用中",-1)),n("h3",Se,w(M(V).enabled),1)])])]),_:1}),l(S,{class:"stat-card"},{default:a(()=>[n("div",Te,[e[26]||(e[26]=n("div",{class:"stat-icon stat-icon-warning"},[n("i",{class:"i-carbon-pause"})],-1)),n("div",We,[e[25]||(e[25]=n("p",{class:"stat-label"},"已禁用",-1)),n("h3",Fe,w(M(V).disabled),1)])])]),_:1})])):Y("",!0),l(S,{class:"filter-card mb-6"},{default:a(()=>[l(A,{inline:!0,model:k},{default:a(()=>[l(f,{label:"匹配类型"},{default:a(()=>[l(T,{modelValue:k.match_type,"onUpdate:modelValue":e[0]||(e[0]=t=>k.match_type=t),clearable:"",placeholder:"全部",style:{width:"160px"}},{default:a(()=>[l(_,{label:"全部",value:"all"}),l(_,{label:"路径",value:"path"}),l(_,{label:"域名",value:"domain"}),l(_,{label:"IP",value:"ip"}),l(_,{label:"请求头",value:"header"})]),_:1},8,["modelValue"])]),_:1}),l(f,{label:"状态"},{default:a(()=>[l(T,{modelValue:k.is_enabled,"onUpdate:modelValue":e[1]||(e[1]=t=>k.is_enabled=t),clearable:"",placeholder:"全部",style:{width:"120px"}},{default:a(()=>[l(_,{label:"启用",value:!0}),l(_,{label:"禁用",value:!1})]),_:1},8,["modelValue"])]),_:1}),l(f,null,{default:a(()=>[l(v,{type:"primary",onClick:se},{default:a(()=>[...e[27]||(e[27]=[g("查询",-1)])]),_:1}),l(v,{onClick:ie},{default:a(()=>[...e[28]||(e[28]=[g("重置",-1)])]),_:1})]),_:1})]),_:1},8,["model"])]),_:1}),l(S,null,{default:a(()=>[l(ue,{data:M(x),loading:M(r),stripe:"",class:"caddy-table"},{default:a(()=>[l(R,{prop:"id",label:"ID",width:"80"}),l(R,{prop:"rule_name",label:"规则名称","min-width":"160"}),l(R,{label:"匹配","min-width":"220"},{default:a(({row:t})=>[n("div",Ne,[l(F,{size:"small"},{default:a(()=>[g(w(t.match_type),1)]),_:2},1024),n("span",Ae,w(t.match_domain||t.match_pattern||"-"),1)])]),_:1}),l(R,{label:"阈值",width:"170"},{default:a(({row:t})=>[n("span",null,w(t.limit_value)+" / "+w(t.limit_window)+"s",1)]),_:1}),l(R,{label:"限流键",width:"110"},{default:a(({row:t})=>[l(F,{type:"info",size:"small"},{default:a(()=>[g(w(t.limit_key),1)]),_:2},1024)]),_:1}),l(R,{label:"白名单",width:"100",align:"center"},{default:a(({row:t})=>[g(w((t.whitelist_ips||[]).length),1)]),_:1}),l(R,{label:"黑名单",width:"100",align:"center"},{default:a(({row:t})=>[g(w((t.blacklist_ips||[]).length),1)]),_:1}),l(R,{label:"状态",width:"90",align:"center"},{default:a(({row:t})=>[l(F,{type:t.is_enabled?"success":"info",size:"small"},{default:a(()=>[g(w(t.is_enabled?"启用":"禁用"),1)]),_:2},1032,["type"])]),_:1}),l(R,{label:"操作",width:"340",fixed:"right"},{default:a(({row:t})=>[n("div",Ke,[l(v,{text:"",type:"primary",size:"small",onClick:W=>d(t)},{default:a(()=>[...e[29]||(e[29]=[n("i",{class:"i-carbon-edit"},null,-1),n("span",null,"编辑",-1)])]),_:1},8,["onClick"]),l(v,{text:"",size:"small",onClick:W=>ee(t)},{default:a(()=>[...e[30]||(e[30]=[n("i",{class:"i-carbon-list-boxes"},null,-1),n("span",null,"白名单",-1)])]),_:1},8,["onClick"]),l(v,{text:"",size:"small",onClick:W=>le(t)},{default:a(()=>[...e[31]||(e[31]=[n("i",{class:"i-carbon-list-checked"},null,-1),n("span",null,"黑名单",-1)])]),_:1},8,["onClick"]),l(v,{text:"",type:t.is_enabled?"warning":"success",size:"small",onClick:W=>Q(t)},{default:a(()=>[n("i",{class:pe(t.is_enabled?"i-carbon-pause":"i-carbon-play")},null,2),n("span",null,w(t.is_enabled?"禁用":"启用"),1)]),_:2},1032,["type","onClick"]),l(v,{text:"",type:"danger",size:"small",onClick:W=>Z(t)},{default:a(()=>[...e[32]||(e[32]=[n("i",{class:"i-carbon-trash-can"},null,-1),n("span",null,"删除",-1)])]),_:1},8,["onClick"])])]),_:1})]),_:1},8,["data","loading"])]),_:1}),l(J,{modelValue:C.value,"onUpdate:modelValue":e[15]||(e[15]=t=>C.value=t),title:y.value?"编辑限流规则":"创建限流规则",width:"760px","close-on-click-modal":!1},{footer:a(()=>[l(v,{onClick:e[14]||(e[14]=t=>C.value=!1)},{default:a(()=>[...e[33]||(e[33]=[g("取消",-1)])]),_:1}),l(v,{type:"primary",loading:L.value,onClick:O},{default:a(()=>[...e[34]||(e[34]=[g("确定",-1)])]),_:1},8,["loading"])]),default:a(()=>[l(A,{ref_key:"formRef",ref:P,model:o.value,rules:N,"label-width":"130px"},{default:a(()=>[l(f,{label:"规则名称",prop:"rule_name"},{default:a(()=>[l($,{modelValue:o.value.rule_name,"onUpdate:modelValue":e[2]||(e[2]=t=>o.value.rule_name=t)},null,8,["modelValue"])]),_:1}),l(f,{label:"描述"},{default:a(()=>[l($,{modelValue:o.value.description,"onUpdate:modelValue":e[3]||(e[3]=t=>o.value.description=t)},null,8,["modelValue"])]),_:1}),l(f,{label:"匹配类型",prop:"match_type"},{default:a(()=>[l(T,{modelValue:o.value.match_type,"onUpdate:modelValue":e[4]||(e[4]=t=>o.value.match_type=t),style:{width:"100%"}},{default:a(()=>[l(_,{label:"路径",value:"path"}),l(_,{label:"域名",value:"domain"}),l(_,{label:"IP",value:"ip"}),l(_,{label:"请求头",value:"header"}),l(_,{label:"全部",value:"all"})]),_:1},8,["modelValue"])]),_:1}),o.value.match_type!=="all"?(E(),j(f,{key:0,label:"匹配模式",prop:"match_pattern"},{default:a(()=>[l($,{modelValue:o.value.match_pattern,"onUpdate:modelValue":e[5]||(e[5]=t=>o.value.match_pattern=t),placeholder:"例如: /v1/besrv/* 或 X-API-KEY:abc"},null,8,["modelValue"])]),_:1})):Y("",!0),l(f,{label:"匹配域名"},{default:a(()=>[l($,{modelValue:o.value.match_domain,"onUpdate:modelValue":e[6]||(e[6]=t=>o.value.match_domain=t),placeholder:"可选,例如 api.local"},null,8,["modelValue"])]),_:1}),l(f,{label:"限流类型",prop:"limit_type"},{default:a(()=>[l(T,{modelValue:o.value.limit_type,"onUpdate:modelValue":e[7]||(e[7]=t=>o.value.limit_type=t),style:{width:"100%"}},{default:a(()=>[l(_,{label:"请求数",value:"request"}),l(_,{label:"带宽",value:"bandwidth"})]),_:1},8,["modelValue"])]),_:1}),l(f,{label:"限流值",prop:"limit_value"},{default:a(()=>[l(K,{modelValue:o.value.limit_value,"onUpdate:modelValue":e[8]||(e[8]=t=>o.value.limit_value=t),min:1},null,8,["modelValue"])]),_:1}),l(f,{label:"时间窗口(秒)",prop:"limit_window"},{default:a(()=>[l(K,{modelValue:o.value.limit_window,"onUpdate:modelValue":e[9]||(e[9]=t=>o.value.limit_window=t),min:1},null,8,["modelValue"])]),_:1}),l(f,{label:"限流键",prop:"limit_key"},{default:a(()=>[l(T,{modelValue:o.value.limit_key,"onUpdate:modelValue":e[10]||(e[10]=t=>o.value.limit_key=t),style:{width:"100%"}},{default:a(()=>[l(_,{label:"客户端 IP",value:"ip"}),l(_,{label:"请求头",value:"header"}),l(_,{label:"Cookie",value:"cookie"}),l(_,{label:"路径",value:"path"})]),_:1},8,["modelValue"])]),_:1}),l(f,{label:"状态码"},{default:a(()=>[l(K,{modelValue:o.value.block_status_code,"onUpdate:modelValue":e[11]||(e[11]=t=>o.value.block_status_code=t),min:100,max:599},null,8,["modelValue"])]),_:1}),l(f,{label:"返回消息"},{default:a(()=>[l($,{modelValue:o.value.block_message,"onUpdate:modelValue":e[12]||(e[12]=t=>o.value.block_message=t)},null,8,["modelValue"])]),_:1}),l(f,{label:"启用状态"},{default:a(()=>[l(oe,{modelValue:o.value.is_enabled,"onUpdate:modelValue":e[13]||(e[13]=t=>o.value.is_enabled=t)},null,8,["modelValue"])]),_:1})]),_:1},8,["model"])]),_:1},8,["modelValue","title"]),l(J,{modelValue:q.value,"onUpdate:modelValue":e[18]||(e[18]=t=>q.value=t),title:U.value==="whitelist"?"管理白名单":"管理黑名单",width:"620px"},{footer:a(()=>[l(v,{onClick:e[17]||(e[17]=t=>q.value=!1)},{default:a(()=>[...e[35]||(e[35]=[g("关闭",-1)])]),_:1}),l(v,{type:"primary",loading:L.value,onClick:te},{default:a(()=>[...e[36]||(e[36]=[g("添加",-1)])]),_:1},8,["loading"])]),default:a(()=>[l(A,{"label-width":"90px"},{default:a(()=>[l(f,{label:"当前列表"},{default:a(()=>[n("div",je,[(E(!0),X(fe,null,ve(I.value,t=>(E(),j(F,{key:t,closable:"",onClose:W=>ae(t)},{default:a(()=>[g(w(t),1)]),_:2},1032,["onClose"]))),128)),I.value.length===0?(E(),X("span",Xe,"暂无 IP")):Y("",!0)])]),_:1}),l(f,{label:"新增 IP"},{default:a(()=>[l($,{modelValue:B.value,"onUpdate:modelValue":e[16]||(e[16]=t=>B.value=t),placeholder:"支持逗号分隔,例如 1.1.1.1,2.2.2.2"},null,8,["modelValue"])]),_:1})]),_:1})]),_:1},8,["modelValue","title"])]),_:1})}}}),Oe=ye(Ye,[["__scopeId","data-v-449af0a5"]]);export{Oe as default};
|
|
1
|
+
import{N as de,r as b,B as X,G as m,d as re,A as ce,a as me,o as _e,g as G,b as E,w as a,c as K,h as O,i as l,k as M,e as n,y as w,j as h,s as g,q as pe,E as ve,F as fe,O as be,_ as ye}from"./index-Eu9iwQmC.js";import{P as we}from"./PageContainer-CVLD10ut.js";import{n as he,o as ge,p as ke,q as Ve,r as Re,v as Ce,w as xe,x as Le,y as Ue,z as Be,A as qe}from"./caddy-Cmwd6W2n.js";const Ie=de("caddyRateLimit",()=>{const D=b([]),c=b(null),C=b(null),r=b(!1),V=b(null),k=X(()=>D.value.filter(u=>u.is_enabled)),x=X(()=>D.value.filter(u=>!u.is_enabled)),y=async u=>{r.value=!0,V.value=null;try{const s=await he(u);return D.value=s.rules||[],s}catch(s){throw V.value=s,m.error("获取限流规则失败"),s}finally{r.value=!1}},L=async u=>{r.value=!0;try{const s=await ge(u);return c.value=s,s}catch(s){throw m.error("获取限流规则详情失败"),s}finally{r.value=!1}},P=async u=>{r.value=!0;try{const s=await ke(u);return m.success(s.message||"限流规则创建成功"),await y(),await q(),s}catch(s){throw m.error("创建限流规则失败"),s}finally{r.value=!1}},z=async(u,s)=>{r.value=!0;try{const d=await Ve(u,s);return m.success(d.message||"限流规则更新成功"),await y(),await q(),d}catch(d){throw m.error("更新限流规则失败"),d}finally{r.value=!1}},o=async u=>{r.value=!0;try{const s=await Re(u);return m.success(s.message||"限流规则删除成功"),await y(),await q(),s}catch(s){throw m.error("删除限流规则失败"),s}finally{r.value=!1}},N=async u=>{r.value=!0;try{const s=await Ce(u);return m.success(s.message||"规则状态切换成功"),await y(),await q(),s}catch(s){throw m.error("切换限流规则状态失败"),s}finally{r.value=!1}},I=async(u,s)=>{r.value=!0;try{const d=await xe(u,{ips:s});return m.success(d.message||"白名单已添加"),await y(),d}catch(d){throw m.error("添加白名单失败"),d}finally{r.value=!1}},U=async(u,s)=>{r.value=!0;try{const d=await Le(u,{ips:s});return m.success(d.message||"白名单已移除"),await y(),d}catch(d){throw m.error("移除白名单失败"),d}finally{r.value=!1}},p=async(u,s)=>{r.value=!0;try{const d=await Ue(u,{ips:s});return m.success(d.message||"黑名单已添加"),await y(),d}catch(d){throw m.error("添加黑名单失败"),d}finally{r.value=!1}},B=async(u,s)=>{r.value=!0;try{const d=await Be(u,{ips:s});return m.success(d.message||"黑名单已移除"),await y(),d}catch(d){throw m.error("移除黑名单失败"),d}finally{r.value=!1}},q=async()=>{try{const u=await qe();return C.value={total:u.total,enabled:u.enabled,disabled:u.disabled,by_match_type:u.by_match_type||{},total_whitelist_ips:u.total_whitelist_ips||0,total_blacklist_ips:u.total_blacklist_ips||0},C.value}catch(u){throw m.error("获取限流统计失败"),u}};return{rules:D,currentRule:c,statistics:C,loading:r,error:V,enabledRules:k,disabledRules:x,fetchRules:y,fetchRuleDetail:L,createRule:P,updateRule:z,deleteRule:o,toggleRule:N,addWhitelist:I,removeWhitelist:U,addBlacklist:p,removeBlacklist:B,fetchStatistics:q,clearData:()=>{D.value=[],c.value=null,C.value=null,V.value=null}}}),De={key:0,class:"stats-cards mb-6"},ze={class:"stat-content"},$e={class:"stat-info"},Ee={class:"stat-value"},Me={class:"stat-content"},Pe={class:"stat-info"},Se={class:"stat-value"},Te={class:"stat-content"},We={class:"stat-info"},Fe={class:"stat-value"},Ne={class:"flex flex-col gap-1"},Ae={class:"text-sm text-secondary"},je={class:"action-buttons"},Ge={class:"ip-chips"},Ke={key:0,class:"text-secondary"},Oe=re({__name:"RateLimitManage",setup(D){const c=Ie(),{rules:C,loading:r,statistics:V}=ce(c),k=me({match_type:void 0,is_enabled:void 0}),x=b(!1),y=b(!1),L=b(!1),P=b(),z=b(null),o=b({rule_name:"",description:"",match_type:"path",match_pattern:"/v1/besrv/*",match_domain:"",limit_type:"request",limit_value:30,limit_window:60,limit_key:"ip",block_status_code:429,block_message:"Too Many Requests",is_enabled:!0}),N={rule_name:[{required:!0,message:"请输入规则名称",trigger:"blur"}],match_type:[{required:!0,message:"请选择匹配类型",trigger:"change"}],match_pattern:[{required:!0,message:"请输入匹配模式",trigger:"blur"}],limit_type:[{required:!0,message:"请选择限流类型",trigger:"change"}],limit_value:[{required:!0,message:"请输入限流值",trigger:"blur"}],limit_window:[{required:!0,message:"请输入时间窗口",trigger:"blur"}],limit_key:[{required:!0,message:"请选择限流键",trigger:"change"}]},I=b(!1),U=b("whitelist"),p=b(null),B=b(""),q=X(()=>p.value?U.value==="whitelist"?p.value.whitelist_ips||[]:p.value.blacklist_ips||[]:[]),Y=i=>i.split(",").map(e=>e.trim()).filter(e=>e.length>0),u=()=>{o.value={rule_name:"",description:"",match_type:"path",match_pattern:"/v1/besrv/*",match_domain:"",limit_type:"request",limit_value:30,limit_window:60,limit_key:"ip",block_status_code:429,block_message:"Too Many Requests",is_enabled:!0}},s=()=>{y.value=!1,z.value=null,u(),x.value=!0},d=i=>{y.value=!0,z.value=i.id,o.value={rule_name:i.rule_name,description:i.description,match_type:i.match_type,match_pattern:i.match_pattern,match_domain:i.match_domain,limit_type:i.limit_type,limit_value:i.limit_value,limit_window:i.limit_window,limit_key:i.limit_key,block_status_code:i.block_status_code,block_message:i.block_message,is_enabled:i.is_enabled,whitelist_ips:i.whitelist_ips,blacklist_ips:i.blacklist_ips,rule_metadata:i.rule_metadata},x.value=!0},J=async()=>{P.value&&await P.value.validate(async i=>{if(i){L.value=!0;try{if(y.value&&z.value){const e={...o.value};await c.updateRule(z.value,e)}else await c.createRule(o.value);x.value=!1}finally{L.value=!1}}})},Q=async i=>{await c.toggleRule(i.id)},Z=async i=>{try{await be.confirm(`确定删除限流规则「${i.rule_name}」吗?`,"删除确认",{type:"warning",confirmButtonText:"确定",cancelButtonText:"取消"}),await c.deleteRule(i.id)}catch{}},ee=i=>{U.value="whitelist",p.value=i,B.value="",I.value=!0},le=i=>{U.value="blacklist",p.value=i,B.value="",I.value=!0},te=async()=>{if(!p.value)return;const i=Y(B.value);if(i.length!==0){L.value=!0;try{U.value==="whitelist"?await c.addWhitelist(p.value.id,i):await c.addBlacklist(p.value.id,i),B.value="";const e=C.value.find(v=>v.id===p.value?.id);e&&(p.value=e)}finally{L.value=!1}}},ae=async i=>{if(!p.value)return;U.value==="whitelist"?await c.removeWhitelist(p.value.id,[i]):await c.removeBlacklist(p.value.id,[i]);const e=C.value.find(v=>v.id===p.value?.id);e&&(p.value=e)},se=async()=>{await c.fetchRules({match_type:k.match_type,is_enabled:k.is_enabled})},ie=async()=>{k.match_type=void 0,k.is_enabled=void 0,await c.fetchRules()},ne=async()=>{await c.fetchRules(),await c.fetchStatistics()};return _e(async()=>{await c.fetchRules(),await c.fetchStatistics()}),(i,e)=>{const v=h("el-button"),S=h("el-card"),_=h("el-option"),T=h("el-select"),f=h("el-form-item"),A=h("el-form"),R=h("el-table-column"),F=h("el-tag"),ue=h("el-table"),$=h("el-input"),j=h("el-input-number"),oe=h("el-switch"),H=h("el-dialog");return E(),G(we,{title:"限流管理",icon:"i-carbon-traffic-cone"},{actions:a(()=>[l(v,{type:"primary",onClick:s},{default:a(()=>[...e[19]||(e[19]=[n("i",{class:"i-carbon-add mr-2"},null,-1),n("span",null,"创建规则",-1)])]),_:1}),l(v,{onClick:ne},{default:a(()=>[...e[20]||(e[20]=[n("i",{class:"i-carbon-renew mr-2"},null,-1),n("span",null,"刷新",-1)])]),_:1})]),default:a(()=>[M(V)?(E(),K("div",De,[l(S,{class:"stat-card"},{default:a(()=>[n("div",ze,[e[22]||(e[22]=n("div",{class:"stat-icon stat-icon-primary"},[n("i",{class:"i-carbon-traffic-cone"})],-1)),n("div",$e,[e[21]||(e[21]=n("p",{class:"stat-label"},"总规则数",-1)),n("h3",Ee,w(M(V).total),1)])])]),_:1}),l(S,{class:"stat-card"},{default:a(()=>[n("div",Me,[e[24]||(e[24]=n("div",{class:"stat-icon stat-icon-success"},[n("i",{class:"i-carbon-checkmark"})],-1)),n("div",Pe,[e[23]||(e[23]=n("p",{class:"stat-label"},"启用中",-1)),n("h3",Se,w(M(V).enabled),1)])])]),_:1}),l(S,{class:"stat-card"},{default:a(()=>[n("div",Te,[e[26]||(e[26]=n("div",{class:"stat-icon stat-icon-warning"},[n("i",{class:"i-carbon-pause"})],-1)),n("div",We,[e[25]||(e[25]=n("p",{class:"stat-label"},"已禁用",-1)),n("h3",Fe,w(M(V).disabled),1)])])]),_:1})])):O("",!0),l(S,{class:"filter-card mb-6"},{default:a(()=>[l(A,{inline:!0,model:k},{default:a(()=>[l(f,{label:"匹配类型"},{default:a(()=>[l(T,{modelValue:k.match_type,"onUpdate:modelValue":e[0]||(e[0]=t=>k.match_type=t),clearable:"",placeholder:"全部",style:{width:"160px"}},{default:a(()=>[l(_,{label:"全部",value:"all"}),l(_,{label:"路径",value:"path"}),l(_,{label:"域名",value:"domain"}),l(_,{label:"IP",value:"ip"}),l(_,{label:"请求头",value:"header"})]),_:1},8,["modelValue"])]),_:1}),l(f,{label:"状态"},{default:a(()=>[l(T,{modelValue:k.is_enabled,"onUpdate:modelValue":e[1]||(e[1]=t=>k.is_enabled=t),clearable:"",placeholder:"全部",style:{width:"120px"}},{default:a(()=>[l(_,{label:"启用",value:!0}),l(_,{label:"禁用",value:!1})]),_:1},8,["modelValue"])]),_:1}),l(f,null,{default:a(()=>[l(v,{type:"primary",onClick:se},{default:a(()=>[...e[27]||(e[27]=[g("查询",-1)])]),_:1}),l(v,{onClick:ie},{default:a(()=>[...e[28]||(e[28]=[g("重置",-1)])]),_:1})]),_:1})]),_:1},8,["model"])]),_:1}),l(S,null,{default:a(()=>[l(ue,{data:M(C),loading:M(r),stripe:"",class:"caddy-table"},{default:a(()=>[l(R,{prop:"id",label:"ID",width:"80"}),l(R,{prop:"rule_name",label:"规则名称","min-width":"160"}),l(R,{label:"匹配","min-width":"220"},{default:a(({row:t})=>[n("div",Ne,[l(F,{size:"small"},{default:a(()=>[g(w(t.match_type),1)]),_:2},1024),n("span",Ae,w(t.match_domain||t.match_pattern||"-"),1)])]),_:1}),l(R,{label:"阈值",width:"170"},{default:a(({row:t})=>[n("span",null,w(t.limit_value)+" / "+w(t.limit_window)+"s",1)]),_:1}),l(R,{label:"限流键",width:"110"},{default:a(({row:t})=>[l(F,{type:"info",size:"small"},{default:a(()=>[g(w(t.limit_key),1)]),_:2},1024)]),_:1}),l(R,{label:"白名单",width:"100",align:"center"},{default:a(({row:t})=>[g(w((t.whitelist_ips||[]).length),1)]),_:1}),l(R,{label:"黑名单",width:"100",align:"center"},{default:a(({row:t})=>[g(w((t.blacklist_ips||[]).length),1)]),_:1}),l(R,{label:"状态",width:"90",align:"center"},{default:a(({row:t})=>[l(F,{type:t.is_enabled?"success":"info",size:"small"},{default:a(()=>[g(w(t.is_enabled?"启用":"禁用"),1)]),_:2},1032,["type"])]),_:1}),l(R,{label:"操作",width:"340",fixed:"right"},{default:a(({row:t})=>[n("div",je,[l(v,{text:"",type:"primary",size:"small",onClick:W=>d(t)},{default:a(()=>[...e[29]||(e[29]=[n("i",{class:"i-carbon-edit"},null,-1),n("span",null,"编辑",-1)])]),_:1},8,["onClick"]),l(v,{text:"",size:"small",onClick:W=>ee(t)},{default:a(()=>[...e[30]||(e[30]=[n("i",{class:"i-carbon-list-boxes"},null,-1),n("span",null,"白名单",-1)])]),_:1},8,["onClick"]),l(v,{text:"",size:"small",onClick:W=>le(t)},{default:a(()=>[...e[31]||(e[31]=[n("i",{class:"i-carbon-list-checked"},null,-1),n("span",null,"黑名单",-1)])]),_:1},8,["onClick"]),l(v,{text:"",type:t.is_enabled?"warning":"success",size:"small",onClick:W=>Q(t)},{default:a(()=>[n("i",{class:pe(t.is_enabled?"i-carbon-pause":"i-carbon-play")},null,2),n("span",null,w(t.is_enabled?"禁用":"启用"),1)]),_:2},1032,["type","onClick"]),l(v,{text:"",type:"danger",size:"small",onClick:W=>Z(t)},{default:a(()=>[...e[32]||(e[32]=[n("i",{class:"i-carbon-trash-can"},null,-1),n("span",null,"删除",-1)])]),_:1},8,["onClick"])])]),_:1})]),_:1},8,["data","loading"])]),_:1}),l(H,{modelValue:x.value,"onUpdate:modelValue":e[15]||(e[15]=t=>x.value=t),title:y.value?"编辑限流规则":"创建限流规则",width:"760px","close-on-click-modal":!1},{footer:a(()=>[l(v,{onClick:e[14]||(e[14]=t=>x.value=!1)},{default:a(()=>[...e[33]||(e[33]=[g("取消",-1)])]),_:1}),l(v,{type:"primary",loading:L.value,onClick:J},{default:a(()=>[...e[34]||(e[34]=[g("确定",-1)])]),_:1},8,["loading"])]),default:a(()=>[l(A,{ref_key:"formRef",ref:P,model:o.value,rules:N,"label-width":"130px"},{default:a(()=>[l(f,{label:"规则名称",prop:"rule_name"},{default:a(()=>[l($,{modelValue:o.value.rule_name,"onUpdate:modelValue":e[2]||(e[2]=t=>o.value.rule_name=t)},null,8,["modelValue"])]),_:1}),l(f,{label:"描述"},{default:a(()=>[l($,{modelValue:o.value.description,"onUpdate:modelValue":e[3]||(e[3]=t=>o.value.description=t)},null,8,["modelValue"])]),_:1}),l(f,{label:"匹配类型",prop:"match_type"},{default:a(()=>[l(T,{modelValue:o.value.match_type,"onUpdate:modelValue":e[4]||(e[4]=t=>o.value.match_type=t),style:{width:"100%"}},{default:a(()=>[l(_,{label:"路径",value:"path"}),l(_,{label:"域名",value:"domain"}),l(_,{label:"IP",value:"ip"}),l(_,{label:"请求头",value:"header"}),l(_,{label:"全部",value:"all"})]),_:1},8,["modelValue"])]),_:1}),o.value.match_type!=="all"?(E(),G(f,{key:0,label:"匹配模式",prop:"match_pattern"},{default:a(()=>[l($,{modelValue:o.value.match_pattern,"onUpdate:modelValue":e[5]||(e[5]=t=>o.value.match_pattern=t),placeholder:"例如: /v1/besrv/* 或 X-API-KEY:abc"},null,8,["modelValue"])]),_:1})):O("",!0),l(f,{label:"匹配域名"},{default:a(()=>[l($,{modelValue:o.value.match_domain,"onUpdate:modelValue":e[6]||(e[6]=t=>o.value.match_domain=t),placeholder:"可选,例如 api.local"},null,8,["modelValue"])]),_:1}),l(f,{label:"限流类型",prop:"limit_type"},{default:a(()=>[l(T,{modelValue:o.value.limit_type,"onUpdate:modelValue":e[7]||(e[7]=t=>o.value.limit_type=t),style:{width:"100%"}},{default:a(()=>[l(_,{label:"请求数",value:"request"}),l(_,{label:"带宽",value:"bandwidth"})]),_:1},8,["modelValue"])]),_:1}),l(f,{label:"限流值",prop:"limit_value"},{default:a(()=>[l(j,{modelValue:o.value.limit_value,"onUpdate:modelValue":e[8]||(e[8]=t=>o.value.limit_value=t),min:1},null,8,["modelValue"])]),_:1}),l(f,{label:"时间窗口(秒)",prop:"limit_window"},{default:a(()=>[l(j,{modelValue:o.value.limit_window,"onUpdate:modelValue":e[9]||(e[9]=t=>o.value.limit_window=t),min:1},null,8,["modelValue"])]),_:1}),l(f,{label:"限流键",prop:"limit_key"},{default:a(()=>[l(T,{modelValue:o.value.limit_key,"onUpdate:modelValue":e[10]||(e[10]=t=>o.value.limit_key=t),style:{width:"100%"}},{default:a(()=>[l(_,{label:"客户端 IP",value:"ip"}),l(_,{label:"请求头",value:"header"}),l(_,{label:"Cookie",value:"cookie"}),l(_,{label:"路径",value:"path"})]),_:1},8,["modelValue"])]),_:1}),l(f,{label:"状态码"},{default:a(()=>[l(j,{modelValue:o.value.block_status_code,"onUpdate:modelValue":e[11]||(e[11]=t=>o.value.block_status_code=t),min:100,max:599},null,8,["modelValue"])]),_:1}),l(f,{label:"返回消息"},{default:a(()=>[l($,{modelValue:o.value.block_message,"onUpdate:modelValue":e[12]||(e[12]=t=>o.value.block_message=t)},null,8,["modelValue"])]),_:1}),l(f,{label:"启用状态"},{default:a(()=>[l(oe,{modelValue:o.value.is_enabled,"onUpdate:modelValue":e[13]||(e[13]=t=>o.value.is_enabled=t)},null,8,["modelValue"])]),_:1})]),_:1},8,["model"])]),_:1},8,["modelValue","title"]),l(H,{modelValue:I.value,"onUpdate:modelValue":e[18]||(e[18]=t=>I.value=t),title:U.value==="whitelist"?"管理白名单":"管理黑名单",width:"620px"},{footer:a(()=>[l(v,{onClick:e[17]||(e[17]=t=>I.value=!1)},{default:a(()=>[...e[35]||(e[35]=[g("关闭",-1)])]),_:1}),l(v,{type:"primary",loading:L.value,onClick:te},{default:a(()=>[...e[36]||(e[36]=[g("添加",-1)])]),_:1},8,["loading"])]),default:a(()=>[l(A,{"label-width":"90px"},{default:a(()=>[l(f,{label:"当前列表"},{default:a(()=>[n("div",Ge,[(E(!0),K(fe,null,ve(q.value,t=>(E(),G(F,{key:t,closable:"",onClose:W=>ae(t)},{default:a(()=>[g(w(t),1)]),_:2},1032,["onClose"]))),128)),q.value.length===0?(E(),K("span",Ke,"暂无 IP")):O("",!0)])]),_:1}),l(f,{label:"新增 IP"},{default:a(()=>[l($,{modelValue:B.value,"onUpdate:modelValue":e[16]||(e[16]=t=>B.value=t),placeholder:"支持逗号分隔,例如 1.1.1.1,2.2.2.2"},null,8,["modelValue"])]),_:1})]),_:1})]),_:1},8,["modelValue","title"])]),_:1})}}}),Je=ye(Oe,[["__scopeId","data-v-449af0a5"]]);export{Je as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{N as ne,r as g,B as q,G as p,d as oe,A as ue,a as re,o as ie,g as B,b as S,w as t,e as n,i as a,h as A,k as y,j as _,y as b,s as h,q as de,O as J,_ as ce}from"./index-Eu9iwQmC.js";import{g as me,a as _e,c as pe,u as fe,d as ve,t as be,s as ye,b as he,e as ge}from"./caddy-Cmwd6W2n.js";import{P as we}from"./PageContainer-CVLD10ut.js";const Ve=ne("caddyRoute",()=>{const R=g([]),c=g(null),D=g(null),i=g(!1),f=g(null),m=q(()=>R.value.filter(u=>u.is_enabled)),k=q(()=>R.value.filter(u=>!u.is_enabled)),C=q(()=>R.value.filter(u=>u.enable_waf??u.waf_enabled)),$=q(()=>{const u={};return R.value.forEach(r=>{u[r.domain]||(u[r.domain]=[]),u[r.domain].push(r)}),u}),F=q(()=>{const u={};return R.value.forEach(r=>{const w=r.service_name||r.upstream_service||"unknown";u[w]||(u[w]=[]),u[w].push(r)}),u}),o=async u=>{i.value=!0,f.value=null;try{const r=await me(u);return R.value=r.routes,r}catch(r){throw f.value=r,p.error("获取路由列表失败"),r}finally{i.value=!1}};return{routes:R,currentRoute:c,statistics:D,loading:i,error:f,enabledRoutes:m,disabledRoutes:k,wafEnabledRoutes:C,routesByDomain:$,routesByService:F,fetchRoutes:o,fetchRouteDetail:async u=>{i.value=!0;try{const r=await _e(u);return c.value=r,r}catch(r){throw p.error("获取路由详情失败"),r}finally{i.value=!1}},createRoute:async u=>{i.value=!0;try{const r=await pe(u);return p.success(r.message||"路由创建成功"),await o(),r}catch(r){throw p.error("创建路由失败"),r}finally{i.value=!1}},updateRoute:async(u,r)=>{i.value=!0;try{const w=await fe(u,r);return p.success(w.message||"路由更新成功"),await o(),w}catch(w){throw p.error("更新路由失败"),w}finally{i.value=!1}},deleteRoute:async u=>{i.value=!0;try{const r=await ve(u);return p.success(r.message||"路由删除成功"),await o(),r}catch(r){throw p.error("删除路由失败"),r}finally{i.value=!1}},toggleRoute:async u=>{try{const r=await be(u);return p.success(r.message||"状态切换成功"),await o(),r}catch(r){throw p.error("切换状态失败"),r}},syncRoutes:async()=>{i.value=!0;try{const u=await ye();return p.success(u.message||"同步成功"),await o(),u}catch(u){throw p.error("同步失败"),u}finally{i.value=!1}},fetchStatistics:async()=>{try{const u=await he();return D.value=u,u}catch(u){throw p.error("获取统计信息失败"),u}},fetchRoutesByDomain:async u=>{i.value=!0;try{return await ge(u)}catch(r){throw p.error("获取域名路由失败"),r}finally{i.value=!1}},clearData:()=>{R.value=[],c.value=null,D.value=null,f.value=null}}}),Re={class:"stats-cards mb-6"},ke={class:"stat-content"},xe={class:"stat-info"},Ce={class:"stat-value"},Ue={class:"stat-content"},Be={class:"stat-info"},Se={class:"stat-value"},De={class:"stat-content"},$e={class:"stat-info"},Fe={class:"stat-value"},ze={class:"stat-content"},Ee={class:"stat-info"},qe={class:"stat-value"},Ae={class:"text-sm"},Ne={class:"text-sm"},Te={class:"action-buttons"},Ie=oe({__name:"RouteManage",setup(R){const c=Ve(),{routes:D,loading:i,statistics:f}=ue(c),m=re({domain:"",service_name:"",is_enabled:void 0}),k=g(!1),C=g(!1),$=g(!1),F=g(),o=g({route_name:"",domain:"",path:"",service_name:"",upstream_address:"",priority:100,is_enabled:!0,waf_enabled:!1,waf_rules:[],load_balance_policy:"round_robin",health_check_path:"/internal/health",health_check_interval:30,timeout:60}),z=g(null),P={route_name:[{required:!0,message:"请输入路由名称",trigger:"blur"},{min:1,max:100,message:"长度需在 1-100 字符之间",trigger:"blur"}],domain:[{required:!0,message:"请输入域名",trigger:"blur"}],path:[{required:!0,message:"请输入路径",trigger:"blur"}],service_name:[{required:!0,message:"请输入服务名",trigger:"blur"}],upstream_address:[{required:!0,message:"请输入上游地址",trigger:"blur"}]},W=s=>s?{round_robin:"轮询",least_conn:"最少连接",ip_hash:"IP Hash"}[s]||s:"-",T=(s,e)=>{const v=`${s||""}${e||""}`.trim();return v?v.replace(/[^a-zA-Z0-9-_]/g,"-").replace(/-{2,}/g,"-").replace(/^-+|-+$/g,"").slice(0,100):""},L=s=>s.upstream_address?s.upstream_address:s.upstream_host?s.upstream_port?`${s.upstream_host}:${s.upstream_port}`:s.upstream_host:"",H=()=>{o.value.route_name||(o.value.route_name=T(o.value.domain,o.value.path))},j=()=>{C.value=!1,z.value=null,o.value={route_name:"",domain:"",path:"",service_name:"",upstream_address:"",priority:100,is_enabled:!0,waf_enabled:!1,waf_rules:[],load_balance_policy:"round_robin",health_check_path:"/internal/health",health_check_interval:30,timeout:60},k.value=!0},G=s=>{C.value=!0,z.value=s.id,o.value={route_name:s.route_name||T(s.domain,s.path||s.path_pattern||""),domain:s.domain,path:s.path||s.path_pattern||"",service_name:s.service_name||s.upstream_service||"",upstream_address:L(s),priority:s.priority,is_enabled:s.is_enabled,waf_enabled:s.enable_waf??s.waf_enabled,waf_rules:s.waf_rules||(s.waf_rule_set?s.waf_rule_set.split(","):[]),load_balance_policy:s.load_balance_strategy||s.load_balance_policy,health_check_path:s.health_check_path,health_check_interval:s.health_check_interval,timeout:s.timeout},k.value=!0},K=async()=>{F.value&&(H(),await F.value.validate(async s=>{if(s){$.value=!0;try{C.value&&z.value?await c.updateRoute(z.value,o.value):await c.createRoute(o.value),k.value=!1}finally{$.value=!1}}}))},u=async s=>{await c.toggleRoute(s.id)},r=async s=>{try{await J.confirm(`确定要删除路由 "${s.domain}${s.path||s.path_pattern||""}" 吗?`,"删除确认",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"}),await c.deleteRoute(s.id)}catch{}},w=async()=>{try{await J.confirm("确定要同步所有路由到Caddy吗?","同步确认",{confirmButtonText:"确定",cancelButtonText:"取消",type:"info"}),await c.syncRoutes()}catch{}},Y=async()=>{await c.fetchRoutes({domain:m.domain||void 0,service_name:m.service_name||void 0,is_enabled:m.is_enabled})},ee=async()=>{m.domain="",m.service_name="",m.is_enabled=void 0,await c.fetchRoutes()},ae=async()=>{await c.fetchRoutes(),await c.fetchStatistics()};return ie(async()=>{try{await c.fetchRoutes()}catch(s){console.error("Failed to load routes:",s)}try{await c.fetchStatistics()}catch(s){console.error("Failed to load statistics:",s)}}),(s,e)=>{const v=_("el-button"),U=_("el-card"),x=_("el-input"),d=_("el-form-item"),E=_("el-option"),O=_("el-select"),Q=_("el-form"),V=_("el-table-column"),I=_("el-tag"),le=_("el-table"),M=_("el-input-number"),X=_("el-switch"),N=_("el-checkbox"),te=_("el-checkbox-group"),se=_("el-dialog");return S(),B(we,{title:"路由管理",icon:"i-carbon-router"},{actions:t(()=>[a(v,{type:"primary",onClick:j},{default:t(()=>[...e[18]||(e[18]=[n("i",{class:"i-carbon-add mr-2"},null,-1),n("span",null,"创建路由",-1)])]),_:1}),a(v,{onClick:w,loading:y(i)},{default:t(()=>[...e[19]||(e[19]=[n("i",{class:"i-carbon-sync-settings mr-2"},null,-1),n("span",null,"同步到Caddy",-1)])]),_:1},8,["loading"]),a(v,{onClick:ae},{default:t(()=>[...e[20]||(e[20]=[n("i",{class:"i-carbon-renew mr-2"},null,-1),n("span",null,"刷新",-1)])]),_:1})]),default:t(()=>[n("div",Re,[y(f)?(S(),B(U,{key:0,class:"stat-card"},{default:t(()=>[n("div",ke,[e[22]||(e[22]=n("div",{class:"stat-icon stat-icon-primary"},[n("i",{class:"i-carbon-router"})],-1)),n("div",xe,[e[21]||(e[21]=n("p",{class:"stat-label"},"总路由数",-1)),n("h3",Ce,b(y(f).total),1)])])]),_:1})):A("",!0),y(f)?(S(),B(U,{key:1,class:"stat-card"},{default:t(()=>[n("div",Ue,[e[24]||(e[24]=n("div",{class:"stat-icon stat-icon-success"},[n("i",{class:"i-carbon-checkmark"})],-1)),n("div",Be,[e[23]||(e[23]=n("p",{class:"stat-label"},"已启用",-1)),n("h3",Se,b(y(f).enabled),1)])])]),_:1})):A("",!0),y(f)?(S(),B(U,{key:2,class:"stat-card"},{default:t(()=>[n("div",De,[e[26]||(e[26]=n("div",{class:"stat-icon stat-icon-warning"},[n("i",{class:"i-carbon-warning"})],-1)),n("div",$e,[e[25]||(e[25]=n("p",{class:"stat-label"},"已禁用",-1)),n("h3",Fe,b(y(f).disabled),1)])])]),_:1})):A("",!0),y(f)?(S(),B(U,{key:3,class:"stat-card"},{default:t(()=>[n("div",ze,[e[28]||(e[28]=n("div",{class:"stat-icon stat-icon-error"},[n("i",{class:"i-carbon-security"})],-1)),n("div",Ee,[e[27]||(e[27]=n("p",{class:"stat-label"},"WAF已启用",-1)),n("h3",qe,b(y(f).waf_enabled_count),1)])])]),_:1})):A("",!0)]),a(U,{class:"filter-card mb-6"},{default:t(()=>[a(Q,{inline:!0,model:m},{default:t(()=>[a(d,{label:"域名"},{default:t(()=>[a(x,{modelValue:m.domain,"onUpdate:modelValue":e[0]||(e[0]=l=>m.domain=l),placeholder:"请输入域名",clearable:"",style:{width:"200px"}},null,8,["modelValue"])]),_:1}),a(d,{label:"服务名"},{default:t(()=>[a(x,{modelValue:m.service_name,"onUpdate:modelValue":e[1]||(e[1]=l=>m.service_name=l),placeholder:"请输入服务名",clearable:"",style:{width:"200px"}},null,8,["modelValue"])]),_:1}),a(d,{label:"状态"},{default:t(()=>[a(O,{modelValue:m.is_enabled,"onUpdate:modelValue":e[2]||(e[2]=l=>m.is_enabled=l),placeholder:"全部",clearable:"",style:{width:"120px"}},{default:t(()=>[a(E,{label:"已启用",value:!0}),a(E,{label:"已禁用",value:!1})]),_:1},8,["modelValue"])]),_:1}),a(d,null,{default:t(()=>[a(v,{type:"primary",onClick:Y},{default:t(()=>[...e[29]||(e[29]=[h("查询",-1)])]),_:1}),a(v,{onClick:ee},{default:t(()=>[...e[30]||(e[30]=[h("重置",-1)])]),_:1})]),_:1})]),_:1},8,["model"])]),_:1}),a(U,null,{default:t(()=>[a(le,{data:y(D),loading:y(i),stripe:"",style:{width:"100%"},class:"caddy-table"},{default:t(()=>[a(V,{prop:"id",label:"ID",width:"80"}),a(V,{label:"路由名称","min-width":"160"},{default:t(({row:l})=>[n("span",Ae,b(l.route_name||"-"),1)]),_:1}),a(V,{prop:"domain",label:"域名","min-width":"150"}),a(V,{label:"路径","min-width":"150"},{default:t(({row:l})=>[n("span",null,b(l.path||l.path_pattern||"-"),1)]),_:1}),a(V,{label:"服务名",width:"140"},{default:t(({row:l})=>[n("span",null,b(l.service_name||l.upstream_service||"-"),1)]),_:1}),a(V,{label:"优先级",width:"90",align:"center"},{default:t(({row:l})=>[a(I,{size:"small"},{default:t(()=>[h(b(l.priority),1)]),_:2},1024)]),_:1}),a(V,{label:"状态",width:"90",align:"center"},{default:t(({row:l})=>[a(I,{type:l.is_enabled?"success":"info",size:"small"},{default:t(()=>[h(b(l.is_enabled?"启用":"禁用"),1)]),_:2},1032,["type"])]),_:1}),a(V,{label:"WAF",width:"80",align:"center"},{default:t(({row:l})=>[a(I,{type:l.enable_waf??l.waf_enabled?"danger":"info",size:"small"},{default:t(()=>[h(b(l.enable_waf??l.waf_enabled?"开启":"关闭"),1)]),_:2},1032,["type"])]),_:1}),a(V,{label:"负载均衡",width:"120"},{default:t(({row:l})=>[n("span",Ne,b(W(l.load_balance_strategy||l.load_balance_policy)),1)]),_:1}),a(V,{label:"操作",width:"260",fixed:"right"},{default:t(({row:l})=>[n("div",Te,[a(v,{text:"",type:"primary",size:"small",onClick:Z=>G(l)},{default:t(()=>[...e[31]||(e[31]=[n("i",{class:"i-carbon-edit"},null,-1),n("span",null,"编辑",-1)])]),_:1},8,["onClick"]),a(v,{text:"",type:l.is_enabled?"warning":"success",size:"small",onClick:Z=>u(l)},{default:t(()=>[n("i",{class:de(l.is_enabled?"i-carbon-power":"i-carbon-play")},null,2),n("span",null,b(l.is_enabled?"禁用":"启用"),1)]),_:2},1032,["type","onClick"]),a(v,{text:"",type:"danger",size:"small",onClick:Z=>r(l)},{default:t(()=>[...e[32]||(e[32]=[n("i",{class:"i-carbon-trash-can"},null,-1),n("span",null,"删除",-1)])]),_:1},8,["onClick"])])]),_:1})]),_:1},8,["data","loading"])]),_:1}),a(se,{modelValue:k.value,"onUpdate:modelValue":e[17]||(e[17]=l=>k.value=l),title:C.value?"编辑路由":"创建路由",width:"800px","close-on-click-modal":!1},{footer:t(()=>[a(v,{onClick:e[16]||(e[16]=l=>k.value=!1)},{default:t(()=>[...e[39]||(e[39]=[h("取消",-1)])]),_:1}),a(v,{type:"primary",onClick:K,loading:$.value},{default:t(()=>[...e[40]||(e[40]=[h(" 确定 ",-1)])]),_:1},8,["loading"])]),default:t(()=>[a(Q,{ref_key:"formRef",ref:F,model:o.value,rules:P,"label-width":"140px"},{default:t(()=>[a(d,{label:"域名",prop:"domain"},{default:t(()=>[a(x,{modelValue:o.value.domain,"onUpdate:modelValue":e[3]||(e[3]=l=>o.value.domain=l),placeholder:"例如: api.example.com"},null,8,["modelValue"])]),_:1}),a(d,{label:"路由名称",prop:"route_name"},{default:t(()=>[a(x,{modelValue:o.value.route_name,"onUpdate:modelValue":e[4]||(e[4]=l=>o.value.route_name=l),placeholder:"可自定义路由名称,不填则自动生成"},null,8,["modelValue"])]),_:1}),a(d,{label:"路径",prop:"path"},{default:t(()=>[a(x,{modelValue:o.value.path,"onUpdate:modelValue":e[5]||(e[5]=l=>o.value.path=l),placeholder:"例如: /v1/besrv/*"},null,8,["modelValue"])]),_:1}),a(d,{label:"服务名",prop:"service_name"},{default:t(()=>[a(x,{modelValue:o.value.service_name,"onUpdate:modelValue":e[6]||(e[6]=l=>o.value.service_name=l),placeholder:"例如: besrv"},null,8,["modelValue"])]),_:1}),a(d,{label:"上游地址",prop:"upstream_address"},{default:t(()=>[a(x,{modelValue:o.value.upstream_address,"onUpdate:modelValue":e[7]||(e[7]=l=>o.value.upstream_address=l),placeholder:"例如: besrv.service:8080"},null,8,["modelValue"])]),_:1}),a(d,{label:"优先级",prop:"priority"},{default:t(()=>[a(M,{modelValue:o.value.priority,"onUpdate:modelValue":e[8]||(e[8]=l=>o.value.priority=l),min:0,max:1e3},null,8,["modelValue"])]),_:1}),a(d,{label:"负载均衡策略",prop:"load_balance_policy"},{default:t(()=>[a(O,{modelValue:o.value.load_balance_policy,"onUpdate:modelValue":e[9]||(e[9]=l=>o.value.load_balance_policy=l),style:{width:"100%"}},{default:t(()=>[a(E,{label:"轮询(Round Robin)",value:"round_robin"}),a(E,{label:"最少连接(Least Conn)",value:"least_conn"}),a(E,{label:"IP Hash",value:"ip_hash"})]),_:1},8,["modelValue"])]),_:1}),a(d,{label:"健康检查路径",prop:"health_check_path"},{default:t(()=>[a(x,{modelValue:o.value.health_check_path,"onUpdate:modelValue":e[10]||(e[10]=l=>o.value.health_check_path=l),placeholder:"例如: /internal/health"},null,8,["modelValue"])]),_:1}),a(d,{label:"健康检查间隔"},{default:t(()=>[a(M,{modelValue:o.value.health_check_interval,"onUpdate:modelValue":e[11]||(e[11]=l=>o.value.health_check_interval=l),min:10,max:300},null,8,["modelValue"]),e[33]||(e[33]=n("span",{class:"ml-2 text-secondary"},"秒",-1))]),_:1}),a(d,{label:"超时时间"},{default:t(()=>[a(M,{modelValue:o.value.timeout,"onUpdate:modelValue":e[12]||(e[12]=l=>o.value.timeout=l),min:10,max:300},null,8,["modelValue"]),e[34]||(e[34]=n("span",{class:"ml-2 text-secondary"},"秒",-1))]),_:1}),a(d,{label:"启用状态"},{default:t(()=>[a(X,{modelValue:o.value.is_enabled,"onUpdate:modelValue":e[13]||(e[13]=l=>o.value.is_enabled=l)},null,8,["modelValue"])]),_:1}),a(d,{label:"启用WAF"},{default:t(()=>[a(X,{modelValue:o.value.waf_enabled,"onUpdate:modelValue":e[14]||(e[14]=l=>o.value.waf_enabled=l)},null,8,["modelValue"])]),_:1}),o.value.waf_enabled?(S(),B(d,{key:0,label:"WAF规则"},{default:t(()=>[a(te,{modelValue:o.value.waf_rules,"onUpdate:modelValue":e[15]||(e[15]=l=>o.value.waf_rules=l)},{default:t(()=>[a(N,{label:"sqli"},{default:t(()=>[...e[35]||(e[35]=[h("SQL注入",-1)])]),_:1}),a(N,{label:"xss"},{default:t(()=>[...e[36]||(e[36]=[h("XSS攻击",-1)])]),_:1}),a(N,{label:"rce"},{default:t(()=>[...e[37]||(e[37]=[h("远程代码执行",-1)])]),_:1}),a(N,{label:"lfi"},{default:t(()=>[...e[38]||(e[38]=[h("本地文件包含",-1)])]),_:1})]),_:1},8,["modelValue"])]),_:1})):A("",!0)]),_:1},8,["model"])]),_:1},8,["modelValue","title"])]),_:1})}}}),Le=ce(Ie,[["__scopeId","data-v-26d584fd"]]);export{Le as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{d as q,r as p,B as c,g as J,b as O,j as m,w as o,e as s,c as K,h as Q,i as a,y as r,t as W,s as l,k as T,G as E,_ as Z}from"./index-Eu9iwQmC.js";import{a as A}from"./service-BlXlgg12.js";import{n as k,S as V,a as ee,b as se,O as v}from"./service-operation-DAaEb_pH.js";import{S as te,a as ae,O as oe}from"./OperationProgressDialog-C06wo1xn.js";const ne={class:"flex items-start justify-between mb-4"},re={class:"flex items-center flex-1"},le={class:"flex-1"},ie={class:"service-title"},ce={class:"service-stats grid grid-cols-3 gap-4"},de={class:"stat-item text-center"},ue={class:"stat-value"},me={class:"stat-item text-center"},ve={class:"stat-value stat-value-success"},pe={class:"stat-item text-center"},_e={class:"stat-value stat-value-error"},fe={class:"status-expectation mt-3"},Se={class:"status-row"},ge={class:"replica-row"},Te={key:0,class:"mt-4"},Ee={class:"progress-header"},be=q({__name:"ServiceCard",props:{service:{},showProgress:{type:Boolean,default:!0}},emits:["click","detail","config","refresh","logs"],setup(I,{emit:x}){const n=I,d=x,_=p(!1),f=p(!1),b=p(v.RESTART),C=p(),R=c(()=>k(n.service.expected_status,A.RUNNING)),w=c(()=>k(n.service.actual_status,A.STOPPED)),S=c(()=>n.service.total_instances===0?0:Math.round(n.service.healthy_instances/n.service.total_instances*100)),N=c(()=>{const t=S.value;return t>=90?"#67C23A":t>=60?"#E6A23C":"#F56C6C"}),P=c(()=>V[R.value]),D=c(()=>V[w.value]),h=c(()=>ee[R.value]),G=c(()=>se[w.value]),i={DETAIL:"detail",CONFIG:"config",REFRESH:"refresh",LOGS:"logs"},U=()=>{d("click",n.service)},F=t=>{switch(t){case i.DETAIL:d("detail",n.service);break;case i.CONFIG:d("config",n.service);break;case i.REFRESH:d("refresh",n.service);break;case i.LOGS:d("logs",n.service);break;case v.RESTART:case v.START:case v.STOP:b.value=t,_.value=!0;break}},M=t=>{C.value=t,f.value=!0},B=()=>{E.success("操作成功"),d("refresh",n.service)},L=()=>{E.success("操作成功完成"),d("refresh",n.service)},z=t=>{E.error(`操作失败: ${t.error_message||"未知错误"}`)};return(t,e)=>{const H=m("el-button"),u=m("el-dropdown-item"),j=m("el-dropdown-menu"),X=m("el-dropdown"),y=m("el-tag"),Y=m("el-progress"),$=m("el-card");return O(),J($,{class:"service-card cursor-pointer hover:shadow-lg transition-shadow duration-300","body-style":{padding:"20px"},onClick:U},{default:o(()=>[s("div",ne,[s("div",re,[e[3]||(e[3]=s("div",{class:"service-icon"},[s("i",{class:"i-carbon-application"})],-1)),s("div",le,[s("h3",ie,r(t.service.service_name),1),a(te,{status:t.service.overall_status,type:"service",size:"small"},null,8,["status"])])]),s("div",{onClick:e[0]||(e[0]=W(()=>{},["stop"]))},[a(X,{trigger:"click",onCommand:F},{dropdown:o(()=>[a(j,null,{default:o(()=>[a(u,{command:i.DETAIL},{default:o(()=>[...e[5]||(e[5]=[s("i",{class:"i-carbon-information mr-2"},null,-1),l("查看详情 ",-1)])]),_:1},8,["command"]),a(u,{command:i.CONFIG},{default:o(()=>[...e[6]||(e[6]=[s("i",{class:"i-carbon-settings mr-2"},null,-1),l("配置管理 ",-1)])]),_:1},8,["command"]),a(u,{command:i.REFRESH},{default:o(()=>[...e[7]||(e[7]=[s("i",{class:"i-carbon-renew mr-2"},null,-1),l("刷新状态 ",-1)])]),_:1},8,["command"]),a(u,{divided:"",command:i.LOGS},{default:o(()=>[...e[8]||(e[8]=[s("i",{class:"i-carbon-document mr-2"},null,-1),l("操作日志 ",-1)])]),_:1},8,["command"]),a(u,{command:T(v).RESTART},{default:o(()=>[...e[9]||(e[9]=[s("i",{class:"i-carbon-restart mr-2"},null,-1),l("重启服务 ",-1)])]),_:1},8,["command"]),a(u,{command:T(v).START},{default:o(()=>[...e[10]||(e[10]=[s("i",{class:"i-carbon-play mr-2"},null,-1),l("启动服务 ",-1)])]),_:1},8,["command"]),a(u,{command:T(v).STOP},{default:o(()=>[...e[11]||(e[11]=[s("i",{class:"i-carbon-stop mr-2"},null,-1),l("停止服务 ",-1)])]),_:1},8,["command"])]),_:1})]),default:o(()=>[a(H,{text:"",circle:""},{default:o(()=>[...e[4]||(e[4]=[s("i",{class:"i-carbon-overflow-menu-vertical text-lg"},null,-1)])]),_:1})]),_:1})])]),s("div",ce,[s("div",de,[s("div",ue,r(t.service.total_instances),1),e[12]||(e[12]=s("div",{class:"stat-label"},"总实例数",-1))]),s("div",me,[s("div",ve,r(t.service.healthy_instances),1),e[13]||(e[13]=s("div",{class:"stat-label"},"健康实例",-1))]),s("div",pe,[s("div",_e,r(t.service.unhealthy_instances),1),e[14]||(e[14]=s("div",{class:"stat-label"},"异常实例",-1))])]),s("div",fe,[s("div",Se,[e[15]||(e[15]=s("span",{class:"status-label"},"期望",-1)),a(y,{size:"small",type:h.value},{default:o(()=>[l(r(P.value),1)]),_:1},8,["type"]),e[16]||(e[16]=s("span",{class:"status-sep"},"/",-1)),e[17]||(e[17]=s("span",{class:"status-label"},"实际",-1)),a(y,{size:"small",type:G.value},{default:o(()=>[l(r(D.value),1)]),_:1},8,["type"])]),s("div",ge," 副本 "+r(t.service.actual_replicas??t.service.total_instances)+" / "+r(t.service.desired_replicas??1),1)]),t.showProgress?(O(),K("div",Te,[s("div",Ee,[e[18]||(e[18]=s("span",null,"健康率",-1)),s("span",null,r(S.value)+"%",1)]),a(Y,{percentage:S.value,color:N.value,"show-text":!1},null,8,["percentage","color"])])):Q("",!0),a(ae,{modelValue:_.value,"onUpdate:modelValue":e[1]||(e[1]=g=>_.value=g),operation:b.value,"service-names":[t.service.service_name],onOperationSubmitted:M,onSuccess:B},null,8,["modelValue","operation","service-names"]),a(oe,{modelValue:f.value,"onUpdate:modelValue":e[2]||(e[2]=g=>f.value=g),"operation-id":C.value,onSuccess:L,onError:z},null,8,["modelValue","operation-id"])]),_:1})}}}),Oe=Z(be,[["__scopeId","data-v-ca27daff"]]);export{Oe as S};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{d as te,c as p,b as c,C as xe,g as A,h as V,D as Ve,j as u,w as s,i as a,e,y as i,s as _,k as b,_ as ae,A as De,B as y,I as Pe,r as N,J as Ue,o as Le,x as He,K as $e,F as ze,G}from"./index-Eu9iwQmC.js";import{H as w,L as h,u as Me,a as M}from"./service-BlXlgg12.js";import{O as r,n as Q,S as Z,a as Ye,b as Ge}from"./service-operation-DAaEb_pH.js";import{P as Be}from"./PageContainer-CVLD10ut.js";import{S as Y,a as Fe,O as qe}from"./OperationProgressDialog-C06wo1xn.js";import{_ as Ke}from"./AppEmpty.vue_vue_type_script_setup_true_lang-Bf2bE_Hw.js";import{f as se,a as ne}from"./format-Cuzxgna9.js";const We={class:"instance-list"},Xe={class:"instance-id-cell"},je={class:"instance-id-text"},Je={key:0,class:"font-mono text-sm"},Qe={key:1,class:"text-gray-400"},Ze={key:1,class:"text-gray-400"},et={key:0,class:"heartbeat-cell"},tt={class:"heartbeat-time"},at={class:"heartbeat-relative"},st={key:1,class:"text-gray-400"},nt={class:"action-buttons"},lt=te({__name:"InstanceList",props:{instances:{},loading:{type:Boolean}},emits:["detail"],setup(le,{emit:O}){const I=new Set([h.UP,h.RUNNING,h.STARTED,h.HEALTHY]),T=new Set([h.DOWN,h.STOPPED,h.FAILED,h.UNHEALTHY,h.ERROR]),D=O,C=d=>{D("detail",d)},f=d=>{const m=d.health_status?.toString().toLowerCase();if(m===w.HEALTHY||m===w.UNHEALTHY)return m;if(!d.health_status||m===w.UNKNOWN){const l=d.status?.toString().toUpperCase();if(l&&I.has(l))return w.HEALTHY;if(l&&T.has(l))return w.UNHEALTHY}return d.health_status||w.UNKNOWN};return(d,m)=>{const l=u("el-table-column"),S=u("el-tag"),k=u("el-button"),P=u("el-table"),U=Ve("loading");return c(),p("div",We,[xe((c(),A(P,{data:d.instances,stripe:"",style:{width:"100%"}},{default:s(()=>[a(l,{prop:"instance_id",label:"实例 ID","min-width":"200"},{default:s(({row:n})=>[e("div",Xe,[m[0]||(m[0]=e("i",{class:"i-carbon-container-software instance-icon"},null,-1)),e("span",je,i(n.instance_id),1)])]),_:1}),a(l,{prop:"host",label:"主机","min-width":"150"}),a(l,{prop:"port",label:"端口",width:"100"}),a(l,{prop:"container_name",label:"容器名称","min-width":"150"},{default:s(({row:n})=>[n.container_name?(c(),p("span",Je,i(n.container_name),1)):(c(),p("span",Qe,"-"))]),_:1}),a(l,{prop:"status",label:"运行状态",width:"120"},{default:s(({row:n})=>[a(Y,{status:n.status,type:"instance",size:"small"},null,8,["status"])]),_:1}),a(l,{prop:"health_status",label:"健康状态",width:"120"},{default:s(({row:n})=>[a(Y,{status:f(n),type:"health",size:"small"},null,8,["status"])]),_:1}),a(l,{prop:"version",label:"版本",width:"100"},{default:s(({row:n})=>[n.version?(c(),A(S,{key:0,size:"small",effect:"plain"},{default:s(()=>[_(" v"+i(n.version),1)]),_:2},1024)):(c(),p("span",Ze,"-"))]),_:1}),a(l,{prop:"last_heartbeat",label:"最后心跳","min-width":"180"},{default:s(({row:n})=>[n.last_heartbeat?(c(),p("div",et,[e("div",tt,i(b(se)(n.last_heartbeat)),1),e("div",at,i(b(ne)(n.last_heartbeat)),1)])):(c(),p("span",st,"无数据"))]),_:1}),a(l,{label:"元数据","min-width":"150"},{default:s(({row:n})=>[n.instance_metadata?.replica_index!==void 0?(c(),A(S,{key:0,size:"small",effect:"plain",class:"mr-1"},{default:s(()=>[_(" 副本 #"+i(n.instance_metadata.replica_index),1)]),_:2},1024)):V("",!0),n.metadata?.version||n.version?(c(),A(S,{key:1,size:"small",effect:"plain",class:"mr-1"},{default:s(()=>[_(" v"+i(n.metadata?.version||n.version),1)]),_:2},1024)):V("",!0),n.metadata?.environment?(c(),A(S,{key:2,size:"small",type:"info",effect:"plain"},{default:s(()=>[_(i(n.metadata.environment),1)]),_:2},1024)):V("",!0)]),_:1}),a(l,{label:"操作",width:"160",fixed:"right"},{default:s(({row:n})=>[e("div",nt,[a(k,{text:"",type:"primary",size:"small",class:"action-btn",onClick:B=>C(n)},{default:s(()=>[...m[1]||(m[1]=[e("i",{class:"i-carbon-information"},null,-1),e("span",null,"详情",-1)])]),_:1},8,["onClick"])])]),_:1})]),_:1},8,["data"])),[[U,d.loading]]),!d.loading&&d.instances.length===0?(c(),A(Ke,{key:0,type:"empty",description:"暂无实例数据"})):V("",!0)])}}}),ot=ae(lt,[["__scopeId","data-v-c80d8557"]]),it={class:"detail-actions"},ct={key:0,class:"stats-grid"},rt={class:"stat-item"},dt={class:"stat-value"},ut={class:"stat-item"},_t={class:"stat-item"},mt={class:"stat-value"},pt={class:"stat-item"},vt={class:"stat-value stat-value-success"},ft={class:"stat-item"},Tt={class:"stat-item"},St={class:"stat-item"},bt={class:"stat-value"},ht={key:1},yt={class:"flex items-center justify-between"},gt={key:0},Et={class:"heartbeat-time"},Rt={key:1,class:"empty-text"},Nt={key:0,class:"metadata-pre"},At={key:1,class:"empty-text"},It=1500,ee=10,wt=te({__name:"ServiceDetail",setup(le){const O=Pe(),I=He(),T=Me(),{currentInstances:D,instancesLoading:C}=De(T),f=y(()=>O.params.serviceName),d=N(!1),m=N(!1),l=N(null),S=N(!1),k=N(!1),P=N(),U={LOGS:"logs"},n={ACTION:"action"},B=[r.RESTART,r.START,r.STOP],oe=new Set(B),x=N({operation:r.RESTART,serviceNames:[]}),v=y(()=>T.getServiceByName(f.value)),F=y(()=>Q(v.value?.expected_status,M.RUNNING)),L=y(()=>Q(v.value?.actual_status,M.STOPPED)),ie=y(()=>Z[F.value]),ce=y(()=>Z[L.value]),re=y(()=>Ye[F.value]),de=y(()=>Ge[L.value]),ue=()=>{I.back()},_e=()=>{I.push({name:"ConfigManage",params:{serviceName:f.value}})},me=async()=>{await Promise.all([T.fetchServices(),g()])},pe=async()=>{await g()},ve=o=>{l.value=o,m.value=!0},g=async()=>{try{await T.fetchServiceInstances(f.value,d.value)}catch(o){console.error("Failed to fetch instances:",o)}},fe=o=>{switch(o){case U.LOGS:Te();break;case r.RESTART:q();break;case r.START:K();break;case r.STOP:W();break}},Te=()=>{I.push({name:"ServiceLogs",query:{serviceName:f.value}})},q=()=>{S.value=!0,x.value={operation:r.RESTART,serviceNames:[f.value]}},K=()=>{S.value=!0,x.value={operation:r.START,serviceNames:[f.value]}},W=()=>{S.value=!0,x.value={operation:r.STOP,serviceNames:[f.value]}},Se=o=>{P.value=o,k.value=!0},be=async()=>{G.success("操作成功"),await T.fetchServices(),await g()},he=async o=>{G.success("操作成功完成"),await Re(o)},ye=o=>{G.error(`操作失败: ${o.error_message||"未知错误"}`)},ge=o=>new Promise(t=>{setTimeout(t,o)}),Ee=o=>v.value?o.operation_type===r.STOP?L.value===M.STOPPED&&D.value.length===0:o.operation_type===r.START||o.operation_type===r.RESTART?L.value===M.RUNNING:!0:!1,Re=async o=>{for(let t=0;t<ee;t++){if(await Promise.all([T.fetchServices(),g()]),Ee(o))return;t<ee-1&&await ge(It)}};let H=null;const Ne=()=>{X(),H=window.setInterval(()=>{C.value||g()},6e4)},X=()=>{H!==null&&(clearInterval(H),H=null)};return Ue(f,()=>{g()},{immediate:!0}),Le(async()=>{T.services.length===0&&await T.fetchServices(),await g(),Ne();const o=O.query[n.ACTION];if(o&&oe.has(o))switch(I.replace({query:{...O.query,[n.ACTION]:void 0}}),o){case r.RESTART:q();break;case r.START:K();break;case r.STOP:W();break}}),$e(()=>{X()}),(o,t)=>{const $=u("el-button"),z=u("el-dropdown-item"),Ae=u("el-dropdown-menu"),Ie=u("el-dropdown"),j=u("el-tag"),we=u("el-skeleton"),J=u("el-card"),Oe=u("el-switch"),E=u("el-descriptions-item"),Ce=u("el-descriptions"),ke=u("el-dialog");return c(),A(Be,{title:`${f.value} 详情`,subtitle:"查看服务实例和运行状态",icon:"i-carbon-application"},{actions:s(()=>[e("div",it,[a($,{onClick:ue,class:"action-btn"},{default:s(()=>[...t[4]||(t[4]=[e("i",{class:"i-carbon-arrow-left"},null,-1),e("span",{class:"btn-text"},"返回",-1)])]),_:1}),a($,{type:"primary",onClick:_e,class:"action-btn"},{default:s(()=>[...t[5]||(t[5]=[e("i",{class:"i-carbon-settings"},null,-1),e("span",{class:"btn-text"},"配置",-1)])]),_:1}),a($,{onClick:me,loading:b(C),class:"action-btn"},{default:s(()=>[...t[6]||(t[6]=[e("i",{class:"i-carbon-renew"},null,-1),e("span",{class:"btn-text"},"刷新",-1)])]),_:1},8,["loading"]),a(Ie,{trigger:"click",onCommand:fe},{dropdown:s(()=>[a(Ae,null,{default:s(()=>[a(z,{command:U.LOGS},{default:s(()=>[...t[8]||(t[8]=[e("i",{class:"i-carbon-document mr-2"},null,-1),_("操作日志 ",-1)])]),_:1},8,["command"]),a(z,{divided:"",command:b(r).RESTART},{default:s(()=>[...t[9]||(t[9]=[e("i",{class:"i-carbon-restart mr-2"},null,-1),_("重启服务 ",-1)])]),_:1},8,["command"]),a(z,{command:b(r).START},{default:s(()=>[...t[10]||(t[10]=[e("i",{class:"i-carbon-play mr-2"},null,-1),_("启动服务 ",-1)])]),_:1},8,["command"]),a(z,{command:b(r).STOP},{default:s(()=>[...t[11]||(t[11]=[e("i",{class:"i-carbon-stop mr-2"},null,-1),_("停止服务 ",-1)])]),_:1},8,["command"])]),_:1})]),default:s(()=>[a($,{class:"action-btn"},{default:s(()=>[...t[7]||(t[7]=[e("i",{class:"i-carbon-overflow-menu-vertical"},null,-1),e("span",{class:"btn-text"},"操作",-1)])]),_:1})]),_:1})])]),default:s(()=>[a(J,{class:"mb-4"},{header:s(()=>[...t[12]||(t[12]=[e("span",{class:"text-lg font-semibold"},"服务概览",-1)])]),default:s(()=>[v.value?(c(),p("div",ct,[e("div",rt,[t[13]||(t[13]=e("div",{class:"stat-header"},[e("i",{class:"i-carbon-application stat-icon stat-icon-primary"}),e("span",{class:"stat-label"},"服务名称")],-1)),e("div",dt,i(v.value.service_name),1)]),e("div",ut,[t[14]||(t[14]=e("div",{class:"stat-header"},[e("i",{class:"i-carbon-health-cross stat-icon stat-icon-secondary"}),e("span",{class:"stat-label"},"整体状态")],-1)),a(Y,{status:v.value.overall_status,size:"large"},null,8,["status"])]),e("div",_t,[t[15]||(t[15]=e("div",{class:"stat-header"},[e("i",{class:"i-carbon-container-software stat-icon stat-icon-tertiary"}),e("span",{class:"stat-label"},"实例总数")],-1)),e("div",mt,i(v.value.total_instances),1)]),e("div",pt,[t[16]||(t[16]=e("div",{class:"stat-header"},[e("i",{class:"i-carbon-health-cross stat-icon stat-icon-success"}),e("span",{class:"stat-label"},"健康实例")],-1)),e("div",vt,i(v.value.healthy_instances)+" / "+i(v.value.total_instances),1)]),e("div",ft,[t[17]||(t[17]=e("div",{class:"stat-header"},[e("i",{class:"i-carbon-circle-dash stat-icon stat-icon-warning"}),e("span",{class:"stat-label"},"期望状态")],-1)),a(j,{size:"large",type:re.value},{default:s(()=>[_(i(ie.value),1)]),_:1},8,["type"])]),e("div",Tt,[t[18]||(t[18]=e("div",{class:"stat-header"},[e("i",{class:"i-carbon-debug stat-icon stat-icon-danger"}),e("span",{class:"stat-label"},"实际状态")],-1)),a(j,{size:"large",type:de.value},{default:s(()=>[_(i(ce.value),1)]),_:1},8,["type"])]),e("div",St,[t[19]||(t[19]=e("div",{class:"stat-header"},[e("i",{class:"i-carbon-chart-line-data stat-icon stat-icon-primary"}),e("span",{class:"stat-label"},"副本期望/实际")],-1)),e("div",bt,i(v.value.actual_replicas??v.value.total_instances)+" / "+i(v.value.desired_replicas??1),1)])])):(c(),p("div",ht,[a(we,{rows:2,animated:""})]))]),_:1}),a(J,null,{header:s(()=>[e("div",yt,[t[20]||(t[20]=e("span",{class:"text-lg font-semibold"},"实例列表",-1)),a(Oe,{modelValue:d.value,"onUpdate:modelValue":t[0]||(t[0]=R=>d.value=R),"active-text":"只看健康","inactive-text":"显示全部",onChange:pe},null,8,["modelValue"])])]),default:s(()=>[a(ot,{instances:b(D),loading:b(C),onDetail:ve},null,8,["instances","loading"])]),_:1}),a(ke,{modelValue:m.value,"onUpdate:modelValue":t[1]||(t[1]=R=>m.value=R),title:"实例详情",width:"600px"},{default:s(()=>[l.value?(c(),p("div",gt,[a(Ce,{column:1,border:""},{default:s(()=>[a(E,{label:"实例 ID"},{default:s(()=>[_(i(l.value.instance_id),1)]),_:1}),a(E,{label:"主机"},{default:s(()=>[_(i(l.value.host),1)]),_:1}),a(E,{label:"端口"},{default:s(()=>[_(i(l.value.port),1)]),_:1}),a(E,{label:"状态"},{default:s(()=>[a(Y,{status:l.value.status,type:"instance"},null,8,["status"])]),_:1}),a(E,{label:"健康检查路径"},{default:s(()=>[_(i(l.value.health_check_url),1)]),_:1}),a(E,{label:"最后心跳"},{default:s(()=>[l.value.last_heartbeat?(c(),p(ze,{key:0},[_(i(b(se)(l.value.last_heartbeat))+" ",1),e("span",Et," ("+i(b(ne)(l.value.last_heartbeat))+") ",1)],64)):(c(),p("span",Rt,"暂无数据"))]),_:1}),a(E,{label:"元数据"},{default:s(()=>[l.value.metadata?(c(),p("pre",Nt,i(JSON.stringify(l.value.metadata,null,2)),1)):(c(),p("span",At,"无"))]),_:1})]),_:1})])):V("",!0)]),_:1},8,["modelValue"]),a(Fe,{modelValue:S.value,"onUpdate:modelValue":t[2]||(t[2]=R=>S.value=R),operation:x.value.operation,"service-names":x.value.serviceNames,onOperationSubmitted:Se,onSuccess:be},null,8,["modelValue","operation","service-names"]),a(qe,{modelValue:k.value,"onUpdate:modelValue":t[3]||(t[3]=R=>k.value=R),"operation-id":P.value,onSuccess:he,onError:ye},null,8,["modelValue","operation-id"])]),_:1},8,["title"])}}}),Ut=ae(wt,[["__scopeId","data-v-e980caa6"]]);export{Ut as default};
|