当前位置:首页 > VUE

vue 实现登录注册

2026-01-19 12:33:08VUE

Vue 实现登录注册功能

项目结构

建议采用以下目录结构组织登录注册模块:

src/
├── components/
│   ├── Login.vue
│   ├── Register.vue
├── router/
│   ├── index.js
├── store/
│   ├── modules/
│   │   ├── auth.js
├── views/
│   ├── AuthLayout.vue

登录组件实现

Login.vue中创建基础表单:

<template>
  <form @submit.prevent="handleLogin">
    <input v-model="form.email" type="email" placeholder="Email" required>
    <input v-model="form.password" type="password" placeholder="Password" required>
    <button type="submit">Login</button>
  </form>
</template>

<script>
export default {
  data() {
    return {
      form: {
        email: '',
        password: ''
      }
    }
  },
  methods: {
    async handleLogin() {
      try {
        await this.$store.dispatch('auth/login', this.form)
        this.$router.push('/dashboard')
      } catch (error) {
        console.error(error)
      }
    }
  }
}
</script>

注册组件实现

Register.vue中添加验证逻辑:

<template>
  <form @submit.prevent="handleRegister">
    <input v-model="form.name" type="text" placeholder="Name" required>
    <input v-model="form.email" type="email" placeholder="Email" required>
    <input v-model="form.password" type="password" placeholder="Password" required>
    <input v-model="form.passwordConfirm" type="password" placeholder="Confirm Password" required>
    <button type="submit">Register</button>
  </form>
</template>

<script>
export default {
  data() {
    return {
      form: {
        name: '',
        email: '',
        password: '',
        passwordConfirm: ''
      }
    }
  },
  methods: {
    validateForm() {
      return this.form.password === this.form.passwordConfirm
    },
    async handleRegister() {
      if (!this.validateForm()) return alert('Passwords do not match')

      try {
        await this.$store.dispatch('auth/register', this.form)
        this.$router.push('/login')
      } catch (error) {
        console.error(error)
      }
    }
  }
}
</script>

Vuex状态管理

创建auth.js模块处理认证逻辑:

const actions = {
  async login({ commit }, credentials) {
    const response = await axios.post('/api/login', credentials)
    commit('SET_USER', response.data.user)
    localStorage.setItem('token', response.data.token)
  },
  async register({ commit }, userData) {
    const response = await axios.post('/api/register', userData)
    commit('SET_USER', response.data.user)
    localStorage.setItem('token', response.data.token)
  },
  logout({ commit }) {
    commit('CLEAR_USER')
    localStorage.removeItem('token')
  }
}

const mutations = {
  SET_USER(state, user) {
    state.user = user
    state.isAuthenticated = true
  },
  CLEAR_USER(state) {
    state.user = null
    state.isAuthenticated = false
  }
}

const state = {
  user: null,
  isAuthenticated: false
}

export default {
  namespaced: true,
  state,
  actions,
  mutations
}

路由配置

router/index.js中配置保护路由:

import store from '@/store'

const routes = [
  {
    path: '/login',
    component: () => import('@/components/Login'),
    meta: { requiresGuest: true }
  },
  {
    path: '/register',
    component: () => import('@/components/Register'),
    meta: { requiresGuest: true }
  },
  {
    path: '/dashboard',
    component: () => import('@/views/Dashboard'),
    meta: { requiresAuth: true }
  }
]

router.beforeEach((to, from, next) => {
  if (to.matched.some(record => record.meta.requiresAuth)) {
    if (!store.getters['auth/isAuthenticated']) {
      next('/login')
    } else {
      next()
    }
  } else if (to.matched.some(record => record.meta.requiresGuest)) {
    if (store.getters['auth/isAuthenticated']) {
      next('/dashboard')
    } else {
      next()
    }
  } else {
    next()
  }
})

表单验证增强

推荐使用VeeValidate进行表单验证:

npm install vee-validate

main.js中配置:

import { ValidationProvider, extend } from 'vee-validate'
import { required, email, min, confirmed } from 'vee-validate/dist/rules'

extend('required', required)
extend('email', email)
extend('min', min)
extend('confirmed', confirmed)

Vue.component('ValidationProvider', ValidationProvider)

样式优化

建议使用Tailwind CSS或Element UI等库快速构建UI:

npm install element-ui

main.js中引入:

import ElementUI from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css'
Vue.use(ElementUI)

接口安全

实现JWT认证时需注意:

  • 前端存储token使用httpOnlySecure标志
  • 每次请求在axios拦截器中添加Authorization头
    axios.interceptors.request.use(config => {
    const token = localStorage.getItem('token')
    if (token) {
      config.headers.Authorization = `Bearer ${token}`
    }
    return config
    })

响应式布局

使用媒体查询适应不同设备:

vue  实现登录注册

@media (max-width: 640px) {
  .auth-form {
    width: 90%;
    margin: 0 auto;
  }
}

标签: vue
分享给朋友:

相关文章

vue实现录播播放

vue实现录播播放

Vue 实现录播播放 使用 video.js 实现 安装 video.js 和相关的 Vue 适配器: npm install video.js @videojs-player/vue 在 Vue…

vue实现alert

vue实现alert

实现自定义 Alert 组件 在 Vue 中可以通过组件化方式实现自定义 Alert 弹窗。以下是基于 Vue 3 的实现示例: 组件代码 (Alert.vue) <template>…

vue实现排序

vue实现排序

Vue 实现排序的方法 在 Vue 中实现排序可以通过多种方式完成,以下是一些常见的方法: 使用计算属性排序数组 计算属性非常适合对数据进行排序,因为它会在依赖的数据变化时自动更新。以下是一个示例:…

vue实现复选

vue实现复选

Vue 实现复选框 在 Vue 中实现复选框可以通过 v-model 指令绑定数据,同时结合 input 元素的 type="checkbox" 属性来实现。以下是几种常见的实现方式: 单个复选框…

vue实现单据

vue实现单据

Vue 实现单据功能的方法 使用 Vue 实现单据功能通常涉及表单设计、数据绑定、验证和提交等环节。以下是具体实现方案: 表单设计与数据绑定 使用 Vue 的 v-model 指令实现表单数据的双向…

vue轮询实现

vue轮询实现

Vue 轮询实现方法 在 Vue 中实现轮询可以通过以下几种方式: 使用 setInterval data() { return { pollInterval: null }…