Pārlūkot izejas kodu

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

zhb 1 mēnesi atpakaļ
vecāks
revīzija
20d4fc2586
2 mainītis faili ar 643 papildinājumiem un 458 dzēšanām
  1. 387 360
      pages/login/index.vue
  2. 256 98
      pages/login/regist.vue

+ 387 - 360
pages/login/index.vue

@@ -1,173 +1,196 @@
 <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 logoImage from "/static/images/logo3.png";
-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;
+  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'
+
+  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()
   }
-  if (!form.value.password) {
-    uni.$u.toast(t("signin.form.password"));
-    return;
+
+  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,
+          })
+        } else {
+          userStore.saveAccountInfo({
+            loginName: '',
+            password: '',
+            rememberPassword: false,
+          })
+        }
+        //  console.log(1111);
+      } else {
+        uni.showToast({ title: res.msg })
+        //  console.log(12112);
+      }
+    } catch (error) {
+      //  console.log(error, 19089);
+    }
   }
 
-  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,
-        });
+  async function getCustomLoginInfo() {
+    try {
+      const res = await userApi.getUserInfo()
+      userStore.saveUserInfo(res.data)
+      if (res.code === 200) {
+        router.reLaunch(modeStore.value === 'customer' ? '/pages/customer/index' : '/pages/ib/index')
       } else {
-        userStore.saveAccountInfo({
-          loginName: "",
-          password: "",
-          rememberPassword: false,
-        });
+        uni.$u.toast(res.msg || t('login.msg0'))
       }
-      //  console.log(1111);
-    } else {
-      uni.showToast({title: res.msg})
-      //  console.log(12112);
+    } catch (error) {
+      //  console.log(error, 111);
     }
-  } catch (error) {
-    //  console.log(error, 19089);
   }
-}
-async function getCustomLoginInfo() {
-  try {
-    const res = await userApi.getUserInfo();
-    userStore.saveUserInfo(res.data);
-    if (res.code === 200) {
-      router.reLaunch(modeStore.value === 'customer' ? "/pages/customer/index" : "/pages/ib/index");
-    } else {
-      uni.$u.toast(res.msg || t("login.msg0"));
+
+  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);
   }
-}
-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");
+
+  async function reasonsRefusalList() {
+    try {
+      const res = await customApi.reasonsRefusalList()
+      if (res.code === 200) {
+        pickFields(res.data)
       } else {
-        router.push("/pages/card/index");
+        uni.$u.toast(res.msg || t('login.msg0'))
       }
-    } else {
-      uni.$u.toast(res.msg || t("login.msg0"));
+    } catch (error) {
+      //  console.log(error, 111);
     }
-  } catch (error) {
-    //  console.log(error, 111);
   }
-}
-async function reasonsRefusalList() {
-  try {
-    const res = await customApi.reasonsRefusalList();
-    if (res.code === 200) {
-      pickFields(res.data);
+
+  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 hostParts = window.location.host.split('.')
+    ho.value = hostParts.length > 1 ? hostParts[1] : ''
+
+    const accountInfo = userStore.accountInfo
+    if (accountInfo?.rememberPassword) {
+      form.value.loginName = accountInfo?.loginName || ''
+      form.value.password = accountInfo?.password || ''
+      remenber.value = ['记住我']
     } else {
-      uni.$u.toast(res.msg || t("login.msg0"));
+      form.value.loginName = ''
+      form.value.password = ''
+      remenber.value = []
     }
-  } 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 = [];
-  }
-});
-const inputType = ref("password");
+  const inputType = ref('password')
+  const ho = ref('')
 </script>
 
 <template>
   <view class="login-page" :isHeaderFixed="true" :isLoginPage="true">
     <uni-row class="demo-uni-row">
       <cwg-match-media :min-width="991">
-        <uni-col :xs="24" :sm="24" :md="12" :lg="14" :xl="16" class="left-bg">
-          <view class="company logo u-flex-y u-flex-y-center">
-            <image src="/static/images/logo4.png" class="company-icon" mode="widthFix"></image>
-          </view>
-          <view class="left-box">
-            <view class="left-content">
-              <view class="h1">
-                <text>{{ t('newLoop.item12') }}</text>
-                <br />
-                <text class="color-white">{{ t('newLoop.item13') }}</text>
+        <uni-col :xs="24" :sm="24" :md="12" :lg="14" :xl="16">
+          <view class="left-bg">
+            <view class="left-box">
+              <view>
+
               </view>
