|
|
@@ -1,6 +1,6 @@
|
|
|
<template>
|
|
|
<div class="login">
|
|
|
- <el-form ref="loginRef" :model="loginForm" :rules="loginRules" class="login-form">
|
|
|
+ <a-form ref="loginRef" :model="loginForm" :rules="loginRules" class="login-form">
|
|
|
<div class="title-container">
|
|
|
<h3 class="title">{{ title }}</h3>
|
|
|
</div>
|
|
|
@@ -26,93 +26,91 @@
|
|
|
|
|
|
<!-- 账号登录表单 -->
|
|
|
<template v-if="loginType === 'account'">
|
|
|
- <el-form-item prop="username">
|
|
|
- <el-input
|
|
|
- v-model="loginForm.username"
|
|
|
+ <a-form-item name="username">
|
|
|
+ <a-input
|
|
|
+ v-model:value="loginForm.username"
|
|
|
type="text"
|
|
|
size="large"
|
|
|
- auto-complete="off"
|
|
|
+ autocomplete="off"
|
|
|
placeholder="账号"
|
|
|
class="login-input"
|
|
|
>
|
|
|
- <template #prefix><svg-icon icon-class="user" class="el-input__icon input-icon" /></template>
|
|
|
- </el-input>
|
|
|
- </el-form-item>
|
|
|
- <el-form-item prop="password">
|
|
|
- <el-input
|
|
|
- v-model="loginForm.password"
|
|
|
- type="password"
|
|
|
+ <template #prefix><svg-icon icon-class="user" class="input-icon" /></template>
|
|
|
+ </a-input>
|
|
|
+ </a-form-item>
|
|
|
+ <a-form-item name="password">
|
|
|
+ <a-input-password
|
|
|
+ v-model:value="loginForm.password"
|
|
|
size="large"
|
|
|
- auto-complete="off"
|
|
|
+ autocomplete="off"
|
|
|
placeholder="密码"
|
|
|
@keyup.enter="handleLogin"
|
|
|
class="login-input"
|
|
|
- show-password
|
|
|
>
|
|
|
- <template #prefix><svg-icon icon-class="password" class="el-input__icon input-icon" /></template>
|
|
|
- </el-input>
|
|
|
- </el-form-item>
|
|
|
- <el-form-item prop="code" v-if="captchaEnabled">
|
|
|
+ <template #prefix><svg-icon icon-class="password" class="input-icon" /></template>
|
|
|
+ </a-input-password>
|
|
|
+ </a-form-item>
|
|
|
+ <a-form-item name="code" v-if="captchaEnabled">
|
|
|
<div class="captcha-container">
|
|
|
- <el-input
|
|
|
- v-model="loginForm.code"
|
|
|
+ <a-input
|
|
|
+ v-model:value="loginForm.code"
|
|
|
size="large"
|
|
|
- auto-complete="off"
|
|
|
+ autocomplete="off"
|
|
|
placeholder="验证码"
|
|
|
class="login-input captcha-input"
|
|
|
@keyup.enter="handleLogin"
|
|
|
>
|
|
|
- <template #prefix><svg-icon icon-class="validCode" class="el-input__icon input-icon" /></template>
|
|
|
- </el-input>
|
|
|
+ <template #prefix><svg-icon icon-class="validCode" class="input-icon" /></template>
|
|
|
+ </a-input>
|
|
|
<div class="login-code">
|
|
|
<img :src="codeUrl" @click="getCode" class="login-code-img"/>
|
|
|
</div>
|
|
|
</div>
|
|
|
- </el-form-item>
|
|
|
+ </a-form-item>
|
|
|
</template>
|
|
|
|
|
|
<!-- 邮箱登录表单 (UI Only) -->
|
|
|
<template v-else>
|
|
|
- <el-form-item prop="email">
|
|
|
- <el-input
|
|
|
- v-model="loginForm.email"
|
|
|
+ <a-form-item name="email">
|
|
|
+ <a-input
|
|
|
+ v-model:value="loginForm.email"
|
|
|
type="text"
|
|
|
size="large"
|
|
|
- auto-complete="off"
|
|
|
+ autocomplete="off"
|
|
|
placeholder="请输入邮箱地址"
|
|
|
class="login-input"
|
|
|
>
|
|
|
- <template #prefix><svg-icon icon-class="email" class="el-input__icon input-icon" /></template>
|
|
|
- </el-input>
|
|
|
- </el-form-item>
|
|
|
- <el-form-item prop="emailCode">
|
|
|
+ <template #prefix><svg-icon icon-class="email" class="input-icon" /></template>
|
|
|
+ </a-input>
|
|
|
+ </a-form-item>
|
|
|
+ <a-form-item name="emailCode">
|
|
|
<div class="captcha-container">
|
|
|
- <el-input
|
|
|
- v-model="loginForm.emailCode"
|
|
|
+ <a-input
|
|
|
+ v-model:value="loginForm.emailCode"
|
|
|
size="large"
|
|
|
- auto-complete="off"
|
|
|
+ autocomplete="off"
|
|
|
placeholder="邮箱验证码"
|
|
|
class="login-input captcha-input"
|
|
|
@keyup.enter="handleLogin"
|
|
|
>
|
|
|
- <template #prefix><svg-icon icon-class="validCode" class="el-input__icon input-icon" /></template>
|
|
|
- </el-input>
|
|
|
- <el-button size="large" class="get-code-btn" :disabled="emailCodeDisabled" @click="handleSendEmailCode">
|
|
|
+ <template #prefix><svg-icon icon-class="validCode" class="input-icon" /></template>
|
|
|
+ </a-input>
|
|
|
+ <a-button size="large" class="get-code-btn" :disabled="emailCodeDisabled" @click="handleSendEmailCode">
|
|
|
{{ emailCodeBtnText }}
|
|
|
- </el-button>
|
|
|
+ </a-button>
|
|
|
</div>
|
|
|
- </el-form-item>
|
|
|
+ </a-form-item>
|
|
|
</template>
|
|
|
|
|
|
<div class="form-options">
|
|
|
- <el-checkbox v-model="loginForm.rememberMe">记住密码</el-checkbox>
|
|
|
+ <a-checkbox v-model:checked="loginForm.rememberMe">记住密码</a-checkbox>
|
|
|
<div class="link-group">
|
|
|
<router-link v-if="register" class="link-type" :to="'/register'">立即注册</router-link>
|
|
|
</div>
|
|
|
</div>
|
|
|
|
|
|
- <el-form-item style="width:100%;">
|
|
|
- <el-button
|
|
|
+ <a-form-item style="width:100%;">
|
|
|
+ <a-button
|
|
|
:loading="loading"
|
|
|
size="large"
|
|
|
type="primary"
|
|
|
@@ -121,9 +119,9 @@
|
|
|
>
|
|
|
<span v-if="!loading">登 录</span>
|
|
|
<span v-else>登 录 中...</span>
|
|
|
- </el-button>
|
|
|
- </el-form-item>
|
|
|
- </el-form>
|
|
|
+ </a-button>
|
|
|
+ </a-form-item>
|
|
|
+ </a-form>
|
|
|
|
|
|
<!-- 底部 -->
|
|
|
<div class="el-login-footer">
|
|
|
@@ -134,7 +132,7 @@
|
|
|
|
|
|
<script setup>
|
|
|
import { getCodeImg, sendEmailCode } from "@/api/login"
|
|
|
-import { ElMessage } from 'element-plus'
|
|
|
+import { message } from 'ant-design-vue'
|
|
|
import Cookies from "js-cookie"
|
|
|
import { encrypt, decrypt } from "@/utils/jsencrypt"
|
|
|
import useUserStore from '@/store/modules/user'
|
|
|
@@ -160,14 +158,14 @@ const loginForm = ref({
|
|
|
})
|
|
|
|
|
|
const loginRules = {
|
|
|
- username: [{ required: true, trigger: "blur", message: "请输入您的账号" }],
|
|
|
- password: [{ required: true, trigger: "blur", message: "请输入您的密码" }],
|
|
|
- code: [{ required: true, trigger: "change", message: "请输入验证码" }],
|
|
|
+ username: [{ required: true, message: "请输入您的账号", trigger: "blur" }],
|
|
|
+ password: [{ required: true, message: "请输入您的密码", trigger: "blur" }],
|
|
|
+ code: [{ required: true, message: "请输入验证码", trigger: "change" }],
|
|
|
email: [
|
|
|
- { required: true, trigger: "blur", message: "请输入您的邮箱" },
|
|
|
- { type: "email", trigger: "blur", message: "请输入正确的邮箱格式" }
|
|
|
+ { required: true, message: "请输入您的邮箱", trigger: "blur" },
|
|
|
+ { type: "email", message: "请输入正确的邮箱格式", trigger: "blur" }
|
|
|
],
|
|
|
- emailCode: [{ required: true, trigger: "blur", message: "请输入邮箱验证码" }]
|
|
|
+ emailCode: [{ required: true, message: "请输入邮箱验证码", trigger: "blur" }]
|
|
|
}
|
|
|
|
|
|
// 邮箱验证码倒计时相关
|
|
|
@@ -195,42 +193,42 @@ function handleLogin() {
|
|
|
? ['username', 'password', ...(captchaEnabled.value ? ['code'] : [])]
|
|
|
: ['email', 'emailCode']
|
|
|
|
|
|
- proxy.$refs.loginRef.validateField(fieldsToValidate, (valid) => {
|
|
|
- if (valid) {
|
|
|
- loading.value = true
|
|
|
-
|
|
|
- if (loginType.value === 'account') {
|
|
|
- // 账号密码登录
|
|
|
- // 勾选了需要记住密码设置在 cookie 中设置记住用户名和密码
|
|
|
- if (loginForm.value.rememberMe) {
|
|
|
- Cookies.set("username", loginForm.value.username, { expires: 30 })
|
|
|
- Cookies.set("password", encrypt(loginForm.value.password), { expires: 30 })
|
|
|
- Cookies.set("rememberMe", loginForm.value.rememberMe, { expires: 30 })
|
|
|
- } else {
|
|
|
- // 否则移除
|
|
|
- Cookies.remove("username")
|
|
|
- Cookies.remove("password")
|
|
|
- Cookies.remove("rememberMe")
|
|
|
- }
|
|
|
- // 调用action的登录方法
|
|
|
- userStore.login(loginForm.value).then(() => {
|
|
|
- handleLoginSuccess()
|
|
|
- }).catch(() => {
|
|
|
- loading.value = false
|
|
|
- // 重新获取验证码
|
|
|
- if (captchaEnabled.value) {
|
|
|
- getCode()
|
|
|
- }
|
|
|
- })
|
|
|
+ proxy.$refs.loginRef.validateFields(fieldsToValidate).then(() => {
|
|
|
+ loading.value = true
|
|
|
+
|
|
|
+ if (loginType.value === 'account') {
|
|
|
+ // 账号密码登录
|
|
|
+ // 勾选了需要记住密码设置在 cookie 中设置记住用户名和密码
|
|
|
+ if (loginForm.value.rememberMe) {
|
|
|
+ Cookies.set("username", loginForm.value.username, { expires: 30 })
|
|
|
+ Cookies.set("password", encrypt(loginForm.value.password), { expires: 30 })
|
|
|
+ Cookies.set("rememberMe", loginForm.value.rememberMe, { expires: 30 })
|
|
|
} else {
|
|
|
- // 邮箱登录
|
|
|
- userStore.emailLoginAction(loginForm.value).then(() => {
|
|
|
- handleLoginSuccess()
|
|
|
- }).catch(() => {
|
|
|
- loading.value = false
|
|
|
- })
|
|
|
+ // 否则移除
|
|
|
+ Cookies.remove("username")
|
|
|
+ Cookies.remove("password")
|
|
|
+ Cookies.remove("rememberMe")
|
|
|
}
|
|
|
+ // 调用action的登录方法
|
|
|
+ userStore.login(loginForm.value).then(() => {
|
|
|
+ handleLoginSuccess()
|
|
|
+ }).catch(() => {
|
|
|
+ loading.value = false
|
|
|
+ // 重新获取验证码
|
|
|
+ if (captchaEnabled.value) {
|
|
|
+ getCode()
|
|
|
+ }
|
|
|
+ })
|
|
|
+ } else {
|
|
|
+ // 邮箱登录
|
|
|
+ userStore.emailLoginAction(loginForm.value).then(() => {
|
|
|
+ handleLoginSuccess()
|
|
|
+ }).catch(() => {
|
|
|
+ loading.value = false
|
|
|
+ })
|
|
|
}
|
|
|
+ }).catch(() => {
|
|
|
+ // 验证失败,不做任何操作
|
|
|
})
|
|
|
}
|
|
|
|
|
|
@@ -249,28 +247,28 @@ function handleLoginSuccess() {
|
|
|
// 发送邮箱验证码
|
|
|
function handleSendEmailCode() {
|
|
|
// 先验证邮箱格式
|
|
|
- proxy.$refs.loginRef.validateField('email', (valid) => {
|
|
|
- if (valid) {
|
|
|
- emailCodeDisabled.value = true
|
|
|
- sendEmailCode(loginForm.value.email).then(res => {
|
|
|
- ElMessage.success(res.msg || '验证码已发送')
|
|
|
- // 开始倒计时
|
|
|
- let countdown = 60
|
|
|
- emailCodeBtnText.value = `${countdown}s后重新获取`
|
|
|
- emailCodeTimer = setInterval(() => {
|
|
|
- countdown--
|
|
|
- if (countdown <= 0) {
|
|
|
- clearInterval(emailCodeTimer)
|
|
|
- emailCodeDisabled.value = false
|
|
|
- emailCodeBtnText.value = '获取验证码'
|
|
|
- } else {
|
|
|
- emailCodeBtnText.value = `${countdown}s后重新获取`
|
|
|
- }
|
|
|
- }, 1000)
|
|
|
- }).catch(() => {
|
|
|
- emailCodeDisabled.value = false
|
|
|
- })
|
|
|
- }
|
|
|
+ proxy.$refs.loginRef.validateFields(['email']).then(() => {
|
|
|
+ emailCodeDisabled.value = true
|
|
|
+ sendEmailCode(loginForm.value.email).then(res => {
|
|
|
+ message.success(res.msg || '验证码已发送')
|
|
|
+ // 开始倒计时
|
|
|
+ let countdown = 60
|
|
|
+ emailCodeBtnText.value = `${countdown}s后重新获取`
|
|
|
+ emailCodeTimer = setInterval(() => {
|
|
|
+ countdown--
|
|
|
+ if (countdown <= 0) {
|
|
|
+ clearInterval(emailCodeTimer)
|
|
|
+ emailCodeDisabled.value = false
|
|
|
+ emailCodeBtnText.value = '获取验证码'
|
|
|
+ } else {
|
|
|
+ emailCodeBtnText.value = `${countdown}s后重新获取`
|
|
|
+ }
|
|
|
+ }, 1000)
|
|
|
+ }).catch(() => {
|
|
|
+ emailCodeDisabled.value = false
|
|
|
+ })
|
|
|
+ }).catch(() => {
|
|
|
+ // 验证失败,不做任何操作
|
|
|
})
|
|
|
}
|
|
|
|