vue项目登录页面实现
实现登录页面的基本结构
使用Vue单文件组件(SFC)构建登录页面的基础模板,包含表单元素(用户名、密码输入框和提交按钮)。
<template>
<div class="login-container">
<h2>用户登录</h2>
<form @submit.prevent="handleSubmit">
<div class="form-group">
<label>用户名</label>
<input v-model="username" type="text" placeholder="请输入用户名" required />
</div>
<div class="form-group">
<label>密码</label>
<input v-model="password" type="password" placeholder="请输入密码" required />
</div>
<button type="submit">登录</button>
</form>
</div>
</template>
数据绑定与事件处理
通过Vue的响应式数据绑定和事件处理实现表单逻辑。
<script>
export default {
data() {
return {
username: '',
password: ''
}
},
methods: {
handleSubmit() {
// 调用登录API或验证逻辑
console.log('提交数据:', this.username, this.password);
}
}
}
</script>
样式设计
使用CSS或SCSS美化登录页面,确保布局整洁。
<style scoped>
.login-container {
max-width: 400px;
margin: 0 auto;
padding: 20px;
border: 1px solid #ddd;
border-radius: 5px;
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
}
.form-group {
margin-bottom: 15px;
}
input {
width: 100%;
padding: 8px;
box-sizing: border-box;
}
button {
width: 100%;
padding: 10px;
background-color: #42b983;
color: white;
border: none;
border-radius: 4px;
}
</style>
表单验证
添加前端验证逻辑,确保输入符合要求(如非空、长度限制等)。
methods: {
handleSubmit() {
if (!this.username || !this.password) {
alert('用户名和密码不能为空');
return;
}
// 进一步提交逻辑
}
}
集成API请求
通过Axios或Fetch发送登录请求,处理响应结果(如跳转或错误提示)。
import axios from 'axios';
methods: {
async handleSubmit() {
try {
const response = await axios.post('/api/login', {
username: this.username,
password: this.password
});
if (response.data.success) {
this.$router.push('/dashboard'); // 跳转到主页
}
} catch (error) {
alert('登录失败: ' + error.message);
}
}
}
路由配置
在Vue Router中配置登录页路由,确保未登录时重定向到登录页。
const routes = [
{ path: '/login', component: Login },
{ path: '/dashboard', component: Dashboard, meta: { requiresAuth: true } }
];
状态管理(可选)
使用Vuex或Pinia管理登录状态,如存储用户Token或信息。
// 示例:Vuex Action
actions: {
login({ commit }, { username, password }) {
return axios.post('/api/login', { username, password })
.then(response => {
commit('SET_USER', response.data.user);
return response;
});
}
}






