<template>
|
<a-form-model ref="form" :model="model" :rules="validatorRules">
|
<a-form-model-item required prop="username">
|
<div class="login-input">
|
<img src="../../assets/icons/account.png" style="">
|
<a-input v-model="model.username" size="large" placeholder="用户名" ref="inputRef" @focus="inputFocus" autocomplete="off"/>
|
</div>
|
</a-form-model-item>
|
<a-form-model-item required prop="password">
|
<div class="login-input">
|
<img src="../../assets/icons/password.png">
|
<a-input v-model="model.password" size="large" type="password" autocomplete="off"
|
placeholder="密码"/>
|
</div>
|
</a-form-model-item>
|
|
<a-row :gutter="0" class="code-row-container">
|
<a-col :span="16">
|
<a-form-model-item required prop="inputCode">
|
<div class="login-input">
|
<img src="../../assets/icons/inputCode.png">
|
<a-input v-model="model.inputCode" size="large" type="text" placeholder="请输入验证码"/>
|
</div>
|
</a-form-model-item>
|
</a-col>
|
<a-col :span="8" class="code-col-container">
|
<img v-if="requestCodeSuccess" :src="randCodeImage" @click="handleChangeCheckCode"/>
|
<img v-else src="../../assets/checkcode.png" @click="handleChangeCheckCode"/>
|
</a-col>
|
</a-row>
|
</a-form-model>
|
</template>
|
|
<script>
|
import { getAction } from '@/api/manage'
|
import Vue from 'vue'
|
import { mapActions } from 'vuex'
|
|
export default {
|
name: 'LoginAccount',
|
data() {
|
return {
|
requestCodeSuccess: false,
|
randCodeImage: '',
|
currdatetime: '',
|
loginType: 0,
|
model: {
|
username: 'admin',
|
password: '123456',
|
inputCode: ''
|
},
|
validatorRules: {
|
username: [
|
{ required: true, message: '请输入用户名!' },
|
{ validator: this.handleUsernameOrEmail }
|
],
|
password: [{
|
required: true, message: '请输入密码!', validator: 'click'
|
}],
|
inputCode: [{
|
required: true, message: '请输入验证码!'
|
}]
|
}
|
|
}
|
},
|
created() {
|
this.handleChangeCheckCode()
|
},
|
methods: {
|
...mapActions(['Login']),
|
/**刷新验证码*/
|
handleChangeCheckCode() {
|
this.currdatetime = new Date().getTime()
|
this.model.inputCode = ''
|
getAction(`/sys/randomImage/${this.currdatetime}`).then(res => {
|
if (res.success) {
|
this.randCodeImage = res.result
|
this.requestCodeSuccess = true
|
} else {
|
this.$message.error(res.message)
|
this.requestCodeSuccess = false
|
}
|
}).catch(() => {
|
this.requestCodeSuccess = false
|
})
|
},
|
// 判断登录类型
|
handleUsernameOrEmail(rule, value, callback) {
|
const regex = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+((\.[a-zA-Z0-9_-]{2,3}){1,2})$/
|
if (regex.test(value)) {
|
this.loginType = 0
|
} else {
|
this.loginType = 1
|
}
|
callback()
|
},
|
/**
|
* 验证字段
|
* @param arr
|
* @param callback
|
*/
|
validateFields(arr, callback) {
|
let promiseArray = []
|
for (let item of arr) {
|
let p = new Promise((resolve, reject) => {
|
this.$refs['form'].validateField(item, (err) => {
|
if (!err) {
|
resolve()
|
} else {
|
reject(err)
|
}
|
})
|
})
|
promiseArray.push(p)
|
}
|
Promise.all(promiseArray).then(() => {
|
callback()
|
}).catch(err => {
|
callback(err)
|
})
|
},
|
acceptUsername(username) {
|
this.model['username'] = username
|
},
|
//账号密码登录
|
handleLogin(rememberMe) {
|
this.validateFields(['username', 'password', 'inputCode'], (err) => {
|
if (!err) {
|
let loginParams = {
|
username: this.model.username,
|
password: this.model.password,
|
captcha: this.model.inputCode,
|
checkKey: this.currdatetime,
|
remember_me: rememberMe
|
}
|
console.log('登录参数', loginParams)
|
this.Login(loginParams).then((res) => {
|
this.$emit('success', res.result)
|
}).catch((err) => {
|
//update-begin-author: taoyan date:20220425 for: 登录页面,当输入验证码错误时,验证码图片要刷新一下,而不是保持旧的验证码图片不变 #41
|
if (err && err.code === 412) {
|
this.handleChangeCheckCode()
|
}
|
//update-end-author: taoyan date:20220425 for: 登录页面,当输入验证码错误时,验证码图片要刷新一下,而不是保持旧的验证码图片不变 #41
|
this.$emit('fail', err)
|
})
|
} else {
|
this.$emit('validateFail')
|
}
|
})
|
},
|
|
inputFocus() {
|
console.log('触发focus', this.$refs.inputRef.$el.style)
|
this.$refs.inputRef.$el.style = 'background-color:#f00'
|
}
|
|
}
|
|
}
|
</script>
|
|
<style scoped lang="less">
|
.code-row-container {
|
/*height: 40px;*/
|
|
.code-col-container {
|
height: 55px;
|
display: flex;
|
justify-content: right;
|
align-items: center;
|
padding-left: 15px;
|
|
img {
|
height: 45px;
|
width: 100%;
|
border-radius: 15px;
|
}
|
}
|
}
|
</style>
|