zhb 2 ヶ月 前
コミット
5bffc61de1

+ 221 - 0
components/cwg-email-code-popup.vue

@@ -0,0 +1,221 @@
+<template>
+  <cwg-popup v-model:visible="visible" type="center" :mask-click="false" :show-footers="true"
+    :title="t('signup.form.code')">
+    <view class="popup-content">
+      <view class="card-handle-dialog-content">
+        <uni-forms ref="formRef1" :model="form" :rules="rules" label-position="top" validate-trigger="submit"
+          :label-width="200" class="base-info-form">
+          <view class="code-input-wrapper">
+            <view class="code-input">
+              <uni-forms-item :label="t('signup.form.code')" name="emailCode">
+                <uni-easyinput type="number" v-model="form.emailCode" :placeholder="t('signup.form.code')" />
+              </uni-forms-item>
+            </view>
+            <view class="get-code-btn">
+              <view class="cwg-button ok-button">
+                <button type="primary" block :disabled="!canSend || isLoading" @click="handleGetCode">{{
+                  getCodeString
+                }}</button>
+              </view>
+            </view>
+          </view>
+        </uni-forms>
+      </view>
+    </view>
+
+    <template #footer>
+      <button @click="visible = false">{{ t('Btn.Cancel') }}</button>
+      <button type="primary" @click="tosubmitConfirm">{{ t('Btn.Confirm') }}</button>
+    </template>
+  </cwg-popup>
+</template>
+
+<script setup lang="ts">
+import { ref, computed, onBeforeUnmount } from "vue";
+import { showToast } from "@/utils/toast";
+import { useI18n } from "vue-i18n";
+import { useEmailCountdown } from '@/hooks/useEmailCountdown';
+const {
+  time,
+  text: getCodeString,
+  canSend,
+  start,
+  restore
+} = useEmailCountdown({ storageKey: 'emailCodeTimer' })
+const { t } = useI18n();
+const props = defineProps({
+  visible: {
+    type: Boolean,
+    default: false
+  },
+  email: {
+    type: String,
+    default: ''
+  },
+  country: {
+    type: String,
+    default: ''
+  },
+  api: {
+    type: Function,
+    default: () => { }
+  }
+});
+
+
+const emit = defineEmits(['update:visible', 'confirm']);
+
+// Watch for changes in visible prop and emit update event
+const visible = computed({
+  get: () => props.visible,
+  set: (value: boolean) => emit('update:visible', value)
+});
+
+const formRef1 = ref(null);
+const isLoading = ref(false);
+const form = ref<{
+  emailCode: string;
+}>({
+  emailCode: "",
+});
+
+
+const rules = computed(() => ({
+  emailCode: {
+    rules: [
+      {
+        required: true,
+        errorMessage: t('vaildate.code.empty'),
+      },
+      {
+        validateFunction: (rule, value, data, callback) => {
+          // 空值处理:直接报格式错误
+          if (!value) {
+            callback(t('vaildate.code.empty'))
+            return false
+          }
+          if (!/^\d{6}$/.test(value)) {
+            callback(t('vaildate.code.empty'))
+            return false
+          }
+          return true
+        },
+      },
+    ],
+  },
+}))
+
+// 发送邮箱验证码
+async function sendEmailCode() {
+  try {
+    isLoading.value = true;
+    const res = await props.api({
+      email: props.email || undefined,
+      country: props.country || undefined
+    });
+
+    if (res.code === 200) {
+      showToast(t("Msg.CodeSuccess"));
+      start();
+      return true;
+    } else {
+      showToast(t("Msg.CodeFail"));
+      return false;
+    }
+  } catch (error: any) {
+    showToast(t("Msg.CodeFail"));
+    return false;
+  } finally {
+    isLoading.value = false;
+  }
+}
+
+// 获取验证码按钮点击
+async function handleGetCode() {
+  if (!canSend.value || isLoading.value) {
+    return;
+  }
+  await sendEmailCode();
+}
+
+// 确认提交
+const tosubmitConfirm = async () => {
+  if (formRef1.value) {
+    try {
+      await formRef1.value.validate();
+      visible.value = false;
+      console.log(form.value.emailCode, 12121);
+
+      emit('confirm', form.value.emailCode);
+    } catch (error) {
+      if (error instanceof Array) {
+        showToast(error[0].errorMessage);
+        return
+      } else {
+        showToast(t("Msg.CodeFail"));
+      }
+
+    }
+  }
+}
+
+// 组件卸载时恢复倒计时
+onBeforeUnmount(() => {
+  restore();
+});
+</script>
+
+<style scoped lang="scss">
+@import "@/uni.scss";
+
+.popup-content {
+  width: 100%;
+}
+
+.card-handle-dialog-content {
+  width: 100%;
+
+  .code-input-label {
+    font-size: px2rpx(16);
+    line-height: px2rpx(44);
+    letter-spacing: px2rpx(1);
+    color: #474747;
+  }
+
+  .code-input-wrapper {
+    position: relative;
+    display: flex;
+    align-items: flex-end;
+    gap: px2rpx(10);
+  }
+
+  .code-input {
+    flex: 1;
+  }
+
+  .get-code-btn {
+    min-width: px2rpx(120);
+    display: flex;
+    align-items: flex-end;
+    margin-bottom: px2rpx(16);
+
+    button {
+      border-radius: px2rpx(8);
+      font-size: px2rpx(14);
+      height: 100%;
+      min-height: px2rpx(35);
+    }
+  }
+
+  /* 移动端适配 */
+  @media screen and (max-width: 750px) {}
+
+  :deep(.uni-forms-item) {
+    margin-bottom: px2rpx(16);
+  }
+
+  :deep(.uni-easyinput) {
+    border-radius: px2rpx(8);
+  }
+}
+</style>

