为了更人方便、更人性化的进行body、query或者response中的字段设计,我又拓展了字段类型,一方面可以更快速的进行字段设计,另外一方面,可以生成更符合实际情况的mock数据。系统会在test_data匹配不到数据的时候,默认返回response设定好的字段里面的mock数据。
所有字段都共有的属性
name : 字段名称desc : 字段描述required : 字段是否必填,(可选) 不填写的时候默认是必填type : 字段类型default :  字段的默认值,(可选) 不填写时默认是空value : 一旦设置了value, 那么mock就一直只会返回value的值,其它所有值范围属性都会忽略category_id: {name: "category id", type: "int", value:10},
enum : enum是一个数组,mock会随机返回enum数组中的值,例如category_id: {name: "category id", type: "int", enum:[10,20,30]},
enum列表[10,20,30]中的其中一个enum有两种写法:
enum:[-1, 1],$enum:[[-1,"失败"], [1, "成功"]],注意$enum是以$美元符号开头的,表示后面的元素是以数组形式表现,元素的第一个是值,第二个是值的描述。第二种写法和第一种写法获得的结果都是一样的,值只能是:-1 和 1中的一个。增加说明的目的是为了方便以后值的阅读和维护,我们经常时间长了会忘记每一个枚举值的作用。
如果你这么写:
enum:[[-1, "s"], [1, "d"]]
表示值只能是[-1, "s"] 和[1, "d"] 中其中一个数组
int 就是整数类型,是number的一个子集,他有这么几个范围的参数,他们分别是(按有效优先级别展示):
min_value 最小值,设定后,所有mock的值会大于这个值,例如:category_id: {name: "category id", type: "int", min_value:1},
max_value 最大值,设定后,所有mock的值会小于这个值,例如:category_id: {name: "category id", type: "int", max_value:1000},
通常min_value和max_value会同时使用,例如
category_id: {name: "category id", type: "int", min_value:1, max_value:1000},
我们还有其它数字类型,如:正整数PosInt、负整数NegInt,浮点数Float,正浮点数PosFloat,负浮点数NegFloat,时间戳Timestamp。
表示正整数, 是int的子集
表示负整数, 是int的子集
表示小数, 是number的子集
表示正小数, 是Float的子集
表示负小数, 是Float的子集
小数比整数多了三个参数:
decimal_places 表示小数的固定位数,默认是2位money: {name: "Money", type: "float", decimal_places:2},
min_decimal_places 表示小数的随机的最小位数,默认为2位money: {name: "Money", type: "float", min_decimal_places:2},
max_decimal_places 表示小数的随机位数的最大位数, 默认最大10位money: {name: "Money", type: "float", max_decimal_places:10},
通常min_decimal_places和max_decimal_places会同时使用,例如
money: {name: "Money", type: "int", min_value:1, min_decimal_places:2, max_decimal_places:10},
注意:小数位数长度最好设置太大,不然有可能依法溢出错误
时间戳,是int的子集,默认随机返回当前时间前后两年的时间戳
created: {name: "Created time", type: "timestamp"},
同样可以设置最小值min_value和最大值max_value,但是整数 min_value默认的最小值是当前时间戳提前两年,最大值的时间戳是当前时间戳
除了array和object字段,其它字段中如果没有设置type,则默认都为string类型,string类型返回的是随机的应为字符串。 string除了value属性和enum属性,string特有的属性是:length字符串固定长度,min_length字符串最小长度,max_length字符串最大长度,
{name: "字符串", type: "string"},
// 随机返回长度在5到30的英文字符串,例如:1@AK()r8r*N2vvVEkWk6Fg
string的默认长度范围是min_length:5, max_length:30
string 一样有很多的子类型。以下类型均为string类型,拥有string的全部属性
date和datetime都是string的子集 date日期类型, datetime是日期+时间类型,两个的所有属性都一样,只是返回日期的格式不一样。 date返回的格式是:2020-01-30 , datetime 返回的是 2020-01-30 10:03 15这样的格式,具体返回格式可以自定义。
created: {name: "Created Time", type: "datetime", format:"%Y-%m-%d %H:%M" min_value:"1999-1-1", max_value:"2020-12-12"},
date 和 datetime这么几个属性:
是string的子集,可以写正则表达式来生成字符串 例如,生成一个手机号码:
mobile:{name:"手机号码", type:"regex", regex:"^1[3456789]\\d{9}"},
// 随机返回手机号码,例如:13854309473 , 15413021985
regex:"^1[3456789]\\d{9}"里面的就是正则表达式,注意一下的是平时我们的\d在这里要写为\\d,因为json5里面单个`‘变成了一个转义字符.
是string的子集, 例如:
{name: "English Word", type: "word"},
// 随机返回长度在3到10的英文字符串,例如:bnsjnw
word的默认长度范围是min_length:3, max_length:10,默认返回长度在3到10的英文字符串
是string的子集, 你在标记属性的时候,可以使用cword,也可以使用简写cw,例如:
{name: "Chinese Word", type: "cword"},
// 随机返回长度在1到4的中文字符串,例如:向放路
或者 下面使用简写也是是一样的
{name: "Chinese Word", type: "cw"},
cword的默认长度范围是min_length:1,max_length:4,也就是默认随机返回1到4个汉字
是string的子集,例如:
{name: "English Title", type: "title"},
// 随机返回 长度在20到90的英文标题,例如:Fohzgbb ywpmpwpg ogxoal cuwwqb yxqjy softj ygihb zyizqqcbu nyqb?
title的默认长度范围是:min_length:20,max_length:90
string的子集,例如:{name: "中文标题", type: "ctitle"},
// 随机返回 长度在5到50个字的中文标题,例如:全性书性实会众下例元回员广用根问动设理说角算?
ctitle的默认长度范围是:min_length:5,max_length:40。标题结尾的标点符号是随机生成的,有时候又,有时候没有。
是string的子集
{name: "English sentence", type: "sentence"},
// 随机返回 长度在20到90长度的英文句子,例如:Fohzgbb ywpmpwpg ogxoal cuwwqb yxqjy softj ygihb zyizqqcbu nyqb?
sentence的默认长度范围是:min_length:5,max_length:40。sentence和title很像,不同的是sentence结尾一定会有标点符号
是string的子集
{name: "中文标题", type: "ctitle"},
// 随机返回 长度在5到50长度的中文句子,例如:全性书性实会众下例元回员广用根问动设理说角算?
csentence的默认长度范围是:min_length:5,max_length:50。csentence和ctitle很像,不同的是csentence结尾一定会有标点符号
是string的子集
{name: "一小段英文段落", type: "summary"},
// 随机返回 长度在到120到300长度的小段英文段落,例如:Tytuigr vfqnkhs cznqzyiq libshz, Rhpuvlxl opxqewlgy pmswwh xqbgavct pvv kaymb suoca rlqfllvhx ocybrioq? Tvxf wkdazfk exz nngosy bjxhfdc sxmsqsh kskah qwphro hpnddptmq skxgtk yemllrr rnsc.
summary的默认长度范围是:min_length:120,max_length:300
是string的子集
{name: "一小段中文段落", type: "csummary"},
// 随机返回 长度在60到250长度的中文段落,例如:速作真市正积除带先构解计生维离数没区什出何节济水年外细查资志阶格政;厂图级性给,身调等压律三海几于出议领法一传但心林种议属前件科战支务问合元准门劳例回细准教省装相是间它元指每。样同天东情需支文局界始油委军作六代事阶界科分员积律八中,道强四性都养例水化气观少斯四亲完。开局行观象受论那白法验许始始党始压基京被交质什并无值么果风增规,可由马带在位历门最般手约从将至水千须儿性响带则这上导起生手合记商四形运格外重示更一多员接亲科领。
csummary的默认长度范围是:min_length:60,max_length:250
是string的子集 拥有额外参数content_type标记内容类型,目前可选为:html、markdown。html输出带有html标记标签<p>的内容段落;markdown输出带有\n\n作为换行分隔的内容段落,默认是markdown
{name: "大段的英文段落", type: "paragraph"},
// 随机返回 长度在300到1600长度的英文段落
是string的子集 拥有额外参数content_type标记内容类型,目前可选为:html、markdown。html输出带有html标记标签<p>的内容段落;markdown输出带有\n\n作为换行分隔的内容段落,默认是markdown
{name: "大段的中文段落", type: "cparagraph"},
// 随机返回 长度在300到1600长度的英文段落
是string的子集, 随机返回一个英文人名
{name: "人名", type: "name"},
// 随机返回英文人名:Cynthia Kenneth Wilson
返回的英文人名随机输出含有middle name 或者不含有middle name的英文名
是string的子集, 随机返回一个中文名
{name: "人名", type: "cname"},
// 随机返回中文人名:黎梦
随机返回的中文名,有可能有是两个字,也有可能是三个字的
是string的子集, 随机返回一个uuid
{name: "UUID", type: "uuid"},
// 随机返回网址:1fc3e7ec-b30c-4774-8aeb-61b8eecaf440
是string的子集,随机返回一个网址
{name: "网址", type: "url"},
// 随机返回网址:https://www.debugmyself.com/aa/
是string的子集,随机返回一个域名
{name: "域名", type: "domain"},
// 随机返回域名:debugmyself.com
是string的子集,随机返回一个ip地址
{name: "ip地址", type: "ip"},
// 随机返回ip地址:192.168.5.12
是string的子集,随机返回一个邮箱地址
{name: "邮箱地址", type: "email"},
// 随机返回邮箱地址:fdsalf2@qq.com
是string的子集,image字段随机返回一个可访问的图像的地址,image拥有额外属性参数:
size 图像尺寸,例如"200x100", "300x250", 如果没有设置,默认就随机返回一个尺寸。注意数字中间的符号是小写的xforeground 图像上的文字颜色,例如:"#868e96","#000000", 默认随机一个颜色background 图像上的背景色,例如:"#ffffff","#007bff", 默认随机一个颜色accept 限制允许的图片类型,默认支持所有图片格式。或自己定义accept:".png, .jpg, .jpeg";accept="*" — 接受任何文件类型。text 需要显示在图像上的文字,默认为空例如:使用默认随机,生成一个图像
{name: "头像", type: "image"},
// 随机返回一个尺寸、颜色的图像地址:https://dummyimage.com/720x300/ffc107/fff/?text=
使用指定的尺寸和颜色生成图像
{name: "头像", type: "image", size:"300x300", foreground:"#fff", background:"#ff3e00", format:"png", text:"Panda Api"},
// 返回 https://dummyimage.com/300x300/ff3e00/fff/?text=Panda Api
对象字段表示这个字段存储的是一个对象,里面还有属性字段,例如:
category: {
    id: {name:"分类id", type:"PosInt"},
    name: {name:"分类名称", type:"cword", min_length:4, max_length:10}
}
// 将会输出mock数据
"category": {
    "id": 3408247458278907748,
    "name": "因没国众北去题养化"
}
这里category就是一个对象字段,系统已经知道category是一个object了,可以不需要单独写,但是因为对象的属性可能会和原始的字段描述type、name、desc等的属性发生命名冲突,因此这里如果需要是用这些属性,前面需要加一个英文的$(美元符号)。例如:
category: {
    $name:"文章分类",
    $desc:"文章分类描述",
    id: {name:"分类id", type:"PosInt"},
    name: {name:"分类名称", type:"cword", min_length:4, max_length:10}
}
// 将会输出mock数据
"category": {
    "id": 5528385245714244033,
    "name": "价农自江响规领"
}
数组字段标书数据是一个列表,列表里面的元素可以是单独一个元素如,整数、字符串,也可以是一个对象。数组字段可以通过属性限定数组的长度:$length 固定长度的数组;$min_length 最小数组长度, $max_length 最大数组长度。设定了$min_length和$max_length后,数组会在这个范围内随机返回一个长度;默认返回3到10范围长度的数组。写法如下:
// 分类列表, 列表里面的元素是一个分类对象
items: [{
    id: {name:"分类id", type:"PosInt"},
    name: {name:"分类名称", type:"cword", min_length:4, max_length:10}
}]
// 将会输出mock数据
"items": [
    {
        "id": 4866056297678518960,
        "name": "连地织地阶"
    },
    {
        "id": 5312498283148111047,
        "name": "目下西却列"
    },
    {
        "id": 5674167607527511114,
        "name": "约反况条权然究"
    }
],
默认随机返回3到10条数组元素,不需要标记类型,系统会自动知道这个类型就是一个数组。也可以手动进行标记:
// 分类列表,列表里面的元素是一个分类对象
items: [{
    $name:"分类列表",
    $desc:"按分类的添加时间进行排序输出",
    $length:5, // 每次数组固定返回5条数据
    id: {name:"分类id", type:"PosInt"},
    name: {name:"分类名称", type:"cword", min_length:3, max_length:10}
}]
// 将会输出mock数据
"items": [
    {
        "id": 523127155952452383,
        "name": "两照精名七消水管其"
    },
    {
        "id": 5217556273572555303,
        "name": "本最毛何劳个南"
    },
    {
        "id": 861716532598225950,
        "name": "记青亲十风于热管"
    },
    {
        "id": 7493601546937027951,
        "name": "写光府那是太运"
    },
    {
        "id": 3356699170396899346,
        "name": "气育位还克团高关"
    }
],
设定一个返回id列表的数组
// id列表,列表里面的元素是一个数字
items: [{
    $name:"分类id列表",
    $desc:"分类id列表描述",
    $length:3,
    name: "分类id",
    type: "PosInt"
}]
// 将会输出mock数据
"items": [
    1953408354386511745,
    476051422826867276,
    8882528644658661510
],
注意: $name和$desc是用来描述items的,name是用来描述数组元素的
设定一个返回人名列表的数组
items: [{
    $name:"人名列表",
    $desc:"人员姓名列表描述",
    $min_length:5,
    $max_length:8,
    name: "人员姓名",
    type: "cname"
}]
// 将会输出mock数据
"items": [
    "谢敏",
    "汪芳",
    "苏勇",
    "乔丽",
    "苏娜",
    "谭娟"
]
这里要注意数组是单个元素和数组中是对象的不同写法。
map字段表示这是一个map,有对应的key和value,
menu:{
    $type:"map",
    $name:"菜单",
    $key:{name:"菜单访问地址"},
    $value:{
        name:{name:"菜单名称", type:"csentence"},
        order:{name:"菜单排序", type:"int"},
    },
    $min_length:0, // 选填
    $max_length:10 // 选填
}
// 将会输出mock数据,如下
menu:{
    "jfdsakf":{
        name:"见覅单独",
        order:1
    },
    "jfljkjj":{
        name:"放口袋里设计费拉丝机",
        order:2
    },
}
map 类型有以下属性:
$type: map类型用的结构和object很像,所以需要标注类型,使用$type:"map"$name: 字段的名称或说明$key 的字段类型可以为 string, bool, number 以及他们的子类型。不可以为object和array$value 字段可以为任意的类型$length 输出map的长度,$length默认为0(选填)$min_length 输出map的最小长度,$min_length默认为0(选填)$max_length 输出map的最大长度,$max_length默认为6(选填)map类型必须有$key和$value这两个字段,否则mock数据的时候回返回空,默认情况下map随机返回$min_length到$max_length个随机值(map的长度)。如果指定了$length,那么就会返回固定$length个随机值(map的长度)。
rec 递归类型在做接口设计的时候,会遇到像分类树、菜单树、节点树等树形结构,这种结构是一层套一层的递归结构,而且又多超层是未知的,是动态的。我们没有办法直接写出整个结构再来生成mock数据。所以我们引入了rec递归结构
array数组递归这是一个返回菜单树的递归的设计例子:
response:{
    menus:[
        {
            $min_length:0,
            $max_length:3,
            id:{name:"菜单id", type:"PosInt"},
            name:{name:"菜单名称", type:"Cword", min_length:4, max_length:6},
            children:{
                $type:"rec",
                $ref:"/menus",
                $name:"菜单的下一级",
                $min_length:0, // 数组的最小长度
                $max_length:3, // 数组的最大长度
                // 还可以指定固定长度的$length
                $min_count:0, // 递归生成的最小层数
                $max_count:3, // 递归生成的最大层数
                // 还可以指定固定长度的$count
            }
        }
    ]
}
$ref"/menus"中$ref的值表示要从response的什么部分开始形成递归。$ref只允许在response自身形成递归,字段路径必须以/开头,表示response根节点,没进入一个属性就要用/分隔。
menus从children开始又是一个菜单列表,每一个菜单里面又有children,如此循环下去,Panda Api会生成类似这样的mock数据: (这里children只是我个人惯用,你可以设定你想要的字段名称)
{
    "menus": [
        {
            "children": [],
            "id": 2114741604123049731,
            "name": "多己工计"
        },
        {
            "children": [
                {
                    "children": [
                        {
                            "children": [
                                {
                                    "children": [
                                        {
                                            "id": 2628566709375304554,
                                            "name": "只自体第"
                                        }
                                    ],
                                    "id": 9061608643768166383,
                                    "name": "装七美同约"
                                },
                                {
                                    "children": [
                                        {
                                            "id": 2376723186703681109,
                                            "name": "民交验感"
                                        }
                                    ],
                                    "id": 1885852586445721494,
                                    "name": "家同海人"
                                },
                                {
                                    "children": [
                                        {
                                            "id": 8966318858611323899,
                                            "name": "水真复增"
                                        },
                                        {
                                            "id": 1961010107398671810,
                                            "name": "两明力矿"
                                        },
                                        {
                                            "id": 3054760830845351094,
                                            "name": "较公要团"
                                        }
                                    ],
                                    "id": 2522859844921578381,
                                    "name": "交主此江时"
                                }
                            ],
                            "id": 5791275467325817489,
                            "name": "识验石维"
                        }
                    ],
                    "id": 3402947262219311875,
                    "name": "算拉果当道"
                },
                {
                    "children": [],
                    "id": 8828917565546610551,
                    "name": "低音每安"
                }
            ],
            "id": 3796488759971353684,
            "name": "度山热白认"
        }
    ]
}
默认情况下,数组类型的递归,同一层的数组默认返回随机的0到10个,递归的层数是随机的0到3层。
rec类型有以下属性:
$type: rec类型用的结构和object很像,所以需要标注类型,使用$type:"rec"$ref: $ref的值表示从哪一个节点开始递归,使用/表示response模型的根节点,然后往下,属性之间用/分隔$name: rec 的名称$desc: rec 的说明$length 输出数组的长度,$length默认为0(选填)$min_length 输出数组的最小长度,$min_length默认为0(选填)$max_length 输出数组的最大长度,$max_length默认为6(选填)$count 递归多少次,默认为0(选填)$min_count 递归最少次数,默认为0(选填)$mac_count 递归最大次数,默认为3(选填)$empty_value 自定义尾节点的空值,默认按类型:array的空值是:[],object默认空值是:null,map默认空值是{},其它类型默认空值会连整个字段删除。(选填)这是一个array递归的另一个例子,一个节点树,最开始只有一个根节点:
response:{
    node:{
        $name:"一个棵节点树",
        name:{name:"名称"},
        score:{name:"节点权重", type:"int"},
        children:[
            {
                $type:"rec",
                $ref:"/node"
            }
        ]
    }
}
从children里面的子节点,调用node节点,形成递归结构
map递归:这是一个使用map递归的例子:
response:{
    menus:{
        $type:"map",
        $name:"map类型的菜单树",
        $key:{name:"菜单访问地址"},
        $value:{
            name:{name:"菜单名称"},
            order:{name:"显示顺序", type:"int"},
            children:{
                $type:"rec",
                $ref:"/menus"
            }
        }
    }
}
object对象递归这是一个使用object递归的例子,一个棵单向链表树,每层只有一个节点:
response:{
    node:{
        $name:"一个棵分类树",
        name:{name:"分类名称"},
        score:{name:"分类权重", type:"int"},
        next_node:{
            $type:"rec",
            $ref:"/node"
        }
    }
}
生成的mock数据像这样:
{
    "node": {
        "name": "6BB!9pLLCvH^",
        "next_node": {
            "name": "DSUd*0IviFEE%Ol",
            "next_node": {
                "name": "p5KhwcVHBuTUtVKybS",
                "score": -666870791861541566
            },
            "score": -2462908145395534478
        },
        "score": 965981022476574150
    }
}
如果路径中遇到数组结构,那么就使用使用数组的索引作为属性:
response:{
    nodes:[{
        node:{
            $name:"一个棵分类树",
            name:{name:"分类名称"},
            score:{name:"分类权重", type:"int"},
            next_node:{
                $type:"rec",
                $ref:"/nodes/0/node"
            }
        }
    }]
}
所有这些例子,为了让大家容易看清楚和明白,所以把递归字段都设置为response中的字段,你也可以直接从response开始,就开始递归。上面的例子经过改写为直接从response开始递归,会变成这样:
数组递归1
response:[{
    id:{name:"菜单id", type:"PosInt"},
    name:{name:"菜单名称", type:"Cword", min_length:4, max_length:6},
    children:{
        $type:"rec",
        $ref:"/",
        name:"菜单的下一级",
        $min_length:0, // 数组的最小长度
        $max_length:10, // 数组的最大长度
        // 还可以指定固定长度的$length
        $min_count:0, // 递归生成的最小层数
        $max_count:3, // 递归生成的最大层数
        // 还可以指定固定长度的$count
    }
}]
输出mock数据
{
    "children": {
        "children": {
            "children": {
                "id": 1871930241063333556,
                "name": "红强近八活"
            },
            "id": 5879124066670883770,
            "name": "查器气算外"
        },
        "id": 4800547273192686311,
        "name": "油总及员多"
    },
    "id": 7529127207311356580,
    "name": "想正第中该"
}
数组递归2
response:{
    $name:"一个棵节点树",
    name:{name:"名称"},
    score:{name:"节点权重", type:"int"},
    children:[
        {
            $type:"rec",
            $ref:"/"
        }
    ]
}
生成mock数据
{
    "children": [
        {
            "children": [],
            "name": "3GvF4y%jzLTKJ#B(",
            "score": -2658177777725672468
        },
        {
            "children": [],
            "name": "EV^&whgz#LRVCwLHFF%pRH",
            "score": -2505644547855075013
        },
        {
            "children": [
                {
                    "children": [],
                    "name": "@yuKB8S%04HZFfyT8",
                    "score": -8018263853608409579
                },
                {
                    "children": [],
                    "name": "q!Wa2FXIZ%uT~N",
                    "score": -1398830444893409480
                },
            ],
            "name": "YY#8@V",
            "score": 2433269522325167205
        }
    ],
    "name": "LFMIaMQVeX9N^L@jhi)Rq",
    "score": 773048924729775541
}
map递归
response:{
    $type:"map",
    $name:"map类型的菜单树",
    $key:{name:"菜单访问地址"},
    $value:{
        name:{name:"菜单名称"},
        order:{name:"显示顺序", type:"int"},
        children:{
            $type:"rec",
            $ref:"/"
        }
    }
}
object递归
response:{
    $name:"一个棵分类树",
    name:{name:"分类名称"},
    score:{name:"分类权重", type:"int"},
    next_node:{
        $type:"rec",
        $ref:"/"
    }
}
2020-03-01 03:22