st-comp 0.0.277 → 0.0.279

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (319) hide show
  1. package/README.md +19 -19
  2. package/es/ChartLayout.cjs +1 -1
  3. package/es/ChartLayout.js +1 -1
  4. package/es/ConfigProvider.cjs +1 -1
  5. package/es/ConfigProvider.js +3 -3
  6. package/es/Contextmenu.cjs +1 -1
  7. package/es/Contextmenu.js +7 -7
  8. package/es/CustomFunction.cjs +2 -2
  9. package/es/CustomFunction.js +514 -308
  10. package/es/FactorWarning.cjs +1 -1
  11. package/es/FactorWarning.js +37 -37
  12. package/es/HeatMap.cjs +1 -1
  13. package/es/HeatMap.js +7 -7
  14. package/es/Kline.cjs +1 -1
  15. package/es/Kline.js +18 -18
  16. package/es/KlineBasic.cjs +1 -1
  17. package/es/KlineBasic.js +93 -93
  18. package/es/KlineConfig.cjs +1 -1
  19. package/es/KlineConfig.js +17 -17
  20. package/es/KlineNew.cjs +1 -1
  21. package/es/KlineNew.js +14 -14
  22. package/es/KlinePlus.cjs +4 -4
  23. package/es/KlinePlus.js +760 -656
  24. package/es/LinearLegend.cjs +1 -1
  25. package/es/LinearLegend.js +1 -1
  26. package/es/Map.cjs +1 -1
  27. package/es/Map.js +1 -1
  28. package/es/MonacoEditor.cjs +1 -1
  29. package/es/MonacoEditor.js +18 -18
  30. package/es/Pagination.cjs +1 -1
  31. package/es/Pagination.js +76 -76
  32. package/es/PasswordPrompt.cjs +1 -1
  33. package/es/PasswordPrompt.js +2 -2
  34. package/es/Pie.cjs +2 -2
  35. package/es/Pie.js +14 -14
  36. package/es/Table.cjs +1 -1
  37. package/es/Table.js +22 -22
  38. package/es/TreeMap.cjs +1 -1
  39. package/es/TreeMap.js +4 -4
  40. package/es/User.cjs +1 -1
  41. package/es/User.js +73 -73
  42. package/es/VarSelectDialog.cjs +2 -2
  43. package/es/VarSelectDialog.js +21 -21
  44. package/es/VarietyAiHelper.cjs +4 -4
  45. package/es/VarietyAiHelper.js +139 -138
  46. package/es/VarietyAutoComplete.cjs +1 -1
  47. package/es/VarietyAutoComplete.js +16 -16
  48. package/es/VarietySearch.cjs +4 -4
  49. package/es/VarietySearch.js +861 -857
  50. package/es/{VarietySelect-6a166293.js → VarietySelect-41daac7b.js} +10 -10
  51. package/es/{VarietySelect-610903f0.cjs → VarietySelect-d58eee29.cjs} +1 -1
  52. package/es/VarietyTextCopy.cjs +2 -2
  53. package/es/VarietyTextCopy.js +25 -25
  54. package/es/VirtualTable.cjs +1 -1
  55. package/es/VirtualTable.js +6 -6
  56. package/es/{_initCloneObject-152b4f4e.js → _initCloneObject-5e73c9c8.js} +2 -2
  57. package/es/{_initCloneObject-76e116d0.cjs → _initCloneObject-a5832933.cjs} +1 -1
  58. package/es/aiTools-229609fb.cjs +2 -0
  59. package/es/aiTools-ce2f9281.js +115 -0
  60. package/es/aiTools.js +179 -176
  61. package/es/{config-provider-4c784baf.cjs → config-provider-06ea6b42.cjs} +1 -1
  62. package/es/{config-provider-7a3aca55.js → config-provider-88b637a8.js} +3 -3
  63. package/es/{dropdown-987c47fb.cjs → dropdown-4ce4c3e2.cjs} +1 -1
  64. package/es/{dropdown-01e09205.js → dropdown-72fbc15d.js} +2 -2
  65. package/es/{el-autocomplete-342ae823.js → el-autocomplete-6cafcdf1.js} +5 -5
  66. package/es/{el-autocomplete-16f66b34.cjs → el-autocomplete-e0857c5b.cjs} +1 -1
  67. package/es/{el-button-13dc915f.cjs → el-button-613e0bb2.cjs} +1 -1
  68. package/es/{el-button-314171a0.js → el-button-94d3de38.js} +3 -3
  69. package/es/{el-checkbox-5899681f.js → el-checkbox-6d4cb393.js} +3 -3
  70. package/es/{el-checkbox-bdf64663.cjs → el-checkbox-e90762df.cjs} +1 -1
  71. package/es/{el-dialog-0ef95df6.cjs → el-dialog-02942e22.cjs} +1 -1
  72. package/es/{el-dialog-86a3eec2.js → el-dialog-5e30161f.js} +4 -4
  73. package/es/{el-form-item-77ef6784.cjs → el-form-item-44f060d8.cjs} +1 -1
  74. package/es/{el-form-item-cda4d93c.js → el-form-item-9e8969ea.js} +5 -5
  75. package/es/{el-input-fa1445ad.js → el-input-342b2def.js} +13 -13
  76. package/es/{el-input-89222943.cjs → el-input-9a9a7f7f.cjs} +1 -1
  77. package/es/{el-input-number-d3338e5e.cjs → el-input-number-65c847d6.cjs} +1 -1
  78. package/es/{el-input-number-8f6dbf74.js → el-input-number-c22b803a.js} +35 -35
  79. package/es/{el-loading-84dde1a8.cjs → el-loading-8179b497.cjs} +1 -1
  80. package/es/{el-loading-9b671203.js → el-loading-bcc51e3d.js} +1 -1
  81. package/es/{el-menu-item-535fef90.js → el-menu-item-339baf6d.js} +21 -21
  82. package/es/{el-menu-item-4531fd0e.cjs → el-menu-item-83186444.cjs} +1 -1
  83. package/es/{el-message-box-621ed2f1.js → el-message-box-035b699c.js} +9 -9
  84. package/es/{el-message-box-f5717070.cjs → el-message-box-c62d3217.cjs} +1 -1
  85. package/es/{el-overlay-23de4324.js → el-overlay-3e17604b.js} +3 -3
  86. package/es/{el-overlay-151708cb.cjs → el-overlay-8f1da9e8.cjs} +1 -1
  87. package/es/{el-popconfirm-b8aa490e.cjs → el-popconfirm-4e32ec1b.cjs} +1 -1
  88. package/es/{el-popconfirm-bcff0aa5.js → el-popconfirm-f8a86e2c.js} +4 -4
  89. package/es/{el-popper-43ec37f4.cjs → el-popper-a4f3ae4d.cjs} +1 -1
  90. package/es/{el-popper-03988662.js → el-popper-fbd0dcea.js} +1 -1
  91. package/es/{el-segmented-db3a86be.js → el-segmented-56bd58a8.js} +2 -2
  92. package/es/{el-segmented-79a1367c.cjs → el-segmented-833ac177.cjs} +1 -1
  93. package/es/{el-select-4bd0010d.js → el-select-44fa547d.js} +8 -8
  94. package/es/{el-select-ec04e7ce.cjs → el-select-70806166.cjs} +1 -1
  95. package/es/{el-table-column-35e47229.cjs → el-table-column-3e2cdfca.cjs} +1 -1
  96. package/es/{el-table-column-7af2bec7.js → el-table-column-b74a857d.js} +9 -9
  97. package/es/{el-tag-bef9e83d.js → el-tag-66c83156.js} +2 -2
  98. package/es/{el-tag-5d5608e0.cjs → el-tag-9c2f329f.cjs} +1 -1
  99. package/es/{el-text-f998902c.js → el-text-034bd3f4.js} +1 -1
  100. package/es/{el-text-abf10fdf.cjs → el-text-6b2374bb.cjs} +1 -1
  101. package/es/index-00f6ca75.cjs +1 -0
  102. package/es/{index-a00e0534.cjs → index-185792a7.cjs} +1 -1
  103. package/es/{index-d1b554ac.js → index-1e2a38ab.js} +2 -2
  104. package/es/{index-0986e373.cjs → index-3153c1db.cjs} +1 -1
  105. package/es/{index-936e7dec.js → index-44a382a5.js} +2 -2
  106. package/es/{index-ce21e2ce.js → index-5216d5f5.js} +5 -5
  107. package/es/{index-7ed0999e.js → index-53cc4e43.js} +720 -716
  108. package/es/{index-cfcd60ca.cjs → index-5c0dd943.cjs} +1 -1
  109. package/es/{index-cfd00899.cjs → index-870b6c9d.cjs} +1 -1
  110. package/es/{index-a83ec4b7.js → index-8c2d7e05.js} +1 -1
  111. package/es/{index-8901a38c.cjs → index-94131fd7.cjs} +30 -30
  112. package/es/{index-db846633.cjs → index-9d16cea8.cjs} +1 -1
  113. package/es/{index-f3f6ee27.js → index-a33b2fb8.js} +178 -178
  114. package/es/{index-2d7ac156.cjs → index-a9246d17.cjs} +17 -17
  115. package/es/{index-60c69dd1.cjs → index-ac8dc53d.cjs} +1 -1
  116. package/es/{index-102edf6c.js → index-c5f2d372.js} +2 -2
  117. package/es/{index-6290ae0f.js → index-c6584658.js} +2 -2
  118. package/es/{index-5c44d71a.js → index-eb96e074.js} +149 -119
  119. package/es/{index-5ed42e9c.js → index-f034b910.js} +2 -2
  120. package/es/{index-c58e90e9.cjs → index-f58b2920.cjs} +1 -1
  121. package/es/{python-6cc6ec1b.js → python-8a1664e6.js} +18 -18
  122. package/es/{python-71f59893.cjs → python-a3db9620.cjs} +1 -1
  123. package/es/style.css +1 -1
  124. package/es/{use-form-common-props-02be4928.cjs → use-form-common-props-ac666630.cjs} +1 -1
  125. package/es/{use-form-common-props-76a09d89.js → use-form-common-props-ed72e914.js} +11 -11
  126. package/es/{use-global-config-31b3ec57.cjs → use-global-config-23472471.cjs} +1 -1
  127. package/es/{use-global-config-0f43458b.js → use-global-config-ee406d58.js} +2 -2
  128. package/es/{validator-ea292506.cjs → validator-366dbf39.cjs} +1 -1
  129. package/es/{validator-0e037618.js → validator-c60a8956.js} +1 -1
  130. package/es/{zh-cn-1227eb8a.js → zh-cn-b59a0910.js} +1 -1
  131. package/es/{zh-cn-0edc7234.cjs → zh-cn-c21d12d8.cjs} +1 -1
  132. package/lib/aiTools.js +179 -176
  133. package/lib/bundle.js +1 -1
  134. package/lib/bundle.umd.cjs +230 -230
  135. package/lib/{index-2a269748.js → index-62fa175a.js} +30149 -29800
  136. package/lib/{python-41da18e5.js → python-4a48fa39.js} +1 -1
  137. package/lib/style.css +1 -1
  138. package/package.json +53 -44
  139. package/auto-imports.d.ts +0 -13
  140. package/components.d.ts +0 -59
  141. package/es/aiTools-a3b095f6.js +0 -113
  142. package/es/aiTools-f36136a4.cjs +0 -2
  143. package/es/index-476c4459.cjs +0 -1
  144. package/index.html +0 -13
  145. package/packages/ChartLayout/index.ts +0 -8
  146. package/packages/ChartLayout/index.vue +0 -63
  147. package/packages/ConfigProvider/index.ts +0 -8
  148. package/packages/ConfigProvider/index.vue +0 -66
  149. package/packages/Contextmenu/index.ts +0 -8
  150. package/packages/Contextmenu/index.vue +0 -134
  151. package/packages/CustomFunction/components/ManageDialog.vue +0 -706
  152. package/packages/CustomFunction/index.ts +0 -8
  153. package/packages/CustomFunction/index.vue +0 -200
  154. package/packages/FactorWarning/index.ts +0 -8
  155. package/packages/FactorWarning/index.vue +0 -754
  156. package/packages/FactorWarning/tools.js +0 -10
  157. package/packages/HeatMap/index.ts +0 -8
  158. package/packages/HeatMap/index.vue +0 -141
  159. package/packages/Kline/components/Contextmenu/index.vue +0 -110
  160. package/packages/Kline/components/Tips/index.vue +0 -40
  161. package/packages/Kline/componentsNew/KlineSlide/index.vue +0 -155
  162. package/packages/Kline/componentsNew/KlineSub/index.vue +0 -297
  163. package/packages/Kline/componentsNew/KlineTips/index.vue +0 -66
  164. package/packages/Kline/componentsNew/KlineUtils/index.vue +0 -84
  165. package/packages/Kline/componentsNew/Tips/index.vue +0 -33
  166. package/packages/Kline/formatKlineData.ts +0 -109
  167. package/packages/Kline/images/buy.svg +0 -1
  168. package/packages/Kline/images/pen.png +0 -0
  169. package/packages/Kline/images/sell.svg +0 -1
  170. package/packages/Kline/images/t.svg +0 -1
  171. package/packages/Kline/index.ts +0 -16
  172. package/packages/Kline/index.vue +0 -891
  173. package/packages/Kline/option.ts +0 -539
  174. package/packages/Kline/type.d.ts +0 -219
  175. package/packages/Kline/utils.ts +0 -682
  176. package/packages/KlineBasic/api.js +0 -58
  177. package/packages/KlineBasic/components/AverageTips/index.vue +0 -33
  178. package/packages/KlineBasic/components/Contextmenu/index.vue +0 -105
  179. package/packages/KlineBasic/components/KlineSub/index.vue +0 -332
  180. package/packages/KlineBasic/components/KlineTips/index.vue +0 -99
  181. package/packages/KlineBasic/components/Tips/index.vue +0 -56
  182. package/packages/KlineBasic/index.ts +0 -8
  183. package/packages/KlineBasic/index.vue +0 -839
  184. package/packages/KlineBasic/utils.js +0 -258
  185. package/packages/KlineConfig/config.js +0 -46
  186. package/packages/KlineConfig/index.ts +0 -8
  187. package/packages/KlineConfig/index.vue +0 -356
  188. package/packages/KlineNew/components/KlineSlide/index.vue +0 -156
  189. package/packages/KlineNew/components/KlineSub/index.vue +0 -335
  190. package/packages/KlineNew/components/KlineTips/index.vue +0 -96
  191. package/packages/KlineNew/components/KlineUtils/index.vue +0 -341
  192. package/packages/KlineNew/components/Tips/index.vue +0 -33
  193. package/packages/KlineNew/index.ts +0 -14
  194. package/packages/KlinePlus/components/SliderChart.vue +0 -208
  195. package/packages/KlinePlus/components/Tips.vue +0 -36
  196. package/packages/KlinePlus/images/buy.svg +0 -1
  197. package/packages/KlinePlus/images/sell.svg +0 -1
  198. package/packages/KlinePlus/images/t.svg +0 -1
  199. package/packages/KlinePlus/index.ts +0 -8
  200. package/packages/KlinePlus/index.vue +0 -1067
  201. package/packages/KlinePlus/utils.js +0 -771
  202. package/packages/LinearLegend/index.ts +0 -8
  203. package/packages/LinearLegend/index.vue +0 -112
  204. package/packages/Map/China.json +0 -1
  205. package/packages/Map/index.ts +0 -8
  206. package/packages/Map/index.vue +0 -147
  207. package/packages/MonacoEditor/index.ts +0 -8
  208. package/packages/MonacoEditor/index.vue +0 -1141
  209. package/packages/MonacoEditor/tools.js +0 -18
  210. package/packages/Pagination/index.ts +0 -8
  211. package/packages/Pagination/index.vue +0 -87
  212. package/packages/PasswordPrompt/index.ts +0 -8
  213. package/packages/PasswordPrompt/index.vue +0 -267
  214. package/packages/Pie/index.ts +0 -8
  215. package/packages/Pie/index.vue +0 -148
  216. package/packages/Table/components/Button/index.vue +0 -61
  217. package/packages/Table/components/Formatter/index.vue +0 -26
  218. package/packages/Table/index.d.ts +0 -0
  219. package/packages/Table/index.ts +0 -8
  220. package/packages/Table/index.vue +0 -133
  221. package/packages/TreeMap/index.ts +0 -8
  222. package/packages/TreeMap/index.vue +0 -186
  223. package/packages/User/components/EditInfoDialog/Mobile.vue +0 -214
  224. package/packages/User/components/EditInfoDialog/index.vue +0 -161
  225. package/packages/User/components/EditPasswordDialog.vue +0 -168
  226. package/packages/User/components/SetPasswordDialog.vue +0 -160
  227. package/packages/User/index.ts +0 -8
  228. package/packages/User/index.vue +0 -117
  229. package/packages/VarSelectDialog/Mock.js +0 -495
  230. package/packages/VarSelectDialog/VarietySelect.vue +0 -78
  231. package/packages/VarSelectDialog/index.ts +0 -8
  232. package/packages/VarSelectDialog/index.vue +0 -323
  233. package/packages/VarietyAiHelper/images/like.png +0 -0
  234. package/packages/VarietyAiHelper/images/like_no.png +0 -0
  235. package/packages/VarietyAiHelper/index.ts +0 -8
  236. package/packages/VarietyAiHelper/index.vue +0 -910
  237. package/packages/VarietyAutoComplete/index.ts +0 -8
  238. package/packages/VarietyAutoComplete/index.vue +0 -89
  239. package/packages/VarietySearch/components/AddTag/index.vue +0 -268
  240. package/packages/VarietySearch/components/CommonIndicator/IndicatorTags.vue +0 -52
  241. package/packages/VarietySearch/components/CommonIndicator/index.vue +0 -697
  242. package/packages/VarietySearch/components/CommonIndicator/tools.js +0 -260
  243. package/packages/VarietySearch/components/CompositeOrder/index.vue +0 -260
  244. package/packages/VarietySearch/components/FactorScreen/FactorDescription.vue +0 -70
  245. package/packages/VarietySearch/components/FactorScreen/index.vue +0 -1158
  246. package/packages/VarietySearch/components/FactorScreen/tools.js +0 -34
  247. package/packages/VarietySearch/config.js +0 -539
  248. package/packages/VarietySearch/index.ts +0 -8
  249. package/packages/VarietySearch/index.vue +0 -688
  250. package/packages/VarietyTextCopy/index.ts +0 -8
  251. package/packages/VarietyTextCopy/index.vue +0 -136
  252. package/packages/VirtualTable/index.ts +0 -8
  253. package/packages/VirtualTable/index.vue +0 -241
  254. package/packages/index.ts +0 -59
  255. package/public/aiTools.js +0 -176
  256. package/public/talib.wasm +0 -0
  257. package/public/vite.svg +0 -1
  258. package/src/App.vue +0 -140
  259. package/src/assets/vue.svg +0 -1
  260. package/src/components/Dialog/index.vue +0 -16
  261. package/src/components/Kline/index.vue +0 -21
  262. package/src/components/Table/index.vue +0 -27
  263. package/src/main.ts +0 -17
  264. package/src/pages/ChartLayout/index.vue +0 -22
  265. package/src/pages/ConfigProvider/index.vue +0 -9
  266. package/src/pages/Contextmenu/index.vue +0 -46
  267. package/src/pages/CustomFunction/index.vue +0 -13
  268. package/src/pages/FactorWarning/index.vue +0 -203
  269. package/src/pages/HeatMap/index.vue +0 -128
  270. package/src/pages/Kline/index.vue +0 -12
  271. package/src/pages/KlineBasic/api.js +0 -48
  272. package/src/pages/KlineBasic/index.vue +0 -366
  273. package/src/pages/KlineBasic/indicator.js +0 -114
  274. package/src/pages/KlineConfig/index.vue +0 -20
  275. package/src/pages/KlineNew/components/KlineAction/components/ContextMenu/index.vue +0 -91
  276. package/src/pages/KlineNew/components/KlineAction/components/YearChart/index.vue +0 -532
  277. package/src/pages/KlineNew/components/KlineAction/images/pen.png +0 -0
  278. package/src/pages/KlineNew/components/KlineAction/index.vue +0 -716
  279. package/src/pages/KlineNew/components/KlineAction/mockApi/index.js +0 -13
  280. package/src/pages/KlineNew/components/KlineAction/utils.js +0 -571
  281. package/src/pages/KlineNew/components/KlineBasic/index.vue +0 -336
  282. package/src/pages/KlineNew/components/KlineBasic/utils.js +0 -46
  283. package/src/pages/KlineNew/components/KlineNew/index.vue +0 -316
  284. package/src/pages/KlineNew/components/KlineNew/utils.js +0 -31
  285. package/src/pages/KlineNew/components/KlineSlide/index.vue +0 -448
  286. package/src/pages/KlineNew/components/KlineSlide/utils.js +0 -78
  287. package/src/pages/KlineNew/components/KlineSlideNew/index.vue +0 -430
  288. package/src/pages/KlineNew/components/KlineSlideNew/utils.js +0 -78
  289. package/src/pages/KlineNew/index.vue +0 -92
  290. package/src/pages/KlinePlus/KlineDialog/MultiCycle.vue +0 -312
  291. package/src/pages/KlinePlus/KlineDialog/api.js +0 -108
  292. package/src/pages/KlinePlus/KlineDialog/index.vue +0 -582
  293. package/src/pages/KlinePlus/KlineDialog/indicator.js +0 -109
  294. package/src/pages/KlinePlus/KlineDialog/tools.js +0 -86
  295. package/src/pages/KlinePlus/index.vue +0 -30
  296. package/src/pages/KlinePlus/tradeLogMock.js +0 -1927
  297. package/src/pages/LinearLegend/index.vue +0 -92
  298. package/src/pages/Map/index.vue +0 -62
  299. package/src/pages/MonacoEditor/index.vue +0 -63
  300. package/src/pages/Pagination/index.vue +0 -24
  301. package/src/pages/PasswordPrompt/index.vue +0 -12
  302. package/src/pages/Pie/index.vue +0 -36
  303. package/src/pages/Table/index.vue +0 -117
  304. package/src/pages/TreeMap/index.vue +0 -542
  305. package/src/pages/User/index.vue +0 -24
  306. package/src/pages/VarSelectDialog/index.vue +0 -16
  307. package/src/pages/VarietyAiHelper/index.vue +0 -20
  308. package/src/pages/VarietyAutoComplete/index.vue +0 -19
  309. package/src/pages/VarietySearch/api.js +0 -70
  310. package/src/pages/VarietySearch/index.vue +0 -467
  311. package/src/pages/VarietyTextCopy/index.vue +0 -24
  312. package/src/pages/VirtualTable/demo.json +0 -6377
  313. package/src/pages/VirtualTable/index.vue +0 -79
  314. package/src/router/index.ts +0 -9
  315. package/src/router/routes.ts +0 -132
  316. package/src/style.css +0 -79
  317. package/src/vite-env.d.ts +0 -9
  318. package/tsconfig.json +0 -30
  319. package/tsconfig.node.json +0 -10