+ 1 - 0
components/cwg-label-line-value.vue

@@ -3,6 +3,7 @@
         <view class="label">{{ label }}</view>
         <view class="label">{{ label }}</view>
         <view class="line"></view>
         <view class="line"></view>
         <view class="value">
         <view class="value">
+            <slot name="operation1" />
             <view>{{ value }}</view>
             <view>{{ value }}</view>
             <slot name="operation" />
             <slot name="operation" />
         </view>
         </view>

+ 53 - 0
components/cwg-tips-popup.vue

@@ -0,0 +1,53 @@
+<template>
+    <cwg-popup v-model:visible="visible" type="center" :mask-click="false" :show-footers="true">
+        <view class="popup-content">
+            <view v-if="content" class="des1" style="font-size: 16px; line-height: 1.6; margin: 30px 0 50px" v-t="content"/>
+            <view v-else class="des1" style="font-size: 16px; line-height: 1.6; margin: 30px 0 50px" v-t="content"></view>
+            <rich-text class="popup-text" :nodes="introduce"></rich-text>
+        </view>
+        <template #footer>
+            <button @click="visible = false">{{ t('Btn.Cancel') }}</button>
+            <button type="primary" @click="tosubmitConfirm">{{ t('Btn.Confirm') }}</button>
+        </template>
+    </cwg-popup>
+</template>
+
+<script setup>
+import { computed } from 'vue';
+import { useI18n } from 'vue-i18n';
+
+const props = defineProps({
+    visible: {
+        type: Boolean,
+        default: false
+    },
+    // 弹窗内容
+    content: {
+        type: String,
+        default: ''
+    },
+    // 弹窗富文本内容
+    introduce: {
+        type: String,
+        default: ''
+    },
+});
+
+const emit = defineEmits(['update:visible', 'confirm']);
+
+const { t } = useI18n();
+
+// Watch for changes in visible prop and emit update event
+const visible = computed({
+    get: () => props.visible,
+    set: (value) => emit('update:visible', value)
+});
+const tosubmitConfirm = () => {
+    visible.value = false;
+    emit('confirm');
+}
+</script>
+
+<style lang="scss" scoped>
+
+</style>

+ 69 - 8
pages/analytics/analystViews.vue

@@ -1,22 +1,83 @@
 <template>
 <template>
     <cwg-page-wrapper class="create-page" :isHeaderFixed="true">
     <cwg-page-wrapper class="create-page" :isHeaderFixed="true">
-        <cwg-header :title="t('Home.page_ib.item9')" />
+        <cwg-header :title="t('News.Announcement')" />
+        <cwg-asset-tabs v-model="activeTab" :tabs="tabsConfig" />
         <view class="account-section">
         <view class="account-section">
+            <List ref="newsList" :fetchData="fetchNewsList" :queryParams="queryParams" :type="type" />
         </view>
         </view>
     </cwg-page-wrapper>
     </cwg-page-wrapper>
 </template>
 </template>
 
 
 <script setup lang="ts">
 <script setup lang="ts">
-import { ref, reactive, computed, onMounted, onUnmounted } from 'vue'
-import { onLoad } from '@dcloudio/uni-app'
+import { ref, reactive, computed, onMounted, onUnmounted, watch, nextTick } from 'vue'
+import { onLoad, onReachBottom } from '@dcloudio/uni-app'
 import { useI18n } from 'vue-i18n' // 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'
+import { newsApi } from '@/service/news'
+import List from './components/List.vue'
 const { t, locale } = useI18n()
 const { t, locale } = useI18n()
 const isZh = computed(() => ['cn', 'zhHant'].includes(locale.value))
 const isZh = computed(() => ['cn', 'zhHant'].includes(locale.value))
