| | |
| | | <template> |
| | | <el-form size="large" class="login-content-form"> |
| | | <el-form-item class="login-animation1"> |
| | | <el-form size="large" ref="dialogFormRef" :model="state.ruleForm" :rules="formRules" class="login-content-form"> |
| | | <el-form-item class="login-animation1" prop="userName"> |
| | | <el-input text :placeholder="$t('message.mobile.placeholder1')" v-model="state.ruleForm.userName" clearable autocomplete="off"> |
| | | <template #prefix> |
| | | <i class="iconfont icon-dianhua el-input__icon"></i> |
| | | <i class="myiconfont icon-dianhua el-input__icon"></i> |
| | | </template> |
| | | </el-input> |
| | | </el-form-item> |
| | | <el-form-item class="login-animation2"> |
| | | <el-form-item class="login-animation2" prop="code"> |
| | | <el-col :span="15"> |
| | | <el-input text maxlength="4" :placeholder="$t('message.mobile.placeholder2')" v-model="state.ruleForm.code" clearable autocomplete="off"> |
| | | <el-input |
| | | text |
| | | maxlength="4" |
| | | :placeholder="$t('message.mobile.placeholder2')" |
| | | v-model="state.ruleForm.code" |
| | | clearable |
| | | autocomplete="off" |
| | | > |
| | | <template #prefix> |
| | | <el-icon class="el-input__icon"><ele-Position /></el-icon> |
| | | </template> |
| | |
| | | </el-col> |
| | | <el-col :span="1"></el-col> |
| | | <el-col :span="8"> |
| | | <el-button v-waves class="login-content-code">{{ $t('message.mobile.codeText') }}</el-button> |
| | | <el-button v-waves class="login-content-code" @click="sendSMS" :disabled="hasSended">{{ sendCodeMsg }}</el-button> |
| | | </el-col> |
| | | </el-form-item> |
| | | <el-form-item class="login-animation3"> |
| | | <el-button round type="primary" v-waves class="login-content-submit"> |
| | | <el-button round type="primary" v-waves class="login-content-submit" @click="onSignIn"> |
| | | <span>{{ $t('message.mobile.btnText') }}</span> |
| | | </el-button> |
| | | </el-form-item> |
| | | <div class="font12 mt30 login-animation4 login-msg">{{ $t('message.mobile.msgText') }}</div> |
| | | <!-- <div class="font12 mt30 login-animation4 login-msg">{{ $t('message.mobile.msgText') }}</div> --> |
| | | </el-form> |
| | | </template> |
| | | |
| | | <script setup lang="ts" name="loginMobile"> |
| | | import { reactive } from 'vue'; |
| | | import { FormInstance, FormRules } from 'element-plus'; |
| | | import { computed, reactive, ref } from 'vue'; |
| | | import { PostPhoneLogin, loginVerifyMessage } from '/@/api/ai/user'; |
| | | import { formatAxis } from '/@/utils/formatTime'; |
| | | |
| | | const emit = defineEmits(['login']); |
| | | // 定义变量内容 |
| | | const state = reactive({ |
| | | ruleForm: { |
| | | userName: '', |
| | | code: '', |
| | | countNum: null, |
| | | countTimer: null, |
| | | }, |
| | | }); |
| | | |
| | | const formRules = ref<FormRules>({ |
| | | code: [{ required: true, message: '请输入验证码', trigger: 'blur' }], |
| | | userName: [ |
| | | { required: true, message: '请输入手机号码', trigger: 'blur' }, |
| | | { pattern: /^1\d{10}$/, message: '请输入正确的手机号码', trigger: 'blur' }, |
| | | ], |
| | | }); |
| | | |
| | | const hasSended = computed(() => { |
| | | return state.ruleForm.countNum !== null; |
| | | }); |
| | | const sendCodeMsg = computed(() => { |
| | | return !hasSended.value ? '获取验证码' : `${state.ruleForm.countNum} 秒后重试`; |
| | | }); |
| | | function stopCount() { |
| | | state.ruleForm.countNum = null; |
| | | clearInterval(state.ruleForm.countTimer); |
| | | } |
| | | |
| | | const startCount = () => { |
| | | stopCount(); |
| | | state.ruleForm.countNum = 60; |
| | | state.ruleForm.countTimer = setInterval(() => { |
| | | if (state.ruleForm.countNum === 0) { |
| | | state.ruleForm.countNum = null; |
| | | clearInterval(state.ruleForm.countTimer); |
| | | return; |
| | | } |
| | | state.ruleForm.countNum--; |
| | | }, 1000); |
| | | }; |
| | | |
| | | const dialogFormRef = ref<FormInstance>(null); |
| | | |
| | | const sendSMS = async () => { |
| | | if (state.ruleForm.countNum !== null) { |
| | | return; |
| | | } |
| | | const valid = await dialogFormRef.value.validateField(['userName']).catch(() => {}); |
| | | if (!valid) return; |
| | | |
| | | state.ruleForm.code = ''; |
| | | |
| | | await loginVerifyMessage( |
| | | { |
| | | phone: state.ruleForm.userName, |
| | | }, |
| | | { |
| | | noAuth: true, |
| | | loading: false, |
| | | } |
| | | ); |
| | | |
| | | startCount(); |
| | | }; |
| | | |
| | | const currentTime = computed(() => { |
| | | return formatAxis(new Date()); |
| | | }); |
| | | const LOGIN_CLIENT = '后台管理'; |
| | | // 登录 |
| | | const onSignIn = async () => { |
| | | dialogFormRef.value.validate(async (valid) => { |
| | | if (!valid) return false; |
| | | let params = { |
| | | phone: state.ruleForm.userName, |
| | | code: state.ruleForm.code, |
| | | client: LOGIN_CLIENT, |
| | | }; |
| | | const res = await PostPhoneLogin(params, { |
| | | noAuth: true, |
| | | loading: false, |
| | | }); |
| | | |
| | | // state.loading.signIn = true; |
| | | await emit('login', res, currentTime.value); |
| | | // state.loading.signIn = false; |
| | | }); |
| | | }; |
| | | </script> |
| | | |
| | | <style scoped lang="scss"> |
| | |
| | | } |
| | | } |
| | | </style> |
| | | import { initBackEndControlRoutes } from '/@/router/backEnd'; import { initFrontEndControlRoutes } from '/@/router/frontEnd'; import { |
| | | useUserInfo } from '/@/stores/userInfo'; |