当前位置:首页 > VUE

vue路由实现登录注册

2026-01-21 02:05:58VUE

Vue路由实现登录注册功能

路由配置

在Vue项目中,通过vue-router配置登录和注册的路由。通常将这些路由设置为公开可访问,不要求认证。

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

Vue.use(Router)

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

导航守卫

使用路由守卫保护需要认证的页面,未登录用户尝试访问受保护路由时重定向到登录页。

// 添加全局前置守卫
router.beforeEach((to, from, next) => {
  const isAuthenticated = localStorage.getItem('token')

  if (to.matched.some(record => record.meta.requiresAuth)) {
    if (!isAuthenticated) {
      next({ name: 'Login' })
    } else {
      next()
    }
  } else {
    next()
  }
})

登录组件实现

创建登录表单组件,处理用户提交的凭证。

vue路由实现登录注册

<!-- views/Login.vue -->
<template>
  <div>
    <form @submit.prevent="handleLogin">
      <input v-model="email" type="email" placeholder="Email" required>
      <input v-model="password" type="password" placeholder="Password" required>
      <button type="submit">Login</button>
    </form>
  </div>
</template>

<script>
export default {
  data() {
    return {
      email: '',
      password: ''
    }
  },
  methods: {
    async handleLogin() {
      try {
        const response = await authService.login(this.email, this.password)
        localStorage.setItem('token', response.data.token)
        this.$router.push({ name: 'Dashboard' })
      } catch (error) {
        console.error('Login failed:', error)
      }
    }
  }
}
</script>

注册组件实现

创建用户注册表单组件。

<!-- views/Register.vue -->
<template>
  <div>
    <form @submit.prevent="handleRegister">
      <input v-model="name" type="text" placeholder="Name" required>
      <input v-model="email" type="email" placeholder="Email" required>
      <input v-model="password" type="password" placeholder="Password" required>
      <button type="submit">Register</button>
    </form>
  </div>
</template>

<script>
export default {
  data() {
    return {
      name: '',
      email: '',
      password: ''
    }
  },
  methods: {
    async handleRegister() {
      try {
        await authService.register(this.name, this.email, this.password)
        this.$router.push({ name: 'Login' })
      } catch (error) {
        console.error('Registration failed:', error)
      }
    }
  }
}
</script>

认证服务

创建独立的认证服务模块处理API调用。

vue路由实现登录注册

// services/auth.js
import axios from 'axios'

const API_URL = 'https://your-api-endpoint.com'

export default {
  login(email, password) {
    return axios.post(`${API_URL}/login`, { email, password })
  },
  register(name, email, password) {
    return axios.post(`${API_URL}/register`, { name, email, password })
  }
}

用户状态管理

对于更复杂的应用,建议使用Vuex管理用户认证状态。

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

const mutations = {
  SET_USER(state, user) {
    state.user = user
  },
  SET_TOKEN(state, token) {
    state.token = token
    localStorage.setItem('token', token)
  },
  LOGOUT(state) {
    state.user = null
    state.token = null
    localStorage.removeItem('token')
  }
}

const actions = {
  login({ commit }, credentials) {
    return authService.login(credentials.email, credentials.password)
      .then(response => {
        commit('SET_TOKEN', response.data.token)
        return response
      })
  },
  register({ commit }, userData) {
    return authService.register(userData.name, userData.email, userData.password)
  }
}

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

响应式导航

根据认证状态动态显示/隐藏导航菜单项。

<!-- components/Navbar.vue -->
<template>
  <nav>
    <router-link to="/login" v-if="!isAuthenticated">Login</router-link>
    <router-link to="/register" v-if="!isAuthenticated">Register</router-link>
    <button @click="logout" v-if="isAuthenticated">Logout</button>
  </nav>
</template>

<script>
import { mapState, mapActions } from 'vuex'

export default {
  computed: {
    ...mapState('auth', ['token']),
    isAuthenticated() {
      return !!this.token
    }
  },
  methods: {
    ...mapActions('auth', ['logout'])
  }
}
</script>

标签: 路由vue
分享给朋友:

相关文章

vue项目实现

vue项目实现

Vue 项目实现指南 环境准备 确保已安装 Node.js(建议版本 14+)和 npm/yarn。通过以下命令检查版本: node -v npm -v 安装 Vue CLI(脚手架工具): np…

vue组件的实现

vue组件的实现

Vue 组件的实现方式 Vue 组件可以通过多种方式实现,以下是常见的几种方法: 单文件组件 (SFC) 使用 .vue 文件,包含模板、脚本和样式三部分: <template>…

vue实现横向导航

vue实现横向导航

vue实现横向导航的方法 使用Flex布局实现横向导航 在Vue中可以通过Flex布局快速实现横向导航。创建一个组件,使用display: flex和flex-direction: row属性使导航项…

vue 实现复选

vue 实现复选

Vue 实现复选功能 在 Vue 中实现复选功能可以通过多种方式完成,以下是常见的几种方法: 使用 v-model 绑定数组 通过 v-model 绑定一个数组,可以自动收集用户选择的复选框值。…

vue实现ai

vue实现ai

Vue 实现 AI 功能 Vue.js 可以通过集成第三方 AI 服务或本地 AI 模型来实现 AI 功能。以下是几种常见的方法: 集成第三方 AI API 使用 Vue 调用如 OpenAI、G…

vue实现tablegrid

vue实现tablegrid

Vue 实现 TableGrid 的方法 使用 Element UI 的 Table 组件 Element UI 提供了强大的 Table 组件,可以快速实现表格布局。安装 Element UI 后,…