vue_02

news2024/11/17 12:49:23

文章目录

  • 安装axios
  • 配置响应拦截器(对响应做统一处理)
  • 解决跨域问题
  • 登录token问题
    • 首先在Login.vue中添加下列代码
    • 然后在api.js中添加请求拦截器
  • 页面加载动画的添加
  • 请求方式的全局配置
    • 在api.js中添加四种请求
    • 在main.js中配置全局
  • Login.vue完成代码

安装axios

npm install axios -S

在这里插入图片描述

配置响应拦截器(对响应做统一处理)

在这里插入图片描述

在这里插入图片描述

import axios from "axios";

// 单独引用 message
// 后序调用 弹窗用 Message.success({message:})  或 Message.error({message:})
import {Message} from 'element-ui';

// 引入路由  跳转页面的时候用到
import router from "@/router";


// 响应拦截器
// success.data 后端返回的数据(JSON对象)
axios.interceptors.response.use(success => {
    // 业务逻辑错误
    if (success.status && success.status == 200) {
        if (success.data.code == 500 || success.data.code == 401 || success.data.code == 403) {
            // 错误弹窗
            Message.error({message: success.data.message});
            return;
        }
        if (success.data.message) {
            // 成功弹窗
            Message.success({message: success.data.message});
        }
    }
    return success.data;
}, error => {
    if (error.response.code == 504 || error.response.code == 404) {
        Message.error({message: '服务器错误'});
    } else if (error.response.code == 403) {
        Message.error({message: '权限不足'});
    } else if (error.response.code == 401) {
        Message.error({message: '请登录'});
        // 跳转到 指定页面下
        router.replace('/');
    } else {
        if (error.response.data.message) {
            Message.error({messag: error.response.data.message});
        } else {
            Message.error({message: '未知错误'});
        }
    }
    return;
});

解决跨域问题

在这里插入图片描述
在这里插入图片描述

登录token问题

首先在Login.vue中添加下列代码

const tokenStr = resp.obj.tokenHead + resp.obj.token;
// 存储用户 token
window.sessionStorage.setItem('tokenStr', tokenStr);

然后在api.js中添加请求拦截器

axios.interceptors.request.use(config => {
    // 如果存在token,则请求头 携带这个token
    if (window.sessionStorage.getItem('tokenStr')) {
        config.headers['Authorization'] = window.sessionStorage.getItem('tokenStr');
    }
    return config;
}, error => {
    console.log(error);
});

页面加载动画的添加

在data的return里面添加  fullscreenLoading: false,   //加载动画开关

在methods的登录事件中添加
 // 加载动画添加
this.fullscreenLoading = true;
     setTimeout(() => {
         this.fullscreenLoading = false;
     }, 1000);

请求方式的全局配置

在api.js中添加四种请求

// 防止leader 让在页面路径前加东西
let base = '';

// 传送JSON格式的 post请求
export const postRequest = (url, params) => {
    return axios({
        method: 'post',
        url: `${base}${url}`,
        data: params
    })
}

// 传送JSON格式的 put请求
export const putRequest = (url, params) => {
    return axios({
        method: 'put',
        url: `${base}${url}`,
        data: params
    })
}

// 传送JSON格式的 get请求
export const getRequest = (url, params) => {
    return axios({
        method: 'get',
        url: `${base}${url}`,
        data: params
    })
}

// 传送JSON格式的 delete请求
export const deleteRequest = (url, params) => {
    return axios({
        method: 'delete',
        url: `${base}${url}`,
        data: params
    })
}

在main.js中配置全局

// 请求方式的全局配置  配置完成后 可以使用 this. 方式调用
import {postRequest} from "@/utils/api";
import {putRequest} from "@/utils/api";
import {getRequest} from "@/utils/api";
import {deleteRequest} from "@/utils/api";

Vue.prototype.postRequest = postRequest;
Vue.prototype.putRequest = putRequest;
Vue.prototype.getRequest = getRequest;
Vue.prototype.deleteRequest = deleteRequest;

Login.vue完成代码

<template>
  <el-form :rules="rules" :label-position="labelPosition" label-width="80px" :model="formLabelAlign"
           class="loginContainer" ref="loginForm">
    <h3 class="loginTitle">系统登录</h3>
    <el-form-item label="用户名" prop="username">
      <el-input v-model="formLabelAlign.username"></el-input>
    </el-form-item>
    <el-form-item label="密码" prop="password">
      <el-input v-model="formLabelAlign.password" type="password"></el-input>
    </el-form-item>
    <el-radio v-model="radio" label="1">管理员</el-radio>
    <el-radio v-model="radio" label="2">教师</el-radio>
    <el-radio v-model="radio" label="3">学生</el-radio>
    <br>
    <br>
    <el-button type="primary" style="width: 100%" @click="loginSubmit('loginForm')">登录</el-button>
  </el-form>
</template>

