Jelajahi Sumber

Merge branch 'admin_dev' of http://112.213.107.185:3000/cwg-crm/gypsy-crm-frontend-vu into admin_dev

zhb 1 bulan lalu
induk
melakukan
75a9c5b34f
4 mengubah file dengan 1221 tambahan dan 564 penghapusan
  1. 3 1
      locale/cn.json
  2. 3 1
      locale/en.json
  3. 7 0
      pages/ib/components/applyIbDialog.vue
  4. 1208 562
      pages/login/index.vue

+ 3 - 1
locale/cn.json

@@ -550,7 +550,9 @@
     "agreemnet1": "CWG Markets品牌在多个司法管辖区均获得授权和监管:<br><br>CWG Markets Ltd(SVG)注册于圣文森特格林纳丁斯,是一家国际经纪公司,注册号为25447 BC 2019,获得授权从事金融衍生品交易业务。<br>注册地址是:Beachmont Business Centre, Suite 305, Griffith Corporate Centre, Kingstown, St. Vincent and the Grenadines <br><br>CWG Markets Ltd(VU)注册于瓦努阿图,获得授权从事金融衍生品交易业务,监管号为41694。<br>注册地址是:1276,Govant Building,Kumul Highway,Port Vila,Vanuatu",
     "agreemnet2": "风险提示: 差价合约(CFDs)具有杠杆作用并且承担着高风险。您应该考虑投资目标,经验水平,差价合约(CFDs)交易的操作,以及确保您了解交易过程中损失资本的风险。请仔细阅读我们的",
     "agreemnet3": "风险披露,",
-    "agreemnet4": "并确保您完全了解。"
+    "agreemnet4": "并确保您完全了解。",
+    "tabs1": "登录",
+    "tabs2": "创建一个账号"
   },
   "forget": {
     "title": "找回密码",

+ 3 - 1
locale/en.json

@@ -538,7 +538,9 @@
     "agreemnet3": " RISK DISCLOSURE ",
     "agreemnet4": "carefully and ensure that you fully understand it before the investment/you initiate the investment. ",
     "agreemnet5": "Please be aware that CWG Markets (VU) is not authorized by the Financial Conduct Authority (FCA) to provide financial services in the UK.",
-    "agreemnet6": "Therefore, when CWG Markets Limited (VU) provides you with financial products or services, you will not have the benefit of the various protections that are available to clients of regulated (FCA) UK investment firms."
+    "agreemnet6": "Therefore, when CWG Markets Limited (VU) provides you with financial products or services, you will not have the benefit of the various protections that are available to clients of regulated (FCA) UK investment firms.",
+    "tabs1": "Sign In",
+    "tabs2": "Create An Account"
   },
   "forget": {
     "title": "Retrieve Password",

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

@@ -19,6 +19,7 @@
                 <th>ENERGY</th>
                 <th>CFD</th>
                 <th>INDEX</th>
+<!--                <th>Crypto</th>-->
               </tr>
             </thead>
             <tbody v-for="(group, gIndex) in commissionTemplateTableData" :key="gIndex">
@@ -145,6 +146,9 @@
         let params = {
           customId: props.detail.id,
         }
+        addAgentForm.value = {
+          customerId: props.detail.id,
+        };
         if (props.paramsType == 'vietnam') {
           params = {
             agentId: props.detail.id,
@@ -403,6 +407,9 @@
         if (row.energy2 !== undefined && row.energy2 !== null) {
           pointList.push({ symbolCategory: 5, point: row.energy2 }) // Energy
         }
+        // if (row.energy2 !== undefined && row.energy2 !== null) {
+        //   pointList.push({ symbolCategory: 5, point: row.energy2 }) // Energy
+        // }
       })
     })
 

+ 1208 - 562
pages/login/index.vue

@@ -2,24 +2,6 @@
   <view class="login-page" :isHeaderFixed="true" :isLoginPage="true">
     <view class="fixed" />
     <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> &lt;!&ndash; 左侧可预留放logo或留空 &ndash;&gt;-->
-<!--            <LoginHeaderGroup text-color="#fff" icon-color="#fff" />-->
-<!--          </view>-->
-<!--        </view>-->
-<!--      </cwg-match-media>-->
-
-      <!-- 移动端顶部栏:悬浮在上方,深色文字 -->
-<!--      <cwg-match-media :max-width="991">-->
-<!--        <view class="mobile-header-bar">-->
-<!--          &lt;!&ndash;          <view class="fixed"/>&ndash;&gt;-->
-
-<!--          <LoginHeaderGroup text-color="#141d22" icon-color="#141d22" />-->
-<!--        </view>-->
-<!--      </cwg-match-media>-->
-
       <uni-row class="demo-uni-row">
         <cwg-match-media :min-width="991" style="height: 100%;">
           <uni-col :xs="24" :sm="24" :md="12" :lg="14" :xl="16" style="height: 100%">
@@ -32,7 +14,7 @@
                   </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>
@@ -44,70 +26,207 @@
                     <text v-html="t('newSignin.item11')"></text>
                     <br />
                     <text v-t="'newSignin.item13'"></text>
-                    <cwg-link type="pdf" :title="'newSignin.item13_1'"
-                              :url="`pdf/Risk-Disclosures-and-Acknowledgements-2020-08.pdf`" target="_blank"
-                              v-t="'newSignin.item13_1'" class="doc-link" />
+                    <!--                    <cwg-link type="pdf" :title="'newSignin.item13_1'"-->
+                    <!--                              :url="`pdf/Risk-Disclosures-and-Acknowledgements-2020-08.pdf`" target="_blank"-->
+                    <!--                              v-t="'newSignin.item13_1'" class="doc-link" />-->
                     <text v-t="'newSignin.item13_2'"></text>
                     <!-- <view v-t="'newSignin.item13_3'"></view>
                     <text v-t="'newSignin.item13_4'"></text> -->
                   </view>
                 </view>
+                <image src="/static/images/trust-pilot.png" class="img-fluid mt--10" mode="widthFix"></image>
               </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-full.svg" class="company-icon" mode="widthFix"></image>
+          <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="#141d22" icon-color="#141d22" />
               </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>
+          </cwg-match-media>
+
+          <!-- 移动端顶部栏:悬浮在上方,深色文字 -->
+          <cwg-match-media :max-width="991">
+            <view class="mobile-header-bar">
+              <!--          <view class="fixed"/>-->
+
+              <LoginHeaderGroup text-color="#141d22" icon-color="#141d22" />
             </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>
+          </cwg-match-media>
+          <view class="account">
+            <view class="company u-flex-y u-flex-y-center">
+              <image src="/static/images/logo-full.svg" class="company-icon" mode="widthFix"></image>
+            </view>
+            <view class="tab-list">
+              <view
+                v-for="tab in tabs"
+                :key="tab.value"
+                class="tab-item"
+                :class="{ active: activeTab === tab.value }"
+                @click="handleClick(tab.value)"
+              >
+                <text class="tab-label">{{ tab.text }}</text>
               </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 v-show="activeTab == 1">
