Vue3+TypeScript二次封装axios

news2024/12/24 0:02:03
安装如下
npm install axios

第一步:创建config配置文件,用于存放请求后端的ip地址,用于后期打包后便于修改ip地址。

注:typescript要求参数要有类型。(ES6 定义对象 属性 类型 修改的是属性的值)

interface Config {
    getCookieExpires(): number;
    getBaseIP(): string;
    getBaseUrl(): string;
    getSQLServerBaseUrl(): string;
}

const config: Config = {
    getCookieExpires() {
        return 5;
    },
    getBaseIP() {
        const developmentIP = "";
        return developmentIP;
    },
    getBaseUrl() {
        const developmentUrl = `http://${this.getBaseIP()}:8580/edu_examandmanage_back`;
        return developmentUrl;
    },
    getSQLServerBaseUrl() {
        const developmentSQLServerUrl = `http://${this.getBaseIP()}:9191/edu_examandmanage_back`;
        return developmentSQLServerUrl;
    },
};

export default config;


 

第二步:封装axios于http文件中

注:{ type AxiosInstance, type AxiosResponse }要用type

import axios, { type AxiosInstance, type AxiosResponse } from "axios"
import config from '@/config';




const http:AxiosInstance = axios.create({
    baseURL: config.getBaseUrl(),
    timeout: 30000, // 请求超时时间
    headers: {'Content-Type': 'application/json'}
});

// 请求拦截器
http.interceptors.request.use(
    (config) => {
        const token = sessionStorage.getItem('token');
        if (token) {
            config.headers.Authorization = `Bearer ${token}`;
        }
        return config;
    },
    (error) => Promise.reject(error)
);

// 响应拦截器
http.interceptors.response.use(
    (response) => response,
    (error) => {
        if (error.response?.status === 403) {
            // 处理权限错误
        }
        return Promise.reject(error);
    }
);

export default http;

第三步:调用http实现get、post、delete、put方法

// 公共请求
import http from 'src/lib/http'

export const ProcessApi = {
    // 根据ID获取仪器进度
    GetInstrumentProgressById(id:number) {
        return http.get(`/api/progress/getInstrumentProgressById?id=${id}`);
    },

    // 根据UserName获取仪器进度
    getInstrumentProgressByUserNumber(user_number:number) {
        return http.get(`/api/progress/getInstrumentProgressByUserNumber?user_number=${user_number}`);
    },
};

第四步:引入在单页面使用(根据组件化开发模式不需要全局注册,只需要在需要的地方引用就可以了)

以下为vue2+JavaScript版本

config.js

//全局配置信息
const config =  {
  //token在Cookie中存储的天数,默认7天
  getCookieExpires(){
    return 5;
  },
  getBaseIP(){
    const developmentIP = "";
    return developmentIP;
  },
  getBaseUrl(){
    const developmentUrl = "http://" + this.getBaseIP() + ":8580/edu_examandmanage_back";
    // const developmentUrl = "http://localhost:8580/edu_examandmanage_back";
    return developmentUrl;
  },

  getSQLServerBaseUrl(){
    const developmentSQLServerUrl = "http://" + this.getBaseIP() + ":9191/edu_examandmanage_back";
    // const developmentUrl = "http://localhost:9191/edu_examandmanage_back";
    return developmentSQLServerUrl;
  },

};

export default config;

http.js

import axios from 'axios';
import config from '../config';
import Vue from 'vue';


// Create an Axios instance
const http = axios.create({
  timeout: 30000, // Request timeout
  baseURL: config.getBaseUrl(),
  headers: {
    'Content-Type': 'application/json;charset=UTF-8',
  },
});

// Add a request interceptor
http.interceptors.request.use(
    (config) => {
      // Get the token from localStorage
      const token = sessionStorage.getItem('token');

      // If the token exists, add it to the Authorization header
      if (token) {
        config.headers.Authorization = `Bearer ${token}`;
      }

      return config;
    },
    (error) => {
      return Promise.reject(error);
    }
);


// Add a response interceptor
http.interceptors.response.use(
    (response) => {
        return response;
    },
    (error) => {
        // Check if the error response status is 403
        if (error.response && error.response.status === 403) {
            // Use Vuesax to display a notification
            Vue.prototype.$vs.notification({
                title: '权限错误',
                text: '请叫管理员开通权限。',
                color: 'danger', // Set the notification color
                position: 'top-center',
                duration: 4000, // Duration in milliseconds
            });
        }

        return Promise.reject(error);
    }
);

export default http;

 ExamApi.js