<script>
export default {
  name: "Login",
  data() {
    return {
      labelPosition: 'right',
      formLabelAlign: {
        username: '',
        password: ''
      },
      fullscreenLoading: false,   //加载动画开关
      radio: '1',  //默认选 管理员
      rules: {
        username: [
          {required: true, message: '请输入用户名', trigger: 'blur'},
          {min: 3, message: '长度大于3个字符', trigger: 'blur'}
        ],
        password: [
          {required: true, message: '请输入密码', trigger: 'blur'}
        ]
      }
    }
  },
  methods: {
    // ref 的 loginForm
    loginSubmit(loginForm) {
      this.$refs[loginForm].validate((valid) => {
        if (valid) {
          this.postRequest('/login', this.formLabelAlign).then(resp => {
            if (resp) {  // 如果请求成功 进行页面跳转
              const tokenStr = resp.obj.tokenHead + resp.obj.token;
              // 存储用户 token
              window.sessionStorage.setItem('tokenStr', tokenStr);

              // 加载动画添加
              this.fullscreenLoading = true;
              setTimeout(() => {
                this.fullscreenLoading = false;
              }, 1000);
              // 进行页面跳转
              this.$router.replace('/admin')
            }
          })
        } else {
          this.$message.error('用户名或密码不正确');
          return false;
        }
      });
    },

  }
}
</script>

<style>

.loginContainer {
  border-radius: 15px;
  background-clip: padding-box;
  margin: 180px auto;
  width: 350px;
  padding: 15px 35px 15px 35px;
  background: #fff;
  border: 1px solid #eaeaea;
  box-shadow: 0 0 25px #cac6c6;
}

.loginTitle {
  margin: 0px auto 40px auto;
  text-align: center;
}

</style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/442260.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

前端实战(三):element-ui的二次封装

目录 二次封装 Switch 开关 原始效果 设计效果 实现步骤 在日常开发过程中&#xff0c;大多数项目主要以 vue 为主&#xff0c;并且现在很多公司仍在使用着 vue。但在使用element-ui组件时通常会遇到一些问题&#xff1a;如组件样式与设计不符合、组件不存在某个功能等等&a…

都已经那么卷了,用户还需要开源的 API 管理工具么

关于 API 管理工具&#xff0c;如今的市场已经把用户教育的差不多了&#xff0c;毫不夸张地说&#xff0c;如果我随机抽取一位幸运读者&#xff0c;他都能给我罗列出一二三四款大家耳熟能详的工具。可说到开源的 API 管理工具&#xff0c;大家又能知道多少呢&#xff1f; 我们是…

计算机网络复习题+答案

