首页 > 其他分享 >Vue3+Vite+Axios Request 请求封装(TS版本)最新

Vue3+Vite+Axios Request 请求封装(TS版本)最新

时间:2024-03-30 14:33:20浏览次数:14  
标签:Axios string Request TS break error msg ElMessage data

Vue3+Vite+Axios Request 请求封装(TS版本)

http > index.ts 请求封装

/*
 * @Date: 2024-03-30 12:37:05
 * @LastEditors: zhong
 * @LastEditTime: 2024-03-30 14:12:52
 * @FilePath: \app-admin\src\http\index.ts
 */
import axios, { AxiosInstance, AxiosRequestConfig, AxiosResponse, InternalAxiosRequestConfig } from "axios";
import { ElMessage } from "element-plus";

// axios 请求配置
const config = {
    // baseURL:'http://localhost:8080',
    baseURL: '/api',
    timeout: 1000
}
// 定义返回值类型
export interface Result<T = any> {
    code: number;
    msg: string;
    data: T;
}

class Http {
    // axios 实例
    private instance: AxiosInstance;
    // 构造函数初始化
    constructor(config: AxiosRequestConfig) {
        this.instance = axios.create(config);
        //定义拦截器
        this.interceptors();
    }
    private interceptors() {
        // axios 发送请求之前的处理
        this.instance.interceptors.request.use((config: InternalAxiosRequestConfig) => {
            // 在请求头部携带token
            // let token = sessionStorage.getItem('token');
            let token = '';
            if (token) {
                config.headers!['token'] = token;
                // 把 token 放到 headers 里面
                // (config.headers as AxiosRequestHeaders).token = token;
            }
            console.log(config);
            return config;

        }, (error: any) => {
            error.data = {};
            error.data.msg = '服务器异常,请联系管理员!'
            return error;
        })
        // axios 请求返回之后的处理
        // 请求返回处理
        this.instance.interceptors.response.use((res: AxiosResponse) => {
            // console.log(res.data);
            if (res.data.code != 200) {
                ElMessage.error(res.data.msg || '服务器出错啦');
                return Promise.reject(res.data.msg || '服务器出错啦');
            } else {
                return res.data;
            }
        }, (error) => {
            console.log('进入错误!');
            error.data = {};
            if (error && error.response) {
                switch (error.response.status) {
                    case 400:
                        error.data.msg = "错误请求";
                        ElMessage.error(error.data.msg);
                        break;
                    case 401:
                        error.data.msg = "未授权,请登录";
                        ElMessage.error(error.data.msg);
                        break;
                    case 403:
                        error.data.msg = "拒绝访问";
                        ElMessage.error(error.data.msg);
                        break;
                    case 404:
                        error.data.msg = "请求错误,未找到该资源";
                        ElMessage.error(error.data.msg);
                        break;
                    case 405:
                        error.data.msg = "请求方法未允许";
                        ElMessage.error(error.data.msg);
                        break;
                    case 408:
                        error.data.msg = "请求超时";
                        ElMessage.error(error.data.msg);
                        break;
                    case 500:
                        error.data.msg = "服务器端出错";
                        ElMessage.error(error.data.msg);
                        break;
                    case 501:
                        error.data.msg = "网络未实现";
                        ElMessage.error(error.data.msg);
                        break;
                    case 502:
                        error.data.msg = "网络错误";
                        ElMessage.error(error.data.msg);
                        break;
                    case 503:
                        error.data.msg = "服务不可用";
                        ElMessage.error(error.data.msg);
                        break;
                    case 504:
                        error.data.msg = "网络超时";
                        ElMessage.error(error.data.msg);
                        break;
                    case 505:
                        error.data.msg = "http版本不支持该请求";
                        ElMessage.error(error.data.msg);
                        break;
                    default:
                        error.data.msg = `连接错误${error.response.status}`;
                        ElMessage.error(error.data.msg);
                }
            } else {
                error.data.msg = "连接到服务器失败";
                ElMessage.error(error.data.msg)
            }
            return Promise.reject(error);
        })
    }
    // GET方法
    get<T = Result>(url: string, params?: object): Promise<T> {
        return this.instance.get(url, { params });
    }
    // POST方法
    post<T = Result>(url: string, data?: object): Promise<T> {
        return this.instance.post(url, data);
    }
    // PUT方法
    put<T = Result>(url: string, data?: object): Promise<T> {
        return this.instance.put(url, data );
    }
    // DELETE方法
    delete<T = Result>(url: string): Promise<T> {
        return this.instance.delete(url);
    }
}

export default new Http(config);

vite.config.ts 配置跨域

/*
 * @Date: 2024-03-24 15:19:01
 * @LastEditors: zhong
 * @LastEditTime: 2024-03-30 13:48:06
 * @FilePath: \app-admin\vite.config.ts
 */
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import { resolve } from 'path'

