|
159 | 159 | </svg>
|
160 | 160 | </a>
|
161 | 161 | </div>
|
162 |
| - <div v-show="isTestCaseShow" style="bottom: 4px; padding: 4px 13px 0px 10px; position: absolute; width: 100%; text-align: right; background-color: white; z-index: 100"> |
| 162 | + <div v-show="isTestCaseShow && ! isLocalShow" style="bottom: 4px; padding: 4px 13px 0px 10px; position: absolute; width: 100%; text-align: right; background-color: white; z-index: 100"> |
163 | 163 | <a >搜索</a>
|
164 | 164 | <input id="vTestCaseSearch" v-model="testCaseSearch" style="min-width: 60px; display: inline-flex; text-align: center" @keyup="doOnKeyUp(event, 'testCase', true)" />
|
165 | 165 | <button @click="pageDown('testCase')">上一页</button>
|
|
193 | 193 | <div v-show="! isPreviewEnabled" style="width: 100%;height: 100%;position: absolute;display: flex;flex-grow: 1" >
|
194 | 194 | <textarea id="vComment" style="width: 100%; height: 100%; position: absolute; z-index: 0; color: darkseagreen; background-color: white;" wrap="off" disabled>
|
195 | 195 | </textarea>
|
196 |
| - <textarea id="vInput" @keyup="onChange(true)" style="width: 100%;height: 100%; position: absolute; z-index: 100; background: #0000;" wrap="off" > |
| 196 | + <textarea v-show="! isEditResponse" id="vWarning" style="width: 100%; height: 100%; position: absolute; z-index: 0; color: orangered; background-color: #0000;" wrap="off" disabled> |
| 197 | + </textarea> |
| 198 | + <textarea id="vInput" @keyup="onChange(true)" style="width: 100%;height: 100%; position: absolute; z-index: 100; background: #0000;" wrap="off" placeholder="{ // 根对象,可在内部加 format,tag,version,@role,@database,@schema,@datasource,@explain,@cache 等全局关键词键值对 |
| 199 | + '[]': { // 数组,可在内部加 count,page,query,join 等关键词键值对 |
| 200 | + 'count': 5, // 每页数量 |
| 201 | + 'page': 0, // 分页页码 |
| 202 | + 'join': '</User/id@', // 多表连接:LEFT JOIN User,同一层级必须有 'User':{ 'id@':'/../..' } |
| 203 | + 'Moment': { // 动态 |
| 204 | + '@order': 'date+', // 排序方式:+升序,-降序 |
| 205 | + '@column': 'id,userId;date_format(date,%Y-%m-%d %H:%m)', // 返回字段,可传 字段(:别名)、SQL 函数(:别名,用分号 ; 隔开)、表达式,以及部分 SQL 关键词 |
| 206 | + '@explain': true, // 性能分析:true-开启 false-关闭,返回执行的 SQL 及查询计划 |
| 207 | + 'content~': 'o', // 正则匹配 < content: String(300)? 内容 |
| 208 | + 'userId!': 82001, // 都不符合 < userId: Int(15), 用户id |
| 209 | + '@combine': 'userId!,content~' // 条件组合,| 可省略。合并同类,外层按照 & | ! 顺序,内层按传参顺序组合成 (key0 & key1 & key6 & 其它key) & (key2 | key3 | key7) & !(key4 | key5) |
| 210 | + }, |
| 211 | + 'User': { // 用户公开信息表。 对安全要求高,不想泄漏真实名称。对外名称为 User |
| 212 | + 'id@': '/Moment/userId', // 引用赋值,从对象父级开始的相对(缺省)路径 < id: Int(15), 唯一标识 |
| 213 | + '@column': 'id,name,head' // 返回字段,可传 字段(:别名)、SQL 函数(:别名,用分号 ; 隔开)、表达式,以及部分 SQL 关键词 |
| 214 | + }, |
| 215 | + '[]': { // 数组,可在内部加 count,page,query,join 等关键词键值对 |
| 216 | + 'count': 6, // 每页数量 |
| 217 | + 'join': '@/User/id@', // 多表连接:APP JOIN User,同一层级必须有 'User':{ 'id@':'/../..' } |
| 218 | + 'Comment': { // 评论 |
| 219 | + '@order': 'date-', // 排序方式:+升序,-降序 |
| 220 | + 'momentId@': '[]/Moment/id' // 引用赋值,从最外层开始的绝对(完整)路径 < momentId: Int(15), 动态id |
| 221 | + }, |
| 222 | + 'User': { // 用户公开信息表。 对安全要求高,不想泄漏真实名称。对外名称为 User |
| 223 | + 'id@': '/Comment/userId', // 引用赋值,从对象父级开始的相对(缺省)路径 < id: Int(15), 唯一标识 |
| 224 | + '@column': 'DISTINCT id,name;concat(%,name,%):concat' // 返回字段,可传 字段(:别名)、SQL 函数(:别名,用分号 ; 隔开)、表达式,以及部分 SQL 关键词 |
| 225 | + } |
| 226 | + } |
| 227 | + } |
| 228 | +} |
| 229 | +
|
| 230 | +/* |
| 231 | +JSON 右侧可以写行注释,两个空格加两个斜杆 ' //' 开头; |
| 232 | +JSON 下方可以写段注释,'/*' 开头 '*/' 结尾,都在每行最前, |
| 233 | +段注释可以是普通文本或 Markdown 格式文本,一般用于枚举值等额外说明。 |
| 234 | +
|
| 235 | +### 例如一个表格 |
| 236 | +开发流程 | 传统方式 | APIJSON |
| 237 | + --- | --- | --- |
| 238 | +实现接口 | 写代码 + 写文档 | 都不用写 |
| 239 | +兼容旧版 | v2, v3.. 接口 | 都不用写 |
| 240 | +
|
| 241 | +### 例如一段代码 |
| 242 | +```js |
| 243 | +// 前端解析并打印 Response JSON |
| 244 | +var list = data['[]'] || [] |
| 245 | +for (var i = 0; i < list.length; i ++) { |
| 246 | + console.log('[]/' + i + '=' + JSON.stringify(list[i])) |
| 247 | +} |
| 248 | +``` |
| 249 | +
|
| 250 | +### 例如一张图片 |
| 251 | + |
| 252 | +
|
| 253 | +## 快捷键 |
| 254 | +Ctrl + I 或 Command + I 格式化 JSON |
| 255 | +
|
| 256 | +#### 右上角设置项 > 预览请求输入框,显示对应的预览效果 |
| 257 | +*/ |
| 258 | +
|
| 259 | +
|
| 260 | +
|
| 261 | +" > |
197 | 262 | {
|
198 | 263 | "User": {
|
199 | 264 | "id": 82001
|
|
204 | 269 | }
|
205 | 270 | }
|
206 | 271 | }
|
| 272 | + |
| 273 | +/* |
| 274 | +以上 JSON 文本支持 JSON5 格式。清空文本内容可查看规则。 |
| 275 | +注释可省略。行注释前必须有两个空格;段注释必须在 JSON 下方。 |
| 276 | + |
| 277 | +## 快捷键 |
| 278 | +Ctrl + I 或 Command + I 格式化 JSON |
| 279 | + |
| 280 | +#### 右上角设置项 > 预览请求输入框,显示对应的预览效果 |
| 281 | +*/ |
| 282 | + |
| 283 | + |
| 284 | + |
207 | 285 | </textarea>
|
208 | 286 | </div>
|
209 | 287 | <div id="vRequestMarkdown" v-show="isPreviewEnabled" style="width: 100%;height: 100%;position: relative;"></div>
|
|
224 | 302 | </a>
|
225 | 303 | <a v-show="(currentRemoteItem || {}).Document != null" class="hint--top @cli-tool" data-hint="添加" style="font-size:xx-large; margin-bottom: 2px; color: black;"
|
226 | 304 | href="javascript:void(0)" @click="if(isRandomListShow || isRandomSubListShow) { randomTestTitle = null; isRandomListShow = false; isRandomSubListShow = false; } else { showExport(true, true, true) }"> + </a>
|
227 |
| - <a v-show="false" href="javascript:void(0)" style="font-size: small;" class="hint--top" data-hint="共享" @click="showExport(true, true)"> |
| 305 | + <a v-show="false" href="javascript:void(0)" style="font-size: small;" class="hint--top" data-hint="上传/共享" @click="showExport(true, true)"> |
228 | 306 | <svg class="icon">
|
229 | 307 | <use xlink:href="svg/icon.svg#share"></use>
|
230 | 308 | </svg>
|
|
314 | 392 | placeholder="# 常用:
|
315 | 393 | RANDOM_IN(val0:Any, val1:Any ...) // 从选项内随机取值
|
316 | 394 | RANDOM_INT(min:Integer, max:Integer) // 从范围内随机取整数
|
317 |
| -RANDOM_DB(min:Integer, max:Integer) // 从数据库随机取值 |
| 395 | +RANDOM_DB(min:Integer, max:Integer, table:String, column:String) // 从数据库随机取值 |
318 | 396 | RANDOM_NUM(min:Number, max:Number, precision:Integer) // 从范围内随机取小数
|
319 | 397 | RANDOM_STR(minLength:Integer, maxLength:Integer, regexp:String) // 从长度范围内随机取字符串
|
320 | 398 | ORDER_IN(val0:Any, val1:Any ...) // 从选项内顺序取值
|
321 | 399 | ORDER_INT(min:Integer, max:Integer) // 从范围内顺序取整数
|
322 |
| -ORDER_DB(min:Integer, max:Integer) // 从数据库顺序取值 |
| 400 | +ORDER_DB(min:Integer, max:Integer, table:String, column:String) // 从数据库顺序取值 |
323 | 401 | 其中 RANDOM 开头的是随机函数;ORDER 开头的是顺序函数,可以使用 + - 升降序 和 step 跨步,例如 ORDER_IN-(1, 2, 3) 降序取值,ORDER_INT+3(0, 100) 间隔 step = 3 位来升序取整数。
|
324 | 402 | # 模板:
|
325 | 403 | format: ORDER_IN(true, false, null, undefined) // 从选项中顺序取值
|
326 |
| -User/id id>: RANDOM_DB() // 用 id> 替换 User 内的 id,从数据库随机取值 |
| 404 | +User/id: RANDOM_DB() // 从数据库随机取值,等价于 User/id: RANDOM_DB(null, null, 'User', 'id') |
327 | 405 | []/page: Math.round(100*Math.random()) // 通过 JavaScript 代码来自定义 [] 内的 page
|
328 | 406 | ">
|
329 | 407 | User/id: RANDOM_INT(82001, 82020) // 随机整数
|
|
345 | 423 | </svg>
|
346 | 424 | </a>
|
347 | 425 | </div>
|
348 |
| - <textarea id="vHeader" @keyup="onChange(true)" style="width: 100%;height: 100%;" wrap="off" placeholder="Authorization: Basic YWRtaW46YWRtaW4= // 示例,支持单行注释"></textarea> |
| 426 | + <textarea id="vHeader" @keyup="onChange(true)" style="width: 100%;height: 100%;" wrap="off" placeholder="Authorization: Basic YWRtaW46YWRtaW4= // 示例,支持单行注释 |
| 427 | +My-Header: 'Secret' + Math.random() // 示例,代码执行结果作为实际值,值为 fun(arg0, arg1..) 等包含函数名与括号的格式 "></textarea> |
349 | 428 | </div>
|
350 | 429 |
|
351 | 430 | </div>
|
|
379 | 458 | <use xlink:href="svg/icon.svg#save"></use>
|
380 | 459 | </svg>
|
381 | 460 | </a>
|
382 |
| - <ul class="historys pop" style="width: 240px"> |
| 461 | + <ul class="historys pop" style="width: 304px"> <!-- 没必要太长,遮挡范围过大 // 490 刚好与 URL 输入框左对齐 --> |
383 | 462 | <li v-for="(his, index) in historys">
|
384 | 463 | <a href="javascript:void(0)" @click="restore(his, his.response)" > {{his.name}}</a>
|
385 | 464 |
|
|
422 | 501 | </svg>
|
423 | 502 | </a>
|
424 | 503 |
|
425 |
| - <a href="javascript:void(0)" class="hint--top" data-hint="共享" @click="showExport(true, true)"> |
| 504 | + <a href="javascript:void(0)" class="hint--top" data-hint="上传/共享" @click="showExport(true, true)"> |
426 | 505 | <svg class="icon">
|
427 | 506 | <use xlink:href="svg/icon.svg#share"></use>
|
428 | 507 | </svg>
|
|
722 | 801 | <script type="text/javascript" language="JavaScript" charset="UTF-8" src="apijson/JSONResponse.js" ></script>
|
723 | 802 | <script type="text/javascript" language="JavaScript" charset="UTF-8" src="apijson/CodeUtil.js" ></script>
|
724 | 803 | <!-- 必须在main.js前 TODO 可能有冲突,代码写入vue文件? >>>>>>>>>>>>>>>> -->
|
| 804 | +<script src="https://unpkg.com/json5@^2.0.0/dist/index.min.js"></script> |
725 | 805 |
|
726 | 806 |
|
727 | 807 | <script src="js/main.js"></script>
|
|
735 | 815 | var vSend = document.getElementById("vSend");
|
736 | 816 |
|
737 | 817 | var vInput = document.getElementById("vInput");
|
| 818 | + var vWarning = document.getElementById("vWarning"); |
738 | 819 | var vComment = document.getElementById("vComment");
|
739 | 820 | var vHeader = document.getElementById("vHeader");
|
740 | 821 | var vRandom = document.getElementById("vRandom");
|
|
766 | 847 | function onScrollChanged() {
|
767 | 848 | $(vComment).scrollLeft(vInput.scrollLeft);
|
768 | 849 | $(vComment).scrollTop(vInput.scrollTop);
|
| 850 | + $(vWarning).scrollLeft(vInput.scrollLeft); |
| 851 | + $(vWarning).scrollTop(vInput.scrollTop); |
769 | 852 | }
|
770 | 853 |
|
771 | 854 | //vComment跟随vInput滚动,避免JSON重叠"露馅"
|
|
780 | 863 | $(vUrl).on('scroll', onURLScrollChanged);
|
781 | 864 |
|
782 | 865 |
|
783 |
| - |
784 | 866 | function markdownToHTML(md, isRequest) {
|
| 867 | + if (editormd == null) { |
| 868 | + return; |
| 869 | + } |
| 870 | + |
785 | 871 | if (isRequest) {
|
786 | 872 | vRequestMarkdown.innerHTML = '';
|
787 | 873 | }
|
|
0 commit comments