React项目接口文档.html 107 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655
  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
  6. <meta http-equiv='X-UA-Compatible' content='IE=edge,chrome=1' />
  7. <meta name="renderer" content="webkit">
  8. <meta http-equiv="Expires" content="0">
  9. <meta http-equiv="Pragma" content="no-cache">
  10. <meta http-equiv="Cache-control" content="no-cache">
  11. <meta http-equiv="Cache" content="no-cache">
  12. <title>Apipost接口文档</title>
  13. <link href="https://img.cdn.apipost.cn/docs/css7/style.css?20220909" rel="stylesheet">
  14. <link href="https://img.cdn.apipost.cn/docs/css/font-awesome-4.7.0/css/font-awesome.min.css?20220909" rel="stylesheet">
  15. <link href="https://img.cdn.apipost.cn/docs/css7/github.css?20220909" rel="stylesheet">
  16. <link rel="stylesheet" href="https://img.cdn.apipost.cn/docs/css7/content-v7.css?20220909">
  17. <link href="https://img.cdn.apipost.cn/docs/css7/json-viewer.css?20220909" rel="stylesheet">
  18. <script type="text/javascript" src="https://img.cdn.apipost.cn/docs/js/jquery-3.4.1.min.js?20220909"></script>
  19. <script type="text/javascript" src="https://img.cdn.apipost.cn/docs/js7/marked.min.js?20220909"></script>
  20. <script type="text/javascript" src="https://img.cdn.apipost.cn/docs/js7/template-web.js?20220909"></script>
  21. <script type="text/javascript" src="https://img.cdn.apipost.cn/docs/js7/highlight.js?20220909"></script>
  22. <script type="text/javascript" src="https://img.cdn.apipost.cn/docs/js7/clipboard.min.js?20220909"></script>
  23. <script type="text/javascript" src="https://img.cdn.apipost.cn/docs/js7/crypto-js.min.js?20220909" charset="utf-8"></script>
  24. <script type="text/javascript" src="https://img.cdn.apipost.cn/docs/js/json5.min.js?20220909"></script>
  25. <script type="text/javascript" src="https://img.cdn.apipost.cn/docs/js/dayjs.min.js?20220909"></script>
  26. <script type="text/javascript" src="https://img.cdn.apipost.cn/docs/js/url-join.js?20220909"></script>
  27. <!-- <script type="text/javascript" src="./js/enc.min.js"></script> -->
  28. <script type="text/javascript" src="https://img.cdn.apipost.cn/docs/js/json-viewer.min.js?20220909"></script>
  29. <script type="text/javascript" src="https://img.cdn.apipost.cn/docs/js/lodash.min.js?20220909"></script>
  30. <script type="text/javascript">
  31. consoleLog = console.log; // 重写 consoleLog
  32. $(function () {
  33. })
  34. </script>
  35. </head>
  36. <body>
  37. <div class="apipost-doc-body">
  38. <div class="apipost-doc-body-main">
  39. <div class="apipost-doc-body-nav">
  40. <div class="logo">
  41. <a href="https://www.apipost.cn/"><img class="project-logo" src="https://img.cdn.apipost.cn/docs/images7/logo.svg" /></a>
  42. </div>
  43. <div class="apipost-doc-body-nav-search">
  44. <img src="https://img.cdn.apipost.cn/docs/images7/search-icon.svg">
  45. <input type="text" name="search-input" placeholder="搜索目录、接口。支持 名称、URL、Method 搜索">
  46. </div>
  47. <div class="apipost-doc-body-nav-title"> 项目名 </div>
  48. <div class="apipost-doc-body-nav-list">
  49. <ul>
  50. <li data-type="global" data-parent_id="0" data-target_id="001" data-indent="0"
  51. class="global active">
  52. <a class="load-data-btn" href="javascript:;" data-type="global" data-parent_id="0"
  53. data-target_id="001" data-indent="0">全局公共参数</a>
  54. </li>
  55. </ul>
  56. <ul class="apipost-left-nav-template">
  57. <script type="text/html" id="apipost-left-nav-template-tpl">
  58. {{if _.isArray(list)}}
  59. {{each list item}}
  60. {{if !item.indent}}
  61. {{set indent = item.indent = 0}}
  62. {{/if}}
  63. <li data-type="{{item.target_type}}" data-parent_id="{{item.parent_id}}" data-target_id="{{item.target_id}}" data-indent="{{item.indent}}" class="{{item.target_type}} {{if target_id == item.target_id}}active{{/if}} {{if item.indent != 0}}is-hidden{{/if}}" style="padding-left: {{item.indent?item.indent:0}}em;">
  64. {{if item.target_type == 'folder' || item.example_type == 'folder'}}
  65. <a class="load-data-btn" href="javascript:;" data-type="{{item.target_type}}" data-parent_id="{{item.parent_id}}" data-target_id="{{item.local_target_id}}" data-indent="{{item.indent}}"><i class="fa fa-caret-down"></i>{{item.name}}</a>
  66. {{else if item.target_type == 'websocket' || item.example_type == 'websocket'}}
  67. <a class="load-data-btn" href="javascript:;" data-type="{{item.target_type}}" data-parent_id="{{item.parent_id}}" data-target_id="{{item.local_target_id}}" data-indent="{{item.indent}}"><em class="method websocket">WS</em><span>{{item.name}}</span></a>
  68. {{else if item.target_type == 'doc' || item.example_type == 'doc'}}
  69. <a class="load-data-btn" href="javascript:;" data-type="{{item.target_type}}" data-parent_id="{{item.parent_id}}" data-target_id="{{item.local_target_id}}" data-indent="{{item.indent}}"><em class="method doc">文本</em><span>{{item.name}}</span></a>
  70. {{else if item.target_type == 'grpc' || item.example_type == 'grpc'}}
  71. <a class="load-data-btn" href="javascript:;" data-type="{{item.target_type}}" data-parent_id="{{item.parent_id}}" data-target_id="{{item.local_target_id}}" data-indent="{{item.indent}}"><em class="method grpc">GRPC</em><span>{{item.name}}</span></a>
  72. {{else}}
  73. <a class="load-data-btn" href="javascript:;" data-type="{{item.target_type}}" data-parent_id="{{item.parent_id}}" data-target_id="{{item.local_target_id}}" data-indent="{{item.indent}}"><em class="method {{item.method}}">{{item.method}}</em><span>{{item.name}}</span></a>
  74. {{/if}}
  75. {{if item.target_type != 'folder' && item.color}}
  76. <span style="margin-left:5px;display:inline-block;width:6px;height:6px;border-radius:50%;background-color: {{item.color}};"></span>
  77. {{/if}}
  78. {{if item.target_type == 'example'}}
  79. <svg style="margin-left:5px;" width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg">
  80. <path d="M4.91033 6.68207H3.30033C3.09013 6.68207 2.94513 6.4768 3.01993 6.28529L4.61973 2.18849C4.64137 2.13306 4.67976 2.08536 4.72982 2.0517C4.77987 2.01804 4.83923 2.00001 4.90003 2H7.59962C7.81262 2 7.95782 2.21054 7.87742 2.40303L6.94592 4.63367H8.69951C8.95741 4.63367 9.09501 4.93026 8.92491 5.11933L4.62553 9.89887C4.41653 10.1313 4.02903 9.92989 4.11013 9.63106L4.91033 6.68207Z" fill="#FFC01E"/>
  81. </svg>
  82. {{/if}}
  83. </li>
  84. {{if _.isArray(item.children)}}
  85. {{each item.children as childrenItem key}}
  86. {{if item.children[key].indent}}
  87. {{set indent = item.children[key].indent = item.children[key].indent+2}}
  88. {{else}}
  89. {{set indent = item.children[key].indent = item.indent + 2}}
  90. {{/if}}
  91. {{/each}}
  92. {{set _recursiveList ={list:item.children}; }}
  93. {{include 'apipost-left-nav-template-tpl' _recursiveList}}
  94. {{/if}}
  95. {{/each}}
  96. {{/if}}
  97. </script>
  98. </ul>
  99. </div>
  100. <div class="apipost-doc-body-nav-drag-bar"></div>
  101. </div>
  102. <div class="apipost-doc-body-content">
  103. <div class="apipost-doc-wrap">
  104. <script type="text/html" id="apipost-doc-wrap-tpl">
  105. <div class="apipost-doc-wrap-title">
  106. <h2 class="title" data-text="{{data.name}}" id="{{data.name}}">
  107. <div class="mobile-nav-toggle-btn">
  108. <a href="javascript:;" class="mobile-nav-toggle-link-btn"><i class="fa fa-reorder"></i></a>
  109. </div>
  110. <div class="title-text">{{data.name}}</div>
  111. {{if data.target_type == 'api' || data.example_type == 'api'}}
  112. <button type="button" class="copy-clipboard" data-clipboard-text="{{JSON.stringify(data.copyData)}}"><i class="fa fa-copy"></i> 复制接口 </button>
  113. {{/if}}
  114. {{if data.target_type == 'api' || data.target_type == 'grpc' || data.target_type == 'websocket' || data.example_type == 'api' || data.example_type == 'grpc' || data.example_type == 'websocket'}}
  115. <a type="button" class="copy-clipboard" data-clipboard-text="{{JSON.stringify(data)}}" href="https://v7.apipost.cn/#/apis/run?target_id={{data.target_id}}" target="_blank">去调试</a>
  116. {{/if}}
  117. </h2>
  118. </div>
  119. <div class="apipost-doc-wrap-desc">
  120. <!-- 创建人:哈利厄 最后更新:哈利厄 &nbsp;&nbsp; -->
  121. 创建时间:{{data.format_create_dtime}} &nbsp;&nbsp;更新时间:{{data.format_update_dtime}}
  122. </div>
  123. {{if _.has(data, 'request.description')}}
  124. <div class="apipost-doc-wrap-para-markdown">
  125. <div class="markdown-section">{{@marked(data.request.description)}}</div>
  126. </div>
  127. {{/if}}
  128. {{if data.target_type == 'grpc' || data.example_type == 'grpc'}}
  129. <h3 class="apipost-doc-wrap-para-title" data-text="基本信息" id="基本信息">
  130. <i class="fa fa-wpforms"></i>
  131. <span>基本信息</span>
  132. </h3>
  133. <ul class="apipost-doc-wrap-base-para">
  134. {{if _.has(data, 'formatMark') && _.isObject(data.formatMark)}}
  135. <li><span>接口状态: </span><span style="color: {{data.formatMark.color}};">{{data.formatMark.name}}</span> </li>
  136. {{/if}}
  137. </ul>
  138. {{if _.has(data, 'protos') && _.isObject(data.protos) && Object.values(data.protos).length > 0}}
  139. <h3 class="apipost-doc-wrap-para-title" data-text="方法列表" id="方法列表">
  140. <i class="fa fa-wpforms"></i>
  141. <span>方法列表</span>
  142. </h3>
  143. {{each data.protos item key}}
  144. {{if _.has(item, 'services') && _.isObject(item.services) && !_.isEmpty(item.services)}}
  145. <h4 class="apipost-doc-wrap-para-title" data-text="{{key}}" id="{{key}}">
  146. <span>{{key}}</span>
  147. </h4>
  148. <div class="apipost-doc-paras" for-id="{{key}}">
  149. {{each item.services service namespace}}
  150. {{if _.isObject(service)}}
  151. {{each service method methodName}}
  152. <h5 data-text="{{namespace}}/{{methodName}}" id="{{namespace}}/{{methodName}}"><a name="{{key}}/{{namespace}}/{{methodName}}">[method]</a> {{key}}/{{namespace}}/{{methodName}}</h5>
  153. <ul class="apipost-doc-wrap-base-para">
  154. <li><span>方法名: </span><span><i class="copy-clipboard" data-clipboard-text="{{methodName}}">{{methodName}}</i></span> </li>
  155. <li><span>服务地址: </span><span><i class="copy-clipboard" data-clipboard-text="{{method.url}}">{{method.url}}</i></span> </li>
  156. </ul>
  157. {{if _.has(method, 'request.body.raw') && method.request.body.raw != ''}}
  158. <h6 data-text="请求参数" id="请求参数">请求参数</h6>
  159. <div class="apipost-raw-json request-body-json-view">
  160. <button type="button" class="copy-clipboard" data-clipboard-text="{{method.request.body.raw}}"><i class="fa fa-clipboard"></i>复制</button>
  161. <input type="hidden" id="request-body-raw-editor-input-{{methodName}}" value='{{method.request.body.raw}}'>
  162. <pre class="request-body-raw-editor-json" id="request-body-raw-editor-json-{{methodName}}"><code class="json">{{method.request.body.raw}}</code></pre>
  163. </div>
  164. {{if _.has(method, 'request.body.parameter') && _.isArray(method.request.body.parameter) && method.request.body.parameter.length > 0}}
  165. <table>
  166. <thead>
  167. <tr>
  168. <th>参数名</th>
  169. <th>参数值</th>
  170. <th>是否必填</th>
  171. <th>参数类型</th>
  172. <th>描述说明</th>
  173. </tr>
  174. </thead>
  175. <tbody>
  176. {{each method.request.body.parameter item}}
  177. <tr>
  178. <td><i class="copy-clipboard" data-clipboard-text="{{item.key}}">{{item.key}}</i></td>
  179. <td style="position: relative;">
  180. {{if item.value_var}}
  181. {{item.value_var}}
  182. <img src="https://img.cdn.apipost.cn/v6/docs/img/vars.svg" alt="">
  183. <div class="vars_title">
  184. 变量{{item.value}} 生成
  185. </div>
  186. {{else}}
  187. <pre>{{item.value}}</pre>
  188. {{/if}}
  189. </td>
  190. <td>{{(item.not_null >0) ? '是' : '否'}}</td>
  191. <td>{{item.field_type}}</td>
  192. <td>
  193. <pre>{{item.description}}</pre>
  194. </td>
  195. </tr>
  196. {{/each}}
  197. </tbody>
  198. </table>
  199. {{/if}}
  200. {{/if}}
  201. {{if _.has(method, 'response') && _.isObject(method.response) && !_.isEmpty(method.response)}}
  202. {{each method.response response name}}
  203. {{if response.raw != ''}}
  204. <h6 data-text="{{name == 'success' ? '成功响应示例':'错误响应示例'}}" id="{{name == 'success' ? '成功响应示例':'错误响应示例'}}">{{name == 'success' ? '成功响应示例':'错误响应示例'}}</h6>
  205. <div class="apipost-raw-json response-body-json-view">
  206. <button type="button" class="copy-clipboard" data-clipboard-text="{{response.raw}}"><i class="fa fa-clipboard"></i>复制</button>
  207. <input type="hidden" id="response-body-raw-editor-input-{{name}}" value='{{response.raw}}'>
  208. <pre class="request-body-raw-editor-json" id="response-body-raw-editor-json-{{name}}"><code class="json">{{response.raw}}</code></pre>
  209. </div>
  210. {{if _.has(response, 'parameter') && _.isArray(response.parameter) && response.parameter.length > 0}}
  211. <table>
  212. <thead>
  213. <tr>
  214. <th>参数名</th>
  215. <th>参数值</th>
  216. <th>是否必填</th>
  217. <th>参数类型</th>
  218. <th>描述说明</th>
  219. </tr>
  220. </thead>
  221. <tbody>
  222. {{each response.parameter item}}
  223. <tr>
  224. <td><i class="copy-clipboard" data-clipboard-text="{{item.key}}">{{item.key}}</i></td>
  225. <td>
  226. <pre>{{item.value}}</pre>
  227. </td>
  228. <td>{{(item.not_null >0) ? '是' : '否'}}</td>
  229. <td>{{item.field_type}}</td>
  230. <td>
  231. <pre>{{item.description}}</pre>
  232. </td>
  233. </tr>
  234. {{/each}}
  235. </tbody>
  236. </table>
  237. {{/if}}
  238. {{/if}}
  239. {{/each}}
  240. {{/if}}
  241. <hr>
  242. {{/each}}
  243. {{/if}}
  244. {{/each}}
  245. </div>
  246. {{/if}}
  247. {{/each}}
  248. {{/if}}
  249. {{/if}}
  250. {{if data.target_type == 'folder'}}
  251. <h3 class="apipost-doc-wrap-para-title" data-text="目录参数" id="目录参数">
  252. <i class="fa fa-wpforms"></i>
  253. <span>目录参数</span>
  254. </h3>
  255. <div class="apipost-doc-paras" for-id="目录参数">
  256. {{if _.has(data, 'request.header') && _.isArray(data.request.header) && data.request.header.length > 0}}
  257. <h4 data-text="Header 请求参数" id="Header 请求参数">Header 请求参数</h4>
  258. <table>
  259. <thead>
  260. <tr>
  261. <th>参数名</th>
  262. <th>参数值</th>
  263. <th>是否必填</th>
  264. <th>参数类型</th>
  265. <th>描述说明</th>
  266. </tr>
  267. </thead>
  268. <tbody>
  269. {{each data.request.header item}}
  270. <tr>
  271. <td><i class="copy-clipboard" data-clipboard-text="{{item.key}}">{{item.key}}</i></td>
  272. <td style="position: relative;">
  273. {{if item.value_var}}
  274. {{item.value_var}}
  275. <img src="https://img.cdn.apipost.cn/v6/docs/img/vars.svg" alt="">
  276. <div class="vars_title">
  277. 变量{{item.value}} 生成
  278. </div>
  279. {{else}}
  280. <pre>{{item.value}}</pre>
  281. {{/if}}
  282. </td>
  283. <td>{{(item.not_null >0) ? '是' : '否'}}</td>
  284. <td>{{item.field_type}}</td>
  285. <td>
  286. <pre>{{item.description}}</pre>
  287. </td>
  288. </tr>
  289. {{/each}}
  290. </tbody>
  291. </table>
  292. {{/if}}
  293. {{if _.has(data, 'request.query') && _.isArray(data.request.query) && data.request.query.length > 0}}
  294. <h4 data-text="Query 请求参数" id="Query 请求参数">Query 请求参数</h4>
  295. <table>
  296. <thead>
  297. <tr>
  298. <th>参数名</th>
  299. <th>参数值</th>
  300. <th>是否必填</th>
  301. <th>参数类型</th>
  302. <th>描述说明</th>
  303. </tr>
  304. </thead>
  305. <tbody>
  306. {{each data.request.query item}}
  307. <tr>
  308. <td><i class="copy-clipboard" data-clipboard-text="{{item.key}}">{{item.key}}</i></td>
  309. <td style="position: relative;">
  310. {{if item.value_var}}
  311. {{item.value_var}}
  312. <img src="https://img.cdn.apipost.cn/v6/docs/img/vars.svg" alt="">
  313. <div class="vars_title">
  314. 变量{{item.value}} 生成
  315. </div>
  316. {{else}}
  317. <pre>{{item.value}}</pre>
  318. {{/if}}
  319. </td>
  320. <td>{{(item.not_null >0) ? '是' : '否'}}</td>
  321. <td>{{item.field_type}}</td>
  322. <td>
  323. <pre>{{item.description}}</pre>
  324. </td>
  325. </tr>
  326. {{/each}}
  327. </tbody>
  328. </table>
  329. {{/if}}
  330. {{if _.has(data, 'request.body') && _.isArray(data.request.body) && data.request.body.length > 0}}
  331. <h4 data-text="Body 请求参数" id="Body 请求参数">Body 请求参数</h4>
  332. <table>
  333. <thead>
  334. <tr>
  335. <th>参数名</th>
  336. <th>参数值</th>
  337. <th>是否必填</th>
  338. <th>参数类型</th>
  339. <th>描述说明</th>
  340. </tr>
  341. </thead>
  342. <tbody>
  343. {{each data.request.body item}}
  344. <tr>
  345. <td><i class="copy-clipboard" data-clipboard-text="{{item.key}}">{{item.key}}</i></td>
  346. <td style="position: relative;">
  347. {{if item.value_var}}
  348. {{item.value_var}}
  349. <img src="https://img.cdn.apipost.cn/v6/docs/img/vars.svg" alt="">
  350. <div class="vars_title">
  351. 变量{{item.value}} 生成
  352. </div>
  353. {{else}}
  354. <pre>{{item.type == 'File' ? '[文件路径]':item.value}}</pre>
  355. {{/if}}
  356. </td>
  357. <td>{{(item.not_null >0) ? '是' : '否'}}</td>
  358. <td>{{item.type == 'File' ? '[文件类型]':item.field_type}}</td>
  359. <td>
  360. <pre>{{item.description}}</pre>
  361. </td>
  362. </tr>
  363. {{/each}}
  364. </tbody>
  365. </table>
  366. {{/if}}
  367. {{if _.has(data, 'request.authType')}}
  368. <h4 data-text="认证方式" id="认证方式">认证方式</h4>
  369. <ul class="apipost-doc-wrap-base-para">
  370. <li>{{data.request.authType}}</li>
  371. </ul>
  372. {{/if}}
  373. </div>
  374. {{/if}}
  375. {{if data.target_type == 'global'}}
  376. <div class="apipost-global-tips">
  377. 说明:全局公共参数是针对项目而言的,所有请求的 HTTP 类型的接口都需要携带此参数。
  378. </div>
  379. <h3 data-text="全局公共参数" id="全局公共参数" class="apipost-doc-wrap-para-title">
  380. <i class="fa fa-wpforms"></i>
  381. <span>全局公共参数</span>
  382. </h3>
  383. <div class="apipost-doc-paras" for-id="全局公共参数">
  384. {{if _.has(data, 'request.header') && _.isArray(data.request.header) && data.request.header.length > 0}}
  385. <h4 data-text="Header 请求参数" id="Header 请求参数" >Header 请求参数</h4>
  386. <table>
  387. <thead>
  388. <tr>
  389. <th>参数名</th>
  390. <th>参数值</th>
  391. <th>描述说明</th>
  392. </tr>
  393. </thead>
  394. <tbody>
  395. {{each data.request.header item}}
  396. <tr>
  397. <td><i class="copy-clipboard" data-clipboard-text="{{item.key}}">{{item.key}}</i></td>
  398. <td style="position: relative;">
  399. {{if item.value_var}}
  400. {{item.value_var}}
  401. <img src="https://img.cdn.apipost.cn/v6/docs/img/vars.svg" alt="">
  402. <div class="vars_title">
  403. 变量{{item.value}} 生成
  404. </div>
  405. {{else}}
  406. <pre>{{item.value}}</pre>
  407. {{/if}}
  408. </td>
  409. <td>
  410. <pre>{{item.description}}</pre>
  411. </td>
  412. </tr>
  413. {{/each}}
  414. </tbody>
  415. </table>
  416. {{/if}}
  417. {{if _.has(data, 'request.query') && _.isArray(data.request.query) && data.request.query.length > 0}}
  418. <h4 data-text="Query 请求参数" id="Query 请求参数">Query 请求参数</h4>
  419. <table>
  420. <thead>
  421. <tr>
  422. <th>参数名</th>
  423. <th>参数值</th>
  424. <th>描述说明</th>
  425. </tr>
  426. </thead>
  427. <tbody>
  428. {{each data.request.query item}}
  429. <tr>
  430. <td><i class="copy-clipboard" data-clipboard-text="{{item.key}}">{{item.key}}</i></td>
  431. <td style="position: relative;">
  432. {{if item.value_var}}
  433. {{item.value_var}}
  434. <img src="https://img.cdn.apipost.cn/v6/docs/img/vars.svg" alt="">
  435. <div class="vars_title">
  436. 变量{{item.value}} 生成
  437. </div>
  438. {{else}}
  439. <pre>{{item.value}}</pre>
  440. {{/if}}
  441. </td>
  442. <td>
  443. <pre>{{item.description}}</pre>
  444. </td>
  445. </tr>
  446. {{/each}}
  447. </tbody>
  448. </table>
  449. {{/if}}
  450. {{if _.has(data, 'request.body') && _.isArray(data.request.body) && data.request.body.length > 0}}
  451. <h4 data-text="Body 请求参数" id="Body 请求参数">Body 请求参数</h4>
  452. <table>
  453. <thead>
  454. <tr>
  455. <th>参数名</th>
  456. <th>参数值</th>
  457. <th>描述说明</th>
  458. </tr>
  459. </thead>
  460. <tbody>
  461. {{each data.request.body item}}
  462. <tr>
  463. <td><i class="copy-clipboard" data-clipboard-text="{{item.key}}">{{item.key}}</i></td>
  464. <td style="position: relative;">
  465. {{if item.value_var}}
  466. {{item.value_var}}
  467. <img src="https://img.cdn.apipost.cn/v6/docs/img/vars.svg" alt="">
  468. <div class="vars_title">
  469. 变量{{item.value}} 生成
  470. </div>
  471. {{else}}
  472. <pre>{{item.type == 'File' ? '[文件路径]':item.value}}</pre>
  473. {{/if}}
  474. </td>
  475. <td>
  476. <pre>{{item.description}}</pre>
  477. </td>
  478. </tr>
  479. {{/each}}
  480. </tbody>
  481. </table>
  482. {{/if}}
  483. {{if _.has(data, 'script.auth.type')}}
  484. <h4 data-text="认证方式" id="认证方式">认证方式</h4>
  485. <ul class="apipost-doc-wrap-base-para">
  486. <li>{{data.script.auth.type}}</li>
  487. </ul>
  488. {{/if}}
  489. </div>
  490. {{/if}}
  491. {{if data.target_type == 'websocket' || data.example_type == 'websocket'}}
  492. <h3 data-text="基本信息" id="基本信息" class="apipost-doc-wrap-para-title">
  493. <i class="fa fa-wpforms"></i>
  494. <span>基本信息</span>
  495. </h3>
  496. <ul class="apipost-doc-wrap-base-para">
  497. {{if _.has(data, 'formatMark') && _.isObject(data.formatMark)}}
  498. <li><span>接口状态: </span><span style="color: {{data.formatMark.color}};">{{data.formatMark.name}}</span> </li>
  499. {{/if}}
  500. <li><span>接口URL: </span><span><em class="method {{data.method}}">{{data.method}}</em>
  501. <i class="copy-clipboard" data-clipboard-text="{{data.url}}">{{data.url}}</i></span> </li>
  502. </ul>
  503. {{/if}}
  504. {{if data.target_type == 'api' || data.example_type == 'api'}}
  505. <h3 data-text="基本信息" id="基本信息" class="apipost-doc-wrap-para-title">
  506. <i class="fa fa-wpforms"></i>
  507. <span>基本信息</span>
  508. </h3>
  509. <ul class="apipost-doc-wrap-base-para">
  510. {{if _.has(data, 'formatMark') && _.isObject(data.formatMark)}}
  511. <li><span>接口状态: </span><span style="color: {{data.formatMark.color}};">{{data.formatMark.name}}</span> </li>
  512. {{/if}}
  513. <li><span>接口URL: </span><span><em class="method {{data.method}}">{{data.method}}</em>
  514. <i class="copy-clipboard" data-clipboard-text="{{data.url}}">{{data.url}}</i></span> </li>
  515. {{if data.mock_url != ''}}
  516. <li><span>本地 Mock: </span><span><i class="copy-clipboard" data-clipboard-text="{{urlJoin('http://127.0.0.1:10393/mock/',data.project_id, data.mock_url,'?apipost_id='+data.target_id.toString().substr(0,6))}}">{{urlJoin('http://127.0.0.1:10393/mock/',data.project_id, data.mock_url,'?apipost_id='+data.target_id.toString().substr(0,6))}}</i><br><a href="https://www.apipost.cn/download.html" target="_blank">需安装 Apipost v7 客户端</a> </span> </li>
  517. {{if data.enable_server_mock > 0}}
  518. <li><span>云端 Mock: </span><span><i class="copy-clipboard" data-clipboard-text="{{urlJoin('https://console-mock.apipost.cn/mock/',data.project_id, data.mock_url,'?apipost_id='+data.target_id.toString().substr(0,6))}}">{{urlJoin('https://console-mock.apipost.cn/mock/',data.project_id, data.mock_url,'?apipost_id='+data.target_id.toString().substr(0,6))}}</i></span> </li>
  519. {{/if}}
  520. {{/if}}
  521. {{if _.has(data, 'request.body.formatMode')}}
  522. <li><span>Content-Type:</span><span><i class="copy-clipboard" data-clipboard-text="{{data.request.body.formatMode}}">{{data.request.body.formatMode}}</i></span></li>
  523. {{/if}}
  524. {{if _.has(data, 'request.authType')}}
  525. <li><span>认证方式:</span><span><i class="copy-clipboard" data-clipboard-text="{{data.request.authType}}">{{data.request.authType}}</i></span></li>
  526. {{/if}}
  527. </ul>
  528. <h3 data-text="请求参数" id="请求参数" class="apipost-doc-wrap-para-title">
  529. <i class="fa fa-wpforms"></i>
  530. <span>请求参数</span>
  531. </h3>
  532. <div class="apipost-doc-paras" for-id="请求参数">
  533. {{if _.has(data, 'request.header.parameter') && _.isArray(data.request.header.parameter) && data.request.header.parameter.length > 0}}
  534. <h4 data-text="Header 请求参数" id="Header 请求参数" >Header 请求参数</h4>
  535. <table>
  536. <thead>
  537. <tr>
  538. <th>参数名</th>
  539. <th>参数值</th>
  540. <th>是否必填</th>
  541. <th>参数类型</th>
  542. <th>描述说明</th>
  543. </tr>
  544. </thead>
  545. <tbody>
  546. {{each data.request.header.parameter item}}
  547. <tr>
  548. <td><i class="copy-clipboard" data-clipboard-text="{{item.key}}">{{item.key}}</i></td>
  549. <td style="position: relative;">
  550. {{if item.value_var}}
  551. {{item.value_var}}
  552. <img src="https://img.cdn.apipost.cn/v6/docs/img/vars.svg" alt="">
  553. <div class="vars_title">
  554. 变量{{item.value}} 生成
  555. </div>
  556. {{else}}
  557. <pre>{{item.value}}</pre>
  558. {{/if}}
  559. </td>
  560. <td>{{(item.not_null >0) ? '是' : '否'}}</td>
  561. <td>{{item.field_type}}</td>
  562. <td>
  563. <pre>{{item.description}}</pre>
  564. </td>
  565. </tr>
  566. {{/each}}
  567. </tbody>
  568. </table>
  569. {{/if}}
  570. {{if _.has(data, 'request.query.parameter') && _.isArray(data.request.query.parameter) && data.request.query.parameter.length > 0}}
  571. <h4 data-text="Query 请求参数" id="Query 请求参数" >Query 请求参数</h4>
  572. <table>
  573. <thead>
  574. <tr>
  575. <th>参数名</th>
  576. <th>参数值</th>
  577. <th>是否必填</th>
  578. <th>参数类型</th>
  579. <th>描述说明</th>
  580. </tr>
  581. </thead>
  582. <tbody>
  583. {{each data.request.query.parameter item}}
  584. <tr>
  585. <td><i class="copy-clipboard" data-clipboard-text="{{item.key}}">{{item.key}}</i></td>
  586. <td style="position: relative;">
  587. {{if item.value_var}}
  588. {{item.value_var}}
  589. <img src="https://img.cdn.apipost.cn/v6/docs/img/vars.svg" alt="">
  590. <div class="vars_title">
  591. 变量{{item.value}} 生成
  592. </div>
  593. {{else}}
  594. <pre>{{item.type == 'File' ? '[文件路径]':item.value}}</pre>
  595. {{/if}}
  596. </td>
  597. <td>{{(item.not_null >0) ? '是' : '否'}}</td>
  598. <td>{{item.field_type}}</td>
  599. <td>
  600. <pre>{{item.description}}</pre>
  601. </td>
  602. </tr>
  603. {{/each}}
  604. </tbody>
  605. </table>
  606. {{/if}}
  607. {{if _.has(data, 'request.resful.parameter') && _.isArray(data.request.resful.parameter) && data.request.resful.parameter.length > 0}}
  608. <h4 data-text="路径参数及说明" id="路径参数及说明" >路径参数及说明</h4>
  609. <table>
  610. <thead>
  611. <tr>
  612. <th>参数名</th>
  613. <th>参数值</th>
  614. <th>描述说明</th>
  615. </tr>
  616. </thead>
  617. <tbody>
  618. {{each data.request.resful.parameter item}}
  619. <tr>
  620. <td><i class="copy-clipboard" data-clipboard-text="{{item.key}}">{{item.key}}</i></td>
  621. <td style="position: relative;">
  622. {{if item.value_var}}
  623. {{item.value_var}}
  624. <img src="https://img.cdn.apipost.cn/v6/docs/img/vars.svg" alt="">
  625. <div class="vars_title">
  626. 变量{{item.value}} 生成
  627. </div>
  628. {{else}}
  629. <pre>{{item.type == 'File' ? '[文件路径]':item.value}}</pre>
  630. {{/if}}
  631. </td>
  632. <td>
  633. <pre>{{item.description}}</pre>
  634. </td>
  635. </tr>
  636. {{/each}}
  637. </tbody>
  638. </table>
  639. {{/if}}
  640. {{if _.has(data, 'request.body.mode') && data.request.body.mode != 'none'}}
  641. <h4 data-text="Body 请求参数" id="Body 请求参数" >Body 请求参数</h4>
  642. {{if data.request.body.mode == 'form-data' || data.request.body.mode == 'urlencoded'}}
  643. {{if _.has(data, 'request.body.parameter') && _.isArray(data.request.body.parameter) && data.request.body.parameter.length > 0}}
  644. <table>
  645. <thead>
  646. <tr>
  647. <th>参数名</th>
  648. <th>参数值</th>
  649. <th>是否必填</th>
  650. <th>参数类型</th>
  651. <th>描述说明</th>
  652. </tr>
  653. </thead>
  654. <tbody>
  655. {{each data.request.body.parameter item}}
  656. <tr>
  657. <td><i class="copy-clipboard" data-clipboard-text="{{item.key}}">{{item.key}}</i></td>
  658. <td style="position: relative;">
  659. {{if item.value_var}}
  660. {{item.value_var}}
  661. <img src="https://img.cdn.apipost.cn/v6/docs/img/vars.svg" alt="">
  662. <div class="vars_title">
  663. 变量{{item.value}} 生成
  664. </div>
  665. {{else}}
  666. <pre>{{item.type == 'File' ? '[文件路径]':item.value}}</pre>
  667. {{/if}}
  668. </td>
  669. <td>{{(item.not_null >0) ? '是' : '否'}}</td>
  670. <td>{{item.type == 'File' ? '[文件类型]':item.field_type}}</td>
  671. <td>
  672. <pre>{{item.description}}</pre>
  673. </td>
  674. </tr>
  675. {{/each}}
  676. </tbody>
  677. </table>
  678. {{/if}}
  679. {{else}}
  680. {{if data.request.body.raw != ''}}
  681. <div class="apipost-raw-json request-body-json-view">
  682. <button type="button" class="copy-clipboard" data-clipboard-text="{{data.request.body.raw}}"><i class="fa fa-clipboard"></i>复制</button>
  683. <input type="hidden" id="request-body-raw-editor-input" value='{{data.request.body.raw}}'>
  684. <pre id="request-body-raw-editor-json"><code class="json">{{data.request.body.raw}}</code></pre>
  685. </div>
  686. {{if _.has(data, 'request.body.raw_para') && _.isArray(data.request.body.raw_para) && data.request.body.raw_para.length > 0}}
  687. <table>
  688. <thead>
  689. <tr>
  690. <th>参数名</th>
  691. <th>参数值</th>
  692. <th>是否必填</th>
  693. <th>参数类型</th>
  694. <th>描述说明</th>
  695. </tr>
  696. </thead>
  697. <tbody>
  698. {{each data.request.body.raw_para item}}
  699. {{if item.key != ''}}
  700. <tr>
  701. <td><i class="copy-clipboard" data-clipboard-text="{{item.key}}">{{item.key}}</i></td>
  702. <td style="position: relative;">
  703. {{if item.value_var}}
  704. {{item.value_var}}
  705. <img src="https://img.cdn.apipost.cn/v6/docs/img/vars.svg" alt="">
  706. <div class="vars_title">
  707. 变量{{item.value}} 生成
  708. </div>
  709. {{else}}
  710. <pre>{{item.value}}</pre>
  711. {{/if}}
  712. </td>
  713. <td>{{(item.not_null >0) ? '是' : '否'}}</td>
  714. <td>{{item.field_type}}</td>
  715. <td>
  716. <pre>{{item.description}}</pre>
  717. </td>
  718. </tr>
  719. {{/if}}
  720. {{/each}}
  721. </tbody>
  722. </table>
  723. {{/if}}
  724. {{/if}}
  725. {{/if}}
  726. {{/if}}
  727. </div>
  728. {{if _.has(data, 'response') && _.isObject(data.response) && Object.values(data.response).length > 0}}
  729. <h3 data-text="响应示例" id="响应示例" class="apipost-doc-wrap-para-title">
  730. <i class="fa fa-wpforms"></i>
  731. <span>响应示例</span>
  732. </h3>
  733. <div class="apipost-doc-paras" for-id="响应示例">
  734. {{each data.response item key}}
  735. {{if _.has(item, 'expect.name') && item.raw != ''}}
  736. <h4 data-text="{{item.expect.name}}({{item.expect.code}})" id="{{item.expect.name}}({{item.expect.code}})">{{item.expect.name}}({{item.expect.code}})</h4>
  737. <div data-type="{{key}}" class="apipost-raw-json response-raw-json-view">
  738. <button type="button" class="copy-clipboard" data-clipboard-text="{{item.raw}}"><i class="fa fa-clipboard"></i>复制</button>
  739. <input type="hidden" id="response-raw-{{key}}-json-input" value='{{item.raw}}'>
  740. <pre id="response-raw-{{key}}-json"><code class="json">{{item.raw}}</code></pre>
  741. </div>
  742. {{if _.has(item, 'parameter') && _.isArray(item.parameter) && item.parameter.length > 0}}
  743. <table>
  744. <thead>
  745. <tr>
  746. <th>参数名</th>
  747. <th>参数值</th>
  748. <!-- <th>是否必填</th> -->
  749. <th>参数类型</th>
  750. <th>描述说明</th>
  751. </tr>
  752. </thead>
  753. <tbody>
  754. {{each item.parameter item}}
  755. {{if item.key != ''}}
  756. <tr>
  757. <td><i class="copy-clipboard" data-clipboard-text="{{item.key}}">{{item.key}}</i></td>
  758. <td>
  759. <pre>{{item.value}}</pre>
  760. </td>
  761. <!-- <td>{{(item.not_null >0) ? '是' : '否'}}</td> -->
  762. <td>{{item.field_type}}</td>
  763. <td>
  764. <pre>{{@replaceOperatorSymbol(item.description)}}</pre>
  765. </td>
  766. </tr>
  767. {{/if}}
  768. {{/each}}
  769. </tbody>
  770. </table>
  771. {{/if}}
  772. {{/if}}
  773. {{/each}}
  774. </div>
  775. {{/if}}
  776. {{/if}}
  777. <footer> 本文档由 <a href="https://www.apipost.cn/" target="_blank">Apipost 接口管理工具 (https://www.apipost.cn)</a>
  778. 生成 </footer>
  779. </script>
  780. </div>
  781. <div class="apipost-float-navs">
  782. <h2>内容导航</h2>
  783. <ul class="apipost-float-nav-template">
  784. <script type="text/html" id="apipost-float-nav-template-tpl">
  785. {{if list.length > 0}}
  786. {{each list item i}}
  787. <li style="text-indent: {{item.indent*16}}px;" {{if i == 0}}class="active"{{/if}} data-id="{{item.id}}"><a href="#{{item.id}}">{{item.text}}</a></li>
  788. {{/each}}
  789. {{else}}
  790. <li style="text-align: center;justify-content: center;">暂无导航数据</li>
  791. {{/if}}
  792. </script>
  793. </ul>
  794. </div>
  795. </div>
  796. </div>
  797. </div>
  798. <script type="text/javascript">
  799. // 给 arttemplate 注入新函数
  800. template.defaults.imports.JSON = JSON;
  801. template.defaults.imports.urlJoin = urlJoin;
  802. template.defaults.imports._ = _;
  803. template.defaults.imports.marked = function (md) {
  804. marked.setOptions({
  805. renderer: new marked.Renderer(),
  806. highlight(code) {
  807. return hljs.highlight('javascript', code).value;
  808. },
  809. breaks: true,
  810. sanitize: true,
  811. });
  812. return marked.parse(md).replace(/<pre>/g, "<pre class='hljs javascript'>");
  813. };
  814. template.defaults.imports.Object = Object;
  815. template.defaults.imports.keyFormat = function (params) {
  816. const arr = params.split('.');
  817. let str = '';
  818. for (let i = 0; i < arr.length - 1; i++) {
  819. str += `<span style="color:#999">${arr[i]}.</span>`;
  820. }
  821. str += arr[arr.length - 1];
  822. return str;
  823. };
  824. template.defaults.imports.replaceOperatorSymbol = function (originString) {
  825. if (!originString || originString=='') {
  826. return '';
  827. }
  828. const result = originString.replace(/&([^&;]+);/g, function (matchStr, b) {
  829. const entity = {
  830. quot: '"',
  831. lt: '<',
  832. gt: '>',
  833. apos: "'",
  834. amp: '&',
  835. ldquo: '“',
  836. rdquo: '”',
  837. };
  838. const r = entity[b];
  839. return typeof r === 'string' ? r : matchStr;
  840. });
  841. return result;
  842. };
  843. template.defaults.imports.markForName = function (key) {
  844. try {
  845. if (apipostData.project.vars.mark.filter((it) => it.key === key)[0].name) {
  846. return apipostData.project.vars.mark.filter((it) => it.key === key)[0].name;
  847. }
  848. return '开发中';
  849. } catch (error) {
  850. return '开发中';
  851. }
  852. };
  853. // 接口排序
  854. function sortData(data, type) {
  855. data.sort((a, b) => {
  856. // 升序
  857. if (type == 'ascending') {
  858. if (a.sort != b.sort) {
  859. return a.sort - b.sort;
  860. }
  861. return a.name.localeCompare(b.name);
  862. }
  863. // 降序
  864. if (type == 'descending') {
  865. if (a.sort != b.sort) {
  866. return b.sort - a.sort;
  867. }
  868. return b.name.localeCompare(a.name);
  869. }
  870. });
  871. // 如果有嵌套children且children里面有数据 就递归调用排序函数
  872. if (_.isArray(data)) {
  873. data.forEach((item) => {
  874. if (item.children && item.children.length != 0) {
  875. sortData(item.children, type);
  876. }
  877. });
  878. return data;
  879. }
  880. return [];
  881. }
  882. // 解析 url 并返回数组
  883. function GetUrlQuery(uri) {
  884. let url = '';
  885. if (typeof uri === 'undefined') {
  886. url = window.location.search;
  887. } else {
  888. url = `?${uri.split('?')[1]}`;
  889. }
  890. const theRequest = {};
  891. if (url.indexOf('?') !== -1) {
  892. const str = url.substr(1);
  893. const strs = str.split('&');
  894. for (let i = 0; i < strs.length; i++) {
  895. theRequest[strs[i].split('=')[0]] = unescape(strs[i].split('=')[1]);
  896. }
  897. }
  898. return theRequest;
  899. }
  900. // 获取某接口的 所有父target
  901. function getParentTargetIDs(collection, target_id, parent_ids = []) {
  902. if (_.isArray(collection)) {
  903. const item = _.find(collection, _.matchesProperty('target_id', target_id));
  904. if (item) {
  905. parent_ids.push(item.parent_id);
  906. getParentTargetIDs(collection, item.parent_id, parent_ids);
  907. }
  908. }
  909. return parent_ids;
  910. }
  911. // 获取某接口的 所有子target
  912. function getChildrenTargetIDs(collection, target_id, children_ids = []) {
  913. if (_.isArray(collection)) {
  914. collection.forEach(item => {
  915. if (item.parent_id == target_id) {
  916. children_ids.push(item.target_id);
  917. getChildrenTargetIDs(collection, item.target_id, children_ids);
  918. }
  919. })
  920. }
  921. return children_ids;
  922. }
  923. // // 获取某接口的 所有子target
  924. // function getChildrenTargetIDs(collection, target_id, children_ids = []) {
  925. // if (_.isArray(collection)) {
  926. // collection.forEach(item => {
  927. // if (item.target_id == target_id) {
  928. // if (item.children && _.isArray(item.children)) {
  929. // item.children.forEach((it) => {
  930. // children_ids.push(it.target_id);
  931. // if (it.children && _.isArray(it.children)) {
  932. // getChildrenTargetIDs(it.children, it.target_id, children_ids);
  933. // }
  934. // })
  935. // }
  936. // }
  937. // })
  938. // }
  939. // return children_ids;
  940. // }
  941. // 接口数据
  942. let apipostData = {};
  943. try {
  944. apipostData = {"data":{"id":1201743,"local_issue_id":"7997f359bf5bceba64dd3117c88eeb39","local_target_id":"afca0fa6-d999-4e1c-a4b8-53e11562ec95","project_id":2354823,"name":"React Demo","url":"61649f3cb2e5986a","salt":"fe93ce7b9b85cea4","password":"","env_id":"-1","create_time":1687078091,"target_id":-1,"target_type":"folder","expire_days":-1,"expire_time":-1,"attribute_list":[],"env_ids":["-1"],"portrait":"https:\/\/img.cdn.apipost.cn\/user\/default_profile_photo\/Vector-4.png","nick_name":"郭小侠","app_web_url":"https:\/\/v7-api.apipost.cn","project_name":"郭小侠项目","publisher":"郭小侠","pub_name":"React Demo","project_logo":"","project":{"vars":{"request":{"cookie":[],"header":[],"query":[],"body":[]},"script":{"pre_script":"","test":"","auth":{"type":"noauth","kv":{"key":"","value":""},"bearer":{"key":""},"basic":{"username":"","password":""}}},"variable":[],"methods":["POST","GET","PUT","PATCH","DELETE","COPY","HEAD","OPTIONS","LINK","UNLINK","PURGE","LOCK","UNLOCK","PROPFIND","VIEW"],"mark":[{"key":"developing","name":"开发中","color":"#3A86FF","is_default":true},{"key":"complated","name":"已完成","color":"#2BA58F","is_default":true},{"key":"modifying","name":"需修改","color":"#EC4646","is_default":true}]},"code_list":[],"attribute_list":[]},"attribute_lists":[],"children":[{"local_target_id":"afca0fa6-d999-4e1c-a4b8-53e11562ec95","local_parent_id":"0","name":"React Demo","method":"POST","mark":"developing","is_doc":0,"target_type":"folder","example_type":"0","project_id":2354823,"status":1,"sort":10,"create_dtime":1686464657,"update_dtime":1686464657,"local_server_id":"","target_id":"afca0fa6-d999-4e1c-a4b8-53e11562ec95","modifier_id":"U8JG3929D1C8","extend_server_id":"","create_time":"2023-06-11 14:24:17","create_users":{"create_user":"郭小侠","update_user":"郭小侠"},"color":"#3A86FF","attribute_lists":[],"script":{"pre_script":"","test":"","pre_script_switch":1,"test_switch":1},"request":{"description":"","header":[],"query":[],"body":[],"auth":{"type":"noauth","kv":{"key":"","value":""},"bearer":{"key":""},"basic":{"username":"","password":""}}},"parent_id":"0","children":[{"local_target_id":"d6b3364a-6498-4e6e-8d33-c06b9fe329f8","local_parent_id":"afca0fa6-d999-4e1c-a4b8-53e11562ec95","name":"登录","method":"POST","mark":"complated","is_doc":0,"target_type":"api","example_type":"0","project_id":"1849985d-3c7e-485e-9e68-79958eb62a29","status":1,"sort":0,"create_dtime":1686464742,"update_dtime":1686464742,"local_server_id":"","target_id":"d6b3364a-6498-4e6e-8d33-c06b9fe329f8","modifier_id":"U8JG3929D1C8","extend_server_id":"","create_time":"2023-06-11 14:25:42","create_users":{"create_user":"郭小侠","update_user":"郭小侠"},"color":"#2BA58F","attribute_lists":[],"enable_server_mock":-1,"mock_server_url":"","mock_url":"","new_target_id":"9b804911-dd46-4999-acb0-d6b539938bee","request":{"url":"http:\/\/localhost:4000\/v1\/login","description":"","body":{"mode":"urlencoded","parameter":[{"description":"账号","field_type":"String","is_checked":1,"key":"username","value":"daxia","not_null":1,"type":"Text","value_var":"","key_var":""},{"description":"密码","field_type":"String","is_checked":1,"key":"password","value":"123456","not_null":1,"type":"Text","value_var":"","key_var":""}],"raw":"","raw_para":[]},"event":{"pre_script":"","test":""},"auth":{"type":"noauth","kv":{"key":"","value":""},"bearer":{"key":""},"basic":{"username":"","password":""},"digest":{"username":"","password":"","realm":"","nonce":"","algorithm":"","qop":"","nc":"","cnonce":"","opaque":""},"hawk":{"authId":"","authKey":"","algorithm":"","user":"","nonce":"","extraData":"","app":"","delegation":"","timestamp":"","includePayloadHash":-1},"awsv4":{"accessKey":"","secretKey":"","region":"","service":"","sessionToken":"","addAuthDataToQuery":-1},"ntlm":{"username":"","password":"","domain":"","workstation":"","disableRetryRequest":1},"edgegrid":{"accessToken":"","clientToken":"","clientSecret":"","nonce":"","timestamp":"","baseURi":"","headersToSign":""},"oauth1":{"consumerKey":"","consumerSecret":"","signatureMethod":"","addEmptyParamsToSign":-1,"includeBodyHash":-1,"addParamsToHeader":-1,"realm":"","version":"1.0","nonce":"","timestamp":"","verifier":"","callback":"","tokenSecret":"","token":""}},"header":{"parameter":[]},"query":{"parameter":[]},"cookie":{"parameter":[]},"resful":{"parameter":[]},"origin_url":"http:\/\/localhost:4000\/v1\/login"},"response":{"success":{"raw":"","parameter":[],"expect":{"name":"成功","isDefault":1,"code":200,"contentType":"json","verifyType":"schema","schema":[],"mock":""}},"error":{"raw":"","parameter":[],"expect":{"name":"失败","isDefault":-1,"code":404,"contentType":"json","verifyType":"schema","schema":[],"mock":""}}},"parent_id":"afca0fa6-d999-4e1c-a4b8-53e11562ec95"},{"local_target_id":"75992af3-4218-4227-b753-f715b32a6d88","local_parent_id":"afca0fa6-d999-4e1c-a4b8-53e11562ec95","name":"代办","method":"POST","mark":"developing","is_doc":0,"target_type":"folder","example_type":"0","project_id":2354823,"status":1,"sort":1,"create_dtime":1686466504,"update_dtime":1686469713,"local_server_id":"","target_id":"75992af3-4218-4227-b753-f715b32a6d88","modifier_id":"U8JG3929D1C8","extend_server_id":"","create_time":"2023-06-11 14:55:04","create_users":{"create_user":"郭小侠","update_user":"郭小侠"},"color":"#3A86FF","attribute_lists":[],"script":{"pre_script":"","test":"","pre_script_switch":1,"test_switch":1},"request":{"description":"","header":[{"description":"","field_type":"String","is_checked":1,"key":"Authorization","value":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwidXNlcm5hbWUiOiJkYXhpYSIsInBhc3N3b3JkIjoiZTEwYWRjMzk0OWJhNTlhYmJlNTZlMDU3ZjIwZjg4M2UiLCJzdGF0dXMiOjEsIm5pY2tuYW1lIjpudWxsLCJhdmF0YXIiOm51bGwsImFkZHJlc3MiOm51bGwsImNvbXBhbnkiOm51bGwsImRlcGFydG1lbnQiOm51bGwsInBvc2l0aW9uIjpudWxsLCJkZXNjcmlwdGlvbiI6bnVsbCwiY3JlYXRlX3RpbWUiOiIyMDIzLTA2LTA1VDA1OjM5OjA3LjAwMFoiLCJpYXQiOjE2ODY0NjQ3MzQsImV4cCI6MTY4NjUwMDczNH0.Mb9p3Db4ihIwQoDkWf1hVOPLehQ3x3DzLydQU8jrRVk","not_null":1,"type":"Text","value_var":"","key_var":""}],"query":[],"body":[],"auth":{"type":"noauth","kv":{"key":"","value":""},"bearer":{"key":""},"basic":{"username":"","password":""}}},"parent_id":"afca0fa6-d999-4e1c-a4b8-53e11562ec95","children":[{"local_target_id":"11eb021f-7c92-45e0-9f27-927107f1987c","local_parent_id":"75992af3-4218-4227-b753-f715b32a6d88","name":"查询代办","method":"GET","mark":"complated","is_doc":0,"target_type":"api","example_type":"0","project_id":"1849985d-3c7e-485e-9e68-79958eb62a29","status":1,"sort":0,"create_dtime":1686466512,"update_dtime":1687057732,"local_server_id":"","target_id":"11eb021f-7c92-45e0-9f27-927107f1987c","modifier_id":"U8JG3929D1C8","extend_server_id":"","create_time":"2023-06-11 14:55:12","create_users":{"create_user":"郭小侠","update_user":"郭小侠"},"color":"#2BA58F","attribute_lists":[],"enable_server_mock":-1,"mock_server_url":"","mock_url":"","new_target_id":"8f795d61-14af-4b2b-99f4-e247d675a187","request":{"url":"http:\/\/localhost:4000\/v1\/todos\/page?current=1&count=10&title=&status=","description":"","body":{"mode":"none","parameter":[],"raw":"","raw_para":[]},"event":{"pre_script":"","test":""},"auth":{"type":"noauth","kv":{"key":"","value":""},"bearer":{"key":""},"basic":{"username":"","password":""},"digest":{"username":"","password":"","realm":"","nonce":"","algorithm":"","qop":"","nc":"","cnonce":"","opaque":""},"hawk":{"authId":"","authKey":"","algorithm":"","user":"","nonce":"","extraData":"","app":"","delegation":"","timestamp":"","includePayloadHash":-1},"awsv4":{"accessKey":"","secretKey":"","region":"","service":"","sessionToken":"","addAuthDataToQuery":-1},"ntlm":{"username":"","password":"","domain":"","workstation":"","disableRetryRequest":1},"edgegrid":{"accessToken":"","clientToken":"","clientSecret":"","nonce":"","timestamp":"","baseURi":"","headersToSign":""},"oauth1":{"consumerKey":"","consumerSecret":"","signatureMethod":"","addEmptyParamsToSign":-1,"includeBodyHash":-1,"addParamsToHeader":-1,"realm":"","version":"1.0","nonce":"","timestamp":"","verifier":"","callback":"","tokenSecret":"","token":""}},"header":{"parameter":[{"description":"","field_type":"String","is_checked":1,"key":"Authorization","value":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwidXNlcm5hbWUiOiJkYXhpYSIsInBhc3N3b3JkIjoiZTEwYWRjMzk0OWJhNTlhYmJlNTZlMDU3ZjIwZjg4M2UiLCJzdGF0dXMiOjEsIm5pY2tuYW1lIjpudWxsLCJhdmF0YXIiOm51bGwsImFkZHJlc3MiOm51bGwsImNvbXBhbnkiOm51bGwsImRlcGFydG1lbnQiOm51bGwsInBvc2l0aW9uIjpudWxsLCJkZXNjcmlwdGlvbiI6bnVsbCwiY3JlYXRlX3RpbWUiOiIyMDIzLTA2LTA1VDA1OjM5OjA3LjAwMFoiLCJpYXQiOjE2ODY0NjQ3MzQsImV4cCI6MTY4NjUwMDczNH0.Mb9p3Db4ihIwQoDkWf1hVOPLehQ3x3DzLydQU8jrRVk","not_null":1,"type":"Text","value_var":"","key_var":""}]},"query":{"parameter":[{"description":"","is_checked":1,"key":"current","type":"Text","not_null":1,"field_type":"String","value":"1","value_var":"","key_var":""},{"description":"","is_checked":1,"key":"count","type":"Text","not_null":1,"field_type":"String","value":"10","value_var":"","key_var":""},{"description":"","field_type":"String","is_checked":1,"key":"title","value":"","not_null":1,"type":"Text","value_var":"","key_var":""},{"description":"","field_type":"String","is_checked":1,"key":"status","value":"","not_null":1,"type":"Text","value_var":"","key_var":""}]},"cookie":{"parameter":[]},"resful":{"parameter":[]},"origin_url":"http:\/\/localhost:4000\/v1\/todos\/page?current=1&count=10&title=&status="},"response":{"success":{"raw":"","parameter":[],"expect":{"name":"成功","isDefault":1,"code":200,"contentType":"json","verifyType":"schema","schema":[],"mock":""}},"error":{"raw":"","parameter":[],"expect":{"name":"失败","isDefault":-1,"code":404,"contentType":"json","verifyType":"schema","schema":[],"mock":""}}},"parent_id":"75992af3-4218-4227-b753-f715b32a6d88"},{"local_target_id":"d28bea6d-4d83-47e0-8735-c63574c4b611","local_parent_id":"75992af3-4218-4227-b753-f715b32a6d88","name":"添加代办","method":"POST","mark":"complated","is_doc":0,"target_type":"api","example_type":"0","project_id":"1849985d-3c7e-485e-9e68-79958eb62a29","status":1,"sort":1,"create_dtime":1686464787,"update_dtime":1686469935,"local_server_id":"","target_id":"d28bea6d-4d83-47e0-8735-c63574c4b611","modifier_id":"U8JG3929D1C8","extend_server_id":"","create_time":"2023-06-11 14:26:27","create_users":{"create_user":"郭小侠","update_user":"郭小侠"},"color":"#2BA58F","attribute_lists":[],"enable_server_mock":-1,"mock_server_url":"","mock_url":"","new_target_id":"b76f1dc6-2707-4563-859e-ebf2b085e863","request":{"url":"http:\/\/localhost:4000\/v1\/todos\/add","description":"","body":{"mode":"urlencoded","parameter":[{"description":"","field_type":"String","is_checked":1,"key":"title","value":"观风景","not_null":1,"type":"Text","value_var":"","key_var":""},{"description":"","field_type":"String","is_checked":1,"key":"description","value":"一个背包,一个人的旅行,遇见无数擦肩而过的陌生人,目的地也是随心情而临时决定,在陌生的城市寻找与众不同的风景,你总是一个念头就开始说走就走的旅行。","not_null":1,"type":"Text","value_var":"","key_var":""},{"description":"","field_type":"String","is_checked":1,"key":"cover","value":"https:\/\/bing.ioliu.cn\/v1\/rand?&t=json&w=320&h=320","not_null":1,"type":"Text","value_var":"","key_var":""},{"description":"","field_type":"String","is_checked":1,"key":"","value":"","not_null":1,"type":"Text","value_var":"","key_var":""}],"raw":"","raw_para":[]},"event":{"pre_script":"","test":""},"auth":{"type":"noauth","kv":{"key":"","value":""},"bearer":{"key":""},"basic":{"username":"","password":""},"digest":{"username":"","password":"","realm":"","nonce":"","algorithm":"","qop":"","nc":"","cnonce":"","opaque":""},"hawk":{"authId":"","authKey":"","algorithm":"","user":"","nonce":"","extraData":"","app":"","delegation":"","timestamp":"","includePayloadHash":-1},"awsv4":{"accessKey":"","secretKey":"","region":"","service":"","sessionToken":"","addAuthDataToQuery":-1},"ntlm":{"username":"","password":"","domain":"","workstation":"","disableRetryRequest":1},"edgegrid":{"accessToken":"","clientToken":"","clientSecret":"","nonce":"","timestamp":"","baseURi":"","headersToSign":""},"oauth1":{"consumerKey":"","consumerSecret":"","signatureMethod":"","addEmptyParamsToSign":-1,"includeBodyHash":-1,"addParamsToHeader":-1,"realm":"","version":"1.0","nonce":"","timestamp":"","verifier":"","callback":"","tokenSecret":"","token":""}},"header":{"parameter":[{"description":"","field_type":"String","is_checked":1,"key":"Authorization","value":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwidXNlcm5hbWUiOiJkYXhpYSIsInBhc3N3b3JkIjoiZTEwYWRjMzk0OWJhNTlhYmJlNTZlMDU3ZjIwZjg4M2UiLCJzdGF0dXMiOjEsIm5pY2tuYW1lIjpudWxsLCJhdmF0YXIiOm51bGwsImFkZHJlc3MiOm51bGwsImNvbXBhbnkiOm51bGwsImRlcGFydG1lbnQiOm51bGwsInBvc2l0aW9uIjpudWxsLCJkZXNjcmlwdGlvbiI6bnVsbCwiY3JlYXRlX3RpbWUiOiIyMDIzLTA2LTA1VDA1OjM5OjA3LjAwMFoiLCJpYXQiOjE2ODY0NjQ3MzQsImV4cCI6MTY4NjUwMDczNH0.Mb9p3Db4ihIwQoDkWf1hVOPLehQ3x3DzLydQU8jrRVk","not_null":1,"type":"Text","value_var":"","key_var":""}]},"query":{"parameter":[]},"cookie":{"parameter":[]},"resful":{"parameter":[]},"origin_url":"http:\/\/localhost:4000\/v1\/todos\/add"},"response":{"success":{"raw":"","parameter":[],"expect":{"name":"成功","isDefault":1,"code":200,"contentType":"json","verifyType":"schema","schema":[],"mock":""}},"error":{"raw":"","parameter":[],"expect":{"name":"失败","isDefault":-1,"code":404,"contentType":"json","verifyType":"schema","schema":[],"mock":""}}},"parent_id":"75992af3-4218-4227-b753-f715b32a6d88"},{"local_target_id":"2fd3f25e-4af5-45b3-9e79-03cbc990df3f","local_parent_id":"75992af3-4218-4227-b753-f715b32a6d88","name":"删除代办","method":"DELETE","mark":"complated","is_doc":0,"target_type":"api","example_type":"0","project_id":"1849985d-3c7e-485e-9e68-79958eb62a29","status":1,"sort":2,"create_dtime":1686468550,"update_dtime":1686469787,"local_server_id":"","target_id":"2fd3f25e-4af5-45b3-9e79-03cbc990df3f","modifier_id":"U8JG3929D1C8","extend_server_id":"","create_time":"2023-06-11 15:29:10","create_users":{"create_user":"郭小侠","update_user":"郭小侠"},"color":"#2BA58F","attribute_lists":[],"enable_server_mock":-1,"mock_server_url":"","mock_url":"","new_target_id":"81f5832b-5e74-4446-9c17-ae76cf8c268c","request":{"url":"http:\/\/localhost:4000\/v1\/todos\/delete\/1","description":"","body":{"mode":"none","parameter":[],"raw":"","raw_para":[]},"event":{"pre_script":"","test":""},"auth":{"type":"noauth","kv":{"key":"","value":""},"bearer":{"key":""},"basic":{"username":"","password":""},"digest":{"username":"","password":"","realm":"","nonce":"","algorithm":"","qop":"","nc":"","cnonce":"","opaque":""},"hawk":{"authId":"","authKey":"","algorithm":"","user":"","nonce":"","extraData":"","app":"","delegation":"","timestamp":"","includePayloadHash":-1},"awsv4":{"accessKey":"","secretKey":"","region":"","service":"","sessionToken":"","addAuthDataToQuery":-1},"ntlm":{"username":"","password":"","domain":"","workstation":"","disableRetryRequest":1},"edgegrid":{"accessToken":"","clientToken":"","clientSecret":"","nonce":"","timestamp":"","baseURi":"","headersToSign":""},"oauth1":{"consumerKey":"","consumerSecret":"","signatureMethod":"","addEmptyParamsToSign":-1,"includeBodyHash":-1,"addParamsToHeader":-1,"realm":"","version":"1.0","nonce":"","timestamp":"","verifier":"","callback":"","tokenSecret":"","token":""}},"header":{"parameter":[{"description":"","field_type":"String","is_checked":1,"key":"Authorization","value":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwidXNlcm5hbWUiOiJkYXhpYSIsInBhc3N3b3JkIjoiZTEwYWRjMzk0OWJhNTlhYmJlNTZlMDU3ZjIwZjg4M2UiLCJzdGF0dXMiOjEsIm5pY2tuYW1lIjpudWxsLCJhdmF0YXIiOm51bGwsImFkZHJlc3MiOm51bGwsImNvbXBhbnkiOm51bGwsImRlcGFydG1lbnQiOm51bGwsInBvc2l0aW9uIjpudWxsLCJkZXNjcmlwdGlvbiI6bnVsbCwiY3JlYXRlX3RpbWUiOiIyMDIzLTA2LTA1VDA1OjM5OjA3LjAwMFoiLCJpYXQiOjE2ODY0NjQ3MzQsImV4cCI6MTY4NjUwMDczNH0.Mb9p3Db4ihIwQoDkWf1hVOPLehQ3x3DzLydQU8jrRVk","not_null":1,"type":"Text","value_var":"","key_var":""}]},"query":{"parameter":[]},"cookie":{"parameter":[]},"resful":{"parameter":[]},"origin_url":"http:\/\/localhost:4000\/v1\/todos\/delete\/1"},"response":{"success":{"raw":"","parameter":[],"expect":{"name":"成功","isDefault":1,"code":200,"contentType":"json","verifyType":"schema","schema":[],"mock":""}},"error":{"raw":"","parameter":[],"expect":{"name":"失败","isDefault":-1,"code":404,"contentType":"json","verifyType":"schema","schema":[],"mock":""}}},"parent_id":"75992af3-4218-4227-b753-f715b32a6d88"},{"local_target_id":"011fec25-301e-4e13-85c5-8562eadebd68","local_parent_id":"75992af3-4218-4227-b753-f715b32a6d88","name":"编辑代办","method":"POST","mark":"complated","is_doc":0,"target_type":"api","example_type":"0","project_id":"1849985d-3c7e-485e-9e68-79958eb62a29","status":1,"sort":3,"create_dtime":1686468575,"update_dtime":1687077018,"local_server_id":"","target_id":"011fec25-301e-4e13-85c5-8562eadebd68","modifier_id":"U8JG3929D1C8","extend_server_id":"","create_time":"2023-06-11 15:29:35","create_users":{"create_user":"郭小侠","update_user":"郭小侠"},"color":"#2BA58F","attribute_lists":[],"enable_server_mock":-1,"mock_server_url":"","mock_url":"","new_target_id":"bb94413b-2c37-44ca-850d-c66c811d2e57","request":{"url":"http:\/\/localhost:4000\/v1\/todos\/edit","description":"","body":{"mode":"urlencoded","parameter":[{"description":"","field_type":"Number","is_checked":1,"key":"id","value":"1","not_null":1,"type":"Text","value_var":"","key_var":""},{"description":"","field_type":"String","is_checked":1,"key":"title","value":"观风景","not_null":1,"type":"Text","value_var":"","key_var":""},{"description":"","field_type":"String","is_checked":1,"key":"description","value":"一个背包,一个人的旅行,遇见无数擦肩而过的陌生人,目的地也是随心情而临时决定,在陌生的城市寻找与众不同的风景,你总是一个念头就开始说走就走的旅行。","not_null":1,"type":"Text","value_var":"","key_var":""},{"description":"","field_type":"String","is_checked":1,"key":"cover","value":"https:\/\/bing.ioliu.cn\/v1\/rand?&t=json&w=320&h=320","not_null":1,"type":"Text","value_var":"","key_var":""},{"description":"","field_type":"Number","is_checked":1,"key":"status","value":"","not_null":1,"type":"Text","value_var":"","key_var":""}],"raw":"","raw_para":[]},"event":{"pre_script":"","test":""},"auth":{"type":"noauth","kv":{"key":"","value":""},"bearer":{"key":""},"basic":{"username":"","password":""},"digest":{"username":"","password":"","realm":"","nonce":"","algorithm":"","qop":"","nc":"","cnonce":"","opaque":""},"hawk":{"authId":"","authKey":"","algorithm":"","user":"","nonce":"","extraData":"","app":"","delegation":"","timestamp":"","includePayloadHash":-1},"awsv4":{"accessKey":"","secretKey":"","region":"","service":"","sessionToken":"","addAuthDataToQuery":-1},"ntlm":{"username":"","password":"","domain":"","workstation":"","disableRetryRequest":1},"edgegrid":{"accessToken":"","clientToken":"","clientSecret":"","nonce":"","timestamp":"","baseURi":"","headersToSign":""},"oauth1":{"consumerKey":"","consumerSecret":"","signatureMethod":"","addEmptyParamsToSign":-1,"includeBodyHash":-1,"addParamsToHeader":-1,"realm":"","version":"1.0","nonce":"","timestamp":"","verifier":"","callback":"","tokenSecret":"","token":""}},"header":{"parameter":[{"description":"","field_type":"String","is_checked":1,"key":"Authorization","value":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwidXNlcm5hbWUiOiJkYXhpYSIsInBhc3N3b3JkIjoiZTEwYWRjMzk0OWJhNTlhYmJlNTZlMDU3ZjIwZjg4M2UiLCJzdGF0dXMiOjEsIm5pY2tuYW1lIjpudWxsLCJhdmF0YXIiOm51bGwsImFkZHJlc3MiOm51bGwsImNvbXBhbnkiOm51bGwsImRlcGFydG1lbnQiOm51bGwsInBvc2l0aW9uIjpudWxsLCJkZXNjcmlwdGlvbiI6bnVsbCwiY3JlYXRlX3RpbWUiOiIyMDIzLTA2LTA1VDA1OjM5OjA3LjAwMFoiLCJpYXQiOjE2ODY0NjQ3MzQsImV4cCI6MTY4NjUwMDczNH0.Mb9p3Db4ihIwQoDkWf1hVOPLehQ3x3DzLydQU8jrRVk","not_null":1,"type":"Text","value_var":"","key_var":""},{"description":"","field_type":"String","is_checked":1,"key":"","value":"","not_null":1,"type":"Text","value_var":"","key_var":""}]},"query":{"parameter":[]},"cookie":{"parameter":[]},"resful":{"parameter":[]},"origin_url":"http:\/\/localhost:4000\/v1\/todos\/edit"},"response":{"success":{"raw":"","parameter":[],"expect":{"name":"成功","isDefault":1,"code":200,"contentType":"json","verifyType":"schema","schema":[],"mock":""}},"error":{"raw":"","parameter":[],"expect":{"name":"失败","isDefault":-1,"code":404,"contentType":"json","verifyType":"schema","schema":[],"mock":""}}},"parent_id":"75992af3-4218-4227-b753-f715b32a6d88"}]},{"local_target_id":"d57bfba1-8bde-4aa4-b76d-3d60840a8a6a","local_parent_id":"afca0fa6-d999-4e1c-a4b8-53e11562ec95","name":"文件上传","method":"PUT","mark":"developing","is_doc":0,"target_type":"api","example_type":"0","project_id":"1849985d-3c7e-485e-9e68-79958eb62a29","status":1,"sort":2,"create_dtime":1687007443,"update_dtime":1687007725,"local_server_id":"","target_id":"d57bfba1-8bde-4aa4-b76d-3d60840a8a6a","modifier_id":"U8JG3929D1C8","extend_server_id":"","create_time":"2023-06-17 21:10:43","create_users":{"create_user":"郭小侠","update_user":"郭小侠"},"color":"#3A86FF","attribute_lists":[],"enable_server_mock":-1,"mock_server_url":"","mock_url":"","new_target_id":"307ad552-2323-4212-b894-6d32ee08bc34","request":{"url":"http:\/\/localhost:4000\/v1\/upload","description":"","body":{"mode":"form-data","parameter":[{"description":"","field_type":"String","is_checked":1,"key":"folder","value":"covers","not_null":1,"type":"Text","value_var":"","key_var":""},{"description":"","field_type":"String","is_checked":1,"key":"cover","value":["\/Users\/daxia\/Desktop\/images\/zhangbu.png"],"not_null":1,"type":"File","filename":"zhangbu.png","fileBase64":[],"value_var":"","key_var":""}],"raw":"","raw_para":[]},"event":{"pre_script":"","test":""},"auth":{"type":"noauth","kv":{"key":"","value":""},"bearer":{"key":""},"basic":{"username":"","password":""},"digest":{"username":"","password":"","realm":"","nonce":"","algorithm":"","qop":"","nc":"","cnonce":"","opaque":""},"hawk":{"authId":"","authKey":"","algorithm":"","user":"","nonce":"","extraData":"","app":"","delegation":"","timestamp":"","includePayloadHash":-1},"awsv4":{"accessKey":"","secretKey":"","region":"","service":"","sessionToken":"","addAuthDataToQuery":-1},"ntlm":{"username":"","password":"","domain":"","workstation":"","disableRetryRequest":1},"edgegrid":{"accessToken":"","clientToken":"","clientSecret":"","nonce":"","timestamp":"","baseURi":"","headersToSign":""},"oauth1":{"consumerKey":"","consumerSecret":"","signatureMethod":"","addEmptyParamsToSign":-1,"includeBodyHash":-1,"addParamsToHeader":-1,"realm":"","version":"1.0","nonce":"","timestamp":"","verifier":"","callback":"","tokenSecret":"","token":""}},"header":{"parameter":[{"description":"","field_type":"String","is_checked":1,"key":"Authorization","value":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwidXNlcm5hbWUiOiJkYXhpYSIsInBhc3N3b3JkIjoiZTEwYWRjMzk0OWJhNTlhYmJlNTZlMDU3ZjIwZjg4M2UiLCJzdGF0dXMiOjEsIm5pY2tuYW1lIjpudWxsLCJhdmF0YXIiOm51bGwsImFkZHJlc3MiOm51bGwsImNvbXBhbnkiOm51bGwsImRlcGFydG1lbnQiOm51bGwsInBvc2l0aW9uIjpudWxsLCJkZXNjcmlwdGlvbiI6bnVsbCwiY3JlYXRlX3RpbWUiOiIyMDIzLTA2LTA1VDA1OjM5OjA3LjAwMFoiLCJpYXQiOjE2ODY5ODg2MDEsImV4cCI6MTY4NzAyNDYwMX0.9DXzrDLA6t9E8md2TZGlRhVbcaWUU0e2UHGunwGwbsE","not_null":1,"type":"Text","value_var":"","key_var":""}]},"query":{"parameter":[]},"cookie":{"parameter":[]},"resful":{"parameter":[]},"origin_url":"http:\/\/localhost:4000\/v1\/upload"},"response":{"success":{"raw":"","parameter":[],"expect":{"name":"成功","isDefault":1,"code":200,"contentType":"json","verifyType":"schema","schema":[],"mock":""}},"error":{"raw":"","parameter":[],"expect":{"name":"失败","isDefault":-1,"code":404,"contentType":"json","verifyType":"schema","schema":[],"mock":""}}},"parent_id":"afca0fa6-d999-4e1c-a4b8-53e11562ec95"}]}]}};
  945. apipostData = apipostData.data;
  946. consoleLog('apipostData ---- ',apipostData);
  947. } catch (e) { }
  948. if (!_.isEmpty(apipostData)) {
  949. if (!_.isArray(apipostData.children)) {
  950. apipostData.children = [];
  951. }
  952. // 导航菜单
  953. apipostData.children = sortData(apipostData.children, 'ascending');
  954. // 数据词典(对象,键为target_id)
  955. const dataDB = {};
  956. const ruleType = (data) => {
  957. const d = Object.prototype.toString.call(data);
  958. return d.substr(8, d.length - 9);
  959. };
  960. const renderListtoObject = (List) => {
  961. if (ruleType(List) === 'Array') {
  962. List &&
  963. List.forEach((item) => {
  964. if (item.children) {
  965. renderListtoObject(item.children);
  966. dataDB[item.target_id] = item;
  967. } else {
  968. dataDB[item.target_id] = item;
  969. }
  970. });
  971. }
  972. };
  973. // 搜索
  974. $(document).on('input', 'input[name="search-input"]', function () {
  975. let keyword = _.toLower($(this).val());
  976. let searchResult = [];
  977. if (keyword == '') {
  978. $('.apipost-left-nav-template').find('li').removeClass('is-search-hidden search-toggle');
  979. } else {
  980. if (_.isObject(dataDB) && !_.isEmpty(dataDB)) {
  981. _.forEach(dataDB, function (item) {
  982. consoleLog(_.toLower(item.name), keyword, _.toLower(item.name).indexOf(keyword))
  983. if (_.toLower(item.url).indexOf(keyword) > -1 || _.toLower(item.name).indexOf(keyword) > -1 || _.toLower(item.method).indexOf(keyword) > -1) {
  984. searchResult.push(item.target_id);
  985. }
  986. });
  987. if (searchResult.length == 0) {
  988. $('.apipost-left-nav-template').find('li').addClass('is-search-hidden');
  989. } else {
  990. searchResult.forEach(target_id => {
  991. searchResult = _.concat(searchResult, getParentTargetIDs(Object.values(dataDB), target_id));
  992. })
  993. }
  994. // 隐藏其他
  995. _.difference(Object.keys(dataDB), searchResult).forEach(hidden_target_id => {
  996. $(`.apipost-left-nav-template li[data-target_id="${hidden_target_id}"]`).addClass('is-search-hidden');
  997. $(`.apipost-left-nav-template li[data-target_id="${hidden_target_id}"][data-type="folder"]`).addClass('search-toggle');
  998. })
  999. // 展示结果
  1000. searchResult.forEach(show_target_id => {
  1001. $(`.apipost-left-nav-template li[data-target_id="${show_target_id}"]`).removeClass('is-search-hidden is-hidden search-toggle');
  1002. $(`.apipost-left-nav-template li[data-target_id="${show_target_id}"][data-type="folder"]`).removeClass('search-toggle');
  1003. })
  1004. }
  1005. }
  1006. })
  1007. renderListtoObject(apipostData.children);
  1008. // 获取当前的target_id
  1009. let _target_id = '001';
  1010. const _urlParas = GetUrlQuery();
  1011. if (_.isObject(_urlParas) && _.isString(_urlParas.target_id)) {
  1012. _target_id = _urlParas.target_id;
  1013. }
  1014. // 修改地址栏
  1015. function changeURLStatic(name, value) {
  1016. const url = changeURLParam(location.href, name, value); // 修改 URL 参数
  1017. history.replaceState(null, null, url); // 替换地址栏
  1018. }
  1019. function changeURLParam(url, name, value) {
  1020. const reg = eval(`/([?|&]${name}=)[^&]*/gi`);
  1021. value = value.toString().replace(/(^\s*)|(\s*$)/g, ''); // 移除首尾空格
  1022. let url2;
  1023. if (!value) {
  1024. // remove
  1025. url2 = url.replace(reg, '');
  1026. } else if (url.match(reg)) {
  1027. // edit
  1028. url2 = url.replace(reg, `$1${value}`);
  1029. } else {
  1030. // add
  1031. url2 = `${url + (url.indexOf('?') > -1 ? '&' : '?') + name}=${value}`;
  1032. }
  1033. return url2;
  1034. }
  1035. // 格式化内容
  1036. function formatJson(json) {
  1037. // consoleLog(json, apipostData);
  1038. // name
  1039. if (json.target_type == 'global') {
  1040. _.set(json, 'name', '全局公共参数');
  1041. }
  1042. // mark
  1043. if (_.has(apipostData, 'project.vars.mark') && _.isArray(apipostData.project.vars.mark)) {
  1044. const _markedObj = {};
  1045. apipostData.project.vars.mark.forEach((item) => {
  1046. _markedObj[item.key] = item;
  1047. });
  1048. if (_.isObject(_markedObj[json.mark])) {
  1049. _.set(json, 'formatMark', _markedObj[json.mark]);
  1050. }
  1051. }
  1052. // time
  1053. if (_.isNumber(json.create_dtime)) {
  1054. if (String(json.create_dtime).length == 10) {
  1055. _.set(
  1056. json,
  1057. 'format_create_dtime',
  1058. dayjs.unix(json.create_dtime).format('YYYY-MM-DD HH:mm:ss')
  1059. );
  1060. }
  1061. if (String(json.create_dtime).length == 13) {
  1062. _.set(json, 'format_create_dtime', dayjs(json.create_dtime).format('YYYY-MM-DD HH:mm:ss'));
  1063. }
  1064. } else {
  1065. if (_.isString(json.create_dtime)) {
  1066. _.set(json, 'format_create_dtime', json.create_dtime);
  1067. } else {
  1068. _.set(json, 'format_create_dtime', dayjs().format('YYYY-MM-DD HH:mm:ss'));
  1069. }
  1070. }
  1071. if (_.isNumber(json.update_dtime)) {
  1072. if (String(json.update_dtime).length == 10) {
  1073. _.set(
  1074. json,
  1075. 'format_update_dtime',
  1076. dayjs.unix(json.update_dtime).format('YYYY-MM-DD HH:mm:ss')
  1077. );
  1078. }
  1079. if (String(json.update_dtime).length == 13) {
  1080. _.set(json, 'format_update_dtime', dayjs(json.update_dtime).format('YYYY-MM-DD HH:mm:ss'));
  1081. }
  1082. } else {
  1083. if (_.isString(json.update_dtime)) {
  1084. _.set(json, 'format_update_dtime', json.update_dtime);
  1085. } else {
  1086. _.set(json, 'format_update_dtime', dayjs().format('YYYY-MM-DD HH:mm:ss'));
  1087. }
  1088. }
  1089. // formatMode
  1090. if (_.has(json, 'request.body.mode')) {
  1091. switch (json.request.body.mode) {
  1092. case 'none':
  1093. break;
  1094. case 'form-data':
  1095. _.set(json, 'request.body.formatMode', 'multipart/form-data');
  1096. break;
  1097. case 'urlencoded':
  1098. _.set(json, 'request.body.formatMode', 'application/x-www-form-urlencoded');
  1099. break;
  1100. case 'json':
  1101. _.set(json, 'request.body.formatMode', 'application/json');
  1102. break;
  1103. case 'xml':
  1104. _.set(json, 'request.body.formatMode', 'application/xml');
  1105. break;
  1106. case 'javascript':
  1107. _.set(json, 'request.body.formatMode', 'application/javascript');
  1108. break;
  1109. case 'plain':
  1110. _.set(json, 'request.body.formatMode', 'text/plain');
  1111. break;
  1112. case 'html':
  1113. _.set(json, 'request.body.formatMode', 'text/html');
  1114. break;
  1115. }
  1116. }
  1117. if(_.has(json, 'request.auth.type')) {
  1118. switch (json.request.auth.type) {
  1119. case 'noauth':
  1120. _.set(json, 'request.authType', '无需认证');
  1121. break;
  1122. case 'awsv4':
  1123. _.set(json, 'request.authType', 'AWS Signature');
  1124. break;
  1125. case 'basic':
  1126. _.set(json, 'request.authType', 'Basic auth');
  1127. break;
  1128. case 'bearer':
  1129. _.set(json, 'request.authType', 'Bearer auth');
  1130. break;
  1131. case 'digest':
  1132. _.set(json, 'request.authType', 'Digest auth');
  1133. break;
  1134. case 'edgegrid':
  1135. _.set(json, 'request.authType', 'Akamai EdgeGrid');
  1136. break;
  1137. case 'hawk':
  1138. _.set(json, 'request.authType', 'Hawk authentication');
  1139. break;
  1140. case 'kv':
  1141. _.set(json, 'request.authType', '私密键值对');
  1142. break;
  1143. case 'ntlm':
  1144. _.set(json, 'request.authType', 'NTLM Authentication');
  1145. break;
  1146. case 'oauth1':
  1147. _.set(json, 'request.authType', 'OAuth 1.0');
  1148. break;
  1149. }
  1150. }
  1151. json.url = json.request.url;
  1152. return json;
  1153. }
  1154. // 加载当前数据
  1155. function loadData(_target_id,dataDB) {
  1156. // 获取当前的数据信息
  1157. let _targetData = {};
  1158. // 右侧浮动导航
  1159. let floatNavs = [];
  1160. if(_target_id == '001'){
  1161. if (_.isObject(dataDB[_target_id])) {
  1162. _targetData = _.cloneDeep(dataDB[_target_id]);
  1163. } else if (
  1164. _.has(apipostData, 'project.vars.request') &&
  1165. _.isObject(apipostData.project.vars.request)
  1166. ) {
  1167. _targetData = {
  1168. target_type: 'global',
  1169. request: apipostData.project.vars.request,
  1170. script: apipostData.project.vars.script,
  1171. };
  1172. } else {
  1173. _targetData = {
  1174. target_type: 'none',
  1175. request: {},
  1176. };
  1177. }
  1178. _targetData = formatJson(_targetData);
  1179. $('.apipost-doc-body-nav-list').find('li').removeClass('active');
  1180. $('.apipost-doc-body-nav-list')
  1181. .find(`li[data-target_id="${_target_id}"]`)
  1182. .eq(0)
  1183. .addClass('active')
  1184. .toggleClass('toggle search-toggle');
  1185. // const children_ids = getChildrenTargetIDs(Object.values(dataDB), _target_id);
  1186. //
  1187. // if (_.isArray(children_ids)) {
  1188. // if (
  1189. // $('.apipost-doc-body-nav-list')
  1190. // .find(`li[data-target_id="${_target_id}"]`)
  1191. // .eq(0)
  1192. // .hasClass('toggle')
  1193. // ) {
  1194. // children_ids.forEach((target_id) => {
  1195. // if ($(`li[data-target_id="${target_id}"]`).attr('data-type') == 'folder') {
  1196. // $(`li[data-target_id="${target_id}"]`).addClass('is-hidden toggle');
  1197. // } else {
  1198. // $(`li[data-target_id="${target_id}"]`).addClass('is-hidden');
  1199. // }
  1200. // });
  1201. // } else {
  1202. // children_ids.forEach((target_id) => {
  1203. // if ($(`li[data-target_id="${target_id}"]`).attr('data-type') == 'folder') {
  1204. // $(`li[data-target_id="${target_id}"]`).removeClass('is-hidden toggle');
  1205. // } else {
  1206. // $(`li[data-target_id="${target_id}"]`).removeClass('is-hidden');
  1207. // }
  1208. // });
  1209. // }
  1210. // }
  1211. _targetData.copyData = JSON.parse(JSON.stringify(_targetData));
  1212. if(_targetData.copyData.target_type == 'example'){
  1213. _targetData.copyData.target_type = _targetData.copyData.example_type;
  1214. }
  1215. // 加载左侧内容
  1216. const _docContentHtml = template('apipost-doc-wrap-tpl', {
  1217. data: _targetData,
  1218. target_id: _target_id,
  1219. });
  1220. $('.apipost-doc-wrap').html(_docContentHtml);
  1221. // 右侧浮动导航
  1222. floatNavs = [];
  1223. $('.apipost-doc-wrap').find('h3 ,h4, h5, h6, h7').each((i, item) => {
  1224. let text = $(item).attr('data-text');
  1225. let id = $(item).attr('id');
  1226. if (text) {
  1227. floatNavs.push({
  1228. text, id,
  1229. name: $(item).prop("tagName"),
  1230. indent: $(item).prop("tagName").replace(/[^0-9]/ig, "") - 2,
  1231. })
  1232. }
  1233. })
  1234. const _floatNavs = template('apipost-float-nav-template-tpl', {
  1235. list: floatNavs
  1236. });
  1237. $('.apipost-float-nav-template').html(_floatNavs);
  1238. // 请求body raw 参数
  1239. try {
  1240. if (_targetData.target_type == 'grpc' || _targetData.example_type == 'grpc') {
  1241. $('.request-body-raw-editor-json').each((i, item) => {
  1242. let val = $(item).prev('input').val();
  1243. if(val){
  1244. new JsonEditor(
  1245. `#${$(item).attr('id')}`,
  1246. JSON5.parse(val),
  1247. {},
  1248. []
  1249. ).load(JSON5.parse(val), []);
  1250. }
  1251. })
  1252. }
  1253. if (_targetData.target_type == 'api' || _targetData.example_type == 'api') {
  1254. let obj = [];
  1255. if (_.has(_targetData, 'request.body.raw_para')) {
  1256. obj = _targetData.request.body.raw_para.map((itemRaw) => {
  1257. const arr = itemRaw.key.split('.');
  1258. itemRaw.newKey = arr[arr.length - 1];
  1259. return itemRaw;
  1260. });
  1261. }
  1262. if($('#request-body-raw-editor-input').length > 0){
  1263. new JsonEditor('#request-body-raw-editor-json',
  1264. JSON5.parse($('#request-body-raw-editor-input').val()),
  1265. {},
  1266. obj
  1267. ).load(JSON5.parse($('#request-body-raw-editor-input').val()), obj);
  1268. }
  1269. }
  1270. } catch (e) { }
  1271. // 响应示例 raw 参数
  1272. try {
  1273. _.forEach(_targetData.response, function (item, key) {
  1274. const obj = item.parameter.map((itemRaw) => {
  1275. const arr = itemRaw.key.split('.');
  1276. itemRaw.newKey = arr[arr.length - 1];
  1277. return itemRaw;
  1278. });
  1279. if($(`#response-raw-${key}-json-input`).length > 0){
  1280. new JsonEditor(`#response-raw-${key}-json`,
  1281. JSON5.parse($(`#response-raw-${key}-json-input`).val()),
  1282. {},
  1283. obj
  1284. ).load(JSON5.parse($(`#response-raw-${key}-json-input`).val()), obj);
  1285. }
  1286. });
  1287. } catch (e) { }
  1288. // 更新 url
  1289. changeURLStatic('target_id', _target_id);
  1290. // 优化 apipost-doc-paras 展示
  1291. $('.apipost-doc-paras').each((i, item) => {
  1292. if ($(item).children().length == 0) {
  1293. let _id = $(item).attr('for-id');
  1294. let _title = $(`#${_id}`).attr('data-text');
  1295. let _tipDiv = `<div class="apipost-no-data">暂无${_title}数据</div>`;
  1296. $(item).append(_tipDiv)
  1297. }
  1298. })
  1299. }else {
  1300. let newdata = Object.values(dataDB)
  1301. // let LevelArr = []
  1302. //
  1303. // function levelTree(arr1, newarr) {
  1304. // arr1.forEach(item => {
  1305. // if (item.children && item.children.length > 0) {
  1306. // newarr.push(item)
  1307. // levelTree(item.children, newarr)
  1308. // } else {
  1309. // newarr.push(item)
  1310. // }
  1311. // })
  1312. // }
  1313. //
  1314. // levelTree(newdata, LevelArr)
  1315. newdata.forEach(item => {
  1316. if (item.local_target_id == _target_id) {
  1317. _targetData = formatJson(item);
  1318. $('.apipost-doc-body-nav-list').find('li').removeClass('active');
  1319. $('.apipost-doc-body-nav-list')
  1320. .find(`li[data-target_id="${_target_id}"]`)
  1321. .eq(0)
  1322. .addClass('active')
  1323. .toggleClass('toggle search-toggle');
  1324. const children_ids = getChildrenTargetIDs(Object.values(dataDB), _target_id);
  1325. if (_.isArray(children_ids)) {
  1326. if (
  1327. $('.apipost-doc-body-nav-list')
  1328. .find(`li[data-target_id="${_target_id}"]`)
  1329. .eq(0)
  1330. .hasClass('toggle')
  1331. ) {
  1332. children_ids.forEach((target_id) => {
  1333. if ($(`li[data-target_id="${target_id}"]`).attr('data-type') == 'folder') {
  1334. $(`li[data-target_id="${target_id}"]`).addClass('is-hidden toggle');
  1335. } else {
  1336. $(`li[data-target_id="${target_id}"]`).addClass('is-hidden');
  1337. }
  1338. });
  1339. } else {
  1340. children_ids.forEach((target_id) => {
  1341. if ($(`li[data-target_id="${target_id}"]`).attr('data-type') == 'folder') {
  1342. $(`li[data-target_id="${target_id}"]`).removeClass('is-hidden toggle');
  1343. } else {
  1344. $(`li[data-target_id="${target_id}"]`).removeClass('is-hidden');
  1345. }
  1346. });
  1347. }
  1348. }
  1349. // 加载左侧内容
  1350. const _docContentHtml = template('apipost-doc-wrap-tpl', {
  1351. data: _targetData,
  1352. target_id: _target_id,
  1353. });
  1354. $('.apipost-doc-wrap').html(_docContentHtml);
  1355. // 右侧浮动导航
  1356. floatNavs = [];
  1357. $('.apipost-doc-wrap').find('h3 ,h4, h5, h6, h7').each((i, item) => {
  1358. let text = $(item).attr('data-text');
  1359. let id = $(item).attr('id');
  1360. if (text) {
  1361. floatNavs.push({
  1362. text, id,
  1363. name: $(item).prop("tagName"),
  1364. indent: $(item).prop("tagName").replace(/[^0-9]/ig, "") - 2,
  1365. })
  1366. }
  1367. })
  1368. const _floatNavs = template('apipost-float-nav-template-tpl', {
  1369. list: floatNavs
  1370. });
  1371. $('.apipost-float-nav-template').html(_floatNavs);
  1372. // 请求body raw 参数
  1373. try {
  1374. if (_targetData.target_type == 'grpc' || _targetData.example_type == 'grpc') {
  1375. $('.request-body-raw-editor-json').each((i, item) => {
  1376. let val = $(item).prev('input').val();
  1377. if(val){
  1378. new JsonEditor(
  1379. `#${$(item).attr('id')}`,
  1380. JSON5.parse(val),
  1381. {},
  1382. []
  1383. ).load(JSON5.parse(val), []);
  1384. }
  1385. })
  1386. }
  1387. if (_targetData.target_type == 'api' || _targetData.example_type == 'api') {
  1388. let obj = [];
  1389. if (_.has(_targetData, 'request.body.raw_para')) {
  1390. obj = _targetData.request.body.raw_para.map((itemRaw) => {
  1391. const arr = itemRaw.key.split('.');
  1392. itemRaw.newKey = arr[arr.length - 1];
  1393. return itemRaw;
  1394. });
  1395. }
  1396. if($('#request-body-raw-editor-input').length > 0){
  1397. new JsonEditor('#request-body-raw-editor-json',
  1398. JSON5.parse($('#request-body-raw-editor-input').val()),
  1399. {},
  1400. obj
  1401. ).load(JSON5.parse($('#request-body-raw-editor-input').val()), obj);
  1402. }
  1403. }
  1404. } catch (e) { }
  1405. // 响应示例 raw 参数
  1406. try {
  1407. _.forEach(_targetData.response, function (item, key) {
  1408. const obj = item.parameter.map((itemRaw) => {
  1409. const arr = itemRaw.key.split('.');
  1410. itemRaw.newKey = arr[arr.length - 1];
  1411. return itemRaw;
  1412. });
  1413. if($(`#response-raw-${key}-json-input`).length > 0){
  1414. new JsonEditor(`#response-raw-${key}-json`,
  1415. JSON5.parse($(`#response-raw-${key}-json-input`).val()),
  1416. {},
  1417. obj
  1418. ).load(JSON5.parse($(`#response-raw-${key}-json-input`).val()), obj);
  1419. }
  1420. });
  1421. } catch (e) { }
  1422. // 更新 url
  1423. changeURLStatic('target_id', _target_id);
  1424. }
  1425. // 优化 apipost-doc-paras 展示
  1426. $('.apipost-doc-paras').each((i, item) => {
  1427. if ($(item).children().length == 0) {
  1428. let _id = $(item).attr('for-id');
  1429. let _title = $(`#${_id}`).attr('data-text');
  1430. let _tipDiv = `<div class="apipost-no-data">暂无${_title}数据</div>`;
  1431. $(item).append(_tipDiv)
  1432. }
  1433. })
  1434. })
  1435. }
  1436. // 折叠导航(移动端)
  1437. $('.apipost-doc-body-nav,.apipost-doc-body-content').removeClass('open');
  1438. $(document).on('scroll', function (e) {
  1439. let currentNav= '';
  1440. let scrollTop = $(document).scrollTop();
  1441. floatNavs.forEach(item => {
  1442. if ($(`#${item.id}`).offset()) {
  1443. if ($(`#${item.id}`).offset().top > scrollTop && currentNav == '') {
  1444. currentNav = item.id
  1445. // console.log(currentNav)
  1446. $('.apipost-float-nav-template').find(`li[data-id="${currentNav}"]`).addClass('active').siblings().removeClass('active');
  1447. }
  1448. }
  1449. })
  1450. // console.log('请求参数:', $('#请求参数').offset().top, scrollTop)
  1451. }).on('click', '.apipost-float-nav-template li', function(){
  1452. $(this).addClass('active').siblings().removeClass('active');
  1453. });
  1454. }
  1455. // 初始化左侧导航列表
  1456. const _leftNavHtml = template('apipost-left-nav-template-tpl', {
  1457. list: apipostData.children,
  1458. target_id: _target_id,
  1459. });
  1460. $('.apipost-left-nav-template').html(_leftNavHtml);
  1461. // 初始化项目公共信息
  1462. $('title').text(`${apipostData.project_name} - Powered by Apipost V7`);
  1463. $('.apipost-doc-body-nav-title').text(`${apipostData.project_name}`);
  1464. // project-logo
  1465. if (_.has(apipostData, 'project_logo') && apipostData.project_logo != '') {
  1466. $('.project-logo').attr('src', apipostData.project_logo);
  1467. }
  1468. $('.project-logo').on('error', function () {
  1469. $('.project-logo').attr('src', 'https://img.cdn.apipost.cn/docs/images7/logo.svg');
  1470. });
  1471. // consoleLog(apipostData)
  1472. // 复制按钮
  1473. const clipboard = new ClipboardJS('.copy-clipboard');
  1474. clipboard.on('success', function (e) {
  1475. $('.copy-clipboard-success').remove();
  1476. $(e.trigger).append('<i class="copy-clipboard-success">复制成功</i>');
  1477. e.clearSelection();
  1478. $('.copy-clipboard-success').fadeOut(1000);
  1479. setTimeout(function () {
  1480. $('.copy-clipboard-success').remove();
  1481. }, 1500);
  1482. });
  1483. clipboard.on('error', function (e) { });
  1484. // 优化左侧菜单展示,默认收起
  1485. // 获取当前的父ID
  1486. let _target_parent_ids = getParentTargetIDs(Object.values(dataDB), _target_id);
  1487. $('.apipost-left-nav-template').children('li').each((i, item) => {
  1488. if ($(item).attr('data-type') == 'folder') {
  1489. if (_target_parent_ids.indexOf($(item).attr('data-target_id')) == -1) {
  1490. $(item).addClass('toggle');
  1491. } else {
  1492. $(item).removeClass('toggle');
  1493. }
  1494. }
  1495. //if($(item).attr('data-type') != 'example') {
  1496. if ($(item).attr('data-parent_id') != '0' && _target_parent_ids.indexOf($(item).attr('data-target_id')) == -1 && $(item).attr('data-target_id') != _target_id) {
  1497. $(item).addClass('is-hidden');
  1498. } else {
  1499. $(item).removeClass('is-hidden');
  1500. }
  1501. //}
  1502. })
  1503. // 同级展示
  1504. if (dataDB[_target_id]) {
  1505. // $('.apipost-left-nav-template').children(`li[data-parent_id="${dataDB[_target_id].parent_id}"]`).removeClass('is-hidden');
  1506. _target_parent_ids.forEach(_parent_id => {
  1507. $('.apipost-left-nav-template').children(`li[data-parent_id="${_parent_id}"]`).removeClass('is-hidden');
  1508. })
  1509. }
  1510. // alert(dataDB)
  1511. // 加载单接口信息
  1512. loadData(_target_id, dataDB);
  1513. // 绑定事件
  1514. $(document).on('click', '.mobile-nav-toggle-link-btn', function () { // 移动端导航
  1515. $('.apipost-doc-body-nav,.apipost-doc-body-content').addClass('open');
  1516. }).on('click', '.load-data-btn', function () { // 加载数据
  1517. let target_id = $(this).attr('data-target_id');
  1518. // let parent_id = $(this).attr('data-parent_id');
  1519. // let target_type = $(this).attr('data-type');
  1520. // let indent = $(this).attr('data-indent');
  1521. // 加载单条数据
  1522. loadData(target_id, dataDB);
  1523. }).on('click', '.export-download-btn', function () { // 导出文档
  1524. $(this).next('ul').toggleClass('is-hidden');
  1525. })
  1526. } else {
  1527. // 空数据
  1528. // consoleLog('null')
  1529. }
  1530. </script>
  1531. <script>
  1532. var _hmt = _hmt || [];
  1533. (function () {
  1534. var hm = document.createElement("script");
  1535. hm.src = "https://hm.baidu.com/hm.js?a046ce178828e393614822a297b8d296";
  1536. var s = document.getElementsByTagName("script")[0];
  1537. s.parentNode.insertBefore(hm, s);
  1538. })();
  1539. </script>
  1540. </body>
  1541. </html>