当前位置:首页 > VUE

vue 实现登陆注册

2026-01-22 05:18:38VUE

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的表单验证:

vue 实现登陆注册

<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>

安全注意事项

  1. 始终使用HTTPS传输敏感数据
  2. 后端应实现密码加密存储(如bcrypt)
  3. 添加CSRF防护措施
  4. 实现合理的密码强度策略
  5. 考虑添加验证码防止暴力破解

以上实现可以根据实际项目需求进行调整和扩展,如添加第三方登录、忘记密码等功能。

标签: vue
分享给朋友:

相关文章

vue实现批量

vue实现批量

Vue 实现批量操作的方法 在 Vue 中实现批量操作通常涉及选择多个项目并执行统一处理,例如批量删除、批量更新等。以下是几种常见实现方式: 表格多选批量操作 使用 el-table 配合复选框实现…

vue 实现关闭

vue 实现关闭

Vue 实现关闭功能的方法 在Vue中实现关闭功能通常涉及组件销毁、模态框隐藏或路由跳转等场景。以下是几种常见实现方式: 销毁当前组件 使用v-if或v-show控制组件显示/隐藏,适用于局部组件:…

vue实现机制

vue实现机制

Vue 实现机制的核心原理 Vue.js 的核心实现机制主要基于响应式系统、虚拟 DOM 和组件化设计。以下是关键实现细节: 响应式系统 Vue 通过 Object.defineProperty(V…

vue实现选择

vue实现选择

Vue 实现选择功能的方法 在 Vue 中实现选择功能可以通过多种方式完成,以下介绍几种常见的实现方法。 使用 v-model 绑定单选 通过 v-model 可以轻松实现单选功能。以下是一个简单的…

vue 实现后退

vue 实现后退

实现后退功能的方法 在Vue中实现后退功能通常需要结合浏览器历史记录API或Vue Router的导航方法。以下是几种常见的实现方式: 使用Vue Router的go方法 this.$router…

vue实现拖拉

vue实现拖拉

实现拖拽功能的基本步骤 在Vue中实现拖拽功能可以通过原生HTML5的拖放API或第三方库如vuedraggable完成。以下是两种方法的详细说明。 使用HTML5原生拖放API HTML5提供了原…