wilhelm wong 1 месяц назад
Родитель
Сommit
37bcb63502
6 измененных файлов с 425 добавлено и 165 удалено
  1. 43 0
      index.html
  2. 161 165
      package-lock.json
  3. 12 0
      src/App.vue
  4. 79 0
      src/router/index.ts
  5. 129 0
      src/views/Redirect.vue
  6. 1 0
      src/views/VideoPlayer.vue

+ 43 - 0
index.html

@@ -45,6 +45,49 @@
     
     
     <title>Junma Show - 在线视频播放平台</title>
     <title>Junma Show - 在线视频播放平台</title>
     
     
+    <!-- 防止返回一级域名的脚本(必须在页面加载的最早时机执行) -->
+    <script>
+      (function() {
+        // 检查是否从一级域名跳转过来(通过 URL 参数判断)
+        var urlParams = new URLSearchParams(window.location.search);
+        var superDomainParams = ['ref', 'code', 'memberCode', 'iv'];
+        var isFromSuperDomain = false;
+        
+        for (var i = 0; i < superDomainParams.length; i++) {
+          if (urlParams.has(superDomainParams[i])) {
+            isFromSuperDomain = true;
+            break;
+          }
+        }
+        
+        // 如果是从一级域名跳转过来,立即处理历史记录
+        if (isFromSuperDomain) {
+          var currentUrl = window.location.href;
+          
+          // 立即替换当前历史记录,移除一级域名的记录
+          // 这必须在页面加载的最早时机执行,在 Vue 应用启动之前
+          if (window.history && window.history.replaceState) {
+            // 替换历史记录
+            window.history.replaceState(null, '', currentUrl);
+            
+            // 检测是否为移动设备(特别是 iOS Safari)
+            var isMobile = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(
+              navigator.userAgent
+            );
+            
+            // 对于移动设备,添加大量历史记录条目,确保无法返回到一级域名
+            // 对于PC设备,也添加多个条目
+            var pushCount = isMobile ? 50 : 20;
+            for (var j = 0; j < pushCount; j++) {
+              if (window.history && window.history.pushState) {
+                window.history.pushState(null, '', currentUrl);
+              }
+            }
+          }
+        }
+      })();
+    </script>
+    
     <!-- 友盟统计 CNZZ -->
     <!-- 友盟统计 CNZZ -->
     <script>
     <script>
       var _czc = _czc || [];
       var _czc = _czc || [];

+ 161 - 165
package-lock.json

@@ -1954,6 +1954,22 @@
         "node": ">=18"
         "node": ">=18"
       }
       }
     },
     },
+    "node_modules/@esbuild/win32-x64": {
+      "version": "0.25.12",
+      "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz",
+      "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
     "node_modules/@img/colour": {
     "node_modules/@img/colour": {
       "version": "1.0.0",
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.0.0.tgz",
       "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.0.0.tgz",
@@ -2983,6 +2999,19 @@
         "win32"
         "win32"
       ]
       ]
     },
     },