-              <view class="h6 text-white">{{ t('newLoop.item14') }}</view>
-              <view class="company u-flex-y u-flex-y-center">
-                <image src="/static/images/trust-pilot.png" class="company-icon" 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>
           </view>
@@ -188,7 +211,7 @@ const inputType = ref("password");
             <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')">
+                          :placeholder="t('signin.form.email')">
                   <template #prefix>
                     <cwg-icon name="email-outline" :size="20" color="#000" />
                   </template>
@@ -197,7 +220,7 @@ const inputType = ref("password");
 
               <up-form-item label="" prop="password">
                 <up-input :customStyle="customStyle" v-model="form.password" :type="inputType" border="none"
-                  :placeholder="t('signin.form.password')">
+                          :placeholder="t('signin.form.password')">
                   <template #prefix>
                     <cwg-icon name="lock-outline" :size="20" color="#000" />
                   </template>
@@ -209,21 +232,21 @@ const inputType = ref("password");
             <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>
+                             :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>
+              <text>{{ t('signin.forget') }}</text>
             </navigator>
           </view>
           <view class="cwg-button">
             <u-button type="primary" class="" @click="submit">
-              {{ t("signin.login") }}
+              {{ t('signin.login') }}
             </u-button>
           </view>
           <navigator url="/pages/login/regist" class="account-tip">
-            {{ t("signin.words") }}
-            <text>{{ t("signin.signup") }}</text>
+            {{ t('signin.words') }}
+            <text>{{ t('signin.signup') }}</text>
           </navigator>
           <cwg-match-media :min-width="791">
 
@@ -240,268 +263,272 @@ const inputType = ref("password");
         </view>
       </uni-col>
     </uni-row>
-    <view class="bottom-box">
-      <cwg-match-media :max-width="791">
-        <view class="bottom-title ellipsis">{{ t('newSignin.item12') }}</view>
-      </cwg-match-media>
-      <cwg-match-media :min-width="791">
-        <view class="bottom-title">{{ t('newSignin.item12') }}</view>
-      </cwg-match-media>
-      <view class="cwg-button">
-        <u-button type="primary" class="" @click="">
-          {{ t("News.More") }}
-        </u-button>
-      </view>
-    </view>
   </view>
 </template>
 
 <style lang="scss" scoped>
-@import "@/uni.scss";
-
-:deep(uni-content) {
-  padding-left: 0 !important;
-}
+  @import "@/uni.scss";
 
-.login-page {
-  height: 100vh;
-  border: none;
-  padding: 0;
-}
+  :deep(uni-content) {
+    padding-left: 0 !important;
+  }
 
-.demo-uni-row {
-  margin: 0 !important;
+  .login-page {
+    height: 100vh;
+    border: none;
+    padding: 0;
+  }
 
-  .left-bg {
-    height: calc(100vh - 60px);
-    background-image: url(/static/images/login-bg.gif);
-    background-repeat: no-repeat;
-    background-size: cover;
-    background-position: center center;
+  .demo-uni-row {
+    margin: 0 !important;
 
-    .left-box {
+    .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;
       display: flex;
       flex-direction: column;
-      justify-content: center;
       align-items: center;
 
-      .h1 {
-        // text-align: center;
-        line-height: 20px;
-        color: #fff;
-        font-size: 30px;
-        margin-top: 30px;
-        font-size: 700;
-        line-height: 1.5;
+      .left-box {
+        display: flex;
+        flex-direction: column;
+        justify-content: center;
+        align-items: center;
+        width: 60%;
+        margin-top: px2rpx(20);
+
+        .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%;
+        }
       }
 
-      .h6 {
-        text-align: start;
-        line-height: 20px;
-        color: #fff;
-        font-size: 14px;
-        margin-top: 10px;
-      }
-
-      .company {
-        padding: px2rpx(40) 0 px2rpx(50) 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: #ffde02;
+            text-decoration: underline;
+            margin: 0 px2rpx(4);
+          }
+        }
       }
     }
 
-    .left-content {
-      .h1 {
-        // text-align: center;
-        line-height: 20px;
-        color: #fff;
-        font-size: 30px;
-        margin-top: 30px;
-        font-size: 700;
-        line-height: 1.5;
-      }
+    .right-f {
+      background-color: var(--color-white);
+      padding: 0 px2rpx(24);
+      box-sizing: border-box;
 
-      .h6 {
-        line-height: 20px;
-        color: #fff;
-        font-size: 14px;
-        margin-top: 10px;
+      .account {
+        background-color: var(--color-white);
+        position: relative;
+        height: calc(100vh - 60px);
+        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;
+        }
+
+        .company-icon {
+          width: px2rpx(234);
+        }
       }
     }
   }
 
-  .right-f {
+  .bottom-box {
+    width: 100%;
+    height: 60px;
     background-color: var(--color-white);
-    padding: 0 px2rpx(24);
-    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 - 60px);
-      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);
-      }
     }
