utils.js 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253
  1. import $i from './i18n.js'
  2. /**
  3. * 排序数组对象
  4. * @param {*} arr 排序的数据
  5. * @param {*} reverse 是否倒序
  6. * @param {*} field 排序的字段
  7. * @param {*} childField 子元素排序的字段
  8. * @returns
  9. */
  10. export function sortArrayObject(arr, reverse, field, childField) {
  11. if (arr && arr.length > 0 && field) {
  12. function sortItem(item1, item2) {
  13. return item1[field].localeCompare(item2[field], 'zh-CN')
  14. }
  15. // 分组
  16. let folderArr = []
  17. // 对象
  18. let fileArr = []
  19. arr.forEach((element) => {
  20. if (element.folder === true) {
  21. if (childField) {
  22. element[childField] = sortArrayObject(element[childField], reverse, field, childField)
  23. }
  24. folderArr.push(element)
  25. } else {
  26. fileArr.push(element)
  27. }
  28. })
  29. folderArr.sort(sortItem)
  30. fileArr.sort(sortItem)
  31. if (reverse === false) {
  32. folderArr.reverse()
  33. fileArr.reverse()
  34. }
  35. arr.splice(0, arr.length, ...folderArr.concat(fileArr))
  36. }
  37. return arr
  38. }
  39. export function randomString(len) {
  40. return Array(len).fill(0).map(() => (Math.random() * 16 | 0).toString(16)).join('')
  41. }
  42. export function paddingZero(val, len) {
  43. len = len || 2
  44. return (Array(len).join(0) + val).slice(-len)
  45. }
  46. export function formatDate(val) {
  47. if (typeof val === 'number') {
  48. if (val.toString().length === 13) {
  49. val = new Date(val)
  50. } else {
  51. val = new Date(val * 1000)
  52. }
  53. }
  54. if (val instanceof Date) {
  55. var month = val.getMonth() + 1;
  56. var day = val.getDate();
  57. var hour = val.getHours();
  58. var minute = val.getMinutes();
  59. var seconds = val.getSeconds();
  60. return val.getFullYear() + '-' + paddingZero(month) + '-' + paddingZero(day) + ' ' + paddingZero(hour) + ':' + paddingZero(minute) + ':' + paddingZero(seconds);
  61. }
  62. return '';
  63. }
  64. export function replaceURL(url) {
  65. return url.replace(/:?\/+/g, e => e.indexOf(':') > -1 ? e : '/');
  66. }
  67. export function convertVariables(variables) {
  68. const convertObject = data => {
  69. if (Array.isArray(data)) {
  70. let len = data.length;
  71. let chunkSize = 100;
  72. if (len > chunkSize) {
  73. let ranges = [];
  74. for (let index = 0; index < len; index += chunkSize) {
  75. ranges.push({
  76. name: `[${index}...${Math.min(index + chunkSize, len) - 1}]`,
  77. folder: true,
  78. opened: false,
  79. dataType: 'array',
  80. type: 'Array',
  81. children: data.slice(index, Math.min(index + chunkSize, len)).map((v, i) => convert('' + (index + i), undefined, JSON.stringify(v), v))
  82. })
  83. }
  84. return ranges;
  85. }
  86. return data.map((v, index) => convert('' + index, undefined, JSON.stringify(v), v))
  87. } else {
  88. return Object.keys(data).map(key => {
  89. const value = data[key]
  90. return convert(key, undefined, JSON.stringify(value), value)
  91. })
  92. }
  93. }
  94. const convertToJson = value => {
  95. try {
  96. return JSON.parse(value)
  97. } catch (e) {
  98. return value
  99. }
  100. }
  101. const convert = (name, type, value, data) => {
  102. let displayText = (type || '').startsWith('java.lang')
  103. let dataType
  104. let children
  105. let size
  106. if (!displayText) {
  107. data = data || (value && convertToJson(value))
  108. if (!Array.isArray(data) && typeof data !== 'object') {
  109. displayText = true
  110. dataType = typeof data
  111. } else {
  112. if (Array.isArray(data)) {
  113. size = `size = ${data.length}`
  114. dataType = 'array'
  115. } else {
  116. size = `members = ${data && Object.keys(data).length}`
  117. dataType = 'object'
  118. }
  119. type = type || (Array.isArray(data) ? `Array` : typeof data)
  120. children = data && convertObject(data) || []
  121. }
  122. } else {
  123. dataType = type?.substring(10)?.toLowerCase() || typeof data
  124. if (['integer', 'double', 'float', 'byte', 'short', 'long'].indexOf(dataType) > -1) {
  125. dataType = 'number'
  126. }
  127. if (dataType === 'class') {
  128. value = value.substring(1, value.length - 1)
  129. }
  130. }
  131. let isNull = data == null && !displayText
  132. if (isNull) {
  133. type = 'null'
  134. displayText = true
  135. value = 'null'
  136. }
  137. return {
  138. name,
  139. value,
  140. data,
  141. dataType,
  142. type,
  143. size,
  144. isNull,
  145. folder: !displayText,
  146. opened: false,
  147. children
  148. }
  149. }
  150. return variables && variables.map(it => convert(it.name, it.type, it.value)) || []
  151. }
  152. export function getSizeUnit(dataLen) {
  153. const unit = ['B', 'KB', 'MB'];
  154. let index = 0;
  155. while (index < unit.length && dataLen >= 1024) {
  156. dataLen = dataLen / 1024
  157. index++;
  158. }
  159. dataLen = dataLen.toFixed(2);
  160. return `${dataLen} ${unit[index]}`
  161. }
  162. export function processTree(tree, fn) {
  163. const process = list => list.filter(it => it.folder).forEach(it => {
  164. process(it.children || []);
  165. fn(it)
  166. })
  167. process(tree || [])
  168. }
  169. export function download(blob, filename) {
  170. let element = document.createElement('a')
  171. let href = window.URL.createObjectURL(blob);
  172. element.href = href;
  173. element.download = filename;
  174. document.body.appendChild(element);
  175. element.click();
  176. document.body.removeChild(element);
  177. window.URL.revokeObjectURL(href)
  178. }
  179. export function copyToClipboard(value) {
  180. try {
  181. var copyText = document.createElement('textarea')
  182. copyText.style = 'position:absolute;left:-99999999px'
  183. document.body.appendChild(copyText)
  184. copyText.innerHTML = value
  185. copyText.readOnly = false
  186. copyText.select()
  187. document.execCommand('copy')
  188. return true
  189. } catch (e) {
  190. return false
  191. }
  192. }
  193. export function hash(str) {
  194. let h = 0;
  195. for (let i = 0, offset = 0, len = str.length; i < len; i++) {
  196. h = 31 * h + str.charCodeAt(offset++);
  197. }
  198. return h;
  199. }
  200. export function definition2TreeList(definition) {
  201. let treeList = []
  202. const appendNode = (node, level) => {
  203. const item = {
  204. level,
  205. node,
  206. name: level === 0 ? $i('message.root') : node.name,
  207. folder: node?.dataType === 'Object' || node?.dataType === 'Array',
  208. display: true
  209. }
  210. if (item.folder) {
  211. item.expand = true
  212. }
  213. treeList.push(item)
  214. }
  215. const appendChild = (items, level) => {
  216. (items || []).forEach(node => {
  217. appendNode(node, level)
  218. appendChild(node.children, level + 1)
  219. })
  220. }
  221. appendNode(definition || {}, 0)
  222. appendChild(definition?.children || [], 1)
  223. return treeList
  224. }
  225. export function loadPlugin(url) {
  226. return new Promise(resolve => {
  227. const head = document.getElementsByTagName('head')[0];
  228. const element = document.createElement('script');
  229. element.setAttribute('type', 'text/javascript');
  230. element.src = url;
  231. head.appendChild(element);
  232. if (element.readyState) {
  233. element.onreadystatechange = () => {
  234. if (element.readyState === 'loaded' || element.readyState === 'complete') {
  235. element.onreadystatechange = null;
  236. resolve();
  237. }
  238. };
  239. } else {
  240. element.onload = function(){
  241. resolve()
  242. };
  243. }
  244. })
  245. }