基于Vue3和element-plus实现登录功能(最终完整版)

接下来我将为您讲解“基于Vue3和element-plus实现登录功能(最终完整版)”的完整攻略。

一、前置知识

在学习本教程前,需要掌握以下技术:

  • Vue3基础知识
  • Element Plus UI框架的使用
  • 前端基础知识,如 HTTP 等协议、Cookie 和 Session 等概念
  • 前端路由和组件化开发思想

二、实现步骤

1. 创建vue-cli项目

使用以下命令创建一个vue3项目:

vue create login-demo

2. 安装element-plus

在项目根目录中运行以下命令来安装element-plus:

npm install element-plus --save

将element-plus配置到main.js中:

import { createApp } from "vue"
import ElementPlus from 'element-plus'
import "element-plus/lib/theme-chalk/index.css";
import App from "./App.vue";
import router from "./router";

createApp(App).use(router).use(ElementPlus).mount("#app");

3. 创建登录页面和路由

在src/views文件夹下创建LoginPage.vue并实现基本布局,如下:

<template>
  <el-form class="login-box" ref="loginForm" :model="form" :rules="rules">
    <h3 class="title">用户登录</h3>
    <el-form-item label="用户名" prop="username">
      <el-input v-model="form.username"></el-input>
    </el-form-item>
    <el-form-item label="密码" prop="password">
      <el-input type="password" v-model="form.password"></el-input>
    </el-form-item>
    <el-form-item>
      <el-button type="primary" @click="handleSubmit">登录</el-button>
      <el-button @click="resetForm">重置</el-button>
    </el-form-item>
  </el-form>
</template>

<script>
export default {
  name: "LoginPage",
  data() {
    return {
      form: {
        username: "",
        password: "",
      },
      rules: {
        username: [{ required: true, message: "请输入用户名", trigger: "blur" }],
        password: [{ required: true, message: "请输入密码", trigger: "blur" }],
      },
    };
  },
  methods: {
    handleSubmit() {
      this.$refs.loginForm.validate((valid) => {
        if (valid) {
          // TODO 登录逻辑
        } else {
          return false;
        }
      });
    },
    resetForm() {
      this.$refs.loginForm.resetFields();
    },
  },
};
</script>

<style scoped>
.login-box {
  width: 320px;
  margin: 160px auto;
}

.title {
  text-align: center;
  margin-bottom: 30px;
}
</style>

修改router/index.js文件,添加登录页路由:

import { createRouter, createWebHistory } from 'vue-router'
import LoginPage from '@/views/LoginPage.vue'

const routes = [
  {
    path: '/',
    name: 'Login',
    component: LoginPage
  }
]

const router = createRouter({
  history: createWebHistory(process.env.BASE_URL),
  routes
})

export default router

4. 实现登录逻辑

在src/api文件夹中添加user.js文件,封装登录API:

import request from '@/utils/request'

export function login(data) {
  return request({
    url: '/login',
    method: 'POST',
    data: data
  })
}

在src/utils文件夹中新建request.js文件,使用axios封装请求:

import axios from "axios";

const service = axios.create({
  baseURL: process.env.VUE_APP_BASE_API,
  timeout: 5000,
});

service.interceptors.request.use(
  (config) => {
    config.headers["Content-Type"] = "application/json;charset=UTF-8";
    return config;
  },
  (error) => {
    console.log(error); // for debug
    return Promise.reject(error);
  }
);

service.interceptors.response.use(
  (response) => {
    const res = response.data;

    return res;
  },
  (error) => {
    console.log("err" + error); // for debug
    return Promise.reject(error);
  }
);

export default service;

修改LoginPage.vue文件,添加登录逻辑:

import { login } from "@/api/user";

// ...