-  }
-}
 
-.bottom-box {
-  width: 100%;
-  height: 60px;
-  background-color: var(--color-white);
-  display: flex;
-  justify-content: center;
-  align-items: center;
-  color: #000;
+    .ellipsis {
+      width: px2rpx(200);
+      white-space: nowrap;
+      overflow: hidden;
+      text-overflow: ellipsis;
+    }
 
-  .bottom-title {
+    .cwg-button {
+      width: 120px !important;
+      padding: px2rpx(4) 0 !important;
+    }
+  }
 
-    text-align: center;
-    font-size: px2rpx(14);
-    font-weight: 500;
-    line-height: 1.5;
-    color: #666666;
 
+  button {
+    background-color: #ea002a;
+    font-size: px2rpx(14);
+    font-weight: normal;
+    height: px2rpx(44);
+    line-height: px2rpx(44);
   }
 
-  .ellipsis {
-    width: px2rpx(200);
-    white-space: nowrap;
-    overflow: hidden;
-    text-overflow: ellipsis;
+  .right-f .account .company {
+    padding: px2rpx(50) 0 px2rpx(200) 0;
+    position: relative;
+    align-items: flex-start !important;
   }
 
-  .cwg-button {
-    width: 120px !important;
-    padding: px2rpx(4) 0 !important;
+  .logo {
+    margin-left: px2rpx(48);
   }
-}
-
-
 
+  .left-bg .company-icon {
+    width: px2rpx(234);
+  }
 
-button {
-  background-color: #ea002a;
-  font-size: px2rpx(14);
-  font-weight: normal;
-  height: px2rpx(44);
-  line-height: px2rpx(44);
-}
-
-.company {
-  padding: px2rpx(50) 0 px2rpx(200) 0;
-  position: relative;
-  align-items: flex-start !important;
-}
+  .left-bg .left-content {
+    position: relative;
+    z-index: 1;
+  }
 
-.logo {
-  margin-left: px2rpx(48);
-}
+  .title {
+    margin: px2rpx(32) 0;
+    font-size: px2rpx(24);
+    font-weight: bolder;
+    color: #e4e4e4;
+    text-align: center;
 
-.title {
-  margin: px2rpx(32) 0;
-  font-size: px2rpx(24);
-  font-weight: bolder;
-  color: #e4e4e4;
-  text-align: center;
+    i {
+      margin-right: px2rpx(10);
+    }
 
-  i {
-    margin-right: px2rpx(10);
-  }
+    .tit1 {
+      font-size: px2rpx(34);
+      line-height: 1.5;
+      font-weight: bold;
+      color: #000000;
+    }
 
-  .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;
+    }
   }
 
-  .tit2 {
+  .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);
+
+    }
+
   }
-}
-
-.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;
+
+  .input {
+    height: px2rpx(44);
+    border-radius: px2rpx(8);
+    background: #f7f8fa;
+    padding: 0 px2rpx(20) !important;
+    position: relative;
   }
 
-  .qr-tit2 {
-    margin: 0 px2rpx(12);
+  .account-icon {
+    width: px2rpx(12);
+    height: px2rpx(14) !important;
+    margin-right: px2rpx(5);
+  }
 
+  :deep(.u-input__content__prefix-icon) {
+    height: px2rpx(20);
   }
 
-}
-
-.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;
+  .regiset-btn {
+    margin: px2rpx(20) 0;
   }
-}
 
-:deep(.u-form-item__body) {
-  padding: 0 !important;
-  padding-bottom: px2rpx(24) !important;
-}
+  .account-tip {
+    color: #666666;
+    font-size: px2rpx(14);
+    text-align: center;
+
+    text {
+      color: #ea002a;
+    }
+  }
 
-:deep(.wcg-checkbox) {
-  padding: 0 !important;
-}
+  :deep(.u-form-item__body) {
+    padding: 0 !important;
+    padding-bottom: px2rpx(24) !important;
+  }
+
+  :deep(.wcg-checkbox) {
+    padding: 0 !important;
+  }
 
-.cwg-button {
-  padding: px2rpx(34) 0 !important;
-}
-</style>
+  .cwg-button {
+    padding: px2rpx(34) 0 !important;
+  }
+</style>

