Mock数据

Mock数据

mockjs
安装
第一种:

# 安装
npm install mockjs
第二种使用CDN:

https://cdnjs.cloudflare.com/ajax/libs/Mock.js/1.0.0/mock.js
直接在Header部分引用即可。

 

示例:

// 使用 Mock
var Mock = require('mockjs')
var data = Mock.mock({
    // 属性 list 的值是一个数组,其中含有 1 到 10 个元素
    'list|1-10': [{
        // 属性 id 是一个自增数,起始值为 1,每次增 1
        'id|+1': 1
    }]
})
// 输出结果
console.log(JSON.stringify(data, null, 4))
 

语法
数据模板定义规范 DTD

# 格式

// 属性名   name
// 生成规则 rule
// 属性值   value
'name|rule': value
注意:

属性名 和 生成规则 之间用竖线 | 分隔。

生成规则 是可选的。

生成规则

 

有 7 种格式:

'name|min-max': value

'name|count': value

'name|min-max.dmin-dmax': value

'name|min-max.dcount': value

'name|count.dmin-dmax': value

'name|count.dcount': value

'name|+step': value

*生成规则* 的 含义 需要依赖 *属性值的类型* 才能确定。

属性值 中可以含有 @占位符。

属性值 还指定了最终值的初始值和类型。

示例:

const Mock = require("mockjs");
​
const params = 2;
const key = "lists|" + params;
​
const result = Mock.mock({
  code: 200,
  [key]: [
    {
      "number1|1-100.1-10": 1,
      "number2|10.1-10": 1,
      "number3|11.3": 1000,
      "number4|123.10": 1.123,
      "id|+1": 1
    }
  ],
  msg: "mock msg"
});
 

数据占位符定义规范

# 格式

@占位符
@占位符(参数 [, 参数])
 

常规应用
Demo1:

在HTML中直接使用script标签引用mockjs

在页面中拦截ajax请求

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>Document</title>
    <script src="https://cdn.staticfile.org/Mock.js/1.0.0/mock-min.js"></script>
    <script src="https://cdn.staticfile.org/jquery/3.4.1/jquery.min.js"></script>
  </head>
  <body>
    <div id="app"></div>
    <script>
      Mock.mock(/^/lists/, "get", {
        code: 200,
        data: {
          "lists|1-10": [
            {
              "id|+1": 0
            }
          ]
        }
      });
      $.ajax({
        url: "/api/lists",
        type: "get",
        dataType: "json",
        success: function(data) {
          if (data.code === 200) {
            var obj = data.data;
            var elem = "";
            $.each(obj.lists, function(item) {
              elem += "<div>" + item + "</div>";
            });
            $("#app").append(elem);
          }
        }
      });
    </script>
  </body>
</html>
 

Demo2:

在Vue工程化项目中进行引用:

Mock.js

// 拦截请求
import Mock from "mockjs";
​
Mock.mock(//get/, {
  code: 200,
  "data|10": [
    {
      "id|+1": 1,
      name: "@cname",
      email: "@email",
      picture: "@image('120x120', '#dcdcdc')",
      remark: "@title",
      address: "@city(true)",
      "gender|0-1": 0,
      hobby: "@hobby"
    }
  ]
});
​
export default Mock;
 

在Main.js中进行引用

if (process.env.NODE_ENV !== "production") require("@/mock/index");
 

Json-server
安装与使用
npm install -g json-server
创建一个db.json的文件:

{
  "posts": [
    { "id": 1, "title": "json-server", "author": "typicode" }
  ],
  "comments": [
    { "id": 1, "body": "some comment", "postId": 1 }
  ],
  "profile": { "name": "typicode" }
}
然后,使用:

json-server --watch db.json
就可以在http://localhost:3000/posts/1获取对应的数据了:

{ "id": 1, "title": "json-server", "author": "typicode" }
所有数据的POST, PUT, PATCH,DELETE请求都会得到响应。

 

<!-- [Mockjs]结合json-server的综合应用模拟整个请求过程: -->
1,npm install -S mockjs

2,api-json.js里:
const Mock = require('mockjs')
const data = () => {
  const result = { test: {},new:{} }  //多个接口  http://localhost:80/test    http://localhost:80/new
  result.test = Mock.mock({
    'lists|5-10': [{
      'id|+1': 1,
      'name': '@cname'
    }],
    "comments": [
      { "id": 1, "body": "some comment", "postId": 1 }
    ]
  })
  result.new = Mock.mock({
    'lists1|5-10': [{
      'id|+1': 1,
      'name': '@cname'
    }]
  })
  return result
}

module.exports = data

3,运行:json-server api-json.js --port=10000
 

动态数据
例如启动json-server的命令:json-server --watch app.js 是把一个js文件返回的数据托管成web服务。

app.js配合mockjs库可以很方便的进行生成模拟数据。

const Mock = require("mockjs");
const Random = Mock.Random;
​
const key = "lists|6-10";
// const result = Random.capitalize("hello");
// 自定义占位符
Random.extend({
  hobby: function() {
    var arr = ["swim", "run", "play computer game", "ride"];
    return this.pick(arr);
  }
});
​
const result = Mock.mock({
  [key]: [
    {
      "id|+1": 1,
      name: "@cname",
      email: "@email",
      picture: "@image('120x120', '#dcdcdc')",
      remark: "@title",
      address: "@city(true)",
      "gender|0-1": 0,
      hobby: "@hobby"
    }
  ]
});
​
module.exports = () => result;
当json-server启动之后,mock数据就不会变化了,可以使用nodemon配合着使用,以达到接口随机数据变化的目的。

 

自定义路由
当然你可以自定义路由:

$ json-server --routes route.json --watch db.json
route.json文件

{
  "/api/*": "/$1",
  "/:resource/:id/show": "/:resource/:id",
  "/posts/:category": "/posts?category=:category",
  "/articles\?id=:id": "/posts/:id"
}
对应的请求会进行转发:

/api/posts # → /posts
/api/posts/1  # → /posts/1
/posts/1/show # → /posts/1
/posts/javascript # → /posts?category=javascript
/articles?id=1 # → /posts/1
 

过滤查询
查询数据,可以额外提供

GET /posts?title=json-server&author=typicode
GET /posts?id=1&id=2

# 可以用 . 访问更深层的属性。
GET /comments?author.name=typicode
还可以使用一些判断条件作为过滤查询的辅助。

GET /posts?views_gte=10&views_lte=20
可以用的拼接条件为:

_gte : 大于等于

_lte : 小于等于

_ne : 不等于

_like : 包含

GET /posts?id_ne=1
GET /posts?id_lte=100
GET /posts?title_like=server
分页查询

默认后台处理分页参数为: _page 第几页, _limit一页多少条。

GET /posts?_page=7
GET /posts?_page=7&_limit=20
默认一页10条。

后台会返回总条数,总条数的数据在响应头:X-Total-Count中。

排序

参数: _sort设定排序的字段

参数: _order设定排序的方式(默认升序)

GET /posts?_sort=views&_order=asc
GET /posts/1/comments?_sort=votes&_order=asc
支持多个字段排序:

GET /posts?_sort=user,views&_order=desc,asc
 

原文地址:https://www.cnblogs.com/xm0328/p/13782088.html