From 26b01d96ed75ce19004283e15075622adb5ecf15 Mon Sep 17 00:00:00 2001 From: suxiaoxin Date: Thu, 31 Aug 2017 18:04:45 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=A2=9E=E5=BC=BAmock?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- client/components/Postman/Postman.js | 25 +++- .../InterfaceList/InterfaceEditForm.js | 2 + .../Interface/InterfaceList/mockEditor.js | 3 +- common/mock-extra.js | 113 +++++++++--------- server/controllers/interface.js | 1 + server/middleware/mockServer.js | 3 +- server_dist/controllers/interface.js | 1 + server_dist/middleware/mockServer.js | 6 +- ykit.js | 6 +- 9 files changed, 95 insertions(+), 65 deletions(-) diff --git a/client/components/Postman/Postman.js b/client/components/Postman/Postman.js index d23f356f..16fb60e2 100644 --- a/client/components/Postman/Postman.js +++ b/client/components/Postman/Postman.js @@ -6,7 +6,7 @@ import { autobind } from 'core-decorators'; import crossRequest from 'cross-request'; import mockEditor from '../../containers/Project/Interface/InterfaceList/mockEditor' import URL from 'url'; - +const MockExtra = require('common/mock-extra.js') import './Postman.scss' const { TextArea } = Input; @@ -158,8 +158,29 @@ export default class Run extends Component { } const { res_body, res_body_type } = this.props.data; let validRes = ''; + let query = {}; + this.state.query.forEach(item=>{ + query[item.name] = item.value; + }) + let body = {}; + if(this.state.bodyType === 'form'){ + this.state.bodyForm.forEach(item=>{ + body[item.name] = item.value; + }) + }else if(this.state.bodyType === 'json'){ + try{ + body = JSON.parse(this.state.bodyOther); + }catch(e){ + body = {} + } + } if (res_body && res_body_type === 'json' && typeof res === 'object') { - validRes = Mock.valid(JSON.parse(res_body), res) + let tpl = MockExtra(JSON.parse(res_body), { + query: query, + body: body + }) + console.log(tpl, this.state) + validRes = Mock.valid(tpl, res) console.log(validRes) } diff --git a/client/containers/Project/Interface/InterfaceList/InterfaceEditForm.js b/client/containers/Project/Interface/InterfaceList/InterfaceEditForm.js index fea321cf..aa577671 100644 --- a/client/containers/Project/Interface/InterfaceList/InterfaceEditForm.js +++ b/client/containers/Project/Interface/InterfaceList/InterfaceEditForm.js @@ -4,6 +4,7 @@ import _ from 'underscore' import constants from '../../../../constants/variable.js' import { handlePath } from '../../../../common.js' + import { Form, Select, Input, Tooltip, Button, Row, Col, Radio, Icon, AutoComplete, Switch @@ -89,6 +90,7 @@ class InterfaceEditForm extends Component { if (!err) { if (values.res_body_type === 'json') values.res_body = this.state.res_body; values.method = this.state.method; + values.req_params = values.req_params || []; let isfile = false, isHavaContentType = false; if (values.req_body_type === 'form') { values.req_body_form.forEach((item) => { diff --git a/client/containers/Project/Interface/InterfaceList/mockEditor.js b/client/containers/Project/Interface/InterfaceList/mockEditor.js index 73c867dc..a24666ca 100644 --- a/client/containers/Project/Interface/InterfaceList/mockEditor.js +++ b/client/containers/Project/Interface/InterfaceList/mockEditor.js @@ -4,6 +4,7 @@ require('brace/mode/javascript'); require('brace/theme/xcode'); require("brace/ext/language_tools.js"); var json5 = require('json5'); +const MockExtra = require('common/mock-extra.js') var langTools = ace.acequire("ace/ext/language_tools"), wordList = [ @@ -67,7 +68,7 @@ function run(options) { curData.text = json; curData.format = true; curData.jsonData = obj; - curData.mockData = Mock.mock(obj); + curData.mockData = Mock.mock(MockExtra(obj, {})); curData.mockText = JSON.stringify(curData.mockData, null, " "); } catch (e) { curData.format = e.message; diff --git a/common/mock-extra.js b/common/mock-extra.js index 5c899f68..7eb62b28 100644 --- a/common/mock-extra.js +++ b/common/mock-extra.js @@ -1,70 +1,67 @@ -var mockjs = require('mockjs'); -var strRegex = /\${([a-zA-Z0-9_\.]+)\}/g -var varSplit = "."; -var mockSplit = "|"; +var strRegex = /\${([a-zA-Z0-9_\.]+)\}/g; +var varSplit = '.'; +var mockSplit = '|'; function mock(mockJSON, context) { - context = context || {}; - var filtersMap = { - regexp: handleRegexp - } - return mockjs.mock(parse(mockJSON)) + context = context || {}; + var filtersMap = { + regexp: handleRegexp + }; - function parse(p, c) { - c = c || {}; - for (var i in p) { - if (!p.hasOwnProperty(i)) { - continue; - } - if (typeof p[i] === 'object') { - c[i] = (p[i].constructor === Array) ? [] : {}; - parse(p[i], c[i]); - } else { - p[i] = handleStr(p[i]); - var filters = i.split(mockSplit), newFilters = [].concat(filters); - if (filters.length > 1) { - for (var f = 1, l = filters.length, index; f < l; f++) { - if (filters[f] in filtersMap) { - if ((index = newFilters.indexOf(filters[f])) !== -1) { - newFilters.splice(index, 1); - } - c[newFilters.join(mockSplit)] = filtersMap[filters[f]].call(p, p[i]) + return parse(mockJSON); + + function parse(p, c) { + c = c || {}; + for (var i in p) { + if (!p.hasOwnProperty(i)) { + continue; + } + if (typeof p[i] === 'object') { + c[i] = (p[i].constructor === Array) ? [] : {}; + parse(p[i], c[i]); + } else { + p[i] = handleStr(p[i]); + var filters = i.split(mockSplit), newFilters = [].concat(filters); + if (filters.length > 1) { + for (var f = 1, l = filters.length, index; f < l; f++) { + if (filters[f] in filtersMap) { + if ((index = newFilters.indexOf(filters[f])) !== -1) { + newFilters.splice(index, 1); + } + c[newFilters.join(mockSplit)] = filtersMap[filters[f]].call(p, p[i]); + } + } + } else { + c[i] = p[i]; + } } - } - } else { - c[i] = p[i] } - } + return c; } - return c; - } - function handleRegexp(item) { - return new RegExp(item) - } - - function handleStr(str) { - if(typeof str !== 'string' ||str.indexOf("{") === -1 || str.indexOf("}") === -1 || str.indexOf("$") === -1){ - return str; + function handleRegexp(item) { + return new RegExp(item); } - str = str.replace(strRegex, function (matchs, name) { - var names = name.split(varSplit); - var data = context; - names.forEach(function(n){ - if(data === false) return false; - if(n in data){ - data = data[n]; - }else{ - data = false; + + function handleStr(str) { + if (typeof str !== 'string' || str.indexOf('{') === -1 || str.indexOf('}') === -1 || str.indexOf('$') === -1) { + return str; } - }) - if(data === false){ - return matchs; - } - return data; - }) - return str; - } + str = str.replace(strRegex, function (matchs, name) { + var names = name.split(varSplit); + var data = context; + names.forEach(function (n) { + if (data === '') return ''; + if (n in data) { + data = data[n]; + } else { + data = ''; + } + }); + return data; + }); + return str; + } } module.exports = mock; \ No newline at end of file diff --git a/server/controllers/interface.js b/server/controllers/interface.js index 5629f58c..34f0286d 100644 --- a/server/controllers/interface.js +++ b/server/controllers/interface.js @@ -351,6 +351,7 @@ class interfaceController extends baseController { data.req_params = params.req_params; } else { data.type = 'static' + data.req_params = []; } if (!_.isUndefined(params.req_query)) { diff --git a/server/middleware/mockServer.js b/server/middleware/mockServer.js index b3dd8e52..cbcb416c 100644 --- a/server/middleware/mockServer.js +++ b/server/middleware/mockServer.js @@ -3,6 +3,7 @@ import projectModel from '../models/project.js'; import interfaceModel from '../models/interface.js'; import mockExtra from '../../common/mock-extra.js'; import _ from 'underscore'; +import Mock from 'mockjs'; function matchApi(apiPath, apiRule) { @@ -96,7 +97,7 @@ module.exports = async (ctx, next) => { body: ctx.request.body } ); - return ctx.body = res; + return ctx.body = Mock.mock(res); } catch (e) { yapi.commons.log(e, 'error') return ctx.body = { diff --git a/server_dist/controllers/interface.js b/server_dist/controllers/interface.js index a16357cc..0a5e7f85 100644 --- a/server_dist/controllers/interface.js +++ b/server_dist/controllers/interface.js @@ -698,6 +698,7 @@ var interfaceController = function (_baseController) { data.req_params = params.req_params; } else { data.type = 'static'; + data.req_params = []; } if (!_underscore2.default.isUndefined(params.req_query)) { diff --git a/server_dist/middleware/mockServer.js b/server_dist/middleware/mockServer.js index 31f2aad9..09bf8117 100644 --- a/server_dist/middleware/mockServer.js +++ b/server_dist/middleware/mockServer.js @@ -28,6 +28,10 @@ var _underscore = require('underscore'); var _underscore2 = _interopRequireDefault(_underscore); +var _mockjs = require('mockjs'); + +var _mockjs2 = _interopRequireDefault(_mockjs); + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function matchApi(apiPath, apiRule) { @@ -189,7 +193,7 @@ module.exports = function () { query: ctx.request.query, body: ctx.request.body }); - return _context.abrupt('return', ctx.body = res); + return _context.abrupt('return', ctx.body = _mockjs2.default.mock(res)); case 60: _context.prev = 60; diff --git a/ykit.js b/ykit.js index 30fbae04..b89ea7ef 100644 --- a/ykit.js +++ b/ykit.js @@ -92,7 +92,8 @@ module.exports = { exports: [ './index.js' ], - modifyWebpackConfig: function (baseConfig) { + modifyWebpackConfig: function (baseConfig) { + var ENV_PARAMS = {}; switch (this.env) { case 'local': @@ -113,7 +114,8 @@ module.exports = { //初始化配置 baseConfig.devtool = 'cheap-module-eval-source-map' - baseConfig.context = path.resolve(__dirname, "client"); + baseConfig.context = path.resolve(__dirname, './client'); + baseConfig.resolve.alias.common = '/common'; baseConfig.output.prd.path = 'static/prd'; baseConfig.output.prd.publicPath = ''; baseConfig.output.prd.filename = '[name]@[chunkhash][ext]'