// 公共请求
import http from '@/lib/http';
export const ExamApi = {
    UserNeedExamByUserNumber(UserNumber){
        return http.get('/exam/UserNeedExamByUserNumber', { params: { UserNumber } });
    },
    SelectAllQustionByPaperIdUpdate(PaperId){
        return http.get('/exam/SelectAllQustionByPaperIdUpdate', { params: { PaperId } });
    },
    insertRecordFromStartExam(data) {
        return http.post('/exam/insertRecordFromStartExam', JSON.stringify(data));
    },
    insertUserAnswerAndSubmitExamToAddScore(data) {
        return http.post('/exam/insertUserAnswerAndSubmitExamToAddScore', JSON.stringify(data));
    },
    SelectAllQustionFromStore(QuestionId){
      return http.get('/exam/SelectAllQustionFromStore', { params: { QuestionId } });
    },
    addQuestions(data) {
        return http.post('/exam/addQuestions', JSON.stringify(data));
    },
    getUserAnswers(id){
        return http.get('/exam/RecordAllExamInfoById', { params: { id } });
    },
    delteRecordByClassName(classname){
        return http.post('/exam/delteRecordByClassName', classname);
    },

    SelectAllExamInfoByUserNumber(ExamUserNumber){
        return http.get('/exam/SelectAllExamInfoByUserNumber', { params: { ExamUserNumber } });
    },


    SelectAllExamInfo(){
        return http.get('/exam/SelectAllExamInfo');
    },
    DeleteQustionByQuestionId(QuestionId){
        return http.get('/exam/DeleteQustionByQuestionId', { params: { QuestionId } });
    },




    //组卷模块
    GetAllPaperInfo(){
        return http.get('/exam/GetAllPaperInfo');
    },
    DeleteAnPaper(paperId){
        return http.get('/exam/DeleteAnPaper', { params: { paperId } });
    },
    GenerateAnPaperController(data) {
        return http.post('/exam/GenerateAnPaperController', JSON.stringify(data));
    },
    deleteImageFile(ImageName) {
        return http.delete("/upload/deleteImageFile", {
            params: {
                ImageName: ImageName
            }
        });
    }
}

main.js

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

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

相关文章

超级干货|AI产品经理6大知识体系,【附零基础小白入门指南】

想要转行AI产品经理的宝子,这6大知识体系是你入门的基础 💥基础知识:AI产品的根基 💥平台和硬件支持:AI产品的技术基础设施 💥AI核心技术:推动产品创新的引擎 💥行业实践应用&#…

Python计算机视觉 第8章-图像内容分类

