03. 开发前端登录页面
element-plus 默认的主题色
https://element-plus.org/zh-CN/guide/theming
登录页面 Login.vue
<template>
<div class="login-container">
<div class="login-box">
<h1 style="font-size: 28px">实验室预约系统</h1>
<div style="margin-top: 5px; margin-bottom: 30px">基于Agent智能预约系统</div>
<el-form :model="form" label-width="auto" style="max-width: 600px">
<el-form-item>
<el-input
size="large"
v-model="form.username"
placeholder="请输入账号"
:prefix-icon="User"
/>
</el-form-item>
<el-form-item>
<el-input
type="password"
size="large"
v-model="form.password"
placeholder="请输入密码"
:prefix-icon="Lock"
show-password
/>
</el-form-item>
<div>
<el-button
size="large"
type="primary"
style="width: 100%"
@click="login"
:loading="loadingValue"
>登 录</el-button
>
<div style="text-align: right; margin-top: 20px">
还没有账号?请 <a style="color: var(--el-color-primary)" href="/register">注册</a>
</div>
</div>
</el-form>
</div>
</div>
</template>
<script setup>
import { reactive, ref } from 'vue'
import { User, Lock } from '@element-plus/icons-vue'
import { ElMessage } from 'element-plus'
import router from '@/router'
const form = reactive({
username: '',
password: ''
})
const loadingValue = ref(false)
const login = () => {
loadingValue.value = true
setTimeout(() => {
loadingValue.value = false
ElMessage.success('登录成功')
router.push('/manager/home')
}, 2000)
}
</script>
<style scoped>
.login-container {
height: 100vh;
display: flex;
justify-content: center;
align-items: center;
}
.login-box {
width: 380px;
border-radius: 8px;
box-shadow: 0 8px 12px rgba(0, 0, 0, 0.1);
padding: 30px;
text-align: center;
background-color: white;
}
</style>
注册页面 Register.vue
<template>
<div class="register-container">
<div class="register-box">
<h1 style="font-size: 24px; margin-bottom: 30px">欢迎注册实验室预约系统</h1>
<el-form :model="form" label-width="auto" style="max-width: 600px">
<el-form-item>
<el-input
size="large"
v-model="form.username"
placeholder="请输入账号"
:prefix-icon="User"
/>
</el-form-item>
<el-form-item>
<el-input
type="password"
size="large"
v-model="form.password"
placeholder="请输入密码"
:prefix-icon="Lock"
show-password
/>
</el-form-item>
<el-form-item>
<el-input
type="password"
size="large"
v-model="form.confirmPassword"
placeholder="请确认密码"
:prefix-icon="Lock"
show-password
/>
</el-form-item>
<div>
<el-button size="large" type="primary" style="width: 100%">注 册</el-button>
<div style="text-align: right; margin-top: 20px">
已有账号?请 <a style="color: var(--el-color-primary)" href="/login">登录</a>
</div>
</div>
</el-form>
</div>
</div>
</template>
<script setup>
import { reactive } from 'vue'
import { User, Lock } from '@element-plus/icons-vue'
import { ElMessage } from 'element-plus'
const form = reactive({
username: '',
password: '',
confirmPassword: ''
})
</script>
<style scoped>
.register-container {
height: 100vh;
display: flex;
justify-content: center;
align-items: center;
}
.register-box {
width: 380px;
border-radius: 8px;
box-shadow: 0 8px 12px rgba(0, 0, 0, 0.1);
padding: 30px;
text-align: center;
background-color: white;
}
</style>
路由配置
import { createRouter, createWebHistory } from 'vue-router'
const router = createRouter({
history: createWebHistory(import.meta.env.BASE_URL),
routes: [
{ path: '/', redirect: '/manager/home' },
{
path: '/manager',
name: 'Layout',
component: () => import('@/layouts/Layout.vue'),
children: [
{ path: 'home', name: 'Home', component: () => import('@/views/Home.vue') },
{ path: 'lab', name: 'Lab', component: () => import('@/views/Lab.vue') }
]
},
{ path: '/login', name: 'Login', component: () => import('@/views/Login.vue') },
{ path: '/register', name: 'Register', component: () => import('@/views/Register.vue') }
]
})
export default router