From 543735d5141ce80b5f48c1a0d777fc29b0b34c86 Mon Sep 17 00:00:00 2001
From: 李 <344137771@qq.com>
Date: Wed, 03 Jun 2026 18:27:50 +0800
Subject: [PATCH] 1

---
 src/views/quotes/Market.vue        |   52 +++++---
 /dev/null                          |   88 --------------
 src/views/home/index.vue           |   51 ++++++--
 src/views/trade/Options.vue        |   84 ++++++++++---
 src/main.js                        |   32 +---
 index.html                         |    2 
 src/config/index.js                |    6 
 package.json                       |    8 
 src/assets/image/login_logo.png    |    0 
 favicon.ico                        |    0 
 vite.config.js                     |    4 
 src/components/fx-footer/index.vue |    4 
 12 files changed, 151 insertions(+), 180 deletions(-)

diff --git a/favicon.ico b/favicon.ico
index a8f1eaf..55434b3 100644
--- a/favicon.ico
+++ b/favicon.ico
Binary files differ
diff --git a/index.html b/index.html
index c0cd44f..0a894f6 100644
--- a/index.html
+++ b/index.html
@@ -12,7 +12,7 @@
   <meta name="theme-color" content="#131A2E">
   <meta name="apple-mobile-web-app-status-bar-style" content="#131A2E" />
   <link rel="apple-touch-icon" href="./favicon.ico">
-  <title>Crypto</title>
+  <title>Bitget</title>
 </head>
 
 <body>
diff --git a/package.json b/package.json
index bb1c13f..a462cb2 100644
--- a/package.json
+++ b/package.json
@@ -6,10 +6,10 @@
   "scripts": {
     "lint": "eslint --ext .vue,.js ./",
     "lint:fix": "eslint --fix --ext .vue,.js ./",
-    "dev": "vite",
-    "build": "vite build",
-    "build:visualizer": "NODE_ENV=production VISUALIZER=show vite build && node ./fixDistPath.js",
-    "preview": "vite preview"
+    "dev": "node ./node_modules/vite/bin/vite.js",
+    "build": "node ./node_modules/vite/bin/vite.js build",
+    "build:visualizer": "set NODE_ENV=production&& set VISUALIZER=show&& node ./node_modules/vite/bin/vite.js build && node ./fixDistPath.js",
+    "preview": "node ./node_modules/vite/bin/vite.js preview"
   },
   "dependencies": {
     "@vueuse/components": "9.4.0",
diff --git a/src/assets/image/login_logo.png b/src/assets/image/login_logo.png
index bba5286..55434b3 100644
--- a/src/assets/image/login_logo.png
+++ b/src/assets/image/login_logo.png
Binary files differ
diff --git a/src/components/fx-footer/index.vue b/src/components/fx-footer/index.vue
index 62ffc9a..a383518 100644
--- a/src/components/fx-footer/index.vue
+++ b/src/components/fx-footer/index.vue
@@ -19,11 +19,11 @@
         </template>
       </van-tabbar-item>
 
-      <!-- <van-tabbar-item name="fund" to="/cryptos/fund">
+      <van-tabbar-item name="fund" to="/cryptos/fund">
         <template #icon>
           <img :src="active == 'fund' ? icon.fund.active : icon.fund.inactive" alt="fund" />
         </template>
-      </van-tabbar-item> -->
+      </van-tabbar-item>
 
       <van-tabbar-item name="personal" to="/personal">
         <template #icon>
diff --git a/src/config/index.js b/src/config/index.js
index 79cf32b..f1743ce 100644
--- a/src/config/index.js
+++ b/src/config/index.js
@@ -43,12 +43,12 @@
 
 // const ENV_DEV = '127.0.0.1' // dev
 // const ENV_DEV = '192.168.10.11:8848' // dev
-const ENV_DEV = 'api.dpcex.com' // dev
+const ENV_DEV = 'zhapi.bitget-jp-us.cyou' // dev
 
 // const ENV_PRO = window.location.hostname // 接口域名跟随 H5
 // const ENV_PRO = "127.0.0.1"
 // const ENV_PRO = "192.168.10.11:8848"
-const ENV_PRO = "api.dpcex.com"
+const ENV_PRO = "zhapi.bitget-jp-us.cyou"
 // 避免打包出错务必把 app域名的注释要放在在本地ENV_PRO的下面
 // const ENV_PRO = 'foilwm.com' //  app域名
 
@@ -66,7 +66,7 @@
 }
 export const BASE_URL = base_url
 export const WS_URL = ws_url
