refactor: login page

This commit is contained in:
pany 2022-04-28 16:10:49 +08:00
parent c97ee74c44
commit 5c22bddbff

View File

@ -12,70 +12,68 @@ interface ILoginForm {
password: string password: string
/** 验证码 */ /** 验证码 */
code: string code: string
/** 随机数 */
codeToken: string
} }
const router = useRouter() const router = useRouter()
const loading = ref<boolean>(false)
const loginFormDom = ref<any>() const loginFormDom = ref<any>()
const codeUrl = ref<string>("")
const loginForm = reactive<ILoginForm>({ const state = reactive({
username: "admin", /** 登录按钮 loading */
password: "123456", loading: false,
code: "1234", /** 验证码图片 URL */
codeToken: "" codeUrl: "",
}) /** 登录表单 */
const loginRules = reactive({ loginForm: {
username: [{ required: true, message: "请输入用户名", trigger: "blur" }], username: "admin",
password: [ password: "12345678",
{ required: true, message: "请输入密码", trigger: "blur" }, code: "abcd"
{ min: 6, max: 18, message: "长度在 6 到 18 个字符", trigger: "blur" } } as ILoginForm,
], /** 登录表单校验规则 */
code: [{ required: true, message: "请输入验证码", trigger: "blur" }] loginRules: {
}) username: [{ required: true, message: "请输入用户名", trigger: "blur" }],
const handleLogin = () => { password: [
loginFormDom.value.validate((valid: boolean) => { { required: true, message: "请输入密码", trigger: "blur" },
if (valid) { { min: 8, max: 16, message: "长度在 8 到 16 个字符", trigger: "blur" }
loading.value = true ],
useUserStore() code: [{ required: true, message: "请输入验证码", trigger: "blur" }]
.login({ },
username: loginForm.username, /** 登录逻辑 */
password: loginForm.password handleLogin: () => {
}) loginFormDom.value.validate((valid: boolean) => {
.then(() => { if (valid) {
loading.value = false state.loading = true
router.push({ path: "/" }).catch((err) => { useUserStore()
console.warn(err) .login({
username: state.loginForm.username,
password: state.loginForm.password
}) })
}) .then(() => {
.catch(() => { state.loading = false
loading.value = false router.push({ path: "/" }).catch((err) => {
// createCode() console.warn(err)
}) })
} else { })
return false .catch(() => {
} state.loading = false
}) state.createCode()
} state.loginForm.password = ""
/** 创建验证码 */ })
const createCode: () => void = () => { } else {
// return false
loginForm.code = "" }
let codeToken = "" })
const codeTokenLength = 12 },
// /** 创建验证码 */
for (let i = 0; i < codeTokenLength; i++) { createCode: () => {
const index = Math.floor(Math.random() * 36) //
codeToken += index state.loginForm.code = ""
//
state.codeUrl = `/api/v1/login/code?${Math.random() * 1000}`
} }
loginForm.codeToken = codeToken })
//
codeUrl.value = `/api/v1/login/authcode?token=${codeToken}` /** 初始化验证码 */
} // state.createCode()
//
// createCode()
</script> </script>
<template> <template>
@ -86,10 +84,10 @@ const createCode: () => void = () => {
<img src="@/assets/layout/logo-text-2.png" /> <img src="@/assets/layout/logo-text-2.png" />
</div> </div>
<div class="content"> <div class="content">
<el-form ref="loginFormDom" :model="loginForm" :rules="loginRules" @keyup.enter="handleLogin"> <el-form ref="loginFormDom" :model="state.loginForm" :rules="state.loginRules" @keyup.enter="state.handleLogin">
<el-form-item prop="username"> <el-form-item prop="username">
<el-input <el-input
v-model="loginForm.username" v-model="state.loginForm.username"
placeholder="用户名" placeholder="用户名"
type="text" type="text"
tabindex="1" tabindex="1"
@ -99,17 +97,18 @@ const createCode: () => void = () => {
</el-form-item> </el-form-item>
<el-form-item prop="password"> <el-form-item prop="password">
<el-input <el-input
v-model="loginForm.password" v-model="state.loginForm.password"
placeholder="密码" placeholder="密码"
type="password" type="password"
tabindex="2" tabindex="2"
:prefix-icon="Lock" :prefix-icon="Lock"
size="large" size="large"
show-password
/> />
</el-form-item> </el-form-item>
<el-form-item prop="code"> <el-form-item prop="code">
<el-input <el-input
v-model="loginForm.code" v-model="state.loginForm.code"
placeholder="验证码" placeholder="验证码"
type="text" type="text"
tabindex="3" tabindex="3"
@ -118,10 +117,12 @@ const createCode: () => void = () => {
size="large" size="large"
/> />
<span class="show-code"> <span class="show-code">
<img :src="codeUrl" @click="createCode" /> <img :src="state.codeUrl" @click="state.createCode" />
</span> </span>
</el-form-item> </el-form-item>
<el-button :loading="loading" type="primary" size="large" @click.prevent="handleLogin"> </el-button> <el-button :loading="state.loading" type="primary" size="large" @click.prevent="state.handleLogin">
</el-button>
</el-form> </el-form>
</div> </div>
</div> </div>