// https://vitejs.dev/config/
export default defineConfig({
  plugins: [vue()],server:{
    host: "0.0.0.0",   // 解决控制台: NextWork:use --host to expose
    port: 8080,
    hmr: true,  // 开启热更新
    open: true,  // 启动在浏览器打开
    proxy: {
      '/api': {
        target: 'http://localhost:9999',
        // target就是你要访问的目标地址,可以是基础地址,这样方便在这个网站的其他api口调用数据
        changeOrigin: true,
        rewrite: (path) => path.replace(/^\/api/, ''),
        // 要记得加rewrite这句
      },
    },
  },
  resolve: {
    alias: [
      {
        find: '@',
        replacement: resolve(__dirname, 'src')
      }
    ]
  }
})

user > UserModel.ts 用户数据模型

/*
 * @Date: 2024-03-30 13:16:03
 * @LastEditors: zhong
 * @LastEditTime: 2024-03-30 13:19:17
 * @FilePath: \app-admin\src\api\user\userModel.ts
 */
// 定义用户的数据类型

export type User = {
    userId?: string,
    username: string,
    password: string,
    nickName: string,
    phone: string,
    sex: string,
    status: string,
}

user > index.ts 请求函数

/*
 * @Date: 2024-03-30 13:15:25
 * @LastEditors: zhong
 * @LastEditTime: 2024-03-30 13:58:40
 * @FilePath: \app-admin\src\api\user\index.ts
 */
import http from "@/http";
import { User } from "./userModel";

// 新增
export const addAdminUserApi = (parm: User) => {
    console.log(parm);
    return http.post("/api/sysUser", parm)
}

AdminUser.vue 使用请求函数

<!--
 * @Date: 2024-03-24 18:14:27
 * @LastEditors: zhong
 * @LastEditTime: 2024-03-30 14:03:00
 * @FilePath: \app-admin\src\views\system\AdminUser.vue
-->
<template>
    <el-main>
        <!-- 搜索栏 -->
        <el-form :model="searchParm" ref="form" :inline="true" size="default">
            <el-form-item>
                <el-input v-model="searchParm.nickName" placeholder="请输入姓名"></el-input>
            </el-form-item>
            <el-form-item>
                <el-button icon="search">搜索</el-button>
                <el-button icon="closeBold" type="danger">重置</el-button>
                <el-button icon="plus" type="primary" @click="addBtn">新增</el-button>

            </el-form-item>
        </el-form>
        <!-- 新增 -->
        <SystemDialog :title="dialog.title" :height="dialog.height" :width="dialog.width" :visible="dialog.visible"
            @on-close="onClose" @on-confirm="commit">
            <template v-slot:content>
                <!-- 新增内容表单 -->
                <el-form :model="addAdminParm" ref="addRef" :rules="rules" label-width="80px" :inline="false"
                    size="default">
                    <el-form-item prop="nickName" label="姓名:">
                        <el-input v-model="addAdminParm.nickName"></el-input>
                    </el-form-item>
                    <el-form-item prop="sex" label="性别:">
                        <el-radio-group v-model="addAdminParm.sex">
                            <el-radio value="1" size="large" border>男</el-radio>
                            <el-radio value="2" size="large" border>女</el-radio>
                        </el-radio-group>
                    </el-form-item>
                    <el-form-item prop="phone" label="电话:">
                        <el-input v-model="addAdminParm.phone"></el-input>
                    </el-form-item>
                    <el-form-item prop="username" label="账号:">
                        <el-input v-model="addAdminParm.username"></el-input>
                    </el-form-item>
                    <el-form-item prop="password" label="密码:">
                        <el-input v-model="addAdminParm.password"></el-input>
                    </el-form-item>
                    <el-form-item prop="status" label="状态:">
                        <el-radio-group v-model="addAdminParm.status">
                            <el-radio value="1" size="large" border>启用</el-radio>
                            <el-radio value="2" size="large" border>停用</el-radio>
                        </el-radio-group>
                    </el-form-item>
                </el-form>

            </template>
        </SystemDialog>

    </el-main>
</template>

<script setup lang="ts">
import { reactive, ref } from 'vue';
import SystemDialog from '@/components/SystemDialog/SystemDialog.vue';
import useDialog from '@/hooks/useDialog';
import { ElMessage, FormInstance } from 'element-plus';
import { addAdminUserApi } from '@/api/user'

// 获取弹框属性
const { dialog, onClose } = useDialog();

// 搜索绑定对对象
const searchParm = reactive({
    nickName: ""
})
// 表单 ref 属性
const addRef = ref<FormInstance>()