+const newsList = ref(null)
+const fetchNewsList = ref(null)
+const queryParams = ref({
+    tag: 4,
+    endDate: "",
+    startDate: "",
+    id: null
+})
+const activeTab = ref(1)
+const tabsConfig = computed(() => [
+    { text: t('News.Announcement1'), value: 1, type: 3 },
+    { text: t('News.CompanyNews'), value: 2, type: 5 },
+])
+
+
+onReachBottom(() => {
+    newsList.value?.loadMore()
+})
+// const lang = computed(() => uni.getLocale())
+const type = ref(0)
+// watch(lang, (val) => {
+//     if (activeTab.value == 1) {
+//         const langMap = {
+//             'zh-Hans': 'cn',
+//             'zh-Hant': 'zhHant',
+//             'vn': 'vi'
+//         }
+//         queryParams.value = {
+//             tag: null,
+//             endDate: '',
+//             startDate: '',
+//             id: null,
+//             pageSize: 18,
+//             lang: langMap[val] || val
+//         }
+//     }
+// })
+watch(activeTab, (val) => {
+    if (val == 1) {
+        fetchNewsList.value = newsApi.newsInformationList
+        queryParams.value = {
+            tag: null,
+            endDate: '',
+            startDate: '',
+            id: null,
+            pageSize: 18
+        }
+    } else {
+        fetchNewsList.value = newsApi.newsInformationNewsletterList
+        queryParams.value = {
+            tag: 4,
+            endDate: '',
+            startDate: '',
+            id: null,
+            pageSize: 9
+        }
+    }
+    type.value = tabsConfig.value.find(item => item.value == val).type
+    nextTick(() => {
+        newsList.value.load()
+    })
+}, { immediate: true })
 </script>
 </script>
 <style lang="scss" scoped>
 <style lang="scss" scoped>
 @import "@/uni.scss";
 @import "@/uni.scss";

+ 244 - 0
pages/analytics/components/List.vue

