vue 实现登陆注册
Vue 登录注册功能实现
技术栈
- Vue 3(Composition API)
- Vue Router
- Axios(HTTP请求)
- Pinia/Vuex(状态管理,可选)
- Element Plus/Ant Design Vue(UI组件库,可选)
项目结构
src/
├── api/ # API接口封装
│ └── auth.js
├── components/ # 公共组件
├── router/ # 路由配置
│ └── index.js
├── stores/ # 状态管理
│ └── auth.js
├── views/ # 页面组件
│ ├── Login.vue
│ └── Register.vue
└── App.vue
路由配置
在router/index.js中配置登录注册路由:
import { createRouter, createWebHistory } from 'vue-router'
import Login from '../views/Login.vue'
import Register from '../views/Register.vue'
const routes = [
{
path: '/login',
name: 'Login',
component: Login
},
{
path: '/register',
name: 'Register',
component: Register
}
]
const router = createRouter({
history: createWebHistory(),
routes
})
export default router
登录组件实现
Login.vue示例代码:
<template>
<div class="login-container">
<h2>用户登录</h2>
<form @submit.prevent="handleLogin">
<div class="form-group">
<label>用户名</label>
<input v-model="form.username" type="text" required>
</div>
<div class="form-group">
<label>密码</label>
<input v-model="form.password" type="password" required>
</div>
<button type="submit">登录</button>
</form>
</div>
</template>
<script setup>
import { ref } from 'vue'
import { useRouter } from 'vue-router'
import { login } from '@/api/auth'
const router = useRouter()
const form = ref({
username: '',
password: ''
})
const handleLogin = async () => {
try {
const res = await login(form.value)
localStorage.setItem('token', res.data.token)
router.push('/dashboard')
} catch (error) {
alert(error.message)
}
}
</script>
注册组件实现
Register.vue示例代码:
<template>
<div class="register-container">
<h2>用户注册</h2>
<form @submit.prevent="handleRegister">
<div class="form-group">
<label>用户名</label>
<input v-model="form.username" type="text" required>
</div>
<div class="form-group">
<label>密码</label>
<input v-model="form.password" type="password" required>
</div>
<div class="form-group">
<label>确认密码</label>
<input v-model="form.confirmPassword" type="password" required>
</div>
<button type="submit">注册</button>
</form>
</div>
</template>
<script setup>
import { ref } from 'vue'
import { useRouter } from 'vue-router'
import { register } from '@/api/auth'
const router = useRouter()
const form = ref({
username: '',
password: '',
confirmPassword: ''
})
const handleRegister = async () => {
if (form.value.password !== form.value.confirmPassword) {
alert('两次密码输入不一致')
return
}
try {
await register(form.value)
alert('注册成功')
router.push('/login')
} catch (error) {
alert(error.message)
}
}
</script>
API接口封装
api/auth.js示例:
import axios from 'axios'
const API_URL = 'http://your-api-url.com/auth'
export const login = async (credentials) => {
return await axios.post(`${API_URL}/login`, credentials)
}
export const register = async (userData) => {
return await axios.post(`${API_URL}/register`, userData)
}
状态管理(可选)
使用Pinia管理用户状态:
// stores/auth.js
import { defineStore } from 'pinia'
export const useAuthStore = defineStore('auth', {
state: () => ({
user: null,
isAuthenticated: false
}),
actions: {
setUser(user) {
this.user = user
this.isAuthenticated = true
},
logout() {
this.user = null
this.isAuthenticated = false
localStorage.removeItem('token')
}
}
})
路由守卫
添加路由守卫保护需要认证的页面:
// router/index.js
router.beforeEach((to, from, next) => {
const isAuthenticated = localStorage.getItem('token')
if (to.name !== 'Login' && to.name !== 'Register' && !isAuthenticated) {
next({ name: 'Login' })
} else {
next()
}
})
表单验证增强
可以使用VeeValidate或Element Plus的表单验证:
<template>
<el-form :model="form" :rules="rules" ref="formRef">
<el-form-item label="用户名" prop="username">
<el-input v-model="form.username"></el-input>
</el-form-item>
<!-- 其他表单项 -->
</el-form>
</template>
<script setup>
const rules = {
username: [
{ required: true, message: '请输入用户名', trigger: 'blur' },
{ min: 3, max: 10, message: '长度在3到10个字符', trigger: 'blur' }
],
password: [
{ required: true, message: '请输入密码', trigger: 'blur' },
{ min: 6, max: 16, message: '长度在6到16个字符', trigger: 'blur' }
]
}
</script>
安全注意事项
- 始终使用HTTPS传输敏感数据
- 后端应实现密码加密存储(如bcrypt)
- 添加CSRF防护措施
- 实现合理的密码强度策略
- 考虑添加验证码防止暴力破解
以上实现可以根据实际项目需求进行调整和扩展,如添加第三方登录、忘记密码等功能。







