<template>
|
<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="myiconfont icon-dianhua el-input__icon"></i>
|
</template>
|
</el-input>
|
</el-form-item>
|
<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"
|
>
|
<template #prefix>
|
<el-icon class="el-input__icon"><ele-Position /></el-icon>
|
</template>
|
</el-input>
|
</el-col>
|
<el-col :span="1"></el-col>
|
<el-col :span="8">
|
<el-button v-waves class="login-content-code" @click="sendSMS" :disabled="state.ruleForm.countNum > 0">{{
|
state.ruleForm.countNum > 0 ? `${state.ruleForm.countNum}秒后重试` : '获取验证码'
|
}}</el-button>
|
</el-col>
|
</el-form-item>
|
<el-form-item class="login-animation3">
|
<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> -->
|
</el-form>
|
</template>
|
|
<script setup lang="ts" name="loginMobile">
|
import { FormInstance, FormRules } from 'element-plus';
|
import { reactive, ref } from 'vue';
|
import { PostPhoneLogin, loginVerifyMessage } from '/@/api/ai/user';
|
import { accessSessionKey } from '/@/utils/request';
|
import { Local } from '/@/utils/storage';
|
// 定义变量内容
|
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' },
|
],
|
});
|
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,
|
}
|
);
|
|
startCount();
|
};
|
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,
|
});
|
|
Local.set(accessSessionKey, res.hswatersession);
|
return
|
await useUserInfo().setUserInfos({
|
userName: ruleForm.value.account,
|
phoneNumber: '',
|
photo: profileMan,
|
}); //缓存用户信息
|
state.loading.signIn = true;
|
if (!themeConfig.value.isRequestRoutes) {
|
// 前端控制路由,2、请注意执行顺序
|
const isNoPower = await initFrontEndControlRoutes();
|
// console.log(isNoPower,172)
|
signInSuccess(isNoPower);
|
} else {
|
// 模拟后端控制路由,isRequestRoutes 为 true,则开启后端控制路由
|
// 添加完动态路由,再进行 router 跳转,否则可能报错 No match found for location with path "/"
|
const isNoPower = await initBackEndControlRoutes();
|
// 执行完 initBackEndControlRoutes,再执行 signInSuccess
|
// console.log(isNoPower,178)
|
signInSuccess(isNoPower);
|
}
|
|
// 登录校验
|
// await apiSysAuthLoginPost(params)
|
// .then(async (res: any) => {
|
|
// })
|
// .catch((err: any) => {
|
// console.log(err);
|
// });
|
});
|
};
|
</script>
|
|
<style scoped lang="scss">
|
.login-content-form {
|
margin-top: 20px;
|
@for $i from 1 through 4 {
|
.login-animation#{$i} {
|
opacity: 0;
|
animation-name: error-num;
|
animation-duration: 0.5s;
|
animation-fill-mode: forwards;
|
animation-delay: calc($i/10) + s;
|
}
|
}
|
.login-content-code {
|
width: 100%;
|
padding: 0;
|
}
|
.login-content-submit {
|
width: 100%;
|
letter-spacing: 2px;
|
font-weight: 300;
|
margin-top: 15px;
|
}
|
.login-msg {
|
color: var(--el-text-color-placeholder);
|
}
|
}
|
</style>
|
import { initBackEndControlRoutes } from '/@/router/backEnd'; import { initFrontEndControlRoutes } from '/@/router/frontEnd'; import {
|
useUserInfo } from '/@/stores/userInfo';
|