¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <div class="aui-content"> |
| | | <div class="aui-container"> |
| | | <div class="aui-form"> |
| | | <div class="aui-image"> |
| | | <div class="aui-image-text"> |
| | | <img :src="adTextImg" alt="" /> |
| | | </div> |
| | | </div> |
| | | <div class="aui-formBox"> |
| | | <div class="aui-formWell"> |
| | | <div class="aui-step-box"> |
| | | <div class="aui-step-item" :class="activeKey === 1 ? 'activeStep' : ''"> |
| | | <div class="aui-step-tags"> |
| | | <em>1</em> |
| | | <p>{{t('sys.login.authentication')}}</p> |
| | | </div> |
| | | </div> |
| | | <div class="aui-step-item" :class="activeKey === 2 ? 'activeStep' : ''"> |
| | | <div class="aui-step-tags"> |
| | | <em>2</em> |
| | | <p>{{t('sys.login.resetLoginPassword')}}</p> |
| | | </div> |
| | | </div> |
| | | <div class="aui-step-item" :class="activeKey === 3 ? 'activeStep' : ''"> |
| | | <div class="aui-step-tags"> |
| | | <em>3</em> |
| | | <p>{{t('sys.login.resetSuccess')}}</p> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="" style="height: 230px; position: relative"> |
| | | <a-form ref="formRef" :model="formData" v-if="activeKey === 1"> |
| | | <!-- 身份éªè¯ begin --> |
| | | <div class="aui-account aui-account-line aui-forgot"> |
| | | <a-form-item> |
| | | <div class="aui-input-line"> |
| | | <a-input type="text" :placeholder="t('sys.login.mobile')" v-model:value="formData.mobile" /> |
| | | </div> |
| | | </a-form-item> |
| | | <div class="aui-input-line"> |
| | | <a-form-item> |
| | | <a-input type="text" :placeholder="t('sys.login.smsCode')" v-model:value="formData.smscode" /> |
| | | </a-form-item> |
| | | <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> |
| | | </div> |
| | | <!-- 身份éªè¯ end --> |
| | | </a-form> |
| | | <a-form ref="pwdFormRef" :model="pwdFormData" v-else-if="activeKey === 2"> |
| | | <!-- éç½®å¯ç begin --> |
| | | <div class="aui-account aui-account-line aui-forgot"> |
| | | <a-form-item> |
| | | <div class="aui-input-line"> |
| | | <a-input type="password" :placeholder="t('sys.login.passwordPlaceholder')" v-model:value="pwdFormData.password" /> |
| | | </div> |
| | | </a-form-item> |
| | | <a-form-item> |
| | | <div class="aui-input-line"> |
| | | <a-input type="password" :placeholder="t('sys.login.confirmPassword')" v-model:value="pwdFormData.confirmPassword" /> |
| | | </div> |
| | | </a-form-item> |
| | | </div> |
| | | <!-- éç½®å¯ç end --> |
| | | </a-form> |
| | | <!-- éç½®æå begin --> |
| | | <div class="aui-success" v-else> |
| | | <div class="aui-success-icon"> |
| | | <img :src="successImg"/> |
| | | </div> |
| | | <h3>æåæ¨ï¼éç½®å¯ç æåï¼</h3> |
| | | </div> |
| | | <!-- éç½®æå end --> |
| | | </div> |
| | | <div class="aui-formButton" style="padding-bottom: 40px"> |
| | | <div class="aui-flex" v-if="activeKey === 1 || activeKey === 2"> |
| | | <a class="aui-link-login aui-flex-box" @click="nextStepClick">{{t('sys.login.nextStep')}}</a> |
| | | </div> |
| | | <div class="aui-flex" v-else> |
| | | <a class="aui-linek-code aui-flex-box" @click="toLogin">{{t('sys.login.goToLogin')}}</a> |
| | | </div> |
| | | <div class="aui-flex"> |
| | | <a class="aui-linek-code aui-flex-box" @click="goBack"> {{ t('sys.login.backSignIn') }}</a> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </template> |
| | | <script lang="ts" name="mini-forgotpad" setup> |
| | | import { reactive, ref, toRaw, unref } from 'vue'; |
| | | import { useI18n } from '/@/hooks/web/useI18n'; |
| | | import { SmsEnum, useFormRules, useFormValid, useLoginState } from '/@/views/sys/login/useLogin'; |
| | | import { useMessage } from '/@/hooks/web/useMessage'; |
| | | import { getCaptcha, passwordChange, phoneVerify } from '/@/api/sys/user'; |
| | | import logoImg from '/@/assets/loginmini/icon/lanpu_logo.png' |
| | | import adTextImg from '/@/assets/loginmini/icon/jeecg_ad_text.png' |
| | | import successImg from '/@/assets/loginmini/icon/icon-success.png' |
| | | |
| | | //ä¸ä¸æ¥æ§å¶ |
| | | const activeKey = ref<number>(1); |
| | | const { t } = useI18n(); |
| | | const { handleBackLogin } = useLoginState(); |
| | | const { notification, createMessage, createErrorModal } = useMessage(); |
| | | //æ¯å¦æ¾ç¤ºè·åéªè¯ç |
| | | const showInterval = ref<boolean>(true); |
| | | //60s |
| | | const timeRuning = ref<number>(60); |
| | | //宿¶å¨ |
| | | const timer = ref<any>(null); |
| | | const formRef = ref(); |
| | | const pwdFormRef = ref(); |
| | | //è´¦å·æ°æ® |
| | | const accountInfo = reactive<any>({}); |
| | | //ææºå·è¡¨å |
| | | const formData = reactive({ |
| | | mobile: '', |
| | | smscode: '', |
| | | }); |
| | | //å¯ç 表å |
| | | const pwdFormData = reactive<any>({ |
| | | password: '', |
| | | confirmPassword: '', |
| | | }); |
| | | const emit = defineEmits(['go-back', 'success', 'register']); |
| | | |
| | | /** |
| | | * ä¸ä¸æ¥ |
| | | */ |
| | | async function handleNext() { |
| | | if (!formData.mobile) { |
| | | createMessage.warn(t('sys.login.mobilePlaceholder')); |
| | | return; |
| | | } |
| | | if (!formData.smscode) { |
| | | createMessage.warn(t('sys.login.smsPlaceholder')); |
| | | return; |
| | | } |
| | | const resultInfo = await phoneVerify( |
| | | toRaw({ |
| | | phone: formData.mobile, |
| | | smscode: formData.smscode, |
| | | }) |
| | | ); |
| | | if (resultInfo.success) { |
| | | Object.assign(accountInfo, { |
| | | username: resultInfo.result.username, |
| | | phone: formData.mobile, |
| | | smscode: formData.smscode, |
| | | }); |
| | | activeKey.value = 2; |
| | | setTimeout(()=>{ |
| | | pwdFormRef.value.resetFields(); |
| | | },300) |
| | | } else { |
| | | notification.error({ |
| | | message: 'é误æç¤º', |
| | | description: resultInfo.message || t('sys.api.networkExceptionMsg'), |
| | | duration: 3, |
| | | }); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * å®æä¿®æ¹å¯ç |
| | | */ |
| | | async function finishedPwd() { |
| | | if (!pwdFormData.password) { |
| | | createMessage.warn(t('sys.login.passwordPlaceholder')); |
| | | return; |
| | | } |
| | | if (!pwdFormData.confirmPassword) { |
| | | createMessage.warn(t('sys.login.confirmPassword')); |
| | | return; |
| | | } |
| | | if (pwdFormData.password !== pwdFormData.confirmPassword) { |
| | | createMessage.warn(t('sys.login.diffPwd')); |
| | | return; |
| | | } |
| | | const resultInfo = await passwordChange( |
| | | toRaw({ |
| | | username: accountInfo.username, |
| | | password: pwdFormData.password, |
| | | smscode: accountInfo.smscode, |
| | | phone: accountInfo.phone, |
| | | }) |
| | | ); |
| | | if (resultInfo.success) { |
| | | accountInfo.password = pwdFormData.password; |
| | | //ä¿®æ¹å¯ç |
| | | activeKey.value = 3; |
| | | } else { |
| | | //é误æç¤º |
| | | createErrorModal({ |
| | | title: t('sys.api.errorTip'), |
| | | content: resultInfo.message || t('sys.api.networkExceptionMsg'), |
| | | }); |
| | | } |
| | | } |
| | | /** |
| | | * ä¸ä¸æ¥ |
| | | */ |
| | | function nextStepClick() { |
| | | if (unref(activeKey) == 1) { |
| | | handleNext(); |
| | | } else if (unref(activeKey) == 2) { |
| | | finishedPwd(); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * å»ç»å½ |
| | | */ |
| | | function toLogin() { |
| | | emit('success', { username: accountInfo.username, password: accountInfo.password }); |
| | | initForm(); |
| | | } |
| | | |
| | | /** |
| | | * è¿å |
| | | */ |
| | | function goBack() { |
| | | 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.FORGET_PASSWORD }); |
| | | 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 initForm() { |
| | | activeKey.value = 1; |
| | | Object.assign(formData, { phone: '', smscode: '' }); |
| | | Object.assign(pwdFormData, { password: '', confirmPassword: '' }); |
| | | Object.assign(accountInfo, {}); |
| | | if(unref(timer)){ |
| | | clearInterval(unref(timer)); |
| | | timer.value = null; |
| | | showInterval.value = true; |
| | | } |
| | | setTimeout(()=>{ |
| | | formRef.value.resetFields(); |
| | | },300) |
| | | } |
| | | |
| | | defineExpose({ |
| | | initForm, |
| | | }); |
| | | </script> |
| | | <style lang="less" scoped> |
| | | @import '/@/assets/loginmini/style/home.less'; |
| | | @import '/@/assets/loginmini/style/base.less'; |
| | | </style> |