前端开发实践与后端开发解耦(一)-- 接口数据mock和接口字段映射

embedded/2024/10/22 3:12:30/

摘要

众所周知,现在的前后端开发都是独立的,除了一些老项目。但是如果公司的开发流程不规范就可能出现前端开发的阻塞,或者出现得多做一些无用功。正确的开发流程应该是:需求评审–需求确认–后端接口设计并输出文档 – 前/后端开发 – 联调 – 测试 – 上线。这里主要强调优先输出接口设计文档的重要性。

Mock 数据

mock数据的作用是让前端开发不依赖后端的开发进度,减少创建数据的时间,减少联调的时间。但是mock也有自己的局限,对于一些复杂的接口没法很好的兼容,对于下载文件也不太好mock等。下面用 vue3 + vite 举例

安装依赖

npm install vite-plugin-mock -D

配置

src 目录的同级上新建mock文件夹;并在 vite.config.jsplugins 中添加下面配置,联调时将选项中的 enable 设置为 false

javascript">// mock/index.js -- 按模块导入方便管理
import user from './user'
import data from './data'export default [...user, ...data]// vite.config.js
viteMockServe({mockPath: path.resolve(__dirname, '../../mock'),// enable: false,localEnabled: viteEnv.VITE_APP_ENV === 'development',watchFiles: true,
})
如何Mock数据

如何使用的官方文档:
vite-plugin-mock配置中文文档
mock数据如何使用
下面写一些常用的写法,以及对于 Restful Api 该如何通过 mock 的接口拦截;其他的使用请看文档。
说明一下Restful Api 类型的接口:
删除:/api/v1/project/:id 请求方法为: Delete
修改:/api/v1/project/:id 请求方法为: Post
详情:/api/v1/project/:id 请求方法为: Get
某个项目里的其他列表:/api/v1/project/:id/other/list 请求方法为: Get

第一种:非 Restful Api
javascript">[{url: '/dev-api/api/v1/project',method: 'get',response: () => {return Mock.mock({code: 0,msg: 'OK','data|10': [{id: '@guid',name: '@string',desc: '@sentence',created_at: '@integer(1693904305000, 1725526705000)',},],})},},// 有查询参数,以下所有都是通用的{url: '/dev-api/api/v1/project/type/list',method: 'get',response: ({ query }) => {const { ... } = querylet list = ['default']// 根据条件生成listreturn {code: 0,msg: 'OK',data: {list,total: 2,},}},},
]
第二种: Restful Api/api/v1/project/:id,接口参数在后面
javascript">[{url: /\/dev-api\/api\/v1\/project\/*/,method: 'delete',response: () => {return {code: 0,msg: 'OK',data: null,}},},
]
第三种: Restful Api/api/v1/project/:id/other/list,接口参数在中间
javascript">	{url: /\/dev-api\/api\/v1\/project\/[^/]+\/other\/list/,method: 'get',response: () => {return {code: 0,msg: 'OK',data: Mock.mock({id: '@guid',name: '@string',}),}},}

接口字段映射

在我们写表单,写表格时都会绑定一个 prop 属性的值,该值对应的就是后端接口返回的 字段名;传参数时也是后端需要什么前端传什么,如果后端需要的时下划线的参数 project_name,安装前端的代码习惯都是 驼峰命名 的参数名,这时候你可以将驼峰转下划线。这里说一下更好的实践,那就是这一节的主题:接口字段的映射。将后端接口的响应数据,传给后端的请求参数,通过字段映射转换成前端需要的字段名和后端需要的参数名。

实现

src 中新建 field-map 文件夹,按模块新增对应的文件,比如 project.js。下面是具体代码

javascript">import { mapRequestFields, formatDate } from '@/utils/common'export const fieldMap = {name: 'name',description: 'description',creator: 'creator',createdAt: 'created_at',
}// Format project list
export function formatList(data) {return (data?.map(item => ({id: item.id,name: item.name,description: item.description,creator: item.creator,createdAt: formatDate(item.created_at),})) || [])
}export function formatQuery(params) {return mapRequestFields(params, fieldMap)
}
对象类型字段转换的翻转

