当前位置: 首页 > news >正文

优化基于axios接口管理的骚操作

优化基于axios接口管理的骚操作!

本文针对中大型的后台项目的接口模块优化,在不影响项目正常运行的前提下,增量更新。

强化功能

1.接口文件写法简化(接口模块半自动化生成)
2.任务调度、Loading调度(接口层面的防抖兜底,多个接口共用一个loading,防止闪烁)
3.接口提示自由化(提示消息可由前端控制,也可以由后端控制)

接口文件写法简化

对于一些中后台模块的接口,基本上都是增删改查以及审核流的一些功能(其他特殊接口暂且不谈)。如果后端接口足够规范的话,大概就是下面这个情形

 import request from "@/utils/request";
// 销售退货列表
export function getSalesReturnList(data) {return request({url: "/sales_return/list",method: "post",data,});
}
​
// 保存销售退货
export function saveSalesReturn(data) {return request({url: "/sales_return/save",method: "post",data,});
}
// 根据Id获取销售退货
export function getSalesReturn(query) {return request({url: "/sales_return/get",method: "get",params: query,});
}
// 根据Id删除销售退货
export function deleteSalesReturn(data) {return request({url: "/sales_return/delete",method: "post",data,});
}
// 提交销售退货审核
export function submitSalesReturn(data) {return request({url: "/sales_return/submit",method: "post",data,});
}
// 审核销售退货
export function auditSalesReturn(data) {return request({url: "/sales_return/audit",method: "post",data,});
}
// 撤审销售退货
export function revokeAuditSalesReturn(data) {return request({url: "/sales_return/withdraw",method: "post",data,});
}
// 审核拒绝销售退货
export function rejectSalesReturn(data) {return request({url: "/sales_return/reject",method: "post",data,});
}
// 作废销售退货
export function discardSalesReturn(data) {return request({url: "/sales_return/discard",method: "post",data,});
} 

我觉得这个也太重复了,而且接口函数命名太麻烦了,要让团队规范起来比较困难。能不能自动生成了,命名也帮忙处理了,这样这种接口文件岂不是更加规范。

接下来想想办法

假设如上,一个单据模块的通常来说有九个接口方法,增删改查,提交、作废、审核、撤审、拒绝。他们的 url,前面的 sales_return 拼接是固定的,不同的就是后面标识功能的路径标识。另外就是,method 分为 post 和 get 方法。

我们把这九个接口,看成是一个 9 位二进制上的 9 个位,1 代表存在,0 代表不存在。

我们可以创建一个 map 文件来做构建准备(如下)

export const apiEnum = {// 查列表2^01: {name: "list",//接口名称type: "post",//接口方式},// 查详情2^12: {name: "get",type: "get",loading: true,//是否需要loading调度、防抖},// 删列表 2^24: {name: "delete",type: "post",},// 保存 或者 保存且提交2^38: {name: "save",type: "post",loading: true,},// 提交2^416: {name: "submit",type: "post",loading: true,},// 审核2^532: {name: "audit",type: "post",},// 撤审2^664: {name: "withdraw",type: "post",},// 拒绝2^7128: {name: "reject",type: "post",},// 作废2^7256: {name: "discard",type: "post",},
};
export const apiFuncModule = {// 全部COMMON: 511,// 增删改查CURD: 15,
}; 

当我传 1 的时候,九位为000000001,代表只有一个查接口。当我传 15 的时候,九位为000001111,代表拥有增删改查四个接口。以此类推。

接下就是完成处理函数,完成上面的功能(如下)

 import request from "@/utils/request";