Python计算机视觉 第8章-图像内容分类 8.1 K邻近分类法(KNN) 在分类方法中,最简单且用得最多的一种方法之一就是 KNN(K-Nearest Neighbor ,K邻近分类法),这种算法把要分类的对象(例如一个特征…

知网合作商AEPH出版,学生/教师均可投稿,优先录用教育社科领域,往期最快2周见刊

AEPH出版社旗下有5本学术期刊,专门出版自然科学、社会科学研究与教育领域论文的高影响力期刊,拥有正规ISSN号,出版类型涉及应用和理论方面的原创和未曾公开发表的研究论文,分配独立DOI号。AEPH作为中国知网(CNKI&#…

COCOS:(飞机大战01)背景图无线循环向下滚动

飞机大战知识点总结 背景图宽高:480*852 将背景图移动到Canvas中 设置图2的Y轴为852,这样图1和图2就衔接上了 创建控制背景的ts文件 import { _decorator, Component, Node } from cc; const { ccclass, property } _decorator;ccclass(Bg) export cla…

HTTPS证书申请

🌐 JoySSL CA机构 机构介绍:JoySSL是网盾安全基于全球可信顶级根创新推出的新一代https数字证书,也是目前为数不多的中国自主品牌SSL证书。 服务特点:JoySSL携手全球权威CA机构,全球多节点服务器验证签发,安…

MySQL系列—8.存储结构

目录 1.系统表空间 ibdata 2.通用表空间 .ibd 3.独立表空间 4.Undo 表空间 5.临时表空间 6.Redo Log File 1.系统表空间 ibdata 系统表空间由参数innodb_data_file_path定义路径、初始化大小、自动扩展策略 如: innodb_data_file_path/dayta/mysql/ibdata1:…

【机器学习】C++与OpenCV实战:创建你的第一个图片显示程序

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 前言 在计算机视觉领域,OpenCV是一个非常强大的开源库,它提供了大量的图像处理和计算机视觉功能。C与Op…

这次我可真没手写代码

我是一个平平无奇的程序员,兢兢业业地做着公司的需求,直到那天,一位十年见过两面的亲戚突然找上门,他说: 小Z啊,听说你是学计算机的对吧。 听完这话,我当场汗流浃背,这不是让我上门修…

Web组件:Servlet Listener Filter

1 前言 1.1 内容概要 掌握ServletContextListener的使用,并且理解其执行时机掌握Filter的使用,并且理解其执行时机能够使用Filter解决一些实际的问题 1.2 前置知识准备 Servlet的执行 ServletContext的功能和使用 2 Web组件 JavaEE的三大Web组件 …

Aigtek功率放大器在超声检测陶瓷复合材料内部缺陷中的应用

2023年5月30日,神舟十六号载人飞船于9时28分左右在酒泉基地正式发射。本次神舟十六号最引人注目的一点就是它的元件国产率相较之前是大大提高了。选择提高自主研发能力,一方面是防范他国在技术、贸易上的“卡脖子”隐患,一方面也是我国制造实…

【智慧物流】新中地智慧城市实训:优秀学生项目作品1

实训结束后,同学们在最后的答辩中纷纷展现了自己的优秀成果,并以小组的形势进行汇报。今天截取部分学生优秀作品给大家进行展示,帮助大家快速了解智慧系列项目的效果。 智慧城市开发项目主题:智慧物流 (为保护学生隐…

亲测好用,ChatGPT 3.5/4.0新手使用手册,最好论文指令手册~ 【2024年9月 更新】

本以为遥遥领先的GPT早就普及了,但小伙伴寻找使用的热度一直高居不下,其实现在很简单了! 国产大模型快200家了,还有很多成熟的国内AI产品,跟官网一样使用,还更加好用~ ① 3.5 大多数场景是够用的&#xff…

热门运动耳机品牌有哪些?精选五款骨传导耳机运动好物分享

随着人们对于听力和健康问题的重视,不管是日常、运动还是游泳骨传导耳机逐渐成为了更健康、便捷的听音方式。因为行业的爆火,骨传导耳机市场的竞争也是非常激烈,有很多没有专业技术沉淀的品牌也来做骨传导耳机想吃这波红利,很容易…

SysML图例-混合动力SUV

DDD领域驱动设计批评文集>> 《软件方法》强化自测题集>> 《软件方法》各章合集>>

swagger-bootstrap-ui页面空白,也没报错

回想起来,代码层面没有进行什么大的调整,增加了配置文件,application.yml中的 spring:profiles:active: sms # dev --> smsname: sms-server swagger配置未调整导致空白 修改profile 问题解决

.htaccess防火墙,Nginx防火墙,Apache防火墙,WEB防火墙,网站防火墙

.htaccess防火墙,Nginx防火墙,Apache防火墙,WEB防火墙,网站防火墙 对此域的请求通过 Apache 处理。 在 nginxdev.com 测试 Nginx 服务器上的防火墙 防火墙代码: # 资源宝分享:www.httple.net # 8G FIREWA…

当你忘记很久前的 DJANGO + UWSGI 项目是怎么启动的

在后端项目代码推到云服务器后,通常需要手动重启相关服务才会更新生效。 本人生产环境中用的是UWSGI服务器,更新步骤如下: 文章目录 UWSGI服务启动方式SYSTEMCTL 命令查看查看当前运行的 UWSGI 进程其他:查看 UWSGI 日志文件 重启…

基于Vue框架的娱爆新闻网站的设计与实现---附源码80930

目 录 摘要 1 绪论 1.1研究背景与意义 1.2国内外研究现状 1.3研究内容 1.4论文结构与章节安排 2 娱爆新闻网站系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1数据增加流程 2.2.2数据修改流程 2.2.3数据删除流程 2.3 系统功能分析 2.3.1 功能性分析 2.3.2 非功…

Redis面试必问:Redis为什么快?Redis五大基本数据类型

请记住胡广一句话,所有的中间件所有的框架都是建立在基础之上,数据结构,计算机网络,计算机原理大伙一定得看透!!~ 1. Redis快的秘密 相信大部分Redis初学者都会忽略掉一个重要的知识点,Redis…

计算机网络 ---如何寻找目标计算机

序言 在没有产生网络之前,单个主机就像汪洋大海之间的一个孤岛,和其他主机之间没有任何联系。但随着需求的产生,免不了两台主机之间需要产生交流(传送数据等)。离得近的两台主机之间搭一根网线就能够解决,但…