当前位置:首页 > VUE

vue登录模块实现

2026-01-16 21:36:31VUE

Vue 登录模块实现

创建登录表单组件

components/LoginForm.vue 中构建基础表单,包含用户名、密码输入框和提交按钮。使用 v-model 实现双向数据绑定。

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

<script>
export default {
  data() {
    return {
      username: '',
      password: ''
    }
  },
  methods: {
    handleSubmit() {
      this.$emit('login', {
        username: this.username,
        password: this.password
      })
    }
  }
}
</script>

状态管理(Vuex)

store/index.js 中配置 Vuex 存储用户状态和登录逻辑:

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, payload) {
      state.user = payload.user
      state.token = payload.token
    }
  },
  actions: {
    async login({ commit }, credentials) {
      try {
        const response = await axios.post('/api/login', credentials)
        commit('SET_USER', response.data)
        localStorage.setItem('token', response.data.token)
        return response.data
      } catch (error) {
        throw error.response.data
      }
    }
  }
})

路由配置

router/index.js 中设置登录路由和权限控制:

vue登录模块实现

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,
      meta: { requiresGuest: true }
    },
    {
      path: '/dashboard',
      name: 'dashboard',
      component: Dashboard,
      meta: { requiresAuth: true }
    }
  ]
})

router.beforeEach((to, from, next) => {
  const isAuthenticated = store.state.token !== null
  if (to.matched.some(record => record.meta.requiresAuth)) {
    if (!isAuthenticated) {
      next('/login')
    } else {
      next()
    }
  } else if (to.matched.some(record => record.meta.requiresGuest)) {
    if (isAuthenticated) {
      next('/dashboard')
    } else {
      next()
    }
  } else {
    next()
  }
})

export default router

登录页面集成

views/Login.vue 中整合表单和登录逻辑:

<template>
  <div class="login-container">
    <LoginForm @login="attemptLogin" />
    <p v-if="error" class="error">{{ error }}</p>
  </div>
</template>

<script>
import LoginForm from '@/components/LoginForm.vue'

export default {
  components: { LoginForm },
  data() {
    return {
      error: null
    }
  },
  methods: {
    async attemptLogin(credentials) {
      try {
        await this.$store.dispatch('login', credentials)
        this.$router.push('/dashboard')
      } catch (error) {
        this.error = error.message || '登录失败'
      }
    }
  }
}
</script>

持久化登录状态

main.js 中初始化时检查本地存储的 token:

vue登录模块实现

import store from './store'

const token = localStorage.getItem('token')
if (token) {
  store.commit('SET_USER', { token })
}

new Vue({
  router,
  store,
  render: h => h(App)
}).$mount('#app')

安全增强措施

添加 axios 请求拦截器自动附加 token:

axios.interceptors.request.use(config => {
  const token = store.state.token
  if (token) {
    config.headers.Authorization = `Bearer ${token}`
  }
  return config
}, error => {
  return Promise.reject(error)
})

实现登出功能:

// Vuex action
logout({ commit }) {
  commit('SET_USER', { user: null, token: null })
  localStorage.removeItem('token')
}

// 组件调用
methods: {
  logout() {
    this.$store.dispatch('logout')
    this.$router.push('/login')
  }
}

标签: 模块vue
分享给朋友:

相关文章

vue设计与实现下载

vue设计与实现下载

vue设计与实现电子书下载 《Vue.js设计与实现》是一本深入解析Vue.js框架原理的书籍,由霍春阳(HcySunYang)撰写。以下是获取该资源的常见途径: 正版购买渠道 京东、…

vue实现主页

vue实现主页

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

vue实现排序

vue实现排序

Vue 实现排序的方法 在 Vue 中实现排序可以通过多种方式完成,以下是一些常见的方法: 使用计算属性排序数组 计算属性非常适合对数据进行排序,因为它会在依赖的数据变化时自动更新。以下是一个示例…

vue实现markdown

vue实现markdown

Vue 实现 Markdown 编辑器 在 Vue 中实现 Markdown 编辑器可以通过集成第三方库或自定义解析器完成。以下是两种常见方法: 使用第三方库(如 marked 或 markdow…

vue实现定位

vue实现定位

Vue 中实现定位的方法 在 Vue 中实现定位可以通过以下几种方式: 使用 CSS 定位 通过 CSS 的 position 属性实现定位,Vue 中可以直接在组件的 <style>…

vue实现图片

vue实现图片

Vue 实现图片功能的方法 静态图片引入 在 Vue 项目中,可以通过 src 属性直接引入静态图片。图片通常放在 public 或 assets 目录下。 <template> &…