@@ -0,0 +1,244 @@
+<template>
+  <view class="news-list-container">
+    <!-- 列表 -->
+    <view v-if="list.length > 0" class="list">
+      <view v-for="item in list" :key="item.id" class="news-item" @click="handleItemClick(item)">
+        <image v-if="item.coverImage" class="cover" :src="Config.Host80 + item.coverImage" mode="aspectFill" />
+        <view class="info">
+          <view class="title">{{ item.title }}</view>
+          <view class="subtitle">{{ item.subTitle }}</view>
+          <view class="meta">
+            <text class="date">{{ formatDate(item.deliveryTime) }}</text>
+            <!-- <text v-if="item.tags && item.tags.length" class="tag">
+              {{ getTagName(item.tags[0].tag) }}
+            </text> -->
+          </view>
+        </view>
+      </view>
+    </view>
+
+    <!-- 空状态 -->
+    <view v-else-if="!loading && finished" class="empty">
+      <cwg-empty-state />
+    </view>
+
+    <!-- 加载更多状态 -->
+    <view v-if="loadingMore" class="load-more">
+      <text v-t11="'common.loading'" />
+    </view>
+    <view v-else-if="finished && list.length > 0" class="load-more">
+      <text v-t11="'common.noMore'" />
+    </view>
+  </view>
+</template>
+
+<script setup>
+import { ref, watch, computed } from 'vue'
+import { useI18n } from 'vue-i18n'
+import Config from '@/config/index'
+const { locale } = useI18n()
+
+const props = defineProps({
+  fetchData: { type: Function, required: true },
+  queryParams: { type: Object, default: () => ({}) },   // 修正:应为对象
+  pageSize: { type: Number, default: 10 },
+  type: { type: Number, default: 0 },
+  immediate: { type: Boolean, default: true },
+})
+
+const list = ref([])
+const page = ref(1)
+const loading = ref(false)
+const loadingMore = ref(false)
+const finished = ref(false)
+const total = ref(0)
+const formatDate = (dateStr) => {
+  if (!dateStr) return ''
+  return dateStr.slice(0, 10).replace('T', ' ')
+}
+
+const load = async () => {
+  if (loading.value) return
+  loading.value = true
+  finished.value = false
+  page.value = 1
+  console.log('load 请求参数', {
+    lang: locale.value == 'vn' ? 'vi' : locale.value,
+    page: { current: page.value, row: props.queryParams?.pageSize || props.pageSize },
+    ...props.queryParams
+  })
+
+  try {
+    const res = await props.fetchData({
+      lang: locale.value == 'vn' ? 'vi' : locale.value,
+      page: { current: page.value, row: props.queryParams?.pageSize || props.pageSize },
+      ...props.queryParams
+    })
+    if (res.code === 200) {
+      list.value = res.data || []
+      total.value = res.page?.rowTotal || 0
+      finished.value = list.value.length >= total.value
+    } else {
+      throw new Error(res.msg || '请求失败')
+    }
+  } catch (err) {
+    console.error('加载失败', err)
+    uni.showToast({ title: err.message || '加载失败', icon: 'none' })
+  } finally {
+    loading.value = false
+  }
+}
+
+const loadMore = async () => {
+  if (loadingMore.value || finished.value) return
+  loadingMore.value = true
+  try {
+    const nextPage = page.value + 1
+    const params = {
+      lang: locale.value,
+      page: { current: nextPage, row: props.queryParams?.pageSize || props.pageSize },
+      ...props.queryParams
+    }
+    console.log('loadMore 请求参数', params)  // ① 查看请求参数
+
+    const res = await props.fetchData(params)
+    console.log('loadMore 响应结果', res)      // ② 查看完整响应
+
+    if (res.code === 200) {
+      const newList = res.data || []
+      console.log('newList 长度', newList.length, newList) // ③ 查看新数据
+
+      if (newList.length > 0) {
+        list.value.push(...newList)
+        page.value = nextPage
+        console.log('当前列表长度', list.value.length)
+      }
+      // 更新 finished 状态
+      const totalRows = res.page?.rowTotal || total.value
+      finished.value = list.value.length >= totalRows
+      console.log('finished', finished.value, '总条数', totalRows)
+    } else {
+      throw new Error(res.msg || '请求失败')
+    }
+  } catch (err) {
+    console.error('加载更多失败', err)
+    uni.showToast({ title: err.message || '加载更多失败', icon: 'none' })
+  } finally {
+    loadingMore.value = false
+  }
+}
+const handleItemClick = (item) => {
+  uni.navigateTo({ url: `/pages/analytics/detail?type=${props.type}&id=${item.id}` })
+}
+const lang = computed(() => uni.getLocale())
+watch(lang, (val) => {
+  console.log('lang 变化', val)
+  load()
+}, { immediate: true })
+defineExpose({ load, loadMore })
+</script>
+<style lang="scss" scoped>
+@import "@/uni.scss";
+
+.news-list-container {
+  .list {
+    display: grid;
+    grid-row-gap: px2rpx(16);
+    grid-column-gap: px2rpx(24);
+    grid-template-columns: repeat(auto-fill, minmax(px2rpx(389), 1fr));
+  }
+
+  .news-item {
+    display: flex;
+    flex-wrap: wrap;
+    justify-content: center;
+    padding: px2rpx(20);
+    gap: px2rpx(10);
+    margin-bottom: px2rpx(10);
+    background: #fafafa;
+    border-radius: px2rpx(8);
+    overflow: hidden;
+    box-shadow: 0 2rpx px2rpx(4) rgba(0, 0, 0, 0.05);
+    box-sizing: border-box;
+    cursor: pointer;
+
+    // 添加过渡效果
+    transition: all 0.3s ease;
+
+    // 鼠标悬浮时的动效
+    &:hover {
+      transform: translateY(-4rpx);
+      box-shadow: 0 8rpx px2rpx(16) rgba(0, 0, 0, 0.1);
+      background: #fff;
+    }
+
+    .cover {
+      aspect-ratio: 359 / 242;
+      width: px2rpx(359);
+      height: auto;
+      border: 1px solid rgba(14, 15, 12, 0.12);
+      border-radius: px2rpx(8);
+    }
+
+    .info {
+      flex: 1;
+      display: flex;
+      flex-direction: column;
+      justify-content: space-between;
+    }
+
+    .title {
+      font-size: px2rpx(16);
+      font-weight: bold;
+      color: #333;
+      line-height: 1.4;
+      margin-bottom: px2rpx(6);
+      display: -webkit-box;
+      -webkit-box-orient: vertical;
+      -webkit-line-clamp: 2;
+      overflow: hidden;
+    }
+
+    .subtitle {
+      font-size: px2rpx(14);
+      color: #666;
+      line-height: 1.4;
+      display: -webkit-box;
+      -webkit-box-orient: vertical;
+      -webkit-line-clamp: 2;
+      overflow: hidden;
+      margin-bottom: px2rpx(6);
+    }
+
+    .meta {
+      display: flex;
+      justify-content: space-between;
+      align-items: center;
+      font-size: px2rpx(12);
+      color: #999;
+    }
+  }
+
+
+}
+
+
+
+
+
+
+
+.load-more {
+  text-align: center;
+  padding: px2rpx(10);
+  font-size: px2rpx(14);
+  color: #999;
+}
+
+.empty {
+  text-align: center;
+  padding: 100rpx 0;
+  color: #999;
+  font-size: px2rpx(10);
+}
+</style>

+ 51 - 8
pages/analytics/news.vue

@@ -1,23 +1,66 @@
 <template>
 <template>
     <cwg-page-wrapper class="create-page" :isHeaderFixed="true">
     <cwg-page-wrapper class="create-page" :isHeaderFixed="true">
-        <cwg-header :title="t('Home.page_ib.item9')" />
+        <cwg-header :title="t('News.NewsInformation')" />
+        <cwg-asset-tabs v-model="activeTab" :tabs="tabsConfig" />
         <view class="account-section">
         <view class="account-section">
