笔记之vue实现登录与注册功能

以下是一个基本的 Vue 登录注册业务的实现,使用了 Vue Router 和 VueX:

1. 首先创建一个 Vue 项目并安装相关依赖:

vue create my-project
cd my-project
npm install vue-router vuex axios

2. 在 src 目录下新建以下文件:


- `api.js`:定义与后端交互的 API 接口方法;
- `components/Login.vue`:登录页面组件;
- `components/Register.vue`:注册页面组件;
- `components/Welcome.vue`:欢迎页面组件;
- `router/index.js`:定义路由配置;
- `store/index.js`:定义全局状态管理器。

3. 在 `api.js` 中定义与后端交互的 API 接口方法:

import axios from 'axios'
const API_URL = 'http://localhost:3000/api'
export default {
  login (credentials) {
    return axios.post(`${API_URL}/login`, credentials)
  },
  register (userData) {
    return axios.post(`${API_URL}/register`, userData)
  },
  getProfile () {
    return axios.get(`${API_URL}/profile`)
  },
  logout () {
    return axios.post(`${API_URL}/logout`)
  }
}

4. 在 `components/Login.vue` 中实现登录页面:

<template>
  <div>
    <h2>Login</h2>
    <form @submit.prevent="login">
      <label>
        Email:
        <input type="email" v-model="email" required />
      </label>
      <label>
        Password:
        <input type="password" v-model="password" required />
      </label>
      <button type="submit">Login</button>
    </form>
    <div v-if="error">{{ error }}</div>
  </div>
</template>
<script>
export default {
  data () {
    return {
      email: '',
      password: '',
      error: ''
    }
  },
  methods: {
    async login () {
      try {
        await this.$store.dispatch('login', {
          email: this.email,
          password: this.password
        })
        this.$router.push('/welcome')
      } catch (error) {
        this.error = error.response.data.message
      }
    }
  }
}
</script>


5. 在 `components/Register.vue` 中实现注册页面:

<template>
  <div>
    <h2>Register</h2>
    <form @submit.prevent="register">
      <label>
        Name:
        <input type="text" v-model="name" required />
      </label>
      <label>
        Email:
        <input type="email" v-model="email" required />
      </label>
      <label>
        Password:
        <input type="password" v-model="password" required />
      </label>
      <button type="submit">Register</button>
    </form>
    <div v-if="error">{{ error }}</div>
  </div>
</template>
<script>
export default {
  data () {
    return {
      name: '',
      email: '',
      password: '',
      error: ''
    }
  },
  methods: {
    async register () {
      try {
        await this.$store.dispatch('register', {
          name: this.name,
          email: this.email,
          password: this.password
        })
        this.$router.push('/welcome')
      } catch (error) {
        this.error = error.response.data.message
      }
    }
  }
}
</script>


6. 在 `components/Welcome.vue` 中实现欢迎页面:


<template>
  <div>
    <h2>Welcome</h2>
    <p>You are logged in as {{ user.name }} ({{ user.email }}).</p >
    <button @click="logout">Logout</button>
  </div>
</template>
<script>
export default {
  computed: {
    user () {
      return this.$store.state.user
    }
  },
  methods: {
    async logout () {
      await this.$store.dispatch('logout')
      this.$router.push('/login')
    }
  }
}
</script>


7. 在 `router/index.js` 中定义路由配置:

import Vue from 'vue'
import VueRouter from 'vue-router'
import Login from '../components/Login.vue'
import Register from '../components/Register.vue'
import Welcome from '../components/Welcome.vue'
Vue.use(VueRouter)
const routes = [
  { path: '/login', component: Login },
  { path: '/register', component: Register },
  { path: '/welcome', component: Welcome, meta: { requiresAuth: true } },
  { path: '/', redirect: '/login' }
]
const router = new VueRouter({
  mode: 'history',
  routes
})
router.beforeEach((to, from, next) => {
  const isAuthenticated = !!localStorage.getItem('token')
  const requiresAuth = to.matched.some(record => record.meta.requiresAuth)
  if (requiresAuth && !isAuthenticated) {
    next('/login')
  } else {
    next()
  }
})
export default router



