|
|
|
<template>
|
|
|
|
<div class="wrap">
|
|
|
|
<div class="shapes">
|
|
|
|
<img class="shape1" src="@/assets/img/shapes/shape1.png" alt="">
|
|
|
|
<img class="shape2" src="@/assets/img/shapes/shape2.png" alt="">
|
|
|
|
<img class="shape3" src="@/assets/img/shapes/shape3.png" alt="">
|
|
|
|
<img class="shape4" src="@/assets/img/shapes/shape4.png" alt="">
|
|
|
|
<img class="shape5" src="@/assets/img/shapes/shape5.png" alt="">
|
|
|
|
<img class="shape6" src="@/assets/img/shapes/shape6.png" alt="">
|
|
|
|
</div>
|
|
|
|
<div class="login">
|
|
|
|
<div class="form">
|
|
|
|
<h6 class="title">欢迎使用请登录</h6>
|
|
|
|
<ul class="tab">
|
|
|
|
<li v-for="(item,index) in tabList" :key="index" :class="{active: form.distinguish == item.id}" @click="typeClick(item)">{{item.label}}</li>
|
|
|
|
</ul>
|
|
|
|
<el-form :model="form" :rules="rules" ref="login" label-width="0px">
|
|
|
|
<el-form-item prop="account">
|
|
|
|
<label class="account"></label>
|
|
|
|
<el-input v-model="form.account" :placeholder="form.distinguish == 1 ? '请输入账号' : '请输入手机号/邮箱'" @keyup.enter.native="submitForm"></el-input>
|
|
|
|
</el-form-item>
|
|
|
|
<el-form-item prop="password">
|
|
|
|
<label class="password"></label>
|
|
|
|
<el-input type="password" placeholder="请输入密码" v-model="form.password" @keyup.enter.native="submitForm"></el-input>
|
|
|
|
</el-form-item>
|
|
|
|
<el-form-item prop="code">
|
|
|
|
<label class="code"></label>
|
|
|
|
<el-input placeholder="请输入验证码" v-model="form.code" @keyup.enter.native="submitForm"></el-input>
|
|
|
|
<img @click="getVerImg" :src="verificationIMG" class="ver-img" alt="">
|
|
|
|
</el-form-item>
|
|
|
|
<el-button class="submit" type="primary" @click="submitForm">登录</el-button>
|
|
|
|
</el-form>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
|
|
|
|
<el-dialog title="绑定手机号" :visible.sync="phoneVisible" :close-on-click-modal="false" width="30%">
|
|
|
|
<el-form ref="form" label-width="60px">
|
|
|
|
<el-form-item label="手机号">
|
|
|
|
<el-input style="width: 394px;" placeholder="请输入手机号" v-model="phone" maxlength="11"></el-input>
|
|
|
|
</el-form-item>
|
|
|
|
<el-form-item label="验证码">
|
|
|
|
<div class="flex">
|
|
|
|
<el-input v-model="phoneCode" placeholder="请输入验证码" maxlength="6"></el-input>
|
|
|
|
<el-button style="margin-left: 10px" type="text" @click="sendPhoneCode" :disabled="phoneDisabled">{{phoneBtnText}}</el-button>
|
|
|
|
</div>
|
|
|
|
</el-form-item>
|
|
|
|
</el-form>
|
|
|
|
<span slot="footer" class="dialog-footer">
|
|
|
|
<el-button size="small" @click="phoneVisible = false">取 消</el-button>
|
|
|
|
<el-button size="small" type="primary" @click="phoneSubmit">确 定</el-button>
|
|
|
|
</span>
|
|
|
|
</el-dialog>
|
|
|
|
|
|
|
|
<div class="footer">
|
|
|
|
<div class="copyright">
|
|
|
|
<a href="https://beian.miit.gov.cn/#/Integrated/index" target="_blank">粤ICP备20072679号</a>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</template>
|
|
|
|
|
|
|
|
<script>
|
|
|
|
import { mapActions } from 'vuex'
|
|
|
|
import vHead from '@/layouts/header'
|
|
|
|
import util from '@/libs/util'
|
|
|
|
import Setting from '@/setting'
|
|
|
|
import vFooter from '@/layouts/footer'
|
|
|
|
export default {
|
|
|
|
data: function() {
|
|
|
|
return {
|
|
|
|
tabList: [
|
|
|
|
{
|
|
|
|
id: '1',
|
|
|
|
label: '账号'
|
|
|
|
},{
|
|
|
|
id: '2',
|
|
|
|
label: '手机号/邮箱'
|
|
|
|
}
|
|
|
|
],
|
|
|
|
verificationIMG: '',
|
|
|
|
form: {
|
|
|
|
distinguish: '1',
|
|
|
|
account: 'admin',
|
|
|
|
password: '111aaa',
|
|
|
|
random: '',
|
|
|
|
code: ''
|
|
|
|
},
|
|
|
|
rules: {
|
|
|
|
account: [{ required: true, message: '请输入账号', trigger: 'blur' }],
|
|
|
|
password: [{ required: true, message: '请输入密码', trigger: 'blur' }],
|
|
|
|
code: [{ required: true, message: '请输入验证码', trigger: 'blur' }],
|
|
|
|
},
|
|
|
|
phoneVisible: false,
|
|
|
|
phone: '',
|
|
|
|
phoneCode: '',
|
|
|
|
phoneDisabled: false,
|
|
|
|
phoneTimer: null,
|
|
|
|
phoneBtnText: '发送验证码'
|
|
|
|
};
|
|
|
|
},
|
|
|
|
components: {vHead,vFooter},
|
|
|
|
mounted(){
|
|
|
|
this.getVerImg()
|
|
|
|
},
|
|
|
|
methods: {
|
|
|
|
...mapActions('user', [
|
|
|
|
'login','setCustomer'
|
|
|
|
]),
|
|
|
|
typeClick(item){
|
|
|
|
this.form.account = ''
|
|
|
|
this.form.distinguish = item.id
|
|
|
|
this.$refs.login.clearValidate()
|
|
|
|
this.rules.account[0].message = item.id == 1 ? '请输入账号' : '请输入手机号/邮箱'
|
|
|
|
},
|
|
|
|
submitForm() {
|
|
|
|
this.$refs.login.validate(valid => {
|
|
|
|
if (valid) {
|
|
|
|
this.login(this.form).then(() => {
|
|
|
|
let redirect = this.$route.query.redirect ? decodeURIComponent(this.$route.query.redirect) : '/index'
|
|
|
|
this.$router.replace(redirect)
|
|
|
|
}).catch(res => {
|
|
|
|
// 如果没有绑定手机号
|
|
|
|
if(res && res.status == 30001){
|
|
|
|
this.phoneVisible = true
|
|
|
|
}
|
|
|
|
this.getVerImg()
|
|
|
|
this.form.code = ''
|
|
|
|
})
|
|
|
|
}
|
|
|
|
})
|
|
|
|
},
|
|
|
|
getVerImg(){
|
|
|
|
if(!this.form.account){
|
|
|
|
return this.verificationIMG = ''
|
|
|
|
}
|
|
|
|
this.form.random = Math.floor(Math.random()*999999999)
|
|
|
|
this.verificationIMG = this.api.verification+'?random='+`${this.form.random}`
|
|
|
|
},
|
|
|
|
phoneCountdown(){
|
|
|
|
let count = 60
|
|
|
|
if(!this.phoneTimer){
|
|
|
|
this.phoneDisabled = true
|
|
|
|
this.phoneTimer = setInterval(() => {
|
|
|
|
console.log('倒计时中')
|
|
|
|
if(count > 0){
|
|
|
|
count--
|
|
|
|
this.phoneBtnText = `${count}秒后重试`
|
|
|
|
}else{
|
|
|
|
this.phoneDisabled = false
|
|
|
|
clearInterval(this.phoneTimer)
|
|
|
|
this.phoneTimer = null
|
|
|
|
this.phoneBtnText = `发送验证码`
|
|
|
|
}
|
|
|
|
},1000)
|
|
|
|
}
|
|
|
|
},
|
|
|
|
sendPhoneCode(){
|
|
|
|
if(!this.phone) return util.warningMsg('请输入手机号')
|
|
|
|
if(!/^1[3456789]\d{9}$/.test(this.phone)) return util.warningMsg('请输入正确的手机号')
|
|
|
|
let data = {
|
|
|
|
phone: this.phone,
|
|
|
|
types: 2 // 邮箱:1,手机:2
|
|
|
|
}
|
|
|
|
this.$post(this.api.sendPhoneOrEmailCode,data).then(res => {
|
|
|
|
if(res.message.opener){
|
|
|
|
this.phoneCountdown()
|
|
|
|
this.phoneOpener = res.message.opener
|
|
|
|
}else{
|
|
|
|
util.errorMsg(res.message)
|
|
|
|
}
|
|
|
|
|
|
|
|
}).catch(res => {})
|
|
|
|
},
|
|
|
|
phoneSubmit(){
|
|
|
|
if(!this.phone) return util.warningMsg('请输入手机号')
|
|
|
|
if(!/^1[3456789]\d{9}$/.test(this.phone)) return util.warningMsg('请输入正确的手机号')
|
|
|
|
if(!this.phoneCode) return util.warningMsg('请输入验证码')
|
|
|
|
let data = {
|
|
|
|
phone: this.phone,
|
|
|
|
types: 2,
|
|
|
|
code: this.phoneCode,
|
|
|
|
opener: this.phoneOpener,
|
|
|
|
platform: Setting.platformId,
|
|
|
|
account: this.form.account
|
|
|
|
}
|
|
|
|
this.$post(this.api.bindPhoneOrEmail,data).then(res => {
|
|
|
|
util.successMsg('绑定成功')
|
|
|
|
this.form.phone = this.phone
|
|
|
|
this.phoneVisible = false
|
|
|
|
// 是否是客户
|
|
|
|
this.$get(this.api.isClient).then(res => {
|
|
|
|
this.setCustomer(res.customer)
|
|
|
|
}).catch(res => {})
|
|
|
|
util.local.set(Setting.tokenKey,res.token,43200000)
|
|
|
|
util.successMsg('登录成功')
|
|
|
|
setTimeout(() => {
|
|
|
|
this.$post(this.api.saveRecord,{
|
|
|
|
type: 3,
|
|
|
|
}).then(res => {}).catch(res => {})
|
|
|
|
},3000)
|
|
|
|
this.$router.push('/index/list')
|
|
|
|
}).catch(res => {})
|
|
|
|
},
|
|
|
|
},
|
|
|
|
};
|
|
|
|
</script>
|
|
|
|
|
|
|
|
<style scoped lang="scss">
|
|
|
|
.wrap {
|
|
|
|
min-height: 100%;
|
|
|
|
background-color: #F3F6FA;
|
|
|
|
overflow: hidden;
|
|
|
|
.shapes{
|
|
|
|
img{
|
|
|
|
position: absolute;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
.shape1{
|
|
|
|
top: 123px;
|
|
|
|
}
|
|
|
|
.shape2{
|
|
|
|
top: 238px;
|
|
|
|
left: 35px;
|
|
|
|
}
|
|
|
|
.shape3{
|
|
|
|
top: 485px;
|
|
|
|
}
|
|
|
|
.shape4{
|
|
|
|
bottom: 285px;
|
|
|
|
right: 0;
|
|
|
|
}
|
|
|
|
.shape5{
|
|
|
|
bottom: 145px;
|
|
|
|
right: 0;
|
|
|
|
}
|
|
|
|
.shape6{
|
|
|
|
bottom: 0;
|
|
|
|
right: 0;
|
|
|
|
}
|
|
|
|
.login{
|
|
|
|
width: 436px;
|
|
|
|
margin: 188px auto 150px;
|
|
|
|
.form{
|
|
|
|
padding: 38px 38px 60px;
|
|
|
|
border-radius: 6px;
|
|
|
|
background-color: #fff;
|
|
|
|
.title{
|
|
|
|
margin-bottom: 25px;
|
|
|
|
font-size: 26px;
|
|
|
|
color: #0B1D30;
|
|
|
|
letter-spacing: 4px;
|
|
|
|
}
|
|
|
|
.tab{
|
|
|
|
display: flex;
|
|
|
|
align-items: center;
|
|
|
|
margin-bottom: 24px;
|
|
|
|
border-bottom: 2px solid #E1E6F2;
|
|
|
|
li{
|
|
|
|
padding: 18px 0;
|
|
|
|
margin-bottom: -1px;
|
|
|
|
font-size: 18px;
|
|
|
|
color: #555;
|
|
|
|
cursor: pointer;
|
|
|
|
border-bottom: 4px solid transparent;
|
|
|
|
&:first-child{
|
|
|
|
margin-right: 50px;
|
|
|
|
}
|
|
|
|
&.active{
|
|
|
|
color: #006EFF;;
|
|
|
|
border-bottom-color: #006EFF;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
.label{
|
|
|
|
margin-bottom: 10px;
|
|
|
|
color: #105CB2;
|
|
|
|
}
|
|
|
|
/deep/.el-form-item{
|
|
|
|
margin-bottom: 20px;
|
|
|
|
}
|
|
|
|
/deep/.el-input__inner{
|
|
|
|
position: relative;
|
|
|
|
height: 52px;
|
|
|
|
padding: 0 20px 0 34px;
|
|
|
|
line-height: 50px;
|
|
|
|
background-color: #FBFBFB;
|
|
|
|
border: 1px solid #E1E6F2;
|
|
|
|
border-radius: 4px !important;
|
|
|
|
}
|
|
|
|
.account,.password,.code{
|
|
|
|
z-index: 1;
|
|
|
|
position: absolute;
|
|
|
|
top: 17px;
|
|
|
|
left: 11px;
|
|
|
|
width: 18px;
|
|
|
|
height: 18px;
|
|
|
|
background: url(../../../assets/img/login/account.png) 0 0/100% 100% no-repeat;
|
|
|
|
}
|
|
|
|
.password{
|
|
|
|
top: 18px;
|
|
|
|
background-image: url(../../../assets/img/login/password.png);
|
|
|
|
}
|
|
|
|
.code{
|
|
|
|
top: 18px;
|
|
|
|
background-image: url(../../../assets/img/login/code.png);
|
|
|
|
}
|
|
|
|
.ver-img{
|
|
|
|
position: absolute;
|
|
|
|
top: 1px;
|
|
|
|
right: 1px;
|
|
|
|
}
|
|
|
|
/deep/.el-form-item__error{
|
|
|
|
top: 105%;
|
|
|
|
left: auto;
|
|
|
|
right: 0;
|
|
|
|
color: #FFA94E;
|
|
|
|
}
|
|
|
|
.submit{
|
|
|
|
width: 100%;
|
|
|
|
height: 48px;
|
|
|
|
margin-top: 30px;
|
|
|
|
line-height: 48px;
|
|
|
|
padding: 0;
|
|
|
|
font-size: 20px;
|
|
|
|
background-color: $main-color;
|
|
|
|
border-radius: 4px;
|
|
|
|
border: 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
.footer{
|
|
|
|
z-index: 3;
|
|
|
|
position: fixed;
|
|
|
|
bottom: 0;
|
|
|
|
left: 0;
|
|
|
|
width: 100%;
|
|
|
|
}
|
|
|
|
.copyright{
|
|
|
|
padding: 18px 0;
|
|
|
|
font-size: 12px;
|
|
|
|
text-align: center;
|
|
|
|
background-color: #F3F6FA;
|
|
|
|
a{
|
|
|
|
color:#B1B4B8;
|
|
|
|
font-size: 12px;
|
|
|
|
&:hover{
|
|
|
|
opacity: .8;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
</style>
|