文章目录

  • 什么是mock
  • vue项目引入mock
  • mock模拟数据生成列表并模拟实现已发起表单页面表格分页功能
  • mock实现数据的新增
  • mock实现数据列表的删除
  • 列表数据批量处理(如审核通过)
  • 总结与心得
    • mock使用步骤
    • 心得

什么是mock

  在进行vue项目前后端分离的开发过程中,想必会遇到这样一个问题,前端已经设计好了页面,但是需要使用后端提供的接口来接收数据,但是往往后端还尚未设计好接口,并未给出完善的接口文档,此时我们前端又想要测试自己设计的是否符合需求,进行后续开发时,我们就需要用到mock。
  mock.js是模拟一些产生一些虚拟的数据,并提供模拟的接口,可以让前端在后端接口还没有开发出来时进行独立开发,避免等待接口文档,降低效率。我们可以使用真实的url,mockjs可以拦截ajax请求,返回设定好的数据。

vue项目引入mock

  实践是检验真理的唯一标准!接下来我们将要动手实操。

  • 安装mock.js
npm install mockjs --save / yarn add mockjs --save
  • 使用mock.js模拟数据和接口
// 新建一个mockApi.js模块 来保存我们模拟的接口。 在规范的vue项目中,在/src/api文件夹新建mockApi.js
var Mock = require('mockjs') // 导入mockjs
var arr2 = Mock.mock({'list|22-100': [ // 生成一个 length是 22~100之间的数组list{'a': '@string(3,50)', // 生成3-50位的产品合同号-梯号'b': '@string(3,50)', // 生成3-50位的保养合同号'c': '@cname', // 生成客户名称'd': '@string(3,50)', // 生成3-50位的现场客户梯号'e': '@cname', // 生成巡视整改人员'f': '@date(yyyy-MM-dd)' // 生成整改时间}]
})
// 获取列表数据的接口 第一个参数表示自定义的接口地址 第二个参数表示自定义的请求方法
// 第三个参数是回调函数,定义返回的数据
Mock.mock('http://www.bbb.com', 'get', () => {return arr2})

  如下图:

  下面是我自己模拟的数据及接口

var arr = []
arr = Mock.mock({'list|22-100': [ // 生成一个 length是 22~100之间的数组{ 'inspectionId': '@integer(3,1000000)', // 生成1-1000000之间的巡视工单id'eleContractNo': '@string(3,50)', // 生成3-50位的产品合同号-梯号'mntContractNo': '@string(3,50)', // 生成3-50位的保养合同号'customerName': '@cname', // 生成客户名称'onsiteEleName': '@string(3,50)', // 生成3-50位的现场客户梯号'inspectionType|1': ['ELEVATOR', 'ESCALATOR'], // 生成作业类型'userName': '@cname', // 生成保养巡视人员'inspectionDate': '@date(yyyy-MM-dd)', // 生成巡视时间'h|1': '@time(HH:mm)-@time(HH:mm)', // 生成巡视时间段'orderCode|1': ['INITIATED', 'CHANGE_REQUEST', 'INSPECTION_AUDIT', 'COMPLETE'] // 生成订单状态}],'code': '2000','message': '这是mock数据'
})
Mock.mock(RegExp('/inspection/work/order'), 'get', () => {return arr})
  • 导入定义好的mockApi模块
 //在main.js中导入定义好的mockApi模块require('mockApi文件的地址')

  如下图:

  • 使用定义好的接口
// 方式一: 使用axios直接请求模拟接口
//在任意vue文件中 当然axios如果自己已经定义 请使用自己的 这里只做演示用
import axios from 'axios'
export default {created() {axios.get('http://www.bbb.com').then(res => {// 这里的res就是mock模拟的接口返回的数据})}
}
// 方式二: 使用src/api中规范定义的接口
import request from '@/utils/request'
// 这是src/api文夹下tourOrderApiAndConfigs.js文件中定义的接口
export const api = {// 分页显示巡视工单列表&&巡视工单查询接口getTourOrderList: {// 执行接口doApi: (params) => {return request({url: 'inspection/work/order',method: 'GET',params: params})},successTip: '执行成功', // 成功提示failTip: '执行失败', // 失败提示errorTip: '执行错误'// 错误提示}
}// 这是某个vue文件中调用接口的内容
import { api, pageConfig, exportConfig, searchConfig } from '@/api/tourOrderApiAndConfigs'
export default {methods: {getData() {// 获取表格数据const params = {pageNum: this.pageNo,pageSize: this.pageSize}api.getTourOrderList.doApi(params).then(res => {console.log(res)this.tableData = res.list.listthis.total = res.total}).catch((err) => {console.log(err)})}}
}

  具体用法及说明如图:

  通过以上步骤,我们已经简单使用mock模拟生成一个获取表格数据的接口啦!效果图如下:

mock模拟数据生成列表并模拟实现已发起表单页面表格分页功能

  接下来我将要模拟生成不同页面的数据列表,统一通过一个接口来实现。首先,我先描述一下我的业务需求:现在共有四个页面,分别为已发起表单、待修改表单、待审核表单和已完成表单页面。已发起表单查询的是所有数据,共分为两种状态:已完成和未完成。实际上模拟的数据是四种状态:

'orderCode|1': ['INITIATED', 'CHANGE_REQUEST', 'INSPECTION_AUDIT', 'COMPLETE'] // 生成表单状态

  前端调用接口时会传入orderCode值返回不同状态的表单数据。首先,模拟一个数组存储数据(以下操作均在mockApi.js文件内进行)

// 模拟一个列表数据
var arr = []
arr = Mock.mock({'list|22-100': [ // 生成一个 length是 22~100之间的数组{ 'inspectionId': '@integer(3,1000000)', // 生成1-1000000之间的巡视工单id'eleContractNo': '@string(3,50)', // 生成3-50位的产品合同号-梯号'mntContractNo': '@string(3,50)', // 生成3-50位的保养合同号'customerName': '@cname', // 生成客户名称'onsiteEleName': '@string(3,50)', // 生成3-50位的现场客户梯号'inspectionType|1': ['ELEVATOR', 'ESCALATOR'], // 生成作业类型'userName': '@cname', // 生成保养巡视人员'inspectionDate': '@date(yyyy-MM-dd)', // 生成巡视时间'h|1': '@time(HH:mm)-@time(HH:mm)', // 生成巡视时间段'orderCode|1': ['INITIATED', 'CHANGE_REQUEST', 'INSPECTION_AUDIT', 'COMPLETE'] // 生成订单状态}],'code': '2000','message': '这是mock数据'
})

  关于mock生成随机数据用法可以参考这篇作者文档Mock生成随机数据常用的类型规则

  接下来我们需要模拟定义一个方法来处理前端传来的orderCode值来返回对应的数据

/*** 模拟实现已发起巡视工单列表分页功能* params: orderCode(N),pageNum(Y),pageSize(Y)* returns: 数组+total(如startArr)*/
var { ...finishArr } = arr // 对象深拷贝
const tourOrderListByOrdercode = function(options) {var catchUrl = options.url// 截取url中携带的参数var querys = catchUrl.substring(catchUrl.indexOf('?') + 1).split('&')var result = [] // 用来存储处理结果(存储请求参数--键值对)for (var i = 0; i < querys.length; i++) {var temp = querys[i].split('=')if (temp.length < 2) {result[temp[0]] = ''} else {result[temp[0]] = temp[1]}}if (result.orderCode === 'CHANGE_REQUEST') { // 待修改表单orderCode状态var { ...modifyArr } = arr // 对象深拷贝modifyArr.list = modifyArr.list.filter(function(val) {return val.orderCode === result.orderCode})return modifyArr} else if (result.orderCode === 'INSPECTION_AUDIT') { // 待审核表单orderCode状态var { ...passingArr } = arrpassingArr.list = passingArr.list.filter(function(val) {return val.orderCode === result.orderCode})return passingArr} else if (result.orderCode === 'COMPLETE') { // 已完成表单orderCode状态finishArr.list = finishArr.list.filter(function(val) {return val.orderCode === result.orderCode})return finishArr} else { // 无参数orderCode,全查,对应已发起表单页面var { ...startArr } = arrconst total = startArr.list.lengthchangePageAndSize(startArr) // 调用此方法实现分页功能return {list: startArr,total: total,code: '2000',message: 'success'}}// 根据参数pageNum与pageSize实现分页功能function changePageAndSize(selfArr) {var totalPage = []var pageAllNum = Math.ceil(selfArr.list.length / result.pageSize) || 1for (let i = 0; i < pageAllNum; i++) {totalPage[i] = selfArr.list.slice(result.pageSize * i, result.pageSize * (i + 1))}selfArr.list = totalPage[result.pageNum - 1]console.log(selfArr)return selfArr}
}

  当模拟完成列表数据和处理数据的方法后,我们还需要模拟一个接口供前端调用,完成这一步,整个流程才算是结束了。具体如下:

Mock.mock(RegExp('/inspection/work/order' + '.*'), 'get', tourOrderListByOrdercode)

  说明一下:RegExp('/inspection/work/order' + '.*')这是正则表达式用法,此处具体含义是全匹配,无论/inspection/work/order'后面携带的什么参数,携带了多少参数,此接口都能成功调用,这是mock模拟携带参数接口所需要使用的方法。
  到这里,我们就已经实现了mock模拟数据生成列表并模拟实现已发起表单页面表格分页功能,并提供了前端调用的接口,前端只需要向后端传orderCode(非必须),pageNum(必须)和pageSize(必须)这三个参数并调用接口就能成功接收到模拟的数据,并实现分页功能啦!代码如下(相关说明已在前文指出):

// 这是src/api文夹下tourOrderApiAndConfigs.js文件中定义的接口
import request from '@/utils/request'
export const api = {// 分页显示巡视工单列表&&巡视工单查询接口getTourOrderList: {// 执行接口doApi: (params) => {return request({url: 'inspection/work/order',method: 'GET',params: params})},successTip: '执行成功', // 成功提示failTip: '执行失败', // 失败提示errorTip: '执行错误'// 错误提示}
}// 这是某个vue文件中调用接口的内容
import { api } from '@/api/tourOrderApiAndConfigs'
export default {methods: {getData() {// 获取表格数据const params = { //向后端传参orderCode: 'COMPLETE' // 此处需要传值时则赋予对应的状态值,不需要时,此代码不写pageNum: this.pageNo,pageSize: this.pageSize}api.getTourOrderList.doApi(params).then(res => {console.log(res)this.tableData = res.list.listthis.total = res.total}).catch((err) => {console.log(err)})}}
}

mock实现数据的新增

  那么,如何使用mock模拟实现数据的新增呢,首先,我们应该明确,模拟新增其实就是将新数据拼接到列表数组中。整个思路大致为:前端将新增数据通过调用接口传给"后端",然后"后端"将此数据拼接到之前的列表数组中("后端"指代mock)。步骤如下:

  • 前端通过填写表单存储数据并调用接口传给"后端",截图及代码如下:

    填写完表单后点击提交,调用新增接口。代码如下:
//这是src/api中tourOrderApiAndConfigs.js文件中定义的新增请求接口
import request from '@/utils/request'
export const api = {// 表单新建接口creatTourOrder: {// 执行接口doApi: (data) => {return request({url: 'inspection/create/order',method: 'POST',data: { obj: data }})},successTip: '执行成功', // 成功提示failTip: '执行失败', // 失败提示errorTip: '执行错误'// 错误提示}
}// 这是新增页面提交按钮方法
methods: {submitForm(formName) {this.$refs[formName].validate((valid) => {if (valid) {this.$confirm('确认提交表单吗?', '提示', {confirmButtonText: '确认',cancelButtonText: '取消',type: 'warning'}).then(() => {// 将时间段数组数据分别存入不同字段this.ruleForm.beginInspectionPeriod = this.value1[0]this.ruleForm.endInspectionPeriod = this.value1[1]console.log(this.ruleForm)if (this.ruleForm.inspectionType === '升降梯') {this.ruleForm.inspectionType = 'ELEVATOR'}if (this.ruleForm.inspectionType === '扶梯') {this.ruleForm.inspectionType = 'ESCALATOR'}console.log(this.ruleForm)var obj = this.ruleFormapi.creatTourOrder.doApi(obj).then(res => { // 表单创建调用接口console.log(res)})this.$router.push('startTourOrder')this.$message({type: 'success',message: '工单新建成功!'})}).catch(() => {this.$message({type: 'info',message: '已取消'})})} else {console.log('error submit!!')return false}})}}


  此时,前端已经将新增数据传给"后端",此时"后端"需要将这条新增数据拼接到原有列表数据中,以模拟实现新增功能。代码如下:

/*** 数据的添加操作* @param {*}* @returns*/
const listAdd = function(options) {try {var obj = JSON.parse(options.body).objobj.h = obj.beginInspectionPeriod + '-' + obj.endInspectionPeriod // 拼接成时间段var newArr = []newArr[0] = objarr.list = arr.list.concat(newArr[0]) // 将前台返回来的数据,拼接到数组中return {code: '2000',message: '建单成功!'}} catch (error) {return {code: 'error',message: '出现错误!'}}
}
Mock.mock('/inspection/create/order', 'post', listAdd)

  到这里,我们就实现了使用mock完成数据的新增。结果如图:

mock实现数据列表的删除

  删除其实和新增类似,删除需要前端传递一个参数id,"后端"根据这个id遍历数组并将其删除,返回新的数组,实现删除功能。当然,这个参数可以是个id集合,将这个集合传给"后端"实现删除(后文有实例说明)。

  首先,前端调用请求接口并携带参数id。代码如下:

// 这桑src/api文件夹中tourOrderApiAndConfigs.js文件中定义的删除接口
import request from '@/utils/request'
export const api = {// 巡视工单撤销与删除接口tourOrderDelete: {// 执行接口doApi: (data) => {return request({// url: '/inspection/revoke/${info.eleContractNo}',url: '/inspection/revoke',method: 'POST',data: { id: data }})},successTip: '执行成功', // 成功提示failTip: '执行失败', // 失败提示errorTip: '执行错误'// 错误提示}
}// 这是已发起表单中的删除方法
methods: {deleteKpi(index, row) {// console.log(index)this.$confirm('是否确认删除该巡视工单?', '提示', {confirmButtonText: '确定',cancelButtonText: '取消',type: 'warning'}).then(() => {var id = row.eleContractNoapi.tourOrderDelete.doApi(id).then(res => {this.tableData = res.listthis.getData()})}).then(() => {this.$message({type: 'success',message: '删除成功!'})}).catch(() => {this.$message({type: 'info',message: '已取消'})})}
}

  此时,"后端"接收参数id并处理数组,实现删除。代码如下:

/*** 删除表单* @param id* @return arr*/
const listDelete = function(options) {try {const id = JSON.parse(options.body).idconsole.log(id)arr.list = arr.list.filter(function(val) {return val.eleContractNo !== id // 过滤掉前台传过来的id对应的相应数据,并重新返回})if (finishArr !== '' && finishArr !== null) { // 已完成巡视工单删除finishArr.list = finishArr.list.filter(function(val) {return val.eleContractNo !== id // 过滤掉前台传过来的id对应的相应数据,并重新返回})}return {code: '2000',message: '删除成功!'}} catch (error) {return {code: 'error',message: '删除失败!'}}
}
Mock.mock('/inspection/revoke', 'post', listDelete)

  到这里,我们就使用mock模拟实现了删除功能。

列表数据批量处理(如审核通过)

  刚刚在说明模拟删除时提到,前端可以传递一个id集合给"后端",“后端"再处理这个id集合实现批量删除,由于我当时的业务需求并没有批量删除,只有一个批量通过,其实效果都是一样的,都是传给后端一个id集合。所以在这里,我将使用mock模拟实现批量通过功能(全选/选择某几项),首先,展示一下前端页面效果图:

  当我点击通过按钮后,调用相应的接口,并将选中的数据的id集合传给"后端”。代码如下:

// 这是src/api文件夹中tourOrderApiAndConfigs.js文件定义的通过接口
export const api = {// 巡视工单审核通过接口// auditType判断tourOrderAudit: {// 执行接口doApi: (data) => {return request({url: 'inspection/audit',method: 'POST',data})},successTip: '执行成功', // 成功提示failTip: '执行失败', // 失败提示errorTip: '执行错误'// 错误提示}
}// 这是待审核表单页面定义的参数及通过方法
data() {return {selectData: [],selectCount: 0,form: {auditType: '',funId: []}}
},
methods: {select(selection) {this.form.funId = []for (var i = 0; i < selection.selection.length; i++) {this.form.funId.push(selection.selection[i].inspectionId)}},selectChange(data) { // 全选/全不选// 勾选this.selectData = datathis.selectCount = data.lengththis.form.funId = []for (var i = 0; i < this.selectCount; i++) {this.form.funId.push(data[i].inspectionId)}},accessPass() {if (this.selectCount === 0) {this.$message({type: 'warning',message: '您并未选择工单,请先选择工单再进行操作'})} else {this.$confirm('是否确认通过选中巡视工单?', '提示', {confirmButtonText: '确定',cancelButtonText: '取消',type: 'warning'}).then(() => {this.form.auditType = 1 // auditType是判断业务是通过还是需整改,1为通过api.tourOrderAudit.doApi(this.form).then(res => {console.log(res)this.getData()})}).then(() => {this.$message({type: 'success',message: '通过成功!'})}).catch(() => {this.$message({type: 'info',message: '已取消'})})}},
}

  此时,"后端"接收到前端传来的id集合–funId,进行处理后返回新数据。代码如下:

/***巡视工单需整改提交整改信息模拟接口(尚未完成)与巡视工单审核通过接口(已完成--正常)* @param {*} options* @returns* 逻辑仍需处理,该模拟接口尚未完善*/
const rectifyDataInput = function(options) {try {console.log(options)const id = JSON.parse(options.body).auditTypeconst idList = JSON.parse(options.body).funId // 当审核通过时,这里的funId是一个inspectionId集合;需整改时,仅一个数据var handleData = []for (var i = 0; i < idList.length; i++) {arr.list = arr.list.filter(function(val) {if (val.inspectionId === idList[i]) {val.orderCode = 'COMPLETE'handleData.push(val)}return val.inspectionId !== idList[i] // 过滤掉前台传过来的id对应的相应数据,并重新返回})}if (id === 1) { // 巡视工单审核通过var newArr = []newArr = handleDatafinishArr.list = finishArr.list.concat(newArr) // 将该数据,拼接到已完成表单数组中return {list: finishArr,code: '2000',message: '巡视工单审核已通过!'}}if (id === 0) { // 巡视工单需整改console.log('还需整改!')return {code: '2000',message: '整改信息提交成功!'}}} catch (error) {return {code: 'error',message: '整改信息提交失败!'}}
}
Mock.mock('/inspection/audit', 'post', rectifyDataInput)

  到这里,我们就已经完成了批量通过功能。结果如下:

总结与心得

mock使用步骤

  • 安装mock.js
  • 使用mockjs模拟数据并开发接口
  • 导入定义好的mockApi模块
  • 使用定义好的接口

心得

  通过使用mock来模拟数据和接口,能够很方便的为我们前端开发提供便利,我们不再必须先等后端设计完成接口后再进行开发了,非常实用!但是有一个地方需要说明一下,一般情况下我们只需要模拟出虚拟数据就够了,不需要继续模拟实现复杂的业务逻辑,比如新增、按状态查询等等,我们只需要按照后端提前给出的接口文档将需要传递的参数及字段规范好即可。当然,如果时间充裕的话,做一些上述的业务逻辑处理也是非常有意义的

vue项目使用mock模拟数据并实现列表的增、删、分页、批量操作功能相关推荐

  1. 【Vue】使用mock模拟数据

    目录 一.mock.js 二.vue项目使用mock.js 三.mock.js文档 一.mock.js 对于前后端分离的项目,前端不得不等待后端接口写好后再请求数据.或者自己需要手写一些'死'数据来模 ...

  2. 在vue中使用Mock模拟数据

    Q:为什么进行模拟数据? A:在做开发时,后端程序没有配齐,前端人员在做vue开发时,需要自己先模拟接口,模拟数据,等到后端数据配齐,提供好接口后,将项目中的接口换一下即可 一.本地加载请求静态jso ...

  3. vue中使用mock模拟数据

    1.安装mock npm install mockjs --save-dev 2.在src下创建mock目录添加mock.js文件 mock.js const Mock = require('mock ...

  4. vue-cli快速构建vue项目和本地模拟请求数据

    Vue-cli快速构建 Vue 项目和本地模拟请求数据 1 前提: 安装了 node.js 首先: 全局安装 vue-cli npm intsall vue-cli -g (-g代表全局安装) 2 使 ...

  5. vue尚品汇商城项目-day03【vue插件-19.mockjs模拟数据(开发Home首页当中的ListContainer组件与Floor组件)】

    文章目录 19.mockjs模拟数据(开发Home首页当中的ListContainer组件与Floor组件) 本人其他相关文章链接 19.mockjs模拟数据(开发Home首页当中的ListConta ...

  6. VUE开发环境下mock模拟数据与后端接口对接示例

    在以往的前端开发中,前端严重依赖后端,必须等待后端接口开发出来才能继续开发.使用mock,可以使得前后端开发异步进行,互不影响.Mock.js 是一个模拟数据生成器,使用它可以拦截ajax请求,直接模 ...

  7. vue项目中使用mock模拟数据

    一.先在vue项目中安装依赖 # 使用axios发送ajax cnpm install axios --save # 使用mockjs产生随机数据 cnpm install mockjs --save ...

  8. mock模拟的数据能增删改查吗_如何在Vue中使用Mockjs模拟数据的增删查改

    之前一直使用json-server在前端开发时,搭建本地数据接口测试,但有时又需要将做好的项目放于 github page上做项目演示.在本地时,json server很好使用,但一旦放在github ...

  9. 在微信小程序项目中使用mock模拟数据

    之前对mockjs做了一个介绍,以及在js.vue中拦截ajax的方法,介绍是必看的,也是一些基础 mockjs介绍总结 mockjs拦截ajax 在vue项目中使用mock拦截axios请求 这一篇 ...

最新文章

  1. WCF学习笔记(二):在WCF中使用集合传输数据
  2. 竞赛专题 | 挖掘模型哪家强,自动调参 VS 祖传参数?
  3. ubuntu桌面管理
  4. ORB-SLAM3系列-多地图管理
  5. 数组、链表、Hash(转)
  6. 使用kuberbuilder创建工程示例
  7. python关键字as_python 之 import、from、as 关键字的 白话 解释与例子
  8. SPOJ Problem 6219:Edit distance
  9. 导出excel数字前面的0消失_Excel操作中常见的3大坑你遇到过吗?遇到应该这么解决...
  10. 计算机教育工作,计算机教育教学工作总结
  11. 学习java第一天 (大白(●—●))
  12. 2016年度最受欢迎的100个Java库
  13. python部署到linux打开ie_Linux上部署python+selenium+webdriver常见问题解决方案
  14. 华三ASPF技术白皮书
  15. linux 3ds 模拟器下载,3DS模拟器电脑版
  16. 软考架构师 | 01 考试介绍及备考攻略
  17. python MDI窗口加载ui文件方法
  18. 第五章创业机会与创业风险
  19. 【2022第十三届蓝桥杯】c/c++ 大学c组 解题报告
  20. 188数码管驱动案方案

热门文章

  1. LXR:在线浏览和对比linux内核源码
  2. Linux内核结构(LXR linux)
  3. 工厂卖家如何借助TikTok突围?
  4. pandas的疯狂融合之路
  5. 搜狐智能媒体研发中心暑期面试
  6. linux pclint配置_pclint设置 | 学步园
  7. Git cherry-pick 是什么,如何使用?
  8. 上海市金山区财政局容灾项目招标
  9. php中求解二元一次方程,C#二元一次方程参数求解
  10. vnc远程操作,vnc远程操作怎么实现?实现教程