swagger-quick

先搜索服务,也可以搜索当前服务下的api路径;复制api路径和小驼峰函数名

  1. // ==UserScript==
  2. // @name swagger-quick
  3. // @namespace http://tampermonkey.net/
  4. // @version 0.1.2
  5. // @description 先搜索服务,也可以搜索当前服务下的api路径;复制api路径和小驼峰函数名
  6. // @author hoyche
  7. // @license MIT
  8. // @include /.*\/swagger-ui\.html.*/
  9. // @grant none
  10. // ==/UserScript==
  11.  
  12. (function() {
  13. 'use strict';
  14. $(function(){
  15. let timer = setInterval(()=>{
  16. if ($("#select_baseUrl option").length === 0) return;
  17. clearTimeout(timer);
  18. // 创建左侧控制台
  19. const ctrl = $(`<div class="ctrl-wrap" style="position:fixed;left:0;top:100px;z-index:1;background-color: #fff;"><input type="text" placeholder="服务搜索" id="serviceIpt"/><div class="service-lists" style="margin-bottom: 30px;"></div><input type="text" placeholder="当前服务api搜索" id="apiIpt"><div class="api-lists">`);
  20. $("body").append(ctrl);
  21. // 获取所有api路径列表
  22. var observerOptions = {
  23. childList: true, // 观察目标子节点的变化,是否有添加或者删除
  24. }
  25. var observer = new MutationObserver(getApiOps);
  26. observer.observe($('#swagger-ui-container')[0], observerOptions);
  27. // 复制api路径和小驼峰函数名
  28. $('#swagger-ui-container').on('mouseenter','.operations>.operation',function(e){
  29. var apiEl = $(`<span style="color: red">复制api路径</span>`);
  30. var fnEl = $(`<span style="color: red;margin-left: 5px;">复制小驼峰函数名</span>`);
  31. let text = $('.path',e.currentTarget).text().replace(/[\n\s]/g,'');
  32. const url = $('#select_baseUrl').val().match(/\.com(\/[^/]+)/)[1] + text;
  33. apiEl.click(function(){
  34. copyContentH5(url)
  35. })
  36. fnEl.click(function(){
  37. copyContentH5(text.replace(/\/api\//,'').replace(/\/[^/]/g, function(s) {return s.slice(1).toUpperCase()}))
  38. })
  39. $('.heading>h3',e.currentTarget).append([apiEl,fnEl]);
  40. }).on('mouseleave','.operations>.operation',function(e){
  41. $('.heading>h3>.path',e.currentTarget).nextAll().remove();
  42. })
  43. // 服务列表
  44. let serviceOps = [];
  45. $("#select_baseUrl option").each(function(){
  46. serviceOps.push($(this).text());
  47. })
  48. // api路径列表
  49. let apiOps = [];
  50. // 输入服务过滤
  51. $("#serviceIpt").keyup(function() {
  52. let split = this.value.split(/\s+/);
  53. let res = new Set();
  54. for (let i = 0; split[i]; i++) {
  55. for (let j = 0; serviceOps[j]; j++) {
  56. if (~serviceOps[j].search(new RegExp(split[i]),'i')){
  57. res.add(serviceOps[j])
  58. }
  59. }
  60. }
  61. $(".service-lists").html(batHtml(res))
  62. })
  63. $(".service-lists").on('click','div',function(e){
  64. let url = $(e.currentTarget).text().match(/\((.+?)\)/)[1];
  65. $(`#select_baseUrl,#input_baseUrl`).val(url);
  66. $("#serviceIpt").val("");
  67. $(".service-lists").html("");
  68. swaggerUi.headerView.trigger("update-swagger-ui", {
  69. url: $("#input_baseUrl").val()
  70. })
  71. })
  72. // 输入api路径过滤
  73. $("#apiIpt").keyup(function() {
  74. let split = this.value.split(/\s+/);
  75. let res = new Set();
  76. for (let i = 0; split[i]; i++) {
  77. for (let j = 0; apiOps[j]; j++) {
  78. if (~apiOps[j].search(new RegExp(split[i],'i'))) {
  79. res.add(apiOps[j])
  80. }
  81. }
  82. }
  83. $(".api-lists").html(batHtml(res))
  84. })
  85. $(".api-lists").on('click','div',function(e){
  86. let url = $(e.currentTarget).text();
  87. let el = $(`.heading .path a.toggleOperation:contains('${url}'):first`);
  88. let elAni = el.closest('.heading');
  89. $("#apiIpt").val("");
  90. $(".api-lists").html("");
  91. el.closest('ul.endpoints').show();
  92. scrollTo(0,el.offset().top);
  93. //elAni.animate({backgroundColor: 'red'},function(){
  94. // elAni.animate({backgroundColor: 'transparent'})
  95. //});
  96. elAni.css({backgroundColor: 'red'});
  97. setTimeout(function(){
  98. elAni.css({backgroundColor: 'transparent'})
  99. },2000);
  100. })
  101. function batHtml(list) {
  102. let h = ''
  103. list.forEach(v => {
  104. h += `<div>${v}</div>`
  105. })
  106. return h
  107. }
  108. function getApiOps() {
  109. let set = new Set()
  110. $(`.heading .path a.toggleOperation`).each(function() {
  111. set.add($(this).text())
  112. });
  113. apiOps = [...set];
  114. // console.log(apiOps)
  115. }
  116. //h5复制文本到剪切板
  117. function copyContentH5(content) {
  118. var copyDom = document.createElement('div');
  119. copyDom.innerText=content;
  120. copyDom.style.position='absolute';
  121. copyDom.style.top='0px';
  122. copyDom.style.right='-9999px';
  123. document.body.appendChild(copyDom);
  124. //创建选中范围
  125. var range = document.createRange();
  126. range.selectNode(copyDom);
  127. //移除剪切板中内容
  128. window.getSelection().removeAllRanges();
  129. //添加新的内容到剪切板
  130. window.getSelection().addRange(range);
  131. //复制
  132. var successful = document.execCommand('copy');
  133. copyDom.parentNode.removeChild(copyDom);
  134. }
  135. },200)
  136. })
  137.  
  138. // Your code here...
  139. })();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址