From d8ce81946e209cf4a990c8600641acd3d8a2007b Mon Sep 17 00:00:00 2001 From: TommyLemon <1184482681@qq.com> Date: Wed, 31 Oct 2018 23:28:10 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=8E=86=E5=8F=B2=E8=AF=B7?= =?UTF-8?q?=E6=B1=82=E8=AE=B0=E5=BD=95=EF=BC=9B=E6=96=B0=E5=A2=9E=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E5=91=98=E8=B4=A6=E5=8F=B7=EF=BC=9B=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E9=85=8D=E7=BD=AEschema=E5=92=8C=E6=89=98=E7=AE=A1=E6=9C=8D?= =?UTF-8?q?=E5=8A=A1=E5=99=A8=EF=BC=9B=E4=BC=98=E5=8C=96=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E5=8C=96=E6=8E=A5=E5=8F=A3=E5=9B=9E=E5=BD=92=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=EF=BC=9B=E4=BC=98=E5=8C=96=E8=87=AA=E5=8A=A8=E6=B3=A8=E9=87=8A?= =?UTF-8?q?=EF=BC=9B=E6=96=B0=E5=A2=9E=E6=96=87=E6=A1=A3=E8=A7=86=E9=A2=91?= =?UTF-8?q?=E6=BA=90=E7=A0=81=E7=AD=89=E5=85=A5=E5=8F=A3=EF=BC=9B=E4=BF=AE?= =?UTF-8?q?=E5=A4=8Dbug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apijson/CodeUtil.js | 89 ++-- apijson/JSONRequest.js | 2 +- apijson/JSONResponse.js | 115 ++++- apijson/StringUtil.js | 16 + css/main.css | 22 +- img/wechat_collect.jpg | Bin 0 -> 27494 bytes index.html | 165 +++++-- js/main.js | 957 ++++++++++++++++++++++++++++++---------- 8 files changed, 1028 insertions(+), 338 deletions(-) create mode 100644 img/wechat_collect.jpg diff --git a/apijson/CodeUtil.js b/apijson/CodeUtil.js index 5d07299..6776f14 100644 --- a/apijson/CodeUtil.js +++ b/apijson/CodeUtil.js @@ -62,7 +62,6 @@ var CodeUtil = { else { if (line.endsWith('}')) { if (line.endsWith('{}')) { //对象,判断是不是Table,再加对应的注释 - names[depth] = key; comment = CodeUtil.getComment4Request(tableList, null, key, null, method); } else { @@ -225,20 +224,22 @@ var CodeUtil = { const isTable = isSmart && JSONObject.isTableKey(JSONResponse.getTableName(key)); const column = isTable ? value['@column'] : null; - const order = isTable ? value['@order'] : null; const group = isTable ? value['@group'] : null; const having = isTable ? value['@having'] : null; + const order = isTable ? value['@order'] : null; const combine = isTable ? value['@combine'] : null; const schema = isTable ? value['@schema'] : null; + const database = isTable ? value['@database'] : null; const role = isTable ? value['@role'] : null; if (isTable) { delete value['@column']; - delete value['@order']; delete value['@group']; delete value['@having']; + delete value['@order']; delete value['@combine']; delete value['@schema']; + delete value['@database']; delete value['@role']; } @@ -247,11 +248,12 @@ var CodeUtil = { const name = CodeUtil.getTableKey(JSONResponse.getSimpleName(key)); if (isTable) { s = column == null ? s : s + '\n' + name + '.setColumn(' + CodeUtil.getJavaValue(name, key, column) + ');'; - s = order == null ? s : s + '\n' + name + '.setOrder(' + CodeUtil.getJavaValue(name, key, order) + ');'; s = group == null ? s : s + '\n' + name + '.setGroup(' + CodeUtil.getJavaValue(name, key, group) + ');'; s = having == null ? s : s + '\n' + name + '.setHaving(' + CodeUtil.getJavaValue(name, key, having) + ');'; + s = order == null ? s : s + '\n' + name + '.setOrder(' + CodeUtil.getJavaValue(name, key, order) + ');'; s = combine == null ? s : s + '\n' + name + '.setCombine(' + CodeUtil.getJavaValue(name, key, combine) + ');'; s = schema == null ? s : s + '\n' + name + '.setSchema(' + CodeUtil.getJavaValue(name, key, schema) + ');'; + s = database == null ? s : s + '\n' + name + '.setDatabase(' + CodeUtil.getJavaValue(name, key, database) + ');'; s = role == null ? s : s + '\n' + name + '.setRole(' + CodeUtil.getJavaValue(name, key, role) + ');'; } @@ -270,6 +272,18 @@ var CodeUtil = { if (key == 'version') { return '\n' + parentKey + '.setVersion(' + CodeUtil.getJavaValue(name, key, value) + ');'; } + if (key == 'format') { + return '\n' + parentKey + '.setFormat(' + CodeUtil.getJavaValue(name, key, value) + ');'; + } + if (key == '@schema') { + return '\n' + parentKey + '.setSchema(' + CodeUtil.getJavaValue(name, key, value) + ');'; + } + if (key == '@database') { + return '\n' + parentKey + '.setDatabase(' + CodeUtil.getJavaValue(name, key, value) + ');'; + } + if (key == '@role') { + return '\n' + parentKey + '.setRole(' + CodeUtil.getJavaValue(name, key, value) + ');'; + } } return '\n' + parentKey + '.put("' + key + '", ' + CodeUtil.getJavaValue(name, key, value) + ');'; } @@ -827,6 +841,7 @@ var CodeUtil = { OWNER: '拥有者', ADMIN: '管理员' }, + REQUEST_DATABASE_KEYS: ['MYSQL', 'POSTGRESQL', 'ORACLE'], /**获取请求JSON的注释 * @param tableList @@ -875,17 +890,17 @@ var CodeUtil = { if (JSONObject.isArrayKey(name)) { switch (key) { case 'count': - return CodeUtil.getType4Request(value) != 'number' ? ' ! value必须是Number类型!' : CodeUtil.getComment('最多数量', false, ' '); + return CodeUtil.getType4Request(value) != 'number' ? ' ! value必须是Number类型!' : CodeUtil.getComment('最多数量: 例如 5 10 20 ...', false, ' '); case 'page': if (CodeUtil.getType4Request(value) != 'number') { return ' ! value必须是Number类型!'; } - return value < 0 ? ' ! 必须 >= 0 !' : CodeUtil.getComment('分页页码', false, ' '); + return value < 0 ? ' ! 必须 >= 0 !' : CodeUtil.getComment('分页页码: 例如 0 1 2 ...', false, ' '); case 'query': var query = CodeUtil.QUERY_TYPES[value]; return StringUtil.isEmpty(query) ? ' ! value必须是[' + CodeUtil.QUERY_TYPE_KEYS.join() + ']中的一种!' : CodeUtil.getComment('查询内容:0-数据 1-总数 2-全部', false, ' '); case 'join': - return CodeUtil.getType4Request(value) != 'string' ? ' ! value必须是String类型!' : CodeUtil.getComment('多表连接:LEFT JOIN < ,RIGHT JOIN > ,INNER JOIN & | ! ', false, ' '); + return CodeUtil.getType4Request(value) != 'string' ? ' ! value必须是String类型!' : CodeUtil.getComment('多表连接:例如 &/User/id@,100;sum(balance)<=10000;...', false, ' '); + case '@order': + return CodeUtil.getType4Request(value) != 'string' ? ' ! value必须是String类型!' : CodeUtil.getComment('排序方式:+升序,-降序,例如 name+,date-,...', false, ' '); + case '@combine': + return CodeUtil.getType4Request(value) != 'string' ? ' ! value必须是String类型!' : CodeUtil.getComment('条件组合:例如 name?,|tag?,&id{},!id,...', false, ' '); + case '@schema': + return CodeUtil.getType4Request(value) != 'string' ? ' ! value必须是String类型!' : CodeUtil.getComment('集合空间:例如 sys apijson ...', false, ' '); + case '@database': + try { + value = value.substring(1, value.length - 1).toUpperCase(); + } catch (e) {} + return CodeUtil.REQUEST_DATABASE_KEYS.indexOf(value) < 0 ? ' ! value必须是[' + CodeUtil.REQUEST_DATABASE_KEYS.join() + ']中的一种!' : CodeUtil.getComment('数据库:例如 MYSQL POSTGRESQL ORACLE ...', false, ' '); + case '@role': + try { + value = value.substring(1, value.length - 1).toUpperCase(); + } catch (e) {} + var role = CodeUtil.REQUEST_ROLE[value]; + return StringUtil.isEmpty(role) ? ' ! value必须是[' + CodeUtil.REQUEST_ROLE_KEYS.join() + ']中的一种!' : CodeUtil.getComment('来访角色:' + role, false, ' '); + } if (key.startsWith('@')) { - switch (key) { - case '@column': - return CodeUtil.getType4Request(value) != 'string' ? ' ! value必须是String类型!' : CodeUtil.getComment('返回字段:例如 id,name,json_length(contactIdList):contactCount...', false, ' '); - case '@order': - return CodeUtil.getType4Request(value) != 'string' ? ' ! value必须是String类型!' : CodeUtil.getComment('排序方式:+升序,-降序,例如 name+,date-,...', false, ' '); - case '@group': - return CodeUtil.getType4Request(value) != 'string' ? ' ! value必须是String类型!' : CodeUtil.getComment('分组方式:例如 userId', false, ' '); - case '@having': - return CodeUtil.getType4Request(value) != 'string' ? ' ! value必须是String类型!' : CodeUtil.getComment('SQL函数:例如 max(id)>100,sum(balance)<=10000,...', false, ' '); - case '@combine': - return CodeUtil.getType4Request(value) != 'string' ? ' ! value必须是String类型!' : CodeUtil.getComment('条件组合:例如 name?,|tag?,&id{},!id,...', false, ' '); - case '@schema': - return CodeUtil.getType4Request(value) != 'string' ? ' ! value必须是String类型!' : CodeUtil.getComment('数据库:例如 sys', false, ' '); - case '@correct': - return value != null ? ' ! value必须是Object类型!' : CodeUtil.getComment('字段校正', false, ' '); - case '@role': - try { - value = value.substring(1, value.length - 1).toUpperCase(); - } catch (e) {} - var role = CodeUtil.REQUEST_ROLE[value]; - return StringUtil.isEmpty(role) ? ' ! value必须是[' + CodeUtil.REQUEST_ROLE_KEYS.join() + ']中的一种!' : CodeUtil.getComment('来访角色:' + role, false, ' '); - } return ''; } var c = CodeUtil.getCommentFromDoc(tableList, objName, key, method); @@ -930,12 +948,21 @@ var CodeUtil = { if (method == 'GET' || method == 'HEAD') { return ''; } - return CodeUtil.getType4Request(value) != 'string' ? ' ! value必须是String类型!' : CodeUtil.getComment('请求密钥', false, ' '); + return CodeUtil.getType4Request(value) != 'string' ? ' ! value必须是String类型!' : CodeUtil.getComment('请求密钥:例如 User Comment[] Privacy-CIRCLE ...', false, ' '); case 'version': if (method == 'GET' || method == 'HEAD') { return ''; } - return CodeUtil.getType4Request(value) != 'number' ? ' ! value必须是Number类型!' : CodeUtil.getComment('版本号', false, ' '); + return CodeUtil.getType4Request(value) != 'number' ? ' ! value必须是Number类型!' : CodeUtil.getComment('版本号: 例如 1 2 3 ...', false, ' '); + case 'format': + return CodeUtil.getType4Request(value) != 'boolean' ? ' ! value必须是Boolean类型!' : CodeUtil.getComment('格式化: true-是 false-否', false, ' '); + case '@schema': + return CodeUtil.getType4Request(value) != 'string' ? ' ! value必须是String类型!' : CodeUtil.getComment('集合空间:例如 sys apijson ...', false, ' '); + case '@database': + try { + value = value.substring(1, value.length - 1).toUpperCase(); + } catch (e) {} + return CodeUtil.REQUEST_DATABASE_KEYS.indexOf(value) < 0 ? ' ! value必须是[' + CodeUtil.REQUEST_DATABASE_KEYS.join() + ']中的一种!' : CodeUtil.getComment('数据库:例如 MYSQL POSTGRESQL ORACLE ...', false, ' '); case '@role': try { value = value.substring(1, value.length - 1).toUpperCase(); diff --git a/apijson/JSONRequest.js b/apijson/JSONRequest.js index 78442ff..4c95cbc 100644 --- a/apijson/JSONRequest.js +++ b/apijson/JSONRequest.js @@ -189,7 +189,7 @@ function format(json) { } function log(tag, msg) { - console.log(tag + '.' + msg); + //console.log(tag + '.' + msg); } /**将json字符串转为JSON对象 diff --git a/apijson/JSONResponse.js b/apijson/JSONResponse.js index cba1c92..7305f99 100644 --- a/apijson/JSONResponse.js +++ b/apijson/JSONResponse.js @@ -194,6 +194,7 @@ var JSONResponse = { COMPARE_NO_STANDARD: -1, COMPARE_EQUAL: 0, COMPARE_KEY_MORE: 1, + COMPARE_LENGTH_CHANGE: 2, COMPARE_VALUE_CHANGE: 2, COMPARE_KEY_LESS: 3, COMPARE_TYPE_CHANGE: 4, @@ -207,14 +208,25 @@ var JSONResponse = { 3-对象缺少字段/整数变小数,黄色; 4-code/值类型 改变,红色; */ - compareResponse: function(target, real) { + compareResponse: function(target, real, folder, isMachineLearning) { if (target == null || target.code == null) { - return JSONResponse.COMPARE_NO_STANDARD; //未上传对比标准(正确的结果) + return { + code: JSONResponse.COMPARE_NO_STANDARD, //未上传对比标准 + msg: '没有校验标准!', + path: folder == null ? '' : folder + }; } if (target.code != real.code) { - return JSONResponse.COMPARE_CODE_CHANGE; + return { + code: JSONResponse.COMPARE_CODE_CHANGE, + msg: '状态码改变!', + path: folder == null ? '' : folder + }; } + var tCode = target.code; + var rCode = real.code; + delete target.code; delete real.code; @@ -222,7 +234,12 @@ var JSONResponse = { // delete target.msg; // delete real.msg; - return JSONResponse.compare(target, real); + var result = JSONResponse.compareWithBefore(target, real, folder); + + target.code = tCode; + real.code = rCode; + + return result; }, /**测试compare: 对比 新的请求与上次请求的结果 @@ -232,21 +249,48 @@ var JSONResponse = { 3-缺少字段/整数变小数,黄色; 4-类型/code 改变,红色; */ - compare: function(target, real) { + compareWithBefore: function(target, real, folder) { + folder = folder == null ? '' : folder; + if (target == null) { - return real == null ? JSONResponse.COMPARE_EQUAL : JSONResponse.COMPARE_KEY_MORE; + return { + code: real == null ? JSONResponse.COMPARE_EQUAL : JSONResponse.COMPARE_KEY_MORE, + msg: real == null ? '结果正确' : '是新增的', + path: real == null ? '' : folder, + value: real + }; } if (real == null) { //少了key - return JSONResponse.COMPARE_KEY_LESS; + return { + code: JSONResponse.COMPARE_KEY_LESS, + msg: '是缺少的', + path: folder, + value: real + }; } var type = typeof target; if (type != typeof real) { //类型改变 - return JSONResponse.COMPARE_TYPE_CHANGE; + return { + code: JSONResponse.COMPARE_TYPE_CHANGE, + msg: '值改变', + path: folder, + value: real + }; } - var max = JSONResponse.COMPARE_EQUAL; - var each = JSONResponse.COMPARE_EQUAL; + // var max = JSONResponse.COMPARE_EQUAL; + // var each = JSONResponse.COMPARE_EQUAL; + + var max = { + code: JSONResponse.COMPARE_EQUAL, + msg: '结果正确', + path: '', //导致正确时也显示 folder, + value: null //导致正确时也显示 real + }; + + var each; + if (target instanceof Array) { // JSONArray var all = target[0]; for (var i = 1; i < length; i++) { //合并所有子项, Java类型是稳定的,不会出现两个子项间同名字段对应值类型不一样 @@ -254,41 +298,48 @@ var JSONResponse = { } //下载需要看源JSON real = [all]; - each = JSONResponse.compare(target[0], all); + each = JSONResponse.compareWithBefore(target[0], all, JSONResponse.getAbstractPath(folder, i)); - if (max < each) { + if (max.code < each.code) { max = each; } - if (max < JSONResponse.COMPARE_VALUE_CHANGE) { + if (max.code < JSONResponse.COMPARE_VALUE_CHANGE) { if (target.length != real.length || (JSON.stringify(target) != JSON.stringify(real))) { - max = JSONResponse.COMPARE_VALUE_CHANGE; + max.code = JSONResponse.COMPARE_VALUE_CHANGE; + max.msg = '值改变'; + max.path = folder; + max.value = real; } } } else if (target instanceof Object) { // JSONObject var tks = Object.keys(target); var key; - for (var i = 0; i< tks.length; i++) { //遍历并递归下一层 + for (var i = 0; i < tks.length; i++) { //遍历并递归下一层 key = tks[i]; if (key == null) { continue; } - each = JSONResponse.compare(target[key], real[key]); - if (max < each) { + each = JSONResponse.compareWithBefore(target[key], real[key], JSONResponse.getAbstractPath(folder, key)); + if (max.code < each.code) { max = each; } - if (max >= JSONResponse.COMPARE_TYPE_CHANGE) { + if (max.code >= JSONResponse.COMPARE_TYPE_CHANGE) { break; } } - if (max < JSONResponse.COMPARE_KEY_MORE) { //多出key + if (max.code < JSONResponse.COMPARE_KEY_MORE) { //多出key for (var k in real) { if (k != null && tks.indexOf(k) < 0) { - max = JSONResponse.COMPARE_KEY_MORE; + max.code = JSONResponse.COMPARE_KEY_MORE; + max.msg = '是新增的'; + max.path = JSONResponse.getAbstractPath(folder, k); + max.value = real[k]; + break; } } } @@ -296,12 +347,18 @@ var JSONResponse = { else { // Boolean, Number, String if (type == 'number') { //数字类型由整数变为小数 if (String(target).indexOf('.') < 0 && String(real).indexOf('.') >= 0) { - return JSONResponse.COMPARE_NUMBER_TYPE_CHANGE; + max.code = JSONResponse.COMPARE_NUMBER_TYPE_CHANGE; + max.msg = '整数变小数'; + max.path = folder; + max.value = real; } } - if (target !== real) { //值不同 - return JSONResponse.COMPARE_VALUE_CHANGE; + if (max.code < JSONResponse.COMPARE_VALUE_CHANGE && target !== real) { //值不同 + max.code = JSONResponse.COMPARE_VALUE_CHANGE; + max.msg = '值改变'; + max.path = folder; + max.value = real; } } @@ -345,7 +402,17 @@ var JSONResponse = { } return left; - } + }, + + getAbstractPath: function (folder, name) { + folder = folder == null ? '' : folder; + name = name == null ? '' : name; //导致 0 变为 '' name = name || ''; + return StringUtil.isEmpty(folder, true) ? name : folder + '/' + name; + }, + + log(msg) { + // console.log(msg); + } } \ No newline at end of file diff --git a/apijson/StringUtil.js b/apijson/StringUtil.js index 02f4559..17cf6c8 100644 --- a/apijson/StringUtil.js +++ b/apijson/StringUtil.js @@ -117,6 +117,22 @@ var StringUtil = { toLowerCase: function(s, trim) { s = trim ? StringUtil.trim(s) : StringUtil.get(s); return s.toLowerCase(); + }, + + split: function (s, separator) { + if (s == null) { + return null; + } + + if (separator == null) { + separator = ','; + } + + if (s.indexOf(separator) < 0) { + return [s]; + } + + return s.split(separator) } } diff --git a/css/main.css b/css/main.css index 8d40bec..999f407 100755 --- a/css/main.css +++ b/css/main.css @@ -16,23 +16,33 @@ html,body { display: none } -.pull-right { - float: right; - display: flex; - padding: 0; + +.pull-left { + float: left; display: flex; align-items: center; + flex-grow: 1 /* justify-content: center */ } -.pull-left { +.pull-center { + align-items: center; + width: 100%; + /* justify-content: center */ +} + +.pull-right { + float: right; + display: flex; + padding: 0; display: flex; align-items: center; - flex-grow: 1 /* justify-content: center */ } + + textarea, input { color: #000; } diff --git a/img/wechat_collect.jpg b/img/wechat_collect.jpg new file mode 100644 index 0000000000000000000000000000000000000000..75e22f7baf09a4b5578f8fa5d2f5d6bfc8981487 GIT binary patch literal 27494 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

TYkkaQa1h91y0 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 OVY5ZMSSPjLr2hq1Vmo#K literal 0 HcmV?d00001 diff --git a/index.html b/index.html index 9d2f0a9..dc6bce9 100755 --- a/index.html +++ b/index.html @@ -1,7 +1,7 @@ - APIJSON.cn + APIJSON.org @@ -54,73 +54,109 @@

-
+
- +
-
- - - - 测试用例 - {{ testProcess }} - +
-
    -
  • - {{(item.version > 0 ? 'V' + item.version : 'V*') + ' ' + item.name + ' ' + item.url}} -
    - + -
    +