当前位置:首页 > VUE

vue登录怎么实现

2026-01-19 05:21:10VUE

Vue 登录实现方法

基础登录表单实现

在 Vue 组件中创建登录表单,包含用户名和密码输入框:

<template>
  <div>
    <input v-model="username" placeholder="用户名" type="text">
    <input v-model="password" placeholder="密码" type="password">
    <button @click="handleLogin">登录</button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      username: '',
      password: ''
    }
  },
  methods: {
    async handleLogin() {
      try {
        const response = await axios.post('/api/login', {
          username: this.username,
          password: this.password
        })
        localStorage.setItem('token', response.data.token)
        this.$router.push('/dashboard')
      } catch (error) {
        console.error('登录失败:', error)
      }
    }
  }
}
</script>

路由配置与导航守卫

在 Vue Router 中配置登录路由并设置导航守卫:

// router/index.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', component: Login },
    { path: '/dashboard', component: Dashboard, meta: { requiresAuth: true } }
  ]
})

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

状态管理实现

使用 Vuex 管理登录状态和用户信息:

// store/index.js
import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

export default new Vuex.Store({
  state: {
    user: null,
    token: null
  },
  mutations: {
    SET_USER(state, user) {
      state.user = user
    },
    SET_TOKEN(state, token) {
      state.token = token
    }
  },
  actions: {
    login({ commit }, { username, password }) {
      return axios.post('/api/login', { username, password })
        .then(response => {
          commit('SET_USER', response.data.user)
          commit('SET_TOKEN', response.data.token)
          localStorage.setItem('token', response.data.token)
        })
    },
    logout({ commit }) {
      commit('SET_USER', null)
      commit('SET_TOKEN', null)
      localStorage.removeItem('token')
    }
  }
})

表单验证增强

添加表单验证逻辑,确保输入符合要求:

<template>
  <form @submit.prevent="handleLogin">
    <div>
      <input v-model="form.username" placeholder="用户名">
      <span v-if="errors.username">{{ errors.username }}</span>
    </div>
    <div>
      <input v-model="form.password" type="password" placeholder="密码">
      <span v-if="errors.password">{{ errors.password }}</span>
    </div>
    <button type="submit" :disabled="isSubmitting">登录</button>
  </form>
</template>

<script>
export default {
  data() {
    return {
      form: {
        username: '',
        password: ''
      },
      errors: {},
      isSubmitting: false
    }
  },
  methods: {
    validateForm() {
      this.errors = {}
      if (!this.form.username) this.errors.username = '请输入用户名'
      if (!this.form.password) this.errors.password = '请输入密码'
      return Object.keys(this.errors).length === 0
    },
    async handleLogin() {
      if (!this.validateForm()) return
      this.isSubmitting = true
      try {
        await this.$store.dispatch('login', this.form)
        this.$router.push('/dashboard')
      } catch (error) {
        this.errors.form = error.response?.data?.message || '登录失败'
      } finally {
        this.isSubmitting = false
      }
    }
  }
}
</script>

安全增强措施

实现 JWT 刷新机制和 CSRF 防护:

vue登录怎么实现

// axios 拦截器配置
axios.interceptors.request.use(config => {
  const token = localStorage.getItem('token')
  if (token) {
    config.headers.Authorization = `Bearer ${token}`
  }
  return config
}, error => {
  return Promise.reject(error)
})

axios.interceptors.response.use(response => {
  return response
}, async error => {
  const originalRequest = error.config
  if (error.response.status === 401 && !originalRequest._retry) {
    originalRequest._retry = true
    try {
      const response = await axios.post('/api/refresh', {
        refreshToken: localStorage.getItem('refreshToken')
      })
      localStorage.setItem('token', response.data.token)
      return axios(originalRequest)
    } catch (refreshError) {
      store.dispatch('logout')
      router.push('/login')
      return Promise.reject(refreshError)
    }
  }
  return Promise.reject(error)
})

标签: vue
分享给朋友:

相关文章

前端vue登录功能实现

前端vue登录功能实现

Vue 登录功能实现步骤 创建登录表单组件 在 Vue 项目中创建一个登录组件,通常命名为 Login.vue。该组件包含用户名和密码输入框以及提交按钮。 <template> &l…

vue实现列表显示

vue实现列表显示

Vue 实现列表显示的方法 在 Vue 中实现列表显示通常使用 v-for 指令,结合数组或对象数据渲染动态列表。以下是几种常见的实现方式。 基本列表渲染 通过 v-for 指令遍历数组,动态生成列…

vue公共列表的实现

vue公共列表的实现

实现 Vue 公共列表组件 公共列表组件通常用于展示重复结构的数据,例如商品列表、用户列表等。以下是一个典型的实现方式: 基础实现 创建可复用的列表组件 List.vue: <tem…

vue中登陆实现逻辑

vue中登陆实现逻辑

Vue 中登录实现逻辑 前端实现逻辑 表单验证 使用 Vue 的表单验证库(如 VeeValidate)或自定义验证规则,确保用户输入的账号和密码符合要求。例如,检查邮箱格式、密码长度等。 发送登录…

vue实现alert

vue实现alert

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

vue实现主页

vue实现主页

Vue 实现主页的基本步骤 创建一个 Vue 主页通常涉及以下几个关键步骤,从项目初始化到页面布局和功能实现。 初始化 Vue 项目 使用 Vue CLI 或 Vite 初始化项目。Vue CLI…