当前位置:首页 > 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 中配置登录路由并设置导航守卫:

vue登录怎么实现

// 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 管理登录状态和用户信息:

vue登录怎么实现

// 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 防护:

// 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实现sql操作

vue实现sql操作

在Vue中实现SQL操作通常需要结合后端服务或本地数据库技术,因为前端JavaScript无法直接连接SQL数据库。以下是几种常见的实现方式: 通过API与后端交互 Vue前端通过HTTP请求(如a…

vue实现多人视频

vue实现多人视频

实现多人视频通话的Vue方案 使用WebRTC技术结合Vue框架可以构建多人视频通话应用。以下是核心实现方法: 技术栈选择 Vue 2/3作为前端框架 WebRTC用于实时通信 Socket.io…

vue实现drag

vue实现drag

Vue 实现拖拽功能的方法 在 Vue 中实现拖拽功能可以通过原生 HTML5 的拖拽 API 或第三方库如 vuedraggable 来完成。以下是两种常见方法的实现方式。 使用 HTML5 拖拽…

vue菜单实现

vue菜单实现

Vue 菜单实现方法 使用 Element UI 的菜单组件 Element UI 提供了现成的菜单组件,适合快速实现导航菜单。安装 Element UI 后,可以直接使用 el-menu 相关组件。…

vue能实现

vue能实现

Vue.js 是一个流行的前端框架,能够实现多种功能。以下是 Vue 能够实现的主要功能和特性: 响应式数据绑定 Vue 的核心特性之一是响应式数据绑定。通过数据驱动视图,当数据发生变化时,视图会自…

vue 实现聊天

vue 实现聊天

使用 Vue 实现聊天功能 创建 Vue 项目并安装依赖 确保已安装 Vue CLI,通过以下命令创建新项目: vue create chat-app 进入项目目录后,安装必要的依赖(如 Socke…