export default {
  name: "LoginPage",
  data() {
    return {
      form: {
        username: "",
        password: "",
      },
      rules: {
        username: [{ required: true, message: "请输入用户名", trigger: "blur" }],
        password: [{ required: true, message: "请输入密码", trigger: "blur" }],
      },
    };
  },
  methods: {
    handleSubmit() {
      this.$refs.loginForm.validate((valid) => {
        if (valid) {
          login(this.form).then(res => {
            if (res.code === 200) {
              this.$message.success(res.message);
              // TODO 成功登录跳转逻辑
            } else {
              this.$message.error(res.message);
            }
          }).catch(err => {
            console.error(err)
          })
        } else {
          return false;
        }
      });
    },
    resetForm() {
      this.$refs.loginForm.resetFields();
    },
  },
};

这里我们发送的请求是POST请求,后端会在请求体中获取账号密码进行校验,返回给我们token用于后续的操作。

暂时我们只需要在请求头中添加Authorization字段(值为token)进行简单的校验,防止不是登录操作的请求访问敏感信息。

5. 实现登录后样式和功能

在LoginPage.vue文件登录成功的跳转逻辑处调用localStorage存储token,如下:

handleSubmit() {
  // ...

  if (valid) {
    login(this.form).then(res => {
      if (res.code === 200) {
        window.localStorage.setItem('token', res.data.token)

        this.$message.success(res.message);
        this.$router.push('/dashboard')
      } else {
        this.$message.error(res.message);
      }
    }).catch(err => {
      console.error(err)
    })
  } else {
    return false;
  }
}

在成功登录后跳转到Dashboard页面并显示菜单导航,如下:

<template>
  <el-container>
    <el-aside width="200px">
      <router-link to="/dashboard">Dashboard</router-link>
      <router-link to="/user">用户管理</router-link>
    </el-aside>
    <el-container>
      <el-header>Header</el-header>
      <el-main>Main</el-main>
    </el-container>
  </el-container>
</template>

<script>
export default {
  name: "DashboardPage",
};
</script>

<style scoped></style>

在router/index.js中添加Dashboard页路由和路由守卫:

import { createRouter, createWebHistory } from 'vue-router'
import LoginPage from '@/views/LoginPage.vue'
import DashboardPage from '@/views/DashboardPage.vue'

const routes = [
  {
    path: '/',
    name: 'Login',
    component: LoginPage
  },
  {
    path: '/dashboard',
    name: 'Dashboard',
    component: DashboardPage,
    meta: {
      requiresAuth: true
    }
  }
]

const router = createRouter({
  history: createWebHistory(process.env.BASE_URL),
  routes
})

router.beforeEach((to, from, next) => {
  const token = window.localStorage.getItem('token')

  if (to.meta.requiresAuth && !token) {
    next('/')
  } else {
    next()
  }
})

export default router

添加路由守卫后,若本地没有存储token,则无法进入Dashboard页,会被跳转到登录页。

三、示例

  1. 登录接口返回的JSON数据格式示例:
{
  "code": 200,
  "message": "登录成功",
  "data": {
    "token": "eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwicm9sZXMiOlt7InVzZXJuYW1lIjoibG9uZyJ9XSwiaWF0IjoxNTE2MjM5MDIyfQ.sFOlsffBYyVBvCY6JPJT2z80T8Xbc1I5FjCO2PNn1UY",
    "user": {
      "id": 1,
      "username": "long",
      "roles": ["管理员"]
    }
  }
}
  1. Dashboard页路由守卫的示例:

当没有登录时,访问Dashboard会被拒绝并跳转回登录页。

router.beforeEach((to, from, next) => {
  const token = window.localStorage.getItem('token')

  if (to.meta.requiresAuth && !token) {
    next('/')
  } else {
    next()
  }
})

以上便是“基于Vue3和element-plus实现登录功能(最终完整版)”的实现步骤及示例,希望对您有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:基于Vue3和element-plus实现登录功能(最终完整版) - Python技术站

(0)
上一篇 2023年5月28日
下一篇 2023年5月28日

