Panda-api字段说明

为了更人方便、更人性化的进行body、query或者response中的字段设计,我又拓展了字段类型,一方面可以更快速的进行字段设计,另外一方面,可以生成更符合实际情况的mock数据。系统会在test_data匹配不到数据的时候,默认返回response设定好的字段里面的mock数据。

字段的公共属性

所有字段都共有的属性

enum有两种写法:

增加说明的目的是为了方便以后值的阅读和维护,我们经常时间长了会忘记每一个枚举值的作用。

如果你这么写:

enum:[[-1, "s"], [1, "d"]]

表示值只能是[-1, "s"][1, "d"] 中其中一个数组

int

int 就是整数类型,是number的一个子集,他有这么几个范围的参数,他们分别是(按有效优先级别展示):

通常min_valuemax_value会同时使用,例如

category_id: {name: "category id", type: "int", min_value:1, max_value:1000},

其它数字类型

我们还有其它数字类型,如:正整数PosInt、负整数NegInt,浮点数Float,正浮点数PosFloat,负浮点数NegFloat,时间戳Timestamp

PosInt

表示正整数, 是int的子集

NegInt

表示负整数, 是int的子集

Float

表示小数, 是number的子集

PosFloat

表示正小数, 是Float的子集

NegFloat

表示负小数, 是Float的子集

小数比整数多了三个参数:

通常min_decimal_placesmax_decimal_places会同时使用,例如

money: {name: "Money", type: "int", min_value:1, min_decimal_places:2, max_decimal_places:10},

注意:小数位数长度最好设置太大,不然有可能依法溢出错误

Timestamp

时间戳,是int的子集,默认随机返回当前时间前后两年的时间戳

created: {name: "Created time", type: "timestamp"},

同样可以设置最小值min_value和最大值max_value,但是整数 min_value默认的最小值是当前时间戳提前两年,最大值的时间戳是当前时间戳

string 字符串类型

除了arrayobject字段,其它字段中如果没有设置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

datedatetime都是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"},

datedatetime这么几个属性:

regex 正则表达式

string的子集,可以写正则表达式来生成字符串 例如,生成一个手机号码:

mobile:{name:"手机号码", type:"regex", regex:"^1[3456789]\\d{9}"},
// 随机返回手机号码,例如:13854309473 , 15413021985

