<template>
<div class="login" @keyup.enter="clickLogin">
<div class="loginModule" ref="formWrap">
<div class="logo">
<img src="@/assets/images/logo.png" alt="" />
</div>
<div class="form">
<el-form ref="loginFormRef" :rules="loginRules" :model="loginForm">
<el-form-item prop="username">
<el-input
clearable
placeholder="用户名"
v-model="loginForm.username"
>
</el-input>
</el-form-item>
<el-form-item prop="password">
<el-input
clearable
show-password
placeholder="密码"
v-model="loginForm.password"
>
</el-input>
</el-form-item>
<div class="sliderValidate">
<div
class="validateWrap"
ref="sliderWrap"
:class="{
validatePass: validPass
}"
>
<div class="block" ref="slider">
<img
v-show="validPass"
src="@/assets/images/Login/slider-icon.png"
alt="滑块"
/>
<div class="sliderIcon" v-show="!validPass">
<DArrowRight style="width: 1em; height: 1em; " />
</div>
</div>
<span v-show="validPass" class="validatePass">验证通过</span>
<span v-show="!validPass" class="noValidate">拖动滑块校验</span>
</div>
</div>
<div class="showResetPassword">
<p>
<span class="sliderValid" v-if="showSliderWarn">请拖动滑块完成校验</span>
</p>
</div>
</el-form>
<a-button class="loginButton" type="primary" @click="clickLogin">登录</a-button>
</div>
</div>
</div>
</template>
<script lang="ts" setup>
import { reactive, ref, unref, onMounted, inject, getCurrentInstance } from "vue";
import { login } from "@/api/User";
import throttle from "@/utils/common"
const Mes: any = inject('$message')
import { submitEncrypt } from '@/utils/jsencrypt';
interface loginData {
username: string;
password: string;
}
let loginForm = reactive<loginData>({
username: "",
password: ""
});
const usernameCheck = async (rule: any, value: string, cb: any) => {
if (!/^w{5,20}$/g.test(value)) {
return cb("用户名不合法");
}
};
let loginRules = reactive({
username: [ { required: true, message: "请输入用户名", trigger: "blur" }, { validator: usernameCheck, trigger: 'blur' } ],
password: [ { required: true, message: "请输入密码", trigger: "blur" } ]
});
const loginFormRef = ref();
const validPass = ref(false)
const showSliderWarn = ref(false)
const slider = ref()
const sliderWrap = ref()
const formWrap = ref()
function sliderEvent() {
if (!slider.value || !sliderWrap.value) return null;
const sliderBoxWidth = sliderWrap.value.clientWidth;
const sliderWidth = slider.value.clientWidth;
const maxSlideX = sliderBoxWidth - sliderWidth;
const formClientX = formWrap.value.offsetLeft + 43;
slider.value.onmousedown = function(e: any) {
const offsetX = e.offsetX
if (validPass.value) {
return
}
document.onmousemove = function(e: any) {
if (validPass.value) {
document.onmousemove = null;
document.onmouseup = null;
return;
}
const x = e.clientX - formClientX - offsetX;
if (x > 0 && x < maxSlideX) {
slider.value.style.left = x + "px";
}
if (x < 0) {
slider.value.style.left = "0px";
}
if (x > maxSlideX) {
slider.value.style.left = maxSlideX + "px";
validPass.value = true;
showSliderWarn.value = false;
}
if (x === maxSlideX) {
validPass.value = true;
showSliderWarn.value = false;
}
}
document.onmouseup = function(e: any) {
const centerX = sliderBoxWidth / 2 - 23;
let x = e.clientX - formClientX - offsetX;
let timer: any = null;
if (x <= centerX && x > 0) {
timer = setInterval(() => {
x -= 2;
if (x <= 0) {
clearInterval(timer);
slider.value.style.left = "0px";
}
slider.value.style.left = x + "px";
}, 1);
} else if (x > centerX && x < maxSlideX) {
timer = setInterval(() => {
x += 2;
if (x >= maxSlideX) {
clearInterval(timer);
slider.value.style.left = maxSlideX + "px";
validPass.value = true;
showSliderWarn.value = false;
}
slider.value.style.left = x + "px";
}, 1);
}
document.onmousemove = null;
document.onmouseup = null;
}
}
}
const throttles = throttle(2000);
const clickLogin = () => {
throttles(async () => {
const form: any = unref(loginFormRef)
await form.validate()
if (validPass.value) {
showSliderWarn.value = false;
await isLogin();
} else {
showSliderWarn.value = true;
}
})
}
async function isLogin() {
try {
const { data } = await login({
username: loginForm.username,
password: submitEncrypt(loginForm.password)
})
if (data.code) {
}else{
}
} catch (err) {
console.log('e', err)
Mes.error('用户名或密码错误,请重试')
}
}
onMounted(() => {
sliderEvent()
});
</script>
<style lang="scss" scoped src="./Login.scss"></style>