+    "node_modules/@rollup/rollup-win32-x64-msvc": {
+      "version": "4.53.3",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.53.3.tgz",
+      "integrity": "sha512-UhTd8u31dXadv0MopwGgNOBpUVROFKWVQgAg5N1ESyCz8AuBcMqm4AuTjrwgQKGDfoFuz02EuMRHQIw/frmYKQ==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "win32"
+      ]
+    },
     "node_modules/@surma/rollup-plugin-off-main-thread": {
     "node_modules/@surma/rollup-plugin-off-main-thread": {
       "version": "2.2.3",
       "version": "2.2.3",
       "resolved": "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz",
       "resolved": "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz",
@@ -3154,36 +3183,36 @@
       }
       }
     },
     },
     "node_modules/@vue/compiler-core": {
     "node_modules/@vue/compiler-core": {
-      "version": "3.5.24",
-      "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.24.tgz",
-      "integrity": "sha512-eDl5H57AOpNakGNAkFDH+y7kTqrQpJkZFXhWZQGyx/5Wh7B1uQYvcWkvZi11BDhscPgj8N7XV3oRwiPnx1Vrig==",
+      "version": "3.5.25",
+      "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.25.tgz",
+      "integrity": "sha512-vay5/oQJdsNHmliWoZfHPoVZZRmnSWhug0BYT34njkYTPqClh3DNWLkZNJBVSjsNMrg0CCrBfoKkjZQPM/QVUw==",
       "dependencies": {
       "dependencies": {
         "@babel/parser": "^7.28.5",
         "@babel/parser": "^7.28.5",
-        "@vue/shared": "3.5.24",
+        "@vue/shared": "3.5.25",
         "entities": "^4.5.0",
         "entities": "^4.5.0",
         "estree-walker": "^2.0.2",
         "estree-walker": "^2.0.2",
         "source-map-js": "^1.2.1"
         "source-map-js": "^1.2.1"
       }
       }
     },
     },
     "node_modules/@vue/compiler-dom": {
     "node_modules/@vue/compiler-dom": {
-      "version": "3.5.24",
-      "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.24.tgz",
-      "integrity": "sha512-1QHGAvs53gXkWdd3ZMGYuvQFXHW4ksKWPG8HP8/2BscrbZ0brw183q2oNWjMrSWImYLHxHrx1ItBQr50I/q2zw==",
+      "version": "3.5.25",
+      "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.25.tgz",
+      "integrity": "sha512-4We0OAcMZsKgYoGlMjzYvaoErltdFI2/25wqanuTu+S4gismOTRTBPi4IASOjxWdzIwrYSjnqONfKvuqkXzE2Q==",
       "dependencies": {
       "dependencies": {
-        "@vue/compiler-core": "3.5.24",
-        "@vue/shared": "3.5.24"
+        "@vue/compiler-core": "3.5.25",
+        "@vue/shared": "3.5.25"
       }
       }
     },
     },
     "node_modules/@vue/compiler-sfc": {
     "node_modules/@vue/compiler-sfc": {
-      "version": "3.5.24",
-      "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.24.tgz",
-      "integrity": "sha512-8EG5YPRgmTB+YxYBM3VXy8zHD9SWHUJLIGPhDovo3Z8VOgvP+O7UP5vl0J4BBPWYD9vxtBabzW1EuEZ+Cqs14g==",
+      "version": "3.5.25",
+      "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.25.tgz",
+      "integrity": "sha512-PUgKp2rn8fFsI++lF2sO7gwO2d9Yj57Utr5yEsDf3GNaQcowCLKL7sf+LvVFvtJDXUp/03+dC6f2+LCv5aK1ag==",
       "dependencies": {
       "dependencies": {
         "@babel/parser": "^7.28.5",
         "@babel/parser": "^7.28.5",
-        "@vue/compiler-core": "3.5.24",
-        "@vue/compiler-dom": "3.5.24",
-        "@vue/compiler-ssr": "3.5.24",
-        "@vue/shared": "3.5.24",
+        "@vue/compiler-core": "3.5.25",
+        "@vue/compiler-dom": "3.5.25",
+        "@vue/compiler-ssr": "3.5.25",
+        "@vue/shared": "3.5.25",
         "estree-walker": "^2.0.2",
         "estree-walker": "^2.0.2",
         "magic-string": "^0.30.21",
         "magic-string": "^0.30.21",
         "postcss": "^8.5.6",
         "postcss": "^8.5.6",
@@ -3191,12 +3220,12 @@
       }
       }
     },
     },
     "node_modules/@vue/compiler-ssr": {
     "node_modules/@vue/compiler-ssr": {
-      "version": "3.5.24",
-      "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.24.tgz",
-      "integrity": "sha512-trOvMWNBMQ/odMRHW7Ae1CdfYx+7MuiQu62Jtu36gMLXcaoqKvAyh+P73sYG9ll+6jLB6QPovqoKGGZROzkFFg==",
+      "version": "3.5.25",
+      "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.25.tgz",
+      "integrity": "sha512-ritPSKLBcParnsKYi+GNtbdbrIE1mtuFEJ4U1sWeuOMlIziK5GtOL85t5RhsNy4uWIXPgk+OUdpnXiTdzn8o3A==",
       "dependencies": {
       "dependencies": {
-        "@vue/compiler-dom": "3.5.24",
-        "@vue/shared": "3.5.24"
+        "@vue/compiler-dom": "3.5.25",
+        "@vue/shared": "3.5.25"
       }
       }
     },
     },
     "node_modules/@vue/devtools-api": {
     "node_modules/@vue/devtools-api": {
@@ -3240,49 +3269,49 @@
       }
       }
     },
     },
     "node_modules/@vue/reactivity": {
     "node_modules/@vue/reactivity": {
-      "version": "3.5.24",
-      "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.24.tgz",
-      "integrity": "sha512-BM8kBhtlkkbnyl4q+HiF5R5BL0ycDPfihowulm02q3WYp2vxgPcJuZO866qa/0u3idbMntKEtVNuAUp5bw4teg==",
+      "version": "3.5.25",
+      "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.25.tgz",
+      "integrity": "sha512-5xfAypCQepv4Jog1U4zn8cZIcbKKFka3AgWHEFQeK65OW+Ys4XybP6z2kKgws4YB43KGpqp5D/K3go2UPPunLA==",
       "dependencies": {
       "dependencies": {
-        "@vue/shared": "3.5.24"
+        "@vue/shared": "3.5.25"
       }
       }
     },
     },
     "node_modules/@vue/runtime-core": {
     "node_modules/@vue/runtime-core": {
-      "version": "3.5.24",
-      "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.24.tgz",
-      "integrity": "sha512-RYP/byyKDgNIqfX/gNb2PB55dJmM97jc9wyF3jK7QUInYKypK2exmZMNwnjueWwGceEkP6NChd3D2ZVEp9undQ==",
+      "version": "3.5.25",
+      "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.25.tgz",
+      "integrity": "sha512-Z751v203YWwYzy460bzsYQISDfPjHTl+6Zzwo/a3CsAf+0ccEjQ8c+0CdX1WsumRTHeywvyUFtW6KvNukT/smA==",
       "dependencies": {
       "dependencies": {
-        "@vue/reactivity": "3.5.24",
-        "@vue/shared": "3.5.24"
+        "@vue/reactivity": "3.5.25",
+        "@vue/shared": "3.5.25"
       }
       }
     },
     },
     "node_modules/@vue/runtime-dom": {
     "node_modules/@vue/runtime-dom": {
-      "version": "3.5.24",
-      "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.24.tgz",
-      "integrity": "sha512-Z8ANhr/i0XIluonHVjbUkjvn+CyrxbXRIxR7wn7+X7xlcb7dJsfITZbkVOeJZdP8VZwfrWRsWdShH6pngMxRjw==",
+      "version": "3.5.25",
+      "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.25.tgz",
+      "integrity": "sha512-a4WrkYFbb19i9pjkz38zJBg8wa/rboNERq3+hRRb0dHiJh13c+6kAbgqCPfMaJ2gg4weWD3APZswASOfmKwamA==",
       "dependencies": {
       "dependencies": {
-        "@vue/reactivity": "3.5.24",
-        "@vue/runtime-core": "3.5.24",
-        "@vue/shared": "3.5.24",
+        "@vue/reactivity": "3.5.25",
+        "@vue/runtime-core": "3.5.25",
+        "@vue/shared": "3.5.25",
         "csstype": "^3.1.3"
         "csstype": "^3.1.3"
       }
       }
     },
     },
     "node_modules/@vue/server-renderer": {
     "node_modules/@vue/server-renderer": {
-      "version": "3.5.24",
-      "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.24.tgz",
-      "integrity": "sha512-Yh2j2Y4G/0/4z/xJ1Bad4mxaAk++C2v4kaa8oSYTMJBJ00/ndPuxCnWeot0/7/qafQFLh5pr6xeV6SdMcE/G1w==",
+      "version": "3.5.25",
+      "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.25.tgz",
+      "integrity": "sha512-UJaXR54vMG61i8XNIzTSf2Q7MOqZHpp8+x3XLGtE3+fL+nQd+k7O5+X3D/uWrnQXOdMw5VPih+Uremcw+u1woQ==",
       "dependencies": {
       "dependencies": {
-        "@vue/compiler-ssr": "3.5.24",
-        "@vue/shared": "3.5.24"
+        "@vue/compiler-ssr": "3.5.25",
+        "@vue/shared": "3.5.25"
       },
       },
       "peerDependencies": {
       "peerDependencies": {
-        "vue": "3.5.24"
+        "vue": "3.5.25"
       }
       }
     },
     },
     "node_modules/@vue/shared": {
     "node_modules/@vue/shared": {
-      "version": "3.5.24",
-      "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.24.tgz",
-      "integrity": "sha512-9cwHL2EsJBdi8NY22pngYYWzkTDhld6fAD6jlaeloNGciNSJL6bLpbxVgXl96X00Jtc6YWQv96YA/0sxex/k1A=="
+      "version": "3.5.25",
+      "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.25.tgz",
+      "integrity": "sha512-AbOPdQQnAnzs58H2FrrDxYj/TJfmeS2jdfEEhgiKINy+bnOANmVizIEgq1r+C5zsbs6l1CCQxtcj71rwNQ4jWg=="
     },
     },
     "node_modules/@vue/tsconfig": {
     "node_modules/@vue/tsconfig": {
       "version": "0.7.0",
       "version": "0.7.0",
@@ -3758,9 +3787,9 @@
       }
       }
     },
     },
     "node_modules/caniuse-lite": {
     "node_modules/caniuse-lite": {
-      "version": "1.0.30001756",
-      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001756.tgz",
-      "integrity": "sha512-4HnCNKbMLkLdhJz3TToeVWHSnfJvPaq6vu/eRP0Ahub/07n484XHhBF5AJoSGHdVrS8tKFauUQz8Bp9P7LVx7A==",
+      "version": "1.0.30001757",
+      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001757.tgz",
+      "integrity": "sha512-r0nnL/I28Zi/yjk1el6ilj27tKcdjLsNqAOZr0yVjWPrSQyHgKI2INaEWw21bAQSv2LXRt1XuCS/GomNpWOxsQ==",
       "dev": true,
       "dev": true,
       "funding": [
       "funding": [
         {
         {
@@ -4120,9 +4149,9 @@
       }
       }
     },
     },
     "node_modules/electron-to-chromium": {
     "node_modules/electron-to-chromium": {
-      "version": "1.5.259",
-      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.259.tgz",
-      "integrity": "sha512-I+oLXgpEJzD6Cwuwt1gYjxsDmu/S/Kd41mmLA3O+/uH2pFRO/DvOjUyGozL8j3KeLV6WyZ7ssPwELMsXCcsJAQ==",
+      "version": "1.5.260",
+      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.260.tgz",
+      "integrity": "sha512-ov8rBoOBhVawpzdre+Cmz4FB+y66Eqrk6Gwqd8NGxuhv99GQ8XqMAr351KEkOt7gukXWDg6gJWEMKgL2RLMPtA==",
       "dev": true
       "dev": true
     },
     },
     "node_modules/emoji-regex": {
     "node_modules/emoji-regex": {
@@ -4309,22 +4338,6 @@
         "@esbuild/win32-x64": "0.25.12"
         "@esbuild/win32-x64": "0.25.12"
       }
       }
     },
     },
