前后端分离,使用MOCK进行数据模拟开发,让前端攻城师独立于后端进行开发

mock是什么

Mock生成随机数据,拦截Ajax 请求,前后端分离,让前端攻城师独立于后端进行开发。 增加单元测试的真实性 通过随机数据,模拟各种场景。
在实际开发过程中,前端是通过axios来请求数据的,很多时候前端开发者就是通过写固定的JSON数据来模拟数据,但是这个JSON是一个对象,没有经过数据请求的情况下直接使用,在后续的工作中要等到后端将API写好以后再进行对接API,而mock就是通过拦截真实的axios的请求来模拟数据,相当于通过mock写一个假的API,并直接拿来使用,前端开发人员是可以真实的写一个axios请求的
简单来说,mock就是假的API

(一)前提条件

vue项目已经进行了axios请求接口封装,可以正常的请求后端接口(我用的是登录接口测试是合适的)。

(二)安装

我使用的是vue的vite(Vue3的)框架。使用的依赖是以下两个依赖。

"vite-plugin-mock": "^2.9.6",
"mockjs": "^1.1.0",

(三)配置

vite.config.js 文件中引入并配置这个插件:

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import { viteMockServe } from 'vite-plugin-mock'export default defineConfig({plugins: [vue(),viteMockServe({ignore: /^\_/,mockPath: 'mock',localEnabled: !isBuild,//表示是否在本地环境中启用Mock服务器。如果isBuild为false,则localEnabled为true,表示在本地环境中启用Mock服务器;反之亦然。prodEnabled: isBuild,//表示是否在生产环境中启用Mock服务器。如果isBuild为true,则prodEnabled为true,表示在生产环境中启用Mock服务器;反之亦然。injectCode: `import { setupProdMockServer } from '../mock/_createProductionServer';setupProdMockServer();`,}),],
})

创建mock服务
其中**/mock/_createProductionServer**文件如下:

import { createProdMockServer } from 'vite-plugin-mock/es/createProdMockServer';const modules = import.meta.glob('./**/*.ts', { eager: true });const mockModules: any[] = [];
Object.keys(modules).forEach((key) => {if (key.includes('/_')) {return;}mockModules.push(...(modules as Recordable)[key].default);
});/*** Used in a production environment. Need to manually import all modules*/
export function setupProdMockServer() {createProdMockServer(mockModules);
}

(四)实例

1、在mock文件夹中的一个house.ts文件:

import { MockMethod } from 'vite-plugin-mock';
import { resultPageSuccess, resultSuccess, baseUrl } from '../_util';const testList = (() => {const result: any[] = [];for (let index = 0; index < 40; index++) {result.push({id: index,apartment: '@integer(1,4)',//公寓楼--字典building: '@integer(1,10)',//栋数--字典room: '@integer(1,32)' + '0' + '@integer(1,9)' + '-' + '@integer(1,6)',// 房间--stringtype: '@integer(1,4)',//户型--字典address: "@county(true)", // 地址--stringarea: '@integer(15,90)',//面积--数字status: '@integer(1,2)',// 入住状态--字典matching: "@ctitle",//房屋配套---stringdecorationTime: "@date(yyyy-MM-dd)", //装修时间--datacheckDate: "@date(yyyy-MM-dd)", // 预入住时间---datarent: "@float(500,4000,0,2)",//租金---floatmanagerId: "admin",// 用户(公寓管理员)标识--用户列表中的username字段---根据实际情况定是否使用该字段managerName: "@cname",//用户名称(公寓管理员)---后端根据用户标识匹配返回前端pictureList: "@image", // 多张图片remarks: "@ctitle", // 备注信息---富文本identityCard: /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/,//身份证号码-----numberphone: /^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\d{8}$/,//生成的符合正则表达式的字符串identificationPhoto: "@image(35x50)", // 证件照--一张图片});}return result;
})();const info = (() => {const result = {id: 1,apartment: '2',building: '9',room: '@integer(1,32)' + '0' + '@integer(1,9)' + '-' + '@integer(1,6)',type: '4',address: "@county(true)",area: '@integer(15,90)',status: '1',matching: "@ctitle",decorationTime: "@date(yyyy-MM-dd)",checkDate: "@date(yyyy-MM-dd)",rent: "@float(500,4000,0,2)",managerId: "admin",managerName: "@cname",pictureList: "@image",remarks: "@ctitle",}return result;
})();export default [{url: `${baseUrl}/internetOfThings/getHouseList`,timeout: 1000,method: 'get',response: ({ query }) => {const { page = 1, pageSize = 20 } = query;return resultPageSuccess(page, pageSize, testList);},},{url: `${baseUrl}/internetOfThings/getHouseInfo`,timeout: 1000,method: 'get',response: () => {return resultSuccess(info);},},
] as MockMethod[];

其中_util.ts文件:

export function resultSuccess<T = Recordable>(result: T, { message = 'ok' } = {}) {return {code: 0,result,message,type: 'success',};
}export function resultPageSuccess<T = any>(pageNo: number,pageSize: number,list: T[],{ message = 'ok' } = {}
) {const pageData = pagination(pageNo, pageSize, list);return {...resultSuccess({records: pageData,total: list.length,}),message,};
}export function resultError(message = 'Request failed', { code = -1, result = null } = {}) {return {code,result,message,type: 'error',};
}export function pagination<T = any>(pageNo: number, pageSize: number, array: T[]): T[] {const offset = (pageNo - 1) * Number(pageSize);const ret =offset + Number(pageSize) >= array.length? array.slice(offset, array.length): array.slice(offset, offset + Number(pageSize));return ret;
}export interface requestParams {method: string;body: any;headers?: { authorization?: string };query: any;
}/*** @description 本函数用于从request数据中获取token,请根据项目的实际情况修改**/
export function getRequestToken({ headers }: requestParams): string | undefined {return headers?.authorization;
}//TODO 接口父路径(写死不够灵活)
export const baseUrl = '/api/mock';

2、mock API书写

就像平时请求API的接口一样正常请求数据,defHttp 是封装好的axios请求封装好的函数,没有做其他操作。

import { defHttp } from '/@/utils/http/axios';enum Api {houseList = '/mock/internetOfThings/getHouseList',houseInfo = '/mock/internetOfThings/getHouseInfo',
}/*** @description: 房源管理--列表*/export const getHouseList = (params) => {// console.log(params,"API传参");return defHttp.get({ url: Api.houseList, params });
}
/*** 详情* */
export const getHouseInfo = (id) => {return defHttp.get({ url: Api.houseInfo, id });}

3、API的实际使用

  getHouseList(recordId.value).then((res) => {console.log(res, '请求数据');});

(五)效果

在这里插入图片描述
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

浅谈Spring Cloud:OpenFeign

RestTemplate 方式调用存在的问题&#xff1a; String url "http://userservice/user/" order.getUserId(); User user restTemplate.getForObject(url, User.class); 这是通过URL地址来访问的。但是&#xff1a; 代码可读性差&#xff0c;编程体验不统一参数复…

Lucene详解介绍以及底层原理说明

文章目录 什么是Lucene?示意图Lucene 的使用场景&#xff1a;Lucene 的生态系统&#xff1a; 相关概念1. **Document&#xff08;文档&#xff09;**2. **Field&#xff08;字段&#xff09;**3. **Analyzer&#xff08;分析器&#xff09;**4. **Tokenizer&#xff08;分词器…

前端基础知识+算法(一)

文章目录 算法二分查找条件注意方式基本原理左闭右闭正向写法 左闭右开正向写法 前端基础知识定时器及清除盒子垂直水平居中的方式垂直水平1.flex布局2.grid布局3.定位对于块级元素 解决高度塌陷的方式1.给父元素一个固定的高度2.给父元素添加属性 overflow: hidden;3.在子元素…

深度学习-从零基础快速入门到项目实践,这本书上市了!!!

此书地址&#xff1a; 《【2024新书】深度学习 从零基础快速入门到项目实践 文青山 跟我一起学人工智能 机器学习算法原理代码实现教程 深度学习项目分析 深度学习 从零基础快速入门到项目实践》【摘要 书评 试读】- 京东图书 除深度学习外我还写了一本软件测试书。我大概是国…

[Excel VBA办公]如何使用VBA批量删除空行

在处理Excel数据时&#xff0c;空行可能会干扰数据分析和展示。以下是一个VBA代码示例&#xff0c;帮助你批量删除工作表中的空行。 1. 代码说明 此代码将遍历指定工作表&#xff0c;删除所有空行&#xff0c;确保数据整洁。 2. VBA代码 删除sheet1的空行 Sub DeleteEmptyRow…

VMware虚拟机因磁盘空间不足黑屏无法登录

在虚拟机里存储了一些文件之后&#xff0c;再打开发现进不去了&#xff0c;只有光标一直在左上角&#xff0c;登录的框都是黑的&#xff0c;具体如下&#xff1a; 明明知道登录框的存在却怎么也触碰不到它T_T &#xff0c;先说解决方法&#xff1a; 产生这个问题的原因是因为磁…

大数据Flink(一百二十一):Flink CDC基本介绍

文章目录 Flink CDC基本介绍 一、什么是CDC 二、CDC的实现机制 三、​​​​​​​​​​​​​​传统 CDC ETL 分析 四、​​​​​​​​​​​​​​基于 Flink CDC 的 ETL 分析 五、​​​​​​​​​​​​​​什么是 Flink CDC 六、​​​​​​​​​​​​​​…

OpenCV特征检测(10)检测图像中直线的函数HoughLinesP()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 在二值图像中使用概率霍夫变换查找线段。 该函数实现了用于直线检测的概率霍夫变换算法&#xff0c;该算法在文献 181中有所描述。 HoughLines…

go webapi上传文件

一、导入依赖 import "net/http" 我这里用到了Guid所以安装依赖 go get github.com/google/uuid 二、main.go package mainimport ("fmt""github.com/jmoiron/sqlx""github.com/tealeg/xlsx""log""path/filepath&q…

Cpp类和对象(中续)(5)

文章目录 前言一、赋值运算符重载运算符重载赋值运算符重载赋值运算符不可重载为全局函数前置和后置的重载 二、const修饰成员函数三、取地址及const取地址操作符重载四、日期类的实现构造函数日期 天数日期 天数日期 - 天数日期 - 天数日期类的大小比较日期类 > 日期类日…

【CSS in Depth 2 精译_036】5.6 Grid 网格布局中与对齐相关的属性 + 5.7本章小结

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第一章 层叠、优先级与继承&#xff08;已完结&#xff09; 1.1 层叠1.2 继承1.3 特殊值1.4 简写属性1.5 CSS 渐进式增强技术1.6 本章小结 第二章 相对单位&#xff08;已完结&#xff09; 2.1 相对…

桶排序和计数排序(非比较排序算法)

桶排序 桶排序是一种基于分配的排序算法&#xff0c;特别适合用来排序均匀分布的数据。它的基本思想是将输入的数据分到有限数量的桶里&#xff0c;然后对每个桶内的数据分别进行排序&#xff0c;最后再将各个桶内的数据合并得到最终的排序结果。(通常用于浮点数&#xff0c;因…

Go-知识-定时器

Go-知识-定时器 1. 介绍2. Timer使用场景2.1 设定超时时间2.2 延迟执行某个方法 3. Timer 对外接口3.1 创建定时器3.2 停止定时器3.3 重置定时器3.4 After3.5 AfterFunc 4. Timer 的实现原理4.1 Timer数据结构4.1.1 Timer4.1.2 runtimeTimer 4.2 Timer 实现原理4.2.1 创建Timer…

【Godot4.3】基于状态切换的游戏元素概论

提示 本文的设想性质比较大,只是探讨一种设计思路。完全理论阶段&#xff0c;不可行就当是闹了个笑话O(∩_∩)O哈哈~但很符合我瞎搞的气质。 概述 一些游戏元素&#xff0c;其实是拥有多个状态的。比如一个宝箱&#xff0c;有打开和关闭两个状态。那么只需要设定两个状态的图…

并发编程多线程

1.线程和进程的区别&#xff1f; 进程是正在运行程序的实例&#xff0c;进程中包含了线程&#xff0c;每个线程执行不同的任务不同的进程使用不同的内存空间&#xff0c;在当前进程下的所有线程可以共享内存空间线程更轻量&#xff0c;线程上下文切换成本一般上要比进程上下文…

axure的下载,激活,汉化全过程,多图

1.前言 下载地址&#xff1a;https://pan.baidu.com/s/12xo1mJer2hmBK7QrYM5v-Q?pwd0107#list/path%2Fcsdn%E5%85%B1%E4%BA%AB%E6%96%87%E4%BB%B6 源文章&#xff1a;https://blog.csdn.net/iwanttostudyc/article/details/123773796?ops_request_misc%257B%2522request%25…

STM32 单片机最小系统全解析

STM32 单片机最小系统全解析 本文详细介绍了 STM32 单片机最小系统&#xff0c;包括其各个组成部分及设计要点与注意事项。STM32 最小系统在嵌入式开发中至关重要&#xff0c;由电源、时钟、复位、调试接口和启动电路等组成。 在电源电路方面&#xff0c;采用 3.3V 直流电源供…

.Net网络通信组件 - TouchSocket

文章目录 .Net网络通信组件 - TouchSocket1、新建.Net8控制台项目2、Nuget安装TouchSocket组件3、编写服务端代码4、编写客户端代码5、编写Program代码6、运行效果7、日志组件&#xff08;NLog&#xff09;参考我的另一篇博客 .Net网络通信组件 - TouchSocket 1、新建.Net8控制…

PyCharm的使用

PyCharm的入门使用教程 下载和安装PyCharm&#xff1a; 首先&#xff0c;访问JetBrains官方网站&#xff08;https://www.jetbrains.com/pycharm/&#xff09;下载PyCharm的最新版本。根据您的操作系统选择合适的版本进行下载。 安装完成后&#xff0c;打开PyCharm。 创建新…

深度学习03-神经网络02-激活函数

可以使用这个进行跳转链接​​​​​​​http://playground.tensorflow.org/#activationrelu&batchSize11&datasetspiralDatasetreg-gauss&learningRate0.01ularizationRate0.1&noise0&networkShape7,5,4,3,2&seed0.54477&showTestDatafalse&d…