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.
5.3 KiB
5.3 KiB
03-登录页面(原型)
目标
实现 Web 端登录页面原型,使用模拟数据验证登录。
UI 设计参考
参考设计稿:
files/ui/登录页.png
前置要求
- 路由配置完成
- 模拟数据服务已创建
实施步骤
创建登录页面
创建 src/views/auth/LoginView.vue:
<template>
<div class="login-page">
<div class="login-header">
<div class="logo">
<el-icon size="48" color="#fff"><FirstAidKit /></el-icon>
</div>
<h1>欢迎来到AI健康助手</h1>
</div>
<el-card class="login-card">
<el-form
ref="formRef"
:model="form"
:rules="rules"
label-position="top"
size="large"
>
<el-form-item label="手机号" prop="phone">
<el-input
v-model="form.phone"
placeholder="请输入手机号或邮箱"
:prefix-icon="User"
maxlength="11"
/>
</el-form-item>
<el-form-item label="验证码" prop="code">
<div class="code-row">
<el-input
v-model="form.code"
placeholder="请输入验证码"
:prefix-icon="Lock"
maxlength="6"
/>
<el-button
:disabled="countdown > 0"
@click="sendCode"
>
{{ countdown > 0 ? `${countdown}s` : '获取验证码' }}
</el-button>
</div>
</el-form-item>
<el-form-item>
<el-button
type="primary"
:loading="loading"
class="login-btn"
@click="handleLogin"
>
登录
</el-button>
</el-form-item>
</el-form>
<div class="login-hint">
测试账号:13800138000,验证码:123456
</div>
<div class="login-footer">
<span>还没有账号?</span>
<el-link type="primary">立即注册</el-link>
</div>
<div class="agreement">
<el-link type="primary">《用户协议》</el-link>
<el-link type="primary">《隐私政策》</el-link>
<span>登录即表示您同意我们的</span>
</div>
</el-card>
</div>
</template>
<script setup lang="ts">
import { ref, reactive } from 'vue'
import { useRouter } from 'vue-router'
import { User, Lock } from '@element-plus/icons-vue'
import { ElMessage } from 'element-plus'
import { useAuthStore } from '@/stores/auth'
import { mockLogin } from '@/mock/user'
const router = useRouter()
const authStore = useAuthStore()
const formRef = ref()
const loading = ref(false)
const countdown = ref(0)
const form = reactive({
phone: '13800138000',
code: ''
})
const rules = {
phone: [
{ required: true, message: '请输入手机号', trigger: 'blur' },
{ pattern: /^1\d{10}$/, message: '手机号格式不正确', trigger: 'blur' }
],
code: [
{ required: true, message: '请输入验证码', trigger: 'blur' },
{ len: 6, message: '验证码为6位数字', trigger: 'blur' }
]
}
const sendCode = () => {
if (!form.phone || !/^1\d{10}$/.test(form.phone)) {
ElMessage.warning('请输入正确的手机号')
return
}
countdown.value = 60
const timer = setInterval(() => {
countdown.value--
if (countdown.value <= 0) {
clearInterval(timer)
}
}, 1000)
ElMessage.success('验证码已发送,测试验证码为:123456')
}
const handleLogin = async () => {
await formRef.value?.validate()
loading.value = true
try {
const user = await mockLogin(form.phone, form.code)
if (user) {
authStore.login(user)
ElMessage.success('登录成功')
router.push('/')
} else {
ElMessage.error('验证码错误,请输入:123456')
}
} finally {
loading.value = false
}
}
</script>
<style scoped lang="scss">
.login-page {
min-height: 100vh;
background: linear-gradient(135deg, #10B981 0%, #2EC4B6 100%);
display: flex;
flex-direction: column;
align-items: center;
padding: 60px 20px;
}
.login-header {
text-align: center;
margin-bottom: 40px;
.logo {
width: 80px;
height: 80px;
background: rgba(255, 255, 255, 0.2);
border-radius: 20px;
display: flex;
align-items: center;
justify-content: center;
margin: 0 auto 16px;
}
h1 {
color: #fff;
font-size: 28px;
font-weight: 600;
}
}
.login-card {
width: 100%;
max-width: 400px;
border-radius: 16px;
.code-row {
display: flex;
gap: 12px;
.el-input {
flex: 1;
}
}
.login-btn {
width: 100%;
height: 48px;
border-radius: 24px;
font-size: 16px;
}
.login-hint {
text-align: center;
font-size: 12px;
color: #9CA3AF;
margin-bottom: 16px;
}
.login-footer {
text-align: center;
color: #6B7280;
.el-link {
margin-left: 4px;
}
}
.agreement {
margin-top: 24px;
text-align: center;
font-size: 12px;
color: #9CA3AF;
.el-link {
font-size: 12px;
}
}
}
</style>
验收标准
- 登录页面 UI 正常显示
- 验证码倒计时正常
- 表单验证正常
- 正确验证码可登录成功
- 登录成功后跳转到首页
预计耗时
20-25 分钟
下一步
完成后进入 03-Web原型开发/04-首页.md