2022-03-28 21:21:26 +08:00

234 lines
5.8 KiB
Vue

<template>
<div class="magic-login">
<div class="magic-login-box">
<!-- <div class="magic-login-logo"></div>-->
<div class="magic-login-text">{{ $global.title }}</div>
<div class="magic-login-row error" v-if="error"><mb-icon icon="error"/><span>{{ error }}</span></div>
<div class="magic-login-row">
<mb-icon icon="user"/>
<input ref="username" class="magic-input" v-model="loginForm.username" placeholder="用户名" name="username" type="text" tabindex="1" auto-complete="on" />
</div>
<div class="magic-login-row">
<mb-icon icon="password"/>
<input class="magic-input" ref="password" v-model="loginForm.password" type="password" placeholder="密码" name="password" tabindex="2" auto-complete="on" @keyup.enter.native="handleLogin" />
</div>
<div class="magic-login-row">
<mb-icon icon="verification-code"/>
<input class="magic-input code" ref="code" v-model="loginForm.code" placeholder="验证码" name="code" tabindex="3" @keyup.enter.native="handleLogin" />
<img class="code-img" :src="codeImg" @click="refreshCode">
</div>
<div class="magic-login-row">
<button :loading="loading" class="magic-button" type="primary" size="medium" @click.native.prevent="handleLogin">登录</button>
</div>
</div>
<div class="magic-login-copyright">Copyright © 2020-{{new Date().getYear() + 1900}} <a href="https://ssssssss.org.cn" target="_blank">ssssssss.org.cn</a> All rights reserved.</div>
</div>
</template>
<script setup>
import { reactive, ref, getCurrentInstance } from 'vue'
import { login } from '@/scripts/auth'
const { proxy } = getCurrentInstance()
const codeImg = ref(import.meta.env.VITE_APP_BASE_API + '/security/verification/code')
const loginForm = reactive({
username: '',
password: '',
code: ''
})
const loading = ref(false)
function refreshCode(){
proxy.$get('/system/security/verification/code').then(res => {
codeImg.value = 'data:image/png;base64,' + res.data.img
loginForm.uuid = res.data.uuid
})
}
refreshCode()
function handleLogin() {
if(!loginForm.username){
proxy.$message({
message: '请输入用户名',
type: 'error',
duration: 2000,
showClose: true
})
return
}else if(!loginForm.password){
proxy.$message({
message: '请输入密码',
type: 'error',
duration: 2000,
showClose: true
})
return
}else if(!loginForm.code){
proxy.$message({
message: '请输入验证码',
type: 'error',
duration: 2000,
showClose: true
})
return
}else{
loading.value = true
login(loginForm).then((res) => {
proxy.$router.push({ path: '/home' })
loading.value = false
}).catch(() => {
refreshCode()
loading.value = false
})
}
}
</script>
<style scoped>
*{
box-sizing: border-box;
}
.code{
width: 283px;
float: left;
margin-right: 15px;
}
.code-img{
border: 1px solid #D9D9D9;
border-radius: 4px;
}
input{
width: 100%;
}
label {
width: 60px;
text-align: right;
display: inline-block;
}
.magic-login{
position: fixed;
background: #fff;
width: 100%;
height: 100%;
display: flex;
align-items: center;
justify-content: center;
background-image: url(../assets/images/login-bg.svg);
}
.magic-login .magic-login-box{
border-radius: 5px;
width: 450px;
box-shadow: 0 7px 25px rgba(0,0,0,.08);
position: absolute;
box-sizing: border-box;
/*padding-top:60px;*/
padding-top:30px;
top:33.333333%;
margin-top: -125px;
background-color: #fff;
}
.magic-login-logo{
background-image: url(../assets/images/logo-magic-boot.png);
width: 128px;
height: 128px;
background-size: 90px 90px;
background-repeat: no-repeat;
background-position: center center;
position: absolute;
top: -64px;
left: 50%;
margin-left: -64px;
border-radius: 64px;
box-shadow: 0 0 20px 5px rgba(0,0,0,.08);
padding: 10px;
background-color: #fff;
}
.magic-login-text{
height: 70px;
line-height: 70px;
display: block;
text-align: center;
font-family: PoetsenOne;
font-size: 28px;
color: #808080;
}
.magic-login-text span{
font-size: 16px;
}
.magic-login-copyright{
text-align: center;
color: #999;
font-size: 18px;
font-family: Avenir,Helvetica,Arial,sans-serif;
position: absolute;
bottom: 50px;
}
.magic-login-copyright a{
text-decoration: none;
color: #2196f3;
outline: 0;
}
.magic-login-row{
width: 400px;
margin:25px auto;
position: relative;
}
.magic-login-row.error{
background-color: #fff1f0;
border: 1px solid #ffa39e;
color: #000;
border-radius: 4px;
padding:10px 0;
padding-left: 40px;
}
.magic-login-row.error span{
font-size: 14px;
word-break: break-all;
}
.magic-login-row svg{
position: absolute;
width: 20px;
height: 20px;
top: 15px;
left: 15px;
}
.magic-login-row :deep(.magic-icon-error){
fill: red;
}
.magic-login-box .magic-input{
height: 50px;
line-height: 50px;
background-color: transparent;
display: block;
border: 1px solid #D9D9D9;
border-radius: 4px;
padding-left: 40px;
color: rgba(0,0,0,.65);
transition: all .3s;
font-size: 16px;
outline: 0;
}
.magic-login-box .magic-input:focus{
border-color:#0784de;
}
.magic-login-box .magic-button{
width: 100%;
height: 50px;
line-height: 50px;
background-color: #2196f3;
color: #fff;
border-radius: 4px;
font-size: 18px;
border: 1px solid #ADADAD;
border-color: #2196f3;
transition: all .3s;
cursor: pointer;
}
.magic-login-box .magic-button:hover,
.magic-login-box .magic-button:focus{
background-color: #4db5ff !important;
border-color: #4db5ff !important;
}
.magic-login-box .magic-button:active{
background-color: #1272cc;
border-color: #1272cc;
}
</style>