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

yizhihongxing

接下来我将为您讲解“基于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-cli3没有vue.config.js文件夹及配置vue项目域名的问题

    下面是详细讲解“解决Vue-cli3没有vue.config.js文件夹及配置vue项目域名的问题”的完整攻略。 解决Vue-cli3没有vue.config.js文件夹的问题 Vue-cli3是一个快速构建Vue项目的脚手架工具,但有时可能会出现没有vue.config.js文件夹的情况。出现这种情况的原因可能是我们没有手动创建该文件夹,或者我们的项目是从…

    Vue 2023年5月28日
    00
  • vue组件文档(.md)中如何自动导入示例(.vue)详解

    要在Vue组件文档(.md)中自动导入示例(.vue),需要安装vue-styleguidist这个插件。接下来,我们以vue-cli3创建的项目为例,来讲解如何实现自动导入示例。 第一步:安装vue-styleguidist插件 首先,在项目根目录下使用npm命令行安装vue-styleguidist插件。 npm install vue-stylegui…

    Vue 2023年5月28日
    00
  • Vue.Js及Java实现文件分片上传代码实例

    我来为你详细讲解Vue.js及Java实现文件分片上传代码实例的完整攻略。 背景知识 在介绍代码实现前,先了解一下文件分片上传的概念。文件分片上传是指将文件划分为多个小块,通过异步上传的方式逐一上传,直到整个文件全部上传完毕。这种方式可以有效地提高大文件的上传速度和稳定性。 Vue.js实现文件分片上传 前端代码实现 首先,在Vue.js中使用axios库发…

    Vue 2023年5月28日
    00
  • 理顺8个版本vue的区别(小结)

    当我们学习Vue.js时,会发现有多个版本可供选择,例如Vue.js 1.x、Vue.js 2.x、Vue.js 3.x等版本。那么这些版本之间有什么区别呢?下面我将帮助你详细理顺这些版本之间的差异。 Vue.js 1.x版本 Vue.js 1.x版本是第一版Vue.js发布的版本,该版本主要特点是可以直接在HTML页面中使用Vue.js,并支持很多便捷的指…

    Vue 2023年5月27日
    00
  • 八种vue实现组建通信的方式

    以下是八种Vue实现组件通信的完整攻略: 1. Props Props是Vue组件间通信中最常用的一种方式。Props允许父组件向子组件传递数据,可以通过在子组件中声明props选项来接收父组件传递的值。示例代码如下: <!–父组件模版–> <template> <Child :msg="message"…

    Vue 2023年5月29日
    00
  • 为什么vue中不建议使用空字符串作为className

    在Vue中使用类名时,应尽量避免空字符串作为类名,以下是原因及解决方案: 1. 空字符串无法清除类名 在Vue中使用 v-bind:class 绑定类名时,空字符串会被视为有效的类名。当我们通过更改 data 中的属性值来更改类名时,空字符串也会作为一个类名被添加。但是,一旦添加上了空字符串,就无法通过更改该属性值来清除这个空字符串类名。 示例代码: &lt…

    Vue 2023年5月27日
    00
  • vue使用video插件vue-video-player的示例

    下面是使用Vue.js框架中的插件vue-video-player的示例攻略: 准备工作 在开始之前,你需要先安装Vue.js和vue-video-player插件。如果你还没有安装这两个工具,请参考以下命令进行安装: # 安装 Vue.js npm install vue # 安装 vue-video-player npm install vue-vide…

    Vue 2023年5月27日
    00
  • 想到头秃也想不到的Vue3复用组件还可以这么hack的用法

    当我们在开发Vue应用时,需要多次使用同样的组件,此时我们可以使用组件复用来简化代码并提高开发效率。Vue3提供了更为灵活的组件复用方式,下面就是Vue3复用组件的hack用法攻略。 局部注册组件 我们可以在Vue模板中使用局部注册组件的方式来重复使用同一个组件,这种方式只有在当前组件内部可用。 <template> <div> &l…

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