ys 6 months ago
commit
b762ceaa82

+ 24 - 0
exgame/.gitignore

@@ -0,0 +1,24 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+dist
+dist-ssr
+*.local
+
+# Editor directories and files
+.vscode/*
+!.vscode/extensions.json
+.idea
+.DS_Store
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?

+ 3 - 0
exgame/.vscode/extensions.json

@@ -0,0 +1,3 @@
+{
+  "recommendations": ["Vue.volar"]
+}

+ 93 - 0
exgame/README.md

@@ -0,0 +1,93 @@
+# 🎭 恶搞游戏网站
+
+一个超级烦人但又让人忍不住想看的恶搞体验网站!
+
+## 🎯 最新优化 (v2.0)
+
+### ✅ 用户体验优化:
+- **移除页面离开阻拦**:不再有"检测到你要离开"的烦人提示
+- **优化弹窗系统**:减少弹窗轰炸频率,所有弹窗都可以正常关闭
+- **降低音效骚扰**:减少恼人音效的播放频率
+- **限制弹窗数量**:最多同时显示5个弹窗,避免界面完全被阻塞
+
+### 🎪 保留的恶搞功能:
+- **随机页面重定向**:每次刷新随机跳转到不同恶搞页面
+- **超级恼人的广告弹窗**:各种虚假广告和中奖信息
+- **病毒警告页面**:逼真的系统感染提示
+- **天降大奖页面**:超级花哨的中奖界面
+- **视觉特效轰炸**:彩虹背景、闪烁文字、旋转动画
+
+## 🎮 恶搞页面介绍
+
+### 📺 `/ad` - 广告轰炸页面
+- 持续弹出各种虚假广告
+- 恼人的音效和视觉效果
+- 鼠标陷阱和随机弹窗
+- **优化**:所有弹窗都可关闭,减少轰炸频率
+
+### 🦠 `/virus` - 病毒恐吓页面
+- 逼真的系统感染警告
+- 倒计时和恐吓音效
+- 全屏红色闪烁效果
+- 虚假的病毒扫描界面
+
+### 🎊 `/winning` - 超级大奖页面
+- 999万大奖中奖通知
+- 30秒紧急倒计时
+- 多层恼人弹窗系统
+- **优化**:移除页面失焦检测,减少用户困扰
+
+## 🔧 技术特性
+
+- **Vue 3 + Vite**:现代化前端框架
+- **响应式设计**:完美适配手机和电脑
+- **Web Audio API**:动态生成恼人音效
+- **CSS动画**:丰富的视觉特效
+- **全局路由守卫**:智能随机重定向
+
+## 🚀 运行项目
+
+```bash
+# 安装依赖
+npm install
+
+# 启动开发服务器
+npm run dev
+
+# 构建生产版本
+npm run build
+```
+
+## 🎭 使用说明
+
+1. **访问主页**:自动随机跳转到恶搞页面
+2. **刷新页面**:每次刷新都会跳转到不同页面
+3. **体验恶搞**:享受各种恼人但有趣的特效
+4. **安全退出**:现在可以正常关闭浏览器标签页
+
+## ⚠️ 免责声明
+
+这是一个纯娱乐的恶搞网站,所有内容都是虚假的!
+- 不会真的有病毒感染您的设备
+- 不会真的有999万大奖等您领取
+- 不会真的有任何安全威胁
+
+请勿在此输入任何真实的个人信息!
+
+## 🎉 更新日志
+
+### v2.0 - 用户体验优化
+- 移除了过度恼人的页面离开阻拦
+- 优化了弹窗系统,提升可用性
+- 减少了音效骚扰频率
+- 保持恶搞效果的同时提升用户体验
+
+### v1.0 - 初始版本
+- 基础恶搞功能实现
+- 三个核心恶搞页面
+- 随机重定向系统
+- 视觉和音效特效
+
+---
+
+🎭 **享受这个"恼人至极"的恶搞体验吧!** 😄

+ 13 - 0
exgame/index.html

@@ -0,0 +1,13 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="UTF-8" />
+    <link rel="icon" type="image/svg+xml" href="/vite.svg" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+    <title>Vite + Vue</title>
+  </head>
+  <body>
+    <div id="app"></div>
+    <script type="module" src="/src/main.js"></script>
+  </body>
+</html>

+ 1257 - 0
exgame/package-lock.json

@@ -0,0 +1,1257 @@
+{
+  "name": "exgame",
+  "version": "0.0.0",
+  "lockfileVersion": 3,
+  "requires": true,
+  "packages": {
+    "": {
+      "name": "exgame",
+      "version": "0.0.0",
+      "dependencies": {
+        "animate.css": "^4.1.1",
+        "vue": "^3.5.13",
+        "vue-router": "^4.5.1"
+      },
+      "devDependencies": {
+        "@vitejs/plugin-vue": "^5.2.3",
+        "vite": "^6.3.5"
+      }
+    },
+    "node_modules/@babel/helper-string-parser": {
+      "version": "7.27.1",
+      "resolved": "https://mirrors.cloud.tencent.com/npm/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz",
+      "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-validator-identifier": {
+      "version": "7.27.1",
+      "resolved": "https://mirrors.cloud.tencent.com/npm/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz",
+      "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/parser": {
+      "version": "7.27.5",
+      "resolved": "https://mirrors.cloud.tencent.com/npm/@babel/parser/-/parser-7.27.5.tgz",
+      "integrity": "sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/types": "^7.27.3"
+      },
+      "bin": {
+        "parser": "bin/babel-parser.js"
+      },
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/@babel/types": {
+      "version": "7.27.6",
+      "resolved": "https://mirrors.cloud.tencent.com/npm/@babel/types/-/types-7.27.6.tgz",
+      "integrity": "sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-string-parser": "^7.27.1",
+        "@babel/helper-validator-identifier": "^7.27.1"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@esbuild/aix-ppc64": {
+      "version": "0.25.5",
+      "resolved": "https://mirrors.cloud.tencent.com/npm/@esbuild/aix-ppc64/-/aix-ppc64-0.25.5.tgz",
+      "integrity": "sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==",
+      "cpu": [
+        "ppc64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "aix"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/android-arm": {
+      "version": "0.25.5",
+      "resolved": "https://mirrors.cloud.tencent.com/npm/@esbuild/android-arm/-/android-arm-0.25.5.tgz",
+      "integrity": "sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==",
+      "cpu": [
+        "arm"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/android-arm64": {
+      "version": "0.25.5",
+      "resolved": "https://mirrors.cloud.tencent.com/npm/@esbuild/android-arm64/-/android-arm64-0.25.5.tgz",
+      "integrity": "sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/android-x64": {
+      "version": "0.25.5",
+      "resolved": "https://mirrors.cloud.tencent.com/npm/@esbuild/android-x64/-/android-x64-0.25.5.tgz",
+      "integrity": "sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/darwin-arm64": {
+      "version": "0.25.5",
+      "resolved": "https://mirrors.cloud.tencent.com/npm/@esbuild/darwin-arm64/-/darwin-arm64-0.25.5.tgz",
+      "integrity": "sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/darwin-x64": {
+      "version": "0.25.5",
+      "resolved": "https://mirrors.cloud.tencent.com/npm/@esbuild/darwin-x64/-/darwin-x64-0.25.5.tgz",
+      "integrity": "sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/freebsd-arm64": {
+      "version": "0.25.5",
+      "resolved": "https://mirrors.cloud.tencent.com/npm/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.5.tgz",
+      "integrity": "sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "freebsd"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/freebsd-x64": {
+      "version": "0.25.5",
+      "resolved": "https://mirrors.cloud.tencent.com/npm/@esbuild/freebsd-x64/-/freebsd-x64-0.25.5.tgz",
+      "integrity": "sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "freebsd"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/linux-arm": {
+      "version": "0.25.5",
+      "resolved": "https://mirrors.cloud.tencent.com/npm/@esbuild/linux-arm/-/linux-arm-0.25.5.tgz",
+      "integrity": "sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==",
+      "cpu": [
+        "arm"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/linux-arm64": {
+      "version": "0.25.5",
+      "resolved": "https://mirrors.cloud.tencent.com/npm/@esbuild/linux-arm64/-/linux-arm64-0.25.5.tgz",
+      "integrity": "sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/linux-ia32": {
+      "version": "0.25.5",
+      "resolved": "https://mirrors.cloud.tencent.com/npm/@esbuild/linux-ia32/-/linux-ia32-0.25.5.tgz",
+      "integrity": "sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==",
+      "cpu": [
+        "ia32"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/linux-loong64": {
+      "version": "0.25.5",
+      "resolved": "https://mirrors.cloud.tencent.com/npm/@esbuild/linux-loong64/-/linux-loong64-0.25.5.tgz",
+      "integrity": "sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==",
+      "cpu": [
+        "loong64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/linux-mips64el": {
+      "version": "0.25.5",
+      "resolved": "https://mirrors.cloud.tencent.com/npm/@esbuild/linux-mips64el/-/linux-mips64el-0.25.5.tgz",
+      "integrity": "sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==",
+      "cpu": [
+        "mips64el"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/linux-ppc64": {
+      "version": "0.25.5",
+      "resolved": "https://mirrors.cloud.tencent.com/npm/@esbuild/linux-ppc64/-/linux-ppc64-0.25.5.tgz",
+      "integrity": "sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==",
+      "cpu": [
+        "ppc64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/linux-riscv64": {
+      "version": "0.25.5",
+      "resolved": "https://mirrors.cloud.tencent.com/npm/@esbuild/linux-riscv64/-/linux-riscv64-0.25.5.tgz",
+      "integrity": "sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==",
+      "cpu": [
+        "riscv64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/linux-s390x": {
+      "version": "0.25.5",
+      "resolved": "https://mirrors.cloud.tencent.com/npm/@esbuild/linux-s390x/-/linux-s390x-0.25.5.tgz",
+      "integrity": "sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==",
+      "cpu": [
+        "s390x"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/linux-x64": {
+      "version": "0.25.5",
+      "resolved": "https://mirrors.cloud.tencent.com/npm/@esbuild/linux-x64/-/linux-x64-0.25.5.tgz",
+      "integrity": "sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/netbsd-arm64": {
+      "version": "0.25.5",
+      "resolved": "https://mirrors.cloud.tencent.com/npm/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.5.tgz",
+      "integrity": "sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "netbsd"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/netbsd-x64": {
+      "version": "0.25.5",
+      "resolved": "https://mirrors.cloud.tencent.com/npm/@esbuild/netbsd-x64/-/netbsd-x64-0.25.5.tgz",
+      "integrity": "sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "netbsd"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/openbsd-arm64": {
+      "version": "0.25.5",
+      "resolved": "https://mirrors.cloud.tencent.com/npm/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.5.tgz",
+      "integrity": "sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "openbsd"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/openbsd-x64": {
+      "version": "0.25.5",
+      "resolved": "https://mirrors.cloud.tencent.com/npm/@esbuild/openbsd-x64/-/openbsd-x64-0.25.5.tgz",
+      "integrity": "sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "openbsd"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/sunos-x64": {
+      "version": "0.25.5",
+      "resolved": "https://mirrors.cloud.tencent.com/npm/@esbuild/sunos-x64/-/sunos-x64-0.25.5.tgz",
+      "integrity": "sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "sunos"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/win32-arm64": {
+      "version": "0.25.5",
+      "resolved": "https://mirrors.cloud.tencent.com/npm/@esbuild/win32-arm64/-/win32-arm64-0.25.5.tgz",
+      "integrity": "sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/win32-ia32": {
+      "version": "0.25.5",
+      "resolved": "https://mirrors.cloud.tencent.com/npm/@esbuild/win32-ia32/-/win32-ia32-0.25.5.tgz",
+      "integrity": "sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==",
+      "cpu": [
+        "ia32"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@esbuild/win32-x64": {
+      "version": "0.25.5",
+      "resolved": "https://mirrors.cloud.tencent.com/npm/@esbuild/win32-x64/-/win32-x64-0.25.5.tgz",
+      "integrity": "sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@jridgewell/sourcemap-codec": {
+      "version": "1.5.0",
+      "resolved": "https://mirrors.cloud.tencent.com/npm/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
+      "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==",
+      "license": "MIT"
+    },
+    "node_modules/@rollup/rollup-android-arm-eabi": {
+      "version": "4.44.0",
+      "resolved": "https://mirrors.cloud.tencent.com/npm/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.44.0.tgz",
+      "integrity": "sha512-xEiEE5oDW6tK4jXCAyliuntGR+amEMO7HLtdSshVuhFnKTYoeYMyXQK7pLouAJJj5KHdwdn87bfHAR2nSdNAUA==",
+      "cpu": [
+        "arm"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "android"
+      ]
+    },
+    "node_modules/@rollup/rollup-android-arm64": {
+      "version": "4.44.0",
+      "resolved": "https://mirrors.cloud.tencent.com/npm/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.44.0.tgz",
+      "integrity": "sha512-uNSk/TgvMbskcHxXYHzqwiyBlJ/lGcv8DaUfcnNwict8ba9GTTNxfn3/FAoFZYgkaXXAdrAA+SLyKplyi349Jw==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "android"
+      ]
+    },
+    "node_modules/@rollup/rollup-darwin-arm64": {
+      "version": "4.44.0",
+      "resolved": "https://mirrors.cloud.tencent.com/npm/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.44.0.tgz",
+      "integrity": "sha512-VGF3wy0Eq1gcEIkSCr8Ke03CWT+Pm2yveKLaDvq51pPpZza3JX/ClxXOCmTYYq3us5MvEuNRTaeyFThCKRQhOA==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "darwin"
+      ]
+    },
+    "node_modules/@rollup/rollup-darwin-x64": {
+      "version": "4.44.0",
+      "resolved": "https://mirrors.cloud.tencent.com/npm/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.44.0.tgz",
+      "integrity": "sha512-fBkyrDhwquRvrTxSGH/qqt3/T0w5Rg0L7ZIDypvBPc1/gzjJle6acCpZ36blwuwcKD/u6oCE/sRWlUAcxLWQbQ==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "darwin"
+      ]
+    },
+    "node_modules/@rollup/rollup-freebsd-arm64": {
+      "version": "4.44.0",
+      "resolved": "https://mirrors.cloud.tencent.com/npm/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.44.0.tgz",
+      "integrity": "sha512-u5AZzdQJYJXByB8giQ+r4VyfZP+walV+xHWdaFx/1VxsOn6eWJhK2Vl2eElvDJFKQBo/hcYIBg/jaKS8ZmKeNQ==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "freebsd"
+      ]
+    },
+    "node_modules/@rollup/rollup-freebsd-x64": {
+      "version": "4.44.0",
+      "resolved": "https://mirrors.cloud.tencent.com/npm/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.44.0.tgz",
+      "integrity": "sha512-qC0kS48c/s3EtdArkimctY7h3nHicQeEUdjJzYVJYR3ct3kWSafmn6jkNCA8InbUdge6PVx6keqjk5lVGJf99g==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "freebsd"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
+      "version": "4.44.0",
+      "resolved": "https://mirrors.cloud.tencent.com/npm/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.44.0.tgz",
+      "integrity": "sha512-x+e/Z9H0RAWckn4V2OZZl6EmV0L2diuX3QB0uM1r6BvhUIv6xBPL5mrAX2E3e8N8rEHVPwFfz/ETUbV4oW9+lQ==",
+      "cpu": [
+        "arm"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-arm-musleabihf": {
+      "version": "4.44.0",
+      "resolved": "https://mirrors.cloud.tencent.com/npm/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.44.0.tgz",
+      "integrity": "sha512-1exwiBFf4PU/8HvI8s80icyCcnAIB86MCBdst51fwFmH5dyeoWVPVgmQPcKrMtBQ0W5pAs7jBCWuRXgEpRzSCg==",
+      "cpu": [
+        "arm"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-arm64-gnu": {
+      "version": "4.44.0",
+      "resolved": "https://mirrors.cloud.tencent.com/npm/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.44.0.tgz",
+      "integrity": "sha512-ZTR2mxBHb4tK4wGf9b8SYg0Y6KQPjGpR4UWwTFdnmjB4qRtoATZ5dWn3KsDwGa5Z2ZBOE7K52L36J9LueKBdOQ==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-arm64-musl": {
+      "version": "4.44.0",
+      "resolved": "https://mirrors.cloud.tencent.com/npm/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.44.0.tgz",
+      "integrity": "sha512-GFWfAhVhWGd4r6UxmnKRTBwP1qmModHtd5gkraeW2G490BpFOZkFtem8yuX2NyafIP/mGpRJgTJ2PwohQkUY/Q==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-loongarch64-gnu": {
+      "version": "4.44.0",
+      "resolved": "https://mirrors.cloud.tencent.com/npm/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.44.0.tgz",
+      "integrity": "sha512-xw+FTGcov/ejdusVOqKgMGW3c4+AgqrfvzWEVXcNP6zq2ue+lsYUgJ+5Rtn/OTJf7e2CbgTFvzLW2j0YAtj0Gg==",
+      "cpu": [
+        "loong64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
+      "version": "4.44.0",
+      "resolved": "https://mirrors.cloud.tencent.com/npm/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.44.0.tgz",
+      "integrity": "sha512-bKGibTr9IdF0zr21kMvkZT4K6NV+jjRnBoVMt2uNMG0BYWm3qOVmYnXKzx7UhwrviKnmK46IKMByMgvpdQlyJQ==",
+      "cpu": [
+        "ppc64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-riscv64-gnu": {
+      "version": "4.44.0",
+      "resolved": "https://mirrors.cloud.tencent.com/npm/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.44.0.tgz",
+      "integrity": "sha512-vV3cL48U5kDaKZtXrti12YRa7TyxgKAIDoYdqSIOMOFBXqFj2XbChHAtXquEn2+n78ciFgr4KIqEbydEGPxXgA==",
+      "cpu": [
+        "riscv64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-riscv64-musl": {
+      "version": "4.44.0",
+      "resolved": "https://mirrors.cloud.tencent.com/npm/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.44.0.tgz",
+      "integrity": "sha512-TDKO8KlHJuvTEdfw5YYFBjhFts2TR0VpZsnLLSYmB7AaohJhM8ctDSdDnUGq77hUh4m/djRafw+9zQpkOanE2Q==",
+      "cpu": [
+        "riscv64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-s390x-gnu": {
+      "version": "4.44.0",
+      "resolved": "https://mirrors.cloud.tencent.com/npm/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.44.0.tgz",
+      "integrity": "sha512-8541GEyktXaw4lvnGp9m84KENcxInhAt6vPWJ9RodsB/iGjHoMB2Pp5MVBCiKIRxrxzJhGCxmNzdu+oDQ7kwRA==",
+      "cpu": [
+        "s390x"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-x64-gnu": {
+      "version": "4.44.0",
+      "resolved": "https://mirrors.cloud.tencent.com/npm/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.44.0.tgz",
+      "integrity": "sha512-iUVJc3c0o8l9Sa/qlDL2Z9UP92UZZW1+EmQ4xfjTc1akr0iUFZNfxrXJ/R1T90h/ILm9iXEY6+iPrmYB3pXKjw==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-x64-musl": {
+      "version": "4.44.0",
+      "resolved": "https://mirrors.cloud.tencent.com/npm/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.44.0.tgz",
+      "integrity": "sha512-PQUobbhLTQT5yz/SPg116VJBgz+XOtXt8D1ck+sfJJhuEsMj2jSej5yTdp8CvWBSceu+WW+ibVL6dm0ptG5fcA==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-win32-arm64-msvc": {
+      "version": "4.44.0",
+      "resolved": "https://mirrors.cloud.tencent.com/npm/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.44.0.tgz",
+      "integrity": "sha512-M0CpcHf8TWn+4oTxJfh7LQuTuaYeXGbk0eageVjQCKzYLsajWS/lFC94qlRqOlyC2KvRT90ZrfXULYmukeIy7w==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ]
+    },
+    "node_modules/@rollup/rollup-win32-ia32-msvc": {
+      "version": "4.44.0",
+      "resolved": "https://mirrors.cloud.tencent.com/npm/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.44.0.tgz",
+      "integrity": "sha512-3XJ0NQtMAXTWFW8FqZKcw3gOQwBtVWP/u8TpHP3CRPXD7Pd6s8lLdH3sHWh8vqKCyyiI8xW5ltJScQmBU9j7WA==",
+      "cpu": [
+        "ia32"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ]
+    },
+    "node_modules/@rollup/rollup-win32-x64-msvc": {
+      "version": "4.44.0",
+      "resolved": "https://mirrors.cloud.tencent.com/npm/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.44.0.tgz",
+      "integrity": "sha512-Q2Mgwt+D8hd5FIPUuPDsvPR7Bguza6yTkJxspDGkZj7tBRn2y4KSWYuIXpftFSjBra76TbKerCV7rgFPQrn+wQ==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "win32"
+      ]
+    },
+    "node_modules/@types/estree": {
+      "version": "1.0.8",
+      "resolved": "https://mirrors.cloud.tencent.com/npm/@types/estree/-/estree-1.0.8.tgz",
+      "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/@vitejs/plugin-vue": {
+      "version": "5.2.4",
+      "resolved": "https://mirrors.cloud.tencent.com/npm/@vitejs/plugin-vue/-/plugin-vue-5.2.4.tgz",
+      "integrity": "sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": "^18.0.0 || >=20.0.0"
+      },
+      "peerDependencies": {
+        "vite": "^5.0.0 || ^6.0.0",
+        "vue": "^3.2.25"
+      }
+    },
+    "node_modules/@vue/compiler-core": {
+      "version": "3.5.17",
+      "resolved": "https://mirrors.cloud.tencent.com/npm/@vue/compiler-core/-/compiler-core-3.5.17.tgz",
+      "integrity": "sha512-Xe+AittLbAyV0pabcN7cP7/BenRBNcteM4aSDCtRvGw0d9OL+HG1u/XHLY/kt1q4fyMeZYXyIYrsHuPSiDPosA==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/parser": "^7.27.5",
+        "@vue/shared": "3.5.17",
+        "entities": "^4.5.0",
+        "estree-walker": "^2.0.2",
+        "source-map-js": "^1.2.1"
+      }
+    },
+    "node_modules/@vue/compiler-dom": {
+      "version": "3.5.17",
+      "resolved": "https://mirrors.cloud.tencent.com/npm/@vue/compiler-dom/-/compiler-dom-3.5.17.tgz",
+      "integrity": "sha512-+2UgfLKoaNLhgfhV5Ihnk6wB4ljyW1/7wUIog2puUqajiC29Lp5R/IKDdkebh9jTbTogTbsgB+OY9cEWzG95JQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@vue/compiler-core": "3.5.17",
+        "@vue/shared": "3.5.17"
+      }
+    },
+    "node_modules/@vue/compiler-sfc": {
+      "version": "3.5.17",
+      "resolved": "https://mirrors.cloud.tencent.com/npm/@vue/compiler-sfc/-/compiler-sfc-3.5.17.tgz",
+      "integrity": "sha512-rQQxbRJMgTqwRugtjw0cnyQv9cP4/4BxWfTdRBkqsTfLOHWykLzbOc3C4GGzAmdMDxhzU/1Ija5bTjMVrddqww==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/parser": "^7.27.5",
+        "@vue/compiler-core": "3.5.17",
+        "@vue/compiler-dom": "3.5.17",
+        "@vue/compiler-ssr": "3.5.17",
+        "@vue/shared": "3.5.17",
+        "estree-walker": "^2.0.2",
+        "magic-string": "^0.30.17",
+        "postcss": "^8.5.6",
+        "source-map-js": "^1.2.1"
+      }
+    },
+    "node_modules/@vue/compiler-ssr": {
+      "version": "3.5.17",
+      "resolved": "https://mirrors.cloud.tencent.com/npm/@vue/compiler-ssr/-/compiler-ssr-3.5.17.tgz",
+      "integrity": "sha512-hkDbA0Q20ZzGgpj5uZjb9rBzQtIHLS78mMilwrlpWk2Ep37DYntUz0PonQ6kr113vfOEdM+zTBuJDaceNIW0tQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@vue/compiler-dom": "3.5.17",
+        "@vue/shared": "3.5.17"
+      }
+    },
+    "node_modules/@vue/devtools-api": {
+      "version": "6.6.4",
+      "resolved": "https://mirrors.cloud.tencent.com/npm/@vue/devtools-api/-/devtools-api-6.6.4.tgz",
+      "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==",
+      "license": "MIT"
+    },
+    "node_modules/@vue/reactivity": {
+      "version": "3.5.17",
+      "resolved": "https://mirrors.cloud.tencent.com/npm/@vue/reactivity/-/reactivity-3.5.17.tgz",
+      "integrity": "sha512-l/rmw2STIscWi7SNJp708FK4Kofs97zc/5aEPQh4bOsReD/8ICuBcEmS7KGwDj5ODQLYWVN2lNibKJL1z5b+Lw==",
+      "license": "MIT",
+      "dependencies": {
+        "@vue/shared": "3.5.17"
+      }
+    },
+    "node_modules/@vue/runtime-core": {
+      "version": "3.5.17",
+      "resolved": "https://mirrors.cloud.tencent.com/npm/@vue/runtime-core/-/runtime-core-3.5.17.tgz",
+      "integrity": "sha512-QQLXa20dHg1R0ri4bjKeGFKEkJA7MMBxrKo2G+gJikmumRS7PTD4BOU9FKrDQWMKowz7frJJGqBffYMgQYS96Q==",
+      "license": "MIT",
+      "dependencies": {
+        "@vue/reactivity": "3.5.17",
+        "@vue/shared": "3.5.17"
+      }
+    },
+    "node_modules/@vue/runtime-dom": {
+      "version": "3.5.17",
+      "resolved": "https://mirrors.cloud.tencent.com/npm/@vue/runtime-dom/-/runtime-dom-3.5.17.tgz",
+      "integrity": "sha512-8El0M60TcwZ1QMz4/os2MdlQECgGoVHPuLnQBU3m9h3gdNRW9xRmI8iLS4t/22OQlOE6aJvNNlBiCzPHur4H9g==",
+      "license": "MIT",
+      "dependencies": {
+        "@vue/reactivity": "3.5.17",
+        "@vue/runtime-core": "3.5.17",
+        "@vue/shared": "3.5.17",
+        "csstype": "^3.1.3"
+      }
+    },
+    "node_modules/@vue/server-renderer": {
+      "version": "3.5.17",
+      "resolved": "https://mirrors.cloud.tencent.com/npm/@vue/server-renderer/-/server-renderer-3.5.17.tgz",
+      "integrity": "sha512-BOHhm8HalujY6lmC3DbqF6uXN/K00uWiEeF22LfEsm9Q93XeJ/plHTepGwf6tqFcF7GA5oGSSAAUock3VvzaCA==",
+      "license": "MIT",
+      "dependencies": {
+        "@vue/compiler-ssr": "3.5.17",
+        "@vue/shared": "3.5.17"
+      },
+      "peerDependencies": {
+        "vue": "3.5.17"
+      }
+    },
+    "node_modules/@vue/shared": {
+      "version": "3.5.17",
+      "resolved": "https://mirrors.cloud.tencent.com/npm/@vue/shared/-/shared-3.5.17.tgz",
+      "integrity": "sha512-CabR+UN630VnsJO/jHWYBC1YVXyMq94KKp6iF5MQgZJs5I8cmjw6oVMO1oDbtBkENSHSSn/UadWlW/OAgdmKrg==",
+      "license": "MIT"
+    },
+    "node_modules/animate.css": {
+      "version": "4.1.1",
+      "resolved": "https://mirrors.cloud.tencent.com/npm/animate.css/-/animate.css-4.1.1.tgz",
+      "integrity": "sha512-+mRmCTv6SbCmtYJCN4faJMNFVNN5EuCTTprDTAo7YzIGji2KADmakjVA3+8mVDkZ2Bf09vayB35lSQIex2+QaQ==",
+      "license": "MIT"
+    },
+    "node_modules/csstype": {
+      "version": "3.1.3",
+      "resolved": "https://mirrors.cloud.tencent.com/npm/csstype/-/csstype-3.1.3.tgz",
+      "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
+      "license": "MIT"
+    },
+    "node_modules/entities": {
+      "version": "4.5.0",
+      "resolved": "https://mirrors.cloud.tencent.com/npm/entities/-/entities-4.5.0.tgz",
+      "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
+      "license": "BSD-2-Clause",
+      "engines": {
+        "node": ">=0.12"
+      },
+      "funding": {
+        "url": "https://github.com/fb55/entities?sponsor=1"
+      }
+    },
+    "node_modules/esbuild": {
+      "version": "0.25.5",
+      "resolved": "https://mirrors.cloud.tencent.com/npm/esbuild/-/esbuild-0.25.5.tgz",
+      "integrity": "sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==",
+      "dev": true,
+      "hasInstallScript": true,
+      "license": "MIT",
+      "bin": {
+        "esbuild": "bin/esbuild"
+      },
+      "engines": {
+        "node": ">=18"
+      },
+      "optionalDependencies": {
+        "@esbuild/aix-ppc64": "0.25.5",
+        "@esbuild/android-arm": "0.25.5",
+        "@esbuild/android-arm64": "0.25.5",
+        "@esbuild/android-x64": "0.25.5",
+        "@esbuild/darwin-arm64": "0.25.5",
+        "@esbuild/darwin-x64": "0.25.5",
+        "@esbuild/freebsd-arm64": "0.25.5",
+        "@esbuild/freebsd-x64": "0.25.5",
+        "@esbuild/linux-arm": "0.25.5",
+        "@esbuild/linux-arm64": "0.25.5",
+        "@esbuild/linux-ia32": "0.25.5",
+        "@esbuild/linux-loong64": "0.25.5",
+        "@esbuild/linux-mips64el": "0.25.5",
+        "@esbuild/linux-ppc64": "0.25.5",
+        "@esbuild/linux-riscv64": "0.25.5",
+        "@esbuild/linux-s390x": "0.25.5",
+        "@esbuild/linux-x64": "0.25.5",
+        "@esbuild/netbsd-arm64": "0.25.5",
+        "@esbuild/netbsd-x64": "0.25.5",
+        "@esbuild/openbsd-arm64": "0.25.5",
+        "@esbuild/openbsd-x64": "0.25.5",
+        "@esbuild/sunos-x64": "0.25.5",
+        "@esbuild/win32-arm64": "0.25.5",
+        "@esbuild/win32-ia32": "0.25.5",
+        "@esbuild/win32-x64": "0.25.5"
+      }
+    },
+    "node_modules/estree-walker": {
+      "version": "2.0.2",
+      "resolved": "https://mirrors.cloud.tencent.com/npm/estree-walker/-/estree-walker-2.0.2.tgz",
+      "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
+      "license": "MIT"
+    },
+    "node_modules/fdir": {
+      "version": "6.4.6",
+      "resolved": "https://mirrors.cloud.tencent.com/npm/fdir/-/fdir-6.4.6.tgz",
+      "integrity": "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==",
+      "dev": true,
+      "license": "MIT",
+      "peerDependencies": {
+        "picomatch": "^3 || ^4"
+      },
+      "peerDependenciesMeta": {
+        "picomatch": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/fsevents": {
+      "version": "2.3.3",
+      "resolved": "https://mirrors.cloud.tencent.com/npm/fsevents/-/fsevents-2.3.3.tgz",
+      "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+      "dev": true,
+      "hasInstallScript": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+      }
+    },
+    "node_modules/magic-string": {
+      "version": "0.30.17",
+      "resolved": "https://mirrors.cloud.tencent.com/npm/magic-string/-/magic-string-0.30.17.tgz",
+      "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==",
+      "license": "MIT",
+      "dependencies": {
+        "@jridgewell/sourcemap-codec": "^1.5.0"
+      }
+    },
+    "node_modules/nanoid": {
+      "version": "3.3.11",
+      "resolved": "https://mirrors.cloud.tencent.com/npm/nanoid/-/nanoid-3.3.11.tgz",
+      "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/ai"
+        }
+      ],
+      "license": "MIT",
+      "bin": {
+        "nanoid": "bin/nanoid.cjs"
+      },
+      "engines": {
+        "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+      }
+    },
+    "node_modules/picocolors": {
+      "version": "1.1.1",
+      "resolved": "https://mirrors.cloud.tencent.com/npm/picocolors/-/picocolors-1.1.1.tgz",
+      "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+      "license": "ISC"
+    },
+    "node_modules/picomatch": {
+      "version": "4.0.2",
+      "resolved": "https://mirrors.cloud.tencent.com/npm/picomatch/-/picomatch-4.0.2.tgz",
+      "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/jonschlinkert"
+      }
+    },
+    "node_modules/postcss": {
+      "version": "8.5.6",
+      "resolved": "https://mirrors.cloud.tencent.com/npm/postcss/-/postcss-8.5.6.tgz",
+      "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==",
+      "funding": [
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/postcss/"
+        },
+        {
+          "type": "tidelift",
+          "url": "https://tidelift.com/funding/github/npm/postcss"
+        },
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/ai"
+        }
+      ],
+      "license": "MIT",
+      "dependencies": {
+        "nanoid": "^3.3.11",
+        "picocolors": "^1.1.1",
+        "source-map-js": "^1.2.1"
+      },
+      "engines": {
+        "node": "^10 || ^12 || >=14"
+      }
+    },
+    "node_modules/rollup": {
+      "version": "4.44.0",
+      "resolved": "https://mirrors.cloud.tencent.com/npm/rollup/-/rollup-4.44.0.tgz",
+      "integrity": "sha512-qHcdEzLCiktQIfwBq420pn2dP+30uzqYxv9ETm91wdt2R9AFcWfjNAmje4NWlnCIQ5RMTzVf0ZyisOKqHR6RwA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@types/estree": "1.0.8"
+      },
+      "bin": {
+        "rollup": "dist/bin/rollup"
+      },
+      "engines": {
+        "node": ">=18.0.0",
+        "npm": ">=8.0.0"
+      },
+      "optionalDependencies": {
+        "@rollup/rollup-android-arm-eabi": "4.44.0",
+        "@rollup/rollup-android-arm64": "4.44.0",
+        "@rollup/rollup-darwin-arm64": "4.44.0",
+        "@rollup/rollup-darwin-x64": "4.44.0",
+        "@rollup/rollup-freebsd-arm64": "4.44.0",
+        "@rollup/rollup-freebsd-x64": "4.44.0",
+        "@rollup/rollup-linux-arm-gnueabihf": "4.44.0",
+        "@rollup/rollup-linux-arm-musleabihf": "4.44.0",
+        "@rollup/rollup-linux-arm64-gnu": "4.44.0",
+        "@rollup/rollup-linux-arm64-musl": "4.44.0",
+        "@rollup/rollup-linux-loongarch64-gnu": "4.44.0",
+        "@rollup/rollup-linux-powerpc64le-gnu": "4.44.0",
+        "@rollup/rollup-linux-riscv64-gnu": "4.44.0",
+        "@rollup/rollup-linux-riscv64-musl": "4.44.0",
+        "@rollup/rollup-linux-s390x-gnu": "4.44.0",
+        "@rollup/rollup-linux-x64-gnu": "4.44.0",
+        "@rollup/rollup-linux-x64-musl": "4.44.0",
+        "@rollup/rollup-win32-arm64-msvc": "4.44.0",
+        "@rollup/rollup-win32-ia32-msvc": "4.44.0",
+        "@rollup/rollup-win32-x64-msvc": "4.44.0",
+        "fsevents": "~2.3.2"
+      }
+    },
+    "node_modules/source-map-js": {
+      "version": "1.2.1",
+      "resolved": "https://mirrors.cloud.tencent.com/npm/source-map-js/-/source-map-js-1.2.1.tgz",
+      "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
+      "license": "BSD-3-Clause",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/tinyglobby": {
+      "version": "0.2.14",
+      "resolved": "https://mirrors.cloud.tencent.com/npm/tinyglobby/-/tinyglobby-0.2.14.tgz",
+      "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "fdir": "^6.4.4",
+        "picomatch": "^4.0.2"
+      },
+      "engines": {
+        "node": ">=12.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/SuperchupuDev"
+      }
+    },
+    "node_modules/vite": {
+      "version": "6.3.5",
+      "resolved": "https://mirrors.cloud.tencent.com/npm/vite/-/vite-6.3.5.tgz",
+      "integrity": "sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "esbuild": "^0.25.0",
+        "fdir": "^6.4.4",
+        "picomatch": "^4.0.2",
+        "postcss": "^8.5.3",
+        "rollup": "^4.34.9",
+        "tinyglobby": "^0.2.13"
+      },
+      "bin": {
+        "vite": "bin/vite.js"
+      },
+      "engines": {
+        "node": "^18.0.0 || ^20.0.0 || >=22.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/vitejs/vite?sponsor=1"
+      },
+      "optionalDependencies": {
+        "fsevents": "~2.3.3"
+      },
+      "peerDependencies": {
+        "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0",
+        "jiti": ">=1.21.0",
+        "less": "*",
+        "lightningcss": "^1.21.0",
+        "sass": "*",
+        "sass-embedded": "*",
+        "stylus": "*",
+        "sugarss": "*",
+        "terser": "^5.16.0",
+        "tsx": "^4.8.1",
+        "yaml": "^2.4.2"
+      },
+      "peerDependenciesMeta": {
+        "@types/node": {
+          "optional": true
+        },
+        "jiti": {
+          "optional": true
+        },
+        "less": {
+          "optional": true
+        },
+        "lightningcss": {
+          "optional": true
+        },
+        "sass": {
+          "optional": true
+        },
+        "sass-embedded": {
+          "optional": true
+        },
+        "stylus": {
+          "optional": true
+        },
+        "sugarss": {
+          "optional": true
+        },
+        "terser": {
+          "optional": true
+        },
+        "tsx": {
+          "optional": true
+        },
+        "yaml": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/vue": {
+      "version": "3.5.17",
+      "resolved": "https://mirrors.cloud.tencent.com/npm/vue/-/vue-3.5.17.tgz",
+      "integrity": "sha512-LbHV3xPN9BeljML+Xctq4lbz2lVHCR6DtbpTf5XIO6gugpXUN49j2QQPcMj086r9+AkJ0FfUT8xjulKKBkkr9g==",
+      "license": "MIT",
+      "dependencies": {
+        "@vue/compiler-dom": "3.5.17",
+        "@vue/compiler-sfc": "3.5.17",
+        "@vue/runtime-dom": "3.5.17",
+        "@vue/server-renderer": "3.5.17",
+        "@vue/shared": "3.5.17"
+      },
+      "peerDependencies": {
+        "typescript": "*"
+      },
+      "peerDependenciesMeta": {
+        "typescript": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/vue-router": {
+      "version": "4.5.1",
+      "resolved": "https://mirrors.cloud.tencent.com/npm/vue-router/-/vue-router-4.5.1.tgz",
+      "integrity": "sha512-ogAF3P97NPm8fJsE4by9dwSYtDwXIY1nFY9T6DyQnGHd1E2Da94w9JIolpe42LJGIl0DwOHBi8TcRPlPGwbTtw==",
+      "license": "MIT",
+      "dependencies": {
+        "@vue/devtools-api": "^6.6.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/posva"
+      },
+      "peerDependencies": {
+        "vue": "^3.2.0"
+      }
+    }
+  }
+}

+ 20 - 0
exgame/package.json

@@ -0,0 +1,20 @@
+{
+  "name": "exgame",
+  "private": true,
+  "version": "0.0.0",
+  "type": "module",
+  "scripts": {
+    "dev": "vite",
+    "build": "vite build",
+    "preview": "vite preview"
+  },
+  "dependencies": {
+    "animate.css": "^4.1.1",
+    "vue": "^3.5.13",
+    "vue-router": "^4.5.1"
+  },
+  "devDependencies": {
+    "@vitejs/plugin-vue": "^5.2.3",
+    "vite": "^6.3.5"
+  }
+}

+ 1 - 0
exgame/public/vite.svg

@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="31.88" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 257"><defs><linearGradient id="IconifyId1813088fe1fbc01fb466" x1="-.828%" x2="57.636%" y1="7.652%" y2="78.411%"><stop offset="0%" stop-color="#41D1FF"></stop><stop offset="100%" stop-color="#BD34FE"></stop></linearGradient><linearGradient id="IconifyId1813088fe1fbc01fb467" x1="43.376%" x2="50.316%" y1="2.242%" y2="89.03%"><stop offset="0%" stop-color="#FFEA83"></stop><stop offset="8.333%" stop-color="#FFDD35"></stop><stop offset="100%" stop-color="#FFA800"></stop></linearGradient></defs><path fill="url(#IconifyId1813088fe1fbc01fb466)" d="M255.153 37.938L134.897 252.976c-2.483 4.44-8.862 4.466-11.382.048L.875 37.958c-2.746-4.814 1.371-10.646 6.827-9.67l120.385 21.517a6.537 6.537 0 0 0 2.322-.004l117.867-21.483c5.438-.991 9.574 4.796 6.877 9.62Z"></path><path fill="url(#IconifyId1813088fe1fbc01fb467)" d="M185.432.063L96.44 17.501a3.268 3.268 0 0 0-2.634 3.014l-5.474 92.456a3.268 3.268 0 0 0 3.997 3.378l24.777-5.718c2.318-.535 4.413 1.507 3.936 3.838l-7.361 36.047c-.495 2.426 1.782 4.5 4.151 3.78l15.304-4.649c2.372-.72 4.652 1.36 4.15 3.788l-11.698 56.621c-.732 3.542 3.979 5.473 5.943 2.437l1.313-2.028l72.516-144.72c1.215-2.423-.88-5.186-3.54-4.672l-25.505 4.922c-2.396.462-4.435-1.77-3.759-4.114l16.646-57.705c.677-2.35-1.37-4.583-3.769-4.113Z"></path></svg>

+ 66 - 0
exgame/src/App.vue

@@ -0,0 +1,66 @@
+<script setup>
+// 不需要额外引入组件,路由会自动处理
+</script>
+
+<template>
+  <div class="app-container">
+    <!-- 路由视图 -->
+    <router-view v-slot="{ Component }">
+      <transition name="fade" mode="out-in">
+        <component :is="Component" />
+      </transition>
+    </router-view>
+  </div>
+</template>
+
+<style>
+/* 全局样式 */
+* {
+  margin: 0;
+  padding: 0;
+  box-sizing: border-box;
+}
+
+html, body {
+  height: 100%;
+  width: 100%;
+  overflow: hidden;
+}
+
+body {
+  font-family: 'Arial', sans-serif;
+  background-color: #f5f5f5;
+}
+
+.app-container {
+  width: 100%;
+  height: 100vh;
+  position: relative;
+}
+
+/* 淡入淡出过渡效果 */
+.fade-enter-active,
+.fade-leave-active {
+  transition: opacity 0.3s ease;
+}
+
+.fade-enter-from,
+.fade-leave-to {
+  opacity: 0;
+}
+
+/* 响应式设计 */
+@media (max-width: 768px) {
+  /* 手机端样式 */
+  .app-container {
+    padding: 10px;
+  }
+}
+
+@media (min-width: 769px) {
+  /* 电脑端样式 */
+  .app-container {
+    padding: 20px;
+  }
+}
+</style>

