UnisKB/ui/src/views/login/register/index.vue

217 lines
5.5 KiB
Vue
Raw Normal View History

2023-10-12 08:36:16 +00:00
<template>
<login-layout>
2023-12-14 08:24:10 +00:00
<LoginContainer subTitle="欢迎使用 MaxKB 智能知识库">
2024-02-23 03:37:37 +00:00
<h2 class="mb-24">用户注册</h2>
2023-10-12 08:36:16 +00:00
<el-form class="register-form" :model="registerForm" :rules="rules" ref="registerFormRef">
2024-02-23 03:37:37 +00:00
<div class="mb-24">
<el-form-item prop="username">
2023-10-12 08:36:16 +00:00
<el-input
size="large"
2024-02-23 03:37:37 +00:00
class="input-item"
v-model="registerForm.username"
placeholder="请输入用户名"
2023-10-12 08:36:16 +00:00
>
</el-input>
2024-02-23 03:37:37 +00:00
</el-form-item>
</div>
<div class="mb-24">
<el-form-item prop="password">
<el-input
type="password"
size="large"
class="input-item"
v-model="registerForm.password"
placeholder="请输入密码"
show-password
>
</el-input>
</el-form-item>
</div>
<div class="mb-24">
<el-form-item prop="re_password">
<el-input
type="password"
2023-10-12 08:36:16 +00:00
size="large"
2024-02-23 03:37:37 +00:00
class="input-item"
v-model="registerForm.re_password"
placeholder="请输入确认密码"
show-password
2023-10-12 08:36:16 +00:00
>
2024-02-23 03:37:37 +00:00
</el-input>
</el-form-item>
</div>
<div class="mb-24">
<el-form-item prop="email">
<el-input
size="large"
class="input-item"
v-model="registerForm.email"
placeholder="请输入邮箱"
>
</el-input>
</el-form-item>
</div>
<div class="mb-24">
<el-form-item prop="code">
<div class="flex-between w-full">
<el-input
size="large"
class="code-input"
v-model="registerForm.code"
placeholder="请输入验证码"
>
</el-input>
<el-button
2024-02-28 07:42:17 +00:00
:disabled="isDisabled"
2024-02-23 03:37:37 +00:00
size="large"
class="send-email-button ml-12"
@click="sendEmail"
:loading="sendEmailLoading"
2024-02-28 07:42:17 +00:00
>
{{ isDisabled ? `重新发送(${time}s` : '获取验证码' }}</el-button
2024-02-23 03:37:37 +00:00
>
</div>
</el-form-item>
</div>
2023-10-12 08:36:16 +00:00
</el-form>
2024-02-23 03:37:37 +00:00
<el-button size="large" type="primary" class="w-full" @click="register"></el-button>
2023-12-12 03:32:45 +00:00
<div class="operate-container mt-12">
2023-10-12 08:36:16 +00:00
<el-button
class="register"
@click="router.push('/login')"
link
type="primary"
2023-12-12 03:32:45 +00:00
icon="ArrowLeft"
2023-10-12 08:36:16 +00:00
>
返回登录
</el-button>
</div>
</LoginContainer>
</login-layout>
</template>
<script setup lang="ts">
import { ref } from 'vue'
2023-10-20 03:26:14 +00:00
import type { RegisterRequest } from '@/api/type/user'
2023-10-12 08:36:16 +00:00
import { useRouter } from 'vue-router'
2023-10-20 03:26:14 +00:00
import UserApi from '@/api/user'
2023-10-13 08:11:54 +00:00
import { MsgSuccess } from '@/utils/message'
2023-10-12 08:36:16 +00:00
import type { FormInstance, FormRules } from 'element-plus'
const router = useRouter()
const registerForm = ref<RegisterRequest>({
username: '',
password: '',
re_password: '',
email: '',
code: ''
})
const rules = ref<FormRules<RegisterRequest>>({
username: [
{
required: true,
message: '请输入用户名',
trigger: 'blur'
2024-02-28 07:05:18 +00:00
},
{
min: 6,
max: 20,
message: '长度在 6 到 20 个字符',
trigger: 'blur'
2023-10-12 08:36:16 +00:00
}
],
password: [
{
required: true,
message: '请输入密码',
trigger: 'blur'
},
{
min: 6,
2023-12-12 03:32:45 +00:00
max: 20,
message: '长度在 6 到 20 个字符',
2023-10-12 08:36:16 +00:00
trigger: 'blur'
}
],
re_password: [
{
required: true,
message: '请输入确认密码',
trigger: 'blur'
},
{
min: 6,
2023-12-12 03:32:45 +00:00
max: 20,
message: '长度在 6 到 20 个字符',
2023-10-12 08:36:16 +00:00
trigger: 'blur'
},
{
validator: (rule, value, callback) => {
if (registerForm.value.password != registerForm.value.re_password) {
callback(new Error('密码不一致'))
} else {
callback()
}
},
trigger: 'blur'
}
],
email: [
{ required: true, message: '请输入邮箱', trigger: 'blur' },
{
validator: (rule, value, callback) => {
const emailRegExp = /^[a-zA-Z0-9_.-]+@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*\.[a-zA-Z0-9]{2,6}$/
if (!emailRegExp.test(value) && value != '') {
callback(new Error('请输入有效邮箱格式!'))
} else {
callback()
}
},
trigger: 'blur'
}
],
code: [{ required: true, message: '请输入验证码' }]
})
const registerFormRef = ref<FormInstance>()
const register = () => {
registerFormRef.value
?.validate()
.then(() => {
return UserApi.register(registerForm.value)
})
.then(() => {
router.push('login')
})
}
const sendEmailLoading = ref<boolean>(false)
2024-02-28 07:42:17 +00:00
const isDisabled = ref<boolean>(false)
const time = ref<number>(60)
2023-10-12 08:36:16 +00:00
/**
* 发送验证码
*/
const sendEmail = () => {
registerFormRef.value?.validateField('email', (v: boolean) => {
if (v) {
UserApi.sendEmit(registerForm.value.email, 'register', sendEmailLoading).then(() => {
2023-10-13 08:11:54 +00:00
MsgSuccess('发送验证码成功')
2024-02-28 07:42:17 +00:00
isDisabled.value = true
handleTimeChange()
2023-10-12 08:36:16 +00:00
})
}
})
}
2024-02-28 07:42:17 +00:00
const handleTimeChange = () => {
if (time.value <= 0) {
isDisabled.value = false
time.value = 60
} else {
setTimeout(() => {
time.value--
handleTimeChange()
}, 1000)
}
}
2023-10-12 08:36:16 +00:00
</script>
2024-02-23 03:37:37 +00:00
<style lang="scss" scope></style>