zhb 2 mēneši atpakaļ
vecāks
revīzija
3a020b662d

+ 7 - 9
pages/mine/components/AddBankDialog.vue → components/AddBankDialog.vue

@@ -2,7 +2,7 @@
     <uni-popup ref="popupRef" type="center" background-color="#fff">
         <view class="dialog-container">
             <view class="dialog-header">
-                <text class="dialog-title">{{ t('blockchain.item2') }}</text>
+                <text class="dialog-title" v-t="typeMap[form.type]"></text>
                 <view class="dialog-close" @click="close">
                     <text>×</text>
                 </view>
@@ -154,7 +154,12 @@ import { useI18n } from 'vue-i18n';
 import { Validators } from '@/utils/validators';
 import { personalApi } from '@/service/personal';
 const { t, locale } = useI18n();
-
+const typeMap = {
+    4: 'blockchain.item2',
+    1: 'PersonalManagement.Title.ChinaUnionPayCard',
+    2: 'PersonalManagement.Title.BankWireTransfer',
+    3: 'PersonalManagement.Label.CreditCard'
+}
 interface AddBankForm {
     addressName: string;
     address: string;
@@ -198,13 +203,9 @@ const resetForm = () => {
 
 // 提交表单
 const submit = async () => {
-    console.log(form.value, 42342342);
-
     try {
         // 校验表单
         const valid = await formRef.value?.validate();
-        console.log(valid, 23123);
-
         if (!valid) {
             return;
         }
@@ -226,17 +227,14 @@ const submit = async () => {
             uni.showToast({ title: res.msg || t('common.error'), icon: 'none' });
         }
         close();
-
     } catch (error: any) {
         console.log(error);
-
         uni.showToast({ title: error.message || error.msg || t('common.error'), icon: 'none' });
     }
 };
 
 const bankList = ref([])
 const isZh = computed(() => ['cn', 'zh', 'zhHant'].includes(locale.value));
-
 const getLangName = (item: any) => (isZh.value ? item.name : item.enName);
 const createOptions = (list: any[], valueKey = 'code') => {
     return list.map((item) => ({

+ 97 - 0
components/LanguageDropdown.vue

@@ -0,0 +1,97 @@
+<template>
+  <cwg-dropdown :menu-list="customMenuList" @menuClick="handleMenuClick">
+    <view class="lang-select">
+      <image class="img flag" :src="currentFlag" alt="lang" />
+      <text>{{ currentLabel }}</text>
+      <text class="arrow">▼</text>
+    </view>
+  </cwg-dropdown>
+</template>
+
+<script setup lang="ts">
+import { computed } from 'vue'
+import { useI18n } from 'vue-i18n'
+import { localesList, LANG_MAP } from '@/locale/index'
+import { lang } from '@/composables/config'
+
+const { t, locale } = useI18n()
+
+const currentLang = computed(() => lang.value || locale.value)
+const currentLabel = computed(() => t(`language.${currentLang.value}`))
+const currentFlag = computed(() => getFlagSrc(currentLang.value))
+
+const customMenuList = computed(() =>
+  localesList.map((code) => ({
+    label: t(`language.${code}`),
+    type: code
+  })),
+)
+
+function handleMenuClick({ value }: { value: any }) {
+  const type = value?.type ?? value
+  if (!type) return
+  locale.value = type
+  lang.value = type
+  const localeValue = LANG_MAP[type] || 'zh-Hans'
+  uni.setLocale(localeValue)
+}
+
+function getFlagSrc(code: string) {
+  switch (code) {
+    case 'en':
+      return '/static/flag-en.png'
+    case 'cn':
+      return '/static/flag-cn.png'
+    case 'zhHant':
+      return '/static/flag-zhHant.png'
+    case 'es':
+      return '/static/flag-es.png'
+    default:
+      return '/static/flag-en.png'
+  }
+}
+</script>
+
+<style scoped lang="scss">
+@import "@/uni.scss";
+
+.lang-select {
+  display: flex;
+  align-items: center;
+  background: #f5f7fa;
+  border-radius: 18px;
+  padding: 4px 12px;
+  font-size: 14px;
+  cursor: pointer;
+}
+
+.flag {
+  width: 22px;
+  height: 16px;
+  margin-right: 6px;
+}
+
+.arrow {
+  margin-left: 4px;
+  font-size: 12px;
+}
+
+:deep(.cwg-dropdown-menu-container) {
+  top: px2rpx(40) !important;
+  left: 0 !important;
+  right: auto !important;
+  z-index: 1000 !important;
+}
+
+:deep(.cwg-dropdown-menu-container .menu) {
+  min-width: px2rpx(180);
+}
+
+:deep(.cwg-dropdown-menu-container .menu .menu-item) {
+  min-height: px2rpx(36);
+}
+
+:deep(.cwg-dropdown) {
+  overflow: visible !important;
+}
+</style>

+ 3 - 2
components/cwg-page-wrapper.vue

@@ -3,7 +3,7 @@
     <cwg-match-media :max-width="991" v-if="!isLoginPage" class="header-box">
       <cwg-pc-header @open-right-drawer="openRightDrawer" @open-left-drawer="openLeftDrawer" />
     </cwg-match-media>
-
+    <LanguageDropdown style="width: 0;display: none;" />
     <cwg-progress />
     <view class="page-content">
       <cwg-match-media :max-width="991" v-if="!isLoginPage">
@@ -16,7 +16,7 @@
         }"></view>
       </cwg-match-media>
       <view class="content-wrapper" :class="{ 'content-wrapper-padding': isContentPadding }">
-        <cwg-header />
+        <!-- <cwg-header /> -->
         <slot />
       </view>
       <view :style="{ height: isTabBarPage ? '60px' : '0px' }" />
@@ -38,6 +38,7 @@ import useRouter from '@/hooks/useRouter'
 import useUserStore from '@/stores/use-user-store'
 import { userApi } from '@/api/user'
 import useGlobalStore from '@/stores/use-global-store'
+import LanguageDropdown from './LanguageDropdown.vue'
 const globalStore = useGlobalStore()
 const router = useRouter()
 const userStore = useUserStore()

+ 24 - 13
components/cwg-sidebar.vue

@@ -38,24 +38,26 @@ const menu = ref<MenuItem[]>([
         isOpenMenu: false, submenuHeight: 0,
         path: '/pages/customer/index', label: 'Home.msg.Custom', icon: 'crm-house',
         children: [
-            { path: '/pages/customer/index', label: 'Client Zone', icon: 'icon-client' },
-            { path: '/pages/customer/promotion', label: 'Promotion Center', icon: 'icon-promotion' },
-            { path: '/pages/customer/deposit', label: 'Deposit', icon: 'icon-deposit' },
-            { path: '/pages/customer/withdrawal', label: 'Withdrawal', icon: 'icon-withdrawal' },
-            { path: '/pages/customer/payment-history', label: 'Payment History', icon: 'icon-payment' },
-            { path: '/pages/customer/transfer', label: 'Internal Transfer', icon: 'icon-transfer' },
-            { path: '/pages/customer/recording-history', label: 'Application History', icon: 'icon-application' }
+            { path: '/pages/customer/index', label: 'Custom.Index.AccountList', icon: 'icon-client' },
+            { path: '/pages/customer/deposit', label: 'Home.page_customer.item2', icon: 'icon-deposit' },
+            { path: '/pages/customer/withdrawal', label: 'Home.page_customer.item3', icon: 'icon-withdrawal' },
+            { path: '/pages/customer/payment-history', label: 'Home.page_customer.item4', icon: 'icon-payment' },
+            { path: '/pages/customer/transfer', label: 'Home.page_customer.item5', icon: 'icon-transfer' },
+            { path: '/pages/customer/recording-history', label: 'Home.page_customer.item7', icon: 'icon-application' }
         ]
     },
-    {
-        isOpenMenu: false, submenuHeight: 0,
-        path: '/pages/customer/index', label: 'Home.msg.Custom', icon: 'crm-house',
-        children: []
-    },
     {
         isOpenMenu: false,
         path: '/pages/customer/promotion', label: 'Home.msg.Ib', icon: 'crm-users',
-        children: []
+        children: [
+            { path: '/pages/ib/index', label: 'Home.page_ib.item1', icon: 'icon-client' },
+            { path: '/pages/ib/customer', label: 'Home.page_ib.item2', icon: 'icon-deposit' },
+            { path: '/pages/ib/report', label: 'Home.page_ib.item3', icon: 'icon-withdrawal' },
+            { path: '/pages/ib/transfer', label: 'Home.page_ib.item4', icon: 'icon-payment' },
+            { path: '/pages/ib/withdraw', label: 'Home.page_ib.item5', icon: 'icon-transfer' },
+            { path: '/pages/ib/agent-transfer', label: 'Home.page_ib.item9', icon: 'icon-transfer' },
+            { path: '/pages/ib/recording', label: 'Home.page_ib.item7', icon: 'icon-application' }
+        ]
     },
     {
         path: '/pages/customer/deposit', isOpenMenu: false, label: 'Documentary.title', icon: 'crm-chart-area',
@@ -69,6 +71,15 @@ const menu = ref<MenuItem[]>([
         path: '/pages/customer/support', isOpenMenu: false, label: 'Downloadpage.item16', icon: 'crm-headset',
         children: []
     },
+    {
+        path: '/pages/customer/support', isOpenMenu: false, label: '设置', icon: 'crm-headset',
+        children: [
+            { path: '/pages/mine/info?type=1', isOpenMenu: false, label: 'PersonalManagement.Title.PersonalInformation', icon: 'crm-headset' },
+            { path: '/pages/mine/info?type=2', isOpenMenu: false, label: 'PersonalManagement.Title.BankInformation', icon: 'crm-headset' },
+            { path: '/pages/mine/info?type=3', isOpenMenu: false, label: 'PersonalManagement.Title.FileManagement', icon: 'crm-headset' },
+            { path: '/pages/mine/info?type=4', isOpenMenu: false, label: 'PersonalManagement.Title.SecurityCenter', icon: 'crm-headset' },
+        ]
+    },
 ]);
 const submenuRefs = ref<any[]>([]);
 const measureHeight = (element: HTMLElement): number => {

+ 8 - 8
config/index.ts

@@ -11,14 +11,14 @@ let ho = '44a5c8109e4'; // 默认主域名或可根据实际APP环境配置
 const config = {
 
   HostWs: "wss://ws." + ho + ".com",
-  // Host80: ht + "//secure." + ho + ".com",
-  // Host00: ht + "//ucard." + ho + ".com",
-  // Host85: ht + "//ucard." + ho + ".com",
-  // Host04: ht + "//pay." + ho + ".com",
-  Host80: 'http://192.168.0.21:8000',
-  Host00: 'http://192.168.0.21:8000',
-  Host85: 'http://192.168.0.21:8000',
-  Host04: 'http://192.168.0.21:8004',
+  Host80: ht + "//secure." + ho + ".com",
+  Host00: ht + "//ucard." + ho + ".com",
+  Host85: ht + "//ucard." + ho + ".com",
+  Host04: ht + "//pay." + ho + ".com",
+  // Host80: 'http://192.168.0.21:8000',
+  // Host00: 'http://192.168.0.21:8000',
+  // Host85: 'http://192.168.0.21:8000',
+  // Host04: 'http://192.168.0.21:8004',
   Host90: ht + "//data." + ho + ".com",
   HostShop: ht + "//shopcustom." + ho + ".com",
   HostShopImg: ht + "//shopmanager." + ho + ".com",

+ 13 - 13
locale/es.json

@@ -222,20 +222,20 @@
   },
   "language": {
     "selectLang": "Seleccionar idioma",
-    "cn": "Chino simplificado",
-    "zhHant": "Chino tradicional",
-    "en": "Inglés",
-    "de": "Alemán",
+    "cn": "简体中文",
+    "zhHant": "繁體中文",
+    "en": "English",
+    "de": "Deutsch",
     "es": "Español",
-    "ar": "Árabe",
-    "id": "Indonesio",
-    "ms": "Malayo",
-    "th": "Tailandés",
-    "tr": "Turco",
-    "pt": "Portugués",
-    "ko": "Coreano",
-    "fa": "Persa",
-    "vn": "Vietnamita",
+    "ar": "العربية",
+    "id": "Indonesian",
+    "ms": "Malay",
+    "th": "ไทย",
+    "tr": "Türkçe",
+    "pt": "Português",
+    "ko": "한국어",
+    "fa": "فارسی",
+    "vn": "Tiếng Việt",
     "i0": "Verificado",
     "i1": "Idioma",
     "i2": "Cambiar contraseña",

+ 13 - 13
locale/fa.json

@@ -222,20 +222,20 @@
   },
   "language": {
     "selectLang": "انتخاب زبان",
-    "cn": "چینی ساده",
-    "zhHant": "چینی سنتی",
-    "en": "انگلیسی",
-    "de": "آلمانی",
-    "es": "اسپانیایی",
-    "ar": "عربی",
-    "id": "اندونزیایی",
-    "ms": "مالایی",
-    "th": "تایلندی",
-    "tr": "ترکی",
-    "pt": "پرتغالی",
-    "ko": "کره‌ای",
+    "cn": "简体中文",
+    "zhHant": "繁體中文",
+    "en": "English",
+    "de": "Deutsch",
+    "es": "Español",
+    "ar": "العربية",
+    "id": "Indonesian",
+    "ms": "Malay",
+    "th": "ไทย",
+    "tr": "Türkçe",
+    "pt": "Português",
+    "ko": "한국어",
     "fa": "فارسی",
-    "vn": "ویتنامی",
+    "vn": "Tiếng Việt",
     "i0": "تأیید شده",
     "i1": "تنظیم زبان",
     "i2": "تغییر رمز عبور",

+ 14 - 14
locale/id.json

@@ -222,20 +222,20 @@
   },
   "language": {
     "selectLang": "Pilih bahasa",
-    "cn": "China Sederhana",
-    "zhHant": "China Tradisional",
-    "en": "Inggris",
-    "de": "Jerman",
-    "es": "Spanyol",
-    "ar": "Arab",
-    "id": "Indonesia",
-    "ms": "Melayu",
-    "th": "Thai",
-    "tr": "Turki",
-    "pt": "Portugis",
-    "ko": "Korea",
-    "fa": "Persia",
-    "vn": "Vietnam",
+    "cn": "简体中文",
+    "zhHant": "繁體中文",
+    "en": "English",
+    "de": "Deutsch",
+    "es": "Español",
+    "ar": "العربية",
+    "id": "Indonesian",
+    "ms": "Malay",
+    "th": "ไทย",
+    "tr": "Türkçe",
+    "pt": "Portugs",
+    "ko": "한국어",
+    "fa": "فارسی",
+    "vn": "Tiếng Việt",
     "i0": "Terverifikasi",
     "i1": "Bahasa",
     "i2": "Ubah kata sandi",

+ 13 - 13
locale/ko.json

@@ -222,20 +222,20 @@
   },
   "language": {
     "selectLang": "언어 선택",
-    "cn": "중국어(간체)",
-    "zhHant": "중국어(번체)",
-    "en": "영어",
-    "de": "독일어",
-    "es": "스페인어",
-    "ar": "아랍어",
-    "id": "인도네시아어",
-    "ms": "말레이어",
-    "th": "태국어",
-    "tr": "터키어",
-    "pt": "포르투갈어",
+    "cn": "简体中文",
+    "zhHant": "繁體中文",
+    "en": "English",
+    "de": "Deutsch",
+    "es": "Español",
+    "ar": "العربية",
+    "id": "Indonesian",
+    "ms": "Malay",
+    "th": "ไทย",
+    "tr": "Türkçe",
+    "pt": "Português",
     "ko": "한국어",
-    "fa": "페르시아어",
-    "vn": "베트남어",
+    "fa": "فارسی",
+    "vn": "Tiếng Việt",
     "i0": "인증됨",
     "i1": "언어 설정",
     "i2": "비밀번호 변경",

+ 2 - 2
locale/ms.json

@@ -222,8 +222,8 @@
   },
   "language": {
     "selectLang": "Pilih bahasa",
-    "cn": "Cina Ringkas",
-    "zhHant": "Cina Tradisional",
+    "cn": "简体中文",
+    "zhHant": "繁體中文",
     "en": "English",
     "de": "Deutsch",
     "es": "Español",

+ 2 - 2
locale/pt.json

@@ -222,8 +222,8 @@
   },
   "language": {
     "selectLang": "Selecionar idioma",
-    "cn": "Chinês Simplificado",
-    "zhHant": "Chinês Tradicional",
+    "cn": "简体中文",
+    "zhHant": "繁體中文",
     "en": "English",
     "de": "Deutsch",
     "es": "Español",

+ 2 - 2
locale/th.json

@@ -222,8 +222,8 @@
   },
   "language": {
     "selectLang": "เลือกภาษา",
-    "cn": "จีนตัวย่อ",
-    "zhHant": "จีนตัวเต็ม",
+    "cn": "简体中文",
+    "zhHant": "繁體中文",
     "en": "English",
     "de": "Deutsch",
     "es": "Español",

+ 2 - 2
locale/tr.json

@@ -222,8 +222,8 @@
   },
   "language": {
     "selectLang": "Dil seç",
-    "cn": "Basitleştirilmiş Çince",
-    "zhHant": "Geleneksel Çince",
+    "cn": "简体中文",
+    "zhHant": "繁體中文",
     "en": "English",
     "de": "Deutsch",
     "es": "Español",

+ 2 - 2
locale/vn.json

@@ -222,8 +222,8 @@
   },
   "language": {
     "selectLang": "Chọn ngôn ngữ",
-    "cn": "Tiếng Trung giản thể",
-    "zhHant": "Tiếng Trung phồn thể",
+    "cn": "简体中文",
+    "zhHant": "繁體中文",
     "en": "English",
     "de": "Deutsch",
     "es": "Español",

+ 13 - 13
locale/zhHant.json

@@ -222,20 +222,20 @@
   },
   "language": {
     "selectLang": "選擇語言",
-    "cn": "簡體中文",
+    "cn": "简体中文",
     "zhHant": "繁體中文",
-    "en": "英文",
-    "de": "德文",
-    "es": "西班牙文",
-    "ar": "阿拉伯文",
-    "id": "印尼文",
-    "ms": "馬來文",
-    "th": "泰文",
-    "tr": "土耳其文",
-    "pt": "葡萄牙文",
-    "ko": "韓文",
-    "fa": "波斯文",
-    "vn": "越南文",
+    "en": "English",
+    "de": "Deutsch",
+    "es": "Español",
+    "ar": "العربية",
+    "id": "Indonesian",
+    "ms": "Malay",
+    "th": "ไทย",
+    "tr": "Türkçe",
+    "pt": "Português",
+    "ko": "한국어",
+    "fa": "فارسی",
+    "vn": "Tiếng Việt",
     "i0": "已驗證",
     "i1": "語言設定",
     "i2": "修改密碼",

+ 49 - 0
pages.json

@@ -191,6 +191,55 @@
         "navigationStyle": "custom"
       }
     },
+    {
+      "path": "pages/ib/index",
+      "style": {
+        "navigationBarTitleText": "",
+        "navigationStyle": "custom"
+      }
+    },
+    {
+      "path": "pages/ib/customer",
+      "style": {
+        "navigationBarTitleText": "",
+        "navigationStyle": "custom"
+      }
+    },
+    {
+      "path": "pages/ib/report",
+      "style": {
+        "navigationBarTitleText": "",
+        "navigationStyle": "custom"
+      }
+    },
+    {
+      "path": "pages/ib/transfer",
+      "style": {
+        "navigationBarTitleText": "",
+        "navigationStyle": "custom"
+      }
+    },
+    {
+      "path": "pages/ib/agent-transfer",
+      "style": {
+        "navigationBarTitleText": "",
+        "navigationStyle": "custom"
+      }
+    },
+    {
+      "path": "pages/ib/withdraw",
+      "style": {
+        "navigationBarTitleText": "",
+        "navigationStyle": "custom"
+      }
+    },
+    {
+      "path": "pages/ib/recording",
+      "style": {
+        "navigationBarTitleText": "",
+        "navigationStyle": "custom"
+      }
+    },
     {
       "path": "pages/mine/notice",
       "style": {

+ 0 - 182
pages/customer/components/TerminalInfoDialog.vue

@@ -1,182 +0,0 @@
-<template>
-    <cwg-popup :title="title" v-model:visible="props.visible" :showFooter="false"
-        @update:visible="$emit('update:visible', $event)">
-        <view class="account-detail-content">
-            <!-- 账户编号独立显示(如果需要,也可以作为 fieldList 中的一项) -->
-            <view v-if="accountNumber" class="account-number-row">
-                <text class="label">{{ accountLabel }}</text>
-                <text class="value">{{ accountNumber }}</text>
-            </view>
-
-            <!-- 动态字段列表 -->
-            <view v-for="(field, index) in fieldList" :key="index" class="field-row">
-
-                <cwg-label-line-value :label="field.label" :value="getFieldValue(field.key)">
-                    <template #operation v-if="field.copyable">
-                        <view class="copy-btn" @click="copyValue(getFieldValue(field.key))">
-                            <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24"
-                                fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"
-                                stroke-linejoin="round">
-                                <path
-                                    d="M7 7m0 2.667a2.667 2.667 0 0 1 2.667 -2.667h8.666a2.667 2.667 0 0 1 2.667 2.667v8.666a2.667 2.667 0 0 1 -2.667 2.667h-8.666a2.667 2.667 0 0 1 -2.667 -2.667z" />
-                                <path
-                                    d="M4.012 16.737a2.005 2.005 0 0 1 -1.012 -1.737v-10c0 -1.1 .9 -2 2 -2h10c.75 0 1.158 .385 1.5 1" />
-                            </svg>
-                        </view>
-                    </template>
-                </cwg-label-line-value>
-                <!-- <text class="label">{{ field.label }}</text>
-                <view class="value-wrapper">
-                    <text class="value">{{ getFieldValue(field.key) || '--' }}</text>
-                    <view v-if="field.copyable" class="copy-btn" @click="copyValue(getFieldValue(field.key))">
-                        <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none"
-                            stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
-                            <path
-                                d="M7 7m0 2.667a2.667 2.667 0 0 1 2.667 -2.667h8.666a2.667 2.667 0 0 1 2.667 2.667v8.666a2.667 2.667 0 0 1 -2.667 2.667h-8.666a2.667 2.667 0 0 1 -2.667 -2.667z" />
-                            <path
-                                d="M4.012 16.737a2.005 2.005 0 0 1 -1.012 -1.737v-10c0 -1.1 .9 -2 2 -2h10c.75 0 1.158 .385 1.5 1" />
-                        </svg>
-                    </view>
-                </view> -->
-            </view>
-        </view>
-    </cwg-popup>
-</template>
-
-<script setup>
-import { computed } from 'vue'
-
-const props = defineProps({
-    // 是否显示弹窗
-    visible: {
-        type: Boolean,
-        default: false
-    },
-    // 弹窗标题
-    title: {
-        type: String,
-        default: '账户详情'
-    },
-    // 账户编号(若单独展示)
-    accountNumber: {
-        type: String,
-        default: ''
-    },
-    // 账户编号标签
-    accountLabel: {
-        type: String,
-        default: '账户:'
-    },
-    // 表单数据对象
-    form: {
-        type: Object,
-        default: () => ({})
-    },
-    // 字段配置列表,每项包含:
-    // - label: 字段显示名称
-    // - key: 在 form 中对应的键名
-    // - copyable: 是否显示复制按钮,默认 false
-    fieldList: {
-        type: Array,
-        default: () => []
-    }
-})
-
-const emit = defineEmits(['update:visible'])
-
-// 获取字段值
-const getFieldValue = (key) => {
-    return props.form?.[key] ?? ''
-}
-
-// 复制文本到剪贴板
-const copyValue = (text) => {
-    if (!text) {
-        uni.showToast({ title: '无内容可复制', icon: 'none' })
-        return
-    }
-    uni.setClipboardData({
-        data: String(text),
-        success: () => {
-            uni.showToast({ title: '复制成功', icon: 'success' })
-        },
-        fail: () => {
-            uni.showToast({ title: '复制失败', icon: 'none' })
-        }
-    })
-}
-</script>
-
-<style scoped lang="scss">
-@import "@/uni.scss";
-@media (min-width: 768px) {
-    :deep(.cwg-dialog) {
-        background-color: var(--color-white);
-        border-radius: px2rpx(8);
-        width: px2rpx(500) !important;
-    }
-}
-
-.account-number-row,
-.field-row {
-    display: flex;
-    align-items: center;
-    padding: px2rpx(10) 0;
-    width: 100%;
-    font-size: px2rpx(14);
-
-    &:last-child {
-        border-bottom: none;
-    }
-
-    .label {
-        min-width: px2rpx(30);
-        color: #666;
-        font-weight: normal;
-        flex-shrink: 0;
-    }
-
-    .value-wrapper {
-        flex: 1;
-        display: flex;
-        align-items: center;
-        justify-content: space-between;
-    }
-
-    .value {
-        color: #333;
-        flex: 1;
-    }
-
-    .copy-btn {
-        width: px2rpx(20);
-        height: px2rpx(20);
-        display: flex;
-        align-items: center;
-        justify-content: center;
-        margin-left: px2rpx(12);
-        cursor: pointer;
-        color: #999;
-        transition: color 0.2s;
-
-        &:active {
-            color: #007aff;
-        }
-
-        svg {
-            width: px2rpx(20);
-            height: px2rpx(20);
-        }
-    }
-}
-
-// 可复制行样式(仅用于视觉区分)
-.copyable-row {
-    .value-wrapper {
-        .value {
-            // 可复制字段的值留出右侧空间
-            margin-right: px2rpx(8);
-        }
-    }
-}
-</style>

+ 184 - 0
pages/customer/components/TerminalNickNameDialog copy.vue

@@ -0,0 +1,184 @@
+<template>
+    <cwg-popup :title="'账户昵称'" :visible="props.visible" :showFooter="false"
+        @update:visible="$emit('update:visible', $event)">
+        <view class="popup-content">
+            <text class="account-number">{{ accountLabel }} {{ account.login }}</text>
+            <text class="account-hint">{{ hint }}</text>
+
+            <view class="form-item">
+                <view class="input-label">账户昵称</view>
+                <input class="input-field" v-model="nickName" :maxlength="36" :placeholder="placeholder"
+                    @input="onInput" />
+                <text class="input-hint">{{ constraint }}</text>
+            </view>
+            <view class="save-btn">
+                <view class="btn primary" @click="save" :disabled="!isValid || !nickName.trim()" v-t="'Btn.Save'" />
+            </view>
+        </view>
+    </cwg-popup>
+</template>
+
+<script setup>
+import { ref, computed, onMounted } from 'vue'
+import { customApi } from '@/service/custom';
+import { useI18n } from 'vue-i18n'
+const { t, locale } = useI18n()
+const props = defineProps({
+    visible: { type: Boolean, default: false },
+    // 账户编号
+    account: { type: Object, default: {} },
+    // 标题
+    title: { type: String, default: '账户昵称' },
+    // 账户标签前缀
+    accountLabel: { type: String, default: '账户: #' },
+    // 提示文字
+    hint: { type: String, default: '为账户定制名称,以便快速查找。' },
+    // 输入框占位符
+    placeholder: { type: String, default: '为账户定制名称,以便快速查找。' },
+    // 特殊字符限制说明
+    constraint: { type: String, default: '昵称不可包含特殊字符:< > " \' & ? ^ * # @' }
+})
+const emit = defineEmits(['update:visible', 'save'])
+
+const nickName = ref(props.account.nickName)
+
+// 特殊字符正则
+const specialCharsRegex = /[<>"\'&?^*#@]/
+
+// 校验昵称是否合法
+const isValid = computed(() => {
+    if (!nickName.value) return false
+    return !specialCharsRegex.test(nickName.value)
+})
+
+// 输入时实时校验(可选,可去掉)
+const onInput = (e) => {
+    // 实时过滤非法字符(也可以只是校验)
+}
+// 保存昵称
+const save = async () => {
+    if (!isValid.value) {
+        uni.showToast({
+            title: '昵称包含非法字符,请重新输入',
+            icon: 'none'
+        })
+        return
+    }
+    const nickname = nickName.value.trim()
+    if (!nickname) {
+        uni.showToast({
+            title: '昵称不能为空',
+            icon: 'none'
+        })
+        return
+    }
+    const res = await customApi.updateNick({ nickName: nickname, login: props.account.login })
+    if (res.code == 200) {
+        emit('update:visible', false)
+        emit('save', nickname)
+    }
+}
+</script>
+
+<style scoped lang="scss">
+@import "@/uni.scss";
+
+@media (min-width: 768px) {
+    :deep(.cwg-dialog) {
+        background-color: var(--color-white);
+        border-radius: px2rpx(8);
+        width: px2rpx(480) !important;
+    }
+}
+
+.popup-content {
+    padding: px2rpx(16);
+}
+
+.account-number {
+    display: block;
+    font-size: px2rpx(14);
+    color: #141d22;
+    margin-bottom: px2rpx(40);
+}
+
+.account-hint {
+    display: block;
+    font-size: px2rpx(13);
+    color: #141d22;
+    margin-bottom: px2rpx(40);
+}
+
+.form-item {
+    margin-bottom: px2rpx(20);
+}
+
+.input-label {
+    font-size: px2rpx(12);
+    color: #141d22;
+    margin-bottom: px2rpx(4);
+}
+
+.input-field {
+    width: 100%;
+    height: px2rpx(40);
+    border: 1px solid #ddd;
+    border-radius: px2rpx(6);
+    padding: 0 px2rpx(12);
+    font-size: px2rpx(14);
+    box-sizing: border-box;
+}
+
+.input-hint {
+    display: block;
+    font-size: px2rpx(11);
+    color: #999;
+    margin-top: px2rpx(6);
+    line-height: 1.4;
+}
+
+.save-btn {
+    width: 100%;
+    height: px2rpx(40);
+    color: #fff;
+    border-radius: px2rpx(8);
+    font-size: px2rpx(16);
+    font-weight: 500;
+    display: flex;
+    justify-content: flex-end;
+
+    border: none;
+
+
+    .btn {
+        background: transparent;
+        border: 1px solid rgba(108, 133, 149, 0);
+        border-radius: px2rpx(8);
+        padding: px2rpx(8) px2rpx(20);
+        font-size: px2rpx(14);
+        color: #2e3a47;
+        display: inline-flex;
+        align-items: center;
+        justify-content: center;
+        gap: px2rpx(8);
+        cursor: pointer;
+        transition: all 0.2s;
+        height: px2rpx(40);
+        box-sizing: border-box;
+        background-color: rgba(108, 133, 149, 0.08);
+
+        &.primary {
+            background-color: var(--color-navy-700);
+            color: #fff;
+
+            svg {
+                stroke: #fff;
+            }
+
+            &:hover {
+                background-color: var(--color-navy-600);
+            }
+        }
+    }
+}
+</style>

+ 2 - 8
pages/customer/deposit.vue

@@ -1,11 +1,7 @@
 <template>
     <cwg-page-wrapper class="create-page" :isHeaderFixed="true">
+        <cwg-header :title="t('Home.page_customer.item2')" />
         <view class="custom-deposit">
-            <!-- 标题 -->
-            <!-- <view class="crm-title-box">
-                <text class="tit">{{ t('Home.page_customer.item2') }}</text>
-            </view> -->
-
             <!-- 步骤1:选择账户 -->
             <view class="box box-step1">
                 <view class="b-card">
@@ -17,7 +13,6 @@
                     </view>
                 </view>
             </view>
-
             <!-- 步骤2:支付通道列表(卡片布局) -->
             <view class="box box-step2" v-if="step2">
                 <view class="b-card">
@@ -1100,7 +1095,7 @@ const closeDiaAdd = () => { dialogInfoTradingAdd.value = false }
 
 // 提交确认逻辑
 const submitConfirm = () => {
-    console.log(params,121212);
+    console.log(params, 121212);
     // 原 openDontActive 逻辑,先判断活动冲突,然后打开确认弹窗
     if (!tableData4Flag.value && !tableData4TwoFlag.value && !tableDataNewListFlag.value &&
         (country.value != 'CN' || (country.value == 'CN' && (ACCType.value == 1 || ACCType.value == 2 || ACCType.value == 7))) &&
@@ -1470,7 +1465,6 @@ onLoad(() => {
 @import "@/uni.scss";
 
 .custom-deposit {
-    min-height: 100vh;
 
     .crm-title-box {
         margin-bottom: px2rpx(20);

+ 126 - 62
pages/customer/withdrawal.vue

@@ -1,11 +1,7 @@
 <template>
   <cwg-page-wrapper class="create-page" :isHeaderFixed="true">
+    <cwg-header :title="t('Custom.Withdraw.Title')" />
     <view class="custom-withdraw">
-      <!-- 标题 -->
-      <!-- <view class="crm-title-box">
-        <text class="tit">{{ t('Custom.Withdraw.Title') }}</text>
-      </view> -->
-
       <!-- 步骤1:选择账户 -->
       <view class="box box-step1">
         <view class="b-card">
@@ -65,7 +61,7 @@
 
                 <!-- 电子钱包地址输入 -->
                 <uni-col :xs="24" :sm="24" :md="12" :lg="8" :xl="8"
-                  v-if="['CHANNEL_TYPE_WALLET', 'UCARD_WALLET', 'CHANNEL_TYPE_ALI_WALLET'].includes(channelData.type)">
+                  v-if="['CHANNEL_TYPE_WALLET', 'CHANNEL_TYPE_ALI_WALLET'].includes(channelData.type)">
                   <uni-forms-item :label="getWalletLabel">
                     <uni-easyinput :clearable="false" v-model="form.address" :placeholder="t('placeholder.input')" />
                   </uni-forms-item>
@@ -185,7 +181,6 @@
                     </uni-col>
                   </uni-row>
                 </uni-col>
-
                 <!-- 出金金额 -->
                 <uni-col :xs="24" :sm="24" :md="12" :lg="8" :xl="8" v-if="channelData.type !== 'BANK_TELEGRAPHIC'">
                   <uni-forms-item :label="t('Custom.Withdraw.Title3') + '(' + channelData.currency + ')'">
@@ -205,25 +200,26 @@
                     </uni-forms-item>
                   </uni-col>
                 </template>
-
               </uni-row>
-
               <!-- 协议同意 -->
               <view class="agree">
-                <label class="checkbox">
-                  <checkbox :checked="form.agree2" @click="form.agree2 = !form.agree2" />
-                  <text class="crm-cursor" style="text-decoration: underline;" @click="dialogCheckTip = true">{{
-                    t('Custom.Withdraw.Des') }}</text>
-                </label>
+                <checkbox-group :value="form.agree2 ? ['1'] : []" @change="onAgreeChange('agree2', $event)">
+                  <label class="checkbox">
+                    <checkbox value="1" />
+                    <text class="crm-cursor" style="text-decoration: underline;" @click="dialogCheckTip = true">{{
+                      t('Custom.Withdraw.Des') }}</text>
+                  </label>
+                </checkbox-group>
               </view>
               <view class="agree" v-if="dialogTipsIsShow">
-                <label class="checkbox">
-                  <checkbox :checked="form.agree3" @click="form.agree3 = !form.agree3" />
-                  <text>* {{ t('Custom.Withdraw.item1') }}<br>{{ t('Custom.Withdraw.item1_1') }}<br>{{
-                    t('Custom.Withdraw.item1_2') }}</text>
-                </label>
+                <checkbox-group :value="form.agree3 ? ['1'] : []" @change="onAgreeChange('agree3', $event)">
+                  <label class="checkbox">
+                    <checkbox value="1" />
+                    <text>* {{ t('Custom.Withdraw.item1') }}<br>{{ t('Custom.Withdraw.item1_1') }}<br>{{
+                      t('Custom.Withdraw.item1_2') }}</text>
+                  </label>
+                </checkbox-group>
               </view>
-
               <button class="s-btn" type="primary" @click="openTips">{{ t('Btn.Submit') }}</button>
             </uni-forms>
           </view>
@@ -310,10 +306,7 @@
           </view>
         </view>
       </uni-popup>
-
-      <!-- 抽屉:新增/修改银行信息 -->
-      <!-- <drawer :dialogInfoTradingAdd="dialogInfoTradingAdd" :addType="openType" @closeAdd="closeAdd"
-      @confirmToReload="confirmToReload" /> -->
+      <add-bank-dialog ref="addBankDialogRef" @success="addSuccess" />
     </view>
   </cwg-page-wrapper>
 
@@ -328,7 +321,7 @@ import { financialApi } from '@/service/financial'
 // import {ServiceA} from '@/service/activity'
 import Config from '@/config/index'
 import Decimal from 'decimal.js'
-// import Drawer from '@/components/Drawer.vue' // 假设抽屉组件已存在
+import AddBankDialog from '@/components/AddBankDialog.vue';
 import PaymentMethodsList from './components/PaymentMethodsList.vue'
 
 const { t, locale } = useI18n()
@@ -345,21 +338,21 @@ const loginComboxOptions = computed(() => {
 const bankOptions = computed(() => {
   return bankDate.value.map((item, index) => ({
     text: isZh.value ? item.name : item.enName,
-    value: index
+    value: item.id
   }))
 })
 
 const digitalOptions = computed(() => {
   return ruleForm.bankBlockchain.map((item, index) => ({
     text: `${item.addressName}-${item.address}`,
-    value: index
+    value: item.id
   }))
 })
 
 const bankCardOptions = computed(() => {
   return bankList.value.map((item, index) => ({
     text: getBankLabel(item),
-    value: index
+    value: item.id
   }))
 })
 
@@ -413,7 +406,6 @@ const channelData = ref({})
 const introduce = ref({ introduce: '', enIntroduce: '' })
 const bankDate = ref([])
 const selectedBankIndex = ref(-1)
-const selectedBankLabel = ref('')
 const ruleForm = reactive({
   bankInfo: [],
   bankWrit: [],
@@ -447,12 +439,14 @@ const bankList = computed(() => {
   return []
 })
 const selectedBankCardIndex = ref(-1)
-const selectedBankCardLabel = ref('')
 const selectedDigitalIndex = ref(-1)
-const selectedDigitalLabel = ref('')
 const mAmount = reactive({ minAmount: '', maxAmount: '' })
 const FreeNumber = ref(0)
 const isFree = ref(false)
+const onAgreeChange = (key, e) => {
+  const vals = (e?.detail?.value) || []
+  form[key] = Array.isArray(vals) && vals.length > 0
+}
 const dialogTipsIsShow = ref(true)
 const dialogConfirmFee = ref(0)
 
@@ -606,8 +600,7 @@ const getBankInfo = async () => {
 const selectBankCard = (item) => {
   const index = bankList.value.findIndex(b => b.id === item.id)
   if (index !== -1) {
-    selectedBankCardIndex.value = index
-    selectedBankCardLabel.value = getBankLabel(item)
+    selectedBankCardIndex.value = item.id
     Object.assign(form, item)
   }
 }
@@ -615,8 +608,7 @@ const selectBankCard = (item) => {
 const selectDigital = (item) => {
   const index = ruleForm.bankBlockchain.findIndex(b => b.id === item.id)
   if (index !== -1) {
-    selectedDigitalIndex.value = index
-    selectedDigitalLabel.value = `${item.addressName}-${item.address}`
+    selectedDigitalIndex.value = item.id
     form.addressName = item.addressName
     form.address = item.address
     form.addressProve = item.addressProve
@@ -668,11 +660,8 @@ const showTable = () => {
   Object.assign(form, { currency: 'USD', amount: '', amount1: '', agree2: false, agree3: false, address: '', addressName: '', addressProve: '', bankUname: '', bankCardNum: '', bankName: '', bankBranchName: '', swiftCode: '', customBankCode: '', bankAddr: '', agencyNo: '', cpf: '' })
   if (bankDate.value.length) bankDate.value = []
   selectedBankIndex.value = -1
-  selectedBankLabel.value = ''
   selectedBankCardIndex.value = -1
-  selectedBankCardLabel.value = ''
   selectedDigitalIndex.value = -1
-  selectedDigitalLabel.value = ''
 }
 
 const isShowStep3 = (row) => {
@@ -721,11 +710,8 @@ const isShowStep3 = (row) => {
 }
 
 const onBankChange = (val) => {
-  const index = val
-  const item = bankDate.value[index]
+  const item = ruleForm.bankBlockchain.find(b => b.id === val)
   if (item) {
-    selectedBankIndex.value = index
-    selectedBankLabel.value = (t('lang') === 'cn' || t('lang') === 'zhHant') ? item.name : item.enName
     channelData.value.rate = item.rate
     channelData.value.transformCurrency = item.currency
     channelData.value.feeTypeBank = item.feeType
@@ -735,28 +721,18 @@ const onBankChange = (val) => {
 }
 
 const onBankCardChange = (val) => {
-  const index = val
-  const item = bankList.value[index]
-  if (item) {
-    selectedBankCardIndex.value = index
-    selectedBankCardLabel.value = getBankLabel(item)
-    Object.assign(form, item)
-  }
+  const item = ruleForm.bankBlockchain.find(b => b.id === val)
 }
 
 const onDigitalCurrencyChange = (val) => {
-  const index = val
-  const item = ruleForm.bankBlockchain[index]
+  const item = ruleForm.bankBlockchain.find(b => b.id === val)
   if (item && item.authStatus === 1) {
-    selectedDigitalIndex.value = index
-    selectedDigitalLabel.value = `${item.addressName}-${item.address}`
     form.addressName = item.addressName
     form.address = item.address
     form.addressProve = item.addressProve
   } else if (item && item.authStatus === 0) {
     uni.showToast({ title: t('Msg.item11'), icon: 'none' })
     selectedDigitalIndex.value = -1
-    selectedDigitalLabel.value = ''
   }
 }
 
@@ -787,12 +763,13 @@ const onAmountInput = (val) => {
 }
 
 const openTips = () => {
+
   // 校验
-  if (channelData.value.type === 'DIGITAL_CURRENCY' && !myId.value) {
+  if (channelData.value.type === 'DIGITAL_CURRENCY' && !selectedDigitalIndex.value) {
     uni.showToast({ title: t('blockchain.item11'), icon: 'none' })
     return
   }
-  if (['BANK', 'BANK_TELEGRAPHIC', 'CHANNEL_TYPE_CARD'].includes(channelData.value.type) && !selectedBankCardIndex.value !== -1) {
+  if (['BANK', 'BANK_TELEGRAPHIC', 'CHANNEL_TYPE_CARD'].includes(channelData.value.type) && !selectedBankCardIndex.value) {
     uni.showToast({ title: t('vaildate.withdrawBank.empty'), icon: 'none' })
     return
   }
@@ -809,6 +786,7 @@ const openTips = () => {
     uni.showToast({ title: t('vaildate.amount.format'), icon: 'none' })
     return
   }
+  console.log(form.agree2, form.agree3, dialogTipsIsShow.value, 111111)
   if (!form.agree2) {
     uni.showToast({ title: t('vaildate.agree.empty'), icon: 'none' })
     return
@@ -926,10 +904,98 @@ const submitCode = () => {
   submit()
 }
 
-const openAddBankCard = (type) => {
-  openType.value = type
-  dialogInfoTradingAdd.value = true
+// 新增银行信息
+const addBankDialogRef = ref(null);
+function openAddBankCard(type) {
+  console.log(type, 121212)
+  switch (type) {
+    case 'add_bankBlockchain':
+      openAddCrypto()
+      break;
+    case 'add_bankCard':
+      openAddUnionpay()
+      break;
+    case 'add_wireTransfer':
+      openAddBank()
+      break;
+    case 'add_CreditCard':
+      openAddCredit()
+      break;
+  }
+}
+function openAddCrypto() {
+  const wallets = bankCardOptions.value || []
+  // 1️⃣ 没有钱包
+  if (wallets.length === 0) {
+    addBankDialogRef.value?.open(4);
+    return;
+  }
+  // 2️⃣ 是否存在未认证钱包
+  const hasUnAuth = wallets.some(
+    item => item.authStatus === 0 || item.approveStatus === 1
+  );
+  if (hasUnAuth) {
+    uni.showToast({
+      title: "加密钱包未认证",
+      icon: "none"
+    });
+    return;
+  }
+  // 3️⃣ 是否达到上限
+  if (wallets.length >= 2) {
+    uni.showToast({
+      title: t('blockchain.item9'),
+      icon: "none"
+    });
+    return;
+  }
+  // 4️⃣ 正常打开
+  addBankDialogRef.value?.open(4);
 }
+function openAddUnionpay() {
+  const wallets = bankCardOptions.value || []
+  if (wallets.length === 0) {
+    addBankDialogRef.value?.open(1);
+    return;
+  }
+  if (wallets.length >= 2) {
+    uni.showToast({
+      title: t('Msg.UnionPayCARDS'),
+      icon: "none"
+    });
+    return;
+  }
+  addBankDialogRef.value?.open(1);
+}
+function openAddBank() {
+  const wallets = bankCardOptions.value || []
+  console.log(wallets, 121212)
+  if (wallets.length === 0) {
+    addBankDialogRef.value?.open(2);
+    return;
+  }
+  if (wallets.length >= 2) {
+    uni.showToast({
+      title: t('Msg.WireTransfers'),
+      icon: "none"
+    });
+    return;
+  }
+  addBankDialogRef.value?.open(2);
+}
+function openAddCredit() {
+  const wallets = bankCardOptions.value || []
+  if (wallets.length === 0) {
+    addBankDialogRef.value?.open(3);
+    return;
+  }
+  addBankDialogRef.value?.open(3);
+}
+// 新增银行信息成功回调
+const addSuccess = (e) => {
+  getBankInfo();
+}
+
 
 const closeAdd = (val) => {
   dialogInfoTradingAdd.value = val
@@ -982,8 +1048,6 @@ onUnmounted(() => {
 @import "@/uni.scss";
 
 .custom-withdraw {
-  background: var(--color-zinc-50);
-  min-height: 100vh;
 
   .box {
     margin-bottom: px2rpx(20);
@@ -1344,4 +1408,4 @@ onUnmounted(() => {
     }
   }
 }
-</style>
+</style>

+ 23 - 0
pages/ib/agent-transfer.vue

@@ -0,0 +1,23 @@
+<template>
+    <cwg-page-wrapper class="create-page" :isHeaderFixed="true">
+        <cwg-header :title="t('Home.page_ib.item9')" />
+        <view class="account-section">
+        </view>
+    </cwg-page-wrapper>
+</template>
+
+<script setup lang="ts">
+import { ref, reactive, computed, onMounted, onUnmounted } from 'vue'
+import { onLoad } from '@dcloudio/uni-app'
+import { useI18n } from 'vue-i18n' // uni-app 中已集成,但需配置
+import { customApi } from '@/service/custom'
+import { financialApi } from '@/service/financial'
+import Config from '@/config/index'
+import AddBankDialog from '@/components/AddBankDialog.vue';
+import PaymentMethodsList from './components/PaymentMethodsList.vue'
+const { t, locale } = useI18n()
+const isZh = computed(() => ['cn', 'zhHant'].includes(locale.value))
+</script>
+<style lang="scss" scoped>
+@import "@/uni.scss";
+</style>

+ 23 - 0
pages/ib/customer.vue

@@ -0,0 +1,23 @@
+<template>
+    <cwg-page-wrapper class="create-page" :isHeaderFixed="true">
+        <cwg-header :title="t('Home.page_ib.item2')" />
+        <view class="account-section">
+        </view>
+    </cwg-page-wrapper>
+</template>
+
+<script setup lang="ts">
+import { ref, reactive, computed, onMounted, onUnmounted } from 'vue'
+import { onLoad } from '@dcloudio/uni-app'
+import { useI18n } from 'vue-i18n' // uni-app 中已集成,但需配置
+import { customApi } from '@/service/custom'
+import { financialApi } from '@/service/financial'
+import Config from '@/config/index'
+import AddBankDialog from '@/components/AddBankDialog.vue';
+import PaymentMethodsList from './components/PaymentMethodsList.vue'
+const { t, locale } = useI18n()
+const isZh = computed(() => ['cn', 'zhHant'].includes(locale.value))
+</script>
+<style lang="scss" scoped>
+@import "@/uni.scss";
+</style>

+ 23 - 0
pages/ib/index.vue

@@ -0,0 +1,23 @@
+<template>
+    <cwg-page-wrapper class="create-page" :isHeaderFixed="true">
+        <cwg-header :title="t('Home.page_ib.item1')" />
+        <view class="account-section">
+        </view>
+    </cwg-page-wrapper>
+</template>
+
+<script setup lang="ts">
+import { ref, reactive, computed, onMounted, onUnmounted } from 'vue'
+import { onLoad } from '@dcloudio/uni-app'
+import { useI18n } from 'vue-i18n' // uni-app 中已集成,但需配置
+import { customApi } from '@/service/custom'
+import { financialApi } from '@/service/financial'
+import Config from '@/config/index'
+import AddBankDialog from '@/components/AddBankDialog.vue';
+import PaymentMethodsList from './components/PaymentMethodsList.vue'
+const { t, locale } = useI18n()
+const isZh = computed(() => ['cn', 'zhHant'].includes(locale.value))
+</script>
+<style lang="scss" scoped>
+@import "@/uni.scss";
+</style>

+ 23 - 0
pages/ib/recording.vue

@@ -0,0 +1,23 @@
+<template>
+    <cwg-page-wrapper class="create-page" :isHeaderFixed="true">
+        <cwg-header :title="t('Home.page_ib.item7')" />
+        <view class="account-section">
+        </view>
+    </cwg-page-wrapper>
+</template>
+
+<script setup lang="ts">
+import { ref, reactive, computed, onMounted, onUnmounted } from 'vue'
+import { onLoad } from '@dcloudio/uni-app'
+import { useI18n } from 'vue-i18n' // uni-app 中已集成,但需配置
+import { customApi } from '@/service/custom'
+import { financialApi } from '@/service/financial'
+import Config from '@/config/index'
+import AddBankDialog from '@/components/AddBankDialog.vue';
+import PaymentMethodsList from './components/PaymentMethodsList.vue'
+const { t, locale } = useI18n()
+const isZh = computed(() => ['cn', 'zhHant'].includes(locale.value))
+</script>
+<style lang="scss" scoped>
+@import "@/uni.scss";
+</style>

+ 23 - 0
pages/ib/report.vue

@@ -0,0 +1,23 @@
+<template>
+    <cwg-page-wrapper class="create-page" :isHeaderFixed="true">
+        <cwg-header :title="t('Home.page_ib.item3')" />
+        <view class="account-section">
+        </view>
+    </cwg-page-wrapper>
+</template>
+
+<script setup lang="ts">
+import { ref, reactive, computed, onMounted, onUnmounted } from 'vue'
+import { onLoad } from '@dcloudio/uni-app'
+import { useI18n } from 'vue-i18n' // uni-app 中已集成,但需配置
+import { customApi } from '@/service/custom'
+import { financialApi } from '@/service/financial'
+import Config from '@/config/index'
+import AddBankDialog from '@/components/AddBankDialog.vue';
+import PaymentMethodsList from './components/PaymentMethodsList.vue'
+const { t, locale } = useI18n()
+const isZh = computed(() => ['cn', 'zhHant'].includes(locale.value))
+</script>
+<style lang="scss" scoped>
+@import "@/uni.scss";
+</style>

+ 23 - 0
pages/ib/transfer.vue

@@ -0,0 +1,23 @@
+<template>
+    <cwg-page-wrapper class="create-page" :isHeaderFixed="true">
+        <cwg-header :title="t('Home.page_ib.item4')" />
+        <view class="account-section">
+        </view>
+    </cwg-page-wrapper>
+</template>
+
+<script setup lang="ts">
+import { ref, reactive, computed, onMounted, onUnmounted } from 'vue'
+import { onLoad } from '@dcloudio/uni-app'
+import { useI18n } from 'vue-i18n' // uni-app 中已集成,但需配置
+import { customApi } from '@/service/custom'
+import { financialApi } from '@/service/financial'
+import Config from '@/config/index'
+import AddBankDialog from '@/components/AddBankDialog.vue';
+import PaymentMethodsList from './components/PaymentMethodsList.vue'
+const { t, locale } = useI18n()
+const isZh = computed(() => ['cn', 'zhHant'].includes(locale.value))
+</script>
+<style lang="scss" scoped>
+@import "@/uni.scss";
+</style>

+ 23 - 0
pages/ib/withdraw.vue

@@ -0,0 +1,23 @@
+<template>
+    <cwg-page-wrapper class="create-page" :isHeaderFixed="true">
+        <cwg-header :title="t('Home.page_ib.item5')" />
+        <view class="account-section">
+        </view>
+    </cwg-page-wrapper>
+</template>
+
+<script setup lang="ts">
+import { ref, reactive, computed, onMounted, onUnmounted } from 'vue'
+import { onLoad } from '@dcloudio/uni-app'
+import { useI18n } from 'vue-i18n' // uni-app 中已集成,但需配置
+import { customApi } from '@/service/custom'
+import { financialApi } from '@/service/financial'
+import Config from '@/config/index'
+import AddBankDialog from '@/components/AddBankDialog.vue';
+import PaymentMethodsList from './components/PaymentMethodsList.vue'
+const { t, locale } = useI18n()
+const isZh = computed(() => ['cn', 'zhHant'].includes(locale.value))
+</script>
+<style lang="scss" scoped>
+@import "@/uni.scss";
+</style>

+ 1 - 1
pages/mine/components/BankInfoTab.vue

@@ -362,7 +362,7 @@ import { useI18n } from 'vue-i18n';
 import { personalApi } from '@/service/personal';
 import KycAuthDialog from './KycAuthDialog.vue';
 import CardAuthDialog from './CardAuthDialog.vue';
-import AddBankDialog from './AddBankDialog.vue';
+import AddBankDialog from '@/components/AddBankDialog.vue';
 import config from '@/config'
 import { BankType } from './bank'
 const { t, locale } = useI18n();

+ 4 - 0
static/scss/global/global.scss

@@ -259,6 +259,10 @@ body {
     color: #000;
 }
 
+.uni-top-window {
+    overflow: visible;
+}
+
 uni-left-window {
     position: fixed;
     top: px2rpx(56);

+ 2 - 5
utils/request.js

@@ -1,9 +1,6 @@
 // 基础配置
 import { showLoading, hideLoading } from '@/hooks/useLoading'
 import config1 from "@/config";
-// const baseUrl = "https://ucard.cwgrd.com";
-// const baseUrl = "https://ucard.44a5c8109e4.com";
-// const baseUrl = "http://192.168.0.18:8700";
 const baseUrl = config1.Host85;
 const timeout = 10000;
 // 不加loading
@@ -131,8 +128,8 @@ const errorHandler = (error) => {
 
 // 核心请求函数
 export const request = (options) => {
-  const host = config1[options.type || 'Host85'] || '';
-  // const host = config1[options.type || 'Host80'] || '';
+  // const host = config1[options.type || 'Host85'] || '';
+  const host = config1[options.type || 'Host80'] || '';
   // 合并配置
   const config = {
     ...options,

+ 15 - 8
windows/left-window.vue

@@ -40,19 +40,26 @@ const menu = ref<MenuItem[]>([
         isOpenMenu: false, submenuHeight: 0,
         path: '/pages/customer/index', label: 'Home.msg.Custom', icon: 'crm-house',
         children: [
-            { path: '/pages/customer/index', label: 'Client Zone', icon: 'icon-client' },
-            { path: '/pages/customer/promotion', label: 'Promotion Center', icon: 'icon-promotion' },
-            { path: '/pages/customer/deposit', label: 'Deposit', icon: 'icon-deposit' },
-            { path: '/pages/customer/withdrawal', label: 'Withdrawal', icon: 'icon-withdrawal' },
-            { path: '/pages/customer/payment-history', label: 'Payment History', icon: 'icon-payment' },
-            { path: '/pages/customer/transfer', label: 'Internal Transfer', icon: 'icon-transfer' },
-            { path: '/pages/customer/recording-history', label: 'Application History', icon: 'icon-application' }
+            { path: '/pages/customer/index', label: 'Custom.Index.AccountList', icon: 'icon-client' },
+            { path: '/pages/customer/deposit', label: 'Home.page_customer.item2', icon: 'icon-deposit' },
+            { path: '/pages/customer/withdrawal', label: 'Home.page_customer.item3', icon: 'icon-withdrawal' },
+            { path: '/pages/customer/payment-history', label: 'Home.page_customer.item4', icon: 'icon-payment' },
+            { path: '/pages/customer/transfer', label: 'Home.page_customer.item5', icon: 'icon-transfer' },
+            { path: '/pages/customer/recording-history', label: 'Home.page_customer.item7', icon: 'icon-application' }
         ]
     },
     {
         isOpenMenu: false,
         path: '/pages/customer/promotion', label: 'Home.msg.Ib', icon: 'crm-users',
-        children: []
+        children: [
+            { path: '/pages/ib/index', label: 'Home.page_ib.item1', icon: 'icon-client' },
+            { path: '/pages/ib/customer', label: 'Home.page_ib.item2', icon: 'icon-deposit' },
+            { path: '/pages/ib/report', label: 'Home.page_ib.item3', icon: 'icon-withdrawal' },
+            { path: '/pages/ib/transfer', label: 'Home.page_ib.item4', icon: 'icon-payment' },
+            { path: '/pages/ib/withdraw', label: 'Home.page_ib.item5', icon: 'icon-transfer' },
+            { path: '/pages/ib/agent-transfer', label: 'Home.page_ib.item9', icon: 'icon-transfer' },
+            { path: '/pages/ib/recording', label: 'Home.page_ib.item7', icon: 'icon-application' }
+        ]
     },
     {
         path: '/pages/customer/deposit', isOpenMenu: false, label: 'Documentary.title', icon: 'crm-chart-area',

+ 3 - 6
windows/top-window.vue

@@ -4,12 +4,8 @@
 			<image class="left-img" src="/static/images/logo.png" mode="widthFix" alt="logo" @click="openLeftDrawer" />
 		</div>
 		<div class="right">
-			<div class="lang-select">
-				<image class="img flag" src="/static/flag-en.png" alt="en" />
-				<text>English</text>
-				<text class="arrow">▼</text>
-			</div>
-			<text class="icon sun" @click="toggleTheme">🌞</text>
+			<LanguageDropdown />
+			<!-- <text class="icon sun" @click="toggleTheme">🌞</text> -->
 			<text class="icon bell">🔔<text class="dot"></text></text>
 			<text class="icon avatar">
 				<image class="img" src="/static/avatar.png" alt="avatar" />
@@ -25,6 +21,7 @@
 // import useGlobalStore from '@/stores/use-global-store'
 // const globalStore = useGlobalStore()
 import useRouter from "@/hooks/useRouter";
+import LanguageDropdown from "@/components/LanguageDropdown.vue";
 const router = useRouter();
 const props = defineProps({
 	sidebarVisible: {