|
|
@@ -6,7 +6,10 @@ export default {
|
|
|
data() {
|
|
|
return {
|
|
|
userData,
|
|
|
+ activeTab: '1',
|
|
|
loginLoading: false,
|
|
|
+ sendCodeLoading: false,
|
|
|
+ countdown: 0,
|
|
|
form: {
|
|
|
code: '',
|
|
|
username: '',
|
|
|
@@ -15,6 +18,27 @@ export default {
|
|
|
phoneForm: {
|
|
|
code: '',
|
|
|
phone: '',
|
|
|
+ },
|
|
|
+ formRules: {
|
|
|
+ username: [
|
|
|
+ { required: true, message: '请输入用户名', trigger: 'change' },
|
|
|
+ { required: true, message: '请输入用户名', trigger: 'blur' },
|
|
|
+ ],
|
|
|
+ password: [
|
|
|
+ { required: true, message: '请输入密码', trigger: 'change' },
|
|
|
+ { required: true, message: '请输入密码', trigger: 'blur' },
|
|
|
+ { min: 6, message: '密码至少6位', trigger: 'blur' },
|
|
|
+ ],
|
|
|
+ },
|
|
|
+ phoneFormRules: {
|
|
|
+ phone: [
|
|
|
+ { required: true, message: '请输入手机号', trigger: 'blur' },
|
|
|
+ { pattern: /^1[3456789]\d{9}$/, message: '请输入正确的手机号', trigger: 'blur' },
|
|
|
+ ],
|
|
|
+ code: [
|
|
|
+ { required: true, message: '请输入手机验证码', trigger: 'blur' },
|
|
|
+ { len: 6, message: '请正确输入6位验证码', trigger: 'blur' },
|
|
|
+ ],
|
|
|
}
|
|
|
}
|
|
|
},
|
|
|
@@ -22,15 +46,56 @@ export default {
|
|
|
},
|
|
|
mounted() {
|
|
|
this.GVerify = new GVerify("verify-code")
|
|
|
+ clearInterval(this.countdownInterval);
|
|
|
},
|
|
|
methods: {
|
|
|
callback(key) {
|
|
|
- //console.log(key);
|
|
|
+ this.activeTab = key;
|
|
|
+ if (key == '1') {
|
|
|
+ this.$nextTick(()=>{
|
|
|
+ this.GVerify = new GVerify("verify-code")
|
|
|
+ })
|
|
|
+ }
|
|
|
},
|
|
|
onChange(val) {
|
|
|
console.log(val)
|
|
|
},
|
|
|
handleSubmit() {
|
|
|
+ if (this.activeTab == '2') {
|
|
|
+ this.$refs.phoneForm.validate(valid=>{
|
|
|
+ if (valid) {
|
|
|
+ this.phoneLogin();
|
|
|
+ }
|
|
|
+ })
|
|
|
+ } else {
|
|
|
+ this.$refs.form.validate(valid=>{
|
|
|
+ if (valid) {
|
|
|
+ this.login();
|
|
|
+ }
|
|
|
+ })
|
|
|
+ }
|
|
|
+ },
|
|
|
+ sendCode() {
|
|
|
+ clearInterval(this.countdownInterval);
|
|
|
+ let app = this;
|
|
|
+ this.$refs.phoneForm.validateField('phone', valid=>{
|
|
|
+ if (!valid) {
|
|
|
+ app.$message.success('发送成功')
|
|
|
+ app.sendCodeLoading = true;
|
|
|
+ app.countdown = 30;
|
|
|
+
|
|
|
+ app.countdownInterval = setInterval(function() {
|
|
|
+ app.countdown = app.countdown-1;
|
|
|
+ if (app.countdown === 0) {
|
|
|
+ clearInterval(app.countdownInterval);
|
|
|
+ app.sendCodeLoading = false;
|
|
|
+ }
|
|
|
+ }, 1000);
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ },
|
|
|
+ login() {
|
|
|
let app = this;
|
|
|
app.loginLoading = true;
|
|
|
let valid = this.GVerify.validate(this.form.code)
|
|
|
@@ -49,6 +114,19 @@ export default {
|
|
|
this.GVerify.refresh();
|
|
|
app.loginLoading = false;
|
|
|
}
|
|
|
+ },
|
|
|
+ phoneLogin() {
|
|
|
+ let app = this;
|
|
|
+ app.loginLoading = true;
|
|
|
+ apiLogin.phonelogin(this.phoneForm).then(res=>{
|
|
|
+ app.loginLoading = false;
|
|
|
+ app.$store.userStore().setToken(res.token);
|
|
|
+ app.$store.userStore().setUserInfo(res.userInfo);
|
|
|
+ app.$message.success("登录成功")
|
|
|
+ app.$router.push("/")
|
|
|
+ }).catch(err=>{
|
|
|
+ app.loginLoading = false;
|
|
|
+ })
|
|
|
}
|
|
|
},
|
|
|
}
|
|
|
@@ -60,31 +138,31 @@ export default {
|
|
|
<div class="loginDiv">
|
|
|
<a-tabs default-active-key="1" @change="callback">
|
|
|
<a-tab-pane key="1" tab="账户登录">
|
|
|
- <div class="loginForm">
|
|
|
- <a-form :form="form">
|
|
|
- <a-form-item>
|
|
|
+ <div v-if="activeTab=='1'" class="loginForm">
|
|
|
+ <a-form-model ref="form" :model="form" :rules="formRules" >
|
|
|
+ <a-form-model-item prop="username">
|
|
|
<a-input v-model="form.username" style="height: 40px;letter-spacing: 1px" placeholder="账户/邮件账户" @keyup.enter.native="handleSubmit">
|
|
|
<a-icon slot="prefix" type="user" style="font-size: 16px;height: 25px;color: #a8a8a8;"/>
|
|
|
</a-input>
|
|
|
- </a-form-item>
|
|
|
- <a-form-item>
|
|
|
+ </a-form-model-item>
|
|
|
+ <a-form-model-item prop="password">
|
|
|
<a-input-password v-model="form.password" style="height: 40px;letter-spacing: 1px" placeholder="密码" @keyup.enter.native="handleSubmit">
|
|
|
<a-icon slot="prefix" type="lock" style="font-size: 16px;height: 23px;color: #a8a8a8"/>
|
|
|
</a-input-password>
|
|
|
- </a-form-item>
|
|
|
- <a-form-item>
|
|
|
+ </a-form-model-item>
|
|
|
+ <a-form-model-item>
|
|
|
<a-input v-model="form.code" placeholder="请输入验证码" :maxLength="4" @keyup.enter.native="handleSubmit"
|
|
|
style="width: 200px;height: 32px;display: inline-block;vertical-align: middle;letter-spacing: 2px"/>
|
|
|
<div id="verify-code" title="点击更换"></div>
|
|
|
- </a-form-item>
|
|
|
- <a-form-item>
|
|
|
+ </a-form-model-item>
|
|
|
+ <a-form-model-item>
|
|
|
<div style="height: 20px"></div>
|
|
|
<a-button type="primary" @click="handleSubmit" :loading="loginLoading"
|
|
|
style="width: 100%;height: 32px;font-size: 17px;letter-spacing: 5px">
|
|
|
登录
|
|
|
</a-button>
|
|
|
- </a-form-item>
|
|
|
- </a-form>
|
|
|
+ </a-form-model-item>
|
|
|
+ </a-form-model>
|
|
|
<div class="form-bottom">
|
|
|
<a-checkbox @change="onChange" style="float: left;margin-top: 5px">
|
|
|
记住密码
|
|
|
@@ -94,9 +172,9 @@ export default {
|
|
|
</div>
|
|
|
</a-tab-pane>
|
|
|
<a-tab-pane key="2" tab="手机登录" force-render>
|
|
|
- <div class="loginForm">
|
|
|
- <a-form :form="phoneForm">
|
|
|
- <a-form-item>
|
|
|
+ <div v-if="activeTab=='2'" class="loginForm">
|
|
|
+ <a-form-model ref="phoneForm" :model="phoneForm" :rules="phoneFormRules">
|
|
|
+ <a-form-model-item has-feedback prop="phone">
|
|
|
<a-input v-model="phoneForm.phone" style="height: 40px;" placeholder="手机号">
|
|
|
<template #prefix>
|
|
|
<span class="anticon" style="font-size: 16px;height: 25px;color: #a8a8a8;">
|
|
|
@@ -104,12 +182,15 @@ export default {
|
|
|
</span>
|
|
|
</template>
|
|
|
</a-input>
|
|
|
- </a-form-item>
|
|
|
- <a-form-item>
|
|
|
+ </a-form-model-item>
|
|
|
+ <a-form-model-item prop="code">
|
|
|
<a-input v-model="phoneForm.code" placeholder="请输入验证码"
|
|
|
- style="width: 240px;height: 32px;display: inline-block;vertical-align: middle"/>
|
|
|
- <a-button style="width: 100px">发送验证码</a-button>
|
|
|
- </a-form-item>
|
|
|
+ style="width: 200px;height: 32px;display: inline-block;vertical-align: middle"/>
|
|
|
+ <a-button style="width: 140px" @click="sendCode" :disabled="sendCodeLoading">
|
|
|
+ <span v-if="!sendCodeLoading">发送验证码</span>
|
|
|
+ <span v-if="sendCodeLoading">{{ countdown }}s 后重新发送</span>
|
|
|
+ </a-button>
|
|
|
+ </a-form-model-item>
|
|
|
<a-form-item>
|
|
|
<div style="height: 20px"></div>
|
|
|
<a-button type="primary" @click="handleSubmit"
|
|
|
@@ -117,7 +198,7 @@ export default {
|
|
|
登录
|
|
|
</a-button>
|
|
|
</a-form-item>
|
|
|
- </a-form>
|
|
|
+ </a-form-model>
|
|
|
</div>
|
|
|
</a-tab-pane>
|
|
|
</a-tabs>
|