b91736434ac6385c12c264b2cfc104fe.php 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458
  1. <?php if (!defined('THINK_PATH')) exit(); /*a:0:{}*/ ?>
  2. <!DOCTYPE html>
  3. <html lang="<?php echo $config['language']; ?>">
  4. <head>
  5. <meta charset="utf-8">
  6. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  7. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  8. <meta name="description" content="">
  9. <meta name="author" content="<?php echo $config['author']; ?>">
  10. <title><?php echo $config['title']; ?></title>
  11. <link href="https://cdn.bootcss.com/bootstrap/3.0.3/css/bootstrap.min.css" rel="stylesheet">
  12. <style type="text/css">
  13. body { padding-top: 70px; margin-bottom: 15px; }
  14. .tab-pane { padding-top: 10px; }
  15. .mt0 { margin-top: 0px; }
  16. .footer { font-size: 12px; color: #666; }
  17. .label { display: inline-block; min-width: 65px; padding: 0.3em 0.6em 0.3em; }
  18. .string { color: green; }
  19. .number { color: darkorange; }
  20. .boolean { color: blue; }
  21. .null { color: magenta; }
  22. .key { color: red; }
  23. .popover { max-width: 400px; max-height: 400px; overflow-y: auto;}
  24. </style>
  25. </head>
  26. <body>
  27. <!-- Fixed navbar -->
  28. <div class="navbar navbar-default navbar-fixed-top" role="navigation">
  29. <div class="container">
  30. <div class="navbar-header">
  31. <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
  32. <span class="sr-only">Toggle navigation</span>
  33. <span class="icon-bar"></span>
  34. <span class="icon-bar"></span>
  35. <span class="icon-bar"></span>
  36. </button>
  37. <a class="navbar-brand" href="http://www.fastadmin.net" target="_blank"><?php echo $config['title']; ?></a>
  38. </div>
  39. <div class="navbar-collapse collapse">
  40. <form class="navbar-form navbar-right">
  41. <div class="form-group">
  42. Token:
  43. </div>
  44. <div class="form-group">
  45. <input type="text" class="form-control input-sm" data-toggle="tooltip" title="<?php echo $lang['Tokentips']; ?>" placeholder="token" id="token" />
  46. </div>
  47. <div class="form-group">
  48. Apiurl:
  49. </div>
  50. <div class="form-group">
  51. <input id="apiUrl" type="text" class="form-control input-sm" data-toggle="tooltip" title="<?php echo $lang['Apiurltips']; ?>" placeholder="https://api.mydomain.com" value="<?php echo $config['apiurl']; ?>" />
  52. </div>
  53. <div class="form-group">
  54. <button type="button" class="btn btn-success btn-sm" data-toggle="tooltip" title="<?php echo $lang['Savetips']; ?>" id="save_data">
  55. <span class="glyphicon glyphicon-floppy-disk" aria-hidden="true"></span>
  56. </button>
  57. </div>
  58. </form>
  59. </div><!--/.nav-collapse -->
  60. </div>
  61. </div>
  62. <div class="container">
  63. <div class="panel-group" id="accordion">
  64. <?php if(is_array($docslist) || $docslist instanceof \think\Collection || $docslist instanceof \think\Paginator): if( count($docslist)==0 ) : echo "" ;else: foreach($docslist as $key=>$docs): ?>
  65. <h2><?php echo $key; ?></h2>
  66. <hr>
  67. <?php if(is_array($docs) || $docs instanceof \think\Collection || $docs instanceof \think\Paginator): if( count($docs)==0 ) : echo "" ;else: foreach($docs as $key=>$api): ?>
  68. <div class="panel panel-default">
  69. <div class="panel-heading">
  70. <h4 class="panel-title">
  71. <span class="label <?php echo $api['method_label']; ?>"><?php echo strtoupper($api['method']); ?></span> <a data-toggle="collapse" data-parent="#accordion<?php echo $api['id']; ?>" href="#collapseOne<?php echo $api['id']; ?>"> <?php echo $api['route']; ?></a>
  72. </h4>
  73. </div>
  74. <div id="collapseOne<?php echo $api['id']; ?>" class="panel-collapse collapse">
  75. <div class="panel-body">
  76. <!-- Nav tabs -->
  77. <ul class="nav nav-tabs" id="doctab<?php echo $api['id']; ?>">
  78. <li class="active"><a href="#info<?php echo $api['id']; ?>" data-toggle="tab"><?php echo $lang['Info']; ?></a></li>
  79. <li><a href="#sandbox<?php echo $api['id']; ?>" data-toggle="tab"><?php echo $lang['Sandbox']; ?></a></li>
  80. <li><a href="#sample<?php echo $api['id']; ?>" data-toggle="tab"><?php echo $lang['Sampleoutput']; ?></a></li>
  81. </ul>
  82. <!-- Tab panes -->
  83. <div class="tab-content">
  84. <div class="tab-pane active" id="info<?php echo $api['id']; ?>">
  85. <div class="well">
  86. <?php echo $api['summary']; ?>
  87. </div>
  88. <div class="panel panel-default">
  89. <div class="panel-heading"><strong><?php echo $lang['Headers']; ?></strong></div>
  90. <div class="panel-body">
  91. <?php if($api['headerslist']): ?>
  92. <table class="table table-hover">
  93. <thead>
  94. <tr>
  95. <th><?php echo $lang['Name']; ?></th>
  96. <th><?php echo $lang['Type']; ?></th>
  97. <th><?php echo $lang['Required']; ?></th>
  98. <th><?php echo $lang['Description']; ?></th>
  99. </tr>
  100. </thead>
  101. <tbody>
  102. <?php if(is_array($api['headerslist']) || $api['headerslist'] instanceof \think\Collection || $api['headerslist'] instanceof \think\Paginator): if( count($api['headerslist'])==0 ) : echo "" ;else: foreach($api['headerslist'] as $key=>$header): ?>
  103. <tr>
  104. <td><?php echo $header['name']; ?></td>
  105. <td><?php echo $header['type']; ?></td>
  106. <td><?php echo !empty($header['required'])?'是':'否'; ?></td>
  107. <td><?php echo $header['description']; ?></td>
  108. </tr>
  109. <?php endforeach; endif; else: echo "" ;endif; ?>
  110. </tbody>
  111. </table>
  112. <?php else: ?>
  113. <?php endif; ?>
  114. </div>
  115. </div>
  116. <div class="panel panel-default">
  117. <div class="panel-heading"><strong><?php echo $lang['Parameters']; ?></strong></div>
  118. <div class="panel-body">
  119. <?php if($api['paramslist']): ?>
  120. <table class="table table-hover">
  121. <thead>
  122. <tr>
  123. <th><?php echo $lang['Name']; ?></th>
  124. <th><?php echo $lang['Type']; ?></th>
  125. <th><?php echo $lang['Required']; ?></th>
  126. <th><?php echo $lang['Description']; ?></th>
  127. </tr>
  128. </thead>
  129. <tbody>
  130. <?php if(is_array($api['paramslist']) || $api['paramslist'] instanceof \think\Collection || $api['paramslist'] instanceof \think\Paginator): if( count($api['paramslist'])==0 ) : echo "" ;else: foreach($api['paramslist'] as $key=>$param): ?>
  131. <tr>
  132. <td><?php echo $param['name']; ?></td>
  133. <td><?php echo $param['type']; ?></td>
  134. <td><?php echo $param['required']?'是':'否'; ?></td>
  135. <td><?php echo $param['description']; ?></td>
  136. </tr>
  137. <?php endforeach; endif; else: echo "" ;endif; ?>
  138. </tbody>
  139. </table>
  140. <?php else: ?>
  141. <?php endif; ?>
  142. </div>
  143. </div>
  144. <div class="panel panel-default">
  145. <div class="panel-heading"><strong><?php echo $lang['Body']; ?></strong></div>
  146. <div class="panel-body">
  147. <?php echo (isset($api['body']) && ($api['body'] !== '')?$api['body']:'无'); ?>
  148. </div>
  149. </div>
  150. </div><!-- #info -->
  151. <div class="tab-pane" id="sandbox<?php echo $api['id']; ?>">
  152. <div class="row">
  153. <div class="col-md-12">
  154. <?php if($api['headerslist']): ?>
  155. <div class="panel panel-default">
  156. <div class="panel-heading"><strong><?php echo $lang['Headers']; ?></strong></div>
  157. <div class="panel-body">
  158. <div class="headers">
  159. <?php if(is_array($api['headerslist']) || $api['headerslist'] instanceof \think\Collection || $api['headerslist'] instanceof \think\Paginator): if( count($api['headerslist'])==0 ) : echo "" ;else: foreach($api['headerslist'] as $key=>$param): ?>
  160. <div class="form-group">
  161. <label class="control-label" for="<?php echo $param['name']; ?>"><?php echo $param['name']; ?></label>
  162. <input type="<?php echo $param['type']; ?>" class="form-control input-sm" id="<?php echo $param['name']; ?>" <?php if($param['required']): ?>required<?php endif; ?> placeholder="<?php echo $param['description']; ?> - Ex: <?php echo $param['sample']; ?>" name="<?php echo $param['name']; ?>">
  163. </div>
  164. <?php endforeach; endif; else: echo "" ;endif; ?>
  165. </div>
  166. </div>
  167. </div>
  168. <?php endif; ?>
  169. <div class="panel panel-default">
  170. <div class="panel-heading"><strong><?php echo $lang['Parameters']; ?></strong></div>
  171. <div class="panel-body">
  172. <form enctype="application/x-www-form-urlencoded" role="form" action="<?php echo $api['route']; ?>" method="<?php echo $api['method']; ?>" name="form<?php echo $api['id']; ?>" id="form<?php echo $api['id']; ?>">
  173. <?php if($api['paramslist']): if(is_array($api['paramslist']) || $api['paramslist'] instanceof \think\Collection || $api['paramslist'] instanceof \think\Paginator): if( count($api['paramslist'])==0 ) : echo "" ;else: foreach($api['paramslist'] as $key=>$param): ?>
  174. <div class="form-group">
  175. <label class="control-label" for="<?php echo $param['name']; ?>"><?php echo $param['name']; ?></label>
  176. <input type="<?php echo $param['type']; ?>" class="form-control input-sm" id="<?php echo $param['name']; ?>" <?php if($param['required']): ?>required<?php endif; ?> placeholder="<?php echo $param['description']; if($param['sample']): ?> - 例: <?php echo $param['sample']; endif; ?>" name="<?php echo $param['name']; ?>">
  177. </div>
  178. <?php endforeach; endif; else: echo "" ;endif; else: ?>
  179. <div class="form-group">
  180. </div>
  181. <?php endif; ?>
  182. <div class="form-group">
  183. <button type="submit" class="btn btn-success send" rel="<?php echo $api['id']; ?>"><?php echo $lang['Send']; ?></button>
  184. </div>
  185. </form>
  186. </div>
  187. </div>
  188. <div class="panel panel-default">
  189. <div class="panel-heading"><strong><?php echo $lang['Response']; ?></strong></div>
  190. <div class="panel-body">
  191. <div class="row">
  192. <div class="col-md-12" style="overflow-x:auto">
  193. <pre id="response_headers<?php echo $api['id']; ?>"></pre>
  194. <pre id="response<?php echo $api['id']; ?>"></pre>
  195. </div>
  196. </div>
  197. </div>
  198. </div>
  199. <div class="panel panel-default">
  200. <div class="panel-heading"><strong><?php echo $lang['ReturnParameters']; ?></strong></div>
  201. <div class="panel-body">
  202. <?php if($api['returnparamslist']): ?>
  203. <table class="table table-hover">
  204. <thead>
  205. <tr>
  206. <th><?php echo $lang['Name']; ?></th>
  207. <th><?php echo $lang['Type']; ?></th>
  208. <th><?php echo $lang['Description']; ?></th>
  209. </tr>
  210. </thead>
  211. <tbody>
  212. <?php if(is_array($api['returnparamslist']) || $api['returnparamslist'] instanceof \think\Collection || $api['returnparamslist'] instanceof \think\Paginator): if( count($api['returnparamslist'])==0 ) : echo "" ;else: foreach($api['returnparamslist'] as $key=>$param): ?>
  213. <tr>
  214. <td><?php echo $param['name']; ?></td>
  215. <td><?php echo $param['type']; ?></td>
  216. <td><?php echo $param['description']; ?></td>
  217. </tr>
  218. <?php endforeach; endif; else: echo "" ;endif; ?>
  219. </tbody>
  220. </table>
  221. <?php else: ?>
  222. <?php endif; ?>
  223. </div>
  224. </div>
  225. </div>
  226. </div>
  227. </div><!-- #sandbox -->
  228. <div class="tab-pane" id="sample<?php echo $api['id']; ?>">
  229. <div class="row">
  230. <div class="col-md-12">
  231. <pre id="sample_response<?php echo $api['id']; ?>"><?php echo (isset($api['return']) && ($api['return'] !== '')?$api['return']:'无'); ?></pre>
  232. </div>
  233. </div>
  234. </div><!-- #sample -->
  235. </div><!-- .tab-content -->
  236. </div>
  237. </div>
  238. </div>
  239. <?php endforeach; endif; else: echo "" ;endif; endforeach; endif; else: echo "" ;endif; ?>
  240. </div>
  241. <hr>
  242. <div class="row mt0 footer">
  243. <div class="col-md-6" align="left">
  244. Generated on <?php echo date('Y-m-d H:i:s'); ?>
  245. </div>
  246. <div class="col-md-6" align="right">
  247. <a href="http://www.fastadmin.net" target="_blank">FastAdmin</a>
  248. </div>
  249. </div>
  250. </div> <!-- /container -->
  251. <script src="https://cdn.bootcss.com/jquery/1.10.2/jquery.min.js"></script>
  252. <script src="https://cdn.bootcss.com/bootstrap/3.0.3/js/bootstrap.min.js"></script>
  253. <script type="text/javascript">
  254. function syntaxHighlight(json) {
  255. if (typeof json != 'string') {
  256. json = JSON.stringify(json, undefined, 2);
  257. }
  258. json = json.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
  259. return json.replace(/("(\\u[a-zA-Z0-9]{4}|\\[^u]|[^\\"])*"(\s*:)?|\b(true|false|null)\b|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?)/g, function (match) {
  260. var cls = 'number';
  261. if (/^"/.test(match)) {
  262. if (/:$/.test(match)) {
  263. cls = 'key';
  264. } else {
  265. cls = 'string';
  266. }
  267. } else if (/true|false/.test(match)) {
  268. cls = 'boolean';
  269. } else if (/null/.test(match)) {
  270. cls = 'null';
  271. }
  272. return '<span class="' + cls + '">' + match + '</span>';
  273. });
  274. }
  275. function prepareStr(str) {
  276. try {
  277. return syntaxHighlight(JSON.stringify(JSON.parse(str.replace(/'/g, '"')), null, 2));
  278. } catch (e) {
  279. return str;
  280. }
  281. }
  282. var storage = (function () {
  283. var uid = new Date;
  284. var storage;
  285. var result;
  286. try {
  287. (storage = window.localStorage).setItem(uid, uid);
  288. result = storage.getItem(uid) == uid;
  289. storage.removeItem(uid);
  290. return result && storage;
  291. } catch (exception) {
  292. }
  293. }());
  294. $.fn.serializeObject = function ()
  295. {
  296. var o = {};
  297. var a = this.serializeArray();
  298. $.each(a, function () {
  299. if (!this.value) {
  300. return;
  301. }
  302. if (o[this.name] !== undefined) {
  303. if (!o[this.name].push) {
  304. o[this.name] = [o[this.name]];
  305. }
  306. o[this.name].push(this.value || '');
  307. } else {
  308. o[this.name] = this.value || '';
  309. }
  310. });
  311. return o;
  312. };
  313. $(document).ready(function () {
  314. if (storage) {
  315. $('#token').val(storage.getItem('token'));
  316. $('#apiUrl').val(storage.getItem('apiUrl'));
  317. }
  318. $('[data-toggle="tooltip"]').tooltip({
  319. placement: 'bottom'
  320. });
  321. $('code[id^=response]').hide();
  322. $.each($('pre[id^=sample_response],pre[id^=sample_post_body]'), function () {
  323. if ($(this).html() == 'NA') {
  324. return;
  325. }
  326. var str = prepareStr($(this).html());
  327. $(this).html(str);
  328. });
  329. $("[data-toggle=popover]").popover({placement: 'right'});
  330. $('[data-toggle=popover]').on('shown.bs.popover', function () {
  331. var $sample = $(this).parent().find(".popover-content"),
  332. str = $(this).data('content');
  333. if (typeof str == "undefined" || str === "") {
  334. return;
  335. }
  336. var str = prepareStr(str);
  337. $sample.html('<pre>' + str + '</pre>');
  338. });
  339. $('body').on('click', '#save_data', function (e) {
  340. if (storage) {
  341. storage.setItem('token', $('#token').val());
  342. storage.setItem('apiUrl', $('#apiUrl').val());
  343. } else {
  344. alert('Your browser does not support local storage');
  345. }
  346. });
  347. $('body').on('click', '.send', function (e) {
  348. e.preventDefault();
  349. var form = $(this).closest('form');
  350. //added /g to get all the matched params instead of only first
  351. var matchedParamsInRoute = $(form).attr('action').match(/[^{]+(?=\})/g);
  352. var theId = $(this).attr('rel');
  353. //keep a copy of action attribute in order to modify the copy
  354. //instead of the initial attribute
  355. var url = $(form).attr('action');
  356. var serializedData = new FormData();
  357. $(form).find('input').each(function (i, input) {
  358. if ($(input).attr('type') == 'file') {
  359. serializedData.append($(input).attr('name'), $(input)[0].files[0]);
  360. } else {
  361. serializedData.append($(input).attr('name'), $(input).val())
  362. }
  363. });
  364. var index, key, value;
  365. if (matchedParamsInRoute) {
  366. for (index = 0; index < matchedParamsInRoute.length; ++index) {
  367. try {
  368. key = matchedParamsInRoute[index];
  369. value = serializedData[key];
  370. if (typeof value == "undefined")
  371. value = "";
  372. url = url.replace("{" + key + "}", value);
  373. delete serializedData[key];
  374. } catch (err) {
  375. console.log(err);
  376. }
  377. }
  378. }
  379. var headers = {};
  380. var token = $('#token').val();
  381. if (token.length > 0) {
  382. headers['token'] = token;
  383. }
  384. $("#sandbox" + theId + " .headers input[type=text]").each(function () {
  385. val = $(this).val();
  386. if (val.length > 0) {
  387. headers[$(this).prop('name')] = val;
  388. }
  389. });
  390. $.ajax({
  391. url: $('#apiUrl').val() + url,
  392. data: $(form).attr('method') == 'get' ? $(form).serialize() : serializedData,
  393. type: $(form).attr('method') + '',
  394. dataType: 'json',
  395. contentType: false,
  396. processData: false,
  397. headers: headers,
  398. success: function (data, textStatus, xhr) {
  399. if (typeof data === 'object') {
  400. var str = JSON.stringify(data, null, 2);
  401. $('#response' + theId).html(syntaxHighlight(str));
  402. } else {
  403. $('#response' + theId).html(data || '');
  404. }
  405. $('#response_headers' + theId).html('HTTP ' + xhr.status + ' ' + xhr.statusText + '<br/><br/>' + xhr.getAllResponseHeaders());
  406. $('#response' + theId).show();
  407. },
  408. error: function (xhr, textStatus, error) {
  409. try {
  410. var str = JSON.stringify($.parseJSON(xhr.responseText), null, 2);
  411. } catch (e) {
  412. var str = xhr.responseText;
  413. }
  414. $('#response_headers' + theId).html('HTTP ' + xhr.status + ' ' + xhr.statusText + '<br/><br/>' + xhr.getAllResponseHeaders());
  415. $('#response' + theId).html(syntaxHighlight(str));
  416. $('#response' + theId).show();
  417. }
  418. });
  419. return false;
  420. });
  421. });
  422. </script>
  423. </body>
  424. </html>