当前位置:首页 > VUE

vue项目实现注册登录

2026-02-22 13:46:48VUE

Vue 项目实现注册登录功能

项目初始化与依赖安装

创建 Vue 项目并安装必要依赖(如 Vue Router、Axios、Vuex 等):

vue create auth-demo
cd auth-demo
npm install vue-router axios vuex

路由配置

src/router/index.js 中配置路由:

import { createRouter, createWebHistory } from 'vue-router'
import Login from '../views/Login.vue'
import Register from '../views/Register.vue'
import Dashboard from '../views/Dashboard.vue'

const routes = [
  { path: '/login', component: Login },
  { path: '/register', component: Register },
  { path: '/dashboard', component: Dashboard, meta: { requiresAuth: true } }
]

const router = createRouter({
  history: createWebHistory(),
  routes
})

状态管理(Vuex)

src/store/index.js 中设置用户状态:

import { createStore } from 'vuex'

export default createStore({
  state: {
    user: null,
    token: localStorage.getItem('token') || null
  },
  mutations: {
    SET_USER(state, user) {
      state.user = user
    },
    SET_TOKEN(state, token) {
      state.token = token
      localStorage.setItem('token', token)
    },
    CLEAR_AUTH(state) {
      state.user = null
      state.token = null
      localStorage.removeItem('token')
    }
  }
})

注册组件实现

src/views/Register.vue 示例:

<template>
  <form @submit.prevent="handleRegister">
    <input v-model="form.email" type="email" placeholder="Email">
    <input v-model="form.password" type="password" placeholder="Password">
    <button type="submit">Register</button>
  </form>
</template>

<script>
import axios from 'axios'

export default {
  data() {
    return {
      form: {
        email: '',
        password: ''
      }
    }
  },
  methods: {
    async handleRegister() {
      try {
        const response = await axios.post('/api/register', this.form)
        this.$store.commit('SET_TOKEN', response.data.token)
        this.$router.push('/dashboard')
      } catch (error) {
        console.error(error)
      }
    }
  }
}
</script>

登录组件实现

src/views/Login.vue 示例:

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

<script>
import axios from 'axios'

export default {
  data() {
    return {
      form: {
        email: '',
        password: ''
      }
    }
  },
  methods: {
    async handleLogin() {
      try {
        const response = await axios.post('/api/login', this.form)
        this.$store.commit('SET_TOKEN', response.data.token)
        this.$router.push('/dashboard')
      } catch (error) {
        console.error(error)
      }
    }
  }
}
</script>

路由守卫

src/router/index.js 中添加导航守卫:

router.beforeEach((to, from, next) => {
  if (to.meta.requiresAuth && !store.state.token) {
    next('/login')
  } else {
    next()
  }
})

API 请求封装

创建 src/api/auth.js 封装请求:

import axios from 'axios'

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

响应拦截处理

src/main.js 中设置响应拦截:

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

用户信息获取

在 Dashboard 组件中展示用户信息:

<template>
  <div>
    <h1>Welcome, {{ user.name }}</h1>
    <button @click="logout">Logout</button>
  </div>
</template>

<script>
export default {
  computed: {
    user() {
      return this.$store.state.user
    }
  },
  methods: {
    logout() {
      this.$store.commit('CLEAR_AUTH')
      this.$router.push('/login')
    }
  }
}
</script>

后端接口说明

示例 Node.js 后端接口(需单独实现):

// Express 示例
app.post('/api/register', (req, res) => {
  // 实现用户注册逻辑
  res.json({ token: 'generated-jwt-token' })
})

app.post('/api/login', (req, res) => {
  // 实现用户登录验证
  res.json({ token: 'generated-jwt-token' })
})

表单验证增强

建议使用 Vuelidate 或 VeeValidate 进行表单验证:

vue项目实现注册登录

npm install @vuelidate/core @vuelidate/validators

安全注意事项

  • 使用 HTTPS 协议
  • 密码需加密存储(如 bcrypt)
  • 实现 CSRF 防护
  • 设置合理的 Token 过期时间
  • 敏感操作需要二次验证

样式优化建议

  • 添加加载状态指示器
  • 实现表单错误提示
  • 使用过渡动画增强用户体验
  • 响应式布局适配移动设备

标签: 项目vue
分享给朋友:

相关文章

vue表格重置怎么实现

vue表格重置怎么实现

重置表格数据的方法 在Vue中重置表格数据通常需要操作绑定的数据源,以下是几种常见实现方式: 直接重置数据源 // 假设表格绑定的是tableData this.tableData = [...t…

vue实现div

vue实现div

Vue 实现 DIV 元素的方法 在 Vue 中实现 DIV 元素可以通过多种方式,以下是几种常见的实现方法: 使用模板语法 在 Vue 的模板中直接使用 HTML 的 <div> 标签…

vue 实现拖拽

vue 实现拖拽

Vue 实现拖拽功能 使用 HTML5 原生拖拽 API HTML5 提供了原生的拖拽 API,可以通过 draggable 属性和相关事件实现拖拽功能。 <template> &l…

vue实现addclass

vue实现addclass

Vue 实现动态添加 class 的方法 在 Vue 中动态添加 class 可以通过多种方式实现,以下是常见的几种方法: 使用对象语法 通过绑定一个对象到 :class,可以动态切换 class…

vue实现筛选

vue实现筛选

实现筛选功能的基本思路 在Vue中实现筛选功能通常需要结合数据绑定、计算属性和方法。筛选的核心逻辑是根据用户输入的条件过滤原始数据列表,并动态更新显示结果。 数据准备 定义一个数组存储原始数据,另一…

vue实现api

vue实现api

Vue 实现 API 调用 在 Vue 中调用 API 通常涉及使用 axios 或 fetch 发送 HTTP 请求,并结合 Vue 的响应式特性管理数据。以下是常见的实现方式: 安装 axios…