8. 在 `store/index.js` 中定义全局状态管理器:

import Vue from 'vue'
import Vuex from 'vuex'
import api from '../api'
Vue.use(Vuex)
export default new Vuex.Store({
  state: {
    user: null
  },
  mutations: {
    setUser (state, user) {
      state.user = user
    }
  },
  actions: {
    async login ({ commit }, credentials) {
      const response = await api.login(credentials)
      const token = response.data.token
      localStorage.setItem('token', token)
      const user = await api.getProfile()
      commit('setUser', user.data)
    },
    async register ({ commit }, userData) {
      const response = await api.register(userData)
      const token = response.data.token
      localStorage.setItem('token', token)
      const user = await api.getProfile()
      commit('setUser', user.data)
    },
    async logout ({ commit }) {
      await api.logout()
      localStorage.removeItem('token')
      commit('setUser', null)
    }
  }
})


9. 最后在 `App.vue` 中引入 `router-view` 组件:

<template>
  <div id="app">
    <router-view></router-view>
  </div>
</template>
<script>
export default {
  name: 'App'
}
</script>


现在运行 `npm run serve` 启动项目,即可访问 http://localhost:8080 进行登录注册操作。

实现登录注册功能,你需要在Vue中使用组件来创建表单,使用Vue Router来处理路由和页面导航,以及使用Vuex来管理应用程序状态。 下面是一个简单的示例,演示如何使用Vue实现登录注册功能: 1. 创建注册组件和登录组件 在Vue中,可以使用组件来创建用户界面。为了实现登录注册功能,你需要创建两个组件:一个用于用户注册,另一个用于用户登录。 ``` <template> <div> <h1>注册</h1> <form> <input type="text" placeholder="用户名" v-model="username"> <input type="password" placeholder="密码" v-model="password"> <button type="submit" @click.prevent="register">注册</button> </form> </div> </template> <script> export default { data() { return { username: '', password: '' } }, methods: { register() { // 实现注册逻辑 } } } </script> ``` ``` <template> <div> <h1>登录</h1> <form> <input type="text" placeholder="用户名" v-model="username"> <input type="password" placeholder="密码" v-model="password"> <button type="submit" @click.prevent="login">登录</button> </form> </div> </template> <script> export default { data() { return { username: '', password: '' } }, methods: { login() { // 实现登录逻辑 } } } </script> ``` 2. 创建路由和导航 使用Vue Router来处理路由和页面导航。你需要定义两个路由:一个用于用户注册,另一个用于用户登录。 ``` import Vue from 'vue' import Router from 'vue-router' import Register from '@/components/Register' import Login from '@/components/Login' Vue.use(Router) export default new Router({ routes: [ { path: '/register', name: 'Register', component: Register }, { path: '/login', name: 'Login', component: Login } ] }) ``` 3. 创建Vuex store 使用Vuex来管理应用程序状态。你需要创建一个store,用于存储用户信息和登录状态。 ``` import Vue from 'vue' import Vuex from 'vuex' Vue.use(Vuex) export default new Vuex.Store({ state: { user: null, isLoggedIn: false }, mutations: { setUser(state, user) { state.user = user state.isLoggedIn = true }, clearUser(state) { state.user = null state.isLoggedIn = false } }, actions: { login({ commit }, user) { // 实现登录逻辑 commit('setUser', user) }, logout({ commit }) { // 实现登出逻辑 commit('clearUser') } } }) ``` 4. 在应用程序中使用组件、路由和Vuex store 最后,在应用程序中使用组件、路由和Vuex store来实现完整的登录注册功能。 ``` <template> <div> <h1>我的应用程序</h1> <nav> <router-link to="/register">注册</router-link> <router-link to="/login">登录</router-link> </nav> <router-view></router-view> </div> </template> <script> export default { name: 'App' } </script> ``` 完整的示例代码可以在GitHub上找到:https://github.com/vuejs/vue-router/tree/dev/examples/auth-flow
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值