+ 256 - 98
pages/login/regist.vue

@@ -1,76 +1,107 @@
 <template>
-  <cwg-page-wrapper isLoginPage>
-    <view class="regist-content">
-      <uni-row class="content">
-        <uni-col :span="20" :offset="2" :sm="{ span: 14, offset: 5 }">
-          <view class="regist-header">
-            <text class="title">{{ t('signup.title') }}</text>
-            <view class="login-link">
-              <text class="text">{{ t('Label.Or') }}</text>
-              <navigator url="/pages/login/index" class="link" hover-class="none">{{ t('signin.login') }}
-              </navigator>
+  <view class="regist-page" :isHeaderFixed="true" :isLoginPage="true">
+    <uni-row class="demo-uni-row">
+      <cwg-match-media :min-width="991">
+        <uni-col :xs="24" :sm="24" :md="12" :lg="14" :xl="16" class="left-bg">
+          <view class="company logo u-flex-y u-flex-y-center">
+            <image src="/static/images/logo4.png" class="company-icon" mode="widthFix"></image>
+          </view>
+          <view class="left-box">
+            <view class="left-content">
+              <view class="h1">
+                <text>{{ t('newLoop.item12') }}</text>
+                <br />
+                <text class="color-white">{{ t('newLoop.item13') }}</text>
+              </view>
+              <view class="h6 text-white">{{ t('newLoop.item14') }}</view>
+              <view class="company u-flex-y u-flex-y-center">
+                <image src="/static/images/trust-pilot.png" class="company-icon" mode="widthFix"></image>
+              </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>
+          </cwg-match-media>
+          <view class="title">
+            <view class="tit1">{{ t('newSignup.item1') }}</view>
+            <view class="tit2">{{ t('newSignup.item2') }}</view>
           </view>
-          <uni-forms ref="form" :modelValue="formData" :rules="rules" validate-trigger="blur" label-position="top"
-                     label-width="120">
-            <uni-row :gutter="20" class="formContent">
-              <uni-col :xs="24" :md="24">
-                <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="24">
-                <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="24">
-                <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="24">
-                <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')">
-                  <uni-easyinput :disabled="!isAgeValid || !formData.birthDate"
-                                 v-model="formData.emailCode" :placeholder="t('newSignup.item10')">
-                    <template #right>
+          <view>
+            <uni-forms ref="form" :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="24">
+                  <cwg-match-media :max-width="991">
+                    <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>
+                  </cwg-match-media>
+                  <cwg-match-media :min-width="992">
+                    <uni-forms-item name="birthDate" :label="t('newSignup.item18')">
+                      <uni-datetime-picker style="width: 50%;" type="date" v-model="formData.birthDate"
+                                           :placeholder="t('newSignup.item19')" @change="checkAge" />
+                    </uni-forms-item>
+                  </cwg-match-media>
+                </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="12">
+                  <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>
-                    </template>
-                  </uni-easyinput>
-                </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="24">
-                <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>
-              <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>
-
+                    </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"
@@ -79,7 +110,6 @@
                   </uni-forms-item>
                 </uni-col>
 
-
               </uni-row>
               <uni-forms-item name="agree">
                 <view class="check-box" @click="toggleAgree">
@@ -102,27 +132,31 @@
                 </view>
               </uni-forms-item>
             </uni-forms>
-            <view>
-              <u-button class="regiset-btn" @click="register">
-                {{ t('signup.button') }}
-              </u-button>
-            </view>
-            <view class="des-bottom">
-              <text v-t="'signup.agreemnet1'"></text>
-              <a @click="openUrl('pdf/Client_Agreement.pdf')" target="_blank" v-t="'signup.agreemnet2'"></a>
-              <text v-t="'signup.agreemnet3'"></text>
-              <a @click="openUrl('pdf/Terms&Conditions.pdf')" target="_blank" v-t="'signup.agreemnet4'"></a>
-              <text v-t="'signup.agreemnet5'"></text>
-              <a @click="openUrl('pdf/Privacy_Policy.pdf')" target="_blank" v-t="'signup.agreemnet6'"></a>
-              <text v-t="'signup.agreemnet7'"></text>
-            </view>
-          </uni-col>
-
-        </uni-row>
-      </view>
+          </view>
+          <view>
+            <u-button class="regiset-btn" @click="register">
+              {{ t('signup.button') }}
+            </u-button>
 