-export const IMG_PATH = 'https://img.dpcex.com'
+export const IMG_PATH = 'https://zhimg.bitget-jp-us.cyou'
 export const HOST_URL = host_url
 
 export default {
diff --git a/src/main.js b/src/main.js
index 4d3dbba..5eee785 100644
--- a/src/main.js
+++ b/src/main.js
@@ -14,26 +14,14 @@
 import piniaPluginPersistedstate from 'pinia-plugin-persistedstate'
 pinia.use(piniaPluginPersistedstate)
 
-// 生产环境且为 PC 端时跳转到 PC 站
-const PC_SITE_URL = 'https://pc.dpcex.com'
-function isPc() {
-  if (typeof navigator === 'undefined') return false
-  const ua = navigator.userAgent || ''
-  const mobile = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini|Mobile|mobile/i.test(ua)
-  return !mobile
-}
-if (import.meta.env.PROD && isPc()) {
-  window.location.href = PC_SITE_URL
-} else {
-  const app = createApp(App)
-  const title = import.meta.env.VITE_APP__TITLE
-  app.config.globalProperties.$title = title
-  document.title = title
-  app.use(fxHeader)
-  app.use(i18n)
-  app.use(router)
-  app.use(pinia)
-  app.use(store)
+const app = createApp(App)
+const title = import.meta.env.VITE_APP__TITLE
+app.config.globalProperties.$title = title
+document.title = title
+app.use(fxHeader)
+app.use(i18n)
+app.use(router)
+app.use(pinia)
+app.use(store)
 
-  app.mount('#app')
-}
\ No newline at end of file
+app.mount('#app')
\ No newline at end of file
diff --git a/src/views/home/index.vue b/src/views/home/index.vue
index 434d035..6f46501 100644
--- a/src/views/home/index.vue
+++ b/src/views/home/index.vue
@@ -4,7 +4,7 @@
         <div class="header">
             <div class="header-left">
                 <img src="@/assets/image/login_logo.png" alt="Wealthinfra" class="logo" />
-                <span class="logo-text">1m</span>
+                <span class="logo-text">Bitget</span>
             </div>
             <div class="header-right">
                 <div class="lang-selector" @click="$router.push('/language')">
@@ -93,6 +93,12 @@
                 </div>
                 <span>{{ $t('withdraw') }}</span>
             </div>
+            <div class="quick-item" @click="$router.push('/cryptos/loan')">
+                <div class="quick-icon">
+                    <img src="@/assets/image/dk.png" alt="loan" />
+                </div>
+                <span>{{ $t('home.loan') }}</span>
+            </div>
             <div class="quick-item" @click="$router.push('/customerService')">
                 <div class="quick-icon">
                     <img src="@/assets/image/lxkf.png" alt="service" />
@@ -123,9 +129,10 @@
 
         <!-- Trading Instruments -->
         <div class="trading-section">
-            <div class="trading-tabs trading-tabs--single">
-                <div class="tab-item active">
-                    {{ $t('加密货币') }}
+            <div class="trading-tabs">
+                <div class="tab-item" v-for="tab in marketTabs" :key="tab.value"
+                    :class="{ active: activeTab === tab.value }" @click="switchTab(tab.value)">
+                    {{ $t(tab.label) }}
                 </div>
             </div>
             <div class="trading-pairs">
@@ -135,7 +142,7 @@
                         <div class="pair-symbol">
                             <img v-if="getPairIconUrl(pair)" :src="getPairIconUrl(pair)" alt=""
                                 class="pair-symbol-icon" />
-                            {{ pair.symboltxt.toUpperCase() }}
+                            {{ (pair.symboltxt || pair.symbol || '').toUpperCase() }}
                         </div>
                         <div class="pair-change" :class="pair.change >= 0 ? 'up' : 'down'">
                             {{ pair.change >= 0 ? '+' : '' }}{{ pair.change.toFixed(4) }}%
@@ -281,7 +288,7 @@
     if (!symbol) return
     router.push({
         path: '/trade/options',
-        query: { symbol, activeTab: type || 'cryptos' }
+        query: { symbol, activeTab: type || activeTab.value }
     })
 }
 
@@ -313,6 +320,13 @@
 })
 
 const tradingPairs = ref([])
+const activeTab = ref('cryptos')
+const marketTabs = [
+    { label: '加密货币', value: 'cryptos' },
+    { label: '股票', value: 'US-stocks' },
+    { label: 'ETF', value: 'indices' },
+    { label: '外汇', value: 'forex' },
+]
 // 新闻列表,用于横向滚动轮播(与 news/index.vue 同源:_getUsHeadNews)
 const newsList = ref([])
 
@@ -321,12 +335,19 @@
 
 function getPairIconUrl(pair) {
     if (!pair) return ''
+    if (activeTab.value === 'US-stocks' || activeTab.value === 'indices') return ''
     return pair.iconImg ? `${IMG_PATH}/symbol/${pair.iconImg}.png` : ''
 }
 