+ 1 - 0
exgame/src/assets/vue.svg

@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="37.07" height="36" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 198"><path fill="#41B883" d="M204.8 0H256L128 220.8L0 0h97.92L128 51.2L157.44 0h47.36Z"></path><path fill="#41B883" d="m0 0l128 220.8L256 0h-51.2L128 132.48L50.56 0H0Z"></path><path fill="#35495E" d="M50.56 0L128 133.12L204.8 0h-47.36L128 51.2L97.92 0H50.56Z"></path></svg>

+ 448 - 0
exgame/src/components/AnnoyingEffects.vue

@@ -0,0 +1,448 @@
+<script setup>
+import { ref, onMounted, onUnmounted } from 'vue';
+import { useRouter } from 'vue-router';
+
+const router = useRouter();
+const showCursor = ref(false);
+const cursorPosition = ref({ x: 0, y: 0 });
+const showFakeError = ref(false);
+const showFakeUpdate = ref(false);
+const showAutoPopup = ref(false);
+const redirectTimer = ref(null);
+const mouseTrackInterval = ref(null);
+const autoPopupInterval = ref(null);
+
+// 随机弹窗文本
+const popupTexts = [
+  "您的设备已被锁定!请立即支付解锁费用!",
+  "警告:您的账户已被盗用!请立即验证身份!",
+  "检测到您的设备性能下降80%!点击立即优化!",
+  "恭喜!您是第10000000位访问者!点击领取奖品!",
+  "系统检测到您的浏览器已过期!立即更新!",
+  "您的IP地址已被记录,您正在访问违规内容!",
+  "警告:您的设备已感染5个高危病毒!立即清除!"
+];
+
+// 跟踪鼠标位置
+const trackMouse = (e) => {
+  cursorPosition.value = {
+    x: e.clientX,
+    y: e.clientY
+  };
+};
+
+// 显示跟随鼠标的弹窗
+const showMouseFollower = () => {
+  showCursor.value = true;
+  document.addEventListener('mousemove', trackMouse);
+  
+  // 每隔一段时间改变跟随鼠标的内容
+  mouseTrackInterval.value = setInterval(() => {
+    // 切换显示状态,制造闪烁效果
+    showCursor.value = !showCursor.value;
+    setTimeout(() => {
+      showCursor.value = true;
+    }, 100);
+  }, 3000);
+};
+
+// 随机跳转页面
+const randomRedirect = () => {
+  const pages = ['/ad', '/virus', '/winning'];
+  const randomPage = pages[Math.floor(Math.random() * pages.length)];
+  router.push(randomPage);
+};
+
+// 显示假系统错误
+const showSystemError = () => {
+  showFakeError.value = true;
+  
+  // 5秒后自动跳转
+  setTimeout(() => {
+    showFakeError.value = false;
+    randomRedirect();
+  }, 5000);
+};
+
+// 显示假更新提示
+const showUpdateNotice = () => {
+  showFakeUpdate.value = true;
+};
+
+// 自动弹出广告
+const startAutoPopups = () => {
+  autoPopupInterval.value = setInterval(() => {
+    showAutoPopup.value = true;
+    
+    // 3秒后隐藏,然后再次显示
+    setTimeout(() => {
+      showAutoPopup.value = false;
+    }, 3000);
+  }, 8000);
+};
+
+// 禁用右键菜单
+const disableRightClick = () => {
+  document.addEventListener('contextmenu', (e) => {
+    e.preventDefault();
+    showSystemError();
+    return false;
+  });
+};
+
+// 禁用后退按钮
+const disableBackButton = () => {
+  window.history.pushState(null, "", window.location.href);
+  window.onpopstate = function() {
+    window.history.pushState(null, "", window.location.href);
+    showUpdateNotice();
+  };
+};
+
+// 随机开始重定向倒计时
+const startRedirectTimer = () => {
+  const randomTime = Math.floor(Math.random() * 20000) + 10000; // 10-30秒
+  redirectTimer.value = setTimeout(() => {
+    randomRedirect();
+  }, randomTime);
+};
+
+// 创建全屏覆盖层
+const createFullscreenOverlay = () => {
+  const overlay = document.createElement('div');
+  overlay.style.position = 'fixed';
+  overlay.style.top = '0';
+  overlay.style.left = '0';
+  overlay.style.width = '100vw';
+  overlay.style.height = '100vh';
+  overlay.style.backgroundColor = 'transparent';
+  overlay.style.zIndex = '9998';
+  document.body.appendChild(overlay);
+  
+  overlay.addEventListener('click', (e) => {
+    e.stopPropagation();
+    showSystemError();
+  });
+};
+
+onMounted(() => {
+  // 延迟启动各种恶心效果
+  setTimeout(() => {
+    showMouseFollower();
+    disableRightClick();
+    disableBackButton();
+    startAutoPopups();
+    startRedirectTimer();
+    createFullscreenOverlay();
+    
+    // 随机决定是否显示系统错误
+    if (Math.random() > 0.5) {
+      setTimeout(() => {
+        showSystemError();
+      }, 5000);
+    }
+  }, 2000);
+});
+
+onUnmounted(() => {
+  // 清理所有定时器和事件监听
+  document.removeEventListener('mousemove', trackMouse);
+  clearInterval(mouseTrackInterval.value);
+  clearInterval(autoPopupInterval.value);
+  clearTimeout(redirectTimer.value);
+});
+</script>
+
+<template>
+  <div class="annoying-effects-container">
+    <!-- 鼠标跟随弹窗 -->
+    <div 
+      v-if="showCursor" 
+      class="cursor-follower"
+      :style="{
+        left: cursorPosition.x + 'px',
+        top: cursorPosition.y + 'px'
+      }"
+    >
+      <div class="cursor-content">
+        <p>点击此处获取优惠!</p>
+        <button @click="randomRedirect">立即领取</button>
+      </div>
+    </div>
+    
+    <!-- 假系统错误 -->
+    <div v-if="showFakeError" class="fake-error">
+      <div class="error-content">
+        <div class="error-header">
+          <div class="error-icon">!</div>
+          <h3>系统错误</h3>
+        </div>
+        <div class="error-body">
+          <p>错误代码: 0x8007007E</p>
+          <p>您的系统遇到了严重问题,需要立即修复。</p>
+          <p>正在收集错误信息... 请稍候</p>
+          <div class="fake-progress">
+            <div class="progress-bar"></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    
+    <!-- 假更新提示 -->
+    <div v-if="showFakeUpdate" class="fake-update">
+      <div class="update-content">
+        <h3>重要系统更新</h3>
+        <p>您的浏览器需要立即更新以继续浏览网页</p>
+        <div class="update-progress">
+          <div class="progress-bar"></div>
+        </div>
+        <p class="update-status">正在下载更新 (23%)...</p>
+        <p class="update-warning">请勿关闭此窗口</p>
+      </div>
+    </div>
+    
+    <!-- 自动弹出广告 -->
+    <div v-if="showAutoPopup" class="auto-popup">
+      <div class="popup-content">
+        <h4>特别通知</h4>
+        <p>{{ popupTexts[Math.floor(Math.random() * popupTexts.length)] }}</p>
+        <div class="popup-buttons">
+          <button @click="randomRedirect" class="popup-btn">确定</button>
+          <button @click="showAutoPopup = false" class="fake-close-btn">关闭</button>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<style scoped>
+/* 鼠标跟随弹窗样式 */
+.cursor-follower {
+  position: fixed;
+  z-index: 9999;
+  transform: translate(10px, 10px);
+  pointer-events: none;
+  transition: opacity 0.2s;
+}
+
+.cursor-content {
+  background-color: rgba(255, 255, 0, 0.9);
+  padding: 10px;
+  border-radius: 5px;
+  box-shadow: 0 2px 10px rgba(0, 0, 0, 0.3);
+  width: 150px;
+  pointer-events: auto;
+  text-align: center;
+}
+
+.cursor-content p {
+  margin: 0 0 8px;
+  font-size: 12px;
+  font-weight: bold;
+}
+
+.cursor-content button {
+  background-color: #ff4500;
+  color: white;
+  border: none;
+  padding: 5px 10px;
+  border-radius: 3px;
+  cursor: pointer;
+  font-size: 12px;
+}
+
+/* 假系统错误样式 */
+.fake-error {
+  position: fixed;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  background-color: rgba(0, 0, 0, 0.8);
+  z-index: 10000;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+}
+
+.error-content {
+  background-color: #f0f0f0;
+  width: 80%;
+  max-width: 500px;
+  border-radius: 5px;
+  overflow: hidden;
+}
+
+.error-header {
+  background-color: #0078d7;
+  color: white;
+  padding: 15px;
+  display: flex;
+  align-items: center;
+}
+
+.error-icon {
+  width: 30px;
+  height: 30px;
+  background-color: white;
+  color: #0078d7;
+  border-radius: 50%;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  font-weight: bold;
+  font-size: 20px;
+  margin-right: 15px;
+}
+
+.error-body {
+  padding: 20px;
+}
+
+.fake-progress {
+  height: 20px;
+  background-color: #ddd;
+  border-radius: 10px;
+  margin: 20px 0;
+  overflow: hidden;
+}
+
+.fake-progress .progress-bar {
+  height: 100%;
+  width: 75%;
+  background-color: #0078d7;
+  animation: progress 3s infinite;
+}
+
+/* 假更新提示样式 */
+.fake-update {
+  position: fixed;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  background-color: rgba(0, 0, 0, 0.9);
+  z-index: 10000;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+}
+
+.update-content {
+  background-color: #fff;
+  padding: 30px;
+  border-radius: 8px;
+  width: 80%;
+  max-width: 500px;
+  text-align: center;
+}
+
+.update-content h3 {
+  margin-bottom: 20px;
+  color: #333;
+}
+
+.update-progress {
+  height: 20px;
+  background-color: #eee;
+  border-radius: 10px;
+  margin: 20px 0;
+  overflow: hidden;
+}
+
+.update-progress .progress-bar {
+  height: 100%;
+  width: 23%;
+  background-color: #4CAF50;
+  animation: progress-pulse 2s infinite;
+}
+
+.update-status {
+  color: #666;
+  margin-bottom: 10px;
+}
+
+.update-warning {
+  color: #e74c3c;
+  font-weight: bold;
+}
+
+/* 自动弹出广告样式 */
+.auto-popup {
+  position: fixed;
+  bottom: 20px;
+  right: 20px;
+  z-index: 9999;
+  animation: popup-slide 0.5s ease-out;
+}
+
+.popup-content {
+  background-color: #fff;
+  padding: 15px;
+  border-radius: 8px;
+  box-shadow: 0 5px 20px rgba(0, 0, 0, 0.3);
+  width: 300px;
+}
+
+.popup-content h4 {
+  margin: 0 0 10px;
+  color: #e74c3c;
+}
+
+.popup-buttons {
+  display: flex;
+  justify-content: space-between;
+  margin-top: 15px;
+}
+
+.popup-btn {
+  padding: 8px 15px;
+  background-color: #e74c3c;
+  color: white;
+  border: none;
+  border-radius: 4px;
+  cursor: pointer;
+}
+
+.fake-close-btn {
+  padding: 8px 15px;
+  background-color: #95a5a6;
+  color: white;
+  border: none;
+  border-radius: 4px;
+  cursor: pointer;
+}
+
+/* 动画效果 */
+@keyframes progress {
+  0% { width: 0; }
+  50% { width: 75%; }
+  100% { width: 75%; }
+}
+
+@keyframes progress-pulse {
+  0% { opacity: 0.8; }
+  50% { opacity: 1; }
+  100% { opacity: 0.8; }
+}
+
+@keyframes popup-slide {
+  from { transform: translateY(100px); opacity: 0; }
+  to { transform: translateY(0); opacity: 1; }
+}
+
+/* 响应式设计 */
+@media (max-width: 768px) {
+  .cursor-content {
+    width: 120px;
+  }
+  
+  .popup-content {
+    width: 250px;
+  }
+  
+  .error-content, .update-content {
+    width: 90%;
+  }
+}
+</style> 

+ 252 - 0
exgame/src/components/FakeDownload.vue

@@ -0,0 +1,252 @@
+<script setup>
+import { ref, onMounted } from 'vue';
+
+const downloadProgress = ref(0);
+const showDownload = ref(false);
+const downloadInterval = ref(null);
+const downloadSpeed = ref('2.3 MB/s');
+const timeRemaining = ref('1分钟');
+const fileSize = ref('127.8 MB');
+const downloadText = ref('正在下载 setup_installer.exe...');
+
+// 随机改变下载速度
+const updateDownloadSpeed = () => {
+  const speeds = ['1.8 MB/s', '2.3 MB/s', '1.2 MB/s', '3.4 MB/s', '0.9 MB/s', '2.7 MB/s'];
+  const times = ['1分钟', '2分钟', '30秒', '45秒', '3分钟', '1分12秒'];
+  
+  downloadSpeed.value = speeds[Math.floor(Math.random() * speeds.length)];
+  timeRemaining.value = times[Math.floor(Math.random() * times.length)];
+};
+
+// 开始假下载进度
+const startFakeDownload = () => {
+  showDownload.value = true;
+  
+  downloadInterval.value = setInterval(() => {
+    if (downloadProgress.value < 99) {
+      // 随机增加下载进度
+      downloadProgress.value += Math.random() * 2;
+      
+      if (downloadProgress.value > 99) {
+        downloadProgress.value = 99;
+      }
+      
+      // 随机更新下载速度
+      if (Math.random() > 0.7) {
+        updateDownloadSpeed();
+      }
+    } else {
+      // 保持在99%,永远不会完成
+      clearInterval(downloadInterval.value);
+      downloadText.value = '正在验证下载...';
+      timeRemaining.value = '计算中...';
+    }
+  }, 800);
+};
+
+// 取消下载(实际上不会真的取消)
+const cancelDownload = () => {
+  // 显示取消中...但实际上不会取消
+  downloadText.value = '正在取消下载...';
+  
+  // 2秒后继续下载
+  setTimeout(() => {
+    downloadText.value = '正在下载 setup_installer.exe...';
+    startFakeDownload();
+  }, 2000);
+};
+
+onMounted(() => {
+  // 延迟显示下载窗口
+  setTimeout(() => {
+    startFakeDownload();
+  }, 5000);
+});
+</script>
+
+<template>
+  <div class="fake-download-container">
+    <div v-if="showDownload" class="download-popup">
+      <div class="download-header">
+        <span class="download-title">文件下载</span>
+        <button class="close-btn" @click="cancelDownload">×</button>
+      </div>
+      
+      <div class="download-content">
+        <div class="download-icon"></div>
+        
+        <div class="download-info">
+          <p class="download-text">{{ downloadText }}</p>
+          
+          <div class="progress-container">
+            <div class="progress-bar">
+              <div class="progress" :style="{ width: downloadProgress + '%' }"></div>
+            </div>
+            <p class="progress-text">{{ Math.floor(downloadProgress) }}% 完成</p>
+          </div>
+          
+          <div class="download-details">
+            <p>下载速度: <span>{{ downloadSpeed }}</span></p>
+            <p>剩余时间: <span>{{ timeRemaining }}</span></p>
+            <p>文件大小: <span>{{ fileSize }}</span></p>
+          </div>
+        </div>
+        
+        <div class="download-actions">
+          <button class="cancel-btn" @click="cancelDownload">取消</button>
+          <button class="pause-btn">暂停</button>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<style scoped>
+.fake-download-container {
+  position: fixed;
+  bottom: 20px;
+  right: 20px;
+  z-index: 9995;
+}
+
+.download-popup {
+  width: 400px;
+  background-color: #fff;
+  border-radius: 8px;
+  box-shadow: 0 5px 20px rgba(0, 0, 0, 0.3);
+  overflow: hidden;
+  animation: slide-in 0.5s ease;
+}
+
+.download-header {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  padding: 12px 15px;
+  background-color: #f8f8f8;
+  border-bottom: 1px solid #ddd;
+}
+
+.download-title {
+  font-weight: bold;
+  color: #333;
+}
+
+.close-btn {
+  background: none;
+  border: none;
+  font-size: 20px;
+  cursor: pointer;
+  color: #666;
+}
+
+.download-content {
+  padding: 20px;
+}
+
+.download-icon {
+  width: 40px;
+  height: 40px;
+  background-color: #4CAF50;
+  border-radius: 50%;
+  margin: 0 auto 15px;
+  background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"/><polyline points="7 10 12 15 17 10"/><line x1="12" y1="15" x2="12" y2="3"/></svg>');
+  background-repeat: no-repeat;
+  background-position: center;
+}
+
+.download-text {
+  text-align: center;
+  margin-bottom: 15px;
+  font-size: 14px;
+  color: #333;
+}
+
+.progress-container {
+  margin-bottom: 15px;
+}
+
+.progress-bar {
+  height: 15px;
+  background-color: #eee;
+  border-radius: 10px;
+  overflow: hidden;
+  margin-bottom: 5px;
+}
+
+.progress {
+  height: 100%;
+  background-color: #4CAF50;
+  transition: width 0.3s ease;
+}
+
+.progress-text {
+  text-align: right;
+  font-size: 12px;
+  color: #666;
+}
+
+.download-details {
+  display: grid;
+  grid-template-columns: repeat(3, 1fr);
+  gap: 10px;
+  margin-bottom: 20px;
+}
+
+.download-details p {
+  font-size: 12px;
+  color: #666;
+}
+
+.download-details span {
+  font-weight: bold;
+  color: #333;
+}
+
+.download-actions {
+  display: flex;
+  justify-content: flex-end;
+  gap: 10px;
+}
+
+.cancel-btn, .pause-btn {
+  padding: 8px 15px;
+  border: none;
+  border-radius: 4px;
+  cursor: pointer;
+  font-size: 14px;
+}
+
+.cancel-btn {
+  background-color: #f44336;
+  color: white;
+}
+
+.pause-btn {
+  background-color: #2196F3;
+  color: white;
+}
+
+@keyframes slide-in {
+  from {
+    transform: translateY(100%);
+    opacity: 0;
+  }
+  to {
+    transform: translateY(0);
+    opacity: 1;
+  }
+}
+
+/* 响应式设计 */
+@media (max-width: 768px) {
+  .download-popup {
+    width: 90%;
+    max-width: 350px;
+  }
+  
+  .download-details {
+    grid-template-columns: 1fr;
+  }
+}
+</style> 

+ 277 - 0
exgame/src/components/FakeNotifications.vue

@@ -0,0 +1,277 @@
+<script setup>
+import { ref, onMounted, onUnmounted } from 'vue';
+import { useRouter } from 'vue-router';
+
+const router = useRouter();
+const notifications = ref([]);
+const notificationInterval = ref(null);
+const maxNotifications = 5;
+
+// 通知类型和内容
+const notificationTypes = [
+  {
+    type: 'warning',
+    title: '系统警告',
+    messages: [
+      '您的设备已被感染,点击立即清理',
+      '检测到异常活动,请立即验证身份',
+      '您的账户安全风险较高,请更新密码',
+      '系统更新可用,请立即安装',
+      '您的设备性能下降50%,点击优化'
+    ]
+  },
+  {
+    type: 'info',
+    title: '系统通知',
+    messages: [
+      '您有一条新消息',
+      '您的订单已发货',
+      '新版本可用,点击更新',
+      '您的账户已登录',
+      '您有未读邮件'
+    ]
+  },
+  {
+    type: 'success',
+    title: '恭喜',
+    messages: [
+      '您已获得一次抽奖机会',
+      '您已成功注册会员',
+      '您已获得100积分',
+      '您已获得一次免费体验机会',
+      '您已成功参与活动'
+    ]
+  },
+  {
+    type: 'error',
+    title: '错误',
+    messages: [
+      '连接失败,请重试',
+      '操作超时,请稍后再试',
+      '服务暂时不可用',
+      '请求被拒绝',
+      '未知错误,请联系客服'
+    ]
+  }
+];
+
+// 创建随机通知
+const createRandomNotification = () => {
+  // 随机选择通知类型
+  const typeIndex = Math.floor(Math.random() * notificationTypes.length);
+  const notificationType = notificationTypes[typeIndex];
+  
+  // 随机选择通知内容
+  const messageIndex = Math.floor(Math.random() * notificationType.messages.length);
+  const message = notificationType.messages[messageIndex];
+  
+  // 创建通知对象
+  const notification = {
+    id: Date.now(),
+    type: notificationType.type,
+    title: notificationType.title,
+    message: message,
+    time: new Date().toLocaleTimeString()
+  };
+  
+  // 添加到通知列表
+  notifications.value.push(notification);
+  
+  // 如果超过最大数量,移除最早的通知
+  if (notifications.value.length > maxNotifications) {
+    notifications.value.shift();
+  }
+  
+  // 设置自动消失
+  setTimeout(() => {
+    removeNotification(notification.id);
+  }, 5000);
+};
+
+// 移除通知
+const removeNotification = (id) => {
+  notifications.value = notifications.value.filter(n => n.id !== id);
+};
+
+// 点击通知
+const handleNotificationClick = () => {
+  // 随机跳转到其他页面
+  const pages = ['/ad', '/virus', '/winning'];
+  const randomPage = pages[Math.floor(Math.random() * pages.length)];
+  router.push(randomPage);
+};
+
+// 开始定时发送通知
+const startNotifications = () => {
+  // 先发送一条初始通知
+  setTimeout(() => {
+    createRandomNotification();
+  }, 2000);
+  
+  // 设置定时发送
+  notificationInterval.value = setInterval(() => {
+    if (Math.random() > 0.3) { // 70%的概率发送通知
+      createRandomNotification();
+    }
+  }, 8000);
+};
+
+onMounted(() => {
+  startNotifications();
+});
+
+onUnmounted(() => {
+  if (notificationInterval.value) {
+    clearInterval(notificationInterval.value);
+  }
+});
+</script>
+
+<template>
+  <div class="notifications-container">
+    <transition-group name="notification">
+      <div 
+        v-for="notification in notifications" 
+        :key="notification.id" 
+        class="notification" 
+        :class="notification.type"
+        @click="handleNotificationClick"
+      >
+        <div class="notification-icon" :class="notification.type"></div>
+        <div class="notification-content">
+          <div class="notification-header">
+            <div class="notification-title">{{ notification.title }}</div>
+            <div class="notification-time">{{ notification.time }}</div>
+          </div>
+          <div class="notification-message">{{ notification.message }}</div>
+        </div>
+        <button class="close-btn" @click.stop="removeNotification(notification.id)">×</button>
+      </div>
+    </transition-group>
+  </div>
+</template>
+
+<style scoped>
+.notifications-container {
+  position: fixed;
+  top: 20px;
+  right: 20px;
+  width: 320px;
+  z-index: 9997;
+  display: flex;
+  flex-direction: column;
+  gap: 10px;
+  pointer-events: none;
+}
+
+.notification {
+  background-color: white;
+  border-radius: 8px;
+  box-shadow: 0 3px 10px rgba(0, 0, 0, 0.2);
+  padding: 15px;
+  display: flex;
+  align-items: flex-start;
+  position: relative;
+  pointer-events: auto;
+  cursor: pointer;
+  transition: transform 0.2s, box-shadow 0.2s;
+}
+
+.notification:hover {
+  transform: translateY(-3px);
+  box-shadow: 0 5px 15px rgba(0, 0, 0, 0.3);
+}
+
+.notification-icon {
+  width: 24px;
+  height: 24px;
+  border-radius: 50%;
+  margin-right: 12px;
+  flex-shrink: 0;
+  background-position: center;
+  background-repeat: no-repeat;
+  background-size: 14px;
+}
+
+.notification-icon.warning {
+  background-color: #f39c12;
+  background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z"/><line x1="12" y1="9" x2="12" y2="13"/><line x1="12" y1="17" x2="12.01" y2="17"/></svg>');
+}
+
+.notification-icon.info {
+  background-color: #3498db;
+  background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><line x1="12" y1="16" x2="12" y2="12"/><line x1="12" y1="8" x2="12.01" y2="8"/></svg>');
+}
+
+.notification-icon.success {
+  background-color: #2ecc71;
+  background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></svg>');
+}
+
+.notification-icon.error {
+  background-color: #e74c3c;
+  background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="18" y1="6" x2="6" y2="18"/><line x1="6" y1="6" x2="18" y2="18"/></svg>');
+}
+
+.notification-content {
+  flex: 1;
+}
+
+.notification-header {
+  display: flex;
+  justify-content: space-between;
+  margin-bottom: 5px;
+}
+
+.notification-title {
+  font-weight: bold;
+  color: #333;
+}
+
+.notification-time {
+  font-size: 12px;
+  color: #999;
+}
+
+.notification-message {
+  font-size: 14px;
+  color: #666;
+}
+
+.close-btn {
+  background: none;
+  border: none;
+  font-size: 16px;
+  color: #999;
+  cursor: pointer;
+  position: absolute;
+  top: 5px;
+  right: 5px;
+  padding: 0;
+  line-height: 1;
+}
+
+.notification-enter-active,
+.notification-leave-active {
+  transition: all 0.5s ease;
+}
+
+.notification-enter-from {
+  opacity: 0;
+  transform: translateX(50px);
+}
+
+.notification-leave-to {
+  opacity: 0;
+  transform: translateX(50px);
+}
+
+/* 响应式设计 */
+@media (max-width: 768px) {
+  .notifications-container {
+    width: 90%;
+    max-width: 300px;
+    right: 10px;
+  }
+}
+</style> 

