当前位置:首页 > VUE

网页登录实现vue

2026-03-09 01:41:14VUE

网页登录实现(Vue)

使用 Vue Router 和 Axios 实现基础登录

创建登录表单组件(Login.vue),包含用户名和密码输入框及提交按钮。表单提交时触发登录方法。

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

<script>
import axios from 'axios';

export default {
  data() {
    return {
      username: '',
      password: ''
    };
  },
  methods: {
    async handleLogin() {
      try {
        const response = await axios.post('/api/login', {
          username: this.username,
          password: this.password
        });
        localStorage.setItem('token', response.data.token);
        this.$router.push('/dashboard');
      } catch (error) {
        alert('登录失败');
      }
    }
  }
};
</script>

路由配置与导航守卫

router/index.js 中配置路由,并使用导航守卫保护需要认证的路由。

import Vue from 'vue';
import Router from 'vue-router';
import Login from '@/components/Login';
import Dashboard from '@/components/Dashboard';

Vue.use(Router);

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

router.beforeEach((to, from, next) => {
  const isAuthenticated = localStorage.getItem('token');
  if (to.meta.requiresAuth && !isAuthenticated) {
    next('/login');
  } else {
    next();
  }
});

export default router;

状态管理(Vuex)

使用 Vuex 管理用户登录状态,存储 token 和用户信息。

// store/index.js
import Vue from 'vue';
import Vuex from 'vuex';

Vue.use(Vuex);

export default new Vuex.Store({
  state: {
    token: null,
    user: null
  },
  mutations: {
    setToken(state, token) {
      state.token = token;
    },
    setUser(state, user) {
      state.user = user;
    }
  },
  actions: {
    login({ commit }, { username, password }) {
      return axios.post('/api/login', { username, password })
        .then(response => {
          commit('setToken', response.data.token);
          commit('setUser', response.data.user);
        });
    }
  }
});

表单验证

使用 Vuelidate 或自定义验证方法增强表单验证。

import { required, minLength } from 'vuelidate/lib/validators';

export default {
  data() {
    return {
      username: '',
      password: ''
    };
  },
  validations: {
    username: { required },
    password: { required, minLength: minLength(6) }
  },
  methods: {
    handleLogin() {
      if (this.$v.$invalid) {
        alert('请填写正确信息');
        return;
      }
      // 登录逻辑
    }
  }
};

响应式处理

根据登录状态动态显示/隐藏导航栏内容。

<template>
  <div>
    <router-link v-if="!isAuthenticated" to="/login">登录</router-link>
    <button v-else @click="logout">退出</button>
  </div>
</template>

<script>
import { mapState } from 'vuex';

export default {
  computed: {
    ...mapState(['token'])
  },
  methods: {
    logout() {
      this.$store.commit('setToken', null);
      this.$router.push('/login');
    }
  }
};
</script>

安全增强

使用 HTTPS 传输数据,后端验证 token 有效性,设置 token 过期时间。前端定期检查 token 有效性或使用拦截器处理 token 刷新。

网页登录实现vue

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

以上方法可根据实际项目需求组合或调整,实现完整的 Vue 登录功能。

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

相关文章

vue element实现

vue element实现

Vue Element UI 实现 Vue Element UI 是基于 Vue.js 的组件库,提供丰富的 UI 组件,适合快速开发企业级中后台产品。以下是一些关键实现方法和步骤: 安装 Vue…

vue实现双向

vue实现双向

Vue 实现双向绑定的方法 Vue 的双向绑定主要通过 v-model 指令实现,它结合了数据绑定和事件监听,适用于表单元素(如 input、select、textarea 等)。以下是几种常见的实现…

vue实现画廊

vue实现画廊

Vue实现画廊的基本方法 使用Vue.js实现画廊功能可以通过多种方式完成,以下是一种常见的实现方案: 安装必要依赖 npm install vue-gallery --save 引入组件并注册…

vue 实现折叠

vue 实现折叠

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

vue实现搜索提示

vue实现搜索提示

Vue实现搜索提示的方法 使用v-model绑定输入框 通过v-model将输入框的值与Vue实例中的数据进行双向绑定,实时获取用户输入内容。 <input v-model="searchQu…

vue嵌套grafana实现

vue嵌套grafana实现

Vue 中嵌套 Grafana 的实现方法 使用 iframe 嵌入 Grafana 面板 在 Vue 项目中可以通过 iframe 直接嵌入 Grafana 的面板或仪表板。确保 Grafana 已…