当前位置:首页 > VUE

vue实现登录源码

2026-02-11 01:27:52VUE

Vue 登录功能实现源码解析

以下是一个基于 Vue 2 的登录功能实现示例,包含表单验证、API 请求和状态管理。

登录组件 (Login.vue)

<template>
  <div class="login-container">
    <form @submit.prevent="handleSubmit">
      <div class="form-group">
        <label for="username">用户名</label>
        <input 
          type="text" 
          id="username" 
          v-model="form.username" 
          @blur="validate('username')"
        >
        <span class="error" v-if="errors.username">{{ errors.username }}</span>
      </div>

      <div class="form-group">
        <label for="password">密码</label>
        <input 
          type="password" 
          id="password" 
          v-model="form.password" 
          @blur="validate('password')"
        >
        <span class="error" v-if="errors.password">{{ errors.password }}</span>
      </div>

      <button type="submit" :disabled="isSubmitting">
        {{ isSubmitting ? '登录中...' : '登录' }}
      </button>
    </form>
  </div>
</template>

<script>
import { login } from '@/api/auth'
import { validateEmail, validatePassword } from '@/utils/validate'

export default {
  data() {
    return {
      form: {
        username: '',
        password: ''
      },
      errors: {
        username: '',
        password: ''
      },
      isSubmitting: false
    }
  },
  methods: {
    validate(field) {
      if (field === 'username' && !this.form.username) {
        this.errors.username = '请输入用户名'
      } else if (field === 'password' && !this.form.password) {
        this.errors.password = '请输入密码'
      } else {
        this.errors[field] = ''
      }
    },
    async handleSubmit() {
      // 验证所有字段
      Object.keys(this.form).forEach(field => this.validate(field))

      // 如果有错误则停止提交
      if (Object.values(this.errors).some(err => err)) {
        return
      }

      this.isSubmitting = true
      try {
        const { data } = await login(this.form)
        this.$store.commit('SET_TOKEN', data.token)
        this.$router.push('/dashboard')
      } catch (error) {
        alert(error.response?.data?.message || '登录失败')
      } finally {
        this.isSubmitting = false
      }
    }
  }
}
</script>

<style scoped>
.login-container {
  max-width: 400px;
  margin: 0 auto;
  padding: 20px;
}
.form-group {
  margin-bottom: 15px;
}
.error {
  color: red;
  font-size: 12px;
}
</style>

API 请求模块 (auth.js)

import axios from 'axios'

export const login = (data) => {
  return axios.post('/api/login', data)
}

Vuex 状态管理

// store/auth.js
const state = {
  token: localStorage.getItem('token') || ''
}

const mutations = {
  SET_TOKEN(state, token) {
    state.token = token
    localStorage.setItem('token', token)
  },
  CLEAR_TOKEN(state) {
    state.token = ''
    localStorage.removeItem('token')
  }
}

const actions = {
  login({ commit }, credentials) {
    return login(credentials).then(response => {
      commit('SET_TOKEN', response.data.token)
    })
  },
  logout({ commit }) {
    commit('CLEAR_TOKEN')
  }
}

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

路由配置

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

Vue.use(Router)

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

router.beforeEach((to, from, next) => {
  const isAuthenticated = !!store.state.auth.token
  if (to.matched.some(record => record.meta.requiresAuth) && !isAuthenticated) {
    next('/login')
  } else {
    next()
  }
})

export default router

验证工具函数

// utils/validate.js
export function validateEmail(email) {
  const re = /^[^\s@]+@[^\s@]+\.[^\s@]+$/
  return re.test(email)
}

export function validatePassword(password) {
  return password.length >= 6
}

关键实现点

  1. 表单验证:实现了基本的字段非空验证,可通过扩展验证工具函数增加更复杂的验证逻辑

  2. API 请求:使用 axios 封装了登录接口,返回 Promise 便于处理异步操作

  3. 状态管理:通过 Vuex 管理登录状态,token 持久化存储在 localStorage

  4. 路由守卫:通过全局前置守卫实现页面访问权限控制

  5. UI 反馈:提交时禁用按钮并显示加载状态,错误时显示提示信息

扩展建议

  1. 增加验证码功能防止暴力破解

  2. 实现记住密码功能

  3. 添加第三方登录(如微信、GitHub等)

  4. 实现密码强度提示

  5. 增加双因素认证

以上代码实现了一个完整的 Vue 登录功能,可根据实际项目需求进行调整和扩展。

vue实现登录源码

标签: 源码vue
分享给朋友:

相关文章

vue实现导航栏切图

vue实现导航栏切图

Vue 实现导航栏切图 使用 Vue Router 实现基础导航 在 Vue 项目中,可以通过 Vue Router 实现导航栏的路由切换。创建一个导航栏组件,并在其中使用 <router-li…

vue 实现排序

vue 实现排序

Vue 实现排序的方法 使用计算属性实现排序 通过计算属性对数组进行排序,可以保持原始数据不变。示例代码展示了如何对列表按名称升序排序: <template> <div>…

vue实现编辑

vue实现编辑

Vue 实现编辑功能 在 Vue 中实现编辑功能通常涉及表单绑定、状态管理和事件处理。以下是一个常见的实现方法: 双向数据绑定 使用 v-model 指令实现表单元素与数据的双向绑定: <…

vue实现CRUD

vue实现CRUD

Vue 实现 CRUD 操作 Vue 提供了响应式数据绑定和组件化开发能力,结合后端 API 可以轻松实现 CRUD(增删改查)功能。以下是基于 Vue 3 和 Axios 的完整实现方案。 安装…

js 实现vue

js 实现vue

实现 Vue 的核心功能 在 JavaScript 中实现 Vue 的核心功能需要模拟数据绑定、虚拟 DOM 和响应式系统。以下是一个简化版的实现思路: 响应式系统 通过 Object.defin…

vue实现数据

vue实现数据

Vue 实现数据绑定的方法 Vue.js 提供了多种方式实现数据绑定,包括双向绑定、单向绑定以及动态数据绑定。以下是几种常见的实现方式: 双向数据绑定(v-model) 双向数据绑定通常用于表单元素…