Explorar o código

feat:代理修改,

ljc hai 1 mes
pai
achega
1ea146e3f4

+ 1 - 0
components/cwg-complex-search.vue

@@ -223,6 +223,7 @@ const shouldUseSelect = (field) => {
     return field.options.length > 10 || field.isSelect === true
 }
 const handleDateChange = (value) => {
+  console.log(value)
     formData.value[dateField.value.key] = value
     tempFormData.value[dateField.value.key] = value
     // 日期变化时自动触发搜索

+ 15 - 1
components/cwg-language.vue

@@ -1,7 +1,7 @@
 <template>
   <cwg-dropdown :menu-list="customMenuList" @menuClick="handleMenuClick">
     <view class="pc-header-btn">
-      <cwg-icon name="cwg-lang" color="#141d22" />
+      <cwg-icon name="cwg-lang" :color="iconColor" :size="20" />
     </view>
   </cwg-dropdown>
 </template>
@@ -12,6 +12,13 @@ import { useI18n } from 'vue-i18n'
 import { localesList, LANG_MAP } from '@/locale/index'
 import { lang } from '@/composables/config'
 
+const props = defineProps({
+  iconColor: {
+    type: String,
+    default: '#141d22'
+  },
+})
+
 const { t, locale } = useI18n()
 const customMenuList = computed(() =>
   localesList.map((code) => ({
@@ -48,6 +55,13 @@ function getFlagSrc(code: string) {
 <style scoped lang="scss">
 @import "@/uni.scss";
 
+.pc-header-btn {
+  display: flex;
+  align-items: center;
+  cursor: pointer;
+  gap: px2rpx(6);
+}
+
 :deep(.cwg-dropdown-menu-container .menu .menu-item) {
   min-height: px2rpx(36);
 }

+ 10 - 1
components/cwg-system.vue

@@ -2,7 +2,7 @@
   <cwg-dropdown :menu-list="systemMenuList" @menuClick="handleMenuClick">
     <view class="pc-header-btn">
       <text class="current-system-name">{{ currentSystemName }}</text>
-      <cwg-icon name="crm-chevron-down" color="#000" :size="14" />
+      <cwg-icon name="crm-chevron-down" :color="iconColor" :size="14" />
     </view>
   </cwg-dropdown>
 </template>
@@ -14,6 +14,14 @@ import Config from '@/config/index'
 import { customApi } from '@/service/custom'
 
 const props = defineProps({
+  iconColor: {
+    type: String,
+    default: '#141d22'
+  },
+  textColor: {
+    type: String,
+    default: '#141d22'
+  }
 })
 
 const { Code } = Config
@@ -162,6 +170,7 @@ onMounted(() => {
 
 .current-system-name {
   font-size: px2rpx(14);
+  color: v-bind('props.textColor');
 }
 
 :deep(.cwg-dropdown-menu-container .menu .menu-item) {

+ 7 - 12
pages/ib/accountList.vue

@@ -31,7 +31,7 @@
 
 <script setup lang="ts">
   // 账户管理
-  import { ref } from 'vue'
+  import { ref, nextTick } from 'vue'
   import { useI18n } from 'vue-i18n'
   import { ibApi } from '@/service/ib'
   import { useFilters } from '@/composables/useFilters'
@@ -64,17 +64,10 @@
 
   const handleSearch = (params: any) => {
     const payload = { ...params }
-    if (payload.date && Array.isArray(payload.date) && payload.date.length === 2) {
-      payload.startDate = payload.date[0]
-      payload.endDate = payload.date[1]
-    } else {
-      payload.startDate = ''
-      payload.endDate = ''
-    }
-    delete payload.date
-
     search.value = payload
-    tableRef.value?.refreshTable?.()
+    nextTick(() => {
+      tableRef.value?.refreshTable?.()
+    })
   }
 
   const handleReset = () => {
@@ -85,7 +78,9 @@
       startDate: '',
       endDate: '',
     }
-    tableRef.value?.refreshTable?.()
+    nextTick(() => {
+      tableRef.value?.refreshTable?.()
+    })
   }
   // 表格列配置
   const columns = ref([

+ 25 - 5
pages/ib/agentList.vue

@@ -5,9 +5,7 @@
     <view class="account-content">
       <view class="search-content">
         <view class="search-bar">
-          <uni-easyinput v-model="search.name" :placeholder="t('Ib.Custom.NameLabel')" />
-        </view>
-        <view class="search-bar">
+          <cwg-complex-search :fields="filterFields" v-model="searchParams" @search="handleSearch" @reset="handleReset" />
         </view>
       </view>
       <cwg-tabel
@@ -56,7 +54,7 @@
 
 <script setup lang="ts">
   // 信号源管理
-  import { ref, reactive, computed, onMounted, onUnmounted } from 'vue'
+  import { ref, reactive, computed, onMounted, onUnmounted,nextTick } from 'vue'
   import { onLoad } from '@dcloudio/uni-app'
   import { useI18n } from 'vue-i18n' // uni-app 中已集成,但需配置
   import Config from '@/config/index'
@@ -66,10 +64,32 @@
 
   const { numberFormat, numberDecimal } = useFilters()
 
+  const searchParams = ref({})
   const search = ref({
-    cId: '',
+    name:''
   })
 
+  const filterFields = computed(() => [
+    { key: 'name', type: 'input', label: t('Ib.Custom.NameLabel'), placeholder: t('Ib.Custom.NameLabel'), defaultValue: '' },
+  ])
+  const tableRef = ref<any>(null)
+
+  const handleSearch = (params: any) => {
+    search.value = { ...params }
+    nextTick(() => {
+      tableRef.value?.refreshTable?.()
+    })
+  }
+
+  const handleReset = () => {
+    search.value = {
+      name: '',
+    }
+    nextTick(() => {
+      tableRef.value?.refreshTable?.()
+    })
+  }
+
   const formInfo = ref({})
   const dialogInfoTradingAddTc = ref(false)
   const dialogInfoTradingAddTcAgree = ref(false)

+ 3 - 0
pages/ib/components/applyIbDialog.vue

@@ -434,6 +434,9 @@
   }
 
   const closeDia = () => {
+    addAgentForm.value = {
+      customerId: ''
+    }
     commissionTemplateTableData.value = []
     emit('close')
   }

+ 5 - 7
pages/ib/components/pointDialog.vue

@@ -103,7 +103,7 @@
   const { t } = useI18n()
   const formRef = ref(null)
   const dialogForm = ref({
-    cId: '123',
+    cId: '',
   })
   const commissionAccountTypeSettings = ref({
     ecn: { selectedIndex: null, selectedItem: null, loginType: '2' },
@@ -235,12 +235,10 @@
     emit('confirm')
   }
 
-  const cancel = () => {
-    // 取消按钮点击事件
-    emit('close')
-  }
-
   const closeDia = () => {
+    dialogForm.value = {
+      cId: '',
+    }
     emit('close')
   }
 
@@ -261,7 +259,7 @@
       uni.showToast({
         title: t('Msg.ModifySuccess'),
       })
-      this.cancel()
+      closeDia()
     } else {
       uni.showToast({
         title: res.msg,

+ 53 - 20
pages/ib/recording.vue

@@ -5,11 +5,7 @@
     <view class="account-content">
       <view class="search-content">
         <view class="search-bar">
-          <cwg-combox v-model:value="search.types" :options="typeList"
-                      :placeholder="t('placeholder.choose')" :clearable="false" />
-          <uni-datetime-picker type="daterange" v-model="search.date"
-                               :placeholder="t('placeholder.Start') + ' - ' + t('placeholder.End')"
-                               @change="handleDateChange" />
+          <cwg-complex-search :fields="filterFields" v-model="searchParams" @search="handleSearch" @reset="handleReset" />
         </view>
         <view />
       </view>
@@ -66,6 +62,7 @@
   import { useRecordingConst } from '@/pages/ib/const/recording'
   import { useFilters } from '@/composables/useFilters'
   import { useConfirm } from '@/hooks/useConfirm'
+  import { nextTick } from 'vue'
 
   const confirm = useConfirm()
   const { numberFormat, numberDecimal } = useFilters()
@@ -92,30 +89,65 @@
     const now = new Date()
     const year = now.getFullYear()
     const month = now.getMonth()
-    
+
     // 第一天
     const firstDay = new Date(year, month, 1)
     // 最后一天
     const lastDay = new Date(year, month + 1, 0)
-    
+
     const format = (date) => {
       const y = date.getFullYear()
       const m = String(date.getMonth() + 1).padStart(2, '0')
       const d = String(date.getDate()).padStart(2, '0')
       return `${y}-${m}-${d}`
     }
-    
+
     return [format(firstDay), format(lastDay)]
   }
 
   const defaultDateRange = getCurrentMonthRange()
 
+  const searchParams = ref({
+    types: 1,
+    date: defaultDateRange
+  })
+
   const search = ref({
     types: 1,
-    date: defaultDateRange,
     startDate: defaultDateRange[0],
     endDate: defaultDateRange[1],
   })
+
+  const filterFields = computed(() => [
+    { key: 'types', type: 'select', label: t('placeholder.choose'), placeholder: t('placeholder.choose'), options: typeList.value, defaultValue: 1, isSelect: true, clearable: false },
+    { key: 'date', label: t('placeholder.Start') + ' - ' + t('placeholder.End'), type: 'daterange', defaultValue: defaultDateRange },
+  ])
+
+  const tableRef = ref<any>(null)
+
+  const handleSearch = (params: any) => {
+    const payload = { ...params }
+    search.value = payload
+    nextTick(() => {
+      tableRef.value?.refreshTable?.()
+    })
+  }
+
+  const handleReset = () => {
+    searchParams.value = {
+      types: 1,
+      date: defaultDateRange
+    }
+    search.value = {
+      types: 1,
+      startDate: defaultDateRange[0],
+      endDate: defaultDateRange[1],
+    }
+    nextTick(() => {
+      tableRef.value?.refreshTable?.()
+    })
+  }
+
   const isZh = computed(() => {
     return ['cn', 'zhHant'].indexOf(locale.value) != -1
   })
@@ -138,19 +170,19 @@
 
   // 接口 根据types 切换
   const listApi = computed(() => {
-    return search.value.types == 4? (params)=> ibApi[apiList.value[search.value.types]]({ ...params ,type: 4}): (params)=> ibApi[apiList.value[search.value.types]]({ ...params })
+    let other = {}
+    if (search.value.types == 4) {
+      other = {
+        type: 4,
+      }
+    } else if (search.value.types == 1) {
+      other = {
+        mamType: 0,
+      }
+    }
+    return (params) => ibApi[apiList.value[search.value.types]]({ ...params, ...other })
   })
 
-
-  const handleDateChange = (val) => {
-    if (val && val.length === 2) {
-      search.value.startDate = val[0]
-      search.value.endDate = val[1]
-    } else {
-      search.value.startDate = ''
-      search.value.endDate = ''
-    }
-  }
   const cancel = async (id) => {
     try {
       await confirm({
@@ -186,6 +218,7 @@
   .search-content {
     display: flex;
     justify-content: space-between;
+
     .uni-date {
       width: px2rpx(250) !important;
       flex: none;

+ 2 - 9
pages/ib/subsList.vue

@@ -89,11 +89,11 @@
   const { t, locale } = useI18n()
   const { Code } = Config
 
-  const searchParams = ref({})
   const search = ref({
     ibNo: '',
     name: '',
     cId: '',
+    data: '',
     startDate: '',
     endDate: '',
   })
@@ -213,14 +213,7 @@
   const handleSearch = (params: any) => {
     // 拦截处理 daterange,将 date 拆分为 startDate 和 endDate
     const payload = { ...params }
-    if (payload.date && payload.date.length === 2) {
-      payload.startDate = payload.date[0]
-      payload.endDate = payload.date[1]
-    } else {
-      payload.startDate = ''
-      payload.endDate = ''
-    }
-    delete payload.date
+
 
     search.value = payload
     nextTick(() => {

+ 54 - 0
pages/login/components/LoginHeaderGroup.vue

@@ -0,0 +1,54 @@
+<template>
+  <view class="login-header-group">
+    <view class="header-item">
+      <cwg-system :text-color="textColor" :icon-color="iconColor" />
+    </view>
+    <view class="divider" :style="{ backgroundColor: dividerColor }"></view>
+    <view class="header-item">
+      <cwg-language :text-color="textColor" :icon-color="iconColor" />
+    </view>
+  </view>
+</template>
+
+<script setup lang="ts">
+import { computed } from 'vue'
+import CwgSystem from '@/components/cwg-system.vue'
+import CwgLanguage from '@/components/cwg-language.vue'
+
+const props = defineProps({
+  iconColor: {
+    type: String,
+    default: '#141d22'
+  },
+  textColor: {
+    type: String,
+    default: '#141d22'
+  }
+})
+
+const dividerColor = computed(() => {
+  return props.textColor === '#fff' ? 'rgba(255, 255, 255, 0.4)' : 'rgba(0, 0, 0, 0.2)'
+})
+</script>
+
+<style scoped lang="scss">
+@import "@/uni.scss";
+
+.login-header-group {
+  display: flex;
+  align-items: center;
+  padding: px2rpx(4) 0;
+  height: px2rpx(36);
+  
+  .header-item {
+    display: flex;
+    align-items: center;
+  }
+  
+  .divider {
+    width: 1px;
+    height: px2rpx(14);
+    margin: 0 px2rpx(16);
+  }
+}
+</style>

+ 170 - 111
pages/login/index.vue

@@ -11,6 +11,7 @@
   import useRouter from '@/hooks/useRouter'
   import { useI18n } from 'vue-i18n'
   import companyLogo from '@/static/images/logo4.png'
+  import LoginHeaderGroup from './components/LoginHeaderGroup.vue'
 
   const router = useRouter()
   const { t } = useI18n()
@@ -162,116 +163,135 @@
 
 <template>
   <view class="login-page" :isHeaderFixed="true" :isLoginPage="true">
-    <uni-row class="demo-uni-row">
+
+
+    <view class="main-content">
       <cwg-match-media :min-width="991">
-        <uni-col :xs="24" :sm="24" :md="12" :lg="14" :xl="16">
-          <view class="left-bg">
-            <view class="left-box">
-              <view class="inner">
-                <view class="section-title">
-                  <text class="bg-secondary-opacity subtitle w-40" v-t="'newLoop.item11'"></text>
+        <view class="global-header-bar pc-header">
+          <view class="header-inner">
+            <view class="logo-placeholder"></view> <!-- 左侧可预留放logo或留空 -->
+            <LoginHeaderGroup text-color="#fff" icon-color="#fff" />
+          </view>
+        </view>
+      </cwg-match-media>
+
+      <!-- 移动端顶部栏:悬浮在上方,深色文字 -->
+      <cwg-match-media :max-width="991">
+        <view class="mobile-header-bar">
+          <LoginHeaderGroup text-color="#141d22" icon-color="#141d22" />
+        </view>
+      </cwg-match-media>
+
+      <uni-row class="demo-uni-row">
+        <cwg-match-media :min-width="991">
+          <uni-col :xs="24" :sm="24" :md="12" :lg="14" :xl="16">
+            <view class="left-bg">
+              <view class="left-box">
+                <view class="inner">
+                  <view class="section-title">
+                    <text class="bg-secondary-opacity subtitle w-40" v-t="'newLoop.item11'"></text>
+                  </view>
+                  <view class="title w-700">
+                    {{`${t('newLoop.item12')} `}}
+                    <text class="color-white" v-t="'newLoop.item13'"></text>
+                  </view>
+                  <view class="text-white" v-t="'newLoop.item14'"></view>
                 </view>
-                <view class="title w-700">
-                  <text v-t="'newLoop.item12'"></text>
-                  <text>&nbsp;</text>
-                  <text class="color-white" v-t="'newLoop.item13'"></text>
+                <image src="/static/images/trust-pilot.png" class="img-fluid mt--10" mode="widthFix"></image>
+                <view class="left-content">
+                  <view class="des text-white">
+                    <text v-html="t('newSignin.item12')"></text>
+                    <br />
+                    <text v-html="t('newSignin.item12_1')"></text>
+                    <br />
+                    <text v-html="t('newSignin.item10')"></text>
+                    <br />
+                    <text v-html="t('newSignin.item11')"></text>
+                    <br />
+                    <text v-t="'newSignin.item13'"></text>
+                    <a
+                      :href="`https://www.${ho}.com/doc/Risk-Disclosures-and-Acknowledgements-2020-08.pdf`"
+                      target="_blank"
+                      v-t="'newSignin.item13_1'"
+                      class="doc-link"
+                    ></a>
+                    <text v-t="'newSignin.item13_2'"></text>
+                    <!-- <view v-t="'newSignin.item13_3'"></view>
+                    <text v-t="'newSignin.item13_4'"></text> -->
+                  </view>
                 </view>
-                <view class="text-white" v-t="'newLoop.item14'"></view>
               </view>
-              <image src="/static/images/trust-pilot.png" class="img-fluid mt--10" mode="widthFix"></image>
-              <view class="left-content">
-                <view class="des text-white">
-                  <text v-html="t('newSignin.item12')"></text>
-                  <br />
-                  <text v-html="t('newSignin.item12_1')"></text>
-                  <br />
-                  <text v-html="t('newSignin.item10')"></text>
-                  <br />
-                  <text v-html="t('newSignin.item11')"></text>
-                  <br />
-                  <text v-t="'newSignin.item13'"></text>
-                  <a
-                    :href="`https://www.${ho}.com/doc/Risk-Disclosures-and-Acknowledgements-2020-08.pdf`"
-                    target="_blank"
-                    v-t="'newSignin.item13_1'"
-                    class="doc-link"
-                  ></a>
-                  <text v-t="'newSignin.item13_2'"></text>
-                  <!-- <view v-t="'newSignin.item13_3'"></view>
-                  <text v-t="'newSignin.item13_4'"></text> -->
-                </view>
+            </view>
+          </uni-col>
+        </cwg-match-media>
+        <uni-col :xs="24" :sm="24" :md="12" :lg="10" :xl="8" class="right-f">
+          <view class="account">
+            <cwg-match-media :max-width="991">
+              <view class="company u-flex-y u-flex-y-center">
+                <image src="/static/images/logo.png" class="company-icon" mode="widthFix"></image>
               </view>
+            </cwg-match-media>
+            <view class="title">
+              <view class="tit1">{{ t('newSignin.item1') }}</view>
+              <view class="tit2">{{ t('newSignin.item2') }}</view>
             </view>
-          </view>
-        </uni-col>
-      </cwg-match-media>
-      <uni-col :xs="24" :sm="24" :md="12" :lg="10" :xl="8" class="right-f">
-        <view class="account">
-          <cwg-match-media :max-width="991">
-            <view class="company u-flex-y u-flex-y-center">
-              <image src="/static/images/logo.png" class="company-icon" mode="widthFix"></image>
+            <view>
+              <up-form :model="form" ref="uFormRef">
+                <up-form-item label="" prop="loginName">
+                  <up-input :customStyle="customStyle" v-model="form.loginName" border="none"
+                            :placeholder="t('signin.form.email')">
+                    <template #prefix>
+                      <cwg-icon name="email-outline" :size="20" color="#000" />
+                    </template>
+                  </up-input>
+                </up-form-item>
+
+                <up-form-item label="" prop="password">
+                  <up-input :customStyle="customStyle" v-model="form.password" :type="inputType" border="none"
+                            :placeholder="t('signin.form.password')">
+                    <template #prefix>
+                      <cwg-icon name="lock-outline" :size="20" color="#000" />
+                    </template>
+                  </up-input>
+                </up-form-item>
+              </up-form>
             </view>
-          </cwg-match-media>
-          <view class="title">
-            <view class="tit1">{{ t('newSignin.item1') }}</view>
-            <view class="tit2">{{ t('newSignin.item2') }}</view>
-          </view>
-          <view>
-            <up-form :model="form" ref="uFormRef">
-              <up-form-item label="" prop="loginName">
-                <up-input :customStyle="customStyle" v-model="form.loginName" border="none"
-                          :placeholder="t('signin.form.email')">
-                  <template #prefix>
-                    <cwg-icon name="email-outline" :size="20" color="#000" />
-                  </template>
-                </up-input>
-              </up-form-item>
-
-              <up-form-item label="" prop="password">
-                <up-input :customStyle="customStyle" v-model="form.password" :type="inputType" border="none"
-                          :placeholder="t('signin.form.password')">
-                  <template #prefix>
-                    <cwg-icon name="lock-outline" :size="20" color="#000" />
-                  </template>
-                </up-input>
-              </up-form-item>
-            </up-form>
-          </view>
-          <view class="u-flex u-flex-between u-flex-y-center mb1">
-            <view class="check-box">
-              <up-checkbox-group v-model="remenber" @change="checkboxChange">
-                <up-checkbox size="14" labelSize="14" labelColor="#666666" activeColor="#ea002a"
-                             :label="t('newSignin.item5')" name="记住我" class="wcg-checkbox"></up-checkbox>
-              </up-checkbox-group>
+            <view class="u-flex u-flex-between u-flex-y-center mb1">
+              <view class="check-box">
+                <up-checkbox-group v-model="remenber" @change="checkboxChange">
+                  <up-checkbox size="14" labelSize="14" labelColor="#666666" activeColor="#ea002a"
+                               :label="t('newSignin.item5')" name="记住我" class="wcg-checkbox"></up-checkbox>
+                </up-checkbox-group>
+              </view>
+              <navigator url="/pages/login/reset" class="account-tip">
+                <text>{{ t('signin.forget') }}</text>
+              </navigator>
+            </view>
+            <view class="cwg-button">
+              <u-button type="primary" class="" @click="submit">
+                {{ t('signin.login') }}
+              </u-button>
             </view>
-            <navigator url="/pages/login/reset" class="account-tip">
-              <text>{{ t('signin.forget') }}</text>
+            <navigator url="/pages/login/regist" class="account-tip">
+              {{ t('signin.words') }}
+              <text>{{ t('signin.signup') }}</text>
             </navigator>
-          </view>
-          <view class="cwg-button">
-            <u-button type="primary" class="" @click="submit">
-              {{ t('signin.login') }}
-            </u-button>
-          </view>
-          <navigator url="/pages/login/regist" class="account-tip">
-            {{ t('signin.words') }}
-            <text>{{ t('signin.signup') }}</text>
-          </navigator>
-          <cwg-match-media :min-width="791">
-
-
-            <view class="qr-container">
-              <view class="qr-title">
-                <view class="line"></view>
-                <view class="qr-tit2">{{ t('newSignin.item2') }}</view>
-                <view class="line"></view>
+            <cwg-match-media :min-width="791">
+
+
+              <view class="qr-container">
+                <view class="qr-title">
+                  <view class="line"></view>
+                  <view class="qr-tit2">{{ t('newSignin.item2') }}</view>
+                  <view class="line"></view>
+                </view>
+                <QrCode width="200" height="200" text="cardGuide" :logo="logoImage"></QrCode>
               </view>
-              <QrCode width="200" height="200" text="cardGuide" :logo="logoImage"></QrCode>
-            </view>
-          </cwg-match-media>
-        </view>
-      </uni-col>
-    </uni-row>
+            </cwg-match-media>
+          </view>
+        </uni-col>
+      </uni-row>
+    </view>
   </view>
 </template>
 
@@ -286,18 +306,56 @@
     height: 100vh;
     border: none;
     padding: 0;
+    position: relative;
+    display: flex;
+    flex-direction: column;
+  }
+
+  .global-header-bar {
+    width: 100%;
+    height: px2rpx(60);
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    flex-shrink: 0;
+    z-index: 100;
+
+    &.pc-header {
+      background-color: transparent;
+    }
+
+    .header-inner {
+      width: 100%;
+      padding: 0 5%;
+      display: flex;
+      justify-content: space-between; /* 两端对齐,可放logo和组件 */
+      align-items: center;
+    }
+  }
+
+  .mobile-header-bar {
+    position: absolute;
+    top: px2rpx(20);
+    right: px2rpx(20);
+    z-index: 10;
+  }
+
+  .main-content {
+    flex: 1;
+    overflow: hidden;
+    background-image: url(/static/images/login-bg.gif);
+    background-repeat: no-repeat;
+    background-size: cover;
+    background-position: center center;
   }
 
   .demo-uni-row {
+    height: 100%;
     margin: 0 !important;
 
     .left-bg {
       height: 100%;
-      min-height: 100vh;
-      background-image: url(/static/images/login-bg.gif);
-      background-repeat: no-repeat;
-      background-size: cover;
-      background-position: center center;
+      min-height: calc(100vh - 120px);
       display: flex;
       flex-direction: column;
       align-items: center;
@@ -308,7 +366,7 @@
         justify-content: center;
         align-items: flex-start;
         width: 60%;
-        margin-top: px2rpx(20);
+        //margin-top: px2rpx(20);
 
         .inner {
           width: 100%;
@@ -316,14 +374,14 @@
           margin-bottom: px2rpx(20);
 
           .section-title {
-            margin-top: px2rpx(30);
+            margin-top: px2rpx(10);
             margin-bottom: px2rpx(10);
           }
 
 
           .title {
-            font-size: px2rpx(60);
-            line-height: 1.3;
+            font-size: px2rpx(50);
+            line-height: 1;
             color: #fff;
             font-weight: 700;
           }
@@ -362,7 +420,7 @@
 
         .img-fluid {
           width: 100%;
-          max-width: px2rpx(240);
+          max-width: px2rpx(200);
         }
 
         .mt--10 {
@@ -421,12 +479,13 @@
     .right-f {
       background-color: var(--color-white);
       padding: 0 px2rpx(24);
+      height: 100%;
       box-sizing: border-box;
 
       .account {
         background-color: var(--color-white);
         position: relative;
-        height: calc(100vh - 60px);
+        height: calc(100vh - 120px);
         display: flex;
         flex-direction: column;
         justify-content: center;

+ 70 - 11
pages/login/regist.vue

@@ -1,6 +1,24 @@
 <template>
   <view class="regist-page" :isHeaderFixed="true" :isLoginPage="true">
-    <uni-row class="demo-uni-row">
+    <view class="main-content">
+      <!-- 全局顶部栏:占据一整行,带有占位和背景 -->
+      <cwg-match-media :min-width="991">
+        <view class="global-header-bar pc-header">
+          <view class="header-inner">
+            <view class="logo-placeholder"></view> <!-- 左侧可预留放logo或留空 -->
+            <LoginHeaderGroup text-color="#fff" icon-color="#fff" />
+          </view>
+        </view>
+      </cwg-match-media>
+
+      <!-- 移动端顶部栏:悬浮在上方,深色文字 -->
+      <cwg-match-media :max-width="991">
+        <view class="mobile-header-bar">
+          <LoginHeaderGroup text-color="#141d22" icon-color="#141d22" />
+        </view>
+      </cwg-match-media>
+
+      <uni-row class="demo-uni-row">
       <cwg-match-media :min-width="991">
         <uni-col :xs="24" :sm="24" :md="12" :lg="14" :xl="16">
           <view class="left-bg">
@@ -179,6 +197,7 @@
       </uni-col>
     </uni-row>
   </view>
+  </view>
 </template>
 <script setup>
   import { ref, watch, onMounted, computed } from 'vue'
@@ -196,6 +215,7 @@
   import ImportModel from './components/ImportModel.vue'
   import logoImage from '@/static/images/logo3.png'
   import QrCode from '@/components/QrCode.vue'
+  import LoginHeaderGroup from './components/LoginHeaderGroup.vue'
 
   const { t } = useI18n()
   const { Code } = Config
@@ -389,7 +409,7 @@
   const countryCode = ref('my')
   const countryOptions = computed(() => {
     return mock_options.value.map(item => ({
-      text: item.name,
+      text: item.enName,
       value: item.code,
       disabled: item.isOpenAccount == 0 || item.isOpenAccount === null ? true : false,
     }))
@@ -593,19 +613,57 @@
     height: 100vh;
     border: none;
     padding: 0;
+    position: relative;
+    display: flex;
+    flex-direction: column;
+  }
+
+  .global-header-bar {
+    width: 100%;
+    height: px2rpx(60);
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    flex-shrink: 0;
+    z-index: 100;
+    
+    &.pc-header {
+      background-color: transparent;
+    }
+
+    .header-inner {
+      width: 100%;
+      padding: 0 5%;
+      display: flex;
+      justify-content: space-between; /* 两端对齐,可放logo和组件 */
+      align-items: center;
+    }
+  }
+
+  .mobile-header-bar {
+    position: absolute;
+    top: px2rpx(20);
+    right: px2rpx(20);
+    z-index: 10;
+  }
+
+  .main-content {
+    flex: 1;
     overflow: hidden;
+    background-image: url(/static/images/login-bg.gif);
+    background-repeat: no-repeat;
+    background-size: cover;
+    background-position: center center;
   }
 
   .demo-uni-row {
+    height: 100%;
     margin: 0 !important;
 
     .left-bg {
       height: 100%;
-      min-height: 100vh;
-      background-image: url(/static/images/login-bg.gif);
-      background-repeat: no-repeat;
-      background-size: cover;
-      background-position: center center;
+      min-height: calc(100vh - 120px);
+
       display: flex;
       flex-direction: column;
       align-items: center;
@@ -616,7 +674,7 @@
         justify-content: center;
         align-items: flex-start;
         width: 60%;
-        margin-top: px2rpx(20);
+        //margin-top: px2rpx(0);
 
         .inner {
           width: 100%;
@@ -624,13 +682,13 @@
           margin-bottom: px2rpx(20);
 
           .section-title {
-            margin-top: px2rpx(30);
+            margin-top: px2rpx(10);
             margin-bottom: px2rpx(10);
           }
 
 
           .title {
-            font-size: px2rpx(60);
+            font-size: px2rpx(50);
             line-height: 1.3;
             color: #fff;
             font-weight: 700;
@@ -730,12 +788,13 @@
     .right-f {
       background-color: var(--color-white);
       padding: 0 px2rpx(24);
+      height: 100%;
       box-sizing: border-box;
 
       .account {
         background-color: var(--color-white);
         position: relative;
-        height: calc(100vh - 60px);
+        height: calc(100vh - 120px);
         overflow-y: auto;
         display: flex;
         flex-direction: column;

+ 78 - 27
pages/login/reset.vue

@@ -1,29 +1,40 @@
 <template>
   <cwg-page-wrapper :isLoginPage="true">
-    <view class="reset-container">
-      <uni-row class="content">
-        <uni-col :span="20" :offset="2" :sm="{ span: 14, offset: 5 }">
-          <view class="reset-title">{{ t('pages.login.resetTitle') }}</view>
-          <view class="reset-form">
-            <view class="form-label">{{ t('newSignup.item7') }}</view>
-            <uni-easyinput
-              v-model="email"
-              :placeholder="t('forget.form')"
-              class="custom-input"
-            >
-            </uni-easyinput>
-
-            <view class="reset-button">
-              <u-button block :loading="loading" @click="handleReset">{{ t('forget.forget') }}</u-button>
+    <view class="main-content">
+
+      <view class="global-header-bar pc-header">
+        <view class="header-inner">
+          <view class="logo-placeholder"></view> <!-- 左侧可预留放logo或留空 -->
+          <!-- 这里由于没有深色背景,传递深色文字颜色 -->
+          <LoginHeaderGroup text-color="#141d22" icon-color="#141d22" />
+        </view>
+      </view>
+
+
+      <view class="reset-container">
+        <uni-row class="content">
+          <uni-col :span="20" :offset="2" :sm="{ span: 14, offset: 5 }">
+            <view class="reset-title">{{ t('pages.login.resetTitle') }}</view>
+            <view class="reset-form">
+              <view class="form-label">{{ t('newSignup.item7') }}</view>
+              <uni-easyinput
+                v-model="email"
+                :placeholder="t('forget.form')"
+                class="custom-input"
+              >
+              </uni-easyinput>
+
+              <view class="reset-button">
+                <button class="btn" block :loading="loading" @click="handleReset">{{ t('forget.forget') }}</button>
+              </view>
+              <view class="login-link">
+                <text @click="handleLogin" class="link-text">{{ t('signin.login') }}</text>
+              </view>
             </view>
-            <view class="login-link">
-              <text @click="handleLogin" class="link-text">{{ t('signin.login') }}</text>
-            </view>
-          </view>
-        </uni-col>
-      </uni-row>
+          </uni-col>
+        </uni-row>
+      </view>
     </view>
-
   </cwg-page-wrapper>
 </template>
 
@@ -33,6 +44,7 @@
   import useRouter from '@/hooks/useRouter'
   import { userApi } from '@/api/user'
   import config from '@/config'
+  import LoginHeaderGroup from './components/LoginHeaderGroup.vue'
 
   const { t } = useI18n()
   const router = useRouter()
@@ -52,8 +64,10 @@
     loading.value = true
     try {
       const res = await userApi.forgetPwd({ email: email.value })
-      uni.showToast({ title: res.msg , icon: 'success' })
-      setTimeout(() => { router.push('/pages/login/index') }, 1000)
+      uni.showToast({ title: res.msg, icon: 'success' })
+      setTimeout(() => {
+        router.push('/pages/login/index')
+      }, 1000)
     } catch (error: any) {
       uni.showToast({ title: error.message, icon: 'none' })
     } finally {
@@ -78,7 +92,44 @@
   :deep(uni-content) {
     padding-left: 0 !important;
   }
+
+  .main-content {
+    display: flex;
+    flex-direction: column;
+  }
+
+  .global-header-bar {
+    width: 100%;
+    height: px2rpx(60);
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    flex-shrink: 0;
+    z-index: 100;
+
+    &.pc-header {
+      background-color: transparent;
+      border-bottom: 1px solid rgba(0, 0, 0, 0.05);
+    }
+
+    .header-inner {
+      width: 100%;
+      padding: 0 5%;
+      display: flex;
+      justify-content: space-between; /* 两端对齐,可放logo和组件 */
+      align-items: center;
+    }
+  }
+
+  .mobile-header-bar {
+    position: absolute;
+    top: px2rpx(20);
+    right: px2rpx(20);
+    z-index: 10;
+  }
+
   .reset-container {
+    margin-top: px2rpx(20);
     display: flex;
     flex-direction: column;
     align-items: center;
@@ -86,7 +137,7 @@
   }
 
   .content {
-    width: px2rpx(650);
+    width: 100%;
     margin: 0 auto;
   }
 
@@ -125,9 +176,9 @@
       height: px2rpx(44);
       line-height: px2rpx(44);
       border-radius: px2rpx(4);
-      background-color: #fddb46; // 主题黄
+      background-color: var(--color-error); // 主题黄
       border: none;
-      color: #333;
+      color: #fff;
       font-size: px2rpx(16);
       font-weight: 500;
       margin: 0;