+              <view class="title">
+                <view class="tit1">{{ t('newSignin.item1') }}</view>
+                <view class="tit2">{{ t('newSignin.item2') }}</view>
+              </view>
+              <view>
+                <uni-forms ref="uFormRef" :model="form" labelWidth="200" label-position="top">
+                  <uni-forms-item :label="t('newSignup.item7')" prop="loginName">
+                    <up-input :customStyle="customStyle" v-model="form.loginName" border="none"
+                              :placeholder="t('signin.form.email')">
+                    </up-input>
+                  </uni-forms-item>
+
+                  <uni-forms-item :label="t('signin.form.password')" prop="password">
+                    <up-input :customStyle="customStyle" v-model="form.password" :type="inputType" border="none"
+                              :placeholder="t('signin.form.password')">
+                    </up-input>
+                  </uni-forms-item>
+                </uni-forms>
+              </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>
+                <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>
+              <view @click="activeTab = 2" class="account-tip">
+                {{ t('signin.words') }}
+                <text>{{ t('signin.signup') }}</text>
+              </view>
+            </view>
+            <view v-show="activeTab == 2" style="overflow-y: scroll;">
+              <view class="title">
+                <view class="tit1">{{ t('newSignup.item1') }}</view>
+                <view class="tit2">{{ t('newSignup.item2') }}</view>
+              </view>
+              <view>
+                <uni-forms ref="regForm" :modelValue="formData" :rules="rules" validate-trigger="blur" label-position="top"
+                  label-width="120">
+                  <uni-row :gutter="20" class="formContent">
+                    <uni-col :xs="24" :md="12">
+                      <uni-forms-item name="country" :label="t('newSignup.item3')">
+                        <cwg-combox v-model:value="formData.country" :options="countryOptions" filterable>
+                        </cwg-combox>
+                      </uni-forms-item>
+                    </uni-col>
+                    <uni-col :xs="24" :md="12">
+                      <uni-forms-item name="phone" :label="t('newSignup.item5')">
+                        <uni-easyinput v-model="formData.phone"></uni-easyinput>
+                      </uni-forms-item>
+                    </uni-col>
+                    <uni-col :xs="24" :md="12">
+                        <uni-forms-item name="birthDate" :label="t('newSignup.item18')">
+                          <uni-datetime-picker type="date" v-model="formData.birthDate"
+                            :placeholder="t('newSignup.item19')" @change="checkAge" />
+                        </uni-forms-item>
+                    </uni-col>
+                    <uni-col :xs="24" :md="12">
+                      <uni-forms-item name="email" :label="t('newSignup.item7')">
+                        <uni-easyinput v-model="formData.email" :placeholder="t('newSignup.item8')"
+                          :disabled="!isAgeValid || !formData.birthDate"></uni-easyinput>
+                      </uni-forms-item>
+                    </uni-col>
+                    <uni-col :xs="24" :md="24">
+                      <uni-forms-item name="emailCode" :label="t('newSignup.item9')">
+                        <view style="display: flex; gap: 8px;">
+                          <view style="flex: 1;">
+                            <uni-easyinput :disabled="!isAgeValid || !formData.birthDate" v-model="formData.emailCode"
+                              :placeholder="t('newSignup.item10')">
+                            </uni-easyinput>
+                          </view>
+                          <view class="btn-code" @click="(!isAgeValid || !formData.birthDate) ? '' : handleGetCode()">
+                            {{ getCodeString }}
+                          </view>
+                        </view>
+                      </uni-forms-item>
+                    </uni-col>
+                    <uni-col :xs="24" :md="24">
+                      <view class="agreemnet9">*{{ t('signup.agreemnet9') }}</view>
+                    </uni-col>
+                    <uni-col :xs="24" :md="12">
+                      <uni-forms-item name="password" :label="t('newSignup.item12')">
+                        <uni-easyinput v-model.trim="formData.password" :disabled="!isAgeValid || !formData.birthDate"
+                          :placeholder="t('newSignup.item13')" type="password"></uni-easyinput>
+                      </uni-forms-item>
+                      <uni-col :xs="24" :md="24">
+                        <uni-forms-item>
+                          <ul class="pwd">
+                            <li :class="{ fit: rule1 }" v-t="'signup.form.rules.1st'"></li>
+                            <li :class="{ fit: rule2 }" v-t="'signup.form.rules.2nd'"></li>
+                            <li :class="{ fit: rule3 }" v-t="'signup.form.rules.3rd'"></li>
+                          </ul>
+                        </uni-forms-item>
+                      </uni-col>
+                    </uni-col>
+                    <uni-col :xs="24" :md="12">
+                      <uni-forms-item v-if="!isRouteHasId" name="linkValue" :label="t('newSignup.item14')">
+                        <uni-easyinput v-model.trim="formData.linkValue" :disabled="!isAgeValid || !formData.birthDate"
+                          :placeholder="t('newSignup.item15')" @input="limitAgentIdLength"></uni-easyinput>
+                      </uni-forms-item>
+                    </uni-col>
+                  </uni-row>
+                  <uni-forms-item name="agree">
+                    <view class="check-box" @click="toggleAgree">
+                      <up-checkbox-group v-model="agreeGroup" @change="onAgreeChange">
+                        <up-checkbox size="14" labelSize="14" labelColor="#666666" activeColor="#ea002a" name="agree"
+                          class="wcg-checkbox"></up-checkbox>
+                      </up-checkbox-group>
+                      <text class="checkbox-label">{{ t('signup.agree') }}</text>
+                    </view>
+                  </uni-forms-item>
+                  <uni-forms-item name="isSubscribeEmail">
+                    <view class="check-box" @click="toggleSubscribeEmail">
+                      <up-checkbox-group v-model="subscribeEmailGroup" @change="onSubscribeEmailChange">
+                        <up-checkbox size="14" labelSize="14" labelColor="#666666" activeColor="#ea002a"
+                          name="subscribeEmail" class="wcg-checkbox"></up-checkbox>
+                      </up-checkbox-group>
+                      <text class="checkbox-label">{{ t('signup.agree1') }}</text>
+                    </view>
+                  </uni-forms-item>
+                </uni-forms>
+              </view>
+              <view>
+                <u-button class="regiset-btn" @click="register">
+                  {{ t('signup.button') }}
+                </u-button>
+              </view>
+              <view class="login-link">
+                <text>{{ t('newSignup.item16') }}</text>
+                <view class="link" @click="activeTab = 1">{{ t('newSignup.item17') }}</view>
+              </view>
+              <view class="des-bottom">
+                <text v-t="'signup.agreemnet1'"></text>
+                <cwg-link type="pdf" url='pdf/Client_Agreement.pdf' target="_blank" :title="'signup.agreemnet2'"
+                  class="desc-link" />
+                <text v-t="'signup.agreemnet3'"></text>
+                <cwg-link type="pdf" url='pdf/Terms&Conditions.pdf' target="_blank" :title="'signup.agreemnet4'"
+                  class="desc-link" />
+                <text v-t="'signup.agreemnet5'"></text>
+                <cwg-link type="pdf" url='pdf/Privacy_Policy.pdf' target="_blank" :title="'signup.agreemnet6'"
+                  class="desc-link" />
+                <text v-t="'signup.agreemnet7'"></text>
+              </view>
             </view>