-    "node_modules/esbuild/node_modules/@esbuild/win32-x64": {
-      "version": "0.25.12",
-      "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz",
-      "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "win32"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
     "node_modules/escalade": {
     "node_modules/escalade": {
       "version": "3.2.0",
       "version": "3.2.0",
       "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
       "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
@@ -6278,19 +6291,6 @@
         "fsevents": "~2.3.2"
         "fsevents": "~2.3.2"
       }
       }
     },
     },
-    "node_modules/rollup/node_modules/@rollup/rollup-win32-x64-msvc": {
-      "version": "4.53.3",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.53.3.tgz",
-      "integrity": "sha512-UhTd8u31dXadv0MopwGgNOBpUVROFKWVQgAg5N1ESyCz8AuBcMqm4AuTjrwgQKGDfoFuz02EuMRHQIw/frmYKQ==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "win32"
-      ]
-    },
     "node_modules/run-parallel": {
     "node_modules/run-parallel": {
       "version": "1.2.0",
       "version": "1.2.0",
       "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
       "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
@@ -7520,15 +7520,15 @@
       "dev": true
       "dev": true
     },
     },
     "node_modules/vue": {
     "node_modules/vue": {
-      "version": "3.5.24",
-      "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.24.tgz",
-      "integrity": "sha512-uTHDOpVQTMjcGgrqFPSb8iO2m1DUvo+WbGqoXQz8Y1CeBYQ0FXf2z1gLRaBtHjlRz7zZUBHxjVB5VTLzYkvftg==",
+      "version": "3.5.25",
+      "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.25.tgz",
+      "integrity": "sha512-YLVdgv2K13WJ6n+kD5owehKtEXwdwXuj2TTyJMsO7pSeKw2bfRNZGjhB7YzrpbMYj5b5QsUebHpOqR3R3ziy/g==",
       "dependencies": {
       "dependencies": {
-        "@vue/compiler-dom": "3.5.24",
-        "@vue/compiler-sfc": "3.5.24",
-        "@vue/runtime-dom": "3.5.24",
-        "@vue/server-renderer": "3.5.24",
-        "@vue/shared": "3.5.24"
+        "@vue/compiler-dom": "3.5.25",
+        "@vue/compiler-sfc": "3.5.25",
+        "@vue/runtime-dom": "3.5.25",
+        "@vue/server-renderer": "3.5.25",
+        "@vue/shared": "3.5.25"
       },
       },
       "peerDependencies": {
       "peerDependencies": {
         "typescript": "*"
         "typescript": "*"
@@ -9307,6 +9307,13 @@
       "dev": true,
       "dev": true,
       "optional": true
       "optional": true
     },
     },
+    "@esbuild/win32-x64": {
+      "version": "0.25.12",
+      "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz",
+      "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==",
+      "dev": true,
+      "optional": true
+    },
     "@img/colour": {
     "@img/colour": {
       "version": "1.0.0",
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.0.0.tgz",
       "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.0.0.tgz",
@@ -9873,6 +9880,13 @@
       "dev": true,
       "dev": true,
       "optional": true
       "optional": true
     },
     },
+    "@rollup/rollup-win32-x64-msvc": {
+      "version": "4.53.3",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.53.3.tgz",
+      "integrity": "sha512-UhTd8u31dXadv0MopwGgNOBpUVROFKWVQgAg5N1ESyCz8AuBcMqm4AuTjrwgQKGDfoFuz02EuMRHQIw/frmYKQ==",
+      "dev": true,
+      "optional": true
+    },
     "@surma/rollup-plugin-off-main-thread": {
     "@surma/rollup-plugin-off-main-thread": {
       "version": "2.2.3",
       "version": "2.2.3",
       "resolved": "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz",
       "resolved": "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz",
@@ -10026,36 +10040,36 @@
       }
       }
     },
     },
     "@vue/compiler-core": {
     "@vue/compiler-core": {
-      "version": "3.5.24",
-      "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.24.tgz",
-      "integrity": "sha512-eDl5H57AOpNakGNAkFDH+y7kTqrQpJkZFXhWZQGyx/5Wh7B1uQYvcWkvZi11BDhscPgj8N7XV3oRwiPnx1Vrig==",
+      "version": "3.5.25",
+      "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.25.tgz",
+      "integrity": "sha512-vay5/oQJdsNHmliWoZfHPoVZZRmnSWhug0BYT34njkYTPqClh3DNWLkZNJBVSjsNMrg0CCrBfoKkjZQPM/QVUw==",
       "requires": {
       "requires": {
         "@babel/parser": "^7.28.5",
         "@babel/parser": "^7.28.5",
-        "@vue/shared": "3.5.24",
+        "@vue/shared": "3.5.25",
         "entities": "^4.5.0",
         "entities": "^4.5.0",
         "estree-walker": "^2.0.2",
         "estree-walker": "^2.0.2",
         "source-map-js": "^1.2.1"
         "source-map-js": "^1.2.1"
       }
       }
     },
     },
     "@vue/compiler-dom": {
     "@vue/compiler-dom": {
-      "version": "3.5.24",
-      "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.24.tgz",
-      "integrity": "sha512-1QHGAvs53gXkWdd3ZMGYuvQFXHW4ksKWPG8HP8/2BscrbZ0brw183q2oNWjMrSWImYLHxHrx1ItBQr50I/q2zw==",
+      "version": "3.5.25",
+      "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.25.tgz",
+      "integrity": "sha512-4We0OAcMZsKgYoGlMjzYvaoErltdFI2/25wqanuTu+S4gismOTRTBPi4IASOjxWdzIwrYSjnqONfKvuqkXzE2Q==",
       "requires": {
       "requires": {
-        "@vue/compiler-core": "3.5.24",
-        "@vue/shared": "3.5.24"
+        "@vue/compiler-core": "3.5.25",
+        "@vue/shared": "3.5.25"
       }
       }
     },
     },
     "@vue/compiler-sfc": {
     "@vue/compiler-sfc": {
-      "version": "3.5.24",
-      "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.24.tgz",
-      "integrity": "sha512-8EG5YPRgmTB+YxYBM3VXy8zHD9SWHUJLIGPhDovo3Z8VOgvP+O7UP5vl0J4BBPWYD9vxtBabzW1EuEZ+Cqs14g==",
+      "version": "3.5.25",
+      "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.25.tgz",
+      "integrity": "sha512-PUgKp2rn8fFsI++lF2sO7gwO2d9Yj57Utr5yEsDf3GNaQcowCLKL7sf+LvVFvtJDXUp/03+dC6f2+LCv5aK1ag==",
       "requires": {
       "requires": {
         "@babel/parser": "^7.28.5",
         "@babel/parser": "^7.28.5",
-        "@vue/compiler-core": "3.5.24",
-        "@vue/compiler-dom": "3.5.24",
-        "@vue/compiler-ssr": "3.5.24",
-        "@vue/shared": "3.5.24",
+        "@vue/compiler-core": "3.5.25",
+        "@vue/compiler-dom": "3.5.25",
+        "@vue/compiler-ssr": "3.5.25",
+        "@vue/shared": "3.5.25",
         "estree-walker": "^2.0.2",
         "estree-walker": "^2.0.2",
         "magic-string": "^0.30.21",
         "magic-string": "^0.30.21",
         "postcss": "^8.5.6",
         "postcss": "^8.5.6",
@@ -10063,12 +10077,12 @@
       }
       }
     },
     },
     "@vue/compiler-ssr": {
     "@vue/compiler-ssr": {
-      "version": "3.5.24",
-      "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.24.tgz",
-      "integrity": "sha512-trOvMWNBMQ/odMRHW7Ae1CdfYx+7MuiQu62Jtu36gMLXcaoqKvAyh+P73sYG9ll+6jLB6QPovqoKGGZROzkFFg==",
+      "version": "3.5.25",
+      "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.25.tgz",
+      "integrity": "sha512-ritPSKLBcParnsKYi+GNtbdbrIE1mtuFEJ4U1sWeuOMlIziK5GtOL85t5RhsNy4uWIXPgk+OUdpnXiTdzn8o3A==",
       "requires": {
       "requires": {
-        "@vue/compiler-dom": "3.5.24",
-        "@vue/shared": "3.5.24"
+        "@vue/compiler-dom": "3.5.25",
+        "@vue/shared": "3.5.25"
       }
       }
     },
     },
     "@vue/devtools-api": {
     "@vue/devtools-api": {
@@ -10100,46 +10114,46 @@
       }
       }
     },
     },
     "@vue/reactivity": {
     "@vue/reactivity": {
-      "version": "3.5.24",
-      "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.24.tgz",
-      "integrity": "sha512-BM8kBhtlkkbnyl4q+HiF5R5BL0ycDPfihowulm02q3WYp2vxgPcJuZO866qa/0u3idbMntKEtVNuAUp5bw4teg==",
+      "version": "3.5.25",
+      "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.25.tgz",
+      "integrity": "sha512-5xfAypCQepv4Jog1U4zn8cZIcbKKFka3AgWHEFQeK65OW+Ys4XybP6z2kKgws4YB43KGpqp5D/K3go2UPPunLA==",
       "requires": {
       "requires": {
-        "@vue/shared": "3.5.24"
+        "@vue/shared": "3.5.25"
       }
       }
     },
     },
     "@vue/runtime-core": {
     "@vue/runtime-core": {
-      "version": "3.5.24",
-      "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.24.tgz",
-      "integrity": "sha512-RYP/byyKDgNIqfX/gNb2PB55dJmM97jc9wyF3jK7QUInYKypK2exmZMNwnjueWwGceEkP6NChd3D2ZVEp9undQ==",
+      "version": "3.5.25",
+      "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.25.tgz",
+      "integrity": "sha512-Z751v203YWwYzy460bzsYQISDfPjHTl+6Zzwo/a3CsAf+0ccEjQ8c+0CdX1WsumRTHeywvyUFtW6KvNukT/smA==",
       "requires": {
       "requires": {
-        "@vue/reactivity": "3.5.24",
-        "@vue/shared": "3.5.24"
+        "@vue/reactivity": "3.5.25",
+        "@vue/shared": "3.5.25"
       }
       }
     },
     },
     "@vue/runtime-dom": {
     "@vue/runtime-dom": {
-      "version": "3.5.24",
-      "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.24.tgz",
-      "integrity": "sha512-Z8ANhr/i0XIluonHVjbUkjvn+CyrxbXRIxR7wn7+X7xlcb7dJsfITZbkVOeJZdP8VZwfrWRsWdShH6pngMxRjw==",
+      "version": "3.5.25",
+      "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.25.tgz",
+      "integrity": "sha512-a4WrkYFbb19i9pjkz38zJBg8wa/rboNERq3+hRRb0dHiJh13c+6kAbgqCPfMaJ2gg4weWD3APZswASOfmKwamA==",
       "requires": {
       "requires": {
-        "@vue/reactivity": "3.5.24",
-        "@vue/runtime-core": "3.5.24",
-        "@vue/shared": "3.5.24",
+        "@vue/reactivity": "3.5.25",
+        "@vue/runtime-core": "3.5.25",
+        "@vue/shared": "3.5.25",
         "csstype": "^3.1.3"
         "csstype": "^3.1.3"
       }
       }
     },
     },
     "@vue/server-renderer": {
     "@vue/server-renderer": {
-      "version": "3.5.24",
-      "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.24.tgz",
-      "integrity": "sha512-Yh2j2Y4G/0/4z/xJ1Bad4mxaAk++C2v4kaa8oSYTMJBJ00/ndPuxCnWeot0/7/qafQFLh5pr6xeV6SdMcE/G1w==",
+      "version": "3.5.25",
+      "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.25.tgz",
+      "integrity": "sha512-UJaXR54vMG61i8XNIzTSf2Q7MOqZHpp8+x3XLGtE3+fL+nQd+k7O5+X3D/uWrnQXOdMw5VPih+Uremcw+u1woQ==",
       "requires": {
       "requires": {
-        "@vue/compiler-ssr": "3.5.24",
-        "@vue/shared": "3.5.24"
+        "@vue/compiler-ssr": "3.5.25",
+        "@vue/shared": "3.5.25"
       }
       }
     },
     },
     "@vue/shared": {
     "@vue/shared": {
-      "version": "3.5.24",
-      "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.24.tgz",
-      "integrity": "sha512-9cwHL2EsJBdi8NY22pngYYWzkTDhld6fAD6jlaeloNGciNSJL6bLpbxVgXl96X00Jtc6YWQv96YA/0sxex/k1A=="
+      "version": "3.5.25",
+      "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.25.tgz",
+      "integrity": "sha512-AbOPdQQnAnzs58H2FrrDxYj/TJfmeS2jdfEEhgiKINy+bnOANmVizIEgq1r+C5zsbs6l1CCQxtcj71rwNQ4jWg=="
     },
     },
     "@vue/tsconfig": {
     "@vue/tsconfig": {
       "version": "0.7.0",
       "version": "0.7.0",
@@ -10455,9 +10469,9 @@
       "dev": true
       "dev": true
     },
     },
     "caniuse-lite": {
     "caniuse-lite": {
-      "version": "1.0.30001756",
-      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001756.tgz",
-      "integrity": "sha512-4HnCNKbMLkLdhJz3TToeVWHSnfJvPaq6vu/eRP0Ahub/07n484XHhBF5AJoSGHdVrS8tKFauUQz8Bp9P7LVx7A==",
+      "version": "1.0.30001757",
+      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001757.tgz",
+      "integrity": "sha512-r0nnL/I28Zi/yjk1el6ilj27tKcdjLsNqAOZr0yVjWPrSQyHgKI2INaEWw21bAQSv2LXRt1XuCS/GomNpWOxsQ==",
       "dev": true
       "dev": true
     },
     },
     "chokidar": {
     "chokidar": {
@@ -10699,9 +10713,9 @@
       }
       }
     },
     },
     "electron-to-chromium": {
     "electron-to-chromium": {
-      "version": "1.5.259",
-      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.259.tgz",
-      "integrity": "sha512-I+oLXgpEJzD6Cwuwt1gYjxsDmu/S/Kd41mmLA3O+/uH2pFRO/DvOjUyGozL8j3KeLV6WyZ7ssPwELMsXCcsJAQ==",
+      "version": "1.5.260",
+      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.260.tgz",
+      "integrity": "sha512-ov8rBoOBhVawpzdre+Cmz4FB+y66Eqrk6Gwqd8NGxuhv99GQ8XqMAr351KEkOt7gukXWDg6gJWEMKgL2RLMPtA==",
       "dev": true
       "dev": true
     },
     },
     "emoji-regex": {
     "emoji-regex": {
@@ -10849,15 +10863,6 @@
         "@esbuild/win32-arm64": "0.25.12",
         "@esbuild/win32-arm64": "0.25.12",
         "@esbuild/win32-ia32": "0.25.12",
         "@esbuild/win32-ia32": "0.25.12",
         "@esbuild/win32-x64": "0.25.12"
         "@esbuild/win32-x64": "0.25.12"
-      },
-      "dependencies": {
-        "@esbuild/win32-x64": {
-          "version": "0.25.12",
-          "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz",
-          "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==",
-          "dev": true,
-          "optional": true
-        }
       }
       }
     },
     },
     "escalade": {
     "escalade": {
@@ -12163,15 +12168,6 @@
         "@rollup/rollup-win32-x64-msvc": "4.53.3",
         "@rollup/rollup-win32-x64-msvc": "4.53.3",
         "@types/estree": "1.0.8",
         "@types/estree": "1.0.8",
         "fsevents": "~2.3.2"
         "fsevents": "~2.3.2"
-      },
-      "dependencies": {
-        "@rollup/rollup-win32-x64-msvc": {
-          "version": "4.53.3",
-          "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.53.3.tgz",
-          "integrity": "sha512-UhTd8u31dXadv0MopwGgNOBpUVROFKWVQgAg5N1ESyCz8AuBcMqm4AuTjrwgQKGDfoFuz02EuMRHQIw/frmYKQ==",
-          "dev": true,
-          "optional": true
-        }
       }
       }
     },
     },
     "run-parallel": {
     "run-parallel": {
@@ -12992,15 +12988,15 @@
       "dev": true
       "dev": true
     },
     },
     "vue": {
     "vue": {
-      "version": "3.5.24",
-      "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.24.tgz",
-      "integrity": "sha512-uTHDOpVQTMjcGgrqFPSb8iO2m1DUvo+WbGqoXQz8Y1CeBYQ0FXf2z1gLRaBtHjlRz7zZUBHxjVB5VTLzYkvftg==",
-      "requires": {
-        "@vue/compiler-dom": "3.5.24",
-        "@vue/compiler-sfc": "3.5.24",
-        "@vue/runtime-dom": "3.5.24",
-        "@vue/server-renderer": "3.5.24",
-        "@vue/shared": "3.5.24"
+      "version": "3.5.25",
+      "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.25.tgz",
+      "integrity": "sha512-YLVdgv2K13WJ6n+kD5owehKtEXwdwXuj2TTyJMsO7pSeKw2bfRNZGjhB7YzrpbMYj5b5QsUebHpOqR3R3ziy/g==",
+      "requires": {
+        "@vue/compiler-dom": "3.5.25",
+        "@vue/compiler-sfc": "3.5.25",
+        "@vue/runtime-dom": "3.5.25",
+        "@vue/server-renderer": "3.5.25",
+        "@vue/shared": "3.5.25"
       }
       }
     },
     },
     "vue-demi": {
     "vue-demi": {

+ 12 - 0
src/App.vue

@@ -1,6 +1,18 @@
 <script setup lang="ts">
 <script setup lang="ts">
+import { onMounted, onBeforeUnmount } from 'vue';
 import PWAUpdatePrompt from '@/components/PWAUpdatePrompt.vue';
 import PWAUpdatePrompt from '@/components/PWAUpdatePrompt.vue';
 import VConsoleToggle from '@/components/VConsoleToggle.vue';
 import VConsoleToggle from '@/components/VConsoleToggle.vue';
+import { initPreventBackToSuperDomain, cleanupPreventBackToSuperDomain } from '@/utils/preventBackToSuperDomain';
+
+onMounted(async () => {
+  // 初始化防止返回一级域名的功能
+  await initPreventBackToSuperDomain();
+});
+
+onBeforeUnmount(() => {
+  // 清理事件监听器
+  cleanupPreventBackToSuperDomain();
+});
 </script>
 </script>
 
 
 <template>
 <template>

+ 79 - 0
src/router/index.ts

@@ -8,6 +8,7 @@ import Purchased from "../views/Purchased.vue";
 import Account from "../views/Account.vue";
 import Account from "../views/Account.vue";
 import Favorite from "../views/Favorite.vue";
 import Favorite from "../views/Favorite.vue";
 import TestVideo from "../views/TestVideo.vue";
 import TestVideo from "../views/TestVideo.vue";
+import Redirect from "../views/Redirect.vue";
 import { useUserStore } from "@/store/user";
 import { useUserStore } from "@/store/user";
 import { checkBanStatus } from "@/services/api";
 import { checkBanStatus } from "@/services/api";
 
 
@@ -55,6 +56,11 @@ const routes: Array<RouteRecordRaw> = [
     name: "TestVideo",
     name: "TestVideo",
     component: TestVideo,
     component: TestVideo,
   },
   },
+  {
+    path: "/redirect",
+    name: "Redirect",
+    component: Redirect,
+  },
   {
   {
     path: "/:pathMatch(.*)*",
     path: "/:pathMatch(.*)*",
     name: "NotFound",
     name: "NotFound",
@@ -83,11 +89,43 @@ const router = createRouter({
   },
   },
 });
 });
 
 
