vue3 axios 实现自动化api配置详解
作者:落笔忆梦 发布时间:2024-05-28 16:01:23
概述
在实践中,我们发现上述的代码重复率非常高,新增和修改都费力,并且是没技术含量的体力活。 但又必须要这样做,不适合以公共函数的形式重用,为了解决这个重复的体力活,我们开发了代码生成器,用工具来代替体力活。
对于前后端的数据交互都可以归纳为是对实体的 新增、修改、删除、查询。
代码生成器的原理是也是按照对实体的增、删、改、查规范,利用 NodeJs 根据接口的配置文件(包含请求路径、请求选项)按指定模板创建统一符合开发规范的 js 文件到工程指定目录下。
示例
以下通过一个用户的实体配置,讲解由代码生成器生成的代码文件。
1、新建文件 /coder/schemas/system.js 以下配置实现用户的增、删、改、列表查询、详情查询、接口调用。
module.exports = {
name: '系统管理模块',
model: [
{
title: '菜单管理',
name: 'menu',
methods: ['add', 'remove', 'edit', 'list', 'info'],
path: '/system/menu',
},
TIP
新建实体配置文件必须要在/coder/schemas/目录下,可以建目录。
2、运行命令 npm run coder 生成代码,代码文件目录在 src/api/system.js, 目录结构如下:
约定
代码生成器生成的代码需要与后端接口有预先的约定
请求 URL 的约定
前后端分离开发最佳实践是采用 RESTful 的接口形式进行通信,在此我们对请求 URL 进行统一的规范约定。
请求类型 | 前端预定的方法前缀 | 请求方法类型 | api 地址的后缀映射 |
---|---|---|---|
新增 | add | post | /add |
更新 | edit | put | /edit |
删除 | remove | delete | /remove |
分页列表 | page | get | /page |
不分页列表 | list | get | /list |
导出 | export | get | /export |
详情 | info | get | /info |
唯一校验 | unique | get | /unique |
请求传参的约定
GET 请求需要中文转码,导出 export 请求responseType = 'blob'
if (config.method === 'get') config.paramsSerializer = (params) => qs.stringify(params, { arrayFormat: 'comma' });
分页列表,请求参数约定
参数名 | 说明 |
---|---|
pageSize | 每页几条数据 |
pageNum | 页码,从 1 开始 |
needCount | needCount:1,需要总数,处理不需要总条数的情况(后台性能优化),默认为 1 |
分页列表 响应示例
code: 200,
data: {
rows: [{
id: "2"
},{
id: "4"
},{
id: "5"
}],
total: 3
},
msg: "请求成功"
响应码 code 的约定
200:执行成功
401:未登录(需要重新登录)
403:权限不足
404: 访问资源不存在
418: 联合登陆失败
500:系统内部错误(非业务代码里显式抛出的异常,例如由于数据不正确导致空指针异常、数据库异常等等)
请求跨域问题解决方案
前后端分离开发模式,由于前后端可以进行单独部署,请求跨域问题很常见,解决方法主要有两种方式:
1.采用 nginx 代理 2.接口响应头开启 Cross (推荐)
响应头需要做以下配置, 同时后端需要开放 OPTIONS 类型的请求,跨域带 cookie 的请求时,浏览器先试探性发送 OPTIONS 请求,成功后才发起真正的请求
Access-Control-Allow-Credentials:true
Access-Control-Allow-Origin:请求的host
如:
Access-Control-Allow-Credentials:true
Access-Control-Allow-Origin:http://www.fbknav.cn:98
如果接口不需跨域带 cookie 验证信息,可以简单设置
Access-Control-Allow-Origin: *
全局配置
当后端提供的接口与约定的规范不一致的时候,可以通过配置进行相应的调整做适配,但建议还是按前端建议的约定规范。
配置说明coder/config.js
module.exports = {
// 架构配置文件目录
schemasDir: "./schemas/",
// 模板文件目录
templatesDir: "./templates/",
// api请求地址前缀
pathPrefix: "API_HOST",
// api支持的请求方法
methods: [
"add", // 新增数据
"edit", // 更新数据
"remove", // 删除数据
"page", // 列表数据,响应数据含有分页信息,如:总数、当前页码、页大小
"list", // 不分页列表数据
"export", // 根据条件导出
"info", // 详情查询
"unique", // 唯一校验
],
// 数据请求类型对应http请求方法的映射
methodTypeMap: {
add: "post",
edit: "put",
remove: "delete",
page: "get",
list: "get",
export: "get",
info: "get",
unique: "get",
},
// 数据请求类型对应api地址的后缀映射
methodSuffixMap: {
add: "/add",
edit: "/edit",
remove: "/remove",
page: "/page",
list: "/list",
export: "/export",
info: "/info",
unique: "/unique",
},
// 请求方法对应的中文注释
methodCommentMap: {
add: "新增<%=cname%>",
edit: "更新<%=cname%>",
remove: "删除<%=cname%>",
page: "获取<%=cname%>分页列表",
list: "获取<%=cname%>不分页列表",
export: "根据条件导出<%=cname%>",
info: "获取<%=cname%>单条信息详情",
unique: "<%=cname%>字段去重校验",
},
// 是否开启生成批量删除
batchEnabled: true,
// 生成api文件路径
outApiPath: "../src/api/",
};
模型配置
一个标准的模型配置文件如下,建议相同的实体操作都在一个文件里配置。
module.exports = {
name: "系统管理模块", // 模块名称,用来生成注释文档
model: {
path: "/api/users", // 接口地址路径,必须
title: "", // 接口说明,用来生成注释文档
name: "", // 方法名,methods + name使用驼峰法生成完整的方法名,可选
prefix: "", // 接口地址前缀,可选,默认为`coder/config.js`中的pathPrefix, 名称必须要在 src/config/index.js中定义,否则报错
methods: [
"add", // 新增数据
"edit", // 更新数据
"remove", // 删除数据
"page", // 列表数据,响应数据含有分页信息,如:总数、当前页码、页大小
"list", // 不分页列表数据
"export", // 根据条件导出
"info", // 详情查询
"unique", // 唯一校验
], // 生成请求方法,没有该参数时默认全部,如需要自定义,书写名称即可
options: {}, // axios 参数选项,可选
disabled: false, // 是否禁用该配置项, 设置为true,代码生成器将忽略该配置
},
};
1、实现对一个实体进行增、删、改、查、导出、唯一性校验
module.exports = {
name: "系统管理模块",
model: {
path: "/api/user",
},
};
2、只需要增、删、改、查中得某些操作,可以指定生成你需要的方法
module.exports = {
name: "系统管理模块",
model: {
path: '/api/user',
// 需要生成的方法,可以按需要设置
methods: ['add', 'edit', 'remove', 'list', 'info'],
}
}
3、自定义方法配置
module.exports = {
name: "系统管理模块",
model: {
title: "登录接口",
name: "login",
methods: "auth",
path: "/auth/login",
options: {
method: "post",
},
},
};
4、指定请求接口地址前缀
module.exports = {
name: "系统管理模块",
model: {
title: "登录接口",
name: "login",
methods: "auth",
prefix: "OTHER_PATH", // 设置与全局配置不同的前缀,OTHER_PATH 在 src/config/index.js中定义
path: "/auth/login",
options: {
method: "post",
},
},
};
来源:https://juejin.cn/post/7142802556853420045


猜你喜欢
- 保留COOKIES一个小时Response.Cookies("MyCookie").Expires= (now
- 1. 使用 easy_installeasy_install 这应该是最古老的包安装方式了,目前基本没有人使用了。下面是 easy_inst
- 检测缺失值我们先创建一个带有缺失值的数据框(DataFrame)。import pandas as pddf = pd.DataFrame(
- 在上一篇文章中,我介绍了MySQL对XML支持的部分功能,包括--xml命令行选项,以及MySQL 5.1.5中开始引入的新功能。今天我将介
- 在附加数据库后查看不了数据库关系图,也无法建立数据库关系图 我的解决方法如下: 1、设置兼容级别为90(2005为90)(2000为80)
- 一般情况下,我们喜欢使用Session储存我们的变量。Asp.Net提供了下面一些方法储存Session的值: InProc&n
- 现在写一篇博客总是喜欢先谈需求或者本内容的应用场景,是的,如果写出来的东西没有任何应用价值,确实也没有实际意义。今天的最早的需求是来自于如何
- 本文介绍一个exe打包工具pyinstaller,使用非常简单、方便,而且还跨平台。软硬件环境Windows 10 64bitPyQt5An
- 近期Github开源了一款基于Python开发、名为Textshot的截图工具,刚开源不到半个月已经500+Star。这两天抽空看了一下Te
- if"""条件语句:ifif...elseif...elif...elseif 语句的格式:if 条件: &n
- 最近做一个的GUI,因为调用了os模块里的system方法,使用pyinstaller打包的时候选择不输出系统命令弹框,程序无法运行,要求要
- 本文实例讲述了Python通过调用mysql存储过程实现更新数据功能。分享给大家供大家参考,具体如下:一、需求分析由于管理费率配置错误,生成
- 安装配置vim-plug安装vim-plugcurl -fLo ~/.vim/autoload/plug.vim --create-dirs
- 目录1. python爬取网易财经不同板块股票数据目标网址:爬虫思路:爬虫代码:2. excel树状图2.1. 简单的树状图2.2. 带有增
- 前言在没有深度使用函数回调的经验的时候,去看这些内容还是有一点吃力的。由于Node.js独特的异步特性,才出现了“回调地狱”的问题,这篇文章
- 软硬件环境OS X EI CapitanPython 3.5.1mysql 5.6前言在开发中经常涉及到数据库的使用,而python对于数据
- 第一:pandas.read_csv读取本地csv文件为数据框形式data=pd.read_csv('G:\data_operati
- 前言最近因为工作需要要使用PHP 7,所以从网上找教程进行安装, 结果编译没问题, 安装的时候报了错误。错误如下cp -pR -f phar
- Vue的项目中,如果项目简单, 父子组件之间的数据传递可以使用 props 或者 $emit 等方式 进行传递但是如果是大中型项目中,很多时
- 笔主在做一个项目要生成一组随机有序的整型数字,并按行输出到文本文件使用,恰好开始学习Python3,遂决定直接使用Python3解决思路:与