You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
pyx_gitkeshe/library_system/src/views/Auth/Register.vue

156 lines
3.6 KiB

<template>
<div class="register-container">
<el-card class="register-card">
<h2 class="register-title">用户注册</h2>
<el-form
ref="registerForm"
:model="form"
:rules="rules"
@keyup.enter="register">
<el-form-item prop="username">
<el-input
v-model="form.username"
placeholder="用户名"
prefix-icon="User"
size="large"
/>
</el-form-item>
<el-form-item prop="password">
<el-input
v-model="form.password"
type="password"
placeholder="密码"
prefix-icon="Lock"
size="large"
show-password
/>
</el-form-item>
<el-form-item prop="confirmPassword">
<el-input
v-model="form.confirmPassword"
type="password"
placeholder="确认密码"
prefix-icon="Lock"
size="large"
show-password
/>
</el-form-item>
<el-form-item>
<el-button
type="primary"
size="large"
@click="register"
:loading="loading"
class="register-button">
注册
</el-button>
</el-form-item>
<div class="login-link">
已有账号?<el-link type="primary" @click="goToLogin"></el-link>
</div>
</el-form>
</el-card>
</div>
</template>
<script setup>
import { ref } from 'vue'
import { useRouter } from 'vue-router'
import { useStore } from 'vuex'
import { ElMessage } from 'element-plus'
const router = useRouter()
const store = useStore()
const form = ref({
username: '',
password: '',
confirmPassword: ''
})
const rules = ref({
username: [
{ required: true, message: '请输入用户名', trigger: 'blur' },
{ min: 3, max: 20, message: '用户名长度在 3 到 20 个字符', trigger: 'blur' }
],
password: [
{ required: true, message: '请输入密码', trigger: 'blur' },
{ min: 6, message: '密码长度不能少于 6 个字符', trigger: 'blur' }
],
confirmPassword: [
{ required: true, message: '请确认密码', trigger: 'blur' },
{
validator: (rule, value, callback) => {
if (value !== form.value.password) {
callback(new Error('两次输入的密码不一致'))
} else {
callback()
}
},
trigger: 'blur'
}
]
})
const registerForm = ref(null)
const loading = ref(false)
const register = async () => {
try {
await registerForm.value.validate()
loading.value = true
await store.dispatch('register', {
username: form.value.username,
password: form.value.password
})
ElMessage.success('注册成功,请登录')
router.push('/login')
} catch (error) {
console.error('注册失败:', error)
ElMessage.error(error.message || '注册失败')
} finally {
loading.value = false
}
}
const goToLogin = () => {
router.push('/login')
}
</script>
<style scoped>
.register-container {
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
background: linear-gradient(135deg, #4facfe 0%, #00f2fe 100%);
}
.register-card {
width: 400px;
padding: 30px;
border-radius: 10px;
box-shadow: 0 10px 25px rgba(0, 0, 0, 0.2);
}
.register-title {
text-align: center;
margin-bottom: 30px;
color: #303133;
}
.register-button {
width: 100%;
margin-top: 10px;
}
.login-link {
text-align: center;
margin-top: 15px;
font-size: 14px;
color: #606266;
}
</style>