基于vue实现登录页面
创建Vue项目
使用Vue CLI快速初始化项目:
vue create vue-login-demo
cd vue-login-demo
安装必要依赖
添加路由和状态管理库:
npm install vue-router vuex axios
构建登录组件
在src/components下创建Login.vue:

<template>
<div class="login-container">
<h3>用户登录</h3>
<form @submit.prevent="handleSubmit">
<div class="form-group">
<label>用户名</label>
<input v-model="username" type="text" required>
</div>
<div class="form-group">
<label>密码</label>
<input v-model="password" type="password" required>
</div>
<button type="submit">登录</button>
</form>
</div>
</template>
<script>
export default {
data() {
return {
username: '',
password: ''
}
},
methods: {
async handleSubmit() {
try {
const response = await this.$store.dispatch('login', {
username: this.username,
password: this.password
})
this.$router.push('/dashboard')
} catch (error) {
alert('登录失败: ' + error.message)
}
}
}
}
</script>
<style scoped>
.login-container {
max-width: 400px;
margin: 0 auto;
padding: 20px;
}
.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;
cursor: pointer;
}
</style>
配置Vuex存储
在src/store/index.js中设置认证状态:
import Vue from 'vue'
import Vuex from 'vuex'
import axios from 'axios'
Vue.use(Vuex)
export default new Vuex.Store({
state: {
isAuthenticated: false,
user: null
},
mutations: {
SET_AUTH(state, payload) {
state.isAuthenticated = true
state.user = payload.user
}
},
actions: {
async login({ commit }, credentials) {
const response = await axios.post('/api/auth/login', credentials)
commit('SET_AUTH', { user: response.data.user })
return response.data
}
}
})
设置路由配置
在src/router/index.js中配置路由保护:

import Vue from 'vue'
import VueRouter from 'vue-router'
import Login from '../components/Login.vue'
import Dashboard from '../components/Dashboard.vue'
Vue.use(VueRouter)
const routes = [
{
path: '/login',
name: 'Login',
component: Login
},
{
path: '/dashboard',
name: 'Dashboard',
component: Dashboard,
meta: { requiresAuth: true }
}
]
const router = new VueRouter({
mode: 'history',
routes
})
router.beforeEach((to, from, next) => {
if (to.matched.some(record => record.meta.requiresAuth)) {
if (!store.state.isAuthenticated) {
next('/login')
} else {
next()
}
} else {
next()
}
})
export default router
实现API拦截器
在src/main.js中设置全局axios配置:
import axios from 'axios'
axios.defaults.baseURL = 'http://your-api-domain.com'
axios.interceptors.request.use(config => {
const token = localStorage.getItem('token')
if (token) {
config.headers.Authorization = `Bearer ${token}`
}
return config
})
添加表单验证
扩展登录组件增加验证逻辑:
data() {
return {
username: '',
password: '',
errors: {}
}
},
methods: {
validateForm() {
this.errors = {}
if (!this.username) this.errors.username = '请输入用户名'
if (!this.password) this.errors.password = '请输入密码'
return Object.keys(this.errors).length === 0
},
async handleSubmit() {
if (!this.validateForm()) return
// ...原有登录逻辑
}
}
响应式布局优化
更新样式增强移动端适配:
@media (max-width: 768px) {
.login-container {
padding: 10px;
width: 90%;
}
h3 {
font-size: 1.2rem;
}
}






