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/Login.vue

131 lines
2.7 KiB

<template>
<div class="login-container">
<el-card class="login-card">
<h2 class="login-title">图书管理系统登录</h2>
<el-form
ref="loginForm"
:model="form"
:rules="rules"
@keyup.enter="login">
<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>
<el-button
type="primary"
size="large"
@click="login"
:loading="loading"
class="login-button">
登录
</el-button>
</el-form-item>
<div class="register-link">
没有账号?<el-link type="primary" @click="goToRegister"></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: ''
})
const rules = ref({
username: [
{ required: true, message: '请输入用户名', trigger: 'blur' }
],
password: [
{ required: true, message: '请输入密码', trigger: 'blur' }
]
})
const loginForm = ref(null)
const loading = ref(false)
const login = async () => {
try {
await loginForm.value.validate()
loading.value = true
await store.dispatch('login', form.value)
ElMessage.success('登录成功')
// 获取用户信息
await store.dispatch('fetchUser')
// 跳转到首页
router.push('/')
} catch (error) {
console.error('登录失败:', error)
ElMessage.error(error.message || '登录失败')
} finally {
loading.value = false
}
}
const goToRegister = () => {
router.push('/register')
}
</script>
<style scoped>
.login-container {
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
background: linear-gradient(135deg, #4facfe 0%, #00f2fe 100%);
}
.login-card {
width: 400px;
padding: 30px;
border-radius: 10px;
box-shadow: 0 10px 25px rgba(0, 0, 0, 0.2);
}
.login-title {
text-align: center;
margin-bottom: 30px;
color: #303133;
}
.login-button {
width: 100%;
margin-top: 10px;
}
.register-link {
text-align: center;
margin-top: 15px;
font-size: 14px;
color: #606266;
}
</style>