-            <navigator url="/pages/login/regist" class="account-tip">
-              {{ t('signin.words') }}
-              <text>{{ t('signin.signup') }}</text>
-            </navigator>
             <cwg-match-media :min-width="791">
 
 
@@ -131,609 +250,1136 @@
   </view>
 </template>
 <script setup>
-import { ref, onMounted, computed } from 'vue'
-import QrCode from '@/components/QrCode.vue'
-import { post } from '@/utils/request'
-import { userToken } from '@/composables/config'
-import { userApi } from '@/api/user'
-import { ucardApi } from '@/api/ucard'
-import { customApi } from '@/service/custom'
-import useGlobalStore from '@/stores/use-global-store'
-import useUserStore from '@/stores/use-user-store'
-import useRouter from '@/hooks/useRouter'
-import { useI18n } from 'vue-i18n'
-import companyLogo from '@/static/images/logo4.png'
-import LoginHeaderGroup from './components/LoginHeaderGroup.vue'
-import LiveChatService from '@/utils/liveChat.js'
-import { useWindowWidth } from '@/composables/useWindowWidth'
-const windowWidth = useWindowWidth(300)
-const isMobile = computed(() => windowWidth.value <= 991)
-const router = useRouter()
-const { t } = useI18n()
-const userStore = useUserStore()
-const globalStore = useGlobalStore()
-const modeStore = computed(() => globalStore.mode)
-// 响应式表单数据
-const form = ref({
-  loginName: '',
-  password: '',
-})
-
-function submit() {
-  if (!form.value.loginName) {
-    uni.$u.toast(t('signin.form.email'))
-    return
-  }
-  if (!form.value.password) {
-    uni.$u.toast(t('signin.form.password'))
-    return
-  }
-
-  handleLogin()
-}
-
-const customStyle = {
-  height: '44px',
-  'border-radius': '8px',
-  background: '#f7f8fa',
-  padding: '0 20px !important',
-  position: 'relative',
-}
-const remenber = ref([])
-const checkboxChange = (e) => {
-  remenber.value = e
-}
-const fetchUserList = (params) => post('/Login/AcctLogin', params)
-
-async function handleLogin() {
-  try {
-    const res = await userApi.login({
-      loginName: form.value.loginName,
-      password: form.value.password,
-    })
-    if (res.code === 200) {
-      userToken.value = res.data
-      uni.$u.toast(t('login.msg0_1'))
-      getCustomLoginInfo()
-      // getCardUserInfo();
-      reasonsRefusalList()
-      if (remenber.value.length) {
-        userStore.saveAccountInfo({
-          loginName: form.value.loginName,
-          password: form.value.password,
-          rememberPassword: true,
-        })
+  import { ref, watch, onMounted, computed } from 'vue'
+  import { onLoad } from '@dcloudio/uni-app'
+  import QrCode from '@/components/QrCode.vue'
+  import { post } from '@/utils/request'
+  import { userToken } from '@/composables/config'
+  import { userApi } from '@/api/user'
+  import { ucardApi } from '@/api/ucard'
+  import { customApi } from '@/service/custom'
+  import { loginApi } from '@/api/login'
+  import { countryApi } from '@/api/country'
+  import Config from '@/config/index'
+  import { showToast } from '@/utils/toast'
+  import { useEmailCountdown } from '@/hooks/useEmailCountdown'
+  import useGlobalStore from '@/stores/use-global-store'
+  import useUserStore from '@/stores/use-user-store'
+  import useRouter from '@/hooks/useRouter'
+  import { useI18n } from 'vue-i18n'
+  import companyLogo from '@/static/images/logo4.png'
+  import LoginHeaderGroup from './components/LoginHeaderGroup.vue'
+  import LiveChatService from '@/utils/liveChat.js'
+  import { useWindowWidth } from '@/composables/useWindowWidth'
+  import { openLocalPdf } from '@/utils/pdf.js'
+
+  const windowWidth = useWindowWidth(300)
+  const isMobile = computed(() => windowWidth.value <= 991)
+  const router = useRouter()
+  const { t } = useI18n()
+  const { Code } = Config
+  const userStore = useUserStore()
+  const globalStore = useGlobalStore()
+  const modeStore = computed(() => globalStore.mode)
+  const tabs = computed(() => [
+    { text:t('signin.tabs1'),value:1, },
+    { text:t('signin.tabs2'),value:2, },
+  ])
+  const activeTab = ref(1)
+
+  // ========== 注册表单相关 ==========
+  const {
+    time,
+    text: getCodeString,
+    canSend,
+    start,
+    restore,
+  } = useEmailCountdown()
+
+  const isRouteHasId = ref(false)
+  const formData = ref({
+    country: 'CN',
+    phone: '',
+    birthDate: '',
+    email: '',
+    emailCode: '',
+    password: '',
+    linkValue: '',
+    agree: 0,
+    isSubscribeEmail: 0,
+    sourceCode: null,
+    w: '',
+    subId: '',
+    oc: '',
+    agentId: null,
+    ibInvalid: null,
+  })
+
+  const rules = {
+    country: { rules: [{ required: true, errorMessage: t('vaildate.country.empty'), trigger: 'blur' }] },
+    email: {
+      rules: [
+        { required: true, errorMessage: t('vaildate.email.empty'), trigger: 'blur' },
+        { pattern: Config.Pattern.Email, errorMessage: t('vaildate.email.format'), trigger: 'blur' },
+      ],
+    },
+    emailCode: { rules: [{ required: true, errorMessage: t('vaildate.code.empty'), trigger: 'blur' }] },
+    password: {
+      rules: [
+        { required: true, errorMessage: t('vaildate.password.format'), trigger: 'blur' },
+        { pattern: Config.Pattern.Password, errorMessage: t('vaildate.password.format'), trigger: 'blur' },
+      ],
+    },
+    agree: {
+      rules: [
+        {
+          validateFunction: (rule, value) => {
+            if (value) return true
+            return t('vaildate.agree.empty')
+          },
+          trigger: 'change',
+        },
+      ],
+    },
+    phone: {
+      rules: [
+        { required: true, errorMessage: t('vaildate.phone.format'), trigger: 'blur' },
+        { pattern: Config.Pattern.NonNegInt, errorMessage: t('vaildate.phone.format'), trigger: 'blur' },
+      ],
+    },
+    birthDate: { rules: [{ required: true, errorMessage: t('vaildate.birthDate.empty'), trigger: 'change' }] },
+  }
+
+  const agreeGroup = ref([])
+  const subscribeEmailGroup = ref([])
+  const regForm = ref(null)
+  const mock_options = ref([])
+  const countryCode = ref('my')
+
+  const countryOptions = computed(() => {
+    return mock_options.value.map(item => ({
+      text: item.enName,
+      value: item.code,
+      disabled: item.isOpenAccount == 0 || item.isOpenAccount === null ? true : false,
+    }))
+  })
+
+  watch(() => formData.value.agree, (val) => {
+    agreeGroup.value = val === 1 ? ['agree'] : []
+  }, { immediate: true })
+
+  watch(() => formData.value.isSubscribeEmail, (val) => {
+    subscribeEmailGroup.value = val === 1 ? ['subscribeEmail'] : []
+  }, { immediate: true })
+
+  const onAgreeChange = (e) => {
+    formData.value.agree = e && e.length ? 1 : 0
+  }
+
+  const onSubscribeEmailChange = (e) => {
+    formData.value.isSubscribeEmail = e && e.length ? 1 : 0
+  }
+
+  const toggleAgree = () => {
+    const next = agreeGroup.value.length ? [] : ['agree']
+    agreeGroup.value = next
+    onAgreeChange(next)
+  }
+
+  const toggleSubscribeEmail = () => {
+    const next = subscribeEmailGroup.value.length ? [] : ['subscribeEmail']
+    subscribeEmailGroup.value = next
+    onSubscribeEmailChange(next)
+  }
+
+  const rule1 = computed(() => {
+    if (!formData.value.password) return false
+    return /^.{8,16}$/.test(formData.value.password)
+  })
+
+  const rule2 = computed(() => {
+    return /^(?=.*?[a-z])(?=.*?[A-Z]).*$/.test(formData.value.password)
+  })
+
+  const rule3 = computed(() => {
+    return /^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?!.*([~!@&%$^\(\)#_]).*\1.*\1)[A-Za-z0-9~!@&%$^\(\)#_]{8,16}$/.test(
+      formData.value.password,
+    )
+  })
+
+  const isAgeValid = computed(() => {
+    if (!formData.value.birthDate) {
+      return false
+    }
+    const today = new Date()
+    const birthDate = new Date(formData.value.birthDate)
+    let age = today.getFullYear() - birthDate.getFullYear()
+    const monthDiff = today.getMonth() - birthDate.getMonth()
+    if (monthDiff < 0 || (monthDiff === 0 && today.getDate() < birthDate.getDate())) {
+      age--
+    }
+    return age >= 18
+  })
+
+  const checkAge = () => {
+    if (formData.value.birthDate && !isAgeValid.value) {
+      uni.showModal({
+        title: t('Msg.SystemPrompt'),
+        content: t('signup.ageRestriction'),
+        showCancel: false,
+        confirmText: t('Btn.Confirm'),
+        success: function (res) {
+          if (res.confirm) {
+          }
+        },
+      })
+    }
+  }
+
+  const limitAgentIdLength = (val) => {
+    if (val == null || val === '') return
+    const filtered = val.toString().replace(/[^0-9a-zA-Z]/g, '').slice(0, 10)
+    if (formData.value.linkValue !== filtered) {
+      formData.value.linkValue = filtered
+    }
+  }
+
+  onLoad((options) => {
+    if (options) {
+      formData.value.sourceCode = options.ex || null
+      formData.value.w = options.w || ''
+      formData.value.subId = options.SUBID || ''
+      formData.value.oc = options.oc || ''
+      formData.value.email = options.emailAdvertisement || ''
+
+      if (options.id) {
+        isRouteHasId.value = true
+        formData.value.agentId = Number(options.id)
+        formData.value.linkValue = options.commission || ''
+
+        switch (options.ibInvalid) {
+          case 'B0':
+            formData.value.ibInvalid = 0
+            break
+          case 'B1':
+            formData.value.ibInvalid = 1
+            break
+        }
+      }
+    }
+  })
+
+  const ho = ref('')
+
+  // 国家列表
+  async function getCountry() {
+    try {
+      let res = await countryApi.Country({})
+      if (res.code == 200) {
+        mock_options.value = res.data
       } else {
-        userStore.saveAccountInfo({
-          loginName: '',
-          password: '',
-          rememberPassword: false,
-        })
+        showToast(res.msg)
       }
-      //  console.log(1111);
+    } catch (error) {
+      console.error(error)
+    }
+  }
+
+  const getCountryMsg = async () => {
+    let res = await countryApi.CountryGet({})
+    if (res.code == Code.StatusOK) {
+      countryCode.value = res.msg
     } else {
-      uni.showToast({ title: res.msg })
-      //  console.log(12112);
+      console.log(res)
+    }
+  }
+
+  async function handleGetCode() {
+    if (!formData.value.birthDate) {
+      showToast(t('vaildate.birthDate.empty'))
+      return
+    }
+    if (!isAgeValid.value) {
+      showToast(t('signup.ageRestriction'))
+      return
+    }
+    if (!formData.value.country) {
+      showToast(t('vaildate.country.empty'))
+      return
     }
-  } catch (error) {
-    // console.log(error)
-    uni.showToast({ title: error.msg, icon: 'none' })
-    //  console.log(error, 19089);
+    if (!formData.value.email) {
+      showToast(t('vaildate.email.empty'))
+      return
+    }
+    if (!Config.Pattern.Email.test(formData.value.email)) {
+      showToast(t('vaildate.email.format'))
+      return
+    }
+
+    if (!canSend.value) return
+    await sendEmailCode()
   }
-}
 
-async function getCustomLoginInfo() {
-  try {
-    const res = await userApi.getUserInfo()
-    userStore.saveUserInfo(res.data)
+  async function sendEmailCode() {
+    const res = await loginApi.Code({
+      ...formData.value,
+    })
+
     if (res.code === 200) {
-      switch (modeStore.value) {
-        case 'customer':
-          router.reLaunch('/pages/customer/index')
-          break;
-        case 'ib':
-          router.reLaunch('/pages/ib/index')
-          break;
-        case 'follow':
-          router.reLaunch('/pages/follow/index')
-          break;
-
-        default:
-          break;
-      }
+      showToast(t('Msg.CodeSuccess'))
+      start()
+      return true
     } else {
-      uni.$u.toast(res.msg || t('login.msg0'))
+      showToast(t('Msg.CodeFail'))
+      return false
     }
-  } catch (error) {
-    //  console.log(error, 111);
   }
-}
 
-async function getCardUserInfo() {
-  try {
-    const res = await ucardApi.getSingle()
-    userStore.saveUserInfo(res.data)
-    if (res.code === 200) {
-      if (!res.data || res.data.approveStatus != 2) {
-        router.push('/pages/mine/improve')
+  const register = async () => {
+    if (countryCode.value == 'MY' || countryCode.value == 'ID') {
+      showToast('Registration not available for this region')
+      return
+    }
+    regForm.value.validate().then(async (res) => {
+      const chinaCountryCodes = ['CN']
+      const isChina = chinaCountryCodes.includes(formData.value.country)
+      const xSystemValue = isChina ? 'B' : 'A'
+
+      let resData = await loginApi.Register(
+        { ...formData.value },
+        { headers: { 'X-System': xSystemValue } },
+      )
+      if (resData.code == 200) {
+        showToast(t('Msg.registerSuc'))
+        registLogin()
       } else {
-        router.push('/pages/card/index')
+        showToast(resData.msg)
       }
-    } else {
-      uni.$u.toast(res.msg || t('login.msg0'))
+
+    }).catch(err => {
+      console.log('表单错误信息:', err)
+      showToast(err.msg)
+      return false
+    })
+  }
+
+  const registLogin = async () => {
+    try {
+      let res = await userApi.login({
+        loginName: formData.value.email,
+        password: formData.value.password,
+      })
+      if (res.code == 200) {
+        userToken.value = res.data
+        getRegistLoginInfo()
+      } else {
+        showToast(res.msg)
+      }
+    } catch (error) {
+      console.error(error)
     }
-  } catch (error) {
-    //  console.log(error, 111);
   }
-}
 
-async function reasonsRefusalList() {
-  try {
-    const res = await customApi.reasonsRefusalList()
-    if (res.code === 200) {
-      pickFields(res.data)
-    } else {
-      uni.$u.toast(res.msg || t('login.msg0'))
+  const getRegistLoginInfo = async () => {
+    try {
+      let res = await userApi.getUserInfo()
+      if (res.code == 200) {
+        userStore.saveUserInfo(res.data)
+        showToast(t('Msg.LoginSuccess'))
+        setTimeout(() => {
+          uni.reLaunch({
+            url: '/pages/customer/index',
+          })
+        }, 1000)
+      } else {
+        showToast(t('Msg.SystemError'))
+      }
+    } catch (error) {
+      console.error(error)
+    }
+  }
+
+  const openUrl = (url) => {
+    openLocalPdf(url)
+  }
+  // ========== 注册表单相关结束 ==========
+  // 响应式表单数据
+  const form = ref({
+    loginName: '',
+    password: '',
+  })
+
+  function submit() {
+    if (!form.value.loginName) {
+      uni.$u.toast(t('signin.form.email'))
+      return
+    }
+    if (!form.value.password) {
+      uni.$u.toast(t('signin.form.password'))
+      return
+    }
+
+    handleLogin()
+  }
+
+  const customStyle = {
+    height: '44px',
+    'border-radius': '8px',
+    background: '#f7f8fa',
+    padding: '0 20px !important',
+    position: 'relative',
+  }
+  const remenber = ref([])
+  const checkboxChange = (e) => {
+    remenber.value = e
+  }
+  const fetchUserList = (params) => post('/Login/AcctLogin', params)
+
+  const handleClick = (value)=>{
+    activeTab.value = value
+  }
+
+  async function handleLogin() {
+    try {
+      const res = await userApi.login({
+        loginName: form.value.loginName,
+        password: form.value.password,
+      })
+      if (res.code === 200) {
+        userToken.value = res.data
+        uni.$u.toast(t('login.msg0_1'))
+        getCustomLoginInfo()
+        // getCardUserInfo();
+        reasonsRefusalList()
+        if (remenber.value.length) {
+          userStore.saveAccountInfo({
+            loginName: form.value.loginName,
+            password: form.value.password,
+            rememberPassword: true,
+          })
+        } else {
+          userStore.saveAccountInfo({
+            loginName: '',
+            password: '',
+            rememberPassword: false,
+          })
+        }
+        //  console.log(1111);
+      } else {
+        uni.showToast({ title: res.msg })
+        //  console.log(12112);
+      }
+    } catch (error) {
+      // console.log(error)
+      uni.showToast({ title: error.msg, icon: 'none' })
+      //  console.log(error, 19089);
+    }
+  }
+
+  async function getCustomLoginInfo() {
+    try {
+      const res = await userApi.getUserInfo()
+      userStore.saveUserInfo(res.data)
+      if (res.code === 200) {
+        switch (modeStore.value) {
+          case 'customer':
+            router.reLaunch('/pages/customer/index')
+            break
+          case 'ib':
+            router.reLaunch('/pages/ib/index')
+            break
+          case 'follow':
+            router.reLaunch('/pages/follow/index')
+            break
+
+          default:
+            break
+        }
+      } else {
+        uni.$u.toast(res.msg || t('login.msg0'))
+      }
+    } catch (error) {
+      //  console.log(error, 111);
+    }
+  }
+
+  async function getCardUserInfo() {
+    try {
+      const res = await ucardApi.getSingle()
+      userStore.saveUserInfo(res.data)
+      if (res.code === 200) {
+        if (!res.data || res.data.approveStatus != 2) {
+          router.push('/pages/mine/improve')
+        } else {
+          router.push('/pages/card/index')
+        }
+      } else {
+        uni.$u.toast(res.msg || t('login.msg0'))
+      }
+    } catch (error) {
+      //  console.log(error, 111);
     }
-  } catch (error) {
-    //  console.log(error, 111);
   }
-}
 
-function pickFields(source, fields = ['content', 'enContent']) {
-  const result = {}
+  async function reasonsRefusalList() {
+    try {
+      const res = await customApi.reasonsRefusalList()
+      if (res.code === 200) {
+        pickFields(res.data)
+      } else {
+        uni.$u.toast(res.msg || t('login.msg0'))
+      }
+    } catch (error) {
+      //  console.log(error, 111);
+    }
+  }
+
+  function pickFields(source, fields = ['content', 'enContent']) {
+    const result = {}
+
+    Object.entries(source).forEach(([key, value]) => {
+      result[key] = fields.reduce((acc, f) => {
+        acc[f] = value[f] ?? null
+        return acc
+      }, {})
+    })
+    userStore.saveReasonsOptions(result)
+  }
+
+  onMounted(() => {
+    const accountInfo = userStore.accountInfo
+    if (accountInfo?.rememberPassword) {
+      form.value.loginName = accountInfo?.loginName || ''
+      form.value.password = accountInfo?.password || ''
+      remenber.value = ['记住我']
+    } else {
+      form.value.loginName = ''
+      form.value.password = ''
+      remenber.value = []
+    }
+
+    // 注册表单初始化
+    getCountry()
+    getCountryMsg()
 
-  Object.entries(source).forEach(([key, value]) => {
-    result[key] = fields.reduce((acc, f) => {
-      acc[f] = value[f] ?? null
-      return acc
-    }, {})
+    const hostParts = window.location.host.split('.')
+    ho.value = hostParts.length > 1 ? hostParts[1] : ''
   })
-  userStore.saveReasonsOptions(result)
-}
-
-onMounted(() => {
-
-  const accountInfo = userStore.accountInfo
-  if (accountInfo?.rememberPassword) {
-    form.value.loginName = accountInfo?.loginName || ''
-    form.value.password = accountInfo?.password || ''
-    remenber.value = ['记住我']
-  } else {
-    form.value.loginName = ''
-    form.value.password = ''
-    remenber.value = []
-  }
-})
-const inputType = ref('password')
-const isChatIconExpanded = ref(false)
-// 处理聊天图标点击
-const handleChatIconClick = () => {
-  // 如果还没显示 → 先滑出来
-  if (!isChatIconExpanded.value) {
-    isChatIconExpanded.value = true
-    return
-  }
-  if (isMobile.value) {
-    router.push('/pages/common/chat')
-  } else {
-    if (LiveChatService) {
-      LiveChatService.showChat();
-    }
-  }
-  setTimeout(() => {
-    isChatIconExpanded.value = false
-  }, 300)
-}
+  const inputType = ref('password')
+  const isChatIconExpanded = ref(false)
+  // 处理聊天图标点击
+  const handleChatIconClick = () => {
+    // 如果还没显示 → 先滑出来
+    if (!isChatIconExpanded.value) {
+      isChatIconExpanded.value = true
+      return
+    }
+    if (isMobile.value) {
+      router.push('/pages/common/chat')
+    } else {
+      if (LiveChatService) {
+        LiveChatService.showChat()
+      }
+    }
+    setTimeout(() => {
+      isChatIconExpanded.value = false
+    }, 300)
+  }
 </script>
 
 <style lang="scss" scoped>
-@import "@/uni.scss";
-
-:deep(uni-content) {
-  padding-left: 0 !important;
-}
-
-.login-page {
-  height: 100vh;
-  border: none;
-  padding: 0;
-  position: relative;
-  display: flex;
-  flex-direction: column;
-}
-
-.chat-icon {
-  width: px2rpx(50);
-  height: px2rpx(50);
-  border-radius: 50%;
-  background-color: #cf1322;
-  display: flex;
-  align-items: center;
-  justify-content: center;
-  position: fixed;
-  bottom: px2rpx(25);
-  right: px2rpx(-25);
-  z-index: 999;
-  cursor: pointer;
-  transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
-  box-shadow: 0 px2rpx(8) px2rpx(20) rgba(0, 0, 0, 0.15);
-  will-change: transform;
-}
-
-.chat-icon:hover {
-  transform: scale(1.1);
-}
-
-.chat-icon-expanded {
-  bottom: px2rpx(20);
-  right: px2rpx(20);
-  transform: scale(1.1);
-  box-shadow: 0 px2rpx(12) px2rpx(30) rgba(0, 0, 0, 0.2);
-}
-
-.chat-icon-hidden {
-  display: none;
-}
-
-.fixed {
-  width: 100%;
-  height: var(--status-bar-height);
-  background-color: var(--color-white);
-  z-index: 9;
-}
-
-.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%;
+  @import "@/uni.scss";
+
+  :deep(uni-content) {
+    padding-left: 0 !important;
+  }
+
+  .login-page {
+    height: 100vh;
+    border: none;
+    padding: 0;
+    position: relative;
+    display: flex;
+    flex-direction: column;
+  }
+
+  .chat-icon {
+    width: px2rpx(50);
+    height: px2rpx(50);
+    border-radius: 50%;
+    background-color: #cf1322;
     display: flex;
-    justify-content: space-between;
-    /* 两端对齐,可放logo和组件 */
     align-items: center;
+    justify-content: center;
+    position: fixed;
+    bottom: px2rpx(25);
+    right: px2rpx(-25);
+    z-index: 999;
+    cursor: pointer;
+    transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
+    box-shadow: 0 px2rpx(8) px2rpx(20) rgba(0, 0, 0, 0.15);
+    will-change: transform;
   }
-}
-
-.mobile-header-bar {
-  //position: absolute;
-  //top: px2rpx(20);
-  //right: px2rpx(20);
-  z-index: 10;
-  width: 100%;
-  display: flex;
-  background-color: var(--color-white);
-  justify-content: flex-end;
-}
-
-.main-content {
-  flex: 1;
-  overflow: hidden;
-}
-
-.demo-uni-row {
-  height: 100%;
-  margin: 0 !important;
-
-  .left-bg {
-    height: 100%;
-    min-height: calc(100vh - 120px);
-    background-image: url(/static/images/login-bg.gif);
-    background-size: cover;
-    background-position: center;
+
+  .chat-icon:hover {
+    transform: scale(1.1);
+  }
+
+  .chat-icon-expanded {
+    bottom: px2rpx(20);
+    right: px2rpx(20);
+    transform: scale(1.1);
+    box-shadow: 0 px2rpx(12) px2rpx(30) rgba(0, 0, 0, 0.2);
+  }
+
+  .chat-icon-hidden {
+    display: none;
+  }
+
+  .fixed {
+    width: 100%;
+    height: var(--status-bar-height);
+    background-color: var(--color-white);
+    z-index: 9;
+  }
+
+  .global-header-bar {
+    width: 100%;
+    height: px2rpx(60);
     display: flex;
-    flex-direction: column;
     align-items: center;
     justify-content: center;
+    flex-shrink: 0;
+    z-index: 100;
 
-    .left-box {
+    &.pc-header {
+      background-color: transparent;
+    }
+
+    .header-inner {
+      width: 100%;
+      padding: 0 5%;
       display: flex;
-      flex-direction: column;
-      justify-content: center;
-      align-items: flex-start;
-      width: 60%;
-      //margin-top: px2rpx(20);
+      justify-content: space-between;
+      /* 两端对齐,可放logo和组件 */
+      align-items: center;
+    }
+  }
 
-      .inner {
-        width: 100%;
-        text-align: start;
-        margin-bottom: px2rpx(20);
+  .mobile-header-bar {
+    //position: absolute;
+    //top: px2rpx(20);
+    //right: px2rpx(20);
+    z-index: 10;
+    width: 100%;
+    display: flex;
+    background-color: var(--color-white);
+    justify-content: flex-end;
+  }
 
-        .section-title {
-          margin-top: px2rpx(10);
-          margin-bottom: px2rpx(10);
-        }
+  .main-content {
+    flex: 1;
+    overflow: hidden;
+  }
 
+  .demo-uni-row {
+    height: 100%;
+    margin: 0 !important;
+
+    .left-bg {
+      height: 100%;
+      min-height: calc(100vh - 120px);
+      background-image: url(/static/images/login-bg.gif);
+      background-size: cover;
+      background-position: center;
+      display: flex;
+      box-sizing: border-box;
+      padding: px2rpx(50);
+      //flex-direction: column;
+      //align-items: center;
+      justify-content: center;
 
-        .title {
-          font-size: px2rpx(50);
-          line-height: 1;
-          color: #fff;
-          font-weight: 700;
-          text-align: left;
+      .left-box {
+        display: flex;
+        flex-direction: column;
+        justify-content: center;
+        align-items: flex-start;
+        width: 60%;
+        //margin-top: px2rpx(20);
+
+        .inner {
+          width: 100%;
+          text-align: start;
+          //margin-bottom: px2rpx(20);
+
+          .section-title {
+            //margin-top: px2rpx(10);
+            //margin-bottom: px2rpx(10);
+          }
+
+
+          .title {
+            margin: 0 0 0 px2rpx(10);
+            font-size: px2rpx(56);
+            line-height: 1.2;
+            color: #fff;
+            font-weight: 700;
+            text-align: left;
+          }
+
+          .w-700 {
+            font-weight: 700;
+          }
+
+          .subtitle {
+            width: 45%;
+            font-size: px2rpx(18);
+            letter-spacing: px2rpx(1);
+            display: block;
+            margin-bottom: px2rpx(24);
+            color: #ffffff;
+            line-height: px2rpx(15);
+            font-weight: 500;
+            padding: px2rpx(10) px2rpx(20);
+            border-radius: px2rpx(100);
+            text-transform: uppercase;
+            background-color: #e61f1e;
+            text-align: center;
+          }
+
+          .w-40 {
+            max-width: 40%;
+          }
+
+          .text-white {
+            margin-top: px2rpx(10);
+            font-size: px2rpx(18);
+            margin-bottom: px2rpx(16);
+            line-height: 1.6;
+            color: #fff;
+          }
         }
 
-        .w-700 {
-          font-weight: 700;
+        .img-fluid {
+          width: 400px;
+          height: 33px;
         }
 
-        .subtitle {
-          width: 45%;
-          font-size: px2rpx(18);
-          letter-spacing: px2rpx(1);
-          display: block;
-          margin-bottom: px2rpx(24);
-          color: #ffffff;
-          line-height: px2rpx(15);
-          font-weight: 500;
-          padding: px2rpx(10) px2rpx(20);
-          border-radius: px2rpx(100);
-          text-transform: uppercase;
-          background-color: #e61f1e;
-          text-align: center;
+        .mt--10 {
+          margin-top: px2rpx(10);
         }
 
-        .w-40 {
-          max-width: 40%;
+        .h1 {
+          // text-align: center;
+          color: #fff;
+          font-size: 30px;
+          margin-top: 30px;
+          line-height: 1.5;
         }
 
-        .text-white {
-          margin-top: px2rpx(10);
-          font-size: px2rpx(14);
-          line-height: 1.6;
+        .h6 {
+          text-align: start;
+          line-height: 20px;
           color: #fff;
+          font-size: 14px;
+          margin-top: 10px;
         }
-      }
-
-      .img-fluid {
-        width: 100%;
-        max-width: px2rpx(240);
-      }
-
-      .mt--10 {
-        margin-top: px2rpx(10);
-      }
-
-      .h1 {
-        // text-align: center;
-        color: #fff;
-        font-size: 30px;
-        margin-top: 30px;
-        line-height: 1.5;
-      }
 
-      .h6 {
-        text-align: start;
-        line-height: 20px;
-        color: #fff;
-        font-size: 14px;
-        margin-top: 10px;
+        .company {
+          padding: px2rpx(10) 0 px2rpx(10) 0;
+          position: relative;
+          align-items: flex-start !important;
+          width: 100%;
+        }
       }
 
-      .company {
-        padding: px2rpx(10) 0 px2rpx(10) 0;
-        position: relative;
-        align-items: flex-start !important;
+      .left-content {
         width: 100%;
+
+        .des {
+          text-align: start;
+          line-height: 24px;
+          color: #fff;
+          font-size: 14px;
+          //margin-top: px2rpx(20);
+
+          :nth-child(n) {
+            display: inline;
+            word-break: break-all;
+            word-wrap: break-word;
+          }
+
+          .doc-link {
+            color: var(--color-error);
+            text-decoration: underline;
+            margin: 0 px2rpx(4);
+          }
+        }
       }
     }
 
-    .left-content {
-      width: 100%;
+    .right-f {
+      background-color: var(--color-white);
+      padding: 0 px2rpx(24);
+      height: 100%;
+      box-sizing: border-box;
 
-      .des {
-        text-align: start;
-        line-height: 24px;
-        color: #fff;
-        font-size: 14px;
-        margin-top: px2rpx(20);
-
-        :nth-child(n) {
-          display: inline;
-          word-break: break-all;
-          word-wrap: break-word;
+      .account {
+        background-color: var(--color-white);
+        position: relative;
+        height: calc(100vh - 120px);
+        display: flex;
+        flex-direction: column;
+        justify-content: center;
+        padding: 0 10%;
+
+        .company {
+          padding: px2rpx(50) 0 px2rpx(20) 0;
+          position: relative;
+          align-items: center !important;
         }
 
-        .doc-link {
-          color: var(--color-error);
-          text-decoration: underline;
-          margin: 0 px2rpx(4);
+        .company-icon {
+          width: px2rpx(234);
         }
       }
     }
   }
 
-  .right-f {
+  .bottom-box {
+    width: 100%;
+    height: 60px;
     background-color: var(--color-white);
-    padding: 0 px2rpx(24);
-    height: 100%;
-    box-sizing: border-box;
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    color: #000;
 
-    .account {
-      background-color: var(--color-white);
-      position: relative;
-      height: calc(100vh - 120px);
-      display: flex;
-      flex-direction: column;
-      justify-content: center;
-      padding: 0 10%;
+    .bottom-title {
 
-      .company {
-        padding: px2rpx(50) 0 px2rpx(20) 0;
-        position: relative;
-        align-items: center !important;
-      }
+      text-align: center;
+      font-size: px2rpx(14);
+      font-weight: 500;
+      line-height: 1.5;
+      color: #666666;
 
-      .company-icon {
-        width: px2rpx(234);
-      }
     }
+
+    .ellipsis {
+      width: px2rpx(200);
+      white-space: nowrap;
+      overflow: hidden;
+      text-overflow: ellipsis;
+    }
+
+    .cwg-button {
+      width: 120px !important;
+      padding: px2rpx(4) 0 !important;
+    }
+  }
+
+
+  button {
+    background-color: #ea002a;
+    font-size: px2rpx(14);
+    font-weight: normal;
+    height: px2rpx(44);
+    line-height: px2rpx(44);
   }
-}
 
-.bottom-box {
-  width: 100%;
-  height: 60px;
-  background-color: var(--color-white);
-  display: flex;
-  justify-content: center;
-  align-items: center;
-  color: #000;
+  .right-f .account .company {
+    padding: px2rpx(50) 0 px2rpx(200) 0;
+    position: relative;
+    align-items: flex-start !important;
+  }
+
+  .logo {
+    margin-left: px2rpx(48);
+  }
+
+  .left-bg .company-icon {
+    width: px2rpx(234);
+  }
 
-  .bottom-title {
+  .left-bg .left-content {
+    position: relative;
+    z-index: 1;
+  }
 
+  .title {
+    margin: px2rpx(32) 0;
+    font-size: px2rpx(24);
+    font-weight: bolder;
+    color: #e4e4e4;
     text-align: center;
-    font-size: px2rpx(14);
-    font-weight: 500;
+
+    i {
+      margin-right: px2rpx(10);
+    }
+
+    .tit1 {
+      font-size: px2rpx(34);
+      line-height: 1.5;
+      font-weight: bold;
+      color: #000000;
+    }
+
+    .tit2 {
+      font-size: px2rpx(16);
+      line-height: 1.5;
+      color: #cecece;
+      font-weight: 500;
+    }
+  }
+
+  .qr-title {
+    font-size: px2rpx(16);
     line-height: 1.5;
+    color: #cecece;
+    font-weight: 500;
+    text-align: center;
+    margin: px2rpx(40) 0;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+
+    .line {
+      flex: 1;
+      height: 1px;
+      background-color: #e4e4e4;
+    }
+
+    .qr-tit2 {
+      margin: 0 px2rpx(12);
+
+    }
+
+  }
+
+  .input {
+    height: px2rpx(44);
+    border-radius: px2rpx(8);
+    background: #f7f8fa;
+    padding: 0 px2rpx(20) !important;
+    position: relative;
+  }
+
+  .account-icon {
+    width: px2rpx(12);
+    height: px2rpx(14) !important;
+    margin-right: px2rpx(5);
+  }
+
+  :deep(.u-input__content__prefix-icon) {
+    height: px2rpx(20);
+  }
+
+  .regiset-btn {
+    margin: px2rpx(20) 0;
+  }
+
+  .account-tip {
     color: #666666;
+    font-size: px2rpx(14);
+    text-align: center;
 
+    text {
+      color: #ea002a;
+    }
   }
 
-  .ellipsis {
-    width: px2rpx(200);
-    white-space: nowrap;
-    overflow: hidden;
-    text-overflow: ellipsis;
+  :deep(.u-form-item__body) {
+    padding: 0 !important;
+    padding-bottom: px2rpx(24) !important;
+  }
+
+  :deep(.wcg-checkbox) {
+    padding: 0 !important;
   }
 
   .cwg-button {
-    width: 120px !important;
-    padding: px2rpx(4) 0 !important;
+    padding: px2rpx(34) 0 !important;
+  }
+
+  .tab-list {
+    width: 100%;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    //gap: 5px;
+    //padding-bottom: 10px;
+    border-bottom: 1px solid #e4e4e4;
   }
-}
 
+  .tab-item {
+    width: 50%;
+    margin: 0 px2rpx(15);
+    padding-right: 0;
+    padding-left: 0;
+    padding-bottom: 8px;
+    text-align: center;
+    border-bottom: 0.1rem solid transparent;
+    font-weight: 500;
+    color: #333;
+    cursor: pointer;
+    transition: all 0.3s ease;
 
-button {
-  background-color: #ea002a;
-  font-size: px2rpx(14);
-  font-weight: normal;
-  height: px2rpx(44);
-  line-height: px2rpx(44);
-}
+    .tab-label {
+      font-size: px2rpx(24);
+    }
 
-.right-f .account .company {
-  padding: px2rpx(50) 0 px2rpx(200) 0;
-  position: relative;
-  align-items: flex-start !important;
-}
+    &:hover,
+    &:focus {
+      font-weight: 700;
+      color: #e32326;
+      border-bottom-color: #e32326;
+    }
 
-.logo {
-  margin-left: px2rpx(48);
-}
+    &.active {
+      font-weight: 700;
+      color: #e32326;
+      border-bottom-color: #e32326;
+    }
+  }
 
-.left-bg .company-icon {
-  width: px2rpx(234);
-}
+  /* 注册表单样式 */
+  .pwd {
+    list-style: none;
+    padding-left: 0;
+    margin: 0;
 
-.left-bg .left-content {
-  position: relative;
-  z-index: 1;
-}
+    li {
+      font-size: px2rpx(12);
+      color: #999;
+      line-height: px2rpx(20);
+      position: relative;
+      padding-left: px2rpx(16);
+
+      &::before {
+        content: '';
+        position: absolute;
+        left: 0;
+        top: 50%;
+        transform: translateY(-50%);
+        width: px2rpx(6);
+        height: px2rpx(6);
+        border-radius: 50%;
+        background-color: #999;
+      }
 
-.title {
-  margin: px2rpx(32) 0;
-  font-size: px2rpx(24);
-  font-weight: bolder;
-  color: #e4e4e4;
-  text-align: center;
+      &.fit {
+        color: #67c23a;
 
-  i {
-    margin-right: px2rpx(10);
+        &::before {
+          background-color: #67c23a;
+        }
+      }
+    }
   }
 
-  .tit1 {
-    font-size: px2rpx(34);
-    line-height: 1.5;
-    font-weight: bold;
-    color: #000000;
+  .formContent {
+    padding: 0 10px;
   }
 
-  .tit2 {
-    font-size: px2rpx(16);
-    line-height: 1.5;
-    color: #cecece;
-    font-weight: 500;
+  :deep(.uni-stat-box) {
+    height: 100%;
   }
-}
 
-.qr-title {
-  font-size: px2rpx(16);
-  line-height: 1.5;
-  color: #cecece;
-  font-weight: 500;
-  text-align: center;
-  margin: px2rpx(40) 0;
-  display: flex;
-  align-items: center;
-  justify-content: center;
+  :deep(.uni-select) {
+    height: 100%;
+  }
 
-  .line {
-    flex: 1;
-    height: 1px;
-    background-color: #e4e4e4;
+  :deep(.uni-easyinput__content) {
+    height: 100%;
   }
 
-  .qr-tit2 {
-    margin: 0 px2rpx(12);
+  :deep(.uni-date-editor) {
+    height: 100%;
+  }
 
+  :deep(.uni-date-editor--x) {
+    height: 100%;
   }
 
-}
+  .btn-code {
+    margin-left: -10px;
+    width: 120px;
+    height: px2rpx(37);
+    box-sizing: border-box;
+    background-color: #102047;
+    //border: 1px solid rgb(229, 229, 229);
+    color: #fff;
+    text-align: center;
+    line-height: px2rpx(38);
+    border-radius: 0 18px 18px 0;
+    cursor: pointer;
+    font-size: 14px;
+    flex-shrink: 0;
+  }
 
-.input {
-  height: px2rpx(44);
-  border-radius: px2rpx(8);
-  background: #f7f8fa;
-  padding: 0 px2rpx(20) !important;
-  position: relative;
-}
+  .check-box {
+    padding: 0 px2rpx(10);
+    margin-bottom: px2rpx(10);
+    display: flex;
+    align-items: center;
+    cursor: pointer;
 
-.account-icon {
-  width: px2rpx(12);
-  height: px2rpx(14) !important;
-  margin-right: px2rpx(5);
-}
+    .checkbox-label {
+      font-size: px2rpx(14);
+      color: #666666;
+      margin-left: px2rpx(8);
+      user-select: none;
+    }
 
-:deep(.u-input__content__prefix-icon) {
-  height: px2rpx(20);
-}
+    :deep(.u-checkbox) {
+      display: flex;
+      align-items: flex-start;
+    }
+  }
 
-.regiset-btn {
-  margin: px2rpx(20) 0;
-}
+  .regiset-btn {
+    width: 100%;
+    height: px2rpx(40);
+    border-radius: px2rpx(4);
+    background-color: var(--color-error);
+    color: #fff;
+    font-weight: bold;
+  }
 
-.account-tip {
-  color: #666666;
-  font-size: px2rpx(14);
-  text-align: center;
+  .login-link {
+    width: 100%;
+    margin-top: px2rpx(20);
+    text-align: center;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    font-size: px2rpx(16);
+    line-height: 1.6;
+  }
 
-  text {
-    color: #ea002a;
+  .link {
+    margin-left: px2rpx(5);
+    color: #e61f1e;
+    padding-bottom: 2px;
+    cursor: pointer;
+    font-size: px2rpx(14);
   }
-}
 
-:deep(.u-form-item__body) {
-  padding: 0 !important;
-  padding-bottom: px2rpx(24) !important;
-}
+  .agreemnet9 {
+    text-align: initial;
+    color: #e61f1e;
+  }
 
-:deep(.wcg-checkbox) {
-  padding: 0 !important;
-}
+  .des-bottom {
+    margin-top: px2rpx(20);
+    line-height: 20px;
+    color: #000;
+    font-size: 12px;
 
-.cwg-button {
-  padding: px2rpx(34) 0 !important;
-}
+    .desc-link {
+      display: inline-block;
+      color: #e61f1e;
+      text-decoration: underline;
+    }
+  }
 </style>