+            <List ref="newsList" :fetchData="fetchNewsList" :queryParams="queryParams" :type="type" />
         </view>
         </view>
     </cwg-page-wrapper>
     </cwg-page-wrapper>
 </template>
 </template>
 
 
 <script setup lang="ts">
 <script setup lang="ts">
-import { ref, reactive, computed, onMounted, onUnmounted } from 'vue'
-import { onLoad } from '@dcloudio/uni-app'
+import { ref, reactive, computed, onMounted, onUnmounted, watch, nextTick } from 'vue'
+import { onLoad, onReachBottom } from '@dcloudio/uni-app'
 import { useI18n } from 'vue-i18n' // 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'
+import { newsApi } from '@/service/news'
+import List from './components/List.vue'
 const { t, locale } = useI18n()
 const { t, locale } = useI18n()
 const isZh = computed(() => ['cn', 'zhHant'].includes(locale.value))
 const isZh = computed(() => ['cn', 'zhHant'].includes(locale.value))
+const newsList = ref(null)
+const fetchNewsList = ref(null)
+const queryParams = ref({
+    tag: 3,
+    endDate: "",
+    startDate: "",
+    id: null
+})
+const activeTab = ref(1)
+const tabsConfig = computed(() => [
+    { text: t('News.ExpertAnalysis'), value: 1, type: 5 },
+    { text: t('News.Ebook'), value: 2, type: 10 },
+])
+onReachBottom(() => {
+    newsList.value?.loadMore()
+})
+const type = ref(0)
+watch(activeTab, (val) => {
+    if (val == 1) {
+        fetchNewsList.value = newsApi.newsInformationNewsletterList
+        queryParams.value = {
+            tag: 3,
+            endDate: '',
+            startDate: '',
+            id: null, pageSize: 9
+        }
+    } else {
+        fetchNewsList.value = newsApi.newsEbookList
+        queryParams.value = {
+            tag: null,
+            endDate: '',
+            startDate: '',
+            id: null, pageSize: 12
+        }
+    }
+    type.value = tabsConfig.value.find(item => item.value == val).type
+    nextTick(() => {
+        newsList.value.load()
+    })
+}, { immediate: true })
 </script>
 </script>
 <style lang="scss" scoped>
 <style lang="scss" scoped>
 @import "@/uni.scss";
 @import "@/uni.scss";
+
+.create-page {
+    padding: px2rpx(20);
+}
 </style>
 </style>

+ 1 - 1
pages/customer/components/cwg-check-confirm-popup.vue → pages/customer/components/DepositCheckConfirmPopup.vue

@@ -1,5 +1,5 @@
 <template>
 <template>
-  <cwg-popup v-model:visible="visible" type="center" :mask-click="false" :showFooters="true" :showClose="false">
+  <cwg-popup v-model:visible="visible" type="center" :mask-click="false" :showFooters="true" :showClose="false" :title="t('Home.page_customer.item2')">
     <view class="popup-content">
     <view class="popup-content">
       <view class="info-section">
       <view class="info-section">
         <cwg-label-line-value :label="t('Custom.Deposit.Title1')" :value="login" v-if="login" />
         <cwg-label-line-value :label="t('Custom.Deposit.Title1')" :value="login" v-if="login" />

+ 235 - 0
pages/customer/components/WithdrawCheckConfirmPopup.vue