+ 511 - 0
exgame/src/components/FloatingAds.vue

@@ -0,0 +1,511 @@
+<script setup>
+import { ref, onMounted, onUnmounted } from 'vue';
+import { useRouter } from 'vue-router';
+
+const router = useRouter();
+const showBannerAd = ref(false);
+const showSideAd = ref(false);
+const showPopupAd = ref(false);
+const showFullScreenAd = ref(false);
+const showCornerAds = ref(false);
+const adIntervals = ref([]);
+
+// 广告文本数组
+const adTexts = [
+  "单身?点击查看附近的美女",
+  "恭喜!您的手机已被选中获得奖励",
+  "震惊!这个秘密会让你一夜暴富",
+  "医生不会告诉你的减肥秘诀",
+  "这款游戏会让你欲罢不能",
+  "只需一招,轻松赚取10000元",
+  "本地妈妈发现了惊人的赚钱方法",
+  "点击测试你的智商水平",
+  "警告:您的手机需要立即清理",
+  "最后一台iPhone特价销售中"
+];
+
+// 随机获取广告文本
+const getRandomAdText = () => {
+  return adTexts[Math.floor(Math.random() * adTexts.length)];
+};
+
+// 显示横幅广告
+const showBanner = () => {
+  showBannerAd.value = true;
+  
+  // 设置横幅广告的动画效果
+  const bannerInterval = setInterval(() => {
+    showBannerAd.value = !showBannerAd.value;
+    setTimeout(() => {
+      showBannerAd.value = true;
+    }, 200);
+  }, 5000);
+  
+  adIntervals.value.push(bannerInterval);
+};
+
+// 显示侧边广告
+const showSide = () => {
+  showSideAd.value = true;
+  
+  // 让侧边广告每隔一段时间改变位置
+  const sideInterval = setInterval(() => {
+    const sideAd = document.querySelector('.side-ad');
+    if (sideAd) {
+      sideAd.style.right = sideAd.style.right === '0px' ? '-150px' : '0px';
+    }
+  }, 3000);
+  
+  adIntervals.value.push(sideInterval);
+};
+
+// 显示弹出广告
+const showPopup = () => {
+  // 随机延迟显示弹出广告
+  setTimeout(() => {
+    showPopupAd.value = true;
+    
+    // 3秒后自动关闭
+    setTimeout(() => {
+      showPopupAd.value = false;
+      
+      // 再次随机延迟后再次显示
+      setTimeout(() => {
+        showPopup();
+      }, Math.random() * 10000 + 5000);
+    }, 3000);
+  }, Math.random() * 5000 + 2000);
+};
+
+// 显示全屏广告
+const showFullScreen = () => {
+  // 随机延迟显示全屏广告
+  setTimeout(() => {
+    showFullScreenAd.value = true;
+    
+    // 5秒后自动关闭
+    setTimeout(() => {
+      showFullScreenAd.value = false;
+    }, 5000);
+  }, Math.random() * 20000 + 15000);
+};
+
+// 显示角落小广告
+const showCornerAd = () => {
+  showCornerAds.value = true;
+  
+  // 每隔一段时间移动角落广告的位置
+  const cornerInterval = setInterval(() => {
+    const cornerAds = document.querySelectorAll('.corner-ad');
+    cornerAds.forEach(ad => {
+      const randomX = Math.floor(Math.random() * 20) - 10;
+      const randomY = Math.floor(Math.random() * 20) - 10;
+      ad.style.transform = `translate(${randomX}px, ${randomY}px)`;
+    });
+  }, 500);
+  
+  adIntervals.value.push(cornerInterval);
+};
+
+// 跳转到随机页面
+const goToRandomPage = () => {
+  const pages = ['/ad', '/virus', '/winning'];
+  const randomPage = pages[Math.floor(Math.random() * pages.length)];
+  router.push(randomPage);
+};
+
+// 关闭广告(但实际上不会真正关闭)
+const closeAd = (event) => {
+  // 阻止事件冒泡
+  event.stopPropagation();
+  
+  // 有50%的概率直接跳转到另一个页面
+  if (Math.random() > 0.5) {
+    goToRandomPage();
+  } else {
+    // 假装关闭,但实际上会在稍后重新显示
+    const adType = event.target.dataset.adType;
+    
+    if (adType === 'banner') {
+      showBannerAd.value = false;
+      setTimeout(() => {
+        showBannerAd.value = true;
+      }, 3000);
+    } else if (adType === 'side') {
+      showSideAd.value = false;
+      setTimeout(() => {
+        showSideAd.value = true;
+      }, 2000);
+    } else if (adType === 'popup') {
+      showPopupAd.value = false;
+    } else if (adType === 'fullscreen') {
+      showFullScreenAd.value = false;
+    }
+  }
+};
+
+onMounted(() => {
+  // 延迟启动各种广告
+  setTimeout(() => {
+    showBanner();
+    showSide();
+    showPopup();
+    showFullScreen();
+    showCornerAd();
+  }, 2000);
+});
+
+onUnmounted(() => {
+  // 清理所有定时器
+  adIntervals.value.forEach(interval => {
+    clearInterval(interval);
+  });
+});
+</script>
+
+<template>
+  <div class="floating-ads-container">
+    <!-- 横幅广告 -->
+    <div v-if="showBannerAd" class="banner-ad animate__animated animate__flash">
+      <div class="banner-content">
+        <div class="banner-text">{{ getRandomAdText() }}</div>
+        <button class="banner-btn" @click="goToRandomPage">点击这里</button>
+        <button class="close-btn" data-ad-type="banner" @click="closeAd">×</button>
+      </div>
+    </div>
+    
+    <!-- 侧边广告 -->
+    <div v-if="showSideAd" class="side-ad">
+      <div class="side-content">
+        <div class="side-text">{{ getRandomAdText() }}</div>
+        <button class="side-btn" @click="goToRandomPage">立即查看</button>
+        <button class="close-btn" data-ad-type="side" @click="closeAd">×</button>
+      </div>
+    </div>
+    
+    <!-- 弹出广告 -->
+    <div v-if="showPopupAd" class="popup-ad animate__animated animate__zoomIn">
+      <div class="popup-content">
+        <h4>特别优惠</h4>
+        <p>{{ getRandomAdText() }}</p>
+        <button class="popup-btn" @click="goToRandomPage">了解更多</button>
+        <button class="close-btn" data-ad-type="popup" @click="closeAd">×</button>
+      </div>
+    </div>
+    
+    <!-- 全屏广告 -->
+    <div v-if="showFullScreenAd" class="fullscreen-ad animate__animated animate__fadeIn">
+      <div class="fullscreen-content">
+        <h3>限时特惠</h3>
+        <p class="big-text">{{ getRandomAdText() }}</p>
+        <div class="ad-image"></div>
+        <button class="fullscreen-btn" @click="goToRandomPage">立即抢购</button>
+        <div class="countdown">仅剩 <span class="highlight">05:00</span> 结束</div>
+        <button class="close-btn" data-ad-type="fullscreen" @click="closeAd">×</button>
+      </div>
+    </div>
+    
+    <!-- 角落小广告 -->
+    <div v-if="showCornerAds" class="corner-ads">
+      <div class="corner-ad top-left" @click="goToRandomPage">
+        <div class="corner-content">热门</div>
+      </div>
+      <div class="corner-ad top-right" @click="goToRandomPage">
+        <div class="corner-content">优惠</div>
+      </div>
+      <div class="corner-ad bottom-left" @click="goToRandomPage">
+        <div class="corner-content">折扣</div>
+      </div>
+      <div class="corner-ad bottom-right" @click="goToRandomPage">
+        <div class="corner-content">特价</div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<style scoped>
+.floating-ads-container {
+  position: fixed;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  pointer-events: none;
+  z-index: 9990;
+}
+
+/* 横幅广告样式 */
+.banner-ad {
+  position: fixed;
+  top: 0;
+  left: 0;
+  width: 100%;
+  background-color: #ffeb3b;
+  padding: 10px;
+  text-align: center;
+  box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2);
+  z-index: 9991;
+  pointer-events: auto;
+}
+
+.banner-content {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  position: relative;
+}
+
+.banner-text {
+  font-weight: bold;
+  color: #333;
+  margin-right: 15px;
+}
+
+.banner-btn {
+  background-color: #e74c3c;
+  color: white;
+  border: none;
+  padding: 5px 15px;
+  border-radius: 3px;
+  cursor: pointer;
+  font-weight: bold;
+}
+
+/* 侧边广告样式 */
+.side-ad {
+  position: fixed;
+  top: 50%;
+  right: 0;
+  transform: translateY(-50%);
+  width: 150px;
+  background-color: #3498db;
+  padding: 15px;
+  border-radius: 5px 0 0 5px;
+  box-shadow: -2px 0 5px rgba(0, 0, 0, 0.2);
+  z-index: 9992;
+  pointer-events: auto;
+  transition: right 0.3s ease;
+}
+
+.side-content {
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+}
+
+.side-text {
+  color: white;
+  font-size: 12px;
+  margin-bottom: 10px;
+  text-align: center;
+}
+
+.side-btn {
+  background-color: #2ecc71;
+  color: white;
+  border: none;
+  padding: 5px 10px;
+  border-radius: 3px;
+  cursor: pointer;
+  font-size: 12px;
+  width: 100%;
+}
+
+/* 弹出广告样式 */
+.popup-ad {
+  position: fixed;
+  top: 50%;
+  left: 50%;
+  transform: translate(-50%, -50%);
+  background-color: white;
+  padding: 20px;
+  border-radius: 8px;
+  box-shadow: 0 5px 20px rgba(0, 0, 0, 0.3);
+  z-index: 9993;
+  pointer-events: auto;
+  width: 300px;
+}
+
+.popup-content {
+  position: relative;
+}
+
+.popup-content h4 {
+  color: #e74c3c;
+  margin: 0 0 15px;
+}
+
+.popup-content p {
+  margin-bottom: 20px;
+}
+
+.popup-btn {
+  background-color: #e74c3c;
+  color: white;
+  border: none;
+  padding: 8px 15px;
+  border-radius: 4px;
+  cursor: pointer;
+  width: 100%;
+}
+
+/* 全屏广告样式 */
+.fullscreen-ad {
+  position: fixed;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  background-color: rgba(0, 0, 0, 0.8);
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  z-index: 9994;
+  pointer-events: auto;
+}
+
+.fullscreen-content {
+  background-color: white;
+  padding: 30px;
+  border-radius: 10px;
+  text-align: center;
+  max-width: 500px;
+  width: 80%;
+  position: relative;
+}
+
+.fullscreen-content h3 {
+  color: #e74c3c;
+  margin-bottom: 15px;
+}
+
+.big-text {
+  font-size: 20px;
+  font-weight: bold;
+  margin-bottom: 20px;
+}
+
+.ad-image {
+  height: 150px;
+  background-color: #f5f5f5;
+  margin: 20px 0;
+  border-radius: 5px;
+  background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="80" height="80" viewBox="0 0 24 24" fill="none" stroke="%23333" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="3" width="18" height="18" rx="2" ry="2"/><circle cx="8.5" cy="8.5" r="1.5"/><polyline points="21 15 16 10 5 21"/></svg>');
+  background-repeat: no-repeat;
+  background-position: center;
+}
+
+.fullscreen-btn {
+  background-color: #e74c3c;
+  color: white;
+  border: none;
+  padding: 12px 30px;
+  border-radius: 30px;
+  font-size: 16px;
+  font-weight: bold;
+  cursor: pointer;
+  margin-bottom: 15px;
+}
+
+.countdown {
+  font-size: 14px;
+  color: #666;
+}
+
+.highlight {
+  color: #e74c3c;
+  font-weight: bold;
+}
+
+/* 角落小广告样式 */
+.corner-ads {
+  pointer-events: none;
+}
+
+.corner-ad {
+  position: fixed;
+  width: 60px;
+  height: 60px;
+  background-color: rgba(255, 69, 0, 0.8);
+  border-radius: 50%;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  cursor: pointer;
+  box-shadow: 0 2px 5px rgba(0, 0, 0, 0.3);
+  transition: transform 0.2s ease;
+  pointer-events: auto;
+  z-index: 9990;
+}
+
+.corner-content {
+  color: white;
+  font-weight: bold;
+  font-size: 12px;
+}
+
+.top-left {
+  top: 20px;
+  left: 20px;
+}
+
+.top-right {
+  top: 20px;
+  right: 20px;
+}
+
+.bottom-left {
+  bottom: 20px;
+  left: 20px;
+}
+
+.bottom-right {
+  bottom: 20px;
+  right: 20px;
+}
+
+/* 通用关闭按钮样式 */
+.close-btn {
+  background: none;
+  border: none;
+  font-size: 20px;
+  color: #666;
+  cursor: pointer;
+  position: absolute;
+  top: 5px;
+  right: 5px;
+  padding: 0;
+  line-height: 1;
+}
+
+/* 响应式设计 */
+@media (max-width: 768px) {
+  .banner-content {
+    flex-direction: column;
+  }
+  
+  .banner-text {
+    margin-right: 0;
+    margin-bottom: 10px;
+  }
+  
+  .side-ad {
+    width: 100px;
+  }
+  
+  .popup-ad {
+    width: 90%;
+    max-width: 300px;
+  }
+  
+  .fullscreen-content {
+    padding: 20px;
+    width: 90%;
+  }
+  
+  .corner-ad {
+    width: 40px;
+    height: 40px;
+  }
+}
+</style> 

+ 43 - 0
exgame/src/components/HelloWorld.vue

@@ -0,0 +1,43 @@
+<script setup>
+import { ref } from 'vue'
+
+defineProps({
+  msg: String,
+})
+
+const count = ref(0)
+</script>
+
+<template>
+  <h1>{{ msg }}</h1>
+
+  <div class="card">
+    <button type="button" @click="count++">count is {{ count }}</button>
+    <p>
+      Edit
+      <code>components/HelloWorld.vue</code> to test HMR
+    </p>
+  </div>
+
+  <p>
+    Check out
+    <a href="https://vuejs.org/guide/quick-start.html#local" target="_blank"
+      >create-vue</a
+    >, the official Vue + Vite starter
+  </p>
+  <p>
+    Learn more about IDE Support for Vue in the
+    <a
+      href="https://vuejs.org/guide/scaling-up/tooling.html#ide-support"
+      target="_blank"
+      >Vue Docs Scaling up Guide</a
+    >.
+  </p>
+  <p class="read-the-docs">Click on the Vite and Vue logos to learn more</p>
+</template>
+
+<style scoped>
+.read-the-docs {
+  color: #888;
+}
+</style>

+ 184 - 0
exgame/src/main.js

@@ -0,0 +1,184 @@
+import { createApp } from 'vue'
+import { createRouter, createWebHashHistory } from 'vue-router'
+import './style.css'
+import 'animate.css'
+import App from './App.vue'
+
+// 引入路由组件
+import Home from './views/Home.vue'
+import FakeAd from './views/FakeAd.vue'
+import FakeVirus from './views/FakeVirus.vue'
+import FakeWinning from './views/FakeWinning.vue'
+
+// 定义路由
+const routes = [
+  { path: '/', component: Home },
+  { path: '/ad', component: FakeAd },
+  { path: '/virus', component: FakeVirus },
+  { path: '/winning', component: FakeWinning },
+]
+
+// 创建路由实例
+const router = createRouter({
+  history: createWebHashHistory(),
+  routes,
+})
+
+// 检测页面是否是通过刷新进入的
+const isPageRefreshed = () => {
+  // 方法1: 检查 performance.navigation.type
+  if (performance.navigation && performance.navigation.type === 1) {
+    return true;
+  }
+  
+  // 方法2: 检查 window.performance.getEntriesByType
+  const navEntries = performance.getEntriesByType('navigation');
+  if (navEntries.length > 0 && navEntries[0].type === 'reload') {
+    return true;
+  }
+  
+  // 方法3: 检查 sessionStorage 中的访问标记
+  const currentPage = window.location.hash;
+  const lastVisitedPage = sessionStorage.getItem('lastPage');
+  const isFromRefresh = lastVisitedPage === currentPage;
+  
+  sessionStorage.setItem('lastPage', currentPage);
+  
+  return isFromRefresh;
+};
+
+// 添加全局前置守卫
+router.beforeEach((to, from, next) => {
+  const prankPages = ['/virus', '/ad', '/winning'];
+  
+  // 检查冷却时间
+  const lastRandomJump = sessionStorage.getItem('lastRandomJump');
+  const now = Date.now();
+  const jumpCooldown = 1000; // 1秒冷却时间
+  
+  if (lastRandomJump && (now - parseInt(lastRandomJump)) < jumpCooldown) {
+    console.log('⏰ 跳转冷却中,直接通过');
+    next();
+    return;
+  }
+  
+  // 首页访问处理
+  if (to.path === '/' || to.path === '') {
+    sessionStorage.setItem('lastRandomJump', now.toString());
+    
+    const randomIndex = Math.floor(Math.random() * prankPages.length);
+    const randomPage = prankPages[randomIndex];
+    const randomParam = Math.random().toString(36).substring(7);
+    
+    console.log(`🎲 首页随机跳转: / → ${randomPage}?r=${randomParam}`);
+    
+    next({
+      path: randomPage,
+      query: { r: randomParam, from: 'home' }
+    });
+    return;
+  }
+  
+  // 检查是否是恶搞页面
+  const isPrankPage = prankPages.includes(to.path);
+  
+  // 如果是恶搞页面且检测到页面刷新
+  if (isPrankPage && isPageRefreshed()) {
+    sessionStorage.setItem('lastRandomJump', now.toString());
+    
+    // 过滤掉当前页面
+    const otherPages = prankPages.filter(page => page !== to.path);
+    
+    const randomIndex = Math.floor(Math.random() * otherPages.length);
+    const randomPage = otherPages[randomIndex];
+    const randomParam = Math.random().toString(36).substring(7);
+    
+    console.log(`🔄 检测到页面刷新,随机跳转: ${to.path} → ${randomPage}?r=${randomParam}`);
+    
+    next({
+      path: randomPage,
+      query: { r: randomParam, from: to.path.replace('/', '') }
+    });
+    return;
+  }
+  
+  // 其他情况正常导航
+  next();
+});
+
+// 页面加载完成后,为所有恶搞页面添加刷新监听
+router.afterEach((to) => {
+  const prankPages = ['/virus', '/ad', '/winning'];
+  
+  if (prankPages.includes(to.path)) {
+    // 延迟添加刷新监听,确保页面完全加载
+    setTimeout(() => {
+      // 监听键盘快捷键刷新
+      const handleKeyDown = (e) => {
+        // F5 或 Ctrl+R
+        if (e.key === 'F5' || (e.ctrlKey && e.key === 'r')) {
+          e.preventDefault();
+          randomJumpToOtherPage(to.path);
+        }
+      };
+      
+      // 监听浏览器刷新按钮
+      const handleBeforeUnload = (e) => {
+        // 设置刷新标记
+        sessionStorage.setItem('willRefresh', 'true');
+        sessionStorage.setItem('refreshPage', to.path);
+      };
+      
+      // 移除之前的监听器
+      document.removeEventListener('keydown', handleKeyDown);
+      window.removeEventListener('beforeunload', handleBeforeUnload);
+      
+      // 添加新的监听器
+      document.addEventListener('keydown', handleKeyDown);
+      window.addEventListener('beforeunload', handleBeforeUnload);
+    }, 500);
+  }
+});
+
+// 随机跳转到其他页面的函数
+const randomJumpToOtherPage = (currentPath) => {
+  const prankPages = ['/virus', '/ad', '/winning'];
+  const otherPages = prankPages.filter(page => page !== currentPath);
+  
+  const randomIndex = Math.floor(Math.random() * otherPages.length);
+  const randomPage = otherPages[randomIndex];
+  const randomParam = Math.random().toString(36).substring(7);
+  
+  console.log(`🎯 手动刷新检测,强制跳转: ${currentPath} → ${randomPage}?r=${randomParam}`);
+  
+  // 设置跳转时间戳
+  sessionStorage.setItem('lastRandomJump', Date.now().toString());
+  
+  // 强制跳转
+  window.location.hash = `${randomPage}?r=${randomParam}&from=${currentPath.replace('/', '')}`;
+};
+
+// 页面加载时检查是否是刷新后的页面
+window.addEventListener('load', () => {
+  const willRefresh = sessionStorage.getItem('willRefresh');
+  const refreshPage = sessionStorage.getItem('refreshPage');
+  
+  if (willRefresh === 'true' && refreshPage) {
+    sessionStorage.removeItem('willRefresh');
+    sessionStorage.removeItem('refreshPage');
+    
+    // 延迟执行跳转,确保页面完全加载
+    setTimeout(() => {
+      randomJumpToOtherPage(refreshPage);
+    }, 100);
+  }
+});
+
+// 创建Vue应用实例
+const app = createApp(App)
+
+// 使用路由
+app.use(router)
+
+// 挂载应用
+app.mount('#app')

+ 79 - 0
exgame/src/style.css

@@ -0,0 +1,79 @@
+:root {
+  font-family: system-ui, Avenir, Helvetica, Arial, sans-serif;
+  line-height: 1.5;
+  font-weight: 400;
+
+  color-scheme: light dark;
+  color: rgba(255, 255, 255, 0.87);
+  background-color: #242424;
+
+  font-synthesis: none;
+  text-rendering: optimizeLegibility;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+
+a {
+  font-weight: 500;
+  color: #646cff;
+  text-decoration: inherit;
+}
+a:hover {
+  color: #535bf2;
+}
+
+body {
+  margin: 0;
+  display: flex;
+  place-items: center;
+  min-width: 320px;
+  min-height: 100vh;
+}
+
+h1 {
+  font-size: 3.2em;
+  line-height: 1.1;
+}
+
+button {
+  border-radius: 8px;
+  border: 1px solid transparent;
+  padding: 0.6em 1.2em;
+  font-size: 1em;
+  font-weight: 500;
+  font-family: inherit;
+  background-color: #1a1a1a;
+  cursor: pointer;
+  transition: border-color 0.25s;
+}
+button:hover {
+  border-color: #646cff;
+}
+button:focus,
+button:focus-visible {
+  outline: 4px auto -webkit-focus-ring-color;
+}
+
+.card {
+  padding: 2em;
+}
+
+#app {
+  max-width: 1280px;
+  margin: 0 auto;
+  padding: 2rem;
+  text-align: center;
+}
+
+@media (prefers-color-scheme: light) {
+  :root {
+    color: #213547;
+    background-color: #ffffff;
+  }
+  a:hover {
+    color: #747bff;
+  }
+  button {
+    background-color: #f9f9f9;
+  }
+}

+ 2967 - 0
exgame/src/views/FakeAd.vue

