fdb2 1.0.13 → 1.0.15

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 (313) hide show
  1. package/README.md +9 -2
  2. package/bin/docker/.env +4 -0
  3. package/package.json +26 -18
  4. package/public/favicon.ico +0 -0
  5. package/public/favicon.png +0 -0
  6. package/view/modules/header.tpl +1 -1
  7. package/.dockerignore +0 -21
  8. package/.editorconfig +0 -11
  9. package/.eslintrc.cjs +0 -14
  10. package/.eslintrc.json +0 -7
  11. package/.prettierrc.js +0 -3
  12. package/.tpl.env +0 -22
  13. package/.vscodeignore +0 -45
  14. package/dist/package.json +0 -115
  15. package/dist/pnpm-lock.yaml +0 -8135
  16. package/dist/public/.vite/manifest.json +0 -82
  17. package/dist/public/bootstrap-icons.woff +0 -0
  18. package/dist/public/bootstrap-icons.woff2 +0 -0
  19. package/dist/public/bootstrap.css +0 -14152
  20. package/dist/public/bootstrap.js +0 -5038
  21. package/dist/public/explorer.css +0 -2379
  22. package/dist/public/explorer.js +0 -50586
  23. package/dist/public/index.css +0 -1099
  24. package/dist/public/index.js +0 -12862
  25. package/dist/public/layout.css +0 -318
  26. package/dist/public/layout.js +0 -25
  27. package/dist/public/vue.css +0 -1
  28. package/dist/public/vue.js +0 -9110
  29. package/dist/scripts/preinstall.js +0 -112
  30. package/dist/server/index.d.ts +0 -2
  31. package/dist/server/index.d.ts.map +0 -1
  32. package/dist/server/index.js +0 -601
  33. package/dist/server/index.js.map +0 -1
  34. package/dist/server/index.ts +0 -681
  35. package/dist/server/model/connection.entity.d.ts +0 -55
  36. package/dist/server/model/connection.entity.d.ts.map +0 -1
  37. package/dist/server/model/connection.entity.js +0 -59
  38. package/dist/server/model/connection.entity.js.map +0 -1
  39. package/dist/server/model/connection.entity.ts +0 -66
  40. package/dist/server/model/database.entity.d.ts +0 -203
  41. package/dist/server/model/database.entity.d.ts.map +0 -1
  42. package/dist/server/model/database.entity.js +0 -211
  43. package/dist/server/model/database.entity.js.map +0 -1
  44. package/dist/server/model/database.entity.ts +0 -246
  45. package/dist/server/service/connection.service.d.ts +0 -84
  46. package/dist/server/service/connection.service.d.ts.map +0 -1
  47. package/dist/server/service/connection.service.js +0 -369
  48. package/dist/server/service/connection.service.js.map +0 -1
  49. package/dist/server/service/connection.service.ts +0 -359
  50. package/dist/server/service/database/base.service.d.ts +0 -183
  51. package/dist/server/service/database/base.service.d.ts.map +0 -1
  52. package/dist/server/service/database/base.service.js +0 -253
  53. package/dist/server/service/database/base.service.js.map +0 -1
  54. package/dist/server/service/database/base.service.ts +0 -407
  55. package/dist/server/service/database/cockroachdb.service.d.ts +0 -116
  56. package/dist/server/service/database/cockroachdb.service.d.ts.map +0 -1
  57. package/dist/server/service/database/cockroachdb.service.js +0 -812
  58. package/dist/server/service/database/cockroachdb.service.js.map +0 -1
  59. package/dist/server/service/database/cockroachdb.service.ts +0 -871
  60. package/dist/server/service/database/database.service.d.ts +0 -495
  61. package/dist/server/service/database/database.service.d.ts.map +0 -1
  62. package/dist/server/service/database/database.service.js +0 -711
  63. package/dist/server/service/database/database.service.js.map +0 -1
  64. package/dist/server/service/database/database.service.ts +0 -776
  65. package/dist/server/service/database/index.d.ts +0 -8
  66. package/dist/server/service/database/index.d.ts.map +0 -1
  67. package/dist/server/service/database/index.js +0 -18
  68. package/dist/server/service/database/index.js.map +0 -1
  69. package/dist/server/service/database/index.ts +0 -7
  70. package/dist/server/service/database/mongodb.service.d.ts +0 -121
  71. package/dist/server/service/database/mongodb.service.d.ts.map +0 -1
  72. package/dist/server/service/database/mongodb.service.js +0 -502
  73. package/dist/server/service/database/mongodb.service.js.map +0 -1
  74. package/dist/server/service/database/mongodb.service.ts +0 -501
  75. package/dist/server/service/database/mssql.service.d.ts +0 -118
  76. package/dist/server/service/database/mssql.service.d.ts.map +0 -1
  77. package/dist/server/service/database/mssql.service.js +0 -871
  78. package/dist/server/service/database/mssql.service.js.map +0 -1
  79. package/dist/server/service/database/mssql.service.ts +0 -932
  80. package/dist/server/service/database/mysql.service.d.ts +0 -114
  81. package/dist/server/service/database/mysql.service.d.ts.map +0 -1
  82. package/dist/server/service/database/mysql.service.js +0 -960
  83. package/dist/server/service/database/mysql.service.js.map +0 -1
  84. package/dist/server/service/database/mysql.service.ts +0 -1026
  85. package/dist/server/service/database/oracle.service.d.ts +0 -126
  86. package/dist/server/service/database/oracle.service.d.ts.map +0 -1
  87. package/dist/server/service/database/oracle.service.js +0 -963
  88. package/dist/server/service/database/oracle.service.js.map +0 -1
  89. package/dist/server/service/database/oracle.service.ts +0 -1036
  90. package/dist/server/service/database/postgres.service.d.ts +0 -122
  91. package/dist/server/service/database/postgres.service.d.ts.map +0 -1
  92. package/dist/server/service/database/postgres.service.js +0 -882
  93. package/dist/server/service/database/postgres.service.js.map +0 -1
  94. package/dist/server/service/database/postgres.service.ts +0 -961
  95. package/dist/server/service/database/sap.service.d.ts +0 -115
  96. package/dist/server/service/database/sap.service.d.ts.map +0 -1
  97. package/dist/server/service/database/sap.service.js +0 -868
  98. package/dist/server/service/database/sap.service.js.map +0 -1
  99. package/dist/server/service/database/sap.service.ts +0 -922
  100. package/dist/server/service/database/sqlite.service.d.ts +0 -112
  101. package/dist/server/service/database/sqlite.service.d.ts.map +0 -1
  102. package/dist/server/service/database/sqlite.service.js +0 -723
  103. package/dist/server/service/database/sqlite.service.js.map +0 -1
  104. package/dist/server/service/database/sqlite.service.ts +0 -787
  105. package/dist/server/service/session.service.ts +0 -158
  106. package/dist/view/index.html +0 -45
  107. package/env.d.ts +0 -1
  108. package/packages/vscode/.vscodeignore +0 -44
  109. package/packages/vscode/README.md +0 -62
  110. package/packages/vscode/out/database-services/base.service.js +0 -236
  111. package/packages/vscode/out/database-services/base.service.js.map +0 -1
  112. package/packages/vscode/out/database-services/cockroachdb.service.js +0 -634
  113. package/packages/vscode/out/database-services/cockroachdb.service.js.map +0 -1
  114. package/packages/vscode/out/database-services/connection.service.js +0 -346
  115. package/packages/vscode/out/database-services/connection.service.js.map +0 -1
  116. package/packages/vscode/out/database-services/database.service.js +0 -571
  117. package/packages/vscode/out/database-services/database.service.js.map +0 -1
  118. package/packages/vscode/out/database-services/index.js +0 -18
  119. package/packages/vscode/out/database-services/index.js.map +0 -1
  120. package/packages/vscode/out/database-services/model/connection.entity.js +0 -11
  121. package/packages/vscode/out/database-services/model/connection.entity.js.map +0 -1
  122. package/packages/vscode/out/database-services/model/database.entity.js +0 -35
  123. package/packages/vscode/out/database-services/model/database.entity.js.map +0 -1
  124. package/packages/vscode/out/database-services/mongodb.service.js +0 -458
  125. package/packages/vscode/out/database-services/mongodb.service.js.map +0 -1
  126. package/packages/vscode/out/database-services/mssql.service.js +0 -694
  127. package/packages/vscode/out/database-services/mssql.service.js.map +0 -1
  128. package/packages/vscode/out/database-services/mysql.service.js +0 -735
  129. package/packages/vscode/out/database-services/mysql.service.js.map +0 -1
  130. package/packages/vscode/out/database-services/oracle.service.js +0 -787
  131. package/packages/vscode/out/database-services/oracle.service.js.map +0 -1
  132. package/packages/vscode/out/database-services/postgres.service.js +0 -696
  133. package/packages/vscode/out/database-services/postgres.service.js.map +0 -1
  134. package/packages/vscode/out/database-services/sap.service.js +0 -695
  135. package/packages/vscode/out/database-services/sap.service.js.map +0 -1
  136. package/packages/vscode/out/database-services/sqlite.service.js +0 -532
  137. package/packages/vscode/out/database-services/sqlite.service.js.map +0 -1
  138. package/packages/vscode/out/extension.js +0 -93
  139. package/packages/vscode/out/extension.js.map +0 -1
  140. package/packages/vscode/out/provider/DatabaseTreeProvider.js +0 -159
  141. package/packages/vscode/out/provider/DatabaseTreeProvider.js.map +0 -1
  142. package/packages/vscode/out/provider/WebViewProvider.js +0 -259
  143. package/packages/vscode/out/provider/WebViewProvider.js.map +0 -1
  144. package/packages/vscode/out/service/ConnectionManager.js +0 -105
  145. package/packages/vscode/out/service/ConnectionManager.js.map +0 -1
  146. package/packages/vscode/out/service/DatabaseServiceBridge.js +0 -395
  147. package/packages/vscode/out/service/DatabaseServiceBridge.js.map +0 -1
  148. package/packages/vscode/out/typings/connection.js +0 -3
  149. package/packages/vscode/out/typings/connection.js.map +0 -1
  150. package/packages/vscode/package.json +0 -144
  151. package/packages/vscode/resources/icon.svg +0 -5
  152. package/packages/vscode/resources/webview/_plugin-vue_export-helper.js +0 -6529
  153. package/packages/vscode/resources/webview/_plugin-vue_export-helper.js.map +0 -1
  154. package/packages/vscode/resources/webview/connection.css +0 -69
  155. package/packages/vscode/resources/webview/connection.js +0 -228
  156. package/packages/vscode/resources/webview/connection.js.map +0 -1
  157. package/packages/vscode/resources/webview/database.css +0 -259
  158. package/packages/vscode/resources/webview/database.js +0 -275
  159. package/packages/vscode/resources/webview/database.js.map +0 -1
  160. package/packages/vscode/resources/webview/favicon.ico +0 -0
  161. package/packages/vscode/resources/webview/index.html +0 -9
  162. package/packages/vscode/resources/webview/modules/header.tpl +0 -14
  163. package/packages/vscode/resources/webview/modules/initial_state.tpl +0 -55
  164. package/packages/vscode/resources/webview/query.css +0 -162
  165. package/packages/vscode/resources/webview/query.js +0 -198
  166. package/packages/vscode/resources/webview/query.js.map +0 -1
  167. package/packages/vscode/src/database-services/base.service.js.map +0 -1
  168. package/packages/vscode/src/database-services/base.service.ts +0 -363
  169. package/packages/vscode/src/database-services/cockroachdb.service.js.map +0 -1
  170. package/packages/vscode/src/database-services/cockroachdb.service.ts +0 -659
  171. package/packages/vscode/src/database-services/connection.service.ts +0 -341
  172. package/packages/vscode/src/database-services/database.service.ts +0 -630
  173. package/packages/vscode/src/database-services/index.ts +0 -7
  174. package/packages/vscode/src/database-services/model/connection.entity.js +0 -11
  175. package/packages/vscode/src/database-services/model/connection.entity.js.map +0 -1
  176. package/packages/vscode/src/database-services/model/connection.entity.ts +0 -66
  177. package/packages/vscode/src/database-services/model/database.entity.js +0 -35
  178. package/packages/vscode/src/database-services/model/database.entity.js.map +0 -1
  179. package/packages/vscode/src/database-services/model/database.entity.ts +0 -246
  180. package/packages/vscode/src/database-services/mongodb.service.js.map +0 -1
  181. package/packages/vscode/src/database-services/mongodb.service.ts +0 -454
  182. package/packages/vscode/src/database-services/mssql.service.js.map +0 -1
  183. package/packages/vscode/src/database-services/mssql.service.ts +0 -723
  184. package/packages/vscode/src/database-services/mysql.service.js.map +0 -1
  185. package/packages/vscode/src/database-services/mysql.service.ts +0 -761
  186. package/packages/vscode/src/database-services/oracle.service.js.map +0 -1
  187. package/packages/vscode/src/database-services/oracle.service.ts +0 -832
  188. package/packages/vscode/src/database-services/postgres.service.js.map +0 -1
  189. package/packages/vscode/src/database-services/postgres.service.ts +0 -741
  190. package/packages/vscode/src/database-services/sap.service.js.map +0 -1
  191. package/packages/vscode/src/database-services/sap.service.ts +0 -713
  192. package/packages/vscode/src/database-services/sqlite.service.js.map +0 -1
  193. package/packages/vscode/src/database-services/sqlite.service.ts +0 -558
  194. package/packages/vscode/src/extension.ts +0 -76
  195. package/packages/vscode/src/provider/DatabaseTreeProvider.ts +0 -167
  196. package/packages/vscode/src/provider/WebViewProvider.ts +0 -277
  197. package/packages/vscode/src/service/DatabaseServiceBridge.ts +0 -414
  198. package/packages/vscode/src/typings/connection.ts +0 -90
  199. package/packages/vscode/tsconfig.json +0 -21
  200. package/scripts/preinstall.js +0 -112
  201. package/server/index.ts +0 -681
  202. package/server/model/connection.entity.js +0 -11
  203. package/server/model/connection.entity.js.map +0 -1
  204. package/server/model/connection.entity.ts +0 -66
  205. package/server/model/database.entity.js +0 -35
  206. package/server/model/database.entity.js.map +0 -1
  207. package/server/model/database.entity.ts +0 -246
  208. package/server/service/connection.service.ts +0 -359
  209. package/server/service/database/base.service.ts +0 -407
  210. package/server/service/database/cockroachdb.service.ts +0 -871
  211. package/server/service/database/database.service.ts +0 -776
  212. package/server/service/database/index.ts +0 -7
  213. package/server/service/database/mongodb.service.ts +0 -501
  214. package/server/service/database/mssql.service.ts +0 -932
  215. package/server/service/database/mysql.service.ts +0 -1026
  216. package/server/service/database/oracle.service.ts +0 -1036
  217. package/server/service/database/postgres.service.ts +0 -961
  218. package/server/service/database/sap.service.ts +0 -922
  219. package/server/service/database/sqlite.service.ts +0 -787
  220. package/server/service/session.service.ts +0 -158
  221. package/server/tsconfig.json +0 -20
  222. package/src/adapter/ajax.ts +0 -135
  223. package/src/assets/base.css +0 -1
  224. package/src/assets/database.css +0 -950
  225. package/src/assets/images/collapse.png +0 -0
  226. package/src/assets/images/no-login.png +0 -0
  227. package/src/assets/images/svg/illustrations/illustration-1.svg +0 -1
  228. package/src/assets/images/svg/illustrations/illustration-2.svg +0 -2
  229. package/src/assets/images/svg/illustrations/illustration-3.svg +0 -50
  230. package/src/assets/images/svg/illustrations/illustration-4.svg +0 -1
  231. package/src/assets/images/svg/illustrations/illustration-5.svg +0 -73
  232. package/src/assets/images/svg/illustrations/illustration-6.svg +0 -89
  233. package/src/assets/images/svg/illustrations/illustration-7.svg +0 -39
  234. package/src/assets/images/svg/illustrations/illustration-8.svg +0 -1
  235. package/src/assets/images/svg/separators/curve-2.svg +0 -3
  236. package/src/assets/images/svg/separators/curve.svg +0 -3
  237. package/src/assets/images/svg/separators/line.svg +0 -3
  238. package/src/assets/images/theme/light/screen-1-1000x800.jpg +0 -0
  239. package/src/assets/images/theme/light/screen-2-1000x800.jpg +0 -0
  240. package/src/assets/login/bg.jpg +0 -0
  241. package/src/assets/login/bg.png +0 -0
  242. package/src/assets/login/left.jpg +0 -0
  243. package/src/assets/logo.svg +0 -73
  244. package/src/assets/logo.webp +0 -0
  245. package/src/assets/main.css +0 -1
  246. package/src/base/config.ts +0 -20
  247. package/src/base/detect.ts +0 -134
  248. package/src/base/entity.ts +0 -92
  249. package/src/base/eventBus.ts +0 -37
  250. package/src/components/connection-editor/index.vue +0 -589
  251. package/src/components/dataGrid/index.vue +0 -163
  252. package/src/components/dataGrid/pagination.vue +0 -106
  253. package/src/components/loading/index.vue +0 -43
  254. package/src/components/modal/index.ts +0 -181
  255. package/src/components/modal/index.vue +0 -560
  256. package/src/components/toast/index.ts +0 -44
  257. package/src/components/toast/toast.vue +0 -58
  258. package/src/components/user/name.vue +0 -104
  259. package/src/components/user/selector.vue +0 -416
  260. package/src/domain/SysConfig.ts +0 -74
  261. package/src/platform/App.vue +0 -8
  262. package/src/platform/database/components/connection-detail.vue +0 -1153
  263. package/src/platform/database/components/data-editor.vue +0 -478
  264. package/src/platform/database/components/data-import-export.vue +0 -1602
  265. package/src/platform/database/components/database-detail.vue +0 -1199
  266. package/src/platform/database/components/database-monitor.vue +0 -1086
  267. package/src/platform/database/components/db-tools.vue +0 -1265
  268. package/src/platform/database/components/query-history.vue +0 -1349
  269. package/src/platform/database/components/sql-executor.vue +0 -738
  270. package/src/platform/database/components/sql-query-editor.vue +0 -1046
  271. package/src/platform/database/components/table-data-grid.vue +0 -273
  272. package/src/platform/database/components/table-detail.vue +0 -1173
  273. package/src/platform/database/components/table-editor.vue +0 -917
  274. package/src/platform/database/explorer.vue +0 -1840
  275. package/src/platform/database/index.vue +0 -1193
  276. package/src/platform/database/layout.vue +0 -367
  277. package/src/platform/database/router.ts +0 -37
  278. package/src/platform/database/styles/common.scss +0 -602
  279. package/src/platform/database/types/common.ts +0 -445
  280. package/src/platform/database/utils/export.ts +0 -232
  281. package/src/platform/database/utils/helpers.ts +0 -437
  282. package/src/platform/index.ts +0 -33
  283. package/src/platform/router.ts +0 -41
  284. package/src/platform/vscode/bridge.ts +0 -121
  285. package/src/platform/vscode/components/ConnectionPanel.vue +0 -272
  286. package/src/platform/vscode/components/DatabasePanel.vue +0 -532
  287. package/src/platform/vscode/components/QueryPanel.vue +0 -371
  288. package/src/platform/vscode/entry/connection.ts +0 -13
  289. package/src/platform/vscode/entry/database.ts +0 -13
  290. package/src/platform/vscode/entry/query.ts +0 -13
  291. package/src/platform/vscode/index.ts +0 -5
  292. package/src/service/base.ts +0 -134
  293. package/src/service/database.ts +0 -506
  294. package/src/service/login.ts +0 -121
  295. package/src/shims-vue.d.ts +0 -7
  296. package/src/stores/connection.ts +0 -266
  297. package/src/stores/session.ts +0 -87
  298. package/src/typings/database-types.ts +0 -413
  299. package/src/typings/database.ts +0 -364
  300. package/src/typings/global.d.ts +0 -58
  301. package/src/typings/pinia.d.ts +0 -8
  302. package/src/utils/clipboard.ts +0 -30
  303. package/src/utils/database-types.ts +0 -243
  304. package/src/utils/modal.ts +0 -124
  305. package/src/utils/request.ts +0 -55
  306. package/src/utils/sleep.ts +0 -4
  307. package/src/utils/toast.ts +0 -73
  308. package/src/utils/util.ts +0 -171
  309. package/src/utils/xlsx.ts +0 -228
  310. package/tsconfig.json +0 -33
  311. package/tsconfig.server.json +0 -19
  312. package/vite.config.ts +0 -424
  313. package/vite.config.vscode.ts +0 -47
