| | |
| | | <template> |
| | | <div class="register"> |
| | | <div class="top" @click="router.go(-1)"> |
| | | <img src="../../assets/image/icon-close.png" alt="" /> |
| | | </div> |
| | | <Step :step="1"></Step> |
| | | <div class="title textColor">{{ $t("register") }}</div> |
| | | <div class="flex re-tab"> |
| | | <div class="textColor1" :class="activeIndex == 0 ? 'active' : ''" @click="changeIndex(0)"> |
| | | {{ $t("account") }} |
| | | </div> |
| | | <div class="textColor1" :class="activeIndex == 1 ? 'active' : ''" @click="changeIndex(1)"> |
| | | {{ $t("email") }} |
| | | </div> |
| | | <!-- yyhh --> |
| | | <!-- <div class="textColor1" :class="activeIndex == 2 ? 'active' : ''" @click="changeIndex(2)"> |
| | | {{ $t("phoneNum") }} |
| | | </div> --> |
| | | </div> |
| | | <ExInput :label="getRegType(activeIndex, true)" :placeholderText="getRegType(activeIndex, false)" v-model="username" |
| | | :area="isArea" :dialCode="dialCode" @selectArea="onSelectArea" :icon="icon" /> |
| | | <van-loading color="#92D1FF" class="loading-box" v-if="isLoading" /> |
| | | |
| | | <ExInput :label="$t('setPassword')" :placeholderText="$t('passwordTips')" v-model="password" typeText="password" /> |
| | | <ExInput :label="$t('repassword')" :placeholderText="$t('surePassword')" v-model="repassword" typeText="password" /> |
| | | <ExInput :label="$t('setSafeword')" :placeholderText="$t('safewordTips')" v-model="safeword" typeText="password" |
| | | v-if="activeIndex === 1" /> |
| | | <div class="inputCom" v-if="activeIndex === 1"> |
| | | <p class="label textColor">{{ $t("验证码") }}</p> |
| | | <div class="iptbox inputBackground"> |
| | | <input class="inputBackground textColor" type="text" :placeholder="$t('entryVerifyCode')" v-model="verifyCode" /> |
| | | <span v-if="type !== 3" @click="senCode">{{ $t("sendVerifyCode") }} |
| | | <template v-if="time">({{ time }})s</template> |
| | | <!-- 顶部返回 --> |
| | | <div class="header"> |
| | | <div class="back-btn" @click="router.go(-1)"> |
| | | <img src="../../assets/image/icon_back2.png" alt="" /> |
| | | </div> |
| | | </div> |
| | | |
| | | <div class="register-cont"> |
| | | <!-- 标题 --> |
| | | <div class="title textColor">{{ activeIndex === 1 ? $t("email") : $t("mobile") }}</div> |
| | | |
| | | <!-- Email 模式 --> |
| | | <template v-if="activeIndex === 1"> |
| | | <ExInput :label="$t('email')" :placeholderText="$t('entryEmail')" v-model="username" /> |
| | | <ExInput :label="$t('password')" :placeholderText="$t('entryPassword')" v-model="password" |
| | | typeText="password" /> |
| | | <ExInput :label="$t('repassword')" :placeholderText="$t('repassword')" v-model="repassword" |
| | | typeText="password" /> |
| | | <ExInput :label="$t('invitCode')" :placeholderText="$t('entryInvitCode')" v-model="invitCode" |
| | | :clearBtn="false" /> |
| | | </template> |
| | | |
| | | <!-- Mobile 模式 --> |
| | | <template v-else> |
| | | <ExInput :label="$t('phoneNum')" :placeholderText="$t('phoneNum')" v-model="username" :area="isArea" |
| | | :dialCode="dialCode" @selectArea="onSelectArea" :icon="icon" /> |
| | | <ExInput :label="$t('password')" :placeholderText="$t('entryPassword')" v-model="password" |
| | | typeText="password" /> |
| | | <ExInput :label="$t('repassword')" :placeholderText="$t('repassword')" v-model="repassword" |
| | | typeText="password" /> |
| | | <ExInput :label="$t('invitCode')" :placeholderText="$t('entryInvitCode')" v-model="invitCode" |
| | | :clearBtn="false" /> |
| | | </template> |
| | | |
| | | <!-- Sign Up 按钮 --> |
| | | <van-button class="w-full sign-up-btn" type="primary" @click="register"> |
| | | {{ $t("register") }} |
| | | </van-button> |
| | | |
| | | <!-- 切换链接 --> |
| | | <div class="switch-link textColor" @click="switchMode"> |
| | | {{ activeIndex === 1 ? $t("mobile") : $t("email") }} |
| | | </div> |
| | | |
| | | <!-- 协议复选框 --> |
| | | <div class="protocol textColor mainBackground"> |
| | | <i @click="agreeProt"> |
| | | <img v-show="agree" src="../../assets/image/login/prot2.png" alt="" /> |
| | | <img v-show="!agree" src="../../assets/image/login/prot1.png" alt="" /> |
| | | </i> |
| | | {{ $t("agree") }} |
| | | <span class="colorMain" @click="router.push('/aboutUs?serviceTerm=1')"> |
| | | {{ "<" + $t("serviceConf") + ">" }} |
| | | </span> |
| | | </div> |
| | | </div> |
| | | <ExInput :label="$t('invitCode')" :placeholderText="$t('entryInvitCode')" v-model="invitCode" :clearBtn="false" /> |
| | | <div class="protocol textColor"> |
| | | <i @click="agreeProt"> |
| | | <img v-show="agree" src="../../assets/image/login/prot2.png" alt="" /> |
| | | <img v-show="!agree" src="../../assets/image/login/prot1.png" alt="" /> |
| | | </i> |
| | | {{ $t("readAgree") |
| | | }}<span class="colorMain" @click="router.push('/aboutUs?serviceTerm=1')">{{ |
| | | $t("serviceConf") |
| | | }}</span> |
| | | </div> |
| | | <van-button class="w-full" style="margin-top: 10px" type="primary" @click="register">{{ $t("register") }} |
| | | </van-button> |
| | | <div class="noTips textColor"> |
| | | {{ $t("hasAccount") |
| | | }}<span class="colorMain" @click="router.push('/login')"> {{ $t("goLogin") }}</span> |
| | | </div> |
| | | |
| | | <nationality-list ref="controlChildRef" :title="$t('selectArea')" @getName="getName"></nationality-list> |
| | | |
| | | <Vcode :imgs="[img1, img2]" :show="show" @success="onSuccess" :canvasHeight="200" @fail="onFail" @close="show = false" |
| | | sliderText="" :successText="$t('vertifyPass')" :failText="$t('vertifuFail')" /> |
| | | |
| | | <div>{{ msg }}</div> |
| | | <Vcode :imgs="[img1, img2]" :show="show" @success="onSuccess" :canvasHeight="200" @fail="onFail" |
| | | @close="show = false" sliderText="" :successText="$t('vertifyPass')" :failText="$t('vertifuFail')" /> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup> |
| | | import ExInput from "@/components/ex-input/index.vue"; |
| | | import Step from "./step.vue"; |
| | | import { _registerUser, _sendVerifyCode } from "@/service/login.api"; |
| | | import { _bindEmailRegister } from "@/service/user.api.js"; |
| | | import { useUserStore } from "@/store/user"; |
| | |
| | | import { ref, onMounted, reactive, onUnmounted } from "vue"; |
| | | import { showToast } from "vant"; |
| | | import store from "@/store/store"; |
| | | |
| | | const { t } = useI18n(); |
| | | const router = useRouter(); |
| | | const onRoute = (path) => { |
| | | router.push(path); |
| | | }; |
| | | const userStore = useUserStore(); |
| | | |
| | | let show = ref(false); |
| | | const msg = ref(""); |
| | | const type = ref(1); |
| | | const isLoading = ref(false); |
| | | const type = ref(2); |
| | | const time = ref(0); |
| | | let agree = ref(false); |
| | | const username = ref(""); |
| | |
| | | const repassword = ref(""); |
| | | const verifyCode = ref(""); |
| | | const safeword = ref(""); |
| | | const fundPassword = ref(""); |
| | | const refundPassword = ref(""); |
| | | const activeIndex = ref(0); |
| | | const typeText = ref("password"); |
| | | const activeIndex = ref(1); // 1 = Email, 2 = Mobile |
| | | let isArea = ref(false); |
| | | let dialCode = ref(0); |
| | | let icon = ref(""); |
| | |
| | | |
| | | let invitCode = ref(""); |
| | | onMounted(() => { |
| | | console.log(store); |
| | | let usercode = getStorage("usercode"); |
| | | if (usercode) { |
| | | invitCode.value = usercode; |
| | |
| | | state.timer = null; |
| | | }); |
| | | |
| | | const getRegType = (activeIndex, bFlag) => { |
| | | switch (activeIndex) { |
| | | case 0: |
| | | return bFlag ? t("account") : t("entryAccount"); |
| | | case 1: |
| | | return bFlag ? t("email") : t("entryEmail"); |
| | | case 2: |
| | | return bFlag ? t("phoneNum") : t("entryPhone"); |
| | | const switchMode = () => { |
| | | activeIndex.value = activeIndex.value === 1 ? 2 : 1; |
| | | if (activeIndex.value === 2) { |
| | | isArea.value = true; |
| | | } else { |
| | | isArea.value = false; |
| | | } |
| | | }; |
| | | |
| | | const senCode = () => { |
| | | if (time.value > 0) { |
| | | return false; |
| | | } |
| | | if (activeIndex.value === 1) { |
| | | let match = username.value.search(/@/); |
| | | if (username.value == "" || match == -1) { |
| | | showToast(t("entryCorrectEmail")); |
| | | return; |
| | | } |
| | | } |
| | | |
| | | _sendVerifyCode({ |
| | | target: username.value, |
| | | }) |
| | | .then((res) => { |
| | | time.value = 60; |
| | | state.timer = setInterval(() => { |
| | | if (time.value > 0) { |
| | | time.value = time.value - 1; |
| | | } else { |
| | | time.value = 0; |
| | | clearInterval(state.timer); |
| | | state.timer = null; |
| | | } |
| | | }, 1000); |
| | | }) |
| | | .catch((error) => { |
| | | showToast(t(error.msg)); |
| | | }); |
| | | }; |
| | | |
| | | const onSuccess = () => { |
| | | console.log("onSuccess"); |
| | | registerApi(); |
| | | show.value = false; |
| | | }; |
| | | const onFail = () => { |
| | | msg.value = ""; |
| | | }; |
| | | const onRefresh = () => { |
| | | msg.value = ""; |
| | | // 清空表单 |
| | | username.value = ""; |
| | | password.value = ""; |
| | | repassword.value = ""; |
| | | }; |
| | | |
| | | const controlChildRef = ref(null); |
| | |
| | | icon.value = params.code; |
| | | dialCode.value = params.dialCode; |
| | | }; |
| | | |
| | | const agreeProt = () => { |
| | | agree.value = !agree.value; |
| | | }; |
| | | |
| | | const register = () => { |
| | | console.log(activeIndex.value, "activeIndex.value"); |
| | | if (activeIndex.value == 0) { |
| | | if (username.value == "") { |
| | | showToast(t("entryAccount")); |
| | | return; |
| | | } |
| | | if (username.value.length < 6 || username.value.length > 30) { |
| | | showToast(t("accountLength")); |
| | | return; |
| | | } |
| | | } else if (activeIndex.value == 1) { |
| | | if (activeIndex.value === 1) { |
| | | // Email 模式验证 |
| | | let match = username.value.search(/@/); |
| | | if (username.value == "" || match.value == -1) { |
| | | if (username.value == "" || match == -1) { |
| | | showToast(t("entryCorrectEmail")); |
| | | return; |
| | | } |
| | | if (safeword.value == "") { |
| | | showToast(t("safewordTips")); |
| | | } else { |
| | | // Mobile 模式验证 |
| | | if (username.value == "") { |
| | | showToast(t("entryPhone")); |
| | | return; |
| | | } |
| | | if (verifyCode.value.length < 6) { |
| | | showToast(t("entryVerifyTips")); |
| | | return; |
| | | } |
| | | } else if (activeIndex.value == 2) { |
| | | if (!/(^[1-9]\d*$)/.test(username.value)) { |
| | | showToast(t("entryPhone")); |
| | | return; |
| | | } |
| | | if (username.value == "") { |
| | | showToast(t("entryPhone")); |
| | | return; |
| | | } |
| | | } |
| | | |
| | | if (password.value == "") { |
| | | showToast(t("entryPassword")); |
| | | return; |
| | |
| | | } |
| | | show.value = true; |
| | | }; |
| | | const changeIndex = (index) => { |
| | | activeIndex.value = index; |
| | | if (index == 0 || index == 1) { |
| | | isArea.value = false; |
| | | } else { |
| | | isArea.value = true; |
| | | } |
| | | }; |
| | | const registerApi = () => { |
| | | switch (activeIndex.value) { |
| | | case 0: { |
| | | type.value = 3; |
| | | break; |
| | | } |
| | | case 1: { |
| | | type.value = 2; |
| | | break; |
| | | } |
| | | case 2: { |
| | | type.value = 1; |
| | | break; |
| | | } |
| | | } |
| | | |
| | | const onSuccess = () => { |
| | | registerApi(); |
| | | show.value = false; |
| | | }; |
| | | |
| | | const onFail = () => { |
| | | // 验证失败处理 |
| | | }; |
| | | |
| | | const registerApi = () => { |
| | | isLoading.value = true; |
| | | if (activeIndex.value === 1) { |
| | | // Email 注册 |
| | | type.value = 2; |
| | | _bindEmailRegister({ |
| | | username: username.value, |
| | | password: password.value, |
| | | type: "2", // 2邮箱 |
| | | verifcode: verifyCode.value, |
| | | type: "2", |
| | | verifcode: verifyCode.value || "", |
| | | usercode: invitCode.value, |
| | | safeword: safeword.value, |
| | | safeword: safeword.value || "", |
| | | }).then((res) => { |
| | | isLoading.value = false; |
| | | userStore[GET_USERINFO](res); |
| | | store.state.user.userInfo = res; |
| | | // 其他操作?? |
| | | router.push("/identity"); |
| | | }).catch(() => { |
| | | isLoading.value = false; |
| | | }); |
| | | } else { |
| | | // Mobile 注册 |
| | | type.value = 1; |
| | | _registerUser({ |
| | | userName: |
| | | activeIndex.value === 0 || activeIndex.value === 1 |
| | | ? username.value |
| | | : `${dialCode.value}${username.value}`, |
| | | userName: `${dialCode.value}${username.value}`, |
| | | password: password.value, |
| | | // re_password: repassword.value, |
| | | type: type.value, |
| | | userCode: invitCode.value, |
| | | }).then((res) => { |
| | | isLoading.value = false; |
| | | userStore[GET_USERINFO](res); |
| | | store.state.user.userInfo = res; |
| | | if (activeIndex.value == 0) { |
| | | router.push("/setFond"); |
| | | } else { |
| | | router.push({ |
| | | name: "verify", |
| | | query: { |
| | | type: activeIndex.value, |
| | | account: |
| | | activeIndex.value == 1 |
| | | ? username.value |
| | | : `${dialCode.value}${username.value}`, |
| | | }, |
| | | }); |
| | | } |
| | | router.push({ |
| | | name: "verify", |
| | | query: { |
| | | type: activeIndex.value, |
| | | account: `${dialCode.value}${username.value}`, |
| | | }, |
| | | }); |
| | | }).catch(() => { |
| | | isLoading.value = false; |
| | | }); |
| | | } |
| | | }; |
| | | </script> |
| | | |
| | | <style lang="scss" scoped> |
| | | .activeBKClick { |
| | | &:active { |
| | | background: $tab_background; |
| | | opacity: 0.5; |
| | | } |
| | | } |
| | | |
| | | .activeClick { |
| | | &:active { |
| | | background: $mainbgWhiteColor; |
| | | opacity: 0.5; |
| | | } |
| | | :deep(.van-loading) { |
| | | position: absolute; |
| | | top: 50%; |
| | | left: 50%; |
| | | transform: translate(-50%, -50%); |
| | | } |
| | | |
| | | .register { |
| | | width: 100%; |
| | | min-height: 100vh; |
| | | box-sizing: border-box; |
| | | padding: 16px; |
| | | font-size: 13px; |
| | | background: #fff; |
| | | } |
| | | |
| | | .top { |
| | | padding-left: 9px; |
| | | padding-top: 9px; |
| | | /* 顶部返回 */ |
| | | .header { |
| | | padding-top: 2rem; |
| | | padding-left: 3rem; |
| | | |
| | | img { |
| | | width: 18px; |
| | | height: 18px; |
| | | .back-btn { |
| | | width: 4rem; |
| | | height: 4rem; |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: center; |
| | | cursor: pointer; |
| | | |
| | | img { |
| | | width: 100%; |
| | | } |
| | | } |
| | | } |
| | | |
| | | .register-cont { |
| | | padding: 0 3rem 5rem; |
| | | } |
| | | |
| | | /* 标题 */ |
| | | .title { |
| | | font-weight: 700; |
| | | font-size: 26px; |
| | | margin-top: 27px; |
| | | margin-bottom: 33px; |
| | | font-size: 4rem; |
| | | margin-top: 2.5rem; |
| | | margin-bottom: 4rem; |
| | | } |
| | | |
| | | .re-tab { |
| | | margin-bottom: 22px; |
| | | |
| | | div { |
| | | padding: 0 18px; |
| | | height: 34px; |
| | | line-height: 34px; |
| | | text-align: center; |
| | | border-radius: 4px; |
| | | margin-right: 10px; |
| | | } |
| | | |
| | | .active { |
| | | background: $US_tabActice_background; |
| | | color: $color_main; |
| | | } |
| | | /* Sign Up 按钮 */ |
| | | .sign-up-btn { |
| | | margin-top: 2.4rem; |
| | | border-radius: 1rem !important; |
| | | height: 7.2rem !important; |
| | | font-size: 2.8rem !important; |
| | | } |
| | | |
| | | .forget { |
| | | color: $color_main; |
| | | font-size: 12px; |
| | | line-height: 14px; |
| | | /* 切换链接 */ |
| | | .switch-link { |
| | | margin-top: 3rem; |
| | | text-align: center; |
| | | font-size: 2.8rem; |
| | | cursor: pointer; |
| | | } |
| | | |
| | | .noTips { |
| | | margin-top: 24px; |
| | | } |
| | | |
| | | /* 协议复选框 */ |
| | | .protocol { |
| | | display: flex; |
| | | align-items: center; |
| | | height: 15px; |
| | | margin-top: 3rem; |
| | | font-size: 1.75rem; |
| | | padding: 2.2rem 2rem; |
| | | position: fixed; |
| | | left: 0.84rem; |
| | | bottom: 0; |
| | | |
| | | i { |
| | | width: 15px; |
| | | height: 15px; |
| | | margin-right: 9px; |
| | | width: 1.875rem; |
| | | height: 1.875rem; |
| | | margin-right: 1.125rem; |
| | | cursor: pointer; |
| | | flex-shrink: 0; |
| | | |
| | | img { |
| | | width: 100%; |
| | | height: 100%; |
| | | } |
| | | } |
| | | } |
| | | |
| | | .iptbox { |
| | | height: 44px; |
| | | margin-top: 8px; |
| | | margin-bottom: 18px; |
| | | padding: 0 20px; |
| | | display: flex; |
| | | justify-content: space-between; |
| | | align-items: center; |
| | | border-radius: 6px; |
| | | |
| | | input { |
| | | flex: 1; |
| | | height: 100%; |
| | | border: none; |
| | | } |
| | | |
| | | span { |
| | | color: $color_main; |
| | | } |
| | | } |
| | | </style> |