diff --git a/.DS_Store b/.DS_Store old mode 100644 new mode 100755 diff --git a/.cookie b/.cookie old mode 100644 new mode 100755 diff --git a/.trae/documents/Nakama 服务端集成规划.md b/.trae/documents/Nakama 服务端集成规划.md deleted file mode 100644 index a3f27c7..0000000 --- a/.trae/documents/Nakama 服务端集成规划.md +++ /dev/null @@ -1,40 +0,0 @@ -# Nakama 服务端集成规划 (修订版:4人自动匹配) - -根据您的补充需求(4人自动匹配、无需手动管理房间),我调整了规划如下。我们将继续基于“动物扫雷大作战”项目进行开发。 - -## 1. 核心流程:自动匹配 (Auto-Matchmaking) - -我们将完全屏蔽“房间”概念,采用类似《王者荣耀》或《英雄联盟》的匹配机制: - -1. **点击“开始游戏”**: 客户端调用 Nakama Matchmaker API,参数设定为 `min_count=4, max_count=4`。 -2. **服务端排队**: Nakama 自动将请求的玩家放入匹配池。 -3. **匹配成功**: 当凑齐 4 人后,服务端自动创建一个权威比赛 (Authoritative Match)。 -4. **自动入场**: 客户端收到匹配成功通知 (Match Found),携带 Token 自动加入比赛,进入游戏画面。 - -## 2. 系统架构与实施 - -### 第一阶段:基础设施 (不变) -* **动作**: 配置 Docker (Nakama + CockroachDB)。 -* **动作**: 前端安装 `nakama-js`。 - -### 第二阶段:服务端逻辑 (TypeScript) -* **Match Handler (比赛控制器)**: - * **硬性限制**: 仅当凑齐 4 人时游戏逻辑才正式开始(或等待超时添加 AI,目前先按纯真人规划)。 - * **回合制逻辑**: 维护 4 人行动顺序(如:P1 -> P2 -> P3 -> P4 -> P1...)。 - * **状态同步**: 广播 100 个格子的状态、4 名玩家的血量/道具/Buff。 - -### 第三阶段:前端改造 (针对 4 人匹配) -* **UI 调整**: - * 主界面增加“开始匹配 (4人)”大按钮。 - * 增加“匹配中...”的等待状态提示。 - * 游戏内固定显示 4 个玩家的头像槽位(如 `App.tsx` 中已有的布局,需确保能动态映射 P1-P4)。 -* **逻辑对接**: - * **Socket 监听**: 监听 `onmatchmakermatched` 事件 -> 自动执行 `joinMatch`。 - * **游戏开始**: 收到服务端 `OP_GAME_START` 信号后,解锁棋盘交互。 - -## 3. 下一步执行计划 -1. **环境搭建**: 启动 Nakama 服务端。 -2. **前端集成**: 实现“点击匹配 -> 等待 -> 自动进入游戏”的完整链路。 -3. **逻辑迁移**: 将现有的 Mock 数据替换为服务端数据。 - -请确认是否开始执行环境搭建? diff --git a/DEPLOYMENT.md b/DEPLOYMENT.md old mode 100644 new mode 100755 diff --git a/app/.env.production b/app/.env.production old mode 100644 new mode 100755 index 00f9c66..5cb8f57 --- a/app/.env.production +++ b/app/.env.production @@ -1,5 +1,5 @@ # Production environment configuration -VITE_NAKAMA_HOST=game.1024tool.vip +VITE_NAKAMA_HOST=kdy.1024tool.vip VITE_NAKAMA_PORT=443 VITE_NAKAMA_SERVER_KEY=defaultkey VITE_NAKAMA_USE_SSL=true diff --git a/app/.gitignore b/app/.gitignore old mode 100644 new mode 100755 diff --git a/app/README.md b/app/README.md old mode 100644 new mode 100755 diff --git a/app/eslint.config.js b/app/eslint.config.js old mode 100644 new mode 100755 diff --git a/app/index.html b/app/index.html old mode 100644 new mode 100755 diff --git a/app/package-lock.json b/app/package-lock.json old mode 100644 new mode 100755 diff --git a/app/package.json b/app/package.json old mode 100644 new mode 100755 diff --git a/app/postcss.config.js b/app/postcss.config.js old mode 100644 new mode 100755 diff --git a/app/public/vite.svg b/app/public/vite.svg old mode 100644 new mode 100755 diff --git a/app/scripts/simulate_bots.ts b/app/scripts/simulate_bots.ts old mode 100644 new mode 100755 diff --git a/app/scripts/simulate_bots_fixed.ts b/app/scripts/simulate_bots_fixed.ts old mode 100644 new mode 100755 diff --git a/app/scripts/simulate_bots_matchmaker.ts b/app/scripts/simulate_bots_matchmaker.ts old mode 100644 new mode 100755 diff --git a/app/scripts/test_matchmaker.cjs b/app/scripts/test_matchmaker.cjs old mode 100644 new mode 100755 diff --git a/app/scripts/test_matchmaker.mjs b/app/scripts/test_matchmaker.mjs old mode 100644 new mode 100755 diff --git a/app/src/App.css b/app/src/App.css old mode 100644 new mode 100755 diff --git a/app/src/App.tsx b/app/src/App.tsx old mode 100644 new mode 100755 index a581c80..a752609 --- a/app/src/App.tsx +++ b/app/src/App.tsx @@ -288,7 +288,7 @@ const App: React.FC = () => { // Fetch game config to get match_player_count (使用同域避免 CORS) try { - const backendUrl = 'https://game.1024tool.vip'; // 通过 Nginx 反向代理到后端 + const backendUrl = ''; // 同域请求,走 game.1024tool.vip 的 nginx 代理 const configResp = await fetch(`${backendUrl}/api/internal/game/minesweeper/config`, { headers: { 'X-Internal-Key': 'bindbox-internal-secret-2024' } }); @@ -313,6 +313,12 @@ const App: React.FC = () => { setMyUserId(userId); myUserIdRef.current = userId; setIsConnected(true); + + // Join the lobby channel for online tracking + nakamaManager.joinLobby().catch(err => { + console.warn('Failed to join lobby:', err); + }); + addLog('system', '✅ 已连接到服务器'); const socket = nakamaManager.getSocket(); diff --git a/app/src/Explosion.css b/app/src/Explosion.css old mode 100644 new mode 100755 diff --git a/app/src/assets/react.svg b/app/src/assets/react.svg old mode 100644 new mode 100755 diff --git a/app/src/index.css b/app/src/index.css old mode 100644 new mode 100755 diff --git a/app/src/lib/nakama.ts b/app/src/lib/nakama.ts old mode 100644 new mode 100755 index ca8cafb..92fdde2 --- a/app/src/lib/nakama.ts +++ b/app/src/lib/nakama.ts @@ -101,6 +101,18 @@ class NakamaManager { return this.socket.joinMatch(matchId, token, metadata); } + /** + * Join the global minesweeper lobby channel + * This is used to track online users even if they are not in a match + */ + async joinLobby() { + if (!this.socket) throw new Error('Socket not connected'); + + // 1 = Room, true = Persistence, false = Hidden (we want to be counted) + console.log('Joining minesweeper lobby...'); + return this.socket.joinChat('minesweeper_lobby', 1, true, false); + } + async sendMatchState(matchId: string, opCode: number, data: string) { if (!this.socket) throw new Error('Socket not connected'); return this.socket.sendMatchState(matchId, opCode, data); diff --git a/app/src/main.tsx b/app/src/main.tsx old mode 100644 new mode 100755 diff --git a/app/tailwind.config.js b/app/tailwind.config.js old mode 100644 new mode 100755 diff --git a/app/tsconfig.app.json b/app/tsconfig.app.json old mode 100644 new mode 100755 diff --git a/app/tsconfig.json b/app/tsconfig.json old mode 100644 new mode 100755 diff --git a/app/tsconfig.node.json b/app/tsconfig.node.json old mode 100644 new mode 100755 diff --git a/app/vite.config.ts b/app/vite.config.ts old mode 100644 new mode 100755 diff --git a/docker-compose.all.yml b/docker-compose.all.yml old mode 100644 new mode 100755 index 4c30dd8..173c36d --- a/docker-compose.all.yml +++ b/docker-compose.all.yml @@ -1,21 +1,33 @@ -# 全量服务部署 (前端 + 后端 + 游戏服 + 数据库 + 中间件 + Nginx) -# 使用方法: docker-compose -f docker-compose.all.yml up -d --build +# 全量服务部署 (云端/无源码版) +# 使用方法: +# 1. 确保已将 docker-compose.cloud.yml, configs/, nginx/, loki/ 目录上传到服务器同一目录 +# 2. 确保 logs/ 目录存在 (mkdir logs) +# 3. 运行: docker-compose -f docker-compose.cloud.yml up -d + services: # ---------------------------------------------------- # 1. 业务后端 (Bindbox Game Backend) # ---------------------------------------------------- bindbox-game: - image: zfc931912343/bindbox-game:v1.15 + image: zfc931912343/bindbox-game:v1.23 container_name: bindbox-game restart: always # ports: # - "9991:9991" (Internal only) volumes: - - ../bindbox_game/logs:/app/logs - - ../bindbox_game/configs:/app/configs + # 改为挂载当前目录下的 logs 和 configs + - ./logs:/app/logs + - ./configs:/app/configs environment: - ACTIVE_ENV=pro - TZ=Asia/Shanghai + # MySQL 配置(覆盖编译时的默认值) + - MYSQL_ADDR=mysql:3306 + - MYSQL_USER=root + - MYSQL_PASS=bindbox2025kdy + - MYSQL_NAME=bindbox_game + # Redis 配置 + - REDIS_ADDR=redis:6379 networks: - bindbox_net logging: @@ -28,22 +40,7 @@ services: - redis # ---------------------------------------------------- - # 2. 管理后台 (Admin Web) - # ---------------------------------------------------- - admin-web: - build: ../bindbox_game/web/admin - container_name: bindbox-admin-web - restart: always - networks: - - bindbox_net - logging: - driver: "json-file" - options: - max-size: "10m" - max-file: "3" - - # ---------------------------------------------------- - # 3. 游戏数据库 (CockroachDB for Nakama) + # 2. 游戏数据库 (CockroachDB for Nakama) # ---------------------------------------------------- nakama-db: image: cockroachdb/cockroach:latest-v23.1 @@ -52,7 +49,6 @@ services: restart: always volumes: - nakama-db-data:/var/lib/cockroach - healthcheck: test: [ "CMD", "curl", "-f", "http://localhost:8080/health?ready=1" ] interval: 3s @@ -69,10 +65,10 @@ services: max-file: "3" # ---------------------------------------------------- - # 4. 游戏服务器 (Nakama) + # 3. 游戏服务器 (Nakama) # ---------------------------------------------------- nakama: - image: zfc931912343/bindbox-saolei:v1.6 + image: zfc931912343/bindbox-saolei:v1.6-local container_name: nakama-server environment: - MINESWEEPER_BACKEND_URL=http://bindbox-game:9991/api/internal @@ -89,7 +85,6 @@ services: condition: service_started volumes: - nakama-data:/nakama/data - healthcheck: test: [ "CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://bindbox-game:9991/" ] interval: 10s @@ -104,19 +99,22 @@ services: max-file: "3" # ---------------------------------------------------- - # 5. MySQL Database (For Bindbox Backend) + # 4. MySQL Database # ---------------------------------------------------- mysql: image: mysql:8.0 container_name: bindbox-mysql restart: always + ports: + - "3306:3306" # 临时开放外部访问,用完记得关闭! environment: - MYSQL_ROOT_PASSWORD: "123456" + MYSQL_ROOT_PASSWORD: "bindbox2025kdy" MYSQL_DATABASE: "bindbox_game" TZ: Asia/Shanghai command: --default-authentication-plugin=mysql_native_password volumes: - mysql_data:/var/lib/mysql + - ./mysql/init:/docker-entrypoint-initdb.d # 初始化脚本 networks: - bindbox_net logging: @@ -126,7 +124,7 @@ services: max-file: "3" # ---------------------------------------------------- - # 6. Redis (For Bindbox Backend) + # 5. Redis # ---------------------------------------------------- redis: image: redis:7.0 @@ -143,7 +141,7 @@ services: max-file: "3" # ---------------------------------------------------- - # 7. Nginx Gateway + # 6. Nginx Gateway (入口) # ---------------------------------------------------- nginx: image: nginx:latest @@ -155,9 +153,10 @@ services: volumes: - ./nginx/conf.d:/etc/nginx/conf.d - ./nginx/ssl:/etc/nginx/ssl + - ./nginx/admin:/usr/share/nginx/html/admin + - ./nginx/game:/usr/share/nginx/html/game depends_on: - bindbox-game - - admin-web - nakama networks: - bindbox_net @@ -165,17 +164,17 @@ services: driver: "json-file" options: max-size: "10m" + max-file: "3" # ---------------------------------------------------- - # 8. Loki (Log Storage) + # 7. Loki (日志存储) # ---------------------------------------------------- loki: image: grafana/loki:3.0.0 container_name: bindbox-loki restart: always - # ports: - # - "3100:3100" volumes: + # 必须上传 loki 目录到服务器 - ./loki/loki-config.yaml:/etc/loki/local-config.yaml - loki_data:/loki command: -config.file=/etc/loki/local-config.yaml @@ -188,7 +187,7 @@ services: max-file: "3" # ---------------------------------------------------- - # 9. Promtail (Log Collector) + # 8. Promtail (日志采集) # ---------------------------------------------------- promtail: image: grafana/promtail:3.0.0 @@ -198,7 +197,8 @@ services: - ./loki/promtail-config.yaml:/etc/promtail/config.yaml - /var/lib/docker/containers:/var/lib/docker/containers:ro - /var/run/docker.sock:/var/run/docker.sock - - ../bindbox_game/logs:/var/log/bindbox-game:ro + # 采集当前目录下的 logs 文件夹 + - ./logs:/var/log/bindbox-game:ro command: -config.file=/etc/promtail/config.yaml networks: - bindbox_net @@ -211,7 +211,7 @@ services: max-file: "3" # ---------------------------------------------------- - # 10. Grafana (Visualization) + # 9. Grafana (日志界面) # ---------------------------------------------------- grafana: image: grafana/grafana:latest @@ -234,6 +234,106 @@ services: max-size: "10m" max-file: "3" + # ---------------------------------------------------- + # 10. Prometheus (指标采集) + # ---------------------------------------------------- + prometheus: + image: prom/prometheus:latest + container_name: bindbox-prometheus + restart: always + volumes: + - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml + - prometheus_data:/prometheus + command: + - '--config.file=/etc/prometheus/prometheus.yml' + - '--storage.tsdb.path=/prometheus' + - '--web.enable-lifecycle' + networks: + - bindbox_net + logging: + driver: "json-file" + options: + max-size: "10m" + max-file: "3" + + # ---------------------------------------------------- + # 11. Nginx Exporter (Nginx指标导出) + # ---------------------------------------------------- + nginx-exporter: + image: nginx/nginx-prometheus-exporter:latest + container_name: bindbox-nginx-exporter + restart: always + command: + - -nginx.scrape-uri=http://nginx:80/nginx_status + networks: + - bindbox_net + depends_on: + - nginx + logging: + driver: "json-file" + options: + max-size: "10m" + max-file: "3" + + # ---------------------------------------------------- + # 12. Redis Exporter (Redis指标导出) + # ---------------------------------------------------- + redis-exporter: + image: oliver006/redis_exporter:latest + container_name: bindbox-redis-exporter + restart: always + environment: + - REDIS_ADDR=redis://redis:6379 + networks: + - bindbox_net + depends_on: + - redis + logging: + driver: "json-file" + options: + max-size: "10m" + max-file: "3" + + # ---------------------------------------------------- + # 13. MySQL Exporter (MySQL指标导出) + # ---------------------------------------------------- + mysql-exporter: + image: prom/mysqld-exporter:latest + container_name: bindbox-mysql-exporter + restart: always + command: + - --config.my-cnf=/etc/.my.cnf + volumes: + - ./mysql/.my.cnf:/etc/.my.cnf:ro + networks: + - bindbox_net + depends_on: + - mysql + logging: + driver: "json-file" + options: + max-size: "10m" + max-file: "3" + + # ---------------------------------------------------- + # 14. Tempo (链路追踪) + # ---------------------------------------------------- + tempo: + image: grafana/tempo:latest + container_name: bindbox-tempo + restart: always + command: [ "-config.file=/etc/tempo/tempo-config.yaml" ] + volumes: + - ./tempo/tempo-config.yaml:/etc/tempo/tempo-config.yaml + - tempo_data:/var/tempo + networks: + - bindbox_net + logging: + driver: "json-file" + options: + max-size: "10m" + max-file: "3" + volumes: nakama-db-data: nakama-data: @@ -241,6 +341,8 @@ volumes: redis_data: loki_data: grafana_data: + prometheus_data: + tempo_data: networks: diff --git a/docker-compose.cloud.yml b/docker-compose.cloud.yml old mode 100644 new mode 100755 index 8764d49..3959bda --- a/docker-compose.cloud.yml +++ b/docker-compose.cloud.yml @@ -9,7 +9,7 @@ services: # 1. 业务后端 (Bindbox Game Backend) # ---------------------------------------------------- bindbox-game: - image: zfc931912343/bindbox-game:v1.15 + image: zfc931912343/bindbox-game:v1.23 container_name: bindbox-game restart: always # ports: @@ -153,7 +153,8 @@ services: volumes: - ./nginx/conf.d:/etc/nginx/conf.d - ./nginx/ssl:/etc/nginx/ssl - - ./dist:/usr/share/nginx/html/admin + - ./nginx/admin:/usr/share/nginx/html/admin + - ./nginx/game:/usr/share/nginx/html/game depends_on: - bindbox-game - nakama diff --git a/docker-compose.test.yml b/docker-compose.test.yml new file mode 100755 index 0000000..e5161c0 --- /dev/null +++ b/docker-compose.test.yml @@ -0,0 +1,37 @@ +version: '3.8' + +services: + nakama-db: + image: cockroachdb/cockroach:latest-v23.1 + command: start-single-node --insecure --store=attrs=ssd,path=/var/lib/cockroach/,size=20% + restart: "no" + volumes: + - ./cockroach-data:/cockroach/cockroach-data + expose: + - "8080" + - "26257" + ports: + - "8080:8080" + - "26257:26257" + healthcheck: + test: ["CMD", "curl", "-f", "http://localhost:8080/health?ready=1"] + interval: 3s + timeout: 3s + retries: 5 + + nakama: + image: heroiclabs/nakama:3.21.1 + command: > + /bin/sh -ecx ' + /nakama/nakama migrate up --database.address root@nakama-db:26257 && + exec /nakama/nakama --name nakama1 --database.address root@nakama-db:26257 --logger.level DEBUG --session.token_expiry_sec 7200 --metrics.prometheus_port 9100 --runtime.path /nakama/modules --matchmaker.interval_sec 1 --matchmaker.max_intervals 5 + ' + restart: "no" + depends_on: + nakama-db: + condition: service_healthy + volumes: + - ./server:/nakama/modules + ports: + - "7350:7350" + - "7351:7351" diff --git a/docker-compose.yml b/docker-compose.yml old mode 100644 new mode 100755 index 7c96b7a..3959bda --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,52 +1,351 @@ +# 全量服务部署 (云端/无源码版) +# 使用方法: +# 1. 确保已将 docker-compose.cloud.yml, configs/, nginx/, loki/ 目录上传到服务器同一目录 +# 2. 确保 logs/ 目录存在 (mkdir logs) +# 3. 运行: docker-compose -f docker-compose.cloud.yml up -d + services: - cockroachdb: - image: cockroachdb/cockroach:latest-v23.1 - command: start-single-node --insecure --store=attrs=ssd,path=/var/lib/cockroach/ - restart: "no" + # ---------------------------------------------------- + # 1. 业务后端 (Bindbox Game Backend) + # ---------------------------------------------------- + bindbox-game: + image: zfc931912343/bindbox-game:v1.23 + container_name: bindbox-game + restart: always + # ports: + # - "9991:9991" (Internal only) volumes: - - data:/var/lib/cockroach - expose: - - "8080" - - "26257" - ports: - - "26257:26257" - - "8081:8080" + # 改为挂载当前目录下的 logs 和 configs + - ./logs:/app/logs + - ./configs:/app/configs + environment: + - ACTIVE_ENV=pro + - TZ=Asia/Shanghai + # MySQL 配置(覆盖编译时的默认值) + - MYSQL_ADDR=mysql:3306 + - MYSQL_USER=root + - MYSQL_PASS=bindbox2025kdy + - MYSQL_NAME=bindbox_game + # Redis 配置 + - REDIS_ADDR=redis:6379 + networks: + - bindbox_net + logging: + driver: "json-file" + options: + max-size: "10m" + max-file: "3" + depends_on: + - mysql + - redis + + # ---------------------------------------------------- + # 2. 游戏数据库 (CockroachDB for Nakama) + # ---------------------------------------------------- + nakama-db: + image: cockroachdb/cockroach:latest-v23.1 + container_name: nakama-db + command: start-single-node --insecure --store=attrs=ssd,path=/var/lib/cockroach/ --cache=.25 --max-sql-memory=.25 + restart: always + volumes: + - nakama-db-data:/var/lib/cockroach healthcheck: test: [ "CMD", "curl", "-f", "http://localhost:8080/health?ready=1" ] interval: 3s timeout: 3s retries: 5 + environment: + - TZ=Asia/Shanghai + networks: + - bindbox_net + logging: + driver: "json-file" + options: + max-size: "10m" + max-file: "3" + # ---------------------------------------------------- + # 3. 游戏服务器 (Nakama) + # ---------------------------------------------------- nakama: - build: - context: ./server - dockerfile: Dockerfile - container_name: wuziqi-nakama-1 + image: zfc931912343/bindbox-saolei:v1.6 + container_name: nakama-server + environment: + - MINESWEEPER_BACKEND_URL=http://bindbox-game:9991/api/internal + - TZ=Asia/Shanghai entrypoint: - "/bin/sh" - "-ecx" - - > - /nakama/nakama migrate up --database.address root@cockroachdb:26257 && exec /nakama/nakama --name nakama1 --database.address root@cockroachdb:26257 --logger.level DEBUG --session.token_expiry_sec 7200 --metrics.prometheus_port 9100 --runtime.path /nakama/modules - restart: "no" - links: - - "cockroachdb:db" + - "/nakama/nakama migrate up --database.address root@nakama-db:26257 && exec /nakama/nakama --name nakama1 --database.address root@nakama-db:26257 --logger.level DEBUG --session.token_expiry_sec 7200 --metrics.prometheus_port 9100 --runtime.path /nakama/modules --matchmaker.interval_sec 1 --matchmaker.max_intervals 5" + restart: always depends_on: - cockroachdb: + nakama-db: condition: service_healthy + bindbox-game: + condition: service_started volumes: - nakama-data:/nakama/data - expose: - - "7348" - ports: - - "7350:7350" - - "7351:7351" - - "9100:9100" healthcheck: - test: [ "CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:7350/" ] + test: [ "CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://bindbox-game:9991/" ] interval: 10s timeout: 5s retries: 5 + networks: + - bindbox_net + logging: + driver: "json-file" + options: + max-size: "10m" + max-file: "3" + + # ---------------------------------------------------- + # 4. MySQL Database + # ---------------------------------------------------- + mysql: + image: mysql:8.0 + container_name: bindbox-mysql + restart: always + ports: + - "3306:3306" # 临时开放外部访问,用完记得关闭! + environment: + MYSQL_ROOT_PASSWORD: "bindbox2025kdy" + MYSQL_DATABASE: "bindbox_game" + TZ: Asia/Shanghai + command: --default-authentication-plugin=mysql_native_password + volumes: + - mysql_data:/var/lib/mysql + - ./mysql/init:/docker-entrypoint-initdb.d # 初始化脚本 + networks: + - bindbox_net + logging: + driver: "json-file" + options: + max-size: "10m" + max-file: "3" + + # ---------------------------------------------------- + # 5. Redis + # ---------------------------------------------------- + redis: + image: redis:7.0 + container_name: bindbox-redis + restart: always + volumes: + - redis_data:/data + networks: + - bindbox_net + logging: + driver: "json-file" + options: + max-size: "10m" + max-file: "3" + + # ---------------------------------------------------- + # 6. Nginx Gateway (入口) + # ---------------------------------------------------- + nginx: + image: nginx:latest + container_name: bindbox-nginx + restart: always + ports: + - "80:80" + - "443:443" + volumes: + - ./nginx/conf.d:/etc/nginx/conf.d + - ./nginx/ssl:/etc/nginx/ssl + - ./nginx/admin:/usr/share/nginx/html/admin + - ./nginx/game:/usr/share/nginx/html/game + depends_on: + - bindbox-game + - nakama + networks: + - bindbox_net + logging: + driver: "json-file" + options: + max-size: "10m" + max-file: "3" + + # ---------------------------------------------------- + # 7. Loki (日志存储) + # ---------------------------------------------------- + loki: + image: grafana/loki:3.0.0 + container_name: bindbox-loki + restart: always + volumes: + # 必须上传 loki 目录到服务器 + - ./loki/loki-config.yaml:/etc/loki/local-config.yaml + - loki_data:/loki + command: -config.file=/etc/loki/local-config.yaml + networks: + - bindbox_net + logging: + driver: "json-file" + options: + max-size: "10m" + max-file: "3" + + # ---------------------------------------------------- + # 8. Promtail (日志采集) + # ---------------------------------------------------- + promtail: + image: grafana/promtail:3.0.0 + container_name: bindbox-promtail + restart: always + volumes: + - ./loki/promtail-config.yaml:/etc/promtail/config.yaml + - /var/lib/docker/containers:/var/lib/docker/containers:ro + - /var/run/docker.sock:/var/run/docker.sock + # 采集当前目录下的 logs 文件夹 + - ./logs:/var/log/bindbox-game:ro + command: -config.file=/etc/promtail/config.yaml + networks: + - bindbox_net + depends_on: + - loki + logging: + driver: "json-file" + options: + max-size: "10m" + max-file: "3" + + # ---------------------------------------------------- + # 9. Grafana (日志界面) + # ---------------------------------------------------- + grafana: + image: grafana/grafana:latest + container_name: bindbox-grafana + restart: always + ports: + - "3000:3000" + environment: + - GF_SECURITY_ADMIN_PASSWORD=admin + - GF_USERS_ALLOW_SIGN_UP=false + volumes: + - grafana_data:/var/lib/grafana + networks: + - bindbox_net + depends_on: + - loki + logging: + driver: "json-file" + options: + max-size: "10m" + max-file: "3" + + # ---------------------------------------------------- + # 10. Prometheus (指标采集) + # ---------------------------------------------------- + prometheus: + image: prom/prometheus:latest + container_name: bindbox-prometheus + restart: always + volumes: + - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml + - prometheus_data:/prometheus + command: + - '--config.file=/etc/prometheus/prometheus.yml' + - '--storage.tsdb.path=/prometheus' + - '--web.enable-lifecycle' + networks: + - bindbox_net + logging: + driver: "json-file" + options: + max-size: "10m" + max-file: "3" + + # ---------------------------------------------------- + # 11. Nginx Exporter (Nginx指标导出) + # ---------------------------------------------------- + nginx-exporter: + image: nginx/nginx-prometheus-exporter:latest + container_name: bindbox-nginx-exporter + restart: always + command: + - -nginx.scrape-uri=http://nginx:80/nginx_status + networks: + - bindbox_net + depends_on: + - nginx + logging: + driver: "json-file" + options: + max-size: "10m" + max-file: "3" + + # ---------------------------------------------------- + # 12. Redis Exporter (Redis指标导出) + # ---------------------------------------------------- + redis-exporter: + image: oliver006/redis_exporter:latest + container_name: bindbox-redis-exporter + restart: always + environment: + - REDIS_ADDR=redis://redis:6379 + networks: + - bindbox_net + depends_on: + - redis + logging: + driver: "json-file" + options: + max-size: "10m" + max-file: "3" + + # ---------------------------------------------------- + # 13. MySQL Exporter (MySQL指标导出) + # ---------------------------------------------------- + mysql-exporter: + image: prom/mysqld-exporter:latest + container_name: bindbox-mysql-exporter + restart: always + command: + - --config.my-cnf=/etc/.my.cnf + volumes: + - ./mysql/.my.cnf:/etc/.my.cnf:ro + networks: + - bindbox_net + depends_on: + - mysql + logging: + driver: "json-file" + options: + max-size: "10m" + max-file: "3" + + # ---------------------------------------------------- + # 14. Tempo (链路追踪) + # ---------------------------------------------------- + tempo: + image: grafana/tempo:latest + container_name: bindbox-tempo + restart: always + command: [ "-config.file=/etc/tempo/tempo-config.yaml" ] + volumes: + - ./tempo/tempo-config.yaml:/etc/tempo/tempo-config.yaml + - tempo_data:/var/tempo + networks: + - bindbox_net + logging: + driver: "json-file" + options: + max-size: "10m" + max-file: "3" volumes: - data: + nakama-db-data: nakama-data: + mysql_data: + redis_data: + loki_data: + grafana_data: + prometheus_data: + tempo_data: + + +networks: + bindbox_net: + name: bindbox_net + driver: bridge diff --git a/loki/loki-config.yaml b/loki/loki-config.yaml old mode 100644 new mode 100755 diff --git a/loki/promtail-config.yaml b/loki/promtail-config.yaml old mode 100644 new mode 100755 diff --git a/mysql/.DS_Store b/mysql/.DS_Store old mode 100644 new mode 100755 diff --git a/mysql/.my.cnf b/mysql/.my.cnf old mode 100644 new mode 100755 diff --git a/mysql/init/01-create-exporter-user.sql b/mysql/init/01-create-exporter-user.sql old mode 100644 new mode 100755 diff --git a/nginx-cors-config.conf b/nginx-cors-config.conf old mode 100644 new mode 100755 diff --git a/nginx/admin/assets/403-BdWuHcJA.svg b/nginx/admin/assets/403-BdWuHcJA.svg new file mode 100644 index 0000000..68790ad --- /dev/null +++ b/nginx/admin/assets/403-BdWuHcJA.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/nginx/admin/assets/404-BzxNMzaO.svg b/nginx/admin/assets/404-BzxNMzaO.svg new file mode 100644 index 0000000..48e1ca3 --- /dev/null +++ b/nginx/admin/assets/404-BzxNMzaO.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/nginx/admin/assets/500-C-Ru4KUd.svg b/nginx/admin/assets/500-C-Ru4KUd.svg new file mode 100644 index 0000000..512429f --- /dev/null +++ b/nginx/admin/assets/500-C-Ru4KUd.svg @@ -0,0 +1,5 @@ + diff --git a/nginx/admin/assets/ActivityAnalysisDrawer-BHxCQLVD.css b/nginx/admin/assets/ActivityAnalysisDrawer-BHxCQLVD.css new file mode 100644 index 0000000..17e8eb5 --- /dev/null +++ b/nginx/admin/assets/ActivityAnalysisDrawer-BHxCQLVD.css @@ -0,0 +1 @@ +.overview-cards[data-v-38548ddb]{display:grid;grid-template-columns:repeat(4,1fr);gap:16px;margin-bottom:24px}.overview-cards .card-item[data-v-38548ddb]{background:#f8f9fa;border-radius:8px;padding:16px;border:1px solid #ebeef5}.overview-cards .card-item .card-label[data-v-38548ddb]{font-size:13px;color:#909399;margin-bottom:8px}.overview-cards .card-item .card-value[data-v-38548ddb]{font-size:24px;font-weight:600;color:#303133;margin-bottom:8px}.overview-cards .card-item .card-value.text-primary[data-v-38548ddb]{color:var(--el-color-primary)}.overview-cards .card-item .card-value.text-success[data-v-38548ddb]{color:var(--el-color-success)}.overview-cards .card-item .card-value.text-warning[data-v-38548ddb]{color:var(--el-color-warning)}.overview-cards .card-item .card-value.text-danger[data-v-38548ddb]{color:var(--el-color-danger)}.overview-cards .card-item .card-value.text-info[data-v-38548ddb]{color:var(--el-color-info)}.overview-cards .card-item .card-sub[data-v-38548ddb]{font-size:12px;color:#606266}.level-badge[data-v-38548ddb]{padding:2px 6px;border-radius:4px;font-size:12px;font-weight:600} diff --git a/nginx/admin/assets/ActivityAnalysisDrawer-C_7KPjWt.js b/nginx/admin/assets/ActivityAnalysisDrawer-C_7KPjWt.js new file mode 100644 index 0000000..7ec4499 --- /dev/null +++ b/nginx/admin/assets/ActivityAnalysisDrawer-C_7KPjWt.js @@ -0,0 +1 @@ +import{d as t,r as a,c as e,h as s,e as l,w as i,N as r,b as o,i as n,f as c,v as u,q as d,g as v,p,b2 as m,T as y}from"./index-BoIUJTA2.js";/* empty css *//* empty css *//* empty css *//* empty css */import"./el-tooltip-l0sNRNKZ.js";/* empty css *//* empty css *//* empty css *//* empty css */import{f as x}from"./operations-Cr4YfoRu.js";import{b,c as g}from"./activityEnums-zI8yOqFS.js";import{E as f,a as w}from"./index-BjuMygln.js";import{E as j}from"./index-ClDjAOOe.js";import{E as h}from"./index-B18-crhn.js";import{_}from"./_plugin-vue_export-helper-BCo6x5W8.js";import"./index-Cp4NEpJ7.js";import"./index-BMeOzN3u.js";import"./index-COyGylbk.js";import"./index-Bq8lawOo.js";import"./_initCloneObject-DRmC-q3t.js";import"./isArrayLikeObject-CFQi-X2M.js";import"./raf-DsHSIRfX.js";import"./_baseIteratee-CtIat01j.js";import"./castArray-nM8ho4U3.js";import"./debounce-DQl5eUwG.js";import"./index-D8nVJoNy.js";import"./index-CXORCV4U.js";import"./use-dialog-FwJ-QdmW.js";const C={class:"analysis-content"},z={key:0,class:"overview-cards"},D={class:"card-item"},k={class:"card-value text-primary"},P={class:"card-sub"},L={class:"font-medium"},A={class:"card-item"},F={class:"card-value text-danger"},Q={class:"card-sub"},E={class:"font-medium"},V={class:"card-item"},M={class:"card-sub"},N={class:"card-item"},T={class:"card-value text-info"},I={class:"card-sub"},O={class:"font-medium"},S={key:1,class:"prize-table-section mt-6"},U={class:"section-header mb-3 flex justify-between items-center"},q={class:"text-sm text-gray-500"},W={class:"flex items-center"},X={class:"font-medium"},B={class:"text-xs text-gray-500"},G={class:"font-medium"},H={class:"space-y-1"},J={class:"flex justify-between text-xs"},K={class:"text-gray-500"},R={class:"space-y-1"},Y={class:"flex justify-between text-xs"},Z={class:"text-xs"},$={class:"font-medium"},tt={key:2,class:"empty-state py-12 text-center text-gray-400"},at=_(t({__name:"ActivityAnalysisDrawer",setup(t,{expose:_}){const at=a(!1),et=a(!1),st=a(null),lt=e(()=>st.value?st.value.activity.priceDraw*st.value.activity.totalDraws/100:0),it=e(()=>{if(!st.value)return 0;return lt.value-st.value.summary.totalCost/100}),rt=e(()=>{if(!st.value)return 0;const t=lt.value;return t<=0?0:it.value/t*100}),ot=e(()=>st.value&&0!==st.value.activity.totalDraws?st.value.summary.totalCost/st.value.activity.totalDraws:0),nt=e(()=>st.value&&0!==st.value.activity.totalParticipants?(st.value.activity.totalDraws/st.value.activity.totalParticipants).toFixed(1):0),ct=e(()=>{var t;return(null==(t=st.value)?void 0:t.prizes)?[...st.value.prizes].sort((t,a)=>t.prizeLevel-a.prizeLevel):[]}),ut=t=>t.toLocaleString("zh-CN",{maximumFractionDigits:2}),dt=t=>g(t);return _({open:t=>{return a=this,e=null,s=function*(){at.value=!0,et.value=!0,st.value=null;try{const a=yield x(t);st.value=a}catch(a){y.error("获取分析数据失败")}finally{et.value=!1}},new Promise((t,l)=>{var i=t=>{try{o(s.next(t))}catch(a){l(a)}},r=t=>{try{o(s.throw(t))}catch(a){l(a)}},o=a=>a.done?t(a.value):Promise.resolve(a.value).then(i,r);o((s=s.apply(a,e)).next())});var a,e,s}}),(t,a)=>{const e=w,y=j,x=f,g=h,_=m;return l(),s(g,{modelValue:at.value,"onUpdate:modelValue":a[0]||(a[0]=t=>at.value=t),title:"活动数据分析",size:"80%","destroy-on-close":!0,class:"activity-analysis-drawer"},{default:i(()=>[r((l(),o("div",C,[st.value?(l(),o("div",z,[c("div",D,[a[2]||(a[2]=c("div",{class:"card-label"},"总营收 (元)",-1)),c("div",k,"¥"+u(ut(lt.value)),1),c("div",P,[a[1]||(a[1]=c("span",{class:"text-gray"},"总抽奖次数: ",-1)),c("span",L,u(ut(st.value.activity.totalDraws)),1)])]),c("div",A,[a[4]||(a[4]=c("div",{class:"card-label"},"总成本 (元)",-1)),c("div",F,"¥"+u(ut(st.value.summary.totalCost/100)),1),c("div",Q,[a[3]||(a[3]=c("span",{class:"text-gray"},"单次抽奖成本: ",-1)),c("span",E,"¥"+u(ut(ot.value/100)),1)])]),c("div",V,[a[6]||(a[6]=c("div",{class:"card-label"},"毛利润 (元)",-1)),c("div",{class:d(["card-value",it.value>=0?"text-success":"text-danger"])}," ¥"+u(ut(it.value)),3),c("div",M,[a[5]||(a[5]=c("span",{class:"text-gray"},"利润率: ",-1)),c("span",{class:d(["font-medium",rt.value>=0?"text-success":"text-danger"])},u(rt.value.toFixed(2))+"% ",3)])]),c("div",N,[a[8]||(a[8]=c("div",{class:"card-label"},"参与人数",-1)),c("div",T,u(ut(st.value.activity.totalParticipants)),1),c("div",I,[a[7]||(a[7]=c("span",{class:"text-gray"},"人均抽奖: ",-1)),c("span",O,u(nt.value)+" 次",1)])])])):n("",!0),st.value?(l(),o("div",S,[c("div",U,[a[9]||(a[9]=c("h3",{class:"text-lg font-medium"},"奖品出货分析",-1)),c("div",q," 统计时间: "+u((new Date).toLocaleString()),1)]),v(x,{data:ct.value,style:{width:"100%"},border:"",stripe:""},{default:i(()=>[v(e,{label:"奖品信息","min-width":"180"},{default:i(({row:t})=>{return[c("div",W,[c("span",{class:d(["level-badge mr-2",(a=t.prizeLevel,{1:"bg-pink-100 text-pink-600",2:"bg-red-100 text-red-600",3:"bg-orange-100 text-orange-600",4:"bg-yellow-100 text-yellow-600",5:"bg-green-100 text-green-600",6:"bg-cyan-100 text-cyan-600",7:"bg-blue-100 text-blue-600",8:"bg-indigo-100 text-indigo-600",9:"bg-gray-100 text-gray-600",11:"bg-purple-100 text-purple-600"}[a]||"bg-gray-100 text-gray-600")])},u(dt(t.prizeLevel)),3),c("div",null,[c("div",X,u(t.prizeName),1),c("div",B,u(p(b)(t.prizeType)),1)])])];var a}),_:1}),v(e,{label:"价值/成本",width:"120",align:"right"},{default:i(({row:t})=>[c("div",G,"¥"+u(ut(t.prizeValue/100)),1)]),_:1}),v(e,{label:"概率对比","min-width":"200"},{default:i(({row:t})=>{return[c("div",H,[c("div",J,[c("span",K,"配置: "+u(t.probability.toFixed(2))+"%",1),c("span",{class:d(["font-medium",(a=t.actualProbability,e=t.probability,Math.abs(a-e)<=.1?"text-success":a>e?"text-danger":"text-primary")])},"实际: "+u(t.actualProbability.toFixed(2))+"%",3)]),v(y,{percentage:Math.min(t.actualProbability/Math.max(t.probability,.01)*50,100),color:t.actualProbability>t.probability?"#F56C6C":"#67C23A","stroke-width":6,"show-text":!1},null,8,["percentage","color"])])];var a,e}),_:1}),v(e,{label:"发放进度","min-width":"180"},{default:i(({row:t})=>[c("div",R,[c("div",Y,[c("span",null,"已发: "+u(t.winCount),1),c("span",null,"总数: "+u(t.totalQuantity),1)]),v(y,{percentage:t.totalQuantity>0?t.winCount/t.totalQuantity*100:0,status:t.totalQuantity-t.winCount<10&&t.totalQuantity-t.winCount>0?"exception":"","stroke-width":6},{default:i(({percentage:a})=>[c("span",Z,u(t.totalQuantity-t.winCount)+" 剩余",1)]),_:2},1032,["percentage","status"])])]),_:1}),v(e,{label:"营收贡献",width:"150",align:"right"},{default:i(({row:t})=>[a[10]||(a[10]=c("div",{class:"text-xs text-gray-500"},"消耗库存价值",-1)),c("div",$,"¥"+u(ut(t.cost*t.winCount/100)),1)]),_:1})]),_:1},8,["data"])])):n("",!0),st.value||et.value?n("",!0):(l(),o("div",tt," 暂无数据 "))])),[[_,et.value]])]),_:1},8,["modelValue"])}}}),[["__scopeId","data-v-38548ddb"]]);export{at as default}; diff --git a/nginx/admin/assets/ActivityRankingDrawer-D7wqNV1b.js b/nginx/admin/assets/ActivityRankingDrawer-D7wqNV1b.js new file mode 100644 index 0000000..fbaabd0 --- /dev/null +++ b/nginx/admin/assets/ActivityRankingDrawer-D7wqNV1b.js @@ -0,0 +1 @@ +import{_ as i}from"./ActivityRankingDrawer.vue_vue_type_script_setup_true_lang-DgB00tZC.js";import"./index-BoIUJTA2.js";/* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css */import"./el-tooltip-l0sNRNKZ.js";/* empty css *//* empty css *//* empty css *//* empty css */import"./adminActivities-Dgt25iR5.js";import"./index-DqTthkO7.js";import"./index-BjuMygln.js";import"./index-Cp4NEpJ7.js";import"./index-BMeOzN3u.js";import"./index-COyGylbk.js";import"./index-Bq8lawOo.js";import"./_initCloneObject-DRmC-q3t.js";import"./isArrayLikeObject-CFQi-X2M.js";import"./raf-DsHSIRfX.js";import"./_baseIteratee-CtIat01j.js";import"./castArray-nM8ho4U3.js";import"./debounce-DQl5eUwG.js";import"./index-D8nVJoNy.js";import"./index-CXORCV4U.js";import"./index-DvejFoOw.js";import"./index-C1haaLtB.js";import"./index-D2gD5Tn5.js";import"./index-ZsMdSUVI.js";import"./token-DWNpOE8r.js";import"./index-B18-crhn.js";import"./use-dialog-FwJ-QdmW.js";export{i as default}; diff --git a/nginx/admin/assets/ActivityRankingDrawer.vue_vue_type_script_setup_true_lang-DgB00tZC.js b/nginx/admin/assets/ActivityRankingDrawer.vue_vue_type_script_setup_true_lang-DgB00tZC.js new file mode 100644 index 0000000..da037c1 --- /dev/null +++ b/nginx/admin/assets/ActivityRankingDrawer.vue_vue_type_script_setup_true_lang-DgB00tZC.js @@ -0,0 +1 @@ +var e=(e,a,t)=>new Promise((l,o)=>{var s=e=>{try{i(t.next(e))}catch(a){o(a)}},r=e=>{try{i(t.throw(e))}catch(a){o(a)}},i=e=>e.done?l(e.value):Promise.resolve(e.value).then(s,r);i((t=t.apply(e,a)).next())});import{d as a,r as t,h as l,e as o,w as s,f as r,N as i,g as n,j as u,v as m,b2 as p,T as d}from"./index-BoIUJTA2.js";/* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css */import"./el-tooltip-l0sNRNKZ.js";/* empty css *//* empty css *//* empty css *//* empty css */import{o as v}from"./adminActivities-Dgt25iR5.js";import{a as c,E as f}from"./index-DqTthkO7.js";import{E as j,a as g}from"./index-BjuMygln.js";import{E as x}from"./index-DvejFoOw.js";import{E as h}from"./index-C1haaLtB.js";import{E as y}from"./index-B18-crhn.js";const _={class:"mb-4 flex items-center justify-between"},b={class:"flex items-center"},w={class:"font-medium"},V={class:"text-xs text-g-400"},z={class:"font-mono"},E={class:"mt-4 flex justify-end"},U=a({__name:"ActivityRankingDrawer",setup(a,{expose:U}){const k=t(!1),C=t(!1),P=t(0),A=t("amount"),D=t(1),S=t(20),T=t(0),W=t([]),B=()=>e(this,null,function*(){D.value=1,yield F()}),F=()=>e(this,null,function*(){if(P.value){C.value=!0;try{const e=yield v(P.value,{sort_by:A.value,page:D.value,page_size:S.value});W.value=e.list||[],T.value=e.total||0}catch(e){d.error("获取活动排行榜失败")}finally{C.value=!1}}});return U({open:a=>e(this,null,function*(){P.value=a,A.value="amount",D.value=1,k.value=!0,yield F()})}),(e,a)=>{const t=f,d=c,v=g,U=x,P=j,G=h,I=y,M=p;return o(),l(I,{modelValue:k.value,"onUpdate:modelValue":a[3]||(a[3]=e=>k.value=e),title:"活动消费/订单排行榜",size:"70%","destroy-on-close":!0},{default:s(()=>[r("div",_,[n(d,{modelValue:A.value,"onUpdate:modelValue":a[0]||(a[0]=e=>A.value=e),size:"small",onChange:B},{default:s(()=>[n(t,{label:"amount"},{default:s(()=>[...a[4]||(a[4]=[u("消费总额排名",-1)])]),_:1}),n(t,{label:"orders"},{default:s(()=>[...a[5]||(a[5]=[u("订单数排名",-1)])]),_:1})]),_:1},8,["modelValue"]),a[6]||(a[6]=r("div",{class:"text-sm text-g-500"},"仅统计已支付订单(GMV = 实付 + 优惠)",-1))]),i((o(),l(P,{data:W.value,border:"",stripe:""},{default:s(()=>[n(v,{prop:"rank",label:"排名",width:"80",align:"center"}),n(v,{label:"用户","min-width":"220"},{default:s(({row:e})=>[r("div",b,[n(U,{size:30,src:e.avatar,class:"mr-3"},null,8,["src"]),r("div",null,[r("div",w,m(e.nickname||"未设置昵称"),1),r("div",V,"ID: "+m(e.user_id),1)])])]),_:1}),n(v,{label:"消费总额(元)",width:"170",align:"right"},{default:s(({row:e})=>[r("span",z,"¥"+m(((e.total_amount||0)/100).toFixed(2)),1)]),_:1}),n(v,{prop:"order_count",label:"订单数",width:"120",align:"center"})]),_:1},8,["data"])),[[M,C.value]]),r("div",E,[n(G,{"current-page":D.value,"onUpdate:currentPage":a[1]||(a[1]=e=>D.value=e),"page-size":S.value,"onUpdate:pageSize":a[2]||(a[2]=e=>S.value=e),total:T.value,layout:"prev, pager, next, jumper",onCurrentChange:F},null,8,["current-page","page-size","total"])])]),_:1},8,["modelValue"])}}});export{U as _}; diff --git a/nginx/admin/assets/ArtException.vue_vue_type_script_setup_true_lang-BNdHgCsP.js b/nginx/admin/assets/ArtException.vue_vue_type_script_setup_true_lang-BNdHgCsP.js new file mode 100644 index 0000000..bddf7d7 --- /dev/null +++ b/nginx/admin/assets/ArtException.vue_vue_type_script_setup_true_lang-BNdHgCsP.js @@ -0,0 +1 @@ +import{d as a,C as s,u as t,H as e,b as m,e as r,f as l,g as c,N as n,v as d,h as x,E as i,w as o,j as p}from"./index-BoIUJTA2.js";/* empty css */import{_ as u}from"./index-DVdhsH_J.js";const g={class:"page-content !border-0 !bg-transparent min-h-screen flex-cc"},f={class:"flex-cc max-md:!block max-md:text-center"},b={class:"ml-15 w-75 max-md:mx-auto max-md:mt-10 max-md:w-full max-md:text-center"},h={class:"text-xl leading-7 text-g-600 max-md:text-lg"},v=a({__name:"ArtException",props:{data:{}},setup(a){const v=s(),{homePath:_}=t(),j=()=>{v.push(_.value)};return(s,t)=>{const v=u,_=i,w=e("ripple");return r(),m("div",g,[l("div",f,[c(v,{src:a.data.imgUrl,size:"100%",class:"!w-100"},null,8,["src"]),l("div",b,[l("p",h,d(a.data.desc),1),n((r(),x(_,{type:"primary",size:"large",onClick:j,class:"mt-5"},{default:o(()=>[p(d(a.data.btnText),1)]),_:1})),[[w]])])])])}}});export{v as _}; diff --git a/nginx/admin/assets/ArtResultPage.vue_vue_type_script_setup_true_lang-D5vO0ry2.js b/nginx/admin/assets/ArtResultPage.vue_vue_type_script_setup_true_lang-D5vO0ry2.js new file mode 100644 index 0000000..eb7c85f --- /dev/null +++ b/nginx/admin/assets/ArtResultPage.vue_vue_type_script_setup_true_lang-D5vO0ry2.js @@ -0,0 +1 @@ +var e=Object.defineProperty,t=Object.defineProperties,s=Object.getOwnPropertyDescriptors,r=Object.getOwnPropertySymbols,a=Object.prototype.hasOwnProperty,o=Object.prototype.propertyIsEnumerable,p=(t,s,r)=>s in t?e(t,s,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[s]=r;import{_ as l}from"./index.vue_vue_type_script_setup_true_lang-DUbflfBQ.js";import{d as n,b as c,e as m,g as i,f as d,q as u,v as x,s as b}from"./index-BoIUJTA2.js";const g={class:"title mt-8 text-3xl font-medium !text-g-900 max-md:mt-2.5 max-md:text-2xl"},f={class:"msg mt-5 text-base text-g-600"},_={class:"res mt-7.5 rounded bg-g-200/80 dark:bg-g-300/40 px-7.5 py-5.5 text-left max-md:px-7.5 max-md:py-2.5 [&_p]:flex [&_p]:items-center [&_p]:py-2 [&_p]:text-sm [&_p]:text-[#808695] [&_p_i]:mr-1.5"},y={class:"btn-group mt-12.5"},v=n((O=((e,t)=>{for(var s in t||(t={}))a.call(t,s)&&p(e,s,t[s]);if(r)for(var s of r(t))o.call(t,s)&&p(e,s,t[s]);return e})({},{name:"ArtResultPage"}),t(O,s({__name:"ArtResultPage",props:{type:{default:"success"},title:{default:""},message:{default:""},iconCode:{default:""}},setup:e=>(t,s)=>{const r=l;return m(),c("div",{class:u(["page-content box-border !px-20 py-3.5 text-center max-md:!px-5",e.type])},[i(r,{class:u(["icon size-22 p-2 mt-16 block rounded-full !text-white","success"===e.type?"bg-[#19BE6B]":"bg-[#ED4014]"]),icon:e.iconCode},null,8,["icon","class"]),d("h1",g,x(e.title),1),d("p",f,x(e.message),1),d("div",_,[b(t.$slots,"content")]),d("div",y,[b(t.$slots,"buttons")])],2)}}))));var O;export{v as _}; diff --git a/nginx/admin/assets/EffectEditDialog-BmAJKxJl.css b/nginx/admin/assets/EffectEditDialog-BmAJKxJl.css new file mode 100644 index 0000000..1d97d88 --- /dev/null +++ b/nginx/admin/assets/EffectEditDialog-BmAJKxJl.css @@ -0,0 +1 @@ +.unit[data-v-47e87be5]{margin-left:8px;color:#909399}.form-tip[data-v-47e87be5]{margin-top:4px;font-size:12px;color:#909399;line-height:1.4} diff --git a/nginx/admin/assets/EffectEditDialog-CaIWUZ9w.js b/nginx/admin/assets/EffectEditDialog-CaIWUZ9w.js new file mode 100644 index 0000000..9aad5b6 --- /dev/null +++ b/nginx/admin/assets/EffectEditDialog-CaIWUZ9w.js @@ -0,0 +1 @@ +var e=Object.defineProperty,a=Object.getOwnPropertySymbols,l=Object.prototype.hasOwnProperty,t=Object.prototype.propertyIsEnumerable,s=(a,l,t)=>l in a?e(a,l,{enumerable:!0,configurable:!0,writable:!0,value:t}):a[l]=t,u=(e,u)=>{for(var r in u||(u={}))l.call(u,r)&&s(e,r,u[r]);if(a)for(var r of a(u))t.call(u,r)&&s(e,r,u[r]);return e},r=(e,a,l)=>new Promise((t,s)=>{var u=e=>{try{o(l.next(e))}catch(a){s(a)}},r=e=>{try{o(l.throw(e))}catch(a){s(a)}},o=e=>e.done?t(e.value):Promise.resolve(e.value).then(u,r);o((l=l.apply(e,a)).next())});import{d as o,r as i,k as p,c as d,A as m,h as n,e as _,w as c,g as f,b as y,i as v,I as b,K as V,j as g,J as x,f as j,E as h,v as k,T as U}from"./index-BoIUJTA2.js";/* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css */import{titlesApi as q}from"./titles-D1iSw7M5.js";import{f as w}from"./activity-CMsiETfu.js";import{l as A}from"./adminActivities-Dgt25iR5.js";import{E}from"./index-CjpBlozU.js";import{a as I,E as O}from"./index-BcfO0-fK.js";import{E as z,a as D}from"./index-D2gD5Tn5.js";import{E as N}from"./index-C_S0YbqD.js";import{a as S,b as T}from"./index-DqTthkO7.js";import{E as C}from"./index-Dy3gZN7-.js";import{_ as P}from"./_plugin-vue_export-helper-BCo6x5W8.js";import"./index-COyGylbk.js";import"./use-dialog-FwJ-QdmW.js";import"./refs-Cw5r5QN8.js";import"./castArray-nM8ho4U3.js";import"./_baseClone-Ct7RL6h5.js";import"./_initCloneObject-DRmC-q3t.js";import"./index-BMeOzN3u.js";import"./index-Bq8lawOo.js";import"./index-Cp4NEpJ7.js";import"./index-ZsMdSUVI.js";import"./token-DWNpOE8r.js";import"./debounce-DQl5eUwG.js";import"./_baseIteratee-CtIat01j.js";import"./index-CXORCV4U.js";import"./index-BnK4BbY2.js";const J=P(o({__name:"EffectEditDialog",props:{visible:{type:Boolean},title:{},effect:{},occupiedTypes:{}},emits:["update:visible","success"],setup(e,{emit:a}){const l=e,t=a,s=i(),o=i(!1);i([{id:1,name:"满100减10优惠券"},{id:2,name:"新用户专享券"},{id:3,name:"满200减30优惠券"},{id:4,name:"免运费券"}]);const P=i(""),J=i([]),B=i([]),H=i([]),K=i([]),M=i([]),Q=p({effect_type:1,params:{},stacking_strategy:1,cap_value_x1000:0,sort:0,status:1}),R={effect_type:[{required:!0,message:"请选择效果类型",trigger:"change"}],stacking_strategy:[{required:!0,message:"请选择叠加策略",trigger:"change"}],sort:[{required:!0,message:"请输入排序值",trigger:"blur"}],status:[{required:!0,message:"请选择状态",trigger:"change"}]},W=d({get:()=>l.visible,set:e=>t("update:visible",e)});function X(){Q.params=$(Q.effect_type)}function Y(e){return e.split(",").map(e=>e.trim()).filter(e=>e.length>0).map(e=>Number(e)).filter(e=>!Number.isNaN(e))}function $(e){switch(e){case 1:return{template_id:0,frequency:{period:"day",times:1}};case 2:return{discount_type:"percentage",value_x1000:100,max_discount_x1000:0};case 3:return{multiplier_x1000:2e3,daily_cap_points:0};case 4:return{template_id:0,frequency:{period:"week",times:1}};case 5:return{target_prize_ids:[],boost_x1000:100,cap_x1000:0};case 6:return{target_prize_ids:[],chance_x1000:200,period_cap_times:1};default:return{}}}function F(e){try{return JSON.parse(e||"{}")}catch(a){return{}}}function G(){return r(this,null,function*(){if(s.value)try{yield s.value.validate();const e=l.occupiedTypes||[];if((!l.effect||l.effect.effect_type!==Q.effect_type)&&e.includes(Q.effect_type))return void U.error("该效果类型已存在");o.value=!0;const a={effect_type:Q.effect_type,params_json:JSON.stringify(u(u(u({},Q.params),5===Q.effect_type&&{target_prize_ids:Y(P.value)}),6===Q.effect_type&&{target_prize_ids:Y(P.value)})),stacking_strategy:Q.stacking_strategy,cap_value_x1000:Q.cap_value_x1000,sort:Q.sort,status:Q.status,scopes_json:JSON.stringify({activity_ids:J.value,issue_ids:B.value,exclude:{issue_ids:H.value}})};l.effect?(yield q.updateTitleEffect(l.title.id,l.effect.id,a),U.success("修改成功")):(yield q.createTitleEffect(l.title.id,a),U.success("添加成功")),W.value=!1,t("success")}catch(e){!1!==e&&U.error(e.message||"操作失败")}finally{o.value=!1}})}return m(()=>l.effect,e=>{if(e)if(Q.effect_type=e.effect_type,Q.params=F(e.params_json)||$(e.effect_type),Q.stacking_strategy=e.stacking_strategy,Q.cap_value_x1000=e.cap_value_x1000,Q.sort=e.sort,Q.status=e.status,Q.params&&Array.isArray(Q.params.target_prize_ids)?P.value=String(Q.params.target_prize_ids.join(",")):P.value="",e.scopes_json){const a=F(e.scopes_json);J.value=Array.isArray(a.activity_ids)?a.activity_ids:[],B.value=Array.isArray(a.issue_ids)?a.issue_ids:[],H.value=a.exclude&&Array.isArray(a.exclude.issue_ids)?a.exclude.issue_ids:[]}else J.value=[],B.value=[],H.value=[];else Q.effect_type=1,Q.params=$(1),Q.stacking_strategy=1,Q.cap_value_x1000=0,Q.sort=0,Q.status=1,P.value="",J.value=[],B.value=[],H.value=[]},{immediate:!0}),m(J,()=>{!function(){r(this,null,function*(){const e=[],a=new Set;for(const l of J.value){const t=(yield A(l,1,200)).list||[];for(const l of t)a.has(l.id)||(a.add(l.id),e.push({id:l.id,issue_number:l.issue_number}))}M.value=e})}()}),function(){r(this,null,function*(){const e=yield w({page:1,page_size:100});K.value=e.records.map(e=>({id:e.id,name:e.name}))})}(),(a,l)=>{const t=D,u=z,r=O,i=N,p=V,d=T,m=S,U=C,q=I,w=h,A=E;return _(),n(A,{title:e.effect?"编辑效果":"添加效果",modelValue:W.value,"onUpdate:modelValue":l[26]||(l[26]=e=>W.value=e),width:"700px","close-on-click-modal":!1},{footer:c(()=>[f(w,{onClick:l[25]||(l[25]=e=>W.value=!1)},{default:c(()=>[...l[34]||(l[34]=[g("取 消",-1)])]),_:1}),f(w,{type:"primary",onClick:G,loading:o.value},{default:c(()=>[g(k(e.effect?"保 存":"添 加"),1)]),_:1},8,["loading"])]),default:c(()=>[f(q,{ref_key:"formRef",ref:s,model:Q,rules:R,"label-width":"120px"},{default:c(()=>[f(r,{label:"效果类型",prop:"effect_type"},{default:c(()=>[f(u,{modelValue:Q.effect_type,"onUpdate:modelValue":l[0]||(l[0]=e=>Q.effect_type=e),onChange:X,placeholder:"请选择效果类型"},{default:c(()=>[f(t,{label:"领券",value:1}),f(t,{label:"抽奖折扣",value:2}),f(t,{label:"签到倍数",value:3}),f(t,{label:"领道具卡",value:4}),f(t,{label:"概率加成",value:5}),f(t,{label:"双倍概率",value:6})]),_:1},8,["modelValue"])]),_:1}),1===Q.effect_type?(_(),y(b,{key:0},[f(r,{label:"模板ID",prop:"template_id"},{default:c(()=>[f(i,{modelValue:Q.params.template_id,"onUpdate:modelValue":l[1]||(l[1]=e=>Q.params.template_id=e),min:0},null,8,["modelValue"])]),_:1}),f(r,{label:"频次周期",prop:"frequency_period"},{default:c(()=>[f(u,{modelValue:Q.params.frequency.period,"onUpdate:modelValue":l[2]||(l[2]=e=>Q.params.frequency.period=e),placeholder:"选择周期"},{default:c(()=>[f(t,{label:"每天",value:"day"}),f(t,{label:"每周",value:"week"}),f(t,{label:"每月",value:"month"})]),_:1},8,["modelValue"])]),_:1}),f(r,{label:"次数",prop:"frequency_times"},{default:c(()=>[f(i,{modelValue:Q.params.frequency.times,"onUpdate:modelValue":l[3]||(l[3]=e=>Q.params.frequency.times=e),min:1},null,8,["modelValue"])]),_:1})],64)):2===Q.effect_type?(_(),y(b,{key:1},[f(r,{label:"折扣类型",prop:"discount_type"},{default:c(()=>[f(u,{modelValue:Q.params.discount_type,"onUpdate:modelValue":l[4]||(l[4]=e=>Q.params.discount_type=e)},{default:c(()=>[f(t,{label:"百分比",value:"percentage"}),f(t,{label:"固定金额",value:"fixed"})]),_:1},8,["modelValue"])]),_:1}),f(r,{label:"折扣值(×1000)",prop:"value_x1000"},{default:c(()=>[f(i,{modelValue:Q.params.value_x1000,"onUpdate:modelValue":l[5]||(l[5]=e=>Q.params.value_x1000=e),min:0,step:10},null,8,["modelValue"])]),_:1}),f(r,{label:"最高减免(×1000)",prop:"max_discount_x1000"},{default:c(()=>[f(i,{modelValue:Q.params.max_discount_x1000,"onUpdate:modelValue":l[6]||(l[6]=e=>Q.params.max_discount_x1000=e),min:0,step:10},null,8,["modelValue"])]),_:1})],64)):3===Q.effect_type?(_(),y(b,{key:2},[f(r,{label:"倍率(×1000)",prop:"multiplier_x1000"},{default:c(()=>[f(i,{modelValue:Q.params.multiplier_x1000,"onUpdate:modelValue":l[7]||(l[7]=e=>Q.params.multiplier_x1000=e),min:0,step:100},null,8,["modelValue"])]),_:1}),f(r,{label:"每日积分上限",prop:"daily_cap_points"},{default:c(()=>[f(i,{modelValue:Q.params.daily_cap_points,"onUpdate:modelValue":l[8]||(l[8]=e=>Q.params.daily_cap_points=e),min:0},null,8,["modelValue"])]),_:1})],64)):4===Q.effect_type?(_(),y(b,{key:3},[f(r,{label:"模板ID",prop:"template_id"},{default:c(()=>[f(i,{modelValue:Q.params.template_id,"onUpdate:modelValue":l[9]||(l[9]=e=>Q.params.template_id=e),min:0},null,8,["modelValue"])]),_:1}),f(r,{label:"频次周期",prop:"frequency_period"},{default:c(()=>[f(u,{modelValue:Q.params.frequency.period,"onUpdate:modelValue":l[10]||(l[10]=e=>Q.params.frequency.period=e),placeholder:"选择周期"},{default:c(()=>[f(t,{label:"每周",value:"week"}),f(t,{label:"每月",value:"month"})]),_:1},8,["modelValue"])]),_:1}),f(r,{label:"次数",prop:"frequency_times"},{default:c(()=>[f(i,{modelValue:Q.params.frequency.times,"onUpdate:modelValue":l[11]||(l[11]=e=>Q.params.frequency.times=e),min:1},null,8,["modelValue"])]),_:1})],64)):5===Q.effect_type?(_(),y(b,{key:4},[f(r,{label:"目标奖品ID",prop:"target_prize_ids"},{default:c(()=>[f(p,{modelValue:P.value,"onUpdate:modelValue":l[12]||(l[12]=e=>P.value=e),placeholder:"以逗号分隔的ID,如 101,102"},null,8,["modelValue"])]),_:1}),f(r,{label:"加成(×1000)",prop:"boost_x1000"},{default:c(()=>[f(i,{modelValue:Q.params.boost_x1000,"onUpdate:modelValue":l[13]||(l[13]=e=>Q.params.boost_x1000=e),min:0,step:10},null,8,["modelValue"])]),_:1}),f(r,{label:"封顶(×1000)",prop:"cap_x1000"},{default:c(()=>[f(i,{modelValue:Q.params.cap_x1000,"onUpdate:modelValue":l[14]||(l[14]=e=>Q.params.cap_x1000=e),min:0,step:10},null,8,["modelValue"])]),_:1})],64)):6===Q.effect_type?(_(),y(b,{key:5},[f(r,{label:"目标奖品ID",prop:"target_prize_ids"},{default:c(()=>[f(p,{modelValue:P.value,"onUpdate:modelValue":l[15]||(l[15]=e=>P.value=e),placeholder:"以逗号分隔的ID,如 101,102"},null,8,["modelValue"])]),_:1}),f(r,{label:"概率(×1000)",prop:"chance_x1000"},{default:c(()=>[f(i,{modelValue:Q.params.chance_x1000,"onUpdate:modelValue":l[16]||(l[16]=e=>Q.params.chance_x1000=e),min:0,step:10},null,8,["modelValue"])]),_:1}),f(r,{label:"周期内次数上限",prop:"period_cap_times"},{default:c(()=>[f(i,{modelValue:Q.params.period_cap_times,"onUpdate:modelValue":l[17]||(l[17]=e=>Q.params.period_cap_times=e),min:0},null,8,["modelValue"])]),_:1})],64)):v("",!0),f(r,{label:"叠加策略",prop:"stacking_strategy"},{default:c(()=>[f(m,{modelValue:Q.stacking_strategy,"onUpdate:modelValue":l[18]||(l[18]=e=>Q.stacking_strategy=e)},{default:c(()=>[f(d,{label:0},{default:c(()=>[...l[27]||(l[27]=[g("最大值",-1)])]),_:1}),f(d,{label:1},{default:c(()=>[...l[28]||(l[28]=[g("累加封顶",-1)])]),_:1}),f(d,{label:2},{default:c(()=>[...l[29]||(l[29]=[g("首个匹配",-1)])]),_:1})]),_:1},8,["modelValue"])]),_:1}),f(r,{label:"统一封顶(×1000)",prop:"cap_value_x1000"},{default:c(()=>[f(i,{modelValue:Q.cap_value_x1000,"onUpdate:modelValue":l[19]||(l[19]=e=>Q.cap_value_x1000=e),min:0,step:10},null,8,["modelValue"])]),_:1}),f(U,null,{default:c(()=>[...l[30]||(l[30]=[g("作用范围",-1)])]),_:1}),f(r,{label:"包含活动",prop:"scope_activity_ids"},{default:c(()=>[f(u,{modelValue:J.value,"onUpdate:modelValue":l[20]||(l[20]=e=>J.value=e),multiple:"",filterable:"",placeholder:"选择活动"},{default:c(()=>[(_(!0),y(b,null,x(K.value,e=>(_(),n(t,{key:e.id,label:e.name,value:e.id},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])]),_:1}),f(r,{label:"包含期",prop:"scope_issue_ids"},{default:c(()=>[f(u,{modelValue:B.value,"onUpdate:modelValue":l[21]||(l[21]=e=>B.value=e),multiple:"",filterable:"",placeholder:"选择期"},{default:c(()=>[(_(!0),y(b,null,x(M.value,e=>(_(),n(t,{key:e.id,label:e.issue_number,value:e.id},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])]),_:1}),f(r,{label:"排除期",prop:"scope_ex_issue_ids"},{default:c(()=>[f(u,{modelValue:H.value,"onUpdate:modelValue":l[22]||(l[22]=e=>H.value=e),multiple:"",filterable:"",placeholder:"选择排除期"},{default:c(()=>[(_(!0),y(b,null,x(M.value,e=>(_(),n(t,{key:"ex-"+e.id,label:e.issue_number,value:e.id},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])]),_:1}),f(r,{label:"排序",prop:"sort"},{default:c(()=>[f(i,{modelValue:Q.sort,"onUpdate:modelValue":l[23]||(l[23]=e=>Q.sort=e),min:0,max:999},null,8,["modelValue"]),l[31]||(l[31]=j("div",{class:"form-tip"},"数值越大优先级越高",-1))]),_:1}),f(r,{label:"状态",prop:"status"},{default:c(()=>[f(m,{modelValue:Q.status,"onUpdate:modelValue":l[24]||(l[24]=e=>Q.status=e)},{default:c(()=>[f(d,{label:1},{default:c(()=>[...l[32]||(l[32]=[g("启用",-1)])]),_:1}),f(d,{label:0},{default:c(()=>[...l[33]||(l[33]=[g("停用",-1)])]),_:1})]),_:1},8,["modelValue"])]),_:1})]),_:1},8,["model"])]),_:1},8,["title","modelValue"])}}}),[["__scopeId","data-v-47e87be5"]]);export{J as default}; diff --git a/nginx/admin/assets/EffectEditDialog-CaIWUZ9w.js.gz b/nginx/admin/assets/EffectEditDialog-CaIWUZ9w.js.gz new file mode 100644 index 0000000..74fd6f2 Binary files /dev/null and b/nginx/admin/assets/EffectEditDialog-CaIWUZ9w.js.gz differ diff --git a/nginx/admin/assets/EffectManagerDialog-BmMTyIDl.js b/nginx/admin/assets/EffectManagerDialog-BmMTyIDl.js new file mode 100644 index 0000000..b2e0413 --- /dev/null +++ b/nginx/admin/assets/EffectManagerDialog-BmMTyIDl.js @@ -0,0 +1 @@ +var e=(e,t,i)=>new Promise((a,s)=>{var l=e=>{try{o(i.next(e))}catch(t){s(t)}},r=e=>{try{o(i.throw(e))}catch(t){s(t)}},o=e=>e.done?a(e.value):Promise.resolve(e.value).then(l,r);o((i=i.apply(e,t)).next())});import{d as t,r as i,c as a,A as s,h as l,e as r,w as o,f as n,g as p,N as u,E as d,j as c,ai as m,p as f,b5 as _,eo as v,v as y,b as j,I as g,J as b,b2 as x,T as w,aV as h}from"./index-BoIUJTA2.js";/* empty css *//* empty css *//* empty css *//* empty css */import"./el-tooltip-l0sNRNKZ.js";/* empty css *//* empty css *//* empty css *//* empty css */import{titlesApi as k}from"./titles-D1iSw7M5.js";import A from"./EffectEditDialog-CaIWUZ9w.js";import{E as $,a as z}from"./index-BjuMygln.js";import{E as C}from"./index-ZsMdSUVI.js";import{E}from"./index-CjpBlozU.js";import{_ as T}from"./_plugin-vue_export-helper-BCo6x5W8.js";/* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css */import"./activity-CMsiETfu.js";import"./adminActivities-Dgt25iR5.js";import"./index-BcfO0-fK.js";import"./castArray-nM8ho4U3.js";import"./_baseClone-Ct7RL6h5.js";import"./_initCloneObject-DRmC-q3t.js";import"./index-D2gD5Tn5.js";import"./index-BMeOzN3u.js";import"./index-COyGylbk.js";import"./index-Bq8lawOo.js";import"./index-Cp4NEpJ7.js";import"./token-DWNpOE8r.js";import"./debounce-DQl5eUwG.js";import"./_baseIteratee-CtIat01j.js";import"./index-CXORCV4U.js";import"./index-C_S0YbqD.js";import"./index-BnK4BbY2.js";import"./index-DqTthkO7.js";import"./index-Dy3gZN7-.js";import"./use-dialog-FwJ-QdmW.js";import"./refs-Cw5r5QN8.js";import"./isArrayLikeObject-CFQi-X2M.js";import"./raf-DsHSIRfX.js";import"./index-D8nVJoNy.js";const B={class:"effect-manager"},V={class:"toolbar"},I={class:"params-view"},S={class:"params-view"},D=T(t({__name:"EffectManagerDialog",props:{visible:{type:Boolean},title:{}},emits:["update:visible"],setup(t,{emit:T}){const D=t,O=T,U=i(!1),J=i([]),L=i(!1),M=i(null),N=a({get:()=>D.visible,set:e=>O("update:visible",e)}),P={1:{name:"领券",tag:"warning"},2:{name:"抽奖折扣",tag:"success"},3:{name:"签到倍数",tag:"primary"},4:{name:"领道具卡",tag:"info"},5:{name:"概率加成",tag:"warning"},6:{name:"双倍概率",tag:"danger"}},q={0:"最大值",1:"累加封顶",2:"首个匹配"};function H(e){var t;return(null==(t=P[e])?void 0:t.name)||"未知"}function Q(e){var t;return(null==(t=P[e])?void 0:t.tag)||"info"}function W(e){try{return JSON.parse(e||"{}")}catch(t){return{}}}function X(e){const t=W(e.scopes_json||"{}"),i=t.exclude||{};return{activity_ids:Array.isArray(t.activity_ids)?t.activity_ids:[],issue_ids:Array.isArray(t.issue_ids)?t.issue_ids:[],exclude_issue_ids:Array.isArray(i.issue_ids)?i.issue_ids:[]}}function Y(e,t){const i={template_id:"模板ID",frequency:"频次",period:"周期",times:"次数",discount_type:"折扣类型",value_x1000:"折扣值×1000",max_discount_x1000:"最高减免×1000",multiplier_x1000:"倍率×1000",daily_cap_points:"每日积分上限",target_prize_ids:"目标奖品",boost_x1000:"加成×1000",cap_x1000:"封顶×1000",chance_x1000:"概率×1000",period_cap_times:"周期次数上限"}[e]||e;return"number"==typeof t?`${i}: ${t}`:Array.isArray(t)?`${i}: ${t.length}项`:`${i}: ${t}`}function F(){return e(this,null,function*(){if(D.title){U.value=!0;try{const e=yield k.getTitleEffects(D.title.id);J.value=e.list||[]}catch(e){w.error("加载效果列表失败"),J.value=[]}finally{U.value=!1}}})}function G(){M.value=null,L.value=!0}function K(){F()}return s(N,e=>{e&&D.title&&F()}),(i,a)=>{var s;const T=m,O=d,P=C,R=z,Z=$,ee=E,te=x;return r(),l(ee,{title:`称号效果管理 - ${null==(s=t.title)?void 0:s.name}`,modelValue:N.value,"onUpdate:modelValue":a[1]||(a[1]=e=>N.value=e),width:"90%","close-on-click-modal":!1},{default:o(()=>[n("div",B,[n("div",V,[p(O,{type:"primary",onClick:G},{default:o(()=>[p(T,null,{default:o(()=>[p(f(_))]),_:1}),a[2]||(a[2]=c("添加效果 ",-1))]),_:1}),p(O,{type:"info",onClick:K},{default:o(()=>[p(T,null,{default:o(()=>[p(f(v))]),_:1}),a[3]||(a[3]=c("刷新 ",-1))]),_:1})]),u((r(),l(Z,{data:J.value,border:""},{default:o(()=>[p(R,{prop:"effect_type",label:"效果类型",width:"120"},{default:o(({row:e})=>[p(P,{type:Q(e.effect_type)},{default:o(()=>[c(y(H(e.effect_type)),1)]),_:2},1032,["type"])]),_:1}),p(R,{prop:"params",label:"参数配置","min-width":"200"},{default:o(({row:e})=>[n("div",I,[(r(!0),j(g,null,b(W(e.params_json),(e,t)=>(r(),l(P,{key:t,size:"small"},{default:o(()=>[c(y(Y(String(t),e)),1)]),_:2},1024))),128))])]),_:1}),p(R,{label:"作用范围","min-width":"220"},{default:o(({row:e})=>[n("div",S,[(r(!0),j(g,null,b(X(e).activity_ids,e=>(r(),l(P,{type:"info",size:"small",key:"a-"+e},{default:o(()=>[c("活动:"+y(e),1)]),_:2},1024))),128)),(r(!0),j(g,null,b(X(e).issue_ids,e=>(r(),l(P,{type:"success",size:"small",key:"i-"+e},{default:o(()=>[c("期:"+y(e),1)]),_:2},1024))),128)),(r(!0),j(g,null,b(X(e).exclude_issue_ids,e=>(r(),l(P,{type:"danger",size:"small",key:"x-"+e},{default:o(()=>[c("排除期:"+y(e),1)]),_:2},1024))),128))])]),_:1}),p(R,{prop:"stacking_strategy",label:"叠加策略",width:"100"},{default:o(({row:e})=>{return[c(y((t=e.stacking_strategy,q[t]||"未知")),1)];var t}),_:1}),p(R,{prop:"cap_value_x1000",label:"上限值",width:"100"},{default:o(({row:e})=>[c(y(e.cap_value_x1000/1e3),1)]),_:1}),p(R,{prop:"sort",label:"排序",width:"80",sortable:""}),p(R,{prop:"status",label:"状态",width:"80"},{default:o(({row:e})=>[p(P,{type:1===e.status?"success":"danger",size:"small"},{default:o(()=>[c(y(1===e.status?"启用":"停用"),1)]),_:2},1032,["type"])]),_:1}),p(R,{prop:"created_at",label:"创建时间",width:"160"}),p(R,{label:"操作",width:"150",fixed:"right"},{default:o(({row:t})=>[p(O,{type:"primary",size:"small",onClick:e=>{return i=t,M.value=i,void(L.value=!0);var i}},{default:o(()=>[...a[4]||(a[4]=[c("编辑",-1)])]),_:1},8,["onClick"]),p(O,{type:"danger",size:"small",onClick:i=>function(t){return e(this,null,function*(){var e,i;try{const e=H(t.effect_type);yield h.confirm(`确定要删除效果"${e}"吗?此操作不可恢复`,"删除确认",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning",beforeClose:(e,t,i)=>{"confirm"===e?t.confirmButtonLoading=!0:i()}}),yield k.deleteTitleEffect(D.title.id,t.id),w.success({message:`"${e}"已成功删除`,duration:3e3}),F()}catch(a){if("cancel"===a)return;const s=(null==(i=null==(e=null==a?void 0:a.response)?void 0:e.data)?void 0:i.message)||a.message||"删除失败",l=H(t.effect_type);w.error({message:`"${l}"删除失败:${s}`,duration:4e3})}})}(t)},{default:o(()=>[...a[5]||(a[5]=[c("删除",-1)])]),_:1},8,["onClick"])]),_:1})]),_:1},8,["data"])),[[te,U.value]])]),p(A,{visible:L.value,"onUpdate:visible":a[0]||(a[0]=e=>L.value=e),title:t.title,effect:M.value,"occupied-types":J.value.map(e=>e.effect_type),onSuccess:F},null,8,["visible","title","effect","occupied-types"])]),_:1},8,["title","modelValue"])}}}),[["__scopeId","data-v-31a74478"]]);export{D as default}; diff --git a/nginx/admin/assets/EffectManagerDialog-DnvqZPdh.css b/nginx/admin/assets/EffectManagerDialog-DnvqZPdh.css new file mode 100644 index 0000000..d46a951 --- /dev/null +++ b/nginx/admin/assets/EffectManagerDialog-DnvqZPdh.css @@ -0,0 +1 @@ +.effect-manager[data-v-31a74478]{padding:0}.toolbar[data-v-31a74478]{margin-bottom:16px;display:flex;gap:12px}.params-view[data-v-31a74478]{display:flex;flex-wrap:wrap;gap:4px}.params-view .el-tag[data-v-31a74478]{margin:2px} diff --git a/nginx/admin/assets/Iframe-N6cwNV9d.js b/nginx/admin/assets/Iframe-N6cwNV9d.js new file mode 100644 index 0000000..7ea4735 --- /dev/null +++ b/nginx/admin/assets/Iframe-N6cwNV9d.js @@ -0,0 +1 @@ +var e=Object.defineProperty,r=Object.defineProperties,a=Object.getOwnPropertyDescriptors,t=Object.getOwnPropertySymbols,o=Object.prototype.hasOwnProperty,n=Object.prototype.propertyIsEnumerable,s=(r,a,t)=>a in r?e(r,a,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[a]=t;import{d as l,a as f,r as c,o as i,b1 as b,N as p,b2 as u,p as m,e as d,b as v,f as y}from"./index-BoIUJTA2.js";const O={class:"box-border w-full h-full"},h=["src"],j=l((w=((e,r)=>{for(var a in r||(r={}))o.call(r,a)&&s(e,a,r[a]);if(t)for(var a of t(r))n.call(r,a)&&s(e,a,r[a]);return e})({},{name:"IframeView"}),r(w,a({__name:"Iframe",setup(e){const r=f(),a=c(!0),t=c(""),o=c(null);i(()=>{const e=b.getInstance().findByPath(r.path);(null==e?void 0:e.meta)&&(t.value=e.meta.link||"")});const n=()=>{a.value=!1};return(e,r)=>{const s=u;return p((d(),v("div",O,[y("iframe",{ref_key:"iframeRef",ref:o,src:m(t),frameborder:"0",class:"w-full h-full min-h-[calc(100vh-120px)] border-none",onLoad:n},null,40,h)])),[[s,m(a)]])}}}))));var w;export{j as default}; diff --git a/nginx/admin/assets/LoginLeftView-BN4zi5Xi.css b/nginx/admin/assets/LoginLeftView-BN4zi5Xi.css new file mode 100644 index 0000000..c5f0a83 --- /dev/null +++ b/nginx/admin/assets/LoginLeftView-BN4zi5Xi.css @@ -0,0 +1 @@ +.color-dots[data-v-254aa00e]{pointer-events:none;backdrop-filter:blur(10px);box-shadow:0 2px 12px var(--art-gray-300);transition:opacity .3s ease,transform .3s ease;transform:translate(10px)}.color-dot[data-v-254aa00e]{box-shadow:0 2px 4px #00000026;transition:all .3s cubic-bezier(.4,0,.2,1);transition-delay:calc(var(--index) * .05s);transform:translate(20px) scale(.8)}.color-dot[data-v-254aa00e]:hover{box-shadow:0 4px 8px #0003;transform:translate(0) scale(1.1)}.color-picker-expandable:hover .color-dots[data-v-254aa00e]{pointer-events:auto;opacity:1;transform:translate(0)}.color-picker-expandable:hover .color-dot[data-v-254aa00e]{opacity:1;transform:translate(0) scale(1)}.dark .color-dots[data-v-254aa00e]{background-color:var(--art-gray-200);box-shadow:none}.color-picker-expandable:hover .palette-btn[data-v-254aa00e] .art-svg-icon{color:var(--caa805ce)}.login-left-view[data-v-591b4b14]{position:relative;box-sizing:border-box;width:65vw;height:100%;padding:15px;overflow:hidden;background-color:color-mix(in srgb,var(--el-color-primary-light-9) 100%,var(--default-box-color))}.login-left-view .logo[data-v-591b4b14]{position:relative;z-index:100;display:flex;align-items:center}.login-left-view .logo .title[data-v-591b4b14]{margin-left:10px;font-size:20px;font-weight:400}.login-left-view .left-img[data-v-591b4b14]{position:absolute;inset:0 0 10.5%;z-index:10;width:40%;margin:auto;animation:slideInLeft-591b4b14 .6s cubic-bezier(.25,.46,.45,.94) forwards}.login-left-view .text-wrap[data-v-591b4b14]{position:absolute;bottom:80px;width:100%;text-align:center;animation:slideInLeft-591b4b14 .6s cubic-bezier(.25,.46,.45,.94) forwards}.login-left-view .text-wrap h1[data-v-591b4b14]{font-size:24px;font-weight:400;color:var(--art-gray-900)!important}.login-left-view .text-wrap p[data-v-591b4b14]{margin-top:10px;font-size:14px;color:var(--art-gray-600)!important}.login-left-view .geometric-decorations .geo-element[data-v-591b4b14]{position:absolute;opacity:0;animation-fill-mode:forwards;animation-duration:.8s;animation-timing-function:cubic-bezier(.25,.46,.45,.94)}@keyframes fadeInUp-591b4b14{0%{opacity:0;transform:translateY(30px) rotate(0)}to{opacity:1;transform:translateY(0) rotate(0)}}@keyframes fadeInDown-591b4b14{0%{opacity:0;transform:translateY(-30px) rotate(0)}to{opacity:1;transform:translateY(0) rotate(0)}}@keyframes fadeInLeft-591b4b14{0%{opacity:0;transform:translate(-30px) rotate(0)}to{opacity:1;transform:translate(0) rotate(0)}}@keyframes fadeInLeftRotated-591b4b14{0%{opacity:0;transform:translate(-30px) rotate(-25deg)}to{opacity:1;transform:translate(0) rotate(-25deg)}}@keyframes fadeInRight-591b4b14{0%{opacity:0;transform:translate(30px) rotate(0)}to{opacity:1;transform:translate(0) rotate(0)}}@keyframes fadeInRightRotated-591b4b14{0%{opacity:0;transform:translate(30px) rotate(45deg)}to{opacity:1;transform:translate(0) rotate(45deg)}}@keyframes fadeInLeftRotatedBlue-591b4b14{0%{opacity:0;transform:translate(-30px) rotate(-10deg)}to{opacity:1;transform:translate(0) rotate(-10deg)}}@keyframes fadeInLeftRotatedPink-591b4b14{0%{opacity:0;transform:translate(-30px) rotate(10deg)}to{opacity:1;transform:translate(0) rotate(10deg)}}@keyframes fadeInLeftNoRotation-591b4b14{0%{opacity:0;transform:translate(-30px) rotate(0)}to{opacity:1;transform:translate(0) rotate(0)}}@keyframes scaleIn-591b4b14{0%{opacity:0;transform:scale(.8)}to{opacity:1;transform:scale(1)}}@keyframes bounceIn-591b4b14{0%{opacity:0;transform:scale(.3)}50%{opacity:1;transform:scale(1.05)}70%{transform:scale(.9)}to{opacity:1;transform:scale(1)}}@keyframes lineGrow-591b4b14{0%{opacity:0}to{opacity:1}}@keyframes slideInLeft-591b4b14{0%{opacity:0;transform:translate(-30px)}to{opacity:1;transform:translate(0)}}.login-left-view .geometric-decorations .animate-fade-in-up[data-v-591b4b14]{animation-name:fadeInUp-591b4b14}.login-left-view .geometric-decorations .animate-fade-in-down[data-v-591b4b14]{animation-name:fadeInDown-591b4b14}.login-left-view .geometric-decorations .animate-fade-in-left[data-v-591b4b14]{animation-name:fadeInLeft-591b4b14}.login-left-view .geometric-decorations .animate-fade-in-right[data-v-591b4b14]{animation-name:fadeInRight-591b4b14}.login-left-view .geometric-decorations .animate-scale-in[data-v-591b4b14]{animation-name:scaleIn-591b4b14;animation-duration:1.2s}.login-left-view .geometric-decorations .animate-bounce-in[data-v-591b4b14]{animation-name:bounceIn-591b4b14;animation-duration:.6s}.login-left-view .geometric-decorations .animate-fade-in-left-rotated-blue[data-v-591b4b14]{animation-name:fadeInLeftRotatedBlue-591b4b14}.login-left-view .geometric-decorations .animate-fade-in-left-rotated-pink[data-v-591b4b14]{animation-name:fadeInLeftRotatedPink-591b4b14}.login-left-view .geometric-decorations .animate-fade-in-left-no-rotation[data-v-591b4b14]{animation-name:fadeInLeftNoRotation-591b4b14}.login-left-view .geometric-decorations .circle-outline[data-v-591b4b14]{top:10%;left:25%;width:42px;height:42px;border:2px solid var(--el-color-primary-light-8);border-radius:50%}.login-left-view .geometric-decorations .square-rotated[data-v-591b4b14]{top:50%;left:16%;width:60px;height:60px;background-color:color-mix(in srgb,var(--el-color-primary-light-8) 80%,var(--default-box-color))}.login-left-view .geometric-decorations .square-rotated.animate-fade-in-left[data-v-591b4b14]{animation-name:fadeInLeftRotated-591b4b14}.login-left-view .geometric-decorations .circle-small[data-v-591b4b14]{bottom:26%;left:30%;width:18px;height:18px;background-color:var(--el-color-primary-light-8);border-radius:50%}.login-left-view .geometric-decorations .circle-top-right[data-v-591b4b14]{top:3%;right:3%;z-index:100;width:50px;height:50px;cursor:pointer;background:color-mix(in srgb,var(--el-color-primary-light-7) 80%,var(--default-box-color));border-radius:50%;transition:all .3s}.login-left-view .geometric-decorations .circle-top-right[data-v-591b4b14]:after{position:absolute;top:50%;left:50%;width:100%;height:100%;content:"";background:linear-gradient(to right,#fcbb04,#fffc00);border-radius:50%;opacity:0;transition:all .5s;transform:translate(-50%,-50%)}.login-left-view .geometric-decorations .circle-top-right[data-v-591b4b14]:hover{box-shadow:0 0 36px #fffc00}.login-left-view .geometric-decorations .circle-top-right[data-v-591b4b14]:hover:after{opacity:1}.login-left-view .geometric-decorations .square-bottom-right[data-v-591b4b14]{right:10%;bottom:10%;width:50px;height:50px;background-color:var(--el-color-primary-light-8)}.login-left-view .geometric-decorations .square-bottom-right.animate-fade-in-right[data-v-591b4b14]{animation-name:fadeInRightRotated-591b4b14}.login-left-view .geometric-decorations .bg-bubble[data-v-591b4b14]{top:-120px;right:-120px;width:360px;height:360px;background-color:color-mix(in srgb,var(--el-color-primary-light-8) 80%,var(--default-box-color));border-radius:50%}.login-left-view .geometric-decorations .dot[data-v-591b4b14]{width:14px;height:14px;background-color:var(--el-color-primary-light-7);border-radius:50%}.login-left-view .geometric-decorations .dot.dot-top-left[data-v-591b4b14]{top:140px;left:100px}.login-left-view .geometric-decorations .dot.dot-top-right[data-v-591b4b14]{top:140px;right:120px}.login-left-view .geometric-decorations .dot.dot-center-right[data-v-591b4b14]{top:46%;right:22%;background-color:var(--el-color-primary-light-8)}.login-left-view .geometric-decorations .squares-group[data-v-591b4b14]{position:absolute;bottom:18px;left:20px;width:140px;height:140px;pointer-events:none}.login-left-view .geometric-decorations .squares-group .square[data-v-591b4b14]{position:absolute;display:block;border-radius:8px;box-shadow:0 8px 24px #4057a71f}.login-left-view .geometric-decorations .squares-group .square.square-blue[data-v-591b4b14]{top:12px;left:30px;z-index:2;width:50px;height:50px;background-color:rgb(from var(--el-color-primary) r g b/30%)}.login-left-view .geometric-decorations .squares-group .square.square-pink[data-v-591b4b14]{top:30px;left:48px;z-index:1;width:70px;height:70px;background-color:rgb(from var(--el-color-primary) r g b/15%)}.login-left-view .geometric-decorations .squares-group .square.square-purple[data-v-591b4b14]{top:66px;left:86px;z-index:3;width:32px;height:32px;background-color:rgb(from var(--el-color-primary) r g b/45%)}.login-left-view .geometric-decorations .squares-group[data-v-591b4b14]:after{position:absolute;top:86px;left:72px;width:80px;height:1px;content:"";background:linear-gradient(90deg,var(--el-color-primary-light-6),transparent);opacity:0;transform:rotate(50deg);animation:lineGrow-591b4b14 .8s cubic-bezier(.25,.46,.45,.94) forwards;animation-delay:1.2s}@media only screen and (width <= 1600px){.login-left-view[data-v-591b4b14]{width:60vw}.login-left-view .text-wrap[data-v-591b4b14]{bottom:40px}}@media only screen and (width <= 1180px){.login-left-view[data-v-591b4b14]{width:auto;height:auto;padding:0;background:transparent}.login-left-view .left-img[data-v-591b4b14],.login-left-view .text-wrap[data-v-591b4b14],.login-left-view .geometric-decorations[data-v-591b4b14],.login-left-view .logo[data-v-591b4b14]{display:none}}.dark .login-left-view[data-v-591b4b14]{background-color:color-mix(in srgb,var(--el-color-primary-light-9) 60%,#070707)}@media only screen and (width <= 1180px){.dark .login-left-view[data-v-591b4b14]{background:transparent}}.dark .login-left-view .geometric-decorations .circle-top-right[data-v-591b4b14]{background-color:color-mix(in srgb,var(--el-color-primary-light-8) 80%,var(--default-box-color));box-shadow:0 0 25px #333 inset;transition:all .3s ease-in-out .1s;rotate:-48deg}.dark .login-left-view .geometric-decorations .circle-top-right[data-v-591b4b14]:before{position:absolute;top:0;left:15px;width:50px;height:50px;content:"";background-color:color-mix(in srgb,var(--el-color-primary-light-9) 100%,var(--default-box-color));border-radius:50%;transition:all .3s ease-in-out}.dark .login-left-view .geometric-decorations .circle-top-right[data-v-591b4b14]:hover{background-color:transparent;box-shadow:0 40px 25px #ddd inset}.dark .login-left-view .geometric-decorations .circle-top-right[data-v-591b4b14]:hover:before{left:18px}.dark .login-left-view .geometric-decorations .circle-top-right[data-v-591b4b14]:hover:after{opacity:0}.dark .login-left-view .geometric-decorations .bg-bubble[data-v-591b4b14],.dark .login-left-view .geometric-decorations .square-rotated[data-v-591b4b14]{background-color:color-mix(in srgb,var(--el-color-primary-light-9) 100%,var(--default-box-color))}.dark .login-left-view .geometric-decorations .circle-small[data-v-591b4b14],.dark .login-left-view .geometric-decorations .dot[data-v-591b4b14]{background-color:var(--el-color-primary-light-8)}.dark .login-left-view .geometric-decorations .square-bottom-right[data-v-591b4b14]{background-color:var(--el-color-primary-light-9)}.dark .login-left-view .geometric-decorations .dot.dot-top-right[data-v-591b4b14]{background-color:var(--el-color-primary-light-8)}.dark .login-left-view .squares-group .square[data-v-591b4b14]{box-shadow:none}.dark .login-left-view .squares-group .square.square-blue[data-v-591b4b14]{background-color:rgb(from var(--el-color-primary) r g b/18%)}.dark .login-left-view .squares-group .square.square-pink[data-v-591b4b14]{background-color:rgb(from var(--el-color-primary) r g b/10%)}.dark .login-left-view .squares-group .square.square-purple[data-v-591b4b14]{background-color:rgb(from var(--el-color-primary) r g b/20%)}.dark .login-left-view .squares-group[data-v-591b4b14]:after{background:linear-gradient(90deg,var(--el-color-primary-light-8),transparent)} diff --git a/nginx/admin/assets/LoginLeftView-BN4zi5Xi.css.gz b/nginx/admin/assets/LoginLeftView-BN4zi5Xi.css.gz new file mode 100644 index 0000000..bfd3a2c Binary files /dev/null and b/nginx/admin/assets/LoginLeftView-BN4zi5Xi.css.gz differ diff --git a/nginx/admin/assets/LoginLeftView-DmcFsDtV.js b/nginx/admin/assets/LoginLeftView-DmcFsDtV.js new file mode 100644 index 0000000..71b454b --- /dev/null +++ b/nginx/admin/assets/LoginLeftView-DmcFsDtV.js @@ -0,0 +1 @@ +var e=Object.defineProperty,a=Object.defineProperties,t=Object.getOwnPropertyDescriptors,s=Object.getOwnPropertySymbols,l=Object.prototype.hasOwnProperty,i=Object.prototype.propertyIsEnumerable,n=(a,t,s)=>t in a?e(a,t,{enumerable:!0,configurable:!0,writable:!0,value:s}):a[t]=s;import{d as o,U as c,x as r,B as d,y as m,z as u,D as p,b as v,e as b,f,g,v as y,p as x,h,i as _,I as w,J as j,w as k,V as q,q as C,W as O,m as T,X as z}from"./index-BoIUJTA2.js";/* empty css */import{E as I,a as B,b as D}from"./el-dropdown-item-D7SYN_RE.js";/* empty css *//* empty css */import{_ as P}from"./index.vue_vue_type_script_setup_true_lang-DUbflfBQ.js";import{u as S,_ as V}from"./useHeaderBar-B65RzJLX.js";import{_ as L}from"./_plugin-vue_export-helper-BCo6x5W8.js";import{_ as E}from"./index-DVdhsH_J.js";const U={class:"absolute w-full flex-cb top-4.5 z-10 flex-c !justify-end max-[1180px]:!justify-between"},A={class:"flex-cc !hidden max-[1180px]:!flex ml-2 max-sm:ml-6"},$={class:"text-xl ont-mediumf ml-2"},H={class:"flex-cc gap-1.5 mr-2 max-sm:mr-5"},J={class:"color-picker-expandable relative flex-c max-sm:!hidden"},M={class:"color-dots absolute right-0 rounded-full flex-c gap-2 rounded-5 px-2.5 py-2 pr-9 pl-2.5 opacity-0"},Q=["onClick"],W={class:"btn palette-btn relative z-[2] h-8 w-8 c-p flex-cc tad-300"},X={class:"btn language-btn h-8 w-8 c-p flex-cc tad-300"},F={class:"menu-txt"},G=o((K=((e,a)=>{for(var t in a||(a={}))l.call(a,t)&&n(e,t,a[t]);if(s)for(var t of s(a))i.call(a,t)&&n(e,t,a[t]);return e})({},{name:"AuthTopBar"}),a(K,t({__name:"AuthTopBar",setup(e){c(e=>({caa805ce:x(L)}));const a=r(),t=d(),{isDark:s,systemThemeColor:l}=m(a),{shouldShowThemeToggle:i,shouldShowLanguage:n}=S(),{locale:o}=u(),z=p.systemMainColor,L=l,E=e=>{o.value!==e&&(o.value=e,t.setLanguage(e))};return(e,t)=>{const c=V,r=P,d=B,m=I,u=D;return b(),v("div",U,[f("div",A,[g(c,{class:"icon",size:"46"}),f("h1",$,y(x(p).systemInfo.name),1)]),f("div",H,[f("div",J,[f("div",M,[(b(!0),v(w,null,j(x(z),(e,t)=>(b(),v("div",{key:e,class:C(["color-dot relative size-5 c-p flex-cc rounded-full opacity-0",{active:e===x(l)}]),style:T({background:e,"--index":t}),onClick:t=>(e=>{l.value!==e&&(a.setElementTheme(e),a.reload())})(e)},[e===x(l)?(b(),h(r,{key:0,icon:"ri:check-fill",class:"text-white"})):_("",!0)],14,Q))),128))]),f("div",W,[g(r,{icon:"ri:palette-line",class:"text-xl text-g-800 transition-colors duration-300"})])]),x(n)?(b(),h(u,{key:0,onCommand:E,"popper-class":"langDropDownStyle"},{dropdown:k(()=>[g(m,null,{default:k(()=>[(b(!0),v(w,null,j(x(q),e=>(b(),v("div",{key:e.value,class:"lang-btn-item"},[g(d,{command:e.value,class:C({"is-selected":x(o)===e.value})},{default:k(()=>[f("span",F,y(e.label),1),x(o)===e.value?(b(),h(r,{key:0,icon:"ri:check-fill",class:"text-base"})):_("",!0)]),_:2},1032,["command","class"])]))),128))]),_:1})]),default:k(()=>[f("div",X,[g(r,{icon:"hugeicons:global",class:"text-[19px] text-g-800 transition-colors duration-300"})])]),_:1})):_("",!0),x(i)?(b(),v("div",{key:1,class:"btn theme-btn h-8 w-8 c-p flex-cc tad-300",onClick:t[0]||(t[0]=(...e)=>x(O)&&x(O)(...e))},[g(r,{icon:x(s)?"ri:sun-fill":"ri:moon-line",class:"text-xl text-g-800 transition-colors duration-300"},null,8,["icon"])])):_("",!0)])])}}}))));var K;const N=L(G,[["__scopeId","data-v-254aa00e"]]),R={class:"login-left-view"},Y={class:"logo"},Z={class:"title"},ee={class:"left-img"},ae={class:"text-wrap"},te={class:"geometric-decorations"},se=L(o({__name:"LoginLeftView",props:{hideContent:{type:Boolean}},setup:e=>(e,a)=>{const t=V,s=E;return b(),v("div",R,[f("div",Y,[g(t,{class:"icon",size:"46"}),f("h1",Z,y(x(p).systemInfo.name),1)]),f("div",ee,[g(s,{src:x("/admin/assets/login_icon-C4TVlUS8.svg"),size:"100%"},null,8,["src"])]),f("div",ae,[f("h1",null,y(e.$t("login.leftView.title")),1),f("p",null,y(e.$t("login.leftView.subTitle")),1)]),f("div",te,[a[1]||(a[1]=z('
',5)),f("div",{class:"geo-element circle-top-right animate-fade-in-down",style:{"animation-delay":"0.5"},onClick:a[0]||(a[0]=(...e)=>x(O)&&x(O)(...e))}),a[2]||(a[2]=z('\n{\n "methods": ["register", "consume", "invite", "activity", "manual"],\n "consume": {\n "amount": 1000,\n "times": 5\n },\n "invite": {\n "count": 3,\n "friend_consume": 500\n }\n}\n \n{\n "user_level": ["newbie", "normal", "vip", "svip"],\n "category_ids": [1, 2, 3],\n "region_type": "all",\n "time_type": "always"\n}\n 比上周 +23%
我们为您创建了多个选项,可将它们组合在一起并定制为像素完美的页面
基于 ARPU 与裂变系数的深度增长洞察
de&&(u=de),r=o}u M&&!ca(T-M)&&T f){if(!i)return void(t[ei[e]]=Ef.outside);c=f}t.point[e]=c,t[ei[e]]=h<=c&&c<=f?Ef.inBody:p<=c&&c<=h?Ef.inCorner:Ef.outside}else d?(t[ei[e]]=Ef.inCorner,c=ii(d.xy+d.wh,ai(u.xy,c)),t.point[e]=c):t[ei[e]]=Ef.outside;else s?(t[ei[e]]=Ef.inBody,c=ii(l.xy+l.wh,ai(s.xy,c)),t.point[e]=c):t[ei[e]]=Ef.outside;else t[ei[e]]=Ef.outside}function Rf(t,e,n,a){var i=1-n;if(t[ei[n]]!==Ef.outside)for(a[ei[n]].resetCellIterator(Cf);Cf.next();){var o=Cf.item;if(Bf(t.point[n],o.rect,n)&&Bf(t.point[i],o.rect,i))return e[n]=o.ordinal,void(e[i]=o.id[ei[i]])}}function Of(t,e,n,a){if(t[ei[n]]!==Ef.outside)for((t[ei[n]]===Ef.inCorner?a[ei[1-n]]:a[ei[n]]).resetLayoutIterator(Mf,n);Mf.next();)if(Vf(t.point[n],Mf.item))return void(e[n]=Mf.item.id[ei[n]])}function Vf(t,e){return e.xy<=t&&t<=e.xy+e.wh}function Bf(t,e,n){return e[ei[n]]<=t&&t<=e[ei[n]]+e[ni[n]]}function Gf(t,e){var n;return G(e,function(e){null!=t[e]&&"auto"!==t[e]&&(n=!0)}),n}var Wf=["transition","enterFrom","leaveTo"],Ff=Wf.concat(["enterAnimation","updateAnimation","leaveAnimation"]);function jf(t,e,n){if(n&&(!t[n]&&e[n]&&(t[n]={}),t=t[n],e=e[n]),t&&e)for(var a=n?Wf:Ff,i=0;i {const t=e.clientX,n=e.clientY,{offsetX:a,offsetY:s}=r,l=e=>{i.value||(i.value=!0);const r=a+e.clientX-t,l=s+e.clientY-n;o(r,l)},c=()=>{i.value=!1,document.removeEventListener("mousemove",l),document.removeEventListener("mouseup",c)};document.addEventListener("mousemove",l),document.addEventListener("mouseup",c)},l=()=>{t.value&&e.value&&(t.value.removeEventListener("mousedown",s),window.removeEventListener("resize",c))},c=()=>{const{offsetX:e,offsetY:t}=r;o(e,t)};return wa(()=>{Wr(()=>{n.value?t.value&&e.value&&(t.value.addEventListener("mousedown",s),window.addEventListener("resize",c)):l()})}),La(()=>{l()}),{isDragging:i,resetPosition:()=>{r.offsetX=0,r.offsetY=0,e.value&&(e.value.style.transform="")},updatePosition:c}},Mg=(e,t={})=>{Ht(e)||S_("[useLockscreen]","You need to pass a ref param to this function");const n=t.ns||Ls("popup"),a=eo(()=>n.bm("parent","hidden"));if(!Fd||s_(document.body,a.value))return;let r=0,i=!1,o="0";const s=()=>{setTimeout(()=>{"undefined"!=typeof document&&i&&document&&(document.body.style.width=o,c_(document.body,a.value))},200)};Kr(e,e=>{if(!e)return void s();i=!s_(document.body,a.value),i&&(o=document.body.style.width,l_(document.body,a.value)),r=(e=>{var t;if(!Fd)return 0;if(void 0!==g_)return g_;const n=document.createElement("div");n.className=`${e}-scrollbar__wrap`,n.style.visibility="hidden",n.style.width="100px",n.style.position="absolute",n.style.top="-9999px",document.body.appendChild(n);const a=n.offsetWidth;n.style.overflow="scroll";const r=document.createElement("div");r.style.width="100%",n.appendChild(r);const i=r.offsetWidth;return null==(t=n.parentNode)||t.removeChild(n),g_=a-i,g_})(n.namespace.value);const t=document.documentElement.clientHeightr[1]&&(r[1]=e)})):r=[NaN,NaN];return{sum:a,dataExtent:r}}(e,r,l);if(0===u.sum)return t.viewChildren=[];if(u.sum=function(t,e,n,a,i){if(!a)return n;for(var o=t.get("visibleMin"),r=i.length,l=r,s=r-1;s>=0;s--){var u=i["asc"===a?r-s-1:s].getValue();u/n*e=0;n--)bn(e[n])},e.prototype.getActiveState=function(t){var e=this.activeIntervals;if(!e.length)return"normal";if(null==t||isNaN(+t))return"inactive";if(1===e.length){var n=e[0];if(n[0]<=t&&t<=n[1])return"active"}else for(var a=0,i=e.length;a=0&&(o[i[r].depth]=new Lt(i[r],this,e));return tu(a,n,this,!0,function(t,e){t.wrapMethod("getItemModel",function(t,e){var n=t.parentModel,a=n.getData().getItemLayout(e);if(a){var i=a.depth,o=n.levelModels[i];o&&(t.parentModel=o)}return t}),e.wrapMethod("getItemModel",function(t,e){var n=t.parentModel,a=n.getGraph().getEdgeByIndex(e).node1.getLayout();if(a){var i=a.depth,o=n.levelModels[i];o&&(t.parentModel=o)}return t})}).data},e.prototype.setNodePosition=function(t,e){var n=(this.option.data||this.option.nodes)[t];n.localX=e[0],n.localY=e[1]},e.prototype.setCenter=function(t){this.option.center=t},e.prototype.setZoom=function(t){this.option.zoom=t},e.prototype.getGraph=function(){return this.getData().graph},e.prototype.getEdgeData=function(){return this.getGraph().edgeData},e.prototype.formatTooltip=function(t,e,n){function a(t){return isNaN(t)||null==t}if("edge"===n){var i=this.getDataParams(t,n),o=i.data,r=i.value,l=o.source+" -- "+o.target;return At("nameValue",{name:l,value:r,noValue:a(r)})}var s=this.getGraph().getNodeByIndex(t).getLayout().value,u=this.getDataParams(t,n).data.name;return At("nameValue",{name:null!=u?u+"":null,value:s,noValue:a(s)})},e.prototype.optionUpdated=function(){},e.prototype.getDataParams=function(e,n){var a=t.prototype.getDataParams.call(this,e,n);if(null==a.value&&"node"===n){var i=this.getGraph().getNodeByIndex(e).getLayout().value;a.value=i}return a},e.type="series.sankey",e.layoutMode="box",e.defaultOption={z:2,coordinateSystemUsage:"box",left:"5%",top:"5%",right:"20%",bottom:"5%",orient:"horizontal",nodeWidth:20,nodeGap:8,draggable:!0,layoutIterations:32,roam:!1,roamTrigger:"global",center:null,zoom:1,label:{show:!0,position:"right",fontSize:12},edgeLabel:{show:!1,fontSize:12},levels:[],nodeAlign:"justify",lineStyle:{color:ut.color.neutral50,opacity:.2,curveness:.5},emphasis:{label:{show:!0},lineStyle:{opacity:.5}},select:{itemStyle:{borderColor:ut.color.primary}},animationEasing:"linear",animationDuration:1e3},e}(Pt);function id(t,e){t.eachSeriesByType("sankey",function(t){var n=t.get("nodeWidth"),a=t.get("nodeGap"),i=kt(t,e).refContainer,o=Et(t.getBoxLayoutParams(),i);t.layoutInfo=o;var r=o.width,l=o.height,s=t.getGraph(),u=s.nodes,d=s.edges;!function(t){G(t,function(t){var e=fd(t.outEdges,pd),n=fd(t.inEdges,pd),a=t.getValue()||0,i=Math.max(e,n,a);t.setLayout({value:i},!0)})}(u),function(t,e,n,a,i,o,r,l,s){(function(t,e,n,a,i,o,r){for(var l=[],s=[],u=[],d=[],c=0,h=0;h0){if(Hn(u,d,(u+h)/2-(d-p)*i,(d+p)/2-(h-u)*i,h,p,o,t,e))return r}else if(Xn(u,d,h,p,o,t,e))return r;r++}return-1},e.prototype.contain=function(t,e){var n=this.transformCoordToLocal(t,e),a=this.getBoundingRect();return t=n[0],e=n[1],a.contain(t,e)?(this.hoverDataIdx=this.findDataIndex(t,e))>=0:(this.hoverDataIdx=-1,!1)},e.prototype.getBoundingRect=function(){var t=this._rect;if(!t){for(var e=this.shape.segs,n=1/0,a=1/0,i=-1/0,o=-1/0,r=0;rs[1])continue;var P=u.dataToPoint([L,A]);T=new oe({shape:{x:P[0]-o/2,y:P[1]-r/2,width:o,height:r},style:D})}else if(c){var k=u.dataToLayout([g.get(M[0],C),g.get(M[1],C)]).rect;if(ln(k.x))continue;T=new oe({z2:1,shape:k,style:D})}else{if(isNaN(g.get(M[1],C)))continue;var E=u.dataToLayout([g.get(M[0],C)]);k=E.contentRect||E.rect;if(ln(k.x)||ln(k.y))continue;T=new oe({z2:1,shape:k,style:D})}if(g.hasItemOption){var N=g.getItemModel(C),z=N.getModel("emphasis");v=z.getModel("itemStyle").getItemStyle(),y=N.getModel(["blur","itemStyle"]).getItemStyle(),m=N.getModel(["select","itemStyle"]).getItemStyle(),x=N.get(["itemStyle","borderRadius"]),w=z.get("focus"),S=z.get("blurScope"),I=z.get("disabled"),_=ne(N)}T.shape.r=x;var R=t.getRawValue(C),O="-";R&&null!=R[2]&&(O=R[2]+""),ee(T,_,{labelFetcher:t,labelDataIndex:C,defaultOpacity:D.opacity,defaultText:O}),T.ensureState("emphasis").style=v,T.ensureState("blur").style=y,T.ensureState("select").style=m,Yt(T,w,S,I),T.incremental=i,i&&(T.states.emphasis.hoverLayer=!0),f.add(T),g.setItemGraphicEl(C,T),this._progressiveEls&&this._progressiveEls.push(T)}},e.prototype._renderOnGeo=function(t,e,n,a){var i=n.targetVisuals.inRange,o=n.targetVisuals.outOfRange,r=e.getData(),l=this._hmLayer||this._hmLayer||new Ud;l.blurSize=e.get("blurSize"),l.pointSize=e.get("pointSize"),l.minOpacity=e.get("minOpacity"),l.maxOpacity=e.get("maxOpacity");var s=t.getViewRect().clone(),u=t.getRoamTransform();s.applyTransform(u);var d=Math.max(s.x,0),c=Math.max(s.y,0),h=Math.min(s.width+s.x,a.getWidth()),p=Math.min(s.height+s.y,a.getHeight()),f=h-d,g=p-c,v=[r.mapDimension("lng"),r.mapDimension("lat"),r.mapDimension("value")],y=r.mapArray(v,function(e,n,a){var i=t.dataToPoint([e,n]);return i[0]-=d,i[1]-=c,i.push(a),i}),m=n.getExtent(),x="visualMap.continuous"===n.type?function(t,e){var n=t[1]-t[0];return e=[(e[0]-t[0])/n,(e[1]-t[0])/n],function(t){return t>=e[0]&&t<=e[1]}}(m,n.option.range):function(t,e,n){var a=t[1]-t[0],i=(e=St(e,function(e){return{interval:[(e.interval[0]-t[0])/a,(e.interval[1]-t[0])/a]}})).length,o=0;return function(t){var a;for(a=o;a=0;a--){var r;if((r=e[a].interval)[0]<=t&&t<=r[1]){o=a;break}}return a>=0&&a=0?1:-1:o>0?1:-1}(n,o,i,a,c),function(t,e,n,a,i,o,r,l,s,u){var d,c=s.valueDim,h=s.categoryDim,p=Math.abs(n[h.wh]),f=t.getItemVisual(e,"symbolSize");d=It(f)?f.slice():null==f?["100%","100%"]:[f,f];d[h.index]=B(d[h.index],p),d[c.index]=B(d[c.index],a?p:Math.abs(o)),u.symbolSize=d;var g=u.symbolScale=[d[0]/l,d[1]/l];g[c.index]*=(s.isHorizontal?-1:1)*r}(t,e,i,o,0,c.boundingLength,c.pxSign,u,a,c),function(t,e,n,a,i){var o=t.get(qd)||0;o&&(Kd.attr({scaleX:e[0],scaleY:e[1],rotation:n}),Kd.updateTransform(),o/=Kd.getLineScale(),o*=e[a.valueDim.index]);i.valueLineWidth=o||0}(n,c.symbolScale,s,a,c);var h=c.symbolSize,p=Gn(n.get("symbolOffset"),h);return function(t,e,n,a,i,o,r,l,s,u,d,c){var h=d.categoryDim,p=d.valueDim,f=c.pxSign,g=Math.max(e[p.index]+l,0),v=g;if(a){var y=Math.abs(s),m=ue(t.get("symbolMargin"),"15%")+"",x=!1;m.lastIndexOf("!")===m.length-1&&(x=!0,m=m.slice(0,m.length-1));var _=B(m,e[p.index]),b=Math.max(g+2*_,0),w=x?0:2*_,S=na(a),I=S?a:gc((y+w)/b);b=g+2*(_=(y-I*g)/2/(x?I:Math.max(I-1,1))),w=x?0:2*_,S||"fixed"===a||(I=u?gc((Math.abs(u)+w)/b):0),v=I*b-w,c.repeatTimes=I,c.symbolMargin=_}var M=f*(v/2),C=c.pathPosition=[];C[h.index]=n[h.wh]/2,C[p.index]="start"===r?M:"end"===r?s-M:s/2,o&&(C[0]+=o[0],C[1]+=o[1]);var T=c.bundlePosition=[];T[h.index]=n[h.xy],T[p.index]=n[p.xy];var D=c.barRectShape=wt({},n);D[p.wh]=f*Math.max(Math.abs(n[p.wh]),Math.abs(C[p.index]+M)),D[h.wh]=n[h.wh];var L=c.clipShape={};L[h.xy]=-n[h.xy],L[h.wh]=d.ecSize[h.wh],L[p.xy]=0,L[p.wh]=n[p.wh]}(n,h,i,o,0,p,l,c.valueLineWidth,c.boundingLength,c.repeatCutLength,a,c),c}function tc(t,e){return t.toGlobalCoord(t.dataToCoord(t.scale.parse(e)))}function ec(t){var e=t.symbolPatternSize,n=Je(t.symbolType,-e/2,-e/2,e,e);return n.attr({culling:!0}),"image"!==n.type&&n.setStyle({strokeNoScale:!0}),n}function nc(t,e,n,a){var i=t.__pictorialBundle,o=n.symbolSize,r=n.valueLineWidth,l=n.pathPosition,s=e.valueDim,u=n.repeatTimes||0,d=0,c=o[e.valueDim.index]+r+2*n.symbolMargin;for(hc(t,function(t){t.__pictorialAnimationIndex=d,t.__pictorialRepeatTimes=u,d0:a<0)&&(i=u-1-t),e[s.index]=c*(i-u/2+.5)+l[s.index],{x:e[0],y:e[1],scaleX:n.symbolScale[0],scaleY:n.symbolScale[1],rotation:n.rotation}}}function ac(t,e,n,a){var i=t.__pictorialBundle,o=t.__pictorialMainPath;o?pc(o,null,{x:n.pathPosition[0],y:n.pathPosition[1],scaleX:n.symbolScale[0],scaleY:n.symbolScale[1],rotation:n.rotation},n,a):(o=t.__pictorialMainPath=ec(n),i.add(o),pc(o,{x:n.pathPosition[0],y:n.pathPosition[1],scaleX:0,scaleY:0,rotation:n.rotation},{scaleX:n.symbolScale[0],scaleY:n.symbolScale[1]},n,a))}function ic(t,e,n){var a=wt({},e.barRectShape),i=t.__pictorialBarRect;i?pc(i,null,{shape:a},e,n):((i=t.__pictorialBarRect=new oe({z2:2,shape:a,silent:!0,style:{stroke:"transparent",fill:"transparent",lineWidth:0}})).disableMorphing=!0,t.add(i))}function oc(t,e,n,a){if(n.symbolClip){var i=t.__pictorialClipPath,o=wt({},n.clipShape),r=e.valueDim,l=n.animationModel,s=n.dataIndex;if(i)tt(i,{shape:o},l,s);else{o[r.wh]=0,i=new oe({shape:o}),t.__pictorialBundle.setClipPath(i),t.__pictorialClipPath=i;var u={};u[r.wh]=n.clipShape[r.wh],zn[a?"updateProps":"initProps"](i,{shape:u},l,s)}}}function rc(t,e){var n=t.getItemModel(e);return n.getAnimationDelayParams=lc,n.isAnimationEnabled=sc,n}function lc(t){return{index:t.__pictorialAnimationIndex,count:t.__pictorialRepeatTimes}}function sc(){return this.parentModel.isAnimationEnabled()&&!!this.getShallow("animation")}function uc(t,e,n,a){var i=new at,o=new at;return i.add(o),i.__pictorialBundle=o,o.x=n.bundlePosition[0],o.y=n.bundlePosition[1],n.symbolRepeat?nc(i,e,n):ac(i,0,n),ic(i,n,a),oc(i,e,n,a),i.__pictorialShapeStr=cc(t,n),i.__pictorialSymbolMeta=n,i}function dc(t,e,n,a){var i=a.__pictorialBarRect;i&&i.removeTextContent();var o=[];hc(a,function(t){o.push(t)}),a.__pictorialMainPath&&o.push(a.__pictorialMainPath),a.__pictorialClipPath&&(n=null),G(o,function(t){ft(t,{scaleX:0,scaleY:0},n,e,function(){a.parent&&a.parent.remove(a)})}),t.setItemGraphicEl(e,null)}function cc(t,e){return[t.getItemVisual(e.dataIndex,"symbol")||"none",!!e.symbolRepeat,!!e.symbolClip].join(":")}function hc(t,e,n){G(t.__pictorialBundle.children(),function(a){a!==t.__pictorialBarRect&&e.call(n,a)})}function pc(t,e,n,a,i,o){e&&t.attr(e),a.symbolClip&&!i?n&&t.attr(n):n&&zn[i?"updateProps":"initProps"](t,n,a.animationModel,a.dataIndex,o)}function fc(t,e,n){var a=n.dataIndex,i=n.itemModel,o=i.getModel("emphasis"),r=o.getModel("itemStyle").getItemStyle(),l=i.getModel(["blur","itemStyle"]).getItemStyle(),s=i.getModel(["select","itemStyle"]).getItemStyle(),u=i.getShallow("cursor"),d=o.get("focus"),c=o.get("blurScope"),h=o.get("scale");hc(t,function(t){if(t instanceof Qe){var e=t.style;t.useStyle(wt({image:e.image,x:e.x,y:e.y,width:e.width,height:e.height},n.style))}else t.useStyle(n.style);var a=t.ensureState("emphasis");a.style=r,h&&(a.scaleX=1.1*t.scaleX,a.scaleY=1.1*t.scaleY),t.ensureState("blur").style=l,t.ensureState("select").style=s,u&&(t.cursor=u),t.z2=n.z2});var p=e.valueDim.posDesc[+(n.boundingLength>0)],f=t.__pictorialBarRect;f.ignoreClip=!0,ee(f,ne(i),{labelFetcher:e.seriesModel,labelDataIndex:a,defaultText:ta(e.seriesModel.getData(),a),inheritColor:n.style.fill,defaultOpacity:n.style.opacity,defaultOutsidePosition:p}),Yt(t,d,c,o.get("disabled"))}function gc(t){var e=Math.round(t);return Math.abs(t-e)<1e-4?e:Math.ceil(t)}var vc=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.hasSymbolVisual=!0,n.defaultSymbol="roundRect",n}return nt(e,t),e.prototype.getInitialData=function(e){return e.stack=null,t.prototype.getInitialData.apply(this,arguments)},e.type="series.pictorialBar",e.dependencies=["grid"],e.defaultOption=aa(ia.defaultOption,{symbol:"circle",symbolSize:null,symbolRotate:null,symbolPosition:null,symbolOffset:null,symbolMargin:null,symbolRepeat:!1,symbolRepeatDirection:"end",symbolClip:!1,symbolBoundingData:null,symbolPatternSize:400,barGap:"-100%",clip:!1,progressive:0,emphasis:{scale:!1},select:{itemStyle:{borderColor:ut.color.primary}}}),e}(ia);var yc=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n._layers=[],n}return nt(e,t),e.prototype.render=function(t,e,n){var a=t.getData(),i=this,o=this.group,r=t.getLayerSeries(),l=a.getLayout("layoutInfo"),s=l.rect,u=l.boundaryGap;function d(t){return t.name}o.x=0,o.y=s.y+u[0];var c=new Ut(this._layersSeries||[],r,d,d),h=[];function p(e,n,l){var s=i._layers;if("remove"!==e){for(var u,d,c=[],p=[],f=r[n].indices,g=0;gt(e,n,void 0,i));else{const n=Object.keys(e);r=new Array(n.length);for(let a=0,o=n.length;avoid 0===e,Td=e=>"boolean"==typeof e,yd=e=>"number"==typeof e,Cd=e=>!e&&0!==e||N(e)&&0===e.length||M(e)&&!Object.keys(e).length,Rd=e=>"undefined"!=typeof Element&&e instanceof Element,Od=e=>fd(e),Nd=e=>e===window;var Ad,Id=Object.defineProperty,wd=Object.defineProperties,Dd=Object.getOwnPropertyDescriptors,xd=Object.getOwnPropertySymbols,Ld=Object.prototype.hasOwnProperty,Md=Object.prototype.propertyIsEnumerable,Pd=(e,t,n)=>t in e?Id(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n;function kd(e,t){const n=qt();var a,r;return Wr(()=>{n.value=e()},(a=((e,t)=>{for(var n in t||(t={}))Ld.call(t,n)&&Pd(e,n,t[n]);if(xd)for(var n of xd(t))Md.call(t,n)&&Pd(e,n,t[n]);return e})({},t),r={flush:null!=void 0?void 0:"sync"},wd(a,Dd(r)))),xt(n)}const Fd="undefined"!=typeof window,Ud=(e,t,n)=>Math.min(n,Math.max(t,e)),Bd=()=>{},Gd=Fd&&(null==(Ad=null==window?void 0:window.navigator)?void 0:Ad.userAgent)&&/iP(ad|hone|od)/.test(window.navigator.userAgent);function Yd(e){return"function"==typeof e?e():Kt(e)}function Vd(e,t){return function(...n){return new Promise((a,r)=>{Promise.resolve(e(()=>t.apply(this,n),{fn:t,thisArg:this,args:n})).then(a).catch(r)})}}function Hd(e){return!!he()&&(ve(e),!0)}function zd(e,t=200,n={}){return Vd(function(e,t={}){let n,a,r=Bd;const i=e=>{clearTimeout(e),r(),r=Bd};return o=>{const s=Yd(e),l=Yd(t.maxWait);return n&&i(n),s<=0||void 0!==l&&l<=0?(a&&(i(a),a=null),Promise.resolve(o())):new Promise((e,c)=>{r=t.rejectOnCancel?c:e,l&&!a&&(a=setTimeout(()=>{n&&i(n),a=null,e(o())},l)),n=setTimeout(()=>{a&&i(a),a=null,e(o())},s)})}}(t,n),e)}function qd(e,t=200,n={}){const a=zt(e.value),r=zd(()=>{a.value=e.value},t,n);return Kr(e,()=>r()),a}function $d(e,t=200,n=!1,a=!0,r=!1){return Vd(function(e,t=!0,n=!0,a=!1){let r,i,o=0,s=!0,l=Bd;const c=()=>{r&&(clearTimeout(r),r=void 0,l(),l=Bd)};return d=>{const u=Yd(e),_=Date.now()-o,p=()=>i=d();return c(),u<=0?(o=Date.now(),p()):(_>u&&(n||!s)?(o=Date.now(),p()):t&&(i=new Promise((e,t)=>{l=a?t:e,r=setTimeout(()=>{o=Date.now(),s=!0,e(p()),c()},Math.max(0,u-_))})),n||r||(r=setTimeout(()=>s=!0,u)),s=!1,i)}}(t,n,a,r),e)}function jd(e,t=!0){Yi()?wa(e):t?e():Tn(e)}function Wd(e,t,n={}){const{immediate:a=!0}=n,r=zt(!1);let i=null;function o(){i&&(clearTimeout(i),i=null)}function s(){r.value=!1,o()}function l(...n){o(),r.value=!0,i=setTimeout(()=>{r.value=!1,i=null,e(...n)},Yd(t))}return a&&(r.value=!0,Fd&&l()),Hd(s),{isPending:xt(r),start:l,stop:s}}function Kd(e){var t;const n=Yd(e);return null!=(t=null==n?void 0:n.$el)?t:n}const Qd=Fd?window:void 0,Xd=Fd?window.document:void 0;function Zd(...e){let t,n,a,r;if("string"==typeof e[0]||Array.isArray(e[0])?([n,a,r]=e,t=Qd):[t,n,a,r]=e,!t)return Bd;Array.isArray(n)||(n=[n]),Array.isArray(a)||(a=[a]);const i=[],o=()=>{i.forEach(e=>e()),i.length=0},s=Kr(()=>[Kd(t),Yd(r)],([e,t])=>{o(),e&&i.push(...n.flatMap(n=>a.map(a=>((e,t,n,a)=>(e.addEventListener(t,n,a),()=>e.removeEventListener(t,n,a)))(e,n,a,t))))},{immediate:!0,flush:"post"}),l=()=>{s(),o()};return Hd(l),l}let Jd=!1;function eu(e,t,n={}){const{window:a=Qd,ignore:r=[],capture:i=!0,detectIframe:o=!1}=n;if(!a)return;Gd&&!Jd&&(Jd=!0,Array.from(a.document.body.children).forEach(e=>e.addEventListener("click",Bd)));let s=!0;const l=e=>r.some(t=>{if("string"==typeof t)return Array.from(a.document.querySelectorAll(t)).some(t=>t===e.target||e.composedPath().includes(t));{const n=Kd(t);return n&&(e.target===n||e.composedPath().includes(n))}}),c=[Zd(a,"click",n=>{const a=Kd(e);a&&a!==n.target&&!n.composedPath().includes(a)&&(0===n.detail&&(s=!l(n)),s?t(n):s=!0)},{passive:!0,capture:i}),Zd(a,"pointerdown",t=>{const n=Kd(e);n&&(s=!t.composedPath().includes(n)&&!l(t))},{passive:!0}),o&&Zd(a,"blur",n=>{var r;const i=Kd(e);"IFRAME"!==(null==(r=a.document.activeElement)?void 0:r.tagName)||(null==i?void 0:i.contains(a.document.activeElement))||t(n)})].filter(Boolean);return()=>c.forEach(e=>e())}function tu(e,t=!1){const n=zt(),a=()=>n.value=Boolean(e());return a(),jd(a,t),n}const nu="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{},au="__vueuse_ssr_handlers__";function ru(e,t,{window:n=Qd,initialValue:a=""}={}){const r=zt(a),i=eo(()=>{var e;return Kd(t)||(null==(e=null==n?void 0:n.document)?void 0:e.documentElement)});return Kr([i,()=>Yd(e)],([e,t])=>{var i;if(e&&n){const o=null==(i=n.getComputedStyle(e).getPropertyValue(t))?void 0:i.trim();r.value=o||a}},{immediate:!0}),Kr(r,t=>{var n;(null==(n=i.value)?void 0:n.style)&&i.value.style.setProperty(Yd(e),t)}),r}function iu({document:e=Xd}={}){if(!e)return zt("visible");const t=zt(e.visibilityState);return Zd(e,"visibilitychange",()=>{t.value=e.visibilityState}),t}nu[au]=nu[au]||{};var ou=Object.getOwnPropertySymbols,su=Object.prototype.hasOwnProperty,lu=Object.prototype.propertyIsEnumerable;function cu(e,t,n={}){const a=n,{window:r=Qd}=a,i=((e,t)=>{var n={};for(var a in e)su.call(e,a)&&t.indexOf(a)<0&&(n[a]=e[a]);if(null!=e&&ou)for(var a of ou(e))t.indexOf(a)<0&&lu.call(e,a)&&(n[a]=e[a]);return n})(a,["window"]);let o;const s=tu(()=>r&&"ResizeObserver"in r),l=()=>{o&&(o.disconnect(),o=void 0)},c=Kr(()=>Kd(e),e=>{l(),s.value&&r&&e&&(o=new ResizeObserver(t),o.observe(e,i))},{immediate:!0,flush:"post"}),d=()=>{l(),c()};return Hd(d),{isSupported:s,stop:d}}function du(e,t={width:0,height:0},n={}){const{window:a=Qd,box:r="content-box"}=n,i=eo(()=>{var t,n;return null==(n=null==(t=Kd(e))?void 0:t.namespaceURI)?void 0:n.includes("svg")}),o=zt(t.width),s=zt(t.height);return cu(e,([t])=>{const n="border-box"===r?t.borderBoxSize:"content-box"===r?t.contentBoxSize:t.devicePixelContentBoxSize;if(a&&i.value){const t=Kd(e);if(t){const e=a.getComputedStyle(t);o.value=parseFloat(e.width),s.value=parseFloat(e.height)}}else if(n){const e=Array.isArray(n)?n:[n];o.value=e.reduce((e,{inlineSize:t})=>e+t,0),s.value=e.reduce((e,{blockSize:t})=>e+t,0)}else o.value=t.contentRect.width,s.value=t.contentRect.height},n),Kr(()=>Kd(e),e=>{o.value=e?t.width:0,s.value=e?t.height:0}),{width:o,height:s}}function uu(e,t,n={}){const{root:a,rootMargin:r="0px",threshold:i=.1,window:o=Qd}=n,s=tu(()=>o&&"IntersectionObserver"in o);let l=Bd;const c=s.value?Kr(()=>({el:Kd(e),root:Kd(a)}),({el:e,root:n})=>{if(l(),!e)return;const a=new IntersectionObserver(t,{root:n,rootMargin:r,threshold:i});a.observe(e),l=()=>{a.disconnect(),l=Bd}},{immediate:!0,flush:"post"}):Bd,d=()=>{l(),c()};return Hd(d),{isSupported:s,stop:d}}var _u,pu,mu=Object.getOwnPropertySymbols,gu=Object.prototype.hasOwnProperty,Eu=Object.prototype.propertyIsEnumerable;function fu(e,t,n={}){const a=n,{window:r=Qd}=a,i=((e,t)=>{var n={};for(var a in e)gu.call(e,a)&&t.indexOf(a)<0&&(n[a]=e[a]);if(null!=e&&mu)for(var a of mu(e))t.indexOf(a)<0&&Eu.call(e,a)&&(n[a]=e[a]);return n})(a,["window"]);let o;const s=tu(()=>r&&"MutationObserver"in r),l=()=>{o&&(o.disconnect(),o=void 0)},c=Kr(()=>Kd(e),e=>{l(),s.value&&r&&e&&(o=new MutationObserver(t),o.observe(e,i))},{immediate:!0}),d=()=>{l(),c()};return Hd(d),{isSupported:s,stop:d}}(pu=_u||(_u={})).UP="UP",pu.RIGHT="RIGHT",pu.DOWN="DOWN",pu.LEFT="LEFT",pu.NONE="NONE";var Su=Object.defineProperty,bu=Object.getOwnPropertySymbols,hu=Object.prototype.hasOwnProperty,vu=Object.prototype.propertyIsEnumerable,Tu=(e,t,n)=>t in e?Su(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n;function yu(e,t,n,a={}){var r,i,o;const{clone:s=!1,passive:l=!1,eventName:c,deep:d=!1,defaultValue:u}=a,_=Yi(),p=(null==_?void 0:_.emit)||(null==(r=null==_?void 0:_.$emit)?void 0:r.bind(_))||(null==(o=null==(i=null==_?void 0:_.proxy)?void 0:i.$emit)?void 0:o.bind(null==_?void 0:_.proxy));let m=c;m=c||m||`update:${t.toString()}`;const g=e=>{return s?(e=>"function"==typeof e)(s)?s(e):(t=e,JSON.parse(JSON.stringify(t))):e;var t},E=()=>void 0!==e[t]?g(e[t]):u;if(l){const n=zt(E());return Kr(()=>e[t],e=>n.value=g(e)),Kr(n,n=>{(n!==e[t]||d)&&p(m,n)},{deep:d}),n}return eo({get:()=>E(),set(e){p(m,e)}})}function Cu({window:e=Qd}={}){if(!e)return zt(!1);const t=zt(e.document.hasFocus());return Zd(e,"blur",()=>{t.value=!1}),Zd(e,"focus",()=>{t.value=!0}),t}function Ru(e={}){const{window:t=Qd,initialWidth:n=1/0,initialHeight:a=1/0,listenOrientation:r=!0,includeScrollbar:i=!0}=e,o=zt(n),s=zt(a),l=()=>{t&&(i?(o.value=t.innerWidth,s.value=t.innerHeight):(o.value=t.document.documentElement.clientWidth,s.value=t.document.documentElement.clientHeight))};return l(),jd(l),Zd("resize",l,{passive:!0}),r&&Zd("orientationchange",l,{passive:!0}),{width:o,height:s}}((e,t)=>{for(var n in t||(t={}))hu.call(t,n)&&Tu(e,n,t[n]);if(bu)for(var n of bu(t))vu.call(t,n)&&Tu(e,n,t[n])})({linear:function(e){return e}},{easeInSine:[.12,0,.39,0],easeOutSine:[.61,1,.88,1],easeInOutSine:[.37,0,.63,1],easeInQuad:[.11,0,.5,0],easeOutQuad:[.5,1,.89,1],easeInOutQuad:[.45,0,.55,1],easeInCubic:[.32,0,.67,0],easeOutCubic:[.33,1,.68,1],easeInOutCubic:[.65,0,.35,1],easeInQuart:[.5,0,.75,0],easeOutQuart:[.25,1,.5,1],easeInOutQuart:[.76,0,.24,1],easeInQuint:[.64,0,.78,0],easeOutQuint:[.22,1,.36,1],easeInOutQuint:[.83,0,.17,1],easeInExpo:[.7,0,.84,0],easeOutExpo:[.16,1,.3,1],easeInOutExpo:[.87,0,.13,1],easeInCirc:[.55,0,1,.45],easeOutCirc:[0,.55,.45,1],easeInOutCirc:[.85,0,.15,1],easeInBack:[.36,0,.66,-.56],easeOutBack:[.34,1.56,.64,1],easeInOutBack:[.68,-.6,.32,1.6]});const Ou={current:0},Nu=zt(0),Au=Symbol("elZIndexContextKey"),Iu=Symbol("zIndexContextKey"),wu=e=>{const t=Yi()?yr(Au,Ou):Ou,n=e||(Yi()?yr(Iu,void 0):void 0),a=eo(()=>{const e=Kt(n);return yd(e)?e:2e3}),r=eo(()=>a.value+Nu.value);return!Fd&&yr(Au),{initialZIndex:a,currentZIndex:r,nextZIndex:()=>(t.current++,Nu.value=t.current,r.value)}};var Du={name:"en",el:{breadcrumb:{label:"Breadcrumb"},colorpicker:{confirm:"OK",clear:"Clear",defaultLabel:"color picker",description:"current color is {color}. press enter to select a new color.",alphaLabel:"pick alpha value"},datepicker:{now:"Now",today:"Today",cancel:"Cancel",clear:"Clear",confirm:"OK",dateTablePrompt:"Use the arrow keys and enter to select the day of the month",monthTablePrompt:"Use the arrow keys and enter to select the month",yearTablePrompt:"Use the arrow keys and enter to select the year",selectedDate:"Selected date",selectDate:"Select date",selectTime:"Select time",startDate:"Start Date",startTime:"Start Time",endDate:"End Date",endTime:"End Time",prevYear:"Previous Year",nextYear:"Next Year",prevMonth:"Previous Month",nextMonth:"Next Month",year:"",month1:"January",month2:"February",month3:"March",month4:"April",month5:"May",month6:"June",month7:"July",month8:"August",month9:"September",month10:"October",month11:"November",month12:"December",weeks:{sun:"Sun",mon:"Mon",tue:"Tue",wed:"Wed",thu:"Thu",fri:"Fri",sat:"Sat"},weeksFull:{sun:"Sunday",mon:"Monday",tue:"Tuesday",wed:"Wednesday",thu:"Thursday",fri:"Friday",sat:"Saturday"},months:{jan:"Jan",feb:"Feb",mar:"Mar",apr:"Apr",may:"May",jun:"Jun",jul:"Jul",aug:"Aug",sep:"Sep",oct:"Oct",nov:"Nov",dec:"Dec"}},inputNumber:{decrease:"decrease number",increase:"increase number"},select:{loading:"Loading",noMatch:"No matching data",noData:"No data",placeholder:"Select"},mention:{loading:"Loading"},dropdown:{toggleDropdown:"Toggle Dropdown"},cascader:{noMatch:"No matching data",loading:"Loading",placeholder:"Select",noData:"No data"},pagination:{goto:"Go to",pagesize:"/page",total:"Total {total}",pageClassifier:"",page:"Page",prev:"Go to previous page",next:"Go to next page",currentPage:"page {pager}",prevPages:"Previous {pager} pages",nextPages:"Next {pager} pages",deprecationWarning:"Deprecated usages detected, please refer to the el-pagination documentation for more details"},dialog:{close:"Close this dialog"},drawer:{close:"Close this dialog"},messagebox:{title:"Message",confirm:"OK",cancel:"Cancel",error:"Illegal input",close:"Close this dialog"},upload:{deleteTip:"press delete to remove",delete:"Delete",preview:"Preview",continue:"Continue"},slider:{defaultLabel:"slider between {min} and {max}",defaultRangeStartLabel:"pick start value",defaultRangeEndLabel:"pick end value"},table:{emptyText:"No Data",confirmFilter:"Confirm",resetFilter:"Reset",clearFilter:"All",sumText:"Sum"},tour:{next:"Next",previous:"Previous",finish:"Finish",close:"Close this dialog"},tree:{emptyText:"No Data"},transfer:{noMatch:"No matching data",noData:"No data",titles:["List 1","List 2"],filterPlaceholder:"Enter keyword",noCheckedFormat:"{total} items",hasCheckedFormat:"{checked}/{total} checked"},image:{error:"FAILED"},pageHeader:{title:"Back"},popconfirm:{confirmButtonText:"Yes",cancelButtonText:"No"},carousel:{leftArrow:"Carousel arrow left",rightArrow:"Carousel arrow right",indicator:"Carousel switch to index {index}"}}};const xu=e=>(t,n)=>Lu(t,n,Kt(e)),Lu=(e,t,n)=>yc(n,e,e).replace(/\{(\w+)\}/g,(e,n)=>{var a;return`${null!=(a=null==t?void 0:t[n])?a:`{${n}}`}`}),Mu=Symbol("localeContextKey"),Pu=e=>{const t=e||yr(Mu,zt());return(e=>({lang:eo(()=>Kt(e).name),locale:Ht(e)?e:zt(e),t:xu(e)}))(eo(()=>t.value||Du))},ku="__epPropKey",Fu=e=>e,Uu=(e,t)=>{if(!M(e)||M(n=e)&&n[ku])return e;var n;const{values:a,required:r,default:i,type:o,validator:s}=e,l=a||s?n=>{let r=!1,o=[];if(a&&(o=Array.from(a),O(e,"default")&&o.push(i),r||(r=o.includes(n))),s&&(r||(r=s(n))),!r&&o.length>0){const e=[...new Set(o)].map(e=>JSON.stringify(e)).join(", ");ao(`Invalid prop: validation failed${t?` for prop "${t}"`:""}. Expected one of [${e}], got value ${JSON.stringify(n)}.`)}return r}:void 0,c={type:o,required:!!r,validator:l,[ku]:!0};return O(e,"default")&&(c.default=i),c},Bu=e=>gd(Object.entries(e).map(([e,t])=>[e,Uu(t,e)])),Gu=["","default","small","large"],Yu=Uu({type:String,values:Gu,required:!1}),Vu=Symbol("size"),Hu=()=>{const e=yr(Vu,{});return eo(()=>Kt(e.size)||"")},zu=Symbol("emptyValuesContextKey"),qu=["",void 0,null],$u=Bu({emptyValues:Array,valueOnClear:{type:[String,Number,Boolean,Function],default:void 0,validator:e=>(e=D(e)?e():e,N(e)?e.every(e=>!e):!e)}}),ju=(e,t)=>{const n=Yi()?yr(zu,zt({})):zt({}),a=eo(()=>e.emptyValues||n.value.emptyValues||qu),r=eo(()=>D(e.valueOnClear)?e.valueOnClear():void 0!==e.valueOnClear?e.valueOnClear:D(n.value.valueOnClear)?n.value.valueOnClear():void 0!==n.value.valueOnClear?n.value.valueOnClear:void 0!==t?t:undefined),i=e=>{let t=!0;return t=N(e)?a.value.some(t=>Ed(e,t)):a.value.includes(e),t};return i(r.value),{emptyValues:a,valueOnClear:r,isEmptyValue:i}},Wu=e=>Object.keys(e),Ku=e=>Object.entries(e),Qu=(e,t,n)=>({get value(){return yc(e,t,n)},set value(n){!function(e,t,n){null==e||Sd(e,t,n)}(e,t,n)}}),Xu=zt();function Zu(e,t=void 0){const n=Yi()?yr(As,Xu):Xu;return e?eo(()=>{var a,r;return null!=(r=null==(a=n.value)?void 0:a[e])?r:t}):n}function Ju(e,t){const n=Zu(),a=Ls(e,eo(()=>{var e;return(null==(e=n.value)?void 0:e.namespace)||Is})),r=Pu(eo(()=>{var e;return null==(e=n.value)?void 0:e.locale})),i=wu(eo(()=>{var e;return(null==(e=n.value)?void 0:e.zIndex)||2e3})),o=eo(()=>{var e;return Kt(t)||(null==(e=n.value)?void 0:e.size)||""});return e_(eo(()=>Kt(n)||{})),{ns:a,locale:r,zIndex:i,size:o}}const e_=(e,t,n=!1)=>{const a=!!Yi(),r=a?Zu():void 0,i=null!=void 0?undefined:a?Tr:void 0;if(!i)return;const o=eo(()=>{const t=Kt(e);return(null==r?void 0:r.value)?t_(r.value,t):t});return i(As,o),i(Mu,eo(()=>o.value.locale)),i(Ds,eo(()=>o.value.namespace)),i(Iu,eo(()=>o.value.zIndex)),i(Vu,{size:eo(()=>o.value.size||"")}),i(zu,eo(()=>({emptyValues:o.value.emptyValues,valueOnClear:o.value.valueOnClear}))),!n&&Xu.value||(Xu.value=o.value),o},t_=(e,t)=>{const n=[...new Set([...Wu(e),...Wu(t)])],a={};for(const r of n)a[r]=void 0!==t[r]?t[r]:e[r];return a},n_="update:modelValue",a_="change",r_="input";var i_=(e,t)=>{const n=e.__vccOpts||e;for(const[a,r]of t)n[a]=r;return n};const o_=(e="")=>e.split(" ").filter(e=>!!e.trim()),s_=(e,t)=>{if(!e||!t)return!1;if(t.includes(" "))throw new Error("className should not contain space.");return e.classList.contains(t)},l_=(e,t)=>{e&&t.trim()&&e.classList.add(...o_(t))},c_=(e,t)=>{e&&t.trim()&&e.classList.remove(...o_(t))},d_=(e,t)=>{var n;if(!Fd||!e||!t)return"";let a=H(t);"float"===a&&(a="cssFloat");try{const t=e.style[a];if(t)return t;const r=null==(n=document.defaultView)?void 0:n.getComputedStyle(e,"");return r?r[a]:""}catch(vk){return e.style[a]}},u_=(e,t,n)=>{if(e&&t)if(M(t))Ku(t).forEach(([t,n])=>u_(e,t,n));else{const a=H(t);e.style[a]=n}};function __(e,t="px"){return e?yd(e)||x(n=e)&&!Number.isNaN(Number(n))?`${e}${t}`:x(e)?e:void 0:"";var n}const p_=(e,t)=>{if(!Fd)return!1;const n={undefined:"overflow",true:"overflow-y",false:"overflow-x"}[String(t)],a=d_(e,n);return["scroll","auto","overlay"].some(e=>a.includes(e))},m_=(e,t)=>{if(!Fd)return;let n=e;for(;n;){if([window,document,document.documentElement].includes(n))return window;if(p_(n,t))return n;n=n.parentNode}return n};let g_;function E_(e,t){if(!Fd)return;if(!t)return void(e.scrollTop=0);const n=[];let a=t.offsetParent;for(;null!==a&&e!==a&&e.contains(a);)n.push(a),a=a.offsetParent;const r=t.offsetTop+n.reduce((e,t)=>e+t.offsetTop,0),i=r+t.offsetHeight,o=e.scrollTop,s=o+e.clientHeight;r