相关文章

  • vue 之 .sync 修饰符示例详解

    下面详细讲解“vue 之 .sync 修饰符示例详解”。 概述 在 Vue.js 中,有一种特殊的语法糖,叫做“v-bind”的“.sync”修饰符。使用“.sync”修饰符可以实现父子组件之间的双向绑定。在本文中,我们将学习如何使用“.sync”修饰符来实现双向数据绑定。 示例一:父组件向子组件传递数据 在这个示例中,我们将创建一个父组件和一个子组件,父组…

    Vue 2023年5月29日
    00
  • vuex的数据渲染与修改浅析

    下面为你详细讲解“vuex的数据渲染与修改浅析”的完整攻略。 1. vuex的基本概念 Vuex是Vue.js的状态管理,提供了在单个、简洁和易于管理的store中管理所有应用程序的状态。store实际上就是一个容器,它就像一个全局变量,让我们可以在应用中的任何组件之间共享数据。 2. Vuex的核心概念 Vuex包含四个核心概念:state(状态)、mut…

    Vue 2023年5月28日
    00
  • 详解如何在Vue项目中发送jsonp请求

    下面是在Vue项目中发送jsonp请求的详细攻略。 什么是JSONP? JSONP(JSON with Padding)是一种在前端领域经常使用的跨域请求数据的技术。由于同源策略的限制,浏览器通常不能跨域请求数据,而JSONP是利用<script>标签可以跨域加载资源的特性,实现跨域请求数据的。 JSONP请求的URL地址一般是类似callbac…

    Vue 2023年5月28日
    00
  • nginx配置wss协议的实现

    要实现Nginx配置wss(WebSocket Secure)协议,需要按照以下步骤进行操作: 前置条件: 已安装 Nginx 1.4.0 或更高版本。 已安装 OpenSSL 1.0.1e 或更高版本。 已安装 PCRE 8.21 或更高版本。 安装 Nginx 参考官方文档或安装向导完成安装。 安装 OpenSSL 和 PCRE 使用官方安装向导或你系统…

    Vue 2023年5月28日
    00
  • Vue项目中使用setTimeout存在的潜在问题及解决

    在Vue项目中使用setTimeout存在一个潜在的问题:在Vue组件销毁之前,setTimeout的回调函数可能还会被触发,这样就可能导致潜在的内存泄漏或出现意想不到的行为。本文将为您提供解决这一问题的完整攻略,并通过两个实例进行详细说明。 问题描述 在Vue组件中,我们可能会使用定时器来执行一些异步操作,例如延时关闭提示框。然而,定时器在Vue组件销毁时…

    Vue 2023年5月29日
    00
  • axios如何取消重复无用的请求详解

    当我们使用 axios 发送请求时,可能会出现多次发送同样的请求,这种情况可能会降低我们应用的性能。因此我们需要控制请求的发送,以避免重复无用的请求。 使用 axios 取消请求有 3 种方式: 使用 CancelToken 取消请求。 const CancelToken = axios.CancelToken; let cancel; axios.get(…

    Vue 2023年5月28日
    00
  • Vue对象的深层劫持详细讲解

    Vue对象的深层劫持详细讲解 Vue.js是一个JavaScript框架,可以用于基于MVVM模式的Web应用程序开发。其中最重要的部分是Vue对象(Vue实例),它是Vue应用程序的根实例,并且通过对Vue对象进行劫持可以实现响应式数据绑定。在Vue.js中,有两种类型的数据劫持:深层劫持和浅层劫持。本文将详细讲解深层劫持及其使用方法。 什么是深层劫持? …

    Vue 2023年5月28日
    00
  • Vue中.vue文件比main.js先执行的问题及解决

    在Vue项目中,经常会遇到.vue文件比main.js先执行的问题,并且该问题可能会导致程序运行失败或运行结果异常。下面是解决该问题的完整攻略。 问题描述 在Vue项目的main.js文件中,我们通常使用Vue框架的实例化方法来启动整个应用程序。然而,在某些情况下,我们需要在main.js文件中引入.vue文件,并且在实例化Vue应用程序之前使用该文件中的组…

    Vue 2023年5月28日
    00
合作推广
合作推广
分享本页
返回顶部