@@ -0,0 +1,2967 @@
+<script setup>
+import { ref, onMounted, onUnmounted } from 'vue';
+import { useRouter } from 'vue-router';
+import FloatingAds from '../components/FloatingAds.vue';
+import FakeDownload from '../components/FakeDownload.vue';
+import FakeNotifications from '../components/FakeNotifications.vue';
+
+const router = useRouter();
+
+// 恶搞状态管理
+const adPopups = ref([]);
+const popupCount = ref(0);
+const showMainAd = ref(false);
+const showOverlayAd = ref(false);
+const showFloatingAds = ref(false);
+const showFakeDownload = ref(false);
+const showNotifications = ref(false);
+const showVibrationAd = ref(false);
+const showFakeVirus = ref(false);
+const showFakeUpdate = ref(false);
+const isMouseTrapped = ref(false);
+const preventClose = ref(false);
+const audioContext = ref(null);
+const showLeaveDialog = ref(false); // 自定义离开确认对话框
+const showCustomNotification = ref(false); // 自定义通知
+const customNotificationMessage = ref(''); // 通知消息
+const showPrankDialog = ref(false); // 恶搞对话框
+const prankDialogContent = ref(''); // 恶搞对话框内容
+
+// 新增超级恶心功能状态
+const isUltraAnnoyingMode = ref(false); // 超级恶心模式
+const fakeCloseButtons = ref([]); // 假关闭按钮数组
+const movingElements = ref(false); // 移动界面元素
+const invertedControls = ref(false); // 反向控制
+const fakeLoadingScreen = ref(false); // 假加载界面
+const screenShake = ref(false); // 屏幕震动
+const rapidColorChange = ref(false); // 快速变色
+const annoyanceLevel = ref(1); // 恶心等级
+const popupBombingActive = ref(false); // 弹窗轰炸激活状态
+
+// 增强版恼人广告文本
+const ultraAnnoyingTexts = [
+  "🎪 恭喜!您已被永久绑定到广告宇宙!",
+  "🔄 正在安装999999个广告插件...",
+  "🎭 您的浏览器已被广告占领!",
+  "🚀 正在传送您到广告天堂...",
+  "🎨 您的屏幕已被广告病毒感染!",
+  "🎵 正在播放24小时不间断广告音乐...",
+  "🎪 您已成为永恒广告体验的志愿者!",
+  "🔮 广告系统正在读取您的购物欲望...",
+  "🎯 恭喜!您已被广告永久锁定!",
+  "🌟 您获得了终生广告观看资格!"
+];
+
+// 恶搞音效生成器
+const createAnnoyingSound = () => {
+  if (!audioContext.value) {
+    audioContext.value = new (window.AudioContext || window.webkitAudioContext)();
+  }
+  
+  const oscillator = audioContext.value.createOscillator();
+  const gainNode = audioContext.value.createGain();
+  
+  oscillator.connect(gainNode);
+  gainNode.connect(audioContext.value.destination);
+  
+  // 制造恼人的蜂鸣声
+  oscillator.frequency.setValueAtTime(800, audioContext.value.currentTime);
+  oscillator.frequency.exponentialRampToValueAtTime(400, audioContext.value.currentTime + 0.1);
+  
+  gainNode.gain.setValueAtTime(0.3, audioContext.value.currentTime);
+  gainNode.gain.exponentialRampToValueAtTime(0.01, audioContext.value.currentTime + 0.1);
+  
+  oscillator.start();
+  oscillator.stop(audioContext.value.currentTime + 0.1);
+};
+
+// 创建恼人弹窗音效
+const createPopupSound = () => {
+  if (!audioContext.value) {
+    audioContext.value = new (window.AudioContext || window.webkitAudioContext)();
+  }
+  
+  const oscillator = audioContext.value.createOscillator();
+  const gainNode = audioContext.value.createGain();
+  
+  oscillator.connect(gainNode);
+  gainNode.connect(audioContext.value.destination);
+  
+  oscillator.frequency.setValueAtTime(1000, audioContext.value.currentTime);
+  gainNode.gain.setValueAtTime(0.2, audioContext.value.currentTime);
+  gainNode.gain.exponentialRampToValueAtTime(0.01, audioContext.value.currentTime + 0.05);
+  
+  oscillator.start();
+  oscillator.stop(audioContext.value.currentTime + 0.05);
+};
+
+// 自定义通知函数 - 替代alert
+const showCustomNotificationFn = (message) => {
+  customNotificationMessage.value = message;
+  showCustomNotification.value = true;
+  createAnnoyingSound();
+  
+  // 3秒后自动关闭通知
+  setTimeout(() => {
+    showCustomNotification.value = false;
+  }, 3000);
+};
+
+// 自定义恶搞对话框 - 替代confirm
+const showPrankDialogFn = (content, callback = null) => {
+  prankDialogContent.value = content;
+  showPrankDialog.value = true;
+  createAnnoyingSound();
+  
+  // 如果有回调函数,保存起来
+  if (callback) {
+    window.tempPrankCallback = callback;
+  }
+};
+
+// 关闭恶搞对话框
+const closePrankDialog = (choice = false) => {
+  showPrankDialog.value = false;
+  
+  // 如果有回调函数,执行它
+  if (window.tempPrankCallback) {
+    window.tempPrankCallback(choice);
+    delete window.tempPrankCallback;
+  }
+};
+
+// 生成随机位置(确保弹窗不重叠)
+const getRandomPosition = () => {
+  const maxWidth = window.innerWidth - 300;
+  const maxHeight = window.innerHeight - 200;
+  return {
+    left: `${Math.random() * maxWidth}px`,
+    top: `${Math.random() * maxHeight}px`
+  };
+};
+
+// 创建超级恼人的弹窗
+const createAnnoyingPopup = () => {
+  const popup = {
+    id: Date.now() + Math.random(),
+    text: ultraAnnoyingTexts[Math.floor(Math.random() * ultraAnnoyingTexts.length)],
+    position: getRandomPosition(),
+    zIndex: 1000 + popupCount.value
+  };
+  
+  adPopups.value.push(popup);
+  popupCount.value++;
+  
+  // 播放恼人音效
+  createPopupSound();
+  
+  // 让页面震动(如果支持)
+  if (navigator.vibrate) {
+    navigator.vibrate([100, 50, 100]);
+  }
+  
+  // 随机改变页面标题
+  const annoyingTitles = [
+    "🚨 紧急通知!",
+    "💰 恭喜中奖!",
+    "⚠️ 安全警告!",
+    "🎉 限时特价!",
+    "📱 系统通知",
+    "🔥 爆款推荐!"
+  ];
+  document.title = annoyingTitles[Math.floor(Math.random() * annoyingTitles.length)];
+};
+
+// 强制关闭弹窗(移除恶意阻拦行为)
+const closePopup = (id) => {
+  const popup = adPopups.value.find(p => p.id === id);
+  
+  // 简化关闭逻辑,移除恶意阻拦
+  adPopups.value = adPopups.value.filter(popup => popup.id !== id);
+  
+  // 关闭弹窗后偶尔创建一个新的(而不是两个)
+  if (Math.random() > 0.7 && adPopups.value.length < 3) {
+    setTimeout(() => {
+      createAnnoyingPopup();
+    }, 1000);
+  }
+};
+
+// 点击广告的恶搞行为
+const clickAd = () => {
+  createAnnoyingSound();
+  
+  // 随机恶搞行为
+  const pranks = [
+    () => showCustomNotificationFn("恭喜!您已成功被骗!这是一个恶搞网站!😄"),
+    () => {
+      showCustomNotificationFn("正在为您下载1000个文件...");
+      showFakeDownload.value = true;
+    },
+    () => {
+      showCustomNotificationFn("检测到病毒!正在启动全盘扫描...");
+      showFakeVirus.value = true;
+      router.push('/virus');
+    },
+    () => {
+      showCustomNotificationFn("您的中奖信息已发送到火星!请等待外星人联系您!");
+      createMultiplePopups();
+    },
+    () => {
+      window.location.href = "https://www.youtube.com/watch?v=dQw4w9WgXcQ"; // Rick Roll
+    }
+  ];
+  
+  const randomPrank = pranks[Math.floor(Math.random() * pranks.length)];
+  randomPrank();
+};
+
+// 创建多个弹窗轰炸(减少数量)
+const createMultiplePopups = () => {
+  // 减少弹窗数量从5个到3个
+  for (let i = 0; i < 3; i++) {
+    setTimeout(() => {
+      createAnnoyingPopup();
+    }, i * 500);
+  }
+};
+
+// 鼠标陷阱(鼠标移动到某些区域会触发弹窗)
+const handleMouseMove = (event) => {
+  if (isMouseTrapped.value && Math.random() > 0.98) {
+    createAnnoyingPopup();
+  }
+};
+
+// 阻止用户离开页面
+const blockPageLeave = (e) => {
+  e.preventDefault();
+  e.returnValue = '🎁 广告正在加载您的专属奖品!确定要离开吗?';
+  return '🎁 广告正在加载您的专属奖品!确定要离开吗?';
+};
+
+// 禁用各种快捷键
+const disableShortcuts = (e) => {
+  if (e.key === 'F12' || 
+      (e.ctrlKey && e.shiftKey && e.key === 'I') ||
+      (e.ctrlKey && e.key === 'u') ||
+      (e.ctrlKey && e.key === 'U') ||
+      (e.altKey && e.key === 'F4') ||
+      (e.ctrlKey && e.key === 'w') ||
+      (e.ctrlKey && e.key === 'W')) {
+    e.preventDefault();
+    showCustomNotificationFn('🚫 开发者工具已被广告商禁用!');
+    createAnnoyingSound();
+    return false;
+  }
+};
+
+// 禁用右键菜单
+const disableRightClick = (e) => {
+  e.preventDefault();
+  showCustomNotificationFn('🚫 右键功能已被广告保护!');
+  createAnnoyingSound();
+  return false;
+};
+
+// 检测页面失焦
+const handlePageBlur = () => {
+  showCustomNotificationFn('💰 检测到您想离开!广告正在为您计算奖金!');
+  window.focus();
+  createAnnoyingSound();
+};
+
+// 创建假关闭按钮
+const createFakeCloseButtons = () => {
+  for (let i = 0; i < 15; i++) {
+    fakeCloseButtons.value.push({
+      id: Date.now() + i,
+      x: Math.random() * (window.innerWidth - 60),
+      y: Math.random() * (window.innerHeight - 60),
+      clicked: false,
+      text: Math.random() > 0.5 ? '❌' : '🚪'
+    });
+  }
+};
+
+// 点击假关闭按钮
+const clickFakeCloseButton = (buttonId) => {
+  const button = fakeCloseButtons.value.find(b => b.id === buttonId);
+  if (button) {
+    button.clicked = true;
+    annoyanceLevel.value++;
+    
+    showCustomNotificationFn("😈 这也是假的关闭按钮!广告等级提升!");
+    createAnnoyingSound();
+    
+    // 创建更多假按钮
+    createFakeCloseButtons();
+    
+    // 激活更多恶心功能
+    if (annoyanceLevel.value > 3) {
+      activateUltraAnnoyingMode();
+    }
+  }
+};
+
+// 激活超级恶心模式
+const activateUltraAnnoyingMode = () => {
+  isUltraAnnoyingMode.value = true;
+  showCustomNotificationFn("🎪 恭喜解锁超级广告轰炸模式!");
+  
+  // 启动各种恶心效果
+  setTimeout(() => movingElements.value = true, 500);
+  setTimeout(() => invertedControls.value = true, 1000);
+  setTimeout(() => screenShake.value = true, 1500);
+  setTimeout(() => rapidColorChange.value = true, 2000);
+  setTimeout(() => popupBombingActive.value = true, 2500);
+  
+  // 开始疯狂弹窗轰炸
+  startPopupBombing();
+  
+  // 开始移动所有按钮
+  startMovingElements();
+};
+
+// 弹窗轰炸
+const startPopupBombing = () => {
+  if (popupBombingActive.value) {
+    setInterval(() => {
+      if (isUltraAnnoyingMode.value && adPopups.value.length < 10) {
+        for (let i = 0; i < 2; i++) {
+          setTimeout(() => {
+            createAnnoyingPopup();
+          }, i * 300);
+        }
+      }
+    }, 1500); // 更频繁的弹窗
+  }
+};
+
+// 移动元素功能
+const startMovingElements = () => {
+  setInterval(() => {
+    if (movingElements.value) {
+      // 让所有按钮随机移动位置
+      const buttons = document.querySelectorAll('.popup-btn, .mega-button, .overlay-btn');
+      buttons.forEach(button => {
+        if (Math.random() > 0.7) {
+          const randomX = (Math.random() - 0.5) * 100;
+          const randomY = (Math.random() - 0.5) * 100;
+          button.style.transform = `translate(${randomX}px, ${randomY}px) rotate(${Math.random() * 20 - 10}deg)`;
+          
+          setTimeout(() => {
+            button.style.transform = 'none';
+          }, 2000);
+        }
+      });
+    }
+  }, 3000);
+};
+
+// 增强版继续恶搞体验
+const continueAnnoyingExperience = () => {
+  annoyanceLevel.value++;
+  
+  // 根据点击次数增加恶心程度
+  if (annoyanceLevel.value <= 3) {
+    const fakeMessages = [
+      "🤡 想回去?你想多了!",
+      "😈 这里就是你的新家!",
+      "🎪 欢迎来到广告监狱!"
+    ];
+    showCustomNotificationFn(fakeMessages[annoyanceLevel.value - 1]);
+  } else if (annoyanceLevel.value <= 6) {
+    const escalationMessages = [
+      "🔥 广告强度正在飙升...",
+      "⚡ 系统正在释放更多广告能量...",
+      "🌪️ 广告风暴即将席卷而来..."
+    ];
+    showCustomNotificationFn(escalationMessages[annoyanceLevel.value - 4]);
+    
+    // 开始移动界面元素
+    movingElements.value = true;
+    createFakeCloseButtons();
+  } else if (annoyanceLevel.value <= 10) {
+    showCustomNotificationFn("🚀 恭喜触发终极广告轰炸模式!");
+    activateUltraAnnoyingMode();
+    
+    // 启动假加载
+    showFakeLoading();
+  } else {
+    // 超过10次点击,给假的"怜悯"选项
+    showPrankDialogFn(
+      '🙏 您已经尝试逃离了' + annoyanceLevel.value + '次!\n\n真的想显示离开选项吗?\n\n(提示:选"否"可能会更糟糕)',
+      (choice) => {
+        if (choice) {
+          // 即使用户选择"是",也继续恶搞
+          setTimeout(() => {
+            showCustomNotificationFn("😈 刚才只是在测试您的耐心!广告继续!");
+            activateUltraAnnoyingMode();
+            createFakeCloseButtons();
+          }, 2000);
+        } else {
+          showCustomNotificationFn("🎉 您选择了继续广告体验!恶心等级MAX!");
+          annoyanceLevel.value = 999;
+          activateUltraAnnoyingMode();
+          
+          // 疯狂轰炸
+          for (let i = 0; i < 5; i++) {
+            setTimeout(() => createAnnoyingPopup(), i * 1000);
+          }
+        }
+      }
+    );
+  }
+  
+  // 每次点击都触发更多恶搞内容
+  triggerPrankContent();
+  createAnnoyingSound();
+};
+
+// 触发恶搞内容
+const triggerPrankContent = () => {
+  const prankActions = [
+    () => createMultiplePopups(),
+    () => {
+      document.body.style.filter = 'hue-rotate(' + Math.random() * 360 + 'deg) brightness(' + (0.5 + Math.random()) + ')';
+      setTimeout(() => {
+        document.body.style.filter = 'none';
+      }, 3000);
+    },
+    () => {
+      document.body.style.transform = 'rotate(' + (Math.random() * 6 - 3) + 'deg) scale(' + (0.95 + Math.random() * 0.1) + ')';
+      setTimeout(() => {
+        document.body.style.transform = 'none';
+      }, 2000);
+    },
+    () => showFakeLoading(),
+    () => createFakeCloseButtons(),
+    () => {
+      // 让整个页面闪烁
+      document.body.style.opacity = '0.5';
+      setTimeout(() => {
+        document.body.style.opacity = '1';
+      }, 500);
+    }
+  ];
+  
+  const randomAction = prankActions[Math.floor(Math.random() * prankActions.length)];
+  randomAction();
+};
+
+// 假加载屏幕
+const showFakeLoading = () => {
+  fakeLoadingScreen.value = true;
+  showCustomNotificationFn("正在连接广告母星...");
+  
+  let progress = 0;
+  const loadingInterval = setInterval(() => {
+    progress += Math.random() * 3;
+    if (progress >= 99.8) {
+      progress = 99.8;
+      clearInterval(loadingInterval);
+      
+      // 假装加载失败,然后重新开始
+      setTimeout(() => {
+        fakeLoadingScreen.value = false;
+        showCustomNotificationFn("连接失败!正在重新建立广告链接...");
+        
+        // 重新开始假加载
+        setTimeout(() => {
+          if (isUltraAnnoyingMode.value) {
+            showFakeLoading();
+          }
+        }, 3000);
+      }, 5000);
+    }
+  }, 150);
+};
+
+// 生成随机访问者编号
+const getRandomVisitorNumber = () => {
+  return (1000000 + Math.floor(Math.random() * 1000)).toLocaleString();
+};
+
+// 生成随机倒计时
+const getRandomTime = () => {
+  const hours = Math.floor(Math.random() * 24).toString().padStart(2, '0');
+  const minutes = Math.floor(Math.random() * 60).toString().padStart(2, '0');
+  const seconds = Math.floor(Math.random() * 60).toString().padStart(2, '0');
+  return `${hours}:${minutes}:${seconds}`;
+};
+
+// 生成随机IP地址
+const getRandomIP = () => {
+  return `${Math.floor(Math.random() * 255)}.${Math.floor(Math.random() * 255)}.${Math.floor(Math.random() * 255)}.${Math.floor(Math.random() * 255)}`;
+};
+
+// 生成随机奖品价值
+const getRandomPrizeValue = () => {
+  return (Math.random() * 10000000 + 1000000).toFixed(0);
+};
+
+// 生成随机病毒数量
+const getRandomVirusCount = () => {
+  return Math.floor(Math.random() * 999) + 1;
+};
+
+// 显示自定义离开确认对话框
+const showCustomLeaveDialog = () => {
+  showLeaveDialog.value = true;
+  createAnnoyingSound();
+};
+
+// 用户确认离开
+const confirmLeave = () => {
+  const farewell = [
+    "👋 感谢体验恶搞广告!",
+    "💔 我们会想念您的!",
+    "🎭 希望您玩得开心!",
+    "🔄 随时欢迎回来继续恶搞!",
+    "😄 成功逃脱广告轰炸!"
+  ];
+  
+  showCustomNotificationFn(farewell[Math.floor(Math.random() * farewell.length)]);
+  showLeaveDialog.value = false;
+  
+  // 延迟跳转,让用户看到通知
+  setTimeout(() => {
+    router.push('/');
+  }, 1500);
+};
+
+// 用户选择继续留下
+const stayAndContinue = () => {
+  showLeaveDialog.value = false;
+  showCustomNotificationFn("🎉 明智的选择!广告轰炸继续!");
+  
+  // 重新激活所有恶搞功能
+  showMainAd.value = true;
+  showOverlayAd.value = true;
+  createMultiplePopups();
+  createAnnoyingSound();
+};
+
+// 增强版恶搞轮盘
+const showLuckyWheel = ref(false);
+const wheelSpinning = ref(false);
+const wheelResult = ref('');
+const luckyWheelPrizes = [
+  '🎁 恭喜获得空气一份!',
+  '💰 恭喜获得梦想一个!',
+  '🏠 恭喜获得云彩别墅!',
+  '🚗 恭喜获得想象跑车!',
+  '💎 恭喜获得虚拟钻石!',
+  '🎪 恭喜获得永恒恶搞!',
+  '🎭 恭喜获得无限套路!',
+  '🎨 恭喜获得画饼技能!'
+];
+
+// 疯狂弹窗类型
+const popupTypes = [
+  'urgent-winner', 'fake-security', 'celebrity-call', 'limited-time',
+  'virus-warning', 'bank-notification', 'system-update', 'exclusive-offer',
+  'friend-recommendation', 'government-notice', 'lucky-draw', 'prize-expired'
+];
+
+// 弹窗轰炸计数器
+const popupBombCount = ref(0);
+const maxPopups = ref(20); // 最大同时弹窗数
+
+// 创建疯狂弹窗
+const createCrazyPopup = (type = null) => {
+  if (adPopups.value.length >= maxPopups.value) {
+    // 如果达到最大数量,移除最老的弹窗
+    adPopups.value.shift();
+  }
+  
+  const popupType = type || popupTypes[Math.floor(Math.random() * popupTypes.length)];
+  const popup = {
+    id: Date.now() + Math.random(),
+    type: popupType,
+    text: getCrazyPopupText(popupType),
+    position: getRandomPosition(),
+    zIndex: 1000 + popupCount.value,
+    isMoving: Math.random() > 0.7,
+    color: getRandomColor(),
+    size: Math.random() > 0.5 ? 'large' : 'normal'
+  };
+  
+  adPopups.value.push(popup);
+  popupCount.value++;
+  popupBombCount.value++;
+  
+  // 播放恼人音效
+  createPopupSound();
+  
+  // 页面震动
+  if (navigator.vibrate) {
+    navigator.vibrate([100, 50, 100]);
+  }
+  
+  // 随机改变页面标题
+  updateAnnoyingTitle();
+};
+
+// 获取疯狂弹窗文本
+const getCrazyPopupText = (type) => {
+  const popupTexts = {
+    'urgent-winner': [
+      '🚨 紧急通知:您是第99999位访客!立即领取999万!',
+      '⚠️ 警告:奖品库存仅剩1份!马上领取!',
+      '🔥 热烈祝贺:您被选为超级幸运用户!'
+    ],
+    'fake-security': [
+      '🔒 安全提醒:检测到异常访问,请立即验证身份!',
+      '🛡️ 系统保护:为保护您的奖品,请完成安全认证!',
+      '⚡ 防护警告:发现可疑活动,请立即处理!'
+    ],
+    'celebrity-call': [
+      '📞 马🐴来电:恭喜您中奖!请接听重要电话!',
+      '📱 雷🐯留言:我也是在这里发家致富的!',
+      '💬 刘🐧推荐:错过这次机会您会后悔终生!'
+    ],
+    'limited-time': [
+      '⏰ 限时特价:仅剩3分59秒!错过再等100年!',
+      '⏳ 倒计时:距离活动结束还有2小时!',
+      '🕐 最后机会:优惠即将结束,立即行动!'
+    ],
+    'virus-warning': [
+      '🦠 病毒警告:检测到恶意软件!立即下载杀毒软件!',
+      '⚠️ 安全威胁:您的电脑已被感染!马上清理!',
+      '🔥 紧急:发现木马病毒!点击立即清除!'
+    ],
+    'bank-notification': [
+      '🏦 银行通知:您的账户有999万待入账!',
+      '💳 支付提醒:检测到大额转账,请确认身份!',
+      '💰 财务通知:您的投资已获得超额收益!'
+    ],
+    'system-update': [
+      '🔄 系统更新:正在安装重要安全补丁...',
+      '⚙️ 程序升级:恶搞系统正在升级到2.0版本!',
+      '🔧 维护通知:系统将在5秒后重启!'
+    ],
+    'exclusive-offer': [
+      '🎁 专属优惠:仅限今日!VIP会员免费升级!',
+      '⭐ 特别邀请:您已被选为内测用户!',
+      '🏆 独家福利:恭喜获得终身免费资格!'
+    ],
+    'friend-recommendation': [
+      '👥 好友推荐:您的朋友李小明推荐您参加!',
+      '🤝 社交分享:已有10000+好友成功中奖!',
+      '💫 口碑推荐:99.9%用户都选择了我们!'
+    ],
+    'government-notice': [
+      '🏛️ 官方通知:根据新政策,您有资格领取补贴!',
+      '📜 政府公告:恭喜您符合特殊奖励条件!',
+      '🎖️ 国家认证:您已获得官方认可资格!'
+    ],
+    'lucky-draw': [
+      '🎰 幸运抽奖:恭喜您获得转盘机会!立即参与!',
+      '🎲 运气爆棚:今天是您的幸运日!',
+      '🌟 天选之子:您的运气值已达到MAX!'
+    ],
+    'prize-expired': [
+      '⏰ 奖品到期:您的奖品将在60秒后作废!',
+      '🚨 紧急提醒:未领取的奖品即将清空!',
+      '⚠️ 最后通牒:过期奖品无法找回!'
+    ]
+  };
+  
+  const texts = popupTexts[type] || popupTexts['urgent-winner'];
+  return texts[Math.floor(Math.random() * texts.length)];
+};
+
+// 获取随机颜色
+const getRandomColor = () => {
+  const colors = [
+    'linear-gradient(45deg, #ff6b6b, #ee5a24)',
+    'linear-gradient(45deg, #feca57, #ff9ff3)',
+    'linear-gradient(45deg, #48dbfb, #0abde3)',
+    'linear-gradient(45deg, #1dd1a1, #10ac84)',
+    'linear-gradient(45deg, #a55eea, #8c7ae6)',
+    'linear-gradient(45deg, #fd79a8, #e84393)',
+    'linear-gradient(45deg, #fdcb6e, #e17055)',
+    'linear-gradient(45deg, #6c5ce7, #a29bfe)'
+  ];
+  return colors[Math.floor(Math.random() * colors.length)];
+};
+
+// 更新恼人标题
+const updateAnnoyingTitle = () => {
+  const titles = [
+    '🚨 ' + popupBombCount.value + '个弹窗已激活!',
+    '🎪 恶搞进度:' + Math.min(popupBombCount.value * 5, 100) + '%',
+    '💥 弹窗轰炸中...请勿关闭!',
+    '🎯 您已被' + popupBombCount.value + '个广告锁定!',
+    '🔥 广告强度:' + Math.min(annoyanceLevel.value * 20, 100) + '%',
+    '⚡ 系统繁忙:处理中' + popupBombCount.value + '个任务',
+    '🌪️ 广告风暴等级:' + Math.min(Math.floor(popupBombCount.value / 5), 10)
+  ];
+  document.title = titles[Math.floor(Math.random() * titles.length)];
+};
+
+// 超级弹窗轰炸模式
+const activateSuperPopupBombing = () => {
+  showCustomNotificationFn("🎪 超级弹窗轰炸模式已激活!");
+  
+  // 连续创建多个不同类型的弹窗
+  for (let i = 0; i < 5; i++) {
+    setTimeout(() => {
+      createCrazyPopup(popupTypes[i % popupTypes.length]);
+    }, i * 500);
+  }
+  
+  // 启动持续轰炸
+  const bombingInterval = setInterval(() => {
+    if (isUltraAnnoyingMode.value && adPopups.value.length < maxPopups.value) {
+      for (let i = 0; i < 3; i++) {
+        setTimeout(() => {
+          createCrazyPopup();
+        }, i * 200);
+      }
+    }
+  }, 2000);
+  
+  // 30秒后减缓频率(但不停止)
+  setTimeout(() => {
+    clearInterval(bombingInterval);
+    
+    // 启动温和一些的持续轰炸
+    setInterval(() => {
+      if (isUltraAnnoyingMode.value && Math.random() > 0.3) {
+        createCrazyPopup();
+      }
+    }, 3000);
+  }, 30000);
+};
+
+// 显示幸运转盘
+const showLuckyWheelPopup = () => {
+  showLuckyWheel.value = true;
+  showCustomNotificationFn("🎰 恭喜!您获得了专属转盘机会!");
+  createAnnoyingSound();
+};
+
+// 转动转盘
+const spinWheel = () => {
+  if (wheelSpinning.value) return;
+  
+  wheelSpinning.value = true;
+  createAnnoyingSound();
+  
+  // 模拟转盘旋转
+  setTimeout(() => {
+    wheelSpinning.value = false;
+    wheelResult.value = luckyWheelPrizes[Math.floor(Math.random() * luckyWheelPrizes.length)];
+    
+    // 显示中奖结果
+    setTimeout(() => {
+      showCustomNotificationFn(`🎉 转盘结果:${wheelResult.value}`);
+      
+      // 继续恶搞 - 要求再次转盘
+      setTimeout(() => {
+        showCustomNotificationFn("✨ 再转一次可获得更大奖品!");
+        activateSuperPopupBombing(); // 激活超级弹窗轰炸
+      }, 2000);
+    }, 1000);
+  }, 3000);
+};
+
+// 关闭幸运转盘(假的)
+const closeLuckyWheel = () => {
+  // 假装关闭,实际上创建更多弹窗
+  showLuckyWheel.value = false;
+  showCustomNotificationFn("🎪 关闭转盘?那就来更多弹窗吧!");
+  activateSuperPopupBombing();
+};
+
+// 增强版触发随机恶搞内容
+const triggerRandomPrankContent = () => {
+  const prankActions = [
+    () => createCrazyPopup('urgent-winner'),
+    () => createCrazyPopup('fake-security'), 
+    () => createCrazyPopup('celebrity-call'),
+    () => showLuckyWheelPopup(),
+    () => activateSuperPopupBombing(),
+    () => {
+      // 创建多个假关闭按钮
+      for (let i = 0; i < 10; i++) {
+        fakeCloseButtons.value.push({
+          id: Date.now() + i + Math.random(),
+          x: Math.random() * (window.innerWidth - 50),
+          y: Math.random() * (window.innerHeight - 50),
+          text: ['❌', '✕', '×', '✖', '⨯'][Math.floor(Math.random() * 5)],
+          clicked: false
+        });
+      }
+    },
+    () => {
+      // 疯狂改变页面样式
+      document.body.style.filter = `hue-rotate(${Math.random() * 360}deg) saturate(${1 + Math.random() * 2}) brightness(${0.5 + Math.random()})`;
+      setTimeout(() => {
+        document.body.style.filter = 'none';
+      }, 3000);
+    },
+    () => {
+      // 创建虚假系统消息
+      const systemMessages = [
+        'Windows正在下载更新... 99%',
+        '系统即将重启以安装更新',
+        '检测到病毒,正在清理中...',
+        '内存不足,建议关闭其他程序',
+        'CPU使用率过高,系统运行缓慢'
+      ];
+      showCustomNotificationFn(systemMessages[Math.floor(Math.random() * systemMessages.length)]);
+    }
+  ];
+  
+  // 随机执行1-3个恶搞动作
+  const actionCount = Math.floor(Math.random() * 3) + 1;
+  for (let i = 0; i < actionCount; i++) {
+    setTimeout(() => {
+      const randomAction = prankActions[Math.floor(Math.random() * prankActions.length)];
+      randomAction();
+    }, i * 1000);
+  }
+};
+
+onMounted(() => {
+  // 立即显示主广告
+  setTimeout(() => {
+    showMainAd.value = true;
+    createAnnoyingSound();
+  }, 500);
+  
+  // 减缓弹窗轰炸频率 - 从1.5秒改为3秒
+  const popupInterval = setInterval(() => {
+    // 限制最大弹窗数量
+    if (adPopups.value.length < 5) {
+      createAnnoyingPopup();
+    }
+  }, 3000);
+  
+  // 显示各种恶搞组件
+  setTimeout(() => showFloatingAds.value = true, 2000);
+  setTimeout(() => showOverlayAd.value = true, 5000);
+  setTimeout(() => showNotifications.value = true, 3000);
+  
+  // 激活鼠标陷阱
+  setTimeout(() => {
+    isMouseTrapped.value = true;
+  }, 3000);
+  
+  // 立即创建假关闭按钮
+  createFakeCloseButtons();
+
+  // 每5秒随机播放恶心音效
+  setInterval(() => {
+    if (Math.random() > 0.6) {
+      createAnnoyingSound();
+    }
+  }, 5000);
+
+  // 每3秒随机更改页面标题
+  const annoyingTitles = [
+    '🎉 恭喜中奖!点击领取百万大奖!',
+    '⚠️ 您的电脑已被感染!立即清理!',
+    '💰 限时优惠!错过再等100年!',
+    '🚨 系统警告!请勿关闭此页面!',
+    '🎁 免费iPhone等你来拿!',
+    '⭐ 广告宇宙欢迎您的到来!',
+    '🔥 热门!单身美女等你聊天!',
+    '💎 钻石会员专属特权!'
+  ];
+  
+  setInterval(() => {
+    const randomTitle = annoyingTitles[Math.floor(Math.random() * annoyingTitles.length)];
+    document.title = randomTitle;
+  }, 3000);
+
+  // 监控用户行为,恶心等级达到5时激活超级恶心模式
+  setInterval(() => {
+    if (annoyanceLevel.value >= 5 && !isUltraAnnoyingMode.value) {
+      activateUltraAnnoyingMode();
+    }
+    
+    // 如果处于超级恶心模式,随机触发恶搞内容
+    if (isUltraAnnoyingMode.value && Math.random() > 0.7) {
+      triggerPrankContent();
+    }
+  }, 2000);
+
+  // 每15秒自动增加恶心等级(最大10级)
+  setInterval(() => {
+    if (annoyanceLevel.value < 10) {
+      annoyanceLevel.value++;
+      showCustomNotificationFn(`广告恶心等级提升至 ${annoyanceLevel.value} 级!`);
+    }
+  }, 15000);
+  
+  // 添加键盘和右键限制(保留恶搞效果)
+  document.addEventListener('mousemove', handleMouseMove);
+  document.addEventListener('contextmenu', disableRightClick);
+  document.addEventListener('keydown', disableShortcuts);
+  
+  // 禁用键盘快捷键,包括F5刷新、Ctrl+W关闭等
+  document.addEventListener('keydown', (e) => {
+    // 禁用F5刷新
+    if (e.key === 'F5') {
+      e.preventDefault();
+      showCustomNotificationFn('刷新功能已被广告系统锁定!');
+      createAnnoyingSound();
+    }
+    
+    // 禁用Ctrl+W关闭窗口
+    if (e.ctrlKey && e.key === 'w') {
+      e.preventDefault();
+      showCustomNotificationFn('关闭功能已被广告系统接管!');
+      createAnnoyingSound();
+    }
+    
+    // 禁用Alt+F4
+    if (e.altKey && e.key === 'F4') {
+      e.preventDefault();
+      showCustomNotificationFn('Alt+F4已被广告系统屏蔽!');
+      createAnnoyingSound();
+    }
+    
+    // 禁用Ctrl+T新建标签页
+    if (e.ctrlKey && e.key === 't') {
+      e.preventDefault();
+      showCustomNotificationFn('新建标签页功能已被锁定!');
+    }
+    
+    // 禁用Escape键
+    if (e.key === 'Escape') {
+      e.preventDefault();
+      showCustomNotificationFn('Escape键在广告宇宙中无效!');
+      createAnnoyingSound();
+    }
+  });
+  
+  // 定时改变背景颜色制造闪烁效果
+  const colorInterval = setInterval(() => {
+    const colors = ['#ff6b6b', '#4ecdc4', '#45b7d1', '#96ceb4', '#ffeaa7'];
+    document.body.style.backgroundColor = colors[Math.floor(Math.random() * colors.length)];
+  }, 3000);
+  
+  // 页面加载完成后开始持续的音效骚扰(减少频率)
+  setTimeout(() => {
+    const soundInterval = setInterval(() => {
+      if (Math.random() > 0.8) { // 从0.7改为0.8,减少音效频率
+        createAnnoyingSound();
+      }
+    }, 8000); // 从5秒改为8秒
+  }, 10000);
+
+  // 监控页面失焦事件(用户试图离开)
+  window.addEventListener('blur', () => {
+    if (isUltraAnnoyingMode.value) {
+      showCustomNotificationFn('想逃跑?门都没有!');
+      createAnnoyingSound();
+    }
+  });
+
+  // 20秒后随机显示假加载屏幕
+  setTimeout(() => {
+    if (Math.random() > 0.5) {
+      showFakeLoading();
+    }
+  }, 20000);
+
+  // 开始监控鼠标移动(反向控制)
+  if (invertedControls.value) {
+    document.addEventListener('mousemove', (e) => {
+      if (invertedControls.value) {
+        // 反向鼠标控制
+        const invertedX = window.innerWidth - e.clientX;
+        const invertedY = window.innerHeight - e.clientY;
+        
+        // 创建虚假光标指示器
+        let fakeCursor = document.getElementById('fake-cursor');
+        if (!fakeCursor) {
+          fakeCursor = document.createElement('div');
+          fakeCursor.id = 'fake-cursor';
+          fakeCursor.style.cssText = `
+            position: fixed;
+            width: 20px;
+            height: 20px;
+            background: red;
+            border-radius: 50%;
+            pointer-events: none;
+            z-index: 10000;
+            transition: all 0.1s ease;
+          `;
+          document.body.appendChild(fakeCursor);
+        }
+        
+        fakeCursor.style.left = invertedX + 'px';
+        fakeCursor.style.top = invertedY + 'px';
+      }
+    });
+  }
+
+  // 添加页面失焦处理
+  window.addEventListener('blur', handlePageBlur);
+});
+
+onUnmounted(() => {
+  // 清理事件监听器
+  document.removeEventListener('mousemove', handleMouseMove);
+  // 移除页面离开阻拦
+  // window.removeEventListener('beforeunload', blockPageLeave);
+  document.removeEventListener('contextmenu', disableRightClick);
+  document.removeEventListener('keydown', disableShortcuts);
+
+  // 移除页面失焦处理
+  window.removeEventListener('blur', handlePageBlur);
+});
+
+// 获取弹窗标题
+const getPopupTitle = (type) => {
+  const titles = {
+    'urgent-winner': '🚨 紧急通知',
+    'fake-security': '🔒 安全提醒',
+    'celebrity-call': '📞 马🐴来电',
+    'limited-time': '⏰ 限时特价',
+    'virus-warning': '🦠 病毒警告',
+    'bank-notification': '🏦 银行通知',
+    'system-update': '🔄 系统更新',
+    'exclusive-offer': '🎁 专属优惠',
+    'friend-recommendation': '👥 好友推荐',
+    'government-notice': '🏛️ 官方通知',
+    'lucky-draw': '🎰 幸运抽奖',
+    'prize-expired': '⏰ 奖品到期'
+  };
+  return titles[type] || titles['urgent-winner'];
+};
+
+// 获取弹窗图标
+const getPopupIcon = (type) => {
+  const icons = {
+    'urgent-winner': '🏆',
+    'fake-security': '🔒',
+    'celebrity-call': '📞',
+    'limited-time': '⏰',
+    'virus-warning': '🦠',
+    'bank-notification': '🏦',
+    'system-update': '🔄',
+    'exclusive-offer': '🎁',
+    'friend-recommendation': '👥',
+    'government-notice': '🏛️',
+    'lucky-draw': '🎰',
+    'prize-expired': '⏰'
+  };
+  return icons[type] || icons['urgent-winner'];
+};
+
+// 获取按钮文本
+const getActionButtonText = (type) => {
+  const texts = {
+    'urgent-winner': '🏆 立即领取',
+    'fake-security': '🔒 立即验证',
+    'celebrity-call': '📞 接听电话',
+    'limited-time': '🕐 立即行动',
+    'virus-warning': '🦠 立即下载',
+    'bank-notification': '🏦 立即转账',
+    'system-update': '🔄 立即更新',
+    'exclusive-offer': '🎁 VIP升级',
+    'friend-recommendation': '👥 推荐好友',
+    'government-notice': '🏛️ 领取补贴',
+    'lucky-draw': '🎰 参与抽奖',
+    'prize-expired': '⚡ 紧急领取'
+  };
+  return texts[type] || texts['urgent-winner'];
+};
+
+// 获取倒计时
+const getFakeCountdown = () => {
+  const now = new Date().getTime();
+  const end = new Date(now + 1000 * 60 * 60 * 24).getTime();
+  const diff = end - now;
+  const days = Math.floor(diff / (1000 * 60 * 60 * 24));
+  const hours = Math.floor((diff % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
+  const minutes = Math.floor((diff % (1000 * 60 * 60)) / (1000 * 60));
+  const seconds = Math.floor((diff % (1000 * 60)) / 1000);
+  return `${days}天 ${hours}小时 ${minutes}分钟 ${seconds}秒`;
+};
+
+// 处理弹窗操作
+const handlePopupAction = (popup) => {
+  switch (popup.type) {
+    case 'urgent-winner':
+      activateSuperPopupBombing();
+      break;
+    case 'fake-security':
+      createCrazyPopup('virus-warning');
+      break;
+    case 'celebrity-call':
+      createCrazyPopup('government-notice');
+      break;
+    case 'lucky-draw':
+      showLuckyWheelPopup();
+      break;
+    case 'prize-expired':
+      triggerRandomPrankContent();
+      break;
+    default:
+      // 处理其他类型的弹窗操作
+      break;
+  }
+};
+</script>
+
+<template>
+  <div class="fake-ad-container">
+    <!-- 恶搞头部 -->
+    <div class="header">
+      <button 
+        class="back-btn" 
+        @click="continueAnnoyingExperience"
+        :class="{ 'moving': movingElements, 'shake': screenShake }"
+      >
+        继续体验
+      </button>
+      <div class="annoying-banner">
+        <span class="blink-text">🔥 超级特价!今日限时!🔥</span>
+      </div>
+    </div>
+    
+    <!-- 大量假关闭按钮 -->
+    <div 
+      v-for="btn in fakeCloseButtons" 
+      :key="btn.id"
+      class="scattered-fake-button"
+      :style="{ left: btn.x + 'px', top: btn.y + 'px' }"
+      @click="clickFakeCloseButton(btn.id)"
+      :class="{ 'clicked': btn.clicked, 'moving': movingElements }"
+    >
+      {{ btn.text }}
+    </div>
+
+    <!-- 假加载屏幕 -->
+    <div v-if="fakeLoadingScreen" class="fake-loading-overlay">
+      <div class="fake-loading-content">
+        <div class="loading-spinner"></div>
+        <h2>🎪 广告系统升级中...</h2>
+        <div class="loading-bar">
+          <div class="loading-progress"></div>
+        </div>
+        <p class="loading-text">正在下载更多广告内容... 99.8%</p>
+        <p class="loading-subtext">⚠️ 请勿离开,广告即将变得更精彩!</p>
+      </div>
+    </div>
+
+    <!-- 超级恶心模式指示器 -->
+    <div v-if="isUltraAnnoyingMode" class="ultra-mode-indicator">
+      <div class="mode-badge">🎪 超级广告模式已激活</div>
+      <div class="annoyance-meter">
+        <div class="meter-fill" :style="{ width: Math.min(annoyanceLevel * 10, 100) + '%' }"></div>
+        <span class="meter-text">恶心等级: {{ annoyanceLevel }}</span>
+      </div>
+    </div>
+
+    <!-- 移动的恶搞文本 -->
+    <div v-if="movingElements" class="moving-text-container">
+      <div class="moving-text" v-for="n in 6" :key="n">
+        🎭 您已被广告永久绑定!
+      </div>
+    </div>
+    
+    <!-- 背景恶搞效果 -->
+    <div class="background-effects">
+      <div class="floating-money">💰</div>
+      <div class="floating-money">💎</div>
+      <div class="floating-money">🎁</div>
+      <div class="floating-money">🎉</div>
+      <div class="floating-money">💸</div>
+    </div>
+    
+    <!-- 弹窗容器 -->
+    <div class="popup-container">
+      <div 
+        v-for="popup in adPopups" 
+        :key="popup.id" 
+        class="ad-popup crazy-popup"
+        :class="[
+          `popup-${popup.type}`, 
+          `popup-${popup.size}`,
+          { 'moving-popup': popup.isMoving }
+        ]"
+        :style="{ 
+          left: popup.position.left, 
+          top: popup.position.top,
+          zIndex: popup.zIndex,
+          background: popup.color
+        }"
+      >
+        <div class="popup-header crazy-header">
+          <span class="popup-title" v-html="getPopupTitle(popup.type)"></span>
+          <div class="fake-controls">
+            <span class="fake-minimize">➖</span>
+            <span class="fake-maximize">⬜</span>
+            <button 
+              class="close-btn crazy-close" 
+              @click="closePopup(popup.id)"
+              title="关闭弹窗"
+            >
+              ❌
+            </button>
+          </div>
+        </div>
+        
+        <div class="popup-body crazy-body">
+          <div class="popup-icon" v-html="getPopupIcon(popup.type)"></div>
+          <div class="popup-text" v-html="popup.text"></div>
+          
+          <!-- 根据弹窗类型显示不同按钮 -->
+          <div class="popup-actions">
+            <button 
+              v-if="popup.type === 'urgent-winner'" 
+              class="action-btn winner-btn"
+              @click="activateSuperPopupBombing"
+            >
+              🏆 立即领取
+            </button>
+            
+            <button 
+              v-if="popup.type === 'fake-security'" 
+              class="action-btn security-btn"
+              @click="createCrazyPopup('virus-warning')"
+            >
+              🔒 立即验证
+            </button>
+            
+            <button 
+              v-if="popup.type === 'celebrity-call'" 
+              class="action-btn celebrity-btn"
+              @click="createCrazyPopup('government-notice')"
+            >
+              📞 接听电话
+            </button>
+            
+            <button 
+              v-if="popup.type === 'lucky-draw'" 
+              class="action-btn lucky-btn"
+              @click="showLuckyWheelPopup"
+            >
+              🎰 参与抽奖
+            </button>
+            
+            <button 
+              v-if="popup.type === 'prize-expired'" 
+              class="action-btn urgent-btn"
+              @click="triggerRandomPrankContent"
+            >
+              ⚡ 紧急领取
+            </button>
+            
+            <!-- 通用按钮 -->
+            <button 
+              class="action-btn default-btn"
+              @click="handlePopupAction(popup)"
+            >
+              {{ getActionButtonText(popup.type) }}
+            </button>
+            
+            <button 
+              class="action-btn cancel-btn"
+              @click="createCrazyPopup()"
+            >
+              ❌ 拒绝
+            </button>
+          </div>
+        </div>
+        
+        <!-- 假的进度条 -->
+        <div v-if="popup.type === 'system-update'" class="fake-progress">
+          <div class="progress-bar">
+            <div class="progress-fill"></div>
+          </div>
+          <span class="progress-text">系统更新中... 99.9%</span>
+        </div>
+        
+        <!-- 假的倒计时 -->
+        <div v-if="popup.type === 'limited-time' || popup.type === 'prize-expired'" class="fake-countdown">
+          <span class="countdown-label">剩余时间:</span>
+          <span class="countdown-timer">{{ getFakeCountdown() }}</span>
+        </div>
+      </div>
+    </div>
+    
+    <!-- 超级恼人的主广告 -->
+    <div v-if="showMainAd" class="main-ad animate__animated animate__zoomIn">
+      <div class="main-ad-content">
+        <h3 class="rainbow-text">🎊 超级大奖 🎊</h3>
+        <p class="blink-text mega-text">您是第{{ getRandomVisitorNumber() }}位访问者!</p>
+        <div class="prize-showcase">
+          <div class="prize-item">🏠 别墅一套</div>
+          <div class="prize-item">🚗 豪车一辆</div>
+          <div class="prize-item">💰 现金100万</div>
+          <div class="prize-item">💎 黄金10公斤</div>
+        </div>
+        <p class="urgent-text">⚠️ 24小时内领取,否则自动作废!</p>
+        <button class="claim-btn mega-button animate__animated animate__pulse animate__infinite" @click="clickAd">
+          🎯 立即领取全部奖品!
+        </button>
+        <div class="fake-timer">
+          倒计时:{{ getRandomTime() }}
+        </div>
+        <button class="close-main-ad" @click="continueAnnoyingExperience">×</button>
+      </div>
+    </div>
+    
+    <!-- 全屏覆盖恶搞广告 - 永远显示 -->
+    <div v-if="showOverlayAd" class="overlay-ad animate__animated animate__fadeIn">
+      <div class="overlay-content">
+        <h2 class="rainbow-text">🎁 永恒天降大奖!🎁</h2>
+        <p class="mega-text">您的永恒IP地址 {{ getRandomIP() }}</p>
+        <div class="prize-wheel"></div>
+        <p class="blink-text">无限奖品总价值:¥{{ getRandomPrizeValue() }}</p>
+        <button class="overlay-btn mega-button" @click="clickAd">
+          🏆 永远转动幸运轮盘!
+        </button>
+        <div class="warning-text">
+          ⚠️ 不领取将永远待在这里!
+        </div>
+        <button class="overlay-close" @click="continueAnnoyingExperience">×</button>
+      </div>
+    </div>
+    
+    <!-- 假病毒警告 -->
+    <div v-if="showFakeVirus" class="virus-warning animate__animated animate__flash">
+      <h2>🚨 检测到严重病毒感染!🚨</h2>
+      <p>已发现 {{ getRandomVirusCount() }} 个恶意软件!</p>
+      <button @click="showFakeVirus = false">立即修复</button>
+    </div>
+    
+    <!-- 浮动广告组件 -->
+    <FloatingAds v-if="showFloatingAds" />
+    
+    <!-- 假下载组件 -->
+    <FakeDownload v-if="showFakeDownload" />
+    
+    <!-- 假通知组件 -->
+    <FakeNotifications v-if="showNotifications" />
+    
+    <!-- 自定义离开确认对话框 -->
+    <div v-if="showLeaveDialog" class="leave-dialog-overlay">
+      <div class="leave-dialog">
+        <div class="leave-dialog-header">
+          <h3>🎯 真的要离开广告天堂吗?</h3>
+        </div>
+        <div class="leave-dialog-content">
+          <p>离开就意味着你将错过:</p>
+          <ul class="miss-list">
+            <li>💰 100万现金大奖</li>
+            <li>🏠 豪华别墅一套</li>
+            <li>🚗 限量版跑车</li>
+            <li>💎 钻石珠宝礼盒</li>
+            <li>🎪 永恒的广告体验</li>
+          </ul>
+          <p class="final-plea">再想想吧,机会难得!</p>
+        </div>
+        <div class="leave-dialog-buttons">
+          <button @click="stayAndContinue" class="stay-button">留下来享受!</button>
+          <button @click="confirmLeave" class="leave-button">我意已决</button>
+        </div>
+      </div>
+    </div>
+    
+    <!-- 自定义通知 - 替代alert -->
+    <div v-if="showCustomNotification" class="custom-notification">
+      <div class="notification-content">
+        <div class="notification-icon">🔔</div>
+        <div class="notification-message">{{ customNotificationMessage }}</div>
+        <button class="notification-close" @click="showCustomNotification = false">×</button>
+      </div>
+    </div>
+    
+    <!-- 自定义恶搞对话框 - 替代confirm -->
+    <div v-if="showPrankDialog" class="prank-dialog-overlay">
+      <div class="prank-dialog">
+        <div class="prank-dialog-header">
+          <h3>🎭 恶搞提示</h3>
+        </div>
+        <div class="prank-dialog-content">
+          <p>{{ prankDialogContent }}</p>
+        </div>
+        <div class="prank-dialog-buttons">
+          <button @click="closePrankDialog(true)" class="prank-yes-button">是</button>
+          <button @click="closePrankDialog(false)" class="prank-no-button">否</button>
+        </div>
+      </div>
+    </div>
+
+    <!-- 幸运转盘弹窗 -->
+    <div v-if="showLuckyWheel" class="lucky-wheel-overlay">
+      <div class="lucky-wheel-container">
+        <div class="wheel-header">
+          <h2>🎰 超级幸运转盘 🎰</h2>
+          <button class="wheel-close" @click="closeLuckyWheel">❌</button>
+        </div>
+        
+        <div class="wheel-content">
+          <div class="wheel-display" :class="{ 'spinning': wheelSpinning }">
+            <div class="wheel-segment" v-for="(prize, index) in luckyWheelPrizes" :key="index">
+              {{ prize.split(' ')[0] }}
+            </div>
+            <div class="wheel-pointer">👆</div>
+          </div>
+          
+          <div class="wheel-result" v-if="wheelResult">
+            <h3>🎉 恭喜您获得:</h3>
+            <p class="result-text">{{ wheelResult }}</p>
+          </div>
+          
+          <div class="wheel-buttons">
+            <button class="spin-button" @click="spinWheel" :disabled="wheelSpinning">
+              {{ wheelSpinning ? '转盘中...' : '🎲 开始转盘' }}
+            </button>
+            <button class="spin-again-button" @click="spinWheel">
+              ✨ 再转一次
+            </button>
+          </div>
+          
+          <div class="wheel-tips">
+            <p>💡 提示:每次转盘都有惊喜!</p>
+            <p>🔥 连续转盘可获得更大奖品!</p>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<style scoped>
+.fake-ad-container {
+  position: fixed;
+  top: 0;
+  left: 0;
+  width: 100vw;
+  height: 100vh;
+  background: linear-gradient(45deg, #ff6b6b, #4ecdc4, #45b7d1, #96ceb4);
+  background-size: 400% 400%;
+  animation: gradientShift 3s ease infinite;
+  overflow: hidden;
+  font-family: 'Arial', sans-serif;
+}
+
+/* 背景渐变动画 */
+@keyframes gradientShift {
+  0% { background-position: 0% 50%; }
+  50% { background-position: 100% 50%; }
+  100% { background-position: 0% 50%; }
+}
+
+.header {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  padding: 15px;
+  background: linear-gradient(90deg, #ff6b6b, #feca57);
+  box-shadow: 0 4px 20px rgba(0,0,0,0.3);
+  position: relative;
+  z-index: 100;
+}
+
+.back-btn {
+  padding: 10px 20px;
+  background: linear-gradient(45deg, #3498db, #2980b9);
+  color: white;
+  border: none;
+  border-radius: 25px;
+  cursor: pointer;
+  font-weight: bold;
+  box-shadow: 0 4px 15px rgba(52, 152, 219, 0.4);
+  transition: all 0.3s ease;
+}
+
+.back-btn:hover {
+  transform: scale(1.1);
+  box-shadow: 0 6px 20px rgba(52, 152, 219, 0.6);
+}
+
+.annoying-banner {
+  flex: 1;
+  text-align: center;
+  font-size: 18px;
+  font-weight: bold;
+  color: white;
+  text-shadow: 2px 2px 4px rgba(0,0,0,0.5);
+}
+
+/* 漂浮背景效果 */
+.background-effects {
+  position: absolute;
+  width: 100%;
+  height: 100%;
+  overflow: hidden;
+  pointer-events: none;
+}
+
+.floating-money {
+  position: absolute;
+  font-size: 40px;
+  opacity: 0.7;
+  animation: float 6s ease-in-out infinite;
+}
+
+.floating-money:nth-child(1) { left: 10%; animation-delay: 0s; }
+.floating-money:nth-child(2) { left: 30%; animation-delay: 1s; }
+.floating-money:nth-child(3) { left: 50%; animation-delay: 2s; }
+.floating-money:nth-child(4) { left: 70%; animation-delay: 3s; }
+.floating-money:nth-child(5) { left: 90%; animation-delay: 4s; }
+
+@keyframes float {
+  0%, 100% { transform: translateY(100vh) rotate(0deg); }
+  50% { transform: translateY(-100px) rotate(180deg); }
+}
+
+.popup-container {
+  position: fixed;
+  top: 0;
+  left: 0;
+  width: 100vw;
+  height: 100vh;
+  pointer-events: none;
+  z-index: 9999;
+}
+
+.crazy-popup {
+  position: absolute;
+  width: 320px;
+  min-height: 200px;
+  background: linear-gradient(135deg, #ff6b6b, #feca57, #48dbfb, #ff9ff3);
+  background-size: 400% 400%;
+  animation: gradientShift 2s ease infinite;
+  border-radius: 15px;
+  box-shadow: 0 15px 35px rgba(0, 0, 0, 0.3);
+  border: 3px solid #fff;
+  pointer-events: auto;
+  overflow: hidden;
+  transform-origin: center;
+}
+
+.popup-small { width: 280px; min-height: 180px; }
+.popup-medium { width: 350px; min-height: 220px; }
+.popup-large { width: 420px; min-height: 280px; }
+
+/* 不同类型弹窗的特殊样式 */
+.popup-urgent-winner {
+  border: 5px solid #ff0000;
+  box-shadow: 0 0 20px rgba(255, 0, 0, 0.6);
+  animation: urgentPulse 1s infinite, gradientShift 2s ease infinite;
+}
+
+.popup-fake-security {
+  border: 3px solid #ffd700;
+  background: linear-gradient(135deg, #ff4757, #ffa502);
+}
+
+.popup-celebrity-call {
+  border: 3px solid #00ff00;
+  background: linear-gradient(135deg, #26de81, #20bf6b);
+  animation: phoneCall 2s infinite;
+}
+
+.popup-virus-warning {
+  border: 5px solid #ff0000;
+  background: linear-gradient(135deg, #ff3838, #ff6b6b);
+  animation: virusAlert 0.5s infinite;
+}
+
+.popup-system-update {
+  border: 3px solid #007bff;
+  background: linear-gradient(135deg, #3742fa, #2f3542);
+}
+
+/* 疯狂头部样式 */
+.crazy-header {
+  background: linear-gradient(90deg, #ff4757, #ff3838);
+  color: white;
+  padding: 12px 15px;
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  font-weight: bold;
+  position: relative;
+}
+
+.popup-title {
+  font-size: 16px;
+  font-weight: bold;
+  animation: titleBlink 1s infinite;
+}
+
+.fake-controls {
+  display: flex;
+  gap: 8px;
+  align-items: center;
+}
+
+.fake-minimize, .fake-maximize {
+  padding: 2px 6px;
+  background: rgba(255,255,255,0.2);
+  border-radius: 3px;
+  cursor: pointer;
+  font-size: 12px;
+}
+
+.crazy-close {
+  background: rgba(255,255,255,0.2);
+  border: none;
+  color: white;
+  font-size: 16px;
+  font-weight: bold;
+  cursor: pointer;
+  width: 25px;
+  height: 25px;
+  border-radius: 50%;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  transition: all 0.3s ease;
+}
+
+.crazy-close:hover {
+  background: rgba(255,255,255,0.4);
+  transform: rotate(90deg);
+}
+
+/* 疯狂内容样式 */
+.crazy-body {
+  padding: 20px;
+  text-align: center;
+  color: white;
+  font-weight: bold;
+}
+
+.popup-icon {
+  font-size: 48px;
+  margin-bottom: 15px;
+  animation: iconBounce 2s infinite;
+}
+
+.popup-text {
+  font-size: 16px;
+  line-height: 1.5;
+  margin-bottom: 20px;
+  text-shadow: 1px 1px 2px rgba(0,0,0,0.5);
+}
+
+/* 弹窗按钮样式 */
+.popup-actions {
+  display: flex;
+  flex-direction: column;
+  gap: 10px;
+}
+
+.action-btn {
+  padding: 12px 20px;
+  border: none;
+  border-radius: 25px;
+  font-size: 14px;
+  font-weight: bold;
+  cursor: pointer;
+  transition: all 0.3s ease;
+  text-transform: uppercase;
+  letter-spacing: 1px;
+}
+
+.winner-btn {
+  background: linear-gradient(45deg, #ffd700, #ffb347);
+  color: #333;
+  animation: goldenShine 2s infinite;
+}
+
+.security-btn {
+  background: linear-gradient(45deg, #ff4757, #ff3838);
+  color: white;
+}
+
+.celebrity-btn {
+  background: linear-gradient(45deg, #26de81, #20bf6b);
+  color: white;
+}
+
+.lucky-btn {
+  background: linear-gradient(45deg, #3742fa, #2f3542);
+  color: white;
+}
+
+.urgent-btn {
+  background: linear-gradient(45deg, #ff6348, #ff4757);
+  color: white;
+  animation: urgentGlow 1s infinite;
+}
+
+.default-btn {
+  background: linear-gradient(45deg, #48dbfb, #0abde3);
+  color: white;
+}
+
+.cancel-btn {
+  background: linear-gradient(45deg, #747d8c, #57606f);
+  color: white;
+}
+
+.action-btn:hover {
+  transform: translateY(-3px);
+  box-shadow: 0 8px 25px rgba(0,0,0,0.2);
+}
+
+/* 假进度条 */
+.fake-progress {
+  margin-top: 15px;
+  padding: 10px;
+  background: rgba(255,255,255,0.1);
+  border-radius: 8px;
+}
+
+.progress-bar {
+  width: 100%;
+  height: 20px;
+  background: rgba(255,255,255,0.2);
+  border-radius: 10px;
+  overflow: hidden;
+  position: relative;
+}
+
+.progress-fill {
+  height: 100%;
+  width: 99.9%;
+  background: linear-gradient(90deg, #26de81, #20bf6b);
+  border-radius: 10px;
+  animation: progressBlink 2s infinite;
+}
+
+.progress-text {
+  color: white;
+  font-size: 12px;
+  margin-top: 8px;
+  display: block;
+}
+
+/* 假倒计时 */
+.fake-countdown {
+  margin-top: 15px;
+  padding: 10px;
+  background: rgba(255,255,255,0.1);
+  border-radius: 8px;
+  color: white;
+}
+
+.countdown-label {
+  font-size: 14px;
+  color: #feca57;
+}
+
+.countdown-timer {
+  font-size: 16px;
+  font-weight: bold;
+  color: #ff6348;
+  animation: countdownBlink 1s infinite;
+}
+
+/* 移动弹窗动画 */
+.moving-popup {
+  animation: crazyMove 3s infinite linear;
+}
+
+/* 动画关键帧 */
+@keyframes urgentPulse {
+  0%, 100% { 
+    transform: scale(1); 
+    box-shadow: 0 0 20px rgba(255, 0, 0, 0.6);
+  }
+  50% { 
+    transform: scale(1.05); 
+    box-shadow: 0 0 30px rgba(255, 0, 0, 0.9);
+  }
+}
+
+@keyframes phoneCall {
+  0%, 100% { transform: rotate(0deg); }
+  25% { transform: rotate(-5deg); }
+  75% { transform: rotate(5deg); }
+}
+
+@keyframes virusAlert {
+  0%, 100% { background-position: 0% 50%; }
+  50% { background-position: 100% 50%; }
+}
+
+@keyframes titleBlink {
+  0%, 50% { opacity: 1; }
+  51%, 100% { opacity: 0.7; }
+}
+
+@keyframes iconBounce {
+  0%, 20%, 50%, 80%, 100% { transform: translateY(0); }
+  40% { transform: translateY(-10px); }
+  60% { transform: translateY(-5px); }
+}
+
+@keyframes goldenShine {
+  0% { background-position: -200px; }
+  100% { background-position: 200px; }
+}
+
+@keyframes urgentGlow {
+  0%, 100% { box-shadow: 0 0 5px rgba(255, 99, 72, 0.5); }
+  50% { box-shadow: 0 0 20px rgba(255, 99, 72, 0.8); }
+}
+
+@keyframes progressBlink {
+  0%, 50% { width: 99.9%; }
+  51%, 100% { width: 99.8%; }
+}
+
+@keyframes countdownBlink {
+  0%, 50% { color: #ff6348; }
+  51%, 100% { color: #feca57; }
+}
+
+@keyframes crazyMove {
+  0% { transform: translate(0, 0) rotate(0deg); }
+  25% { transform: translate(50px, -30px) rotate(5deg); }
+  50% { transform: translate(-30px, 50px) rotate(-5deg); }
+  75% { transform: translate(40px, -20px) rotate(3deg); }
+  100% { transform: translate(0, 0) rotate(0deg); }
+}
+
+@keyframes gradientShift {
+  0% { background-position: 0% 50%; }
+  50% { background-position: 100% 50%; }
+  100% { background-position: 0% 50%; }
+}
+
+/* 响应式设计 */
+@media (max-width: 768px) {
+  .crazy-popup {
+    width: 280px;
+    min-height: 180px;
+  }
+  
+  .popup-large {
+    width: 300px;
+    min-height: 200px;
+  }
+  
+  .action-btn {
+    padding: 10px 15px;
+    font-size: 12px;
+  }
+  
+  .popup-icon {
+    font-size: 36px;
+  }
+}
+
+/* 主广告超级恶搞样式 */
+.main-ad {
+  position: fixed;
+  top: 50%;
+  left: 50%;
+  transform: translate(-50%, -50%);
+  width: 90%;
+  max-width: 600px;
+  background: linear-gradient(135deg, #fff, #f8f9fa);
+  border-radius: 20px;
+  box-shadow: 0 20px 60px rgba(0,0,0,0.6);
+  z-index: 9999;
+  text-align: center;
+  padding: 30px;
+  border: 5px solid #ff6b6b;
+  animation: megaPulse 1s ease-in-out infinite;
+}
+
+@keyframes megaPulse {
+  0%, 100% { transform: translate(-50%, -50%) scale(1); }
+  50% { transform: translate(-50%, -50%) scale(1.05); }
+}
+
+.rainbow-text {
+  background: linear-gradient(45deg, #ff6b6b, #4ecdc4, #45b7d1, #96ceb4, #feca57);
+  -webkit-background-clip: text;
+  -webkit-text-fill-color: transparent;
+  background-clip: text;
+  font-size: 28px;
+  font-weight: bold;
+  animation: rainbowShift 2s ease-in-out infinite;
+}
+
+@keyframes rainbowShift {
+  0%, 100% { filter: hue-rotate(0deg); }
+  50% { filter: hue-rotate(180deg); }
+}
+
+.mega-text {
+  font-size: 20px;
+  font-weight: bold;
+  color: #e74c3c;
+  margin: 15px 0;
+}
+
+.prize-showcase {
+  display: grid;
+  grid-template-columns: 1fr 1fr;
+  gap: 10px;
+  margin: 20px 0;
+}
+
+.prize-item {
+  background: linear-gradient(45deg, #feca57, #ff9ff3);
+  padding: 10px;
+  border-radius: 10px;
+  font-weight: bold;
+  color: #2c3e50;
+  border: 2px solid #ff6b6b;
+}
+
+.urgent-text {
+  color: #e74c3c;
+  font-weight: bold;
+  font-size: 16px;
+  margin: 15px 0;
+}
+
+.mega-button {
+  padding: 15px 30px;
+  background: linear-gradient(45deg, #e74c3c, #c0392b);
+  color: white;
+  border: none;
+  border-radius: 30px;
+  font-size: 18px;
+  font-weight: bold;
+  cursor: pointer;
+  box-shadow: 0 8px 25px rgba(231, 76, 60, 0.4);
+  transition: all 0.3s ease;
+  margin: 10px;
+}
+
+.mega-button:hover {
+  transform: scale(1.1);
+  box-shadow: 0 12px 35px rgba(231, 76, 60, 0.6);
+}
+
+.fake-timer {
+  background: #2c3e50;
+  color: #ecf0f1;
+  padding: 10px;
+  border-radius: 8px;
+  font-family: 'Courier New', monospace;
+  font-weight: bold;
+  margin-top: 15px;
+}
+
+.close-main-ad {
+  position: absolute;
+  top: -15px;
+  right: -15px;
+  width: 40px;
+  height: 40px;
+  border-radius: 50%;
+  background: linear-gradient(45deg, #2c3e50, #34495e);
+  color: white;
+  border: none;
+  font-size: 20px;
+  font-weight: bold;
+  cursor: pointer;
+  box-shadow: 0 4px 15px rgba(0,0,0,0.3);
+}
+
+/* 全屏覆盖恶搞广告 */
+.overlay-ad {
+  position: fixed;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  background: linear-gradient(45deg, rgba(231, 76, 60, 0.95), rgba(155, 89, 182, 0.95));
+  z-index: 10000;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  backdrop-filter: blur(10px);
+}
+
+.overlay-content {
+  text-align: center;
+  padding: 40px;
+  max-width: 600px;
+  background: rgba(255, 255, 255, 0.95);
+  border-radius: 20px;
+  box-shadow: 0 20px 60px rgba(0,0,0,0.5);
+  animation: overlayBounce 2s ease-in-out infinite;
+}
+
+@keyframes overlayBounce {
+  0%, 100% { transform: scale(1); }
+  50% { transform: scale(1.05); }
+}
+
+.prize-wheel {
+  width: 200px;
+  height: 200px;
+  margin: 20px auto;
+  border-radius: 50%;
+  background: linear-gradient(45deg, #ff6b6b, #4ecdc4, #45b7d1, #96ceb4, #feca57, #ff9ff3);
+  animation: spin 3s linear infinite;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  font-size: 40px;
+}
+
+@keyframes spin {
+  0% { transform: rotate(0deg); }
+  100% { transform: rotate(360deg); }
+}
+
+.warning-text {
+  color: #e74c3c;
+  font-weight: bold;
+  margin-top: 20px;
+  font-size: 16px;
+}
+
+/* 假病毒警告 */
+.virus-warning {
+  position: fixed;
+  top: 20px;
+  right: 20px;
+  background: linear-gradient(45deg, #e74c3c, #c0392b);
+  color: white;
+  padding: 20px;
+  border-radius: 10px;
+  box-shadow: 0 8px 25px rgba(231, 76, 60, 0.4);
+  z-index: 9998;
+  text-align: center;
+  border: 3px solid #fff;
+}
+
+/* 闪烁文本动画 */
+.blink-text {
+  animation: blink 1s ease-in-out infinite;
+}
+
+@keyframes blink {
+  0%, 100% { opacity: 1; }
+  50% { opacity: 0.3; }
+}
+
+.blink-button {
+  animation: buttonPulse 1.5s ease-in-out infinite;
+}
+
+@keyframes buttonPulse {
+  0%, 100% { transform: scale(1); box-shadow: 0 8px 25px rgba(231, 76, 60, 0.4); }
+  50% { transform: scale(1.1); box-shadow: 0 12px 35px rgba(231, 76, 60, 0.8); }
+}
+
+/* 响应式设计 */
+@media (max-width: 768px) {
+  .ad-popup {
+    width: 280px;
+  }
+  
+  .main-ad {
+    width: 95%;
+    padding: 20px;
+  }
+  
+  .rainbow-text {
+    font-size: 22px;
+  }
+  
+  .mega-text {
+    font-size: 16px;
+  }
+  
+  .prize-showcase {
+    grid-template-columns: 1fr;
+  }
+  
+  .mega-button {
+    padding: 12px 25px;
+    font-size: 16px;
+  }
+  
+  .overlay-content {
+    padding: 30px;
+    margin: 20px;
+  }
+  
+  .prize-wheel {
+    width: 150px;
+    height: 150px;
+    font-size: 30px;
+  }
+}
+
+@keyframes bounceIn {
+  0% { transform: scale(0.3); opacity: 0; }
+  50% { transform: scale(1.05); opacity: 0.8; }
+  70% { transform: scale(0.9); opacity: 0.9; }
+  100% { transform: scale(1); opacity: 1; }
+}
+
+/* 自定义离开确认对话框样式 */
+.leave-dialog-overlay {
+  position: fixed;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  background: rgba(0, 0, 0, 0.8);
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  z-index: 10000;
+  animation: fadeIn 0.3s ease-in-out;
+}
+
+.leave-dialog {
+  background: linear-gradient(135deg, #ff6b6b, #feca57, #48dbfb, #ff9ff3);
+  background-size: 400% 400%;
+  animation: gradientShift 3s ease infinite, dialogBounce 0.5s ease-out;
+  border-radius: 20px;
+  padding: 30px;
+  max-width: 500px;
+  width: 90%;
+  text-align: center;
+  box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3);
+  border: 3px solid #fff;
+}
+
+.leave-dialog-header h3 {
+  margin: 0 0 20px 0;
+  font-size: 24px;
+  font-weight: bold;
+  color: #fff;
+  text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.5);
+}
+
+.leave-dialog-content {
+  margin-bottom: 25px;
+  color: #fff;
+  font-size: 16px;
+}
+
+.leave-dialog-content p {
+  margin: 10px 0;
+  font-weight: bold;
+}
+
+.miss-list {
+  list-style: none;
+  padding: 0;
+  margin: 15px 0;
+}
+
+.miss-list li {
+  margin: 8px 0;
+  padding: 8px;
+  background: rgba(255, 255, 255, 0.2);
+  border-radius: 10px;
+  font-weight: bold;
+  animation: listItemPulse 2s ease-in-out infinite;
+}
+
+.miss-list li:nth-child(odd) {
+  animation-delay: 0.5s;
+}
+
+.final-plea {
+  font-style: italic;
+  color: #ffff00;
+  font-size: 18px;
+  text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.7);
+}
+
+.leave-dialog-buttons {
+  display: flex;
+  gap: 15px;
+  justify-content: center;
+}
+
+.leave-dialog-buttons button {
+  padding: 12px 25px;
+  border: none;
+  border-radius: 25px;
+  font-size: 16px;
+  font-weight: bold;
+  cursor: pointer;
+  transition: all 0.3s ease;
+  text-transform: uppercase;
+}
+
+.stay-button {
+  background: linear-gradient(45deg, #00f260, #0575e6);
+  color: white;
+  box-shadow: 0 4px 15px rgba(0, 242, 96, 0.4);
+}
+
+.stay-button:hover {
+  transform: translateY(-2px);
+  box-shadow: 0 6px 20px rgba(0, 242, 96, 0.6);
+}
+
+.leave-button {
+  background: linear-gradient(45deg, #ff416c, #ff4b2b);
+  color: white;
+  box-shadow: 0 4px 15px rgba(255, 65, 108, 0.4);
+}
+
+.leave-button:hover {
+  transform: translateY(-2px);
+  box-shadow: 0 6px 20px rgba(255, 65, 108, 0.6);
+}
+
+@keyframes gradientShift {
+  0% { background-position: 0% 50%; }
+  50% { background-position: 100% 50%; }
+  100% { background-position: 0% 50%; }
+}
+
+@keyframes dialogBounce {
+  0% { transform: scale(0.3) rotate(-10deg); opacity: 0; }
+  50% { transform: scale(1.1) rotate(5deg); opacity: 0.8; }
+  100% { transform: scale(1) rotate(0deg); opacity: 1; }
+}
+
+@keyframes listItemPulse {
+  0%, 100% { transform: scale(1); }
+  50% { transform: scale(1.05); }
+}
+
+@keyframes fadeIn {
+  from { opacity: 0; }
+  to { opacity: 1; }
+}
+
+/* 响应式设计 */
+@media (max-width: 768px) {
+  .leave-dialog {
+    padding: 20px;
+    margin: 20px;
+  }
+  
+  .leave-dialog-header h3 {
+    font-size: 20px;
+  }
+  
+  .leave-dialog-content {
+    font-size: 14px;
+  }
+  
+  .leave-dialog-buttons {
+    flex-direction: column;
+  }
+  
+  .leave-dialog-buttons button {
+    width: 100%;
+    margin-bottom: 10px;
+  }
+}
+
+/* 自定义通知 - 替代alert */
+.custom-notification {
+  position: fixed;
+  top: 20px;
+  right: 20px;
+  background: rgba(255, 255, 255, 0.9);
+  padding: 10px 20px;
+  border-radius: 10px;
+  box-shadow: 0 4px 10px rgba(0, 0, 0, 0.1);
+  z-index: 10000;
+}
+
+.notification-content {
+  display: flex;
+  align-items: center;
+}
+
+.notification-icon {
+  font-size: 24px;
+  margin-right: 10px;
+}
+
+.notification-message {
+  font-size: 16px;
+  font-weight: bold;
+}
+
+.notification-close {
+  background: none;
+  border: none;
+  font-size: 20px;
+  cursor: pointer;
+  margin-left: auto;
+}
+
+/* 自定义恶搞对话框 - 替代confirm */
+.prank-dialog-overlay {
+  position: fixed;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  background: rgba(0, 0, 0, 0.8);
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  z-index: 10000;
+  animation: fadeIn 0.3s ease-in-out;
+}
+
+.prank-dialog {
+  background: linear-gradient(135deg, #ff6b6b, #feca57, #48dbfb, #ff9ff3);
+  background-size: 400% 400%;
+  animation: gradientShift 3s ease infinite, dialogBounce 0.5s ease-out;
+  border-radius: 20px;
+  padding: 30px;
+  max-width: 500px;
+  width: 90%;
+  text-align: center;
+  box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3);
+  border: 3px solid #fff;
+}
+
+.prank-dialog-header h3 {
+  margin: 0 0 20px 0;
+  font-size: 24px;
+  font-weight: bold;
+  color: #fff;
+  text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.5);
+}
+
+.prank-dialog-content {
+  margin-bottom: 25px;
+  color: #fff;
+  font-size: 16px;
+}
+
+.prank-dialog-buttons {
+  display: flex;
+  gap: 15px;
+  justify-content: center;
+}
+
+.prank-yes-button, .prank-no-button {
+  padding: 12px 25px;
+  border: none;
+  border-radius: 25px;
+  font-size: 16px;
+  font-weight: bold;
+  cursor: pointer;
+  transition: all 0.3s ease;
+  text-transform: uppercase;
+}
+
+.prank-yes-button {
+  background: linear-gradient(45deg, #00f260, #0575e6);
+  color: white;
+  box-shadow: 0 4px 15px rgba(0, 242, 96, 0.4);
+}
+
+.prank-yes-button:hover {
+  transform: translateY(-2px);
+  box-shadow: 0 6px 20px rgba(0, 242, 96, 0.6);
+}
+
+.prank-no-button {
+  background: linear-gradient(45deg, #ff416c, #ff4b2b);
+  color: white;
+  box-shadow: 0 4px 15px rgba(255, 65, 108, 0.4);
+}
+
+.prank-no-button:hover {
+  transform: translateY(-2px);
+  box-shadow: 0 6px 20px rgba(255, 65, 108, 0.6);
+}
+
+/* 自定义恶搞对话框 - 替代confirm */
+.prank-dialog-overlay {
+  position: fixed;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  background: rgba(0, 0, 0, 0.8);
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  z-index: 10000;
+  animation: fadeIn 0.3s ease-in-out;
+}
+
+.prank-dialog {
+  background: linear-gradient(135deg, #ff6b6b, #feca57, #48dbfb, #ff9ff3);
+  background-size: 400% 400%;
+  animation: gradientShift 3s ease infinite, dialogBounce 0.5s ease-out;
+  border-radius: 20px;
+  padding: 30px;
+  max-width: 500px;
+  width: 90%;
+  text-align: center;
+  box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3);
+  border: 3px solid #fff;
+}
+
+.prank-dialog-header h3 {
+  margin: 0 0 20px 0;
+  font-size: 24px;
+  font-weight: bold;
+  color: #fff;
+  text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.5);
+}
+
+.prank-dialog-content {
+  margin-bottom: 25px;
+  color: #fff;
+  font-size: 16px;
+}
+
+.prank-dialog-buttons {
+  display: flex;
+  gap: 15px;
+  justify-content: center;
+}
+
+.prank-yes-button, .prank-no-button {
+  padding: 12px 25px;
+  border: none;
+  border-radius: 25px;
+  font-size: 16px;
+  font-weight: bold;
+  cursor: pointer;
+  transition: all 0.3s ease;
+  text-transform: uppercase;
+}
+
+.prank-yes-button {
+  background: linear-gradient(45deg, #00f260, #0575e6);
+  color: white;
+  box-shadow: 0 4px 15px rgba(0, 242, 96, 0.4);
+}
+
+.prank-yes-button:hover {
+  transform: translateY(-2px);
+  box-shadow: 0 6px 20px rgba(0, 242, 96, 0.6);
+}
+
+.prank-no-button {
+  background: linear-gradient(45deg, #ff416c, #ff4b2b);
+  color: white;
+  box-shadow: 0 4px 15px rgba(255, 65, 108, 0.4);
+}
+
+.prank-no-button:hover {
+  transform: translateY(-2px);
+  box-shadow: 0 6px 20px rgba(255, 65, 108, 0.6);
+}
+
+/* 超级恶心模式新增样式 */
+
+/* 散落的假关闭按钮 */
+.scattered-fake-button {
+  position: fixed;
+  width: 50px;
+  height: 50px;
+  background: linear-gradient(45deg, #e74c3c, #c0392b);
+  color: white;
+  border: none;
+  border-radius: 50%;
+  font-size: 24px;
+  cursor: pointer;
+  z-index: 9999;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  box-shadow: 0 4px 15px rgba(231, 76, 60, 0.4);
+  animation: floatAroundCrazy 3s ease-in-out infinite;
+  transition: all 0.3s ease;
+}
+
+.scattered-fake-button:hover {
+  transform: scale(1.3);
+  background: linear-gradient(45deg, #ff0000, #cc0000);
+  box-shadow: 0 6px 20px rgba(255, 0, 0, 0.6);
+}
+
+.scattered-fake-button.clicked {
+  background: linear-gradient(45deg, #2ecc71, #27ae60);
+  animation: clickedExplosion 1s ease-out;
+}
+
+.scattered-fake-button.moving {
+  animation: crazyMove 2s linear infinite;
+}
+
+@keyframes floatAroundCrazy {
+  0%, 100% { transform: translate(0, 0) rotate(0deg) scale(1); }
+  25% { transform: translate(20px, -30px) rotate(90deg) scale(1.1); }
+  50% { transform: translate(-20px, 20px) rotate(180deg) scale(0.9); }
+  75% { transform: translate(30px, 10px) rotate(270deg) scale(1.2); }
+}
+
+@keyframes clickedExplosion {
+  0% { transform: scale(1) rotate(0deg); }
+  25% { transform: scale(2) rotate(90deg); opacity: 1; }
+  50% { transform: scale(3) rotate(180deg); opacity: 0.5; }
+  75% { transform: scale(4) rotate(270deg); opacity: 0.2; }
+  100% { transform: scale(1) rotate(360deg); opacity: 1; }
+}
+
+@keyframes crazyMove {
+  0% { transform: translate(0, 0) rotate(0deg); }
+  25% { transform: translate(100px, -50px) rotate(180deg); }
+  50% { transform: translate(-100px, 100px) rotate(360deg); }
+  75% { transform: translate(50px, -100px) rotate(540deg); }
+  100% { transform: translate(0, 0) rotate(720deg); }
+}
+
+/* 假加载屏幕 */
+.fake-loading-overlay {
+  position: fixed;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  background: linear-gradient(45deg, #1a1a1a, #2c3e50, #34495e);
+  background-size: 400% 400%;
+  animation: gradientShift 2s ease infinite;
+  z-index: 10003;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+}
+
+.fake-loading-content {
+  text-align: center;
+  color: white;
+  padding: 50px;
+  background: rgba(0, 0, 0, 0.9);
+  border-radius: 20px;
+  box-shadow: 0 20px 60px rgba(0, 0, 0, 0.7);
+  border: 3px solid #e74c3c;
+  animation: loadingContentPulse 1.5s ease-in-out infinite;
+}
+
+.loading-spinner {
+  width: 100px;
+  height: 100px;
+  margin: 0 auto 30px;
+  border: 10px solid #3498db;
+  border-top: 10px solid #e74c3c;
+  border-right: 10px solid #f39c12;
+  border-bottom: 10px solid #2ecc71;
+  border-radius: 50%;
+  animation: spinCrazy 0.8s linear infinite;
+}
+
+@keyframes spinCrazy {
+  0% { transform: rotate(0deg) scale(1); }
+  25% { transform: rotate(90deg) scale(1.1); }
+  50% { transform: rotate(180deg) scale(0.9); }
+  75% { transform: rotate(270deg) scale(1.2); }
+  100% { transform: rotate(360deg) scale(1); }
+}
+
+.loading-bar {
+  width: 400px;
+  height: 30px;
+  background: #34495e;
+  border-radius: 15px;
+  margin: 25px auto;
+  overflow: hidden;
+  box-shadow: inset 0 2px 5px rgba(0, 0, 0, 0.5);
+}
+
+.loading-progress {
+  height: 100%;
+  background: linear-gradient(45deg, #e74c3c, #f39c12, #2ecc71, #3498db);
+  background-size: 400% 400%;
+  width: 99.8%;
+  animation: loadingProgressShift 2s ease-in-out infinite;
+  border-radius: 15px;
+}
+
+@keyframes loadingProgressShift {
+  0%, 100% { background-position: 0% 50%; width: 99.8%; }
+  50% { background-position: 100% 50%; width: 99.85%; }
+}
+
+@keyframes loadingContentPulse {
+  0%, 100% { transform: scale(1); }
+  50% { transform: scale(1.02); }
+}
+
+/* 超级恶心模式指示器 */
+.ultra-mode-indicator {
+  position: fixed;
+  top: 50%;
+  left: 20px;
+  transform: translateY(-50%);
+  background: rgba(0, 0, 0, 0.9);
+  padding: 20px;
+  border-radius: 15px;
+  z-index: 9998;
+  border: 3px solid #e74c3c;
+  animation: indicatorPulse 2s ease-in-out infinite;
+}
+
+.mode-badge {
+  background: linear-gradient(45deg, #e74c3c, #f39c12);
+  color: white;
+  padding: 10px 15px;
+  border-radius: 20px;
+  font-weight: bold;
+  text-align: center;
+  margin-bottom: 15px;
+  animation: badgeBlink 1s ease-in-out infinite;
+}
+
+.annoyance-meter {
+  position: relative;
+  width: 200px;
+  height: 25px;
+  background: #34495e;
+  border-radius: 12px;
+  overflow: hidden;
+}
+
+.meter-fill {
+  height: 100%;
+  background: linear-gradient(45deg, #2ecc71, #f39c12, #e74c3c);
+  transition: width 0.5s ease;
+  border-radius: 12px;
+}
+
+.meter-text {
+  position: absolute;
+  top: 50%;
+  left: 50%;
+  transform: translate(-50%, -50%);
+  color: white;
+  font-weight: bold;
+  font-size: 12px;
+  text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.8);
+}
+
+@keyframes indicatorPulse {
+  0%, 100% { transform: translateY(-50%) scale(1); }
+  50% { transform: translateY(-50%) scale(1.05); }
+}
+
+@keyframes badgeBlink {
+  0%, 100% { opacity: 1; }
+  50% { opacity: 0.7; }
+}
+
+/* 移动文本容器 */
+.moving-text-container {
+  position: fixed;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  pointer-events: none;
+  z-index: 9997;
+}
+
+.moving-text {
+  position: absolute;
+  font-size: 28px;
+  font-weight: bold;
+  color: #e74c3c;
+  text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.8);
+  animation: textCrazyMove 6s linear infinite;
+}
+
+.moving-text:nth-child(1) {
+  left: 5%;
+  animation-delay: 0s;
+  color: #e74c3c;
+}
+
+.moving-text:nth-child(2) {
+  left: 25%;
+  animation-delay: 1s;
+  color: #f39c12;
+}
+
+.moving-text:nth-child(3) {
+  left: 45%;
+  animation-delay: 2s;
+  color: #2ecc71;
+}
+
+.moving-text:nth-child(4) {
+  left: 65%;
+  animation-delay: 3s;
+  color: #3498db;
+}
+
+.moving-text:nth-child(5) {
+  left: 85%;
+  animation-delay: 4s;
+  color: #9b59b6;
+}
+
+.moving-text:nth-child(6) {
+  left: 95%;
+  animation-delay: 5s;
+  color: #e91e63;
+}
+
+@keyframes textCrazyMove {
+  0% { transform: translateY(100vh) rotate(0deg) scale(1); opacity: 1; }
+  25% { transform: translateY(75vh) rotate(90deg) scale(1.2); opacity: 0.8; }
+  50% { transform: translateY(50vh) rotate(180deg) scale(0.8); opacity: 0.9; }
+  75% { transform: translateY(25vh) rotate(270deg) scale(1.5); opacity: 0.7; }
+  100% { transform: translateY(-50px) rotate(360deg) scale(1); opacity: 0; }
+}
+
+/* 移动和震动效果 */
+.moving {
+  animation: elementMove 4s ease-in-out infinite !important;
+}
+
+.shake {
+  animation: violentShake 0.3s ease-in-out infinite !important;
+}
+
+@keyframes elementMove {
+  0%, 100% { transform: translate(0, 0) rotate(0deg); }
+  25% { transform: translate(15px, -10px) rotate(2deg); }
+  50% { transform: translate(-10px, 15px) rotate(-2deg); }
+  75% { transform: translate(10px, -5px) rotate(1deg); }
+}
+
+@keyframes violentShake {
+  0%, 100% { transform: translate(0, 0) rotate(0deg); }
+  10% { transform: translate(-3px, 2px) rotate(1deg); }
+  20% { transform: translate(3px, -2px) rotate(-1deg); }
+  30% { transform: translate(-2px, 3px) rotate(1deg); }
+  40% { transform: translate(2px, -3px) rotate(-1deg); }
+  50% { transform: translate(-3px, -2px) rotate(1deg); }
+  60% { transform: translate(3px, 2px) rotate(-1deg); }
+  70% { transform: translate(-2px, -3px) rotate(1deg); }
+  80% { transform: translate(2px, 3px) rotate(-1deg); }
+  90% { transform: translate(-3px, 2px) rotate(1deg); }
+}
+
+/* 全局恶心效果增强 */
+.fake-ad-container.ultra-annoying {
+  animation: containerCrazy 3s ease-in-out infinite;
+}
+
+@keyframes containerCrazy {
+  0%, 100% { 
+    transform: translateX(0) scale(1); 
+    filter: hue-rotate(0deg);
+  }
+  25% { 
+    transform: translateX(-3px) scale(1.01); 
+    filter: hue-rotate(90deg);
+  }
+  50% { 
+    transform: translateX(3px) scale(0.99); 
+    filter: hue-rotate(180deg);
+  }
+  75% { 
+    transform: translateX(-2px) scale(1.01); 
+    filter: hue-rotate(270deg);
+  }
+}
+
+/* 快速变色效果增强 */
+.rapid-color-change {
+  animation: rapidColorCrazy 0.3s ease-in-out infinite;
+}
+
+@keyframes rapidColorCrazy {
+  0% { filter: hue-rotate(0deg) saturate(2) brightness(1.2); }
+  20% { filter: hue-rotate(72deg) saturate(3) brightness(0.8); }
+  40% { filter: hue-rotate(144deg) saturate(1.5) brightness(1.5); }
+  60% { filter: hue-rotate(216deg) saturate(2.5) brightness(0.6); }
+  80% { filter: hue-rotate(288deg) saturate(1.8) brightness(1.3); }
+  100% { filter: hue-rotate(360deg) saturate(2) brightness(1.2); }
+}
+
+/* 响应式设计 */
+@media (max-width: 768px) {
+  .scattered-fake-button {
+    width: 40px;
+    height: 40px;
+    font-size: 18px;
+  }
+  
+  .fake-loading-content {
+    padding: 30px;
+    margin: 20px;
+  }
+  
+  .loading-spinner {
+    width: 70px;
+    height: 70px;
+  }
+  
+  .loading-bar {
+    width: 280px;
+    height: 25px;
+  }
+  
+  .moving-text {
+    font-size: 20px;
+  }
+  
+  .ultra-mode-indicator {
+    left: 10px;
+    padding: 15px;
+  }
+  
+  .annoyance-meter {
+    width: 150px;
+    height: 20px;
+  }
+}
+
+/* 幸运转盘弹窗 */
+.lucky-wheel-overlay {
+  position: fixed;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  background: rgba(0, 0, 0, 0.8);
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  z-index: 10001;
+  animation: fadeIn 0.3s ease-in-out;
+}
+
+.lucky-wheel-container {
+  background: linear-gradient(135deg, #ff6b6b, #feca57, #48dbfb, #ff9ff3);
+  background-size: 400% 400%;
+  animation: gradientShift 3s ease infinite, dialogBounce 0.5s ease-out;
+  border-radius: 20px;
+  padding: 30px;
+  max-width: 500px;
+  width: 90%;
+  text-align: center;
+  box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3);
+  border: 3px solid #fff;
+}
+
+.wheel-header {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  padding: 12px;
+  background: linear-gradient(45deg, #ff6b6b, #ee5a52);
+  color: white;
+  font-weight: bold;
+}
+
+.wheel-close {
+  background: rgba(255,255,255,0.2);
+  border: none;
+  color: white;
+  font-size: 18px;
+  font-weight: bold;
+  cursor: pointer;
+  width: 30px;
+  height: 30px;
+  border-radius: 50%;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+}
+
+.wheel-content {
+  margin-top: 20px;
+}
+
+.wheel-display {
+  position: relative;
+  width: 200px;
+  height: 200px;
+  margin: 0 auto;
+  border-radius: 50%;
+  background: linear-gradient(45deg, #ff6b6b, #4ecdc4, #45b7d1, #96ceb4, #feca57, #ff9ff3);
+  animation: spin 3s linear infinite;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  font-size: 40px;
+}
+
+@keyframes spin {
+  0% { transform: rotate(0deg); }
+  100% { transform: rotate(360deg); }
+}
+
+.wheel-pointer {
+  position: absolute;
+  top: 50%;
+  left: 50%;
+  transform: translate(-50%, -50%);
+  font-size: 30px;
+  color: white;
+  animation: pointerMove 3s linear infinite;
+}
+
+@keyframes pointerMove {
+  0% { transform: translate(-50%, -50%) rotate(0deg); }
+  50% { transform: translate(-50%, -50%) rotate(180deg); }
+  100% { transform: translate(-50%, -50%) rotate(360deg); }
+}
+
+.wheel-result {
+  margin-top: 20px;
+  color: white;
+  font-size: 24px;
+  font-weight: bold;
+}
+
+.result-text {
+  margin-top: 10px;
+  font-size: 18px;
+}
+
+.wheel-buttons {
+  display: flex;
+  justify-content: space-between;
+  margin-top: 20px;
+}
+
+.spin-button, .spin-again-button {
+  flex: 1;
+  padding: 12px 25px;
+  border: none;
+  border-radius: 25px;
+  font-size: 16px;
+  font-weight: bold;
+  cursor: pointer;
+  transition: all 0.3s ease;
+}
+
+.spin-button:hover, .spin-again-button:hover {
+  transform: translateY(-2px);
+  box-shadow: 0 6px 20px rgba(255, 65, 108, 0.6);
+}
+
+.wheel-tips {
+  margin-top: 20px;
+  color: white;
+  font-size: 16px;
+}
+</style> 

+ 808 - 0
exgame/src/views/FakeVirus.vue

@@ -0,0 +1,808 @@
+<script setup>
+import { ref, onMounted, onUnmounted } from 'vue';
+import { useRouter } from 'vue-router';
+
+const router = useRouter();
+const countdownTime = ref(180); // 3分钟倒计时(秒)
+const countdownInterval = ref(null);
+const virusCount = ref(147);
+const virusInterval = ref(null);
+const alertSound = ref(null);
+const flashEffect = ref(false);
+const flashInterval = ref(null);
+const scrollingText = ref('VIRUS DETECTED! SYSTEM COMPROMISED! DATA BEING STOLEN! ');
+
+// 恶意病毒名称 - 更加可怕
+const virusNames = [
+  'SYSTEM_DESTROYER.EXE',
+  'BANKING_STEALER_2024.DLL',
+  'RANSOMWARE_CRYPTO_LOCKER',
+  'KEYLOGGER_STEALTH_PRO',
+  'WEBCAM_SPY_MONITOR',
+  'CREDIT_CARD_HARVESTER',
+  'PASSWORD_CRACKER_ELITE',
+  'ROOTKIT_INVISIBLE_GHOST',
+  'TROJAN_BACKDOOR_MASTER',
+  'BITCOIN_MINER_DESTROYER',
+  'FILE_ENCRYPTION_DEMON',
+  'IDENTITY_THEFT_BOT',
+  'NETWORK_HIJACKER_PRO',
+  'ANTIVIRUS_KILLER_2024',
+  'SYSTEM_REGISTRY_BOMBER'
+];
+
+// 被攻击的文件和数据
+const compromisedData = [
+  '银行密码已被窃取',
+  '信用卡信息正在传输',
+  '个人照片被加密',
+  '联系人列表已泄露',
+  '浏览记录被监控',
+  '邮箱密码已破解',
+  '社交媒体账号被盗',
+  '文档文件被锁定',
+  '系统注册表损坏',
+  '防火墙已被关闭'
+];
+
+// 返回主页
+const goHome = () => {
+  router.push('/');
+};
+
+// 格式化倒计时
+const formatCountdown = () => {
+  const minutes = Math.floor(countdownTime.value / 60);
+  const seconds = countdownTime.value % 60;
+  return `${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;
+};
+
+// 开始倒计时
+const startCountdown = () => {
+  countdownInterval.value = setInterval(() => {
+    if (countdownTime.value > 0) {
+      countdownTime.value--;
+      
+      // 最后10秒加强恐吓效果
+      if (countdownTime.value <= 10 && countdownTime.value > 0) {
+        // 加快闪烁
+        startFlashEffect();
+        // 播放更急促的警报
+        if (countdownTime.value % 2 === 0) {
+          playAlertSound();
+        }
+      }
+    } else {
+      // 倒计时结束后重新开始,永远循环
+      const scaryMessages = [
+        '💀 时间到!系统正在格式化... 重新扫描发现更多病毒!',
+        '🔥 硬盘已烧毁!正在重建... 检测到新的威胁!',
+        '⚡ 数据全部丢失!系统重启中... 发现超级病毒!',
+        '👾 外星病毒已完全控制您的计算机!继续扫描...',
+        '🌪️ 系统崩溃!正在紧急修复... 病毒变异了!',
+        '🚨 红色警报!系统重置失败,病毒进化中...'
+      ];
+      
+      alert(scaryMessages[Math.floor(Math.random() * scaryMessages.length)]);
+      
+      // 重置倒计时到一个随机时间(15-45秒)
+      countdownTime.value = Math.floor(Math.random() * 30) + 15;
+      
+      // 增加病毒数量
+      virusCount.value += Math.floor(Math.random() * 500) + 100;
+      if (virusCount.value > 9999) {
+        virusCount.value = 9999;
+      }
+      
+      // 重新启动所有恶搞效果
+      startFlashEffect();
+      playAlertSound();
+      
+      // 额外的恐吓消息
+      setTimeout(() => {
+        alert('🔄 病毒已进化!新的威胁正在扫描中...');
+      }, 2000);
+    }
+  }, 1000);
+};
+
+// 病毒数量增长
+const startVirusCounter = () => {
+  virusInterval.value = setInterval(() => {
+    virusCount.value += Math.floor(Math.random() * 15) + 5;
+    if (virusCount.value > 9999) {
+      virusCount.value = 9999;
+    }
+  }, 800);
+};
+
+// 闪烁效果
+const startFlashEffect = () => {
+  flashInterval.value = setInterval(() => {
+    flashEffect.value = !flashEffect.value;
+  }, 300);
+};
+
+// 播放警报声音
+const playAlertSound = () => {
+  try {
+    // 创建音频上下文来播放警报声
+    const audioContext = new (window.AudioContext || window.webkitAudioContext)();
+    const oscillator = audioContext.createOscillator();
+    const gainNode = audioContext.createGain();
+    
+    oscillator.connect(gainNode);
+    gainNode.connect(audioContext.destination);
+    
+    oscillator.frequency.setValueAtTime(800, audioContext.currentTime);
+    oscillator.frequency.setValueAtTime(400, audioContext.currentTime + 0.5);
+    oscillator.type = 'sawtooth';
+    
+    gainNode.gain.setValueAtTime(0.3, audioContext.currentTime);
+    gainNode.gain.exponentialRampToValueAtTime(0.01, audioContext.currentTime + 1);
+    
+    oscillator.start(audioContext.currentTime);
+    oscillator.stop(audioContext.currentTime + 1);
+    
+    // 重复播放
+    setTimeout(() => {
+      if (countdownTime.value > 0) {
+        playAlertSound();
+      }
+    }, 2000);
+  } catch (e) {
+    console.log('音频播放失败');
+  }
+};
+
+// 阻止用户离开页面
+const blockExit = (e) => {
+  e.preventDefault();
+  e.returnValue = '🚨 警告:您的系统正在遭受严重攻击!关闭此窗口将导致数据永久丢失!';
+  return '🚨 警告:您的系统正在遭受严重攻击!关闭此窗口将导致数据永久丢失!';
+};
+
+// 禁用右键和快捷键
+const disableShortcuts = (e) => {
+  // 禁用F12, Ctrl+Shift+I, Ctrl+U等开发者工具快捷键
+  if (e.key === 'F12' || 
+      (e.ctrlKey && e.shiftKey && e.key === 'I') ||
+      (e.ctrlKey && e.key === 'u') ||
+      (e.ctrlKey && e.key === 'U')) {
+    e.preventDefault();
+    alert('🚨 系统安全锁定!开发者工具已被禁用!');
+    return false;
+  }
+};
+
+// 禁用右键菜单
+const disableRightClick = (e) => {
+  e.preventDefault();
+  alert('🚨 右键菜单已被病毒锁定!');
+  return false;
+};
+
+const fakeCleanVirus = () => {
+  // 伪造的清除病毒功能 - 永远不会真正结束
+  const annoyingMessages = [
+    '🦠 病毒清除失败!发现新的永恒病毒!',
+    '⚠️ 警告:系统感染程度加深!',
+    '🔥 您的计算机正在燃烧!立即断网!',
+    '💀 病毒已进化,无法清除!',
+    '🚨 检测到量子病毒,正在穿越时空!',
+    '👾 外星病毒入侵,地球危险!',
+    '⚡ 病毒正在上传您的所有数据!',
+    '🌪️ 龙卷风病毒正在摧毁硬盘!'
+  ];
+  
+  alert(annoyingMessages[Math.floor(Math.random() * annoyingMessages.length)]);
+  
+  // 重置倒计时并加速
+  countdownTime.value = Math.max(15, countdownTime.value - 5);
+  
+  // 增强恶搞效果
+  startFlashEffect();
+  playAlertSound();
+  
+  // 随机弹出更多警告
+  setTimeout(() => {
+    alert('🔄 病毒自我复制中... 数量翻倍!');
+  }, 1000);
+};
+
+const continueVirusExperience = () => {
+  // 永远继续病毒体验的函数
+  const messages = [
+    '🚫 退出失败!病毒已控制系统!',
+    '💀 您无法逃脱病毒的魔爪!',
+    '🔒 系统已被永久锁定!',
+    '⚡ 试图关闭?病毒强度增加!',
+    '🌪️ 逃跑是不可能的!',
+    '👾 病毒笑了:哈哈哈哈哈!'
+  ];
+  
+  alert(messages[Math.floor(Math.random() * messages.length)]);
+  
+  // 重新启动所有效果
+  startFlashEffect();
+  playAlertSound();
+  
+  // 随机重置倒计时
+  countdownTime.value = Math.floor(Math.random() * 20) + 10;
+};
+
+onMounted(() => {
+  // 立即开始所有效果
+  startCountdown();
+  startVirusCounter();
+  startFlashEffect();
+  
+  // 延迟播放声音(避免浏览器阻止)
+  setTimeout(() => {
+    playAlertSound();
+  }, 1000);
+  
+  // 添加事件监听器
+  window.addEventListener('beforeunload', blockExit);
+  document.addEventListener('keydown', disableShortcuts);
+  document.addEventListener('contextmenu', disableRightClick);
+  
+  // 尝试全屏
+  setTimeout(() => {
+    try {
+      const elem = document.documentElement;
+      if (elem.requestFullscreen) {
+        elem.requestFullscreen().catch(() => {});
+      } else if (elem.webkitRequestFullscreen) {
+        elem.webkitRequestFullscreen();
+      } else if (elem.msRequestFullscreen) {
+        elem.msRequestFullscreen();
+      }
+    } catch (e) {
+      console.log('全屏请求失败');
+    }
+  }, 500);
+  
+  // 让页面标题闪烁
+  let titleFlash = true;
+  setInterval(() => {
+    document.title = titleFlash ? '🚨 病毒警告!系统已被感染!' : '⚠️ 立即处理!数据正在丢失!';
+    titleFlash = !titleFlash;
+  }, 1000);
+});
+
+onUnmounted(() => {
+  // 清除所有定时器和事件监听器
+  if (countdownInterval.value) clearInterval(countdownInterval.value);
+  if (virusInterval.value) clearInterval(virusInterval.value);
+  if (flashInterval.value) clearInterval(flashInterval.value);
+  
+  window.removeEventListener('beforeunload', blockExit);
+  document.removeEventListener('keydown', disableShortcuts);
+  document.removeEventListener('contextmenu', disableRightClick);
+  
+  // 恢复标题
+  document.title = '整蛊游戏';
+  
+  // 退出全屏
+  if (document.exitFullscreen && document.fullscreenElement) {
+    document.exitFullscreen().catch(() => {});
+  }
+});
+</script>
+
+<template>
+  <div class="virus-container" :class="{ 'flash-red': flashEffect }">
+    <!-- 全屏病毒警告 -->
+    <div class="fullscreen-virus-alert">
+      <!-- 顶部滚动警告条 -->
+      <div class="scrolling-banner">
+        <div class="scrolling-text">
+          {{ scrollingText.repeat(10) }}
+        </div>
+      </div>
+      
+      <!-- 主要警告内容 -->
+      <div class="main-alert">
+        <div class="skull-icon">💀</div>
+        <h1 class="main-title blink-fast">⚠️ 严重系统感染 ⚠️</h1>
+        <h2 class="sub-title">您的设备已被 {{ virusCount }} 个恶意病毒感染!</h2>
+        
+        <div class="danger-stats">
+          <div class="stat-item">
+            <span class="stat-number">{{ virusCount }}</span>
+            <span class="stat-label">活跃病毒</span>
+          </div>
+          <div class="stat-item">
+            <span class="stat-number">{{ compromisedData.length }}</span>
+            <span class="stat-label">数据泄露</span>
+          </div>
+          <div class="stat-item">
+            <span class="stat-number">{{ formatCountdown() }}</span>
+            <span class="stat-label">系统销毁倒计时</span>
+          </div>
+        </div>
+        
+        <div class="virus-effects">
+          <h3>🔥 正在发生的攻击:</h3>
+          <div class="effects-grid">
+            <div v-for="(effect, index) in compromisedData" :key="index" class="effect-item blink">
+              <span class="effect-icon">🚨</span>
+              <span class="effect-text">{{ effect }}</span>
+            </div>
+          </div>
+        </div>
+        
+        <div class="virus-list">
+          <h3>🦠 检测到的病毒:</h3>
+          <div class="virus-grid">
+            <div v-for="(virus, index) in virusNames.slice(0, 8)" :key="index" class="virus-item">
+              <span class="virus-icon">☠️</span>
+              <span class="virus-name">{{ virus }}</span>
+              <span class="virus-status">ACTIVE</span>
+            </div>
+          </div>
+        </div>
+        
+        <div class="fake-console">
+          <div class="console-header">系统日志 - 实时威胁监控</div>
+          <div class="console-content">
+            <div v-for="i in 15" :key="i" class="console-line">
+              <span class="timestamp">{{ new Date().toLocaleTimeString() }}</span>
+              <span class="error-text">ERROR: {{ virusNames[Math.floor(Math.random() * virusNames.length)] }} - 系统文件损坏</span>
+            </div>
+          </div>
+        </div>
+        
+        <div class="countdown-section">
+          <h2 class="countdown-title">⏰ 系统自毁倒计时</h2>
+          <div class="countdown-display blink-fast">{{ formatCountdown() }}</div>
+          <p class="countdown-warning">时间到达后,您的所有数据将被永久销毁!</p>
+        </div>
+        
+        <div class="action-section">
+          <button class="emergency-btn pulse" @click="fakeCleanVirus">🆘 紧急修复系统</button>
+          <button class="call-btn pulse">📞 联系技术支持</button>
+          <button class="exit-btn" @click="continueVirusExperience">❌ 强制退出(数据将丢失)</button>
+        </div>
+        
+        <div class="warning-footer">
+          <p class="footer-text">
+            ⚠️ 警告:这是一个严重的安全威胁!您的个人信息、银行详情和重要文件正在被窃取!
+            立即采取行动以防止不可逆转的损害!
+          </p>
+        </div>
+      </div>
+      
+      <!-- 底部闪烁警告 -->
+      <div class="bottom-warning blink">
+        🚨 CRITICAL SYSTEM FAILURE - IMMEDIATE ACTION REQUIRED 🚨
+      </div>
+    </div>
+  </div>
+</template>
+
+<style scoped>
+* {
+  margin: 0;
+  padding: 0;
+  box-sizing: border-box;
+}
+
+.virus-container {
+  position: fixed;
+  top: 0;
+  left: 0;
+  right: 0;
+  bottom: 0;
+  width: 100vw;
+  height: 100vh;
+  background: linear-gradient(45deg, #8B0000, #FF0000, #DC143C);
+  background-size: 400% 400%;
+  animation: gradientShift 2s ease-in-out infinite alternate;
+  overflow: hidden;
+  z-index: 99999;
+  font-family: 'Arial', sans-serif;
+}
+
+.flash-red {
+  background: #FF0000 !important;
+}
+
+.fullscreen-virus-alert {
+  width: 100%;
+  height: 100%;
+  display: flex;
+  flex-direction: column;
+  color: white;
+  text-shadow: 2px 2px 4px rgba(0,0,0,0.8);
+}
+
+.scrolling-banner {
+  background: #000;
+  color: #FF0000;
+  height: 40px;
+  overflow: hidden;
+  display: flex;
+  align-items: center;
+  border-bottom: 3px solid #FF0000;
+}
+
+.scrolling-text {
+  white-space: nowrap;
+  animation: scroll-left 10s linear infinite;
+  font-weight: bold;
+  font-size: 18px;
+}
+
+.main-alert {
+  flex: 1;
+  padding: 20px;
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  justify-content: flex-start;
+  overflow-y: auto;
+  text-align: center;
+}
+
+.skull-icon {
+  font-size: 80px;
+  margin-bottom: 20px;
+  animation: rotate 2s linear infinite;
+}
+
+.main-title {
+  font-size: 48px;
+  font-weight: bold;
+  margin-bottom: 10px;
+  text-transform: uppercase;
+  letter-spacing: 3px;
+}
+
+.sub-title {
+  font-size: 24px;
+  margin-bottom: 30px;
+  color: #FFD700;
+}
+
+.danger-stats {
+  display: flex;
+  justify-content: center;
+  gap: 40px;
+  margin-bottom: 30px;
+  flex-wrap: wrap;
+}
+
+.stat-item {
+  background: rgba(0,0,0,0.7);
+  padding: 15px 25px;
+  border-radius: 10px;
+  border: 2px solid #FF0000;
+  min-width: 150px;
+}
+
+.stat-number {
+  display: block;
+  font-size: 36px;
+  font-weight: bold;
+  color: #FF0000;
+}
+
+.stat-label {
+  display: block;
+  font-size: 14px;
+  color: #FFD700;
+  text-transform: uppercase;
+}
+
+.virus-effects {
+  margin-bottom: 30px;
+  width: 100%;
+  max-width: 1000px;
+}
+
+.virus-effects h3 {
+  font-size: 24px;
+  margin-bottom: 15px;
+  color: #FFD700;
+}
+
+.effects-grid {
+  display: grid;
+  grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
+  gap: 10px;
+}
+
+.effect-item {
+  background: rgba(0,0,0,0.8);
+  padding: 10px;
+  border-radius: 5px;
+  border-left: 4px solid #FF0000;
+  display: flex;
+  align-items: center;
+  gap: 10px;
+}
+
+.effect-icon {
+  font-size: 20px;
+}
+
+.effect-text {
+  font-size: 16px;
+  color: #FFF;
+}
+
+.virus-list {
+  margin-bottom: 30px;
+  width: 100%;
+  max-width: 1000px;
+}
+
+.virus-list h3 {
+  font-size: 24px;
+  margin-bottom: 15px;
+  color: #FFD700;
+}
+
+.virus-grid {
+  display: grid;
+  grid-template-columns: repeat(auto-fit, minmax(400px, 1fr));
+  gap: 10px;
+}
+
+.virus-item {
+  background: rgba(0,0,0,0.8);
+  padding: 15px;
+  border-radius: 5px;
+  border: 1px solid #FF0000;
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+}
+
+.virus-icon {
+  font-size: 20px;
+}
+
+.virus-name {
+  flex: 1;
+  margin-left: 10px;
+  font-family: monospace;
+  font-size: 14px;
+}
+
+.virus-status {
+  background: #FF0000;
+  color: white;
+  padding: 4px 8px;
+  border-radius: 3px;
+  font-size: 12px;
+  font-weight: bold;
+}
+
+.fake-console {
+  background: #000;
+  border: 2px solid #FF0000;
+  border-radius: 5px;
+  width: 100%;
+  max-width: 1000px;
+  margin-bottom: 30px;
+  height: 200px;
+  display: flex;
+  flex-direction: column;
+}
+
+.console-header {
+  background: #FF0000;
+  color: white;
+  padding: 8px 15px;
+  font-weight: bold;
+  font-size: 14px;
+}
+
+.console-content {
+  flex: 1;
+  padding: 10px;
+  overflow-y: auto;
+  font-family: monospace;
+  font-size: 12px;
+}
+
+.console-line {
+  margin-bottom: 5px;
+  display: flex;
+  gap: 10px;
+}
+
+.timestamp {
+  color: #00FF00;
+}
+
+.error-text {
+  color: #FF0000;
+}
+
+.countdown-section {
+  margin-bottom: 30px;
+}
+
+.countdown-title {
+  font-size: 28px;
+  margin-bottom: 15px;
+  color: #FFD700;
+}
+
+.countdown-display {
+  font-size: 72px;
+  font-weight: bold;
+  color: #FF0000;
+  background: rgba(0,0,0,0.8);
+  padding: 20px 40px;
+  border-radius: 15px;
+  border: 3px solid #FF0000;
+  margin-bottom: 15px;
+  font-family: monospace;
+}
+
+.countdown-warning {
+  font-size: 18px;
+  color: #FFD700;
+  font-weight: bold;
+}
+
+.action-section {
+  display: flex;
+  gap: 20px;
+  margin-bottom: 30px;
+  flex-wrap: wrap;
+  justify-content: center;
+}
+
+.emergency-btn, .call-btn {
+  background: linear-gradient(45deg, #FF0000, #FF4500);
+  color: white;
+  border: none;
+  padding: 15px 30px;
+  font-size: 18px;
+  font-weight: bold;
+  border-radius: 25px;
+  cursor: pointer;
+  text-transform: uppercase;
+  letter-spacing: 1px;
+  box-shadow: 0 4px 15px rgba(255,0,0,0.4);
+}
+
+.exit-btn {
+  background: #666;
+  color: white;
+  border: none;
+  padding: 12px 25px;
+  font-size: 16px;
+  border-radius: 20px;
+  cursor: pointer;
+}
+
+.warning-footer {
+  background: rgba(0,0,0,0.9);
+  padding: 20px;
+  border-radius: 10px;
+  border: 2px solid #FFD700;
+  max-width: 1000px;
+}
+
+.footer-text {
+  font-size: 16px;
+  line-height: 1.5;
+  color: #FFD700;
+  font-weight: bold;
+}
+
+.bottom-warning {
+  background: #000;
+  color: #FF0000;
+  padding: 15px;
+  text-align: center;
+  font-size: 20px;
+  font-weight: bold;
+  border-top: 3px solid #FF0000;
+}
+
+/* 动画效果 */
+@keyframes gradientShift {
+  0% { background-position: 0% 50%; }
+  100% { background-position: 100% 50%; }
+}
+
+@keyframes scroll-left {
+  0% { transform: translateX(100%); }
+  100% { transform: translateX(-100%); }
+}
+
+@keyframes rotate {
+  0% { transform: rotate(0deg); }
+  100% { transform: rotate(360deg); }
+}
+
+@keyframes blink {
+  0%, 50% { opacity: 1; }
+  25%, 75% { opacity: 0.5; }
+}
+
+@keyframes blink-fast {
+  0%, 50% { opacity: 1; }
+  25%, 75% { opacity: 0.3; }
+}
+
+@keyframes pulse {
+  0% { transform: scale(1); }
+  50% { transform: scale(1.05); }
+  100% { transform: scale(1); }
+}
+
+.blink {
+  animation: blink 1s infinite;
+}
+
+.blink-fast {
+  animation: blink-fast 0.5s infinite;
+}
+
+.pulse {
+  animation: pulse 1.5s ease-in-out infinite;
+}
+
+/* 响应式设计 */
+@media (max-width: 768px) {
+  .main-title {
+    font-size: 32px;
+  }
+  
+  .sub-title {
+    font-size: 18px;
+  }
+  
+  .danger-stats {
+    flex-direction: column;
+    gap: 15px;
+  }
+  
+  .countdown-display {
+    font-size: 48px;
+    padding: 15px 25px;
+  }
+  
+  .effects-grid, .virus-grid {
+    grid-template-columns: 1fr;
+  }
+  
+  .action-section {
+    flex-direction: column;
+    align-items: center;
+  }
+  
+  .emergency-btn, .call-btn {
+    width: 100%;
+    max-width: 300px;
+  }
+}
+
+@media (max-height: 600px) {
+  .skull-icon {
+    font-size: 40px;
+    margin-bottom: 10px;
+  }
+  
+  .main-title {
+    font-size: 24px;
+  }
+  
+  .countdown-display {
+    font-size: 36px;
+  }
+  
+  .main-alert {
+    padding: 10px;
+  }
+}
+</style> 

+ 1517 - 0
exgame/src/views/FakeWinning.vue

@@ -0,0 +1,1517 @@
+<script setup>
+import { ref, onMounted, onUnmounted } from 'vue';
+import { useRouter } from 'vue-router';
+
+const router = useRouter();
+
+// 超级恼人的状态管理
+const showMainPopup = ref(true);
+const showSecondaryPopup = ref(false);
+const showFakeClose = ref(true);
+const showCelebrity = ref(false);
+const showFakeNews = ref(false);
+const showPhishing = ref(false);
+const countdown = ref(30); // 30秒紧急倒计时
+const urgentLevel = ref(1); // 紧急等级 1-5
+const annoying = ref(true);
+const popupCount = ref(0);
+const showLeaveDialog = ref(false); // 显示离开确认对话框
+const showCustomNotification = ref(false); // 自定义通知
+const customNotificationMessage = ref(''); // 通知消息
+
+// 新增恶心功能状态
+const isUltraAnnoyingMode = ref(false); // 超级恶心模式
+const fakeCloseButtons = ref([]); // 假关闭按钮数组
+const movingElements = ref(false); // 移动界面元素
+const invertedControls = ref(false); // 反向控制
+const fakeLoadingScreen = ref(false); // 假加载界面
+const multipleCursors = ref(false); // 多个鼠标光标
+const screenShake = ref(false); // 屏幕震动
+const updownText = ref(false); // 文字上下颠倒
+const rapidColorChange = ref(false); // 快速变色
+const mouseFollower = ref(null); // 鼠标跟踪元素
+const annoyanceLevel = ref(1); // 恶心等级
+
+// 超级恶心的广告文本数组
+const ultraAnnoyingTexts = [
+  "🎪 恭喜!您已被永久绑定到恶搞宇宙!",
+  "🔄 正在安装1000000个恶搞插件...",
+  "🎭 您的现实已被修改!欢迎来到恶搞维度!",
+  "🚀 正在传送您到火星恶搞基地...",
+  "🎨 您的屏幕已被恶搞病毒感染!",
+  "🎵 正在播放10小时循环恶搞音乐...",
+  "🎪 您已成为永恒恶搞实验的志愿者!",
+  "🔮 正在读取您的内心想法...",
+  "🎯 恶搞系统已锁定您的灵魂!",
+  "🌟 您获得了永生恶搞体验资格!"
+];
+
+// 恼人弹窗内容
+const annoyingPopups = [
+  "🚨 警告:您即将错过价值999万的超级大奖!",
+  "⚠️ 系统检测到您想要关闭页面!这样做将失去所有奖品!",
+  "🎉 等等!还有更多惊喜等着您!",
+  "💰 您确定要放弃成为百万富翁的机会吗?",
+  "🔥 最后机会!点击确定继续领奖!",
+  "🎁 您的朋友们都在这里中奖了!不要错过!",
+  "🏆 这是您人生的转折点!请不要放弃!",
+  "💎 钻石会员专享:额外获得豪车一辆!"
+];
+
+// 假新闻内容
+const fakeNewsContent = [
+  "【重磅】某大学生通过此网站中奖500万,当天辞职创业!",
+  "【震惊】90后女孩中奖后买房买车,人生逆袭!",
+  "【爆料】知名企业家透露:我的第一桶金来自这个幸运网站!",
+  "【独家】明星们都在偷偷使用的中奖秘密网站曝光!"
+];
+
+// 假名人推荐
+const fakeCelebrityEndorsements = [
+  { name: "马🐴", quote: "我就是在这里中的第一个100万!", avatar: "👨‍💼" },
+  { name: "雷🐯", quote: "小米的创业资金全靠这个网站!", avatar: "👔" },
+  { name: "刘🐧", quote: "京东的成功离不开这里的财运!", avatar: "🤵" },
+  { name: "王🐒", quote: "美团能上市,多亏了这个幸运平台!", avatar: "👨‍💻" }
+];
+
+// 音频上下文
+const audioContext = ref(null);
+
+// 创建超级烦人的蜂鸣声
+const createAnnoyingBeep = () => {
+  if (!audioContext.value) {
+    audioContext.value = new (window.AudioContext || window.webkitAudioContext)();
+  }
+  
+  const oscillator = audioContext.value.createOscillator();
+  const gainNode = audioContext.value.createGain();
+  
+  oscillator.connect(gainNode);
+  gainNode.connect(audioContext.value.destination);
+  
+  // 超级尖锐刺耳的声音
+  oscillator.frequency.setValueAtTime(2000, audioContext.value.currentTime);
+  oscillator.frequency.setValueAtTime(500, audioContext.value.currentTime + 0.1);
+  
+  gainNode.gain.setValueAtTime(0.3, audioContext.value.currentTime);
+  gainNode.gain.exponentialRampToValueAtTime(0.01, audioContext.value.currentTime + 0.2);
+  
+  oscillator.start();
+  oscillator.stop(audioContext.value.currentTime + 0.2);
+};
+
+// 创建恼人的警报声
+const createAlarmSound = () => {
+  if (!audioContext.value) {
+    audioContext.value = new (window.AudioContext || window.webkitAudioContext)();
+  }
+  
+  const oscillator = audioContext.value.createOscillator();
+  const gainNode = audioContext.value.createGain();
+  
+  oscillator.connect(gainNode);
+  gainNode.connect(audioContext.value.destination);
+  
+  oscillator.frequency.setValueAtTime(800, audioContext.value.currentTime);
+  oscillator.frequency.setValueAtTime(1200, audioContext.value.currentTime + 0.3);
+  oscillator.frequency.setValueAtTime(800, audioContext.value.currentTime + 0.6);
+  
+  gainNode.gain.setValueAtTime(0.4, audioContext.value.currentTime);
+  gainNode.gain.exponentialRampToValueAtTime(0.01, audioContext.value.currentTime + 0.9);
+  
+  oscillator.start();
+  oscillator.stop(audioContext.value.currentTime + 0.9);
+};
+
+// 修改倒计时功能 - 循环重置而不是结束
+let countdownTimer = null;
+const startCountdown = () => {
+  countdownTimer = setInterval(() => {
+    if (countdown.value > 0) {
+      countdown.value--;
+      
+      // 最后10秒疯狂提醒
+      if (countdown.value <= 10) {
+        createAlarmSound();
+        document.title = `🚨${countdown.value}秒!奖品即将作废!`;
+        
+        if (navigator.vibrate) {
+          navigator.vibrate([200, 100, 200, 100, 200]);
+        }
+      }
+      
+      // 每5秒播放烦人声音
+      if (countdown.value % 5 === 0) {
+        createAnnoyingBeep();
+      }
+    } else {
+      // 时间到了自动重置,继续恶搞!
+      countdown.value = 30;
+      urgentLevel.value = 1;
+      popupCount.value = 0;
+      
+      // 播放"恭喜"音效并显示新的恶搞内容
+      createAnnoyingBeep();
+      showFakeNewsPopup();
+      
+      // 随机改变奖品金额,继续诱惑
+      setTimeout(() => {
+        showCelebrityPopup();
+      }, 2000);
+    }
+  }, 1000);
+};
+
+// 移除真正的返回主页功能 - 替换为继续恶搞
+const continueExperience = () => {
+  // 不再提供真正的退出,而是继续恶搞
+  showCustomNotificationFn("🎉 您选择继续体验!准备更多惊喜!");
+  
+  // 重置所有状态,开始新一轮恶搞
+  countdown.value = 30;
+  urgentLevel.value = 1;
+  popupCount.value = 0;
+  showMainPopup.value = true;
+  showSecondaryPopup.value = false;
+  showFakeNews.value = false;
+  showCelebrity.value = false;
+  showPhishing.value = false;
+  
+  // 立即开始新的恶搞轮次
+  setTimeout(() => {
+    showFakeNewsPopup();
+  }, 1000);
+  
+  setTimeout(() => {
+    showCelebrityPopup();
+  }, 3000);
+  
+  createAnnoyingBeep();
+};
+
+// 创建假关闭按钮
+const createFakeCloseButtons = () => {
+  for (let i = 0; i < 20; i++) {
+    fakeCloseButtons.value.push({
+      id: Date.now() + i,
+      x: Math.random() * (window.innerWidth - 50),
+      y: Math.random() * (window.innerHeight - 50),
+      clicked: false
+    });
+  }
+};
+
+// 点击假关闭按钮
+const clickFakeCloseButton = (buttonId) => {
+  const button = fakeCloseButtons.value.find(b => b.id === buttonId);
+  if (button) {
+    button.clicked = true;
+    annoyanceLevel.value++;
+    
+    showCustomNotificationFn("😈 哈哈!这是假的关闭按钮!恶搞等级提升!");
+    createAnnoyingSound();
+    
+    // 创建更多假按钮
+    createFakeCloseButtons();
+    
+    // 激活更多恶心功能
+    if (annoyanceLevel.value > 3) {
+      activateUltraAnnoyingMode();
+    }
+  }
+};
+
+// 激活超级恶心模式
+const activateUltraAnnoyingMode = () => {
+  isUltraAnnoyingMode.value = true;
+  showCustomNotificationFn("🎪 恭喜!您已解锁超级恶心模式!");
+  
+  // 启动各种恶心效果
+  setTimeout(() => movingElements.value = true, 1000);
+  setTimeout(() => invertedControls.value = true, 2000);
+  setTimeout(() => multipleCursors.value = true, 3000);
+  setTimeout(() => screenShake.value = true, 4000);
+  setTimeout(() => updownText.value = true, 5000);
+  setTimeout(() => rapidColorChange.value = true, 6000);
+  
+  // 开始疯狂弹窗轰炸
+  startPopupBombing();
+  
+  // 开始鼠标跟踪恶搞
+  startMouseFollowing();
+};
+
+// 弹窗轰炸
+const startPopupBombing = () => {
+  setInterval(() => {
+    if (isUltraAnnoyingMode.value) {
+      for (let i = 0; i < 3; i++) {
+        setTimeout(() => {
+          createAnnoyingPopup();
+        }, i * 200);
+      }
+    }
+  }, 2000);
+};
+
+// 鼠标跟踪恶搞
+const startMouseFollowing = () => {
+  document.addEventListener('mousemove', (e) => {
+    if (isUltraAnnoyingMode.value && Math.random() > 0.95) {
+      createFollowerElement(e.clientX, e.clientY);
+    }
+  });
+};
+
+// 创建跟踪元素
+const createFollowerElement = (x, y) => {
+  const follower = document.createElement('div');
+  follower.className = 'mouse-follower';
+  follower.style.left = x + 'px';
+  follower.style.top = y + 'px';
+  follower.innerHTML = ultraAnnoyingTexts[Math.floor(Math.random() * ultraAnnoyingTexts.length)];
+  document.body.appendChild(follower);
+  
+  setTimeout(() => {
+    if (follower.parentNode) {
+      follower.parentNode.removeChild(follower);
+    }
+  }, 3000);
+};
+
+// 假加载屏幕
+const showFakeLoading = () => {
+  fakeLoadingScreen.value = true;
+  showCustomNotificationFn("正在连接恶搞服务器...");
+  
+  let progress = 0;
+  const loadingInterval = setInterval(() => {
+    progress += Math.random() * 5;
+    if (progress >= 99) {
+      progress = 99;
+      clearInterval(loadingInterval);
+      
+      // 假装加载失败
+      setTimeout(() => {
+        fakeLoadingScreen.value = false;
+        showCustomNotificationFn("加载失败!正在重新尝试...");
+        
+        // 重新开始假加载
+        setTimeout(() => {
+          showFakeLoading();
+        }, 2000);
+      }, 3000);
+    }
+  }, 100);
+};
+
+// 反向鼠标控制恶搞
+const handleMouseMoveReverse = (e) => {
+  if (invertedControls.value && Math.random() > 0.9) {
+    const reverseX = window.innerWidth - e.clientX;
+    const reverseY = window.innerHeight - e.clientY;
+    
+    // 创建假光标
+    const fakeCursor = document.createElement('div');
+    fakeCursor.className = 'fake-cursor';
+    fakeCursor.style.left = reverseX + 'px';
+    fakeCursor.style.top = reverseY + 'px';
+    document.body.appendChild(fakeCursor);
+    
+    setTimeout(() => {
+      if (fakeCursor.parentNode) {
+        fakeCursor.parentNode.removeChild(fakeCursor);
+      }
+    }, 1000);
+  }
+};
+
+// 增强版假关闭功能
+const fakeCloseClick = () => {
+  popupCount.value++;
+  
+  // 根据点击次数增加恶心程度
+  if (popupCount.value <= 3) {
+    const fakeMessages = [
+      "🤡 关闭?不存在的!",
+      "😈 您想多了!这只是开始!",
+      "🎪 欢迎来到恶搞地狱!"
+    ];
+    showCustomNotificationFn(fakeMessages[popupCount.value - 1]);
+  } else if (popupCount.value <= 6) {
+    const escalationMessages = [
+      "🔥 恶搞强度正在上升...",
+      "⚡ 系统正在释放更多恶搞能量...",
+      "🌪️ 恶搞风暴即将来临..."
+    ];
+    showCustomNotificationFn(escalationMessages[popupCount.value - 4]);
+    
+    // 开始移动界面元素
+    movingElements.value = true;
+  } else if (popupCount.value <= 10) {
+    showCustomNotificationFn("🚀 恭喜触发终极恶搞模式!");
+    activateUltraAnnoyingMode();
+    
+    // 创建大量假关闭按钮
+    createFakeCloseButtons();
+    
+    // 开始假加载
+    showFakeLoading();
+  } else {
+    // 超过10次点击后,显示"怜悯"选项
+    showPrankDialogFn(
+      '🙏 您已经被恶搞了' + popupCount.value + '次!\n\n是否显示真正的离开选项?\n\n(提示:选"否"会让情况变得更糟)',
+      (choice) => {
+        if (choice) {
+          // 即使用户选择"是",也给假选项
+          setTimeout(() => {
+            showCustomNotificationFn("😈 刚才是在骗您!恶搞继续!");
+            activateUltraAnnoyingMode();
+          }, 2000);
+        } else {
+          showCustomNotificationFn("🎉 您选择了继续被恶搞!恶搞等级MAX!");
+          annoyanceLevel.value = 999;
+          activateUltraAnnoyingMode();
+        }
+      }
+    );
+  }
+  
+  // 每次点击都增加更多恶搞内容
+  triggerPrankContent();
+  createAnnoyingSound();
+};
+
+// 触发恶搞内容
+const triggerPrankContent = () => {
+  const prankActions = [
+    () => createMultiplePopups(),
+    () => {
+      document.body.style.filter = 'hue-rotate(' + Math.random() * 360 + 'deg)';
+      setTimeout(() => {
+        document.body.style.filter = 'none';
+      }, 2000);
+    },
+    () => {
+      document.body.style.transform = 'rotate(' + (Math.random() * 10 - 5) + 'deg)';
+      setTimeout(() => {
+        document.body.style.transform = 'none';
+      }, 1000);
+    },
+    () => showFakeLoading(),
+    () => createFakeCloseButtons()
+  ];
+  
+  const randomAction = prankActions[Math.floor(Math.random() * prankActions.length)];
+  randomAction();
+};
+
+// 显示虚假客服
+const showFakeCustomerService = () => {
+  const customerServiceMessage = `🎧 在线客服小美:
+
+亲爱的用户您好!我是专属客服小美~
+
+您刚才是想要关闭页面吗?
+作为VIP用户,我们为您准备了额外福利:
+
+🎁 额外奖励:iPhone 15 Pro Max
+💰 现金红包:88888元
+🏆 神秘大奖:价值不详
+
+请不要离开,让我为您详细介绍吧~ 💕`;
+  
+  showCustomNotificationFn(customerServiceMessage);
+  showSecondaryPopup.value = true;
+};
+
+// 显示假新闻
+const showFakeNewsPopup = () => {
+  const randomNews = fakeNewsContent[Math.floor(Math.random() * fakeNewsContent.length)];
+  showCustomNotificationFn(`📰 热点新闻:\n\n${randomNews}\n\n点击确定查看详情!`);
+  showFakeNews.value = true;
+};
+
+// 显示名人代言
+const showCelebrityPopup = () => {
+  const randomCelebrity = fakeCelebrityEndorsements[Math.floor(Math.random() * fakeCelebrityEndorsements.length)];
+  showCustomNotificationFn(`${randomCelebrity.avatar} ${randomCelebrity.name}说:\n\n"${randomCelebrity.quote}"\n\n连名人都在用,您还在犹豫什么?`);
+  showCelebrity.value = true;
+};
+
+// 阻止用户离开页面的功能
+const blockPageLeave = (e) => {
+  e.preventDefault();
+  e.returnValue = '🎁 您即将错过百万大奖!确定要离开吗?';
+  return '🎁 您即将错过百万大奖!确定要离开吗?';
+};
+
+// 禁用各种快捷键
+const disableShortcuts = (e) => {
+  // 禁用F12, Ctrl+Shift+I, Ctrl+U, Alt+F4等
+  if (e.key === 'F12' || 
+      (e.ctrlKey && e.shiftKey && e.key === 'I') ||
+      (e.ctrlKey && e.key === 'u') ||
+      (e.ctrlKey && e.key === 'U') ||
+      (e.altKey && e.key === 'F4') ||
+      (e.ctrlKey && e.key === 'w') ||
+      (e.ctrlKey && e.key === 'W')) {
+    e.preventDefault();
+    showCustomNotificationFn('🚫 快捷键已被禁用!您必须完成抽奖!');
+    createAnnoyingBeep();
+    return false;
+  }
+};
+
+// 禁用右键菜单
+const disableRightClick = (e) => {
+  e.preventDefault();
+  showCustomNotificationFn('🚫 右键菜单已被锁定!请继续您的抽奖!');
+  createAnnoyingBeep();
+  return false;
+};
+
+// 检测页面失焦(试图切换到其他程序)
+const handlePageBlur = () => {
+  showCustomNotificationFn('🎯 检测到您想逃跑!奖品正在等您领取!');
+  window.focus();
+  createAnnoyingBeep();
+};
+
+// 移除浏览器原生的离开确认,改用自定义UI
+const showCustomLeaveDialog = () => {
+  showLeaveDialog.value = true;
+  createAnnoyingBeep();
+};
+
+// 用户选择离开
+const confirmLeave = () => {
+  const finalMessages = [
+    "💸 真的要放弃999万大奖吗?",
+    "😭 我们会想念您的!",
+    "🎭 感谢体验恶搞游戏!",
+    "🎪 您随时可以回来继续恶搞!",
+    "🌟 希望您玩得开心!"
+  ];
+  
+  showCustomNotificationFn(finalMessages[Math.floor(Math.random() * finalMessages.length)]);
+  showLeaveDialog.value = false;
+  
+  // 延迟跳转,让用户看到通知
+  setTimeout(() => {
+    router.push('/');
+  }, 1500);
+};
+
+// 用户选择继续留下
+const stayAndContinue = () => {
+  showLeaveDialog.value = false;
+  showCustomNotificationFn("🎉 明智的选择!让我们继续这美妙的恶搞之旅!");
+  
+  // 重新激活恶搞效果
+  countdown.value = 30;
+  urgentLevel.value = Math.min(urgentLevel.value + 1, 5);
+  showFakeNewsPopup();
+  createAnnoyingBeep();
+};
+
+// 自定义通知函数 - 替代alert
+const showCustomNotificationFn = (message) => {
+  customNotificationMessage.value = message;
+  showCustomNotification.value = true;
+  createAnnoyingBeep();
+  
+  // 3秒后自动关闭通知
+  setTimeout(() => {
+    showCustomNotification.value = false;
+  }, 3000);
+};
+
+onMounted(() => {
+  // 立即开始倒计时循环
+  startCountdown();
+  
+  // 延迟显示各种弹窗和功能
+  setTimeout(() => showSecondaryPopup.value = true, 3000);
+  setTimeout(() => showFakeNews.value = true, 5000);
+  setTimeout(() => showCelebrity.value = true, 8000);
+  setTimeout(() => showPhishing.value = true, 12000);
+  
+  // 移除页面离开阻拦 - 改用自定义UI
+  // 添加键盘快捷键保护
+  document.addEventListener('keydown', disableShortcuts);
+  document.addEventListener('contextmenu', disableRightClick);
+  
+  // 定期播放恼人音效
+  setInterval(() => {
+    if (Math.random() > 0.5) {
+      createAnnoyingBeep();
+    }
+  }, 5000);
+  
+  // 定期更改页面标题制造恶搞效果
+  setInterval(() => {
+    const annoyingTitles = [
+      "🚨 您已中奖!",
+      "💰 恭喜发财!",
+      "⚠️ 系统警告!",
+      "🎉 限时优惠!",
+      "🔥 火爆促销!",
+      "💎 钻石会员特权!",
+      "🎪 永恒恶搞模式!"
+    ];
+    document.title = annoyingTitles[Math.floor(Math.random() * annoyingTitles.length)];
+  }, 3000);
+
+  // 立即创建一些假关闭按钮
+  createFakeCloseButtons();
+  
+  // 添加鼠标移动监听 - 用于反向控制和跟踪
+  document.addEventListener('mousemove', handleMouseMoveReverse);
+  
+  // 定期检查用户行为并升级恶搞等级
+  setInterval(() => {
+    if (annoyanceLevel.value >= 5 && !isUltraAnnoyingMode.value) {
+      activateUltraAnnoyingMode();
+    }
+    
+    // 随机触发恶搞内容
+    if (Math.random() > 0.9 && isUltraAnnoyingMode.value) {
+      triggerPrankContent();
+    }
+  }, 5000);
+  
+  // 自动增加恶心等级
+  setInterval(() => {
+    if (annoyanceLevel.value < 10) {
+      annoyanceLevel.value++;
+    }
+  }, 10000);
+  
+  // 页面失焦检测 - 试图离开页面时的恶搞
+  window.addEventListener('blur', () => {
+    if (isUltraAnnoyingMode.value) {
+      showCustomNotificationFn("😈 想偷偷离开?被发现了!");
+      createAnnoyingSound();
+      // 重新聚焦到当前页面
+      setTimeout(() => {
+        window.focus();
+      }, 500);
+    }
+  });
+  
+  // 开始假加载循环(在超级恶心模式下)
+  setTimeout(() => {
+    if (Math.random() > 0.7) {
+      showFakeLoading();
+    }
+  }, 20000);
+});
+
+onUnmounted(() => {
+  if (countdownTimer) {
+    clearInterval(countdownTimer);
+  }
+  document.removeEventListener('keydown', disableShortcuts);
+  document.removeEventListener('contextmenu', disableRightClick);
+  window.removeEventListener('blur', handlePageBlur);
+});
+</script>
+
+<template>
+  <div class="fake-winning-container">
+    <!-- 超级烦人模式指示器 -->
+    <div v-if="isUltraAnnoyingMode" class="ultra-mode-indicator">
+      <div class="mode-status">🔥 超级恶搞模式已激活</div>
+      <div class="annoyance-meter">
+        <div class="annoyance-fill" :style="{ width: (annoyanceLevel * 10) + '%' }"></div>
+      </div>
+      <div class="level-text">恶搞等级: {{ annoyanceLevel }}/10</div>
+    </div>
+
+    <!-- 假的关闭按钮 -->
+    <button 
+      class="fake-close-button" 
+      @click="fakeCloseClick"
+      :class="{ 'moving': movingElements, 'shake': screenShake }"
+    >
+      ❌ 真正的关闭按钮
+    </button>
+
+    <!-- 大量假关闭按钮 -->
+    <div 
+      v-for="btn in fakeCloseButtons" 
+      :key="btn.id"
+      class="scattered-fake-button"
+      :style="{ left: btn.x + 'px', top: btn.y + 'px' }"
+      @click="clickFakeCloseButton(btn.id)"
+      :class="{ 'clicked': btn.clicked }"
+    >
+      ❌
+    </div>
+
+    <!-- 假加载屏幕 -->
+    <div v-if="fakeLoadingScreen" class="fake-loading-overlay">
+      <div class="fake-loading-content">
+        <div class="loading-spinner"></div>
+        <h2>🎪 恶搞系统加载中...</h2>
+        <div class="loading-bar">
+          <div class="loading-progress"></div>
+        </div>
+        <p class="loading-text">正在初始化恶搞模块... 99%</p>
+        <p class="loading-subtext">⚠️ 请勿关闭此窗口,否则后果自负!</p>
+      </div>
+    </div>
+
+    <!-- 鼠标跟踪恶搞元素 -->
+    <div v-if="isUltraAnnoyingMode" class="mouse-tracking-container">
+      <!-- 这些会通过JavaScript动态创建 -->
+    </div>
+
+    <!-- 移动的恶搞文本 -->
+    <div v-if="movingElements" class="moving-text-container">
+      <div class="moving-text" v-for="n in 5" :key="n">
+        🎪 您已被永久恶搞!
+      </div>
+    </div>
+
+    <!-- 屏幕边缘的恶搞提示 -->
+    <div v-if="isUltraAnnoyingMode" class="edge-pranks">
+      <div class="edge-prank top">👆 想往上逃?不可能!</div>
+      <div class="edge-prank bottom">👇 向下也逃不掉!</div>
+      <div class="edge-prank left">👈 左边没有出路!</div>
+      <div class="edge-prank right">👉 右边也是死路!</div>
+    </div>
+
+    <!-- 假的进度条 -->
+    <div v-if="isUltraAnnoyingMode" class="fake-progress-container">
+      <div class="fake-progress-bar">
+        <div class="fake-progress-fill"></div>
+      </div>
+      <p class="progress-text">恶搞进度:99.9999%</p>
+    </div>
+
+    <!-- 超级烦人的主弹窗 - 永远显示 -->
+    <div class="main-annoying-popup">
+      <div class="popup-content mega-annoying">
+        <div class="flashing-header">
+          <h1 class="super-title blink-text">🎊🎊 永恒大奖中心 🎊🎊</h1>
+          <div class="fake-close-area" @click="fakeClose">
+            <span class="fake-x">✕</span>
+          </div>
+        </div>
+        
+        <!-- 恶心的奖品展示 -->
+        <div class="disgusting-prize-display">
+          <div class="prize-wheel spinning" :style="{ transform: `rotate(${popupCount * 360}deg)` }">
+            <div class="wheel-segment">💰</div>
+            <div class="wheel-segment">🏠</div>
+            <div class="wheel-segment">🚗</div>
+            <div class="wheel-segment">💎</div>
+          </div>
+          
+          <div class="prize-announcement animate__animated animate__bounce animate__infinite">
+            <p class="mega-text rainbow-text">恭喜您中得永恒大奖!</p>
+            <p class="prize-amount glow-text">¥{{ (999000 + Math.floor(Math.random() * 999000)).toLocaleString() }}</p>
+            <p class="winner-number">您是第{{ (1000000 + Math.floor(Math.random() * 9999999)).toLocaleString() }}位永恒用户!</p>
+            <p class="infinite-text blink-text">🔄 恶搞模式:永久激活 🔄</p>
+          </div>
+        </div>
+        
+        <!-- 超级烦人的无限倒计时 -->
+        <div class="annoying-countdown" :class="`urgent-level-${urgentLevel}`">
+          <div class="countdown-label blink-text">⚠️ 无限循环倒计时 ⚠️</div>
+          <div class="countdown-display">
+            <span class="countdown-number">{{ countdown.toString().padStart(2, '0') }}</span>
+            <span class="countdown-unit">秒</span>
+          </div>
+          <div class="countdown-warning pulse-text">永不过期!永不结束!</div>
+        </div>
+        
+        <!-- 虚假的奖品列表 -->
+        <div class="fake-prize-list">
+          <div class="prize-item premium">
+            <span class="prize-icon">🏆</span>
+            <span class="prize-name">无限现金</span>
+            <span class="prize-value">999万</span>
+          </div>
+          <div class="prize-item gold">
+            <span class="prize-icon">🏠</span>
+            <span class="prize-name">梦想别墅</span>
+            <span class="prize-value">500万</span>
+          </div>
+          <div class="prize-item silver">
+            <span class="prize-icon">🚗</span>
+            <span class="prize-name">豪华跑车</span>
+            <span class="prize-value">200万</span>
+          </div>
+          <div class="prize-item bronze">
+            <span class="prize-icon">🎭</span>
+            <span class="prize-name">永恒体验</span>
+            <span class="prize-value">无价</span>
+          </div>
+        </div>
+        
+        <!-- 烦人的按钮区域 - 所有按钮都不会真正结束 -->
+        <div class="annoying-buttons">
+          <button class="claim-btn super-annoying animate__animated animate__pulse animate__infinite" @click="fakeClose">
+            🎯 领取无限奖品 🎯
+          </button>
+          <button class="info-btn annoying" @click="showFakeNewsPopup">
+            📰 查看永恒案例
+          </button>
+          <button class="celebrity-btn annoying" @click="showCelebrityPopup">
+            ⭐ 无限推荐
+          </button>
+          <button class="continue-btn annoying" @click="continueExperience">
+            🔄 重新开始恶搞
+          </button>
+        </div>
+        
+        <!-- 恶心的滚动文字 -->
+        <div class="scrolling-text">
+          <marquee behavior="scroll" direction="left" scrollamount="8">
+            🔥 永恒恶搞!张三中奖999次!🔥 李四获得无限别墅!🔥 王五中得永恒现金!🔥 这里永远不会结束!🔥
+          </marquee>
+        </div>
+        
+        <!-- 假的安全认证 -->
+        <div class="fake-security">
+          <span class="security-badge">🔒 永恒认证</span>
+          <span class="security-badge">🛡️ 无限安全</span>
+          <span class="security-badge">⚡ 永不到账</span>
+          <span class="security-badge">🏆 恶搞保障</span>
+        </div>
+      </div>
+    </div>
+    
+    <!-- 次级烦人弹窗 -->
+    <div class="secondary-popup" v-if="showSecondaryPopup">
+      <div class="popup-overlay"></div>
+      <div class="popup-box annoying-shake">
+        <h3 class="popup-title blink-text">🚨 重要提醒 🚨</h3>
+        <p class="popup-text">检测到您想要离开页面!</p>
+        <p class="popup-text">这样做将永久失去以下奖品:</p>
+        <ul class="lost-prizes">
+          <li>💰 现金大奖:999万元</li>
+          <li>🏠 豪华别墅:一套</li>
+          <li>🚗 豪华跑车:一辆</li>
+          <li>💎 钻石珠宝:一套</li>
+        </ul>
+        <div class="popup-buttons">
+          <button class="stay-btn pulse-btn" @click="showSecondaryPopup = false">继续领奖</button>
+          <button class="leave-btn danger-btn" @click="continueExperience">放弃奖品</button>
+        </div>
+      </div>
+    </div>
+    
+    <!-- 虚假新闻弹窗 -->
+    <div class="fake-news-popup" v-if="showFakeNews">
+      <div class="news-header">📰 今日头条</div>
+      <div class="news-content">
+        <p v-for="(news, index) in fakeNewsContent" :key="index" class="news-item">
+          {{ news }}
+        </p>
+      </div>
+      <button class="close-news" @click="showFakeNews = false">关闭新闻</button>
+    </div>
+    
+    <!-- 名人代言弹窗 -->
+    <div class="celebrity-popup" v-if="showCelebrity">
+      <div class="celebrity-header">⭐ 名人强烈推荐 ⭐</div>
+      <div class="celebrity-content">
+        <div v-for="(celebrity, index) in fakeCelebrityEndorsements" :key="index" class="celebrity-item">
+          <span class="celebrity-avatar">{{ celebrity.avatar }}</span>
+          <span class="celebrity-name">{{ celebrity.name }}</span>
+          <p class="celebrity-quote">"{{ celebrity.quote }}"</p>
+        </div>
+      </div>
+      <button class="close-celebrity" @click="showCelebrity = false">我也要中奖</button>
+    </div>
+    
+    <!-- 钓鱼信息收集弹窗 -->
+    <div class="phishing-popup" v-if="showPhishing">
+      <div class="phishing-header">🔐 身份验证</div>
+      <div class="phishing-content">
+        <p>为确保奖品安全发放,请输入以下信息:</p>
+        <div class="fake-form">
+          <input type="text" placeholder="真实姓名" class="fake-input">
+          <input type="text" placeholder="身份证号" class="fake-input">
+          <input type="text" placeholder="银行卡号" class="fake-input">
+          <input type="password" placeholder="支付密码" class="fake-input">
+          <button class="verify-btn" @click="alert('哈哈!差点上当了吧?这是恶搞网站!'); showPhishing = false">
+            验证身份
+          </button>
+        </div>
+      </div>
+      <div class="phishing-warning">⚠️ 这是恶搞测试,请勿输入真实信息!</div>
+    </div>
+    
+    <!-- 自定义离开确认对话框 -->
+    <div class="leave-dialog-overlay" v-if="showLeaveDialog">
+      <div class="leave-dialog">
+        <div class="leave-dialog-header">
+          <h3>🚪 真的要离开吗?</h3>
+        </div>
+        <div class="leave-dialog-content">
+          <div class="leave-warning">
+            <p>😱 您即将错过以下丰厚奖品:</p>
+            <ul class="missed-rewards">
+              <li>💰 现金大奖:999万元</li>
+              <li>🏠 豪华别墅:价值500万</li>
+              <li>🚗 豪华跑车:价值200万</li>
+              <li>💎 钻石珠宝:价值100万</li>
+              <li>🎭 永恒恶搞体验:无价之宝</li>
+            </ul>
+            <p class="final-plea">🙏 最后一次机会,真的不再考虑一下吗?</p>
+          </div>
+        </div>
+        <div class="leave-dialog-buttons">
+          <button class="stay-button" @click="stayAndContinue">
+            💝 我要留下来领奖!
+          </button>
+          <button class="leave-button" @click="confirmLeave">
+            😔 我决定离开
+          </button>
+        </div>
+      </div>
+    </div>
+    
+    <!-- 自定义通知 - 替代alert -->
+    <div v-if="showCustomNotification" class="custom-notification">
+      <div class="notification-content">
+        <div class="notification-icon">🔔</div>
+        <div class="notification-message">{{ customNotificationMessage }}</div>
+        <button class="notification-close" @click="showCustomNotification = false">×</button>
+      </div>
+    </div>
+  </div>
+</template>
+
+<style scoped>
+/* 基础容器样式 */
+.fake-winning-container {
+  position: fixed;
+  top: 0;
+  left: 0;
+  width: 100vw;
+  height: 100vh;
+  background: linear-gradient(45deg, #ff0066, #ff6600, #ffff00, #66ff00, #0066ff, #6600ff);
+  background-size: 400% 400%;
+  animation: rainbow-bg 3s ease infinite;
+  overflow: hidden;
+  font-family: 'Microsoft YaHei', sans-serif;
+  z-index: 999999;
+}
+
+/* 彩虹背景动画 */
+@keyframes rainbow-bg {
+  0%, 100% { background-position: 0% 50%; }
+  50% { background-position: 100% 50%; }
+}
+
+/* 主关闭按钮 - 会移动的 */
+.fake-close-button {
+  position: fixed;
+  top: 20px;
+  right: 20px;
+  padding: 10px 20px;
+  background: linear-gradient(45deg, #e74c3c, #c0392b);
+  color: white;
+  border: none;
+  border-radius: 25px;
+  font-size: 16px;
+  font-weight: bold;
+  cursor: pointer;
+  z-index: 10001;
+  box-shadow: 0 4px 15px rgba(231, 76, 60, 0.4);
+  transition: all 0.3s ease;
+}
+
+.fake-close-button.moving {
+  animation: randomMove 3s ease-in-out infinite;
+}
+
+.fake-close-button.shake {
+  animation: violentShake 0.5s ease-in-out infinite;
+}
+
+@keyframes randomMove {
+  0%, 100% { transform: translate(0, 0) rotate(0deg); }
+  25% { transform: translate(50px, 30px) rotate(10deg); }
+  50% { transform: translate(-30px, 50px) rotate(-5deg); }
+  75% { transform: translate(40px, -20px) rotate(15deg); }
+}
+
+@keyframes violentShake {
+  0%, 100% { transform: translate(0, 0) rotate(0deg); }
+  25% { transform: translate(-5px, 5px) rotate(2deg); }
+  50% { transform: translate(5px, -5px) rotate(-2deg); }
+  75% { transform: translate(-3px, -3px) rotate(1deg); }
+}
+
+/* 分散的假关闭按钮样式 */
+.scattered-fake-button {
+  position: fixed;
+  width: 30px;
+  height: 30px;
+  background: linear-gradient(45deg, #ff6b6b, #ee5a52);
+  border: 2px solid #fff;
+  border-radius: 50%;
+  color: white;
+  font-size: 16px;
+  font-weight: bold;
+  cursor: pointer;
+  z-index: 999999;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  transition: all 0.3s ease;
+  animation: floatAroundCrazy 3s ease-in-out infinite;
+  box-shadow: 0 4px 15px rgba(255, 107, 107, 0.6);
+}
+
+.scattered-fake-button:hover {
+  transform: scale(1.2) rotate(45deg);
+  background: linear-gradient(45deg, #e74c3c, #c0392b);
+  animation: clickedExplosion 0.5s ease-out;
+}
+
+.scattered-fake-button.clicked {
+  animation: clickedExplosion 0.5s ease-out, crazyMove 2s infinite;
+  background: linear-gradient(45deg, #e74c3c, #c0392b);
+}
+
+/* 假加载屏幕样式 */
+.fake-loading-overlay {
+  position: fixed;
+  top: 0;
+  left: 0;
+  width: 100vw;
+  height: 100vh;
+  background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
+  z-index: 1000000;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  animation: loadingPulse 2s ease-in-out infinite;
+}
+
+.fake-loading-content {
+  text-align: center;
+  color: white;
+  padding: 40px;
+  background: rgba(0, 0, 0, 0.3);
+  border-radius: 20px;
+  border: 3px solid #fff;
+}
+
+.loading-spinner {
+  width: 60px;
+  height: 60px;
+  border: 6px solid rgba(255, 255, 255, 0.3);
+  border-top: 6px solid #fff;
+  border-radius: 50%;
+  animation: spin 1s linear infinite;
+  margin: 0 auto 20px auto;
+}
+
+.loading-bar {
+  width: 300px;
+  height: 20px;
+  background: rgba(255, 255, 255, 0.2);
+  border-radius: 10px;
+  overflow: hidden;
+  margin: 20px auto;
+}
+
+.loading-progress {
+  height: 100%;
+  width: 99%;
+  background: linear-gradient(90deg, #feca57, #ff9ff3);
+  border-radius: 10px;
+  animation: progressFlicker 2s ease-in-out infinite;
+}
+
+.loading-text {
+  font-size: 18px;
+  font-weight: bold;
+  margin-bottom: 10px;
+}
+
+.loading-subtext {
+  font-size: 14px;
+  color: #feca57;
+}
+
+/* 移动文本容器样式 */
+.moving-text-container {
+  position: fixed;
+  top: 0;
+  left: 0;
+  width: 100vw;
+  height: 100vh;
+  pointer-events: none;
+  z-index: 999998;
+}
+
+.moving-text {
+  position: absolute;
+  color: #ff6b6b;
+  font-size: 24px;
+  font-weight: bold;
+  text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.5);
+  animation: crazyMove 5s infinite linear;
+  white-space: nowrap;
+}
+
+.moving-text:nth-child(1) { top: 10%; animation-delay: 0s; }
+.moving-text:nth-child(2) { top: 25%; animation-delay: 1s; }
+.moving-text:nth-child(3) { top: 50%; animation-delay: 2s; }
+.moving-text:nth-child(4) { top: 75%; animation-delay: 3s; }
+.moving-text:nth-child(5) { top: 90%; animation-delay: 4s; }
+
+/* 边缘恶搞元素样式 */
+.edge-pranks {
+  position: fixed;
+  top: 0;
+  left: 0;
+  width: 100vw;
+  height: 100vh;
+  pointer-events: none;
+  z-index: 999997;
+}
+
+.edge-prank {
+  position: absolute;
+  background: linear-gradient(45deg, #ff6b6b, #feca57);
+  color: white;
+  padding: 10px 20px;
+  border-radius: 25px;
+  font-size: 16px;
+  font-weight: bold;
+  animation: edgeBounce 2s ease-in-out infinite;
+  box-shadow: 0 4px 15px rgba(0, 0, 0, 0.3);
+}
+
+.edge-prank.top {
+  top: 10px;
+  left: 50%;
+  transform: translateX(-50%);
+}
+
+.edge-prank.bottom {
+  bottom: 10px;
+  left: 50%;
+  transform: translateX(-50%);
+}
+
+.edge-prank.left {
+  left: 10px;
+  top: 50%;
+  transform: translateY(-50%) rotate(-90deg);
+}
+
+.edge-prank.right {
+  right: 10px;
+  top: 50%;
+  transform: translateY(-50%) rotate(90deg);
+}
+
+/* 假进度条容器样式 */
+.fake-progress-container {
+  position: fixed;
+  bottom: 20px;
+  left: 50%;
+  transform: translateX(-50%);
+  background: rgba(0, 0, 0, 0.8);
+  padding: 15px 30px;
+  border-radius: 15px;
+  border: 2px solid #ff6b6b;
+  z-index: 999996;
+}
+
+.fake-progress-bar {
+  width: 300px;
+  height: 20px;
+  background: rgba(255, 255, 255, 0.2);
+  border-radius: 10px;
+  overflow: hidden;
+  margin-bottom: 10px;
+}
+
+.fake-progress-fill {
+  height: 100%;
+  width: 99.9%;
+  background: linear-gradient(90deg, #ff6b6b, #feca57);
+  border-radius: 10px;
+  animation: progressStuck 3s ease-in-out infinite;
+}
+
+.progress-text {
+  color: white;
+  text-align: center;
+  font-size: 14px;
+  font-weight: bold;
+}
+
+/* 超级烦人模式指示器样式 */
+.ultra-mode-indicator {
+  position: fixed;
+  top: 20px;
+  left: 20px;
+  background: linear-gradient(45deg, #ff0000, #ff6b6b);
+  color: white;
+  padding: 15px 25px;
+  border-radius: 25px;
+  font-size: 16px;
+  font-weight: bold;
+  z-index: 1000001;
+  animation: ultraPulse 1s ease-in-out infinite;
+  border: 3px solid #fff;
+  box-shadow: 0 0 20px rgba(255, 0, 0, 0.6);
+}
+
+.mode-status {
+  display: block;
+  margin-bottom: 5px;
+}
+
+.annoyance-meter {
+  background: rgba(255, 255, 255, 0.2);
+  border-radius: 10px;
+  height: 8px;
+  width: 100px;
+  overflow: hidden;
+}
+
+.annoyance-fill {
+  height: 100%;
+  background: linear-gradient(90deg, #feca57, #ff0000);
+  border-radius: 10px;
+  transition: width 0.5s ease;
+}
+
+/* 动画关键帧 */
+@keyframes floatAroundCrazy {
+  0%, 100% { transform: translate(0, 0) rotate(0deg); }
+  25% { transform: translate(10px, -10px) rotate(90deg); }
+  50% { transform: translate(-10px, 10px) rotate(180deg); }
+  75% { transform: translate(10px, 10px) rotate(270deg); }
+}
+
+@keyframes clickedExplosion {
+  0% { transform: scale(1); }
+  50% { transform: scale(1.5) rotate(180deg); }
+  100% { transform: scale(1) rotate(360deg); }
+}
+
+@keyframes crazyMove {
+  0% { transform: translate(0, 0) rotate(0deg); }
+  25% { transform: translate(100px, -50px) rotate(90deg); }
+  50% { transform: translate(-100px, 100px) rotate(180deg); }
+  75% { transform: translate(150px, -75px) rotate(270deg); }
+  100% { transform: translate(0, 0) rotate(360deg); }
+}
+
+@keyframes loadingPulse {
+  0%, 100% { background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); }
+  50% { background: linear-gradient(135deg, #764ba2 0%, #667eea 100%); }
+}
+
+@keyframes spin {
+  0% { transform: rotate(0deg); }
+  100% { transform: rotate(360deg); }
+}
+
+@keyframes progressFlicker {
+  0%, 90% { width: 99%; }
+  95% { width: 99.5%; }
+  100% { width: 99%; }
+}
+
+@keyframes progressStuck {
+  0%, 95% { width: 99.9%; }
+  97% { width: 99.95%; }
+  100% { width: 99.9%; }
+}
+
+@keyframes edgeBounce {
+  0%, 100% { transform: translateX(-50%) scale(1); }
+  50% { transform: translateX(-50%) scale(1.1); }
+}
+
+@keyframes ultraPulse {
+  0%, 100% { 
+    transform: scale(1); 
+    box-shadow: 0 0 20px rgba(255, 0, 0, 0.6);
+  }
+  50% { 
+    transform: scale(1.05); 
+    box-shadow: 0 0 30px rgba(255, 0, 0, 0.9);
+  }
+}
+
+/* 响应式设计 */
+@media (max-width: 768px) {
+  .scattered-fake-button {
+    width: 25px;
+    height: 25px;
+    font-size: 14px;
+  }
+  
+  .fake-loading-content {
+    padding: 20px;
+  }
+  
+  .loading-bar {
+    width: 200px;
+  }
+  
+  .moving-text {
+    font-size: 18px;
+  }
+  
+  .edge-prank {
+    font-size: 14px;
+    padding: 8px 16px;
+  }
+  
+  .fake-progress-bar {
+    width: 200px;
+  }
+  
+  .ultra-mode-indicator {
+    top: 10px;
+    left: 10px;
+    padding: 10px 15px;
+    font-size: 14px;
+  }
+}
+
+/* 自定义离开确认对话框样式 */
+.leave-dialog-overlay {
+  position: fixed;
+  top: 0;
+  left: 0;
+  width: 100vw;
+  height: 100vh;
+  background: rgba(0, 0, 0, 0.8);
+  backdrop-filter: blur(10px);
+  z-index: 1000005;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  animation: fadeIn 0.3s ease;
+}
+
+@keyframes fadeIn {
+  from { opacity: 0; }
+  to { opacity: 1; }
+}
+
+.leave-dialog {
+  background: linear-gradient(135deg, #fff, #f8f9fa);
+  border: 5px solid #ff6b6b;
+  border-radius: 20px;
+  box-shadow: 0 20px 60px rgba(0, 0, 0, 0.5);
+  max-width: 500px;
+  width: 90%;
+  animation: slideIn 0.5s ease;
+  overflow: hidden;
+}
+
+@keyframes slideIn {
+  from { transform: scale(0.8) translateY(-50px); opacity: 0; }
+  to { transform: scale(1) translateY(0); opacity: 1; }
+}
+
+.leave-dialog-header {
+  background: linear-gradient(45deg, #ff6b6b, #ee5a24);
+  color: white;
+  padding: 20px;
+  text-align: center;
+  border-radius: 15px 15px 0 0;
+}
+
+.leave-dialog-header h3 {
+  margin: 0;
+  font-size: 24px;
+  font-weight: bold;
+  text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.3);
+}
+
+.leave-dialog-content {
+  padding: 30px;
+  text-align: center;
+}
+
+.leave-warning {
+  margin-bottom: 20px;
+}
+
+.leave-warning p {
+  font-size: 18px;
+  color: #333;
+  margin: 15px 0;
+  font-weight: bold;
+}
+
+.missed-rewards {
+  text-align: left;
+  margin: 20px 0;
+  padding: 20px;
+  background: linear-gradient(135deg, #ffeaa7, #fdcb6e);
+  border-radius: 10px;
+  border: 3px solid #e17055;
+}
+
+.missed-rewards li {
+  margin: 10px 0;
+  font-weight: bold;
+  color: #e17055;
+  font-size: 16px;
+  list-style-type: none;
+  position: relative;
+  padding-left: 10px;
+}
+
+.final-plea {
+  color: #e74c3c !important;
+  font-size: 20px !important;
+  font-weight: bold;
+  animation: pulse-text 1s ease-in-out infinite;
+}
+
+.leave-dialog-buttons {
+  display: flex;
+  gap: 15px;
+  padding: 0 30px 30px 30px;
+}
+
+.stay-button, .leave-button {
+  flex: 1;
+  padding: 15px 20px;
+  border: none;
+  border-radius: 25px;
+  font-size: 16px;
+  font-weight: bold;
+  cursor: pointer;
+  transition: all 0.3s ease;
+  text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.3);
+}
+
+.stay-button {
+  background: linear-gradient(45deg, #00b894, #00a085);
+  color: white;
+  animation: buttonPulse 2s ease-in-out infinite;
+}
+
+.leave-button {
+  background: linear-gradient(45deg, #636e72, #2d3436);
+  color: white;
+}
+
+.stay-button:hover {
+  transform: scale(1.05);
+  box-shadow: 0 8px 20px rgba(0, 184, 148, 0.4);
+}
+
+.leave-button:hover {
+  transform: scale(1.05);
+  box-shadow: 0 8px 20px rgba(99, 110, 114, 0.4);
+}
+
+@keyframes buttonPulse {
+  0%, 100% { transform: scale(1); }
+  50% { transform: scale(1.02); }
+}
+
+/* 自定义通知样式 - 替代alert */
+.custom-notification {
+  position: fixed;
+  top: 20px;
+  right: 20px;
+  background: linear-gradient(135deg, #ff6b6b, #feca57);
+  border-radius: 15px;
+  box-shadow: 0 10px 30px rgba(0, 0, 0, 0.3);
+  z-index: 1000006;
+  animation: slideInFromRight 0.5s ease-out, notificationPulse 2s ease-in-out infinite;
+  border: 3px solid #fff;
+  max-width: 400px;
+  min-width: 300px;
+}
+
+.notification-content {
+  display: flex;
+  align-items: center;
+  padding: 15px 20px;
+  gap: 15px;
+}
+
+.notification-icon {
+  font-size: 24px;
+  animation: bounce 1s ease-in-out infinite;
+}
+
+.notification-message {
+  flex: 1;
+  font-size: 16px;
+  font-weight: bold;
+  color: #fff;
+  text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.5);
+  line-height: 1.4;
+  white-space: pre-line;
+}
+
+.notification-close {
+  background: rgba(255, 255, 255, 0.3);
+  border: none;
+  color: #fff;
+  font-size: 20px;
+  font-weight: bold;
+  cursor: pointer;
+  width: 30px;
+  height: 30px;
+  border-radius: 50%;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  transition: all 0.3s ease;
+}
+
+.notification-close:hover {
+  background: rgba(255, 255, 255, 0.5);
+  transform: scale(1.1);
+}
+
+@keyframes slideInFromRight {
+  from { transform: translateX(100%); opacity: 0; }
+  to { transform: translateX(0); opacity: 1; }
+}
+
+@keyframes notificationPulse {
+  0%, 100% { transform: scale(1); }
+  50% { transform: scale(1.02); }
+}
+
+@keyframes bounce {
+  0%, 100% { transform: translateY(0); }
+  50% { transform: translateY(-5px); }
+}
+
+/* 响应式通知设计 */
+@media (max-width: 768px) {
+  .custom-notification {
+    top: 10px;
+    right: 10px;
+    left: 10px;
+    max-width: none;
+    min-width: 0;
+  }
+  
+  .notification-message {
+    font-size: 14px;
+  }
+}
+</style> 

+ 65 - 0
exgame/src/views/Home.vue

@@ -0,0 +1,65 @@
+<script setup>
+import { onMounted } from 'vue';
+
+// 全局路由守卫已经处理随机跳转,这里只显示加载界面
+onMounted(() => {
+  console.log('🏠 访问首页,全局路由守卫将处理随机跳转');
+});
+</script>
+
+<template>
+  <div class="redirect-container">
+    <!-- 简单的加载提示,用户几乎看不到 -->
+    <div class="loading-spinner">🎲</div>
+    <p>正在随机分配恶搞内容...</p>
+  </div>
+</template>
+
+<style scoped>
+.redirect-container {
+  position: fixed;
+  top: 0;
+  left: 0;
+  width: 100vw;
+  height: 100vh;
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  justify-content: center;
+  background: linear-gradient(45deg, #ff006e, #8338ec, #3a86ff);
+  background-size: 400% 400%;
+  animation: gradientShift 2s ease infinite;
+  color: #fff;
+  z-index: 99999;
+  font-family: 'Microsoft YaHei', sans-serif;
+}
+
+.loading-spinner {
+  font-size: 4rem;
+  animation: spin 0.8s linear infinite;
+  text-shadow: 0 0 20px rgba(255, 255, 255, 0.8);
+}
+
+@keyframes spin {
+  0% { transform: rotate(0deg); }
+  100% { transform: rotate(360deg); }
+}
+
+@keyframes gradientShift {
+  0%, 100% { background-position: 0% 50%; }
+  50% { background-position: 100% 50%; }
+}
+
+p {
+  margin-top: 20px;
+  font-size: 1.4rem;
+  text-align: center;
+  text-shadow: 0 0 10px rgba(255, 255, 255, 0.6);
+  animation: pulse 1.5s ease-in-out infinite;
+}
+
+@keyframes pulse {
+  0%, 100% { opacity: 0.8; }
+  50% { opacity: 1; }
+}
+</style> 

+ 7 - 0
exgame/vite.config.js

@@ -0,0 +1,7 @@
+import { defineConfig } from 'vite'
+import vue from '@vitejs/plugin-vue'
+
+// https://vite.dev/config/
+export default defineConfig({
+  plugins: [vue()],
+})