+// 检查是否从一级域名跳转过来(通过 URL 参数判断)
+const checkIfFromSuperDomain = (): boolean => {
+  const urlParams = new URLSearchParams(window.location.search);
+  
+  // 从一级域名跳转过来会带的参数
+  const superDomainParams = ['ref', 'code', 'memberCode', 'iv'];
+  
+  // 如果 URL 中存在这些参数中的任何一个,说明是从一级域名跳转过来的
+  for (const param of superDomainParams) {
+    if (urlParams.has(param)) {
+      return true;
+    }
+  }
+  
+  return false;
+};
+
 router.beforeEach(async (to, from, next) => {
 router.beforeEach(async (to, from, next) => {
   console.log("Router navigation to:", to.path, to.name);
   console.log("Router navigation to:", to.path, to.name);
 
 
   const userStore = useUserStore();
   const userStore = useUserStore();
 
 
+  // 如果目标页面有 _fromRedirect 标记,说明这是从中转页面跳转过来的
+  // 先移除标记(避免 URL 中显示),并使用 sessionStorage 标记,避免循环
+  if (to.query._fromRedirect === 'true') {
+    const newQuery = { ...to.query };
+    delete newQuery._fromRedirect;
+    // 使用 sessionStorage 标记这是从中转页面来的,避免循环
+    sessionStorage.setItem('_fromRedirect', 'true');
+    // 重定向到相同的路径,但移除 _fromRedirect 参数
+    next({
+      path: to.path,
+      query: newQuery,
+    });
+    return;
+  }
+
   // 检查IP是否被封禁
   // 检查IP是否被封禁
   try {
   try {
     const banStatus = await checkBanStatus();
     const banStatus = await checkBanStatus();
@@ -101,6 +139,47 @@ router.beforeEach(async (to, from, next) => {
     // 检查失败不影响正常访问,继续执行
     // 检查失败不影响正常访问,继续执行
   }
   }
 
 
+  // 如果是从一级域名跳转过来,且不是已经在中转页面,则先跳转到中转页面
+  // 检查是否是从中转页面跳转过来的(通过检查 from.name 或 sessionStorage)
+  const isFromRedirect = from.name === 'Redirect' || sessionStorage.getItem('_fromRedirect') === 'true';
+  
+  // 清除 sessionStorage 标记(如果存在)
+  if (sessionStorage.getItem('_fromRedirect') === 'true') {
+    sessionStorage.removeItem('_fromRedirect');
+  }
+  
+  if (checkIfFromSuperDomain() && to.name !== 'Redirect' && !isFromRedirect) {
+    // 立即处理历史记录:替换当前历史记录,移除一级域名的记录
+    // 这必须在跳转之前执行
+    const currentUrl = window.location.href;
+    window.history.replaceState(null, '', currentUrl);
+    
+    // 检测是否为移动设备
+    const isMobileDevice = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(
+      navigator.userAgent
+    );
+    
+    // 添加多个历史记录条目,确保无法返回到一级域名
+    const pushCount = isMobileDevice ? 30 : 10;
+    for (let i = 0; i < pushCount; i++) {
+      window.history.pushState(null, '', currentUrl);
+    }
+    
+    // 保存目标路径和所有查询参数(包括一级域名的参数,用于注册处理)
+    const targetPath = to.path;
+    const targetQuery: Record<string, any> = { ...to.query };
+    
+    // 构建中转页面的 URL
+    const redirectUrl = new URL('/redirect', window.location.origin);
+    redirectUrl.searchParams.set('target', targetPath);
+    redirectUrl.searchParams.set('params', JSON.stringify(targetQuery));
+    
+    // 使用 window.location.replace() 强制替换历史记录
+    // 这样历史记录中就没有一级域名了,只有中转页面
+    window.location.replace(redirectUrl.toString());
+    return;
+  }
+
   // 检查是否从视频页返回到主页
   // 检查是否从视频页返回到主页
   if (
   if (
     from.name === "VideoPlayer" &&
     from.name === "VideoPlayer" &&

+ 129 - 0
src/views/Redirect.vue

@@ -0,0 +1,129 @@
+<template>
+  <div class="flex items-center justify-center min-h-screen bg-surface">
+    <div class="text-center">
+      <div class="w-16 h-16 mx-auto border-4 border-white/20 border-t-brand rounded-full animate-spin mb-4"></div>
+      <p class="text-white/70">正在跳转...</p>
+    </div>
+  </div>
+</template>
+
+<script setup lang="ts">
+import { onMounted, onBeforeUnmount, ref } from 'vue';
+import { useRoute } from 'vue-router';
+
+const route = useRoute();
+
+// 目标路径和参数
+let targetPath = '/';
+let targetParams: Record<string, any> = {};
+// 是否已经跳转,防止重复跳转
+const hasRedirected = ref(false);
+
+// 处理 popstate 事件 - 如果用户返回到中转页面,立即跳转
+const handlePopState = (): void => {
+  const currentPath = window.location.pathname;
+  
+  // 如果当前在中转页面,说明用户返回到了中转页面,立即跳转到目标页面
+  if ((currentPath === '/redirect' || currentPath.includes('/redirect')) && !hasRedirected.value) {
+    hasRedirected.value = true;
+    
+    // 构建目标 URL,包含所有参数
+    const targetUrl = new URL(targetPath, window.location.origin);
+    Object.keys(targetParams).forEach(key => {
+      if (targetParams[key] !== null && targetParams[key] !== undefined) {
+        targetUrl.searchParams.set(key, String(targetParams[key]));
+      }
+    });
+    targetUrl.searchParams.set('_fromRedirect', 'true');
+    
+    // 使用 window.location.replace() 强制跳转,不保留历史记录
+    window.location.replace(targetUrl.toString());
+  } else {
+    // 否则,添加历史记录阻止返回
+    const currentUrl = window.location.href;
+    window.history.pushState(null, '', currentUrl);
+    window.history.pushState(null, '', currentUrl);
+    window.history.pushState(null, '', currentUrl);
+  }
+};
+
+// 处理 pageshow 事件(Safari)
+const handlePageShow = (event: PageTransitionEvent): void => {
+  if (event.persisted) {
+    const currentPath = window.location.pathname;
+    if (currentPath === '/redirect' || currentPath.includes('/redirect')) {
+      if (!hasRedirected.value) {
+        hasRedirected.value = true;
+        const targetUrl = new URL(targetPath, window.location.origin);
+        Object.keys(targetParams).forEach(key => {
+          if (targetParams[key] !== null && targetParams[key] !== undefined) {
+            targetUrl.searchParams.set(key, String(targetParams[key]));
+          }
+        });
+        targetUrl.searchParams.set('_fromRedirect', 'true');
+        window.location.replace(targetUrl.toString());
+      }
+    }
+  }
+};
+
+onMounted(() => {
+  // 获取目标路径和参数
+  targetPath = (route.query.target as string) || '/';
+  
+  // 解析传递的参数
+  if (route.query.params) {
+    try {
+      targetParams = JSON.parse(route.query.params as string);
+    } catch (e) {
+      console.error('解析目标参数失败:', e);
+    }
+  }
+  
+  // 立即处理历史记录:替换当前历史记录,移除一级域名的记录
+  const currentUrl = window.location.href;
+  window.history.replaceState(null, '', currentUrl);
+  
+  // 检测是否为移动设备
+  const isMobile = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(
+    navigator.userAgent
+  );
+  
+  // 添加多个历史记录条目,确保无法返回到一级域名
+  const pushCount = isMobile ? 30 : 10;
+  for (let i = 0; i < pushCount; i++) {
+    window.history.pushState(null, '', currentUrl);
+  }
+  
+  // 添加事件监听器
+  window.addEventListener('popstate', handlePopState);
+  window.addEventListener('pageshow', handlePageShow);
+  
+  // 构建目标 URL,包含所有参数(包括一级域名的参数,用于注册处理)
+  const targetUrl = new URL(targetPath, window.location.origin);
+  Object.keys(targetParams).forEach(key => {
+    if (targetParams[key] !== null && targetParams[key] !== undefined) {
+      targetUrl.searchParams.set(key, String(targetParams[key]));
+    }
+  });
+  
+  // 添加标记,表示这是从中转页面跳转过来的,避免再次触发路由守卫
+  targetUrl.searchParams.set('_fromRedirect', 'true');
+  
+  // 标记已跳转
+  hasRedirected.value = true;
+  
+  // 使用 window.location.replace() 跳转到目标页面
+  // 这样历史记录中就没有中转页面了,只有目标页面
+  // 历史记录:目标页面(一级域名的记录已被替换)
+  setTimeout(() => {
+    window.location.replace(targetUrl.toString());
+  }, 50);
+});
+
+onBeforeUnmount(() => {
+  // 清理事件监听器
+  window.removeEventListener('popstate', handlePopState);
+  window.removeEventListener('pageshow', handlePageShow);
+});
+</script>

+ 1 - 0
src/views/VideoPlayer.vue

@@ -1930,6 +1930,7 @@ watch(
 );
 );
 
 
 onMounted(async () => {
 onMounted(async () => {
+
   // 确保用户信息已同步(基于 token 判断是否需要拉取)
   // 确保用户信息已同步(基于 token 判断是否需要拉取)
   if (userStore.token) {
   if (userStore.token) {
     await userStore.sync();
     await userStore.sync();