当前位置:首页 > VUE

vue单页面实现登录

2026-02-09 14:20:17VUE

Vue 单页面应用实现登录功能

路由配置

router/index.js 中配置登录路由和主页路由,使用路由守卫控制访问权限。

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

Vue.use(Router)

const router = new Router({
  routes: [
    {
      path: '/login',
      name: 'Login',
      component: Login
    },
    {
      path: '/',
      name: 'Home',
      component: Home,
      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

登录组件实现

创建 Login.vue 组件,包含表单和提交逻辑。

vue单页面实现登录

<template>
  <div class="login-container">
    <form @submit.prevent="handleLogin">
      <input v-model="username" type="text" placeholder="用户名">
      <input v-model="password" type="password" placeholder="密码">
      <button type="submit">登录</button>
    </form>
  </div>
</template>

<script>
export default {
  data() {
    return {
      username: '',
      password: ''
    }
  },
  methods: {
    async handleLogin() {
      try {
        const response = await this.$http.post('/api/login', {
          username: this.username,
          password: this.password
        })

        localStorage.setItem('token', response.data.token)
        this.$router.push('/')
      } catch (error) {
        alert('登录失败')
      }
    }
  }
}
</script>

状态管理

使用 Vuex 管理用户状态,在 store/index.js 中配置。

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

Vue.use(Vuex)

export default new Vuex.Store({
  state: {
    user: null
  },
  mutations: {
    setUser(state, user) {
      state.user = user
    }
  },
  actions: {
    login({ commit }, userData) {
      return new Promise((resolve, reject) => {
        // 这里替换为实际的API调用
        setTimeout(() => {
          commit('setUser', userData)
          localStorage.setItem('token', 'fake-token')
          resolve()
        }, 500)
      })
    }
  }
})

API 请求封装

src/api/auth.js 中封装登录相关API。

vue单页面实现登录

import axios from 'axios'

export default {
  login(credentials) {
    return axios.post('/api/login', credentials)
  }
}

响应拦截器

main.js 中添加响应拦截器处理未授权情况。

import axios from 'axios'

axios.interceptors.response.use(
  response => response,
  error => {
    if (error.response.status === 401) {
      localStorage.removeItem('token')
      router.push('/login')
    }
    return Promise.reject(error)
  }
)

登录后跳转处理

在登录成功后更新Vuex状态并跳转到主页。

methods: {
  async handleLogin() {
    try {
      await this.$store.dispatch('login', {
        username: this.username,
        password: this.password
      })
      this.$router.push('/')
    } catch (error) {
      console.error(error)
    }
  }
}

安全注意事项

确保使用HTTPS传输敏感数据,密码字段应该在前端进行哈希处理,后端需要验证并返回安全的JWT令牌。令牌应设置合理的过期时间,并存储在安全的HttpOnly Cookie中。

标签: 页面vue
分享给朋友:

相关文章

vue实现getapp

vue实现getapp

Vue 中实现全局获取应用实例的方法 在 Vue 3 中,可以通过 getCurrentInstance 方法获取当前组件实例,但需要明确其使用场景和限制。以下是具体实现方式: 方法一:通过 get…

vue实现flbook

vue实现flbook

Vue 实现类似 Flbook 的翻页效果 要实现类似 Flbook 的翻页效果,可以使用 Vue 结合 CSS 动画和 JavaScript 事件处理。以下是实现方法: 安装依赖 需要安装 vue…

vue实现popper

vue实现popper

Vue 实现 Popper 的方法 使用 Tippy.js 库 Tippy.js 是一个轻量级的 Popper.js 封装库,提供丰富的工具提示功能。安装 Tippy.js 及其 Vue 封装: n…

vue 实现折叠

vue 实现折叠

Vue 实现折叠功能的方法 在 Vue 中实现折叠功能可以通过多种方式完成,以下是几种常见的实现方法: 使用 v-if 或 v-show 控制显示隐藏 通过绑定一个布尔值变量,结合 v-if 或 v…

vue nexttrick实现

vue nexttrick实现

Vue 中 nextTick 的实现原理 nextTick 是 Vue 提供的一个异步方法,用于在下次 DOM 更新循环结束之后执行延迟回调。它利用了 JavaScript 的事件循环机制,确保回调在…

vue实现uuid

vue实现uuid

使用 uuid 库生成 UUID 在 Vue 项目中,可以使用 uuid 库来生成 UUID。安装依赖: npm install uuid 在 Vue 组件中使用: import { v4 as…