// 新增按钮
const addBtn = () => {
    dialog.height = 320;
    dialog.visible = true;
}
// 新增表单内容
const addAdminParm = reactive({
    userId: "",
    username: "",
    password: "",
    nickName: "",
    phone: "",
    sex: "",
    status: ""

})
// 表单验证规则
const rules = {
    nickName: [
        { required: true, message: '请填写您的昵称', trigger: 'blur' },
        { min: 0, max: 12, message: 'Length should be 0 to 12', trigger: 'blur' },
    ],
    sex: [{ required: true, message: '请选择您的性别', trigger: 'blur' }],
    phone: [{ required: true, message: '请输入手机号', trigger: 'blur' }],
    userName: [{ required: true, message: '请输入账号', trigger: 'blur' }],
    userPassword: [{ required: true, message: '请输入密码', trigger: 'blur' }],
    status: [{ required: true, message: '请选择账号状态', trigger: 'blur' }],
}
// 提交表单
const commit = () => {
    addRef.value?.validate(async (valid) => {
        if (valid) {
            // 提交数据
            const res = await addAdminUserApi(addAdminParm);
            if (res && res.code == 200) {
                // 信息提示
                ElMessage.success(res.msg);
                // 提交成功 关闭弹框
                dialog.visible = false;
            }
        }
    });
}
</script>

<style lang="scss" scoped></style>

标签:Axios,string,Request,TS,break,error,msg,ElMessage,data
From: https://blog.csdn.net/weixin_56050344/article/details/137172550

相关文章

  • SQL95 从 Products 表中检索所有的产品名称以及对应的销售总数(sum() ,group by..)
    selectprod_name,sum(quantity)asquant_soldfromProductsPinnerjoinOrderItemsOIonP.prod_id=OI.prod_idgroupbyprod_name;......
  • yii2 配置bootstrap使用
    yii2配置bootstrap使用配置config/web.php添加people<?php...$config=[...'bootstrap'=>['log','people'],...'components'=>['people'=>['class'......
  • Babylon 如何使用AssetsManager(),导入多个模型
    AssetsManager是Babylon.js资产管理工具,可以加载多个模型或者纹理,并且在任务完成时提供回调函数。例如://创建一个AssetsManager实例constassetsManager=newBABYLON.AssetsManager(scene);//添加纹理加载任务consttextureTask=assetsManager.addTexture......
  • Struts2 s2-062 oglnRCE
    struts2漏洞总结(到19年4月)-提笔冩未來-博客园(cnblogs.com)CVE-2021-31805struts2介绍什么是MVC(Model-View-Controller)?基础|三层架构与MVC模式-知乎(zhihu.com)MVC模式MVC模式是软件工程中常见的一种软件架构模式,该模式把软件系统(项目)分为三个基本部分:模型(Mod......
  • nbtstat /?命令参数 显示使用NBT(NetBIOS over TCP/IP)的协议统计信息和当前TCP/IP连接
    NBTSTAT(NetBIOSoverTCP/IPStatistics)是一个用于显示和更新NetBIOS名称缓存、NetBIOS名称表和NetBIOS会话表的Windows命令行实用程序。它允许用户查看当前网络上的NetBIOS名称信息,以便诊断网络连接问题和执行基本的网络故障排除。NetBIOS是一种用于在局域网中进行通信的协议,它......
  • Linux架构27 Ansible变量, 定义变量的方式, 变量注册, facts缓存
    Ansible变量一、变量概述变量提供了便捷的方式来管理Ansibleplaybook的每一个项目中的动态值,比如nginx-1.6.3这个软件包的版本,在其他地方或许会反复使用,那么如果讲此值设置为变量,然后再在其他的playbook中调用,会方便许多。如此一来还方便维护,减少维护的成本。二、定义变量的......
  • TSINGSEE青犀智慧工厂视频汇聚与安全风险智能识别和预警方案
    在智慧工厂的建设中,智能视频监控方案扮演着至关重要的角色。它不仅能够实现全方位、无死角的监控,还能够通过人工智能技术,实现智能识别、预警和分析,为工厂的安全生产和高效运营提供有力保障。TSINGSEE青犀智慧工厂智能视频监控方案,主要是采用高清摄像头,通过智能分析技术,实现对工厂......
  • Item2:用consts,enums和inlines取代#defines
    芝士wa2024.3.29Item2链接“用compiler(编译器)取代preprocessor(预处理器)”,问题就在于因为#define不被视为语言的一部分要理解这句话,需要先了解C++程序的编译过程:1.预处理preprocess预处理是编译前的准备工作。在这一步中,预处理器会执行以下操作:替换所有的宏定义(#defin......
  • TSINGSEE青犀多模型、算力调度与智能分析AI算法中台介绍及应用
    TSINGSEE青犀AI算法中台是一款平台型产品,专注于提供各行业中小场景中部署解决方案。平台具备接入广、性能强、支持跨平台、芯片国产化等特点,可提供丰富的视图接入能力和智能分析能力。平台将不同类型、不同协议前端设备,支持通过不同网络环境进行传输、汇聚、处理,并能在平台内部进......
  • 使用 CRXJS、Vite、TypeScript、React、Zustand、Antd 开发 Chrome 浏览器插件——自
    一、CRXJS一、什么是CRXJS?CRXJSVitePlugin是一款使用现代Web开发技术制作Chrome扩展的工具二、CRXJS的作用CRXJS支持热加载和静态资源导入,无需手动构建配置工具CRXJSVite插件通过将Vite的精细功能与简单的配置策略相结合,简化了Chrome扩展开发者体验二......