2022-01-06 个人心得和扩展mock高级应用

这2天没有接口,于是学习了下mock用法,2天归纳出来的自己学习掌握的经验,也解决了mock再语法上对数组的嵌套不支持路径语法的问题。 vue+mock

/**
 * @AUTHOR  KYOL:luowei 
 * @description useing development-data to write components for process/
 * 
 */
 import Mock from 'mockjs'
 import Vue from 'vue'
 window.kyolMock = {}
  const moduleFiles = require.context('.', true, /\.js$/)
  const files = moduleFiles.keys().reduce( (p, n ,i) => {
     const file = moduleFiles(n)?.default || moduleFiles(n)
      return Object.assign(p, file)
  },{})
 
  Object.defineProperty(files,'keys',{
      value: Object.keys(files),
      enumerable :false,
      configurable: false,
      writable: false
  })
 
 /**
  * deep tree 扩展语法的缺陷,实现属性定位赋值, 
  * 
  */
 const deepTree = function(tree, parent = []) {
     const keys = Object.keys(tree)
     const att = str => str.match(/\/\w+/g)?.map?.(key=>key.slice(1)) || []
     const getValue = (obj,arr, defaultValue) => arr?.reduce?.( (p,n)=> p?.[n] || defaultValue,obj) 
     keys.forEach( key => {
         const value = tree[key]
         if(Array.isArray(value)){
             const _parent = [...parent]
             value.forEach( childKey => deepTree(childKey, _parent.concat(tree)))
         } else if(typeof(value) ===  'string') {
             if(value.startsWith('@.') || (value.startsWith('@') && value.length > 1)){
                 const _attKey = att(value)
                 const length = value.match(/\.\.\//g)?.length || 0
                 if(value.includes('../')){
                     tree[key] = getValue(parent.slice(-length)[0], _attKey, value) 
                 } else if(value.includes('./')){
                     tree[key] = getValue(tree, _attKey,value) 
                 } else if(value.startsWith('@') ){
                     const propertyKeys = value.replace('@','').split('/')
                     tree[key] =  getValue(parent[0], propertyKeys, value) 
                 }
             }
         }
     })
 }
 
 const getNewData = function (path, type) {
     const template = typeof(type) === 'object' && !Array.isArray(type) ?  type : files[path] 
     const data = Mock.mock(template || {code:-1,data:{},message:'请求地址无效'})
     const code = data.code || 200, message = data.message || '请求成功'
     Object.assign(data, {code, message})
     deepTree(data)
     typeof(type) === 'function' && type(data)
     kyolMock[path] = data
     return data
 }
 Vue.prototype.$mock = function(key, type){
     return  Promise.resolve(getNewData( key, type))
 }
 Vue.prototype.$mock.setTip = ''
 
 /*express 拦截并没有什么卵用,直接动态响应,更加方便调研查看*/
 export default function (app, server, compiler){
     console.log(app, server, compiler,'express')
     const mockList = files.keys
     try{
         let esc = false
         mockList.forEach( path => {
             if(esc) throw('mock success')
             app.use(path,(req, res , next) =>{
                 esc = req.path.includes(path)
                 const {0:type, 1:url } = path.split(' ')
                 const data = Mock.mock(url,type,files[path])
                 res.send(data)
                 if(!esc) next()
             })
         })
     }catch( message ){
         console.log(message)
     }
 }
 
 /**
  * 个人代码风格
  * @desc: 1:和业务无关的功能、开关 数据转化、代码块独立成函数。
  * 2:也业务有关初始、结束,入口,出口,代码块独立成函数。
  * 3:组件与开发者关心的数据作为输入输出,其他中间件,不作为组件的抛出产物。
  * 4:样式规范:所有组件有一个和组件名一致的class,和一个位移class。并列,
  * 5:子组件与父亲组件层级关系,用parent-child,最终功能快child-tag,展示片段为hild-tag_片段名
  * 6:递归和尾递归的最大区别在于,尾递归没有内部参数定义,减少了闭包的形成。
  * 7:
  */

  /**MOCK语法 */
  //template
  let url,type,template;
  Mock.mock( [url,type],template)
  /**语法规则 */
  template =  {
        // 返回长度内字符串
        'label|2': '',               //    随机字符串长度为2
        'label2|2-5': '2',            //    重复次数 '222'
        'label3':'jskajsd',             //    固定字符
        'arrat|1':['a','b','c'],     // 返回重复数组的长度 a | b | c ,随机返回数组中的字符
        'arrat2|+1':['a','b','c'],     // 返回重复数组的长度 a -> b -> c ,每次顺序获取组中的字符

        // 返回数字
        'number|1-100' : 2,          // 返回1-100的数字  跪着是 value 是一个数字
        'number2|+1' : 2,             // value 是一个数字,以value的初始值开始每次迭加 1
        "number3|1-100.1-10": 1,      // value 是数字,每次返回1-100之间且 1-0位小数

        // 返回数组
        'arrat|2':['a','b','c'],     // 返回重复数组的长度 ['a','b','c','a','b','c']
        'arrat|2-10':['a','b','c'],   // 重复次数 返回长度2-10之间的,
        
        // 返回对象
        "object|2": {                  // value 是对象,返回随机2个属性  2-5 随机2-5个属性
            "310000": "上海市",
            "320000": "江苏省",
            "330000": "浙江省",
            "340000": "安徽省"
          },
        //  Function 函数模式获取当前对象this
        'funName': function() {         // value 是函数,必须返回值,内部this 指向当前对象 template 
            return this.foo
        },
        // 定位属性
        path : '@/number',               // 返回template.number 的属性值
        pathObject:{ 
            path2 : '../path'            // 返回相对定位 上一层对象 path 属性
        },
        /**数据占位符定义  @变量(num),@变量(min,max)*/
        'antKey':`
                 @boolean(num),
                 @integer(min,max) | min,
                 @character("lower")    @character("upper")   返回小写、大写字符
                 @string()   @string(5)  @string("upper",5,10)  返回字符串
                 @date("yyyy-MM-dd")                           返回日期格式
                 @time("HH:mm:ss")                              返回时间
                 @datetime("yyyy-MM-dd A HH:mm:ss")             返回完整时间
                 @color                                         返回颜色  #ffee44
                 @rgb()                                         返回RGB
               
                 英文
                 @paragraph
                 @sentence  @sentence() @sentence(5)   @sentence(2,8)               返回英文行数范围
                 @word @word(5) @word(2,8)                      返回字母个数范围
                 @name   @title
                
                 中文
                 @cparagraph  @cparagraph(3) @cparagraph(1,4)  返回汉字行数    C 标识为中文
                 @csentence  csentence(5) csentence(2, 7)       返回汉字个数范围
                 @cword @cword(5) @cword(2,8)  
                 @cname   @ctitle


                地理位置
                @@province 
                @city() @city(true)                             返回城市,为真 则返回上一级关系
                @county() @county(true)
                
                网络常用
                @id() @web() @emal()

                路径 ## 只能使用在对象属性和属性上,不能使用在数组上
                绝对路径 @/wen                                  // 返回从template开始的this对象   
                相对路径 @../  @./                              // 返回相对位置的路径,也只能使
                自定义 相对路,绝对路径再数组中的判断
                @/

                函数    ## 只能使用在一级属性数
                function(context){ return this.Key }            // 是从template对应的this.开始
                 `

  }


  /**模板例子*/
  export default {
    // 走马灯+快捷设置
    'get /carousel/kyol': {
            data:[ {
                title:'系统模板',
                key:1,
                children:[
                        {
                            'label': '报表中心',
                            'key':1,
                            'parentKey':'@../key',         // 自定义模板语法替换
                            'disabled': false,
                            'checked': true,
                            'coruleCodede':'A000006',
                            'path':'@/data/0/title',        // 自定义模板语法替换
                        },
                        {
                            'label': '项目平台',
                            'key':2,
                            'parentKey': '@../key',       // 自定义模板语法替换
                            'disabled': false,
                            'checked': true,
                            'path':'/home',    
                            'ruleCode':'A000619'
                        },
                ]
        }]
    },
    // 设置面板
    'get /sortCrad/defaultObject':{
        'data':[
            {
                'title':'资源面板:',
                'key': 1,
                'checked': false,
                'children|3':[
                    {
                        'label|+1': ['全国布局概览','资源去化概览','租约即将到期资源分析'],
                        'parentKey': '@../key',
                        'key|+1': 1,
                        'disabled': false,
                        'checked': false,
                        'code|+1':['A0478','A0479','A0480']
                    }
                ]
            },
            {
                'title':'客户面板:',
                'key': 2,
                'checked': false,
                'children|4':[
                    {
                        'label|+1': ['客户转化率分析','客户来源渠道分析','客户产业结构分析','客户产值贡献、税收达成率'],
                        'parentKey': '@../key' ,
                        'key|+1':1,
                        'disabled': false,
                        'checked': false,
                        'code|+1':['A0481','A0482','A0483','A0484']

                    }
                ]
            },
            {
                'title':'租赁面板:',
                'key': 3,
                'checked': false,
                'children|2':[
                    {
                        'label|+1': ['租赁签约统计','到期合同与续租分析'],
                        'parentKey': '@../key' ,
                        'key|+1':1,
                        'disabled': false,
                        'checked': false,
                        'code|+1':['A0485','A0486']
                    }
                ]
            },
            {
                'title':'销售面板:',
                'key': 4,
                'checked': false,
                'children':[
                    {
                        'label': '销售签约统计',
                        'parentKey': '@../key' ,
                        'key':1,
                        'disabled': false,
                        'checked': false,
                        'code':'A0487'

                    }
                ]
            },          
            {
                'title':'财务面板:',
                'key': 5,
                'checked': false,
                'children|2':[
                    {
                        'label|+1': ['财务应收与回款统计','逾期欠款与账龄分析'],
                        'parentKey': '@../key' ,
                        'key|+1':1,
                        'disabled': false,
                        'checked': false,
                        'code|+1':['A0488','A0488']

                    }
                ]
            },
        ]
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,752评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,100评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,244评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,099评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,210评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,307评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,346评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,133评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,546评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,849评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,019评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,702评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,331评论 3 319
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,030评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,260评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,871评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,898评论 2 351

推荐阅读更多精彩内容