import { apiEnum, apiFuncModule } from "@/enum/baseModule/apiEnum";
function useApi(moduleName, code = 511) {let apiMap = {};for (let key in apiEnum) {if ((key & code) == key) {let obj = apiEnum[key];//可以按自己习惯来对接口函数命名let apiName = "api_" + obj.name;apiMap[apiName] = (data) => {return request({url: `/${moduleName}/${obj.name}`,method: obj.type,[obj.type == "get" ? "params" : "data"]: data,loading: obj.loading,});};}}return apiMap;
}
export { useApi, apiFuncModule as apiType }; 

完成以上步骤,我们的接口文件就可以这样写了,这样九个接口就写完了。而且一目了然,如需修改,只需要调整传参就行了。

import { useApi } from "@/utils/system/apiGenPlugin";
//code可以不传 ,默认为511
export const API = useApi("sales_return");
//若有其他特殊接口 兼容原始写法 互不影响
export function xxxxx(data) {...
} 

使用方式

 //API集中管理
import { API as SalesReturn } from "@/api/workApi/sale/return";
const {api_save,api_delete,api_get,api_list,api_audit,api_withdraw,api_discard,api_submit,api_reject} = SalesReturn
//单独使用
import { useApi } from "@/utils/system/apiGenPlugin";
const {api_save,api_delete,api_get,api_list,api_audit,api_withdraw,api_discard,api_submit,api_reject} = useApi('sales_return') 
  • 增 SalesReturn.api_save
  • 删 SalesReturn.api_delete
  • 改 SalesReturn.api_get
  • 查 SalesReturn.api_list
  • 审核 SalesReturn.api_audit
  • 撤审 SalesReturn.api_withdraw
  • 作废 SalesReturn.api_discard
  • 提交 SalesReturn.api_submit
  • 拒绝 SalesReturn.api_reject

任务调度、Loading调度

实际开发中,我们可能会有对接口调用做一些处理

1.对提交事件进行防抖处理,防止重复提交。
2.加载某些重要资源的时候,希望有个loading效果,来优化用户体验。
3.让多个需要loading效果的接口,共用同一个loading,防止页面闪烁。

这些功能单独处理起来就显得很麻烦了,而且每个人的写法不一样,后期维护成本就更难。

废话不多说,直接贴代码

接口调度类

import { Loading } from "element-ui";
class RequestLock {// Loading 实例L_instance = null;// 接口mapreqMap = new Map();// 最近一次调用接口时间戳timestamp = 0;
​constructor(timeout = 500) {// 过渡时间this.timeout = timeout;}// 创建任务put = (id) => {if (this.reqMap.has(id)) return false;this._put(id);return true;};_put = (id) => {this.timestamp = new Date().getTime();this.reqMap.set(id, true);//开启loadingthis.L_instance = Loading.service({fullscreen: true,background: "rgba(255, 255, 255, 0.1)",lock: true,});};// 移除任务del = (id) => {if (this.reqMap.has(id)) {this.reqMap.delete(id);
​if (this.reqMap.size == 0) {this._closeLoading();}}};// 清空所有的任务clearTask = () => {this.reqMap.clear();this.L_instance.close();};//平滑关闭loading_closeLoading = () => {let _timestamp = new Date().getTime();let settime = _timestamp - this.timestamp;if (settime > this.timeout) {this.L_instance?.close();} else {setTimeout(() => {this.L_instance?.close();}, this.timeout - settime);}};
}
export default RequestLock;
​ 

在axios里的使用

这个是增量优化,在不影响以前代码的条件下,添加功能

import { RequestLock } from "@/class/lock";
let loadLock = new RequestLock(500);
//请求拦截
service.interceptors.request.use((config) => {...//如果配置中有loading 开启调度if (config.loading) {if (!loadLock.put(config.url)) {return Promise.reject(new Error("repeat request!"));}}...return config;},(error) => {...//如果有错误请求,中止当前调度任务,并清空loadLock.clearTask();...return Promise.reject(error);}
);
​
//响应拦截
service.interceptors.response.use((response) => {...//检查response.config.loading && loadLock.del(response.config.url);...},(error) => {loadLock.clearTask();return Promise.reject(error);}
); 

接口文件书写

// 根据Id获取销售退货
export function getSalesReturn(query) {return request({url: "/sales_return/get",method: "get",params: query,//在这里配置loading为true,开启loading:true});
} 

提示信息自由化

有时候当我删除一条数据,需要有个弹框提示删除是否成功。通常我们会在接口成功回调的时候加上这个功能。需要判断状态,来显示提示框的描述和颜色。另一方面,有时候删除一条数据,业务需求提示不单单是简单的“删除成功!”,还可能需要其他的附加提示。比如“删除单据xxx成功,请及时处理xxxx!”。这种需求没什么难度,但是有沟通成本和维护成本。业务有一些变化就需要修改。

另一方面,后端对系统的业务逻辑更加贴近,提示功能交给后端更加合理。当然,前端也需要保留这个功能,去兼容某些需求。

import { Message } from "element-ui";
export function responseMsgHandle(res) {//这里需要后端响应数据格式的配合,MsgType表示提示状态,Msg表示提示描述let { MsgType, Msg } = res;if (["success", "warning", "error"].includes(MsgType)) {Message({message: Msg,type: MsgType,duration: 5 * 1000,});}
} 

使用

import { responseMsgHandle } from "@/utils";
//响应拦截
service.interceptors.response.use((response) => {...const res = response.data;responseMsgHandle(res);...},(error) => {...responseMsgHandle({MsgType:"error",Msg:error.message,});...return Promise.reject(error);}
); 

总结

以上三个简单的优化方案,可以组合使用,也可以单独使用。可以根据自己的实际项目需求,进行改造使用。

基本上能解决很大一部分的重复劳动,还能减少维护成本。

最后

最近找到一个VUE的文档,它将VUE的各个知识点进行了总结,整理成了《Vue 开发必须知道的36个技巧》。内容比较详实,对各个知识点的讲解也十分到位。



有需要的小伙伴,可以点击下方卡片领取,无偿分享

相关文章:

优化基于axios接口管理的骚操作

优化基于axios接口管理的骚操作! 本文针对中大型的后台项目的接口模块优化,在不影响项目正常运行的前提下,增量更新。 强化功能 1.接口文件写法简化(接口模块半自动化生成) 2.任务调度、Loading调度(接口层…...

【Django功能开发】如何正确使用定时任务(启动、停止)

系列文章目录 【Django开发入门】ORM的增删改查和批量操作 【Django功能开发】编写自定义manage命令 文章目录系列文章目录前言一、django定时任务二、django-apscheduler基本使用1.安装django-apscheduler2.配置settings.py的INSTALLED_APPS3.通过命令生成定时记录表3.如何创…...

7个好用到爆的音频、配乐素材网站,BGM都在这里了

现在只要有一部手机,人人都能成为视频创作者。一个好的视频不能缺少的就是内容、配乐,越来越注重版权的当下,音效素材使用不当造成侵权的案例层出不穷。为了避免侵权,找素材让很多创作者很头疼。 今天我就整理了7个可以免费下载&…...

JUC(二)

1.可重入锁–ReentrantLock原理 1.1.非公平锁的实现原理 1.1.1.加锁解锁流程 1>.先从构造器开始看,默认为非公平锁,可以在构造函数中设置参数指定公平锁 public ReentrantLock() {sync = new NonfairSync(); }public ReentrantLock...

ATS认证教学

我用的版本是ATS7.11、系统版本是用最新的ios13.2.1 定义 ATS旨在分析通过UART、USB和蓝牙传输传输的iAP流量、通过USB和无线(蓝牙和Wi-Fi)传输的CarPlay流量、通过Wi-Fi传输的AirPlay 2流量以及闪电音频流量。 ATS是Apple’s Accessory Test System的…...

【操作系统】进程管理

进程与线程 1. 进程 进程是资源分配的基本单位 进程控制块 (Process Control Block, PCB) 描述进程的基本信息和运行状态,所谓的创建进程和撤销进程,都是指对 PCB 的操作。 下图显示了 4 个程序创建了 4 个进程,这 4 个进程可以并发地执行…...

一分钟掌握技术术语:API(接口)

很多产品经理在项目开发过程中经常听到:你调我这个接口就好了;这个功能你写个接口给我;有什么不懂的就看下API接口文档。 开发经常说的接口是什么意思呢?术语解释:API(Application Programming Interface&…...

RabbitMQ之交换机

交换机 在上一节中,我们创建了一个工作队列。我们假设的是工作队列背后,每个任务都恰好交付给一个消费者(工作进程)。在这一部分中,我们将做一些完全不同的事情-我们将消息传达给多个消费者。这种模式称为“发布/订阅”. 为了说明这种模式,我们将构建一个简单的日志系统。它…...

Tensorflow深度学习对遥感图像分类,内存不够怎么办?

问题描述在使用Tensorflow-cpu对图像分类的时候,在预读数据过程中,由于数据量过大,内存不足,导致计算失败。使用环境:win10系统 Pycharm tensorflow-cpu2.5.0 CPU: i7 8700 内存64G图1 CPU配置图图2 内存信息图使用数据…...

基础存贮模型介绍

基础存贮模型 这里主要讨论在需求量稳定的情况下,贮存量需要多少的问题。当贮存量过大时,会提高库存成本,也会造成积压资金;当贮存量过小时,会导致一次性订购费用增加,或者不能及时满足需求。 下面讨论不允…...

JNDIExploit使用方法

JNDIExploit 一款用于 JNDI注入 利用的工具,大量参考/引用了 Rogue JNDI 项目的代码,支持直接植入内存shell,并集成了常见的bypass 高版本JDK的方式,适用于与自动化工具配合使用。 对 feihong-cs 大佬的项目https://github.com/fe…...

建议一般人不要全职做副业

欢迎关注勤于奋每天12点准时更新国外LEAD相关技术全职做国外LEAD,听起来不错,但是效果不一定好,没有自控力来全职做,基本要废了自己,最好抽时间来做。我现在就是全职做国外LEAD,外加其他一些项目&#xff0…...

pytorch入门6--数据分析(pandas)

pandas是基于Numpy构建的,提供了众多比NumPy更高级、更直观的数据处理功能,尤其是它的DataFrame数据结构,可以用处理数据库或电子表格的方式来处理分析数据。 使用Pandas前,需导入以下内容: import numpy as np from …...

淘宝API接口开发系列,详情接口参数说明

onebound.taobao.item_get 公共参数 名称类型必须描述keyString是 调用key(必须以GET方式拼接在URL中) 注册Key和secret: https://o0b.cn/anzexi secretString是调用密钥api_nameString是API接口名称(包括在请求地址中&#xff0…...

keep-alive

keep-alive 是 Vue 的内置组件,当它包裹动态组件时,会缓存不活动的组件实例,而不是销毁它们。 keep-alive 包裹动态组件时,会缓存不活动的组件实例,而不是销毁它们 使用场景 使用原则:当我们在某些场景下…...

Maven的生命周期及常用命令

文章目录1、Maven生命周期1.1、clean生命周期1.2、default生命周期1.3、site生命周期2、Maven常用命令1、Maven生命周期 Maven有三套生命周期系统: 1、clean生命周期 2、default生命周期 3、site生命周期 三套生命周期之间相互独立,每套生命周期包含一…...

【Java开发】JUC基础 03:线程五大状态和主要方法

1 概念介绍📌 五大状态:new:Thread t new Thread(); 线程对象一旦被创建就进入到了新生状态;就绪状态:当调用start()方法,线程立即进入就绪状态,但不意味着立即调度执行;运行状态&a…...

docker打包容器 在另一个机器上运行

1:将运行中的容器变为镜像docker commit 容器id 镜像名(docker commit 89e81386d35e aabbcc)2:将容器打包成tar包docker save -o xxx.tar 镜像名 (当前路径下会生成一个tar的文件)3:将tar包压缩为gz包tar -…...

2023年全国最新保安员精选真题及答案9

百分百题库提供保安员考试试题、保安职业资格考试预测题、保安员考试真题、保安职业资格证考试题库等,提供在线做题刷题,在线模拟考试,助你考试轻松过关。 91.护卫对象在公共场所参加活动前,保安员需要事先(&#xff0…...

arduino-sentry2之卡片篇

欧克,今天在学生的强烈要求下 我又重启arduino的sentry2调试篇 目前实验结果,可以检测到10张交通卡片 也就是如图所示十张 具体视频如下: https://live.csdn.net/v/279170 具体代码如下: #include <Arduino.h> #include <...

七、JUC并发工具

文章目录JUC并发工具CountDownLatch应用&源码分析CountDownLatch介绍CountDownLatch应用CountDownLatch源码分析有参构造await方法countDown方法CyclicBarrier应用&源码分析CyclicBarrier介绍CyclicBarrier应用CyclicBarrier源码分析CyclicBarrier的核心属性CyclicBarr…...

C++ string类(二)及深浅拷贝

一、string类方法使用举例1.迭代器迭代器本质&#xff1a;指针&#xff08;理解&#xff09;迭代器&#xff1a;正向迭代器&#xff1a; begin() | end() 反向迭代器&#xff1a; rbegin() | rend()2.find使用//找到s中某个字符 void TestString3() {string s("AAADEFNUIE…...

「TCG 规范解读」TCG 软件栈 TSS (上)

可信计算组织&#xff08;Ttrusted Computing Group,TCG&#xff09;是一个非盈利的工业标准组织&#xff0c;它的宗旨是加强在相异计算机平台上的计算环境的安全性。TCG于2003年春成立&#xff0c;并采纳了由可信计算平台联盟&#xff08;the Trusted Computing Platform Alli…...

(二)Markdown编辑器的使用效果 | 以CSDN自带MD编辑器为例

Markdown编辑器使用指南 &#xff08;一&#xff09;Markdown编辑器的使用示例 | 以CSDN自带MD编辑器为例&#xff08;二&#xff09;Markdown编辑器的使用效果 | 以CSDN自带MD编辑器为例 这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xf…...

WebSocket网络通信执行流程

目录WebSocket网络通信执行流程相关概念执行流程WebSocket网络通信执行流程 WebSocket协议&#xff1a;通过单个TCP连接在客户端和服务器之间建立全双工双向通信通道。 WebSocket 对象&#xff1a;提供了用于创建和管理 WebSocket 连接&#xff0c;以及可以通过该连接发送和接…...

【Shell学习笔记】4.Shell 基本运算符

前言 本章介绍Shell的基本运算符。 Shell 基本运算符 Shell 和其他编程语言一样&#xff0c;支持多种运算符&#xff0c;包括&#xff1a; 算数运算符关系运算符布尔运算符字符串运算符文件测试运算符 原生bash不支持简单的数学运算&#xff0c;但是可以通过其他命令来实现…...

无代码资讯 | 《低代码开发平台能力要求》发布;CADP列入Gartner《2022-2024 中型企业技术采用路线图》

栏目导读&#xff1a;无代码资讯栏目从全球视角出发&#xff0c;带您了解无代码相关最新资讯‍。TOP3 大事件1、《低代码开发平台能力要求》团体标准正式发布近日&#xff0c;中国电子工业标准化协会发布公告&#xff08;中电标【2022】037 号&#xff09;&#xff0c;由中国电…...

智能家居Homekit系列一智能插座

WiFi智能插座对于新手接触智能家居产品更加友好&#xff0c;不需要额外购买网关设备 很多智能小配件也给我们得生活带来极大的便捷&#xff0c;智能插座就是其中之一&#xff0c;比如外出忘记关空调&#xff0c;可以拿起手机远程关闭。 简单说就是&#xff1a;插座可以连接wi…...

React(三):脚手架、组件化、生命周期、父子组件通信、插槽

React&#xff08;三&#xff09;一、脚手架安装和创建1.安装脚手架2.创建脚手架3.看看脚手架目录4.运行脚手架二、脚手架下从0开始写代码三、组件化1.类组件2.函数组件四、React的生命周期1.认识生命周期2.图解生命周期&#xff08;1&#xff09;Constructor&#xff08;2&…...

2023年电子竞技行业报告

第一章 行业概况 电子竞技也被称为电竞或eSports&#xff0c;是一种电子游戏的竞技活动&#xff0c;玩家在这里与其他人或团队对战&#xff0c;通常是在网络上或特定场地上进行。 电子竞技行业的发展与互联网和计算机技术的进步密不可分&#xff0c;同时还受到游戏开发商、赞…...

大学生做网站步骤/阿里巴巴logo

前端技术对比一、ES61、简介2、什么是 JavaScript3、ES6新特性3.1 let3.2 const3.3 解构表达式3.4 字符串扩展3.5 函数优化3.6 对象优化3.7 map 和 reduce3.8 Promise3.9 模块化二、Vue1、MVVM 思想2、Vue 简介3、Vue 入门案例4、Vue 指令插值表达式v-text、v-htmlv-bindv-mode…...

做网站的流程知乎/seo搜索是什么

背景 我们原来访问vue静态页面是通过网宿CDN进行访问的&#xff0c;具体如下&#xff1a; 但是用户说&#xff0c;在海外访问vue网页比较慢&#xff0c;所以&#xff0c;我们打算使用AWS的CDN来进行访问&#xff0c;即CloudFront&#xff0c;如下图&#xff1a; 国内使用网宿…...

wordpress做下载型网站/seo优化快排

HLOOKUP今天介绍HLOOKUP与VLOOKUP不同的是&#xff0c;HLOOKUP是横向查找&#xff0c;还是按老规矩&#xff0c;我们先了解以下函数的基本含义。定义&#xff1a;在数组中&#xff0c;或者在单行里面查找某个值&#xff0c;返回同列其他行的值语法&#xff1a;HLOOKUP(value_lo…...

js网站源码已到期/无屏蔽搜索引擎

Time limit1000 ms Memory limit32768 kB OS/Windows 三个循环结&#xff0c;矩阵快速幂&#xff0c;注意时间要求&#xff0c;此方法比较省时间 #include<bits/stdc.h> using namespace std; typedef long long ll; typedef double s64; ll n; int m2; const int N3; …...

岳阳建设网站公司/链接网

以Edit控件为例进行说明&#xff0c;在Dialog类中&#xff0c;相应WM_CTLCOLOR消息。就是OnCtlColor(),那里面判断传入进来的ID号为你要的编辑控件&#xff0c;然后&#xff0c;用得到的DC&#xff0c;设置字体&#xff0c;颜色&#xff0c;最后返回一个笔刷&#xff0c;这个笔…...

怎么做一款网站/搜索点击软件

本系列文章将会对CSS的flex布局做一个简单的介绍&#xff0c;希望读者朋友们能够对它的功能有一个整体的认知&#xff0c;在工作中可以自由的运用。这是本系列文章的第一篇&#xff0c;主要介绍flex布局中元素的收缩和扩展。如果要使用flex布局&#xff0c;那么第一个使用到的C…...