{"id":20414452,"url":"https://github.com/x-extends/xe-ajax-mock","last_synced_at":"2025-04-12T16:44:40.401Z","repository":{"id":57401224,"uuid":"119239926","full_name":"x-extends/xe-ajax-mock","owner":"x-extends","description":"☘ 基于 xe-ajax 的 Mock 虚拟服务 ","archived":false,"fork":false,"pushed_at":"2021-11-14T13:07:43.000Z","size":790,"stargazers_count":2,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-03-26T11:11:10.875Z","etag":null,"topics":["xe-ajax"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/x-extends.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2018-01-28T08:09:52.000Z","updated_at":"2021-11-14T13:07:46.000Z","dependencies_parsed_at":"2022-09-19T01:00:36.946Z","dependency_job_id":null,"html_url":"https://github.com/x-extends/xe-ajax-mock","commit_stats":null,"previous_names":[],"tags_count":60,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/x-extends%2Fxe-ajax-mock","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/x-extends%2Fxe-ajax-mock/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/x-extends%2Fxe-ajax-mock/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/x-extends%2Fxe-ajax-mock/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/x-extends","download_url":"https://codeload.github.com/x-extends/xe-ajax-mock/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248600294,"owners_count":21131455,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["xe-ajax"],"created_at":"2024-11-15T06:10:04.506Z","updated_at":"2025-04-12T16:44:40.365Z","avatar_url":"https://github.com/x-extends.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# xe-ajax-mock\n\n[![gitee star](https://gitee.com/x-extends/xe-ajax-mock/badge/star.svg?theme=dark)](https://gitee.com/x-extends/xe-ajax-mock/stargazers)\n[![npm version](https://img.shields.io/npm/v/xe-ajax-mock.svg?style=flat-square)](https://www.npmjs.com/package/xe-ajax-mock)\n[![npm build](https://travis-ci.com/x-extends/xe-ajax-mock.svg?branch=master)](https://travis-ci.com/x-extends/xe-ajax-mock)\n[![npm downloads](https://img.shields.io/npm/dm/xe-ajax-mock.svg?style=flat-square)](http://npm-stat.com/charts.html?package=xe-ajax-mock)\n[![gzip size: JS](http://img.badgesize.io/https://unpkg.com/xe-ajax-mock/dist/xe-ajax-mock.umd.min.js?compression=gzip\u0026label=gzip%20size:%20JS)](https://unpkg.com/xe-ajax-mock/dist/xe-ajax-mock.umd.min.js)\n[![npm license](https://img.shields.io/github/license/mashape/apistatus.svg)](LICENSE)\n\n基于 xe-ajax 的 Mock 虚拟服务\n\n## Browser Support\n\n![IE](https://raw.github.com/alrra/browser-logos/master/src/archive/internet-explorer_9-11/internet-explorer_9-11_48x48.png) | ![Edge](https://raw.github.com/alrra/browser-logos/master/src/edge/edge_48x48.png) | ![Chrome](https://raw.github.com/alrra/browser-logos/master/src/chrome/chrome_48x48.png) | ![Firefox](https://raw.github.com/alrra/browser-logos/master/src/firefox/firefox_48x48.png) | ![Opera](https://raw.github.com/alrra/browser-logos/master/src/opera/opera_48x48.png) | ![Safari](https://raw.github.com/alrra/browser-logos/master/src/safari/safari_48x48.png)\n--- | --- | --- | --- | --- | --- |\n9+ ✔ | Latest ✔ | Latest ✔ | Latest ✔ | Latest ✔ | 8+ ✔ |\n\n## Installing\n\n```shell\nnpm install xe-ajax xe-ajax-mock\n\n```\n\n```javascript\nimport XEAjax from 'xe-ajax'\nimport XEAjaxMock from 'xe-ajax-mock'\n\nXEAjax.use(XEAjaxMock)\n```\n\nGet on [unpkg](https://unpkg.com/xe-ajax-mock/) and [cdnjs](https://cdn.jsdelivr.net/npm/xe-ajax-mock/)\n\n```HTML\n\u003cscript src=\"https://cdn.jsdelivr.net/npm/xe-ajax\"\u003e\u003c/script\u003e\n\u003cscript src=\"https://cdn.jsdelivr.net/npm/xe-ajax-mock\"\u003e\u003c/script\u003e\n```\n\n## API\n\n* Mock( defines, options )\n* Mock( path, method, response, options )\n* HEAD( path, response, options )\n* GET( path, response, options )\n* POST( path, response, options )\n* PUT( path, response, options )\n* DELETE( path, response, options )\n* PATCH( path, response, options )\n* JSONP( path, response, options )\n\n### Arguments\n\n* **path** 请求路径\n* **method** 请求方法\n* **response** 对象或者函数(request, response, context)，格式: {status: 200, statusText: 'OK', body: {}, headers: {}}\n* **options** 参数\n\n### 参数\n\n| Name | Type | Description | default value |\n|------|------|-----|----|\n| baseURL | String | 基础路径 | 默认上下文路径 |\n| template | Boolean | 是否允许数据模板自动编译, 可以设置 [**true**,**false**] | 默认 false |\n| pathVariable | Boolean | 是否启用路径参数类型自动解析, 可以设置 [**true**,**false**,'auto'] | 默认 true |\n| timeout | String | 设置请求响应的时间 | 默认 '20-400' |\n| jsonp | String | 设置jsonp回调参数名称 |  |\n| headers | Object | 设置响应头信息 |  |\n| error | Boolean | 控制台输出请求错误日志, 可以设置 [**true**,**false**] | 默认 true |\n| log | Boolean | 控制台输出请求请求日志, 可以设置 [**true**,**false**] | 默认 false |\n\n## 全局参数\n\n```javascript\nimport XEAjaxMock from 'xe-ajax-mock'\n\nXEAjaxMock.setup({\n  baseURL: 'http://xuliangzhan.com',\n  template: true,\n  pathVariable: 'auto', // 如果为auto则支持自动转换类型\n  timeout: '50-600',\n  headers: {\n    'Content-Type': 'application/json; charset=utf-8'\n  },\n  error: true,\n  log: true\n})\n```\n\n## Template - 基础语法\n\n### Number 数值\n\n[key]|number\n\n```javascript\nimport { template } from 'xe-ajax-mock'\n\ntemplate({\n  'num|number': '123'\n})\n// {num: 123}\n```\n\n### Boolean 布尔值\n\n[key]|boolean\n\n```javascript\nimport { template } from 'xe-ajax-mock'\n\ntemplate({\n  'flag1|boolean': 'true',\n  'flag2|boolean': 'false'\n})\n// {flag1: true, flag2: false}\n```\n\n### 指定生成一个或多个值\n\n[key]|array([min]-[max])\n\n```javascript\nimport { template } from 'xe-ajax-mock'\n\ntemplate({\n  'region|array(1-5)': 'val'\n})\n// {region: ['val', 'val', 'val']}\n\ntemplate({\n  'region|array(1)': [\"beijing\", \"shanghai\", \"guangzhou\", \"shenzhen\"]\n})\n// {region: ['beijing']}\n\ntemplate({\n  'region|array(1-3)': [\"beijing\", \"shanghai\", \"guangzhou\", \"shenzhen\"]\n})\n// {region: ['shenzhen', 'shanghai']}\n```\n\n### 随机生成一个或多个值\n\n[key]|random([min]-[max])\n\n```javascript\nimport { template } from 'xe-ajax-mock'\n\ntemplate({\n  'region|random(1-5)': 'val'\n})\n// {region: ['val', 'val', 'val']}\n\ntemplate({\n  'region|random(1)': [\"beijing\", \"shanghai\", \"guangzhou\", \"shenzhen\"]\n})\n// {region: 'shanghai'}\n\ntemplate({\n  'region|random(1-3)': [\"beijing\", \"shanghai\", \"guangzhou\", \"shenzhen\"]\n})\n// {region: ['beijing', 'guangzhou']}\n```\n\n### Object 对象\n\n```javascript\nimport { template } from 'xe-ajax-mock'\n\ntemplate({\n  'id|number': '1',\n  'name': 'test 1',\n  'region|array(1)': [\"beijing\", \"shanghai\", \"guangzhou\", \"shenzhen\"],\n  'active|boolean': '1'\n  'age|number': '30'\n})\n// {id: 1,name: 'test 1', region: ['shanghai'], active: true, age: 30}\n```\n\n### Array 数组\n\n```javascript\nimport { template } from 'xe-ajax-mock'\n\ntemplate(['{{ random.repeat(\"abcdefg\",10,20) }}', '{{ random.date(\"2018-03-04\",\"2018-03-20\") }}'])\n// ['gbabcdefega', '2018-03-13 14:52:02']\n\ntemplate([{\n  'id|number': '1',\n  'name': 'test1',\n  'region|array(1)': [\"beijing\", \"shanghai\", \"guangzhou\", \"shenzhen\"],\n  'active|boolean': '0',\n  'age|number': '30'\n}])\n// [{id: 1,name: 'test 0', region: ['guangzhou'], active: false, age: 30}]\n```\n\n### 内置变量\n\n**$size** 获取数组大小\n**$index** 获取数组索引\n**$params** 获取请求查询参数\n**$body** 获取请求提交参数\n**$pathVariable** 获取请求路径参数\n\n```javascript\nimport { template } from 'xe-ajax-mock'\n\ntemplate({\n  'result|array(1-5)': {\n    'id|number': '{{ $index }}',\n    'size|number': '{{ $size }}',\n    'name': '{{ $params.name }}',\n    'password': '{{ $body.password }}'\n  }\n})\n// {\n//   age: {pageSize: 10, currentPage: 1},\n//   result: [\n//     {id: 0, size: 2, name: 'test', password: ''},\n//     {id: 1, size: 2, name: 'test', password: ''}\n//   ]\n// }\n```\n\n### 直接返回对应的值\n\n**~** 如果对象中只有一个属性，返回对应值\n\n```javascript\nimport { template } from 'xe-ajax-mock'\n\ntemplate({\n  '~': {\n    'id|number': '1',\n    'name': 'test {{ $index }}',\n    'region|array(1)': [\"beijing\", \"shanghai\", \"guangzhou\", \"shenzhen\"],\n    'active|boolean': '{{ random.num(0,1) }}',\n    'age|number': '{{ random.num(18,60) }}'\n  }\n})\n// {id: 1, name: 'test 0', region: ['shenzhen'], active: true, age: 30}\n\ntemplate({\n  '~|array(1-2)': {\n    'id|number': '{{ $index+1 }}',\n    'name': 'test {{ $index }}',\n    'region|array(1)': [\"beijing\", \"shanghai\", \"guangzhou\", \"shenzhen\"],\n    'active|boolean': '{{ random.num(0,1) }}',\n    'age|number': '{{ random.num(18,60) }}'\n  }\n})\n// [{id: 1, name: 'test 0', region: ['shanghai'], active: true, age: 30},\n// {id: 2, name: 'test 1', region: ['shenzhen'], active: false, age: 42}]\n```\n\n## Template - 函数的使用\n\n### 随机生成数值\n\nrandom.num(min, max)\n\n```javascript\nimport { template } from 'xe-ajax-mock'\n\ntemplate({\n  'age': '{{ random.num(18,60) }}'\n})\n// {age: '30'}\n\ntemplate({\n  'ip': '{{ random.num(1,254) }}.{{ random.num(1,254) }}.{{ random.num(1,254) }}.{{ random.num(1,254) }}'\n})\n// {ip: '147.136.43.175'}\n\ntemplate({\n  'color': 'rgb({{ random.num(100,120) }}, {{ random.num(140,180) }}, {{ random.num(140,160) }})'\n})\n// {color: 'rgb(242, 121, 132)'}\n```\n\n### 根据内容随机生成（可以是字符串或数组）\n\nrandom.repeat(array|string, min, max)\n\n```javascript\nimport { template } from 'xe-ajax-mock'\n\ntemplate({\n  'describe': '{{ random.repeat(\"abcdefg\",10,200) }}'\n})\n// {describe: 'bacdeggaccedbga'}\n\ntemplate({\n  'email': '{{ random.repeat(\"abcdefg\",5,20) }}@163.{{ random.repeat([\"com\",\"net\"],1) }}'\n})\n// {email: 'abcfdgecee@163.com'}\n```\n\n### 随机时间戳\n\nrandom.time(startDate, endDate)\n\n```javascript\nimport { template } from 'xe-ajax-mock'\n\ntemplate({\n  'datetime': '{{ random.time(\"2018-03-04\") }}'\n})\n// {datetime: '1520092800000'}\n\ntemplate({\n  'datetime': '{{ random.time(\"2018-03-04\",\"2018-03-20\") }}'\n})\n// {datetime: '1520611200000'}\n```\n\n### 随机日期\n\nrandom.date(startDate, endDate, format)\n\n```javascript\nimport { template } from 'xe-ajax-mock'\n\ntemplate({\n  'dateStr': '{{ random.date(\"2018-03-04\") }}'\n})\n// {dateStr: '2018-03-04'}\n\ntemplate({\n  'dateStr': '{{ random.date(\"2018-03-04\",null,\"yyyy-MM-dd HH:mm:ss.S\") }}'\n})\n// {dateStr: '2018-03-04 00:00:00.0'}\n\ntemplate({\n  'dateStr': '{{ random.date(\"2018-03-04\",\"2018-03-20\") }}'\n})\n// {dateStr: '2018-03-10'}\n\ntemplate({\n  'dateStr': '{{ random.date(\"2018-03-04\",\"2018-03-20\",\"yyyy-MM-dd HH:mm:ss.S\") }}'\n})\n// {dateStr: '2018-03-10 10:30:20.500'}\n```\n\n### 完整配置\n\n```javascript\nimport { template } from 'xe-ajax-mock'\n\n// GET('http://xuliangzhan.com/api/user/list/{pageSize/{currentPage}') ==\u003e XEAjax.fetchGet('api/user/list/10/1')\ntemplate({\n  \"page\": {\n    \"currentPage|number\": \"{{ $pathVariable.currentPage }}\",\n    \"pageSize|number\": \"{{ $pathVariable.pageSize }}\",\n    \"totalResult|number\": \"{{ random.num(100,200) }}\"\n  },\n  \"result|array({{ $pathVariable.pageSize }})\": {\n    \"id|number\": \"{{ $index+1 }}\",\n    \"name\": \"test {{ $index }}\",\n    \"region|random(1)\": [\"beijing\", \"shanghai\", \"guangzhou\", \"shenzhen\"],\n    \"roles|array(1-3)\": [\"admin\", \"developer\", \"tester\", \"designer\"],\n    \"isLogin|boolean\": \"{{ random.num(0,1) }}\",\n    \"email\": \"{{ random.repeat('abcdefg',5,20) }}@qq.{{ random.repeat(['com','net'],1) }}\",\n    \"color\": \"rgb(120, {{ random.num(140,180) }}, {{ random.num(140,160) }})\",\n    \"ip\": \"192.168.{{ random.num(1,254) }}.{{ random.num(1,254) }}\",\n    \"age|number\": \"{{ random.num(18,60) }}\",\n    \"password\": \"{{ random.num(100000,999999) }}\",\n    \"describe\": \"{{ random.repeat('abcdefg',10,200) }}\",\n    \"createDate\": \"{{ random.date('2018-01-01','2018-06-20') }}\",\n    \"updateTime\": \"{{ random.time('2018-01-01','2018-06-20') }}\"\n  }\n})\n```\n\n### Template 模板混合函数\n\ntemplate.mixin({})\n\n```javascript\nimport { template } from 'xe-ajax-mock'\n\ntemplate.mixin({\n  format (str) {\n    return 'format: ' + str\n  }\n})\n\ntemplate({\n  'val': '{{ format(\"2018-01-01\") }}'\n})\n// {val: 'format: 2018-01-01'}\n```\n\n## Example\n\n[example](https://github.com/xuliangzhan/vue-mock-template)\n\n### Mock\n\n```javascript\nimport { Mock } from 'xe-ajax-mock'\n\nMock([{\n  path: '/api/user',\n  children: [{\n    method: 'GET',\n    path: 'list',\n    response: {\n      '~|array(1-3)': {\n        'id|number': '{{ $index+1 }}',\n        'name': '{{ random.repeat(\"abcdefg\",4,20) }}'\n      }\n    },\n  }, {\n    method: 'POST',\n    path: 'submit',\n    response: {msg: 'success'},\n  },\n  {\n    method: 'DELETE',\n    path : 'delete/{id}',\n    response (request, response) {\n      response.status = 500\n      response.body = {msg: 'error'}\n      return response\n    }\n  ]\n}])\n```\n\n### HEAD\n\n```javascript\nimport { HEAD } from 'xe-ajax-mock'\n\nHEAD('/api/user/head', null)\n```\n\n### GET\n\n```javascript\nimport { GET } from 'xe-ajax-mock'\n\nGET('/api/user/list', {msg: 'success'})\n\nGET('/api/user/list', (request, response) =\u003e {\n  response.status = 200\n  response.statusText = 'OK'\n  response.body = {\n    '~|array(1-3)': {\n      'id|number': '{{ $index+1 }}',\n      'name': '{{ random.repeat(\"abcdefg\",4,20) }}'\n    }\n  }\n  return response\n})\n\nGET('/api/user/list/{pageSize}/{currentPage}', (request, response, { pathVariable }) =\u003e {\n  response.body = {\n    'page': {\n      'currentPage|number': '{{ $pathVariable.currentPage }}',\n      'pageSize|number': '{{ $pathVariable.pageSize }}'\n    },\n    'result|array(2-5)': {\n      'id|number': '{{ $index+1 }}',\n      'name': '{{ random.repeat(\"abcdefg\",4,20) }}'\n    }\n  }\n  return response\n})\n```\n\n### POST\n\n```javascript\nimport { template, POST } from 'xe-ajax-mock'\n\nPOST('/api/user/save', {msg: 'success'})\n\nPOST('/api/user/save', (request, response) =\u003e {\n  response.body = {msg: 'success'}\n  return response\n})\n\nPOST('/api/user/save', (request, response) =\u003e {\n  // 简单模拟后台校验\n  if (request.params.id) {\n    response.body = {msg: 'success'}\n  } else {\n    response.status = 500\n    response.body = {msg: 'error'}\n  }\n  return response\n})\n```\n\n### PUT\n\n```javascript\nimport { PUT } from 'xe-ajax-mock'\n\nPUT('/api/user/update', {msg: 'success'})\n\nPUT('/api/user/update', (request, response) =\u003e {\n  response.status = 500\n  response.body = {msg: 'error'}\n  return response\n})\n```\n\n### DELETE\n\n```javascript\nimport { DELETE } from 'xe-ajax-mock'\n\nDELETE('/api/user/delete/{id}', {msg: 'success'})\n\nDELETE('/api/user/delete/{id}', (request, response) =\u003e {\n  response.body = {msg: 'success'}\n  return response\n})\n```\n\n### PATCH\n\n```javascript\nimport { PATCH } from 'xe-ajax-mock'\n\nPATCH('/api/user/update', {msg: 'success'})\n```\n\n### JSONP\n\n```javascript\nimport { JSONP } from 'xe-ajax-mock'\n\nJSONP('http://xuliangzhan.com/jsonp/user/message', {msg: 'success'})\n\nJSONP('http://xuliangzhan.com/jsonp/user/message', (request, response) =\u003e {\n  response.body = {\n    '~|array(1-3)': {\n      'id|number': '{{ $index+1 }}',\n      'name': '{{ random.repeat(\"abcdefg\",4,20) }}'\n    }\n  }\n  return response\n}， {jsonp: 'cb'})\n```\n\n## License\n\n[MIT](LICENSE) © 2017-present, Xu Liangzhan\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fx-extends%2Fxe-ajax-mock","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fx-extends%2Fxe-ajax-mock","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fx-extends%2Fxe-ajax-mock/lists"}