@@ -1,706 +0,0 @@
1
- <script setup>
2
- import { ref, h, inject, watch, reactive, nextTick, computed } from "vue";
3
- import { Close, DocumentCopy, Delete, Document } from "@element-plus/icons-vue";
4
- import { debounce } from "st-func";
5
-
6
- const { request } = inject("stConfig"); // 组件库全局配置
7
- const stMonacoEditorRef = ref(null);
8
- const stVarSelectDialogRef = ref(null);
9
-
10
- const emit = defineEmits(["refreshData"]);
11
- const props = defineProps({
12
- data: {
13
- type: Array,
14
- default: () => [],
15
- },
16
- });
17
-
18
- const visible = ref(false);
19
- const loading = reactive({
20
- save: false,
21
- test: false,
22
- });
23
-
24
- // 函数相关参数
25
- const funcKeyWord = ref(null);
26
- const funcList = computed(() => {
27
- if (funcKeyWord.value) {
28
- return props.data.filter((item) => item.funcName.includes(funcKeyWord.value));
29
- } else {
30
- return props.data;
31
- }
32
- });
33
- const ruleForm = reactive({
34
- id: null,
35
- funcName: "",
36
- funcExpression: "",
37
- });
38
-
39
- // 测试日志相关参数
40
- const testResult = reactive({
41
- result: null,
42
- detail: "",
43
- code: "",
44
- });
45
- const testLogVisible = ref(false);
46
-
47
- // 函数: 新建
48
- const handleAdd = () => {
49
- Object.assign(ruleForm, {
50
- id: null,
51
- funcName: "",
52
- funcExpression: "",
53
- });
54
- stMonacoEditorRef.value?.setValue(ruleForm.funcExpression);
55
- };
56
- // 函数: 编辑
57
- const handleEdit = (item) => {
58
- Object.assign(ruleForm, {
59
- id: item.id,
60
- funcName: item.funcName,
61
- funcExpression: item.funcExpression,
62
- });
63
- stMonacoEditorRef.value?.setValue(ruleForm.funcExpression);
64
- };
65
- // 函数: 复制
66
- const handleCopy = (item) => {
67
- Object.assign(ruleForm, {
68
- id: null,
69
- funcName: `${item.funcName}-复制`,
70
- funcExpression: item.funcExpression,
71
- });
72
- stMonacoEditorRef.value?.setValue(ruleForm.funcExpression);
73
- };
74
-
75
- // 函数: 删除
76
- const handleDelete = async (item) => {
77
- // 如果删除的是当前正在操作的自定义函数, 则需要清空表单
78
- if (item.id === ruleForm.id) {
79
- Object.assign(ruleForm, {
80
- id: null,
81
- funcName: "",
82
- funcExpression: "",
83
- });
84
- stMonacoEditorRef.value?.setValue(ruleForm.funcExpression);
85
- }
86
- await request.post("/common/qt/deleteSearchFunctionById", { id: item.id });
87
- emit("refreshData");
88
- };
89
- // 函数: 保存
90
- const handleSave = debounce(async () => {
91
- try {
92
- loading.save = true;
93
- ruleForm.funcExpression = stMonacoEditorRef.value.getValue();
94
- // 校验
95
- if (!ruleForm.funcName) return ElMessage.error("函数名称不可为空");
96
- if (!ruleForm.funcExpression) return ElMessage.error("函数内容不可为空");
97
- // 调用接口
98
- await request.post("/common/qt/saveOrUpdateSearchFunction", ruleForm);
99
- ElMessage.success("操作成功");
100
- emit("refreshData");
101
- // 如果是复制, 或者新建则清空当前表单
102
- if (!ruleForm.id) handleAdd();
103
- } finally {
104
- loading.save = false;
105
- }
106
- });
107
-
108
- // 测试: 生成变量key和value的输入框
109
- const showVariableInputDialog = (variables) => {
110
- return new Promise((resolve) => {
111
- const formData = ref(
112
- variables.reduce((obj, variable) => {
113
- obj[variable] = "";
114
- return obj;
115
- }, {}),
116
- );
117
- const errors = ref({});
118
-
119
- // 验证函数
120
- const validateForm = () => {
121
- let isValid = true;
122
- const newErrors = {};
123
-
124
- variables.forEach((variable) => {
125
- if (!formData.value[variable]?.trim()) {
126
- newErrors[variable] = `请输入${variable}的值`;
127
- isValid = false;
128
- }
129
- });
130
-
131
- errors.value = newErrors;
132
- return isValid;
133
- };
134
- // h语法表单组件
135
- const FormComponent = {
136
- setup() {
137
- return () =>
138
- h("div", [
139
- h(
140
- ElForm,
141
- {
142
- model: formData.value,
143
- },
144
- () =>
145
- variables.map((variable) =>
146
- h(
147
- ElFormItem,
148
- {
149
- label: `${variable}: `,
150
- prop: variable,
151
- error: errors.value[variable],
152
- "label-width": "90px",
153
- },
154
- () =>
155
- h(ElInput, {
156
- modelValue: formData.value[variable],
157
- "onUpdate:modelValue": (val) => {
158
- formData.value[variable] = val;
159
- // 清除错误状态
160
- if (errors.value[variable]) delete errors.value[variable];
161
- },
162
- placeholder: `请输入 ${variable} 的值`,
163
- status: errors.value[variable] ? "error" : "",
164
- }),
165
- ),
166
- ),
167
- ),
168
- ]);
169
- },
170
- };
171
- ElMessageBox({
172
- title: "填写变量值用于接口测试",
173
- message: h(FormComponent),
174
- showCancelButton: true,
175
- confirmButtonText: "确定",
176
- cancelButtonText: "取消",
177
- customClass: "variable-input-dialog",
178
- beforeClose: async (action, instance, done) => {
179
- if (action !== "confirm") {
180
- resolve(false);
181
- done();
182
- }
183
- await nextTick();
184
- if (validateForm()) {
185
- resolve({ ...formData.value });
186
- done();
187
- }
188
- },
189
- }).catch(() => resolve(false));
190
- });
191
- };
192
- const extractVariables = (expression) => {
193
- const regex = /\$\{([^}]*)\}/g;
194
- const matches = [];
195
- let match;
196
-
197
- while ((match = regex.exec(expression)) !== null) {
198
- matches.push(match[1]);
199
- }
200
-
201
- return [...new Set(matches)];
202
- };
203
- const replaceVariables = (expression, variableValues) => {
204
- return expression.replace(/\$\{([^}]*)\}/g, (match, variableName) => {
205
- return variableValues[variableName] !== undefined ? variableValues[variableName] : match;
206
- });
207
- };
208
- // 测试: 提交/日志
209
- const handleTest = async (action) => {
210
- switch (action) {
211
- case "submit": {
212
- let testContent = stMonacoEditorRef.value.getValue();
213
- if (!testContent) return ElMessage.error("函数内容不可为空");
214
- // 检测函数中是否使用的变量语法, 如果包含, 需要用户二次输入对应的值, 将其替换后进行测试
215
- if (/\$\{[^}]*\}/.test(testContent)) {
216
- const variables = extractVariables(testContent);
217
- const variableValues = await showVariableInputDialog(variables);
218
- if (!variableValues) return;
219
- testContent = replaceVariables(testContent, variableValues);
220
- }
221
- try {
222
- loading.test = true;
223
- const { body } = await request.post("/common/qt/testFactorSelect", { factorSelectExpr: testContent });
224
- const { result, detail } = body;
225
- Object.assign(testResult, { result, detail, code: testContent });
226
- if (result === 1) {
227
- ElMessage.success("测试通过");
228
- } else {
229
- ElMessage.error("测试未能通过");
230
- testLogVisible.value = true;
231
- }
232
- } finally {
233
- loading.test = false;
234
- }
235
- break;
236
- }
237
- case "log": {
238
- if (testResult.result === null) {
239
- return ElMessage.warning("请先进行测试, 等待测试完成后可查看日志");
240
- }
241
- testLogVisible.value = true;
242
- break;
243
- }
244
- }
245
- };
246
-
247
- // 变量选择器
248
- const handleOpenVarSelectDialog = () => {
249
- stVarSelectDialogRef.value.open(stMonacoEditorRef.value);
250
- };
251
- // 监视: 窗口开关
252
- watch(
253
- () => visible.value,
254
- (newValue) => {
255
- if (!newValue) {
256
- // 确保内嵌窗口全部关闭
257
- stVarSelectDialogRef.value.close();
258
- testLogVisible.value = false;
259
- }
260
- },
261
- );
262
- defineExpose({
263
- open: (params) => {
264
- visible.value = true;
265
- // 进行一些窗口内初始化操作
266
- nextTick(() => {
267
- stMonacoEditorRef.value?.resize();
268
- // 重置函数关键字
269
- funcKeyWord.value = null;
270
- // 重置测试结果
271
- Object.assign(testResult, {
272
- result: null,
273
- detail: "",
274
- code: "",
275
- });
276
- // 根据入参判断, 去赋值表单默认值
277
- if (params) {
278
- const item = {
279
- id: params.id,
280
- funcName: params.funcName,
281
- funcExpression: params.funcExpression,
282
- };
283
- handleEdit(item);
284
- } else {
285
- funcList.value.length ? handleEdit(funcList.value[0]) : handleAdd();
286
- }
287
- });
288
- },
289
- });
290
- </script>
291
-
292
- <template>
293
- <el-dialog
294
- modal-class="manage-dialog"
295
- v-model="visible"
296
- width="1600"
297
- align-center
298
- append-to-body
299
- overflow
300
- :modal="false"
301
- :modal-penetrable="true"
302
- :show-close="false"
303
- >
304
- <template #header="{ titleId, titleClass }">
305
- <div class="custom-header">
306
- <div class="left">
307
- <span
308
- :id="titleId"
309
- :class="titleClass"
310
- >
311
- 自定义函数管理面板
312
- </span>
313
- </div>
314
- <div class="right">
315
- <el-icon @click="visible = false"><Close /></el-icon>
316
- </div>
317
- </div>
318
- </template>
319
- <div class="manage-dialog-body">
320
- <!-- 函数列表 -->
321
- <div class="func-list">
322
- <div class="search">
323
- <span>输入函数关键字</span>
324
- <el-input
325
- v-model="funcKeyWord"
326
- clearable
327
- />
328
- <el-button
329
- type="primary"
330
- @click="handleAdd"
331
- >新建</el-button
332
- >
333
- </div>
334
- <el-scrollbar class="list">
335
- <template v-if="funcList.length">
336
- <div
337
- v-for="item in funcList"
338
- :key="item.id"
339
- :class="{ 'active-list-item': ruleForm.id === item.id }"
340
- class="list-item"
341
- >
342
- <span
343
- class="func-name"
344
- @click="handleEdit(item)"
345
- >{{ item.funcName }}</span
346
- >
347
- <div class="icon-box">
348
- <el-icon>
349
- <DocumentCopy @click="handleCopy(item)" />
350
- </el-icon>
351
- <el-popconfirm
352
- :title="`确认是否删除?`"
353
- confirm-button-text="确认"
354
- cancel-button-text="取消"
355
- @confirm="handleDelete(item)"
356
- >
357
- <template #reference>
358
- <el-icon @click.stop="() => {}"> <Delete /> </el-icon>
359
- </template>
360
- </el-popconfirm>
361
- </div>
362
- </div>
363
- </template>
364
- <el-empty
365
- v-else
366
- description="暂无数据"
367
- />
368
- </el-scrollbar>
369
- </div>
370
- <!-- 函数表单 -->
371
- <div class="rule-form">
372
- <div class="header">
373
- <span>函数名称:</span>
374
- <el-input v-model="ruleForm.funcName" />
375
- <div class="right">
376
- <el-button
377
- type="primary"
378
- @click="handleSave"
379
- :loading="loading.save"
380
- >
381
- 保存
382
- </el-button>
383
- <el-button
384
- :loading="loading.test"
385
- @click="handleTest('submit')"
386
- >
387
- 测试
388
- </el-button>
389
- <el-button
390
- :icon="Document"
391
- @click="handleTest('log')"
392
- >
393
- 日志明细
394
- </el-button>
395
- <el-button
396
- type="primary"
397
- @click="handleOpenVarSelectDialog"
398
- >
399
- 变量选择器
400
- </el-button>
401
- </div>
402
- </div>
403
- <!-- 注意事项 -->
404
- <div class="tip-box">说明: 公式里可以使用变量, 变量名命名格式: ${变量名}, 后续可在应用函数时填写具体值, 系统会自动换算</div>
405
- <!-- 内容 -->
406
- <st-monacoEditor
407
- ref="stMonacoEditorRef"
408
- :language="'lua'"
409
- style="width: 100%; height: calc(80vh - 75px)"
410
- />
411
- </div>
412
- </div>
413
-
414
- <!-- 变量选择器 -->
415
- <st-varSelectDialog ref="stVarSelectDialogRef" />
416
-
417
- <!-- 窗口: 日志明细 -->
418
- <el-dialog
419
- modal-class="log-dialog"
420
- v-model="testLogVisible"
421
- width="830"
422
- align-center
423
- append-to-body
424
- draggable
425
- overflow
426
- :modal="false"
427
- :modal-penetrable="true"
428
- :show-close="false"
429
- >
430
- <template #header="{ titleId, titleClass }">
431
- <div class="custom-header">
432
- <div class="left">
433
- <span
434
- :id="titleId"
435
- :class="titleClass"
436
- >
437
- 日志明细
438
- </span>
439
- </div>
440
- <!-- 关闭 -->
441
- <div class="right">
442
- <el-icon @click="testLogVisible = false"><Close /></el-icon>
443
- </div>
444
- </div>
445
- </template>
446
- <div class="content">
447
- <!-- 代码 -->
448
- <el-scrollbar
449
- class="code"
450
- height="600px"
451
- >
452
- <pre>{{ testResult.code }}</pre>
453
- </el-scrollbar>
454
- <!-- 分割线 -->
455
- <el-divider direction="vertical" />
456
- <!-- 日志 -->
457
- <el-scrollbar height="600px">
458
- <pre :class="testResult.result === 1 ? 'success-log' : 'error-log'">{{ testResult.result === 1 ? `✅️ 测试通过\n${testResult.detail}` : testResult.detail }}</pre>
459
- </el-scrollbar>
460
- </div>
461
- <!-- 底部 -->
462
- <template #footer>
463
- <div class="dialog-footer">
464
- <el-button @click="testLogVisible = false"> 关闭 </el-button>
465
- </div>
466
- </template>
467
- </el-dialog>
468
- </el-dialog>
469
- </template>
470
-
471
- <style lang="scss" scoped>
472
- .manage-dialog {
473
- .custom-header {
474
- display: flex;
475
- align-items: center;
476
- justify-content: space-between;
477
- .left,
478
- .right {
479
- display: flex;
480
- align-items: center;
481
- gap: 10px;
482
- }
483
- .el-icon {
484
- cursor: pointer;
485
- }
486
- }
487
- .manage-dialog-body {
488
- height: 80vh;
489
- display: flex;
490
- align-items: center;
491
- .func-list {
492
- height: 100%;
493
- width: 400px;
494
- display: flex;
495
- flex-direction: column;
496
- box-sizing: border-box;
497
- padding-right: 10px;
498
- border-right: var(--el-border);
499
- .search {
500
- display: flex;
501
- align-items: center;
502
- justify-content: space-between;
503
- margin-bottom: 10px;
504
- .el-input {
505
- flex: 1;
506
- margin: 0 10px;
507
- }
508
- }
509
- .list {
510
- width: 100%;
511
- height: 100%;
512
- .list-item {
513
- font-size: 16px;
514
- width: 100%;
515
- display: flex;
516
- align-items: center;
517
- justify-content: space-between;
518
- position: relative;
519
- border-radius: 4px;
520
- &:hover {
521
- background-color: #d9e7ff;
522
- }
523
- &::before {
524
- content: "";
525
- position: absolute;
526
- left: -30px;
527
- top: calc(50% - 2px);
528
- width: 30px;
529
- height: 16px;
530
- background: var(--el-color-primary);
531
- clip-path: polygon(
532
- 0% 0%,
533
- // 左上角
534
- 50% 0%,
535
- // 右上角缺点
536
- 100% 100%,
537
- // 缺点终点
538
- 100% 100%,
539
- // 右下角
540
- 0% 100% // 左下角
541
- );
542
- transform: translateY(-50%);
543
- transition: all 0.25s ease;
544
- }
545
- .func-name {
546
- line-height: 32px;
547
- flex: 1;
548
- box-sizing: border-box;
549
- overflow: hidden;
550
- white-space: nowrap;
551
- text-overflow: ellipsis;
552
- transition: all 0.25s ease;
553
- cursor: pointer;
554
- &:hover {
555
- color: var(--el-color-primary);
556
- }
557
- }
558
- .icon-box {
559
- font-size: 18px;
560
- height: 20px;
561
- padding-right: 10px;
562
- .el-icon {
563
- margin-left: 6px;
564
- cursor: pointer;
565
- &:hover {
566
- color: var(--el-color-primary);
567
- }
568
- }
569
- .delete {
570
- &:hover {
571
- color: var(--el-color-danger);
572
- }
573
- }
574
- }
575
- }
576
- .active-list-item {
577
- &::before {
578
- left: 0;
579
- }
580
- &::after {
581
- content: "";
582
- position: absolute;
583
- bottom: 0;
584
- left: 0;
585
- width: 100%;
586
- height: 2px;
587
- background: var(--el-color-primary);
588
- transform: scaleX(0);
589
- transform-origin: left center;
590
- animation: borderGrow 0.25s ease forwards;
591
- }
592
- .func-name {
593
- color: var(--el-color-primary);
594
- font-weight: bold;
595
- padding-left: 34px;
596
- }
597
- }
598
- @keyframes borderGrow {
599
- from {
600
- transform: scaleX(0);
601
- }
602
- to {
603
- transform: scaleX(1);
604
- }
605
- }
606
- }
607
- }
608
- .rule-form {
609
- flex: 1;
610
- height: 100%;
611
- box-sizing: border-box;
612
- padding-left: 10px;
613
- .header {
614
- width: 100%;
615
- display: flex;
616
- align-items: center;
617
- gap: 10px;
618
- margin-bottom: 10px;
619
- .el-input {
620
- flex: 1;
621
- }
622
- }
623
- .tip-box {
624
- box-sizing: border-box;
625
- padding: 4px 0 4px 8px;
626
- margin-bottom: 4px;
627
- border-left: 6px solid var(--el-color-info);
628
- background-color: var(--el-color-info-light-8);
629
- }
630
- .el-empty {
631
- height: 100%;
632
- }
633
- }
634
- }
635
- }
636
- .test-variety-dialog {
637
- .custom-header {
638
- display: flex;
639
- align-items: center;
640
- justify-content: space-between;
641
- .left,
642
- .right {
643
- display: flex;
644
- align-items: center;
645
- gap: 10px;
646
- }
647
- .el-icon {
648
- cursor: pointer;
649
- }
650
- }
651
- .full-height-textarea {
652
- width: 100%;
653
- height: 200px;
654
- margin-top: 10px;
655
- :deep(.el-textarea__inner) {
656
- box-sizing: border-box;
657
- height: 100%;
658
- }
659
- }
660
- }
661
- .log-dialog {
662
- .custom-header {
663
- display: flex;
664
- align-items: center;
665
- justify-content: space-between;
666
- .left,
667
- .right {
668
- display: flex;
669
- align-items: center;
670
- gap: 10px;
671
- }
672
- .el-icon {
673
- cursor: pointer;
674
- }
675
- }
676
- .content {
677
- display: flex;
678
- background-color: var(--el-color-black);
679
- .el-scrollbar {
680
- flex: 1;
681
- box-sizing: border-box;
682
- padding: 8px;
683
- }
684
- .el-divider {
685
- margin: 0;
686
- height: 616px;
687
- }
688
- .code {
689
- color: var(--el-color-info);
690
- }
691
- .success-log {
692
- color: var(--el-color-success);
693
- }
694
- .error-log {
695
- color: var(--el-color-danger);
696
- }
697
- pre {
698
- margin: 0;
699
- line-height: 1.5;
700
- white-space: pre-wrap;
701
- word-break: break-all;
702
- word-wrap: break-word;
703
- }
704
- }
705
- }
706
- </style>
@@ -1,8 +0,0 @@
1
- import { App } from "vue";
2
- import StCustomFunction from "./index.vue";
3
-
4
- export default {
5
- install(app: App) {
6
- app.component("st-customFunction", StCustomFunction);
7
- },
8
- }