¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <div class="aui-content"> |
| | | <div class="aui-container"> |
| | | <div class="aui-form"> |
| | | <div class="aui-image"> |
| | | <div class="aui-image-text"> |
| | | <img :src="jeecgAdTextImg" alt="" /> |
| | | </div> |
| | | </div> |
| | | <div class="aui-formBox"> |
| | | <div class="aui-formWell"> |
| | | <a-form ref="formRef" :model="formData"> |
| | | <div class="aui-flex aui-form-nav aui-clear-left" style="padding-bottom: 21px"> |
| | | <div class="aui-flex-box activeNav on">{{t('sys.login.signUpFormTitle')}}</div> |
| | | </div> |
| | | <div class="aui-form-box"> |
| | | <div class="aui-account aui-account-line"> |
| | | <a-form-item> |
| | | <div class="aui-input-line"> |
| | | <Icon class="aui-icon" icon="ant-design:user-outlined"/> |
| | | <a-input class="fix-auto-fill" type="text" :placeholder="t('sys.login.userName')" v-model:value="formData.username" /> |
| | | </div> |
| | | </a-form-item> |
| | | <a-form-item> |
| | | <div class="aui-input-line"> |
| | | <Icon class="aui-icon" icon="ant-design:mobile-outlined"/> |
| | | <a-input class="fix-auto-fill" type="text" :placeholder="t('sys.login.mobile')" v-model:value="formData.mobile" /> |
| | | </div> |
| | | </a-form-item> |
| | | <a-form-item> |
| | | <div class="aui-input-line"> |
| | | <Icon class="aui-icon" icon="ant-design:mail-outlined"/> |
| | | <a-input class="fix-auto-fill" type="text" :placeholder="t('sys.login.smsCode')" v-model:value="formData.smscode" /> |
| | | <div v-if="showInterval" class="aui-code-line" @click="getLoginCode">{{t('component.countdown.normalText')}}</div> |
| | | <div v-else class="aui-code-line">{{t('component.countdown.sendText',[unref(timeRuning)])}}</div> |
| | | </div> |
| | | </a-form-item> |
| | | <a-form-item> |
| | | <div class="aui-input-line"> |
| | | <Icon class="aui-icon" icon="ant-design:lock-outlined"/> |
| | | <a-input class="fix-auto-fill" :type="pwdIndex==='close'?'password':'text'" :placeholder="t('sys.login.password')" v-model:value="formData.password" /> |
| | | <div class="aui-eye"> |
| | | <img :src="eyeKImg" alt="å¼å¯" v-if="pwdIndex==='open'" @click="pwdClick('close')" /> |
| | | <img :src="eyeGImg" alt="å
³é" v-else-if="pwdIndex==='close'" @click="pwdClick('open')" /> |
| | | </div> |
| | | </div> |
| | | </a-form-item> |
| | | <a-form-item> |
| | | <div class="aui-input-line"> |
| | | <Icon class="aui-icon" icon="ant-design:lock-outlined"/> |
| | | <a-input class="fix-auto-fill" :type="confirmPwdIndex==='close'?'password':'text'" :placeholder="t('sys.login.confirmPassword')" v-model:value="formData.confirmPassword" /> |
| | | <div class="aui-eye"> |
| | | <img :src="eyeKImg" alt="å¼å¯" v-if="confirmPwdIndex==='open'" @click="confirmPwdClick('close')" /> |
| | | <img :src="eyeGImg" alt="å
³é" v-else-if="confirmPwdIndex==='close'" @click="confirmPwdClick('open')" /> |
| | | </div> |
| | | </div> |
| | | </a-form-item> |
| | | <a-form-item name="policy"> |
| | | <div class="aui-flex"> |
| | | <div class="aui-flex-box"> |
| | | <div class="aui-choice"> |
| | | <a-checkbox v-model:checked="formData.policy" /> |
| | | <span style="color: #1b90ff;margin-left: 4px">{{ t('sys.login.policy') }}</span> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </a-form-item> |
| | | </div> |
| | | </div> |
| | | <div class="aui-formButton"> |
| | | <div class="aui-flex"> |
| | | <a class="aui-link-login aui-flex-box" @click="registerHandleClick"> {{ t('sys.login.registerButton') }}</a> |
| | | </div> |
| | | <div class="aui-flex"> |
| | | <a class="aui-linek-code aui-flex-box" @click="goBackHandleClick">{{ t('sys.login.backSignIn') }}</a> |
| | | </div> |
| | | </div> |
| | | </a-form> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </template> |
| | | |
| | | <script lang="ts" setup name="mini-register"> |
| | | import { ref, reactive, unref, toRaw } from 'vue'; |
| | | import { getCaptcha, register } from '/@/api/sys/user'; |
| | | import { SmsEnum } from '/@/views/sys/login/useLogin'; |
| | | import { useMessage } from '/@/hooks/web/useMessage'; |
| | | import logoImg from '/@/assets/loginmini/icon/lanpu_logo.png'; |
| | | import jeecgAdTextImg from '/@/assets/loginmini/icon/jeecg_ad_text.png'; |
| | | import eyeKImg from '/@/assets/loginmini/icon/icon-eye-k.png'; |
| | | import eyeGImg from '/@/assets/loginmini/icon/icon-eye-g.png'; |
| | | import { useI18n } from "/@/hooks/web/useI18n"; |
| | | |
| | | const { t } = useI18n(); |
| | | const { notification, createErrorModal, createMessage } = useMessage(); |
| | | const emit = defineEmits(['go-back', 'success', 'register']); |
| | | const formRef = ref(); |
| | | const formData = reactive<any>({ |
| | | username: '', |
| | | mobile: '', |
| | | smscode: '', |
| | | password: '', |
| | | confirmPassword: '', |
| | | policy: false, |
| | | }); |
| | | //æ¯å¦æ¾ç¤ºè·åéªè¯ç |
| | | const showInterval = ref<boolean>(true); |
| | | //60s |
| | | const timeRuning = ref<number>(60); |
| | | //宿¶å¨ |
| | | const timer = ref<any>(null); |
| | | //å¯ç ç¼çæå¼å
³é |
| | | const pwdIndex = ref<string>('close'); |
| | | //确认å¯ç ç¼çæå¼å
³é |
| | | const confirmPwdIndex = ref<string>('close'); |
| | | |
| | | /** |
| | | * è¿å |
| | | */ |
| | | function goBackHandleClick() { |
| | | emit('go-back'); |
| | | initForm(); |
| | | } |
| | | |
| | | /** |
| | | * è·åææºéªè¯ç |
| | | */ |
| | | async function getLoginCode() { |
| | | if (!formData.mobile) { |
| | | createMessage.warn(t('sys.login.mobilePlaceholder')); |
| | | return; |
| | | } |
| | | const result = await getCaptcha({ mobile: formData.mobile, smsmode: SmsEnum.REGISTER }); |
| | | if (result) { |
| | | const TIME_COUNT = 60; |
| | | if (!unref(timer)) { |
| | | timeRuning.value = TIME_COUNT; |
| | | showInterval.value = false; |
| | | timer.value = setInterval(() => { |
| | | if (unref(timeRuning) > 0 && unref(timeRuning) <= TIME_COUNT) { |
| | | timeRuning.value = timeRuning.value - 1; |
| | | } else { |
| | | showInterval.value = true; |
| | | clearInterval(unref(timer)); |
| | | timer.value = null; |
| | | } |
| | | }, 1000); |
| | | } |
| | | } |
| | | } |
| | | |
| | | function registerHandleClick() { |
| | | if (!formData.username) { |
| | | createMessage.warn(t('sys.login.accountPlaceholder')); |
| | | return; |
| | | } |
| | | if (!formData.mobile) { |
| | | createMessage.warn(t('sys.login.mobilePlaceholder')); |
| | | return; |
| | | } |
| | | if (!formData.smscode) { |
| | | createMessage.warn(t('sys.login.smsPlaceholder')); |
| | | return; |
| | | } |
| | | if (!formData.password) { |
| | | createMessage.warn(t('sys.login.passwordPlaceholder')); |
| | | return; |
| | | } |
| | | if (!formData.confirmPassword) { |
| | | createMessage.warn(t('sys.login.confirmPassword')); |
| | | return; |
| | | } |
| | | if (formData.password !== formData.confirmPassword) { |
| | | createMessage.warn(t('sys.login.diffPwd')); |
| | | return; |
| | | } |
| | | if(!formData.policy){ |
| | | createMessage.warn(t('sys.login.policyPlaceholder')); |
| | | return; |
| | | } |
| | | registerAccount(); |
| | | } |
| | | |
| | | /** |
| | | * 注åè´¦å· |
| | | */ |
| | | async function registerAccount() { |
| | | try { |
| | | const resultInfo = await register( |
| | | toRaw({ |
| | | username: formData.username, |
| | | password: formData.password, |
| | | phone: formData.mobile, |
| | | smscode: formData.smscode, |
| | | }) |
| | | ); |
| | | if (resultInfo && resultInfo.data.success) { |
| | | notification.success({ |
| | | description: resultInfo.data.message || t('sys.api.registerMsg'), |
| | | duration: 3, |
| | | }); |
| | | emit('success', { username: formData.username, password: formData.password }); |
| | | initForm(); |
| | | } else { |
| | | notification.warning({ |
| | | message: t('sys.api.errorTip'), |
| | | description: resultInfo.data.message || t('sys.api.networkExceptionMsg'), |
| | | duration: 3, |
| | | }); |
| | | } |
| | | } catch (error) { |
| | | notification.error({ |
| | | message: t('sys.api.errorTip'), |
| | | description: error.message || t('sys.api.networkExceptionMsg'), |
| | | duration: 3, |
| | | }); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * åå§å表å |
| | | */ |
| | | function initForm() { |
| | | Object.assign(formData,{username:'',mobile: '', smscode: '', password: '', confirmPassword: '', policy: false}) |
| | | if(!unref(timer)){ |
| | | showInterval.value = true; |
| | | clearInterval(unref(timer)); |
| | | timer.value = null; |
| | | } |
| | | formRef.value.resetFields(); |
| | | } |
| | | |
| | | /** |
| | | * å¯ç æå¼æå
³é |
| | | * @param value |
| | | */ |
| | | function pwdClick(value) { |
| | | pwdIndex.value = value; |
| | | } |
| | | |
| | | /** |
| | | * 确认å¯ç æå¼æå
³é |
| | | * @param value |
| | | */ |
| | | function confirmPwdClick(value) { |
| | | confirmPwdIndex.value = value; |
| | | } |
| | | |
| | | defineExpose({ |
| | | initForm |
| | | }) |
| | | </script> |
| | | <style lang="less" scoped> |
| | | @import '/@/assets/loginmini/style/home.less'; |
| | | @import '/@/assets/loginmini/style/base.less'; |
| | | .aui-input-line .aui-icon{ |
| | | position: absolute; |
| | | z-index: 2; |
| | | top: 10px; |
| | | left: 10px; |
| | | font-size: 20px !important; |
| | | } |
| | | </style> |