@@ -0,0 +1,235 @@
+<template>
+  <cwg-popup v-model:visible="visible" type="center" :mask-click="false" :showFooters="true" :showClose="false"
+    :title="t('Home.page_customer.item3')">
+    <view class="popup-content">
+      <view class="info-section">
+        <cwg-label-line-value :label="t('Custom.Deposit.Title11')" :value="login" v-if="login" />
+        <cwg-label-line-value :label="t('Custom.Deposit.Title22')"
+          :value="locale == 'cn' ? channelData.name : channelData.enName" v-if="channelData.code" />
+        <cwg-label-line-value :label="t('news_add_field.Label.Title4')" :value="selectCodes" v-if="code" />
+        <cwg-label-line-value :label="t('Custom.Withdraw.Title3')" :value="params.amount + ' ' + channelData.currency"
+          v-if="params.amount" />
+        <cwg-label-line-value :label="t('Custom.Withdraw.item7')" :value="''">
+          <template #operation1>
+            <view v-if="FreeNumber > 0 && dialogCheckConfirm_form.feeAmount > 0">
+              <text style="text-decoration:line-through">
+                ${{
+                  dialogCheckConfirm_form.feeAmount
+                }}
+              </text>
+              &nbsp;&nbsp;
+              <text>
+                $0.00
+              </text>
+            </view>
+            <view v-else>${{ dialogCheckConfirm_form.feeAmount }}</view>
+          </template>
+        </cwg-label-line-value>
+      </view>
+    </view>
+    <template #footer>
+      <button @click="cancel">{{ t('Btn.Cancel') }}</button>
+      <button type="primary" @click="submit">{{ t('Btn.Confirm') }}</button>
+    </template>
+  </cwg-popup>
+</template>
+
+<script setup>
+import { ref, computed } from 'vue';
+import { useI18n } from 'vue-i18n';
+
+const props = defineProps({
+  visible: { type: Boolean, default: false },
+  login: String,
+  channelData: Object,
+  code: String,
+  selectCodes: String,
+  params: Object,
+  userName: String,
+  FreeNumber: Number,
+  dialogCheckConfirm_form: Object,
+  // 其他可能需要的 props
+});
+const emit = defineEmits(['update:visible', 'confirm', 'cancel']);
+const { t, locale } = useI18n();
+const visible = computed({
+  get: () => props.visible,
+  set: (value) => emit('update:visible', value)
+});
+
+const cancel = () => {
+  visible.value = false;
+  emit('cancel');
+};
+
+const submit = async () => {
+  visible.value = false;
+  emit('confirm');
+};
+</script>
+
+<style lang="scss" scoped>
+@import "@/uni.scss";
+
+.popup-content {
+  .info-section {
+    margin-bottom: px2rpx(24);
+    padding: px2rpx(20);
+    background-color: #f8f9fa;
+    border-radius: px2rpx(8);
+    border: 1px solid #e9ecef;
+
+    :deep(.cwg-label-line-value) {
+      margin-bottom: px2rpx(12);
+
+      &:last-child {
+        margin-bottom: 0;
+      }
+    }
+  }
+
+  .form-section {
+    margin-bottom: px2rpx(24);
+    padding: px2rpx(20);
+    background-color: #ffffff;
+    border-radius: px2rpx(8);
+    border: 1px solid #e9ecef;
+
+    :deep(.uni-forms) {
+      width: 100%;
+
+      :deep(.uni-forms-item) {
+        margin-bottom: px2rpx(16);
+
+        :deep(.uni-forms-item__label) {
+          font-size: px2rpx(14);
+          color: #606266;
+          margin-bottom: px2rpx(8);
+        }
+
+        :deep(.uni-forms-item__error) {
+          font-size: px2rpx(12);
+          color: #f56c6c;
+          margin-top: px2rpx(4);
+        }
+      }
+    }
+
+    .phone-input-group {
+      display: flex;
+      align-items: center;
+      gap: px2rpx(12);
+
+      .area-code-input {
+        flex: 0 0 px2rpx(100);
+
+        input {
+          width: 100%;
+          height: px2rpx(40);
+          padding: 0 px2rpx(12);
+          border: 1px solid #dcdfe6;
+          border-radius: px2rpx(4);
+          font-size: px2rpx(14);
+          transition: border-color 0.3s;
+
+          &:focus {
+            outline: none;
+            border-color: #409eff;
+            box-shadow: 0 0 0 2px rgba(64, 158, 255, 0.2);
+          }
+        }
+      }
+
+      .phone-separator {
+        font-size: px2rpx(16);
+        color: #909399;
+        user-select: none;
+      }
+
+      .phone-input {
+        flex: 1;
+
+        input {
+          width: 100%;
+          height: px2rpx(40);
+          padding: 0 px2rpx(12);
+          border: 1px solid #dcdfe6;
+          border-radius: px2rpx(4);
+          font-size: px2rpx(14);
+          transition: border-color 0.3s;
+
+          &:focus {
+            outline: none;
+            border-color: #409eff;
+            box-shadow: 0 0 0 2px rgba(64, 158, 255, 0.2);
+          }
+        }
+      }
+    }
+
+    input {
+      width: 100%;
+      height: px2rpx(40);
+      padding: 0 px2rpx(12);
+      border: 1px solid #dcdfe6;
+      border-radius: px2rpx(4);
+      font-size: px2rpx(14);
+      transition: border-color 0.3s;
+
+      &:focus {
+        outline: none;
+        border-color: #409eff;
+        box-shadow: 0 0 0 2px rgba(64, 158, 255, 0.2);
+      }
+    }
+  }
+
+  .merchant-info {
+    padding: px2rpx(16);
+    background-color: #f5f7fa;
+    border-radius: px2rpx(8);
+    font-size: px2rpx(13);
+    line-height: 1.6;
+    text-align: left;
+    color: #606266;
+
+    view {
+      margin-bottom: px2rpx(8);
+
+      &:last-child {
+        margin-bottom: 0;
+      }
+    }
+  }
+}
+
+@media (max-width: 768px) {
+  .popup-content {
+
+    .info-section,
+    .form-section {
+      padding: px2rpx(16);
+    }
+
+    .form-section {
+      .phone-input-group {
+        gap: px2rpx(8);
+
+        .area-code-input {
+          flex: 0 0 px2rpx(80);
+        }
+
+        input {
+          height: px2rpx(36);
+          font-size: px2rpx(13);
+        }
+      }
+    }
+
+    .merchant-info {
+      padding: px2rpx(12);
+      font-size: px2rpx(12);
+    }
+  }
+}
+</style>