regex:"^1[3456789]\\d{9}"里面的就是正则表达式,注意一下的是平时我们的\d在这里要写为\\d,因为json5里面单个`‘变成了一个转义字符.

word 英文单词

string的子集, 例如:

{name: "English Word", type: "word"},
// 随机返回长度在3到10的英文字符串,例如:bnsjnw

word的默认长度范围是min_length:3, max_length:10,默认返回长度在3到10的英文字符串

cword | cw 中文单词

string的子集, 你在标记属性的时候,可以使用cword,也可以使用简写cw,例如:

{name: "Chinese Word", type: "cword"},
// 随机返回长度在1到4的中文字符串,例如:向放路

或者 下面使用简写也是是一样的

{name: "Chinese Word", type: "cw"},

cword的默认长度范围是min_length:1max_length:4,也就是默认随机返回1到4个汉字

title 英文标题

string的子集,例如:

{name: "English Title", type: "title"},
// 随机返回 长度在20到90的英文标题,例如:Fohzgbb ywpmpwpg ogxoal cuwwqb yxqjy softj ygihb zyizqqcbu nyqb?

title的默认长度范围是:min_length:20max_length:90

ctitle | ct 中文标题

string的子集,例如:
{name: "中文标题", type: "ctitle"},
// 随机返回 长度在5到50个字的中文标题,例如:全性书性实会众下例元回员广用根问动设理说角算?

ctitle的默认长度范围是:min_length:5max_length:40。标题结尾的标点符号是随机生成的,有时候又,有时候没有。

sentence 英文语句

string的子集

{name: "English sentence", type: "sentence"},
// 随机返回 长度在20到90长度的英文句子,例如:Fohzgbb ywpmpwpg ogxoal cuwwqb yxqjy softj ygihb zyizqqcbu nyqb?

sentence的默认长度范围是:min_length:5max_length:40sentencetitle很像,不同的是sentence结尾一定会有标点符号

csentence | cstring | cs 中文语句

string的子集

{name: "中文标题", type: "ctitle"},
// 随机返回 长度在5到50长度的中文句子,例如:全性书性实会众下例元回员广用根问动设理说角算?

csentence的默认长度范围是:min_length:5max_length:50csentencectitle很像,不同的是csentence结尾一定会有标点符号

summary 小段的英文

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:120max_length:300

csummary | cm 小段的中文

string的子集

{name: "一小段中文段落", type: "csummary"},
// 随机返回 长度在60到250长度的中文段落,例如:速作真市正积除带先构解计生维离数没区什出何节济水年外细查资志阶格政;厂图级性给,身调等压律三海几于出议领法一传但心林种议属前件科战支务问合元准门劳例回细准教省装相是间它元指每。样同天东情需支文局界始油委军作六代事阶界科分员积律八中,道强四性都养例水化气观少斯四亲完。开局行观象受论那白法验许始始党始压基京被交质什并无值么果风增规,可由马带在位历门最般手约从将至水千须儿性响带则这上导起生手合记商四形运格外重示更一多员接亲科领。

csummary的默认长度范围是:min_length:60max_length:250

paragraph 大段的英文段落

string的子集 拥有额外参数content_type标记内容类型,目前可选为:htmlmarkdownhtml输出带有html标记标签<p>的内容段落;markdown输出带有\n\n作为换行分隔的内容段落,默认是markdown

{name: "大段的英文段落", type: "paragraph"},
// 随机返回 长度在300到1600长度的英文段落

cparagraph | cp 大段的中文段落

string的子集 拥有额外参数content_type标记内容类型,目前可选为:htmlmarkdownhtml输出带有html标记标签<p>的内容段落;markdown输出带有\n\n作为换行分隔的内容段落,默认是markdown

{name: "大段的中文段落", type: "cparagraph"},
// 随机返回 长度在300到1600长度的英文段落

name 英文人名

string的子集, 随机返回一个英文人名

{name: "人名", type: "name"},
// 随机返回英文人名:Cynthia Kenneth Wilson

返回的英文人名随机输出含有middle name 或者不含有middle name的英文名

cname 中文人名

string的子集, 随机返回一个中文名

{name: "人名", type: "cname"},
// 随机返回中文人名:黎梦

随机返回的中文名,有可能有是两个字,也有可能是三个字的

uuid

string的子集, 随机返回一个uuid

{name: "UUID", type: "uuid"},
// 随机返回网址:1fc3e7ec-b30c-4774-8aeb-61b8eecaf440

url 网址

string的子集,随机返回一个网址

{name: "网址", type: "url"},
// 随机返回网址:https://www.debugmyself.com/aa/

domain 域名

string的子集,随机返回一个域名

{name: "域名", type: "domain"},
// 随机返回域名:debugmyself.com

ip IP地址

string的子集,随机返回一个ip地址

{name: "ip地址", type: "ip"},
// 随机返回ip地址:192.168.5.12

email 邮箱

string的子集,随机返回一个邮箱地址

{name: "邮箱地址", type: "email"},
// 随机返回邮箱地址:fdsalf2@qq.com

image 图像

string的子集,image字段随机返回一个可访问的图像的地址,image拥有额外属性参数:

例如:使用默认随机,生成一个图像

{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

object 对象

对象字段表示这个字段存储的是一个对象,里面还有属性字段,例如:

category: {
    id: {name:"分类id", type:"PosInt"},
    name: {name:"分类名称", type:"cword", min_length:4, max_length:10}
}
// 将会输出mock数据
"category": {
    "id": 3408247458278907748,
    "name": "因没国众北去题养化"
}

这里category就是一个对象字段,系统已经知道category是一个object了,可以不需要单独写,但是因为对象的属性可能会和原始的字段描述typenamedesc等的属性发生命名冲突,因此这里如果需要是用这些属性,前面需要加一个英文的$(美元符号)。例如:

category: {
    $name:"文章分类",
    $desc:"文章分类描述",
    id: {name:"分类id", type:"PosInt"},
    name: {name:"分类名称", type:"cword", min_length:4, max_length:10}
}
// 将会输出mock数据
"category": {
    "id": 5528385245714244033,
    "name": "价农自江响规领"
}

array 数组

数组字段标书数据是一个列表,列表里面的元素可以是单独一个元素如,整数、字符串,也可以是一个对象。数组字段可以通过属性限定数组的长度:$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字段表示这是一个map,有对应的keyvalue

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 类型有以下属性:

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根节点,没进入一个属性就要用/分隔。

menuschildren开始又是一个菜单列表,每一个菜单里面又有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类型有以下属性:

这是一个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

留言