文章目录 导文题目一、单项选择题二、填空题三、判断改错题,判断下列命题正误,正确的在其题干后的括号内打“√”,错误的打“”,并改正。四、名词解释五、简答题六、应用题导文 计算机网络复习题 题目 一、单项选择题 在应用层协议中,主要用于IP地址自动配置的协议是: (…

一文讲清莱迪斯 LCMXO2-4000HC-4BG256I 可编程逻辑FPGA 特性及运用领域

一文讲清lattice莱迪斯深力科 LCMXO2-4000HC-4BG256I 可编程逻辑FPGA 特性及运用领域 适用于低成本的复杂系统控制和视频接口设计开发&#xff0c;满足了通信、计算、工业、消费电子和医疗市场所需的系统控制和接口应用。 瞬时启动&#xff0c;迅速实现控制——启动时间小于1m…

605. 种花问题

假设有一个很长的花坛&#xff0c;一部分地块种植了花&#xff0c;另一部分却没有。可是&#xff0c;花不能种植在相邻的地块上&#xff0c;它们会争夺水源&#xff0c;两者都会死去。 给你一个整数数组 flowerbed 表示花坛&#xff0c;由若干 0 和 1 组成&#xff0c;其中 0…

Mybatis核心组件简介

文章目录 前言一、Configuration二、MappedStatement三、SqlSession四、Executor五、StatementHandler六、ParameterHandler七、ResultSetHandler八、TypeHandler总结 前言 SqlSession是MyBatis提供的面向用户的操作数据库API。那么MyBatis底层是如何工作的呢&#xff1f;为了…

2. VBA Excel宏

在本章中&#xff0c;我们来学习如何逐步编写一个简单的宏。 第1步 - 首先&#xff0c;在Excel 2016中启用“开发者”菜单。要完成这个设置&#xff0c;请点击左上角菜单&#xff1a;文件 -> 选项。如下图所示 - 第2步 - 点击“自定义功能区”选项卡并选中“开发工具”。然…

Pulumi实战 | 一款架构即代码的开源产品

新钛云服已累计为您分享741篇技术干货 本篇文章&#xff0c;主要介绍 Pulumi 是什么以及它的相关原理&#xff0c;并且使用它搭建一个 Nacos 和 SpringBoot 的环境&#xff01; 一、Pulumi 诞生 &#xff08;一&#xff09;诞生原因 Pulumi 是一个架构即代码的开源产品&#xf…

学系统集成项目管理工程师(中项)系列09_收尾管理

1. 广义 1.1. 项目验收工作 1.2. 项目总结工作 1.3. 系统维护工作 1.4. 项目后评价工作 1.5. 项目团队成员的后续工作 2. 狭义 2.1. 项目验收工作 3. 项目验收 3.1. 首要环节 3.2. 包括验收项目产品、文档及已经完成的交付成果 3.3. 需要完成正式的验收报告 3.3.1.…

STM32使用PWM(脉冲宽度调制)

STM32使用PWM&#xff08;脉冲宽度调制&#xff09; 一、PWM概述二、STM32的PWM分析三、PWM产生的流程示例代码 一、PWM概述 脉冲宽度调制(PWM)&#xff0c;是英文“Pulse Width Modulation”的缩写&#xff0c;简称脉宽调制&#xff0c;是利用微处理器的数字输出&#xff08;…

记录关于GPT的应用

一.AutoGPT chatgpt是一问一答的形式&#xff0c;autogpt则是输入需要做的东西以及几个目标&#xff0c;例如&#xff1a; Enter y to authorise command, y -N to run N continuous commands, n to exit program, or enter feedback for .. 注意&#xff1a;openai账户里应该…

Flink高手之路6-Flink四大基石

文章目录 Flink四大基石一、Flink的四大基石1. Checkpoint2. State3. Time4. Window 二、案例1.需求2.代码实现3.运行&#xff0c;查看结果4.增加需求2的实现5.重启程序&#xff0c;查看结果 Flink四大基石 一、Flink的四大基石 Flink之所以能这么流行&#xff0c;离不开它最…

python和PyTorch知识

解包操作 可变参数和关键字参数是 Python 函数的两种参数类型。 b, *_ t.shape python中这个用法是什么意思 我们使用 _” 来“忽略”一个或多个值&#xff08;表示我们不需要这些值&#xff09;&#xff0c;然后将“t.shape”元组的第一个元素赋值给变量“b”。 pytorc…

使用ChatGPT的方法和替代方案

作为互联网应用&#xff0c;ChatGPT也有国内化的替代方案。在国内&#xff0c;一些公司已经开始利用深度学习技术开发本地化的语言模型&#xff0c;例如阿里巴巴的通义千问、华为的盘古大语言模型&#xff0c;以及百度的文心一言等等&#xff0c;这些模型可以完成自然语言处理任…

javassist 字节码处理库

目录 一、快速入门 1.1 创建class文件1.2 ClassPool的相关方法1.3 CtClass的相关方法1.4 CtMethod的相关方法1.5 调用生成的类对象 1.5.1 通过反射调用1.5.2 通过接口调用1.6 修改现有的类对象二、将类冻结三、类搜索路径四、$开头的特殊字符五、ProxyFactory的使用 我们知道J…

论文排版怎么排?教您3分钟搞定!

案例&#xff1a;如何对论文进行排版&#xff1f; 【我把写好的毕业论文交给老师检查&#xff0c;老师说我的格式不正确&#xff0c;叫我按照正确的格式进行排版修改。如何对论文进行排版&#xff1f;有没有小伙伴知道论文的正确格式&#xff1f;】 临近毕业&#xff0c;很多…

3.java程序员必知必会类库之junit

前言 单元测试技术的使用&#xff0c;是区分一个一般的开发者和好的开发者的重要指标。程序员经常有各种借口不写单元测试&#xff0c;但最常见的借口就是缺乏经验和知识。常见的单测框架有 JUnit , Mockito 和PowerMock 。本文就Junit展开介绍。 1.介绍 JUnit 是一个 Java …

webservice使用帮助手册

什么是Webservice 简单讲就是一种RPC的实现方式 参考&#xff1a;WebService是什么 SOAP1.1和SOAP1.2的区别 参考&#xff1a;https://www.cnblogs.com/yefengmeander/p/4176771.html 发布Webservice服务 1.用WebService编写一个webservice服务 2. 发布服务 3. 查看发布…

实现匹配搜索词高亮(Vue3)

1.使用插件实现&#xff08;ohlight&#xff09; (1).下载插件 // pnpm pnpm i ohlight // npm npm i ohlight // yarn yarn add ohlight如果让选择版本就按照提示的版本选择 (2).基本使用 >1.(Vue3)的使用 首先在vite.config.js中加入以下代码&#xff1a; export de…

AD9208调试经验分享

背景概述 FMC137 是一款基于 VITA57.4 标准规范的 JESD204B 接口FMC 子 卡 模 块 &#xff0c; 该 模 块 可 以 实 现 4 路 14-bit 、 2GSPS/2.6GSPS/3GSPSADC 采集功能。该板卡 ADC 器件采用 ADI 公司的 AD9208 芯片&#xff0c;&#xff0c;与 ADI 公司的 AD9689 可以实现 …