+ 11 - 11
pages/customer/deposit.vue

@@ -7,7 +7,7 @@
                 <view class="b-card">
                 <view class="b-card">
                     <view class="card-top">
                     <view class="card-top">
                         <text class="tit"><text class="iconfont icon-caret-right"></text>{{ t('Custom.Deposit.Title1')
                         <text class="tit"><text class="iconfont icon-caret-right"></text>{{ t('Custom.Deposit.Title1')
-                            }}</text>
+                        }}</text>
                         <cwg-combox :clearable="false" v-model:value="loginValue" :options="loginComboxOptions"
                         <cwg-combox :clearable="false" v-model:value="loginValue" :options="loginComboxOptions"
                             :placeholder="t('placeholder.choose')" />
                             :placeholder="t('placeholder.choose')" />
                     </view>
                     </view>
@@ -18,7 +18,7 @@
                 <view class="b-card">
                 <view class="b-card">
                     <view class="card-top">
                     <view class="card-top">
                         <text class="tit"><text class="iconfont icon-caret-right"></text>{{ t('Custom.Deposit.Title2')
                         <text class="tit"><text class="iconfont icon-caret-right"></text>{{ t('Custom.Deposit.Title2')
-                            }}</text>
+                        }}</text>
                         <view v-for="(group, index) in sortedTableData" :key="index">
                         <view v-for="(group, index) in sortedTableData" :key="index">
                             <view class="channelType" v-if="group.length" v-t="groupTitleMap[group[0].type]" />
                             <view class="channelType" v-if="group.length" v-t="groupTitleMap[group[0].type]" />
                             <PaymentMethodsList :list="group" @select="isShowStep3" />
                             <PaymentMethodsList :list="group" @select="isShowStep3" />
@@ -79,7 +79,7 @@
                                     <uni-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
                                     <uni-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
                                         <text class="tit"><text class="iconfont icon-caret-right"></text>{{
                                         <text class="tit"><text class="iconfont icon-caret-right"></text>{{
                                             t('news_add_field.Label.Title4')
                                             t('news_add_field.Label.Title4')
-                                        }}</text>
+                                            }}</text>
                                     </uni-col>
                                     </uni-col>
                                     <uni-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
                                     <uni-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
                                         <uni-forms-item>
                                         <uni-forms-item>
@@ -111,7 +111,7 @@
                                                         WireTransferAccount.bankUname || '--'
                                                         WireTransferAccount.bankUname || '--'
                                                     }}</text></view>
                                                     }}</text></view>
                                             <view class="row"><text class="label">{{ t('Custom.Deposit.bankName')
                                             <view class="row"><text class="label">{{ t('Custom.Deposit.bankName')
-                                            }}</text><text class="content">{{ WireTransferAccount.bankName ||
+                                                    }}</text><text class="content">{{ WireTransferAccount.bankName ||
                                                         '--'
                                                         '--'
                                                     }}</text></view>
                                                     }}</text></view>
                                             <view class="row"><text class="label SpecialColor">{{
                                             <view class="row"><text class="label SpecialColor">{{
@@ -120,7 +120,7 @@
                                                         WireTransferAccount.bankCardNum || '--'
                                                         WireTransferAccount.bankCardNum || '--'
                                                     }}</text></view>
                                                     }}</text></view>
                                             <view class="row"><text class="label">{{ t('Custom.Deposit.bankAddr')
                                             <view class="row"><text class="label">{{ t('Custom.Deposit.bankAddr')
-                                            }}</text><text class="content">{{ WireTransferAccount.bankAddr ||
+                                                    }}</text><text class="content">{{ WireTransferAccount.bankAddr ||
                                                         '--'
                                                         '--'
                                                     }}</text></view>
                                                     }}</text></view>
                                             <view class="row"><text class="label SpecialColor">{{
                                             <view class="row"><text class="label SpecialColor">{{
@@ -129,7 +129,7 @@
                                                         WireTransferAccount.swiftCode || '--'
                                                         WireTransferAccount.swiftCode || '--'
                                                     }}</text></view>
                                                     }}</text></view>
                                             <view class="row"><text class="label">{{ t('Custom.Deposit.bankCode')
                                             <view class="row"><text class="label">{{ t('Custom.Deposit.bankCode')
-                                            }}</text><text class="content">{{ WireTransferAccount.bankCode ||
+                                                    }}</text><text class="content">{{ WireTransferAccount.bankCode ||
                                                         '--'
                                                         '--'
                                                     }}</text></view>
                                                     }}</text></view>
                                             <view class="row"><text class="label SpecialColor">{{
                                             <view class="row"><text class="label SpecialColor">{{
@@ -156,7 +156,7 @@
                                                         + '-' +
                                                         + '-' +
                                                         WireTransferAccount.type }}</text></view>
                                                         WireTransferAccount.type }}</text></view>
                                             <view class="row"><text class="label">{{ t('Custom.Withdraw.Title6')
                                             <view class="row"><text class="label">{{ t('Custom.Withdraw.Title6')
-                                            }}</text><text class="content">{{ WireTransferAccount.address ||
+                                                    }}</text><text class="content">{{ WireTransferAccount.address ||
                                                         '--'
                                                         '--'
                                                     }}</text></view>
                                                     }}</text></view>
                                             <view class="row"><text class="label">QR Code</text>
                                             <view class="row"><text class="label">QR Code</text>
