当前位置:首页 > 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. 路由守卫:通过全局前置守卫实现页面访问权限控制

    vue实现登录源码

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

扩展建议

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

  2. 实现记住密码功能

    vue实现登录源码

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

  4. 实现密码强度提示

  5. 增加双因素认证

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

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

相关文章

vue实现继承语法糖

vue实现继承语法糖

在Vue中实现继承可以通过多种方式模拟类继承的效果,以下是常见的几种方法: 使用mixins实现逻辑复用 通过Vue的mixins机制共享组件选项,达到类似继承的效果: const BaseCom…

vue实现app

vue实现app

Vue 实现 App 的常见方法 使用 Vue 开发移动端 App 主要有两种主流方案:混合开发(Hybrid)和原生渲染。以下是具体实现方式和工具链: 混合开发方案(WebView 嵌入) 通过…

vue实现switch

vue实现switch

Vue 实现 Switch 开关组件 在 Vue 中实现 Switch 开关组件可以通过自定义组件或使用现有 UI 库完成。以下是几种常见实现方式: 自定义 Switch 组件 创建一个基础 Sw…

vue实现机制

vue实现机制

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

vue 全景实现

vue 全景实现

Vue 全景实现方案 在Vue中实现全景效果,通常需要结合WebGL或第三方库来处理3D场景渲染。以下是几种常见方法: 使用Three.js库 Three.js是一个强大的WebGL库,适合创建3D…

vue实现treeselect

vue实现treeselect

Vue TreeSelect 实现方法 使用 Vue 实现 TreeSelect 组件可以通过以下几种方式完成,包括使用现成的第三方库或自行封装组件。 使用第三方库 推荐使用成熟的第三方 TreeS…