当前位置:首页 > VUE

Vue 实现登录注册

2026-02-20 11:16:12VUE

Vue 实现登录注册功能

项目初始化

使用 Vue CLI 创建项目:

vue create auth-demo
cd auth-demo
npm install axios vue-router vuex

路由配置

src/router/index.js 中配置路由:

import Vue from 'vue'
import Router from 'vue-router'
import Login from '../views/Login.vue'
import Register from '../views/Register.vue'
import Dashboard from '../views/Dashboard.vue'

Vue.use(Router)

const router = new Router({
  routes: [
    { path: '/login', component: Login },
    { path: '/register', component: Register },
    { path: '/dashboard', component: Dashboard, meta: { requiresAuth: true } },
    { path: '*', redirect: '/login' }
  ]
})

// 路由守卫
router.beforeEach((to, from, next) => {
  const isAuthenticated = localStorage.getItem('token')
  if (to.matched.some(record => record.meta.requiresAuth) && !isAuthenticated) {
    next('/login')
  } else {
    next()
  }
})

export default router

状态管理

src/store/index.js 中设置 Vuex 存储:

import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

export default new Vuex.Store({
  state: {
    user: null,
    token: localStorage.getItem('token') || null
  },
  mutations: {
    setUser(state, user) {
      state.user = user
    },
    setToken(state, token) {
      state.token = token
      localStorage.setItem('token', token)
    },
    clearAuthData(state) {
      state.user = null
      state.token = null
      localStorage.removeItem('token')
    }
  },
  actions: {
    login({ commit }, authData) {
      return new Promise((resolve, reject) => {
        // 这里替换为实际API调用
        setTimeout(() => {
          commit('setUser', { email: authData.email })
          commit('setToken', 'demo-token')
          resolve()
        }, 500)
      })
    },
    register({ commit }, authData) {
      // 类似登录处理
    },
    logout({ commit }) {
      commit('clearAuthData')
    }
  },
  getters: {
    isAuthenticated: state => !!state.token
  }
})

登录组件

src/views/Login.vue 示例:

<template>
  <div class="login">
    <h2>Login</h2>
    <form @submit.prevent="login">
      <input v-model="email" type="email" placeholder="Email" required>
      <input v-model="password" type="password" placeholder="Password" required>
      <button type="submit">Login</button>
    </form>
    <p>Don't have an account? <router-link to="/register">Register</router-link></p>
  </div>
</template>

<script>
export default {
  data() {
    return {
      email: '',
      password: ''
    }
  },
  methods: {
    login() {
      this.$store.dispatch('login', {
        email: this.email,
        password: this.password
      }).then(() => {
        this.$router.push('/dashboard')
      }).catch(err => {
        console.error(err)
      })
    }
  }
}
</script>

注册组件

src/views/Register.vue 类似结构:

<template>
  <div class="register">
    <h2>Register</h2>
    <form @submit.prevent="register">
      <input v-model="email" type="email" placeholder="Email" required>
      <input v-model="password" type="password" placeholder="Password" required>
      <input v-model="confirmPassword" type="password" placeholder="Confirm Password" required>
      <button type="submit">Register</button>
    </form>
    <p>Already have an account? <router-link to="/login">Login</router-link></p>
  </div>
</template>

<script>
export default {
  data() {
    return {
      email: '',
      password: '',
      confirmPassword: ''
    }
  },
  methods: {
    register() {
      if (this.password !== this.confirmPassword) {
        alert("Passwords don't match!")
        return
      }
      this.$store.dispatch('register', {
        email: this.email,
        password: this.password
      }).then(() => {
        this.$router.push('/dashboard')
      }).catch(err => {
        console.error(err)
      })
    }
  }
}
</script>

实际API集成

替换模拟登录代码为真实API调用:

// 在store actions中
login({ commit }, authData) {
  return axios.post('/api/auth/login', {
    email: authData.email,
    password: authData.password
  }).then(res => {
    commit('setUser', res.data.user)
    commit('setToken', res.data.token)
  })
}

安全增强

  1. 使用 HTTPS 传输
  2. 密码加密处理(如 bcrypt)
  3. 添加表单验证
  4. 实现 CSRF 防护
  5. 设置 token 过期时间

样式优化

添加基础样式增强用户体验:

Vue 实现登录注册

.login, .register {
  max-width: 400px;
  margin: 0 auto;
  padding: 20px;
}

input {
  display: block;
  width: 100%;
  margin: 10px 0;
  padding: 8px;
}

button {
  background: #42b983;
  color: white;
  border: none;
  padding: 10px 15px;
  cursor: pointer;
}

标签: Vue
分享给朋友:

相关文章

Vue实现数据检验

Vue实现数据检验

Vue 数据校验的实现方法 在Vue中实现数据校验可以通过多种方式,以下是几种常见的方法: 使用内置指令 Vue提供了一些内置指令用于简单的数据校验,例如v-model结合v-bind可以实现基本的…

Vue语法实现

Vue语法实现

Vue 语法实现 Vue.js 是一个渐进式 JavaScript 框架,用于构建用户界面。以下是 Vue 的核心语法实现方式: 模板语法 Vue 使用基于 HTML 的模板语法,允许开发者声明式地…

Vue中实现路由

Vue中实现路由

Vue 路由的实现方法 在 Vue 中实现路由通常使用 Vue Router 库。以下是具体的实现步骤: 安装 Vue Router 通过 npm 或 yarn 安装 Vue Router: n…

Vue submit实现导出

Vue submit实现导出

Vue 中实现导出功能的方法 在 Vue 项目中实现导出功能,通常可以通过前端生成文件或调用后端接口导出数据。以下是几种常见的实现方式: 前端生成 Excel 文件 使用 xlsx 库可以方便地在前…

Vue实现禁止截屏

Vue实现禁止截屏

防止截屏的常见方法 在Vue中实现禁止截屏的功能,可以通过以下几种方式来实现。需要注意的是,完全防止截屏在技术上是不现实的,但可以增加截屏的难度或通过其他手段进行限制。 使用CSS禁止用户选择文本和…

Vue怎么实现权限验证

Vue怎么实现权限验证

Vue权限验证实现方法 路由守卫验证 在router.js中配置全局前置守卫,通过meta字段标记路由权限要求。检查用户权限是否匹配,未匹配则跳转到登录页或403页面。 router.beforeE…