-<!--    <cwg-custom-footer />-->
-  </cwg-page-wrapper>
+          </view>
+          <view class="login-link">
+            <text>{{t('newSignup.item16')}}</text>
+            <navigator url="/pages/login/index" class="link" hover-class="none">{{ t('newSignup.item17') }}
+            </navigator>
+          </view>
+          <view class="des-bottom">
+            <text v-t="'signup.agreemnet1'"></text>
+            <a @click="openUrl('pdf/Client_Agreement.pdf')" target="_blank" v-t="'signup.agreemnet2'"></a>
+            <text v-t="'signup.agreemnet3'"></text>
+            <a @click="openUrl('pdf/Terms&Conditions.pdf')" target="_blank" v-t="'signup.agreemnet4'"></a>
+            <text v-t="'signup.agreemnet5'"></text>
+            <a @click="openUrl('pdf/Privacy_Policy.pdf')" target="_blank" v-t="'signup.agreemnet6'"></a>
+            <text v-t="'signup.agreemnet7'"></text>
+          </view>
+        </view>
+      </uni-col>
+    </uni-row>
+  </view>
 </template>
 <script setup>
   import { ref, watch, onMounted, computed } from 'vue'
@@ -138,6 +172,8 @@
   import { userApi } from '@/api/user'
   import { openLocalPdf } from '@/utils/pdf.js'
   import ImportModel from './components/ImportModel.vue'
+  import logoImage from '@/static/images/logo3.png'
+  import QrCode from '@/components/QrCode.vue'
 
   const { t } = useI18n()
   const { Code } = Config
@@ -535,6 +571,116 @@
     height: 100vh;
     border: none;
     padding: 0;
+    overflow: hidden;
+  }
+
+  .demo-uni-row {
+    margin: 0 !important;
+
+    .left-bg {
+      height: calc(100vh - 60px);
+      background-image: url(/static/images/login-bg.gif);
+      background-repeat: no-repeat;
+      background-size: cover;
+      background-position: center center;
+
+      .left-box {
+        display: flex;
+        flex-direction: column;
+        justify-content: center;
+        align-items: center;
+
+        .h1 {
+          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(40) 0 px2rpx(50) 0;
+          position: relative;
+          align-items: flex-start !important;
+        }
+      }
+
+      .left-content {
+        .h1 {
+          // text-align: center;
+          color: #fff;
+          font-size: 30px;
+          margin-top: 30px;
+          line-height: 1.5;
+        }
+
+        .h6 {
+          line-height: 20px;
+          color: #fff;
+          font-size: 14px;
+          margin-top: 10px;
+        }
+      }
+    }
+
+    .right-f {
+      background-color: var(--color-white);
+      padding: 0 px2rpx(24);
+      box-sizing: border-box;
+
+      .account {
+        background-color: var(--color-white);
+        position: relative;
+        height: calc(100vh - 60px);
+        overflow-y: auto;
+        display: flex;
+        flex-direction: column;
+        padding: px2rpx(32) 10%;
+
+        .title {
+          margin: px2rpx(32) 0;
+          font-size: px2rpx(24);
+          font-weight: bolder;
+          color: #e4e4e4;
+          text-align: center;
+
+          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;
+          }
+        }
+
+        .company {
+          padding: px2rpx(50) 0 px2rpx(20) 0;
+          position: relative;
+          align-items: center !important;
+        }
+
+        .company-icon {
+          width: px2rpx(234);
+        }
+      }
+    }
   }
 
   .content-wrapper {
@@ -548,6 +694,7 @@
     justify-content: space-between;
     min-height: calc(100vh - 56px);
   }
+
   .regist-content {
     display: flex;
     align-items: center;
@@ -584,16 +731,24 @@
         margin-right: px2rpx(4);
       }
 
-      .link {
-        color: #005bbb;
-        text-decoration: none;
-        border-bottom: 1px dashed #005bbb;
-        padding-bottom: 2px;
-        cursor: pointer;
-      }
+
     }
   }
 
+  .login-link{
+    margin-top: px2rpx(20);
+    text-align: start;
+    display: flex;
+    align-items: center;
+    font-size: px2rpx(16);
+    line-height: 1.6;
+  }
+  .link {
+    color: #e61f1e;
+    padding-bottom: 2px;
+    cursor: pointer;
+    font-size: px2rpx(14);
+  }
   //display: flex;
   .logo {
     width: 100%;
@@ -685,15 +840,18 @@
   }
 
   .btn-code {
-    width: 30%;
-    height: 100%;
+    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 4px 4px 0;
+    line-height: px2rpx(35);
+    border-radius: 4px;
+    cursor: pointer;
+    font-size: 14px;
+    flex-shrink: 0;
   }
 
   .check-box {