-// 获取交易数据(仅数字货币)
+function switchTab(tab) {
+    if (activeTab.value === tab) return
+    activeTab.value = tab
+    fetchTradingData()
+}
+
+// 获取交易数据
 const fetchTradingData = async () => {
-    const type = 'cryptos'
+    const type = activeTab.value
 
     try {
         const params = {
@@ -350,19 +371,19 @@
                 const spread = basePrice * 0.0001 // 很小的价差
                 const sellPrice = (basePrice - spread).toFixed(4)
                 const buyPrice = (basePrice + spread).toFixed(4)
-                const symboltxt = item.enName
+                const symboltxt = item.enName || item.name || item.symbol
                 const symbolStr = item.symbol || '--'
                 const iconImg = item.symbol_data || (symbolStr.includes('/') ? symbolStr.split('/')[0].toLowerCase() : symbolStr.replace(/USDT$/i, '').toLowerCase()) || symbolStr.toLowerCase()
                 return {
-                    symboltxt: symboltxt,
+                    symboltxt,
                     symbol: symbolStr,
-                    type: type,
-                    iconImg: iconImg,
+                    type,
+                    iconImg,
                     price: basePrice.toFixed(4),
                     change: changeRatio,
-                    sellPrice: sellPrice,
-                    buyPrice: buyPrice,
-                    klineData: klineData
+                    sellPrice,
+                    buyPrice,
+                    klineData
                 }
             })
         } else {
diff --git a/src/views/quotes/Market.vue b/src/views/quotes/Market.vue
index bb0fc74..7432f87 100644
--- a/src/views/quotes/Market.vue
+++ b/src/views/quotes/Market.vue
@@ -1,9 +1,10 @@
 <template>
     <div class="quotes-market-page">
         <!-- Top Tabs -->
-        <div class="market-tabs market-tabs--single">
-            <div class="tab-item active">
-                {{ $t('加密货币') }}
+        <div class="market-tabs">
+            <div class="tab-item" v-for="tab in marketTabs" :key="tab.value"
+                :class="{ active: activeTab === tab.value }" @click="switchTab(tab.value)">
+                {{ $t(tab.label) }}
             </div>
         </div>
 
@@ -12,12 +13,12 @@
             <van-list v-model:loading="marketLoading" :finished="marketFinished" :immediate-check="false"
                 :scroll-target="marketListRef" :finished-text="$t('没有更多了') || '没有更多了'" @load="loadMoreMarket">
                 <div class="pair-item" v-for="pair in tradingPairs" :key="pair.symbol"
-                    @click="goToOptions(pair.symbol)">
+                    @click="goToOptions(pair.symbol, pair.type)">
                     <div class="pair-header">
                         <div class="pair-symbol">
                             <img v-if="getPairIconUrl(pair)" :src="getPairIconUrl(pair)" alt=""
                                 class="pair-symbol-icon" />
-                            {{ pair.symboltxt.toUpperCase() }}
+                            {{ (pair.symboltxt || pair.symbol || '').toUpperCase() }}
                         </div>
                         <div class="pair-change" :class="pair.change >= 0 ? 'up' : 'down'">
                             {{ pair.change >= 0 ? '+' : '' }}{{ pair.change.toFixed(4) }}%
@@ -60,7 +61,13 @@
 const useStore = useUserStore()
 const quotesStore = useQuotesStore()
 
-const activeTab = ref('crypto')
+const activeTab = ref('cryptos')
+const marketTabs = [
+    { label: '加密货币', value: 'cryptos' },
+    { label: '股票', value: 'US-stocks' },
+    { label: 'ETF', value: 'indices' },
+    { label: '外汇', value: 'forex' },
+]
 const tradingPairs = ref([])
 const interval = ref(null)
 const marketPage = ref(1)
@@ -73,8 +80,15 @@
 function getPairIconUrl(pair) {
     if (!pair) return ''
     const tab = activeTab.value
+    if (tab === 'US-stocks' || tab === 'indices') return ''
     if (tab === 'optional' && (pair.type === 'US-stocks' || pair.type === 'indices')) return ''
     return pair.iconImg ? `${IMG_PATH}/symbol/${pair.iconImg}.png` : ''
+}
+
+function switchTab(tab) {
+    if (activeTab.value === tab) return
+    activeTab.value = tab
+    fetchData()
 }
 
 // 根据当前价与涨跌幅生成小型 K 线数据,与首页一致
@@ -201,7 +215,7 @@
 
 // 获取交易数据;pageNo 页码,append 是否追加
 const fetchTradingData = async (pageNo = 1, append = false) => {
-    const type = 'cryptos'
+    const type = activeTab.value
 
     try {
         const params = {
@@ -217,7 +231,7 @@
                 const basePrice = parseFloat(item.close || item.lastPrice || 0)
                 const changeRatio = item.changeRatio || 0
                 const symbolStr = item.symbol || '--'
-                const symboltxt = item.enName
+                const symboltxt = item.enName || item.name || symbolStr
                 const iconImg = item.symbol_data || (symbolStr.includes('/') ? symbolStr.split('/')[0].toLowerCase() : symbolStr.replace(/USDT$/i, '').toLowerCase()) || symbolStr.toLowerCase()
                 const klineData = generateMiniKlineData(basePrice, changeRatio)
                 const spread = basePrice * 0.0001
@@ -226,20 +240,14 @@
 
                 return {
                     symbol: symbolStr,
-                    symboltxt: symboltxt,
+                    symboltxt,
                     price: basePrice.toFixed(4),
                     change: changeRatio,
-                    sellPrice: sellPrice,
-                    buyPrice: buyPrice,
-                    klineData: klineData,
-                    symbol: symbolStr,
-                    type: type,
-                    iconImg: iconImg,
-                    price: basePrice.toFixed(4),
-                    change: changeRatio,
-                    sellPrice: sellPrice,
-                    buyPrice: buyPrice,
-                    klineData: klineData
+                    sellPrice,
+                    buyPrice,
+                    klineData,
+                    type,
+                    iconImg
                 }
             })
             if (append) {
@@ -284,11 +292,11 @@
 }
 
 // 跳转到交易页 Options,与首页一致:/trade/options?symbol=xxx&activeTab=xxx
-function goToOptions(symbol) {
+function goToOptions(symbol, type) {
     if (!symbol) return
     router.push({
         path: '/trade/options',
-        query: { symbol, activeTab: 'cryptos' }
+        query: { symbol, activeTab: type || activeTab.value }
     })
 }
 
diff --git a/src/views/trade/Options.vue b/src/views/trade/Options.vue
index 4c518e2..bd36db6 100644
--- a/src/views/trade/Options.vue
+++ b/src/views/trade/Options.vue
@@ -35,7 +35,7 @@
                 <!-- Modal Tabs:同一 activeTab 的 label 与 value 统一配置 -->
                 <div v-if="modalTabs.length > 1" class="modal-tabs">
                     <div class="tab-item" v-for="tab in modalTabs" :key="tab.value"
-                        :class="{ active: activeTab === tab.value }" @click="activeTab = tab.value">
+                        :class="{ active: activeTab === tab.value }" @click="switchTab(tab.value)">
                         {{ $t(tab.label) }}
                     </div>
                 </div>
@@ -54,7 +54,7 @@
                             @click="selectSymbol(item)">
                             <div class="symbol-left">
                                 <div class="symbol-info">
-                                    <div class="symbol-name">{{ (item.symbol).toUpperCase() }}</div>
+                                    <div class="symbol-name">{{ getSymbolDisplayName(item) }}</div>
                                 </div>
                             </div>
                             <div class="symbol-change" :class="item.change_ratio >= 0 ? 'up' : 'down'">
@@ -98,20 +98,33 @@
 const symbolListRef = ref(null)
 const symbolInitialLoading = ref(false) // tab 切换时首屏请求中,避免 @load 重复请求 pageNo=1
 const SYMBOL_PAGE_SIZE = 10
+const TAB_TYPES = ['cryptos', 'US-stocks', 'indices', 'forex']
+const DEFAULT_SYMBOL = {
+    cryptos: 'btc',
+    'US-stocks': 'AAPL',
+    indices: 'GlobalETF500',
+    forex: 'EURUSD',
+}
 
-// 从路由 path(params) 或 query 同步 symbol(品种固定为数字货币)
+// 从路由 path(params) 或 query 同步 symbol、activeTab
 function applyFromRoute() {
     const p = route.params || {}
     const q = route.query || {}
     const symbol = q.symbol ?? p.symbol
+    const tab = q.activeTab ?? p.activeTab
+    if (tab && TAB_TYPES.includes(String(tab))) {
+        activeTab.value = String(tab)
+    }
     if (symbol != null && String(symbol).trim()) {
         currentSymbol.value = String(symbol).trim()
     }
-    activeTab.value = 'cryptos'
 }
 
 const modalTabs = [
     { label: '加密货币', value: 'cryptos' },
+    { label: '股票', value: 'US-stocks' },
+    { label: 'ETF', value: 'indices' },
+    { label: '外汇', value: 'forex' },
 ]
 
 // 头部显示:关联选择项的 name,无则用 symbol
@@ -124,8 +137,32 @@
 
 // 嵌入合约:1=永续(合约交易),2=交割(期权交易)
 const embedSelectIndex = computed(() => tradeType.value === 'contract' ? 1 : 2)
-// 嵌入合约品种类型(value 已与接口类型统一,仅 optional 需映射)
-const embedType = computed(() => 'cryptos')
+// 嵌入合约品种类型
+const embedType = computed(() => activeTab.value)
+
+function getSymbolDisplayName(item) {
+    if (!item) return ''
+    const name = item.name || item.enName || item.symbol || ''
+    if (activeTab.value === 'forex') return String(name).toUpperCase()
+    if (activeTab.value === 'cryptos') return String(item.symbol || name).toUpperCase()
+    return name
+}
+
+function mapSymbolItem(item) {
+    return {
+        symbol: item.symbol,
+        name: item.enName || item.name || item.symbol,
+        close: item.close ?? item.lastPrice ?? '--',
+        change_ratio: item.changeRatio ?? item.change_ratio ?? 0,
+    }
+}
+
+function switchTab(tab) {
+    if (activeTab.value === tab) return
+    activeTab.value = tab
+    currentSymbol.value = DEFAULT_SYMBOL[tab] || 'btc'
+    fetchData()
+}
 
 // 图标路径
 const starIcon = new URL('@/assets/image/icon-star.png', import.meta.url).href
@@ -141,8 +178,9 @@
 // 获取交易数据;pageNo 页码,append 是否追加
 const fetchTradingData = async (pageNo = 1, append = false) => {
     try {
+        const type = activeTab.value
         const params = {
-            type: 'cryptos',
+            type,
             pageNo: pageNo,
             pageSize: SYMBOL_PAGE_SIZE
         }
@@ -151,19 +189,21 @@
 
         if (data && Array.isArray(data)) {
             const symbols = data.map(item => item.symbol).join(',')
+            let list = []
             if (symbols) {
                 const homeData = await _getHomeList(symbols)
-                if (homeData && Array.isArray(homeData)) {
-                    if (append) {
-                        symbolList.value = [...symbolList.value, ...homeData]
-                    } else {
-                        symbolList.value = homeData
-                    }
-                } else if (!append) {
-                    symbolList.value = []
+                if (homeData && Array.isArray(homeData) && homeData.length) {
+                    list = homeData
+                } else {
+                    list = data.map(mapSymbolItem)
                 }
-            } else if (!append) {
-                symbolList.value = []
+            } else {
+                list = data.map(mapSymbolItem)
+            }
+            if (append) {
+                symbolList.value = [...symbolList.value, ...list]
+            } else {
+                symbolList.value = list
             }
             if (data.length <= 0) {
                 symbolFinished.value = true
@@ -219,7 +259,8 @@
     const keyword = searchKeyword.value.toLowerCase()
     return symbolList.value.filter(item =>
         item.symbol.toLowerCase().includes(keyword) ||
-        (item.name && item.name.toLowerCase().includes(keyword))
+        (item.name && item.name.toLowerCase().includes(keyword)) ||
+        (item.enName && item.enName.toLowerCase().includes(keyword))
     )
 })
 
@@ -229,8 +270,6 @@
     showSymbolModal.value = false
     searchKeyword.value = ''
 }
-
-// 查询当前交易对是否已收藏(与 add-currency / trade-head 一致)
 function checkFavorite() {
     if (!useStore.userInfo?.token || !currentSymbol.value) {
         isFavorite.value = false
@@ -271,7 +310,10 @@
 })
 
 // 监听路由 query 变化(同一页带不同 query 时同步)
-watch(() => route.query, () => applyFromRoute(), { deep: true })
+watch(() => route.query, () => {
+    applyFromRoute()
+    fetchData()
+}, { deep: true })
 
 // 组件挂载时:先从 path/query 取 symbol、activeTab,再拉数据并刷新收藏状态
 onMounted(() => {
diff --git a/vite.config.js b/vite.config.js
index 54dfe61..e1a0f03 100644
--- a/vite.config.js
+++ b/vite.config.js
@@ -61,8 +61,8 @@
 			// 关键:用正则表达式匹配所有含/api的路径(忽略大小写)
 			'^/api.*': { // 匹配以/api开头的任何路径(如/api、/api/xxx、/api?xx等)
 				// target: 'http://154.23.189.28:8086',
-				target:'https://api.dpcex.com',
-				// target:'https://api.dpcex.com',
+				target:'https://zhapi.bitget-jp-us.cyou',
+				// target:'https://zhapi.bitget-jp-us.cyou',
 				// target: 'https://by2.cccxxx.cc',
 				changeOrigin: true,
 				secure: false,
diff --git a/vite.config.js.timestamp-1775042120961.mjs b/vite.config.js.timestamp-1775042120961.mjs
deleted file mode 100644
index 24b3f8d..0000000
--- a/vite.config.js.timestamp-1775042120961.mjs
+++ /dev/null
@@ -1,88 +0,0 @@
-// vite.config.js
-import {
-  defineConfig
-} from "file:///D:/xzpro/26-3-31/wap/node_modules/vite/dist/node/index.js";
-import vue from "file:///D:/xzpro/26-3-31/wap/node_modules/@vitejs/plugin-vue/dist/index.mjs";
-import path from "path";
-import Components from "file:///D:/xzpro/26-3-31/wap/node_modules/unplugin-vue-components/dist/vite.mjs";
-import {
-  VantResolver
-} from "file:///D:/xzpro/26-3-31/wap/node_modules/unplugin-vue-components/dist/resolvers.mjs";
-import DefineOptions from "file:///D:/xzpro/26-3-31/wap/node_modules/unplugin-vue-define-options/dist/vite.mjs";
-import {
-  visualizer
-} from "file:///D:/xzpro/26-3-31/wap/node_modules/rollup-plugin-visualizer/dist/plugin/index.js";
-import legacy from "file:///D:/xzpro/26-3-31/wap/node_modules/@vitejs/plugin-legacy/dist/index.mjs";
-var __vite_injected_original_dirname = "D:\\xzpro\\26-3-31\\wap";
-var isVisualizer = process.env.VISUALIZER === "show";
-var vite_config_default = defineConfig({
-  base: "./",
-  plugins: [
-    vue(),
-    Components({
-      resolvers: [VantResolver()]
-    }),
-    DefineOptions(),
-    isVisualizer && visualizer({
-      gzipSize: true
-    })
-  ],
-  css: {
-    preprocessorOptions: {
-      scss: {
-        additionalData: `@import "@/assets/css/variable.scss";`
-      }
-    }
-  },
-  server: {
-    open: true,
-    port: 333,
-    host: "0.0.0.0",
-    proxy: {
-      "^/api.*": {
-        target: "https://api.dpcex.com",
-        changeOrigin: true,
-        secure: false,
-        rewrite: (path2) => path2,
-        configure: (proxy) => {
-          proxy.on("proxyReq", (proxyReq, req) => {
-            console.log(`[\u4EE3\u7406\u6210\u529F] \u6355\u83B7\u8BF7\u6C42: ${req.method} ${req.url}`);
-          });
-          proxy.on("error", (err) => {
-            console.log(`[\u4EE3\u7406\u9519\u8BEF] ${err.message}`);
-          });
-        }
-      }
-    }
-  },
-  resolve: {
-    dedupe: [
-      "vue"
-    ],
-    alias: {
-      "vue-i18n": "vue-i18n/dist/vue-i18n.cjs.js",
-      "~": path.resolve(__vite_injected_original_dirname, "./"),
-      "@": path.resolve(__vite_injected_original_dirname, "src")
-    }
-  },
-  build: {
-    assetsDir: "static",
-    chunkSizeWarningLimit: 5e3,
-    target: "esnext",
-    rollupOptions: {
-      input: {
-        index: path.resolve(__vite_injected_original_dirname, "index.html")
-      },
-      output: {
-        chunkFileNames: "js/[name]-[hash].js",
-        entryFileNames: "js/[name]-[hash].js",
-        assetFileNames: "[ext]/[name]-[hash].[ext]"
-      }
-    }
-  },
-  externals: ["vue"]
-});
-export {
-  vite_config_default as default
-};
-//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsidml0ZS5jb25maWcuanMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImNvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9kaXJuYW1lID0gXCJEOlxcXFx4enByb1xcXFwyNi0zLTMxXFxcXHdhcFwiO2NvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9maWxlbmFtZSA9IFwiRDpcXFxceHpwcm9cXFxcMjYtMy0zMVxcXFx3YXBcXFxcdml0ZS5jb25maWcuanNcIjtjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfaW1wb3J0X21ldGFfdXJsID0gXCJmaWxlOi8vL0Q6L3h6cHJvLzI2LTMtMzEvd2FwL3ZpdGUuY29uZmlnLmpzXCI7aW1wb3J0IHtcclxuXHRkZWZpbmVDb25maWdcclxufSBmcm9tICd2aXRlJ1xyXG5pbXBvcnQgdnVlIGZyb20gJ0B2aXRlanMvcGx1Z2luLXZ1ZSdcclxuaW1wb3J0IHBhdGggZnJvbSAncGF0aCdcclxuaW1wb3J0IENvbXBvbmVudHMgZnJvbSAndW5wbHVnaW4tdnVlLWNvbXBvbmVudHMvdml0ZSc7XHJcbmltcG9ydCB7XHJcblx0VmFudFJlc29sdmVyXHJcbn0gZnJvbSAndW5wbHVnaW4tdnVlLWNvbXBvbmVudHMvcmVzb2x2ZXJzJztcclxuaW1wb3J0IERlZmluZU9wdGlvbnMgZnJvbSAndW5wbHVnaW4tdnVlLWRlZmluZS1vcHRpb25zL3ZpdGUnO1xyXG5pbXBvcnQge1xyXG5cdHZpc3VhbGl6ZXJcclxufSBmcm9tICdyb2xsdXAtcGx1Z2luLXZpc3VhbGl6ZXInXHJcbi8vIHl5aGhcclxuaW1wb3J0IGxlZ2FjeSBmcm9tICdAdml0ZWpzL3BsdWdpbi1sZWdhY3knO1xyXG5cclxuXHJcbmNvbnN0IGlzVmlzdWFsaXplciA9IHByb2Nlc3MuZW52LlZJU1VBTElaRVIgPT09ICdzaG93J1xyXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb25maWcoe1xyXG5cdGJhc2U6ICcuLycsXHJcblx0cGx1Z2luczogW1xyXG5cdFx0dnVlKCksXHJcblx0XHRDb21wb25lbnRzKHtcclxuXHRcdFx0cmVzb2x2ZXJzOiBbVmFudFJlc29sdmVyKCldLFxyXG5cdFx0fSksXHJcblx0XHREZWZpbmVPcHRpb25zKCksXHJcblx0XHRpc1Zpc3VhbGl6ZXIgJiYgdmlzdWFsaXplcih7XHJcblx0XHRcdGd6aXBTaXplOiB0cnVlXHJcblx0XHR9KSxcclxuXHRcdC8vIHl5aGhcclxuXHRcdC8vIGxlZ2FjeSh7XHJcblx0XHQvLyBcdHRhcmdldHM6IFsnZGVmYXVsdHMnLCAnbm90IElFIDExJ10sXHJcblx0XHQvLyB9KSxcclxuXHJcblx0XSxcclxuXHRjc3M6IHtcclxuXHRcdHByZXByb2Nlc3Nvck9wdGlvbnM6IHtcclxuXHRcdFx0c2Nzczoge1xyXG5cdFx0XHRcdGFkZGl0aW9uYWxEYXRhOiBgQGltcG9ydCBcIkAvYXNzZXRzL2Nzcy92YXJpYWJsZS5zY3NzXCI7YFxyXG5cdFx0XHR9LFxyXG5cdFx0fVxyXG5cdH0sXHJcblx0Ly8gc2VydmVyOiB7XHJcblx0Ly8gICBvcGVuOiB0cnVlLFxyXG5cdC8vICAgcG9ydDogMzMzLFxyXG5cdC8vICAgaG1yOiB0cnVlLFxyXG5cdC8vICAgaG9zdDogJzAuMC4wLjAnLFxyXG5cdC8vICAgcHJveHk6IHtcclxuXHQvLyAgICAgXCIvYXBpXCI6IHtcclxuXHQvLyAgICAgICB0YXJnZXQ6IFwiaHR0cDovL2FwaS5zd2Z0ZWsuY29tXCIsICAgLy9cdTU4NkJcdTUxOTlcdTUzQ0RcdTU0MTFcdTRFRTNcdTc0MDY4MDg1XHU1NDBFXHU3Njg0XHU1N0RGXHU1NDBEXHJcblx0Ly8gICAgICAgY2hhbmdlT3JpZ2luOiB0cnVlLFxyXG5cdC8vICAgICAgIHNlY3VyZTogZmFsc2VcclxuXHQvLyAgICAgfSxcclxuXHQvLyAgIH0sXHJcblx0Ly8gfSxcclxuXHRzZXJ2ZXI6IHtcclxuXHRcdG9wZW46IHRydWUsXHJcblx0XHRwb3J0OiAzMzMsXHJcblx0XHRob3N0OiAnMC4wLjAuMCcsXHJcblx0XHRwcm94eToge1xyXG5cdFx0XHQvLyBcdTUxNzNcdTk1MkVcdUZGMUFcdTc1MjhcdTZCNjNcdTUyMTlcdTg4NjhcdThGQkVcdTVGMEZcdTUzMzlcdTkxNERcdTYyNDBcdTY3MDlcdTU0MkIvYXBpXHU3Njg0XHU4REVGXHU1Rjg0XHVGRjA4XHU1RkZEXHU3NTY1XHU1OTI3XHU1QzBGXHU1MTk5XHVGRjA5XHJcblx0XHRcdCdeL2FwaS4qJzogeyAvLyBcdTUzMzlcdTkxNERcdTRFRTUvYXBpXHU1RjAwXHU1OTM0XHU3Njg0XHU0RUZCXHU0RjU1XHU4REVGXHU1Rjg0XHVGRjA4XHU1OTgyL2FwaVx1MzAwMS9hcGkveHh4XHUzMDAxL2FwaT94eFx1N0I0OVx1RkYwOVxyXG5cdFx0XHRcdC8vIHRhcmdldDogJ2h0dHA6Ly8xNTQuMjMuMTg5LjI4OjgwODYnLFxyXG5cdFx0XHRcdHRhcmdldDonaHR0cHM6Ly9hcGkuMW1jcnlwdG8uY29tJyxcclxuXHRcdFx0XHQvLyB0YXJnZXQ6J2h0dHBzOi8vYXBpLjFtY3J5cHRvLmNvbScsXHJcblx0XHRcdFx0Ly8gdGFyZ2V0OiAnaHR0cHM6Ly9ieTIuY2NjeHh4LmNjJyxcclxuXHRcdFx0XHRjaGFuZ2VPcmlnaW46IHRydWUsXHJcblx0XHRcdFx0c2VjdXJlOiBmYWxzZSxcclxuXHRcdFx0XHQvLyBsb2dMZXZlbDogJ2RlYnVnJywgIC8vIFx1NjI1M1x1NTM3MFx1OEJFNlx1N0VDNlx1NEVFM1x1NzQwNlx1NjVFNVx1NUZEN1xyXG5cdFx0XHRcdHJld3JpdGU6IChwYXRoKSA9PiBwYXRoLCAvLyBcdTRFMERcdTRGRUVcdTY1MzlcdThERUZcdTVGODRcdUZGMDhcdTU5ODJcdTY3OUNcdTc2RUVcdTY4MDdBUElcdTY3MkNcdThFQUJcdTVDMzFcdTY3MDkvYXBpXHU1MjREXHU3RjAwXHVGRjA5XHJcblx0XHRcdFx0Y29uZmlndXJlOiAocHJveHkpID0+IHtcclxuXHRcdFx0XHRcdHByb3h5Lm9uKCdwcm94eVJlcScsIChwcm94eVJlcSwgcmVxKSA9PiB7XHJcblx0XHRcdFx0XHRcdGNvbnNvbGUubG9nKGBbXHU0RUUzXHU3NDA2XHU2MjEwXHU1MjlGXSBcdTYzNTVcdTgzQjdcdThCRjdcdTZDNDI6ICR7cmVxLm1ldGhvZH0gJHtyZXEudXJsfWApO1xyXG5cdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0XHRwcm94eS5vbignZXJyb3InLCAoZXJyKSA9PiB7XHJcblx0XHRcdFx0XHRcdGNvbnNvbGUubG9nKGBbXHU0RUUzXHU3NDA2XHU5NTE5XHU4QkVGXSAke2Vyci5tZXNzYWdlfWApO1xyXG5cdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fSxcclxuXHRyZXNvbHZlOiB7XHJcblx0XHRkZWR1cGU6IFtcclxuXHRcdFx0J3Z1ZSdcclxuXHRcdF0sXHJcblx0XHRhbGlhczoge1xyXG5cdFx0XHQndnVlLWkxOG4nOiAndnVlLWkxOG4vZGlzdC92dWUtaTE4bi5janMuanMnLFxyXG5cdFx0XHRcIn5cIjogcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJy4vJyksXHJcblx0XHRcdFwiQFwiOiBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnc3JjJyksXHJcblx0XHR9XHJcblx0fSxcclxuXHRidWlsZDoge1xyXG5cdFx0YXNzZXRzRGlyOiBcInN0YXRpY1wiLFxyXG5cdFx0Y2h1bmtTaXplV2FybmluZ0xpbWl0OiA1MDAwLCAvLyBcdTY1MzlcdTRFM0ExMDAwS2lCXHJcblx0XHQvLyB5eWhoXHJcblx0XHR0YXJnZXQ6ICdlc25leHQnLCAvLyBcdTYyMTZcdTgwMDUgJ2VzMjAxOScgLyAnZXMyMDIwJ1xyXG5cdFx0Ly8gXHU2NjBFXHU3ODZFXHU4QkJFXHU3RjZFXHU2NTJGXHU2MzAxXHU1RjAyXHU2QjY1XHU3NTFGXHU2MjEwXHU1NjY4XHU3Njg0XHU3NkVFXHU2ODA3XHU3M0FGXHU1ODgzXHJcblx0XHRyb2xsdXBPcHRpb25zOiB7XHJcblx0XHRcdGlucHV0OiB7XHJcblx0XHRcdFx0aW5kZXg6IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsIFwiaW5kZXguaHRtbFwiKSxcclxuXHRcdFx0fSxcclxuXHRcdFx0b3V0cHV0OiB7XHJcblx0XHRcdFx0Y2h1bmtGaWxlTmFtZXM6ICdqcy9bbmFtZV0tW2hhc2hdLmpzJyxcclxuXHRcdFx0XHRlbnRyeUZpbGVOYW1lczogXCJqcy9bbmFtZV0tW2hhc2hdLmpzXCIsXHJcblx0XHRcdFx0YXNzZXRGaWxlTmFtZXM6IFwiW2V4dF0vW25hbWVdLVtoYXNoXS5bZXh0XVwiXHJcblx0XHRcdH0sXHJcblx0XHR9LFxyXG5cdH0sXHJcblx0ZXh0ZXJuYWxzOiBbJ3Z1ZSddXHJcbn0pIl0sCiAgIm1hcHBpbmdzIjogIjtBQUFzUDtBQUFBLEVBQ3JQO0FBQUEsT0FDTTtBQUNQLE9BQU8sU0FBUztBQUNoQixPQUFPLFVBQVU7QUFDakIsT0FBTyxnQkFBZ0I7QUFDdkI7QUFBQSxFQUNDO0FBQUEsT0FDTTtBQUNQLE9BQU8sbUJBQW1CO0FBQzFCO0FBQUEsRUFDQztBQUFBLE9BQ007QUFFUCxPQUFPLFlBQVk7QUFkbkIsSUFBTSxtQ0FBbUM7QUFpQnpDLElBQU0sZUFBZSxRQUFRLElBQUksZUFBZTtBQUNoRCxJQUFPLHNCQUFRLGFBQWE7QUFBQSxFQUMzQixNQUFNO0FBQUEsRUFDTixTQUFTO0FBQUEsSUFDUixJQUFJO0FBQUEsSUFDSixXQUFXO0FBQUEsTUFDVixXQUFXLENBQUMsYUFBYSxDQUFDO0FBQUEsSUFDM0IsQ0FBQztBQUFBLElBQ0QsY0FBYztBQUFBLElBQ2QsZ0JBQWdCLFdBQVc7QUFBQSxNQUMxQixVQUFVO0FBQUEsSUFDWCxDQUFDO0FBQUEsRUFNRjtBQUFBLEVBQ0EsS0FBSztBQUFBLElBQ0oscUJBQXFCO0FBQUEsTUFDcEIsTUFBTTtBQUFBLFFBQ0wsZ0JBQWdCO0FBQUEsTUFDakI7QUFBQSxJQUNEO0FBQUEsRUFDRDtBQUFBLEVBY0EsUUFBUTtBQUFBLElBQ1AsTUFBTTtBQUFBLElBQ04sTUFBTTtBQUFBLElBQ04sTUFBTTtBQUFBLElBQ04sT0FBTztBQUFBLE1BRU4sV0FBVztBQUFBLFFBRVYsUUFBTztBQUFBLFFBR1AsY0FBYztBQUFBLFFBQ2QsUUFBUTtBQUFBLFFBRVIsU0FBUyxDQUFDQSxVQUFTQTtBQUFBLFFBQ25CLFdBQVcsQ0FBQyxVQUFVO0FBQ3JCLGdCQUFNLEdBQUcsWUFBWSxDQUFDLFVBQVUsUUFBUTtBQUN2QyxvQkFBUSxJQUFJLHdEQUFnQixJQUFJLFVBQVUsSUFBSSxLQUFLO0FBQUEsVUFDcEQsQ0FBQztBQUNELGdCQUFNLEdBQUcsU0FBUyxDQUFDLFFBQVE7QUFDMUIsb0JBQVEsSUFBSSw4QkFBVSxJQUFJLFNBQVM7QUFBQSxVQUNwQyxDQUFDO0FBQUEsUUFDRjtBQUFBLE1BQ0Q7QUFBQSxJQUNEO0FBQUEsRUFDRDtBQUFBLEVBQ0EsU0FBUztBQUFBLElBQ1IsUUFBUTtBQUFBLE1BQ1A7QUFBQSxJQUNEO0FBQUEsSUFDQSxPQUFPO0FBQUEsTUFDTixZQUFZO0FBQUEsTUFDWixLQUFLLEtBQUssUUFBUSxrQ0FBVyxJQUFJO0FBQUEsTUFDakMsS0FBSyxLQUFLLFFBQVEsa0NBQVcsS0FBSztBQUFBLElBQ25DO0FBQUEsRUFDRDtBQUFBLEVBQ0EsT0FBTztBQUFBLElBQ04sV0FBVztBQUFBLElBQ1gsdUJBQXVCO0FBQUEsSUFFdkIsUUFBUTtBQUFBLElBRVIsZUFBZTtBQUFBLE1BQ2QsT0FBTztBQUFBLFFBQ04sT0FBTyxLQUFLLFFBQVEsa0NBQVcsWUFBWTtBQUFBLE1BQzVDO0FBQUEsTUFDQSxRQUFRO0FBQUEsUUFDUCxnQkFBZ0I7QUFBQSxRQUNoQixnQkFBZ0I7QUFBQSxRQUNoQixnQkFBZ0I7QUFBQSxNQUNqQjtBQUFBLElBQ0Q7QUFBQSxFQUNEO0FBQUEsRUFDQSxXQUFXLENBQUMsS0FBSztBQUNsQixDQUFDOyIsCiAgIm5hbWVzIjogWyJwYXRoIl0KfQo=

--
Gitblit v1.9.3