• mock造数据


    前端开发,需要和后台联调;很多时候,前端开发并不需要等后台完全写好接口在去联调,自己可以写死数据,渲染数据,加样式。后台人员有时会很忙,他没有时间写好返回所有的数据等等,特别是新开一个项目,从零开始的那种,前端要是等后台写好,开发效率就不高了。所以自己造数据很重要。有一段时间,我每天早上来就催后台给我开服务器,应该不开的话,代码不好写,效率不快,会影响每天的任务的,影响了的话就要苦逼的加班。

    我做过一个项目,进件新增编辑的,表单字段,一个表单页面有20~30来个字段,填写完最快都要半首歌的时间,页面刷新又得重新填,又得花那个时间。后来同事小强建议写死一个json数据自动填写,填都不用填了。其实省下不少时间。突然间我就意识到写假数据对于一个前端来说,挺重要,可以节省时间,多出来的时间,可以休息,测试项目的功能或者学习新东西。

    在上一家体育公司中,我写了一个体测数据的页面,一个页面很长,密密麻麻的全是体测的数据。记得当时页面的每一部分的数据,我都是用同一个数据,其实这样子不好,因为页面需要的最终数据(比如文字的长度,是否符合该字段正则表达式等等)和写的假数据有时很大出入,会影响页面效果的。如果有问题,你就要重新写样式,加班加点。之前写过一个大屏直播的页面,用户的那个名称,一般人都是2到3个汉字,所以我自然没有考虑到4个汉字的名称,结果悲剧了,真有4个字的人名,然后那一块样式排版乱掉,我又得改。这种场景就需要一个js工具帮我随机生成2到4字的名字。

    办公地点.jpg
    上图为2019年的工作环境

    研究了一个专门造假数据的库,叫mock。其实这个东西我在2018年的年初就已经知道了,有一次面试,面试官问过这个问题(结果是流泪的),后来只不过看了2天的官方文档,就让它在一边吃灰,因为在上一家体育公司的项目中应用场景不多。最近项目闲下来,我花了1天的时间(其实就是半天)写了一个工具类js,方便自己以后在新开项目时或者特别需要假数据时使用。

    mock有两个好处:1. 随机的生成假数据,每次页面刷新都不一样;2. 它可以拦截ajax请求,就是说当你定义在mock里面的接口路径和真实的后台接口路径一样时,前者就把后者拦截。

    代码如下面所示哈:

    import Mock from 'mockjs';
    let Random = Mock.Random;
    
    //枚举的工具对象
    //其实就是`map`方法遍历一个数组,生成一个数组和一个`code`数组,`code`和新数组的序号是一致的,所以就可以轻易的输入`code`拿到想要的值
    class EsEnum {
        constructor(arr) {
            let typeArr = [];
            if (!Array.isArray(arr)){
                throw 'arr is not an array!';
                return;
            }
    
            arr.map(element => {
                if(!element.code || !element.name) {
                    return;
                }
                // 保存code值组成的数组,方便A.getName(name)类型的调用
                typeArr.push(element.code);
                // 根据code生成不同属性值,以便A.B.name类型的调用
                this[element.code] = element;
            });
            
            // 保存源数组
            this.arr = arr; 
            this.typeArr = typeArr;
        }
    
        // 根据code得到对象
        valueOf(code) {
            return this.arr[this.typeArr.indexOf(code)];
        }
    
        // 根据code获取name值
        getNameByCode(code){
            let prop = this.valueOf(code);
            if (!prop){
                throw 'No enum constant'  + code;
                return;
            }
    
            return prop.name;
        }
    
        // 返回源数组
        getValues() {
            return this.arr;
        }
    }
    
    
    // 配置拦截 ajax 的请求时的行为,支持的配置项目有 timeout。
     Mock.setup({
        timeout: '200 - 400'
    })
    
        
    //接口api
    /** 
     *  * @description: 通用工具类  
     *  * @author: StephenWu5   
     *  * @paras   接口链接,接口类型,返回数据结构,返回数据的长度
     *  * @date: 2019-12-3 15:38:27 
     */
    export const  createApiByMock = function(apiUrl,apiType,paraSet) {  
        let data = []; //等下要返回的数据
        let returnData ={};
        let dataLength = paraSet.dataLength || 10;
    
        for (let i = 0; i < dataLength; i++) {
            let images = [1,2,3].map(x=>Random.image('200x100', Random.color(), Random.word(2,6))); //随机成长3个图片信息 尺寸 颜色 和随机字母的数组
            let paraSetNew = JSON.parse(JSON.stringify(paraSet))
            let dataTypeEnum = new EsEnum([
                //==============================================配置的开始==========================================================
                {code: '0', i},   //id 唯一性
                {code: '1', name: Random.cname()},   //中文姓名    cfirst 模拟姓氏  clast 模拟名字    name 英文名字
                {code: '2', name: Random.cword(8,20)},   //标题  8和20是长度
                {code: '3', name: Random.integer(100,5000)},   // 100到5000的随机整数    natural  返回随机的自然数
                {code: '4', name: images.slice(0,Random.integer(1,3))},//截取随机一到三个图片    
                {code: '5', name: Random.image('200x100', '#4A7BF7', 'picture')}, //模拟图片 宽高不指定则随机   
                {code: '6', name: Random.date()},   //日期  yyyy-MM-dd   yyyy-mm-dd是指定格式
                {code: '7', name: Random.time()},   //时间
                {code: '8', name: Random.province()},   //省
                {code: '9', name: Random.city()},   //市  Mock.mock('@city(true)')  加参数true会有奇效哈
                {code: '10', name: Random.county()},   //区   Mock.mock('@county(true)')
                {code: '11', name: Mock.mock('@EMAIL()')},   //邮箱
                {code: '12', name: Mock.mock(/^1[0-9]{10}$/)},   //手机(座机)  这里可以正则
                {code: '13', name: Mock.mock('13531544954')},   //身份证
    
                Mock.mock({ code: '14', "name|1":['精品语文班','精品作业A班','英语班','语文班']}),   //身份证包括一切的枚举,使用率最高
    
                {code: '21', name: Random.csentence(5, 10)},   //生成一条随机的中文句子
                {code: '22', name: Random.cparagraph(0, 10)},   //随机生成0到10段句子
                {code: '23', name: Random.url()},   //url
                {code: '24', name: Random.ip()},   //ip
            //==============================================配置的结束==========================================================
            ])
            for(let key in paraSetNew){
                if(!key){  
                    return;
                }
                if(key === 'dataLength'){
                    continue;
                }
                paraSetNew[''+key] = dataTypeEnum[""+paraSet[""+key]]['name']
            } 
    
            delete paraSetNew.dataLength;  //就看你想不想留dataLength;
            data.push(
                //{allData: (dataTypeEnum)},  //这里就是精华所在哈
                paraSetNew
            )
        }
    
        //利用assign添加默认值 status message
        returnData = Object.assign({
            status: 200,
            message: 'success',
            length: data.length,
        }, {data});
    
    
        // Mock.mock( url, post/get , 返回的数据);
        Mock.mock(apiUrl,apiType, returnData); // 获取验证码
    }
    
    

    使用就是新建一个js文件,把它导入到项目中,使用如下:
    这一步只是在项目注册这个api,还要写一个调用该api的方法才可以。真有一个下午,就是今天,我在项目中引入这个工具类,也注册了,看不到效果,我以为是这两个地方写错了,找来找去,原来是缺了调用该api的方法(就是最后一步下方的代码)。半小时就这样折腾没了。西湖啊,我的泪。

    import {createApiByMock} from './mock';
    
    
    //使用实例   dataLength 是返回数组的长度哈
    let paraSet = {
        name: 1,
        age: 3,
        dataLength: 10
    }
    createApiByMock('http://localhost:8080/getMockData','get',paraSet);
    

    最后一步,调用该api
    其实这个代码和mock无关,只不过我的接口名和项目的不一样,所以就写成这样子。

    //得到mock数据, 
    export const getMockData = (data) => Request.get(`/getMockData`, data, createHeader());
    

    这样子就可以快速拿到自己想要的数据,简单。需要特别注意的是,和mock相关的代码,特别是第2部分的代码,生产,测试环境不能提交,要是不小心提交了,领导会很生气的,他会让你不能下班或者不上班,所以还需要在项目中加上环境判断的代码,决定是否使用注册api那部分的代码哈。

    写到这里,我突然感觉,那些vuejqueryreact其实就是和我这个js是类似的啊,只不过前者就是很多技术大佬写出来,维护,功能强大,可以做很多事情,文件体积大,经过了单元测试,使用的话不会出什么问题;而我这个体积小,功能单一,只能做一件事情,比较辣鸡。前者是优秀电视剧《甄嬛传》的话,后者就是抖音短视频。前者后者只不过都是前端工程师开发的工具,让我们快速的写页面,和那些ppt模版,编辑器vscode,vim没有什么两样都属于工具来的,类似父亲的泥水刀,农民耕田用的水牛,厨师的菜刀。

    以后有空闲的话,再搞axiosutils,vue组件echart等几个常用的工具类出来吧。方便你我她他它使用,顺便假装大佬哈哈哈哈哈哈哈。

    最后,欢迎关注我的公众号。

    公众号二维码.jpg

  • 相关阅读:
    一、定义枚举类,并随机取值
    常用Linux日志查询命令
    一、爬虫之基础
    Jmeter接口自动化-3-生成HTML报告
    Jmeter接口自动化-2-查看结果数只能显示有限的数据,查看全部数据
    Jmeter接口自动化-1-启动报错:Could not initialize class org.apache.jmeter.gui.util.MenuFactory
    三十一、Java基础之Collection集合
    设计模式
    缓存
    Ckeditor配置
  • 原文地址:https://www.cnblogs.com/StephenWu5/p/12187855.html
Copyright © 2020-2023  润新知