@@ -1,437 +0,0 @@
1
- // 数据库平台通用工具函数
2
-
3
- // 格式化文件大小
4
- export function formatFileSize(bytes: number): string {
5
- if (bytes === 0) return '0 B';
6
- const sizes = ['B', 'KB', 'MB', 'GB', 'TB'];
7
- const i = Math.floor(Math.log(bytes) / Math.log(1024));
8
- return Math.round(bytes / Math.pow(1024, i) * 100) / 100 + ' ' + sizes[i];
9
- }
10
-
11
- // 格式化时间
12
- export function formatTime(timestamp: Date): string {
13
- const now = new Date();
14
- const diff = now.getTime() - timestamp.getTime();
15
- const minutes = Math.floor(diff / 60000);
16
- const hours = Math.floor(diff / 3600000);
17
- const days = Math.floor(diff / 86400000);
18
-
19
- if (minutes < 1) return '刚刚';
20
- if (minutes < 60) return `${minutes}分钟前`;
21
- if (hours < 24) return `${hours}小时前`;
22
- if (days < 7) return `${days}天前`;
23
-
24
- return timestamp.toLocaleDateString('zh-CN');
25
- }
26
-
27
- // 格式化日期时间
28
- export function formatDateTime(date: Date): string {
29
- return date.toLocaleString('zh-CN', {
30
- year: 'numeric',
31
- month: '2-digit',
32
- day: '2-digit',
33
- hour: '2-digit',
34
- minute: '2-digit',
35
- second: '2-digit'
36
- });
37
- }
38
-
39
- // 格式化执行时间
40
- export function formatExecutionTime(ms: number): string {
41
- if (ms < 1000) return `${ms}ms`;
42
- if (ms < 60000) return `${(ms / 1000).toFixed(2)}s`;
43
- return `${(ms / 60000).toFixed(2)}min`;
44
- }
45
-
46
- // 获取执行时间状态类
47
- export function getExecutionTimeClass(time: number): string {
48
- if (time < 100) return 'fast';
49
- if (time < 1000) return 'normal';
50
- if (time < 2000) return 'slow';
51
- return 'very-slow';
52
- }
53
-
54
- // 截断SQL语句
55
- export function truncateSql(sql: string, maxLength = 80): string {
56
- if (sql.length <= maxLength) return sql;
57
- return sql.substring(0, maxLength) + '...';
58
- }
59
-
60
- // 格式化SQL语句
61
- export function formatSql(sql: string): string {
62
- return sql
63
- .replace(/\s+/g, ' ')
64
- .replace(/,/g, ',\n ')
65
- .replace(/\bFROM\b/gi, '\nFROM')
66
- .replace(/\bWHERE\b/gi, '\nWHERE')
67
- .replace(/\bORDER BY\b/gi, '\nORDER BY')
68
- .replace(/\bGROUP BY\b/gi, '\nGROUP BY')
69
- .replace(/\bHAVING\b/gi, '\nHAVING')
70
- .replace(/\bLIMIT\b/gi, '\nLIMIT')
71
- .trim();
72
- }
73
-
74
- // 获取SQL类型
75
- export function getSqlType(sql: string): string {
76
- const trimmed = sql.trim().toUpperCase();
77
- if (trimmed.startsWith('SELECT')) return 'SELECT';
78
- if (trimmed.startsWith('INSERT')) return 'INSERT';
79
- if (trimmed.startsWith('UPDATE')) return 'UPDATE';
80
- if (trimmed.startsWith('DELETE')) return 'DELETE';
81
- if (trimmed.startsWith('CREATE')) return 'CREATE';
82
- if (trimmed.startsWith('ALTER')) return 'ALTER';
83
- if (trimmed.startsWith('DROP')) return 'DROP';
84
- if (trimmed.startsWith('TRUNCATE')) return 'TRUNCATE';
85
- return 'OTHER';
86
- }
87
-
88
- // 验证SQL语句
89
- export function validateSql(sql: string): { valid: boolean; error?: string } {
90
- if (!sql || sql.trim() === '') {
91
- return { valid: false, error: 'SQL语句不能为空' };
92
- }
93
-
94
- // 基本的SQL注入检查
95
- const dangerousPatterns = [
96
- /DROP\s+DATABASE/i,
97
- /DROP\s+TABLE/i,
98
- /TRUNCATE/i,
99
- /DELETE\s+FROM.*WHERE\s+1\s*=\s*1/i,
100
- /UPDATE.*SET.*WHERE\s+1\s*=\s*1/i
101
- ];
102
-
103
- for (const pattern of dangerousPatterns) {
104
- if (pattern.test(sql)) {
105
- return { valid: false, error: '检测到潜在的危险SQL操作' };
106
- }
107
- }
108
-
109
- return { valid: true };
110
- }
111
-
112
- // 生成UUID
113
- export function generateUUID(): string {
114
- return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
115
- const r = Math.random() * 16 | 0;
116
- const v = c === 'x' ? r : (r & 0x3 | 0x8);
117
- return v.toString(16);
118
- });
119
- }
120
-
121
- // 深拷贝对象
122
- export function deepClone<T>(obj: T): T {
123
- if (obj === null || typeof obj !== 'object') return obj;
124
- if (obj instanceof Date) return new Date(obj.getTime()) as unknown as T;
125
- if (obj instanceof Array) return obj.map(item => deepClone(item)) as unknown as T;
126
- if (typeof obj === 'object') {
127
- const cloned = {} as T;
128
- for (const key in obj) {
129
- if (obj.hasOwnProperty(key)) {
130
- cloned[key] = deepClone(obj[key]);
131
- }
132
- }
133
- return cloned;
134
- }
135
- return obj;
136
- }
137
-
138
- // 防抖函数
139
- export function debounce<T extends (...args: any[]) => any>(
140
- func: T,
141
- wait: number
142
- ): (...args: Parameters<T>) => void {
143
- let timeout: NodeJS.Timeout;
144
- return (...args: Parameters<T>) => {
145
- clearTimeout(timeout);
146
- timeout = setTimeout(() => func(...args), wait);
147
- };
148
- }
149
-
150
- // 节流函数
151
- export function throttle<T extends (...args: any[]) => any>(
152
- func: T,
153
- wait: number
154
- ): (...args: Parameters<T>) => void {
155
- let inThrottle: boolean;
156
- return (...args: Parameters<T>) => {
157
- if (!inThrottle) {
158
- func(...args);
159
- inThrottle = true;
160
- setTimeout(() => inThrottle = false, wait);
161
- }
162
- };
163
- }
164
-
165
- // 复制到剪贴板
166
- export async function copyToClipboard(text: string): Promise<boolean> {
167
- try {
168
- await navigator.clipboard.writeText(text);
169
- return true;
170
- } catch (error) {
171
- // 降级方案
172
- const textArea = document.createElement('textarea');
173
- textArea.value = text;
174
- textArea.style.position = 'fixed';
175
- textArea.style.opacity = '0';
176
- document.body.appendChild(textArea);
177
- textArea.focus();
178
- textArea.select();
179
-
180
- try {
181
- document.execCommand('copy');
182
- document.body.removeChild(textArea);
183
- return true;
184
- } catch (error) {
185
- document.body.removeChild(textArea);
186
- return false;
187
- }
188
- }
189
- }
190
-
191
- // 下载文件
192
- export function downloadFile(content: string, filename: string, contentType = 'text/plain') {
193
- const blob = new Blob([content], { type: contentType });
194
- const url = URL.createObjectURL(blob);
195
- const link = document.createElement('a');
196
- link.href = url;
197
- link.download = filename;
198
- document.body.appendChild(link);
199
- link.click();
200
- document.body.removeChild(link);
201
- URL.revokeObjectURL(url);
202
- }
203
-
204
- // 导出为CSV
205
- export function exportToCSV(data: any[], filename: string) {
206
- if (data.length === 0) return;
207
-
208
- const headers = Object.keys(data[0]);
209
- const csvContent = [
210
- headers.join(','),
211
- ...data.map(row =>
212
- headers.map(header => {
213
- const value = row[header];
214
- if (value === null || value === undefined) return '';
215
- if (typeof value === 'object') return JSON.stringify(value);
216
- return `"${String(value).replace(/"/g, '""')}"`;
217
- }).join(',')
218
- )
219
- ].join('\n');
220
-
221
- downloadFile(csvContent, filename, 'text/csv;charset=utf-8;');
222
- }
223
-
224
- // 导出为JSON
225
- export function exportToJSON(data: any[], filename: string) {
226
- const jsonContent = JSON.stringify(data, null, 2);
227
- downloadFile(jsonContent, filename, 'application/json;charset=utf-8;');
228
- }
229
-
230
- // 获取数据库类型图标
231
- export function getDbTypeIcon(type: string): string {
232
- const iconMap: Record<string, string> = {
233
- mysql: 'bi-database',
234
- postgres: 'bi-database',
235
- postgresql: 'bi-database',
236
- sqlite: 'bi-database',
237
- mssql: 'bi-database',
238
- sqlserver: 'bi-database',
239
- oracle: 'bi-database',
240
- mongodb: 'bi-diagram-3'
241
- };
242
- return iconMap[type.toLowerCase()] || 'bi-database';
243
- }
244
-
245
- // 获取数据库类型标签
246
- export function getDbTypeLabel(type: string): string {
247
- const labelMap: Record<string, string> = {
248
- mysql: 'MySQL',
249
- postgres: 'PostgreSQL',
250
- postgresql: 'PostgreSQL',
251
- sqlite: 'SQLite',
252
- mssql: 'SQL Server',
253
- sqlserver: 'SQL Server',
254
- oracle: 'Oracle',
255
- mongodb: 'MongoDB'
256
- };
257
- return labelMap[type.toLowerCase()] || type;
258
- }
259
-
260
- // 获取数据库类型样式类
261
- export function getDbTypeClass(type: string): string {
262
- const classMap: Record<string, string> = {
263
- mysql: 'db-mysql',
264
- postgres: 'db-postgres',
265
- postgresql: 'db-postgres',
266
- sqlite: 'db-sqlite',
267
- mssql: 'db-mssql',
268
- sqlserver: 'db-mssql',
269
- oracle: 'db-oracle',
270
- mongodb: 'db-mongodb'
271
- };
272
- return classMap[type.toLowerCase()] || 'db-default';
273
- }
274
-
275
- // 计算百分比
276
- export function calculatePercentage(value: number, total: number): number {
277
- if (total === 0) return 0;
278
- return Math.round((value / total) * 100);
279
- }
280
-
281
- // 格式化数字
282
- export function formatNumber(num: number): string {
283
- if (num >= 1000000) {
284
- return (num / 1000000).toFixed(1) + 'M';
285
- }
286
- if (num >= 1000) {
287
- return (num / 1000).toFixed(1) + 'K';
288
- }
289
- return num.toString();
290
- }
291
-
292
- // 获取颜色值
293
- export function getColorByValue(value: number, ranges: { threshold: number; color: string }[]): string {
294
- for (const range of ranges) {
295
- if (value <= range.threshold) {
296
- return range.color;
297
- }
298
- }
299
- return ranges[ranges.length - 1].color;
300
- }
301
-
302
- // 创建Toast通知
303
- export function createToast(message: string, type: 'success' | 'error' | 'warning' | 'info' = 'info', duration = 3000) {
304
- const toast = document.createElement('div');
305
- toast.className = `toast toast-${type}`;
306
- toast.innerHTML = `
307
- <div class="toast-content">
308
- <i class="bi bi-${getToastIcon(type)}"></i>
309
- <span>${message}</span>
310
- </div>
311
- `;
312
-
313
- Object.assign(toast.style, {
314
- position: 'fixed',
315
- top: '20px',
316
- right: '20px',
317
- background: 'white',
318
- border: '1px solid #e5e7eb',
319
- borderRadius: '8px',
320
- padding: '1rem',
321
- boxShadow: '0 4px 12px rgba(0, 0, 0, 0.15)',
322
- zIndex: '9999',
323
- display: 'flex',
324
- alignItems: 'center',
325
- gap: '0.5rem',
326
- minWidth: '250px',
327
- transform: 'translateX(100%)',
328
- transition: 'transform 0.3s ease'
329
- });
330
-
331
- document.body.appendChild(toast);
332
-
333
- // 触发动画
334
- setTimeout(() => {
335
- toast.style.transform = 'translateX(0)';
336
- }, 100);
337
-
338
- // 自动移除
339
- setTimeout(() => {
340
- toast.style.transform = 'translateX(100%)';
341
- setTimeout(() => {
342
- if (toast.parentNode) {
343
- toast.parentNode.removeChild(toast);
344
- }
345
- }, 300);
346
- }, duration);
347
- }
348
-
349
- function getToastIcon(type: string): string {
350
- const iconMap: Record<string, string> = {
351
- success: 'check-circle',
352
- error: 'x-circle',
353
- warning: 'exclamation-triangle',
354
- info: 'info-circle'
355
- };
356
- return iconMap[type] || 'info-circle';
357
- }
358
-
359
- // 数组去重
360
- export function uniqueArray<T>(array: T[], key?: keyof T): T[] {
361
- if (!key) return [...new Set(array)];
362
-
363
- const seen = new Set();
364
- return array.filter(item => {
365
- const value = item[key];
366
- if (seen.has(value)) {
367
- return false;
368
- }
369
- seen.add(value);
370
- return true;
371
- });
372
- }
373
-
374
- // 数组分组
375
- export function groupBy<T>(array: T[], key: keyof T): Record<string, T[]> {
376
- return array.reduce((groups, item) => {
377
- const groupKey = String(item[key]);
378
- if (!groups[groupKey]) {
379
- groups[groupKey] = [];
380
- }
381
- groups[groupKey].push(item);
382
- return groups;
383
- }, {} as Record<string, T[]>);
384
- }
385
-
386
- // 数组排序
387
- export function sortBy<T>(array: T[], key: keyof T, direction: 'asc' | 'desc' = 'asc'): T[] {
388
- return [...array].sort((a, b) => {
389
- const aVal = a[key];
390
- const bVal = b[key];
391
-
392
- if (aVal === null || aVal === undefined) return direction === 'asc' ? 1 : -1;
393
- if (bVal === null || bVal === undefined) return direction === 'asc' ? -1 : 1;
394
-
395
- let comparison = 0;
396
- if (typeof aVal === 'number' && typeof bVal === 'number') {
397
- comparison = aVal - bVal;
398
- } else {
399
- comparison = String(aVal).localeCompare(String(bVal));
400
- }
401
-
402
- return direction === 'asc' ? comparison : -comparison;
403
- });
404
- }
405
-
406
- // 检查对象是否为空
407
- export function isEmpty(obj: any): boolean {
408
- if (obj == null) return true;
409
- if (Array.isArray(obj)) return obj.length === 0;
410
- if (typeof obj === 'object') return Object.keys(obj).length === 0;
411
- return false;
412
- }
413
-
414
- // 合并对象
415
- export function mergeObjects<T extends Record<string, any>>(...objects: Partial<T>[]): T {
416
- return objects.reduce((result, obj) => {
417
- return { ...result, ...obj };
418
- }, {} as T);
419
- }
420
-
421
- // 获取嵌套对象属性
422
- export function getNestedProperty(obj: any, path: string): any {
423
- return path.split('.').reduce((current, key) => current?.[key], obj);
424
- }
425
-
426
- // 设置嵌套对象属性
427
- export function setNestedProperty(obj: any, path: string, value: any): void {
428
- const keys = path.split('.');
429
- const lastKey = keys.pop()!;
430
- const target = keys.reduce((current, key) => {
431
- if (!current[key] || typeof current[key] !== 'object') {
432
- current[key] = {};
433
- }
434
- return current[key];
435
- }, obj);
436
- target[lastKey] = value;
437
- }
@@ -1,33 +0,0 @@
1
- import { createApp } from 'vue';
2
- import App from './App.vue';
3
- import router from './router';
4
- import { createPinia } from 'pinia';
5
- import piniaPluginPersistedstate from 'pinia-plugin-persistedstate';
6
-
7
- // 引入 vconsole 进行调试
8
- import VConsole from 'vconsole';
9
- new VConsole();
10
-
11
- import 'bootstrap/dist/css/bootstrap.css';
12
- import 'bootstrap-icons/font/bootstrap-icons.css';
13
- import '@/assets/database.css';
14
- import 'bootstrap';
15
-
16
- import toastPlugin from '@/components/toast/index';
17
- import Modal from '@/components/modal/index.vue';
18
- import DataGrid from '@/components/dataGrid/index.vue';
19
- import modalPlugin from '@/components/modal/index';
20
-
21
- const app = createApp(App);
22
- const pinia = createPinia();
23
- pinia.use(piniaPluginPersistedstate);
24
-
25
- app.use(router);
26
- app.use(pinia);
27
- app.use(toastPlugin);
28
- app.use(modalPlugin);
29
-
30
- app.component('Modal', Modal)
31
- app.component('DataGrid', DataGrid)
32
-
33
- app.mount('#app');
@@ -1,41 +0,0 @@
1
- import { createRouter, createWebHistory } from 'vue-router';
2
- import { useTitle } from '@vueuse/core';
3
- import { abortAllPending } from '@/adapter/ajax';
4
- import { checkLogin, initLoginState } from '@/service/login';
5
-
6
- import databaseRouters from './database/router';
7
-
8
- export const router = createRouter({
9
- history: createWebHistory(import.meta.env.BASE_URL),
10
- routes: [
11
- // 数据库管理
12
- ...databaseRouters,
13
- {
14
- path: '/:pathMatch(.*)*',
15
- name: 'not-found',
16
- redirect: '/database/index',
17
- },
18
- ],
19
- });
20
-
21
- router.beforeEach(async (to, from, next) => {
22
- // 切换路由取消请求
23
- abortAllPending();
24
-
25
- const ret = await initLoginState(to);
26
- if(ret === false) return;
27
-
28
- // 校验登陆态
29
- if(to.meta?.needAuth) {
30
- await checkLogin();
31
- }
32
- next();
33
- });
34
-
35
- router.afterEach((to) => {
36
- if (to.meta?.title) {
37
- useTitle(to.meta.title as string);
38
- }
39
- });
40
-
41
- export default router;
@@ -1,121 +0,0 @@
1
- /**
2
- * VSCode WebView 桥接层
3
- * 提供 Vue 应用与 VSCode 扩展之间的通信
4
- */
5
-
6
- /**
7
- * VSCode API 接口
8
- */
9
- interface VSCodeAPI {
10
- postMessage(message: any): void;
11
- getState(): any;
12
- setState(state: any): void;
13
- }
14
-
15
- declare const acquireVsCodeApi: () => VSCodeAPI;
16
-
17
- /**
18
- * VSCode 桥接类
19
- */
20
- export class VSCodeBridge {
21
- private vscode: VSCodeAPI | null = null;
22
-
23
- constructor() {
24
- if (typeof window !== 'undefined' && typeof acquireVsCodeApi === 'function') {
25
- this.vscode = acquireVsCodeApi();
26
- }
27
- }
28
-
29
- /**
30
- * 判断是否在 VSCode 环境中
31
- */
32
- isVSCodeEnvironment(): boolean {
33
- return this.vscode !== null;
34
- }
35
-
36
- /**
37
- * 发送消息到 VSCode 扩展
38
- */
39
- postMessage(message: any): void {
40
- if (!this.vscode) {
41
- console.warn('Not in VSCode environment');
42
- return;
43
- }
44
- this.vscode.postMessage(message);
45
- }
46
-
47
- /**
48
- * 监听来自 VSCode 扩展的消息
49
- */
50
- onMessage(callback: (message: any) => void): void {
51
- window.addEventListener('message', event => {
52
- // 安全检查:确保消息来自扩展
53
- if (event.origin) {
54
- return;
55
- }
56
- callback(event.data);
57
- });
58
- }
59
-
60
- /**
61
- * 获取状态
62
- */
63
- getState(): any {
64
- if (!this.vscode) {
65
- return {};
66
- }
67
- return this.vscode.getState();
68
- }
69
-
70
- /**
71
- * 保存状态
72
- */
73
- setState(state: any): void {
74
- if (!this.vscode) {
75
- return;
76
- }
77
- this.vscode.setState(state);
78
- }
79
-
80
- /**
81
- * 初始化桥接
82
- */
83
- init(messageHandler?: (message: any) => void): void {
84
- if (this.isVSCodeEnvironment()) {
85
- if (messageHandler) {
86
- this.onMessage(messageHandler);
87
- }
88
- // 恢复之前保存的状态
89
- const savedState = this.getState();
90
- if (savedState) {
91
- this.postMessage({
92
- command: 'restoreState',
93
- data: savedState
94
- });
95
- }
96
- }
97
- }
98
- }
99
-
100
- // 创建全局实例
101
- let bridgeInstance: VSCodeBridge | null = null;
102
-
103
- /**
104
- * 获取 VSCode 桥接实例
105
- */
106
- export function getVSCodeBridge(): VSCodeBridge {
107
- if (!bridgeInstance) {
108
- bridgeInstance = new VSCodeBridge();
109
- }
110
- return bridgeInstance;
111
- }
112
-
113
- /**
114
- * 判断是否在 VSCode 环境中
115
- */
116
- export function isVSCodeEnvironment(): boolean {
117
- if (!bridgeInstance) {
118
- bridgeInstance = new VSCodeBridge();
119
- }
120
- return bridgeInstance.isVSCodeEnvironment();
121
- }