当前位置:首页 > 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中配置保护路由:

vue  实现登录注册

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:

vue  实现登录注册

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

响应式布局

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

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

标签: vue
分享给朋友:

相关文章

vue怎么实现动画

vue怎么实现动画

Vue 动画实现方法 Vue 提供了多种方式实现动画效果,包括内置过渡系统、第三方库集成以及 CSS 动画。以下是常见实现方法: 使用 Vue 过渡系统 通过 <transition>…

js实现vue

js实现vue

Vue.js 的基本实现方法 在 JavaScript 中实现 Vue.js 的功能,可以通过直接引入 Vue 库或使用现代构建工具(如 Vite 或 Webpack)。以下是几种常见的实现方式:…

vue datepicker 实现

vue datepicker 实现

实现 Vue Datepicker 的基本方法 在 Vue 项目中实现日期选择功能,可以使用第三方库如 vue-datepicker 或 v-calendar。以下是两种常见实现方式: 安装 vue…

vue实现公告

vue实现公告

Vue 实现公告功能的方法 公告功能通常需要实现滚动展示、自动切换或固定显示的效果。以下是几种常见的实现方式: 使用 marquee 标签实现滚动公告 <template> <…

vue实现全屏

vue实现全屏

Vue 实现全屏功能的方法 在 Vue 中实现全屏功能可以通过浏览器提供的 Fullscreen API 来实现。以下是几种常见的实现方式: 使用原生 Fullscreen API 通过调用 doc…

vue 实现全屏

vue 实现全屏

Vue 实现全屏功能 在 Vue 中实现全屏功能可以通过浏览器提供的 Fullscreen API 完成。以下是一个完整的实现方案: 安装依赖(可选) 如果需要跨浏览器兼容性更好,可以安装 scre…