@@ -233,7 +233,7 @@
                                             <uni-forms-item :label="t('Custom.Deposit.UploadRemittanceVoucher')">
                                             <uni-forms-item :label="t('Custom.Deposit.UploadRemittanceVoucher')">
                                                 <view class="upload-box">
                                                 <view class="upload-box">
                                                     <button class="btn-upload" @click="chooseImage">{{ t('upload')
                                                     <button class="btn-upload" @click="chooseImage">{{ t('upload')
-                                                    }}</button>
+                                                        }}</button>
                                                     <image v-if="imageUrl" :src="imageUrl" mode="aspectFit"
                                                     <image v-if="imageUrl" :src="imageUrl" mode="aspectFit"
                                                         class="img-preview" />
                                                         class="img-preview" />
                                                 </view>
                                                 </view>
@@ -261,7 +261,7 @@
                                                     <text>{{ t('news_add_field1.activitiesNZ.itemDeposit2') }}</text>
                                                     <text>{{ t('news_add_field1.activitiesNZ.itemDeposit2') }}</text>
                                                     <text class="clause crm-cursor" @click="dialogClauseNZ = true">{{
                                                     <text class="clause crm-cursor" @click="dialogClauseNZ = true">{{
                                                         t('news_add_field1.activitiesNZ.itemDeposit3')
                                                         t('news_add_field1.activitiesNZ.itemDeposit3')
-                                                        }}</text>
+                                                    }}</text>
                                                     <text>{{ t('news_add_field1.activitiesNZ.itemDeposit4') }}</text>
                                                     <text>{{ t('news_add_field1.activitiesNZ.itemDeposit4') }}</text>
                                                 </view>
                                                 </view>
                                             </uni-forms-item>
                                             </uni-forms-item>
@@ -414,7 +414,7 @@
                 :title="dialogDealResultTitle" :initialData="dialogDealResult_form" :type="DealResultType"
                 :title="dialogDealResultTitle" :initialData="dialogDealResult_form" :type="DealResultType"
                 @confirm="submitDealResult" />
                 @confirm="submitDealResult" />
             <!-- KYC成功弹窗 -->
             <!-- KYC成功弹窗 -->
-            <cwg-kyc-popup v-model:visible="dialogKyc" :qrText="qrText" />
+            <cwg-kyc-popup v-model:visible="dialogKyc" :qrText="text1" />
         </view>
         </view>
     </cwg-page-wrapper>
     </cwg-page-wrapper>
 </template>
 </template>
@@ -441,7 +441,7 @@ import ClauseNZPopup from './components/ClauseNZPopup.vue'
 import Clause20Popup from './components/Clause20Popup.vue'
 import Clause20Popup from './components/Clause20Popup.vue'
 import ClausePopup from './components/ClausePopup.vue'
 import ClausePopup from './components/ClausePopup.vue'
 import CheckPopup from './components/CheckPopup.vue'
 import CheckPopup from './components/CheckPopup.vue'
-import CwgCheckConfirmPopup from './components/cwg-check-confirm-popup.vue'
+import CwgCheckConfirmPopup from './components/DepositCheckConfirmPopup.vue'
 import VietnamNoticePopup from './components/VietnamNoticePopup.vue'
 import VietnamNoticePopup from './components/VietnamNoticePopup.vue'
 import NewYear24Popup from './components/NewYear24Popup.vue'
 import NewYear24Popup from './components/NewYear24Popup.vue'
 // 假设原有导入路径保持不变
 // 假设原有导入路径保持不变

ファイルの差分が大きいため隠しています
+ 1115 - 665
pages/customer/withdrawal.vue


+ 3 - 3
static/scss/global/global.scss

@@ -1170,9 +1170,9 @@ uni-content {
     min-width: px2rpx(250);
     min-width: px2rpx(250);
 
 
     @media screen and (max-width: 991px) {
     @media screen and (max-width: 991px) {
-        min-width: 80%;
-        max-width: 90%;
-        margin: 0 px2rpx(10);
+        // min-width: 80%;
+        // max-width: 90%;
+        // margin: 0 px2rpx(10);
     }
     }
 
 
     position: relative;
     position: relative;

この差分においてかなりの量のファイルが変更されているため、一部のファイルを表示していません