如果需要将后端的响应对象转换成前端需要的字段名,或者在表格排序时需要将字段转换回去,可以通过下面的方式实现。其他更多的需求可以自己拓展

javascript">export const fieldMapReverse = Object.keys(fieldMap).reduce((acc, key) => {acc[fieldMap[key]] = keyreturn acc
}, {})export function formatQuery(params) {return mapRequestFields(params, fieldMapReverse )
}
mapRequestFields的实现,对请求参数进行转换
javascript">// 未实现嵌套的转换
export function mapRequestFields(obj, map) {const isFormData = obj instanceof FormDataconst mapFields = isFormData ? new FormData() : {}if (isFormData) {for (const [key, value] of obj.entries()) {if (value === 'undefined' || value === null || value === '') returnconst newKey = map[key] || keymapFields.append(newKey, value)}} else {Object.keys(obj).forEach(key => {if (obj[key] === 'undefined' || obj[key] === null || obj[key] === '') returnconst newKey = map[key] || keymapFields[newKey] = obj[key]})}return mapFields
}

http://www.ppmy.cn/embedded/129453.html

相关文章

STMicroelectronics 意法半导体芯片选型表

意法半导体作为全球知名的半导体厂商,其产品广泛应用于各个领域,从消费电子到工业控制,从汽车电子到通信设备,都能看到意法半导体芯片的身影。在电子硬件设计领域,芯片的选型至关重要。亿配芯城(ICgoodFind…

【SpringCloud】03-Gateway网关

1. Gateway 网关&#xff1a;负责请求的路由、转发、身份校验。 2. Spring Cloud Gateway 依赖 <!--网关--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></de…

基于jsp+Spring boot+mybatis的图书管理系统设计和实现

基于jspSpring bootmybatis的图书管理系统设计和实现 &#x1f345; 作者主页 网顺技术团队 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; &#x1f345; 文末获取源码联系方式 &#x1f4dd; &#x1f345; 查看下方微信号获取联系方式 承接各种定制系统 …

5G NR Test UE FR1

什么是5G NR Test UE FR1套件&#xff1f; 5G NR Test UE FR1套件完全符合3GPP Release 15标准&#xff0c;用于模拟5G用户设备(UE)&#xff0c;并可在连接到gNodeB时提供实时性能信息。凭借100 MHz的带宽和4x2 MIMO&#xff0c;该套件可以在每个5G频段上测试组件、子系统和/或…

基于微信小程序二手物品调剂系统设计与实现

文章目录 前言项目介绍技术介绍功能介绍核心代码数据库参考 系统效果图文章目录 前言 文章底部名片&#xff0c;获取项目的完整演示视频&#xff0c;免费解答技术疑问 项目介绍 二手物品调剂系统是一种在线平台&#xff0c;旨在促进用户之间的二手物品交易。该系统提供了一个…

Erric Gamma 关于resuable code的采访

采访地址 The risk of speculating Bill Venners: The GoF book says, “The key to maximizing reuse lies in anticipating new requirements and changes to existing requirements, and in designing your systems so they can evolve accordingly. To design a system s…

网络空间指纹:新型网络犯罪研判的关键路径

前言 新型网络犯罪是指利用计算机技术和互联网平台进行犯罪活动的一类犯罪行为。它涵盖了一系列使用网络和数字技术进行非法活动的行为&#xff0c;如网络钓鱼、网络诈骗、恶意软件攻击、黑客入侵、数据泄露、网络色情和社交网络犯罪等。 随着当前打击治理新型网络犯罪博弈态…

面试头棒-Java如何判断两个对象是否相等

在Java中&#xff0c;判断两个对象是否相等通常涉及两个层面的比较&#xff1a;引用相等&#xff08;也称为身份相等&#xff09;和内容相等&#xff08;也称为值相等&#xff09;。 引用相等&#xff08;Identity Equality&#xff09;&#xff1a; 使用 运算符。如果两个引…